diff --git a/cmd/mo-service/materialized_view_faults.go b/cmd/mo-service/materialized_view_faults.go new file mode 100644 index 0000000000000..538f00ed1af6a --- /dev/null +++ b/cmd/mo-service/materialized_view_faults.go @@ -0,0 +1,36 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build matrixone_mv_faults + +package main + +import ( + "context" + "os" + + "github.com/matrixorigin/matrixone/pkg/util/fault" +) + +// Only the explicitly instrumented native recovery binary accepts startup +// faults. Production builds have no environment-controlled injection path. +// Startup injection is needed because ordinary login cannot precede migration. +func init() { + if point := os.Getenv("MO_MV_STARTUP_FAULT"); point != "" { + fault.Enable() + if result := fault.HandleFaultInject(context.Background(), fault.AddFault, point); result != "OK" { + panic(result) + } + } +} diff --git a/docs/design/materialized_views.md b/docs/design/materialized_views.md new file mode 100644 index 0000000000000..baee27a49f22b --- /dev/null +++ b/docs/design/materialized_views.md @@ -0,0 +1,247 @@ +# Native materialized views + +Design for [#30079](https://github.com/matrixorigin/matrixone/issues/30079), +implemented by [#30085](https://github.com/matrixorigin/matrixone/pull/30085). +Status: experimental P1; pending maintainer design review. +This is the design entry point for the PR. Commands for reproducing validation +are in [the test runner README](../../test/materialized_view/README.md). +This document supersedes the earlier `00000000_materialized_views.md` RFC and +the separate implementation notes. In particular, the transaction model below +replaces the old SI-only execution sketch, and the recovery policy below +replaces the old proposal for paused account/cluster restores. + +## Goal and scope + +Repeated dashboard queries scan the same facts and recompute the same aggregates +and joins. Logical views save SQL but still execute that work on every read. +Application-maintained summary tables leave publication, refresh failure and +dependency management to each application. + +Provide a database-owned, read-only stored SELECT result. The central invariant +is that readers see one complete successful publication: its rows, source +snapshot and successful refresh identity commit together. A failed refresh +preserves the previous publication. Before the first success, every read fails +with `MV_NOT_POPULATED`, including reads simplified to an empty result. + +P1 supports explicit queries against the MV, deferred initial population, manual +refresh and periodic full refresh. It is disabled by default with +`experimental_materialized_view`. It does not implement automatic query rewrite, +incremental maintenance, aggregate-table write semantics, nested MVs or logical +history/clone/restore integration. Those require separate designs and acceptance +criteria before expanding this contract. + +## SQL contract + +```sql +SET experimental_materialized_view = 1; +CREATE MATERIALIZED VIEW sales_summary REFRESH MANUAL AS + SELECT region, COUNT(*) AS n, SUM(amount) AS total + FROM sales GROUP BY region; +REFRESH MATERIALIZED VIEW sales_summary; +SELECT * FROM sales_summary; +ALTER MATERIALIZED VIEW sales_summary REFRESH EVERY INTERVAL 1 MINUTE; +SHOW CREATE MATERIALIZED VIEW sales_summary; +ALTER MATERIALIZED VIEW sales_summary REFRESH MANUAL; +DROP MATERIALIZED VIEW sales_summary; +``` + +CREATE validates the definition and registers dependencies in the same +transaction as relation creation; it does not populate rows. Manual REFRESH +waits for completion. Periodic refresh has a minimum interval of 60 seconds. +Source DML becomes visible in the MV only after a successful refresh. +`SHOW CREATE TABLE` also returns the logical MV definition and current policy. + +Definitions may use deterministic projections, filters, inner joins, GROUP BY, +SUM/COUNT/MIN/MAX/AVG and an explicit scalar-function allowlist. Sources must be +persistent native tables in the same account and database. The definition is +limited to 16 sources and 256 output columns, with a bounded AST binding walk. +CTEs, DISTINCT, windows, subqueries, ORDER BY, LIMIT, parameters, user variables, +UDFs, qualified functions, historical/external sources, views and MVs are rejected. + +Refresh runs with the captured database, SQL mode, timezone, division precision +and identifier-case setting. Format 2 distinguishes an explicitly empty SQL +mode from an absent field. Reinterpreting the definition using the worker's +session defaults would change results and is rejected. + +## Implementation and ownership + +An MV is a native relation of kind `m`, with the `mo_materialized_view` property +and ordinary storage for its rows. No new storage engine is introduced. + +| Component | Responsibility | +| --- | --- | +| `pkg/sql/parsers/tree/materialized_view.go` | SQL statement types; MySQL grammar supplies parsing | +| `pkg/catalog/materialized_view.go` | Persisted definition, source identity and format validation | +| `pkg/sql/plan/materialized_view.go` | Definition validation, source binding and query admission | +| `pkg/frontend/materialized_view.go` | User/definer privileges and SQL command admission | +| `pkg/sql/compile/materialized_view.go` | Native relation lifecycle, dependency and read/write guards | +| `pkg/mv/service.go` | Refresh state, transactional publication and account lifecycle fencing | +| `pkg/mv/task.go` | Reconciliation, existing taskservice executor 17 and bounded cleanup | +| `pkg/bootstrap/versions/v4_0_18/upgrade.go` | Catalog installation and legacy-definition migration | + +Four global catalogs store rows scoped by account ID: + +| Catalog | Persistent state | +| --- | --- | +| `mo_materialized_views` | Definition, policy epoch, requested/successful sequence, populated state, last run, source physical/logical timestamp and next due time | +| `mo_mv_dependencies` | Source database/table physical and logical identities and schema versions | +| `mo_mv_refresh_runs` | Run identity, epoch, sequence, status and successful source snapshot | +| `mo_mv_account_state` | Account revision, retirement and the shared lifecycle lock | + +## Refresh and failure handling + +1. Validate the active account, definer and source grants. Acquire bounded + per-CN admission and reserve a durable run ID and requested sequence. +2. Take the account's existing metadata/lifecycle lock in a separate pessimistic + read-committed transaction: `SELECT revision FROM mo_mv_account_state WHERE + account_id = ? FOR UPDATE`. Hold this fence until publication finishes. This + publication fence does not write the account revision. +3. Start a separate optimistic snapshot-isolation transaction, with a minimum + committed timestamp taken from the fence. Load the current definition, + check its epoch and sequence, and validate the pinned source identities and + schema versions. The account lock serializes lifecycle operations and + publishers within an account, including publishers on different CNs. +4. Delete old backing rows and insert the stored SELECT result in that SI + transaction. Only a private capability bound to the account, MV table and + exact transaction ID authorizes these writes. Verify that the complete + source snapshot timestamp has not changed during execution. +5. In the same transaction, mark the MV populated and commit successful + sequence, run ID, source physical/logical timestamp and terminal run status. + This commit is the publication point. Release the fence through the existing + executor's transaction cleanup. +6. On error, cancellation or timeout, roll back the replacement. Record a + sanitized failure conditionally; it must not overwrite an already committed + success. If a commit response is lost, resolve the durable last-run identity + before reporting failure. Duplicate delivery of the same successful run is + a no-op; an older sequence is superseded and an obsolete policy epoch cannot + publish. + +The SI snapshot is acquired after the outer lock is granted, using +`WithMinCommittedTS(fence.Txn().SnapshotTS())`; it is not a snapshot chosen before +waiting for a competing lifecycle operation. Ordinary rollback/commit releases +both transactions through their respective executor owners. After process loss, +native transaction recovery releases the lock and rolls back an uncommitted +replacement; a committed publication is resolved by its durable run identity. +The 300-second refresh context bounds lock waiting and execution, and bounded +transaction retries do not add a second independent lock owner. + +The reconciler uses the existing taskservice rather than a separate worker +system. It recovers interrupted runs and schedules due policies with stable +run identities. Policy changes advance the epoch. DROP and account retirement +use the same account fence, so a delayed task cannot resurrect removed metadata. +Task retries retain the run identity; transaction retries are owned by the +existing executor and bounded to three attempts. + +Admission allows two active refreshes per CN, with fixed-size account buckets +for active/pending work; bucket collisions conservatively serialize accounts. +Each account is limited to 128 MVs. Refresh has a 300-second deadline and a +512 MiB target-write budget. Reconciliation reads bounded pages; history cleanup +removes bounded batches beyond the recent 100 runs or seven days. These limits +bound admission and retained history, not the source scan cost of a full refresh. + +## Readers, DDL and security + +Readers use ordinary MVCC and see a complete stored generation at their chosen +snapshot. Cross-CN visibility follows MO's normal snapshot propagation; it does +not imply globally fresh reads. A causal handoff is required when a test or +application needs a second CN to observe a completed publication immediately. + +Readers need both MV and source privileges. Refresh rechecks the captured +definer's existence, active role, source grants and account status; a scheduler +does not bypass user admission through its privileged catalog executor. +Suspended, restricted or retired accounts cannot refresh. Failure messages in +refresh history do not persist raw SQL, data or connection errors. + +Public INSERT/UPDATE/DELETE/LOAD writes to an MV are rejected. DUMP/LOAD and +native DATA BRANCH consumers reject MV endpoints, including unpopulated MVs, +before accessing their rows, files or merge operations. Branch snapshot and +authorization checks still run before kind admission. + +Source DML remains allowed. Destructive source DDL is rejected after ordinary +name/lifecycle locking and dependency validation. In particular, source DELETE +must execute row DML rather than becoming TRUNCATE while an MV depends on it. +Prepared DELETE rebinds when it could have cached truncate eligibility before +another session created the MV. Prepared SHOW CREATE also rebinds so a changed +refresh policy is exported correctly. Dropping an MV removes its dependencies; +database deletion restricts surviving MVs. Account deletion fences tasks and +atomically removes its MV objects. + +## Compatibility and Git4Data + +Migration 4.0.18/offset 5 requires 4.0.17 and common protocol 122. The upstream +4.0.17 MEDIUMINT tenant repair stays intact and runs first. Main retains protocol +120 for session ownership and 121 for DECIMAL DIV; MV admission uses its own +protocol 122 so neither older capability implies MV support. Catalog installation +is transactional and restartable; task executor 17 is registered only after +catalog and common-protocol readiness. A protocol-121 CN blocks MV migration +and task admission. An old binary cannot open the upgraded catalog for downgrade. + +Definition format 1 remains readable, but refresh requires recreation with +format 2 because missing authoring context cannot safely be guessed. Migration +pauses legacy periodic policies and advances their epoch. Disabling the session +feature gate prevents new feature use; it is not a catalog downgrade mechanism. + +Git4Data contributes native MVCC source timestamps and physical/logical source +identity to provenance. These identify the snapshot used for a publication; +they are not Git commits or a supported MV checkout/clone API. Logical branch, +backup/export, restore and historical MV behavior are outside P1. Operators must +retain source definitions/data and recreate/repopulate MVs for those workflows; +P1 does not promise that copying backing rows reconstructs a valid MV. Logical +snapshot restore/clone and PITR reject MV objects; account/cluster restore does +not reconstruct MVs as paused objects. System-catalog restore preserves the live +MV control catalogs instead of replacing them with historical refresh metadata. +Native crash/restart recovery of the same database is supported and is tested +separately from these unsupported logical restore operations. + +The P1 decisions are therefore: retain the outer account RC lock for correctness +despite serializing account refreshes across CNs; choose the SI source snapshot +after that lock; and reject logical MV restoration rather than inventing missing +definition/definer/provenance state. These decisions require maintainer review +of this design revision; prior design approval does not imply approval of the +updated contracts. + +## Alternatives and cost + +[StarRocks asynchronous MVs](https://docs.starrocks.io/docs/using_starrocks/async_mv/Materialized_view/) +provide the precedent for a stored SELECT, explicit refresh policies and later +rewrite. MO uses its own SI transactions, source MVCC timestamps and taskservice; +StarRocks partition versions and edit-log publication do not map directly to it. + +| Approach | Benefit | Cost or reason not selected for P1 | +| --- | --- | --- | +| Logical view / application summary table | Existing functionality; no new catalog | Recomputes every read or leaves safe publication and recovery to applications | +| Native full-refresh MV (selected) | Atomic publication using existing storage and transactions; independently testable SQL contract | Recomputes all source rows and retains a stored result; freshness follows refresh policy | +| Incremental aggregate table / CDC maintenance | Lower refresh cost for suitable updates | Adds update/retraction semantics, change tracking and recovery coordination before establishing the basic MV contract | +| Immediate transparent rewrite | Existing queries benefit without changing SQL | Requires equivalence, freshness and cost proofs; incorrect matching can return stale or wrong results | + +For N input rows and M result rows, each refresh executes the original query and +replaces M stored rows. Benefit comes from repeated reads of a much smaller +result. High-cardinality summaries may save little and still incur refresh and +storage costs. Per-account serialization also limits refresh concurrency. Users +should compare query savings with refresh cost and acceptable staleness before +enabling a periodic policy. No current-revision speedup is assumed. + +## Validation and rollout criteria + +| Contract | Executable coverage | +| --- | --- | +| Parsing, deterministic definitions, captured semantics and native guards | Tests beside catalog, parser, planner, compiler and frontend owners | +| Atomic rows/provenance, stale epochs, replay, failure and bounded admission | `pkg/mv/service_test.go`, `pkg/mv/task_test.go` | +| SQL correctness, permissions, tenant lifecycle, empty-result reads and cleanup | `test/distributed/cases/view/materialized_view.sql`; runner `-functional` / `-edge-check` | +| Branch rejection, prepared source DELETE, DUMP/LOAD and current SHOW CREATE | Runner `-consumer-check`, including independent session/CN changes | +| Publication visibility and concurrent refresh across CNs | Runner `-second-dsn`, with causal snapshot handoffs | +| Real old/new catalog and protocol admission, interrupted migration, downgrade refusal and crash/replay | `optools/materialized_view_recovery.py` with native binaries and probe | +| Query savings and refresh cost | Runner benchmark: full result equality, EXPLAIN, 50 alternating warm pairs and high-cardinality control | + +The BVT wrapper integrates the small SQL, failure, consumer and two-CN contracts +with the existing Compose services and coverage path. Native consumer validation +must pass in both RC and SI configurations. Full recovery validation must retain +ordinary pre-upgrade data, install exactly four MV catalogs, reject an old +consumer and prove before/after-commit replay without duplicate publication. + +The [runner README](../../test/materialized_view/README.md) describes reproduction +and links retained execution evidence. Rollout remains default-off while the +design is under maintainer review. Required CI, compatibility and recovery +checks must pass before enabling an experimental deployment. Rewrite, +incremental maintenance and logical history integration remain separate follow-up +decisions tracked in #30079. diff --git a/etc/launch-tae-compose/compose.yaml b/etc/launch-tae-compose/compose.yaml index 7a5a3c053fb5f..1db30afa80066 100644 --- a/etc/launch-tae-compose/compose.yaml +++ b/etc/launch-tae-compose/compose.yaml @@ -42,7 +42,7 @@ services: depends_on: - tn ports: - - "6002" + - "6001" - "12345:12345" environment: - AWS_ACCESS_KEY_ID=minio @@ -61,7 +61,7 @@ services: depends_on: - tn ports: - - "6002" + - "6001" - "22345:12345" profiles: - launch diff --git a/optools/materialized_view_recovery.py b/optools/materialized_view_recovery.py new file mode 100644 index 0000000000000..966324322a5d2 --- /dev/null +++ b/optools/materialized_view_recovery.py @@ -0,0 +1,410 @@ +#!/usr/bin/env python3 +"""Opt-in native upgrade/crash validation; owns every service it starts. + +Full mode requires the pinned pre-feature mo-service (default: main 4.0.17), +a current mo-service built with the matrixone_mv_faults tag, and +test/materialized_view/native_probe. --refresh-only needs the current production +service and probe; it skips startup migration injection. Uses only the Python +standard library. Run from the repository root; see the validation +document for build commands and the tested old revision. +""" + +import argparse +import hashlib +import json +import os +import pathlib +import select +import socket +import subprocess +import time +import urllib.request + + +def wait_for(description, check, seconds=180): + deadline = time.monotonic() + seconds + while True: + value = check() + if value: + return value + if time.monotonic() >= deadline: + raise TimeoutError(description) + time.sleep(0.25) # Poll an observable phase, never assume elapsed readiness. + + +class Fixture: + def __init__(self, args): + self.args = args + self.root = pathlib.Path(args.work_dir).resolve() + self.root.mkdir() # Refuse residue; never delete another fixture's data. + self.processes = [] + self.logs = [] + self.started = time.monotonic() + self.report = {"passed_cases": [], "observations": {}, "binaries": {}, "sql_observations": {}} + for key in ("service", "probe") + (("old_service",) if args.old_service else ()): + path = pathlib.Path(getattr(args, key)).resolve() + with path.open("rb") as binary: + digest = hashlib.sha256() + for chunk in iter(lambda: binary.read(1 << 20), b""): + digest.update(chunk) + self.report["binaries"][key] = { + "path": str(path), "sha256": digest.hexdigest() + } + self.configure() + probe_log = (self.root / "probe.log").open("w") + self.logs.append(probe_log) + self.probe = subprocess.Popen( + [args.probe], stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=probe_log, text=True, + ) + + def sql(self, statement, old=False, query=False, allow_error=False): + port = 6102 if old else 6101 + dsn = f"dump:111@tcp(127.0.0.1:{port})/?timeout=2s&readTimeout=35s&writeTimeout=35s&time_zone=%27%2B00%3A00%27" + self.probe.stdin.write(json.dumps({"dsn": dsn, "sql": statement, "query": query}) + "\n") + self.probe.stdin.flush() + if not select.select([self.probe.stdout], [], [], 40)[0]: + raise TimeoutError("SQL probe failed to honor its operation deadline") + line = self.probe.stdout.readline() + if not line: + raise RuntimeError("SQL probe exited") + response = json.loads(line) + key = ("old: " if old else "current: ") + statement + observation = self.report["sql_observations"].setdefault(key, {"attempts": 0, "changes": []}) + observation["attempts"] += 1 + if not observation["changes"] or observation["changes"][-1] != response: + observation["changes"].append(response) + if response["error"] and not allow_error: + raise RuntimeError(statement + ": " + response["error"]) + return response if allow_error else response["rows"] + + def q(self, statement, **kwargs): + return self.sql(statement, query=True, **kwargs) + + def passed(self, name, observation=None): + self.report["passed_cases"].append(name) + if observation is not None: + self.report["observations"][name] = observation + print("PASS", name, flush=True) + + def configure(self): + template = pathlib.Path("etc/launch") + for name in ("log", "tn", "cn"): + text = (template / (name + ".toml")).read_text() + text = text.replace("./mo-data", str(self.root / "data")) + text = text.replace("disableMetric = false", "disableMetric = true") + text = text.replace("enable-auto-id-cache = true", "enable-auto-id-cache = false") + text = text.replace("status-port = 7001", "status-port = " + {"log": "7301", "tn": "7302", "cn": "7303"}[name]) + if name == "cn": + text = text.replace("[cn]\n", "[cn]\nauto-upgrade = true\n") + (self.root / "cn.toml").write_text(text + "\n[cn.frontend]\nport=6101\n") + old = text.replace("dd1dccb4", "ee1dccb4").replace("18000", "20000") + old = old.replace("status-port = 7303", "status-port = 7304") + (self.root / "old.toml").write_text(old + "\n[cn.frontend]\nport=6102\n") + else: + (self.root / (name + ".toml")).write_text(text) + (self.root / "storage.toml").write_text( + f'logservices=["{self.root}/log.toml"]\ntnservices=["{self.root}/tn.toml"]\n' + ) + + def start(self, label, old=False, storage=False, fault="", role=None): + if storage: + # The regular -launch entry requires at least one CN. Separate + # native LOG/TN processes let a CN crash leave storage running. + processes = [] + for service, port in (("log", 32001), ("tn", 19000)): + p = self.start(label + "-" + service, old=old, role=service) + processes.append(p) + + def listening(): + if p.poll() is not None: + raise RuntimeError(f"{service} exited: {p.returncode}") + try: + with socket.create_connection(("127.0.0.1", port), timeout=1): + return True + except OSError: + return False + wait_for(service + " TCP readiness", listening) + return processes + log = (self.root / (label + ".log")).open("w") + self.logs.append(log) + binary = self.args.old_service if old else self.args.service + env = dict(os.environ) + env.pop("MO_MV_STARTUP_FAULT", None) + if fault: + env["MO_MV_STARTUP_FAULT"] = fault + config = role + ".toml" if role else "old.toml" if old else "cn.toml" + args = [binary, "-cfg", str(self.root / config)] + if role is None and not old: + args += ["-debug-http", "127.0.0.1:7603"] + p = subprocess.Popen(args, stdout=log, stderr=subprocess.STDOUT, env=env) + p.fixture_label = label + self.processes.append(p) + return p + + @staticmethod + def stop(p, crash=False): + if isinstance(p, list): + for child in reversed(p): + Fixture.stop(child, crash=crash) + return + if p.poll() is None: + if crash: + p.kill() + else: + p.terminate() + try: + p.wait(timeout=45) + except subprocess.TimeoutExpired: + p.kill() + p.wait() + raise + if crash and p.returncode != -9: + raise RuntimeError(f"expected SIGKILL, got {p.returncode}") + + def ready(self, p, old=False): + def check(): + if p.poll() is not None: + raise RuntimeError(f"server exited: {p.returncode}") + result = self.q("select 1", old=old, allow_error=True) + return result["rows"] == [["1"]] and not result["error"] + wait_for("normal authenticated SQL readiness", check) + + def await_log(self, label, needle, p): + def check(): + if p.poll() is not None: + raise RuntimeError(f"{label} exited: {p.returncode}") + return needle in (self.root / (label + ".log")).read_text(errors="replace") + wait_for(label + ": " + needle, check) + + def native_upgrade(self): + storage = self.start("old-storage", old=True, storage=True) + old = self.start("old-bootstrap", old=True) + self.ready(old, old=True) + assert self.q("select version,state from mo_catalog.mo_version order by create_at desc limit 1", old=True) == [[self.args.old_version, "2"]] + inventory = self.q("select mo_ctl('cn','GetProtocolVersion','')", old=True) + versions = json.loads(inventory[0][0])["result"] + assert versions and all(int(entry.rsplit(":", 1)[1]) == self.args.old_protocol for entry in versions.split(",")), inventory + self.report["old_protocol"] = self.args.old_protocol + self.sql("create database mv_recovery", old=True) + self.sql("create table mv_recovery.facts(id int primary key,v bigint)", old=True) + self.sql("insert into mv_recovery.facts values(1,10),(2,20)", old=True) + assert self.q("select count(*) from mo_catalog.mo_tables where reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state')", old=True) == [["0"]] + self.passed(f"ordinary authenticated {self.args.old_version} deployment", self.q("select sum(v) from mv_recovery.facts", old=True)) + # Retain the real old CN and LOG/TN while starting the new CN. Catalog + # installation must wait for the protocol barrier across this topology. + current = self.start("new-mixed", fault="mv_catalog_upgrade_after_ddl#2:2::#wait#0##false") + self.await_log("new-mixed", "requires all CNs to support protocol version 122", current) + self.await_log("new-mixed", "materialized view catalogs are not installed", current) + control = self.q("select count(*) from mo_catalog.mo_tables where reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state')", old=True, allow_error=True) + if not control["error"]: + assert control["rows"] == [["0"]], control + rejected = self.q("select 1", allow_error=True) + # Login waits for the target upgrade state (bounded by the probe's + # context), or reports the explicit earlier tenant-version fence. + assert any(message in rejected["error"] for message in ("tenant upgrade requires", "context deadline exceeded")), rejected + # New executor metadata itself must not enter the old scheduler, even + # though no MV can yet be created. Unknown-executor failures on old CNs + # are not an acceptable way to implement capability exclusion. + for table in ("sys_cron_task", "sys_async_task"): + assert self.q(f"select count(*) from mo_task.{table} where task_metadata_executor=17", old=True) == [["0"]] + assert "executor with code 17 not exists" not in (self.root / "old-bootstrap.log").read_text(errors="replace") + self.passed("old nodes block MV catalog migration and new-CN login remains pending", {"new_login": rejected, "old_catalog_control": control}) + self.passed("mixed old nodes never receive MV cron or asynchronous task metadata") + self.stop(current) + self.stop(old) + self.stop(storage) + storage = self.start("new-storage", storage=True) + current = self.start("new-staged-migration", fault="mv_catalog_upgrade_after_ddl#2:2::#wait#0##false") + + # The startup-only tagged hook waits after the second real DDL. SQL + # login correctly cannot happen yet; inspect the existing debug stack. + def staged(): + if current.poll() is not None: + raise RuntimeError("upgrader exited") + try: + with urllib.request.urlopen("http://127.0.0.1:7603/debug/pprof/goroutine?debug=2", timeout=3) as response: + stack = response.read().decode() + if "v4_0_18.(*versionHandle).HandleClusterUpgrade" in stack and "fault.(*faultEntry).doWithContext" in stack: + (self.root / "interrupted-upgrade.stack").write_text(stack) + return True + except OSError: + return False + return False + wait_for("two catalog DDLs staged before commit", staged, seconds=240) + self.stop(current, crash=True) + self.passed("SIGKILL after two catalog DDLs before migration commit") + current = self.start("new-migration-recovery") + self.ready(current) + self.await_log("new-migration-recovery", "ISCP-Task Start", current) + self.assert_catalogs() + assert self.q("select sum(v) from mv_recovery.facts") == [["30"]] + self.passed("interrupted migration recovers atomically with ordinary data intact") + self.stop(current) + current = self.start("new-migration-repeat") + self.ready(current) + self.assert_catalogs() + self.passed("repeated automatic upgrade has exactly four catalogs and one ready target") + return current + + def assert_catalogs(self): + assert self.q("select version,version_offset,state from mo_catalog.mo_version where version='4.0.18'") == [["4.0.18", "5", "2"]] + assert self.q("select relname,count(*) from mo_catalog.mo_tables where account_id=0 and reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state') group by relname order by relname") == [ + ["mo_materialized_views", "1"], ["mo_mv_account_state", "1"], ["mo_mv_dependencies", "1"], ["mo_mv_refresh_runs", "1"]] + + def snapshot(self): + # One snapshot includes result rows, source provenance and run status. + return self.q("select m.n,m.s,v.last_run,v.successful_sequence,v.source_physical,v.source_logical,r.status,r.source_physical,r.source_logical from mv_recovery.result m,mo_catalog.mo_materialized_views v,mo_catalog.mo_mv_refresh_runs r where v.account_id=0 and v.database_name='mv_recovery' and v.name='result' and r.account_id=v.account_id and r.mv_id=v.mv_id and r.run_id=v.last_run") + + def enable(self, point, action="wait", argument=0): + self.q("select enable_fault_injection()") + self.q(f"select add_fault_point('{point}',':::','{action}',{argument},'')") + self.q(f"select add_fault_point('mv_probe_waiters',':::','getwaiters',0,'{point}')") + self.q(f"select add_fault_point('mv_probe_count',':::','getcount',0,'{point}')") + + def crash_refresh(self, current, phase, value): + before = self.snapshot() + self.sql(f"update mv_recovery.facts set v={value}") + self.enable("mv_refresh_" + phase) + self.sql("update mo_catalog.mo_materialized_views set next_due=current_timestamp() where account_id=0 and database_name='mv_recovery' and name='result'") + wait_for("refresh " + phase + " barrier", lambda: self.q("select trigger_fault_point('mv_probe_waiters')") == [["1"]], seconds=120) + assert self.q("select trigger_fault_point('mv_probe_count')") == [["1"]] + run = self.q("select run_id,sequence,status from mo_catalog.mo_mv_refresh_runs where account_id=0 and mv_id=(select mv_id from mo_catalog.mo_materialized_views where account_id=0 and database_name='mv_recovery' and name='result') order by sequence desc limit 1")[0] + assert len(run[0]) == 64, run # Actual periodic task, not a manual UUID. + queue = self.q(f"select task_status,task_runner from mo_task.sys_async_task where task_metadata_id='mv:{run[0][:40]}'") + assert len(queue) == 1 and queue[0][0] == "1", queue + committed = self.snapshot() + if phase == "before_commit": + assert committed == before and run[2] == "RUNNING", (before, committed, run) + else: + assert committed[0][:2] == ["2", str(2 * value)] and run[2] == "SUCCEEDED", (committed, run) + assert committed[0][2] == run[0] and committed[0][4:6] == committed[0][7:9], committed + self.stop(current, crash=True) + self.passed("SIGKILL periodic refresh " + phase, {"before": before, "at_barrier": committed, "run": run, "queue": queue}) + current = self.start("recovery-" + phase) + self.ready(current) + recovered = self.snapshot() + if phase == "after_commit": + assert recovered == committed, (committed, recovered) + elif recovered != before: + assert len(recovered) == 1 and recovered[0][:4] == ["2", str(2 * value), run[0], run[1]], recovered + assert recovered[0][6] == "SUCCEEDED" and recovered[0][4:6] == recovered[0][7:9], recovered + # Observe the same durable queue identity being acknowledged (or GC'd) + # after restart. No hand-written task rows or run-state repair. + def replayed(): + result = self.q(f"select task_status from mo_task.sys_async_task where task_metadata_id='mv:{run[0][:40]}'") + return result in ([], [["2"]]) + wait_for("actual task replay acknowledgement", replayed, seconds=240) + after = self.snapshot() + assert len(after) == 1 and after[0][:2] == ["2", str(2 * value)], after + assert after[0][2] == run[0] and after[0][3] == run[1], (run, after) + assert after[0][6] == "SUCCEEDED" and after[0][4:6] == after[0][7:9], after + assert tuple(map(int, after[0][4:6])) > tuple(map(int, before[0][4:6])), (before, after) + if phase == "after_commit": + assert after == committed, (committed, after) # No second publication. + assert self.q("select count(*) from mo_catalog.mo_mv_refresh_runs where run_id='" + run[0] + "'") == [["1"]] + self.passed("restart and same-run replay " + phase, {"after_restart": recovered, "after_ack": after}) + return current + + def run(self): + if self.args.refresh_only: + self.start("storage", storage=True) + current = self.start("initial") + self.ready(current) + self.sql("create database mv_recovery") + self.sql("create table mv_recovery.facts(id int primary key,v bigint)") + self.sql("insert into mv_recovery.facts values(1,10),(2,20)") + else: + current = self.native_upgrade() + self.sql("set experimental_materialized_view=1") + self.sql("create materialized view mv_recovery.result refresh every interval 1 day as select count(*) as n,sum(v) as s from mv_recovery.facts") + self.sql("refresh materialized view mv_recovery.result") + initial = self.snapshot() + assert initial[0][:2] == ["2", "30"], initial + if not self.args.refresh_only: + # Normal automatic-upgrade startup of an actual old binary must refuse + # the persisted newer cluster before admitting SQL or scheduled work. + old = self.start("unsafe-downgrade", old=True) + wait_for("unsafe old-binary startup refused", lambda: old.poll() is not None, seconds=120) + log = (self.root / "unsafe-downgrade.log").read_text(errors="replace") + fences = (f"cannot startup a old version {self.args.old_version} to join cluster, current version is 4.0.18", + f"requires persisted expression protocol version 122 (local version {self.args.old_protocol})") + reason = next((fence for fence in fences if fence in log), None) + assert old.returncode != 0 and reason, log[-3000:] + assert self.snapshot() == initial + assert self.q("select count(*) from mo_task.sys_async_task where task_metadata_executor=17 and task_runner='ee1dccb4-4d3c-41f8-b482-5251dc7a41bf'") == [["0"]] + self.passed("old binary refuses downgrade with populated periodic MV before SQL/task admission", {"exit_code": old.returncode, "fence": reason}) + # Wait for failed old-node liveness to leave the protocol inventory. + wait_for("old node removed from protocol inventory", lambda: not self.q("select mo_ctl('cn','GetProtocolVersion','')", allow_error=True)["error"], seconds=240) + self.sql("update mv_recovery.facts set v=25") + self.enable("mv_refresh_after_commit", action="echo", argument=1) + self.sql("refresh materialized view mv_recovery.result") + assert self.q("select trigger_fault_point('mv_probe_count')") == [["1"]] + lost = self.snapshot() + assert lost[0][:2] == ["2", "50"] and lost[0][6] == "SUCCEEDED" and lost[0][4:6] == lost[0][7:9], lost + assert self.q("select count(*) from mo_catalog.mo_mv_refresh_runs where status='FAILED'") == [["0"]] + self.q("select disable_fault_injection()") + self.passed("native durable commit response loss resolves to success", lost) + current = self.crash_refresh(current, "before_commit", 40) + current = self.crash_refresh(current, "after_commit", 60) + self.sql("drop materialized view mv_recovery.result") + self.sql("drop database mv_recovery") + assert self.q("select count(*) from mo_catalog.mo_database where datname='mv_recovery'") == [["0"]] + for table in ("mo_materialized_views", "mo_mv_dependencies", "mo_mv_refresh_runs"): + assert self.q("select count(*) from mo_catalog." + table) == [["0"]] + # Queue completion precedes HAKeeper's periodic GC. A completed row is + # not an active task leak; require terminal status, then actual removal. + assert self.q("select count(*) from mo_task.sys_async_task where task_metadata_id like 'mv:%' and task_status<>2") == [["0"]] + wait_for("completed per-view task GC", lambda: self.q("select count(*) from mo_task.sys_async_task where task_metadata_id like 'mv:%'") == [["0"]], seconds=60) + self.passed("native fixture removes MV rows, dependencies, history and per-view tasks") + + def close(self): + errors = [] + for process in reversed(self.processes): + try: + self.stop(process) + except Exception as error: + errors.append(str(error)) + self.probe.stdin.close() + try: + self.probe.wait(timeout=5) + except subprocess.TimeoutExpired: + self.probe.kill() + self.probe.wait() + for log in self.logs: + log.close() + if errors: + self.report["cleanup_errors"] = errors + self.report["process_exits"] = {p.fixture_label: p.returncode for p in self.processes} + self.report["elapsed_seconds"] = time.monotonic() - self.started + (self.root / "results.json").write_text(json.dumps(self.report, indent=2) + "\n") + if errors: + raise RuntimeError(errors) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--refresh-only", action="store_true", + help="fresh current cluster: run commit-loss and refresh crash/replay cases without upgrade/downgrade") + parser.add_argument("--service", required=True) + parser.add_argument("--old-service", help="required unless --refresh-only is selected") + parser.add_argument("--old-version", default="4.0.17", help="catalog version of the pinned old binary") + parser.add_argument("--old-protocol", type=int, default=121, + help="expected protocol of the pinned old binary (121 by default)") + parser.add_argument("--probe", required=True) + parser.add_argument("--work-dir", required=True) + args = parser.parse_args() + if not args.refresh_only and not args.old_service: + parser.error("--old-service is required for upgrade/downgrade validation") + fixture = Fixture(args) + try: + fixture.run() + except BaseException as error: + fixture.report["error"] = repr(error) + raise + finally: + fixture.close() + + +if __name__ == "__main__": + main() diff --git a/optools/run_bvt_group.sh b/optools/run_bvt_group.sh index 1984aac8bfb6b..3d7b2bdb0db5c 100644 --- a/optools/run_bvt_group.sh +++ b/optools/run_bvt_group.sh @@ -70,3 +70,13 @@ printf '%s\n' "${included_scripts[@]}" cd "${tester_dir}" ./run.sh -n -g -o -p "${case_root}" -i "${include_list}" "${resource_args[@]}" + +# Native MV checks need two independently addressed CNs and typed SQL oracles. +# Run once, after mo-tester's global restore/account fixtures have finished. +if (( group_id == 0 )); then + repo_root=$(cd "${case_root}/../../.." && pwd) + if [[ -f "${repo_root}/test/materialized_view/main.go" ]]; then + bash "${repo_root}/optools/run_materialized_view_bvt.sh" \ + "${repo_root}" "${tester_dir}/report/materialized_view" + fi +fi diff --git a/optools/run_materialized_view_bvt.sh b/optools/run_materialized_view_bvt.sh new file mode 100644 index 0000000000000..a091abcd58de0 --- /dev/null +++ b/optools/run_materialized_view_bvt.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +# SQL contract checks reuse the existing multi-CN BVT deployment. Performance +# and restart experiments remain separate, explicitly invoked validation modes. +set -euo pipefail +if [[ $# != 2 ]]; then + echo "Usage: $0 " >&2 + exit 2 +fi +repo_root=$(cd "$1" && pwd) +mkdir -p "$2" "${repo_root}/coverage" +report_dir=$(cd "$2" && pwd) +coverage_dir=$(cd "${repo_root}/coverage" && pwd) +# A rerun must not accept a previous success if the client cannot write JSON. +rm -f "${report_dir}/consumers.json" "${report_dir}/functional.json" "${report_dir}/failure.json" "${report_dir}/multi-cn.json" "${report_dir}/native-probe.json" + +cn_dsn() { + local endpoint port + endpoint=$(docker compose -f "${repo_root}/etc/launch-tae-compose/compose.yaml" \ + --profile launch-multi-cn port "$1" 6001) + port=${endpoint##*:} + [[ "${port}" =~ ^[0-9]+$ ]] + printf 'dump:111@tcp(127.0.0.1:%s)/?timeout=5s&readTimeout=330s&writeTimeout=330s' "${port}" +} + +# Overrides support an existing local deployment without starting more servers. +primary_dsn=${MV_BVT_DSN:-$(cn_dsn cn-0)} +second_dsn=${MV_BVT_SECOND_DSN:-$(cn_dsn cn-1)} +build_dir=$(mktemp -d) +trap 'rm -rf "${build_dir}"' EXIT +cd "${repo_root}" +# Match mo-service's default -cover mode so covdata can combine the producer. +CGO_ENABLED=0 go build -mod=readonly -cover -covermode=set \ + -o "${build_dir}/mv-validation" ./test/materialized_view +CGO_ENABLED=0 go build -mod=readonly -cover -covermode=set \ + -o "${build_dir}/mv-native-probe" ./test/materialized_view/native_probe +export GOCOVERDIR="${coverage_dir}" +# The same JSON bridge drives the destructive native recovery suite. Exercise +# its public stream/session/error contract on this existing deployment too; +# its coverage counters join the unchanged UT/BVT coverage aggregation. +python3 "${repo_root}/test/materialized_view/native_probe/check.py" \ + "${build_dir}/mv-native-probe" "${primary_dsn}" > "${report_dir}/native-probe.json" +"${build_dir}/mv-validation" -dsn "${primary_dsn}" -functional \ + -output "${report_dir}/functional.json" +"${build_dir}/mv-validation" -dsn "${primary_dsn}" -edge-check \ + -output "${report_dir}/failure.json" +"${build_dir}/mv-validation" -dsn "${primary_dsn}" -consumer-check -second-dsn "${second_dsn}" \ + -output "${report_dir}/consumers.json" +"${build_dir}/mv-validation" -dsn "${primary_dsn}" -second-dsn "${second_dsn}" \ + -output "${report_dir}/multi-cn.json" +# Fail closed if a mode exits without its nonempty, successful evidence report. +python3 - "${report_dir}" <<'PY' +import json +import pathlib +import sys + +probe = json.loads((pathlib.Path(sys.argv[1]) / "native-probe.json").read_text()) +if probe != {"runs": [{"passed_requests": 9, "process_exit": 0}] * 2}: + raise SystemExit("Incomplete materialized-view native SQL bridge checks") +print("Materialized-view native SQL bridge: 2 x 9 requests passed") + +for name in ("functional", "failure", "consumers", "multi-cn"): + result = json.loads((pathlib.Path(sys.argv[1]) / (name + ".json")).read_text()) + if result.get("error") or not result.get("passed_cases"): + raise SystemExit("Incomplete materialized-view BVT: " + name) + print("Materialized-view BVT:", name, len(result["passed_cases"]), "checks passed") +PY diff --git a/pkg/bootstrap/columns_upgrade_test.go b/pkg/bootstrap/columns_upgrade_test.go index 78fd928893a9b..286d319d60c22 100644 --- a/pkg/bootstrap/columns_upgrade_test.go +++ b/pkg/bootstrap/columns_upgrade_test.go @@ -37,7 +37,8 @@ func TestColumnsUpgradeReachesExistingTenants(t *testing.T) { current := versions.Version{Version: "4.0.16", VersionOffset: 1, State: versions.StateReady} definition := sysview.InformationSchemaColumnsV109DDL() tenantVersion := "4.0.16" - var queuedVersion, queuedRoute bool + var queuedVersion bool + var queuedRoutes []string var writes []string failCreate := false injected := errors.New("injected COLUMNS create failure") @@ -55,12 +56,11 @@ func TestColumnsUpgradeReachesExistingTenants(t *testing.T) { case strings.HasPrefix(sql, "select version from mo_version"): return newBootstrapStringResult("4.0.16"), nil case strings.HasPrefix(sql, "insert into mo_version"): - require.Contains(t, sql, "'4.0.17', 1, 0") + require.Contains(t, sql, "'4.0.18', 5, 0") queuedVersion = true case strings.HasPrefix(sql, "insert into mo_upgrade"): - require.Contains(t, sql, "'4.0.16'") - require.Contains(t, sql, "'4.0.17'") - queuedRoute = true + require.Contains(t, sql, "'4.0.18'") + queuedRoutes = append(queuedRoutes, sql) case strings.HasPrefix(sql, "select create_version from mo_account"): return newBootstrapStringResult(tenantVersion), nil case strings.HasPrefix(sql, "SELECT tbl.rel_createsql"): @@ -80,6 +80,11 @@ func TestColumnsUpgradeReachesExistingTenants(t *testing.T) { "tenant completion must follow the successful view refresh") tenantVersion = "4.0.17" return executor.Result{AffectedRows: 1}, nil + case sql == "update mo_account set create_version = '4.0.18' where account_id = 7": + require.Equal(t, "4.0.17", tenantVersion, "retain the upstream tenant repair hop") + require.Equal(t, sysview.InformationSchemaColumnsDDL, definition) + tenantVersion = "4.0.18" + return executor.Result{AffectedRows: 1}, nil default: return executor.Result{}, fmt.Errorf("unexpected upgrade SQL: %s", sql) } @@ -91,18 +96,22 @@ func TestColumnsUpgradeReachesExistingTenants(t *testing.T) { final := s.getFinalVersionHandle().Metadata() require.NoError(t, s.doCheckUpgrade(t.Context())) require.True(t, queuedVersion) - require.True(t, queuedRoute, "a completed 4.0.16 cluster must queue the forward repair") - require.Equal(t, "4.0.17", final.Version) - require.Equal(t, "4.0.16", final.MinUpgradeVersion) - require.Equal(t, uint32(1), final.VersionOffset) - require.Equal(t, defines.MORPCVersion118, final.RequiredProtocolVersion) + require.Len(t, queuedRoutes, 2, "retain the tenant repair and later MV catalog hops") + require.Contains(t, queuedRoutes[0], "'4.0.16'") + require.Contains(t, queuedRoutes[0], "'4.0.17'") + require.Contains(t, queuedRoutes[1], "'4.0.17'") + require.Contains(t, queuedRoutes[1], "'4.0.18'") + require.Equal(t, "4.0.18", final.Version) + require.Equal(t, "4.0.17", final.MinUpgradeVersion) + require.Equal(t, uint32(5), final.VersionOffset) + require.Equal(t, defines.MORPCVersion122, final.RequiredProtocolVersion) // Model a tenant created by an old CN after batch enumeration: the // cluster route has finished, but its persisted account version is old. current = final current.State = versions.StateReady failCreate = true - fetchTenant := func() (int32, string, error) { return 7, "4.0.17", nil } + fetchTenant := func() (int32, string, error) { return 7, "4.0.18", nil } upgraded, err := s.MaybeUpgradeTenant(t.Context(), fetchTenant, nil) require.ErrorIs(t, err, injected) require.False(t, upgraded) @@ -114,7 +123,7 @@ func TestColumnsUpgradeReachesExistingTenants(t *testing.T) { require.NoError(t, err) require.True(t, upgraded) require.Equal(t, []string{"DROP VIEW IF EXISTS information_schema.COLUMNS;", sysview.InformationSchemaColumnsDDL}, writes) - require.Equal(t, "4.0.17", tenantVersion) + require.Equal(t, "4.0.18", tenantVersion) require.Equal(t, sysview.InformationSchemaColumnsDDL, definition) writes = nil upgraded, err = s.MaybeUpgradeTenant(t.Context(), fetchTenant, nil) diff --git a/pkg/bootstrap/service_statistics_upgrade_test.go b/pkg/bootstrap/service_statistics_upgrade_test.go index 1d1925c5f9959..a5e2eac2fe779 100644 --- a/pkg/bootstrap/service_statistics_upgrade_test.go +++ b/pkg/bootstrap/service_statistics_upgrade_test.go @@ -29,6 +29,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_14" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_15" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_16" + "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_17" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_6" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_7" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_8" @@ -82,6 +83,7 @@ func TestDoCheckUpgradeQueuesStatisticsRefresh(t *testing.T) { {name: "current_4.0.14", version: "4.0.14", offset: v4_0_14.Handler.Metadata().VersionOffset, upgrade: true}, {name: "current_4.0.15", version: "4.0.15", offset: v4_0_15.Handler.Metadata().VersionOffset, upgrade: true}, {name: "current_4.0.16", version: "4.0.16", offset: v4_0_16.Handler.Metadata().VersionOffset, upgrade: true}, + {name: "current_4.0.17", version: "4.0.17", offset: v4_0_17.Handler.Metadata().VersionOffset, upgrade: true}, {name: "current", version: final.Version, offset: final.VersionOffset}, } { t.Run(test.name, func(t *testing.T) { @@ -117,6 +119,9 @@ func TestDoCheckUpgradeQueuesStatisticsRefresh(t *testing.T) { require.NoError(t, b.doCheckUpgrade(context.Background())) if test.upgrade { hops := []versions.Version{final} + if versions.Compare(test.version, "4.0.17") < 0 { + hops = append([]versions.Version{v4_0_17.Handler.Metadata()}, hops...) + } if versions.Compare(test.version, "4.0.16") < 0 { hops = append([]versions.Version{v4_0_16.Handler.Metadata()}, hops...) } diff --git a/pkg/bootstrap/upgrade.go b/pkg/bootstrap/upgrade.go index fd5b118047547..ff004169ece01 100644 --- a/pkg/bootstrap/upgrade.go +++ b/pkg/bootstrap/upgrade.go @@ -36,6 +36,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_15" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_16" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_17" + "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_18" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_2" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_3" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_4" @@ -81,6 +82,7 @@ func (s *service) initUpgrade() { s.handles = append(s.handles, v4_0_15.Handler) s.handles = append(s.handles, v4_0_16.Handler) s.handles = append(s.handles, v4_0_17.Handler) + s.handles = append(s.handles, v4_0_18.Handler) } func (s *service) getFinalVersionHandle() VersionHandle { diff --git a/pkg/bootstrap/versions/v4_0_18/upgrade.go b/pkg/bootstrap/versions/v4_0_18/upgrade.go new file mode 100644 index 0000000000000..d1731592503d7 --- /dev/null +++ b/pkg/bootstrap/versions/v4_0_18/upgrade.go @@ -0,0 +1,84 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v4_0_18 + +import ( + "context" + "strings" + + "github.com/matrixorigin/matrixone/pkg/bootstrap/versions" + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/util/fault" +) + +var Handler = &versionHandle{ + metadata: versions.Version{ + Version: "4.0.18", + MinUpgradeVersion: "4.0.17", + UpgradeCluster: versions.Yes, + UpgradeTenant: versions.No, + VersionOffset: uint32(len(catalog.MaterializedViewCatalogDDLs) + 1), + RequiredProtocolVersion: defines.MORPCVersion122, + }, +} + +type versionHandle struct { + metadata versions.Version +} + +func (v *versionHandle) Metadata() versions.Version { + return v.metadata +} + +func (v *versionHandle) Prepare(_ context.Context, txn executor.TxnExecutor, _ bool) error { + txn.Use(catalog.MO_CATALOG) + return nil +} + +func (v *versionHandle) HandleTenantUpgrade(_ context.Context, tenantID int32, txn executor.TxnExecutor) error { + return nil +} + +func (v *versionHandle) HandleClusterUpgrade(ctx context.Context, tx executor.TxnExecutor) error { + // This version has no tenant-upgrade phase, so the framework's tenant + // protocol check does not run. Fence old CNs before installing MV catalogs. + if err := versions.CheckCommonProtocolVersion(tx, v.metadata.RequiredProtocolVersion); err != nil { + return err + } + for _, ddl := range catalog.MaterializedViewCatalogDDLs { + ddl = strings.Replace(ddl, "create cluster table ", "create cluster table if not exists ", 1) + result, err := tx.Exec(ddl, executor.StatementOption{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + result.Close() + fault.TriggerFaultWithContext(ctx, "mv_catalog_upgrade_after_ddl") + } + // Format 1 lacks the captured division context. Pause legacy policies and + // fence queued work without guessing semantics or rewriting stored rows. + r, err := tx.Exec("update mo_catalog.mo_materialized_views set interval_seconds=0,next_due=null,epoch=epoch+1 where interval_seconds>0 and cast(json_extract(definition,'$.format_version') as int)=1", executor.StatementOption{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + r.Close() + return nil +} + +func (v *versionHandle) HandleCreateFrameworkDeps(_ executor.TxnExecutor) error { + return moerr.NewInternalErrorNoCtxf("Only v1.2.0 can initialize upgrade framework, current version is:%s", v.metadata.Version) +} diff --git a/pkg/bootstrap/versions/v4_0_18/upgrade_test.go b/pkg/bootstrap/versions/v4_0_18/upgrade_test.go new file mode 100644 index 0000000000000..55ec9622dd5b9 --- /dev/null +++ b/pkg/bootstrap/versions/v4_0_18/upgrade_test.go @@ -0,0 +1,87 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v4_0_18 + +import ( + "context" + "errors" + "strings" + "testing" + + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewUpgrade(t *testing.T) { + require.Equal(t, "4.0.18", Handler.Metadata().Version) + require.Equal(t, "4.0.17", Handler.Metadata().MinUpgradeVersion) + require.Equal(t, uint32(5), Handler.Metadata().VersionOffset) + require.Equal(t, defines.MORPCVersion122, Handler.Metadata().RequiredProtocolVersion) + for _, scenario := range []string{"ready", "DDL failure", "old CN", "protocol query failure"} { + t.Run(scenario, func(t *testing.T) { + calls := 0 + injected := errors.New("catalog creation failed") + mp := mpool.MustNewZeroNoFixed() + t.Cleanup(func() { + defer mpool.DeleteMPool(mp) + require.Zero(t, mp.CurrNB()) + }) + tx := executor.NewMemTxnExecutor(func(sql string) (executor.Result, error) { + if sql == "SELECT mo_ctl('cn', 'GetProtocolVersion', '')" { + if scenario == "protocol query failure" { + return executor.Result{}, injected + } + value := `{"result":"cn-a:122,cn-b:122"}` + if scenario == "old CN" { + value = `{"result":"cn-a:122,cn-b:121"}` + } + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendStringRows(r, 0, []string{value})) + return r.GetResult(), nil + } + calls++ + if calls <= 4 { + require.True(t, strings.HasPrefix(sql, "create cluster table if not exists mo_catalog.mo_")) + } else { + require.Contains(t, sql, "set interval_seconds=0,next_due=null,epoch=epoch+1") + require.Contains(t, sql, "cast(json_extract(definition,'$.format_version') as int)=1") + } + if scenario == "DDL failure" && calls == 2 { + return executor.Result{}, injected + } + return executor.Result{}, nil + }, nil) + err := Handler.HandleClusterUpgrade(context.Background(), tx) + switch scenario { + case "old CN": + require.ErrorContains(t, err, "requires all CNs to support protocol version 122") + require.Zero(t, calls, "old CN must block before the first catalog DDL") + case "protocol query failure": + require.ErrorIs(t, err, injected) + require.Zero(t, calls) + case "DDL failure": + require.ErrorIs(t, err, injected) + require.Equal(t, 2, calls) + default: + require.NoError(t, err) + require.Equal(t, 5, calls) + } + }) + } +} diff --git a/pkg/catalog/materialized_view.go b/pkg/catalog/materialized_view.go new file mode 100644 index 0000000000000..88ebecb149e45 --- /dev/null +++ b/pkg/catalog/materialized_view.go @@ -0,0 +1,197 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package catalog + +import ( + "encoding/json" + "time" + + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/pb/plan" +) + +const SystemMaterializedViewRel = "m" +const MVDefinitionFormatVersion = 2 + +const MaterializedViewProperty = "mo_materialized_view" +const MO_MATERIALIZED_VIEWS = "mo_materialized_views" +const MO_MV_DEPENDENCIES = "mo_mv_dependencies" +const MO_MV_REFRESH_RUNS = "mo_mv_refresh_runs" +const MO_MV_ACCOUNT_STATE = "mo_mv_account_state" + +func IsMaterializedViewDatabase(database string) bool { + switch database { + case "mo_catalog", "information_schema", "system", "mysql", "mo_task", "system_metrics": + return false + default: + return true + } +} + +type MVSource struct { + AccountID uint32 `json:"account_id"` + DatabaseID uint64 `json:"database_id"` + TableID uint64 `json:"table_id"` + LogicalID uint64 `json:"logical_id"` + Version uint32 `json:"version"` + Database string `json:"database"` + Table string `json:"table"` +} + +// MVDefinition is immutable for a stored relation. Runtime coverage and schedule +// are authoritative in mo_materialized_views, not in this property. +type MVDefinition struct { + DivPrecisionIncrement *int32 `json:"div_precision_increment,omitempty"` + TimeZoneKind string `json:"time_zone_kind,omitempty"` + FormatVersion uint32 `json:"format_version"` + Query string `json:"query"` + CreateSQL string `json:"create_sql"` + Database string `json:"database"` + Sources []MVSource `json:"sources"` + IntervalSeconds int64 `json:"interval_seconds"` + SQLMode string `json:"sql_mode"` + TimeZone string `json:"time_zone"` + TimeZoneOffset int32 `json:"time_zone_offset_seconds"` + LowerCaseTableNames int64 `json:"lower_case_table_names"` + OwnerUser uint32 `json:"owner_user"` + OwnerRole uint32 `json:"owner_role"` + OwnerName string `json:"owner_name"` +} + +func MaterializedViewDefinition(def *plan.TableDef) (*MVDefinition, error) { + if def == nil || def.TableType != SystemMaterializedViewRel { + return nil, nil + } + var value string + for _, p := range def.Props { + if p.Key == MaterializedViewProperty { + value = p.Value + } + } + for _, d := range def.Defs { + if ps := d.GetProperties(); ps != nil { + for _, p := range ps.Properties { + if p.Key == MaterializedViewProperty { + value = p.Value + } + } + } + } + return DecodeMaterializedViewDefinition(value) +} + +func DecodeMaterializedViewDefinition(value string) (*MVDefinition, error) { + var result MVDefinition + if value == "" { + return nil, moerr.NewInternalErrorNoCtx("materialized view definition is missing") + } + // Presence matters: an explicitly empty SQL mode is reproducible, while an + // absent/null field cannot establish format-2 binding semantics. + persisted := struct { + *MVDefinition + SQLMode *string `json:"sql_mode"` + }{MVDefinition: &result} + if err := json.Unmarshal([]byte(value), &persisted); err != nil { + return nil, err + } + if persisted.SQLMode != nil { + result.SQLMode = *persisted.SQLMode + } + if (result.FormatVersion != 1 && result.FormatVersion != MVDefinitionFormatVersion) || result.Query == "" || len(result.Sources) == 0 { + return nil, moerr.NewInternalErrorNoCtx("unsupported materialized view definition") + } + if result.FormatVersion == MVDefinitionFormatVersion { + if persisted.SQLMode == nil { + return nil, moerr.NewInternalErrorNoCtx("materialized view SQL mode is missing") + } + if result.DivPrecisionIncrement == nil || *result.DivPrecisionIncrement < 0 || *result.DivPrecisionIncrement > 30 { + return nil, moerr.NewInternalErrorNoCtx("invalid materialized view division precision") + } + if result.TimeZone == "" || (result.TimeZoneKind != "named" && result.TimeZoneKind != "fixed") || + result.TimeZoneOffset < -24*60*60 || result.TimeZoneOffset > 24*60*60 { + return nil, moerr.NewInternalErrorNoCtx("invalid materialized view timezone") + } + } + return &result, nil +} + +// RefreshTimeZone admits only definitions with reproducible binding semantics. +// Older materializations remain readable but must be recreated before refresh. +func (d *MVDefinition) RefreshTimeZone() (*time.Location, error) { + if d.FormatVersion != MVDefinitionFormatVersion { + return nil, moerr.NewNotSupportedNoCtx("recreate the materialized view before refreshing: legacy definition lacks captured query semantics") + } + if d.TimeZoneKind == "fixed" { + return time.FixedZone(d.TimeZone, int(d.TimeZoneOffset)), nil + } + zone, err := time.LoadLocation(d.TimeZone) + if err != nil || d.TimeZone == "Local" { + return nil, moerr.NewInvalidInputNoCtxf("materialized view timezone %q is unavailable; named timezone rules are required", d.TimeZone) + } + return zone, nil +} + +const MoMaterializedViewsDDL = `create cluster table mo_catalog.mo_materialized_views ( + mv_id bigint unsigned not null, + database_id bigint unsigned not null, + database_name varchar(64) not null, + name varchar(64) not null, + definition text not null, + epoch bigint unsigned not null default 1, + requested_sequence bigint unsigned not null default 0, + successful_sequence bigint unsigned not null default 0, + populated bool not null default false, + last_run varchar(64) not null default '', + source_physical bigint not null default 0, + source_logical int unsigned not null default 0, + last_success timestamp null, + interval_seconds bigint not null default 0, + next_due timestamp null, + next_cleanup timestamp not null default current_timestamp(), + primary key(account_id,mv_id), + unique key mv_name(account_id,database_name,name), + index mv_due(next_due,account_id,mv_id), + index mv_cleanup(next_cleanup,account_id,mv_id) +)` +const MoMVDependenciesDDL = `create cluster table mo_catalog.mo_mv_dependencies ( + mv_id bigint unsigned not null, + source_database_id bigint unsigned not null, + source_table_id bigint unsigned not null, + source_logical_id bigint unsigned not null, + source_version int unsigned not null, + primary key(account_id,mv_id,source_table_id), + index mv_source(account_id,source_table_id) +)` +const MoMVRefreshRunsDDL = `create cluster table mo_catalog.mo_mv_refresh_runs ( + mv_id bigint unsigned not null, + run_id varchar(64) not null, + sequence bigint unsigned not null, + epoch bigint unsigned not null, + status varchar(16) not null, + started_at timestamp not null, + finished_at timestamp null, + source_physical bigint not null default 0, + source_logical int unsigned not null default 0, + error_message varchar(1024) not null default '', + primary key(account_id,mv_id,run_id), + index mv_history(account_id,mv_id,started_at), + index mv_expired(status,started_at) +)` +const MoMVAccountStateDDL = `create cluster table mo_catalog.mo_mv_account_state ( + revision bigint unsigned not null default 0, + primary key(account_id) +)` + +var MaterializedViewCatalogDDLs = []string{MoMaterializedViewsDDL, MoMVDependenciesDDL, MoMVRefreshRunsDDL, MoMVAccountStateDDL} diff --git a/pkg/catalog/materialized_view_test.go b/pkg/catalog/materialized_view_test.go new file mode 100644 index 0000000000000..e5526e17a5cc1 --- /dev/null +++ b/pkg/catalog/materialized_view_test.go @@ -0,0 +1,106 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package catalog + +import ( + "encoding/json" + "fmt" + "testing" + "time" + + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewDefinitionPersistence(t *testing.T) { + def := MVDefinition{FormatVersion: 1, Query: "select k,sum(v) from db.t group by k", Sources: []MVSource{{AccountID: 7, DatabaseID: 3, TableID: 8, LogicalID: 9, Version: 2, Database: "db", Table: "t"}}, SQLMode: "NO_UNSIGNED_SUBTRACTION", TimeZone: "Asia/Shanghai", OwnerUser: 10, OwnerRole: 11, OwnerName: "owner"} + data, err := json.Marshal(def) + require.NoError(t, err) + for _, props := range []bool{true, false} { + table := &plan.TableDef{TableType: SystemMaterializedViewRel} + if props { + table.Props = []*plan.PropertyDef{{Key: MaterializedViewProperty, Value: string(data)}} + } else { + table.Defs = []*plan.TableDef_DefType{{Def: &plan.TableDef_DefType_Properties{Properties: &plan.PropertiesDef{Properties: []*plan.Property{{Key: MaterializedViewProperty, Value: string(data)}}}}}} + } + decoded, err := MaterializedViewDefinition(table) + require.NoError(t, err) + require.Equal(t, def, *decoded) + } + for _, raw := range []string{"", "invalid", `{"format_version":2,"query":"select * from t","sources":[{}]}`, `{"format_version":1,"query":"select 1"}`} { + _, err := MaterializedViewDefinition(&plan.TableDef{TableType: SystemMaterializedViewRel, Props: []*plan.PropertyDef{{Key: MaterializedViewProperty, Value: raw}}}) + require.Error(t, err) + if raw != "invalid" { + require.True(t, moerr.IsMoErrCode(err, moerr.ErrInternal), "stored definition failures must use the engine error contract") + } + } + decoded, err := MaterializedViewDefinition(&plan.TableDef{TableType: SystemOrdinaryRel}) + require.NoError(t, err) + require.Nil(t, decoded) +} + +func TestMaterializedViewSemanticContext(t *testing.T) { + for _, precision := range []int32{0, 4, 10, 30} { + for _, property := range []bool{false, true} { + t.Run(fmt.Sprintf("precision%d/property%t", precision, property), func(t *testing.T) { + def := MVDefinition{FormatVersion: MVDefinitionFormatVersion, Query: "select v/3 from t", Sources: []MVSource{{Table: "t"}}, DivPrecisionIncrement: new(precision), TimeZoneKind: "fixed", TimeZone: "UTC"} + raw, err := json.Marshal(def) + require.NoError(t, err) + table := &plan.TableDef{TableType: SystemMaterializedViewRel} + props := []*plan.PropertyDef{{Key: MaterializedViewProperty, Value: string(raw)}} + if property { + table.Props = props + } else { + table.Defs = []*plan.TableDef_DefType{{Def: &plan.TableDef_DefType_Properties{Properties: &plan.PropertiesDef{Properties: []*plan.Property{{Key: MaterializedViewProperty, Value: string(raw)}}}}}} + } + got, err := MaterializedViewDefinition(table) + require.NoError(t, err) + require.Equal(t, def, *got) + _, err = got.RefreshTimeZone() + require.NoError(t, err) + }) + } + } + for _, value := range []any{nil, int32(-1), int32(31), "4"} { + raw, err := json.Marshal(map[string]any{"format_version": 2, "query": "select v/3 from t", "sources": []MVSource{{Table: "t"}}, "time_zone_kind": "fixed", "time_zone": "UTC", "sql_mode": "", "div_precision_increment": value}) + require.NoError(t, err) + _, err = DecodeMaterializedViewDefinition(string(raw)) + require.Error(t, err) + } + for _, suffix := range []string{"", `,"sql_mode":null`} { + _, err := DecodeMaterializedViewDefinition(`{"format_version":2,"query":"select v/3 from t","sources":[{}],"div_precision_increment":4,"time_zone_kind":"fixed","time_zone":"UTC"` + suffix + `}`) + require.ErrorContains(t, err, "SQL mode is missing") + } + legacy, err := DecodeMaterializedViewDefinition(`{"format_version":1,"query":"select v/3 from t","sources":[{}]}`) + require.NoError(t, err) + _, err = legacy.RefreshTimeZone() + require.ErrorContains(t, err, "recreate") + named := MVDefinition{FormatVersion: MVDefinitionFormatVersion, TimeZoneKind: "named", TimeZone: "America/New_York", TimeZoneOffset: 1234} + zone, err := named.RefreshTimeZone() + require.NoError(t, err) + for _, tc := range []struct { + month time.Month + offset int + }{{time.January, -18000}, {time.July, -14400}} { + _, offset := time.Date(2024, tc.month, 15, 12, 0, 0, 0, time.UTC).In(zone).Zone() + require.Equal(t, tc.offset, offset, "named rules, not persisted observation offset") + } + for _, name := range []string{"Local", "unavailable/MV-zone"} { + named.TimeZone = name + _, err = named.RefreshTimeZone() + require.Error(t, err, "never silently replace rules with a fixed offset") + } +} diff --git a/pkg/cnservice/server.go b/pkg/cnservice/server.go index 62939823bbf16..75ff2c19c4368 100644 --- a/pkg/cnservice/server.go +++ b/pkg/cnservice/server.go @@ -52,6 +52,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/lockservice" "github.com/matrixorigin/matrixone/pkg/logservice" "github.com/matrixorigin/matrixone/pkg/logutil" + "github.com/matrixorigin/matrixone/pkg/mv" "github.com/matrixorigin/matrixone/pkg/objectio/ioutil" "github.com/matrixorigin/matrixone/pkg/partitionservice" "github.com/matrixorigin/matrixone/pkg/pb/metadata" @@ -1325,6 +1326,7 @@ func (s *service) initInternalSQlExecutor(mp *mpool.MPool) { s.rt.SetGlobalVariables(runtime.InternalSQLExecutor, s.sqlExecutor) cdc.InitTableDetector(s.rt, s.sqlExecutor) cdc.InitCDCWatermarkUpdater(s.rt, frontend.NewInternalExecutor(s.cfg.UUID)) + s.rt.SetGlobalVariables(mv.RuntimeKey, mv.NewService(s.sqlExecutor)) s.initMongoDBRuntime() } diff --git a/pkg/cnservice/server_task.go b/pkg/cnservice/server_task.go index deae90d6d67d3..ddc4a99deb93f 100644 --- a/pkg/cnservice/server_task.go +++ b/pkg/cnservice/server_task.go @@ -29,6 +29,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/frontend/databranchutils" "github.com/matrixorigin/matrixone/pkg/iscp" "github.com/matrixorigin/matrixone/pkg/logutil" + "github.com/matrixorigin/matrixone/pkg/mv" logservicepb "github.com/matrixorigin/matrixone/pkg/pb/logservice" "github.com/matrixorigin/matrixone/pkg/pb/task" "github.com/matrixorigin/matrixone/pkg/proxy" @@ -399,6 +400,18 @@ func (s *service) registerExecutorsLocked() { task.TaskCode_DataBranchLineageGC, compile.DataBranchLineageGCExecutor(s.sqlExecutor), ) + if service, ok := runtime.ServiceRuntime(s.cfg.UUID).GetGlobalVariables(mv.RuntimeKey); ok { + s.task.runner.RegisterExecutor(task.TaskCode_MaterializedView, service.(*mv.Service).TaskExecutor(ts, ieFactory)) + if err := s.stopper.RunNamedTask("register materialized view cron", func(ctx context.Context) { + ticker := time.NewTicker(10 * time.Second) + defer ticker.Stop() + s.registerCronTask(ctx, mv.CronMetadata(), func(ctx context.Context) error { + return service.(*mv.Service).RegisterCron(ctx, ts) + }, ticker.C) + }); err != nil { + s.logger.Error("failed to start materialized view cron registration", zap.Error(err)) + } + } // Register outside task.Lock and the heartbeat/startup command paths. The // stopper owns both retries and cancellation before task storage is closed. if err := s.stopper.RunNamedTask("register lineage GC cron", func(ctx context.Context) { @@ -413,18 +426,25 @@ func (s *service) registerExecutorsLocked() { } func (s *service) registerLineageGCCron(ctx context.Context, ts taskservice.TaskService, retry <-chan time.Time) { + metadata := databranchutils.LineageGCTaskMetadata() + s.registerCronTask(ctx, metadata, func(ctx context.Context) error { + return ts.CreateCronTask(ctx, metadata, databranchutils.LineageGCTaskCronExpr) + }, retry) +} + +func (s *service) registerCronTask(ctx context.Context, metadata task.TaskMetadata, create func(context.Context) error, retry <-chan time.Time) { for { if ctx.Err() != nil || !s.task.runnerReady.Load() || s.viewMetadataGenerationRevoked.Load() { return } attempt, cancel := context.WithTimeout(ctx, 30*time.Second) attempt = defines.AttachAccount(attempt, catalog.System_Account, catalog.System_User, catalog.System_Role) - err := ts.CreateCronTask(attempt, databranchutils.LineageGCTaskMetadata(), databranchutils.LineageGCTaskCronExpr) + err := create(attempt) cancel() if err == nil || ctx.Err() != nil { return } - s.logger.Warn("failed to register lineage GC cron; retrying", zap.Error(err)) + s.logger.Warn("failed to register cron task; retrying", zap.String("task", metadata.ID), zap.Error(err)) select { case <-ctx.Done(): return diff --git a/pkg/cnservice/server_task_test.go b/pkg/cnservice/server_task_test.go index 6225c29da14b4..d370abf3448bc 100644 --- a/pkg/cnservice/server_task_test.go +++ b/pkg/cnservice/server_task_test.go @@ -30,6 +30,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/common/stopper" "github.com/matrixorigin/matrixone/pkg/defines" "github.com/matrixorigin/matrixone/pkg/logservice" + "github.com/matrixorigin/matrixone/pkg/mv" pb "github.com/matrixorigin/matrixone/pkg/pb/logservice" "github.com/matrixorigin/matrixone/pkg/pb/task" "github.com/matrixorigin/matrixone/pkg/taskservice" @@ -497,3 +498,68 @@ func Test_registerExecutorsLocked(t *testing.T) { assert.Equal(t, "data_branch_lineage_gc", ts.cronTasks[0].ID) assert.Equal(t, "0 */5 * * * *", ts.cronExprs[0]) } + +func TestMaterializedViewCronRegistrationOwnsRetry(t *testing.T) { + metadata := mv.CronMetadata() + attempts := make(chan struct{}, 1) + calls := 0 + ts := &controlledCronTaskService{testTS: &testTS{}} + ts.create = func(ctx context.Context, got task.TaskMetadata, expression string) error { + account, err := defines.GetAccountId(ctx) + require.NoError(t, err) + require.Equal(t, catalog.System_Account, account) + require.Equal(t, metadata, got) + require.Equal(t, mv.CronExpression, expression) + calls++ + if calls == 1 { + attempts <- struct{}{} + return errors.New("temporary MV task-store failure") + } + return nil + } + s := &service{logger: zap.NewNop()} + s.task.runnerReady.Store(true) + ctx, cancel := context.WithCancel(t.Context()) + defer cancel() + ticks := make(chan time.Time) + done := make(chan struct{}) + admissions := 0 + go func() { + defer close(done) + s.registerCronTask(ctx, metadata, func(ctx context.Context) error { + admissions++ + if admissions == 1 { + attempts <- struct{}{} + return errors.New("MV catalogs are not ready") + } + return ts.CreateCronTask(ctx, metadata, mv.CronExpression) + }, ticks) + }() + select { + case <-attempts: + case <-time.After(2 * time.Second): + t.Fatal("MV registration did not attempt") + } + select { + case ticks <- time.Now(): + case <-time.After(2 * time.Second): + t.Fatal("MV registration did not enter its own retry wait") + } + select { + case <-attempts: + case <-time.After(2 * time.Second): + t.Fatal("MV readiness retry did not reach task storage") + } + select { + case ticks <- time.Now(): + case <-time.After(2 * time.Second): + t.Fatal("MV task-store failure did not enter the same retry wait") + } + select { + case <-done: + case <-time.After(2 * time.Second): + t.Fatal("MV retry did not complete") + } + require.Equal(t, 2, calls) + require.Equal(t, 3, admissions) +} diff --git a/pkg/defines/const.go b/pkg/defines/const.go index f501237e253fc..ad0832e4838b7 100644 --- a/pkg/defines/const.go +++ b/pkg/defines/const.go @@ -157,7 +157,8 @@ const ( MORPCVersion119 int64 = 119 // coordinator-owned parameterized subquery programs MORPCVersion120 int64 = 120 // current-session KILL authorization and proxy disconnect cleanup MORPCVersion121 int64 = 121 // exact unsigned DECIMAL DIV result domain - MORPCLatestVersion = MORPCVersion121 + MORPCVersion122 int64 = 122 // native read-only materialized views and atomic refresh + MORPCLatestVersion = MORPCVersion122 ) // DefaultLockWaitTimeoutSeconds is shared by the frontend default and by diff --git a/pkg/defines/materialized_view.go b/pkg/defines/materialized_view.go new file mode 100644 index 0000000000000..d3e070a18ad19 --- /dev/null +++ b/pkg/defines/materialized_view.go @@ -0,0 +1,93 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package defines + +import ( + "context" + "sync/atomic" + + "github.com/matrixorigin/matrixone/pkg/common/moerr" +) + +type materializedViewWriteKey struct{} +type materializedViewWrite struct { + account uint32 + table uint64 + txn string +} + +// WithMaterializedViewWrite is an internal, transaction-bound capability. There +// is deliberately no SQL/session variable that can construct this context value. +func WithMaterializedViewWrite(ctx context.Context, account uint32, table uint64, txnID []byte) context.Context { + return context.WithValue(ctx, materializedViewWriteKey{}, materializedViewWrite{account, table, string(txnID)}) +} + +func CanWriteMaterializedView(ctx context.Context, account uint32, table uint64, txnID []byte) bool { + v, ok := ctx.Value(materializedViewWriteKey{}).(materializedViewWrite) + return ok && table != 0 && len(txnID) != 0 && v.account == account && v.table == table && v.txn == string(txnID) +} + +// HasMaterializedViewWrite permits definition-time DML binding. Execution must +// additionally verify the transaction identity through CanWriteMaterializedView. +func HasMaterializedViewWrite(ctx context.Context, account uint32, table uint64) bool { + v, ok := ctx.Value(materializedViewWriteKey{}).(materializedViewWrite) + return ok && v.account == account && v.table == table && table != 0 +} + +// MaterializedViewTask is supplied only by the typed background task executor. +// Object identity and epoch prevent stale tasks from resolving a recreated name. +type MaterializedViewTask struct { + Account uint32 + Table, Epoch uint64 + RunID string +} +type materializedViewTaskKey struct{} + +func WithMaterializedViewTask(ctx context.Context, task MaterializedViewTask) context.Context { + return context.WithValue(ctx, materializedViewTaskKey{}, task) +} +func GetMaterializedViewTask(ctx context.Context) (MaterializedViewTask, bool) { + task, ok := ctx.Value(materializedViewTaskKey{}).(MaterializedViewTask) + return task, ok +} + +func MaterializedViewWriteActive(ctx context.Context) bool { + v, ok := ctx.Value(materializedViewWriteKey{}).(materializedViewWrite) + return ok && v.table != 0 && v.txn != "" +} + +type materializedViewBudgetKey struct{} +type materializedViewBudget struct { + table uint64 + used atomic.Int64 + limit int64 +} + +func WithMaterializedViewBudget(ctx context.Context, table uint64, limit int64) context.Context { + return context.WithValue(ctx, materializedViewBudgetKey{}, &materializedViewBudget{table: table, limit: limit}) +} + +// ChargeMaterializedViewOutput shares a counter across local parallel writers. +// Ordinary writers have no counter, and DROP/DELETE never charge inserted bytes. +func ChargeMaterializedViewOutput(ctx context.Context, table uint64, bytes int) error { + budget, ok := ctx.Value(materializedViewBudgetKey{}).(*materializedViewBudget) + if !ok || budget.table != table { + return nil + } + if bytes < 0 || budget.used.Add(int64(bytes)) > budget.limit { + return moerr.NewInvalidInput(ctx, "materialized view output budget exceeded") + } + return nil +} diff --git a/pkg/defines/materialized_view_test.go b/pkg/defines/materialized_view_test.go new file mode 100644 index 0000000000000..845b5d533d513 --- /dev/null +++ b/pkg/defines/materialized_view_test.go @@ -0,0 +1,51 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package defines + +import ( + "context" + "sync" + "sync/atomic" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewCapability(t *testing.T) { + ctx := WithMaterializedViewWrite(context.Background(), 7, 99, []byte("transaction")) + require.True(t, CanWriteMaterializedView(ctx, 7, 99, []byte("transaction"))) + require.False(t, CanWriteMaterializedView(ctx, 8, 99, []byte("transaction"))) + require.False(t, CanWriteMaterializedView(ctx, 7, 100, []byte("transaction"))) + require.False(t, CanWriteMaterializedView(ctx, 7, 99, []byte("different"))) + require.False(t, CanWriteMaterializedView(ctx, 7, 99, nil)) + require.False(t, MaterializedViewWriteActive(context.Background())) +} +func TestMaterializedViewOutputBudget(t *testing.T) { + ctx := WithMaterializedViewBudget(context.Background(), 99, 100) + require.NoError(t, ChargeMaterializedViewOutput(ctx, 100, 1000)) + var accepted atomic.Int64 + var wg sync.WaitGroup + for i := 0; i < 20; i++ { + wg.Go(func() { + if ChargeMaterializedViewOutput(ctx, 99, 10) == nil { + accepted.Add(1) + } + }) + } + wg.Wait() + require.Equal(t, int64(10), accepted.Load()) + require.Error(t, ChargeMaterializedViewOutput(ctx, 99, 1)) + require.NoError(t, ChargeMaterializedViewOutput(context.Background(), 99, 1000)) +} diff --git a/pkg/frontend/authenticate.go b/pkg/frontend/authenticate.go index b0634ab1c5c5c..ed802ac1771a0 100644 --- a/pkg/frontend/authenticate.go +++ b/pkg/frontend/authenticate.go @@ -961,12 +961,16 @@ var ( catalog.MO_FEATURE_REGISTRY: 0, } sysAccountTables = map[string]struct{}{ - catalog.MOVersionTable: {}, - catalog.MOUpgradeTable: {}, - catalog.MOUpgradeTenantTable: {}, - catalog.MO_PITR: {}, - catalog.MOPartitionMetadata: {}, - catalog.MOPartitionTables: {}, + catalog.MO_MATERIALIZED_VIEWS: {}, + catalog.MO_MV_DEPENDENCIES: {}, + catalog.MO_MV_REFRESH_RUNS: {}, + catalog.MO_MV_ACCOUNT_STATE: {}, + catalog.MOVersionTable: {}, + catalog.MOUpgradeTable: {}, + catalog.MOUpgradeTenantTable: {}, + catalog.MO_PITR: {}, + catalog.MOPartitionMetadata: {}, + catalog.MOPartitionTables: {}, } // predefined tables of the database mo_catalog in every account predefinedTables = map[string]int8{ @@ -1049,6 +1053,10 @@ var ( MoCatalogMoSubsDDL, MoCatalogMoViewDependenciesDDL, MoCatalogMoViewRefreshDDL, + catalog.MoMaterializedViewsDDL, + catalog.MoMVDependenciesDDL, + catalog.MoMVRefreshRunsDDL, + catalog.MoMVAccountStateDDL, MoCatalogMoStoredProcedureDDL, MoCatalogMoStagesDDL, MoCatalogMoSessionsDDL, @@ -4232,6 +4240,12 @@ func doDropAccount(ctx context.Context, bh BackgroundExec, ses *Session, da *dro } } + // Retire native MVs in this transaction before tenant database guards + // inspect their definitions. Ordinary DROP DATABASE stays RESTRICT. + if rtnErr = retireAccountMaterializedViews(ctx, bh, uint32(accountId)); rtnErr != nil { + return rtnErr + } + // drop tables of the tenant // NOTE!!!: single DDL drop statement per single transaction // SWITCH TO THE CONTEXT of the deleted context @@ -6585,6 +6599,17 @@ func determinePrivilegeSetOfStatement(stmt tree.Statement) *privilege { clusterTableOperation = clusterTableCreate } dbName = string(st.Table.SchemaName) + case *tree.CreateMaterializedView: + objType = objectTypeDatabase + typs = append(typs, PrivilegeTypeCreateView, PrivilegeTypeDatabaseAll, PrivilegeTypeDatabaseOwnership) + writeDatabaseAndTableDirectly = true + appendWriteTableNameDatabaseName(st.Name) + if st.Name != nil { + dbName = string(st.Name.SchemaName) + } + case *tree.RefreshMaterializedView, *tree.DropMaterializedView, *tree.AlterMaterializedView, *tree.ShowMaterializedViews: + objType = objectTypeNone + kind = privilegeKindNone case *tree.CreateView: objType = objectTypeDatabase typs = append(typs, PrivilegeTypeCreateView, PrivilegeTypeDatabaseAll, PrivilegeTypeDatabaseOwnership) @@ -7211,6 +7236,15 @@ func extractPrivilegeTipsFromPlan(p *plan2.Plan) (privilegeTipsArray, error) { for nodeID, node := range q.Nodes { if isPrivilegeBearingTableScan(node) || isMongoDBExternalTableScan(node) { + definition, err := catalog.MaterializedViewDefinition(node.TableDef) + if err != nil { + return nil, err + } + if definition != nil { + for _, source := range definition.Sources { + appendPt(privilegeTips{typ: PrivilegeTypeSelect, objType: objectTypeTable, databaseName: source.Database, tableName: source.Table, clusterTableOperation: clusterTableSelect}) + } + } if _, ok := insertDedupScans[int32(nodeID)]; ok { continue } @@ -9267,6 +9301,9 @@ func authenticateUserCanExecuteStatementWithObjectTypeDatabaseAndTable(ctx conte var stats statistic.StatsArray stats.Reset() + if st, ok := stmt.(*tree.CreateMaterializedView); ok { + return authenticateCreateTableAsSelectSourcePrivilege(ctx, ses, &tree.CreateTable{AsSource: st.AsSource}) + } if st, ok := stmt.(*tree.CreateTable); ok && st.IsAsSelect { if !checkProtectedDatabaseWrite(ctx, ses, string(st.Table.SchemaName)) { return false, stats, nil @@ -10908,6 +10945,10 @@ func createTablesInMoCatalogOfGeneralTenant2(bh BackgroundExec, ca *createAccoun strings.HasPrefix(sql, "create cluster table mo_catalog.mo_view_refresh") { return true } + if isMaterializedViewCatalogDDL(sql) { + return true + } + if strings.HasPrefix(sql, "create table mo_catalog.mo_cdc_task") { return true } @@ -12522,6 +12563,12 @@ func doGrantPrivilegeImplicitly(ctx context.Context, ses *Session, stmt tree.Sta switch st := stmt.(type) { case *tree.CreateDatabase: sql = getSqlForGrantOwnershipOnDatabase(string(st.Name), curRole) + case *tree.CreateMaterializedView: + dbName := string(st.Name.SchemaName) + if dbName == "" { + dbName = ses.GetDatabaseName() + } + sql = getSqlForGrantOwnershipOnTable(dbName, string(st.Name.ObjectName), curRole) case *tree.CreateTable: // get database name var dbName string diff --git a/pkg/frontend/authenticate_test.go b/pkg/frontend/authenticate_test.go index e5e5ba34918d8..207f3eb3b51a1 100644 --- a/pkg/frontend/authenticate_test.go +++ b/pkg/frontend/authenticate_test.go @@ -49,6 +49,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/fileservice" "github.com/matrixorigin/matrixone/pkg/frontend/databranchutils" mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/mv" "github.com/matrixorigin/matrixone/pkg/pb/metadata" "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/pb/timestamp" @@ -12181,6 +12182,7 @@ func Test_doDropAccount(t *testing.T) { bh := &backgroundExecTest{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) bhStub := gostub.StubFunc(&NewBackgroundExec, bh) defer bhStub.Reset() @@ -12247,6 +12249,7 @@ func Test_doDropAccount(t *testing.T) { bh := &backgroundExecTest{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) bhStub := gostub.StubFunc(&NewBackgroundExec, bh) defer bhStub.Reset() @@ -12296,6 +12299,7 @@ func Test_doDropAccount(t *testing.T) { bh := &backgroundExecTest{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) bhStub := gostub.StubFunc(&NewBackgroundExec, bh) defer bhStub.Reset() @@ -12361,6 +12365,7 @@ func TestDoDropAccountSQLTaskCleanupFailureRollsBack(t *testing.T) { bh := &backgroundExecTest{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) bh.sql2result["begin;"] = nil bh.sql2result["rollback;"] = nil @@ -12411,6 +12416,7 @@ func Test_doDropAccount_InTransaction(t *testing.T) { bh := &backgroundExecTestWithHistory{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) stmt := &tree.DropAccount{ Name: boxExprStr("test_acc"), @@ -12487,6 +12493,7 @@ func Test_doDropAccount_InTransaction(t *testing.T) { bh := &backgroundExecTestWithHistory{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) stmt := &tree.DropAccount{ Name: boxExprStr("test_acc"), @@ -12560,6 +12567,7 @@ func Test_doDropAccount_InTransaction(t *testing.T) { bh := &backgroundExecTestWithHistory{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) gateSQL := databranchutils.LineageOwnerLifecycleLockSQL() wantErr := errors.New("lifecycle gate failed") bh.sql2result["begin;"] = nil @@ -12588,6 +12596,7 @@ func Test_doDropAccount_AccountOwnedMetadataCleanupError(t *testing.T) { bh := &backgroundExecTestWithHistory{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) stmt := &tree.DropAccount{Name: boxExprStr("acc")} priv := determinePrivilegeSetOfStatement(stmt) diff --git a/pkg/frontend/computation_wrapper.go b/pkg/frontend/computation_wrapper.go index 02cadba21e144..9c63176f81474 100644 --- a/pkg/frontend/computation_wrapper.go +++ b/pkg/frontend/computation_wrapper.go @@ -1364,7 +1364,8 @@ func initExecuteStmtParamWithResolverInSession( change = true } } - rebuildEveryExecute := shouldRebuildPreparePlan(false, executionPlan) + rebuildEveryExecute := preparedStatementNeedsMetadataRebind(prepareStmt.PrepareStmt) || + shouldRebuildPreparePlan(false, executionPlan) schemaChanged, schemasValidated, err := validateCapturedPrepareSchemas( owner.GetAccountId(), preparePlan.GetSchemas(), resolve, catalogCache, prepareStmt.Ts, validateSubscriptions, rebuildEveryExecute) @@ -1556,7 +1557,8 @@ func initExecuteStmtParamWithResolverInSession( owner, originSQL, prepareStmt.schedulingSQLMode) if !executionSes.IsBackgroundSession() && !executionIntent.Explicit { if _, ok := preparePlan.Plan.Plan.(*plan.Plan_Query); ok && - shouldCachePrepareCompile(preparePlan.Plan) { + shouldCachePrepareCompile(preparePlan.Plan) && + !preparedStatementNeedsMetadataRebind(prepareStmt.PrepareStmt) { // Prepare-time compiles are cached and must not retain a statement-owned trace. // The execution path attaches the current wrapper trace after cache retrieval. comp, err := createCompile( @@ -2658,6 +2660,9 @@ func shouldCachePrepareCompile(p *plan.Plan) bool { if p == nil { return true } + if plan2.PreparedPlanDependsOnMaterializedViewDependencies(p) { + return false + } if plan2.PreparedPlanHasPercentileParams(p) { // The percentile marker is evaluated while the physical aggregate is // constructed and becomes immutable executor configuration. Reusing that @@ -2689,6 +2694,13 @@ func (prepareStmt *PrepareStmt) refreshGenerateSeriesParamMetadata(p *plan.Plan) prepareStmt.temporalRuntimeParamPositions = slices.Compact(positions) } +// SHOW CREATE TABLE is lowered to a literal SELECT. Its live catalog policy is +// not represented by those literals or by the source table's schema version. +func preparedStatementNeedsMetadataRebind(stmt tree.Statement) bool { + _, showCreateTable := stmt.(*tree.ShowCreateTable) + return showCreateTable +} + func shouldRebuildPreparePlan(schemaChanged bool, p *plan.Plan) bool { if schemaChanged || p == nil { return schemaChanged @@ -2704,6 +2716,7 @@ func shouldRebuildPreparePlan(schemaChanged bool, p *plan.Plan) bool { query := p.GetQuery() return query != nil && (query.GetHasForeignKeyAction() || query.GetViewMetadataDependsOnUdf() || + plan2.PreparedPlanDependsOnMaterializedViewDependencies(p) || plan2.PreparedPlanDependsOnSubscriptionMetadata(p) || plan2.PreparedPlanDependsOnIndexCoverage(p)) } diff --git a/pkg/frontend/data_branch.go b/pkg/frontend/data_branch.go index 2f4fc49500bfb..aabae5cd06d3f 100644 --- a/pkg/frontend/data_branch.go +++ b/pkg/frontend/data_branch.go @@ -2046,12 +2046,21 @@ func getRelations( return } + // Native branch readers bypass compiled scan admission. P1 MVs do not + // support branch history/merge semantics, including an unpopulated endpoint. + // Reject both sides before readers, diff output or merge writes are created. + tarDef, baseDef := tarRel.GetTableDef(ctx), baseRel.GetTableDef(ctx) + if tarDef.TableType == catalog.SystemMaterializedViewRel || baseDef.TableType == catalog.SystemMaterializedViewRel { + err = moerr.NewNotSupported(ctx, "DATA BRANCH does not support materialized view endpoints") + return + } + logutil.Info( "DataBranch-GetRelations-Done", zap.Uint64("target-table-id", tarRel.GetTableID(ctx)), zap.Uint64("base-table-id", baseRel.GetTableID(ctx)), - zap.String("target-db", tarRel.GetTableDef(ctx).DbName), - zap.String("base-db", baseRel.GetTableDef(ctx).DbName), + zap.String("target-db", tarDef.DbName), + zap.String("base-db", baseDef.DbName), ) return diff --git a/pkg/frontend/data_branch_helpers_test.go b/pkg/frontend/data_branch_helpers_test.go index 00f8ae5fc0991..37c5ca4882994 100644 --- a/pkg/frontend/data_branch_helpers_test.go +++ b/pkg/frontend/data_branch_helpers_test.go @@ -21,6 +21,7 @@ import ( "testing" "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/container/batch" "github.com/matrixorigin/matrixone/pkg/container/types" @@ -443,3 +444,49 @@ func buildRunSQLResultSet() *MysqlResultSet { func vectorValueAsInt64(bat *batch.Batch, colIdx int, rowIdx int) int64 { return vector.MustFixedColWithTypeCheck[int64](bat.Vecs[colIdx])[rowIdx] } + +func TestDataBranchRelationsRejectMaterializedViewEndpoints(t *testing.T) { + for _, tc := range []struct { + name string + targetKind, baseKind string + wantReject bool + }{ + {name: "ordinary endpoints"}, + {name: "materialized target", targetKind: catalog.SystemMaterializedViewRel, wantReject: true}, + {name: "materialized base", baseKind: catalog.SystemMaterializedViewRel, wantReject: true}, + {name: "both materialized", targetKind: catalog.SystemMaterializedViewRel, baseKind: catalog.SystemMaterializedViewRel, wantReject: true}, + } { + t.Run(tc.name, func(t *testing.T) { + ctrl := gomock.NewController(t) + ses := newTestSession(t, ctrl) + t.Cleanup(ses.Close) + op := mock_frontend.NewMockTxnOperator(ctrl) + eng := mock_frontend.NewMockEngine(ctrl) + db := mock_frontend.NewMockDatabase(ctrl) + target, base := mock_frontend.NewMockRelation(ctrl), mock_frontend.NewMockRelation(ctrl) + ses.proc.Base.SessionInfo.StorageEngine = eng + back := &backSession{} + back.txnHandler = &TxnHandler{txnOp: op} + bh := &backExec{backSes: back} + eng.EXPECT().Database(gomock.Any(), "db", op).Return(db, nil).Times(2) + db.EXPECT().Relation(gomock.Any(), "target", nil).Return(target, nil) + db.EXPECT().Relation(gomock.Any(), "base", nil).Return(base, nil) + target.EXPECT().GetTableDef(gomock.Any()).Return(&planpb.TableDef{TableType: tc.targetKind}) + base.EXPECT().GetTableDef(gomock.Any()).Return(&planpb.TableDef{TableType: tc.baseKind}) + if !tc.wantReject { + target.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)) + base.EXPECT().GetTableID(gomock.Any()).Return(uint64(2)) + } + targetName := *tree.NewTableName("target", tree.ObjectNamePrefix{SchemaName: "db"}, nil) + baseName := targetName + baseName.ObjectName = "base" + _, _, _, _, err := getRelations(context.Background(), ses, bh, targetName, baseName) + if tc.wantReject { + require.True(t, moerr.IsMoErrCode(err, moerr.ErrNotSupported), "%v", err) + require.ErrorContains(t, err, "materialized view endpoints") + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/pkg/frontend/internal_executor.go b/pkg/frontend/internal_executor.go index b84f447625e5a..f88aeb2892ff3 100644 --- a/pkg/frontend/internal_executor.go +++ b/pkg/frontend/internal_executor.go @@ -50,6 +50,7 @@ func applyOverride(sess *Session, opts ie.SessionOverrideOptions) { if acc != nil { if opts.AccountId != nil { acc.SetTenantID(*opts.AccountId) + sess.SetAccountId(*opts.AccountId) } if opts.UserId != nil { @@ -229,6 +230,7 @@ func (ie *internalExecutor) newCmdSession(ctx context.Context, opts ie.SessionOv t, _ = GetTenantInfo(ctx, DefaultTenantMoAdmin) } sess.SetTenantInfo(t) + sess.SetAccountId(t.GetTenantID()) applyOverride(sess, ie.baseSessOpts) applyOverride(sess, opts) diff --git a/pkg/frontend/internal_executor_test.go b/pkg/frontend/internal_executor_test.go index c65ea2022e5a7..b4cb1610ee49d 100644 --- a/pkg/frontend/internal_executor_test.go +++ b/pkg/frontend/internal_executor_test.go @@ -207,3 +207,38 @@ func Test_WriteResultSetRow2(t *testing.T) { err := ip.WriteResultSetRow2(nil, nil, 1) assert.NoError(t, err) } + +func TestInternalExecutorSessionAccountIdentity(t *testing.T) { + runtime.RunTest("", func(rt runtime.Runtime) { + pu := config.NewParameterUnit(&config.FrontendParameters{}, nil, nil, nil) + setPu("", pu) + for _, tc := range []struct { + name string + contextAccount, baseAccount, commandAccount, want uint32 + setBase, setCommand bool + }{ + {"context", 7, 0, 0, 7, false, false}, + {"base override", 7, 8, 0, 8, true, false}, + {"command override", 7, 8, 9, 9, true, true}, + {"system override", 7, 8, 0, 0, true, true}, + } { + t.Run(tc.name, func(t *testing.T) { + ctx := defines.AttachAccount(context.Background(), tc.contextAccount, 11, 12) + internal := newIe("") + if tc.setBase { + internal.ApplySessionOverride(ie.NewOptsBuilder().AccountId(tc.baseAccount).Finish()) + } + opts := ie.NewOptsBuilder().UserId(11).DefaultRoleId(12).Internal(false) + if tc.setCommand { + opts.AccountId(tc.commandAccount) + } + sess := internal.newCmdSession(ctx, opts.Finish()) + defer sess.Close() + assert.Equal(t, tc.want, sess.GetAccountId()) + assert.Equal(t, tc.want, sess.GetTenantInfo().GetTenantID()) + assert.Equal(t, uint32(11), sess.GetTenantInfo().GetUserID()) + assert.Equal(t, uint32(12), sess.GetTenantInfo().GetDefaultRoleID()) + }) + } + }) +} diff --git a/pkg/frontend/materialized_view.go b/pkg/frontend/materialized_view.go new file mode 100644 index 0000000000000..e997f8ee61106 --- /dev/null +++ b/pkg/frontend/materialized_view.go @@ -0,0 +1,425 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package frontend + +import ( + "context" + "fmt" + "strconv" + "strings" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/mv" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + plan2 "github.com/matrixorigin/matrixone/pkg/sql/plan" + "github.com/matrixorigin/matrixone/pkg/util/executor" +) + +func materializedViewService(ctx context.Context, ses *Session) (*mv.Service, error) { + v, ok := moruntime.ServiceRuntime(ses.GetService()).GetGlobalVariables(mv.RuntimeKey) + if !ok { + return nil, moerr.NewInternalError(ctx, "materialized view service is unavailable") + } + return v.(*mv.Service), nil +} +func resolveMaterializedView(ctx context.Context, ses *Session, name *tree.TableName) (mv.Key, *catalog.MVDefinition, error) { + db := string(name.SchemaName) + if db == "" { + db = ses.GetDatabaseName() + } + _, def, err := ses.GetTxnCompileCtx().Resolve(db, string(name.ObjectName), nil) + if err != nil { + return mv.Key{}, nil, err + } + if def == nil { + return mv.Key{}, nil, moerr.NewNoSuchTable(ctx, db, string(name.ObjectName)) + } + d, err := catalog.MaterializedViewDefinition(def) + if err != nil { + return mv.Key{}, nil, err + } + if d == nil { + return mv.Key{}, nil, moerr.NewInvalidInput(ctx, "object is not a materialized view") + } + return mv.Key{Account: ses.GetAccountId(), ID: def.TblId}, d, nil +} +func authorizeMaterializedViewOwner(ctx context.Context, ses *Session, def *catalog.MVDefinition) error { + tenant := ses.GetTenantInfo() + if tenant == nil || (!tenant.IsAdminRole() && tenant.GetUserID() != def.OwnerUser) { + return moerr.NewInvalidInput(ctx, "materialized view operation requires owner or administrative authority") + } + return nil +} +func checkMaterializedViewTransaction(ctx context.Context, ses *Session) error { + if ses.GetTxnHandler().InMultiStmtTransactionMode() { + return moerr.NewInvalidInput(ctx, "materialized view DDL/refresh cannot execute in an active user transaction") + } + return plan2.RequirePersistedProtocolVersionForAuthoring(ctx, ses.GetTxnCompileCtx().GetProcess(), defines.MORPCVersion122) +} +func handleRefreshMaterializedView(ctx context.Context, ses *Session, stmt *tree.RefreshMaterializedView) error { + if err := checkMaterializedViewTransaction(ctx, ses); err != nil { + return err + } + key, def, err := resolveMaterializedView(ctx, ses, stmt.Name) + if err != nil { + return err + } + if err := authorizeMaterializedViewOwner(ctx, ses, def); err != nil { + return err + } + if _, background := defines.GetMaterializedViewTask(ctx); background { + svc, err := materializedViewService(ctx, ses) + if err != nil { + return err + } + if err = validateMaterializedViewDefiner(ctx, ses, svc, def); err != nil { + return err + } + } + // CREATE captured every source before optimization. Authorize those native + // sources directly so the caller's current SQL mode cannot rebind a stored + // expression while checking permissions. Refresh separately fences IDs and + // schema versions in its source transaction. + priv := determinePrivilegeSetOfStatement(&tree.Select{}) + var tips privilegeTipsArray + for _, source := range def.Sources { + tips = append(tips, privilegeTips{typ: PrivilegeTypeSelect, objType: objectTypeTable, databaseName: source.Database, tableName: source.Table, clusterTableOperation: clusterTableSelect}) + } + convertPrivilegeTipsToPrivilege(priv, tips) + allowed, _, err := determineUserHasPrivilegeSet(ctx, ses, priv) + if err != nil { + return err + } + if !allowed { + return moerr.NewInvalidInput(ctx, "materialized view source SELECT privilege is required") + } + svc, err := materializedViewService(ctx, ses) + if err != nil { + return err + } + expectedEpoch := uint64(0) + if background, ok := defines.GetMaterializedViewTask(ctx); ok { + if key.Account != background.Account || key.ID != background.Table { + return moerr.NewInvalidInput(ctx, "obsolete materialized view task object") + } + expectedEpoch = background.Epoch + + } + return svc.Refresh(ctx, key, expectedEpoch) +} +func handleDropMaterializedView(ctx context.Context, ses *Session, stmt *tree.DropMaterializedView) error { + if err := checkMaterializedViewTransaction(ctx, ses); err != nil { + return err + } + key, def, err := resolveMaterializedView(ctx, ses, stmt.Name) + if err != nil { + if stmt.IfExists && moerr.IsMoErrCode(err, moerr.ErrNoSuchTable) { + return nil + } + return err + } + if err := authorizeMaterializedViewOwner(ctx, ses, def); err != nil { + return err + } + svc, err := materializedViewService(ctx, ses) + if err != nil { + return err + } + // Native DROP TABLE participates in the catalog/lineage lifecycle lock + // protocol. Select its required mode on this owning transaction, including + // when the deployment defaults to optimistic transactions. + return svc.SQL.ExecTxn(ctx, func(tx executor.TxnExecutor) error { + if err := mv.DependencyGuard(tx, key.Account); err != nil { + return err + } + st, err := mv.Load(tx, key) + if err != nil { + return err + } + writeCtx := defines.WithMaterializedViewWrite(ctx, key.Account, key.ID, tx.Txn().Txn().ID) + r, err := svc.SQL.Exec(writeCtx, "drop table "+mv.Quote(st.Database)+"."+mv.Quote(st.Name), executor.Options{}.WithAccountID(key.Account).WithTxn(tx.Txn())) + if err != nil { + return err + } + r.Close() + r, err = tx.Exec(fmt.Sprintf("delete from mo_catalog.mo_role_privs where obj_type='table' and obj_id=%d", key.ID), executor.StatementOption{}.WithAccountID(key.Account)) + if err != nil { + return err + } + r.Close() + for _, table := range []string{catalog.MO_MV_DEPENDENCIES, catalog.MO_MV_REFRESH_RUNS, catalog.MO_MATERIALIZED_VIEWS} { + r, err := tx.Exec(fmt.Sprintf("delete from mo_catalog.%s where account_id=%d and mv_id=%d", table, key.Account, key.ID), executor.StatementOption{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + r.Close() + } + return nil + }, executor.Options{}.WithAccountID(key.Account). + WithTxnMode(txn.TxnMode_Pessimistic).WithTxnIsolation(txn.TxnIsolation_RC). + WithWaitCommittedLogApplied()) +} +func handleAlterMaterializedView(ctx context.Context, ses *Session, stmt *tree.AlterMaterializedView) error { + if err := checkMaterializedViewTransaction(ctx, ses); err != nil { + return err + } + if stmt.IntervalSeconds != 0 && stmt.IntervalSeconds < 60 { + return moerr.NewInvalidInput(ctx, "materialized view interval must be at least 60 seconds") + } + key, def, err := resolveMaterializedView(ctx, ses, stmt.Name) + if err != nil { + return err + } + if err := authorizeMaterializedViewOwner(ctx, ses, def); err != nil { + return err + } + svc, err := materializedViewService(ctx, ses) + if err != nil { + return err + } + return svc.AlterPolicy(ctx, key, stmt.IntervalSeconds) +} +func handleShowMaterializedViews(ctx context.Context, ses *Session, stmt *tree.ShowMaterializedViews) error { + svc, err := materializedViewService(ctx, ses) + if err != nil { + return err + } + query := fmt.Sprintf("select name,database_name,epoch,populated,source_physical,source_logical,interval_seconds from mo_catalog.mo_materialized_views where account_id=%d", ses.GetAccountId()) + cols := []string{"name", "database", "definition_epoch", "populated", "source_physical", "source_logical", "interval_seconds"} + if stmt.Name == nil && !ses.GetTenantInfo().IsAdminRole() { + query += fmt.Sprintf(" and cast(json_extract(definition,'$.owner_user') as bigint unsigned)=%d", ses.GetTenantInfo().GetUserID()) + } + if stmt.Name != nil { + key, def, err := resolveMaterializedView(ctx, ses, stmt.Name) + if err != nil { + return err + } + if err := authorizeMaterializedViewOwner(ctx, ses, def); err != nil { + return err + } + if stmt.Create { + m := ses.GetMysqlResultSet() + m.AddColumn(newSQLTaskColumn("Materialized View", defines.MYSQL_TYPE_VARCHAR)) + m.AddColumn(newSQLTaskColumn("Create Materialized View", defines.MYSQL_TYPE_VARCHAR)) + state, err := svc.State(ctx, key) + if err != nil { + return err + } + m.AddRow([]interface{}{string(stmt.Name.ObjectName), state.CreateSQL()}) + return nil + } + query = fmt.Sprintf("select run_id,status,sequence,epoch,error_message from mo_catalog.mo_mv_refresh_runs where account_id=%d and mv_id=%d order by sequence desc limit 100", key.Account, key.ID) + cols = []string{"run_id", "status", "sequence", "definition_epoch", "error_message"} + } + r, err := svc.SQL.Exec(ctx, query, executor.Options{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + defer r.Close() + m := ses.GetMysqlResultSet() + for _, c := range cols { + m.AddColumn(newSQLTaskColumn(c, defines.MYSQL_TYPE_VARCHAR)) + } + r.ReadRows(func(n int, c []*vector.Vector) bool { + for i := 0; i < n; i++ { + row := make([]interface{}, len(c)) + for j, v := range c { + switch v.GetType().Oid { + case types.T_varchar, types.T_text: + row[j] = v.GetStringAt(i) + case types.T_bool: + row[j] = strconv.FormatBool(vector.GetFixedAtWithTypeCheck[bool](v, i)) + case types.T_uint64: + row[j] = strconv.FormatUint(vector.GetFixedAtWithTypeCheck[uint64](v, i), 10) + case types.T_uint32: + row[j] = strconv.FormatUint(uint64(vector.GetFixedAtWithTypeCheck[uint32](v, i)), 10) + case types.T_int64: + row[j] = strconv.FormatInt(vector.GetFixedAtWithTypeCheck[int64](v, i), 10) + } + } + m.AddRow(row) + } + return true + }) + return nil +} + +// A definer task revalidates IDs and names rather than inheriting the internal +// executor's sys administrator role name. A dropped/recreated user is rejected. +func validateMaterializedViewDefiner(ctx context.Context, ses *Session, svc *mv.Service, def *catalog.MVDefinition) error { + // InternalExecutor bypasses login and has no Routine. Resolve live account + // status from the system-owned lifecycle catalog before reading tenant users + // or admitting any source execution. Missing/unknown states fail closed. + accountResult, err := svc.SQL.Exec(ctx, fmt.Sprintf("select status from mo_catalog.mo_account where account_id=%d", ses.GetAccountId()), executor.Options{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + active := false + accountRows := 0 + accountResult.ReadRows(func(n int, c []*vector.Vector) bool { + accountRows += n + if n == 1 { + active = strings.EqualFold(c[0].GetStringAt(0), tree.AccountStatusOpen.String()) + } + return true + }) + accountResult.Close() + if accountRows != 1 || !active { + return moerr.NewInvalidInput(ctx, "materialized view account is unavailable, suspended or restricted") + } + query := fmt.Sprintf("select u.user_name,u.status,r.role_name from mo_catalog.mo_user u join mo_catalog.mo_user_grant g on u.user_id=g.user_id join mo_catalog.mo_role r on r.role_id=g.role_id where u.user_id=%d and r.role_id=%d", def.OwnerUser, def.OwnerRole) + result, err := svc.SQL.Exec(ctx, query, executor.Options{}.WithAccountID(ses.GetAccountId())) + if err != nil { + return err + } + defer result.Close() + valid := false + roleName := "" + result.ReadRows(func(n int, c []*vector.Vector) bool { + if n == 1 { + valid = c[0].GetStringAt(0) == def.OwnerName && strings.EqualFold(c[1].GetStringAt(0), userStatusUnlock) + roleName = c[2].GetStringAt(0) + } + return false + }) + if !valid { + return moerr.NewInvalidInput(ctx, "materialized view definer is unavailable or its role was revoked") + } + ses.GetTenantInfo().SetDefaultRole(roleName) + ses.GetTenantInfo().SetUser(def.OwnerName) + ses.InvalidatePrivilegeCache() + return nil +} + +func isMaterializedViewCatalogDDL(sql string) bool { + for _, name := range []string{catalog.MO_MATERIALIZED_VIEWS, catalog.MO_MV_DEPENDENCIES, catalog.MO_MV_REFRESH_RUNS, catalog.MO_MV_ACCOUNT_STATE} { + if strings.HasPrefix(sql, "create cluster table mo_catalog."+name+" ") { + return true + } + } + return false +} + +// Retire MV metadata before DROP ACCOUNT enters tenant DROP DATABASE. The +// caller owns the already-open account-drop transaction and account-name lock. +// Account/dependency and definition writes conflict with creation/publication; +// deletion makes queued envelopes obsolete, including late scheduler delivery. +func retireAccountMaterializedViews(ctx context.Context, bh BackgroundExec, account uint32) error { + bh.ClearExecResultSet() + if err := bh.Exec(ctx, mv.CatalogReadinessSQL); err != nil { + return err + } + results, err := getResultSet(ctx, bh) + if err != nil { + return err + } + if len(results) == 0 || results[0].GetRowCount() != 1 { + return moerr.NewInternalError(ctx, "invalid materialized view catalog readiness") + } + count, err := results[0].GetInt64(ctx, 0, 0) + if err != nil { + return err + } + if count == 0 { + return nil + } + if count != 4 { + return moerr.NewInternalError(ctx, "incomplete materialized view catalog migration") + } + statements := accountMaterializedViewRetirementSQL(account) + for _, sql := range statements[:3] { + if err := bh.Exec(ctx, sql); err != nil { + return err + } + } + // DROP DATABASE lowers native objects through DROP TABLE, whose read-only + // guard remains in force. Retire each MV using the existing exact + // account/table/transaction capability, never an account-wide DDL bypass. + bh.ClearExecResultSet() + if err := bh.Exec(ctx, fmt.Sprintf("select mv_id,database_name,name from mo_catalog.mo_materialized_views where account_id=%d order by mv_id limit 129", account)); err != nil { + return err + } + objects, err := getResultSet(ctx, bh) + if err != nil { + return err + } + if len(objects) > 1 { + return moerr.NewInternalError(ctx, "invalid materialized view retirement result") + } + // Background SELECTs without rows may produce no result set at all. + // Such accounts still need the metadata and queued-task cleanup below. + var rows uint64 + if len(objects) == 1 { + rows = objects[0].GetRowCount() + } + if rows > 128 { + return moerr.NewInternalError(ctx, "materialized view account limit exceeded during retirement") + } + for i := uint64(0); i < rows; i++ { + id, err := objects[0].GetUint64(ctx, i, 0) + if err != nil { + return err + } + database, err := objects[0].GetString(ctx, i, 1) + if err != nil { + return err + } + name, err := objects[0].GetString(ctx, i, 2) + if err != nil { + return err + } + owner, ok := bh.(interface{ materializedViewRetirementTxnID() []byte }) + if !ok || len(owner.materializedViewRetirementTxnID()) == 0 { + return moerr.NewInternalError(ctx, "materialized view retirement requires account transaction") + } + writeCtx := defines.WithMaterializedViewWrite(defines.AttachAccountId(ctx, account), account, id, owner.materializedViewRetirementTxnID()) + if err := bh.Exec(writeCtx, "drop table "+mv.Quote(database)+"."+mv.Quote(name)); err != nil { + return err + } + } + for _, sql := range statements[3:] { + if err := bh.Exec(ctx, sql); err != nil { + return err + } + } + return nil +} + +func (back *backExec) materializedViewRetirementTxnID() []byte { + op := backgroundExecTxnOperator(back) + if op == nil { + return nil + } + return op.Txn().ID +} + +func accountMaterializedViewRetirementSQL(account uint32) []string { + return []string{ + fmt.Sprintf("insert ignore into mo_catalog.mo_mv_account_state (account_id,revision) values (%d,0)", account), + fmt.Sprintf("update mo_catalog.mo_mv_account_state set revision=revision+1 where account_id=%d", account), + fmt.Sprintf("update mo_catalog.mo_materialized_views set epoch=epoch+1,interval_seconds=0,next_due=null where account_id=%d", account), + fmt.Sprintf("delete from mo_task.sys_async_task where task_metadata_executor=17 and json_extract(cast(task_metadata_context as varchar),'$.Key.Account')=%d", account), + fmt.Sprintf("delete from mo_catalog.mo_mv_dependencies where account_id=%d", account), + fmt.Sprintf("delete from mo_catalog.mo_mv_refresh_runs where account_id=%d", account), + fmt.Sprintf("delete from mo_catalog.mo_materialized_views where account_id=%d", account), + fmt.Sprintf("delete from mo_catalog.mo_mv_account_state where account_id=%d", account), + } +} diff --git a/pkg/frontend/materialized_view_test.go b/pkg/frontend/materialized_view_test.go new file mode 100644 index 0000000000000..9ec905a11cdfe --- /dev/null +++ b/pkg/frontend/materialized_view_test.go @@ -0,0 +1,192 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package frontend + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/mv" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "strings" + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewReadPrivileges(t *testing.T) { + def := catalog.MVDefinition{FormatVersion: 1, Query: "select * from src", Sources: []catalog.MVSource{{Database: "db", Table: "src"}, {Database: "db", Table: "dimension"}}} + data, err := json.Marshal(def) + require.NoError(t, err) + p := &plan.Plan{Plan: &plan.Plan_Query{Query: &plan.Query{StmtType: plan.Query_SELECT, Nodes: []*plan.Node{{NodeType: plan.Node_TABLE_SCAN, ObjRef: &plan.ObjectRef{SchemaName: "db", ObjName: "stored"}, TableDef: &plan.TableDef{TableType: catalog.SystemMaterializedViewRel, Props: []*plan.PropertyDef{{Key: catalog.MaterializedViewProperty, Value: string(data)}}}}}}}} + tips, err := extractPrivilegeTipsFromPlan(p) + require.NoError(t, err) + require.Len(t, tips, 3) + for i, name := range []string{"src", "dimension", "stored"} { + require.Equal(t, name, tips[i].tableName) + require.Equal(t, PrivilegeTypeSelect, tips[i].typ) + require.Equal(t, "db", tips[i].databaseName) + } + p.GetQuery().Nodes[0].TableDef.Props[0].Value = "invalid" + _, err = extractPrivilegeTipsFromPlan(p) + require.Error(t, err) +} + +func TestMaterializedViewGlobalCatalogOwnership(t *testing.T) { + for _, ddl := range catalog.MaterializedViewCatalogDDLs { + require.True(t, isMaterializedViewCatalogDDL(ddl), "tenant initialization must not recreate a global MV catalog") + } +} + +func TestMaterializedViewTransactionClassification(t *testing.T) { + for _, statement := range []tree.Statement{&tree.CreateMaterializedView{}, &tree.RefreshMaterializedView{}, &tree.DropMaterializedView{}, &tree.AlterMaterializedView{}} { + allowed, err := statementCanBeExecutedInUncommittedTransaction(context.Background(), nil, statement) + require.NoError(t, err) + require.False(t, allowed) + } + allowed, err := statementCanBeExecutedInUncommittedTransaction(context.Background(), nil, &tree.ShowMaterializedViews{}) + require.NoError(t, err) + require.True(t, allowed) +} + +func TestMaterializedViewDefinerAccountStatus(t *testing.T) { + for _, status := range []string{"open", "suspend", "restricted", "unknown", "missing"} { + t.Run(status, func(t *testing.T) { + ses := newTestSession(t, gomock.NewController(t)) + t.Cleanup(ses.Close) + ses.SetAccountId(7) + ses.SetTenantInfo(getDefaultAccount()) + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + userReads := 0 + sql := executor.NewMemExecutor(func(q string) (executor.Result, error) { + if strings.HasPrefix(q, "select status from mo_catalog.mo_account") { + require.Contains(t, q, "account_id=7") + if status == "missing" { + return executor.Result{}, nil + } + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendBytesRows(r, 0, [][]byte{[]byte(status)})) + return r.GetResult(), nil + } + userReads++ + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType(), types.T_varchar.ToType(), types.T_varchar.ToType()}, mp) + r.NewBatchWithRowCount(1) + for i, v := range []string{"owner", userStatusUnlock, "accountadmin"} { + require.NoError(t, executor.AppendBytesRows(r, i, [][]byte{[]byte(v)})) + } + return r.GetResult(), nil + }) + err := validateMaterializedViewDefiner(t.Context(), ses, mv.NewService(sql), &catalog.MVDefinition{OwnerUser: 2, OwnerRole: 3, OwnerName: "owner"}) + if status == "open" { + require.NoError(t, err) + require.Equal(t, 1, userReads) + } else { + require.ErrorContains(t, err, "account is unavailable") + require.Zero(t, userReads) + } + }) + } +} + +func TestMaterializedViewAccountRetirement(t *testing.T) { + for _, empty := range []bool{false, true} { + t.Run(fmt.Sprintf("no-result-set=%t", empty), func(t *testing.T) { + for _, count := range []int64{0, 3, 4} { + for _, fail := range []int{-1, 0, 2, 5} { + t.Run(fmt.Sprintf("catalog=%d/failure=%d", count, fail), func(t *testing.T) { + bh := mock_frontend.NewMockBackgroundExec(gomock.NewController(t)) + ctx := t.Context() + bh.EXPECT().ClearExecResultSet() + bh.EXPECT().Exec(ctx, mv.CatalogReadinessSQL).Return(nil) + bh.EXPECT().GetExecResultSet().Return([]interface{}{newMrsForCheckTenant([][]interface{}{{count}})}) + statements := accountMaterializedViewRetirementSQL(7) + injected := errors.New("retirement failed") + if count == 4 && (fail < 0 || fail > 2) { + bh.EXPECT().ClearExecResultSet() + bh.EXPECT().Exec(ctx, "select mv_id,database_name,name from mo_catalog.mo_materialized_views where account_id=7 order by mv_id limit 129").Return(nil) + var results []interface{} + if !empty { + results = []interface{}{newMrsForCheckTenant(nil)} + } + bh.EXPECT().GetExecResultSet().Return(results) + } + if count == 4 { + for i, q := range statements { + require.Contains(t, q, "7") + if i == fail { + bh.EXPECT().Exec(ctx, q).Return(injected) + break + } + bh.EXPECT().Exec(ctx, q).Return(nil) + } + } + err := retireAccountMaterializedViews(ctx, bh, 7) + if count == 3 { + require.ErrorContains(t, err, "incomplete") + } else if count == 4 && fail >= 0 { + require.ErrorIs(t, err, injected) + } else { + require.NoError(t, err) + } + }) + } + } + }) + } +} + +type materializedViewRetirementBackground struct{ BackgroundExec } + +func (materializedViewRetirementBackground) materializedViewRetirementTxnID() []byte { + return []byte("account-drop") +} + +func TestMaterializedViewAccountRetirementCapability(t *testing.T) { + ctx := t.Context() + mock := mock_frontend.NewMockBackgroundExec(gomock.NewController(t)) + bh := materializedViewRetirementBackground{mock} + count := newMrsForCheckTenant([][]interface{}{{int64(4)}}) + objects := newMrsForCheckTenant([][]interface{}{{uint64(99), "db`name", "mv`name"}}) + mock.EXPECT().ClearExecResultSet().Times(2) + calls := []*gomock.Call{mock.EXPECT().Exec(ctx, mv.CatalogReadinessSQL).Return(nil), mock.EXPECT().GetExecResultSet().Return([]interface{}{count})} + statements := accountMaterializedViewRetirementSQL(7) + for _, q := range statements[:3] { + calls = append(calls, mock.EXPECT().Exec(ctx, q).Return(nil)) + } + calls = append(calls, mock.EXPECT().Exec(ctx, "select mv_id,database_name,name from mo_catalog.mo_materialized_views where account_id=7 order by mv_id limit 129").Return(nil), mock.EXPECT().GetExecResultSet().Return([]interface{}{objects})) + calls = append(calls, mock.EXPECT().Exec(gomock.Any(), "drop table `db``name`.`mv``name`").DoAndReturn(func(c context.Context, _ string) error { + require.True(t, defines.CanWriteMaterializedView(c, 7, 99, []byte("account-drop"))) + require.False(t, defines.CanWriteMaterializedView(c, 8, 99, []byte("account-drop"))) + require.False(t, defines.CanWriteMaterializedView(c, 7, 100, []byte("account-drop"))) + require.False(t, defines.CanWriteMaterializedView(c, 7, 99, []byte("another-txn"))) + return nil + })) + for _, q := range statements[3:] { + calls = append(calls, mock.EXPECT().Exec(ctx, q).Return(nil)) + } + gomock.InOrder(calls...) + require.NoError(t, retireAccountMaterializedViews(ctx, bh, 7)) +} diff --git a/pkg/frontend/mysql_cmd_executor.go b/pkg/frontend/mysql_cmd_executor.go index 60643d846472d..3d532cb89e3c3 100644 --- a/pkg/frontend/mysql_cmd_executor.go +++ b/pkg/frontend/mysql_cmd_executor.go @@ -3187,6 +3187,7 @@ func createPrepareStmtInSession( if !executionSes.IsBackgroundSession() && isQueryPlan && len(prepareControl.ParamTypes) == 0 && shouldCachePrepareCompile(prepareControl.Plan) && + !preparedStatementNeedsMetadataRebind(saveStmt) && (!prepareSchedulingIntent.Explicit || schedule.ValidateSchedulingIntent(prepareSchedulingIntent) != "") { //only DQL & DML will pre compile @@ -6011,6 +6012,10 @@ func executeStmt(ses *Session, } switch st := execCtx.stmt.(type) { + case *tree.CreateMaterializedView: + if err = checkMaterializedViewTransaction(execCtx.reqCtx, ses); err != nil { + return + } case *tree.Select: if st.Ep != nil { if getPu(ses.GetService()).SV.DisableSelectInto { @@ -6044,6 +6049,12 @@ func executeStmt(ses *Session, ses.InvalidatePrivilegeCache() // if the droped database is the same as the one in use, database must be reseted to empty. if string(st.Name) == ses.GetDatabaseName() { + previousDatabase := ses.GetDatabaseName() + defer func() { + if err != nil { + ses.SetDatabaseName(previousDatabase) + } + }() ses.SetDatabaseName("") } case *tree.ExplainAnalyze: @@ -6929,7 +6940,10 @@ func checkNodeCanCache(p *plan2.Plan) bool { // otherwise reject it. Do not admit any plan with this dependency to the // ordinary COM_QUERY cache: creating the first subscription does not change // a table schema version and therefore cannot invalidate such a cached plan. - if plan2.PreparedPlanDependsOnSubscriptionMetadata(p) { + // Truncating DELETE also depends on reverse MV dependencies outside the + // source schema version. Its eligibility must be rebound for each statement. + if plan2.PreparedPlanDependsOnSubscriptionMetadata(p) || + plan2.PreparedPlanDependsOnMaterializedViewDependencies(p) { return false } if q, ok := p.Plan.(*plan2.Plan_Query); ok { diff --git a/pkg/frontend/pitr.go b/pkg/frontend/pitr.go index f3a581bef73a5..650ad72d8a2a7 100644 --- a/pkg/frontend/pitr.go +++ b/pkg/frontend/pitr.go @@ -1632,6 +1632,9 @@ func reCreateTableWithPitr( pitrName string, ts int64, tblInfo *tableInfo) (err error) { + if tblInfo.relKind == catalog.SystemMaterializedViewRel { + return moerr.NewNotSupported(ctx, "PITR of materialized views") + } if isExternalTable(tblInfo) { return newExternalTableRestoreError(ctx, tblInfo, "pitr") } diff --git a/pkg/frontend/prepared_fk_cache_test.go b/pkg/frontend/prepared_fk_cache_test.go index 6e60990441607..1a745062c79a9 100644 --- a/pkg/frontend/prepared_fk_cache_test.go +++ b/pkg/frontend/prepared_fk_cache_test.go @@ -58,6 +58,28 @@ func TestShouldCachePrepareCompileForeignKeyActions(t *testing.T) { require.False(t, checkNodeCanCache(subscriptionMetadataPlan)) } +func TestMaterializedViewDeletePlanCachePolicy(t *testing.T) { + for _, tc := range []struct { + name string + stmt plan.Query_StatementType + node *plan.Node + rebind bool + }{ + {"truncating delete", plan.Query_DELETE, &plan.Node{NodeType: plan.Node_DELETE, DeleteCtx: &plan.DeleteCtx{CanTruncate: true}}, true}, + {"row delete", plan.Query_DELETE, &plan.Node{NodeType: plan.Node_DELETE, DeleteCtx: &plan.DeleteCtx{}}, false}, + {"missing delete context", plan.Query_DELETE, &plan.Node{NodeType: plan.Node_DELETE}, false}, + {"ordinary select", plan.Query_SELECT, &plan.Node{NodeType: plan.Node_TABLE_SCAN}, false}, + {"other node", plan.Query_DELETE, &plan.Node{NodeType: plan.Node_PROJECT, DeleteCtx: &plan.DeleteCtx{CanTruncate: true}}, false}, + } { + t.Run(tc.name, func(t *testing.T) { + p := &plan.Plan{Plan: &plan.Plan_Query{Query: &plan.Query{StmtType: tc.stmt, Nodes: []*plan.Node{tc.node}}}} + require.Equal(t, tc.rebind, shouldRebuildPreparePlan(false, p)) + require.Equal(t, !tc.rebind, shouldCachePrepareCompile(p)) + require.Equal(t, !tc.rebind, checkNodeCanCache(p)) + }) + } +} + func TestInitExecuteStmtParamRebuildsAcrossForeignKeyChecksTransitions(t *testing.T) { for i, test := range []struct { name string diff --git a/pkg/frontend/self_handle.go b/pkg/frontend/self_handle.go index 9db07dcf48025..e59c6aa4acb1c 100644 --- a/pkg/frontend/self_handle.go +++ b/pkg/frontend/self_handle.go @@ -137,6 +137,22 @@ func execInFrontend(ses *Session, execCtx *ExecCtx) (stats statistic.StatsArray, if err != nil { return } + case *tree.RefreshMaterializedView: + if err = handleRefreshMaterializedView(execCtx.reqCtx, ses, st); err != nil { + return + } + case *tree.DropMaterializedView: + if err = handleDropMaterializedView(execCtx.reqCtx, ses, st); err != nil { + return + } + case *tree.AlterMaterializedView: + if err = handleAlterMaterializedView(execCtx.reqCtx, ses, st); err != nil { + return + } + case *tree.ShowMaterializedViews: + if err = handleShowMaterializedViews(execCtx.reqCtx, ses, st); err != nil { + return + } case *tree.CreateSQLTask: ses.EnterFPrint(FPCreateSQLTask) defer ses.ExitFPrint(FPCreateSQLTask) diff --git a/pkg/frontend/snapshot.go b/pkg/frontend/snapshot.go index 00b24f577a65d..97fb798eec994 100644 --- a/pkg/frontend/snapshot.go +++ b/pkg/frontend/snapshot.go @@ -112,12 +112,16 @@ var ( "mo_indexes": systemCatalogRestoreSkip, "mo_account": systemCatalogRestoreSkip, - catalog.MOVersionTable: systemCatalogRestoreSkip, - catalog.MOUpgradeTable: systemCatalogRestoreSkip, - catalog.MOUpgradeTenantTable: systemCatalogRestoreSkip, - catalog.MOAutoIncrTable: systemCatalogRestoreSkip, - catalog.MO_VIEW_DEPENDENCIES: systemCatalogRestoreSkip, - catalog.MO_VIEW_REFRESH: systemCatalogRestoreSkip, + catalog.MOVersionTable: systemCatalogRestoreSkip, + catalog.MOUpgradeTable: systemCatalogRestoreSkip, + catalog.MOUpgradeTenantTable: systemCatalogRestoreSkip, + catalog.MOAutoIncrTable: systemCatalogRestoreSkip, + catalog.MO_VIEW_DEPENDENCIES: systemCatalogRestoreSkip, + catalog.MO_VIEW_REFRESH: systemCatalogRestoreSkip, + catalog.MO_MATERIALIZED_VIEWS: systemCatalogRestoreSkip, + catalog.MO_MV_DEPENDENCIES: systemCatalogRestoreSkip, + catalog.MO_MV_REFRESH_RUNS: systemCatalogRestoreSkip, + catalog.MO_MV_ACCOUNT_STATE: systemCatalogRestoreSkip, "mo_user": systemCatalogRestoreCopy, "mo_role": systemCatalogRestoreCopy, @@ -1788,6 +1792,11 @@ func dropClusterTable( } continue } + // Subsystem-owned cluster catalogs must retain the current schema. + // Their bulk-restore policy also governs this destructive cleanup. + if needSkipSystemTable(toAccountId, tblInfo) { + continue + } getLogger(sid).Debug(fmt.Sprintf("[%s] start to drop system table: %v.%v", snapshotName, moCatalog, tblInfo.tblName)) if err = bh.Exec(ctx, dropTableIfExistsSQL(moCatalog, tblInfo.tblName)); err != nil { return @@ -2859,6 +2868,9 @@ func fillTableCreateSQLsForRestore( sequences := make([]*tableInfo, 0) restorable := make([]*tableInfo, 0, len(tableInfos)) for _, tblInfo := range tableInfos { + if tblInfo.relKind == catalog.SystemMaterializedViewRel { + return nil, moerr.NewNotSupportedNoCtx("logical restore/clone of materialized views; drop and recreate their definitions") + } createSQL, err := getCreateSQL(tblInfo) if err != nil { if moerr.IsMoErrCode(err, moerr.ErrNoSuchTable) { diff --git a/pkg/frontend/snapshot_catalog_restore_test.go b/pkg/frontend/snapshot_catalog_restore_test.go index ee9836f92aa51..c548d19c24f08 100644 --- a/pkg/frontend/snapshot_catalog_restore_test.go +++ b/pkg/frontend/snapshot_catalog_restore_test.go @@ -450,3 +450,25 @@ func TestLoadRolePrivilegesAtSnapshotValidatesCatalogRows(t *testing.T) { }) } } + +func TestClusterRestorePreservesMaterializedViewCatalogs(t *testing.T) { + ctx := defines.AttachAccountId(t.Context(), sysAccountID) + bh := &backgroundExecTest{} + bh.init() + metadata := []string{catalog.MO_MATERIALIZED_VIEWS, catalog.MO_MV_DEPENDENCIES, catalog.MO_MV_REFRESH_RUNS, catalog.MO_MV_ACCOUNT_STATE} + rows := make([][]interface{}, 0, len(metadata)+3) + for _, name := range metadata { + rows = append(rows, []interface{}{name, string(clusterTable), catalog.SystemClusterRel, ""}) + require.True(t, needSkipTable(sysAccountID, moCatalog, name)) + } + rows = append(rows, []interface{}{catalog.MO_VIEW_DEPENDENCIES, string(clusterTable), catalog.SystemClusterRel, ""}, + []interface{}{catalog.MO_VIEW_REFRESH, string(clusterTable), catalog.SystemClusterRel, ""}, + []interface{}{"user_cluster", string(clusterTable), catalog.SystemClusterRel, ""}) + query := buildTableInfoListSQL(moCatalog, "", 0, sysAccountID) + bh.sql2result[query] = newMrsForRestoreStringRows([]string{"relname", "table_type", "relkind", "viewdef"}, rows) + require.NoError(t, dropClusterTable(ctx, "", bh, "snapshot", sysAccountID)) + require.Equal(t, []string{query, "delete from mo_catalog.mo_view_dependencies", "delete from mo_catalog.mo_view_refresh", dropTableIfExistsSQL(moCatalog, "user_cluster")}, bh.executedSQLs) + for _, name := range metadata { + require.NotContains(t, bh.executedSQLs, dropTableIfExistsSQL(moCatalog, name)) + } +} diff --git a/pkg/frontend/snapshot_test.go b/pkg/frontend/snapshot_test.go index e0087cc41637c..6282b217b4a32 100644 --- a/pkg/frontend/snapshot_test.go +++ b/pkg/frontend/snapshot_test.go @@ -38,6 +38,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/container/vector" "github.com/matrixorigin/matrixone/pkg/defines" mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/mv" "github.com/matrixorigin/matrixone/pkg/pb/txn" "github.com/matrixorigin/matrixone/pkg/sql/compile" sqlmongodb "github.com/matrixorigin/matrixone/pkg/sql/mongodb" @@ -2121,6 +2122,7 @@ func Test_dropExistsAccount_InRestoreTransaction(t *testing.T) { bh.sql2result["rollback;"] = nil // Setup SQL results for doDropAccount (called by dropExistsAccount) + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) sql, _ := getSqlForCheckTenant(ctx, "test_acc") mrs := newMrsForGetAllAccounts([][]interface{}{ {uint64(1), "test_acc", "open", uint64(1), nil}, diff --git a/pkg/frontend/status_stmt.go b/pkg/frontend/status_stmt.go index ee6ec728ea0e5..3f9a237d406e9 100644 --- a/pkg/frontend/status_stmt.go +++ b/pkg/frontend/status_stmt.go @@ -171,7 +171,7 @@ func executeStatusStmt(ses *Session, execCtx *ExecCtx) (err error) { } else { return moerr.NewInternalError(execCtx.reqCtx, "select without it generates the result rows") } - case *tree.CreateTable: + case *tree.CreateTable, *tree.CreateMaterializedView: runBegin := time.Now() if execCtx.runResult, err = execCtx.runner.Run(0); err != nil { return diff --git a/pkg/frontend/stmt_kind.go b/pkg/frontend/stmt_kind.go index 69ca8e7556c77..652ed9328acc7 100644 --- a/pkg/frontend/stmt_kind.go +++ b/pkg/frontend/stmt_kind.go @@ -319,6 +319,10 @@ func statementCanBeExecutedInUncommittedTransaction( USE ROLE role; */ return !st.IsUseRole(), nil + case *tree.CreateMaterializedView, *tree.RefreshMaterializedView, *tree.DropMaterializedView, *tree.AlterMaterializedView: + return false, nil + case *tree.ShowMaterializedViews: + return true, nil case *tree.DropTable, *tree.DropIndex, *tree.DropView, *tree.TruncateTable, *tree.RenameTable: return true, nil case *tree.DropSequence: //Case1, Case3 above diff --git a/pkg/frontend/table_dump.go b/pkg/frontend/table_dump.go index 174c52118c20f..7013018a9e9ca 100644 --- a/pkg/frontend/table_dump.go +++ b/pkg/frontend/table_dump.go @@ -529,7 +529,7 @@ func validateTableDumpSchema(def *plan.TableDef) error { switch def.TableType { case catalog.SystemExternalRel, catalog.SystemSourceRel: return moerr.NewNotSupportedNoCtx("DUMP TABLE and LOAD TABLE with external or source tables") - case catalog.SystemViewRel: + case catalog.SystemViewRel, catalog.SystemMaterializedViewRel: return moerr.NewNotSupportedNoCtx("DUMP TABLE and LOAD TABLE with views") case catalog.SystemSequenceRel: return moerr.NewNotSupportedNoCtx("DUMP TABLE and LOAD TABLE with sequences") diff --git a/pkg/frontend/table_dump_test.go b/pkg/frontend/table_dump_test.go index 0baeef70d26c1..b444d1262dffb 100644 --- a/pkg/frontend/table_dump_test.go +++ b/pkg/frontend/table_dump_test.go @@ -30,6 +30,7 @@ import ( "github.com/gogo/protobuf/proto" "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/prashantv/gostub" "github.com/stretchr/testify/require" @@ -1117,6 +1118,7 @@ func TestHandleDumpTableRejectsUnsupportedSchemas(t *testing.T) { {name: "external", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemExternalRel}}, {name: "source", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemSourceRel}}, {name: "view", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemViewRel}}, + {name: "materialized view", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemMaterializedViewRel}}, {name: "sequence", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemSequenceRel}}, {name: "transient", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemTransientRel}}, {name: "view-sql", def: &plan.TableDef{Name: "orders", ViewSql: &plan.ViewDef{}}}, @@ -1173,7 +1175,7 @@ func TestHandleLoadTableRejectsNonObjectBackedRelations(t *testing.T) { Table: tree.NewTableName("orders", tree.ObjectNamePrefix{}, nil), Path: t.TempDir(), }) - require.Error(t, err) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrNotSupported), "schema admission must reject before reading any dump files: %v", err) }) } } diff --git a/pkg/frontend/variables.go b/pkg/frontend/variables.go index 7369ca336d186..4ca1f6344ce20 100644 --- a/pkg/frontend/variables.go +++ b/pkg/frontend/variables.go @@ -3952,6 +3952,10 @@ var gSysVarsDefs = map[string]SystemVariable{ Type: InitSystemVariableStringType("remap_rewrites"), Default: "", }, + "experimental_materialized_view": { + Name: "experimental_materialized_view", Scope: ScopeBoth, Dynamic: true, SetVarHintApplies: false, + Type: InitSystemVariableBoolType("experimental_materialized_view"), Default: int8(0), + }, "experimental_ivf_index": { Name: "experimental_ivf_index", Scope: ScopeBoth, diff --git a/pkg/mv/service.go b/pkg/mv/service.go new file mode 100644 index 0000000000000..44ac5ad62cf7c --- /dev/null +++ b/pkg/mv/service.go @@ -0,0 +1,484 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mv + +import ( + "context" + "encoding/json" + "fmt" + "strings" + "time" + + "github.com/google/uuid" + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/common/sqlquote" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/pb/timestamp" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/util/fault" +) + +const RuntimeKey = "materialized-view-service" +const Timeout = 300 * time.Second + +type Key struct { + Account uint32 + ID uint64 +} +type State struct { + Key + Database, Name string + Definition catalog.MVDefinition + Epoch, Requested, Successful uint64 + Populated bool + LastRun string + SourceTS timestamp.Timestamp + Interval int64 +} + +// CreateSQL reconstructs the logical object using its authoritative policy. +// Internal storage properties and refresh provenance are never export DDL. +func (st *State) CreateSQL() string { + policy := "manual" + if st.Interval > 0 { + policy = fmt.Sprintf("every interval %d second", st.Interval) + } + return "create materialized view " + Quote(st.Database) + "." + Quote(st.Name) + " refresh " + policy + " as " + st.Definition.Query +} + +// Service owns bounded per-CN admission, not cluster-wide publication locks. +// Fixed account buckets conservatively serialize collisions without a growing +// tenant-to-semaphore map. Transaction conflict detection fences publishers. +type Service struct { + SQL executor.SQLExecutor + slots chan struct{} + accounts [256]chan struct{} + pending [256]chan struct{} +} + +func NewService(sql executor.SQLExecutor) *Service { + s := &Service{SQL: sql, slots: make(chan struct{}, 2)} + for i := range s.accounts { + s.accounts[i] = make(chan struct{}, 1) + s.pending[i] = make(chan struct{}, 2) + } + return s +} +func Quote(s string) string { return "`" + strings.ReplaceAll(s, "`", "``") + "`" } +func literal(s string) string { return "'" + sqlquote.EscapeString(s) + "'" } +func system() executor.StatementOption { + return executor.StatementOption{}.WithAccountID(catalog.System_Account).WithDisableLog() +} +func consume(tx executor.TxnExecutor, sql string) error { + r, e := tx.Exec(sql, system()) + if e == nil { + r.Close() + } + return e +} + +func Load(tx executor.TxnExecutor, key Key) (*State, error) { + r, err := tx.Exec(fmt.Sprintf("select database_name,name,definition,epoch,requested_sequence,successful_sequence,populated,last_run,source_physical,source_logical,interval_seconds from mo_catalog.mo_materialized_views where account_id=%d and mv_id=%d", key.Account, key.ID), system()) + if err != nil { + return nil, err + } + defer r.Close() + var st *State + var decodeErr error + r.ReadRows(func(rows int, c []*vector.Vector) bool { + for i := 0; i < rows; i++ { + if st != nil { + decodeErr = moerr.NewInternalErrorNoCtx("duplicate materialized view metadata") + return false + } + st = &State{Key: key, Database: c[0].GetStringAt(i), Name: c[1].GetStringAt(i), Epoch: vector.GetFixedAtWithTypeCheck[uint64](c[3], i), Requested: vector.GetFixedAtWithTypeCheck[uint64](c[4], i), Successful: vector.GetFixedAtWithTypeCheck[uint64](c[5], i), Populated: vector.GetFixedAtWithTypeCheck[bool](c[6], i), LastRun: c[7].GetStringAt(i), SourceTS: timestamp.Timestamp{PhysicalTime: vector.GetFixedAtWithTypeCheck[int64](c[8], i), LogicalTime: vector.GetFixedAtWithTypeCheck[uint32](c[9], i)}, Interval: vector.GetFixedAtWithTypeCheck[int64](c[10], i)} + definition, err := catalog.DecodeMaterializedViewDefinition(c[2].GetStringAt(i)) + decodeErr = err + if err == nil { + st.Definition = *definition + } + } + return decodeErr == nil + }) + if decodeErr != nil { + return nil, decodeErr + } + if st == nil { + return nil, moerr.NewInvalidInputNoCtx("materialized view metadata does not exist") + } + return st, nil +} + +func ValidateSources(tx executor.TxnExecutor, st *State) error { + for _, d := range st.Definition.Sources { + if d.AccountID != st.Account || d.Database != st.Database { + return moerr.NewInvalidInputNoCtx("invalid materialized view source account/database") + } + r, err := tx.Exec(fmt.Sprintf("select rel_id,rel_logical_id,rel_version from mo_catalog.mo_tables where account_id=%d and reldatabase_id=%d and relname=%s", d.AccountID, d.DatabaseID, literal(d.Table)), system()) + if err != nil { + return err + } + valid, rows := false, 0 + r.ReadRows(func(n int, c []*vector.Vector) bool { + rows += n + for i := 0; i < n; i++ { + valid = vector.GetFixedAtWithTypeCheck[uint64](c[0], i) == d.TableID && vector.GetFixedAtWithTypeCheck[uint64](c[1], i) == d.LogicalID && vector.GetFixedAtWithTypeCheck[uint32](c[2], i) == d.Version + } + return true + }) + r.Close() + if rows != 1 || !valid { + return moerr.NewInvalidInputNoCtx("MV_INVALID_DEFINITION: materialized view source identity/schema changed") + } + } + return nil +} + +// Register is called by CREATE in the same transaction as native relation creation. +func Register(tx executor.TxnExecutor, key Key, databaseID uint64, name string, definition *catalog.MVDefinition) error { + if err := DependencyGuard(tx, key.Account); err != nil { + return err + } + r, err := tx.Exec(fmt.Sprintf("select count(*) from mo_catalog.mo_materialized_views where account_id=%d", key.Account), system()) + if err != nil { + return err + } + var count int64 + r.ReadRows(func(n int, c []*vector.Vector) bool { + if n > 0 { + count = vector.GetFixedAtWithTypeCheck[int64](c[0], 0) + } + return true + }) + r.Close() + if count >= 128 { + return moerr.NewInvalidInputNoCtx("materialized view account limit (128) exceeded") + } + st := &State{Key: key, Database: definition.Database, Name: name, Definition: *definition} + if err := ValidateSources(tx, st); err != nil { + return err + } + data, err := json.Marshal(definition) + if err != nil { + return err + } + err = consume(tx, fmt.Sprintf("insert into mo_catalog.mo_materialized_views (account_id,mv_id,database_id,database_name,name,definition,interval_seconds,next_due) values (%d,%d,%d,%s,%s,%s,%d,%s)", key.Account, key.ID, databaseID, literal(definition.Database), literal(name), literal(string(data)), definition.IntervalSeconds, nextDueSQL(definition.IntervalSeconds))) + if err != nil { + return err + } + for _, d := range definition.Sources { + if err := consume(tx, fmt.Sprintf("insert into mo_catalog.mo_mv_dependencies (account_id,mv_id,source_database_id,source_table_id,source_logical_id,source_version) values (%d,%d,%d,%d,%d,%d)", key.Account, key.ID, d.DatabaseID, d.TableID, d.LogicalID, d.Version)); err != nil { + return err + } + } + return nil +} +func nextDueSQL(seconds int64) string { + if seconds == 0 { + return "null" + } + return fmt.Sprintf("date_add(current_timestamp(),interval %d second)", seconds) +} + +// CatalogReadinessSQL uses only the pre-existing system metadata catalog. All +// four global MV tables must be installed in the caller's transaction snapshot; +// a registered CN service or a session feature flag is not migration readiness. +const CatalogReadinessSQL = "select count(*) from mo_catalog.mo_tables where account_id=0 and reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state')" + +func CatalogReady(tx executor.TxnExecutor) (bool, error) { + r, err := tx.Exec(CatalogReadinessSQL, system()) + if err != nil { + return false, err + } + defer r.Close() + var count int64 + r.ReadRows(func(n int, c []*vector.Vector) bool { + if n > 0 { + count = vector.GetFixedAtWithTypeCheck[int64](c[0], 0) + } + return false + }) + if count != 0 && count != 4 { + return false, moerr.NewInternalErrorNoCtx("incomplete materialized view catalog migration") + } + return count == 4, nil +} + +func DependencyGuard(tx executor.TxnExecutor, account uint32) error { + if err := consume(tx, fmt.Sprintf("insert ignore into mo_catalog.mo_mv_account_state (account_id,revision) values (%d,0)", account)); err != nil { + return err + } + return consume(tx, fmt.Sprintf("update mo_catalog.mo_mv_account_state set revision=revision+1 where account_id=%d", account)) +} + +// Refresh publishes stored rows and their exact source snapshot together. +// Callers authorize the current user/owner and require protocol admission first. +func (s *Service) Refresh(ctx context.Context, key Key, expectedEpoch uint64) error { + ctx, cancel := context.WithTimeout(ctx, Timeout) + defer cancel() + if err := ctx.Err(); err != nil { + return err + } + // Bound both active and waiting requests without a growing per-tenant map. + // One active request and one waiter may occupy an account hash bucket. + pending := s.pending[key.Account%uint32(len(s.pending))] + select { + case pending <- struct{}{}: + defer func() { <-pending }() + default: + return moerr.NewInvalidInput(ctx, "MV_REFRESH_BUSY: refresh admission is full") + } + bucket := s.accounts[key.Account%uint32(len(s.accounts))] + select { + case bucket <- struct{}{}: + defer func() { <-bucket }() + case <-ctx.Done(): + return ctx.Err() + } + select { + case s.slots <- struct{}{}: + defer func() { <-s.slots }() + case <-ctx.Done(): + return ctx.Err() + } + runID := uuid.NewString() + if background, ok := defines.GetMaterializedViewTask(ctx); ok { + if background.Account != key.Account || background.Table != key.ID || background.Epoch != expectedEpoch || background.RunID == "" { + return moerr.NewInvalidInputNoCtx("invalid materialized view task identity") + } + runID = background.RunID + } + var sequence, epoch uint64 + var definition catalog.MVDefinition + var zone *time.Location + opts := executor.Options{}.WithAccountID(key.Account).WithTxnIsolation(txn.TxnIsolation_SI).WithTxnMode(txn.TxnMode_Optimistic).WithWaitCommittedLogApplied() + err := s.metadataTxn(ctx, key, func(tx executor.TxnExecutor) error { + st, err := Load(tx, key) + if err != nil { + return err + } + zone, err = st.Definition.RefreshTimeZone() + if err != nil { + return err + } + if expectedEpoch != 0 && expectedEpoch != st.Epoch { + return moerr.NewInvalidInputNoCtx("obsolete materialized view refresh task") + } + if prior, err := loadRun(tx, key, runID); err != nil { + return err + } else if prior != nil { + sequence = prior.sequence + epoch = prior.epoch + definition = st.Definition + if epoch != st.Epoch { + return moerr.NewInvalidInputNoCtx("obsolete materialized view refresh attempt") + } + if st.Successful < sequence { + return consume(tx, fmt.Sprintf("update mo_catalog.mo_mv_refresh_runs set status='RUNNING',started_at=current_timestamp(),finished_at=null,error_message='' where account_id=%d and mv_id=%d and run_id=%s", key.Account, key.ID, literal(runID))) + } + return nil + } + if st.Requested == ^uint64(0) { + return moerr.NewInvalidInputNoCtx("materialized view refresh sequence exhausted") + } + sequence = st.Requested + 1 + epoch = st.Epoch + definition = st.Definition + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set requested_sequence=%d where account_id=%d and mv_id=%d and epoch=%d", sequence, key.Account, key.ID, epoch)); err != nil { + return err + } + return consume(tx, fmt.Sprintf("insert into mo_catalog.mo_mv_refresh_runs (account_id,mv_id,run_id,sequence,epoch,status,started_at) values (%d,%d,%s,%d,%d,'RUNNING',current_timestamp())", key.Account, key.ID, literal(runID), sequence, epoch)) + }, opts) + if err != nil { + return err + } + // Only the persisted source SQL inherits authoring context. Control-plane SQL + // uses the executor's default literal escaping, including source names with + // backslashes, and must keep its own parser mode. + sourceOpts := opts.WithDatabase(definition.Database).WithTimeZone(zone).WithLowerCaseTableNames(&definition.LowerCaseTableNames).WithParserSQLMode(definition.SQLMode).WithResolveVariableFunc(func(name string, system, global bool) (interface{}, error) { + if system && !global { + switch strings.ToLower(name) { + case "sql_mode": + return definition.SQLMode, nil + case "div_precision_increment": + return int64(*definition.DivPrecisionIncrement), nil + } + } + if executor.DefaultResolveVariable != nil { + return executor.DefaultResolveVariable(name, system, global) + } + return nil, moerr.NewInvalidInputNoCtx("unsupported refresh session variable") + }) + err = s.metadataTxn(ctx, key, func(fence executor.TxnExecutor) error { + return s.SQL.ExecTxn(ctx, func(tx executor.TxnExecutor) error { + st, err := Load(tx, key) + if err != nil { + return err + } + if st.LastRun == runID { + return nil + } + if st.Successful >= sequence { + return consume(tx, fmt.Sprintf("update mo_catalog.mo_mv_refresh_runs set status='SUPERSEDED',finished_at=current_timestamp() where account_id=%d and mv_id=%d and run_id=%s and status='RUNNING'", key.Account, key.ID, literal(runID))) + } + if st.Epoch != epoch { + return moerr.NewInvalidInputNoCtx("materialized view definition changed during refresh") + } + if err := ValidateSources(tx, st); err != nil { + return err + } + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set successful_sequence=%d where account_id=%d and mv_id=%d and epoch=%d", sequence, key.Account, key.ID, epoch)); err != nil { + return err + } + ts := tx.Txn().SnapshotTS() + writeCtx := defines.WithMaterializedViewBudget(defines.WithMaterializedViewWrite(ctx, key.Account, key.ID, tx.Txn().Txn().ID), key.ID, 512<<20) + writeOpts := sourceOpts.WithTxn(tx.Txn()) + target := Quote(st.Database) + "." + Quote(st.Name) + for _, sql := range []string{"delete from " + target, "insert into " + target + " " + definition.Query} { + r, err := s.SQL.Exec(writeCtx, sql, writeOpts) + if err != nil { + return err + } + r.Close() + } + if !tx.Txn().SnapshotTS().Equal(ts) { + return moerr.NewInternalErrorNoCtx("materialized view refresh source snapshot changed") + } + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set populated=true,last_run=%s,source_physical=%d,source_logical=%d,last_success=current_timestamp(),next_due=%s where account_id=%d and mv_id=%d and epoch=%d", literal(runID), ts.PhysicalTime, ts.LogicalTime, nextDueSQL(st.Interval), key.Account, key.ID, epoch)); err != nil { + return err + } + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_mv_refresh_runs set status='SUCCEEDED',finished_at=current_timestamp(),source_physical=%d,source_logical=%d where account_id=%d and mv_id=%d and run_id=%s", ts.PhysicalTime, ts.LogicalTime, key.Account, key.ID, literal(runID))); err != nil { + return err + } + // Native recovery tests stop the CN with all replacement writes still + // uncommitted. Disabled fault injection is a single atomic pointer read. + fault.TriggerFaultWithContext(ctx, "mv_refresh_before_commit") + return nil + }, opts.WithMinCommittedTS(fence.Txn().SnapshotTS())) + }, executor.Options{}.WithAccountID(key.Account)) + if err == nil { + // This boundary is after durable publication and before the task runner + // receives its acknowledgement. ECHO(1) models a lost commit response; + // WAIT lets a native test kill this CN without stopping the TN. + if lost, _, _ := fault.TriggerFaultWithContext(ctx, "mv_refresh_after_commit"); lost == 1 { + err = moerr.NewInternalErrorNoCtx("injected materialized view commit response loss") + } + } + if err != nil { + // Diagnostic failure recording never changes the last-good result. A + // conditional RUNNING update cannot overwrite a committed success. + cleanupCtx, cleanupCancel := context.WithTimeout(context.WithoutCancel(ctx), 5*time.Second) + defer cleanupCancel() + // Resolve a lost commit response before reporting failure. + if committed, checkErr := s.State(cleanupCtx, key); checkErr == nil && committed.LastRun == runID { + return nil + } + message := "refresh failed" // Do not persist raw SQL/data/connection error strings. + _ = s.metadataTxn(cleanupCtx, key, func(tx executor.TxnExecutor) error { + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_mv_refresh_runs set status='FAILED',finished_at=current_timestamp(),error_message=%s where account_id=%d and mv_id=%d and run_id=%s and status='RUNNING'", literal(message), key.Account, key.ID, literal(runID))); err != nil { + return err + } + return consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set next_due=date_add(current_timestamp(),interval 60 second) where account_id=%d and mv_id=%d and epoch=%d and interval_seconds>0 and last_run<>%s", key.Account, key.ID, epoch, literal(runID))) + }, executor.Options{}.WithAccountID(catalog.System_Account)) + } + return err +} + +// AlterPolicy is called after frontend owner authorization. Read the live +// definition under the same metadata lifecycle fence used by DROP. +func (s *Service) AlterPolicy(ctx context.Context, key Key, interval int64) error { + ctx, cancel := context.WithTimeout(ctx, Timeout) + defer cancel() + if interval != 0 && interval < 60 { + return moerr.NewInvalidInputNoCtx("materialized view interval must be at least 60 seconds") + } + return s.metadataTxn(ctx, key, func(tx executor.TxnExecutor) error { + st, err := Load(tx, key) + if err != nil { + return err + } + definition := st.Definition + if interval > 0 { + if _, err = definition.RefreshTimeZone(); err != nil { + return err + } + } + definition.IntervalSeconds = interval + data, err := json.Marshal(definition) + if err != nil { + return err + } + return consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set epoch=epoch+1,definition=%s,interval_seconds=%d,next_due=%s where account_id=%d and mv_id=%d", literal(string(data)), interval, nextDueSQL(interval), key.Account, key.ID)) + }, executor.Options{}.WithAccountID(catalog.System_Account).WithWaitCommittedLogApplied()) +} + +func (s *Service) State(ctx context.Context, key Key) (*State, error) { + ctx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + var st *State + err := s.SQL.ExecTxn(ctx, func(tx executor.TxnExecutor) error { var err error; st, err = Load(tx, key); return err }, executor.Options{}.WithAccountID(key.Account)) + return st, err +} + +type refreshRun struct { + sequence, epoch uint64 + status string +} + +func loadRun(tx executor.TxnExecutor, key Key, id string) (*refreshRun, error) { + r, err := tx.Exec(fmt.Sprintf("select sequence,epoch,status from mo_catalog.mo_mv_refresh_runs where account_id=%d and mv_id=%d and run_id=%s", key.Account, key.ID, literal(id)), system()) + if err != nil { + return nil, err + } + defer r.Close() + var run *refreshRun + r.ReadRows(func(n int, c []*vector.Vector) bool { + if n > 0 { + run = &refreshRun{vector.GetFixedAtWithTypeCheck[uint64](c[0], 0), vector.GetFixedAtWithTypeCheck[uint64](c[1], 0), c[2].GetStringAt(0)} + } + return false + }) + return run, nil +} + +// Metadata-only writers hold DROP's existing lifecycle row lock through RC. +// Publication holds this read-only fence while a separate optimistic SI txn +// replaces data; its fixed snapshot starts after fence admission. Do not write +// the dependency revision or recreate retired account state here. +func (s *Service) metadataTxn(ctx context.Context, key Key, fn func(executor.TxnExecutor) error, opts executor.Options) error { + return s.retryTxn(ctx, func(tx executor.TxnExecutor) error { + if err := consume(tx, fmt.Sprintf("select revision from mo_catalog.mo_mv_account_state where account_id=%d for update", key.Account)); err != nil { + return err + } + return fn(tx) + }, opts.WithTxnMode(txn.TxnMode_Pessimistic).WithTxnIsolation(txn.TxnIsolation_RC)) +} + +func (s *Service) retryTxn(ctx context.Context, fn func(executor.TxnExecutor) error, opts executor.Options) error { + var err error + for attempt := 0; attempt < 3; attempt++ { + if ctx.Err() != nil { + return ctx.Err() + } + err = s.SQL.ExecTxn(ctx, fn, opts) + if !moerr.IsMoErrCode(err, moerr.ErrTxnWWConflict) && !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetry) && !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged) { + return err + } + } + return err +} diff --git a/pkg/mv/service_test.go b/pkg/mv/service_test.go new file mode 100644 index 0000000000000..6d374ddab4b84 --- /dev/null +++ b/pkg/mv/service_test.go @@ -0,0 +1,429 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mv + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strings" + "testing" + "time" + + "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/pb/timestamp" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/txn/client" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/util/fault" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewSourceIdentity(t *testing.T) { + mp := mpool.MustNewZero() + defer require.Zero(t, mp.CurrNB()) + st := &State{Key: Key{7, 99}, Database: "db", Definition: catalog.MVDefinition{Sources: []catalog.MVSource{{AccountID: 7, DatabaseID: 2, TableID: 3, LogicalID: 4, Version: 5, Database: "db", Table: "t"}}}} + for _, version := range []uint32{5, 6} { + tx := executor.NewMemTxnExecutor(func(sql string) (executor.Result, error) { + require.Contains(t, sql, "account_id=7 and reldatabase_id=2") + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_uint32.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint64{3})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{4})) + require.NoError(t, executor.AppendFixedRows(r, 2, []uint32{version})) + return r.GetResult(), nil + }, nil) + err := ValidateSources(tx, st) + if version == 5 { + require.NoError(t, err) + } else { + require.ErrorContains(t, err, "MV_INVALID_DEFINITION") + } + } + st.Definition.Sources[0].AccountID = 8 + tx := executor.NewMemTxnExecutor(func(string) (executor.Result, error) { + t.Fatal("invalid account reached SQL") + return executor.Result{}, nil + }, nil) + require.Error(t, ValidateSources(tx, st)) +} +func TestMaterializedViewTaskIdentity(t *testing.T) { + a := runMetadata(Key{7, 99}, 2, 10) + require.LessOrEqual(t, len(a.ID), 50, "task storage metadata ID width") + require.Equal(t, a, runMetadata(Key{7, 99}, 2, 10)) + require.NotEqual(t, a.ID, runMetadata(Key{7, 100}, 2, 10).ID) + require.NotEqual(t, a.ID, runMetadata(Key{7, 99}, 3, 10).ID) + require.NotEqual(t, a.ID, runMetadata(Key{7, 99}, 2, 11).ID) + var spec TaskSpec + require.NoError(t, json.Unmarshal(a.Context, &spec)) + require.Equal(t, uint64(99), spec.Key.ID) + require.Len(t, spec.RunID, 64) + s := NewService(executor.NewMemExecutor(func(string) (executor.Result, error) { + t.Fatal("cancelled admission reached SQL") + return executor.Result{}, nil + })) + s.accounts[7] <- struct{}{} + ctx, cancel := context.WithCancel(context.Background()) + cancel() + require.ErrorIs(t, s.Refresh(ctx, Key{7, 99}, 0), context.Canceled) +} + +type refreshExecutor struct { + executor.SQLExecutor + t *testing.T + op client.TxnOperator + txnOpts executor.Options + lifecycleLocked bool + mp *mpool.MPool + state State + failInsert bool + failPublish bool + conflictOnce bool + changeEpoch bool + loseCommitResponse bool + loseFenceResponse bool + prior *refreshRun + lastPublication string + failureRecords int + dataWrites int + publications int + commits, rollbacks int +} + +func (e *refreshExecutor) ExecTxn(ctx context.Context, f func(executor.TxnExecutor) error, opts executor.Options) error { + if e.conflictOnce { + e.conflictOnce = false + return moerr.NewTxnWWConflictNoCtx(99, "injected conflict") + } + _, bounded := ctx.Deadline() + require.True(e.t, bounded, "native transaction operations require a deadline") + priorOpts, priorLock := e.txnOpts, e.lifecycleLocked + e.txnOpts = opts + defer func() { e.txnOpts, e.lifecycleLocked = priorOpts, priorLock }() + tx := executor.NewMemTxnExecutor(e.statement, e.op) + err := f(tx) + if err != nil { + e.rollbacks++ + } else { + e.commits++ + if e.publications > 0 { + e.state.LastRun = e.lastPublication + } + if e.changeEpoch && e.commits == 1 { + e.state.Epoch++ + } + if e.loseFenceResponse && opts.TxnMode() == txn.TxnMode_Pessimistic && e.publications > 0 { + e.loseFenceResponse = false + return errors.New("lost read-only fence completion response") + } + if e.loseCommitResponse && e.publications > 0 { + e.loseCommitResponse = false + e.state.LastRun = e.lastPublication + return errors.New("lost commit response") + } + } + return err +} +func (e *refreshExecutor) Exec(ctx context.Context, sql string, opts executor.Options) (executor.Result, error) { + if strings.HasPrefix(sql, "delete from `db`.`stored`") || strings.HasPrefix(sql, "insert into `db`.`stored`") { + require.True(e.t, e.lifecycleLocked, "data replacement must hold the outer lifecycle lock until publication completes") + require.Equal(e.t, txn.TxnMode_Optimistic, e.txnOpts.TxnMode()) + require.Equal(e.t, txn.TxnIsolation_SI, e.txnOpts.TxnIsolation()) + require.False(e.t, e.txnOpts.MinCommittedTS().IsEmpty(), "SI snapshot must follow fence admission") + require.Equal(e.t, txn.TxnMode_Optimistic, opts.TxnMode(), "data publication retains native SI") + require.Equal(e.t, txn.TxnIsolation_SI, opts.TxnIsolation()) + require.Same(e.t, e.op, opts.Txn()) + require.True(e.t, defines.CanWriteMaterializedView(ctx, 7, 99, e.op.Txn().ID)) + e.dataWrites++ + if e.failInsert && strings.HasPrefix(sql, "insert") { + return executor.Result{}, errors.New("injected source/write failure") + } + } + return e.statement(sql) +} +func (e *refreshExecutor) statement(sql string) (executor.Result, error) { + if sql == "select revision from mo_catalog.mo_mv_account_state where account_id=7 for update" { + e.lifecycleLocked = true + } + if strings.Contains(sql, "set status='FAILED'") { + e.failureRecords++ + } + if strings.HasPrefix(sql, "select sequence,") && e.prior != nil { + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_varchar.ToType()}, e.mp) + r.NewBatchWithRowCount(1) + require.NoError(e.t, executor.AppendFixedRows(r, 0, []uint64{e.prior.sequence})) + require.NoError(e.t, executor.AppendFixedRows(r, 1, []uint64{e.prior.epoch})) + require.NoError(e.t, executor.AppendStringRows(r, 2, []string{e.prior.status})) + return r.GetResult(), nil + } + if strings.HasPrefix(sql, "select database_name,") { + return e.stateResult(), nil + } + if strings.HasPrefix(sql, "select rel_id,") { + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_uint32.ToType()}, e.mp) + r.NewBatchWithRowCount(1) + require.NoError(e.t, executor.AppendFixedRows(r, 0, []uint64{3})) + require.NoError(e.t, executor.AppendFixedRows(r, 1, []uint64{4})) + require.NoError(e.t, executor.AppendFixedRows(r, 2, []uint32{5})) + return r.GetResult(), nil + } + if strings.HasPrefix(sql, "update mo_catalog.mo_materialized_views set populated=true") { + if e.failPublish { + return executor.Result{}, errors.New("injected publication failure") + } + e.publications++ + e.lastPublication = strings.SplitN(strings.SplitN(sql, "last_run='", 2)[1], "'", 2)[0] + require.Contains(e.t, sql, "source_physical=123,source_logical=17") + } + return executor.Result{}, nil +} +func (e *refreshExecutor) stateResult() executor.Result { + data, err := json.Marshal(e.state.Definition) + require.NoError(e.t, err) + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType(), types.T_varchar.ToType(), types.T_text.ToType(), types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_bool.ToType(), types.T_varchar.ToType(), types.T_int64.ToType(), types.T_uint32.ToType(), types.T_int64.ToType()}, e.mp) + r.NewBatchWithRowCount(1) + for i, s := range []string{"db", "stored", string(data)} { + require.NoError(e.t, executor.AppendStringRows(r, i, []string{s})) + } + require.NoError(e.t, executor.AppendFixedRows(r, 3, []uint64{e.state.Epoch})) + require.NoError(e.t, executor.AppendFixedRows(r, 4, []uint64{e.state.Requested})) + require.NoError(e.t, executor.AppendFixedRows(r, 5, []uint64{e.state.Successful})) + require.NoError(e.t, executor.AppendFixedRows(r, 6, []bool{true})) + require.NoError(e.t, executor.AppendStringRows(r, 7, []string{e.state.LastRun})) + require.NoError(e.t, executor.AppendFixedRows(r, 8, []int64{5})) + require.NoError(e.t, executor.AppendFixedRows(r, 9, []uint32{6})) + require.NoError(e.t, executor.AppendFixedRows(r, 10, []int64{e.state.Interval})) + return r.GetResult() +} +func TestMaterializedViewRefreshTransaction(t *testing.T) { + for _, tc := range []struct { + name string + fail bool + epoch uint64 + }{{"success", false, 2}, {"insert failure", true, 2}, {"obsolete epoch", false, 3}} { + t.Run(tc.name, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().SnapshotTS().Return(timestamp.Timestamp{PhysicalTime: 123, LogicalTime: 17}).AnyTimes() + op.EXPECT().Txn().Return(txn.TxnMeta{ID: []byte("refresh-txn")}).AnyTimes() + e := &refreshExecutor{t: t, op: op, mp: mp, failInsert: tc.fail, state: State{Key: Key{7, 99}, Epoch: 2, Requested: 10, Successful: 9, Definition: catalog.MVDefinition{FormatVersion: catalog.MVDefinitionFormatVersion, DivPrecisionIncrement: new(int32(4)), TimeZoneKind: "fixed", Database: "db", Query: "select * from t", TimeZone: "UTC", Sources: []catalog.MVSource{{AccountID: 7, DatabaseID: 2, TableID: 3, LogicalID: 4, Version: 5, Database: "db", Table: "t"}}}}} + s := NewService(e) + err := s.Refresh(context.Background(), Key{7, 99}, tc.epoch) + require.Zero(t, len(s.slots)) + require.Zero(t, len(s.accounts[7])) + switch tc.name { + case "success": + require.NoError(t, err) + require.Equal(t, 2, e.dataWrites) + require.Equal(t, 1, e.publications) + require.Equal(t, 3, e.commits) + case "insert failure": + require.ErrorContains(t, err, "injected") + require.Equal(t, 2, e.dataWrites) + require.Zero(t, e.publications) + require.Equal(t, 2, e.rollbacks) + case "obsolete epoch": + require.ErrorContains(t, err, "obsolete") + require.Zero(t, e.dataWrites) + require.Zero(t, e.publications) + } + }) + } +} + +func TestMaterializedViewRefreshFailureBoundaries(t *testing.T) { + for _, scenario := range []string{"metadata publication failure", "source snapshot drift", "definition changed", "lost commit response", "lost fence completion response", "injected post-commit response loss", "retry conflict", "task replay", "obsolete replay epoch", "invalid task account"} { + t.Run(scenario, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().Txn().Return(txn.TxnMeta{ID: []byte("refresh-txn")}).AnyTimes() + snapshots := 0 + op.EXPECT().SnapshotTS().DoAndReturn(func() timestamp.Timestamp { + snapshots++ + ts := timestamp.Timestamp{PhysicalTime: 123, LogicalTime: 17} + if scenario == "source snapshot drift" && snapshots > 2 { + ts.LogicalTime++ + } + return ts + }).AnyTimes() + e := &refreshExecutor{t: t, op: op, mp: mp, state: State{Key: Key{7, 99}, Epoch: 2, Requested: 10, Successful: 9, LastRun: "last-good", Definition: catalog.MVDefinition{FormatVersion: catalog.MVDefinitionFormatVersion, DivPrecisionIncrement: new(int32(4)), TimeZoneKind: "fixed", Database: "db", Query: "select * from t", TimeZone: "UTC", SQLMode: "NO_UNSIGNED_SUBTRACTION", Sources: []catalog.MVSource{{AccountID: 7, DatabaseID: 2, TableID: 3, LogicalID: 4, Version: 5, Database: "db", Table: "t"}}}}} + runID := strings.Repeat("a", 64) + ctx := context.Background() + switch scenario { + case "metadata publication failure": + e.failPublish = true + case "definition changed": + e.changeEpoch = true + case "lost commit response": + e.loseCommitResponse = true + case "lost fence completion response": + e.loseFenceResponse = true + case "injected post-commit response loss": + enabledHere := fault.Enable() + t.Cleanup(func() { + if enabledHere { + defer fault.Disable() + } + _, err := fault.RemoveFaultPoint(context.Background(), "mv_refresh_after_commit") + require.NoError(t, err) + }) + require.NoError(t, fault.AddFaultPoint(context.Background(), "mv_refresh_after_commit", ":::", "echo", 1, "", false)) + case "retry conflict": + e.conflictOnce = true + case "task replay": + e.prior = &refreshRun{11, 2, "SUCCEEDED"} + e.state.LastRun = runID + e.state.Successful = 11 + ctx = defines.WithMaterializedViewTask(ctx, defines.MaterializedViewTask{Account: 7, Table: 99, Epoch: 2, RunID: runID}) + case "obsolete replay epoch": + e.prior = &refreshRun{11, 1, "RUNNING"} + ctx = defines.WithMaterializedViewTask(ctx, defines.MaterializedViewTask{Account: 7, Table: 99, Epoch: 2, RunID: runID}) + case "invalid task account": + ctx = defines.WithMaterializedViewTask(ctx, defines.MaterializedViewTask{Account: 8, Table: 99, Epoch: 2, RunID: runID}) + } + service := NewService(e) + err := service.Refresh(ctx, Key{7, 99}, 2) + switch scenario { + case "retry conflict", "lost commit response", "lost fence completion response", "injected post-commit response loss": + require.NoError(t, err) + require.Equal(t, 2, e.dataWrites) + require.Equal(t, 1, e.publications) + require.Zero(t, e.failureRecords) + case "task replay": + require.NoError(t, err) + require.Zero(t, e.dataWrites) + require.Zero(t, e.publications) + default: + require.Error(t, err) + require.Zero(t, e.publications) + if scenario == "source snapshot drift" || scenario == "metadata publication failure" { + require.Equal(t, 2, e.dataWrites) + } else { + require.Zero(t, e.dataWrites) + } + } + require.Zero(t, len(service.slots)) + require.Zero(t, len(service.accounts[7])) + }) + } +} + +func TestMaterializedViewBoundedAdmission(t *testing.T) { + s := NewService(executor.NewMemExecutor(func(string) (executor.Result, error) { + t.Fatal("full admission reached SQL") + return executor.Result{}, nil + })) + s.pending[7] <- struct{}{} + s.pending[7] <- struct{}{} + require.ErrorContains(t, s.Refresh(context.Background(), Key{7, 99}, 0), "MV_REFRESH_BUSY") + require.Equal(t, 2, len(s.pending[7])) + require.Zero(t, len(s.accounts[7])) + require.Zero(t, len(s.slots)) +} + +func TestMaterializedViewCapturedTimeZone(t *testing.T) { + for _, zone := range []struct { + name string + offset int32 + }{{"+08:00", 28800}, {"UTC", 0}, {"Local", -18000}} { + t.Run(zone.name, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().Txn().Return(txn.TxnMeta{ID: []byte("refresh-txn")}).AnyTimes() + op.EXPECT().SnapshotTS().Return(timestamp.Timestamp{PhysicalTime: 123, LogicalTime: 17}).AnyTimes() + e := &refreshExecutor{t: t, op: op, mp: mp, state: State{Key: Key{7, 99}, Epoch: 1, Definition: catalog.MVDefinition{FormatVersion: catalog.MVDefinitionFormatVersion, DivPrecisionIncrement: new(int32(4)), TimeZoneKind: "fixed", Database: "db", Query: "select * from t", TimeZone: zone.name, TimeZoneOffset: zone.offset, SQLMode: "PIPES_AS_CONCAT,NO_BACKSLASH_ESCAPES", Sources: []catalog.MVSource{{AccountID: 7, DatabaseID: 2, TableID: 3, LogicalID: 4, Version: 5, Database: "db", Table: "t"}}}}} + wrapped := &zoneExecutor{refreshExecutor: e, offset: int(zone.offset)} + require.NoError(t, NewService(wrapped).Refresh(context.Background(), Key{7, 99}, 0)) + }) + } +} + +type zoneExecutor struct { + *refreshExecutor + offset int +} + +func (e *zoneExecutor) ExecTxn(ctx context.Context, f func(executor.TxnExecutor) error, opts executor.Options) error { + require.Empty(e.t, opts.ParserSQLMode(), "metadata SQL must retain its own literal/parser contract") + return e.refreshExecutor.ExecTxn(ctx, f, opts) +} + +func (e *zoneExecutor) Exec(ctx context.Context, sql string, opts executor.Options) (executor.Result, error) { + if strings.HasPrefix(sql, "insert into `db`.`stored`") { + require.Equal(e.t, e.state.Definition.SQLMode, opts.ParserSQLMode()) + _, offset := time.Unix(0, 0).In(opts.GetTimeZone()).Zone() + require.Equal(e.t, e.offset, offset) + } + return e.refreshExecutor.Exec(ctx, sql, opts) +} + +func TestMaterializedViewCatalogReadiness(t *testing.T) { + for _, count := range []int64{0, 1, 3, 4} { + t.Run(fmt.Sprint(count), func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + tx := executor.NewMemTxnExecutor(func(sql string) (executor.Result, error) { + require.Equal(t, CatalogReadinessSQL, sql) + r := executor.NewMemResult([]types.Type{types.T_int64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []int64{count})) + return r.GetResult(), nil + }, nil) + ready, err := CatalogReady(tx) + if count == 0 || count == 4 { + require.NoError(t, err) + require.Equal(t, count == 4, ready) + } else { + require.ErrorContains(t, err, "incomplete") + require.False(t, ready) + } + }) + } + injected := errors.New("catalog read failed") + ready, err := CatalogReady(executor.NewMemTxnExecutor(func(string) (executor.Result, error) { return executor.Result{}, injected }, nil)) + require.ErrorIs(t, err, injected) + require.False(t, ready) +} + +func TestMaterializedViewLegacyRefreshDoesNotPublish(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + e := &refreshExecutor{t: t, op: op, mp: mp, state: State{Key: Key{7, 99}, Epoch: 2, Successful: 9, LastRun: "last-good", Definition: catalog.MVDefinition{FormatVersion: 1, Query: "select * from t", Sources: []catalog.MVSource{{Table: "t"}}}}} + require.ErrorContains(t, NewService(e).Refresh(context.Background(), Key{7, 99}, 0), "recreate") + require.Zero(t, e.dataWrites) + require.Zero(t, e.publications) + require.Equal(t, "last-good", e.state.LastRun) +} + +func TestMaterializedViewCreateSQL(t *testing.T) { + for _, tc := range []struct { + interval int64 + policy string + }{{0, "manual"}, {120, "every interval 120 second"}} { + state := &State{Database: "db`name", Name: "mv`name", Interval: tc.interval, Definition: catalog.MVDefinition{Query: "select k from `source`", IntervalSeconds: 60}} + require.Equal(t, "create materialized view `db``name`.`mv``name` refresh "+tc.policy+" as select k from `source`", state.CreateSQL()) + } +} diff --git a/pkg/mv/task.go b/pkg/mv/task.go new file mode 100644 index 0000000000000..8f23ad2f3b25c --- /dev/null +++ b/pkg/mv/task.go @@ -0,0 +1,261 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mv + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "time" + + "github.com/matrixorigin/matrixone/pkg/bootstrap/versions" + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/pb/task" + "github.com/matrixorigin/matrixone/pkg/taskservice" + "github.com/matrixorigin/matrixone/pkg/util/executor" + ie "github.com/matrixorigin/matrixone/pkg/util/internalExecutor" +) + +const CronExpression = "*/30 * * * * *" + +// TaskSpec is an internal, versioned task envelope, never a user SQL body. +type TaskSpec struct { + Version int + Reconcile bool + Key Key + Epoch uint64 + RunID string +} + +func CronMetadata() task.TaskMetadata { + data, _ := json.Marshal(TaskSpec{Version: 1, Reconcile: true}) + return task.TaskMetadata{ID: "materialized-view-reconcile-v1", Executor: task.TaskCode_MaterializedView, Context: data, Options: task.TaskOptions{Concurrency: 1}} +} + +// RegisterCron publishes the new task code only after its catalogs and every +// inventoried consumer are ready. Registering an executor on this CN alone +// cannot prevent an old CN from claiming a globally scheduled reconcile task. +// The CN's existing registration loop owns the deadline, retry and shutdown. +func (s *Service) RegisterCron(ctx context.Context, ts taskservice.TaskService) error { + if err := s.SQL.ExecTxn(ctx, func(tx executor.TxnExecutor) error { + ready, err := CatalogReady(tx) + if err != nil { + return err + } + if !ready { + return moerr.NewInvalidStateNoCtx("materialized view catalogs are not installed") + } + return versions.CheckCommonProtocolVersion(tx, defines.MORPCVersion122) + }, executor.Options{}.WithAccountID(catalog.System_Account)); err != nil { + return err + } + return ts.CreateCronTask(ctx, CronMetadata(), CronExpression) +} + +func runMetadata(key Key, epoch uint64, due int64) task.TaskMetadata { + digest := sha256.Sum256([]byte(fmt.Sprintf("%d:%d:%d:%d", key.Account, key.ID, epoch, due))) + id := hex.EncodeToString(digest[:]) + data, _ := json.Marshal(TaskSpec{Version: 1, Key: key, Epoch: epoch, RunID: id}) + // sys_async_task.task_metadata_id is VARCHAR(50). Keep 160 digest bits in + // the queue identity while the persisted refresh run uses the full digest. + return task.TaskMetadata{ID: "mv:" + id[:40], Executor: task.TaskCode_MaterializedView, Context: data, Options: task.TaskOptions{MaxRetryTimes: 2, RetryInterval: int64(5 * time.Second), Concurrency: 1}} +} + +func (s *Service) TaskExecutor(ts taskservice.TaskService, factory func() ie.InternalExecutor) taskservice.TaskExecutor { + return func(ctx context.Context, value task.Task) error { + ctx, cancel := context.WithTimeout(ctx, Timeout) + defer cancel() + async, ok := value.(*task.AsyncTask) + if !ok { + return moerr.NewInvalidInputNoCtx("invalid materialized view task") + } + var spec TaskSpec + if err := json.Unmarshal(async.Metadata.Context, &spec); err != nil { + return err + } + if spec.Version != 1 { + return moerr.NewNotSupportedNoCtx("materialized view task version") + } + if spec.Reconcile { + return s.reconcile(ctx, ts) + } + st, err := s.State(ctx, spec.Key) + if err != nil { + return err + } + if st.Epoch != spec.Epoch || st.Interval == 0 { + return nil + } + ctx = defines.AttachAccount(ctx, st.Account, st.Definition.OwnerUser, st.Definition.OwnerRole) + ctx = defines.WithMaterializedViewTask(ctx, defines.MaterializedViewTask{Account: st.Account, Table: st.ID, Epoch: spec.Epoch, RunID: spec.RunID}) + // The frontend rechecks owner existence, active role and source ACL. It never + // uses the privileged catalog executor for source permission admission. + opts := ie.NewOptsBuilder().AccountId(st.Account).UserId(st.Definition.OwnerUser).DefaultRoleId(st.Definition.OwnerRole).Username(st.Definition.OwnerName).Database(st.Database).Internal(false).Finish() + err = factory().Exec(ctx, "refresh materialized view "+Quote(st.Database)+"."+Quote(st.Name), opts) + if err != nil { + s.recordTaskFailure(ctx, spec) + } + return err + } +} + +// Admission failures (including revoked definer permissions) occur before +// Refresh can create a run. Record a sanitized terminal attempt and move the +// due time together so completed task deduplication cannot strand the policy. +func (s *Service) recordTaskFailure(ctx context.Context, spec TaskSpec) { + ctx, cancel := context.WithTimeout(context.WithoutCancel(ctx), 5*time.Second) + defer cancel() + _ = s.metadataTxn(ctx, spec.Key, func(tx executor.TxnExecutor) error { + st, err := Load(tx, spec.Key) + if err != nil { + return err + } + if st.Epoch != spec.Epoch || st.LastRun == spec.RunID { + return nil + } + prior, err := loadRun(tx, spec.Key, spec.RunID) + if err != nil { + return err + } + if prior == nil { + sequence := st.Requested + 1 + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set requested_sequence=%d where account_id=%d and mv_id=%d", sequence, st.Account, st.ID)); err != nil { + return err + } + if err := consume(tx, fmt.Sprintf("insert into mo_catalog.mo_mv_refresh_runs(account_id,mv_id,run_id,sequence,epoch,status,started_at,finished_at,error_message) values(%d,%d,%s,%d,%d,'FAILED',current_timestamp(),current_timestamp(),'refresh admission failed')", st.Account, st.ID, literal(spec.RunID), sequence, st.Epoch)); err != nil { + return err + } + } + return consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set next_due=date_add(current_timestamp(),interval 60 second) where account_id=%d and mv_id=%d and interval_seconds>0", st.Account, st.ID)) + }, executor.Options{}.WithAccountID(spec.Key.Account).WithWaitCommittedLogApplied()) +} +func (s *Service) reconcile(ctx context.Context, ts taskservice.TaskService) error { + ctx, cancel := context.WithTimeout(ctx, Timeout) + defer cancel() + opts := executor.Options{}.WithAccountID(catalog.System_Account) + // Recover a bounded, indexed page of interrupted attempts. + r, err := s.SQL.Exec(ctx, "select account_id,mv_id,run_id,epoch from mo_catalog.mo_mv_refresh_runs where status='RUNNING' and started_at0 and last_run<>%s and exists(select 1 from mo_catalog.mo_mv_refresh_runs where account_id=%d and mv_id=%d and run_id=%s and status='RUNNING' and started_at0 and next_due<=current_timestamp() and not exists (select 1 from mo_catalog.mo_mv_refresh_runs r where r.account_id=v.account_id and r.mv_id=v.mv_id and r.status='RUNNING') order by next_due,account_id,mv_id limit 128", opts) + if err != nil { + return err + } + var batch []task.TaskMetadata + r.ReadRows(func(n int, c []*vector.Vector) bool { + for i := 0; i < n; i++ { + batch = append(batch, runMetadata(Key{vector.GetFixedAtWithTypeCheck[uint32](c[0], i), vector.GetFixedAtWithTypeCheck[uint64](c[1], i)}, vector.GetFixedAtWithTypeCheck[uint64](c[2], i), vector.GetFixedAtWithTypeCheck[int64](c[3], i))) + } + return true + }) + r.Close() + if len(batch) > 0 { + if err := ts.CreateBatch(ctx, batch); err != nil { + return err + } + } + return s.cleanupHistory(ctx) +} + +// Visit 16 indexed maintenance intents. Each visits at most 128 terminal run +// IDs per retention rule and advances its cursor, including manual-only MVs. +func (s *Service) cleanupHistory(ctx context.Context) error { + opts := executor.Options{}.WithAccountID(catalog.System_Account) + r, err := s.SQL.Exec(ctx, "select account_id,mv_id from mo_catalog.mo_materialized_views where next_cleanup<=current_timestamp() order by next_cleanup,account_id,mv_id limit 16", opts) + if err != nil { + return err + } + var keys []Key + r.ReadRows(func(n int, c []*vector.Vector) bool { + for i := 0; i < n; i++ { + keys = append(keys, Key{vector.GetFixedAtWithTypeCheck[uint32](c[0], i), vector.GetFixedAtWithTypeCheck[uint64](c[1], i)}) + } + return true + }) + r.Close() + for _, key := range keys { + if ctx.Err() != nil { + return ctx.Err() + } + // Stable primary-key deletes are conditional on terminal status. The two + // pages may overlap; DELETE is idempotent and never removes an active run. + ids := map[string]struct{}{} + more := false + for _, condition := range []string{"order by sequence desc limit 128 offset 100", "and started_at'RUNNING' %s", key.Account, key.ID, condition), opts) + if err != nil { + return err + } + pageRows := 0 + r.ReadRows(func(n int, c []*vector.Vector) bool { + pageRows += n + for i := 0; i < n; i++ { + ids[c[0].GetStringAt(i)] = struct{}{} + } + return true + }) + r.Close() + more = more || pageRows >= 128 + } + for id := range ids { + r, err := s.SQL.Exec(ctx, fmt.Sprintf("delete from mo_catalog.mo_mv_refresh_runs where account_id=%d and mv_id=%d and run_id=%s and status<>'RUNNING'", key.Account, key.ID, literal(id)), opts) + if err != nil { + return err + } + r.Close() + } + next := "date_add(current_timestamp(),interval 1 hour)" + if more { + next = "current_timestamp()" + } + // A stale maintenance intent must not race definition retirement. Share + // DROP's lifecycle fence and transaction mode before writing the cursor. + err := s.metadataTxn(ctx, key, func(tx executor.TxnExecutor) error { + return consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set next_cleanup=%s where account_id=%d and mv_id=%d", next, key.Account, key.ID)) + }, opts) + if err != nil { + return err + } + } + return nil +} diff --git a/pkg/mv/task_test.go b/pkg/mv/task_test.go new file mode 100644 index 0000000000000..978f333d23532 --- /dev/null +++ b/pkg/mv/task_test.go @@ -0,0 +1,654 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mv + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strings" + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/pb/task" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/taskservice" + "github.com/matrixorigin/matrixone/pkg/util/executor" + ie "github.com/matrixorigin/matrixone/pkg/util/internalExecutor" + "github.com/stretchr/testify/require" +) + +type scheduledTasks struct { + taskservice.TaskService + batches [][]task.TaskMetadata + crons []task.TaskMetadata + exprs []string + cronErr error +} + +type maintenanceTxnExecutor struct { + executor.SQLExecutor + execTxn func(context.Context, func(executor.TxnExecutor) error, executor.Options) error +} + +func (e *maintenanceTxnExecutor) ExecTxn(ctx context.Context, f func(executor.TxnExecutor) error, opts executor.Options) error { + return e.execTxn(ctx, f, opts) +} + +func TestMaterializedViewMaintenanceLifecycleFence(t *testing.T) { + for _, phase := range []string{"success", "fence failure", "cancelled fence", "cursor failure"} { + t.Run(phase, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + failure := errors.New("maintenance lifecycle fence unavailable") + inTxn, fenced := false, false + txns, fences, cursors := 0, 0, 0 + query := func(q string) (executor.Result, error) { + switch { + case strings.HasPrefix(q, "select account_id,mv_id from"): + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{99})) + return r.GetResult(), nil + case strings.HasPrefix(q, "select run_id"): + return executor.Result{}, nil + case strings.HasPrefix(q, "select revision from mo_catalog.mo_mv_account_state "): + require.True(t, inTxn) + require.Zero(t, cursors) + require.Equal(t, "select revision from mo_catalog.mo_mv_account_state where account_id=7 for update", q) + fences++ + if phase == "fence failure" { + return executor.Result{}, failure + } + if phase == "cancelled fence" { + cancel() + return executor.Result{}, ctx.Err() + } + fenced = true + case strings.HasPrefix(q, "update mo_catalog.mo_materialized_views set next_cleanup="): + require.True(t, inTxn && fenced, "cursor and lifecycle fence must share one transaction") + require.Contains(t, q, "account_id=7 and mv_id=99") + cursors++ + if phase == "cursor failure" { + return executor.Result{}, failure + } + default: + t.Fatalf("unexpected maintenance SQL (retired account state must not be inserted): %s", q) + } + return executor.Result{}, nil + } + sql := &maintenanceTxnExecutor{SQLExecutor: executor.NewMemExecutor(query)} + sql.execTxn = func(ctx context.Context, f func(executor.TxnExecutor) error, opts executor.Options) error { + require.Equal(t, txn.TxnMode_Pessimistic, opts.TxnMode()) + require.Equal(t, txn.TxnIsolation_RC, opts.TxnIsolation()) + require.Equal(t, uint32(catalog.System_Account), opts.AccountID()) + txns++ + inTxn = true + defer func() { inTxn = false }() + return f(executor.NewMemTxnExecutor(query, nil)) + } + err := NewService(sql).cleanupHistory(ctx) + if phase == "success" { + require.NoError(t, err) + } else if phase == "cancelled fence" { + require.ErrorIs(t, err, context.Canceled) + } else { + require.ErrorIs(t, err, failure) + } + require.Equal(t, 1, txns) + require.Equal(t, 1, fences) + if phase == "success" || phase == "cursor failure" { + require.Equal(t, 1, cursors) + } else { + require.Zero(t, cursors) + } + }) + } +} + +func (s *scheduledTasks) CreateCronTask(_ context.Context, metadata task.TaskMetadata, expression string) error { + s.crons = append(s.crons, metadata) + s.exprs = append(s.exprs, expression) + return s.cronErr +} + +func TestMaterializedViewCronAdmission(t *testing.T) { + for _, name := range []string{"ready", "missing catalogs", "partial catalogs", "catalog query failure", "old consumer", "protocol query failure", "empty inventory", "task store failure"} { + t.Run(name, func(t *testing.T) { + mp := mpool.MustNewZeroNoFixed() + t.Cleanup(func() { + defer mpool.DeleteMPool(mp) + require.Zero(t, mp.CurrNB()) + }) + injected := errors.New("cron admission dependency unavailable") + protocolQueries := 0 + sql := executor.NewMemExecutor(func(query string) (executor.Result, error) { + if query == CatalogReadinessSQL { + if name == "catalog query failure" { + return executor.Result{}, injected + } + count := int64(4) + if name == "missing catalogs" { + count = 0 + } else if name == "partial catalogs" { + count = 2 + } + r := executor.NewMemResult([]types.Type{types.T_int64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []int64{count})) + return r.GetResult(), nil + } + require.Equal(t, "SELECT mo_ctl('cn', 'GetProtocolVersion', '')", query) + protocolQueries++ + if name == "protocol query failure" { + return executor.Result{}, injected + } + if name == "empty inventory" { + return executor.Result{}, nil + } + value := `{"result":"cn-new:122,tn-new:122"}` + if name == "old consumer" { + value = `{"result":"cn-new:122,cn-old:121,tn-new:122"}` + } + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendStringRows(r, 0, []string{value})) + return r.GetResult(), nil + }) + tasks := &scheduledTasks{} + if name == "task store failure" { + tasks.cronErr = injected + } + err := NewService(sql).RegisterCron(t.Context(), tasks) + if name == "ready" { + require.NoError(t, err) + } else { + require.Error(t, err) + } + if name == "ready" || name == "task store failure" { + require.Equal(t, []task.TaskMetadata{CronMetadata()}, tasks.crons) + require.Equal(t, []string{CronExpression}, tasks.exprs) + } else { + require.Empty(t, tasks.crons, "no new task code may be published before admission") + } + if strings.Contains(name, "catalog") { + require.Zero(t, protocolQueries) + } else { + require.Equal(t, 1, protocolQueries) + } + }) + } +} + +type scheduledRefreshExecutor struct { + ie.InternalExecutor + exec func(context.Context, string, ie.SessionOverrideOptions) error +} + +func (e scheduledRefreshExecutor) Exec(ctx context.Context, query string, opts ie.SessionOverrideOptions) error { + return e.exec(ctx, query, opts) +} + +// A queue entry cannot borrow a privileged session, revive an obsolete policy, +// or lose its terminal admission failure. Reuse the existing in-memory catalog +// fixture; no timer, task runner, or SQL service is needed for these boundaries. +func TestMaterializedViewTaskAdmission(t *testing.T) { + for _, name := range []string{"non-async task", "malformed envelope", "unknown version", "metadata failure", "retired definition", "obsolete epoch", "manual policy", "definer success", "definer failure", "already published failure"} { + t.Run(name, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + state := State{Key: Key{7, 99}, Epoch: 2, Interval: 60, + Definition: catalog.MVDefinition{FormatVersion: 1, Database: "db", Query: "select * from t", OwnerUser: 11, OwnerRole: 12, OwnerName: "owner", Sources: []catalog.MVSource{{AccountID: 7, Database: "db", Table: "t"}}}} + if name == "manual policy" { + state.Interval = 0 + } + if name == "already published failure" { + state.LastRun = "queued-run" + } + fixture := &refreshExecutor{t: t, mp: mp, state: state} + metadataError := errors.New("metadata unavailable") + definerError := errors.New("definer permission revoked") + var writes []string + loads, calls, fences := 0, 0, 0 + sql := executor.NewMemExecutor(func(query string) (executor.Result, error) { + if strings.HasPrefix(query, "select revision from mo_catalog.mo_mv_account_state ") { + require.Empty(t, writes) + require.Contains(t, query, "where account_id=7") + fences++ + return executor.Result{}, nil + } + if strings.HasPrefix(query, "select database_name,") { + loads++ + if name == "metadata failure" { + return executor.Result{}, metadataError + } + if name == "retired definition" { + return executor.Result{}, nil + } + + return fixture.stateResult(), nil + } + if !strings.HasPrefix(query, "select ") { + writes = append(writes, query) + } + return executor.Result{}, nil + }) + svc := NewService(sql) + spec := TaskSpec{Version: 1, Key: state.Key, Epoch: 2, RunID: "queued-run"} + if name == "unknown version" { + spec.Version = 2 + } + if name == "obsolete epoch" { + spec.Epoch = 1 + } + payload, err := json.Marshal(spec) + require.NoError(t, err) + if name == "malformed envelope" { + payload = []byte("[") + } + var queued task.Task = &task.AsyncTask{Metadata: task.TaskMetadata{Context: payload}} + if name == "non-async task" { + queued = &task.CronTask{} + } + run := svc.TaskExecutor(nil, func() ie.InternalExecutor { + calls++ + return scheduledRefreshExecutor{exec: func(ctx context.Context, query string, opts ie.SessionOverrideOptions) error { + account, err := defines.GetAccountId(ctx) + require.NoError(t, err) + require.Equal(t, uint32(7), account) + require.Equal(t, uint32(11), defines.GetUserId(ctx)) + require.Equal(t, uint32(12), defines.GetRoleId(ctx)) + envelope, ok := defines.GetMaterializedViewTask(ctx) + require.True(t, ok) + require.Equal(t, defines.MaterializedViewTask{Account: 7, Table: 99, Epoch: 2, RunID: "queued-run"}, envelope) + require.Equal(t, "refresh materialized view `db`.`stored`", query) + require.Equal(t, ie.NewOptsBuilder().AccountId(7).UserId(11).DefaultRoleId(12).Username("owner").Database("db").Internal(false).Finish(), opts) + _, bounded := ctx.Deadline() + require.True(t, bounded) + if name != "definer success" { + return definerError + } + return nil + }} + }) + err = run(context.Background(), queued) + switch name { + case "non-async task", "malformed envelope", "unknown version": + require.Error(t, err) + require.Zero(t, loads) + switch name { + case "non-async task": + require.True(t, moerr.IsMoErrCode(err, moerr.ErrInvalidInput)) + case "malformed envelope": + var syntaxError *json.SyntaxError + require.ErrorAs(t, err, &syntaxError) + case "unknown version": + require.True(t, moerr.IsMoErrCode(err, moerr.ErrNotSupported)) + } + case "retired definition": + require.ErrorContains(t, err, "metadata does not exist") + require.Zero(t, calls) + require.Empty(t, writes) + case "metadata failure": + require.ErrorIs(t, err, metadataError) + case "definer failure": + require.ErrorIs(t, err, definerError) + require.Len(t, writes, 3) + require.Contains(t, writes[0], "requested_sequence=1") + require.Contains(t, writes[1], "'FAILED'") + require.Contains(t, writes[1], "'refresh admission failed'") + require.NotContains(t, writes[1], definerError.Error(), "persist only sanitized failure diagnostics") + require.Contains(t, writes[2], "next_due=date_add") + case "already published failure": + require.ErrorIs(t, err, definerError) + default: + require.NoError(t, err) + } + if name != "definer failure" { + require.Empty(t, writes) + } + if name == "definer failure" || name == "already published failure" { + require.Equal(t, 1, fences) + } else { + require.Zero(t, fences) + } + if name == "definer success" || name == "definer failure" || name == "already published failure" { + require.Equal(t, 1, calls) + } else { + require.Zero(t, calls) + } + }) + } +} + +func (s *scheduledTasks) CreateBatch(_ context.Context, batch []task.TaskMetadata) error { + s.batches = append(s.batches, append([]task.TaskMetadata(nil), batch...)) + return nil +} +func TestMaterializedViewReconcileIdentity(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + sql := executor.NewMemExecutor(func(query string) (executor.Result, error) { + if strings.HasPrefix(query, "select account_id,mv_id,epoch,") { + require.Contains(t, query, "next_due<=current_timestamp()") + require.Contains(t, query, "not exists") + require.Contains(t, query, "limit 128") + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_int64.ToType()}, mp) + r.NewBatchWithRowCount(2) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7, 8})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{99, 99})) + require.NoError(t, executor.AppendFixedRows(r, 2, []uint64{2, 2})) + require.NoError(t, executor.AppendFixedRows(r, 3, []int64{123, 123})) + return r.GetResult(), nil + } + require.True(t, strings.HasPrefix(query, "select account_id,mv_id,run_id,") || strings.HasPrefix(query, "select account_id,mv_id from")) + return executor.Result{}, nil + }) + service := NewService(sql) + tasks := &scheduledTasks{} + require.NoError(t, service.reconcile(context.Background(), tasks)) + require.NoError(t, service.reconcile(context.Background(), tasks)) + require.Len(t, tasks.batches, 2) + require.Len(t, tasks.batches[0], 2) + require.Equal(t, tasks.batches[0], tasks.batches[1]) + require.NotEqual(t, tasks.batches[0][0].ID, tasks.batches[0][1].ID) +} + +func TestMaterializedViewInterruptedTaskRecovery(t *testing.T) { + for _, phase := range []string{"success", "scan failure", "reschedule failure", "abort failure", "cancelled page"} { + t.Run(phase, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + failure := errors.New("interrupted task recovery unavailable") + var writes []string + sql := executor.NewMemExecutor(func(query string) (executor.Result, error) { + if strings.HasPrefix(query, "select revision from mo_catalog.mo_mv_account_state ") { + require.Empty(t, writes) + require.Contains(t, query, "where account_id=7") + return executor.Result{}, nil + } + if strings.HasPrefix(query, "select account_id,mv_id,run_id,") { + require.Contains(t, query, "status='RUNNING'") + require.Contains(t, query, "interval 360 second") + require.Contains(t, query, "limit 128") + if phase == "scan failure" { + return executor.Result{}, failure + } + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType(), types.T_varchar.ToType(), types.T_uint64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{99})) + require.NoError(t, executor.AppendStringRows(r, 2, []string{"interrupted-run"})) + require.NoError(t, executor.AppendFixedRows(r, 3, []uint64{2})) + if phase == "cancelled page" { + cancel() + } + return r.GetResult(), nil + } + if strings.HasPrefix(query, "update ") { + writes = append(writes, query) + require.Contains(t, query, "account_id=7 and mv_id=99") + require.Contains(t, query, "run_id='interrupted-run'") + require.Contains(t, query, "status='RUNNING'") + if strings.Contains(query, "next_due=") { + require.Contains(t, query, "epoch=2") + require.Contains(t, query, "last_run<>'interrupted-run'") + if phase == "reschedule failure" { + return executor.Result{}, failure + } + } else { + require.Contains(t, query, "status='ABORTED'") + if phase == "abort failure" { + return executor.Result{}, failure + } + } + } + return executor.Result{}, nil + }) + tasks := &scheduledTasks{} + err := NewService(sql).reconcile(ctx, tasks) + switch phase { + case "success": + require.NoError(t, err) + require.Len(t, writes, 2) + case "cancelled page": + require.ErrorIs(t, err, context.Canceled) + require.Empty(t, writes) + default: + require.ErrorIs(t, err, failure) + } + require.Empty(t, tasks.batches, "recovery failure cannot enqueue a replacement refresh") + }) + } +} + +func TestMaterializedViewHistoryRetention(t *testing.T) { + for _, phase := range []string{"overlapping pages", "key scan failure", "count page failure", "age page failure", "delete failure", "fence failure", "cursor failure", "cancelled page"} { + t.Run(phase, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + failure := errors.New("history maintenance unavailable") + pages, deletes, advances := 0, 0, 0 + sql := executor.NewMemExecutor(func(query string) (executor.Result, error) { + switch { + case strings.HasPrefix(query, "select account_id,mv_id from"): + require.Contains(t, query, "limit 16") + if phase == "key scan failure" { + return executor.Result{}, failure + } + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{99})) + if phase == "cancelled page" { + cancel() + } + return r.GetResult(), nil + case strings.HasPrefix(query, "select run_id"): + pages++ + require.Contains(t, query, "account_id=7 and mv_id=99") + require.Contains(t, query, "status<>'RUNNING'") + require.Contains(t, query, "limit 128") + if pages == 1 { + require.Contains(t, query, "offset 100") + if phase == "count page failure" { + return executor.Result{}, failure + } + } else { + require.Contains(t, query, "interval 7 day") + if phase == "age page failure" { + return executor.Result{}, failure + } + } + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendStringRows(r, 0, []string{"old-terminal-run"})) + return r.GetResult(), nil + case strings.HasPrefix(query, "delete from"): + deletes++ + require.Contains(t, query, "account_id=7 and mv_id=99") + require.Contains(t, query, "run_id='old-terminal-run' and status<>'RUNNING'") + if phase == "delete failure" { + return executor.Result{}, failure + } + case strings.HasPrefix(query, "select revision from mo_catalog.mo_mv_account_state "): + require.Contains(t, query, "where account_id=7") + if phase == "fence failure" { + return executor.Result{}, failure + } + case strings.HasPrefix(query, "update "): + advances++ + require.Contains(t, query, "account_id=7 and mv_id=99") + require.Contains(t, query, "next_cleanup=date_add") + if phase == "cursor failure" { + return executor.Result{}, failure + } + default: + t.Fatalf("unexpected maintenance statement: %s", query) + } + return executor.Result{}, nil + }) + err := NewService(sql).cleanupHistory(ctx) + switch phase { + case "overlapping pages": + require.NoError(t, err) + require.Equal(t, 2, pages) + require.Equal(t, 1, deletes, "overlapping retention pages delete each terminal run once") + require.Equal(t, 1, advances) + case "cancelled page": + require.ErrorIs(t, err, context.Canceled) + require.Zero(t, pages) + default: + require.ErrorIs(t, err, failure) + } + if phase != "overlapping pages" && phase != "cursor failure" { + require.Zero(t, advances, "a failed maintenance page must not advance its cursor") + } + }) + } +} + +func TestMaterializedViewHistoryBacklogConverges(t *testing.T) { + for _, tc := range []struct { + name string + pages [2]int + batches bool + cancel bool + more bool + }{ + {"both short", [2]int{127, 127}, false, false, false}, + {"count full age short", [2]int{128, 1}, false, false, true}, + {"age full count short", [2]int{1, 128}, false, false, true}, + {"full overlapping pages", [2]int{128, 128}, false, false, true}, + {"full across batches", [2]int{128, 0}, true, false, true}, + {"cancel after history page", [2]int{128, 0}, false, true, true}, + } { + t.Run(tc.name, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + invocation, pages := 0, 0 + deleted := map[string]bool{} + var cursors []string + sql := executor.NewMemExecutor(func(q string) (executor.Result, error) { + if err := ctx.Err(); err != nil { + return executor.Result{}, err + } + switch { + case strings.HasPrefix(q, "select account_id,mv_id,run_id,epoch"): + return executor.Result{}, nil + case strings.HasPrefix(q, "select account_id,mv_id,epoch,"): + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_int64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{999})) + require.NoError(t, executor.AppendFixedRows(r, 2, []uint64{2})) + require.NoError(t, executor.AppendFixedRows(r, 3, []int64{1})) + return r.GetResult(), nil + case strings.HasPrefix(q, "select account_id,mv_id from"): + require.Contains(t, q, "order by next_cleanup,account_id,mv_id limit 16") + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{99})) + return r.GetResult(), nil + case strings.HasPrefix(q, "select run_id"): + require.Contains(t, q, "status<>'RUNNING'") + require.Contains(t, q, "limit 128") + page := 0 + if !strings.Contains(q, "offset 100") { + page = 1 + } + pages++ + n := tc.pages[page] + if invocation > 0 { + n = 0 + } // Independent drained-store response. + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + for start := 0; start < n; { + end := n + if tc.batches && end-start > 64 { + end = start + 64 + } + values := make([]string, end-start) + for i := range values { + values[i] = fmt.Sprintf("terminal-%03d", start+i) + } + r.NewBatchWithRowCount(len(values)) + require.NoError(t, executor.AppendStringRows(r, 0, values)) + start = end + } + if tc.cancel { + cancel() + } + return r.GetResult(), nil + case strings.HasPrefix(q, "delete from"): + require.Contains(t, q, "account_id=7 and mv_id=99") + require.Contains(t, q, "and status<>'RUNNING'") + require.False(t, deleted[q], "overlapping pages must delete each terminal ID once") + deleted[q] = true + case strings.HasPrefix(q, "select revision from mo_catalog.mo_mv_account_state "): + require.Contains(t, q, "where account_id=7") + case strings.HasPrefix(q, "update "): + cursors = append(cursors, q) + default: + t.Fatalf("unexpected maintenance SQL: %s", q) + } + return executor.Result{}, nil + }) + svc := NewService(sql) + tasks := &scheduledTasks{} + err := svc.reconcile(ctx, tasks) + require.Len(t, tasks.batches, 1, "maintenance backlog must not suppress task publication") + require.Len(t, tasks.batches[0], 1) + var spec TaskSpec + require.NoError(t, json.Unmarshal(tasks.batches[0][0].Context, &spec)) + require.Equal(t, Key{7, 999}, spec.Key) + require.Equal(t, uint64(2), spec.Epoch) + if tc.cancel { + require.ErrorIs(t, err, context.Canceled) + require.Empty(t, cursors) + return + } + require.NoError(t, err) + require.Equal(t, 2, pages) + require.Len(t, deleted, max(tc.pages[0], tc.pages[1])) + require.Len(t, cursors, 1) + if tc.more { + require.Contains(t, cursors[0], "next_cleanup=current_timestamp() ") + } else { + require.Contains(t, cursors[0], "next_cleanup=date_add(current_timestamp(),interval 1 hour)") + } + invocation++ + require.NoError(t, svc.reconcile(ctx, tasks)) + require.Len(t, tasks.batches, 2) + require.Len(t, cursors, 2) + require.Contains(t, cursors[1], "next_cleanup=date_add(current_timestamp(),interval 1 hour)") + }) + } +} diff --git a/pkg/pb/task/task.pb.go b/pkg/pb/task/task.pb.go index 9a1bab38ae2e8..d7fb0e0ddaea1 100644 --- a/pkg/pb/task/task.pb.go +++ b/pkg/pb/task/task.pb.go @@ -126,6 +126,8 @@ const ( TaskCode_InitCdcLosslessStart TaskCode = 15 // CDC source patterns with lossless identifier encoding. TaskCode_InitCdcSourcePatternV1 TaskCode = 16 + // Native materialized view reconciliation and fenced refresh tasks. + TaskCode_MaterializedView TaskCode = 17 ) var TaskCode_name = map[int32]string{ @@ -144,6 +146,7 @@ var TaskCode_name = map[int32]string{ 14: "InitCdcStableEpoch", 15: "InitCdcLosslessStart", 16: "InitCdcSourcePatternV1", + 17: "MaterializedView", } var TaskCode_value = map[string]int32{ @@ -162,6 +165,7 @@ var TaskCode_value = map[string]int32{ "InitCdcStableEpoch": 14, "InitCdcLosslessStart": 15, "InitCdcSourcePatternV1": 16, + "MaterializedView": 17, } func (x TaskCode) String() string { @@ -957,11 +961,11 @@ func (m *Account) GetName() string { } type CreateCdcDetails struct { - // cdc task uuid + //cdc task uuid TaskId string `protobuf:"bytes,1,opt,name=TaskId,proto3" json:"TaskId,omitempty"` - // cdc task name in CreateCdc + //cdc task name in CreateCdc TaskName string `protobuf:"bytes,2,opt,name=TaskName,proto3" json:"TaskName,omitempty"` - // cdc source account + //cdc source account Accounts []*Account `protobuf:"bytes,3,rep,name=Accounts,proto3" json:"Accounts,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1182,7 +1186,6 @@ type Details struct { Username string `protobuf:"bytes,4,opt,name=Username,proto3" json:"Username,omitempty"` Error string `protobuf:"bytes,5,opt,name=Error,proto3" json:"Error,omitempty"` // Types that are valid to be assigned to Details: - // // *Details_CreateCdc // *Details_ISCP // *Details_Publication @@ -1485,111 +1488,112 @@ func init() { func init() { proto.RegisterFile("task.proto", fileDescriptor_ce5d8dd45b4a91ff) } var fileDescriptor_ce5d8dd45b4a91ff = []byte{ - // 1664 bytes of a gzipped FileDescriptorProto + // 1678 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x93, 0xe3, 0x46, - 0x15, 0xb7, 0x6c, 0xd9, 0x96, 0x5b, 0xb6, 0xb7, 0xe9, 0xdd, 0xda, 0xa8, 0x4c, 0x98, 0x75, 0xa9, - 0x02, 0x19, 0xa6, 0x2a, 0x33, 0x64, 0x08, 0x14, 0x49, 0x51, 0x54, 0x66, 0xec, 0x21, 0xe3, 0xcd, - 0x4c, 0x76, 0xd2, 0x9e, 0xe1, 0xc0, 0xad, 0x2d, 0xbd, 0x78, 0xc5, 0xd8, 0x2d, 0x47, 0x6a, 0x85, - 0xf1, 0x57, 0xd8, 0x13, 0x37, 0x2e, 0x6c, 0x15, 0x9f, 0x80, 0xaf, 0xc0, 0x35, 0xc7, 0x9c, 0x38, - 0x51, 0x10, 0x16, 0x3e, 0x02, 0x57, 0xaa, 0xa8, 0xd7, 0x2d, 0xc9, 0xb2, 0xb7, 0xa0, 0xb2, 0xb0, - 0x37, 0xbd, 0xdf, 0xfb, 0xd3, 0xaf, 0xdf, 0xeb, 0xf7, 0xeb, 0x16, 0x21, 0x4a, 0xa4, 0xb7, 0x87, - 0xab, 0x24, 0x56, 0x31, 0xb3, 0xf1, 0x7b, 0xf0, 0xce, 0x3c, 0x52, 0x4f, 0xb3, 0xd9, 0x61, 0x10, - 0x2f, 0x8f, 0xe6, 0xf1, 0x3c, 0x3e, 0xd2, 0xca, 0x59, 0xf6, 0x99, 0x96, 0xb4, 0xa0, 0xbf, 0x8c, - 0xd3, 0xe0, 0xd1, 0x3c, 0x8e, 0xe7, 0x0b, 0xd8, 0x58, 0xa9, 0x68, 0x09, 0xa9, 0x12, 0xcb, 0x55, - 0x6e, 0xd0, 0x5f, 0x82, 0x12, 0xa1, 0x50, 0xc2, 0xc8, 0xfe, 0x6f, 0x2d, 0xd2, 0xbd, 0x16, 0xe9, - 0xed, 0x65, 0x0e, 0xb3, 0x3e, 0xa9, 0x4f, 0xc6, 0x9e, 0x35, 0xb4, 0xf6, 0x3b, 0xbc, 0x3e, 0x19, - 0xb3, 0x03, 0xe2, 0x9c, 0xdd, 0x41, 0x90, 0xa9, 0x38, 0xf1, 0xea, 0x43, 0x6b, 0xbf, 0x7f, 0xdc, - 0x3f, 0xd4, 0x59, 0xa2, 0xd7, 0x28, 0x0e, 0x81, 0x97, 0x7a, 0xe6, 0x91, 0xf6, 0x28, 0x96, 0x0a, - 0xee, 0x94, 0xd7, 0x18, 0x5a, 0xfb, 0x5d, 0x5e, 0x88, 0xec, 0x5d, 0xd2, 0x7e, 0xb2, 0x52, 0x51, - 0x2c, 0x53, 0xcf, 0x1e, 0x5a, 0xfb, 0xee, 0xf1, 0xb7, 0x36, 0x41, 0x72, 0xc5, 0xa9, 0xfd, 0xe5, - 0x5f, 0x1e, 0xd5, 0x78, 0x61, 0xe7, 0xff, 0xb9, 0x41, 0xfa, 0xd3, 0x4f, 0x2f, 0xcc, 0x32, 0x26, - 0xca, 0x43, 0xd2, 0x42, 0x71, 0x12, 0xea, 0xfc, 0x6c, 0x9e, 0x4b, 0x6c, 0x40, 0x1c, 0xfc, 0xfa, - 0x44, 0x2c, 0x41, 0xe7, 0xd8, 0xe1, 0xa5, 0xcc, 0xde, 0x24, 0x9d, 0x93, 0x20, 0x88, 0x33, 0xa9, - 0x26, 0xa1, 0xce, 0xaa, 0xc7, 0x37, 0x00, 0xf3, 0x49, 0x77, 0x2c, 0x94, 0x98, 0x89, 0x14, 0xb4, - 0xb7, 0xad, 0xbd, 0xb7, 0x30, 0xdc, 0xd5, 0xf4, 0xd3, 0x8b, 0xd3, 0x38, 0x5c, 0x7b, 0x4d, 0xad, - 0x2e, 0x44, 0xf6, 0x16, 0xe9, 0x7d, 0x24, 0x14, 0x8c, 0x62, 0x19, 0x46, 0x98, 0xb4, 0xd7, 0xd2, - 0xfa, 0x6d, 0x90, 0xed, 0x11, 0xc2, 0x41, 0x25, 0xeb, 0x8b, 0x68, 0x19, 0x29, 0xaf, 0xad, 0x53, - 0xa8, 0x20, 0xec, 0x7b, 0xa4, 0x7f, 0x1d, 0x2d, 0x21, 0xce, 0xd4, 0x14, 0x82, 0x58, 0x86, 0xa9, - 0xe7, 0x68, 0x9b, 0x1d, 0x54, 0x57, 0x37, 0x01, 0x81, 0x8d, 0xe8, 0x98, 0x3c, 0x72, 0x11, 0xf3, - 0xc8, 0x3f, 0x6f, 0x52, 0x48, 0x26, 0xa1, 0x47, 0x74, 0x80, 0x6d, 0xb0, 0x62, 0xc5, 0xe3, 0x05, - 0x4c, 0x42, 0xcf, 0xdd, 0xb2, 0x32, 0x20, 0x1b, 0x12, 0xf7, 0x3a, 0x89, 0xe6, 0x73, 0x48, 0xae, - 0xd7, 0x2b, 0xf0, 0xba, 0x7a, 0xa5, 0x2a, 0x84, 0x16, 0xd3, 0xe0, 0x29, 0x84, 0xd9, 0x02, 0xc2, - 0x13, 0xe5, 0xf5, 0x86, 0xd6, 0x7e, 0x83, 0x57, 0x21, 0xac, 0x6a, 0xee, 0x30, 0xc2, 0x3a, 0x7b, - 0x7d, 0xdd, 0xad, 0x2d, 0xcc, 0xff, 0x63, 0x9d, 0xb8, 0x95, 0xee, 0x63, 0x76, 0x97, 0xe2, 0x4e, - 0x97, 0x05, 0xf7, 0x9d, 0xea, 0x16, 0xf7, 0xf8, 0x36, 0x88, 0x56, 0x5a, 0x9a, 0x48, 0x05, 0xc9, - 0x17, 0x62, 0xa1, 0xdb, 0xdd, 0xe0, 0xdb, 0x20, 0x5a, 0x8d, 0x61, 0x21, 0xd6, 0xe3, 0x2c, 0x11, - 0xba, 0x2f, 0x0d, 0x63, 0xb5, 0x05, 0xe2, 0x3e, 0x46, 0xb1, 0x0c, 0xb2, 0x24, 0x01, 0x19, 0xac, - 0x75, 0xeb, 0x7b, 0xbc, 0x0a, 0xb1, 0x1f, 0x91, 0xd6, 0x85, 0x98, 0xc1, 0x22, 0xf5, 0x9a, 0xc3, - 0xc6, 0xbe, 0x7b, 0xfc, 0x9d, 0x97, 0x0e, 0xed, 0xa1, 0xd1, 0x9f, 0x49, 0x95, 0xac, 0x79, 0x6e, - 0x8c, 0x23, 0xc3, 0x21, 0x8d, 0xb3, 0x24, 0x00, 0x7d, 0x22, 0xdc, 0x62, 0x64, 0x0a, 0x94, 0x97, - 0xfa, 0xc1, 0xfb, 0xc4, 0xad, 0x84, 0x60, 0x94, 0x34, 0x6e, 0x61, 0x9d, 0x8f, 0x1f, 0x7e, 0xb2, - 0x07, 0xa4, 0xf9, 0x85, 0x58, 0x64, 0xc5, 0xc1, 0x36, 0xc2, 0x07, 0xf5, 0x9f, 0x58, 0xfe, 0x7b, - 0x9b, 0x65, 0xd0, 0x6f, 0x74, 0x75, 0x93, 0x8f, 0x05, 0x7e, 0xe2, 0xac, 0x5c, 0xc2, 0x32, 0x4e, - 0xd6, 0xda, 0xd1, 0xe6, 0xb9, 0xe4, 0x7f, 0x4c, 0x7a, 0x66, 0x5e, 0x81, 0x43, 0x9a, 0x2d, 0x14, - 0x7b, 0x8b, 0xd8, 0x38, 0xc6, 0xda, 0xb7, 0x7f, 0x4c, 0xcb, 0x4c, 0xb3, 0x85, 0xd2, 0xe3, 0xad, - 0xb5, 0x98, 0xc6, 0x59, 0x92, 0xe4, 0x1c, 0xd0, 0xe1, 0x46, 0xf0, 0xff, 0x59, 0x27, 0x9d, 0x93, - 0x74, 0x2d, 0x03, 0x2c, 0x49, 0x85, 0x3a, 0x6c, 0x4d, 0x1d, 0xef, 0x11, 0xa7, 0xa0, 0x15, 0xed, - 0xe6, 0x1e, 0xb3, 0x4d, 0x01, 0x0b, 0x4d, 0x3e, 0xf6, 0xa5, 0x25, 0x1e, 0x9e, 0x2b, 0x91, 0x80, - 0x54, 0x7a, 0xb8, 0xc7, 0xba, 0x77, 0x1d, 0xbe, 0x85, 0xb1, 0x7d, 0xd2, 0x9a, 0x2a, 0xa1, 0x32, - 0xc3, 0x26, 0x65, 0xd6, 0xa8, 0x35, 0x38, 0xcf, 0xf5, 0x38, 0x7c, 0x88, 0xf2, 0x4c, 0x4a, 0x48, - 0xf2, 0xf9, 0xad, 0x20, 0x7a, 0x5f, 0xab, 0x38, 0x78, 0xaa, 0x1b, 0xd5, 0xe3, 0x46, 0xc0, 0x03, - 0x74, 0x21, 0x52, 0x75, 0x0e, 0x22, 0x51, 0x33, 0x10, 0x66, 0x6a, 0x1b, 0x7c, 0x1b, 0x44, 0xda, - 0xd1, 0xb3, 0x03, 0x27, 0x4a, 0x8f, 0x6c, 0x83, 0x97, 0xb2, 0x39, 0x5c, 0xcb, 0xd5, 0x02, 0x94, - 0x1e, 0x92, 0x8e, 0x19, 0x92, 0x0a, 0xc4, 0xde, 0xdf, 0x69, 0x84, 0x1e, 0x5a, 0xf7, 0xf8, 0xbe, - 0xd9, 0xca, 0x96, 0x8a, 0x6f, 0x5b, 0xfa, 0xff, 0xb0, 0x70, 0xe5, 0x58, 0xbe, 0xc6, 0xaa, 0x0f, - 0x4c, 0xc4, 0xb3, 0xbb, 0x55, 0x92, 0x57, 0xbc, 0x94, 0x51, 0xf7, 0x09, 0xdc, 0x29, 0x9c, 0x40, - 0x5d, 0xef, 0x06, 0x2f, 0xe5, 0xca, 0xa8, 0x9b, 0xa9, 0x6d, 0x6e, 0x8d, 0xba, 0x19, 0xda, 0x6a, - 0x9d, 0x5a, 0x3b, 0x75, 0x1a, 0x10, 0xe7, 0x66, 0x15, 0x1a, 0x9d, 0x29, 0x72, 0x29, 0xfb, 0xef, - 0x90, 0x76, 0xce, 0xd4, 0x7a, 0x93, 0x61, 0xb9, 0xc9, 0x90, 0x31, 0x62, 0x57, 0xd8, 0x5e, 0x7f, - 0xfb, 0x9f, 0x13, 0x6a, 0xc2, 0x8e, 0xc2, 0x60, 0x0c, 0x4a, 0x44, 0x8b, 0x74, 0xe7, 0xc6, 0xe8, - 0x7c, 0xa3, 0x1b, 0xe3, 0xfb, 0xc4, 0xc9, 0x97, 0x4d, 0xbd, 0x86, 0x9e, 0xfb, 0x9e, 0x29, 0x60, - 0x8e, 0xf2, 0x52, 0xed, 0x33, 0x42, 0x39, 0x28, 0x90, 0xc8, 0x05, 0xf9, 0x92, 0xfe, 0x09, 0x71, - 0x27, 0xd3, 0xd1, 0xd5, 0xff, 0x91, 0x81, 0x7f, 0x4e, 0xd8, 0x55, 0x36, 0x5b, 0x44, 0x81, 0xa8, - 0x04, 0xfe, 0x9f, 0x22, 0xfd, 0xa9, 0x4e, 0xda, 0x85, 0xff, 0x90, 0xb8, 0x63, 0x48, 0x83, 0x24, - 0xd2, 0xd4, 0x95, 0x07, 0xa9, 0x42, 0xd5, 0xbb, 0x72, 0xac, 0x43, 0x55, 0xee, 0xca, 0x31, 0xde, - 0x3f, 0xb9, 0x90, 0x9f, 0x90, 0xb2, 0x3b, 0xd8, 0xc4, 0x14, 0x12, 0xb9, 0xb9, 0x41, 0x4b, 0x79, - 0x43, 0x1c, 0xcd, 0x0a, 0x71, 0xb0, 0x1f, 0x93, 0x4e, 0xd9, 0x2b, 0x7d, 0xc7, 0xb8, 0xc7, 0x0f, - 0x4d, 0x91, 0x77, 0x5b, 0x78, 0x5e, 0xe3, 0x1b, 0x53, 0xf6, 0x36, 0xb1, 0xb1, 0xb8, 0xfa, 0xd2, - 0x29, 0x1f, 0x11, 0x95, 0x72, 0x9f, 0xd7, 0xb8, 0x36, 0x60, 0x3f, 0x25, 0x6e, 0xa5, 0x84, 0xfa, - 0x06, 0x72, 0x8f, 0x3d, 0x63, 0xff, 0x72, 0x6d, 0xcf, 0x6b, 0xbc, 0x6a, 0x7e, 0xda, 0x29, 0xab, - 0xf6, 0xd8, 0x76, 0x08, 0x75, 0x1f, 0xdb, 0x8e, 0x4b, 0xbb, 0xbc, 0x33, 0x8a, 0xa5, 0x84, 0x40, - 0xc5, 0x89, 0xff, 0x2f, 0x9b, 0x90, 0xb1, 0x80, 0xe5, 0x6b, 0x1d, 0xc2, 0xad, 0xfa, 0x37, 0xfe, - 0x4b, 0xfd, 0xed, 0xed, 0xfa, 0x1f, 0x98, 0x13, 0xa0, 0x2f, 0xec, 0xe6, 0xee, 0x1b, 0x0d, 0x51, - 0x5e, 0xea, 0x77, 0x08, 0xb1, 0xf5, 0x12, 0x21, 0xfe, 0xc0, 0xe8, 0x73, 0x7a, 0x6d, 0xff, 0x07, - 0x7a, 0xad, 0xd8, 0xb0, 0xc7, 0xbb, 0x64, 0xe9, 0xe8, 0x0d, 0x0f, 0x0e, 0xcd, 0x5b, 0xf4, 0xb0, - 0x78, 0x8b, 0x1e, 0x5e, 0x17, 0x6f, 0xd1, 0x53, 0x07, 0x37, 0xfe, 0x9b, 0xbf, 0x3e, 0xb2, 0x76, - 0x29, 0xf5, 0xed, 0xb2, 0xf0, 0x9a, 0x32, 0xcb, 0xd1, 0xcb, 0x41, 0x5e, 0x1e, 0xe6, 0x0f, 0x2b, - 0x9c, 0x42, 0x5e, 0x61, 0xbd, 0x0d, 0xf3, 0x7c, 0x58, 0x61, 0x1e, 0xf7, 0x55, 0x22, 0x14, 0x5e, - 0xec, 0x03, 0xd2, 0x3c, 0x93, 0xc8, 0xee, 0xdd, 0x57, 0x70, 0x37, 0x2e, 0xec, 0x67, 0xa4, 0x8d, - 0x3b, 0xe7, 0x99, 0xcc, 0xcf, 0xf2, 0x37, 0xf3, 0x2e, 0x9c, 0x0e, 0xfe, 0x60, 0x55, 0xfb, 0xc4, - 0xdc, 0xfc, 0x6d, 0x08, 0x21, 0xad, 0xa1, 0x80, 0xcd, 0x8c, 0xe4, 0x9c, 0x5a, 0xac, 0x47, 0x3a, - 0xe5, 0xad, 0x43, 0xeb, 0x8c, 0x90, 0xd6, 0x95, 0xc8, 0x52, 0x08, 0x69, 0x83, 0x75, 0xf2, 0xd1, - 0xa4, 0x36, 0xeb, 0x12, 0x67, 0x24, 0x64, 0x00, 0x0b, 0x08, 0x69, 0x93, 0xdd, 0x27, 0xf7, 0xf0, - 0xa6, 0x59, 0x02, 0x87, 0xcf, 0x33, 0x48, 0xd1, 0xb3, 0xc5, 0x18, 0xe9, 0x6b, 0xcf, 0x0d, 0xd6, - 0x46, 0x43, 0xe3, 0xb6, 0x01, 0x1d, 0xf6, 0x00, 0x49, 0x31, 0x55, 0x22, 0x51, 0x1b, 0xb4, 0x73, - 0xf0, 0x75, 0xdd, 0x1c, 0x52, 0xfd, 0x9a, 0xe8, 0x12, 0xe7, 0x1a, 0x52, 0xf5, 0x44, 0x2e, 0xd6, - 0xb4, 0xc6, 0xfa, 0x84, 0x4c, 0xd7, 0xa9, 0x82, 0xe5, 0x44, 0x46, 0x8a, 0x5a, 0xb8, 0xd2, 0x25, - 0xa8, 0x24, 0x0a, 0x2e, 0xe2, 0xf9, 0x25, 0x24, 0x73, 0xa0, 0x75, 0xf6, 0x90, 0x30, 0x83, 0x4d, - 0x55, 0x9c, 0x88, 0x39, 0xdc, 0xa4, 0x62, 0x0e, 0xb4, 0xc1, 0xee, 0x11, 0x57, 0x9b, 0x3c, 0x99, - 0xfd, 0x0a, 0x02, 0x45, 0x9b, 0xb8, 0x79, 0x0c, 0x33, 0x0a, 0x03, 0xda, 0x66, 0x94, 0x74, 0x2f, - 0x9f, 0x5c, 0x8b, 0xd9, 0x02, 0xb0, 0x4e, 0x29, 0x75, 0x10, 0x41, 0x7e, 0x28, 0x7e, 0x59, 0x68, - 0x87, 0x7d, 0x9b, 0xbc, 0x31, 0x91, 0x21, 0xdc, 0x99, 0xb6, 0x62, 0x8a, 0xa5, 0x92, 0xb0, 0x37, - 0xc8, 0xfd, 0x0a, 0x2f, 0x94, 0x0a, 0x17, 0x97, 0xc9, 0x7f, 0x4e, 0x68, 0x17, 0xad, 0xf0, 0x8f, - 0xe1, 0x34, 0x11, 0x32, 0x78, 0x7a, 0x11, 0x49, 0x10, 0x73, 0xf8, 0x68, 0x44, 0x7b, 0x98, 0x75, - 0x9e, 0xcc, 0x54, 0x61, 0x16, 0xfa, 0x75, 0x41, 0xfb, 0xcc, 0x23, 0x0f, 0x72, 0xfc, 0x22, 0x4e, - 0xd3, 0x05, 0xa4, 0xe9, 0x14, 0xeb, 0x45, 0xef, 0xb1, 0x01, 0x79, 0x58, 0x78, 0xe8, 0x97, 0xdd, - 0x95, 0x50, 0x0a, 0x12, 0xf9, 0x8b, 0x77, 0x29, 0xf5, 0x6d, 0xc7, 0xa6, 0xb6, 0x6f, 0x3b, 0x2d, - 0xda, 0x3a, 0x60, 0x25, 0x15, 0x7d, 0x2c, 0x3e, 0xbb, 0x15, 0xd3, 0x48, 0xde, 0x1e, 0x7c, 0x17, - 0x7f, 0x34, 0x8a, 0x77, 0x9b, 0xce, 0x30, 0x0b, 0x02, 0x48, 0x53, 0x5a, 0xc3, 0xb6, 0xff, 0x5c, - 0x44, 0xd8, 0x5d, 0xeb, 0xe0, 0x77, 0xd6, 0x86, 0x2e, 0xd8, 0x9b, 0xa4, 0x7d, 0x23, 0x6f, 0x65, - 0xfc, 0x6b, 0x49, 0x6b, 0x83, 0x7b, 0xcf, 0x9e, 0x0f, 0x5d, 0x84, 0x73, 0x08, 0x09, 0xa9, 0xe4, - 0x5e, 0xda, 0x18, 0xf4, 0x9e, 0x3d, 0x1f, 0x56, 0xc8, 0x98, 0x19, 0x32, 0xa6, 0xf6, 0xc0, 0x79, - 0xf6, 0x7c, 0x68, 0x78, 0x77, 0xb8, 0xc5, 0xbb, 0xb4, 0x69, 0x62, 0x56, 0x20, 0xdf, 0x76, 0x2c, - 0x6a, 0xf9, 0xb6, 0x53, 0xa7, 0xf5, 0x03, 0x56, 0x26, 0x5f, 0x6e, 0xe7, 0x74, 0xf4, 0xd5, 0xdf, - 0xf6, 0xac, 0x2f, 0x5f, 0xec, 0x59, 0x5f, 0xbd, 0xd8, 0xb3, 0xbe, 0x7e, 0xb1, 0x57, 0xfb, 0xfd, - 0xdf, 0xf7, 0xac, 0x5f, 0x56, 0xff, 0x83, 0x97, 0x42, 0x25, 0xd1, 0x5d, 0x9c, 0x44, 0xf3, 0x48, - 0x16, 0x82, 0x84, 0xa3, 0xd5, 0xed, 0xfc, 0x68, 0x35, 0x3b, 0x42, 0xbe, 0x98, 0xb5, 0xf4, 0x14, - 0xfd, 0xf0, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x41, 0x27, 0x32, 0x8c, 0x51, 0x0f, 0x00, 0x00, + 0x15, 0xb7, 0x6c, 0xd9, 0x96, 0x5b, 0xb6, 0xb7, 0xd3, 0xbb, 0xb5, 0x51, 0x99, 0x30, 0xeb, 0x52, + 0x05, 0x32, 0x4c, 0x55, 0x66, 0xc8, 0x10, 0x28, 0x92, 0xa2, 0x28, 0x66, 0xec, 0x21, 0xe3, 0xcd, + 0x4c, 0x76, 0xd2, 0x9e, 0xc9, 0x81, 0x5b, 0x5b, 0x7a, 0xf1, 0x8a, 0xb1, 0x5b, 0x8e, 0xd4, 0x4a, + 0xc6, 0x7c, 0x84, 0x3d, 0x71, 0xe3, 0xc2, 0x56, 0xf1, 0x09, 0xf8, 0x0a, 0x5c, 0x73, 0xcc, 0x89, + 0x13, 0xc5, 0x9f, 0x85, 0x8f, 0x40, 0x71, 0xa3, 0x8a, 0x7a, 0xdd, 0x92, 0x2c, 0x7b, 0x0b, 0x8a, + 0x85, 0xdc, 0xf4, 0x7e, 0xef, 0xbd, 0xee, 0xd7, 0xef, 0xf5, 0xfb, 0xbd, 0x16, 0x21, 0x4a, 0xa4, + 0xb7, 0x87, 0xab, 0x24, 0x56, 0x31, 0xb3, 0xf1, 0x7b, 0xf0, 0xf6, 0x3c, 0x52, 0x4f, 0xb3, 0xd9, + 0x61, 0x10, 0x2f, 0x8f, 0xe6, 0xf1, 0x3c, 0x3e, 0xd2, 0xca, 0x59, 0xf6, 0xa9, 0x96, 0xb4, 0xa0, + 0xbf, 0x8c, 0xd3, 0xe0, 0xd1, 0x3c, 0x8e, 0xe7, 0x0b, 0xd8, 0x58, 0xa9, 0x68, 0x09, 0xa9, 0x12, + 0xcb, 0x55, 0x6e, 0xd0, 0x5f, 0x82, 0x12, 0xa1, 0x50, 0xc2, 0xc8, 0xfe, 0xaf, 0x2c, 0xd2, 0xbd, + 0x16, 0xe9, 0xed, 0x65, 0x0e, 0xb3, 0x3e, 0xa9, 0x4f, 0xc6, 0x9e, 0x35, 0xb4, 0xf6, 0x3b, 0xbc, + 0x3e, 0x19, 0xb3, 0x03, 0xe2, 0x9c, 0xdd, 0x41, 0x90, 0xa9, 0x38, 0xf1, 0xea, 0x43, 0x6b, 0xbf, + 0x7f, 0xdc, 0x3f, 0xd4, 0x51, 0xa2, 0xd7, 0x28, 0x0e, 0x81, 0x97, 0x7a, 0xe6, 0x91, 0xf6, 0x28, + 0x96, 0x0a, 0xee, 0x94, 0xd7, 0x18, 0x5a, 0xfb, 0x5d, 0x5e, 0x88, 0xec, 0x1d, 0xd2, 0x7e, 0xb2, + 0x52, 0x51, 0x2c, 0x53, 0xcf, 0x1e, 0x5a, 0xfb, 0xee, 0xf1, 0x6b, 0x9b, 0x45, 0x72, 0xc5, 0xa9, + 0xfd, 0xe5, 0x1f, 0x1f, 0xd5, 0x78, 0x61, 0xe7, 0xff, 0xa1, 0x41, 0xfa, 0xd3, 0x8f, 0x2f, 0xcc, + 0x36, 0x66, 0x95, 0x87, 0xa4, 0x85, 0xe2, 0x24, 0xd4, 0xf1, 0xd9, 0x3c, 0x97, 0xd8, 0x80, 0x38, + 0xf8, 0xf5, 0x91, 0x58, 0x82, 0x8e, 0xb1, 0xc3, 0x4b, 0x99, 0xbd, 0x41, 0x3a, 0x27, 0x41, 0x10, + 0x67, 0x52, 0x4d, 0x42, 0x1d, 0x55, 0x8f, 0x6f, 0x00, 0xe6, 0x93, 0xee, 0x58, 0x28, 0x31, 0x13, + 0x29, 0x68, 0x6f, 0x5b, 0x7b, 0x6f, 0x61, 0x78, 0xaa, 0xe9, 0xc7, 0x17, 0xa7, 0x71, 0xb8, 0xf6, + 0x9a, 0x5a, 0x5d, 0x88, 0xec, 0x4d, 0xd2, 0xfb, 0x40, 0x28, 0x18, 0xc5, 0x32, 0x8c, 0x30, 0x68, + 0xaf, 0xa5, 0xf5, 0xdb, 0x20, 0xdb, 0x23, 0x84, 0x83, 0x4a, 0xd6, 0x17, 0xd1, 0x32, 0x52, 0x5e, + 0x5b, 0x87, 0x50, 0x41, 0xd8, 0xb7, 0x49, 0xff, 0x3a, 0x5a, 0x42, 0x9c, 0xa9, 0x29, 0x04, 0xb1, + 0x0c, 0x53, 0xcf, 0xd1, 0x36, 0x3b, 0xa8, 0xce, 0x6e, 0x02, 0x02, 0x0b, 0xd1, 0x31, 0x71, 0xe4, + 0x22, 0xc6, 0x91, 0x7f, 0xde, 0xa4, 0x90, 0x4c, 0x42, 0x8f, 0xe8, 0x05, 0xb6, 0xc1, 0x8a, 0x15, + 0x8f, 0x17, 0x30, 0x09, 0x3d, 0x77, 0xcb, 0xca, 0x80, 0x6c, 0x48, 0xdc, 0xeb, 0x24, 0x9a, 0xcf, + 0x21, 0xb9, 0x5e, 0xaf, 0xc0, 0xeb, 0xea, 0x9d, 0xaa, 0x10, 0x5a, 0x4c, 0x83, 0xa7, 0x10, 0x66, + 0x0b, 0x08, 0x4f, 0x94, 0xd7, 0x1b, 0x5a, 0xfb, 0x0d, 0x5e, 0x85, 0x30, 0xab, 0xb9, 0xc3, 0x08, + 0xf3, 0xec, 0xf5, 0x75, 0xb5, 0xb6, 0x30, 0xff, 0x77, 0x75, 0xe2, 0x56, 0xaa, 0x8f, 0xd1, 0x5d, + 0x8a, 0x3b, 0x9d, 0x16, 0x3c, 0x77, 0xaa, 0x4b, 0xdc, 0xe3, 0xdb, 0x20, 0x5a, 0x69, 0x69, 0x22, + 0x15, 0x24, 0x9f, 0x8b, 0x85, 0x2e, 0x77, 0x83, 0x6f, 0x83, 0x68, 0x35, 0x86, 0x85, 0x58, 0x8f, + 0xb3, 0x44, 0xe8, 0xba, 0x34, 0x8c, 0xd5, 0x16, 0x88, 0xe7, 0x18, 0xc5, 0x32, 0xc8, 0x92, 0x04, + 0x64, 0xb0, 0xd6, 0xa5, 0xef, 0xf1, 0x2a, 0xc4, 0xbe, 0x4f, 0x5a, 0x17, 0x62, 0x06, 0x8b, 0xd4, + 0x6b, 0x0e, 0x1b, 0xfb, 0xee, 0xf1, 0x37, 0x5f, 0xba, 0xb4, 0x87, 0x46, 0x7f, 0x26, 0x55, 0xb2, + 0xe6, 0xb9, 0x31, 0xb6, 0x0c, 0x87, 0x34, 0xce, 0x92, 0x00, 0xf4, 0x8d, 0x70, 0x8b, 0x96, 0x29, + 0x50, 0x5e, 0xea, 0x07, 0xef, 0x11, 0xb7, 0xb2, 0x04, 0xa3, 0xa4, 0x71, 0x0b, 0xeb, 0xbc, 0xfd, + 0xf0, 0x93, 0x3d, 0x20, 0xcd, 0xcf, 0xc5, 0x22, 0x2b, 0x2e, 0xb6, 0x11, 0xde, 0xaf, 0xff, 0xd0, + 0xf2, 0xdf, 0xdd, 0x6c, 0x83, 0x7e, 0xa3, 0xab, 0x9b, 0xbc, 0x2d, 0xf0, 0x13, 0x7b, 0xe5, 0x12, + 0x96, 0x71, 0xb2, 0xd6, 0x8e, 0x36, 0xcf, 0x25, 0xff, 0x43, 0xd2, 0x33, 0xfd, 0x0a, 0x1c, 0xd2, + 0x6c, 0xa1, 0xd8, 0x9b, 0xc4, 0xc6, 0x36, 0xd6, 0xbe, 0xfd, 0x63, 0x5a, 0x46, 0x9a, 0x2d, 0x14, + 0xe2, 0x5c, 0x6b, 0x31, 0x8c, 0xb3, 0x24, 0xc9, 0x39, 0xa0, 0xc3, 0x8d, 0xe0, 0xff, 0xbd, 0x4e, + 0x3a, 0x27, 0xe9, 0x5a, 0x06, 0x98, 0x92, 0x0a, 0x75, 0xd8, 0x9a, 0x3a, 0xde, 0x25, 0x4e, 0x41, + 0x2b, 0xda, 0xcd, 0x3d, 0x66, 0x9b, 0x04, 0x16, 0x9a, 0xbc, 0xed, 0x4b, 0x4b, 0xbc, 0x3c, 0x57, + 0x22, 0x01, 0xa9, 0x74, 0x73, 0x8f, 0x75, 0xed, 0x3a, 0x7c, 0x0b, 0x63, 0xfb, 0xa4, 0x35, 0x55, + 0x42, 0x65, 0x86, 0x4d, 0xca, 0xa8, 0x51, 0x6b, 0x70, 0x9e, 0xeb, 0xb1, 0xf9, 0x10, 0xe5, 0x99, + 0x94, 0x90, 0xe4, 0xfd, 0x5b, 0x41, 0xf4, 0xb9, 0x56, 0x71, 0xf0, 0x54, 0x17, 0xaa, 0xc7, 0x8d, + 0x80, 0x17, 0xe8, 0x42, 0xa4, 0xea, 0x1c, 0x44, 0xa2, 0x66, 0x20, 0x4c, 0xd7, 0x36, 0xf8, 0x36, + 0x88, 0xb4, 0xa3, 0x7b, 0x07, 0x4e, 0x94, 0x6e, 0xd9, 0x06, 0x2f, 0x65, 0x73, 0xb9, 0x96, 0xab, + 0x05, 0x28, 0xdd, 0x24, 0x1d, 0xd3, 0x24, 0x15, 0x88, 0xbd, 0xb7, 0x53, 0x08, 0xdd, 0xb4, 0xee, + 0xf1, 0x7d, 0x73, 0x94, 0x2d, 0x15, 0xdf, 0xb6, 0xf4, 0xff, 0x66, 0xe1, 0xce, 0xb1, 0xfc, 0x1a, + 0xb3, 0x3e, 0x30, 0x2b, 0x9e, 0xdd, 0xad, 0x92, 0x3c, 0xe3, 0xa5, 0x8c, 0xba, 0x8f, 0xe0, 0x4e, + 0x61, 0x07, 0xea, 0x7c, 0x37, 0x78, 0x29, 0x57, 0x5a, 0xdd, 0x74, 0x6d, 0x73, 0xab, 0xd5, 0x35, + 0xb6, 0x95, 0xa7, 0xd6, 0x4e, 0x9e, 0x06, 0xc4, 0xb9, 0x59, 0x85, 0x46, 0x67, 0x92, 0x5c, 0xca, + 0xfe, 0xdb, 0xa4, 0x9d, 0x33, 0xb5, 0x3e, 0x64, 0x58, 0x1e, 0x32, 0x64, 0x8c, 0xd8, 0x15, 0xb6, + 0xd7, 0xdf, 0xfe, 0x67, 0x84, 0x9a, 0x65, 0x47, 0x61, 0x30, 0x06, 0x25, 0xa2, 0x45, 0xba, 0x33, + 0x31, 0x3a, 0xff, 0xd5, 0xc4, 0xf8, 0x0e, 0x71, 0xf2, 0x6d, 0x53, 0xaf, 0xa1, 0xfb, 0xbe, 0x67, + 0x12, 0x98, 0xa3, 0xbc, 0x54, 0xfb, 0x8c, 0x50, 0x0e, 0x0a, 0x24, 0x72, 0x41, 0xbe, 0xa5, 0x7f, + 0x42, 0xdc, 0xc9, 0x74, 0x74, 0xf5, 0x7f, 0x44, 0xe0, 0x9f, 0x13, 0x76, 0x95, 0xcd, 0x16, 0x51, + 0x20, 0x2a, 0x0b, 0xff, 0x4f, 0x2b, 0xfd, 0xbe, 0x4e, 0xda, 0x85, 0xff, 0x90, 0xb8, 0x63, 0x48, + 0x83, 0x24, 0xd2, 0xd4, 0x95, 0x2f, 0x52, 0x85, 0xaa, 0xb3, 0x72, 0xec, 0xd5, 0xb7, 0x67, 0xe5, + 0x18, 0xe7, 0x4f, 0x2e, 0xe4, 0x37, 0xa4, 0x10, 0x75, 0x11, 0x53, 0x48, 0xe4, 0x66, 0x82, 0x96, + 0xf2, 0x86, 0x38, 0x9a, 0x15, 0xe2, 0x60, 0x3f, 0x20, 0x9d, 0xb2, 0x56, 0x7a, 0xc6, 0xb8, 0xc7, + 0x0f, 0x4d, 0x92, 0x77, 0x4b, 0x78, 0x5e, 0xe3, 0x1b, 0x53, 0xf6, 0x16, 0xb1, 0x31, 0xb9, 0x5e, + 0xaf, 0xfa, 0x88, 0xa8, 0xa4, 0xfb, 0xbc, 0xc6, 0xb5, 0x01, 0xfb, 0x11, 0x71, 0x2b, 0x29, 0xd4, + 0x13, 0xc8, 0x3d, 0xf6, 0x8c, 0xfd, 0xcb, 0xb9, 0x3d, 0xaf, 0xf1, 0xaa, 0xf9, 0x69, 0xa7, 0xcc, + 0xda, 0x63, 0xdb, 0x21, 0xd4, 0x7d, 0x6c, 0x3b, 0x2e, 0xed, 0xf2, 0xce, 0x28, 0x96, 0x12, 0x02, + 0x15, 0x27, 0xfe, 0x3f, 0x6d, 0x42, 0xc6, 0x02, 0x96, 0x5f, 0x6b, 0x13, 0x6e, 0xe5, 0xbf, 0xf1, + 0x1f, 0xf2, 0x6f, 0x6f, 0xe7, 0xff, 0xc0, 0xdc, 0x00, 0x3d, 0xb0, 0x9b, 0xbb, 0x6f, 0x34, 0x44, + 0x79, 0xa9, 0xdf, 0x21, 0xc4, 0xd6, 0x4b, 0x84, 0xf8, 0x5d, 0xa3, 0xcf, 0xe9, 0xb5, 0xfd, 0x6f, + 0xe8, 0xb5, 0x62, 0xc3, 0x1e, 0xef, 0x92, 0xa5, 0xa3, 0x0f, 0x3c, 0x38, 0x34, 0x6f, 0xd1, 0xc3, + 0xe2, 0x2d, 0x7a, 0x78, 0x5d, 0xbc, 0x45, 0x4f, 0x1d, 0x3c, 0xf8, 0x2f, 0xff, 0xf4, 0xc8, 0xda, + 0xa5, 0xd4, 0xb7, 0xca, 0xc4, 0x6b, 0xca, 0x2c, 0x5b, 0x2f, 0x07, 0x79, 0xa1, 0x65, 0x3f, 0xa9, + 0x70, 0x0a, 0x79, 0x85, 0xfd, 0x4a, 0x2f, 0x5c, 0xa1, 0x64, 0x1e, 0xf7, 0x55, 0x56, 0x28, 0xbc, + 0xd8, 0xfb, 0xa4, 0x79, 0x26, 0x91, 0xdd, 0xbb, 0xaf, 0xe0, 0x6e, 0x5c, 0xd8, 0x8f, 0x49, 0x1b, + 0x4f, 0xce, 0x33, 0xe9, 0xf5, 0x5e, 0xc1, 0xbb, 0x70, 0x3a, 0xf8, 0xad, 0x55, 0xad, 0x13, 0x73, + 0xf3, 0xb7, 0x21, 0x84, 0xb4, 0x86, 0x02, 0x16, 0x33, 0x92, 0x73, 0x6a, 0xb1, 0x1e, 0xe9, 0x94, + 0x53, 0x87, 0xd6, 0x19, 0x21, 0xad, 0x2b, 0x91, 0xa5, 0x10, 0xd2, 0x06, 0xeb, 0xe4, 0xad, 0x49, + 0x6d, 0xd6, 0x25, 0xce, 0x48, 0xc8, 0x00, 0x16, 0x10, 0xd2, 0x26, 0xbb, 0x4f, 0xee, 0xe1, 0xa4, + 0x59, 0x02, 0x87, 0xcf, 0x32, 0x48, 0xd1, 0xb3, 0xc5, 0x18, 0xe9, 0x6b, 0xcf, 0x0d, 0xd6, 0x46, + 0x43, 0xe3, 0xb6, 0x01, 0x1d, 0xf6, 0x00, 0x49, 0x31, 0x55, 0x22, 0x51, 0x1b, 0xb4, 0x73, 0xf0, + 0x8f, 0xba, 0xb9, 0xa4, 0xfa, 0x35, 0xd1, 0x25, 0xce, 0x35, 0xa4, 0xea, 0x89, 0x5c, 0xac, 0x69, + 0x8d, 0xf5, 0x09, 0x99, 0xae, 0x53, 0x05, 0xcb, 0x89, 0x8c, 0x14, 0xb5, 0x70, 0xa7, 0x4b, 0x50, + 0x49, 0x14, 0x5c, 0xc4, 0xf3, 0x4b, 0x48, 0xe6, 0x40, 0xeb, 0xec, 0x21, 0x61, 0x06, 0x9b, 0xaa, + 0x38, 0x11, 0x73, 0xb8, 0x49, 0xc5, 0x1c, 0x68, 0x83, 0xdd, 0x23, 0xae, 0x36, 0x79, 0x32, 0xfb, + 0x39, 0x04, 0x8a, 0x36, 0xf1, 0xf0, 0xb8, 0xcc, 0x28, 0x0c, 0x68, 0x9b, 0x51, 0xd2, 0xbd, 0x7c, + 0x72, 0x2d, 0x66, 0x0b, 0xc0, 0x3c, 0xa5, 0xd4, 0x41, 0x04, 0xf9, 0xa1, 0xf8, 0x65, 0xa1, 0x1d, + 0xf6, 0x0d, 0xf2, 0xfa, 0x44, 0x86, 0x70, 0x67, 0xca, 0x8a, 0x21, 0x96, 0x4a, 0xc2, 0x5e, 0x27, + 0xf7, 0x2b, 0xbc, 0x50, 0x2a, 0x5c, 0xdc, 0x26, 0xff, 0x39, 0xa1, 0x5d, 0xb4, 0xc2, 0x3f, 0x86, + 0xd3, 0x44, 0xc8, 0xe0, 0xe9, 0x45, 0x24, 0x41, 0xcc, 0xe1, 0x83, 0x11, 0xed, 0x61, 0xd4, 0x79, + 0x30, 0x53, 0x85, 0x51, 0xe8, 0xd7, 0x05, 0xed, 0x33, 0x8f, 0x3c, 0xc8, 0xf1, 0x8b, 0x38, 0x4d, + 0x17, 0x90, 0xa6, 0x53, 0xcc, 0x17, 0xbd, 0xc7, 0x06, 0xe4, 0x61, 0xe1, 0xa1, 0x5f, 0x76, 0x57, + 0x42, 0x29, 0x48, 0xe4, 0x27, 0xef, 0x50, 0x8a, 0x89, 0xbd, 0x14, 0x0a, 0x92, 0x48, 0x2c, 0xa2, + 0x5f, 0x40, 0xf8, 0x49, 0x04, 0x5f, 0xd0, 0xd7, 0x7c, 0xdb, 0xb1, 0xa9, 0xed, 0xdb, 0x4e, 0x8b, + 0xb6, 0x0e, 0x58, 0x49, 0x50, 0x1f, 0x8a, 0x4f, 0x6f, 0xc5, 0x34, 0x92, 0xb7, 0x07, 0xdf, 0x22, + 0xc4, 0x3c, 0x1b, 0x74, 0xe6, 0x31, 0xee, 0x2c, 0x08, 0x20, 0x4d, 0x69, 0x0d, 0x2f, 0xc3, 0x4f, + 0x45, 0x84, 0x35, 0xb7, 0x0e, 0x7e, 0x6d, 0x6d, 0x48, 0x84, 0xbd, 0x41, 0xda, 0x37, 0xf2, 0x56, + 0xc6, 0x5f, 0x48, 0x5a, 0x1b, 0xdc, 0x7b, 0xf6, 0x7c, 0xe8, 0x22, 0x9c, 0x43, 0x48, 0x53, 0x25, + 0x23, 0xd3, 0xc6, 0xa0, 0xf7, 0xec, 0xf9, 0x70, 0x03, 0xe0, 0x68, 0xc6, 0x0c, 0x53, 0x7b, 0xe0, + 0x3c, 0x7b, 0x3e, 0xd4, 0xdf, 0x38, 0x7a, 0x2a, 0x69, 0xa4, 0x4d, 0xb3, 0x66, 0x05, 0xf2, 0x6d, + 0xc7, 0xa2, 0x96, 0x6f, 0x3b, 0x75, 0x5a, 0x3f, 0x60, 0x65, 0xf0, 0xe5, 0x71, 0x4e, 0x47, 0x5f, + 0xfd, 0x65, 0xcf, 0xfa, 0xf2, 0xc5, 0x9e, 0xf5, 0xd5, 0x8b, 0x3d, 0xeb, 0xcf, 0x2f, 0xf6, 0x6a, + 0xbf, 0xf9, 0xeb, 0x9e, 0xf5, 0xb3, 0xea, 0xdf, 0xf1, 0x52, 0xa8, 0x24, 0xba, 0x8b, 0x93, 0x68, + 0x1e, 0xc9, 0x42, 0x90, 0x70, 0xb4, 0xba, 0x9d, 0x1f, 0xad, 0x66, 0x47, 0xc8, 0x22, 0xb3, 0x96, + 0xee, 0xad, 0xef, 0xfd, 0x6b, 0x00, 0x74, 0x6f, 0x1c, 0xb9, 0x67, 0x0f, 0x00, 0x00, } func (m *TaskMetadata) Marshal() (dAtA []byte, err error) { diff --git a/pkg/sql/colexec/insert/insert.go b/pkg/sql/colexec/insert/insert.go index 6a008751f38ea..137e378f5f513 100644 --- a/pkg/sql/colexec/insert/insert.go +++ b/pkg/sql/colexec/insert/insert.go @@ -357,6 +357,11 @@ func (insert *Insert) insert_s3(proc *process.Process, analyzer process.Analyzer atomic.AddUint64(&insert.ctr.affectedRows, affectedRows) } + if insert.InsertCtx.TableDef != nil { + if err := defines.ChargeMaterializedViewOutput(proc.Ctx, insert.InsertCtx.TableDef.TblId, input.Batch.Size()); err != nil { + return vm.CancelResult, err + } + } // write to s3. input.Batch.Attrs = append(input.Batch.Attrs[:0], insert.InsertCtx.Attrs...) if err = insert.acquireS3WriteMemory(proc, analyzer, input.Batch.Size()); err != nil { @@ -555,6 +560,11 @@ func (insert *Insert) insert_table(proc *process.Process, analyzer process.Analy } input := insert.input + if insert.InsertCtx.TableDef != nil { + if err := defines.ChargeMaterializedViewOutput(proc.Ctx, insert.InsertCtx.TableDef.TblId, input.Batch.Size()); err != nil { + return vm.CancelResult, err + } + } affectedRows := uint64(input.Batch.RowCount()) insert.ctr.buf.CleanOnlyData() for i := range insert.ctr.buf.Attrs { diff --git a/pkg/sql/colexec/insert/materialized_view_test.go b/pkg/sql/colexec/insert/materialized_view_test.go new file mode 100644 index 0000000000000..033333d762998 --- /dev/null +++ b/pkg/sql/colexec/insert/materialized_view_test.go @@ -0,0 +1,43 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package insert + +import ( + "testing" + + "github.com/matrixorigin/matrixone/pkg/container/batch" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/matrixorigin/matrixone/pkg/vm" + "github.com/matrixorigin/matrixone/pkg/vm/process" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewWriterBudget(t *testing.T) { + proc := testutil.NewProcess(t) + proc.Ctx = defines.WithMaterializedViewBudget(proc.Ctx, 99, 1) + bat := batch.NewWithSize(1) + bat.Vecs[0] = vector.NewVec(types.T_int64.ToType()) + require.NoError(t, vector.AppendFixed(bat.Vecs[0], int64(10), false, proc.Mp())) + bat.SetRowCount(1) + t.Cleanup(func() { bat.Clean(proc.Mp()) }) + op := &Insert{delegated: true, input: vm.CallResult{Batch: bat}, InsertCtx: &InsertCtx{TableDef: &plan.TableDef{TblId: 99}}} + // An uninitialized writer would panic if execution reached native Write. + _, err := op.insert_table(proc, process.NewTempAnalyzer()) + require.ErrorContains(t, err, "output budget exceeded") +} diff --git a/pkg/sql/colexec/multi_update/materialized_view_test.go b/pkg/sql/colexec/multi_update/materialized_view_test.go new file mode 100644 index 0000000000000..b3bc809f63c5a --- /dev/null +++ b/pkg/sql/colexec/multi_update/materialized_view_test.go @@ -0,0 +1,42 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package multi_update + +import ( + "testing" + + "github.com/matrixorigin/matrixone/pkg/container/batch" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/matrixorigin/matrixone/pkg/vm" + "github.com/matrixorigin/matrixone/pkg/vm/process" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewWriterBudget(t *testing.T) { + proc := testutil.NewProcess(t) + proc.Ctx = defines.WithMaterializedViewBudget(proc.Ctx, 99, 1) + bat := batch.NewWithSize(1) + bat.Vecs[0] = vector.NewVec(types.T_int64.ToType()) + require.NoError(t, vector.AppendFixed(bat.Vecs[0], int64(10), false, proc.Mp())) + bat.SetRowCount(1) + t.Cleanup(func() { bat.Clean(proc.Mp()) }) + op := &MultiUpdate{delegated: true, input: vm.CallResult{Batch: bat}, mainTable: 99} + op.ctr.action = actionInsert + _, err := op.update(proc, process.NewTempAnalyzer()) + require.ErrorContains(t, err, "output budget exceeded") +} diff --git a/pkg/sql/colexec/multi_update/multi_update.go b/pkg/sql/colexec/multi_update/multi_update.go index 03bf89c6cf2e2..99ee14e7600de 100644 --- a/pkg/sql/colexec/multi_update/multi_update.go +++ b/pkg/sql/colexec/multi_update/multi_update.go @@ -219,6 +219,11 @@ func (update *MultiUpdate) update_s3(proc *process.Process, analyzer process.Ana return result, nil } + if update.ctr.action == actionInsert { + if err := defines.ChargeMaterializedViewOutput(proc.Ctx, update.mainTable, input.Batch.Size()); err != nil { + return vm.CancelResult, err + } + } w, err := update.getS3WriterFunc(proc.GetService(), update.mainTable) if err != nil { return vm.CancelResult, err @@ -281,6 +286,11 @@ func (update *MultiUpdate) update(proc *process.Process, analyzer process.Analyz } input := update.input + if update.ctr.action == actionInsert { + if err := defines.ChargeMaterializedViewOutput(proc.Ctx, update.mainTable, input.Batch.Size()); err != nil { + return vm.CancelResult, err + } + } err := update.updateOneBatch(proc, analyzer, input.Batch) if err != nil { return vm.CancelResult, err diff --git a/pkg/sql/compile/alter.go b/pkg/sql/compile/alter.go index 41c6a909908c4..f95c6676c77e8 100644 --- a/pkg/sql/compile/alter.go +++ b/pkg/sql/compile/alter.go @@ -1396,6 +1396,11 @@ func (s *Scope) alterTableCopy(c *Compile, cleanup *alterAutoIncrementResetClean } } + if !isTemp { + if err := c.guardMaterializedViewDDL(dbName, tblName, false); err != nil { + return err + } + } if err = validateAlterDataBranchLineageColumnReplacement(qry, lineagePlan); err != nil { return err } @@ -1652,6 +1657,12 @@ func (s *Scope) alterTableCopy(c *Compile, cleanup *alterAutoIncrementResetClean if originRel.GetTableDef(c.proc.Ctx).GetVersion() != sourceDefVersion { return c.alterCopyPostPublicationConflict("source definition changed") } + // Preparation runs before source-name admission. A materialized view + // can be created during that window without changing the source's + // schema or data timestamp. Recheck after locks and RC advancement. + if err = c.guardMaterializedViewDDL(dbName, tblName, false); err != nil { + return err + } sourceChanged, sourceChangedErr := c.alterCopySourceChangedSinceCopy( originRel, lineagePlan.cloneTS, ) diff --git a/pkg/sql/compile/compile.go b/pkg/sql/compile/compile.go index afa0f521231bc..a7e72bb12d8a2 100644 --- a/pkg/sql/compile/compile.go +++ b/pkg/sql/compile/compile.go @@ -1404,6 +1404,9 @@ func (c *Compile) compileQuery(qry *plan.Query) ([]*Scope, error) { c.execType = vectorQueryExecType(sequenceExecType( plan2.GetExecType(c.pn.GetQuery(), c.getHaveDDL(), c.isPrepare), qry), qry) + if defines.MaterializedViewWriteActive(c.proc.Ctx) { + c.execType = plan2.ExecTypeAP_ONECN + } c.cnList, err = c.scheduleQueryWorkers() if err != nil { return nil, err @@ -2415,7 +2418,7 @@ func (c *Compile) canUseLiteralLimitZeroFastPath(node *plan.Node) bool { return false } cval, ok := cExpr.Lit.Value.(*plan.Literal_U64Val) - return ok && cval.U64Val == 0 + return ok && cval.U64Val == 0 && !c.containsMaterializedViewScan(node) } func (c *Compile) ownsFoundRows(node *plan.Node) bool { @@ -5437,6 +5440,9 @@ func (c *Compile) compileValueScan(node *plan.Node) ([]*Scope, error) { } func (c *Compile) compileTableScan(node *plan.Node) ([]*Scope, error) { + if err := c.validateMaterializedViewScan(node.TableDef); err != nil { + return nil, err + } stats := statistic.StatsInfoFromContext(c.proc.GetTopContext()) compileStart := time.Now() defer func() { @@ -11467,7 +11473,7 @@ func (c *Compile) validateDMLTarget(node *plan.Node) error { if blocked { return moerr.NewCCPRReadOnly(c.proc.Ctx) } - return nil + return c.validateMaterializedViewDML(node) } // shouldBlockCCPRReadOnly checks if the CCPR read-only check should block the operation. diff --git a/pkg/sql/compile/ddl.go b/pkg/sql/compile/ddl.go index 65449f695e9cf..853539d8b5c3b 100644 --- a/pkg/sql/compile/ddl.go +++ b/pkg/sql/compile/ddl.go @@ -269,6 +269,9 @@ func (s *Scope) DropDatabase(c *Compile) error { return moerr.NewErrDropNonExistsDB(c.proc.Ctx, dbName) } } + if err := c.guardMaterializedViewDatabaseDDL(dbName); err != nil { + return err + } // RC admission already installed a TN-ordered applied snapshot after D; // publication writers hold that same D key through their catalog write. if err := ensureDatabaseNotPublished(c, db, dbName); err != nil { @@ -1125,6 +1128,11 @@ func (s *Scope) alterTableInplace(c *Compile, cleanup *alterAutoIncrementResetCl } } + if !isTemp { + if err := c.guardMaterializedViewDDL(dbName, tblName, false); err != nil { + return err + } + } initialForeignKeyParents := foreignKeyParentIDs(oTableDef.Fkeys) var hasUpdateConstraints bool @@ -1912,6 +1920,9 @@ func (s *Scope) createTable(c *Compile, tableCreated func()) error { tblName := qry.GetTableDef().GetName() + if err := c.pinMaterializedViewSourceNames(qry, dbName); err != nil { + return err + } if err := c.admitCreateNames(qry, dbName); err != nil { return err } @@ -2450,6 +2461,9 @@ func (s *Scope) createTable(c *Compile, tableCreated func()) error { } } + if err := c.registerMaterializedView(dbSource, dbName, tblName, qry.TableDef); err != nil { + return err + } if err := c.populateCreatedTable(qry, isTemp, dbName, aliasName, tblName); err != nil { return err } @@ -3178,6 +3192,9 @@ func (s *Scope) CreateIndex(c *Compile) error { } } + if err := c.guardMaterializedViewDDL(qry.Database, qry.Table, false); err != nil { + return err + } ps := c.proc.GetPartitionService() if !ps.Enabled() || !features.IsPartitioned(r.GetExtraInfo().FeatureFlag) { @@ -3557,6 +3574,9 @@ func (s *Scope) DropIndex(c *Compile) error { } } + if err := c.guardMaterializedViewDDL(qry.Database, qry.Table, false); err != nil { + return err + } // old tabledef oldTableDef := r.CopyTableDef(c.proc.Ctx) if err := plan2.CheckDropReferencedKeyForeignKeyDependency(c.proc.Ctx, oldTableDef, qry.IndexName, nil, @@ -4122,6 +4142,9 @@ func (s *Scope) TruncateTable(c *Compile) error { } } + if err := c.guardMaterializedViewDDL(db, table, false); err != nil { + return err + } // TRUNCATE is a copy-and-swap rebuild: it creates a replacement relation // before the ordinary DROP path retires the old physical generation. Reuse // ALTER's lineage publication protocol so the replacement remains the live @@ -4811,6 +4834,11 @@ func (s *Scope) dropTableSingleResolved( } } + if !isTemp { + if err := c.guardMaterializedViewDDL(dbName, tblName, false); err != nil { + return err + } + } // if dbSource is a pub, update tableList if !c.ignorePublish { if err = updatePubTableList(c.proc.Ctx, c, dbName, tblName); err != nil { diff --git a/pkg/sql/compile/dependent.go b/pkg/sql/compile/dependent.go index 4e7030a8d1de9..b22e3c7649fde 100644 --- a/pkg/sql/compile/dependent.go +++ b/pkg/sql/compile/dependent.go @@ -100,6 +100,9 @@ func (c *Compile) compileDependentSource(node *plan.Node) (dependent.SourceFacto return op, nil }), nil } + if err := c.validateMaterializedViewScan(node.TableDef); err != nil { + return nil, err + } if node.ObjRef != nil { c.appendMetaTables(node.ObjRef) } diff --git a/pkg/sql/compile/lifecycle_fk_scope.go b/pkg/sql/compile/lifecycle_fk_scope.go index 55909dfcc0e63..5f1abb5bf56df 100644 --- a/pkg/sql/compile/lifecycle_fk_scope.go +++ b/pkg/sql/compile/lifecycle_fk_scope.go @@ -508,6 +508,13 @@ func createNameDomain(q *plan.CreateTable, database string) map[plan2.FkReferKey database = q.Database } domain[plan2.FkReferKey{Db: database, Tbl: q.GetTableDef().GetName()}] = struct{}{} + // MV publication and source DDL own the same name frontier. Include every + // source before any target/source lock or snapshot advancement occurs. + if definition, err := catalog.MaterializedViewDefinition(q.GetTableDef()); err == nil && definition != nil { + for _, source := range definition.Sources { + domain[plan2.FkReferKey{Db: source.Database, Tbl: source.Table}] = struct{}{} + } + } for i, name := range q.FkTables { if i < len(q.FkDbs) { domain[plan2.FkReferKey{Db: q.FkDbs[i], Tbl: name}] = struct{}{} diff --git a/pkg/sql/compile/materialized_view.go b/pkg/sql/compile/materialized_view.go new file mode 100644 index 0000000000000..ba623c6d95467 --- /dev/null +++ b/pkg/sql/compile/materialized_view.go @@ -0,0 +1,303 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package compile + +import ( + "fmt" + "sort" + "strconv" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/common/sqlquote" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/mv" + "github.com/matrixorigin/matrixone/pkg/pb/lock" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + plan2 "github.com/matrixorigin/matrixone/pkg/sql/plan" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/vm/engine" +) + +func (c *Compile) mvTxn(f func(executor.TxnExecutor) error) error { + v, ok := moruntime.ServiceRuntime(c.proc.GetService()).GetGlobalVariables(moruntime.InternalSQLExecutor) + if !ok { + return moerr.NewInternalError(c.proc.Ctx, "materialized view SQL executor unavailable") + } + // The outer DDL/scan owns the active statement workspace. Nested catalog + // operations reuse it without starting a second statement or advancing S. + return v.(executor.SQLExecutor).ExecTxn(c.proc.Ctx, f, executor.Options{}.WithTxn(c.proc.GetTxnOperator()).WithDatabase(c.db).WithDisableIncrStatement()) +} + +func (c *Compile) registerMaterializedView(db engine.Database, dbName, name string, def *plan.TableDef) error { + definition, err := catalog.MaterializedViewDefinition(def) + if err != nil { + return err + } + if definition == nil { + return nil + } + if err := plan2.RequirePersistedProtocolVersionForAuthoring(c.proc.Ctx, c.proc, defines.MORPCVersion122); err != nil { + return err + } + r, err := db.Relation(c.proc.Ctx, name, nil) + if err != nil { + return err + } + dbID, err := strconv.ParseUint(db.GetDatabaseId(c.proc.Ctx), 10, 64) + if err != nil { + return err + } + account, err := defines.GetAccountId(c.proc.Ctx) + if err != nil { + return err + } + return c.mvTxn(func(tx executor.TxnExecutor) error { + return mv.Register(tx, mv.Key{Account: account, ID: r.GetTableID(c.proc.Ctx)}, dbID, name, definition) + }) +} + +func (c *Compile) validateMaterializedViewScan(def *plan.TableDef) error { + if def == nil || def.TableType != catalog.SystemMaterializedViewRel { + return nil + } + if err := plan2.RequirePersistedProtocolVersion(c.proc.Ctx, c.proc, defines.MORPCVersion122); err != nil { + return err + } + account, err := defines.GetAccountId(c.proc.Ctx) + if err != nil { + return err + } + if defines.CanWriteMaterializedView(c.proc.Ctx, account, def.TblId, c.proc.GetTxnOperator().Txn().ID) { + return nil + } + return c.mvTxn(func(tx executor.TxnExecutor) error { + st, err := mv.Load(tx, mv.Key{Account: account, ID: def.TblId}) + if err != nil { + return err + } + if !st.Populated { + return moerr.NewInvalidInput(c.proc.Ctx, "MV_NOT_POPULATED: refresh materialized view before querying it") + } + return mv.ValidateSources(tx, st) + }) +} + +// Guard source DDL and the MV through durable dependencies after existing +// lifecycle/name admission has acquired the target locks and refreshed RC state. +// Pessimistic CREATE MV pins those source names through publication. Optimistic +// SI has no name locks and retains a write/write fence through commit. +func (c *Compile) guardMaterializedViewDDL(dbName, name string, allowMV bool) error { + if dbName == "" { + dbName = c.db + } + if session := c.proc.GetSession(); session != nil { + if _, temporary := session.GetTempTable(dbName, name); temporary { + return nil + } + } + if !catalog.IsMaterializedViewDatabase(dbName) { + return nil + } + if _, ok := moruntime.ServiceRuntime(c.proc.GetService()).GetGlobalVariables(mv.RuntimeKey); !ok { + return nil + } + account, err := defines.GetAccountId(c.proc.Ctx) + if err != nil { + return err + } + db, err := c.e.Database(c.proc.Ctx, dbName, c.proc.GetTxnOperator()) + if err != nil { + return err + } + r, err := db.Relation(c.proc.Ctx, name, nil) + if err != nil { + return err + } + def := r.GetTableDef(c.proc.Ctx) + if def.TableType == catalog.SystemMaterializedViewRel && !allowMV && !defines.CanWriteMaterializedView(c.proc.Ctx, account, def.TblId, c.proc.GetTxnOperator().Txn().ID) { + return moerr.NewInvalidInput(c.proc.Ctx, "materialized view is read only; use DROP/ALTER MATERIALIZED VIEW") + } + return c.mvTxn(func(tx executor.TxnExecutor) error { + ready, err := mv.CatalogReady(tx) + if err != nil || !ready { + return err + } + if !c.proc.GetTxnOperator().Txn().IsPessimistic() { + if err := mv.DependencyGuard(tx, account); err != nil { + return err + } + } + res, err := tx.Exec(fmt.Sprintf("select mv_id from mo_catalog.mo_mv_dependencies where account_id=%d and source_table_id=%d limit 1", account, def.TblId), executor.StatementOption{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + defer res.Close() + rows := 0 + res.ReadRows(func(n int, _ []*vector.Vector) bool { rows += n; return false }) + if rows > 0 { + return moerr.NewInvalidInput(c.proc.Ctx, "source has dependent materialized views; drop them before changing its schema/identity") + } + return nil + }) +} + +// Both ordinary scopes and dependent programs enter through validateDMLTarget. +// Keep the transaction-bound write capability check before any target operator. +func (c *Compile) validateMaterializedViewDML(node *plan.Node) error { + switch node.NodeType { + case plan.Node_INSERT: + if node.InsertCtx != nil { + return c.validateMaterializedViewWrite(node.InsertCtx.TableDef) + } + case plan.Node_DELETE: + if node.DeleteCtx != nil { + return c.validateMaterializedViewWrite(node.DeleteCtx.TableDef) + } + case plan.Node_MULTI_UPDATE: + for _, update := range node.UpdateCtxList { + if err := c.validateMaterializedViewWrite(update.TableDef); err != nil { + return err + } + } + } + return nil +} + +func (c *Compile) validateMaterializedViewWrite(def *plan.TableDef) error { + if def == nil || def.TableType != catalog.SystemMaterializedViewRel { + return nil + } + account, err := defines.GetAccountId(c.proc.Ctx) + if err != nil { + return err + } + if !defines.CanWriteMaterializedView(c.proc.Ctx, account, def.TblId, c.proc.GetTxnOperator().Txn().ID) { + return moerr.NewInvalidInput(c.proc.Ctx, "materialized view is read only") + } + return nil +} + +// DROP DATABASE uses RESTRICT while materialized views or their sources exist. +// Dropping the views first leaves no global catalog rows orphaned. +func (c *Compile) guardMaterializedViewDatabaseDDL(dbName string) error { + if !catalog.IsMaterializedViewDatabase(dbName) { + return nil + } + if _, ok := moruntime.ServiceRuntime(c.proc.GetService()).GetGlobalVariables(mv.RuntimeKey); !ok { + return nil + } + account, err := defines.GetAccountId(c.proc.Ctx) + if err != nil { + return err + } + return c.mvTxn(func(tx executor.TxnExecutor) error { + ready, err := mv.CatalogReady(tx) + if err != nil || !ready { + return err + } + if !c.proc.GetTxnOperator().Txn().IsPessimistic() { + if err := mv.DependencyGuard(tx, account); err != nil { + return err + } + } + r, err := tx.Exec(fmt.Sprintf("select mv_id from mo_catalog.mo_materialized_views where account_id=%d and database_name='%s' limit 1", account, sqlquote.EscapeString(dbName)), executor.StatementOption{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + defer r.Close() + rows := 0 + r.ReadRows(func(n int, _ []*vector.Vector) bool { rows += n; return false }) + if rows != 0 { + return moerr.NewInvalidInput(c.proc.Ctx, "database contains materialized views; drop them first") + } + return nil + }) +} + +// SI creation pins the complete source/target name domain before publication. +// RC uses pinCreateNames, including source names, and its TN-ordered snapshot. +func (c *Compile) pinMaterializedViewSourceNames(q *plan.CreateTable, database string) error { + definition, err := catalog.MaterializedViewDefinition(q.TableDef) + if err != nil || definition == nil { + return err + } + if !c.proc.GetTxnOperator().Txn().IsPessimistic() { + return nil + } + if c.disableLock { + return moerr.NewInternalError(c.proc.Ctx, "materialized view creation requires lifecycle name locks") + } + if c.isLifecycleRC() { + return nil + } + if err := lockMoDatabase(c, database, lock.LockMode_Shared); err != nil { + return err + } + names := make([]string, 0, len(definition.Sources)+1) + names = append(names, q.TableDef.Name) + for _, source := range definition.Sources { + names = append(names, source.Table) + } + sort.Strings(names) + for i, name := range names { + if i > 0 && name == names[i-1] { + continue + } + if err := lockMoTable(c, database, name, lock.LockMode_Exclusive); err != nil { + return err + } + } + return nil +} + +// Empty-result compilation must still reach the existing MV scan validation. +// This bounded metadata walk runs only for a literal LIMIT 0 candidate; it does +// not fetch catalogs or create a second population/privilege validator. +func (c *Compile) containsMaterializedViewScan(root *plan.Node) bool { + query := c.pn.GetQuery() + queue := []*plan.Node{root} + seen := make(map[*plan.Node]struct{}) + for len(queue) > 0 { + node := queue[len(queue)-1] + queue = queue[:len(queue)-1] + if node == nil { + continue + } + if _, ok := seen[node]; ok { + continue + } + seen[node] = struct{}{} + if node.NodeType == plan.Node_TABLE_SCAN && node.TableDef.GetTableType() == catalog.SystemMaterializedViewRel { + return true + } + for _, child := range node.Children { + if child >= 0 && int(child) < len(query.GetNodes()) { + queue = append(queue, query.Nodes[child]) + } + } + for _, step := range node.SourceStep { + if step >= 0 && int(step) < len(query.GetSteps()) { + child := query.Steps[step] + if child >= 0 && int(child) < len(query.GetNodes()) { + queue = append(queue, query.Nodes[child]) + } + } + } + } + return false +} diff --git a/pkg/sql/compile/materialized_view_test.go b/pkg/sql/compile/materialized_view_test.go new file mode 100644 index 0000000000000..dbaebba59037e --- /dev/null +++ b/pkg/sql/compile/materialized_view_test.go @@ -0,0 +1,425 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package compile + +import ( + "context" + "encoding/json" + "fmt" + "github.com/matrixorigin/matrixone/pkg/txn/client" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "strings" + "testing" + + "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/mv" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + plan2 "github.com/matrixorigin/matrixone/pkg/sql/plan" + "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewExecutionCapability(t *testing.T) { + proc := testutil.NewProcess(t) + proc.Ctx = defines.AttachAccountId(proc.Ctx, 7) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().Txn().Return(txn.TxnMeta{ID: []byte("execution")}).AnyTimes() + proc.Base.TxnOperator = op + c := &Compile{proc: proc} + def := &plan.TableDef{TableType: catalog.SystemMaterializedViewRel, TblId: 99} + rt := moruntime.ServiceRuntime(proc.GetService()) + old, present := rt.GetGlobalVariables(moruntime.MOProtocolVersion) + rt.SetGlobalVariables(moruntime.MOProtocolVersion, defines.MORPCVersion122) + t.Cleanup(func() { + if present { + rt.SetGlobalVariables(moruntime.MOProtocolVersion, old) + } else { + rt.CompareAndDeleteGlobalVariables(moruntime.MOProtocolVersion, defines.MORPCVersion122) + } + }) + nodes := []*plan.Node{ + {NodeType: plan.Node_INSERT, InsertCtx: &plan.InsertCtx{TableDef: def}}, + {NodeType: plan.Node_DELETE, DeleteCtx: &plan.DeleteCtx{TableDef: def}}, + {NodeType: plan.Node_MULTI_UPDATE, UpdateCtxList: []*plan.UpdateCtx{{TableDef: &plan.TableDef{}}, {TableDef: def}}}, + } + for _, node := range nodes { + // Admission precedes source/compiler/engine setup, as in the shared-table fixture. + _, err := c.compileDependentQuery(&plan.Query{Steps: []int32{0}, Nodes: []*plan.Node{node}}) + require.ErrorContains(t, err, "materialized view is read only", node.NodeType.String()) + } + require.Error(t, c.validateMaterializedViewWrite(def)) + proc.Ctx = defines.WithMaterializedViewWrite(proc.Ctx, 7, 99, []byte("binding")) + require.Error(t, c.validateMaterializedViewWrite(def)) + proc.Ctx = defines.WithMaterializedViewWrite(proc.Ctx, 7, 99, []byte("execution")) + require.NoError(t, c.validateMaterializedViewWrite(def)) + for _, node := range nodes { + require.NoError(t, c.validateDMLTarget(node), "authorized refresh capability must remain valid") + } + def.TblId = 100 + require.Error(t, c.validateMaterializedViewWrite(def)) + def.TableType = catalog.SystemOrdinaryRel + require.NoError(t, c.validateMaterializedViewWrite(def)) +} + +func TestMaterializedViewCompileProtocolAdmission(t *testing.T) { + for _, tc := range []struct { + name string + protocol, floor int64 + register bool + ordinary bool + wantErr bool + dependent bool + }{ + {"old scan protocol", defines.MORPCVersion121, defines.MORPCVersion122, false, false, true, false}, + {"current scan protocol", defines.MORPCVersion122, defines.MORPCVersion122, false, false, false, false}, + {"ordinary scan", defines.MORPCVersion121, defines.MORPCVersion121, false, true, false, false}, + {"old registration protocol", defines.MORPCVersion121, defines.MORPCVersion122, true, false, true, false}, + {"old registration floor", defines.MORPCVersion122, defines.MORPCVersion121, true, false, true, false}, + {"old dependent scan protocol", defines.MORPCVersion121, defines.MORPCVersion122, false, false, true, true}, + {"current dependent scan protocol", defines.MORPCVersion122, defines.MORPCVersion122, false, false, false, true}, + {"ordinary dependent scan", defines.MORPCVersion121, defines.MORPCVersion121, false, true, false, true}, + } { + t.Run(tc.name, func(t *testing.T) { + proc := testutil.NewProcess(t) + proc.Ctx = defines.AttachAccountId(proc.Ctx, 7) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().Txn().Return(txn.TxnMeta{ID: []byte("execution")}).AnyTimes() + proc.Base.TxnOperator = op + proc.Ctx = defines.WithMaterializedViewWrite(proc.Ctx, 7, 99, []byte("execution")) + rt := moruntime.ServiceRuntime(proc.GetService()) + for key, value := range map[string]int64{ + moruntime.MOProtocolVersion: tc.protocol, moruntime.PersistedExpressionProtocolAuthoringFloor: tc.floor, + } { + old, present := rt.GetGlobalVariables(key) + rt.SetGlobalVariables(key, value) + t.Cleanup(func() { + if present { + rt.SetGlobalVariables(key, old) + } else { + rt.CompareAndDeleteGlobalVariables(key, value) + } + }) + } + def := &plan.TableDef{TableType: catalog.SystemMaterializedViewRel, TblId: 99, + Props: []*plan.PropertyDef{{Key: catalog.MaterializedViewProperty, + Value: `{"format_version":1,"query":"select * from t","sources":[{"table":"t"}]}`}}} + if tc.ordinary { + def.TableType = catalog.SystemOrdinaryRel + } + c := &Compile{proc: proc} + var err error + if tc.register { + // Rejection must precede relation lookup and catalog publication. + err = c.registerMaterializedView(nil, "db", "mv", def) + } else if tc.dependent { + _, err = c.compileDependentSource(&plan.Node{NodeType: plan.Node_TABLE_SCAN, TableDef: def}) + } else { + err = c.validateMaterializedViewScan(def) + } + if tc.wantErr { + require.True(t, moerr.IsMoErrCode(err, moerr.ErrNotSupported), "%v", err) + } else { + require.NoError(t, err) + } + }) + } +} + +type materializedViewNestedExecutor struct { + executor.SQLExecutor + t *testing.T + op client.TxnOperator +} + +func (e *materializedViewNestedExecutor) ExecTxn(_ context.Context, f func(executor.TxnExecutor) error, opts executor.Options) error { + require.True(e.t, opts.DisableIncrStatement(), "nested catalog work must not start a second active statement") + require.Same(e.t, e.op, opts.Txn()) + return f(executor.NewMemTxnExecutor(func(string) (executor.Result, error) { return executor.Result{}, nil }, e.op)) +} +func TestMaterializedViewNestedStatementOwnership(t *testing.T) { + proc := testutil.NewProcess(t) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + proc.Base.TxnOperator = op + inner := &materializedViewNestedExecutor{t: t, op: op} + installDropDDLExecutor(t, proc, inner) + c := &Compile{proc: proc, db: "db"} + require.NoError(t, c.mvTxn(func(tx executor.TxnExecutor) error { + require.Same(t, op, tx.Txn()) + r, err := tx.Exec("select 1", executor.StatementOption{}) + if err == nil { + r.Close() + } + return err + })) +} + +func TestMaterializedViewSourceNameAdmissionDomain(t *testing.T) { + definition := catalog.MVDefinition{FormatVersion: 1, Query: "select * from a", Sources: []catalog.MVSource{ + {Database: "db", Table: "b"}, {Database: "db", Table: "a"}, {Database: "db", Table: "a"}, + }} + data, err := json.Marshal(definition) + require.NoError(t, err) + q := &plan.CreateTable{Database: "db", TableDef: &plan.TableDef{Name: "mv", TableType: catalog.SystemMaterializedViewRel, + Props: []*plan.PropertyDef{{Key: catalog.MaterializedViewProperty, Value: string(data)}}}} + domain := createNameDomain(q, "") + require.Len(t, domain, 3) + for _, name := range []string{"mv", "a", "b"} { + require.Contains(t, domain, plan2.FkReferKey{Db: "db", Tbl: name}) + } + changed := plan2.DeepCopyCreateTable(q) + definition.Sources[0].Table = "other" + data, err = json.Marshal(definition) + require.NoError(t, err) + changed.TableDef.Props[0].Value = string(data) + require.False(t, sameCreateNameDomain(q, changed), "replanning cannot silently change the locked source domain") + q.TableDef.TableType = catalog.SystemOrdinaryRel + require.Len(t, createNameDomain(q, ""), 1, "ordinary CREATE must not pin MV source names") +} + +func TestMaterializedViewDDLGuardDoesNotWriteAccountFence(t *testing.T) { + for _, dependent := range []bool{false, true} { + t.Run(map[bool]string{false: "ordinary", true: "dependent"}[dependent], func(t *testing.T) { + ctrl := gomock.NewController(t) + proc := testutil.NewProcess(t) + proc.Ctx = defines.AttachAccountId(proc.Ctx, 7) + op := mock_frontend.NewMockTxnOperator(ctrl) + op.EXPECT().Txn().Return(txn.TxnMeta{Mode: txn.TxnMode_Pessimistic, Isolation: txn.TxnIsolation_RC}).AnyTimes() + proc.Base.TxnOperator = op + eng := mock_frontend.NewMockEngine(ctrl) + database := mock_frontend.NewMockDatabase(ctrl) + relation := mock_frontend.NewMockRelation(ctrl) + eng.EXPECT().Database(proc.Ctx, "db", op).Return(database, nil) + database.EXPECT().Relation(proc.Ctx, "source", nil).Return(relation, nil) + relation.EXPECT().GetTableDef(proc.Ctx).Return(&plan.TableDef{TableType: catalog.SystemOrdinaryRel, TblId: 99}) + calls := 0 + exec := executor.NewMemExecutor2(func(sql string) (executor.Result, error) { + if sql == mv.CatalogReadinessSQL { + res := executor.NewMemResult([]types.Type{types.T_int64.ToType()}, proc.Mp()) + res.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(res, 0, []int64{4})) + return res.GetResult(), nil + } + require.True(t, strings.HasPrefix(sql, "select mv_id from "), "ordinary DDL must not introduce DML or retained locks: %s", sql) + require.Contains(t, sql, "account_id=7") + calls++ + if !dependent { + return executor.Result{}, nil + } + res := executor.NewMemResult([]types.Type{types.T_uint64.ToType()}, proc.Mp()) + res.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(res, 0, []uint64{100})) + return res.GetResult(), nil + }, op) + installDropDDLExecutor(t, proc, exec) + rt := moruntime.ServiceRuntime(proc.GetService()) + previous, existed := rt.GetGlobalVariables(mv.RuntimeKey) + marker := &mv.Service{} + rt.SetGlobalVariables(mv.RuntimeKey, marker) + t.Cleanup(func() { + if existed { + rt.SetGlobalVariables(mv.RuntimeKey, previous) + } else { + rt.CompareAndDeleteGlobalVariables(mv.RuntimeKey, marker) + } + }) + c := &Compile{proc: proc, e: eng, db: "db"} + err := c.guardMaterializedViewDDL("db", "source", false) + if dependent { + require.ErrorContains(t, err, "dependent materialized views") + } else { + require.NoError(t, err) + } + require.Equal(t, 1, calls) + }) + } +} + +func TestMaterializedViewDDLReadiness(t *testing.T) { + for _, mode := range []txn.TxnMode{txn.TxnMode_Pessimistic, txn.TxnMode_Optimistic} { + for _, count := range []int64{0, 4} { + for _, dependent := range []bool{false, true} { + for _, tableDDL := range []bool{false, true} { + t.Run(fmt.Sprintf("%d/catalog=%d/dependent=%v/table=%v", mode, count, dependent, tableDDL), func(t *testing.T) { + proc := testutil.NewProcess(t) + proc.Ctx = defines.AttachAccountId(proc.Ctx, 7) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().Txn().Return(txn.TxnMeta{Mode: mode}).AnyTimes() + proc.Base.TxnOperator = op + downstream := 0 + exec := executor.NewMemExecutor2(func(sql string) (executor.Result, error) { + if sql == mv.CatalogReadinessSQL { + r := executor.NewMemResult([]types.Type{types.T_int64.ToType()}, proc.Mp()) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []int64{count})) + return r.GetResult(), nil + } + downstream++ + require.Equal(t, int64(4), count, "pre-migration DDL touched missing MV catalogs") + if strings.HasPrefix(sql, "select mv_id") && dependent { + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType()}, proc.Mp()) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint64{99})) + return r.GetResult(), nil + } + return executor.Result{}, nil + }, op) + installDropDDLExecutor(t, proc, exec) + rt := moruntime.ServiceRuntime(proc.GetService()) + old, present := rt.GetGlobalVariables(mv.RuntimeKey) + marker := &mv.Service{} + rt.SetGlobalVariables(mv.RuntimeKey, marker) + t.Cleanup(func() { + if present { + rt.SetGlobalVariables(mv.RuntimeKey, old) + } else { + rt.CompareAndDeleteGlobalVariables(mv.RuntimeKey, marker) + } + }) + c := &Compile{proc: proc, db: "db"} + var err error + if tableDDL { + ctrl := gomock.NewController(t) + eng := mock_frontend.NewMockEngine(ctrl) + database := mock_frontend.NewMockDatabase(ctrl) + relation := mock_frontend.NewMockRelation(ctrl) + eng.EXPECT().Database(proc.Ctx, "db", op).Return(database, nil) + database.EXPECT().Relation(proc.Ctx, "source", nil).Return(relation, nil) + relation.EXPECT().GetTableDef(proc.Ctx).Return(&plan.TableDef{TableType: catalog.SystemOrdinaryRel, TblId: 99}) + c.e = eng + err = c.guardMaterializedViewDDL("db", "source", false) + } else { + err = c.guardMaterializedViewDatabaseDDL("db") + } + if count == 4 && dependent { + require.ErrorContains(t, err, "materialized views") + } else { + require.NoError(t, err) + } + if count == 0 { + require.Zero(t, downstream) + } else { + require.Positive(t, downstream) + } + }) + } + } + } + } +} + +func TestMaterializedViewLimitZeroRetainsScanValidation(t *testing.T) { + zero := &plan.Expr{Expr: &plan.Expr_Lit{Lit: &plan.Literal{Value: &plan.Literal_U64Val{U64Val: 0}}}} + for _, sourceStep := range []bool{false, true} { + for _, kind := range []string{catalog.SystemOrdinaryRel, catalog.SystemMaterializedViewRel} { + scan := &plan.Node{NodeId: 0, NodeType: plan.Node_TABLE_SCAN, TableDef: &plan.TableDef{TableType: kind}} + root := &plan.Node{NodeId: 1, NodeType: plan.Node_PROJECT, Limit: zero, Children: []int32{0}} + q := &plan.Query{Nodes: []*plan.Node{scan, root}, Steps: []int32{0, 1}} + if sourceStep { + root.Children = nil + root.SourceStep = []int32{0} + } + c := &Compile{pn: &plan.Plan{Plan: &plan.Plan_Query{Query: q}}} + require.Equal(t, kind != catalog.SystemMaterializedViewRel, c.canUseLiteralLimitZeroFastPath(root)) + root.Children = append(root.Children, 1) // Defensive cycle handling is bounded. + require.Equal(t, kind != catalog.SystemMaterializedViewRel, c.canUseLiteralLimitZeroFastPath(root)) + } + } +} + +// This executor publishes a dependency at the existing publication gate, after +// the real Scope has completed physical preparation. No new production hook. +type materializedViewCopyExecutor struct { + *alterCopyLateOwnerExecutor + existing, late bool + lateError error + checks int +} + +func (e *materializedViewCopyExecutor) Exec(ctx context.Context, sql string, opts executor.Options) (executor.Result, error) { + if sql == mv.CatalogReadinessSQL { + r := executor.NewMemResult([]types.Type{types.T_int64.ToType()}, e.mp) + r.NewBatchWithRowCount(1) + require.NoError(e.t, executor.AppendFixedRows(r, 0, []int64{4})) + return r.GetResult(), nil + } + if strings.HasPrefix(sql, "select mv_id from mo_catalog.mo_mv_dependencies") { + e.checks++ + if e.ownerPublished && e.lateError != nil { + return executor.Result{}, e.lateError + } + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType()}, e.mp) + if e.existing || e.late && e.ownerPublished { + r.NewBatchWithRowCount(1) + require.NoError(e.t, executor.AppendFixedRows(r, 0, []uint64{99})) + } + return r.GetResult(), nil + } + return e.alterCopyLateOwnerExecutor.Exec(ctx, sql, opts) +} +func (e *materializedViewCopyExecutor) ExecTxn(ctx context.Context, f func(executor.TxnExecutor) error, opts executor.Options) error { + return f(executor.NewMemTxnExecutor(func(sql string) (executor.Result, error) { return e.Exec(ctx, sql, opts) }, opts.Txn())) +} +func TestMaterializedViewAlterCopyRechecksDependencies(t *testing.T) { + for _, name := range []string{"existing dependency", "published during preparation", "independent source", "publication probe canceled"} { + t.Run(name, func(t *testing.T) { + ctrl := gomock.NewController(t) + e := &materializedViewCopyExecutor{alterCopyLateOwnerExecutor: &alterCopyLateOwnerExecutor{t: t}, existing: name == "existing dependency", late: name == "published during preparation"} + if name == "publication probe canceled" { + e.lateError = context.Canceled + } + stubAlterCopySourceLocks(t, nil) + scope, c := newAlterCopyGateConcurrencyFixture(t, ctrl, e, "mv-copy-"+strings.ReplaceAll(name, " ", "-"), 123456789) + e.mp = c.proc.Mp() + rt := moruntime.ServiceRuntime(c.proc.GetService()) + previous, present := rt.GetGlobalVariables(mv.RuntimeKey) + marker := &mv.Service{} + rt.SetGlobalVariables(mv.RuntimeKey, marker) + t.Cleanup(func() { + if present { + rt.SetGlobalVariables(mv.RuntimeKey, previous) + } else { + rt.CompareAndDeleteGlobalVariables(mv.RuntimeKey, marker) + } + }) + err := scope.AlterTableCopy(c) + switch name { + case "independent source": + require.ErrorContains(t, err, "stop after snapshot lineage publication") + require.NotEmpty(t, e.metadataSQL) + case "publication probe canceled": + require.ErrorIs(t, err, context.Canceled) + require.Empty(t, e.metadataSQL) + default: + require.ErrorContains(t, err, "dependent materialized views") + require.Empty(t, e.metadataSQL) + } + require.Empty(t, e.dropSourceSQL) + require.False(t, e.sourceRenamed) + require.Equal(t, !e.existing, e.physicalStarted) + if e.existing { + require.Equal(t, 1, e.checks) + } else { + require.Equal(t, 2, e.checks) + } + }) + } +} diff --git a/pkg/sql/compile/scheduler.go b/pkg/sql/compile/scheduler.go index e8d5208fb3c87..e0665aacfee6a 100644 --- a/pkg/sql/compile/scheduler.go +++ b/pkg/sql/compile/scheduler.go @@ -28,6 +28,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/clusterservice" "github.com/matrixorigin/matrixone/pkg/common/moerr" moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/defines" "github.com/matrixorigin/matrixone/pkg/logutil" "github.com/matrixorigin/matrixone/pkg/pb/metadata" "github.com/matrixorigin/matrixone/pkg/pb/plan" @@ -505,6 +506,9 @@ func (c *Compile) executionRequiresCurrentCN() bool { // exists only at the ingress CN and cannot be sent through a remote scheduler // decision. func (c *Compile) ingressOnlyExecution() bool { + if c != nil && c.proc != nil && defines.MaterializedViewWriteActive(c.proc.Ctx) { + return true + } if c == nil || c.stmt == nil { return false } diff --git a/pkg/sql/compile/sql_executor.go b/pkg/sql/compile/sql_executor.go index 79fe62b9b976d..d3e579230506a 100644 --- a/pkg/sql/compile/sql_executor.go +++ b/pkg/sql/compile/sql_executor.go @@ -472,7 +472,7 @@ func (exec *txnExecutor) Exec( receiveAt := time.Now() lower := exec.opts.LowerCaseTableNames() - stmts, err := parsers.Parse(exec.ctx, dialect.MYSQL, sql, lower) + stmts, err := parsers.ParseWithSQLMode(exec.ctx, dialect.MYSQL, sql, lower, exec.opts.ParserSQLMode()) defer func() { for _, stmt := range stmts { stmt.Free() diff --git a/pkg/sql/compile/sql_executor_context.go b/pkg/sql/compile/sql_executor_context.go index ecbfe404e9d64..81d6c574c4cbf 100644 --- a/pkg/sql/compile/sql_executor_context.go +++ b/pkg/sql/compile/sql_executor_context.go @@ -708,7 +708,7 @@ func (c *compilerContext) ResolveVariable(varName string, isSystemVar bool, isGl // // Replay may carry the original frontend context; other internal SQL can // carry a partial session resolver on its process (e.g. ALTER TABLE). - // Prefer the former, then forward explicit precision, DOP and FK-check settings. + // Prefer the former, then forward explicit binding, DOP and FK-check settings. // ALTER COPY population must inherit the outer statement's FK-check mode; // defaulting it to nil silently re-enables checks during the internal INSERT. if delegate := c.resolveDelegate(); delegate != nil { @@ -716,6 +716,7 @@ func (c *compilerContext) ResolveVariable(varName string, isSystemVar bool, isGl } if isSystemVar && !isGlobalVar && c.proc != nil && (strings.EqualFold(varName, "div_precision_increment") || + strings.EqualFold(varName, "sql_mode") || strings.EqualFold(varName, "max_dop") || strings.EqualFold(varName, "foreign_key_checks")) { if resolve := c.proc.GetResolveVariableFunc(); resolve != nil { diff --git a/pkg/sql/compile/sql_executor_context_test.go b/pkg/sql/compile/sql_executor_context_test.go index 82ac927e5f940..f422813475355 100644 --- a/pkg/sql/compile/sql_executor_context_test.go +++ b/pkg/sql/compile/sql_executor_context_test.go @@ -638,7 +638,7 @@ func TestCompilerContextResolveVariableDelegatesToAttachedSession(t *testing.T) require.Equal(t, int64(10), value) // Internal SQL callers can install a resolver for only a subset of // session variables. Unrelated planner lookups retain their nil default. - value, err = processOnly.ResolveVariable("sql_mode", true, false) + value, err = processOnly.ResolveVariable("group_concat_max_len", true, false) require.NoError(t, err) require.Nil(t, value) value, err = processOnly.ResolveVariable("other", false, true) @@ -738,12 +738,15 @@ func TestInternalCompilerPlanConsumesScopedDOP(t *testing.T) { if strings.EqualFold(name, "div_precision_increment") { return int64(10), nil } + if strings.EqualFold(name, "sql_mode") { + return "", nil // Empty SQL mode is a real captured value. + } return nil, errors.New("unexpected variable") }) query := build(compiler, "select cast(1.23 as decimal(10,2)) / cast(3.45 as decimal(10,2))").GetQuery() require.Equal(t, int64(1), query.MaxDop) require.Equal(t, int32(12), query.Nodes[query.Steps[0]].ProjectList[0].Typ.Scale) - for _, name := range []string{"MAX_DOP", "DIV_PRECISION_INCREMENT"} { + for _, name := range []string{"MAX_DOP", "DIV_PRECISION_INCREMENT", "SQL_MODE"} { _, err := compiler.ResolveVariable(name, true, false) require.NoError(t, err) } @@ -754,7 +757,8 @@ func TestInternalCompilerPlanConsumesScopedDOP(t *testing.T) { }{ {"max_dop", false, false}, {"max_dop", true, true}, {"div_precision_increment", false, false}, {"div_precision_increment", true, true}, - {"sql_mode", true, false}, + {"foreign_key_checks", false, false}, {"foreign_key_checks", true, true}, + {"sql_mode", false, false}, {"sql_mode", true, true}, } { v, err := compiler.ResolveVariable(tc.name, tc.system, tc.global) require.NoError(t, err) diff --git a/pkg/sql/compile/union_all_lazy_test.go b/pkg/sql/compile/union_all_lazy_test.go index b2058a0ec85e0..ce0ba808feabb 100644 --- a/pkg/sql/compile/union_all_lazy_test.go +++ b/pkg/sql/compile/union_all_lazy_test.go @@ -462,6 +462,20 @@ func TestUnionNestedTopClearsAllocationOwners(t *testing.T) { logicPlan, err := plan2.BuildPlan(compilerCtx, statements[0], false) require.NoError(t, err) c := newLazyUnionAllTestCompile(t) + // This test owns allocation cleanup, not host disk-pressure policy. Keep + // the normal 1 MiB query limit with a private ledger so another fixture's + // explicit spill limit and the local filesystem margin cannot change it. + budget := process.MustNewExecutionResourceBudget(4<<20, uint64(c.proc.GetLim().Size)) + t.Cleanup(budget.Close) + generation, err := budget.OpenGeneration(1) + require.NoError(t, err) + t.Cleanup(func() { + if generation.Used() != 0 || generation.SpillDiskUsed() != 0 || generation.SpillFDUsed() != 0 { + t.Errorf("operators retained execution resources: %+v", generation.Snapshot()) + } + generation.Close() + }) + require.NoError(t, c.proc.SetExecutionResourceBudgetForTesting(generation)) c.isPrepare = false c.pn = logicPlan c.MessageBoard = message.NewMessageBoard() diff --git a/pkg/sql/parsers/dialect/mysql/keywords.go b/pkg/sql/parsers/dialect/mysql/keywords.go index ce91229d53701..514f3674b0d3e 100644 --- a/pkg/sql/parsers/dialect/mysql/keywords.go +++ b/pkg/sql/parsers/dialect/mysql/keywords.go @@ -579,6 +579,12 @@ func init() { "varcharacter": UNUSED, "varying": UNUSED, "virtual": VIRTUAL, + "materialized": MATERIALIZED, + "refresh": REFRESH, + "manual": MANUAL, + "every": EVERY, + "views": VIEWS, + "refreshes": REFRESHES, "view": VIEW, "visible": VISIBLE, "week": WEEK, diff --git a/pkg/sql/parsers/dialect/mysql/materialized_view_test.go b/pkg/sql/parsers/dialect/mysql/materialized_view_test.go new file mode 100644 index 0000000000000..59a9089ae864c --- /dev/null +++ b/pkg/sql/parsers/dialect/mysql/materialized_view_test.go @@ -0,0 +1,72 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "context" + "testing" + + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewSyntax(t *testing.T) { + for _, sql := range []string{ + "create materialized view mv refresh manual as select k,sum(v) as s from t group by k", + "create materialized view if not exists db.mv refresh every interval 2 minute as select * from t", + "refresh materialized view db.mv", + "drop materialized view if exists db.mv", + "alter materialized view db.mv refresh manual", + "alter materialized view db.mv refresh every interval 1 hour", + "show materialized views", + "show materialized view refreshes db.mv", + "show create materialized view db.mv", + } { + t.Run(sql, func(t *testing.T) { + stmts, err := Parse(context.Background(), sql, 1) + require.NoError(t, err) + require.Len(t, stmts, 1) + defer stmts[0].Free() + canonical := tree.String(stmts[0], dialect.MYSQL) + again, err := Parse(context.Background(), canonical, 1) + require.NoError(t, err) + require.Len(t, again, 1) + defer again[0].Free() + require.IsType(t, stmts[0], again[0]) + if c, ok := stmts[0].(*tree.CreateMaterializedView); ok { + require.NotNil(t, c.AsSource) + if c.IfNotExists { + require.Equal(t, int64(120), c.IntervalSeconds) + } + } + }) + } + for _, sql := range []string{ + "create materialized view mv as select * from t", + "create materialized view mv refresh manual as select db.abs(v) from t", + "create materialized view mv refresh every interval 0 second as select * from t", + "alter materialized view mv refresh every interval 366 day", + "create materialized view mv refresh every interval 9223372036854775808 hour as select * from t", + } { + t.Run(sql, func(t *testing.T) { + stmts, err := Parse(context.Background(), sql, 1) + for _, s := range stmts { + s.Free() + } + require.Error(t, err) + }) + } +} diff --git a/pkg/sql/parsers/dialect/mysql/mysql_sql.go b/pkg/sql/parsers/dialect/mysql/mysql_sql.go index fb589edca8e19..c52415b966b3f 100644 --- a/pkg/sql/parsers/dialect/mysql/mysql_sql.go +++ b/pkg/sql/parsers/dialect/mysql/mysql_sql.go @@ -927,24 +927,30 @@ const STORES = 58089 const SETTINGS = 58090 const DUMP = 58091 const METADATA = 58092 -const KILL = 58093 -const BACKUP = 58094 -const FILESYSTEM = 58095 -const PARALLELISM = 58096 -const RESTORE = 58097 -const QUERY_RESULT = 58098 -const RETURNING = 58099 -const ARRAY = 58100 -const WITHIN = 58101 -const PERCENTILE_CONT = 58102 -const PERCENTILE_DISC = 58103 -const ASOF = 58104 -const TOLERANCE = 58105 -const WINDOW = 58106 -const WINDOW_NAME_EMPTY = 58107 -const RESPECT = 58108 -const MEMBER = 58109 -const AUTO_ID_CACHE = 58110 +const MATERIALIZED = 58093 +const REFRESH = 58094 +const MANUAL = 58095 +const EVERY = 58096 +const VIEWS = 58097 +const REFRESHES = 58098 +const KILL = 58099 +const BACKUP = 58100 +const FILESYSTEM = 58101 +const PARALLELISM = 58102 +const RESTORE = 58103 +const QUERY_RESULT = 58104 +const RETURNING = 58105 +const ARRAY = 58106 +const WITHIN = 58107 +const PERCENTILE_CONT = 58108 +const PERCENTILE_DISC = 58109 +const ASOF = 58110 +const TOLERANCE = 58111 +const WINDOW = 58112 +const WINDOW_NAME_EMPTY = 58113 +const RESPECT = 58114 +const MEMBER = 58115 +const AUTO_ID_CACHE = 58116 var yyToknames = [...]string{ "$end", @@ -1714,6 +1720,12 @@ var yyToknames = [...]string{ "SETTINGS", "DUMP", "METADATA", + "MATERIALIZED", + "REFRESH", + "MANUAL", + "EVERY", + "VIEWS", + "REFRESHES", "KILL", "BACKUP", "FILESYSTEM", @@ -1745,9511 +1757,9574 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line mysql_sql.y:16982 +//line mysql_sql.y:17030 //line yacctab:1 var yyExca = [...]int{ -1, 1, 1, -1, -2, 0, - -1, 153, - 52, 765, - 286, 765, - 313, 772, - 314, 772, - 554, 765, - -2, 805, - -1, 173, - 17, 1016, - 30, 1016, - -2, 1002, - -1, 199, - 284, 1615, - 286, 1435, - -2, 1518, - -1, 276, - 789, 2606, - -2, 638, - -1, 666, - 789, 2734, + -1, 138, + 52, 768, + 286, 768, + 313, 775, + 314, 775, + 554, 768, + -2, 808, + -1, 177, + 17, 1020, + 30, 1020, + -2, 1006, + -1, 204, + 284, 1633, + 286, 1453, + -2, 1536, + -1, 283, + 795, 2630, + -2, 641, + -1, 678, + 795, 2758, + -2, 467, + -1, 738, + 795, 2819, -2, 465, - -1, 726, - 789, 2795, - -2, 463, - -1, 727, - 789, 2796, - -2, 464, - -1, 728, - 789, 2797, + -1, 739, + 795, 2820, -2, 466, - -1, 882, - 549, 805, - 550, 805, - -2, 766, - -1, 954, - 365, 217, - 526, 217, - 527, 217, - -2, 2449, - -1, 1024, - 96, 2178, - -2, 2668, - -1, 1025, - 96, 2199, - -2, 2637, - -1, 1029, - 96, 2200, - -2, 2667, - -1, 1077, - 96, 2099, - -2, 2889, - -1, 1078, - 96, 2100, - -2, 2888, - -1, 1079, - 96, 2101, - -2, 2878, - -1, 1080, - 96, 2849, - -2, 2869, - -1, 1081, - 96, 2850, - -2, 2870, - -1, 1082, - 96, 2851, - -2, 2880, - -1, 1083, - 96, 2852, - -2, 2858, - -1, 1084, - 96, 2853, - -2, 2867, - -1, 1085, - 96, 2854, - -2, 2882, - -1, 1086, - 96, 2855, - -2, 2887, - -1, 1087, - 96, 2856, - -2, 2892, - -1, 1088, - 96, 2857, - -2, 2893, - -1, 1089, - 96, 2174, - -2, 2707, - -1, 1090, - 96, 2175, - -2, 2432, - -1, 1091, - 96, 2176, - -2, 2717, + -1, 740, + 795, 2821, + -2, 468, + -1, 893, + 549, 808, + 550, 808, + -2, 769, + -1, 969, + 365, 219, + 526, 219, + 527, 219, + -2, 2473, + -1, 1039, + 96, 2196, + -2, 2692, + -1, 1040, + 96, 2217, + -2, 2661, + -1, 1044, + 96, 2218, + -2, 2691, -1, 1092, - 96, 2177, - -2, 2443, + 96, 2117, + -2, 2913, + -1, 1093, + 96, 2118, + -2, 2912, -1, 1094, - 96, 2180, - -2, 2451, + 96, 2119, + -2, 2902, + -1, 1095, + 96, 2873, + -2, 2893, -1, 1096, - 96, 2182, - -2, 2742, + 96, 2874, + -2, 2894, + -1, 1097, + 96, 2875, + -2, 2904, -1, 1098, - 96, 2184, - -2, 2475, + 96, 2876, + -2, 2882, -1, 1099, - 96, 2185, - -2, 2402, + 96, 2877, + -2, 2891, + -1, 1100, + 96, 2878, + -2, 2906, -1, 1101, - 96, 2187, - -2, 2754, + 96, 2879, + -2, 2911, -1, 1102, - 96, 2188, - -2, 2753, + 96, 2880, + -2, 2916, -1, 1103, - 96, 2189, - -2, 2561, + 96, 2881, + -2, 2917, -1, 1104, - 96, 2190, - -2, 2663, + 96, 2192, + -2, 2731, -1, 1105, - 96, 2191, - -2, 2581, - -1, 1108, + 96, 2193, + -2, 2456, + -1, 1106, 96, 2194, - -2, 2765, - -1, 1109, + -2, 2741, + -1, 1107, 96, 2195, - -2, 2605, - -1, 1111, - 96, 2197, - -2, 2768, - -1, 1112, + -2, 2467, + -1, 1109, 96, 2198, - -2, 2770, + -2, 2475, + -1, 1111, + 96, 2200, + -2, 2766, -1, 1113, - 96, 2201, - -2, 2777, - -1, 1114, 96, 2202, - -2, 2646, - -1, 1115, + -2, 2499, + -1, 1114, 96, 2203, - -2, 2694, + -2, 2426, -1, 1116, - 96, 2204, - -2, 2657, - -1, 1117, 96, 2205, - -2, 2683, + -2, 2778, + -1, 1117, + 96, 2206, + -2, 2777, + -1, 1118, + 96, 2207, + -2, 2585, + -1, 1119, + 96, 2208, + -2, 2687, + -1, 1120, + 96, 2209, + -2, 2605, + -1, 1123, + 96, 2212, + -2, 2789, + -1, 1124, + 96, 2213, + -2, 2629, + -1, 1126, + 96, 2215, + -2, 2792, + -1, 1127, + 96, 2216, + -2, 2794, -1, 1128, - 96, 2075, - -2, 2883, + 96, 2219, + -2, 2801, -1, 1129, - 96, 2076, - -2, 2884, + 96, 2220, + -2, 2670, -1, 1130, - 96, 2077, - -2, 2885, - -1, 1259, - 138, 2432, - 149, 2432, - 182, 2432, - -2, 2393, - -1, 1408, - 30, 1051, - -2, 978, - -1, 1613, - 17, 1016, - 30, 1016, - -2, 1914, - -1, 1715, - 30, 1051, - -2, 978, - -1, 2052, - 52, 765, - 286, 765, - 313, 772, - 314, 772, - 554, 765, - -2, 805, - -1, 2162, - 96, 2263, - -2, 2665, - -1, 2163, - 96, 2264, - -2, 2666, - -1, 2472, - 17, 1016, - 30, 1016, - -2, 1197, - -1, 2963, - 97, 1291, - -2, 1297, - -1, 2981, - 121, 1513, - 169, 1513, - 217, 1513, - 220, 1513, - 326, 1513, - -2, 1506, - -1, 2984, - 44, 1549, - -2, 1497, - -1, 3497, - 97, 2379, - 183, 2379, - -2, 2648, - -1, 3498, - 97, 2379, - 183, 2379, - -2, 2647, - -1, 3500, - 97, 2375, - 183, 2375, - -2, 2634, - -1, 3501, - 97, 2331, - 183, 2331, - -2, 2639, - -1, 3502, - 97, 2332, - 183, 2332, - -2, 2547, - -1, 3503, - 97, 2333, - 183, 2333, - -2, 2540, - -1, 3504, - 97, 2375, - 183, 2375, - -2, 2417, - -1, 3505, - 97, 2335, - 183, 2335, - -2, 2636, - -1, 3506, - 97, 2336, - 183, 2336, - -2, 2545, - -1, 3507, - 97, 2337, - 183, 2337, - -2, 2539, - -1, 3508, - 97, 2338, - 183, 2338, - -2, 2515, - -1, 3509, - 97, 2379, - 183, 2379, - -2, 2516, - -1, 3510, - 97, 2379, - 183, 2379, - -2, 2517, - -1, 3511, - 97, 2379, - 183, 2379, - -2, 2518, - -1, 3512, - 97, 2379, - 183, 2379, - -2, 2519, - -1, 3513, - 97, 2379, - 183, 2379, - -2, 2520, - -1, 3514, - 97, 2379, - 183, 2379, - -2, 2521, - -1, 3516, - 97, 2347, - 183, 2347, - -2, 2683, - -1, 3517, - 97, 2318, - 183, 2318, - -2, 2668, - -1, 3518, - 97, 2377, - 183, 2377, - -2, 2637, - -1, 3519, - 97, 2377, - 183, 2377, - -2, 2667, - -1, 3520, - 97, 2377, - 183, 2377, - -2, 2452, - -1, 3521, - 97, 2375, - 183, 2375, - -2, 2657, - -1, 3522, - 96, 2298, - 97, 2298, - 172, 2298, - 173, 2298, - 175, 2298, - 183, 2298, - -2, 2416, - -1, 3523, - 96, 2299, - 97, 2299, - 172, 2299, - 173, 2299, - 175, 2299, - 183, 2299, - -2, 2418, - -1, 3524, - 96, 2300, - 97, 2300, - 172, 2300, - 173, 2300, - 175, 2300, - 183, 2300, - -2, 2713, - -1, 3525, - 96, 2302, - 97, 2302, - 172, 2302, - 173, 2302, - 175, 2302, - 183, 2302, - -2, 2638, - -1, 3526, - 96, 2304, - 97, 2304, - 172, 2304, - 173, 2304, - 175, 2304, - 183, 2304, - -2, 2616, - -1, 3527, - 96, 2306, - 97, 2306, - 172, 2306, - 173, 2306, - 175, 2306, - 183, 2306, - -2, 2546, - -1, 3528, - 96, 2308, - 97, 2308, - 172, 2308, - 173, 2308, - 175, 2308, - 183, 2308, - -2, 2501, - -1, 3529, - 96, 2309, - 97, 2309, - 172, 2309, - 173, 2309, - 175, 2309, - 183, 2309, - -2, 2502, - -1, 3530, - 96, 2311, - 97, 2311, - 172, 2311, - 173, 2311, - 175, 2311, - 183, 2311, - -2, 2415, - -1, 3531, - 97, 2382, - 172, 2382, - 173, 2382, - 175, 2382, - 183, 2382, - -2, 2459, - -1, 3532, - 97, 2382, - 172, 2382, - 173, 2382, - 175, 2382, - 183, 2382, - -2, 2476, - -1, 3533, - 97, 2385, - 172, 2385, - 173, 2385, - 175, 2385, - 183, 2385, - -2, 2453, - -1, 3534, - 97, 2385, - 172, 2385, - 173, 2385, - 175, 2385, - 183, 2385, - -2, 2566, + 96, 2221, + -2, 2718, + -1, 1131, + 96, 2222, + -2, 2681, + -1, 1132, + 96, 2223, + -2, 2707, + -1, 1143, + 96, 2093, + -2, 2907, + -1, 1144, + 96, 2094, + -2, 2908, + -1, 1145, + 96, 2095, + -2, 2909, + -1, 1276, + 138, 2456, + 149, 2456, + 182, 2456, + -2, 2411, + -1, 1426, + 30, 1055, + -2, 982, + -1, 1635, + 17, 1020, + 30, 1020, + -2, 1932, + -1, 1737, + 30, 1055, + -2, 982, + -1, 2077, + 52, 768, + 286, 768, + 313, 775, + 314, 775, + 554, 768, + -2, 808, + -1, 2190, + 96, 2281, + -2, 2689, + -1, 2191, + 96, 2282, + -2, 2690, + -1, 2501, + 17, 1020, + 30, 1020, + -2, 1201, + -1, 2997, + 97, 1296, + -2, 1302, + -1, 3016, + 121, 1531, + 169, 1531, + 217, 1531, + 220, 1531, + 326, 1531, + -2, 1524, + -1, 3019, + 44, 1567, + -2, 1515, -1, 3535, - 97, 2382, - 172, 2382, - 173, 2382, - 175, 2382, - 183, 2382, - -2, 2596, + 97, 2397, + 183, 2397, + -2, 2672, -1, 3536, - 97, 2355, - 183, 2355, - -2, 2480, - -1, 3537, - 97, 2356, - 183, 2356, - -2, 2581, + 97, 2397, + 183, 2397, + -2, 2671, -1, 3538, - 97, 2357, - 183, 2357, - -2, 2536, + 97, 2393, + 183, 2393, + -2, 2658, -1, 3539, - 97, 2358, - 183, 2358, - -2, 2582, + 97, 2349, + 183, 2349, + -2, 2663, -1, 3540, - 97, 2359, - 183, 2359, - -2, 2481, + 97, 2350, + 183, 2350, + -2, 2571, -1, 3541, - 97, 2360, - 183, 2360, - -2, 2553, + 97, 2351, + 183, 2351, + -2, 2564, -1, 3542, - 97, 2361, - 183, 2361, - -2, 2552, + 97, 2393, + 183, 2393, + -2, 2441, -1, 3543, - 97, 2362, - 183, 2362, - -2, 2554, + 97, 2353, + 183, 2353, + -2, 2660, -1, 3544, - 97, 2363, - 183, 2363, - -2, 2483, + 97, 2354, + 183, 2354, + -2, 2569, -1, 3545, - 97, 2364, - 183, 2364, - -2, 2482, + 97, 2355, + 183, 2355, + -2, 2563, -1, 3546, - 97, 2365, - 183, 2365, - -2, 2484, + 97, 2356, + 183, 2356, + -2, 2539, -1, 3547, - 97, 2366, - 183, 2366, - -2, 2485, + 97, 2397, + 183, 2397, + -2, 2540, -1, 3548, - 97, 2367, - 183, 2367, - -2, 2486, + 97, 2397, + 183, 2397, + -2, 2541, -1, 3549, - 97, 2368, - 183, 2368, - -2, 2487, + 97, 2397, + 183, 2397, + -2, 2542, -1, 3550, - 97, 2369, - 183, 2369, - -2, 2488, + 97, 2397, + 183, 2397, + -2, 2543, -1, 3551, - 97, 2370, - 183, 2370, - -2, 2489, + 97, 2397, + 183, 2397, + -2, 2544, -1, 3552, - 97, 2371, - 183, 2371, - -2, 2490, - -1, 3553, - 97, 2372, - 183, 2372, - -2, 2491, + 97, 2397, + 183, 2397, + -2, 2545, + -1, 3554, + 97, 2365, + 183, 2365, + -2, 2707, + -1, 3555, + 97, 2336, + 183, 2336, + -2, 2692, + -1, 3556, + 97, 2395, + 183, 2395, + -2, 2661, + -1, 3557, + 97, 2395, + 183, 2395, + -2, 2691, + -1, 3558, + 97, 2395, + 183, 2395, + -2, 2476, + -1, 3559, + 97, 2393, + 183, 2393, + -2, 2681, + -1, 3560, + 96, 2316, + 97, 2316, + 172, 2316, + 173, 2316, + 175, 2316, + 183, 2316, + -2, 2440, + -1, 3561, + 96, 2317, + 97, 2317, + 172, 2317, + 173, 2317, + 175, 2317, + 183, 2317, + -2, 2442, + -1, 3562, + 96, 2318, + 97, 2318, + 172, 2318, + 173, 2318, + 175, 2318, + 183, 2318, + -2, 2737, + -1, 3563, + 96, 2320, + 97, 2320, + 172, 2320, + 173, 2320, + 175, 2320, + 183, 2320, + -2, 2662, + -1, 3564, + 96, 2322, + 97, 2322, + 172, 2322, + 173, 2322, + 175, 2322, + 183, 2322, + -2, 2640, + -1, 3565, + 96, 2324, + 97, 2324, + 172, 2324, + 173, 2324, + 175, 2324, + 183, 2324, + -2, 2570, + -1, 3566, + 96, 2326, + 97, 2326, + 172, 2326, + 173, 2326, + 175, 2326, + 183, 2326, + -2, 2525, + -1, 3567, + 96, 2327, + 97, 2327, + 172, 2327, + 173, 2327, + 175, 2327, + 183, 2327, + -2, 2526, + -1, 3568, + 96, 2329, + 97, 2329, + 172, 2329, + 173, 2329, + 175, 2329, + 183, 2329, + -2, 2439, + -1, 3569, + 97, 2400, + 172, 2400, + 173, 2400, + 175, 2400, + 183, 2400, + -2, 2483, + -1, 3570, + 97, 2400, + 172, 2400, + 173, 2400, + 175, 2400, + 183, 2400, + -2, 2500, + -1, 3571, + 97, 2403, + 172, 2403, + 173, 2403, + 175, 2403, + 183, 2403, + -2, 2477, + -1, 3572, + 97, 2403, + 172, 2403, + 173, 2403, + 175, 2403, + 183, 2403, + -2, 2590, + -1, 3573, + 97, 2400, + 172, 2400, + 173, 2400, + 175, 2400, + 183, 2400, + -2, 2620, + -1, 3574, + 97, 2373, + 183, 2373, + -2, 2504, + -1, 3575, + 97, 2374, + 183, 2374, + -2, 2605, + -1, 3576, + 97, 2375, + 183, 2375, + -2, 2560, + -1, 3577, + 97, 2376, + 183, 2376, + -2, 2606, + -1, 3578, + 97, 2377, + 183, 2377, + -2, 2505, + -1, 3579, + 97, 2378, + 183, 2378, + -2, 2577, + -1, 3580, + 97, 2379, + 183, 2379, + -2, 2576, + -1, 3581, + 97, 2380, + 183, 2380, + -2, 2578, + -1, 3582, + 97, 2381, + 183, 2381, + -2, 2507, + -1, 3583, + 97, 2382, + 183, 2382, + -2, 2506, + -1, 3584, + 97, 2383, + 183, 2383, + -2, 2508, + -1, 3585, + 97, 2384, + 183, 2384, + -2, 2509, + -1, 3586, + 97, 2385, + 183, 2385, + -2, 2510, + -1, 3587, + 97, 2386, + 183, 2386, + -2, 2511, + -1, 3588, + 97, 2387, + 183, 2387, + -2, 2512, -1, 3589, - 121, 1513, - 169, 1513, - 217, 1513, - 220, 1513, - 326, 1513, - -2, 1507, - -1, 3605, - 44, 1550, - -2, 1552, - -1, 3606, - 44, 1551, - -2, 1553, - -1, 3639, - 93, 871, - 183, 871, - -2, 1775, - -1, 4165, - 220, 1513, - 350, 1876, - -2, 1840, - -1, 4221, - 17, 1016, - 30, 1016, - -2, 1914, - -1, 4413, - 44, 1549, - 121, 1513, - 169, 1513, - 217, 1513, - 220, 1513, - -2, 1706, - -1, 4422, - 121, 1513, - 169, 1513, - 217, 1513, - 220, 1513, - -2, 1706, - -1, 4440, - 93, 871, - 183, 871, - -2, 1775, - -1, 4473, - 220, 1513, - 350, 1876, - -2, 1841, - -1, 4684, - 121, 1513, - 169, 1513, - 217, 1513, - 220, 1513, - -2, 1707, - -1, 4728, - 97, 1633, - 183, 1633, - -2, 1513, - -1, 4949, - 102, 1206, - -2, 2400, - -1, 4955, - 97, 1633, - 183, 1633, - -2, 1513, - -1, 5240, - 97, 1637, - 183, 1637, - -2, 1513, - -1, 5312, - 97, 1638, - 183, 1638, - -2, 1513, + 97, 2388, + 183, 2388, + -2, 2513, + -1, 3590, + 97, 2389, + 183, 2389, + -2, 2514, + -1, 3591, + 97, 2390, + 183, 2390, + -2, 2515, + -1, 3628, + 121, 1531, + 169, 1531, + 217, 1531, + 220, 1531, + 326, 1531, + -2, 1525, + -1, 3644, + 44, 1568, + -2, 1570, + -1, 3645, + 44, 1569, + -2, 1571, + -1, 3678, + 93, 875, + 183, 875, + -2, 1793, + -1, 4207, + 220, 1531, + 350, 1894, + -2, 1858, + -1, 4263, + 17, 1020, + 30, 1020, + -2, 1932, + -1, 4457, + 44, 1567, + 121, 1531, + 169, 1531, + 217, 1531, + 220, 1531, + -2, 1724, + -1, 4466, + 121, 1531, + 169, 1531, + 217, 1531, + 220, 1531, + -2, 1724, + -1, 4484, + 93, 875, + 183, 875, + -2, 1793, + -1, 4517, + 220, 1531, + 350, 1894, + -2, 1859, + -1, 4729, + 121, 1531, + 169, 1531, + 217, 1531, + 220, 1531, + -2, 1725, + -1, 4773, + 97, 1651, + 183, 1651, + -2, 1531, + -1, 4999, + 102, 1210, + -2, 2424, + -1, 5005, + 97, 1651, + 183, 1651, + -2, 1531, + -1, 5290, + 97, 1655, + 183, 1655, + -2, 1531, + -1, 5362, + 97, 1656, + 183, 1656, + -2, 1531, } const yyPrivate = 57344 -const yyLast = 89990 +const yyLast = 90660 var yyAct = [...]int{ - 990, 5369, 5358, 965, 5422, 5388, 5354, 5361, 4946, 5337, - 264, 5406, 1992, 5378, 5353, 5250, 3690, 992, 5244, 4957, - 3823, 2141, 4514, 5188, 975, 5243, 4955, 4578, 5254, 3970, - 4195, 5112, 4176, 4022, 5177, 3206, 4268, 5019, 5255, 4763, - 1991, 4841, 4490, 1878, 4947, 3260, 3476, 3705, 4790, 4888, - 4024, 2979, 5036, 4573, 4269, 1652, 781, 2216, 4940, 4954, - 4266, 1497, 5078, 4958, 4388, 1895, 4673, 5189, 5191, 3708, - 3596, 1021, 4717, 1258, 803, 4918, 4586, 4524, 4396, 1504, - 3860, 2203, 3472, 4158, 1932, 4686, 820, 830, 4402, 840, - 2200, 4445, 840, 3074, 4163, 1894, 3416, 3391, 3642, 3390, - 251, 5, 4474, 4680, 3608, 4093, 1472, 1265, 3474, 4702, - 3597, 2144, 4348, 4092, 4074, 967, 4656, 1267, 171, 1468, - 3598, 4249, 3253, 3384, 2473, 2998, 2599, 3822, 4078, 4386, - 3824, 2596, 917, 3721, 249, 2443, 1896, 3789, 4160, 1451, - 4191, 4423, 4170, 3679, 3819, 3673, 3299, 2466, 3492, 1414, - 834, 16, 4218, 3484, 3677, 2648, 908, 3671, 2094, 2770, - 16, 3443, 4338, 2199, 3575, 3810, 4056, 4043, 957, 912, - 2222, 4054, 3201, 4169, 1871, 3088, 4095, 4094, 4105, 2002, - 3004, 958, 3019, 3007, 2337, 1175, 4090, 2999, 832, 38, - 3590, 1980, 1975, 1800, 2923, 1768, 1908, 1984, 38, 4002, - 238, 820, 1219, 962, 2813, 3233, 826, 2653, 2766, 3490, - 2922, 3212, 2592, 3563, 3557, 3298, 3176, 2765, 3696, 3075, - 2487, 3078, 3611, 2474, 3646, 2613, 3018, 892, 4, 2475, - 1798, 3053, 3645, 260, 7, 781, 2467, 2981, 1331, 835, - 32, 3002, 2406, 259, 6, 1965, 2996, 2217, 820, 32, - 3723, 2136, 2005, 1933, 1880, 2767, 3009, 1887, 1717, 2740, - 3006, 966, 802, 2809, 264, 1856, 264, 1850, 1321, 1322, - 2971, 956, 1842, 2210, 2925, 2449, 820, 2433, 2178, 976, - 2127, 1997, 1649, 1449, 2974, 1249, 26, 1432, 1252, 2093, - 2015, 958, 2670, 905, 1940, 2397, 836, 44, 245, 1812, - 1486, 1817, 1274, 2401, 1852, 1251, 44, 2135, 1805, 1855, - 1139, 2405, 1454, 1218, 1140, 1743, 1840, 2427, 1801, 1138, - 244, 1136, 2223, 1507, 914, 250, 1482, 915, 1508, 3177, - 1141, 821, 86, 5338, 237, 1216, 54, 42, 1300, 1799, - 911, 78, 1198, 1211, 780, 877, 2745, 154, 81, 5, - 839, 29, 87, 80, 27, 28, 19, 10, 1269, 5063, - 2479, 1653, 1576, 76, 1577, 1575, 1576, 1135, 1577, 1575, - 1318, 1576, 964, 1577, 1575, 4914, 4282, 3440, 3440, 4013, - 3440, 4443, 831, 17, 2454, 2458, 2459, 2460, 2455, 2465, - 2456, 2462, 17, 4130, 2457, 4012, 2463, 3875, 1317, 16, - 1319, 833, 15, 2365, 3874, 2782, 1744, 1415, 4636, 4405, - 1416, 15, 812, 4261, 16, 3332, 16, 3239, 3237, 810, - 3236, 3234, 1745, 2354, 1947, 806, 807, 1943, 1314, 1313, - 248, 808, 3417, 4833, 4139, 3385, 2886, 38, 2997, 4446, - 1271, 809, 844, 3261, 805, 2921, 1415, 1738, 3252, 1464, - 1465, 1466, 38, 1854, 38, 1695, 5166, 1463, 2454, 2458, - 2459, 2460, 2455, 2465, 2456, 2462, 2695, 2140, 2457, 2006, - 2463, 1462, 3644, 5090, 4287, 2729, 3694, 1312, 1912, 2733, - 1314, 2734, 7, 1828, 1314, 1772, 4421, 2696, 32, 1603, - 3207, 1609, 6, 4014, 2927, 4620, 2011, 4010, 3178, 2937, - 2361, 1747, 3988, 32, 1132, 32, 3985, 1606, 1608, 1602, - 5349, 1607, 1589, 1588, 1598, 1599, 1600, 1601, 1591, 1592, - 1593, 1594, 1595, 1596, 1597, 1590, 1524, 9, 1604, 2348, - 2917, 1354, 1726, 1945, 4571, 3855, 2454, 2458, 2459, 2460, - 2455, 2465, 2456, 2462, 2833, 44, 2457, 3853, 2463, 3995, - 3993, 2658, 1264, 4755, 1960, 963, 1603, 1262, 1609, 3986, - 44, 3983, 44, 5252, 5251, 1162, 4275, 1159, 1263, 1266, - 5031, 4849, 4842, 4574, 1606, 1608, 1602, 4267, 1607, 1589, - 1588, 1598, 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1590, 5194, 3997, 1604, 2454, 2458, 2459, 2460, - 2455, 2465, 2456, 2462, 1076, 3001, 2457, 1576, 2463, 1577, - 1575, 2446, 1137, 2345, 1132, 2454, 2458, 2459, 2460, 2455, - 2465, 2456, 2462, 1647, 3948, 2457, 4041, 2463, 3152, 2677, - 2722, 17, 1576, 3117, 1577, 1575, 5393, 5046, 5345, 4625, - 4860, 2067, 4857, 5043, 1150, 2009, 17, 4900, 17, 4377, - 15, 3365, 2944, 4623, 1455, 5124, 1909, 1753, 1751, 1750, - 4372, 4044, 2961, 2201, 2202, 15, 2008, 15, 1372, 1373, - 1334, 1163, 1160, 1460, 1276, 1461, 3943, 910, 2548, 1794, - 5104, 946, 3817, 2975, 948, 2780, 3197, 1572, 1354, 947, - 2374, 1362, 1366, 1368, 1370, 1375, 2372, 1380, 1376, 1377, - 1378, 1379, 3829, 3830, 1357, 1358, 1359, 1360, 1332, 1333, - 1363, 2587, 1335, 3859, 1336, 1338, 1339, 1340, 1341, 1337, - 1342, 1343, 1344, 1345, 1346, 1353, 1355, 1347, 1348, 1349, - 1350, 1351, 1352, 1381, 1382, 1383, 1384, 1385, 1386, 1387, - 1388, 1390, 1389, 1391, 1392, 1393, 1394, 1395, 1396, 1397, - 1398, 1365, 1367, 1369, 1371, 1374, 1151, 3198, 2609, 2576, - 2577, 3987, 946, 3984, 4902, 948, 2085, 1760, 1157, 946, - 947, 3828, 948, 3184, 2575, 1459, 3183, 947, 3158, 3185, - 2379, 2380, 3157, 201, 246, 200, 233, 202, 3311, 3310, - 1494, 1163, 1356, 1160, 4180, 5310, 1946, 1944, 1552, 4455, - 1123, 1553, 1122, 1124, 1125, 820, 1126, 1127, 3559, 4021, - 1520, 1505, 1506, 1521, 2128, 820, 2258, 2132, 3560, 1857, - 820, 1859, 1418, 3254, 901, 1372, 1373, 1334, 2143, 1555, - 2563, 1503, 3998, 4178, 2109, 1502, 1505, 1506, 5258, 5259, - 1565, 2131, 840, 840, 1446, 5198, 820, 820, 1362, 1366, - 1368, 1370, 1375, 2461, 1380, 1376, 1377, 1378, 1379, 239, - 1570, 1357, 1358, 1359, 1360, 1332, 1333, 1363, 3558, 1335, - 1324, 1336, 1338, 1339, 1340, 1341, 1337, 1342, 1343, 1344, - 1345, 1346, 1353, 1355, 1347, 1348, 1349, 1350, 1351, 1352, - 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1390, 1389, - 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1365, 1367, - 1369, 1371, 1374, 1161, 1523, 1158, 201, 246, 200, 233, - 202, 1409, 2083, 1261, 5198, 5294, 1260, 2461, 1237, 5197, - 3040, 1408, 2459, 2460, 5196, 3471, 2893, 2064, 1501, 3467, - 1498, 5195, 1498, 5197, 5293, 5288, 4868, 1269, 5034, 1356, - 1410, 3861, 1737, 1835, 1550, 5210, 820, 5196, 5292, 5195, - 5291, 5179, 2364, 5182, 5062, 1474, 4859, 5340, 5341, 4845, - 2133, 5037, 5038, 5039, 5040, 1622, 1471, 3862, 4270, 3863, - 4913, 1615, 4294, 3905, 1480, 3439, 1416, 2781, 3996, 2147, - 2375, 1490, 239, 4627, 2130, 4270, 2373, 3283, 1416, 5179, - 1510, 1511, 1913, 1513, 1514, 2461, 1838, 1516, 3866, 1829, - 3469, 5074, 1416, 1773, 3464, 1419, 1551, 2784, 3743, 2593, - 3171, 4291, 2697, 1418, 1492, 2583, 3876, 1154, 2123, 1271, - 3873, 1422, 1426, 4070, 1429, 2818, 2744, 5257, 4387, 4015, - 2928, 2776, 1428, 3566, 1435, 1438, 4665, 247, 3160, 201, - 246, 1416, 2969, 4394, 3602, 201, 246, 200, 233, 202, - 2607, 2608, 3901, 3811, 1314, 2461, 2084, 2704, 1314, 1314, - 817, 1314, 4904, 4905, 3481, 1568, 1569, 4503, 1314, 1532, - 1314, 4715, 5212, 3324, 2461, 2464, 4624, 1269, 2062, 3899, - 2783, 3468, 3433, 4068, 4142, 3465, 1563, 1564, 1554, 1567, - 3604, 230, 1155, 1204, 1230, 1228, 4699, 1229, 1545, 3115, - 1522, 1547, 1540, 3802, 2129, 1439, 1440, 1779, 5023, 4572, - 3261, 3151, 1364, 3154, 3854, 3595, 3162, 1264, 4867, 2546, - 4910, 239, 1407, 4662, 3153, 1233, 4869, 4621, 1656, 1548, - 4075, 1777, 4064, 1263, 2147, 1605, 2062, 4065, 4066, 4421, - 2146, 2145, 3163, 3164, 1740, 1742, 5085, 1746, 1411, 2464, - 5086, 5089, 5088, 4067, 4076, 1745, 3442, 3174, 1745, 1271, - 1488, 1489, 812, 1764, 1562, 3599, 801, 1767, 2058, 810, - 247, 2586, 4533, 1156, 1776, 806, 807, 4988, 4858, 4182, - 2010, 808, 1444, 1445, 4193, 4194, 1483, 1487, 1487, 1487, - 4192, 809, 3235, 1515, 4389, 3994, 1518, 1519, 1238, 5066, - 2683, 1928, 1605, 820, 820, 820, 1752, 1749, 1219, 4529, - 4891, 1525, 1526, 1483, 1483, 1509, 1827, 1948, 1512, 4690, - 4637, 820, 1137, 1834, 1529, 3470, 1841, 2464, 4411, 3466, - 820, 1456, 4255, 1712, 781, 781, 1716, 1505, 1506, 4089, - 1531, 3562, 4106, 4626, 781, 781, 1715, 1623, 1882, 1882, - 1234, 820, 2547, 4951, 1541, 5108, 1329, 949, 950, 951, - 952, 953, 5092, 4062, 4903, 3612, 4930, 1719, 4352, 1364, - 4354, 2983, 1425, 1427, 1437, 1436, 1505, 1506, 838, 1164, - 1543, 840, 1493, 803, 1778, 842, 4076, 2464, 1417, 1936, - 841, 3815, 1884, 1546, 1549, 2146, 2145, 4184, 2977, 4185, - 4187, 4186, 4509, 247, 4003, 264, 2464, 5079, 3605, 247, - 1759, 4515, 1236, 5137, 781, 2956, 1542, 1153, 5113, 1557, - 4177, 3710, 1558, 4629, 4630, 4631, 2792, 2794, 2795, 4188, - 4522, 4366, 1617, 1618, 1619, 1620, 1621, 1481, 949, 950, - 951, 952, 953, 4897, 79, 949, 950, 951, 952, 953, - 1560, 4645, 2153, 2157, 2158, 4363, 1836, 2788, 2790, 2791, - 1889, 4034, 3150, 2154, 1770, 1771, 4535, 4534, 1774, 1905, - 1906, 5073, 1782, 1784, 1785, 1786, 1787, 4751, 1789, 5416, - 3706, 3707, 1793, 3710, 1839, 1668, 1669, 3128, 3607, 2461, - 1988, 3601, 4197, 4076, 1203, 1993, 3127, 1139, 1544, 4365, - 4589, 3170, 2155, 1442, 1479, 1207, 2007, 1208, 3148, 3149, - 4071, 838, 3572, 1329, 201, 246, 200, 233, 202, 2594, - 1876, 1877, 2078, 2059, 3565, 201, 246, 200, 233, 202, - 1722, 4198, 2033, 4740, 1723, 902, 5211, 1264, 1232, 3812, - 3902, 2063, 1710, 4952, 1867, 1816, 4746, 2065, 1866, 2062, - 4906, 2036, 1720, 1263, 1530, 16, 4931, 4183, 1711, 1478, - 3081, 1748, 2776, 1496, 1495, 2000, 3773, 1882, 1477, 3744, - 5114, 3745, 3746, 1841, 4919, 1556, 5242, 79, 830, 3569, - 3570, 1430, 4666, 4085, 4159, 2584, 4317, 2003, 2124, 1657, - 239, 5192, 829, 38, 3568, 4960, 3435, 3118, 1806, 2108, - 5054, 828, 5055, 4424, 3073, 1996, 1841, 4569, 1769, 2066, - 910, 2117, 2117, 1498, 1841, 1561, 1841, 1841, 1781, 3098, - 5176, 1853, 1861, 1863, 3055, 3057, 4063, 1882, 1755, 1882, - 1418, 904, 1874, 1875, 903, 1998, 1610, 1559, 4349, 1537, - 1804, 1977, 1978, 1811, 32, 1925, 1807, 1808, 5381, 1231, - 838, 4222, 1892, 1783, 1226, 1899, 1893, 4193, 4194, 1983, - 4432, 1227, 1987, 4202, 1865, 2079, 1955, 1986, 1757, 4449, - 2070, 2073, 2074, 2077, 1890, 3320, 3189, 1898, 1966, 3090, - 1612, 1611, 2112, 3156, 2041, 3073, 3092, 2099, 2091, 2092, - 3113, 2926, 1266, 1907, 2773, 2582, 1979, 2570, 812, 5056, - 1994, 44, 1949, 1882, 2107, 2101, 2102, 2110, 2111, 1766, - 3606, 3213, 3214, 1788, 3453, 4196, 79, 4547, 2982, 3609, - 2019, 1418, 2220, 2793, 2023, 2024, 1780, 2114, 1937, 3080, - 1938, 1923, 4238, 4224, 3082, 2957, 3904, 1615, 2271, 1919, - 4086, 1792, 5052, 3091, 1536, 2261, 2262, 2263, 1791, 2156, - 1790, 5054, 804, 5055, 2789, 1239, 4959, 846, 2277, 2001, - 845, 2278, 3796, 4380, 2113, 2785, 2786, 2252, 2253, 5048, - 3090, 2257, 2120, 2045, 4754, 1169, 3073, 3092, 247, 2272, - 4189, 3084, 2299, 2300, 824, 825, 5241, 17, 3083, 247, - 2562, 4297, 2279, 1206, 2281, 2356, 2282, 2283, 2284, 2056, - 815, 2021, 816, 4295, 5382, 1193, 15, 2025, 2119, 1220, - 3087, 3741, 2332, 2810, 2031, 4747, 4748, 4339, 4742, 1192, - 4449, 2089, 4741, 2289, 2291, 2290, 1418, 3056, 2552, 2550, - 2050, 201, 246, 2551, 3091, 1982, 3281, 2139, 2366, 1173, - 1139, 2561, 2369, 1269, 1171, 1170, 4281, 820, 820, 820, - 5056, 3774, 3776, 3777, 3778, 3775, 2384, 2386, 1815, 2387, - 3461, 2390, 2391, 3097, 2948, 2394, 2051, 3095, 803, 2398, - 2049, 2047, 2343, 2402, 2159, 1882, 2408, 2409, 1754, 2411, - 1841, 2089, 2100, 2089, 820, 2048, 2039, 1882, 2044, 2038, - 2043, 2037, 1763, 820, 2090, 2106, 1483, 2382, 2335, 2255, - 2095, 1219, 2097, 2098, 2444, 2121, 2122, 239, 2333, 2096, - 1487, 2288, 2469, 2469, 1827, 2469, 2042, 2105, 1769, 2480, - 2481, 820, 820, 1487, 2545, 1271, 4433, 1844, 2402, 2556, - 3880, 2338, 2080, 2081, 4356, 2040, 1172, 1882, 2567, 2568, - 2116, 2118, 2342, 1827, 3085, 781, 902, 201, 246, 2383, - 2134, 1981, 2357, 5379, 5380, 2138, 1176, 2204, 4280, 781, - 246, 1882, 2950, 2949, 201, 246, 200, 233, 202, 1222, - 1223, 1224, 2180, 3454, 4009, 1963, 2947, 1958, 1964, 1961, - 1962, 1756, 1758, 5049, 1761, 1762, 2497, 5190, 2711, 2708, - 2362, 2014, 1967, 1968, 1969, 1970, 1971, 1972, 3604, 2381, - 1165, 2625, 2627, 3140, 1166, 820, 2402, 1882, 2499, 2634, - 1275, 820, 908, 908, 4703, 2398, 4190, 5022, 2641, 838, - 2643, 2644, 2645, 239, 2716, 2717, 2649, 5418, 201, 246, - 838, 2020, 1269, 264, 2086, 239, 264, 264, 2412, 264, - 239, 4245, 904, 1240, 3640, 903, 1845, 2410, 2437, 1286, - 5463, 1235, 2017, 2854, 2358, 5186, 2554, 2853, 2392, 2393, - 2471, 2016, 2477, 2176, 2177, 2399, 2400, 2572, 2346, 2194, - 2195, 2270, 5462, 2198, 5164, 2610, 2413, 2414, 2415, 2434, - 201, 246, 2426, 2285, 2286, 79, 2647, 2341, 1574, 2344, - 3619, 2615, 2616, 2973, 2137, 247, 79, 1843, 2602, 2603, - 2692, 4244, 1473, 2703, 2436, 2062, 2142, 2685, 201, 246, - 2017, 2017, 1473, 2017, 1271, 246, 1264, 201, 246, 2016, - 2016, 2334, 2016, 4240, 1537, 2336, 2579, 2588, 2581, 2089, - 2396, 2689, 1263, 5447, 5049, 2667, 1574, 781, 5050, 2600, - 2601, 2089, 4661, 1574, 2630, 2355, 5445, 2359, 2910, 820, - 2636, 2444, 2363, 820, 2558, 1268, 2691, 4414, 1574, 4277, - 2726, 1268, 2728, 3487, 1844, 1901, 2732, 2657, 4116, 2595, - 2660, 2661, 2571, 2663, 2737, 2738, 2739, 2633, 2772, 2743, - 1574, 1841, 2681, 16, 239, 2425, 16, 16, 2611, 16, - 239, 2089, 2435, 239, 3764, 3765, 3179, 2218, 5453, 3488, - 3489, 5437, 3641, 2559, 5433, 5429, 2439, 2440, 2428, 2445, - 1841, 247, 2432, 2428, 2441, 2089, 892, 1882, 2769, 1574, - 902, 38, 4335, 247, 38, 38, 2972, 38, 247, 1473, - 2126, 2553, 1574, 2573, 2164, 2165, 2166, 2167, 2168, 2169, - 2170, 2171, 2172, 2173, 2174, 2175, 2557, 2698, 2565, 2032, - 2753, 5403, 201, 246, 2196, 2197, 1169, 4293, 4129, 4245, - 2578, 2089, 2580, 2674, 2589, 2029, 2030, 2727, 3112, 3048, - 2730, 2731, 32, 3048, 2735, 32, 32, 5431, 32, 1576, - 2221, 1577, 1575, 1845, 2797, 2256, 2720, 5103, 2747, 2748, - 5430, 5430, 247, 2772, 201, 246, 2620, 5400, 2750, 2751, - 2619, 2736, 2350, 1275, 2646, 2637, 2638, 5397, 2280, 2631, - 2639, 2705, 2706, 2624, 2632, 2755, 904, 3319, 2618, 903, - 1168, 1713, 1802, 2712, 2654, 1171, 1170, 1574, 239, 44, - 5395, 5390, 44, 44, 1843, 44, 3763, 5404, 3940, 3048, - 1999, 1537, 2407, 1576, 247, 1577, 1575, 2682, 3641, 2686, - 2758, 4205, 4203, 5375, 2421, 3978, 2760, 2672, 2762, 3579, - 3585, 3586, 3587, 3580, 3584, 3581, 3583, 3582, 2763, 4151, - 239, 2017, 247, 2687, 4148, 4050, 5329, 2125, 247, 2243, - 2016, 247, 1576, 5401, 1577, 1575, 4245, 5314, 1537, 2690, - 1269, 5274, 5273, 5398, 5272, 2864, 3975, 2709, 2867, 2707, - 2869, 2901, 2752, 2710, 2566, 2713, 2899, 2876, 1144, 1145, - 1146, 1147, 1308, 1309, 1310, 17, 2778, 5391, 17, 17, - 2889, 17, 2715, 1576, 4047, 1577, 1575, 1142, 1576, 4001, - 1577, 1575, 2719, 1576, 15, 1577, 1575, 15, 15, 5315, - 15, 3979, 1144, 1145, 1146, 1147, 2772, 1307, 2929, 2930, - 1304, 2932, 2933, 3625, 3436, 2936, 3319, 1534, 1167, 5267, - 2742, 1142, 5330, 820, 1841, 820, 1841, 5260, 1535, 838, - 2746, 2089, 1271, 5315, 2137, 2647, 2951, 5275, 1574, 1868, - 1574, 3258, 3976, 2958, 2959, 5238, 957, 2902, 2771, 5138, - 820, 820, 2900, 1904, 3200, 2970, 2764, 2816, 1713, 2574, - 5135, 3081, 3084, 2759, 820, 820, 820, 3067, 2892, 2894, - 2895, 2896, 2920, 2898, 2749, 2775, 247, 2907, 2906, 2908, - 2756, 2863, 1576, 2757, 1577, 1575, 5102, 3005, 3005, 3011, - 2796, 1487, 2909, 3081, 3084, 79, 3020, 1827, 1827, 1827, - 1827, 1827, 1827, 1827, 1827, 2778, 5096, 2862, 1535, 2811, - 2861, 2798, 2180, 2828, 2830, 2718, 2803, 2180, 247, 2469, - 4764, 4765, 4766, 4770, 4768, 4769, 4771, 4772, 4773, 4774, - 4767, 5239, 4979, 2820, 2827, 2778, 4978, 1148, 1469, 5013, - 2292, 3939, 1470, 2295, 2296, 2297, 2828, 3104, 2301, 2302, - 2303, 2304, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, - 2315, 2316, 2317, 2318, 2319, 1576, 2239, 1577, 1575, 2771, - 3059, 1148, 5103, 2236, 3296, 4975, 2605, 2238, 2235, 2237, - 2241, 2242, 2941, 2569, 2943, 2240, 1576, 4974, 1577, 1575, - 4973, 1810, 1574, 201, 246, 200, 233, 202, 1301, 1302, - 1303, 1306, 1174, 1305, 4972, 1269, 2799, 2800, 4971, 2207, - 4827, 2804, 2805, 1576, 1882, 1577, 1575, 4449, 2778, 4953, - 820, 2117, 2778, 3111, 2826, 3085, 1576, 4916, 1577, 1575, - 3080, 3073, 3079, 4443, 3076, 3082, 4885, 1576, 4882, 1577, - 1575, 781, 781, 4722, 4721, 3669, 3068, 4436, 3936, 1418, - 3845, 2912, 2913, 3643, 3624, 1882, 820, 3085, 3449, 1139, - 1424, 2828, 3080, 3073, 3079, 3322, 3076, 3082, 3008, 239, - 3321, 4647, 3412, 2828, 201, 246, 2828, 2065, 2915, 3208, - 3209, 3282, 2965, 4646, 2931, 2905, 820, 1271, 2935, 3083, - 2828, 803, 4542, 4393, 2828, 3168, 2824, 2849, 1936, 2832, - 2761, 3224, 2714, 3226, 4825, 4471, 264, 4470, 4466, 2652, - 2990, 2360, 2666, 2828, 3070, 3072, 3071, 2962, 3093, 3094, - 4460, 3083, 1574, 4457, 3016, 1275, 3021, 4430, 4328, 4723, - 3016, 3219, 3155, 2246, 2247, 2248, 2249, 2250, 2251, 2244, - 2245, 4324, 3005, 3005, 3267, 1144, 1145, 1146, 1147, 4213, - 239, 3278, 4111, 3927, 2012, 3047, 3871, 4151, 1631, 1441, - 1404, 3186, 1399, 3187, 1656, 3288, 3869, 3012, 3013, 4148, - 2815, 2814, 3629, 3627, 2989, 3077, 3621, 3410, 2062, 2994, - 3294, 3397, 3192, 3193, 3297, 3300, 2435, 2435, 3041, 3389, - 3302, 2801, 2802, 4471, 4467, 1882, 2806, 2807, 3180, 3022, - 3023, 3024, 3025, 3026, 3027, 3028, 4151, 3077, 4540, 4148, - 3361, 3362, 3316, 1574, 4329, 2769, 3046, 3355, 3334, 1953, - 1952, 3291, 1882, 1484, 1882, 3211, 2604, 4325, 1590, 1418, - 4134, 3249, 3247, 3066, 3245, 4214, 3243, 3333, 3622, 1574, - 3229, 3896, 3628, 5093, 1380, 1376, 1377, 1378, 1379, 3049, - 3015, 3360, 3622, 3359, 3358, 3356, 16, 247, 3630, 3628, - 1269, 2911, 3622, 1574, 2872, 3262, 2871, 1574, 2204, 2852, - 2843, 3354, 2842, 2841, 2829, 1574, 2777, 2104, 1882, 1418, - 2559, 1612, 1611, 3368, 2026, 2388, 3169, 3175, 4107, 5094, - 3181, 4595, 4564, 5419, 38, 4704, 3369, 4932, 3293, 1872, - 3377, 5405, 3295, 3910, 1574, 1882, 3307, 3016, 4427, 3195, - 1873, 4425, 3312, 3196, 1148, 1517, 3306, 3250, 3248, 3199, - 3244, 3363, 3244, 3008, 2389, 1870, 3313, 3314, 1610, 1861, - 1863, 1610, 5402, 1435, 1438, 3048, 3016, 3234, 247, 3357, - 5399, 4705, 1271, 5344, 3413, 32, 1485, 2910, 3378, 2564, - 1574, 3223, 1574, 3216, 4428, 1574, 1574, 4426, 1574, 1574, - 2828, 3303, 2778, 3317, 3284, 3285, 5064, 3286, 3287, 2655, - 2027, 4108, 1612, 1611, 1429, 1612, 1611, 1469, 3444, 3446, - 1469, 1470, 3887, 3263, 1470, 3451, 2260, 2259, 3455, 4933, - 3255, 5005, 2260, 2259, 5004, 820, 820, 820, 4915, 2075, - 3266, 3276, 44, 3265, 1439, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1590, 4853, 3256, 1418, 3554, 4109, 3259, 4594, - 1469, 3392, 3383, 1882, 1470, 3387, 1841, 3398, 959, 4823, - 3290, 1869, 4788, 1841, 2556, 4934, 4744, 3348, 4743, 3351, - 3386, 3325, 4669, 3005, 3330, 3415, 3393, 2071, 3419, 3305, - 3421, 3422, 3304, 3366, 4437, 3429, 1593, 1594, 1595, 1596, - 1597, 1590, 4404, 2191, 4246, 4236, 3343, 3636, 3639, 4227, - 3318, 5231, 4215, 3323, 4153, 4150, 2089, 4080, 2089, 2188, - 2190, 2187, 3805, 2189, 3804, 3631, 3626, 3430, 17, 4259, - 3577, 3617, 1421, 1423, 3441, 3331, 3289, 3191, 838, 1827, - 2934, 1827, 2701, 2700, 2305, 3494, 2699, 15, 3632, 3633, - 2298, 3675, 3681, 3335, 3336, 3353, 2022, 3591, 3338, 3339, - 1469, 1418, 2076, 2018, 1470, 1657, 3364, 1796, 1795, 3613, - 3700, 1420, 1576, 3315, 1577, 1575, 3345, 3228, 3711, 1418, - 4446, 3713, 3714, 3715, 1418, 1418, 1418, 2117, 5230, 5098, - 1418, 3726, 4026, 3727, 3728, 2211, 3729, 2821, 3731, 3732, - 2186, 3594, 1802, 4023, 79, 5, 3479, 2211, 1469, 3726, - 2072, 1803, 1470, 1437, 1436, 3846, 2183, 2185, 2182, 5290, - 2184, 2497, 2469, 1576, 3573, 1577, 1575, 1576, 4758, 1577, - 1575, 3592, 4026, 1941, 4262, 2655, 3786, 4941, 3238, 1576, - 5279, 1577, 1575, 2499, 4884, 1803, 3684, 2429, 4260, 1576, - 4883, 1577, 1575, 781, 1575, 16, 1882, 3428, 1882, 1576, - 4733, 1577, 1575, 1577, 1575, 2556, 3692, 4757, 3347, 1418, - 1418, 3341, 4023, 3342, 2426, 1576, 4112, 1577, 1575, 1576, - 1882, 1577, 1575, 1941, 3431, 3432, 1803, 3733, 3230, 3716, - 3826, 3730, 3703, 38, 1576, 3701, 1577, 1575, 3376, 3806, - 4732, 820, 1633, 2993, 3576, 3571, 1418, 5157, 5158, 3842, - 4025, 5266, 3600, 1827, 3616, 1632, 1576, 2089, 1577, 1575, - 3929, 264, 2845, 3791, 3615, 1942, 264, 3202, 3203, 2137, - 1315, 1316, 5226, 3635, 3638, 1320, 5155, 5156, 7, 3808, - 5161, 3651, 3652, 5160, 32, 3328, 3649, 3650, 6, 5415, - 3634, 5159, 1936, 5317, 5009, 5010, 3555, 3556, 4670, 4671, - 4663, 3424, 3661, 3425, 3699, 3270, 3867, 3666, 3667, 3668, - 3662, 3603, 5154, 3878, 3663, 3269, 2275, 3683, 3686, 3797, - 1576, 5153, 1577, 1575, 3695, 3928, 3698, 3300, 3697, 3697, - 3702, 2276, 3914, 3697, 2844, 2218, 3494, 1576, 5152, 1577, - 1575, 44, 3827, 3719, 5151, 1576, 2825, 1577, 1575, 2004, - 1882, 4397, 1576, 3898, 1577, 1575, 5414, 3843, 2823, 3110, - 4391, 1576, 4664, 1577, 1575, 3116, 5150, 3813, 3119, 3120, - 3121, 3122, 3123, 3124, 3125, 3126, 3868, 3844, 3129, 3130, - 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139, 5149, - 3141, 3142, 3143, 3144, 3145, 3847, 3146, 5147, 3760, 3747, - 3851, 5146, 5145, 5144, 3800, 5143, 5247, 5142, 5140, 5139, - 3785, 16, 1576, 3809, 1577, 1575, 16, 5095, 3473, 4982, - 3783, 3165, 4392, 3167, 3372, 4963, 1576, 17, 1577, 1575, - 3881, 3781, 3883, 1576, 3834, 1577, 1575, 3831, 1576, 5371, - 1577, 1575, 3379, 3888, 3882, 3972, 15, 3885, 3886, 38, - 3890, 3891, 2204, 3840, 38, 3841, 3836, 1581, 1582, 1583, - 1584, 1585, 1586, 1587, 1579, 3892, 3770, 2836, 3849, 3848, - 2407, 3495, 3784, 4007, 2089, 4935, 3991, 5121, 4909, 5372, - 4011, 3803, 3782, 4876, 4881, 4016, 4843, 820, 1841, 4753, - 4707, 4706, 3889, 3780, 4516, 4429, 4028, 4030, 4031, 4033, - 32, 4035, 4036, 3932, 1576, 32, 1577, 1575, 4390, 4373, - 1576, 3835, 1577, 1575, 3944, 3900, 3946, 1418, 3949, 3950, - 3895, 4069, 3879, 3951, 3952, 3953, 3954, 3955, 3769, 3956, - 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3858, 3965, 3966, - 3967, 3968, 3884, 3857, 3973, 3794, 5370, 3977, 4609, 3980, - 3981, 3768, 3767, 3766, 4607, 3758, 3752, 44, 3894, 3751, - 3750, 4598, 44, 5412, 3749, 3748, 1576, 3864, 1577, 1575, - 3926, 3908, 3437, 3907, 3909, 1576, 4403, 1577, 1575, 1273, - 77, 1576, 3920, 1577, 1575, 3292, 3251, 3188, 1576, 77, - 1577, 1575, 4058, 4060, 2919, 3712, 3922, 3923, 993, 1003, - 2723, 3717, 3718, 4073, 2089, 2676, 3722, 2675, 994, 820, - 995, 999, 1002, 998, 996, 997, 4051, 2673, 2669, 2668, - 4597, 2622, 2371, 2368, 4088, 2013, 1418, 1736, 4055, 5394, - 820, 1402, 820, 2556, 3919, 5392, 3921, 4000, 1418, 4907, - 4908, 1418, 5373, 17, 4579, 5342, 4019, 1576, 17, 1577, - 1575, 4596, 5308, 3005, 5298, 4120, 3005, 4110, 5237, 4123, - 4513, 4124, 15, 5207, 4313, 4005, 837, 15, 5205, 4004, - 4303, 1827, 3020, 4889, 4133, 3050, 1000, 5174, 1576, 5076, - 1577, 1575, 4674, 5070, 3982, 3825, 3825, 1576, 5061, 1577, - 1575, 1576, 1401, 1577, 1575, 4084, 3941, 1576, 4096, 1577, - 1575, 1076, 5059, 3675, 5041, 3591, 5032, 1001, 3934, 3681, - 4126, 1576, 4997, 1577, 1575, 4996, 4987, 4986, 3990, 4077, - 3104, 4962, 3495, 1576, 1418, 1577, 1575, 4167, 4961, 4167, - 4171, 3273, 4171, 4171, 3275, 1576, 3933, 1577, 1575, 3274, - 3989, 1864, 1977, 1978, 1269, 4912, 4896, 5456, 1418, 1133, - 4894, 4880, 4844, 4737, 1983, 3930, 4736, 1987, 4735, 4061, - 3594, 4206, 1986, 1576, 3411, 1577, 1575, 4678, 4667, 5455, - 1882, 1882, 4087, 4652, 4651, 4649, 4199, 2338, 4642, 4119, - 1966, 4640, 1576, 4122, 1577, 1575, 4619, 4618, 4617, 4613, - 4612, 1576, 3409, 1577, 1575, 4131, 4583, 1979, 1598, 1599, - 1600, 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, - 4083, 4581, 4577, 4207, 4208, 4165, 4179, 4181, 820, 1576, - 4575, 1577, 1575, 4553, 4102, 4550, 1271, 4104, 77, 4164, - 3561, 4101, 4058, 4118, 4544, 4115, 3008, 4113, 1882, 4121, - 2426, 3790, 4385, 77, 4375, 77, 4358, 4128, 1841, 4340, - 3408, 2556, 2556, 4201, 4132, 5438, 4311, 4308, 5386, 1133, - 4149, 3406, 4276, 4152, 4234, 4233, 5384, 4230, 4229, 4166, - 3405, 4168, 4216, 4211, 3404, 5232, 3368, 1576, 4210, 1577, - 1575, 4231, 4147, 4081, 4263, 4200, 4045, 4037, 1576, 4027, - 1577, 1575, 4154, 4156, 3072, 3071, 4017, 1576, 4008, 1577, - 1575, 1576, 4006, 1577, 1575, 4172, 4173, 1589, 1588, 1598, - 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, - 1590, 2924, 3403, 3906, 3603, 4204, 3903, 5116, 3877, 4174, - 3856, 3833, 3402, 3798, 3913, 820, 3795, 5042, 3792, 2856, - 3917, 3918, 4220, 3779, 3771, 3761, 3759, 3755, 4117, 1576, - 3754, 1577, 1575, 3401, 3753, 3655, 4301, 4212, 4886, 1576, - 4243, 1577, 1575, 4247, 3480, 3462, 3450, 4304, 3438, 1578, - 3400, 3268, 3739, 3740, 3399, 1076, 1075, 1614, 3257, 5134, - 1576, 3217, 1577, 1575, 2952, 2939, 2938, 1625, 3756, 3757, - 4217, 2787, 2680, 4048, 2679, 4241, 4242, 1576, 4226, 1577, - 1575, 1576, 4225, 1577, 1575, 4232, 4239, 2671, 4228, 4235, - 2404, 2370, 4155, 1635, 2367, 2353, 4273, 2352, 2115, 4283, - 3396, 3801, 4285, 4286, 3395, 5132, 4279, 3807, 3394, 4288, - 1664, 1660, 1659, 4875, 4284, 1406, 3388, 1152, 4874, 5367, - 3444, 4343, 4862, 5365, 3373, 3444, 4345, 1576, 2649, 1577, - 1575, 1576, 4856, 1577, 1575, 1576, 4650, 1577, 1575, 4616, - 4359, 4602, 4361, 1576, 5366, 1577, 1575, 4367, 5364, 3675, - 3681, 1576, 4591, 1577, 1575, 246, 200, 233, 202, 4545, - 4434, 1418, 4422, 1962, 3367, 4290, 2260, 2259, 4355, 3344, - 201, 246, 4420, 4289, 1967, 1968, 1969, 1970, 1971, 1972, - 4413, 4336, 4318, 4368, 4334, 4320, 820, 2556, 4296, 4331, - 4330, 1576, 4312, 1577, 1575, 4327, 1576, 2705, 1577, 1575, - 4412, 4326, 4314, 4310, 4307, 4265, 4264, 4254, 2904, 1005, - 173, 4418, 4248, 4140, 4127, 2903, 4049, 4046, 3999, 173, - 3937, 4332, 2314, 2897, 3924, 4362, 3916, 4364, 2866, 3915, - 239, 1724, 3912, 4383, 4384, 1576, 3670, 1577, 1575, 2469, - 1827, 4440, 1576, 3246, 1577, 1575, 239, 5454, 2444, 4379, - 1576, 3494, 1577, 1575, 4451, 1576, 3242, 1577, 1575, 3675, - 3241, 3300, 3681, 2865, 4462, 3240, 4401, 1418, 2206, 3205, - 4468, 4220, 3204, 1418, 4448, 2991, 4278, 4341, 4415, 4350, - 2877, 4342, 4337, 4347, 2870, 4167, 4344, 813, 2860, 2859, - 1576, 2858, 1577, 1575, 2857, 1576, 173, 1577, 1575, 2855, - 2992, 5130, 2851, 2850, 4370, 4374, 4369, 2848, 2839, 4381, - 4410, 4378, 2835, 1418, 1418, 2834, 4539, 2754, 2678, 4419, - 1882, 2325, 2323, 2322, 2321, 4398, 2320, 246, 200, 233, - 202, 4400, 2274, 2273, 2264, 4548, 246, 1903, 5452, 5410, - 5408, 3691, 4442, 5385, 5374, 5304, 5303, 5302, 4441, 820, - 5278, 2556, 4435, 5271, 5269, 1827, 1418, 5167, 5120, 1654, - 5115, 4497, 5026, 4541, 4439, 5025, 4565, 5024, 4995, 4504, - 203, 264, 3692, 4525, 4526, 4527, 4528, 4970, 4964, 1134, - 4787, 4778, 4333, 4447, 4756, 4750, 4438, 1935, 4724, 4708, - 4523, 4520, 4518, 4511, 4510, 4507, 4506, 4505, 4585, 4406, - 4357, 4353, 239, 4561, 4456, 4459, 4464, 4458, 4309, 4143, - 4137, 239, 1982, 1985, 1957, 1976, 1973, 1959, 1954, 4042, - 909, 4039, 4038, 3964, 3925, 3793, 4554, 4512, 3787, 3704, - 3620, 3614, 3610, 1813, 3434, 3215, 3190, 3147, 3033, 3014, - 4530, 2964, 2963, 2918, 2808, 2181, 239, 4538, 1650, 1270, - 4536, 2693, 2478, 2438, 2349, 2060, 1974, 1735, 173, 3603, - 3603, 4557, 4543, 1714, 2444, 4546, 4549, 4632, 1139, 1709, - 4551, 4638, 1708, 173, 4552, 173, 4588, 4644, 4556, 4558, - 4634, 1707, 1706, 4560, 837, 837, 4559, 837, 4555, 1134, - 1705, 1704, 1703, 1702, 1701, 1700, 1699, 1698, 1697, 1696, - 1695, 4584, 1694, 1693, 3603, 4570, 1692, 4580, 1691, 1690, - 1689, 1688, 1687, 4582, 1686, 1685, 1684, 1418, 1882, 1882, - 4601, 16, 4679, 4603, 1683, 1418, 4606, 1682, 4608, 4610, - 1681, 1680, 1679, 4604, 1678, 1677, 1676, 4600, 1675, 1674, - 1673, 4599, 1672, 1418, 1671, 1670, 1667, 4710, 1666, 1665, - 4103, 1663, 1662, 1661, 1658, 1651, 4641, 4720, 4643, 38, - 1648, 4676, 2082, 4709, 1647, 4614, 1646, 1645, 1644, 1643, - 1642, 1641, 1640, 4622, 4675, 1639, 1418, 1638, 1637, 1636, - 1630, 4654, 1418, 1629, 1628, 1627, 4635, 4685, 2103, 1626, - 1539, 1500, 1403, 5127, 4681, 1882, 4685, 4714, 4508, 4628, - 4677, 3647, 3648, 2741, 2980, 1447, 5411, 5321, 4655, 5319, - 32, 4658, 5256, 4223, 820, 3799, 1418, 1418, 1418, 3578, - 3210, 1418, 1418, 4668, 2997, 4691, 1538, 1467, 3045, 1418, - 4141, 1418, 3031, 3658, 4682, 4693, 4701, 3495, 4687, 4688, - 4700, 4781, 4698, 3030, 4683, 3043, 4716, 3044, 3659, 4442, - 4784, 3657, 4786, 3660, 4780, 4712, 4713, 3038, 4826, 4775, - 3656, 4727, 3039, 2149, 2150, 2151, 2152, 44, 3653, 4497, - 4726, 3042, 3029, 4760, 4761, 4762, 4738, 4504, 4776, 4777, - 3036, 4164, 4839, 4840, 4725, 3037, 4731, 4730, 3034, 82, - 5187, 4835, 5045, 3035, 4145, 5044, 5017, 4831, 5446, 1882, - 2698, 1882, 5442, 1882, 4146, 4562, 4729, 4431, 3870, 3623, - 1797, 2208, 2423, 2424, 4079, 2212, 2213, 2214, 2215, 3061, - 4822, 4417, 4611, 1614, 1824, 4161, 2254, 4162, 4870, 4829, - 3114, 4877, 4878, 1498, 820, 2265, 2418, 2419, 2420, 3974, - 3063, 3062, 4852, 3838, 4854, 4531, 4855, 4250, 4890, 4469, - 4892, 4828, 3735, 17, 4382, 4144, 4563, 4252, 4253, 2537, - 3736, 3737, 3738, 2293, 2294, 3618, 4251, 811, 1950, 1999, - 1142, 4846, 15, 2204, 1802, 4830, 3329, 4851, 3202, 3203, - 5235, 2946, 2945, 1995, 1225, 2954, 4893, 1999, 4895, 4537, - 3722, 2324, 2953, 2326, 2327, 2328, 2329, 2330, 2640, 2549, - 1533, 4925, 5165, 2339, 4967, 4921, 4648, 4097, 4053, 4861, - 818, 4052, 4863, 3685, 4871, 4847, 4872, 3271, 4873, 5236, - 3603, 3065, 2988, 2442, 2395, 5334, 1936, 2260, 2259, 4720, - 4720, 4936, 3825, 5305, 4944, 4948, 4966, 4592, 4898, 1733, - 1734, 1731, 1732, 4590, 4517, 4209, 4519, 1729, 1730, 2204, - 1727, 1728, 3172, 3166, 4917, 3161, 3060, 4911, 4923, 4899, - 2560, 1528, 1527, 4920, 4689, 1566, 3872, 2702, 2193, 4938, - 4924, 1144, 1145, 1146, 1147, 3665, 1268, 1499, 1142, 5285, - 2955, 2069, 4588, 1476, 1475, 4926, 1458, 4928, 1142, 1418, - 1142, 1499, 2431, 2725, 4660, 3327, 5283, 5216, 1418, 5184, - 5183, 4942, 4943, 4659, 3326, 5181, 5080, 5027, 4782, 4605, - 4939, 4576, 4568, 4454, 4453, 4272, 4271, 1718, 3099, 4981, - 3086, 1902, 4567, 4257, 3945, 1215, 3407, 1473, 5323, 5322, - 4937, 5228, 5229, 5322, 4965, 1882, 4639, 4360, 5014, 5289, - 4346, 4323, 3893, 3457, 5020, 3456, 4976, 1588, 1598, 1599, - 1600, 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, - 2339, 3448, 4977, 3447, 3222, 2339, 2339, 3218, 2837, 2148, - 1443, 1412, 1311, 5323, 77, 4752, 5307, 5306, 5011, 1144, - 1145, 1146, 1147, 5225, 1268, 5015, 5016, 5234, 5223, 5221, - 3477, 2614, 3475, 2218, 5060, 4983, 4657, 2914, 1990, 1268, - 818, 5053, 5065, 1144, 1145, 1146, 1147, 5435, 5436, 5460, - 5461, 5072, 5309, 5107, 2192, 4322, 814, 5028, 1491, 3825, - 91, 2, 5347, 5348, 1, 4407, 4408, 4409, 3992, 2916, - 2656, 2347, 1725, 2659, 173, 173, 2662, 173, 1270, 2664, - 5067, 3340, 5068, 1143, 5047, 5051, 1858, 813, 3182, 1589, - 1588, 1598, 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1590, 2606, 5029, 1589, 1588, 1598, 1599, 1600, - 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, 5057, - 5058, 1418, 1886, 837, 2351, 5110, 1149, 837, 837, 3603, - 5069, 5075, 2218, 2218, 2218, 3051, 5082, 2218, 2218, 5141, - 5084, 5091, 5081, 837, 3052, 2142, 1418, 2142, 3664, 5097, - 3054, 5100, 5101, 1498, 2623, 1453, 3463, 2774, 3814, 3159, - 2968, 4072, 1814, 1882, 5163, 5109, 1221, 5148, 2266, 1434, - 2028, 5118, 1433, 1431, 2209, 2287, 1007, 5171, 5125, 3000, - 3788, 3762, 4450, 5333, 4734, 5387, 5277, 5168, 5169, 5105, - 5336, 2684, 2055, 991, 5175, 4274, 3865, 5033, 5281, 5126, - 5128, 5129, 5131, 5133, 5035, 5172, 5162, 4850, 2779, 1571, - 4114, 872, 1053, 1019, 2688, 3947, 3942, 5206, 1613, 1018, - 4395, 3567, 5021, 5193, 4929, 873, 2665, 5030, 4848, 4789, - 1951, 1956, 5173, 3064, 1882, 4821, 4950, 5111, 5180, 5178, - 4728, 4157, 3709, 1989, 5199, 5201, 5136, 4521, 5203, 4866, - 4864, 4865, 3971, 5018, 4948, 4832, 5208, 916, 2585, 779, - 4779, 5200, 5202, 5204, 5240, 2995, 2243, 5213, 5077, 4969, - 1882, 1191, 4376, 2978, 1184, 3337, 5214, 5218, 5217, 5215, - 3589, 3588, 5219, 2160, 1580, 2179, 4315, 4316, 1624, 961, - 2819, 3564, 4491, 5227, 3832, 90, 89, 88, 5233, 1589, - 1588, 1598, 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1590, 5248, 272, 5020, 1010, 5261, 271, 4887, - 5262, 4672, 5263, 5170, 5264, 988, 987, 986, 5265, 985, - 984, 983, 2452, 2451, 2453, 2450, 2817, 2448, 2447, 1821, - 2822, 1820, 4256, 4566, 3220, 3221, 3725, 4532, 2831, 3720, - 2489, 2485, 5268, 1849, 2486, 3089, 3101, 2484, 5253, 5284, - 4298, 5286, 5287, 5282, 5280, 5276, 2838, 1418, 3603, 1589, - 1588, 1598, 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1590, 1134, 5295, 4593, 5296, 2840, 5122, 5123, - 4749, 1721, 3772, 5297, 4587, 2847, 2417, 3096, 2505, 3742, - 5301, 2502, 2501, 3734, 4745, 2218, 4739, 2534, 5087, 5357, - 5222, 5360, 5224, 4697, 2142, 4696, 5352, 5312, 5313, 5220, - 3972, 5311, 4695, 4461, 3680, 2868, 5332, 4694, 5316, 2271, - 2873, 2874, 2875, 4684, 5320, 2878, 2879, 2880, 2881, 2882, - 2883, 2884, 2885, 5318, 2887, 2888, 5339, 2890, 2891, 5328, - 4472, 1418, 4473, 5355, 5355, 5355, 1418, 4480, 1361, 2987, - 5359, 5362, 5331, 5343, 5346, 5193, 1330, 1325, 1327, 1328, - 1326, 3352, 5350, 4237, 5351, 1825, 5363, 3069, 4091, 3486, - 3485, 3483, 5110, 5377, 5376, 3482, 1775, 5383, 5389, 5324, - 5325, 5326, 5327, 2239, 5071, 5209, 4653, 3493, 3491, 1457, - 2236, 2061, 2057, 1448, 2238, 2235, 2237, 2241, 2242, 1400, - 3010, 4020, 2240, 1891, 1741, 5407, 1900, 5407, 5396, 1739, - 3654, 4824, 3032, 813, 2612, 4948, 3837, 1822, 5409, 1819, - 4138, 1818, 1299, 5413, 1298, 2617, 1272, 240, 1897, 241, - 172, 1131, 2271, 4351, 4416, 3816, 3173, 2535, 3272, 5355, - 5423, 5420, 5355, 5423, 5425, 5355, 5423, 5426, 5359, 5339, - 5428, 5362, 5427, 5421, 173, 3674, 4901, 2422, 1185, 1405, - 2976, 5432, 5389, 5434, 5439, 126, 5417, 48, 145, 1215, - 125, 5443, 5444, 219, 1413, 2537, 69, 5449, 5451, 218, - 68, 20, 143, 217, 67, 53, 52, 2218, 215, 121, - 120, 119, 118, 142, 5458, 214, 66, 3058, 256, 255, - 1450, 1452, 258, 257, 254, 5457, 3231, 5459, 3232, 253, - 1939, 252, 2142, 5185, 4692, 5270, 51, 50, 220, 49, - 127, 4956, 70, 47, 46, 2724, 4040, 2068, 4371, 3478, - 2960, 2512, 77, 45, 40, 77, 77, 14, 77, 2224, - 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, - 2246, 2247, 2248, 2249, 2250, 2251, 2244, 2245, 12, 43, - 41, 25, 24, 173, 2034, 23, 31, 173, 173, 30, - 4927, 13, 39, 37, 201, 246, 200, 233, 202, 1830, - 1831, 36, 1833, 173, 164, 1837, 163, 1846, 1847, 1848, - 35, 162, 161, 160, 2046, 159, 158, 157, 2339, 156, - 2339, 226, 34, 22, 837, 837, 61, 60, 59, 58, - 1573, 57, 2528, 56, 8, 4444, 837, 139, 149, 2339, - 2339, 148, 150, 146, 141, 138, 33, 140, 1910, 1911, - 136, 137, 1914, 1915, 1916, 1917, 1918, 130, 1920, 1921, - 1922, 837, 1924, 4785, 1927, 129, 1929, 1930, 1931, 128, - 239, 122, 102, 101, 1076, 100, 2035, 115, 114, 113, - 112, 111, 4984, 4985, 110, 108, 1935, 109, 871, 4989, - 4990, 4991, 4992, 4993, 4994, 99, 98, 97, 4998, 4999, - 5000, 5001, 5002, 5003, 96, 95, 135, 134, 131, 5006, - 5007, 5008, 117, 124, 123, 106, 5012, 1589, 1588, 1598, - 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, - 1590, 2516, 116, 107, 105, 104, 103, 94, 3277, 93, - 3280, 4783, 2522, 92, 133, 132, 147, 221, 71, 198, - 197, 196, 195, 5299, 194, 192, 193, 191, 190, 189, - 188, 187, 2510, 2544, 186, 62, 2511, 2513, 2515, 63, - 2517, 2518, 2519, 2523, 2524, 2525, 2527, 2530, 2531, 2532, - 64, 65, 210, 209, 211, 223, 222, 2520, 2529, 2521, - 213, 3308, 3309, 216, 1613, 1589, 1588, 1598, 1599, 1600, - 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, 212, - 207, 205, 208, 206, 204, 5083, 1589, 1588, 1598, 1599, - 1600, 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, - 1354, 83, 11, 144, 21, 18, 3, 2142, 5106, 5448, - 5450, 2536, 3825, 5368, 0, 0, 0, 0, 199, 231, - 243, 232, 0, 151, 0, 0, 0, 5119, 247, 0, - 3346, 3938, 0, 3350, 0, 0, 0, 0, 0, 0, - 0, 0, 2052, 225, 224, 3370, 3371, 0, 0, 0, - 0, 0, 0, 0, 3374, 3375, 0, 1215, 1215, 1809, - 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, - 3380, 3381, 3382, 0, 0, 1832, 0, 0, 0, 0, - 0, 2533, 0, 0, 1851, 1589, 1588, 1598, 1599, 1600, - 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, 2508, - 0, 0, 0, 2507, 0, 1888, 0, 0, 0, 3418, - 0, 3420, 0, 0, 3423, 0, 2149, 0, 0, 2339, - 0, 0, 0, 0, 0, 0, 0, 2526, 173, 0, - 0, 0, 2201, 2202, 0, 173, 2514, 1372, 1373, 1334, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2472, 0, 0, 0, 0, 0, 0, - 1362, 1366, 1368, 1370, 1375, 0, 1380, 1376, 1377, 1378, - 1379, 0, 0, 1357, 1358, 1359, 1360, 3349, 1333, 1363, - 0, 1335, 1825, 1336, 1338, 1339, 1340, 1341, 1337, 1342, - 1343, 1344, 1345, 1346, 1353, 1355, 1347, 1348, 1349, 1350, - 1351, 1352, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, - 1390, 1389, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, - 1365, 1367, 1369, 1371, 1374, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2621, 0, 0, - 0, 3931, 0, 0, 2535, 0, 0, 0, 0, 2495, - 0, 0, 2543, 0, 0, 0, 0, 0, 0, 0, - 0, 1356, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 173, 0, 0, 173, 173, 0, 173, 0, - 0, 0, 2537, 2504, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2538, 2539, 1589, 1588, 1598, 1599, 1600, - 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2503, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 173, 0, 0, 79, 0, 0, 2512, 0, - 0, 0, 0, 0, 173, 173, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 173, 0, 928, 927, - 934, 924, 0, 0, 0, 0, 2053, 242, 2054, 0, - 0, 931, 932, 0, 933, 937, 0, 0, 918, 0, - 0, 173, 0, 0, 0, 0, 0, 0, 942, 2339, - 0, 0, 0, 0, 0, 0, 2812, 0, 0, 0, - 2509, 0, 0, 0, 0, 0, 0, 0, 0, 2614, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2528, - 1589, 1588, 1598, 1599, 1600, 1601, 1591, 1592, 1593, 1594, - 1595, 1596, 1597, 1590, 0, 77, 946, 0, 0, 948, - 0, 0, 0, 3850, 947, 3852, 0, 0, 0, 0, - 0, 0, 0, 2628, 2629, 0, 0, 0, 0, 0, - 2635, 0, 0, 0, 169, 0, 0, 0, 0, 2642, - 1935, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 837, 837, 0, - 837, 837, 0, 0, 0, 0, 0, 837, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2491, 2496, 2494, - 0, 1613, 0, 2488, 0, 0, 0, 0, 2516, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2522, - 0, 0, 0, 0, 0, 0, 0, 2506, 0, 2490, - 0, 0, 0, 0, 0, 2694, 0, 0, 0, 2510, - 2544, 0, 0, 2511, 2513, 2515, 3911, 2517, 2518, 2519, - 2523, 2524, 2525, 2527, 2530, 2531, 2532, 0, 0, 0, - 0, 0, 0, 0, 2520, 2529, 2521, 0, 0, 0, - 0, 0, 0, 0, 0, 3935, 2498, 0, 0, 0, - 0, 1364, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2376, 2377, 2378, 0, 0, 0, 0, 0, 0, - 0, 919, 921, 920, 0, 0, 0, 0, 0, 0, - 0, 3969, 0, 926, 0, 0, 0, 0, 2536, 0, - 0, 0, 0, 0, 0, 930, 0, 0, 2416, 0, - 0, 0, 945, 0, 0, 0, 0, 2430, 0, 923, - 0, 0, 0, 913, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2482, 2483, 0, 0, 0, - 2492, 2493, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2533, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2508, 0, 0, 0, - 2507, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1329, 0, 0, 0, 0, - 0, 0, 0, 0, 2526, 0, 0, 0, 1354, 0, - 0, 0, 0, 2514, 0, 0, 0, 173, 0, 1452, - 0, 0, 173, 0, 0, 1452, 1270, 2541, 2540, 173, - 173, 0, 0, 0, 0, 0, 1825, 1825, 1825, 1825, - 1825, 1825, 1825, 1825, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 925, 929, 935, 0, 936, 938, - 0, 0, 939, 940, 941, 0, 0, 0, 943, 944, - 0, 0, 0, 0, 2500, 0, 0, 0, 0, 2339, - 0, 0, 0, 0, 0, 2339, 0, 0, 0, 0, - 4125, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4135, 0, 0, 4136, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2542, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1372, 1373, 1334, 0, 0, - 1354, 1323, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1450, 0, 0, 0, 2721, 1362, 1366, - 1368, 1370, 1375, 4175, 1380, 1376, 1377, 1378, 1379, 0, - 0, 1357, 1358, 1359, 1360, 1332, 1333, 1363, 0, 1335, - 0, 1336, 1338, 1339, 1340, 1341, 1337, 1342, 1343, 1344, - 1345, 1346, 1353, 1355, 1347, 1348, 1349, 1350, 1351, 1352, - 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1390, 1389, - 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1365, 1367, - 1369, 1371, 1374, 0, 922, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4219, 0, 0, 0, 0, 0, 0, 1356, - 77, 0, 0, 0, 0, 77, 0, 2509, 0, 0, - 0, 1270, 949, 950, 951, 952, 953, 1372, 1373, 1334, - 0, 0, 0, 0, 0, 0, 0, 173, 173, 0, - 173, 173, 0, 0, 0, 0, 0, 173, 0, 0, - 1362, 1366, 1368, 1370, 1375, 0, 1380, 1376, 1377, 1378, - 1379, 0, 0, 1357, 1358, 1359, 1360, 1332, 1333, 1363, - 0, 1335, 0, 1336, 1338, 1339, 1340, 1341, 1337, 1342, - 1343, 1344, 1345, 1346, 1353, 1355, 1347, 1348, 1349, 1350, - 1351, 1352, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, - 1390, 1389, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, - 1365, 1367, 1369, 1371, 1374, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4302, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4305, 4306, - 0, 1356, 0, 0, 0, 2535, 0, 0, 0, 0, - 2495, 0, 0, 2543, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4319, 0, 0, 4321, 0, - 0, 0, 0, 2537, 2504, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2538, 2539, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2940, 0, 2942, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2503, 0, 0, 0, 201, 246, 200, 233, 202, 0, - 0, 0, 0, 0, 2966, 2967, 0, 0, 0, 2512, - 0, 4219, 0, 0, 234, 0, 0, 0, 2984, 2985, - 2986, 226, 0, 0, 0, 235, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, - 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 239, 0, 0, 0, 173, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2528, 0, 0, 0, 0, 0, 0, 0, 0, 1364, - 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, - 0, 0, 928, 927, 934, 924, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 931, 932, 0, 933, 937, - 0, 0, 918, 0, 0, 0, 0, 0, 1825, 0, - 1825, 0, 942, 0, 0, 0, 0, 0, 2535, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 180, 181, 0, 182, 183, 0, 0, 0, 184, 0, - 0, 185, 0, 0, 1851, 0, 0, 0, 3688, 3689, - 2494, 0, 0, 0, 3687, 0, 2537, 0, 1576, 2516, - 1577, 1575, 0, 0, 0, 0, 0, 2339, 0, 0, - 2522, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1888, 0, 0, 0, 0, 2339, 0, 0, 0, 0, - 2510, 2544, 0, 0, 2511, 2513, 2515, 0, 2517, 2518, - 2519, 2523, 2524, 2525, 2527, 2530, 2531, 2532, 0, 0, - 1452, 1364, 2512, 1329, 0, 2520, 2529, 2521, 199, 231, - 243, 232, 84, 151, 0, 0, 0, 2498, 247, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2535, - 0, 0, 153, 225, 224, 0, 0, 201, 246, 85, - 2243, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 179, 0, 2536, - 0, 0, 0, 0, 4615, 0, 0, 2537, 0, 0, - 0, 0, 1825, 0, 0, 0, 0, 0, 0, 4922, - 173, 0, 0, 2528, 152, 173, 0, 0, 3604, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 227, 228, 229, 0, 0, 0, 0, 0, 0, 0, - 0, 2492, 2493, 239, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2512, 0, 919, 921, 920, 0, 2533, - 0, 0, 0, 0, 0, 0, 0, 926, 0, 0, - 0, 0, 0, 0, 0, 1329, 0, 2508, 0, 930, - 0, 2507, 0, 0, 0, 0, 945, 0, 0, 0, - 0, 0, 0, 923, 0, 0, 4711, 0, 0, 0, - 0, 0, 0, 0, 0, 2526, 236, 0, 1635, 0, - 837, 0, 2516, 0, 2514, 0, 0, 0, 0, 0, - 0, 0, 0, 2522, 0, 0, 0, 165, 2541, 2540, - 0, 230, 0, 166, 2528, 0, 0, 0, 0, 0, - 0, 0, 0, 2510, 2544, 0, 0, 2511, 2513, 2515, - 0, 2517, 2518, 2519, 2523, 2524, 2525, 2527, 2530, 2531, - 2532, 0, 0, 0, 0, 2535, 0, 0, 2520, 2529, - 2521, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2500, 0, 0, 0, 167, - 0, 0, 0, 0, 0, 0, 0, 2239, 0, 0, - 0, 0, 75, 2537, 2236, 0, 0, 0, 2238, 2235, - 2237, 2241, 2242, 0, 0, 0, 2240, 0, 0, 0, - 0, 0, 2536, 0, 0, 0, 4834, 0, 2542, 0, - 0, 247, 0, 2516, 0, 0, 3605, 0, 0, 3458, - 3459, 3460, 0, 0, 2522, 0, 0, 0, 925, 929, - 935, 0, 936, 938, 0, 79, 939, 940, 941, 2512, - 0, 860, 943, 944, 2510, 2544, 0, 0, 2511, 2513, - 2515, 0, 2517, 2518, 2519, 2523, 2524, 2525, 2527, 2530, - 2531, 2532, 0, 0, 0, 0, 177, 242, 178, 2520, - 2529, 2521, 2533, 0, 0, 0, 0, 0, 0, 0, - 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, - 2508, 0, 3637, 0, 2507, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 856, 857, 0, 2526, 0, - 2528, 0, 0, 2536, 0, 0, 902, 2514, 0, 0, - 0, 0, 0, 2224, 2225, 2226, 2227, 2228, 2229, 2230, - 2231, 2232, 2233, 2234, 2246, 2247, 2248, 2249, 2250, 2251, - 2244, 2245, 0, 0, 1935, 1270, 0, 173, 2509, 0, - 0, 0, 0, 168, 169, 55, 0, 0, 0, 0, - 0, 73, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2533, 0, 4968, 0, 0, 922, 0, - 1825, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 74, 2508, 174, 175, 0, 2507, 176, 0, 0, 2516, - 0, 0, 904, 0, 0, 903, 0, 0, 0, 0, - 2522, 0, 0, 0, 0, 0, 0, 0, 0, 2526, - 0, 0, 0, 0, 0, 173, 0, 0, 2514, 0, - 2510, 2544, 0, 0, 2511, 2513, 2515, 0, 2517, 2518, - 2519, 2523, 2524, 2525, 2527, 2530, 2531, 2532, 0, 0, - 77, 0, 0, 0, 0, 2520, 2529, 2521, 0, 889, - 0, 0, 0, 0, 0, 3839, 0, 0, 0, 861, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4499, 0, 0, 0, 0, 0, 4478, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 863, 0, 3606, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2536, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4492, 0, - 0, 0, 0, 4221, 0, 0, 860, 0, 0, 0, - 0, 0, 4481, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4475, 0, 0, 0, 0, 4501, 4502, - 5099, 0, 0, 0, 4476, 0, 0, 0, 0, 0, - 0, 2509, 0, 885, 0, 887, 884, 0, 0, 2533, - 888, 0, 0, 5117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2508, 0, 0, - 0, 2507, 0, 4477, 0, 4484, 0, 0, 0, 173, - 856, 857, 0, 0, 0, 0, 0, 0, 0, 0, - 173, 902, 0, 0, 0, 2526, 883, 0, 0, 0, - 0, 0, 0, 0, 2514, 0, 0, 0, 855, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 862, - 897, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 893, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2509, 0, 0, 0, 0, 0, 1295, 0, - 4795, 0, 0, 0, 0, 0, 0, 894, 898, 848, - 0, 4018, 0, 0, 1207, 0, 1208, 904, 0, 0, - 903, 0, 0, 0, 0, 0, 0, 4500, 880, 3079, - 878, 882, 901, 0, 5245, 0, 879, 876, 874, 5249, - 881, 865, 866, 864, 4816, 854, 867, 868, 869, 870, - 849, 0, 0, 899, 4488, 900, 1189, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 895, 896, 0, 0, - 1202, 0, 1197, 2980, 889, 0, 4485, 4489, 4487, 4486, - 0, 0, 4221, 1296, 861, 0, 4794, 0, 0, 0, - 0, 0, 173, 173, 0, 0, 0, 0, 0, 0, - 4795, 0, 0, 0, 891, 0, 0, 0, 0, 0, - 0, 863, 0, 850, 0, 0, 0, 0, 0, 0, - 0, 0, 886, 0, 0, 0, 0, 0, 0, 875, - 0, 0, 0, 4082, 4495, 4496, 0, 173, 0, 0, - 0, 1178, 0, 0, 4816, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4098, 0, 4099, 0, 0, 0, - 0, 5245, 0, 0, 0, 0, 0, 0, 0, 1825, - 0, 0, 0, 1289, 0, 1281, 1285, 1287, 0, 0, - 0, 0, 0, 0, 0, 0, 4794, 0, 885, 0, - 887, 884, 0, 0, 0, 888, 0, 0, 2509, 0, - 0, 1292, 0, 0, 0, 1284, 0, 4503, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 890, 0, - 4479, 0, 0, 4494, 858, 859, 0, 0, 847, 851, - 0, 1204, 0, 1196, 5245, 0, 852, 0, 0, 0, - 0, 883, 1201, 1199, 0, 0, 0, 853, 0, 0, - 0, 0, 0, 855, 0, 0, 1290, 0, 0, 0, - 0, 0, 0, 1190, 862, 897, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4791, 1293, 0, - 0, 0, 0, 0, 1825, 1294, 893, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 173, 0, 1206, 0, 0, 0, 0, 1195, 0, 0, - 0, 1194, 0, 0, 0, 0, 0, 1183, 0, 0, - 0, 0, 894, 898, 0, 0, 0, 0, 0, 0, - 1282, 0, 0, 0, 0, 0, 1188, 0, 5441, 0, - 0, 0, 1452, 880, 0, 878, 882, 901, 0, 0, - 0, 879, 876, 874, 1291, 881, 865, 866, 864, 0, - 854, 867, 868, 869, 870, 849, 0, 0, 899, 1205, - 900, 0, 0, 0, 0, 0, 0, 4791, 4796, 4797, - 0, 895, 896, 0, 1200, 0, 0, 0, 1186, 0, - 0, 0, 1283, 0, 0, 4792, 4793, 4221, 4800, 4799, - 4798, 4814, 4815, 4817, 4801, 4802, 4805, 4807, 4806, 4803, - 4804, 4808, 4810, 4811, 4812, 4809, 0, 4813, 0, 891, - 0, 0, 0, 4818, 0, 0, 0, 1205, 850, 0, - 4820, 0, 0, 0, 4819, 0, 4493, 886, 0, 0, - 0, 0, 0, 0, 875, 0, 0, 0, 0, 0, - 1187, 4498, 0, 173, 0, 0, 0, 0, 0, 4292, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1288, 0, 0, 0, 4796, 4797, - 0, 0, 0, 0, 0, 0, 0, 0, 4482, 4483, - 0, 0, 0, 0, 0, 4792, 4793, 0, 4800, 4799, - 4798, 4814, 4815, 4817, 4801, 4802, 4805, 4807, 4806, 4803, - 4804, 4808, 4810, 4811, 4812, 4809, 0, 4813, 1278, 0, - 0, 0, 0, 4818, 0, 0, 0, 0, 0, 0, - 4820, 0, 1203, 890, 4819, 0, 0, 0, 0, 858, - 859, 0, 0, 847, 851, 0, 0, 0, 0, 0, - 0, 852, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 853, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1182, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1297, - 1452, 0, 0, 1277, 1279, 0, 0, 0, 0, 0, - 0, 1280, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1179, 0, 0, - 0, 1177, 1180, 0, 0, 0, 0, 0, 0, 1181, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1452, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 341, 342, 343, 1099, 345, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 201, 246, 1026, 0, - 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, - 650, 684, 673, 762, 637, 0, 0, 0, 0, 0, - 0, 977, 0, 0, 0, 400, 0, 0, 469, 688, - 669, 680, 670, 512, 655, 656, 657, 664, 412, 658, - 794, 660, 629, 661, 630, 662, 663, 1616, 687, 636, - 548, 488, 0, 704, 0, 0, 1100, 1110, 0, 0, - 0, 173, 0, 0, 0, 0, 1095, 0, 0, 0, - 0, 0, 968, 0, 0, 1006, 1076, 1075, 993, 1003, - 0, 0, 371, 270, 631, 758, 633, 632, 994, 0, - 995, 999, 1002, 998, 996, 997, 0, 1090, 0, 0, - 0, 0, 0, 0, 960, 972, 0, 978, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 969, 970, 0, 0, 0, 0, 1027, - 0, 971, 0, 973, 0, 0, 0, 0, 549, 577, - 0, 590, 0, 438, 439, 1022, 1000, 1004, 4759, 0, - 0, 0, 356, 556, 574, 372, 543, 588, 377, 551, - 567, 367, 505, 539, 0, 0, 358, 572, 550, 483, - 357, 0, 532, 397, 414, 394, 503, 1001, 0, 1025, - 1029, 393, 1116, 1023, 582, 360, 0, 581, 502, 475, - 568, 573, 484, 477, 0, 359, 570, 482, 476, 452, - 404, 1117, 453, 454, 455, 456, 457, 458, 418, 1105, - 473, 519, 419, 490, 489, 491, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 0, 0, 0, 0, - 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 750, 1020, - 247, 755, 0, 584, 0, 0, 1097, 0, 0, 0, - 554, 0, 0, 459, 0, 0, 0, 1024, 4879, 535, - 508, 1113, 0, 0, 533, 471, 569, 520, 575, 557, - 583, 527, 521, 350, 558, 396, 485, 368, 370, 783, - 398, 401, 405, 406, 496, 497, 514, 542, 561, 562, - 563, 395, 382, 534, 383, 415, 384, 351, 387, 386, - 388, 544, 389, 353, 515, 566, 0, 411, 530, 480, - 354, 479, 516, 565, 564, 369, 592, 599, 600, 692, - 0, 605, 797, 798, 799, 614, 0, 522, 365, 362, - 0, 0, 0, 391, 517, 378, 380, 381, 379, 511, - 513, 619, 620, 621, 623, 624, 625, 626, 0, 0, - 0, 0, 627, 693, 711, 677, 646, 607, 701, 643, - 647, 648, 432, 433, 434, 435, 714, 0, 0, 0, - 598, 460, 461, 0, 403, 402, 481, 355, 0, 0, - 449, 431, 523, 361, 399, 451, 437, 462, 463, 464, - 465, 466, 0, 467, 468, 409, 340, 346, 791, 1094, - 504, 716, 753, 754, 638, 0, 1112, 1089, 1091, 1092, - 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, - 0, 694, 708, 795, 707, 787, 510, 0, 541, 705, - 652, 0, 698, 671, 672, 0, 699, 667, 703, 0, - 640, 0, 608, 611, 642, 729, 730, 731, 352, 610, - 733, 734, 735, 736, 737, 738, 739, 732, 1114, 675, - 651, 678, 589, 654, 653, 0, 0, 689, 1028, 690, - 691, 492, 493, 494, 495, 1098, 717, 376, 609, 525, - 526, 0, 676, 0, 0, 0, 0, 0, 0, 0, - 0, 681, 682, 679, 800, 0, 740, 741, 0, 0, - 603, 604, 408, 0, 622, 416, 375, 509, 410, 587, - 440, 0, 615, 683, 616, 528, 529, 744, 749, 745, - 746, 748, 769, 499, 430, 436, 545, 450, 472, 531, - 586, 507, 536, 373, 576, 547, 478, 668, 696, 1123, - 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, - 1035, 1036, 1119, 1118, 1120, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 725, 724, 723, 722, - 721, 720, 719, 718, 0, 0, 665, 390, 788, 782, - 789, 770, 773, 772, 747, 989, 347, 645, 470, 524, - 407, 712, 713, 0, 768, 1083, 1046, 1047, 1048, 979, - 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, - 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, - 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, - 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, - 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, - 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, - 1015, 0, 0, 593, 594, 595, 618, 0, 596, 578, - 644, 417, 348, 559, 585, 785, 786, 0, 0, 0, - 0, 0, 0, 0, 695, 706, 742, 743, 0, 756, - 757, 759, 761, 1074, 763, 552, 553, 771, 0, 0, - 441, 363, 364, 500, 501, 538, 0, 442, 443, 444, - 448, 445, 446, 447, 1060, 766, 767, 764, 474, 537, - 560, 546, 784, 487, 0, 792, 634, 635, 793, 752, - 751, 349, 0, 1039, 1040, 709, 710, 0, 0, 1109, - 486, 641, 0, 974, 341, 342, 343, 1099, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1026, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 977, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 1017, - 687, 636, 548, 488, 0, 704, 0, 0, 1100, 1110, - 0, 0, 0, 0, 0, 0, 0, 0, 1095, 0, - 0, 0, 0, 0, 968, 0, 0, 1006, 1076, 1075, - 993, 1003, 0, 0, 371, 270, 631, 758, 633, 632, - 994, 0, 995, 999, 1002, 998, 996, 997, 0, 1090, - 0, 0, 0, 0, 0, 0, 960, 972, 0, 978, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 969, 970, 0, 0, 0, - 0, 1027, 0, 971, 0, 973, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 1022, 1000, 1004, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 1001, - 0, 1025, 1029, 393, 1116, 1023, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 1117, 453, 454, 455, 456, 457, 458, - 418, 1105, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 1020, 0, 755, 0, 584, 0, 0, 1097, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 1024, - 0, 535, 508, 1113, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 2268, - 2267, 2269, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 1094, 504, 716, 753, 754, 638, 0, 1112, 1089, - 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, - 1115, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 1114, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 1028, 690, 691, 492, 493, 494, 495, 1098, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, - 982, 0, 1035, 1036, 1119, 1118, 1120, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 989, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 1083, 1046, 1047, - 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, - 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, - 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, - 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, - 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, - 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, - 1013, 1014, 1015, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 1074, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 1060, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 1039, 1040, 709, 710, 0, - 0, 1109, 486, 641, 0, 974, 341, 342, 343, 1099, - 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 201, 246, 1026, 0, 0, 0, 0, 0, 0, 0, - 0, 506, 0, 0, 650, 684, 673, 762, 637, 0, - 0, 0, 0, 0, 0, 977, 0, 0, 0, 400, - 0, 0, 469, 688, 669, 680, 670, 512, 655, 656, - 657, 664, 412, 658, 794, 660, 629, 661, 630, 662, - 663, 1017, 687, 636, 548, 488, 0, 704, 0, 0, - 1100, 1110, 0, 0, 0, 0, 0, 0, 0, 0, - 1095, 0, 0, 0, 0, 0, 968, 0, 0, 1006, - 1076, 1075, 993, 1003, 0, 0, 371, 270, 631, 758, - 633, 632, 994, 0, 995, 999, 1002, 998, 996, 997, - 0, 1090, 0, 0, 0, 0, 0, 0, 960, 972, - 0, 978, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 969, 970, 0, - 0, 0, 0, 1027, 0, 971, 0, 973, 0, 0, - 0, 0, 549, 577, 0, 590, 0, 438, 439, 1022, - 1000, 1004, 0, 0, 0, 0, 356, 556, 574, 372, - 543, 588, 377, 551, 567, 367, 505, 539, 0, 0, - 358, 572, 550, 483, 357, 0, 532, 397, 414, 394, - 503, 1001, 0, 1025, 1029, 393, 1116, 1023, 582, 360, - 0, 581, 502, 475, 568, 573, 484, 477, 0, 359, - 570, 482, 476, 452, 404, 1117, 453, 454, 455, 456, - 457, 458, 418, 1105, 473, 519, 419, 490, 489, 491, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 0, 0, 0, 0, 0, 612, 613, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 750, 1020, 0, 755, 0, 584, 0, 0, - 1097, 0, 0, 0, 554, 0, 0, 459, 0, 0, - 0, 1024, 0, 535, 508, 1113, 0, 0, 533, 471, - 569, 520, 575, 557, 583, 527, 521, 350, 558, 396, - 485, 368, 370, 783, 398, 401, 405, 406, 496, 497, - 514, 542, 561, 562, 563, 395, 382, 534, 383, 415, - 384, 351, 387, 386, 388, 544, 389, 353, 515, 566, - 0, 411, 530, 480, 354, 479, 516, 565, 564, 369, - 592, 599, 600, 692, 0, 605, 797, 798, 799, 614, - 0, 522, 365, 362, 0, 0, 0, 391, 517, 378, - 380, 381, 379, 511, 513, 619, 620, 621, 623, 624, - 625, 626, 0, 0, 0, 0, 627, 693, 711, 677, - 646, 607, 701, 643, 647, 648, 432, 433, 434, 435, - 714, 0, 0, 0, 598, 460, 461, 0, 403, 402, - 481, 355, 0, 0, 449, 431, 523, 361, 399, 451, - 437, 462, 463, 464, 465, 466, 0, 467, 468, 409, - 340, 346, 791, 1094, 504, 716, 753, 754, 638, 0, - 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, - 1108, 1111, 1115, 790, 0, 694, 708, 795, 707, 787, - 510, 0, 541, 705, 652, 0, 698, 671, 672, 0, - 699, 667, 703, 0, 640, 0, 608, 611, 642, 729, - 730, 731, 352, 610, 733, 734, 735, 736, 737, 738, - 739, 732, 1114, 675, 651, 678, 589, 654, 653, 0, - 0, 689, 1028, 690, 691, 492, 493, 494, 495, 1098, - 717, 376, 609, 525, 526, 0, 676, 0, 0, 0, - 0, 0, 0, 0, 0, 681, 682, 679, 800, 0, - 740, 741, 0, 0, 603, 604, 408, 0, 622, 416, - 375, 509, 410, 587, 440, 0, 615, 683, 616, 528, - 529, 744, 749, 745, 746, 748, 769, 499, 430, 436, - 545, 450, 472, 531, 586, 507, 536, 373, 576, 547, - 478, 668, 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, - 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, 1120, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 725, 724, 723, 722, 721, 720, 719, 718, 0, 0, - 665, 390, 788, 782, 789, 770, 773, 772, 747, 989, - 347, 645, 470, 524, 407, 712, 713, 0, 768, 1083, - 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, - 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, - 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, - 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, - 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, - 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, - 555, 1012, 1013, 1014, 1015, 0, 0, 593, 594, 595, - 618, 0, 596, 578, 644, 417, 348, 559, 585, 785, - 786, 0, 0, 0, 0, 0, 0, 0, 695, 706, - 742, 743, 0, 756, 757, 759, 761, 1074, 763, 552, - 553, 771, 0, 0, 441, 363, 364, 500, 501, 538, - 0, 442, 443, 444, 448, 445, 446, 447, 1060, 766, - 767, 764, 474, 537, 560, 546, 784, 487, 0, 792, - 634, 635, 793, 752, 751, 349, 0, 1039, 1040, 709, - 710, 0, 0, 1109, 486, 641, 0, 974, 341, 342, - 343, 1099, 345, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1026, 0, 0, 0, 0, 0, - 0, 0, 0, 506, 0, 0, 650, 684, 673, 762, - 637, 0, 0, 0, 0, 0, 0, 977, 0, 0, - 0, 400, 2340, 0, 469, 688, 669, 680, 670, 512, - 655, 656, 657, 664, 412, 658, 794, 660, 629, 661, - 630, 662, 663, 1017, 687, 636, 548, 488, 0, 704, - 0, 0, 1100, 1110, 0, 0, 0, 0, 0, 0, - 0, 0, 1095, 0, 2597, 0, 0, 0, 968, 0, - 0, 1006, 1076, 1075, 993, 1003, 0, 0, 371, 270, - 631, 758, 633, 632, 994, 0, 995, 999, 1002, 998, - 996, 997, 0, 1090, 0, 0, 0, 0, 0, 0, - 960, 972, 0, 978, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 969, - 970, 0, 0, 0, 0, 1027, 0, 971, 0, 973, - 0, 0, 0, 0, 549, 577, 0, 590, 0, 438, - 439, 2598, 1000, 1004, 0, 0, 0, 0, 356, 556, - 574, 372, 543, 588, 377, 551, 567, 367, 505, 539, - 0, 0, 358, 572, 550, 483, 357, 0, 532, 397, - 414, 394, 503, 1001, 0, 1025, 1029, 393, 1116, 1023, - 582, 360, 0, 581, 502, 475, 568, 573, 484, 477, - 0, 359, 570, 482, 476, 452, 404, 1117, 453, 454, - 455, 456, 457, 458, 418, 1105, 473, 519, 419, 490, - 489, 491, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 0, 0, 0, 0, 0, 612, 613, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 750, 1020, 0, 755, 0, 584, - 0, 0, 1097, 0, 0, 0, 554, 0, 0, 459, - 0, 0, 0, 1024, 0, 535, 508, 1113, 0, 0, - 533, 471, 569, 520, 575, 557, 583, 527, 521, 350, - 558, 396, 485, 368, 370, 783, 398, 401, 405, 406, - 496, 497, 514, 542, 561, 562, 563, 395, 382, 534, - 383, 415, 384, 351, 387, 386, 388, 544, 389, 353, - 515, 566, 0, 411, 530, 480, 354, 479, 516, 565, - 564, 369, 592, 599, 600, 692, 0, 605, 797, 798, - 799, 614, 0, 522, 365, 362, 0, 0, 0, 391, - 517, 378, 380, 381, 379, 511, 513, 619, 620, 621, - 623, 624, 625, 626, 0, 0, 0, 0, 627, 693, - 711, 677, 646, 607, 701, 643, 647, 648, 432, 433, - 434, 435, 714, 0, 0, 0, 598, 460, 461, 0, - 403, 402, 481, 355, 0, 0, 449, 431, 523, 361, - 399, 451, 437, 462, 463, 464, 465, 466, 0, 467, - 468, 409, 340, 346, 791, 1094, 504, 716, 753, 754, - 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, - 1104, 1106, 1108, 1111, 1115, 790, 0, 694, 708, 795, - 707, 787, 510, 0, 541, 705, 652, 0, 698, 671, - 672, 0, 699, 667, 703, 0, 640, 0, 608, 611, - 642, 729, 730, 731, 352, 610, 733, 734, 735, 736, - 737, 738, 739, 732, 1114, 675, 651, 678, 589, 654, - 653, 0, 0, 689, 1028, 690, 691, 492, 493, 494, - 495, 1098, 717, 376, 609, 525, 526, 0, 676, 0, - 0, 0, 0, 0, 0, 0, 0, 681, 682, 679, - 800, 0, 740, 741, 0, 0, 603, 604, 408, 0, - 622, 416, 375, 509, 410, 587, 440, 0, 615, 683, - 616, 528, 529, 744, 749, 745, 746, 748, 769, 499, - 430, 436, 545, 450, 472, 531, 586, 507, 536, 373, - 576, 547, 478, 668, 696, 1123, 1093, 1122, 1124, 1125, - 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, - 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 725, 724, 723, 722, 721, 720, 719, 718, - 0, 0, 665, 390, 788, 782, 789, 770, 773, 772, - 747, 989, 347, 645, 470, 524, 407, 712, 713, 0, - 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, - 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, - 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, - 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, - 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, - 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, - 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, 0, 593, - 594, 595, 618, 0, 596, 578, 644, 417, 348, 559, - 585, 785, 786, 0, 0, 0, 0, 0, 0, 0, - 695, 706, 742, 743, 0, 756, 757, 759, 761, 1074, - 763, 552, 553, 771, 0, 0, 441, 363, 364, 500, - 501, 538, 0, 442, 443, 444, 448, 445, 446, 447, - 1060, 766, 767, 764, 474, 537, 560, 546, 784, 487, - 0, 792, 634, 635, 793, 752, 751, 349, 0, 1039, - 1040, 709, 710, 0, 0, 1109, 486, 641, 0, 974, - 341, 342, 343, 1099, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1026, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 977, - 0, 0, 0, 400, 5440, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 1017, 687, 636, 548, 488, - 0, 704, 0, 0, 1100, 1110, 0, 0, 0, 0, - 0, 0, 0, 0, 1095, 0, 0, 0, 0, 0, - 968, 0, 0, 1006, 1076, 1075, 993, 1003, 0, 0, - 371, 270, 631, 758, 633, 632, 994, 0, 995, 999, - 1002, 998, 996, 997, 0, 1090, 0, 0, 0, 0, - 0, 0, 960, 972, 0, 978, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 969, 970, 0, 0, 0, 0, 1027, 0, 971, - 0, 973, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1022, 1000, 1004, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 1001, 0, 1025, 1029, 393, - 1116, 1023, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 1117, - 453, 454, 455, 456, 457, 458, 418, 1105, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 1020, 0, 755, - 0, 584, 0, 0, 1097, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 1024, 0, 535, 508, 1113, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 1094, 504, 716, - 753, 754, 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, - 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 1114, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 1028, 690, 691, 492, - 493, 494, 495, 1098, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 1123, 1093, 1122, - 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, - 1119, 1118, 1120, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 989, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, - 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, - 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, - 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, - 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, - 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, - 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 1074, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 1060, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 1039, 1040, 709, 710, 0, 0, 1109, 486, 641, - 0, 974, 341, 342, 343, 1099, 345, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1026, 0, - 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, - 650, 684, 673, 762, 637, 0, 0, 0, 0, 0, - 0, 977, 0, 0, 0, 400, 0, 0, 469, 688, - 669, 680, 670, 512, 655, 656, 657, 664, 412, 658, - 794, 660, 629, 661, 630, 662, 663, 1017, 687, 636, - 548, 488, 0, 704, 0, 0, 1100, 1110, 0, 0, - 0, 0, 0, 0, 0, 0, 1095, 0, 0, 0, - 0, 0, 968, 0, 0, 1006, 1076, 1075, 993, 1003, - 0, 0, 371, 270, 631, 758, 633, 632, 994, 0, - 995, 999, 1002, 998, 996, 997, 0, 1090, 0, 0, - 0, 0, 0, 0, 960, 972, 0, 978, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 969, 970, 0, 0, 0, 0, 1027, - 0, 971, 0, 973, 0, 0, 0, 0, 549, 577, - 0, 590, 0, 438, 439, 1022, 1000, 1004, 0, 0, - 0, 0, 356, 556, 574, 372, 543, 588, 377, 551, - 567, 367, 505, 539, 0, 0, 358, 572, 550, 483, - 357, 0, 532, 397, 414, 394, 503, 1001, 0, 1025, - 1029, 393, 1116, 1023, 582, 360, 0, 581, 502, 475, - 568, 573, 484, 477, 0, 359, 570, 482, 476, 452, - 404, 1117, 453, 454, 455, 456, 457, 458, 418, 1105, - 473, 519, 419, 490, 489, 491, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 0, 0, 0, 0, - 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 750, 1020, - 0, 755, 0, 584, 0, 0, 1097, 0, 0, 0, - 554, 0, 0, 459, 0, 0, 0, 1024, 0, 535, - 508, 1113, 5246, 0, 533, 471, 569, 520, 575, 557, - 583, 527, 521, 350, 558, 396, 485, 368, 370, 783, - 398, 401, 405, 406, 496, 497, 514, 542, 561, 562, - 563, 395, 382, 534, 383, 415, 384, 351, 387, 386, - 388, 544, 389, 353, 515, 566, 0, 411, 530, 480, - 354, 479, 516, 565, 564, 369, 592, 599, 600, 692, - 0, 605, 797, 798, 799, 614, 0, 522, 365, 362, - 0, 0, 0, 391, 517, 378, 380, 381, 379, 511, - 513, 619, 620, 621, 623, 624, 625, 626, 0, 0, - 0, 0, 627, 693, 711, 677, 646, 607, 701, 643, - 647, 648, 432, 433, 434, 435, 714, 0, 0, 0, - 598, 460, 461, 0, 403, 402, 481, 355, 0, 0, - 449, 431, 523, 361, 399, 451, 437, 462, 463, 464, - 465, 466, 0, 467, 468, 409, 340, 346, 791, 1094, - 504, 716, 753, 754, 638, 0, 1112, 1089, 1091, 1092, - 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, - 0, 694, 708, 795, 707, 787, 510, 0, 541, 705, - 652, 0, 698, 671, 672, 0, 699, 667, 703, 0, - 640, 0, 608, 611, 642, 729, 730, 731, 352, 610, - 733, 734, 735, 736, 737, 738, 739, 732, 1114, 675, - 651, 678, 589, 654, 653, 0, 0, 689, 1028, 690, - 691, 492, 493, 494, 495, 1098, 717, 376, 609, 525, - 526, 0, 676, 0, 0, 0, 0, 0, 0, 0, - 0, 681, 682, 679, 800, 0, 740, 741, 0, 0, - 603, 604, 408, 0, 622, 416, 375, 509, 410, 587, - 440, 0, 615, 683, 616, 528, 529, 744, 749, 745, - 746, 748, 769, 499, 430, 436, 545, 450, 472, 531, - 586, 507, 536, 373, 576, 547, 478, 668, 696, 1123, - 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, - 1035, 1036, 1119, 1118, 1120, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 725, 724, 723, 722, - 721, 720, 719, 718, 0, 0, 665, 390, 788, 782, - 789, 770, 773, 772, 747, 989, 347, 645, 470, 524, - 407, 712, 713, 0, 768, 1083, 1046, 1047, 1048, 979, - 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, - 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, - 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, - 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, - 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, - 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, - 1015, 0, 0, 593, 594, 595, 618, 0, 596, 578, - 644, 417, 348, 559, 585, 785, 786, 0, 0, 0, - 0, 0, 0, 0, 695, 706, 742, 743, 0, 756, - 757, 759, 761, 1074, 763, 552, 553, 771, 0, 0, - 441, 363, 364, 500, 501, 538, 0, 442, 443, 444, - 448, 445, 446, 447, 1060, 766, 767, 764, 474, 537, - 560, 546, 784, 487, 0, 792, 634, 635, 793, 752, - 751, 349, 0, 1039, 1040, 709, 710, 0, 0, 1109, - 486, 641, 0, 974, 341, 342, 343, 1099, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1026, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 977, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 1017, - 687, 636, 548, 488, 0, 704, 0, 0, 1100, 1110, - 0, 0, 0, 0, 0, 0, 0, 0, 1095, 0, - 0, 0, 0, 0, 968, 0, 0, 1006, 1076, 1075, - 993, 1003, 0, 0, 371, 270, 631, 758, 633, 632, - 994, 0, 995, 999, 1002, 998, 996, 997, 0, 1090, - 0, 0, 0, 0, 0, 0, 960, 972, 0, 978, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 969, 970, 1934, 0, 0, - 0, 1027, 0, 971, 0, 973, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 1022, 1000, 1004, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 1001, - 0, 1025, 1029, 393, 1116, 1023, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 1117, 453, 454, 455, 456, 457, 458, - 418, 1105, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 1020, 0, 755, 0, 584, 0, 0, 1097, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 1024, - 0, 535, 508, 1113, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 1094, 504, 716, 753, 754, 638, 0, 1112, 1089, - 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, - 1115, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 1114, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 1028, 690, 691, 492, 493, 494, 495, 1098, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, - 982, 0, 1035, 1036, 1119, 1118, 1120, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 989, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 1083, 1046, 1047, - 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, - 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, - 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, - 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, - 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, - 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, - 1013, 1014, 1015, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 1074, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 1060, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 1039, 1040, 709, 710, 0, - 0, 1109, 486, 641, 0, 974, 341, 342, 343, 1099, - 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1026, 0, 0, 0, 0, 0, 0, 0, - 0, 506, 0, 0, 650, 684, 673, 762, 637, 0, - 0, 0, 0, 0, 0, 977, 0, 0, 0, 400, - 2340, 0, 469, 688, 669, 680, 670, 512, 655, 656, - 657, 664, 412, 658, 794, 660, 629, 661, 630, 662, - 663, 1017, 687, 636, 548, 488, 0, 704, 0, 0, - 1100, 1110, 0, 0, 0, 0, 0, 0, 0, 0, - 1095, 0, 0, 0, 0, 0, 968, 0, 0, 1006, - 1076, 1075, 993, 1003, 0, 0, 371, 270, 631, 758, - 633, 632, 994, 0, 995, 999, 1002, 998, 996, 997, - 0, 1090, 0, 0, 0, 0, 0, 0, 960, 972, - 0, 978, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 969, 970, 0, - 0, 0, 0, 1027, 0, 971, 0, 973, 0, 0, - 0, 0, 549, 577, 0, 590, 0, 438, 439, 1022, - 1000, 1004, 0, 0, 0, 0, 356, 556, 574, 372, - 543, 588, 377, 551, 567, 367, 505, 539, 0, 0, - 358, 572, 550, 483, 357, 0, 532, 397, 414, 394, - 503, 1001, 0, 1025, 1029, 393, 1116, 1023, 582, 360, - 0, 581, 502, 475, 568, 573, 484, 477, 0, 359, - 570, 482, 476, 452, 404, 1117, 453, 454, 455, 456, - 457, 458, 418, 1105, 473, 519, 419, 490, 489, 491, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 0, 0, 0, 0, 0, 612, 613, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 750, 1020, 0, 755, 0, 584, 0, 0, - 1097, 0, 0, 0, 554, 0, 0, 459, 0, 0, - 0, 1024, 0, 535, 508, 1113, 0, 0, 533, 471, - 569, 520, 575, 557, 583, 527, 521, 350, 558, 396, - 485, 368, 370, 783, 398, 401, 405, 406, 496, 497, - 514, 542, 561, 562, 563, 395, 382, 534, 383, 415, - 384, 351, 387, 386, 388, 544, 389, 353, 515, 566, - 0, 411, 530, 480, 354, 479, 516, 565, 564, 369, - 592, 599, 600, 692, 0, 605, 797, 798, 799, 614, - 0, 522, 365, 362, 0, 0, 0, 391, 517, 378, - 380, 381, 379, 511, 513, 619, 620, 621, 623, 624, - 625, 626, 0, 0, 0, 0, 627, 693, 711, 677, - 646, 607, 701, 643, 647, 648, 432, 433, 434, 435, - 714, 0, 0, 0, 598, 460, 461, 0, 403, 402, - 481, 355, 0, 0, 449, 431, 523, 361, 399, 451, - 437, 462, 463, 464, 465, 466, 0, 467, 468, 409, - 340, 346, 791, 1094, 504, 716, 753, 754, 638, 0, - 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, - 1108, 1111, 1115, 790, 0, 694, 708, 795, 707, 787, - 510, 0, 541, 705, 652, 0, 698, 671, 672, 0, - 699, 667, 703, 0, 640, 0, 608, 611, 642, 729, - 730, 731, 352, 610, 733, 734, 735, 736, 737, 738, - 739, 732, 1114, 675, 651, 678, 589, 654, 653, 0, - 0, 689, 1028, 690, 691, 492, 493, 494, 495, 1098, - 717, 376, 609, 525, 526, 0, 676, 0, 0, 0, - 0, 0, 0, 0, 0, 681, 682, 679, 800, 0, - 740, 741, 0, 0, 603, 604, 408, 0, 622, 416, - 375, 509, 410, 587, 440, 0, 615, 683, 616, 528, - 529, 744, 749, 745, 746, 748, 769, 499, 430, 436, - 545, 450, 472, 531, 586, 507, 536, 373, 576, 547, - 478, 668, 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, - 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, 1120, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 725, 724, 723, 722, 721, 720, 719, 718, 0, 0, - 665, 390, 788, 782, 789, 770, 773, 772, 747, 989, - 347, 645, 470, 524, 407, 712, 713, 0, 768, 1083, - 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, - 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, - 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, - 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, - 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, - 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, - 555, 1012, 1013, 1014, 1015, 0, 0, 593, 594, 595, - 618, 0, 596, 578, 644, 417, 348, 559, 585, 785, - 786, 0, 0, 0, 0, 0, 0, 0, 695, 706, - 742, 743, 0, 756, 757, 759, 761, 1074, 763, 552, - 553, 771, 0, 0, 441, 363, 364, 500, 501, 538, - 0, 442, 443, 444, 448, 445, 446, 447, 1060, 766, - 767, 764, 474, 537, 560, 546, 784, 487, 0, 792, - 634, 635, 793, 752, 751, 349, 0, 1039, 1040, 709, - 710, 0, 0, 1109, 486, 641, 0, 974, 341, 342, - 343, 1099, 345, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1026, 0, 0, 2846, 0, 0, - 0, 0, 0, 506, 0, 0, 650, 684, 673, 762, - 637, 0, 0, 0, 0, 0, 0, 977, 0, 0, - 0, 400, 0, 0, 469, 688, 669, 680, 670, 512, - 655, 656, 657, 664, 412, 658, 794, 660, 629, 661, - 630, 662, 663, 1017, 687, 636, 548, 488, 0, 704, - 0, 0, 1100, 1110, 0, 0, 0, 0, 0, 0, - 0, 0, 1095, 0, 0, 0, 0, 0, 968, 0, - 0, 1006, 1076, 1075, 993, 1003, 0, 0, 371, 270, - 631, 758, 633, 632, 994, 0, 995, 999, 1002, 998, - 996, 997, 0, 1090, 0, 0, 0, 0, 0, 0, - 960, 972, 0, 978, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 969, - 970, 0, 0, 0, 0, 1027, 0, 971, 0, 973, - 0, 0, 0, 0, 549, 577, 0, 590, 0, 438, - 439, 1022, 1000, 1004, 0, 0, 0, 0, 356, 556, - 574, 372, 543, 588, 377, 551, 567, 367, 505, 539, - 0, 0, 358, 572, 550, 483, 357, 0, 532, 397, - 414, 394, 503, 1001, 0, 1025, 1029, 393, 1116, 1023, - 582, 360, 0, 581, 502, 475, 568, 573, 484, 477, - 0, 359, 570, 482, 476, 452, 404, 1117, 453, 454, - 455, 456, 457, 458, 418, 1105, 473, 519, 419, 490, - 489, 491, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 0, 0, 0, 0, 0, 612, 613, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 750, 1020, 0, 755, 0, 584, - 0, 0, 1097, 0, 0, 0, 554, 0, 0, 459, - 0, 0, 0, 1024, 0, 535, 508, 1113, 0, 0, - 533, 471, 569, 520, 575, 557, 583, 527, 521, 350, - 558, 396, 485, 368, 370, 783, 398, 401, 405, 406, - 496, 497, 514, 542, 561, 562, 563, 395, 382, 534, - 383, 415, 384, 351, 387, 386, 388, 544, 389, 353, - 515, 566, 0, 411, 530, 480, 354, 479, 516, 565, - 564, 369, 592, 599, 600, 692, 0, 605, 797, 798, - 799, 614, 0, 522, 365, 362, 0, 0, 0, 391, - 517, 378, 380, 381, 379, 511, 513, 619, 620, 621, - 623, 624, 625, 626, 0, 0, 0, 0, 627, 693, - 711, 677, 646, 607, 701, 643, 647, 648, 432, 433, - 434, 435, 714, 0, 0, 0, 598, 460, 461, 0, - 403, 402, 481, 355, 0, 0, 449, 431, 523, 361, - 399, 451, 437, 462, 463, 464, 465, 466, 0, 467, - 468, 409, 340, 346, 791, 1094, 504, 716, 753, 754, - 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, - 1104, 1106, 1108, 1111, 1115, 790, 0, 694, 708, 795, - 707, 787, 510, 0, 541, 705, 652, 0, 698, 671, - 672, 0, 699, 667, 703, 0, 640, 0, 608, 611, - 642, 729, 730, 731, 352, 610, 733, 734, 735, 736, - 737, 738, 739, 732, 1114, 675, 651, 678, 589, 654, - 653, 0, 0, 689, 1028, 690, 691, 492, 493, 494, - 495, 1098, 717, 376, 609, 525, 526, 0, 676, 0, - 0, 0, 0, 0, 0, 0, 0, 681, 682, 679, - 800, 0, 740, 741, 0, 0, 603, 604, 408, 0, - 622, 416, 375, 509, 410, 587, 440, 0, 615, 683, - 616, 528, 529, 744, 749, 745, 746, 748, 769, 499, - 430, 436, 545, 450, 472, 531, 586, 507, 536, 373, - 576, 547, 478, 668, 696, 1123, 1093, 1122, 1124, 1125, - 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, - 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 725, 724, 723, 722, 721, 720, 719, 718, - 0, 0, 665, 390, 788, 782, 789, 770, 773, 772, - 747, 989, 347, 645, 470, 524, 407, 712, 713, 0, - 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, - 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, - 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, - 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, - 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, - 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, - 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, 0, 593, - 594, 595, 618, 0, 596, 578, 644, 417, 348, 559, - 585, 785, 786, 0, 0, 0, 0, 0, 0, 0, - 695, 706, 742, 743, 0, 756, 757, 759, 761, 1074, - 763, 552, 553, 771, 0, 0, 441, 363, 364, 500, - 501, 538, 0, 442, 443, 444, 448, 445, 446, 447, - 1060, 766, 767, 764, 474, 537, 560, 546, 784, 487, - 0, 792, 634, 635, 793, 752, 751, 349, 0, 1039, - 1040, 709, 710, 0, 0, 1109, 486, 641, 0, 974, - 341, 342, 343, 1099, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1026, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 977, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 1017, 687, 636, 548, 488, - 0, 704, 0, 0, 1100, 1110, 0, 0, 0, 0, - 0, 0, 0, 0, 1095, 0, 0, 0, 0, 0, - 968, 0, 0, 1006, 1076, 1075, 993, 1003, 0, 0, - 371, 270, 631, 758, 633, 632, 994, 0, 995, 999, - 1002, 998, 996, 997, 0, 1090, 0, 0, 0, 0, - 0, 0, 960, 972, 0, 978, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 969, 970, 2331, 0, 0, 0, 1027, 0, 971, - 0, 973, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1022, 1000, 1004, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 1001, 0, 1025, 1029, 393, - 1116, 1023, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 1117, - 453, 454, 455, 456, 457, 458, 418, 1105, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 1020, 0, 755, - 0, 584, 0, 0, 1097, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 1024, 0, 535, 508, 1113, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 1094, 504, 716, - 753, 754, 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, - 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 1114, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 1028, 690, 691, 492, - 493, 494, 495, 1098, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 1123, 1093, 1122, - 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, - 1119, 1118, 1120, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 989, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, - 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, - 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, - 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, - 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, - 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, - 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 1074, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 1060, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 1039, 1040, 709, 710, 0, 0, 1109, 486, 641, - 0, 974, 341, 342, 343, 1099, 345, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1026, 0, - 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, - 650, 684, 673, 762, 637, 0, 0, 0, 0, 0, - 0, 977, 0, 0, 0, 400, 0, 0, 469, 688, - 669, 680, 670, 512, 655, 656, 657, 664, 412, 658, - 794, 660, 629, 661, 630, 662, 663, 1017, 687, 636, - 548, 488, 0, 704, 0, 0, 1100, 1110, 0, 0, - 0, 0, 0, 0, 0, 0, 1095, 0, 0, 0, - 0, 0, 968, 0, 0, 1006, 1076, 1075, 993, 1003, - 0, 0, 371, 270, 631, 758, 633, 632, 994, 0, - 995, 999, 1002, 998, 996, 997, 0, 1090, 0, 0, - 0, 0, 0, 0, 960, 972, 0, 978, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 969, 970, 0, 0, 0, 0, 1027, - 0, 971, 0, 973, 0, 0, 0, 0, 549, 577, - 0, 590, 0, 438, 439, 1022, 1000, 1004, 0, 0, - 0, 0, 356, 556, 574, 372, 543, 588, 377, 551, - 567, 367, 505, 539, 0, 0, 358, 572, 550, 483, - 357, 0, 532, 397, 414, 394, 503, 1001, 0, 1025, - 1029, 393, 1116, 1023, 582, 360, 0, 581, 502, 475, - 568, 573, 484, 477, 0, 359, 570, 482, 476, 452, - 404, 1117, 453, 454, 455, 456, 457, 458, 418, 1105, - 473, 519, 419, 490, 489, 491, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 0, 0, 0, 0, - 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 750, 1020, - 0, 755, 0, 584, 0, 0, 1097, 0, 0, 0, - 554, 0, 0, 459, 0, 0, 0, 1024, 0, 535, - 508, 1113, 0, 0, 533, 471, 569, 520, 575, 557, - 583, 527, 521, 350, 558, 396, 485, 368, 370, 783, - 398, 401, 405, 406, 496, 497, 514, 542, 561, 562, - 563, 395, 382, 534, 383, 415, 384, 351, 387, 386, - 388, 544, 389, 353, 515, 566, 0, 411, 530, 480, - 354, 479, 516, 565, 564, 369, 592, 599, 600, 692, - 0, 605, 797, 798, 799, 614, 0, 522, 365, 362, - 0, 0, 0, 391, 517, 378, 380, 381, 379, 511, - 513, 619, 620, 621, 623, 624, 625, 626, 0, 0, - 0, 0, 627, 693, 711, 677, 646, 607, 701, 643, - 647, 648, 432, 433, 434, 435, 714, 0, 0, 0, - 598, 460, 461, 0, 403, 402, 481, 355, 0, 0, - 449, 431, 523, 361, 399, 451, 437, 462, 463, 464, - 465, 466, 0, 467, 468, 409, 340, 346, 791, 1094, - 504, 716, 753, 754, 638, 0, 1112, 1089, 1091, 1092, - 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, - 0, 694, 708, 795, 707, 787, 510, 0, 541, 705, - 652, 0, 698, 671, 672, 0, 699, 667, 703, 0, - 640, 0, 608, 611, 642, 729, 730, 731, 352, 610, - 733, 734, 735, 736, 737, 738, 739, 732, 1114, 675, - 651, 678, 589, 654, 653, 0, 0, 689, 1028, 690, - 691, 492, 493, 494, 495, 1098, 717, 376, 609, 525, - 526, 0, 676, 0, 0, 0, 0, 0, 0, 0, - 0, 681, 682, 679, 800, 0, 740, 741, 0, 0, - 603, 604, 408, 0, 622, 416, 375, 509, 410, 587, - 440, 0, 615, 683, 616, 528, 529, 744, 749, 745, - 746, 748, 769, 499, 430, 436, 545, 450, 472, 531, - 586, 507, 536, 373, 576, 547, 478, 668, 696, 1123, - 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, - 1035, 1036, 1119, 1118, 1120, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 725, 724, 723, 722, - 721, 720, 719, 718, 0, 0, 665, 390, 788, 782, - 789, 770, 773, 772, 747, 989, 347, 645, 470, 524, - 407, 712, 713, 0, 768, 1083, 1046, 1047, 1048, 979, - 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, - 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, - 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, - 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, - 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, - 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, - 1015, 0, 0, 593, 594, 595, 618, 0, 596, 578, - 644, 417, 348, 559, 585, 785, 786, 0, 0, 0, - 0, 0, 0, 0, 695, 706, 742, 743, 0, 756, - 757, 759, 761, 1074, 763, 552, 553, 771, 0, 0, - 441, 363, 364, 500, 501, 538, 0, 442, 443, 444, - 448, 445, 446, 447, 1060, 766, 767, 764, 474, 537, - 560, 546, 784, 487, 0, 792, 634, 635, 793, 752, - 751, 349, 0, 1039, 1040, 709, 710, 0, 0, 1109, - 486, 641, 0, 974, 341, 342, 343, 1099, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1026, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 977, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 1017, - 687, 636, 548, 488, 0, 704, 0, 0, 1100, 1110, - 0, 0, 0, 0, 0, 0, 0, 0, 1095, 0, - 0, 0, 0, 0, 968, 0, 0, 1006, 1076, 1075, - 993, 1003, 0, 0, 371, 270, 631, 758, 633, 632, - 994, 0, 995, 999, 1002, 998, 996, 997, 0, 1090, - 0, 0, 0, 0, 0, 0, 960, 972, 0, 978, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 969, 970, 0, 0, 0, - 0, 1027, 0, 971, 0, 973, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 1022, 1000, 1004, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 1001, - 0, 1025, 1029, 393, 1116, 1023, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 1117, 453, 454, 455, 456, 457, 458, - 418, 1105, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 1020, 0, 755, 0, 584, 0, 0, 1097, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 1024, - 0, 535, 508, 1113, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 1094, 504, 716, 753, 754, 638, 0, 1112, 1089, - 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, - 1115, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 1114, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 1028, 690, 691, 492, 493, 494, 495, 1098, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, - 982, 0, 1035, 1036, 1119, 1118, 1120, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 989, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 1083, 1046, 1047, - 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, - 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, - 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, - 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, - 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, - 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, - 1013, 1014, 1015, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 1074, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 4836, 766, 4837, 4838, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 1039, 1040, 709, 710, 0, - 0, 1109, 486, 641, 0, 974, 341, 342, 343, 1099, - 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1026, 0, 0, 0, 0, 0, 0, 0, - 0, 506, 0, 0, 650, 684, 673, 762, 637, 0, - 0, 0, 0, 0, 0, 977, 0, 0, 0, 400, - 0, 0, 469, 688, 669, 680, 670, 512, 655, 656, - 657, 664, 412, 658, 794, 660, 629, 661, 630, 662, - 663, 1017, 687, 636, 548, 488, 0, 704, 0, 0, - 1100, 1110, 0, 0, 0, 0, 0, 0, 0, 0, - 1095, 0, 0, 0, 0, 0, 968, 0, 0, 1006, - 1076, 1075, 993, 1003, 0, 0, 371, 270, 631, 758, - 633, 632, 3426, 0, 3427, 999, 1002, 998, 996, 997, - 0, 1090, 0, 0, 0, 0, 0, 0, 960, 972, - 0, 978, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 969, 970, 0, - 0, 0, 0, 1027, 0, 971, 0, 973, 0, 0, - 0, 0, 549, 577, 0, 590, 0, 438, 439, 1022, - 1000, 1004, 0, 0, 0, 0, 356, 556, 574, 372, - 543, 588, 377, 551, 567, 367, 505, 539, 0, 0, - 358, 572, 550, 483, 357, 0, 532, 397, 414, 394, - 503, 1001, 0, 1025, 1029, 393, 1116, 1023, 582, 360, - 0, 581, 502, 475, 568, 573, 484, 477, 0, 359, - 570, 482, 476, 452, 404, 1117, 453, 454, 455, 456, - 457, 458, 418, 1105, 473, 519, 419, 490, 489, 491, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 0, 0, 0, 0, 0, 612, 613, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 750, 1020, 0, 755, 0, 584, 0, 0, - 1097, 0, 0, 0, 554, 0, 0, 459, 0, 0, - 0, 1024, 0, 535, 508, 1113, 0, 0, 533, 471, - 569, 520, 575, 557, 583, 527, 521, 350, 558, 396, - 485, 368, 370, 783, 398, 401, 405, 406, 496, 497, - 514, 542, 561, 562, 563, 395, 382, 534, 383, 415, - 384, 351, 387, 386, 388, 544, 389, 353, 515, 566, - 0, 411, 530, 480, 354, 479, 516, 565, 564, 369, - 592, 599, 600, 692, 0, 605, 797, 798, 799, 614, - 0, 522, 365, 362, 0, 0, 0, 391, 517, 378, - 380, 381, 379, 511, 513, 619, 620, 621, 623, 624, - 625, 626, 0, 0, 0, 0, 627, 693, 711, 677, - 646, 607, 701, 643, 647, 648, 432, 433, 434, 435, - 714, 0, 0, 0, 598, 460, 461, 0, 403, 402, - 481, 355, 0, 0, 449, 431, 523, 361, 399, 451, - 437, 462, 463, 464, 465, 466, 0, 467, 468, 409, - 340, 346, 791, 1094, 504, 716, 753, 754, 638, 0, - 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, - 1108, 1111, 1115, 790, 0, 694, 708, 795, 707, 787, - 510, 0, 541, 705, 652, 0, 698, 671, 672, 0, - 699, 667, 703, 0, 640, 0, 608, 611, 642, 729, - 730, 731, 352, 610, 733, 734, 735, 736, 737, 738, - 739, 732, 1114, 675, 651, 678, 589, 654, 653, 0, - 0, 689, 1028, 690, 691, 492, 493, 494, 495, 1098, - 717, 376, 609, 525, 526, 0, 676, 0, 0, 0, - 0, 0, 0, 0, 0, 681, 682, 679, 800, 0, - 740, 741, 0, 0, 603, 604, 408, 0, 622, 416, - 375, 509, 410, 587, 440, 0, 615, 683, 616, 528, - 529, 744, 749, 745, 746, 748, 769, 499, 430, 436, - 545, 450, 472, 531, 586, 507, 536, 373, 576, 547, - 478, 668, 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, - 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, 1120, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 725, 724, 723, 722, 721, 720, 719, 718, 0, 0, - 665, 390, 788, 782, 789, 770, 773, 772, 747, 989, - 347, 645, 470, 524, 407, 712, 713, 0, 768, 1083, - 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, - 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, - 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, - 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, - 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, - 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, - 555, 1012, 1013, 1014, 1015, 0, 0, 593, 594, 595, - 618, 0, 596, 578, 644, 417, 348, 559, 585, 785, - 786, 0, 0, 0, 0, 0, 0, 0, 695, 706, - 742, 743, 0, 756, 757, 759, 761, 1074, 763, 552, - 553, 771, 0, 0, 441, 363, 364, 500, 501, 538, - 0, 442, 443, 444, 448, 445, 446, 447, 1060, 766, - 767, 764, 474, 537, 560, 546, 784, 487, 0, 792, - 634, 635, 793, 752, 751, 349, 0, 1039, 1040, 709, - 710, 0, 0, 1109, 486, 641, 0, 974, 341, 342, - 343, 1099, 345, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1026, 0, 0, 0, 0, 0, - 0, 0, 0, 506, 0, 0, 650, 684, 673, 762, - 637, 0, 0, 2161, 0, 0, 0, 977, 0, 0, - 0, 400, 0, 0, 469, 688, 669, 680, 670, 512, - 655, 656, 657, 664, 412, 658, 794, 660, 629, 661, - 630, 662, 663, 1017, 687, 636, 548, 488, 0, 704, - 0, 0, 1100, 1110, 0, 0, 0, 0, 0, 0, - 0, 0, 1095, 0, 0, 0, 0, 0, 968, 0, - 0, 1006, 1076, 1075, 993, 1003, 0, 0, 371, 270, - 631, 758, 633, 632, 994, 0, 995, 999, 1002, 998, - 996, 997, 0, 1090, 0, 0, 0, 0, 0, 0, - 0, 972, 0, 978, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 969, - 970, 0, 0, 0, 0, 1027, 0, 971, 0, 973, - 0, 0, 0, 0, 549, 577, 0, 590, 0, 438, - 439, 1022, 1000, 1004, 0, 0, 0, 0, 356, 556, - 574, 372, 543, 588, 377, 551, 567, 367, 505, 539, - 0, 0, 358, 572, 550, 483, 357, 0, 532, 397, - 414, 394, 503, 1001, 0, 1025, 1029, 393, 1116, 1023, - 582, 360, 0, 581, 502, 475, 568, 573, 484, 477, - 0, 359, 570, 482, 476, 452, 404, 1117, 453, 454, - 455, 456, 457, 458, 418, 1105, 473, 519, 419, 490, - 489, 491, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 0, 0, 0, 0, 0, 612, 613, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 750, 1020, 0, 755, 0, 584, - 0, 0, 1097, 0, 0, 0, 554, 0, 0, 459, - 0, 0, 0, 1024, 0, 535, 508, 1113, 0, 0, - 533, 471, 569, 520, 575, 557, 583, 527, 521, 350, - 558, 396, 485, 368, 370, 783, 398, 401, 405, 406, - 496, 497, 514, 542, 561, 562, 563, 395, 382, 534, - 383, 415, 384, 351, 387, 386, 388, 544, 389, 353, - 515, 566, 0, 411, 530, 480, 354, 479, 516, 565, - 564, 369, 592, 2162, 2163, 692, 0, 605, 797, 798, - 799, 614, 0, 522, 365, 362, 0, 0, 0, 391, - 517, 378, 380, 381, 379, 511, 513, 619, 620, 621, - 623, 624, 625, 626, 0, 0, 0, 0, 627, 693, - 711, 677, 646, 607, 701, 643, 647, 648, 432, 433, - 434, 435, 714, 0, 0, 0, 598, 460, 461, 0, - 403, 402, 481, 355, 0, 0, 449, 431, 523, 361, - 399, 451, 437, 462, 463, 464, 465, 466, 0, 467, - 468, 409, 340, 346, 791, 1094, 504, 716, 753, 754, - 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, - 1104, 1106, 1108, 1111, 1115, 790, 0, 694, 708, 795, - 707, 787, 510, 0, 541, 705, 652, 0, 698, 671, - 672, 0, 699, 667, 703, 0, 640, 0, 608, 611, - 642, 729, 730, 731, 352, 610, 733, 734, 735, 736, - 737, 738, 739, 732, 1114, 675, 651, 678, 589, 654, - 653, 0, 0, 689, 1028, 690, 691, 492, 493, 494, - 495, 1098, 717, 376, 609, 525, 526, 0, 676, 0, - 0, 0, 0, 0, 0, 0, 0, 681, 682, 679, - 800, 0, 740, 741, 0, 0, 603, 604, 408, 0, - 622, 416, 375, 509, 410, 587, 440, 0, 615, 683, - 616, 528, 529, 744, 749, 745, 746, 748, 769, 499, - 430, 436, 545, 450, 472, 531, 586, 507, 536, 373, - 576, 547, 478, 668, 696, 1123, 1093, 1122, 1124, 1125, - 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, - 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 725, 724, 723, 722, 721, 720, 719, 718, - 0, 0, 665, 390, 788, 782, 789, 770, 773, 772, - 747, 989, 347, 645, 470, 524, 407, 712, 713, 0, - 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, - 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, - 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, - 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, - 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, - 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, - 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, 0, 593, - 594, 595, 618, 0, 596, 578, 644, 417, 348, 559, - 585, 785, 786, 0, 0, 0, 0, 0, 0, 0, - 695, 706, 742, 743, 0, 756, 757, 759, 761, 1074, - 763, 552, 553, 771, 0, 0, 441, 363, 364, 500, - 501, 538, 0, 442, 443, 444, 448, 445, 446, 447, - 1060, 766, 767, 764, 474, 537, 560, 546, 784, 487, - 0, 792, 634, 635, 793, 752, 751, 349, 0, 1039, - 1040, 709, 710, 0, 0, 1109, 486, 641, 0, 974, - 341, 342, 343, 1099, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1026, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 977, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 1017, 687, 636, 548, 488, - 0, 704, 0, 0, 1100, 1110, 0, 0, 0, 0, - 0, 0, 0, 0, 1095, 0, 0, 0, 0, 0, - 1634, 0, 0, 1006, 1076, 1075, 993, 1003, 0, 0, - 371, 270, 631, 758, 633, 632, 994, 0, 995, 999, - 1002, 998, 996, 997, 0, 1090, 0, 0, 0, 0, - 0, 0, 960, 972, 0, 978, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 969, 970, 0, 0, 0, 0, 1027, 0, 971, - 0, 973, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1022, 1000, 1004, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 1001, 0, 1025, 1029, 393, - 1116, 1023, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 1117, - 453, 454, 455, 456, 457, 458, 418, 1105, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 1020, 0, 755, - 0, 584, 0, 0, 1097, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 1024, 0, 535, 508, 1113, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 1094, 504, 716, - 753, 754, 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, - 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 1114, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 1028, 690, 691, 492, - 493, 494, 495, 1098, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 1123, 1093, 1122, - 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, - 1119, 1118, 1120, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 989, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, - 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, - 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, - 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, - 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, - 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, - 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 1074, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 1060, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 1039, 1040, 709, 710, 0, 0, 1109, 486, 641, - 0, 974, 341, 342, 343, 1099, 345, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1026, 0, - 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, - 650, 684, 673, 762, 637, 0, 0, 0, 0, 0, - 0, 977, 0, 0, 0, 400, 0, 0, 469, 688, - 669, 680, 670, 512, 655, 656, 657, 664, 412, 658, - 794, 660, 629, 661, 630, 662, 663, 1017, 687, 636, - 548, 488, 0, 704, 0, 0, 1100, 1110, 0, 0, - 0, 0, 0, 0, 0, 0, 1095, 0, 0, 0, - 0, 0, 968, 0, 0, 1006, 1076, 1075, 993, 1003, - 0, 0, 371, 270, 631, 758, 633, 632, 994, 0, - 995, 999, 1002, 998, 996, 997, 0, 1090, 0, 0, - 0, 0, 0, 0, 0, 972, 0, 978, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 969, 970, 0, 0, 0, 0, 1027, - 0, 971, 0, 973, 0, 0, 0, 0, 549, 577, - 0, 590, 0, 438, 439, 1022, 1000, 1004, 0, 0, - 0, 0, 356, 556, 574, 372, 543, 588, 377, 551, - 567, 367, 505, 539, 0, 0, 358, 572, 550, 483, - 357, 0, 532, 397, 414, 394, 503, 1001, 0, 1025, - 1029, 393, 1116, 1023, 582, 360, 0, 581, 502, 475, - 568, 573, 484, 477, 0, 359, 570, 482, 476, 452, - 404, 1117, 453, 454, 455, 456, 457, 458, 418, 1105, - 473, 519, 419, 490, 489, 491, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 0, 0, 0, 0, - 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 750, 1020, - 0, 755, 0, 584, 0, 0, 1097, 0, 0, 0, - 554, 0, 0, 459, 0, 0, 0, 1024, 0, 535, - 508, 1113, 0, 0, 533, 471, 569, 520, 575, 557, - 583, 527, 521, 350, 558, 396, 485, 368, 370, 783, - 398, 401, 405, 406, 496, 497, 514, 542, 561, 562, - 563, 395, 382, 534, 383, 415, 384, 351, 387, 386, - 388, 544, 389, 353, 515, 566, 0, 411, 530, 480, - 354, 479, 516, 565, 564, 369, 592, 599, 600, 692, - 0, 605, 797, 798, 799, 614, 0, 522, 365, 362, - 0, 0, 0, 391, 517, 378, 380, 381, 379, 511, - 513, 619, 620, 621, 623, 624, 625, 626, 0, 0, - 0, 0, 627, 693, 711, 677, 646, 607, 701, 643, - 647, 648, 432, 433, 434, 435, 714, 0, 0, 0, - 598, 460, 461, 0, 403, 402, 481, 355, 0, 0, - 449, 431, 523, 361, 399, 451, 437, 462, 463, 464, - 465, 466, 0, 467, 468, 409, 340, 346, 791, 1094, - 504, 716, 753, 754, 638, 0, 1112, 1089, 1091, 1092, - 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, - 0, 694, 708, 795, 707, 787, 510, 0, 541, 705, - 652, 0, 698, 671, 672, 0, 699, 667, 703, 0, - 640, 0, 608, 611, 642, 729, 730, 731, 352, 610, - 733, 734, 735, 736, 737, 738, 739, 732, 1114, 675, - 651, 678, 589, 654, 653, 0, 0, 689, 1028, 690, - 691, 492, 493, 494, 495, 1098, 717, 376, 609, 525, - 526, 0, 676, 0, 0, 0, 0, 0, 0, 0, - 0, 681, 682, 679, 800, 0, 740, 741, 0, 0, - 603, 604, 408, 0, 622, 416, 375, 509, 410, 587, - 440, 0, 615, 683, 616, 528, 529, 744, 749, 745, - 746, 748, 769, 499, 430, 436, 545, 450, 472, 531, - 586, 507, 536, 373, 576, 547, 478, 668, 696, 1123, - 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, - 1035, 1036, 1119, 1118, 1120, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 725, 724, 723, 722, - 721, 720, 719, 718, 0, 0, 665, 390, 788, 782, - 789, 770, 773, 772, 747, 989, 347, 645, 470, 524, - 407, 712, 713, 0, 768, 1083, 1046, 1047, 1048, 979, - 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, - 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, - 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, - 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, - 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, - 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, - 1015, 0, 0, 593, 594, 595, 618, 0, 596, 578, - 644, 417, 348, 559, 585, 785, 786, 0, 0, 0, - 0, 0, 0, 0, 695, 706, 742, 743, 0, 756, - 757, 759, 761, 1074, 763, 552, 553, 771, 0, 0, - 441, 363, 364, 500, 501, 538, 0, 442, 443, 444, - 448, 445, 446, 447, 1060, 766, 767, 764, 474, 537, - 560, 546, 784, 487, 0, 792, 634, 635, 793, 752, - 751, 349, 0, 1039, 1040, 709, 710, 0, 0, 1109, - 486, 641, 0, 974, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 201, 246, - 200, 233, 202, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 234, 0, - 0, 0, 0, 0, 0, 226, 0, 400, 0, 235, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 659, 660, 629, 661, 630, 662, 663, 170, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 239, 0, 0, 269, 0, 0, - 0, 0, 0, 0, 371, 270, 631, 758, 633, 632, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 261, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 0, 0, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 0, - 0, 571, 601, 393, 591, 0, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 617, 453, 454, 455, 456, 457, 458, - 418, 518, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 199, 231, 243, 232, 84, 151, 0, 0, - 750, 0, 247, 755, 0, 584, 0, 0, 262, 0, - 0, 0, 554, 0, 0, 459, 153, 225, 224, 602, - 0, 535, 508, 275, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 284, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 152, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 726, 727, 728, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 579, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 265, 697, 700, - 628, 276, 0, 694, 708, 666, 707, 277, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 413, 717, 376, - 609, 525, 526, 167, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 274, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 79, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 282, 366, 283, 770, 773, 772, 747, 0, 347, 645, - 470, 524, 407, 712, 713, 72, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 278, 279, 55, - 263, 266, 268, 267, 0, 73, 695, 706, 742, 743, - 9, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 273, 487, 174, 280, 634, 635, - 281, 752, 751, 349, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 201, 246, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 1275, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 239, 0, 0, 269, 0, 0, - 0, 0, 0, 0, 371, 270, 631, 758, 633, 632, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 3081, 3084, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 0, 0, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 0, - 0, 571, 601, 393, 591, 0, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 617, 453, 454, 455, 456, 457, 458, - 418, 518, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 0, 247, 755, 3085, 584, 0, 0, 0, 3080, - 0, 3079, 554, 3076, 3082, 459, 0, 0, 0, 602, - 0, 535, 508, 796, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 3083, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 3077, 467, 468, 409, 340, 346, - 791, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 0, 697, 700, - 628, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 413, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 0, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 201, 246, - 200, 233, 202, 0, 0, 0, 0, 0, 0, 506, - 822, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 0, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 829, 0, 0, 0, 0, - 0, 0, 0, 0, 828, 0, 0, 269, 0, 0, - 0, 0, 0, 0, 371, 270, 631, 758, 633, 632, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 0, 0, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 0, - 0, 571, 601, 393, 591, 0, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 617, 453, 454, 455, 456, 457, 458, - 418, 518, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 824, 825, 0, - 750, 0, 247, 755, 0, 584, 0, 0, 0, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 602, - 0, 535, 508, 796, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 0, 697, 700, - 628, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 823, 827, 376, - 609, 525, 526, 838, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 79, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 0, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 0, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1655, 0, 0, 269, 0, 0, - 993, 1003, 0, 0, 371, 270, 631, 758, 633, 632, - 994, 0, 995, 999, 1002, 998, 996, 997, 0, 374, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 0, 1000, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 1001, - 0, 571, 601, 393, 591, 0, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 617, 453, 454, 455, 456, 457, 458, - 418, 518, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 0, 0, 755, 0, 584, 0, 0, 0, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 602, - 0, 535, 508, 796, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 0, 697, 700, - 628, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 413, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 0, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 0, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, - 0, 0, 0, 0, 371, 270, 631, 758, 633, 632, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 3081, 3084, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 0, 0, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 0, - 0, 571, 601, 393, 591, 0, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 617, 453, 454, 455, 456, 457, 458, - 418, 518, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 0, 0, 755, 3085, 584, 0, 0, 0, 3080, - 0, 3079, 554, 3076, 3082, 459, 0, 0, 0, 602, - 0, 535, 508, 796, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 3083, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 3077, 467, 468, 409, 340, 346, - 791, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 0, 697, 700, - 628, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 413, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 0, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 1354, 0, - 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 0, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, - 0, 0, 0, 0, 371, 270, 631, 758, 633, 632, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 3528, 3529, 1334, 0, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 3522, 3525, - 3526, 3527, 3530, 0, 3535, 3531, 3532, 3533, 3534, 0, - 0, 3518, 3519, 3520, 3521, 1332, 3497, 3523, 0, 3498, - 502, 3499, 3500, 3501, 3502, 3503, 1337, 3504, 3505, 3506, - 3507, 3508, 3515, 3516, 3509, 3510, 3511, 3512, 3513, 3514, - 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3545, 3544, - 3546, 3547, 3548, 3549, 3550, 3551, 3552, 3553, 1365, 1367, - 1369, 1371, 1374, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 0, 0, 755, 0, 584, 0, 0, 0, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 3517, - 0, 535, 508, 796, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 0, 697, 700, - 628, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 413, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 0, 347, 3524, - 470, 524, 407, 712, 713, 0, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 3496, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 1826, 341, 342, 343, 344, 345, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, - 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 506, 0, 0, 650, 684, 673, 762, 637, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, - 0, 469, 688, 669, 680, 670, 512, 655, 656, 657, - 664, 412, 658, 794, 660, 629, 661, 630, 662, 663, - 1275, 687, 636, 548, 488, 0, 704, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1823, 0, 0, 269, 0, - 0, 0, 0, 0, 0, 371, 270, 631, 758, 633, - 632, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 374, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 549, 577, 0, 590, 0, 438, 439, 0, 0, - 0, 0, 0, 0, 0, 356, 556, 574, 372, 543, - 588, 377, 551, 567, 367, 505, 539, 0, 0, 358, - 572, 550, 483, 357, 0, 532, 397, 414, 394, 503, - 0, 0, 571, 601, 393, 591, 0, 582, 360, 0, - 581, 502, 475, 568, 573, 484, 477, 0, 359, 570, - 482, 476, 452, 404, 617, 453, 454, 455, 456, 457, - 458, 418, 518, 473, 519, 419, 490, 489, 491, 420, - 421, 422, 423, 424, 425, 426, 427, 428, 429, 0, - 0, 0, 0, 0, 612, 613, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 750, 0, 247, 755, 0, 584, 0, 0, 0, - 0, 0, 0, 554, 0, 0, 459, 0, 0, 0, - 602, 0, 535, 508, 796, 0, 0, 533, 471, 569, - 520, 575, 557, 583, 527, 521, 350, 558, 396, 485, - 368, 370, 783, 398, 401, 405, 406, 496, 497, 514, - 542, 561, 562, 563, 395, 382, 534, 383, 415, 384, - 351, 387, 386, 388, 544, 389, 353, 515, 566, 0, - 411, 530, 480, 354, 479, 516, 565, 564, 369, 592, - 599, 600, 692, 0, 605, 797, 798, 799, 614, 0, - 522, 365, 362, 0, 0, 0, 391, 517, 378, 380, - 381, 379, 511, 513, 619, 620, 621, 623, 624, 625, - 626, 0, 0, 0, 0, 627, 693, 711, 677, 646, - 607, 701, 643, 647, 648, 432, 433, 434, 435, 714, - 0, 0, 0, 598, 460, 461, 0, 403, 402, 481, - 355, 0, 0, 449, 431, 523, 361, 399, 451, 437, - 462, 463, 464, 465, 466, 0, 467, 468, 409, 340, - 346, 791, 392, 504, 716, 753, 754, 638, 0, 702, - 639, 649, 385, 674, 686, 685, 498, 597, 0, 697, - 700, 628, 790, 0, 694, 708, 795, 707, 787, 510, - 0, 541, 705, 652, 0, 698, 671, 672, 0, 699, - 667, 703, 0, 640, 0, 608, 611, 642, 729, 730, - 731, 352, 610, 733, 734, 735, 736, 737, 738, 739, - 732, 580, 675, 651, 678, 589, 654, 653, 0, 0, - 689, 606, 690, 691, 492, 493, 494, 495, 413, 717, - 376, 609, 525, 526, 0, 676, 0, 0, 0, 0, - 0, 0, 0, 0, 681, 682, 679, 800, 0, 740, - 741, 0, 0, 603, 604, 408, 0, 622, 416, 375, - 509, 410, 587, 440, 0, 615, 683, 616, 528, 529, - 744, 749, 745, 746, 748, 769, 499, 430, 436, 545, - 450, 472, 531, 586, 507, 536, 373, 576, 547, 478, - 668, 696, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 327, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 725, - 724, 723, 722, 721, 720, 719, 718, 0, 0, 665, - 390, 788, 782, 789, 770, 773, 772, 747, 0, 347, - 645, 470, 524, 407, 712, 713, 0, 768, 285, 286, - 287, 288, 289, 290, 291, 292, 333, 293, 294, 295, - 296, 297, 298, 299, 304, 305, 306, 307, 308, 309, - 310, 311, 715, 302, 303, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 0, - 0, 0, 0, 334, 774, 775, 776, 777, 778, 0, - 0, 335, 336, 337, 0, 0, 300, 301, 328, 555, - 329, 330, 331, 332, 0, 0, 593, 594, 595, 618, - 0, 596, 578, 644, 417, 348, 559, 585, 785, 786, - 0, 0, 0, 0, 0, 0, 0, 695, 706, 742, - 743, 0, 756, 757, 759, 761, 760, 763, 552, 553, - 771, 0, 0, 441, 363, 364, 500, 501, 538, 0, - 442, 443, 444, 448, 445, 446, 447, 765, 766, 767, - 764, 474, 537, 560, 546, 784, 487, 0, 792, 634, - 635, 793, 752, 751, 349, 0, 338, 339, 709, 710, - 0, 0, 540, 486, 641, 0, 2476, 341, 342, 343, - 344, 345, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 506, 0, 0, 650, 684, 673, 762, 637, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 400, 0, 0, 469, 688, 669, 680, 670, 512, 655, - 656, 657, 664, 412, 658, 794, 660, 629, 661, 630, - 662, 663, 0, 687, 636, 548, 488, 0, 704, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 0, 0, 371, 270, 631, - 758, 633, 632, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 374, 0, 3103, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 549, 577, 0, 590, 0, 438, 439, - 0, 0, 0, 0, 0, 0, 0, 356, 556, 574, - 372, 543, 588, 377, 551, 567, 367, 505, 539, 0, - 0, 358, 572, 550, 483, 357, 0, 532, 397, 414, - 394, 503, 0, 0, 571, 601, 393, 591, 0, 582, - 360, 0, 581, 502, 475, 568, 573, 484, 477, 0, - 359, 570, 482, 476, 452, 404, 617, 453, 454, 455, - 456, 457, 458, 418, 518, 473, 519, 419, 490, 489, - 491, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 0, 0, 0, 0, 0, 612, 613, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 750, 0, 0, 755, 3102, 584, 0, - 0, 0, 3109, 3105, 3107, 554, 0, 3106, 459, 0, - 0, 0, 602, 0, 535, 508, 796, 0, 3100, 533, - 471, 569, 520, 575, 557, 583, 527, 521, 350, 558, - 396, 485, 368, 370, 783, 398, 401, 405, 406, 496, - 497, 514, 542, 561, 562, 563, 395, 382, 534, 383, - 415, 384, 351, 387, 386, 388, 544, 389, 353, 515, - 566, 3108, 411, 530, 480, 354, 479, 516, 565, 564, - 369, 592, 599, 600, 692, 0, 605, 797, 798, 799, - 614, 0, 522, 365, 362, 0, 0, 0, 391, 517, - 378, 380, 381, 379, 511, 513, 619, 620, 621, 623, - 624, 625, 626, 0, 0, 0, 0, 627, 693, 711, - 677, 646, 607, 701, 643, 647, 648, 432, 433, 434, - 435, 714, 0, 0, 0, 598, 460, 461, 0, 403, - 402, 481, 355, 0, 0, 449, 431, 523, 361, 399, - 451, 437, 462, 463, 464, 465, 466, 0, 467, 468, - 409, 340, 346, 791, 392, 504, 716, 753, 754, 638, - 0, 702, 639, 649, 385, 674, 686, 685, 498, 597, - 0, 697, 700, 628, 790, 0, 694, 708, 795, 707, - 787, 510, 0, 541, 705, 652, 0, 698, 671, 672, - 0, 699, 667, 703, 0, 640, 0, 608, 611, 642, - 729, 730, 731, 352, 610, 733, 734, 735, 736, 737, - 738, 739, 732, 580, 675, 651, 678, 589, 654, 653, - 0, 0, 689, 606, 690, 691, 492, 493, 494, 495, - 413, 717, 376, 609, 525, 526, 0, 676, 0, 0, - 0, 0, 0, 0, 0, 0, 681, 682, 679, 800, - 0, 740, 741, 0, 0, 603, 604, 408, 0, 622, - 416, 375, 509, 410, 587, 440, 0, 615, 683, 616, - 528, 529, 744, 749, 745, 746, 748, 769, 499, 430, - 436, 545, 450, 472, 531, 586, 507, 536, 373, 576, - 547, 478, 668, 696, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 327, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 725, 724, 723, 722, 721, 720, 719, 718, 0, - 0, 665, 390, 788, 782, 789, 770, 773, 772, 747, - 0, 347, 645, 470, 524, 407, 712, 713, 0, 768, - 285, 286, 287, 288, 289, 290, 291, 292, 333, 293, - 294, 295, 296, 297, 298, 299, 304, 305, 306, 307, - 308, 309, 310, 311, 715, 302, 303, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 0, 0, 0, 0, 334, 774, 775, 776, 777, - 778, 0, 0, 335, 336, 337, 0, 0, 300, 301, - 328, 555, 329, 330, 331, 332, 0, 0, 593, 594, - 595, 618, 0, 596, 578, 644, 417, 348, 559, 585, - 785, 786, 0, 0, 0, 0, 0, 0, 0, 695, - 706, 742, 743, 0, 756, 757, 759, 761, 760, 763, - 552, 553, 771, 0, 0, 441, 363, 364, 500, 501, - 538, 0, 442, 443, 444, 448, 445, 446, 447, 765, - 766, 767, 764, 474, 537, 560, 546, 784, 487, 0, - 792, 634, 635, 793, 752, 751, 349, 0, 338, 339, - 709, 710, 0, 0, 540, 486, 641, 341, 342, 343, - 344, 345, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 506, 0, 0, 650, 684, 673, 762, 637, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 400, 0, 0, 469, 688, 669, 680, 670, 512, 655, - 656, 657, 664, 412, 658, 794, 660, 629, 661, 630, - 662, 663, 0, 687, 636, 548, 488, 0, 704, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 0, 0, 371, 270, 631, - 758, 633, 632, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 374, 0, 3103, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 549, 577, 0, 590, 0, 438, 439, - 0, 0, 0, 0, 0, 0, 0, 356, 556, 574, - 372, 543, 588, 377, 551, 567, 367, 505, 539, 0, - 0, 358, 572, 550, 483, 357, 0, 532, 397, 414, - 394, 503, 0, 0, 571, 601, 393, 591, 0, 582, - 360, 0, 581, 502, 475, 568, 573, 484, 477, 0, - 359, 570, 482, 476, 452, 404, 617, 453, 454, 455, - 456, 457, 458, 418, 518, 473, 519, 419, 490, 489, - 491, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 0, 0, 0, 0, 0, 612, 613, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 750, 0, 0, 755, 3102, 584, 0, - 0, 0, 3109, 3105, 3107, 554, 0, 3106, 459, 0, - 0, 0, 602, 0, 535, 508, 796, 0, 0, 533, - 471, 569, 520, 575, 557, 583, 527, 521, 350, 558, - 396, 485, 368, 370, 783, 398, 401, 405, 406, 496, - 497, 514, 542, 561, 562, 563, 395, 382, 534, 383, - 415, 384, 351, 387, 386, 388, 544, 389, 353, 515, - 566, 3108, 411, 530, 480, 354, 479, 516, 565, 564, - 369, 592, 599, 600, 692, 0, 605, 797, 798, 799, - 614, 0, 522, 365, 362, 0, 0, 0, 391, 517, - 378, 380, 381, 379, 511, 513, 619, 620, 621, 623, - 624, 625, 626, 0, 0, 0, 0, 627, 693, 711, - 677, 646, 607, 701, 643, 647, 648, 432, 433, 434, - 435, 714, 0, 0, 0, 598, 460, 461, 0, 403, - 402, 481, 355, 0, 0, 449, 431, 523, 361, 399, - 451, 437, 462, 463, 464, 465, 466, 0, 467, 468, - 409, 340, 346, 791, 392, 504, 716, 753, 754, 638, - 0, 702, 639, 649, 385, 674, 686, 685, 498, 597, - 0, 697, 700, 628, 790, 0, 694, 708, 795, 707, - 787, 510, 0, 541, 705, 652, 0, 698, 671, 672, - 0, 699, 667, 703, 0, 640, 0, 608, 611, 642, - 729, 730, 731, 352, 610, 733, 734, 735, 736, 737, - 738, 739, 732, 580, 675, 651, 678, 589, 654, 653, - 0, 0, 689, 606, 690, 691, 492, 493, 494, 495, - 413, 717, 376, 609, 525, 526, 0, 676, 0, 0, - 0, 0, 0, 0, 0, 0, 681, 682, 679, 800, - 0, 740, 741, 0, 0, 603, 604, 408, 0, 622, - 416, 375, 509, 410, 587, 440, 0, 615, 683, 616, - 528, 529, 744, 749, 745, 746, 748, 769, 499, 430, - 436, 545, 450, 472, 531, 586, 507, 536, 373, 576, - 547, 478, 668, 696, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 327, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 725, 724, 723, 722, 721, 720, 719, 718, 0, - 0, 665, 390, 788, 782, 789, 770, 773, 772, 747, - 0, 347, 645, 470, 524, 407, 712, 713, 0, 768, - 285, 286, 287, 288, 289, 290, 291, 292, 333, 293, - 294, 295, 296, 297, 298, 299, 304, 305, 306, 307, - 308, 309, 310, 311, 715, 302, 303, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 0, 0, 0, 0, 334, 774, 775, 776, 777, - 778, 0, 0, 335, 336, 337, 0, 0, 300, 301, - 328, 555, 329, 330, 331, 332, 0, 0, 593, 594, - 595, 618, 0, 596, 578, 644, 417, 348, 559, 585, - 785, 786, 0, 0, 0, 0, 0, 0, 0, 695, - 706, 742, 743, 0, 756, 757, 759, 761, 760, 763, - 552, 553, 771, 0, 0, 441, 363, 364, 500, 501, - 538, 0, 442, 443, 444, 448, 445, 446, 447, 765, - 766, 767, 764, 474, 537, 560, 546, 784, 487, 0, - 792, 634, 635, 793, 752, 751, 349, 0, 338, 339, - 709, 710, 0, 0, 540, 486, 641, 341, 342, 343, - 344, 345, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 201, 246, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 506, 0, 0, 650, 684, 673, 762, 637, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 400, 0, 0, 469, 688, 669, 680, 670, 512, 655, - 656, 657, 664, 412, 658, 794, 660, 629, 661, 630, - 662, 663, 1275, 687, 636, 548, 488, 0, 704, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 239, 3264, 0, - 269, 0, 0, 0, 0, 0, 0, 371, 270, 631, - 758, 633, 632, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 374, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 549, 577, 0, 590, 0, 438, 439, - 0, 0, 0, 0, 0, 0, 0, 356, 556, 574, - 372, 543, 588, 377, 551, 567, 367, 505, 539, 0, - 0, 358, 572, 550, 483, 357, 0, 532, 397, 414, - 394, 503, 0, 0, 571, 601, 393, 591, 0, 582, - 360, 0, 581, 502, 475, 568, 573, 484, 477, 0, - 359, 570, 482, 476, 452, 404, 617, 453, 454, 455, - 456, 457, 458, 418, 518, 473, 519, 419, 490, 489, - 491, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 0, 0, 0, 0, 0, 612, 613, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 750, 0, 247, 755, 0, 584, 0, - 0, 0, 0, 0, 0, 554, 0, 0, 459, 0, - 0, 0, 602, 0, 535, 508, 796, 0, 0, 533, - 471, 569, 520, 575, 557, 583, 527, 521, 350, 558, - 396, 485, 368, 370, 783, 398, 401, 405, 406, 496, - 497, 514, 542, 561, 562, 563, 395, 382, 534, 383, - 415, 384, 351, 387, 386, 388, 544, 389, 353, 515, - 566, 0, 411, 530, 480, 354, 479, 516, 565, 564, - 369, 592, 599, 600, 692, 0, 605, 797, 798, 799, - 614, 0, 522, 365, 362, 0, 0, 0, 391, 517, - 378, 380, 381, 379, 511, 513, 619, 620, 621, 623, - 624, 625, 626, 0, 0, 0, 0, 627, 693, 711, - 677, 646, 607, 701, 643, 647, 648, 432, 433, 434, - 435, 714, 0, 0, 0, 598, 460, 461, 0, 403, - 402, 481, 355, 0, 0, 449, 431, 523, 361, 399, - 451, 437, 462, 463, 464, 465, 466, 0, 467, 468, - 409, 340, 346, 791, 392, 504, 716, 753, 754, 638, - 0, 702, 639, 649, 385, 674, 686, 685, 498, 597, - 0, 697, 700, 628, 790, 0, 694, 708, 795, 707, - 787, 510, 0, 541, 705, 652, 0, 698, 671, 672, - 0, 699, 667, 703, 0, 640, 0, 608, 611, 642, - 729, 730, 731, 352, 610, 733, 734, 735, 736, 737, - 738, 739, 732, 580, 675, 651, 678, 589, 654, 653, - 0, 0, 689, 606, 690, 691, 492, 493, 494, 495, - 413, 717, 376, 609, 525, 526, 0, 676, 0, 0, - 0, 0, 0, 0, 0, 0, 681, 682, 679, 800, - 0, 740, 741, 0, 0, 603, 604, 408, 0, 622, - 416, 375, 509, 410, 587, 440, 0, 615, 683, 616, - 528, 529, 744, 749, 745, 746, 748, 769, 499, 430, - 436, 545, 450, 472, 531, 586, 507, 536, 373, 576, - 547, 478, 668, 696, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 327, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 725, 724, 723, 722, 721, 720, 719, 718, 0, - 0, 665, 390, 788, 782, 789, 770, 773, 772, 747, - 0, 347, 645, 470, 524, 407, 712, 713, 0, 768, - 285, 286, 287, 288, 289, 290, 291, 292, 333, 293, - 294, 295, 296, 297, 298, 299, 304, 305, 306, 307, - 308, 309, 310, 311, 715, 302, 303, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 0, 0, 0, 0, 334, 774, 775, 776, 777, - 778, 0, 0, 335, 336, 337, 0, 0, 300, 301, - 328, 555, 329, 330, 331, 332, 0, 0, 593, 594, - 595, 618, 0, 596, 578, 644, 417, 348, 559, 585, - 785, 786, 0, 0, 0, 0, 0, 0, 0, 695, - 706, 742, 743, 0, 756, 757, 759, 761, 760, 763, - 552, 553, 771, 0, 0, 441, 363, 364, 500, 501, - 538, 0, 442, 443, 444, 448, 445, 446, 447, 765, - 766, 767, 764, 474, 537, 560, 546, 784, 487, 0, - 792, 634, 635, 793, 752, 751, 349, 0, 338, 339, - 709, 710, 0, 0, 540, 486, 641, 341, 342, 343, - 344, 345, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 201, 246, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 506, 0, 0, 650, 684, 673, 762, 637, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 400, 0, 0, 469, 688, 669, 680, 670, 512, 655, - 656, 657, 664, 412, 658, 794, 660, 629, 661, 630, - 662, 663, 1275, 687, 636, 548, 488, 0, 704, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 239, 3003, 0, - 269, 0, 0, 0, 0, 0, 0, 371, 270, 631, - 758, 633, 632, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 374, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 549, 577, 0, 590, 0, 438, 439, - 0, 0, 0, 0, 0, 0, 0, 356, 556, 574, - 372, 543, 588, 377, 551, 567, 367, 505, 539, 0, - 0, 358, 572, 550, 483, 357, 0, 532, 397, 414, - 394, 503, 0, 0, 571, 601, 393, 591, 0, 582, - 360, 0, 581, 502, 475, 568, 573, 484, 477, 0, - 359, 570, 482, 476, 452, 404, 617, 453, 454, 455, - 456, 457, 458, 418, 518, 473, 519, 419, 490, 489, - 491, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 0, 0, 0, 0, 0, 612, 613, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 750, 0, 247, 755, 0, 584, 0, - 0, 0, 0, 0, 0, 554, 0, 0, 459, 0, - 0, 0, 602, 0, 535, 508, 796, 0, 0, 533, - 471, 569, 520, 575, 557, 583, 527, 521, 350, 558, - 396, 485, 368, 370, 783, 398, 401, 405, 406, 496, - 497, 514, 542, 561, 562, 563, 395, 382, 534, 383, - 415, 384, 351, 387, 386, 388, 544, 389, 353, 515, - 566, 0, 411, 530, 480, 354, 479, 516, 565, 564, - 369, 592, 599, 600, 692, 0, 605, 797, 798, 799, - 614, 0, 522, 365, 362, 0, 0, 0, 391, 517, - 378, 380, 381, 379, 511, 513, 619, 620, 621, 623, - 624, 625, 626, 0, 0, 0, 0, 627, 693, 711, - 677, 646, 607, 701, 643, 647, 648, 432, 433, 434, - 435, 714, 0, 0, 0, 598, 460, 461, 0, 403, - 402, 481, 355, 0, 0, 449, 431, 523, 361, 399, - 451, 437, 462, 463, 464, 465, 466, 0, 467, 468, - 409, 340, 346, 791, 392, 504, 716, 753, 754, 638, - 0, 702, 639, 649, 385, 674, 686, 685, 498, 597, - 0, 697, 700, 628, 790, 0, 694, 708, 795, 707, - 787, 510, 0, 541, 705, 652, 0, 698, 671, 672, - 0, 699, 667, 703, 0, 640, 0, 608, 611, 642, - 729, 730, 731, 352, 610, 733, 734, 735, 736, 737, - 738, 739, 732, 580, 675, 651, 678, 589, 654, 653, - 0, 0, 689, 606, 690, 691, 492, 493, 494, 495, - 413, 717, 376, 609, 525, 526, 0, 676, 0, 0, - 0, 0, 0, 0, 0, 0, 681, 682, 679, 800, - 0, 740, 741, 0, 0, 603, 604, 408, 0, 622, - 416, 375, 509, 410, 587, 440, 0, 615, 683, 616, - 528, 529, 744, 749, 745, 746, 748, 769, 499, 430, - 436, 545, 450, 472, 531, 586, 507, 536, 373, 576, - 547, 478, 668, 696, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 327, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 725, 724, 723, 722, 721, 720, 719, 718, 0, - 0, 665, 390, 788, 782, 789, 770, 773, 772, 747, - 0, 347, 645, 470, 524, 407, 712, 713, 0, 768, - 285, 286, 287, 288, 289, 290, 291, 292, 333, 293, - 294, 295, 296, 297, 298, 299, 304, 305, 306, 307, - 308, 309, 310, 311, 715, 302, 303, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 0, 0, 0, 0, 334, 774, 775, 776, 777, - 778, 0, 0, 335, 336, 337, 0, 0, 300, 301, - 328, 555, 329, 330, 331, 332, 0, 0, 593, 594, - 595, 618, 0, 596, 578, 644, 417, 348, 559, 585, - 785, 786, 0, 0, 0, 0, 0, 0, 0, 695, - 706, 742, 743, 0, 756, 757, 759, 761, 760, 763, - 552, 553, 771, 0, 0, 441, 363, 364, 500, 501, - 538, 0, 442, 443, 444, 448, 445, 446, 447, 765, - 766, 767, 764, 474, 537, 560, 546, 784, 487, 0, - 792, 634, 635, 793, 752, 751, 349, 0, 338, 339, - 709, 710, 0, 0, 540, 486, 641, 1826, 341, 342, - 343, 344, 345, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 506, 0, 0, 650, 684, 673, 762, - 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 400, 0, 0, 469, 688, 669, 680, 670, 512, - 655, 656, 657, 664, 412, 658, 794, 660, 629, 661, - 630, 662, 663, 0, 687, 636, 548, 488, 0, 704, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1823, 0, - 0, 269, 0, 0, 0, 0, 0, 0, 371, 270, - 631, 758, 633, 632, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 374, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 549, 577, 0, 590, 0, 438, - 439, 0, 0, 0, 0, 0, 0, 0, 356, 556, - 574, 372, 543, 588, 377, 551, 567, 367, 505, 539, - 0, 0, 358, 572, 550, 483, 357, 0, 532, 397, - 414, 394, 503, 0, 0, 571, 601, 393, 591, 0, - 582, 360, 0, 581, 502, 475, 568, 573, 484, 477, - 0, 359, 570, 482, 476, 452, 404, 617, 453, 454, - 455, 456, 457, 458, 418, 518, 473, 519, 419, 490, - 489, 491, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 0, 0, 0, 0, 0, 612, 613, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 750, 0, 0, 755, 0, 584, - 0, 0, 0, 0, 0, 0, 554, 0, 0, 459, - 0, 0, 0, 602, 0, 535, 508, 796, 0, 0, - 533, 471, 569, 520, 575, 557, 583, 527, 521, 350, - 558, 396, 485, 368, 370, 783, 398, 401, 405, 406, - 496, 497, 514, 542, 561, 562, 563, 395, 382, 534, - 383, 415, 384, 351, 387, 386, 388, 544, 389, 353, - 515, 566, 0, 411, 530, 480, 354, 479, 516, 565, - 564, 369, 592, 599, 600, 692, 0, 605, 797, 798, - 799, 614, 0, 522, 365, 362, 0, 0, 0, 391, - 517, 378, 380, 381, 379, 511, 513, 619, 620, 621, - 623, 624, 625, 626, 0, 0, 0, 0, 627, 693, - 711, 677, 646, 607, 701, 643, 647, 648, 432, 433, - 434, 435, 714, 0, 0, 0, 598, 460, 461, 0, - 403, 402, 481, 355, 0, 0, 449, 431, 523, 361, - 399, 451, 437, 462, 463, 464, 465, 466, 0, 467, - 468, 409, 340, 346, 791, 392, 504, 716, 753, 754, - 638, 0, 702, 639, 649, 385, 674, 686, 685, 498, - 597, 0, 697, 700, 628, 790, 0, 694, 708, 795, - 707, 787, 510, 0, 541, 705, 652, 0, 698, 671, - 672, 0, 699, 667, 703, 0, 640, 0, 608, 611, - 642, 729, 730, 731, 352, 610, 733, 734, 735, 736, - 737, 738, 739, 732, 580, 675, 651, 678, 589, 654, - 653, 0, 0, 689, 606, 690, 691, 492, 493, 494, - 495, 413, 717, 376, 609, 525, 526, 0, 676, 0, - 0, 0, 0, 0, 0, 0, 0, 681, 682, 679, - 800, 0, 740, 741, 0, 0, 603, 604, 408, 0, - 622, 416, 375, 509, 410, 587, 440, 0, 615, 683, - 616, 528, 529, 744, 749, 745, 746, 748, 769, 499, - 430, 436, 545, 450, 472, 531, 586, 507, 536, 373, - 576, 547, 478, 668, 696, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 326, 327, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 725, 724, 723, 722, 721, 720, 719, 718, - 0, 0, 665, 390, 788, 782, 789, 770, 773, 772, - 747, 0, 347, 645, 470, 524, 407, 712, 713, 0, - 768, 285, 286, 287, 288, 289, 290, 291, 292, 333, - 293, 294, 295, 296, 297, 298, 299, 304, 305, 306, - 307, 308, 309, 310, 311, 715, 302, 303, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - 324, 325, 0, 0, 0, 0, 334, 774, 775, 776, - 777, 778, 0, 0, 335, 336, 337, 0, 0, 300, - 301, 328, 555, 329, 330, 331, 332, 0, 0, 593, - 594, 595, 618, 0, 596, 578, 644, 417, 348, 559, - 585, 785, 786, 0, 0, 0, 0, 0, 0, 0, - 695, 706, 742, 743, 0, 756, 757, 759, 761, 760, - 763, 552, 553, 771, 0, 0, 441, 363, 364, 500, - 501, 538, 0, 442, 443, 444, 448, 445, 446, 447, - 765, 766, 767, 764, 474, 537, 560, 546, 784, 487, - 0, 792, 634, 635, 793, 752, 751, 349, 0, 338, - 339, 709, 710, 0, 0, 540, 486, 641, 0, 2476, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 1248, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 1255, 1256, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1259, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 1242, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 904, 582, 360, 903, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 1246, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 1247, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 1250, 690, 691, 492, - 493, 494, 495, 413, 717, 1245, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 1257, 1243, 1253, 1244, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 1254, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 1241, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 1255, 1256, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1259, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 904, 582, 360, 903, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 1257, 2590, 1253, 2591, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 1254, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 3818, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3821, 0, 0, 0, 0, 3820, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 2650, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 2651, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 1576, 0, - 1577, 1575, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 0, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 1885, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 1883, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1881, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 1879, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 1883, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1881, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 1844, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1845, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 1843, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 1209, 0, 0, 0, 0, - 0, 0, 1214, 400, 0, 0, 469, 688, 1210, 680, - 670, 1212, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 1213, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5335, 0, 269, 1076, 0, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 1883, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1881, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 1883, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 2205, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 4718, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4719, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 2650, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 2651, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 4299, 4300, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 4057, 4059, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3678, 0, 0, 269, 0, 0, 3682, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3672, 0, 0, 269, 0, 0, 3676, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 1826, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1823, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 3194, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 1883, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 1883, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 2088, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 2087, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 5424, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 5356, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 1076, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5300, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2219, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4980, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 4945, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 4633, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4465, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 4463, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3682, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3301, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3676, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 4452, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4134, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 2468, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 2470, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 0, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 4399, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3445, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4258, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 4100, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4029, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3897, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 1883, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 2470, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 3724, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3693, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3593, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3574, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3452, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3414, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2768, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3279, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3227, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3225, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3017, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 2403, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 1455, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 2626, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 2555, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 1926, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1214, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 819, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 1217, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 955, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 954, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 4949, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 4032, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 2468, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 2470, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 0, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 2385, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 1862, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 1860, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 1765, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 906, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 907, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 843, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 0, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 0, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 928, 927, 934, 924, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 931, 932, 0, 933, 937, 0, - 0, 918, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 942, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 946, - 0, 0, 948, 0, 0, 0, 0, 947, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1005, 5419, 980, 5438, 1007, 5404, 5472, 4996, 5411, 5408, + 270, 5456, 2016, 5300, 3729, 5403, 5387, 5428, 5294, 5007, + 3864, 4558, 990, 5238, 4011, 2017, 4623, 4568, 2169, 5304, + 4237, 5305, 5293, 5005, 3733, 4218, 4063, 5162, 3243, 5227, + 4891, 4311, 5069, 1902, 4808, 4534, 3514, 4997, 3744, 4938, + 3298, 5086, 4835, 3014, 4065, 4312, 4618, 1674, 793, 2228, + 5004, 5128, 4718, 3635, 5239, 5008, 4990, 4432, 1510, 2244, + 5241, 4309, 3747, 1036, 1282, 4762, 816, 1919, 4968, 1275, + 3510, 3901, 1957, 257, 5, 2231, 4446, 4631, 833, 843, + 4440, 853, 1517, 4135, 853, 3109, 1485, 4518, 4200, 4747, + 3429, 3428, 4205, 1918, 3454, 4489, 3512, 4725, 4731, 4134, + 3681, 3647, 2172, 3636, 4391, 1432, 4116, 4701, 982, 4292, + 3637, 2472, 3422, 1284, 3033, 2502, 3291, 3865, 4120, 2629, + 4430, 1920, 3828, 3863, 3760, 4202, 4233, 1481, 175, 847, + 16, 4212, 4467, 932, 3718, 1549, 3712, 3336, 3530, 16, + 255, 2495, 3860, 3522, 2626, 3716, 2679, 4260, 3710, 3849, + 923, 4381, 3614, 2804, 848, 34, 4098, 4084, 2250, 3481, + 4096, 3238, 972, 927, 34, 4211, 2111, 2227, 1895, 3123, + 4137, 4136, 4147, 3054, 2027, 2365, 3039, 3042, 3629, 1190, + 3034, 1932, 2005, 4132, 2009, 2957, 2956, 1823, 973, 4043, + 3271, 3528, 2000, 1985, 2847, 2800, 833, 1235, 1790, 2684, + 3249, 2643, 2799, 3335, 2622, 839, 1990, 3602, 904, 3596, + 977, 2496, 3762, 244, 3213, 3650, 3088, 2022, 3685, 2503, + 3053, 4, 2504, 3684, 1821, 1739, 3031, 3110, 3016, 266, + 7, 793, 3037, 3207, 265, 6, 3735, 1269, 2435, 844, + 17, 2245, 2801, 2164, 833, 1349, 2030, 3044, 981, 17, + 2768, 2516, 3006, 2168, 1835, 3041, 1911, 1880, 2843, 2478, + 270, 1958, 270, 1520, 1339, 1340, 815, 1874, 1865, 2462, + 971, 2959, 833, 2206, 2238, 2155, 3009, 1547, 2110, 1671, + 1266, 1450, 3113, 1499, 2040, 991, 2701, 1965, 2425, 26, + 2430, 2163, 1467, 1268, 1291, 792, 251, 846, 15, 1154, + 1879, 973, 2434, 1863, 1876, 2456, 1234, 15, 845, 40, + 1155, 1151, 1828, 920, 929, 250, 5388, 2251, 40, 1232, + 1765, 834, 256, 3214, 930, 1824, 1495, 1840, 5, 1153, + 849, 46, 88, 56, 926, 1318, 1675, 1156, 852, 1822, + 46, 1214, 44, 31, 1227, 80, 89, 27, 1521, 30, + 888, 243, 19, 10, 158, 83, 1150, 82, 78, 2483, + 2487, 2488, 2489, 2484, 2494, 2485, 2491, 2773, 5113, 2486, + 1598, 2492, 1599, 1597, 1286, 1598, 4964, 1599, 1597, 3478, + 1598, 3478, 1599, 1597, 16, 3478, 2483, 2487, 2488, 2489, + 2484, 2494, 2485, 2491, 2508, 1336, 2486, 4487, 2492, 16, + 3683, 16, 4325, 2393, 3215, 4172, 4054, 4053, 3916, 34, + 1335, 3915, 1337, 2816, 1433, 1766, 4681, 4449, 1434, 978, + 4304, 3370, 3277, 1904, 34, 823, 34, 3275, 1767, 3274, + 3272, 825, 857, 2382, 819, 820, 1332, 821, 822, 1968, + 1331, 254, 2483, 2487, 2488, 2489, 2484, 2494, 2485, 2491, + 1972, 3455, 2486, 4883, 2492, 4181, 3423, 2920, 1372, 1288, + 3032, 4490, 2483, 2487, 2488, 2489, 2484, 2494, 2485, 2491, + 3299, 818, 2486, 2955, 2492, 1760, 1330, 2475, 2139, 1540, + 1433, 3853, 3854, 1533, 7, 3208, 1534, 917, 3290, 6, + 1477, 1478, 1479, 1878, 17, 1332, 5216, 5140, 1717, 1476, + 2483, 2487, 2488, 2489, 2484, 2494, 2485, 2491, 2726, 17, + 2486, 17, 2492, 2031, 4330, 2761, 1332, 2762, 2757, 1936, + 1851, 1794, 4465, 3244, 4055, 1147, 1475, 2961, 4665, 2727, + 4051, 2971, 2389, 1769, 4029, 4026, 5399, 1538, 9, 2376, + 5154, 2951, 1748, 1970, 4036, 4034, 4616, 1177, 1372, 3896, + 1174, 3894, 15, 2689, 1281, 1598, 4800, 1599, 1597, 1598, + 4318, 1599, 1597, 40, 5302, 5301, 5081, 15, 4899, 15, + 4892, 4619, 4027, 1279, 4310, 4024, 5244, 3036, 40, 1669, + 40, 1280, 1283, 1152, 1091, 46, 2373, 1536, 3989, 4038, + 2229, 2230, 3187, 4082, 2708, 1390, 1391, 1352, 2797, 3152, + 46, 5443, 46, 5096, 5395, 4910, 2084, 5093, 1165, 4670, + 4907, 4950, 4420, 3403, 2978, 5174, 1468, 1933, 1380, 1384, + 1386, 1388, 1393, 4668, 1398, 1394, 1395, 1396, 1397, 1775, + 1773, 1375, 1376, 1377, 1378, 1350, 1351, 1381, 1147, 1353, + 2036, 1354, 1356, 1357, 1358, 1359, 1355, 1360, 1361, 1362, + 1363, 1364, 1371, 1373, 1365, 1366, 1367, 1368, 1369, 1370, + 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1408, 1407, + 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1383, 1385, + 1387, 1389, 1392, 1772, 4415, 1390, 1391, 1352, 4085, 2577, + 2995, 1178, 1175, 1293, 1138, 925, 1137, 1139, 1140, 3984, + 1141, 1142, 2814, 1817, 3858, 3010, 4952, 3509, 1380, 1384, + 1386, 1388, 1393, 3234, 1398, 1394, 1395, 1396, 1397, 1374, + 1166, 1375, 1376, 1377, 1378, 1350, 1351, 1381, 1473, 1353, + 1474, 1354, 1356, 1357, 1358, 1359, 1355, 1360, 1361, 1362, + 1363, 1364, 1371, 1373, 1365, 1366, 1367, 1368, 1369, 1370, + 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1408, 1407, + 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1383, 1385, + 1387, 1389, 1392, 1178, 4028, 1594, 1175, 4025, 961, 2592, + 2102, 963, 3507, 1535, 961, 3221, 962, 963, 3220, 2034, + 2617, 3222, 962, 3900, 2156, 1533, 3235, 2160, 1534, 2402, + 2400, 3870, 3871, 2639, 2606, 2607, 1971, 1969, 833, 1374, + 2033, 2407, 2408, 1881, 3869, 1883, 1782, 2605, 833, 1472, + 3193, 2159, 3192, 833, 3598, 1436, 2286, 4039, 2490, 3348, + 3347, 1507, 1516, 3505, 3599, 3292, 1515, 1518, 1519, 4222, + 5360, 1342, 1625, 4220, 1631, 853, 853, 1464, 961, 1518, + 1519, 963, 4499, 4062, 913, 2490, 962, 1587, 2171, 1435, + 1628, 1630, 1624, 3506, 1629, 1611, 1610, 1620, 1621, 1622, + 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1612, 5308, + 5309, 1626, 2126, 2150, 3597, 1592, 3075, 1278, 2488, 2489, + 979, 1427, 4918, 1277, 1625, 1176, 1631, 2867, 1173, 1536, + 5248, 5344, 5247, 5343, 1574, 5246, 5342, 1575, 3502, 833, + 833, 2490, 1628, 1630, 1624, 1172, 1629, 1611, 1610, 1620, + 1621, 1622, 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, + 1612, 2490, 5248, 1626, 4909, 1577, 2100, 5245, 5341, 5247, + 1426, 5246, 5260, 5245, 5338, 2927, 1514, 4313, 1428, 5084, + 2161, 5229, 5229, 1511, 3902, 1511, 1487, 5390, 5391, 3907, + 5232, 833, 2392, 4672, 1539, 4313, 3903, 1537, 3904, 2490, + 1286, 4895, 3321, 2175, 2158, 1858, 1937, 4744, 1852, 5112, + 1644, 2818, 1795, 4037, 1437, 2623, 1759, 4963, 5124, 3503, + 4337, 3782, 3946, 4334, 4431, 1484, 3477, 2613, 4110, 1637, + 206, 252, 2810, 1493, 2815, 3641, 2151, 3508, 1434, 3206, + 1503, 4710, 4112, 4438, 830, 2175, 1434, 3195, 3942, 1523, + 1524, 3519, 1526, 1527, 1861, 1434, 1529, 3004, 1436, 5087, + 5088, 5089, 5090, 3850, 2148, 206, 252, 205, 239, 207, + 3917, 4954, 4955, 1440, 1444, 3914, 1447, 1590, 1591, 1382, + 2852, 3643, 4107, 4108, 4547, 1288, 4669, 5262, 1567, 3940, + 1572, 1569, 1679, 2772, 2728, 1505, 2493, 3471, 4109, 1589, + 4056, 1453, 1456, 2962, 4917, 4184, 3634, 1332, 5307, 1332, + 2101, 3362, 4919, 236, 1332, 3186, 1332, 3189, 1554, 1570, + 3150, 1434, 1562, 2493, 2157, 1535, 1332, 1332, 3188, 2403, + 2401, 4617, 842, 1801, 2817, 2637, 2638, 1579, 1254, 4760, + 1580, 841, 1286, 1585, 1586, 3895, 206, 252, 205, 239, + 207, 3841, 1573, 3198, 3199, 4960, 3638, 1799, 2735, 3197, + 4877, 4707, 1458, 3504, 2174, 2173, 1281, 4874, 1582, 1382, + 2575, 4876, 1457, 4875, 4666, 4117, 1678, 4118, 3299, 2493, + 3273, 3605, 3480, 2148, 1973, 1425, 4908, 3211, 1584, 1762, + 1764, 5073, 1768, 1280, 1501, 1502, 814, 2144, 4577, 2493, + 5038, 1767, 1429, 4465, 1169, 1528, 2174, 2173, 1786, 4433, + 5135, 4224, 1789, 1767, 5136, 5139, 5138, 1953, 1152, 1798, + 2714, 1774, 245, 1462, 1463, 4106, 823, 1288, 1771, 1347, + 4035, 5116, 825, 1469, 1576, 819, 820, 2493, 821, 822, + 2826, 2828, 2829, 4941, 1563, 1734, 4953, 4735, 1738, 833, + 833, 833, 4682, 4671, 1235, 4235, 4236, 1496, 1500, 1500, + 1500, 4234, 1850, 1541, 1542, 1531, 1532, 833, 4455, 1857, + 1565, 1522, 1864, 4298, 1525, 4573, 1551, 833, 4131, 1170, + 3601, 793, 793, 1568, 1571, 1496, 1496, 4148, 5158, 1553, + 2616, 793, 793, 1578, 253, 1906, 1906, 1737, 833, 3644, + 5142, 3651, 4395, 2576, 4397, 5001, 1564, 1741, 1645, 5102, + 1800, 4980, 3018, 1220, 1246, 1244, 1179, 1245, 5104, 1347, + 5105, 855, 1518, 1519, 837, 838, 1518, 1519, 853, 253, + 816, 4118, 854, 1583, 4553, 3856, 5098, 1961, 3012, 1908, + 4044, 1455, 1454, 5129, 4559, 1249, 2822, 2824, 2825, 5163, + 5242, 5187, 4219, 270, 3749, 1581, 4104, 4566, 2990, 5104, + 1171, 5105, 793, 1506, 2035, 3618, 3624, 3625, 3626, 3619, + 3623, 3620, 3622, 3621, 1913, 206, 252, 205, 239, 207, + 1494, 4947, 3640, 1929, 1930, 2490, 4690, 4493, 1566, 4226, + 4406, 4227, 4229, 4228, 964, 965, 966, 967, 968, 1781, + 964, 965, 966, 967, 968, 3125, 4674, 4675, 4676, 4075, + 253, 3108, 3127, 1859, 3185, 1690, 1691, 5106, 1255, 4579, + 4578, 4230, 1792, 1793, 5123, 2624, 1796, 2149, 4493, 4113, + 3205, 1805, 1807, 1808, 1809, 1810, 3943, 1812, 2013, 1154, + 4118, 1816, 1448, 2018, 3745, 3746, 4409, 3749, 1862, 3851, + 4796, 245, 2145, 5466, 2032, 3125, 4785, 3163, 5106, 4956, + 3162, 3108, 3127, 5261, 964, 965, 966, 967, 968, 3126, + 1250, 1900, 1901, 4239, 206, 252, 205, 239, 207, 5431, + 2058, 1745, 3783, 1744, 3784, 3785, 2061, 4711, 1281, 4225, + 2082, 2810, 16, 4634, 1839, 5002, 1770, 2614, 3611, 1460, + 2095, 4981, 1742, 1891, 1168, 3646, 2152, 1732, 1890, 1223, + 1906, 1224, 4240, 4791, 4408, 1280, 1864, 34, 3812, 3126, + 2021, 843, 3183, 3184, 2148, 2025, 1552, 1492, 1885, 1887, + 1733, 1491, 1252, 1490, 1627, 4969, 3122, 2827, 1898, 1899, + 5292, 2045, 2125, 1509, 1508, 5164, 4201, 5010, 4360, 1864, + 245, 2028, 3473, 3153, 2134, 2134, 1829, 1864, 4468, 2083, + 3108, 4614, 1864, 1864, 2747, 2748, 833, 1791, 1511, 925, + 851, 5226, 3604, 1804, 1983, 3133, 1986, 1987, 2023, 1906, + 1877, 1906, 1436, 1834, 1559, 1980, 1627, 4392, 1806, 1992, + 1993, 1994, 1995, 1996, 1997, 4264, 1827, 1991, 2096, 2002, + 2003, 3645, 17, 1830, 1831, 1917, 1949, 1916, 2008, 1974, + 1923, 2012, 2011, 4476, 1219, 2004, 2170, 4244, 1889, 4105, + 2116, 2066, 3358, 4235, 4236, 1632, 1914, 3608, 3609, 1922, + 3226, 2087, 2090, 2091, 2094, 5432, 81, 2124, 2129, 253, + 2127, 2128, 3607, 2823, 3191, 3148, 2070, 2960, 2807, 2108, + 2109, 851, 3090, 3092, 2612, 1906, 1283, 1931, 1248, 3017, + 15, 206, 252, 205, 239, 207, 2118, 2119, 2600, 1634, + 1633, 40, 825, 1436, 2248, 2019, 1947, 2044, 2991, 1788, + 914, 2048, 2049, 1962, 2026, 1963, 3250, 3251, 2131, 1558, + 2299, 2280, 2281, 46, 1777, 2285, 4238, 2138, 1951, 3119, + 1870, 5099, 1637, 2300, 1802, 5100, 1545, 2246, 5009, 1811, + 2289, 2290, 2291, 2181, 2185, 2186, 2307, 81, 2309, 2384, + 2310, 2311, 2312, 2305, 2182, 2130, 2306, 4423, 4127, 3116, + 1803, 2067, 4591, 2137, 1779, 4281, 3648, 245, 253, 3491, + 4266, 4787, 5099, 3945, 2081, 4786, 5240, 2327, 2328, 1943, + 5291, 1815, 3835, 1814, 1813, 817, 1256, 919, 3116, 3119, + 918, 4799, 2046, 2183, 2136, 4340, 2056, 4231, 2050, 1247, + 2581, 2579, 4338, 2103, 1242, 2580, 916, 2360, 1436, 915, + 1236, 1243, 4792, 4793, 5429, 5430, 2167, 1154, 1209, 2065, + 2394, 2819, 2820, 2112, 2397, 2114, 2115, 1222, 1253, 833, + 833, 833, 2844, 3813, 3815, 3816, 3817, 3814, 2412, 2414, + 2122, 2415, 2378, 2418, 2419, 1286, 4382, 2422, 2117, 3132, + 816, 2426, 2075, 3130, 2076, 2074, 2431, 2361, 1906, 2437, + 2438, 2123, 2440, 1864, 2072, 2073, 2371, 833, 2064, 2069, + 1906, 2063, 2165, 2187, 2068, 2062, 833, 2107, 3780, 2283, + 2140, 2141, 2113, 1791, 1235, 3091, 1208, 2473, 2363, 2317, + 2319, 2318, 3120, 3319, 1838, 2498, 2498, 1850, 2498, 1496, + 2591, 3921, 2509, 2510, 833, 833, 2385, 2574, 3499, 4477, + 851, 2431, 2585, 1500, 914, 4128, 2366, 2133, 2135, 2370, + 1906, 833, 2597, 2598, 2984, 2983, 1500, 1850, 3115, 793, + 1288, 1988, 2162, 3117, 1989, 1639, 1640, 1641, 1642, 1643, + 1238, 1239, 1240, 793, 2166, 1906, 828, 4324, 829, 2982, + 2007, 2590, 3120, 206, 252, 253, 1184, 3115, 3108, 3114, + 1785, 3111, 3117, 1783, 1784, 206, 252, 2410, 2411, 1191, + 2208, 2526, 4399, 2106, 1776, 4050, 81, 2316, 2981, 2390, + 206, 252, 2409, 1180, 1867, 2655, 2657, 3118, 252, 833, + 2431, 1906, 3175, 2664, 1181, 833, 923, 923, 4748, 2426, + 2466, 252, 3008, 2672, 3643, 2674, 2675, 2676, 2386, 851, + 916, 2680, 1486, 915, 2528, 2369, 3118, 2372, 270, 5468, + 1188, 270, 270, 2042, 270, 1186, 1185, 2374, 3492, 245, + 1182, 2463, 2041, 4232, 2439, 1286, 206, 252, 1292, 2441, + 2184, 245, 2106, 4288, 2106, 2583, 2298, 2500, 2057, 2506, + 1257, 1925, 2602, 2420, 2421, 5236, 2465, 5072, 5214, 4323, + 2427, 2428, 2429, 245, 2054, 2055, 2006, 2640, 1303, 2455, + 2313, 2314, 2442, 2443, 2444, 81, 245, 1778, 1780, 2716, + 5513, 2678, 1596, 2645, 2646, 3803, 3804, 1292, 2734, 2698, + 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, + 2202, 2203, 3112, 1868, 1281, 2632, 2633, 2364, 2742, 2739, + 2224, 2225, 245, 3658, 2609, 2618, 2611, 1187, 2232, 2148, + 1288, 2436, 793, 2362, 1251, 4283, 2424, 2630, 2631, 914, + 1559, 1280, 2944, 2450, 2660, 3007, 2249, 2754, 5512, 2756, + 2666, 2284, 2383, 2760, 2387, 1184, 1326, 1327, 1328, 2391, + 2625, 2765, 2766, 2767, 1866, 4458, 2771, 16, 1864, 2601, + 16, 16, 5497, 16, 2308, 2663, 1596, 2641, 2688, 3083, + 2042, 2691, 2692, 4171, 2694, 2712, 2603, 3147, 1486, 2041, + 2806, 1325, 34, 2595, 1322, 34, 34, 1864, 34, 833, + 833, 2039, 2588, 2461, 3679, 833, 851, 2473, 2729, 833, + 2470, 1285, 2474, 2468, 2469, 1906, 2803, 904, 2457, 1183, + 1285, 2582, 2454, 2457, 1186, 1185, 3525, 253, 1189, 2464, + 1596, 2271, 206, 252, 1596, 916, 2586, 3802, 915, 253, + 2042, 2042, 2594, 2024, 2755, 2677, 4378, 2758, 2759, 2041, + 2041, 2763, 4336, 3216, 253, 2608, 2619, 2610, 1596, 2705, + 1825, 253, 3526, 3527, 2165, 2775, 2776, 206, 252, 205, + 239, 207, 81, 3680, 253, 2778, 2779, 17, 4287, 1486, + 17, 17, 5503, 17, 4809, 4810, 4811, 4815, 4813, 4814, + 4816, 4817, 4818, 4819, 4812, 2831, 2649, 2654, 2650, 2764, + 2661, 2106, 2662, 2786, 3083, 1453, 1456, 2669, 245, 2788, + 253, 2790, 2153, 2106, 2718, 2736, 2737, 2648, 3357, 2713, + 2783, 2717, 2685, 2042, 206, 252, 4247, 2743, 2795, 2667, + 2668, 5495, 2041, 5487, 1442, 15, 2888, 4019, 15, 15, + 2887, 15, 2154, 245, 2723, 4288, 40, 5483, 4245, 40, + 40, 5479, 40, 1559, 5453, 1598, 2703, 1599, 1597, 206, + 252, 1556, 3680, 2106, 1598, 4193, 1599, 1597, 46, 206, + 252, 46, 46, 2791, 46, 2720, 1457, 1735, 2678, 206, + 252, 5450, 1319, 1320, 1321, 1324, 1596, 1323, 2106, 5447, + 206, 252, 205, 239, 207, 4706, 3083, 2806, 2738, 5445, + 2722, 4190, 2741, 1557, 2744, 2740, 2898, 2806, 1286, 2901, + 4320, 2903, 4016, 4091, 3981, 5440, 5425, 1596, 2910, 5153, + 4158, 5379, 2746, 4020, 4088, 4042, 1596, 5364, 2721, 3664, + 1292, 2923, 5324, 5480, 2106, 245, 4288, 5480, 2587, 1598, + 5454, 1599, 1597, 2097, 2098, 245, 2963, 2964, 1867, 2966, + 2967, 2777, 1557, 2970, 2770, 245, 2774, 2784, 2267, 3474, + 2785, 833, 1864, 833, 1864, 2264, 245, 5451, 1892, 2266, + 2263, 2265, 2269, 2270, 2985, 5448, 5323, 2268, 3296, 5322, + 2805, 2992, 2993, 2787, 972, 2812, 5317, 5481, 833, 833, + 833, 3237, 2794, 1288, 3005, 2850, 253, 2943, 4017, 2798, + 1559, 5441, 5365, 833, 833, 833, 1735, 5380, 5310, 2926, + 2928, 2929, 2930, 5365, 2932, 2809, 2604, 3102, 5325, 1159, + 1160, 1161, 1162, 2864, 2781, 2942, 3040, 3040, 3046, 2954, + 2941, 253, 2697, 2940, 2897, 3055, 1850, 1850, 1850, 1850, + 1850, 1850, 1850, 1850, 2830, 1455, 1454, 2896, 1500, 5288, + 5188, 5185, 2845, 5152, 2832, 2895, 5146, 2750, 2498, 2837, + 3357, 2635, 1596, 1008, 1018, 1596, 2208, 1868, 2599, 5029, + 2805, 2208, 2812, 1009, 1833, 1010, 1014, 1017, 1013, 1011, + 1012, 3094, 2854, 2204, 2205, 2235, 3139, 5028, 253, 2222, + 2223, 5063, 2320, 2226, 2862, 2323, 2324, 2325, 4872, 4487, + 2329, 2330, 2331, 2332, 2334, 2335, 2336, 2337, 2338, 2339, + 2340, 2341, 2343, 2344, 2345, 2346, 2347, 1598, 1866, 1599, + 1597, 5025, 4480, 253, 5024, 2274, 2275, 2276, 2277, 2278, + 2279, 2272, 2273, 253, 4870, 5289, 2812, 2862, 2975, 5153, + 2977, 1015, 1596, 253, 1159, 1160, 1161, 1162, 2106, 1446, + 2935, 5023, 3977, 1906, 253, 2812, 1159, 1160, 1161, 1162, + 833, 2134, 2949, 1157, 1286, 5022, 2946, 2947, 3146, 3886, + 3116, 3119, 1016, 2812, 5021, 1157, 2780, 1598, 3682, 1599, + 1597, 793, 793, 5003, 1598, 2933, 1599, 1597, 1163, 1436, + 4966, 2861, 4935, 1154, 4932, 1906, 833, 1598, 1482, 1599, + 1597, 4767, 1483, 2835, 2836, 3663, 4493, 2862, 2840, 2841, + 2862, 4766, 1598, 3043, 1599, 1597, 4692, 2082, 4691, 3245, + 3246, 3487, 1598, 1679, 1599, 1597, 833, 3360, 4586, 2965, + 4514, 816, 833, 2969, 3333, 1612, 2936, 2862, 3203, 1961, + 3359, 1928, 3262, 3980, 3264, 4510, 4504, 270, 3320, 1288, + 4501, 2862, 1598, 3025, 1599, 1597, 3708, 3105, 3107, 3106, + 2862, 3128, 3129, 4474, 2996, 4371, 1439, 1441, 3056, 4515, + 4367, 2934, 851, 2999, 4255, 3257, 2862, 4153, 1596, 3082, + 3051, 2860, 3190, 3040, 3040, 3305, 3968, 4768, 1598, 2883, + 1599, 1597, 3316, 1598, 2866, 1599, 1597, 3051, 3912, 3910, + 2789, 3668, 4193, 4437, 4190, 3666, 3326, 1678, 3047, 3048, + 3660, 3450, 2745, 1163, 2148, 3448, 4515, 3435, 3331, 2683, + 3081, 3076, 3334, 3337, 3223, 1163, 3224, 3427, 3339, 3372, + 3355, 4511, 4193, 1906, 3120, 4277, 4190, 3101, 81, 3115, + 3108, 3114, 3217, 3111, 3117, 3229, 3230, 2939, 4584, 1596, + 3353, 4372, 2858, 3287, 2388, 3103, 4368, 3024, 2037, 2803, + 4256, 3285, 3029, 3661, 3283, 3281, 1906, 1653, 1906, 2464, + 2464, 3248, 1596, 1436, 3057, 3058, 3059, 3060, 3061, 3062, + 3063, 3371, 3084, 3050, 3667, 3661, 16, 3669, 2945, 1443, + 1445, 3667, 2906, 2905, 2886, 851, 3661, 3267, 3118, 2877, + 2876, 1596, 4176, 1596, 2875, 3300, 1459, 3366, 2863, 2811, + 1422, 34, 2051, 1596, 2634, 1596, 3051, 3204, 1417, 2849, + 2848, 1286, 1906, 1436, 3937, 2588, 4149, 3406, 1885, 1887, + 1978, 1977, 3218, 2121, 3344, 5143, 3236, 3212, 2416, 3288, + 3349, 1634, 1633, 4982, 3415, 2288, 2287, 3286, 3951, 1906, + 3282, 3282, 1530, 3407, 3330, 1632, 4749, 2246, 3332, 2288, + 2287, 81, 3233, 3272, 4609, 3401, 4471, 3354, 3083, 3051, + 3043, 1482, 3343, 4469, 2944, 1483, 1632, 2417, 1596, 1596, + 1596, 5144, 3350, 3351, 3112, 1596, 1596, 1482, 3451, 3928, + 1596, 1483, 3416, 1896, 2862, 2812, 17, 4640, 2052, 1634, + 1633, 3294, 4750, 3340, 1897, 3297, 1288, 3253, 3293, 4150, + 3261, 1894, 4472, 5469, 3322, 3323, 5455, 3324, 3325, 4470, + 1634, 1633, 3482, 3484, 1447, 3301, 5452, 5449, 5394, 3489, + 2593, 5114, 3493, 3421, 5055, 4983, 3425, 1497, 5054, 833, + 833, 833, 3304, 4965, 4903, 4868, 3314, 4833, 4789, 3303, + 4788, 4714, 4481, 4448, 15, 4151, 4302, 1482, 4289, 1436, + 3592, 1483, 4279, 2333, 4269, 40, 4257, 3430, 1906, 3328, + 4195, 1864, 4192, 3436, 3368, 4122, 3844, 2326, 1864, 2585, + 3363, 4984, 3843, 3424, 2092, 2088, 2232, 46, 3040, 3431, + 3670, 3341, 3453, 3533, 3665, 3386, 3404, 3389, 3616, 3479, + 3457, 3369, 3459, 3460, 3327, 3228, 2968, 3467, 2732, 2731, + 2730, 3356, 3675, 3678, 5281, 3383, 2047, 1893, 3532, 3361, + 1598, 3352, 1599, 1597, 2043, 4639, 1819, 3381, 3232, 2165, + 1818, 4305, 1438, 3266, 3468, 1615, 1616, 1617, 1618, 1619, + 1612, 3656, 2686, 3652, 1850, 4064, 1850, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 1612, 5280, 3714, 3720, 3671, 3672, + 1498, 5148, 3373, 3374, 3517, 2239, 1436, 3376, 3377, 2239, + 1826, 2855, 2833, 2834, 3402, 3739, 3391, 2838, 2839, 1966, + 1826, 2686, 2458, 3750, 1436, 3630, 3752, 3753, 3754, 1436, + 1436, 1436, 2134, 5, 1825, 1436, 3765, 3887, 3766, 3767, + 4067, 3768, 5340, 3770, 3771, 1482, 1482, 2093, 2089, 1483, + 1483, 4991, 3633, 4934, 3765, 4933, 4067, 1597, 3751, 1598, + 3723, 1599, 1597, 4803, 3756, 3757, 2219, 2498, 2526, 3761, + 3276, 4802, 3955, 4154, 3469, 3470, 5465, 1598, 3466, 1599, + 1597, 3825, 2216, 2218, 2215, 4490, 2217, 3612, 1598, 16, + 1599, 1597, 4778, 1598, 3631, 1599, 1597, 4303, 793, 3731, + 3772, 1906, 3385, 1906, 3769, 3742, 3342, 1598, 2214, 1599, + 1597, 2528, 2585, 3740, 34, 1966, 1436, 1436, 1826, 4777, + 4064, 3615, 3755, 2455, 2211, 2213, 2210, 1906, 2212, 1598, + 974, 1599, 1597, 1598, 4066, 1599, 1597, 3867, 3268, 2106, + 2029, 2106, 3028, 5464, 3845, 3594, 1599, 1597, 833, 1655, + 3866, 3866, 1598, 1436, 1599, 1597, 3610, 3883, 3639, 5207, + 5208, 1850, 1654, 3655, 5329, 3593, 3830, 3595, 3414, 270, + 3654, 2436, 2870, 1598, 270, 1599, 1597, 1598, 5316, 1599, + 1597, 3674, 1967, 3677, 3462, 3673, 3463, 3533, 3847, 7, + 3690, 3691, 3688, 3689, 6, 5205, 5206, 3239, 3240, 17, + 1961, 3908, 3410, 1603, 1604, 1605, 1606, 1607, 1608, 1609, + 1601, 5276, 3532, 3700, 3702, 5059, 5060, 3145, 3701, 5211, + 3417, 3919, 3738, 3151, 5210, 3722, 3154, 3155, 3156, 3157, + 3158, 3159, 3160, 3161, 3337, 3836, 3164, 3165, 3166, 3167, + 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3734, 3176, 3177, + 3178, 3179, 3180, 4708, 3181, 3884, 3758, 15, 1906, 3737, + 3642, 3939, 5209, 3741, 3725, 5204, 3852, 1598, 40, 1599, + 1597, 1598, 3868, 1599, 1597, 1598, 3786, 1599, 1597, 3200, + 4435, 3202, 3909, 3705, 3706, 3707, 3885, 5203, 3799, 3824, + 46, 1610, 1620, 1621, 1622, 1623, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 1612, 3736, 3736, 3822, 5367, 16, 3736, + 4715, 4716, 5421, 16, 3839, 4709, 3820, 2303, 3809, 3888, + 3970, 3308, 3848, 5202, 3892, 5201, 5200, 3922, 5297, 3924, + 5199, 3307, 2304, 34, 1598, 5197, 1599, 1597, 34, 3872, + 3929, 2106, 4436, 3875, 5196, 3842, 5195, 3931, 3932, 3877, + 5194, 3823, 5422, 4013, 3882, 1598, 5193, 1599, 1597, 3881, + 5192, 5190, 5171, 5189, 3876, 3930, 5145, 3511, 3821, 3923, + 5032, 3890, 3926, 3927, 5013, 4985, 4959, 1091, 3819, 3889, + 3808, 4048, 2859, 4931, 2879, 3969, 2857, 4893, 4052, 1598, + 3933, 1599, 1597, 4057, 4798, 833, 1864, 4032, 1333, 1334, + 4441, 4752, 4751, 1338, 4069, 4071, 4072, 4074, 4596, 4076, + 4077, 4560, 1598, 3973, 1599, 1597, 4473, 4434, 17, 5420, + 4416, 3905, 4111, 17, 3985, 1436, 3987, 3941, 3990, 3991, + 3920, 3899, 3936, 3992, 3993, 3994, 3995, 3996, 3898, 3997, + 3998, 3999, 4000, 4001, 4002, 4003, 4004, 3925, 4006, 4007, + 4008, 4009, 3833, 3807, 4447, 4014, 2878, 3806, 4018, 4089, + 4021, 4022, 1598, 3935, 1599, 1597, 1598, 3948, 1599, 1597, + 3805, 4097, 3797, 3791, 3790, 3789, 15, 3967, 3788, 3787, + 3085, 15, 3475, 1598, 3329, 1599, 1597, 40, 3289, 3225, + 2953, 3954, 40, 4092, 2751, 2707, 3949, 3958, 3959, 3950, + 3961, 4100, 4102, 2706, 3963, 3964, 2704, 2700, 2699, 46, + 2652, 2399, 4115, 3960, 46, 3962, 2396, 2038, 833, 1611, + 1610, 1620, 1621, 1622, 1623, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 1612, 4130, 1758, 1436, 2232, 3311, 1420, 833, + 3313, 833, 2585, 4041, 5462, 3312, 4926, 1436, 4957, 4958, + 1436, 2890, 3399, 3400, 5444, 4654, 5442, 5423, 4624, 3393, + 2106, 5392, 3040, 5358, 4162, 3040, 5348, 5287, 4165, 5257, + 4166, 5255, 4060, 1598, 4046, 1599, 1597, 4045, 4652, 4152, + 1850, 3055, 1598, 4175, 1599, 1597, 1398, 1394, 1395, 1396, + 1397, 4939, 4643, 3398, 4030, 3397, 3396, 3394, 4642, 1419, + 4138, 5224, 5126, 4031, 4719, 1598, 5120, 1599, 1597, 5111, + 4126, 5109, 3714, 3392, 5091, 5082, 5047, 5046, 3720, 1598, + 5037, 1599, 1597, 5036, 4168, 1598, 5012, 1599, 1597, 3139, + 4119, 5011, 4962, 1436, 4946, 4944, 4209, 3630, 4209, 4213, + 1987, 4213, 4213, 3379, 4930, 3380, 4894, 4129, 4782, 4781, + 4780, 1992, 1993, 1994, 1995, 1996, 1997, 1436, 4723, 1991, + 2002, 2003, 4103, 2008, 4712, 4697, 2012, 2011, 4696, 4641, + 4248, 4694, 4687, 1286, 4557, 3633, 2004, 4685, 4664, 1906, + 1906, 3395, 4356, 4663, 4662, 4241, 4346, 4161, 4658, 2366, + 4657, 2106, 4628, 4207, 3600, 4164, 1598, 4626, 1599, 1597, + 4622, 1598, 4023, 1599, 1597, 4173, 4620, 3982, 4598, 1598, + 4594, 1599, 1597, 1598, 4588, 1599, 1597, 4125, 3829, 4429, + 4418, 4401, 4249, 4250, 4383, 4354, 4206, 833, 4351, 1598, + 4319, 1599, 1597, 4276, 1598, 4143, 1599, 1597, 4221, 4223, + 4144, 4100, 3975, 4146, 4275, 4157, 4272, 1906, 4160, 4155, + 4243, 3043, 4163, 2455, 3974, 4271, 4258, 4253, 1288, 1864, + 4252, 4170, 2585, 2585, 4174, 5033, 4189, 3971, 4123, 1598, + 4191, 1599, 1597, 4194, 3449, 4086, 4078, 4208, 4068, 4210, + 4058, 1598, 3447, 1599, 1597, 4049, 4047, 3406, 2958, 3947, + 4273, 4242, 3944, 3918, 1598, 4306, 1599, 1597, 3897, 3874, + 3837, 1598, 3834, 1599, 1597, 4196, 4198, 3107, 3106, 1598, + 3831, 1599, 1597, 3818, 3446, 3810, 4214, 4215, 3444, 1611, + 1610, 1620, 1621, 1622, 1623, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 1612, 4246, 3800, 3798, 3778, 3779, 3794, 3443, + 924, 1598, 3793, 1599, 1597, 1598, 833, 1599, 1597, 3792, + 3694, 4216, 3795, 3796, 3518, 3500, 3488, 3442, 3476, 1091, + 1090, 4286, 5488, 3441, 4290, 3306, 1598, 4344, 1599, 1597, + 3295, 4262, 4254, 3440, 3255, 2986, 2973, 3642, 4347, 2972, + 2821, 2711, 3439, 4830, 1598, 3840, 1599, 1597, 1888, 2710, + 1598, 3846, 1599, 1597, 2702, 2433, 2398, 2395, 2381, 4259, + 1598, 4159, 1599, 1597, 3438, 2380, 2132, 4268, 4274, 1598, + 4267, 1599, 1597, 1686, 4284, 4285, 1682, 1681, 4278, 1424, + 4326, 4270, 1167, 4328, 4329, 4316, 5436, 5434, 5417, 5282, + 4331, 1598, 5166, 1599, 1597, 4282, 4322, 1611, 1610, 1620, + 1621, 1622, 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, + 1612, 3482, 4386, 5416, 5415, 3437, 3482, 4388, 5092, 2680, + 3434, 4936, 4925, 4327, 4924, 4197, 4912, 4906, 4695, 3433, + 4661, 4402, 4647, 4404, 4636, 4589, 3432, 4478, 4410, 5414, + 3714, 3720, 1598, 3426, 1599, 1597, 4466, 1598, 4464, 1599, + 1597, 4457, 1436, 3411, 1290, 79, 1598, 4379, 1599, 1597, + 4333, 3405, 4398, 1598, 79, 1599, 1597, 4377, 4332, 3382, + 1598, 4374, 1599, 1597, 4373, 2938, 4370, 4411, 833, 2585, + 1598, 4361, 1599, 1597, 4363, 4369, 3533, 4357, 1598, 4355, + 1599, 1597, 4456, 4339, 2937, 4353, 1598, 2736, 1599, 1597, + 2931, 4350, 1598, 4462, 1599, 1597, 4308, 4307, 2900, 4422, + 4375, 3532, 2899, 4297, 4405, 4291, 4407, 4426, 4427, 4428, + 2234, 1598, 4182, 1599, 1597, 2288, 2287, 1598, 4169, 1599, + 1597, 2498, 1850, 4484, 4090, 1598, 4393, 1599, 1597, 1598, + 2473, 1599, 1597, 850, 206, 252, 4495, 1598, 4087, 1599, + 1597, 3714, 4040, 3337, 3720, 3978, 4506, 3965, 3957, 1436, + 3956, 3953, 4512, 4459, 4492, 1436, 1600, 4384, 3709, 3284, + 4445, 4380, 3280, 3279, 1636, 4390, 3278, 4209, 4463, 3242, + 4385, 2342, 4262, 3241, 1647, 4387, 2911, 2904, 3026, 2894, + 252, 205, 239, 207, 2893, 2892, 4413, 2891, 4412, 4513, + 4424, 4417, 4421, 2889, 4454, 1436, 1436, 2885, 4583, 2884, + 1657, 4321, 1906, 3027, 252, 4569, 4570, 4571, 4572, 4376, + 245, 4183, 2882, 4442, 2873, 2869, 2868, 4592, 1148, 2782, + 4485, 4444, 2709, 208, 2353, 252, 205, 239, 207, 4581, + 3761, 2351, 833, 4479, 2585, 2350, 4486, 2349, 1850, 1436, + 2348, 2302, 3731, 2301, 2292, 4585, 1927, 4483, 5504, 4610, + 5502, 4491, 5460, 4548, 270, 245, 5458, 3730, 5435, 5424, + 5354, 5353, 5352, 5328, 5321, 5319, 4541, 5217, 5170, 1676, + 5165, 5076, 4482, 3866, 5075, 5074, 5045, 5020, 5014, 245, + 4832, 4630, 4823, 4801, 4795, 4769, 4753, 4500, 4503, 4508, + 4502, 4606, 4567, 4564, 4562, 4555, 4554, 4551, 4550, 79, + 245, 4549, 4450, 4400, 4396, 4352, 4185, 4179, 4556, 2007, + 2010, 4602, 1982, 2001, 79, 1998, 79, 1984, 4574, 1979, + 4083, 4599, 4080, 4079, 4005, 3966, 3832, 3826, 3743, 4580, + 4582, 1148, 3659, 3653, 3649, 1836, 3472, 3252, 1746, 4587, + 3227, 3182, 3068, 3049, 2998, 1154, 2997, 2473, 2952, 4593, + 4677, 2842, 2209, 245, 4683, 1672, 2724, 4597, 4590, 2507, + 4689, 2467, 2377, 4603, 2146, 4633, 4604, 4601, 1999, 4605, + 1757, 1736, 1731, 1730, 4629, 4595, 4679, 4600, 1729, 1728, + 1727, 1726, 1725, 4649, 3642, 3642, 3642, 1724, 4145, 1723, + 1722, 1721, 1720, 16, 4625, 4627, 1719, 1718, 1717, 1716, + 1715, 1436, 1906, 1906, 4615, 4646, 4724, 1714, 4648, 1436, + 1713, 1712, 4651, 1711, 4653, 1710, 1709, 1708, 34, 1707, + 4655, 1706, 1705, 4644, 1704, 1703, 4645, 1436, 1702, 1701, + 3642, 4755, 1700, 4699, 1699, 2246, 1698, 4686, 1697, 4688, + 1696, 4765, 1695, 1694, 1693, 4721, 4659, 4754, 1692, 1689, + 1688, 1687, 1685, 1684, 1683, 1680, 1673, 1670, 4667, 1669, + 1436, 3866, 1668, 1667, 1666, 1665, 1436, 1664, 4673, 1663, + 4720, 4726, 1662, 4730, 1661, 1660, 1659, 1020, 177, 1906, + 1658, 1652, 4730, 1651, 1650, 1649, 4759, 177, 4722, 4680, + 1648, 1561, 1513, 1421, 4700, 5184, 4703, 1960, 833, 5182, + 1436, 1436, 1436, 17, 5180, 1436, 1436, 3686, 3687, 4713, + 5177, 4552, 2769, 1436, 3015, 1436, 1465, 4736, 4732, 5506, + 5505, 4727, 4745, 4826, 4746, 4733, 4738, 4743, 4728, 4757, + 4758, 5461, 5371, 5369, 2246, 2246, 2246, 5306, 4825, 2246, + 2246, 4829, 4871, 4831, 4761, 4486, 4265, 2170, 4820, 2170, + 2729, 3838, 3617, 4206, 4867, 3247, 3032, 826, 4770, 4775, + 4772, 15, 4771, 4548, 4783, 4776, 177, 4889, 4890, 4805, + 4806, 4807, 40, 1560, 4821, 4822, 4541, 1480, 3080, 3066, + 3698, 3078, 3073, 3079, 1906, 3699, 1906, 3074, 1906, 4885, + 3065, 3071, 3069, 84, 46, 3697, 3072, 3070, 3696, 3695, + 4561, 3692, 4563, 1620, 1621, 1622, 1623, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 1612, 3077, 4927, 4928, 4187, 833, + 3064, 4879, 5237, 5095, 5094, 5067, 4920, 4902, 4188, 4904, + 1511, 4905, 4607, 4940, 4878, 4942, 4881, 5496, 5492, 4774, + 1847, 4475, 3911, 3662, 1820, 2452, 2453, 2447, 2448, 2449, + 4880, 1149, 3774, 4121, 4461, 3149, 3096, 4896, 4295, 4296, + 3775, 3776, 3777, 4293, 4203, 4656, 4204, 2099, 4015, 4575, + 3879, 4425, 2566, 824, 4943, 4901, 4945, 3098, 3097, 4186, + 1975, 3657, 4294, 4608, 1157, 2024, 4975, 3239, 3240, 5215, + 1825, 5285, 3367, 2120, 2980, 2979, 4911, 2020, 1241, 4913, + 2988, 2024, 2987, 2670, 2578, 1555, 4923, 4921, 5017, 4922, + 4971, 1961, 4693, 4139, 4765, 4765, 4095, 4094, 4897, 4994, + 4998, 4948, 4093, 1287, 3724, 3309, 3100, 4949, 831, 4986, + 5286, 3023, 177, 2471, 2423, 2288, 2287, 1755, 1756, 5384, + 4828, 4970, 4967, 1753, 1754, 4973, 5355, 177, 3642, 177, + 1751, 1752, 1749, 1750, 4961, 5016, 4637, 4635, 4251, 4988, + 3209, 4974, 3201, 3196, 1149, 3095, 2589, 1544, 1543, 4734, + 1588, 3913, 2733, 4633, 1436, 4978, 2221, 2177, 2178, 2179, + 2180, 4976, 4987, 1436, 1512, 1157, 5335, 3704, 2989, 4992, + 4993, 2086, 1489, 4989, 1611, 1610, 1620, 1621, 1622, 1623, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1612, 2246, 1488, + 1471, 5031, 1157, 1512, 2753, 4705, 5333, 2170, 3365, 5266, + 1906, 5015, 5234, 5064, 4704, 2236, 5233, 3364, 5231, 2240, + 2241, 2242, 2243, 5130, 5070, 5077, 2232, 1636, 4827, 4650, + 2282, 4621, 4613, 5026, 4498, 4497, 1231, 4315, 4314, 2293, + 5027, 1159, 1160, 1161, 1162, 1740, 1285, 3134, 3121, 1926, + 4612, 4300, 3986, 5061, 3445, 4684, 4451, 4452, 4453, 1486, + 1157, 5373, 5372, 5278, 5279, 5373, 4403, 2321, 2322, 4389, + 5065, 5066, 850, 850, 5110, 850, 4366, 3934, 3495, 5103, + 3494, 3486, 5115, 3485, 1329, 3260, 3256, 2871, 2176, 1461, + 3979, 5122, 4779, 1430, 5372, 2352, 4797, 2354, 2355, 2356, + 2357, 2358, 2232, 5357, 5356, 5339, 5275, 2367, 5078, 5273, + 5271, 3515, 831, 1159, 1160, 1161, 1162, 3513, 1285, 4702, + 2948, 5097, 2015, 5117, 1285, 5118, 5511, 5101, 1159, 1160, + 1161, 1162, 5485, 5486, 5079, 5510, 5284, 4834, 5359, 5157, + 2220, 4365, 827, 4866, 1611, 1610, 1620, 1621, 1622, 1623, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1612, 1504, 93, + 2, 1436, 5107, 5108, 5397, 5160, 5398, 5125, 5119, 1, + 4033, 2950, 2375, 1747, 1158, 5131, 1882, 3219, 5132, 5191, + 5141, 2636, 1910, 5134, 2379, 1164, 1436, 3086, 3087, 5176, + 5178, 5179, 5181, 5183, 3703, 2246, 5147, 2460, 5155, 5150, + 5151, 3089, 2653, 1906, 5213, 1511, 5159, 1466, 3642, 3501, + 2808, 3855, 3194, 5168, 5198, 3003, 4114, 5221, 1837, 1237, + 2170, 2294, 1452, 2053, 1451, 1449, 2237, 2315, 1022, 3035, + 5175, 3827, 3801, 4494, 5383, 5437, 5327, 5386, 2715, 2080, + 5218, 5219, 1006, 5225, 5222, 4317, 5212, 3906, 5083, 5331, + 5085, 4900, 2813, 1593, 4156, 883, 1068, 5256, 1034, 2719, + 3988, 5243, 3983, 1033, 4439, 3606, 2367, 5071, 4979, 884, + 2696, 2367, 2367, 5080, 1906, 5223, 4898, 5230, 1976, 1981, + 5228, 3099, 5000, 5161, 4773, 4199, 3748, 5249, 5251, 2014, + 5186, 5253, 4565, 4916, 4998, 4914, 4915, 2644, 4012, 5258, + 5068, 4882, 931, 5254, 5290, 5250, 5252, 2615, 791, 4824, + 1906, 3030, 5263, 5127, 5019, 1207, 4419, 5268, 3013, 5267, + 5264, 5265, 5269, 1199, 3628, 1853, 1854, 3627, 1856, 2188, + 1602, 1860, 2207, 1869, 4358, 1871, 1872, 2687, 5277, 4359, + 2690, 5283, 1646, 2693, 976, 2853, 2695, 3603, 4535, 3873, + 92, 91, 90, 5298, 278, 5070, 3972, 1025, 277, 4937, + 4717, 5220, 5311, 1003, 1002, 5312, 1001, 5313, 1000, 5314, + 999, 5315, 998, 2481, 2480, 1934, 1935, 2482, 2479, 1938, + 1939, 1940, 1941, 1942, 2477, 1944, 1945, 1946, 2476, 1948, + 1844, 1843, 1952, 4299, 1954, 1955, 1956, 5318, 5334, 4611, + 5336, 5337, 3258, 3259, 5326, 3764, 4576, 1436, 5332, 5330, + 1611, 1610, 1620, 1621, 1622, 1623, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 1612, 3759, 2518, 2514, 5345, 1873, 5346, + 2515, 3124, 3136, 2513, 5303, 4341, 5347, 4638, 5172, 5173, + 4794, 5349, 3811, 5351, 4632, 2446, 3131, 2534, 3781, 2531, + 2530, 3773, 3642, 4790, 4784, 2563, 5137, 5407, 5272, 5410, + 4013, 5274, 4742, 4741, 5362, 5363, 5382, 5361, 5366, 2299, + 5402, 5270, 4740, 5389, 5381, 5370, 5368, 4505, 3719, 5374, + 5375, 5376, 5377, 4739, 5378, 4729, 4516, 4517, 4524, 1379, + 3022, 1436, 1348, 5405, 5405, 5405, 1436, 1343, 1345, 5409, + 5412, 1346, 5393, 5243, 5396, 177, 177, 1344, 177, 1287, + 3378, 3390, 4280, 5401, 4869, 3104, 5413, 4133, 826, 5400, + 3524, 5427, 5160, 3523, 5426, 2170, 3521, 5439, 3520, 1797, + 3866, 5433, 5121, 5259, 1611, 1610, 1620, 1621, 1622, 1623, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1612, 4698, 3531, + 3529, 1470, 2147, 2564, 2143, 5457, 5446, 5457, 1546, 1418, + 3045, 4061, 1763, 1761, 3693, 4998, 3067, 79, 5459, 2642, + 3878, 1845, 5463, 1842, 4180, 1841, 1317, 1316, 2647, 1289, + 246, 1921, 2299, 247, 176, 1146, 5389, 4394, 5467, 5405, + 5473, 2566, 5405, 5473, 4460, 5405, 5473, 5409, 5470, 5476, + 5412, 5475, 5478, 5477, 5471, 3857, 2851, 3210, 3310, 3713, + 2856, 5439, 5489, 4951, 2451, 1201, 3011, 128, 2865, 50, + 149, 5493, 5494, 127, 5482, 224, 5484, 5499, 5501, 71, + 223, 70, 20, 147, 222, 69, 55, 5006, 54, 220, + 123, 122, 121, 120, 5508, 146, 219, 2541, 1423, 68, + 262, 1635, 261, 264, 263, 260, 3269, 2874, 1231, 3270, + 259, 1964, 258, 1431, 5235, 2881, 4737, 5320, 5507, 53, + 5509, 52, 225, 51, 4977, 129, 850, 72, 49, 48, + 850, 850, 2752, 4081, 2085, 4414, 3516, 2994, 47, 42, + 14, 12, 45, 43, 25, 2902, 850, 24, 2059, 23, + 2907, 2908, 2909, 33, 32, 2912, 2913, 2914, 2915, 2916, + 2917, 2918, 2919, 13, 2921, 2922, 41, 2924, 2925, 39, + 38, 943, 942, 949, 939, 168, 167, 37, 2557, 166, + 165, 164, 163, 162, 946, 947, 161, 948, 952, 160, + 36, 933, 22, 63, 62, 61, 60, 59, 58, 1548, + 1550, 957, 1611, 1610, 1620, 1621, 1622, 1623, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 1612, 5034, 5035, 8, 4488, + 143, 154, 153, 5039, 5040, 5041, 5042, 5043, 5044, 155, + 150, 145, 5048, 5049, 5050, 5051, 5052, 5053, 142, 35, + 144, 140, 141, 5056, 5057, 5058, 132, 131, 130, 2872, + 5062, 1595, 1611, 1610, 1620, 1621, 1622, 1623, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 1612, 1149, 2564, 124, 104, + 103, 102, 117, 116, 1743, 115, 114, 2545, 113, 112, + 110, 111, 882, 101, 100, 99, 98, 97, 2551, 137, + 136, 133, 119, 126, 125, 4543, 108, 118, 109, 107, + 106, 4522, 105, 96, 95, 2566, 94, 4873, 2539, 2573, + 28, 152, 2540, 2542, 2544, 227, 2546, 2547, 2548, 2552, + 2553, 2554, 2556, 2559, 2560, 2561, 29, 194, 3093, 135, + 134, 151, 226, 2549, 2558, 2550, 73, 203, 202, 201, + 200, 199, 197, 4536, 198, 196, 195, 193, 192, 191, + 190, 64, 65, 66, 5133, 67, 215, 4525, 214, 1848, + 216, 2541, 229, 228, 218, 221, 217, 212, 4519, 210, + 213, 211, 209, 4545, 4546, 85, 11, 148, 21, 4520, + 18, 3, 5156, 5498, 5500, 5418, 0, 2565, 0, 0, + 0, 0, 0, 0, 0, 0, 5169, 0, 1915, 0, + 0, 1924, 0, 0, 0, 0, 0, 0, 826, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4521, 0, + 4528, 0, 0, 0, 934, 936, 935, 0, 0, 0, + 2367, 0, 2367, 0, 0, 0, 941, 0, 4972, 0, + 0, 0, 2557, 0, 0, 0, 0, 0, 945, 0, + 177, 2367, 2367, 0, 0, 960, 0, 2562, 0, 0, + 0, 3375, 938, 0, 0, 0, 0, 2658, 2659, 0, + 0, 0, 0, 0, 2665, 2537, 0, 0, 0, 2536, + 0, 0, 2671, 0, 2673, 1611, 1610, 1620, 1621, 1622, + 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1612, 1960, + 0, 0, 0, 2555, 0, 0, 0, 0, 0, 1231, + 1231, 1832, 2543, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1855, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1875, 0, 0, + 0, 2545, 4544, 0, 3114, 0, 0, 0, 0, 0, + 0, 3315, 2551, 3318, 0, 0, 0, 0, 1912, 177, + 2725, 0, 0, 177, 177, 0, 0, 0, 0, 4532, + 0, 0, 2539, 2573, 0, 0, 2540, 2542, 2544, 177, + 2546, 2547, 2548, 2552, 2553, 2554, 2556, 2559, 2560, 2561, + 0, 4529, 4533, 4531, 4530, 0, 0, 2549, 2558, 2550, + 0, 3345, 3346, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 940, 944, 950, + 0, 951, 953, 0, 0, 954, 955, 956, 0, 0, + 0, 958, 959, 0, 0, 2846, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1372, 0, 0, 4539, + 4540, 2565, 79, 0, 0, 79, 79, 0, 79, 1611, + 1610, 1620, 1621, 1622, 1623, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 1612, 0, 0, 0, 3384, 0, 0, 3388, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3408, 3409, 0, 0, 0, 0, 0, 0, 0, + 3412, 3413, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3418, 3419, 3420, 0, + 0, 2562, 4547, 0, 850, 850, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4523, 850, 0, 4538, 2537, + 0, 0, 0, 2536, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3456, 0, 3458, 0, 0, + 3461, 850, 2177, 0, 0, 2367, 0, 2555, 0, 0, + 0, 0, 0, 0, 1635, 0, 2543, 0, 2229, 2230, + 0, 0, 2538, 1390, 1391, 1352, 0, 937, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1380, 1384, 1386, 1388, + 1393, 0, 1398, 1394, 1395, 1396, 1397, 0, 0, 1375, + 1376, 1377, 1378, 3387, 1351, 1381, 2142, 1353, 0, 1354, + 1356, 1357, 1358, 1359, 1355, 1360, 1361, 1362, 1363, 1364, + 1371, 1373, 1365, 1366, 1367, 1368, 1369, 1370, 1399, 1400, + 1401, 1402, 1403, 1404, 1405, 1406, 1408, 1407, 1409, 1410, + 1411, 1412, 1413, 1414, 1415, 1416, 1383, 1385, 1387, 1389, + 1392, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 206, 252, 205, 239, 207, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2071, 0, 1374, 0, 0, + 0, 0, 232, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2564, 0, 0, 177, + 0, 2524, 0, 0, 2572, 0, 177, 0, 0, 0, + 0, 4537, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 245, 0, 0, 2501, 1091, 4542, 2060, 0, 0, + 0, 0, 0, 0, 2566, 2533, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2567, 2568, 0, 0, 0, + 0, 0, 0, 0, 1848, 0, 0, 0, 0, 0, + 0, 0, 0, 4526, 4527, 0, 0, 0, 0, 0, + 0, 2532, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2564, 0, 0, + 2541, 0, 2524, 0, 0, 2572, 0, 0, 2367, 0, + 0, 0, 0, 0, 0, 0, 2538, 0, 0, 2651, + 0, 0, 0, 0, 0, 0, 0, 0, 2644, 2404, + 2405, 2406, 0, 0, 0, 2566, 2533, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2567, 2568, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 177, 177, + 0, 177, 0, 3891, 0, 3893, 0, 2445, 0, 0, + 0, 0, 2532, 0, 0, 0, 2459, 0, 0, 0, + 0, 2557, 0, 0, 0, 0, 0, 0, 0, 0, + 1960, 2541, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2511, 2512, 0, 0, 0, 204, + 237, 249, 238, 0, 156, 177, 0, 0, 0, 253, + 0, 2596, 0, 0, 0, 0, 0, 177, 177, 0, + 0, 0, 0, 2077, 231, 230, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 2520, + 2525, 2523, 2557, 0, 0, 2517, 3952, 0, 0, 0, + 2545, 0, 0, 0, 0, 0, 0, 0, 0, 1550, + 0, 2551, 0, 0, 0, 1550, 0, 0, 0, 2535, + 0, 2519, 0, 0, 0, 3976, 0, 1382, 0, 0, + 0, 2539, 2573, 0, 0, 2540, 2542, 2544, 0, 2546, + 2547, 2548, 2552, 2553, 2554, 2556, 2559, 2560, 2561, 0, + 0, 0, 0, 0, 0, 0, 2549, 2558, 2550, 0, + 0, 4010, 0, 0, 0, 0, 0, 0, 2527, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3727, 3728, 2523, 0, 0, 0, 3726, 0, 0, 0, + 0, 2545, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2551, 0, 0, 0, 0, 0, 0, 0, + 2565, 0, 0, 0, 0, 0, 0, 1635, 0, 0, + 0, 0, 2539, 2573, 0, 0, 2540, 2542, 2544, 0, + 2546, 2547, 2548, 2552, 2553, 2554, 2556, 2559, 2560, 2561, + 0, 0, 0, 0, 2564, 0, 0, 2549, 2558, 2550, + 0, 0, 206, 252, 0, 0, 0, 0, 0, 2527, + 0, 79, 2521, 2522, 0, 0, 0, 0, 0, 0, + 0, 2271, 0, 0, 0, 0, 0, 1347, 0, 0, + 2562, 0, 2566, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2537, 0, + 0, 2565, 2536, 3643, 0, 0, 0, 0, 0, 2792, + 2793, 0, 0, 850, 850, 1548, 850, 850, 0, 2796, + 0, 2564, 0, 850, 0, 0, 2555, 0, 245, 0, + 0, 0, 0, 0, 0, 2543, 0, 0, 2541, 0, + 0, 0, 0, 0, 0, 0, 81, 0, 0, 2570, + 2569, 0, 0, 2521, 2522, 0, 0, 0, 0, 2566, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2367, 2562, 0, 0, 0, 0, 2367, 2078, 248, 2079, + 0, 4167, 0, 0, 0, 0, 0, 0, 0, 2537, + 0, 0, 0, 2536, 4177, 0, 0, 4178, 0, 0, + 0, 0, 0, 0, 0, 0, 2529, 0, 0, 0, + 0, 0, 0, 0, 0, 2541, 0, 2555, 0, 2557, + 0, 0, 0, 0, 0, 0, 2543, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2570, 2569, 0, 0, 0, 0, 0, 0, 0, 2571, + 1598, 0, 1599, 1597, 4217, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 177, + 0, 0, 0, 1287, 0, 173, 177, 177, 0, 0, + 0, 0, 0, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 0, 0, 0, 0, 0, 2557, 2529, 2267, 0, + 0, 0, 0, 0, 0, 2264, 0, 0, 0, 2266, + 2263, 2265, 2269, 2270, 0, 0, 253, 2268, 2545, 0, + 0, 3644, 0, 0, 0, 0, 0, 0, 0, 2551, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2571, 0, 2271, 4261, 0, 0, 0, 0, 0, 2539, + 2573, 0, 0, 2540, 2542, 2544, 0, 2546, 2547, 2548, + 2552, 2553, 2554, 2556, 2559, 2560, 2561, 0, 0, 0, + 0, 2974, 0, 2976, 2549, 2558, 2550, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2545, 0, 0, 3000, 3001, + 3002, 0, 0, 0, 0, 2538, 2551, 0, 0, 0, + 0, 0, 0, 3019, 3020, 3021, 0, 0, 0, 0, + 0, 0, 0, 0, 79, 0, 2539, 2573, 2565, 0, + 2540, 2542, 2544, 0, 2546, 2547, 2548, 2552, 2553, 2554, + 2556, 2559, 2560, 2561, 0, 0, 0, 0, 0, 0, + 0, 2549, 2558, 2550, 2252, 2253, 2254, 2255, 2256, 2257, + 2258, 2259, 2260, 2261, 2262, 2274, 2275, 2276, 2277, 2278, + 2279, 2272, 2273, 0, 0, 0, 0, 0, 0, 0, + 0, 4345, 0, 0, 0, 0, 0, 0, 0, 1372, + 0, 4348, 4349, 0, 177, 0, 2538, 0, 2562, 0, + 0, 0, 0, 0, 0, 2565, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2537, 0, 0, 0, + 2536, 0, 0, 0, 0, 0, 0, 0, 4362, 0, + 1287, 4364, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2555, 0, 177, 177, 0, 177, + 177, 0, 0, 2543, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2267, + 1875, 0, 0, 0, 0, 2562, 2264, 0, 0, 0, + 2266, 2263, 2265, 2269, 2270, 0, 1313, 0, 2268, 0, + 0, 0, 0, 2537, 4261, 0, 0, 2536, 0, 0, + 0, 0, 0, 0, 0, 0, 1912, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2555, 0, 3645, 0, 0, 1390, 1391, 1352, 0, + 2543, 0, 1341, 0, 0, 0, 1550, 0, 0, 0, + 0, 0, 3254, 79, 0, 0, 0, 0, 79, 1380, + 1384, 1386, 1388, 1393, 0, 1398, 1394, 1395, 1396, 1397, + 0, 0, 1375, 1376, 1377, 1378, 1350, 1351, 1381, 0, + 1353, 1314, 1354, 1356, 1357, 1358, 1359, 1355, 1360, 1361, + 1362, 1363, 1364, 1371, 1373, 1365, 1366, 1367, 1368, 1369, + 1370, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1408, + 1407, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1383, + 1385, 1387, 1389, 1392, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2252, 2253, 2254, 2255, 2256, + 2257, 2258, 2259, 2260, 2261, 2262, 2274, 2275, 2276, 2277, + 2278, 2279, 2272, 2273, 0, 0, 0, 0, 0, 0, + 1374, 0, 0, 0, 0, 206, 252, 205, 239, 207, + 0, 1306, 0, 1298, 1302, 1304, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, + 0, 2367, 232, 0, 0, 0, 241, 0, 0, 1309, + 0, 0, 0, 1301, 0, 0, 0, 0, 0, 208, + 2367, 0, 0, 0, 0, 0, 174, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 159, 0, 2538, 0, 0, 0, 177, 0, 0, + 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1307, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 1311, 0, 0, 0, + 0, 0, 0, 1312, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4660, + 0, 1848, 0, 1848, 0, 0, 0, 0, 0, 0, + 2538, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1299, 0, + 0, 184, 185, 0, 186, 187, 0, 0, 0, 188, + 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1308, 0, 0, 0, 0, 0, 0, 3496, + 3497, 3498, 1372, 0, 0, 0, 0, 1221, 0, 0, + 0, 0, 0, 0, 0, 0, 1223, 0, 1224, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1300, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4756, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1657, 0, 0, 0, 1205, 204, + 237, 249, 238, 86, 156, 0, 0, 0, 0, 253, + 0, 0, 1218, 3676, 1213, 0, 0, 0, 0, 0, + 0, 0, 0, 138, 231, 230, 0, 0, 0, 0, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 1305, 0, 0, 0, 0, 0, 1848, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 1382, 177, 0, 0, 0, 157, 0, 0, 0, 1390, + 1391, 1352, 0, 1193, 0, 0, 0, 0, 0, 0, + 0, 233, 234, 235, 0, 0, 1295, 0, 0, 0, + 0, 0, 1380, 1384, 1386, 1388, 1393, 0, 1398, 1394, + 1395, 1396, 1397, 4884, 0, 1375, 1376, 1377, 1378, 1350, + 1351, 1381, 0, 1353, 0, 1354, 1356, 1357, 1358, 1359, + 1355, 1360, 1361, 1362, 1363, 1364, 1371, 1373, 1365, 1366, + 1367, 1368, 1369, 1370, 1399, 1400, 1401, 1402, 1403, 1404, + 1405, 1406, 1408, 1407, 1409, 1410, 1411, 1412, 1413, 1414, + 1415, 1416, 1383, 1385, 1387, 1389, 1392, 242, 0, 0, + 0, 0, 0, 1220, 0, 1212, 0, 0, 0, 0, + 0, 0, 0, 0, 1217, 1215, 0, 0, 169, 0, + 0, 0, 236, 0, 170, 0, 0, 0, 0, 0, + 0, 0, 0, 1374, 0, 1206, 0, 1315, 3880, 0, + 0, 1294, 1296, 0, 0, 871, 0, 0, 0, 1297, + 1347, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1310, 0, 0, 0, + 0, 0, 0, 0, 1222, 0, 0, 0, 0, 1211, + 171, 0, 0, 1210, 0, 0, 0, 0, 0, 1198, + 0, 1960, 0, 77, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1204, 0, + 0, 0, 0, 0, 0, 0, 850, 0, 0, 867, + 868, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 914, 0, 5018, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1216, 0, 0, 0, + 1202, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 181, 248, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 74, 0, 0, 0, 0, 0, 0, 1221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1203, 0, 0, 0, 916, 0, 0, 915, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1287, 0, 177, 0, 0, 0, 0, 0, + 0, 4840, 0, 0, 172, 173, 57, 0, 0, 0, + 0, 0, 75, 900, 0, 4059, 0, 9, 177, 0, + 0, 0, 0, 872, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1219, 0, 0, 1848, 0, 871, + 0, 0, 0, 0, 0, 4861, 0, 0, 0, 0, + 874, 76, 5149, 0, 139, 0, 0, 0, 0, 178, + 179, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3015, 5167, 0, 0, 1197, 0, + 0, 0, 177, 0, 0, 0, 0, 4839, 0, 0, + 0, 0, 0, 1382, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 867, 868, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 914, 0, 0, 896, 0, 898, + 895, 0, 0, 0, 899, 0, 0, 0, 4124, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4140, + 0, 4141, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 894, 0, 0, 0, 0, 0, 0, 0, 0, 1194, + 4263, 0, 866, 1192, 1195, 0, 0, 0, 0, 0, + 0, 1196, 0, 873, 909, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1200, 0, + 916, 0, 0, 915, 0, 905, 5295, 0, 79, 0, + 0, 5299, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1347, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 906, 910, 859, 4840, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 2749, 4836, 177, + 0, 0, 891, 0, 889, 893, 913, 872, 0, 0, + 890, 887, 885, 0, 892, 876, 877, 875, 0, 865, + 878, 879, 880, 881, 860, 0, 0, 911, 4861, 912, + 0, 0, 0, 0, 874, 0, 0, 0, 0, 0, + 907, 908, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1550, 0, 0, + 4839, 0, 0, 5295, 0, 0, 0, 0, 903, 0, + 0, 0, 0, 0, 0, 0, 0, 861, 0, 0, + 0, 0, 0, 0, 0, 0, 897, 0, 0, 4841, + 4842, 0, 0, 886, 0, 0, 0, 0, 0, 0, + 0, 896, 0, 898, 895, 0, 4837, 4838, 899, 4845, + 4844, 4843, 4859, 4860, 4862, 4846, 4847, 4850, 4852, 4851, + 4848, 4849, 4853, 4855, 4856, 4857, 4854, 0, 4858, 0, + 0, 0, 0, 0, 4863, 0, 5295, 0, 0, 0, + 0, 4865, 0, 0, 0, 4864, 0, 0, 0, 0, + 0, 4263, 0, 0, 894, 0, 0, 0, 0, 0, + 0, 177, 177, 177, 0, 0, 866, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4335, 873, 909, 0, + 0, 0, 901, 0, 0, 0, 0, 0, 869, 870, + 0, 0, 858, 862, 0, 0, 0, 0, 0, 905, + 863, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 864, 0, 0, 0, 0, 0, 902, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 906, 910, 0, 0, 1848, + 5491, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4836, 0, 0, 0, 0, 891, 0, 889, 893, + 913, 0, 0, 0, 890, 887, 885, 0, 892, 876, + 877, 875, 0, 865, 878, 879, 880, 881, 860, 0, + 0, 911, 0, 912, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 907, 908, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 903, 0, 0, 0, 0, 0, 0, 0, + 0, 861, 0, 0, 0, 0, 0, 0, 1550, 0, + 897, 0, 4841, 4842, 0, 1848, 0, 886, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4837, + 4838, 177, 4845, 4844, 4843, 4859, 4860, 4862, 4846, 4847, + 4850, 4852, 4851, 4848, 4849, 4853, 4855, 4856, 4857, 4854, + 0, 4858, 0, 0, 0, 0, 0, 4863, 0, 0, + 0, 0, 0, 0, 4865, 0, 0, 0, 4864, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 901, 0, 0, 0, + 0, 0, 869, 870, 0, 0, 858, 862, 0, 0, + 0, 0, 0, 0, 863, 0, 0, 0, 4263, 0, + 0, 0, 0, 0, 0, 864, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1550, 353, 354, 355, 1114, 357, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 206, 252, 1041, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 992, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 1638, 699, + 648, 560, 500, 0, 716, 0, 0, 1115, 1125, 0, + 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, 0, 0, 983, 0, 0, 1021, 1091, 1090, 1008, + 1018, 0, 0, 383, 276, 643, 770, 645, 644, 1009, + 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, + 0, 0, 0, 0, 0, 975, 987, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 984, 985, 0, 0, 0, 0, + 1042, 0, 986, 0, 988, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1037, 1015, 1019, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 1016, 0, + 1040, 1044, 405, 1131, 1038, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 1132, 465, 466, 467, 468, 469, 470, 430, + 1120, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 4804, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 1035, 253, 767, 0, 596, 177, 0, 1112, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 1039, 0, + 547, 520, 1128, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 4929, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 1109, 516, 728, 765, 766, 650, 0, 1127, 1104, 1106, + 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 1129, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 1043, + 702, 703, 504, 505, 506, 507, 1113, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 177, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, + 0, 1050, 1051, 1134, 1133, 1135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 1004, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 1098, 1061, 1062, 1063, + 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, + 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, + 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, + 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, + 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, + 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, + 1029, 1030, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 1089, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 1075, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 1054, 1055, 721, 722, 0, 0, 1124, 498, 653, 0, + 989, 353, 354, 355, 1114, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1041, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 0, 0, 0, 0, + 992, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 1032, 699, 648, 560, + 500, 0, 716, 0, 0, 1115, 1125, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 983, 0, 0, 1021, 1091, 1090, 1008, 1018, 0, + 0, 383, 276, 643, 770, 645, 644, 1009, 0, 1010, + 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, 0, 0, + 0, 0, 0, 975, 987, 0, 993, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 984, 985, 0, 0, 0, 0, 1042, 0, + 986, 0, 988, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 1037, 1015, 1019, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 1016, 0, 1040, 1044, + 405, 1131, 1038, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 1132, 465, 466, 467, 468, 469, 470, 430, 1120, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 1035, 0, + 767, 0, 596, 0, 0, 1112, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 1039, 0, 547, 520, + 1128, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 2296, 2295, 2297, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 1109, 516, + 728, 765, 766, 650, 0, 1127, 1104, 1106, 1107, 1111, + 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 1129, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 1043, 702, 703, + 504, 505, 506, 507, 1113, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 1138, 1108, + 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, + 1051, 1134, 1133, 1135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 1004, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 1098, 1061, 1062, 1063, 994, 1064, + 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, + 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, + 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, + 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, + 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, + 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 1089, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 1075, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 1054, 1055, + 721, 722, 0, 0, 1124, 498, 653, 0, 989, 353, + 354, 355, 1114, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 206, 252, 1041, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 992, 0, + 0, 0, 412, 0, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 1032, 699, 648, 560, 500, 0, + 716, 0, 0, 1115, 1125, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 0, 0, 0, 0, 0, 983, + 0, 0, 1021, 1091, 1090, 1008, 1018, 0, 0, 383, + 276, 643, 770, 645, 644, 1009, 0, 1010, 1014, 1017, + 1013, 1011, 1012, 0, 1105, 0, 0, 0, 0, 0, + 0, 975, 987, 0, 993, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 984, 985, 0, 0, 0, 0, 1042, 0, 986, 0, + 988, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 1037, 1015, 1019, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 1016, 0, 1040, 1044, 405, 1131, + 1038, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 1132, 465, + 466, 467, 468, 469, 470, 430, 1120, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 1035, 0, 767, 0, + 596, 0, 0, 1112, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 1039, 0, 547, 520, 1128, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 1109, 516, 728, 765, + 766, 650, 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, + 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 1129, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 1043, 702, 703, 504, 505, + 506, 507, 1113, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 1138, 1108, 1137, 1139, + 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, + 1133, 1135, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 1004, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, + 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, + 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, + 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, + 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, + 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, + 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 1089, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 1075, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 1054, 1055, 721, 722, + 0, 0, 1124, 498, 653, 0, 989, 353, 354, 355, + 1114, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 0, 992, 0, 0, 0, + 412, 2368, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 1032, 699, 648, 560, 500, 0, 716, 0, + 0, 1115, 1125, 0, 0, 0, 0, 0, 0, 0, + 0, 1110, 0, 2627, 0, 0, 0, 983, 0, 0, + 1021, 1091, 1090, 1008, 1018, 0, 0, 383, 276, 643, + 770, 645, 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, + 1012, 0, 1105, 0, 0, 0, 0, 0, 0, 975, + 987, 0, 993, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 984, 985, + 0, 0, 0, 0, 1042, 0, 986, 0, 988, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 2628, 1015, 1019, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 1016, 0, 1040, 1044, 405, 1131, 1038, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 1132, 465, 466, 467, + 468, 469, 470, 430, 1120, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 1035, 0, 767, 0, 596, 0, + 0, 1112, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 1039, 0, 547, 520, 1128, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 1109, 516, 728, 765, 766, 650, + 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, + 1121, 1123, 1126, 1130, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 1129, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 1043, 702, 703, 504, 505, 506, 507, + 1113, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, + 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 1004, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, + 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, + 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, + 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, + 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, + 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, + 1052, 567, 1027, 1028, 1029, 1030, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 1089, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 1075, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 1054, 1055, 721, 722, 0, 0, + 1124, 498, 653, 0, 989, 353, 354, 355, 1114, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 992, 0, 0, 0, 412, 5490, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 1032, 699, 648, 560, 500, 0, 716, 0, 0, 1115, + 1125, 0, 0, 0, 0, 0, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 983, 0, 0, 1021, 1091, + 1090, 1008, 1018, 0, 0, 383, 276, 643, 770, 645, + 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, + 1105, 0, 0, 0, 0, 0, 0, 975, 987, 0, + 993, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 984, 985, 0, 0, + 0, 0, 1042, 0, 986, 0, 988, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 1037, 1015, + 1019, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 1016, 0, 1040, 1044, 405, 1131, 1038, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 1132, 465, 466, 467, 468, 469, + 470, 430, 1120, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 1035, 0, 767, 0, 596, 0, 0, 1112, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 1039, 0, 547, 520, 1128, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 1109, 516, 728, 765, 766, 650, 0, 1127, + 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, + 1126, 1130, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 1129, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 1043, 702, 703, 504, 505, 506, 507, 1113, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, + 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 1004, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 1098, 1061, + 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, + 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, + 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, + 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, + 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, + 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, + 1027, 1028, 1029, 1030, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 1089, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 1075, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 1054, 1055, 721, 722, 0, 0, 1124, 498, + 653, 0, 989, 353, 354, 355, 1114, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1041, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 992, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 1032, 699, + 648, 560, 500, 0, 716, 0, 0, 1115, 1125, 0, + 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, 0, 0, 983, 0, 0, 1021, 1091, 1090, 1008, + 1018, 0, 0, 383, 276, 643, 770, 645, 644, 1009, + 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, + 0, 0, 0, 0, 0, 975, 987, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 984, 985, 0, 0, 0, 0, + 1042, 0, 986, 0, 988, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1037, 1015, 1019, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 1016, 0, + 1040, 1044, 405, 1131, 1038, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 1132, 465, 466, 467, 468, 469, 470, 430, + 1120, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 1035, 0, 767, 0, 596, 0, 0, 1112, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 1039, 0, + 547, 520, 1128, 5296, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 1109, 516, 728, 765, 766, 650, 0, 1127, 1104, 1106, + 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 1129, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 1043, + 702, 703, 504, 505, 506, 507, 1113, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, + 0, 1050, 1051, 1134, 1133, 1135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 1004, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 1098, 1061, 1062, 1063, + 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, + 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, + 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, + 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, + 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, + 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, + 1029, 1030, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 1089, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 1075, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 1054, 1055, 721, 722, 0, 0, 1124, 498, 653, 0, + 989, 353, 354, 355, 1114, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1041, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 0, 0, 0, 0, + 992, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 1032, 699, 648, 560, + 500, 0, 716, 0, 0, 1115, 1125, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 983, 0, 0, 1021, 1091, 1090, 1008, 1018, 0, + 0, 383, 276, 643, 770, 645, 644, 1009, 0, 1010, + 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, 0, 0, + 0, 0, 0, 975, 987, 0, 993, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 984, 985, 1959, 0, 0, 0, 1042, 0, + 986, 0, 988, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 1037, 1015, 1019, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 1016, 0, 1040, 1044, + 405, 1131, 1038, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 1132, 465, 466, 467, 468, 469, 470, 430, 1120, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 1035, 0, + 767, 0, 596, 0, 0, 1112, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 1039, 0, 547, 520, + 1128, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 1109, 516, + 728, 765, 766, 650, 0, 1127, 1104, 1106, 1107, 1111, + 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 1129, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 1043, 702, 703, + 504, 505, 506, 507, 1113, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 1138, 1108, + 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, + 1051, 1134, 1133, 1135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 1004, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 1098, 1061, 1062, 1063, 994, 1064, + 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, + 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, + 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, + 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, + 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, + 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 1089, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 1075, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 1054, 1055, + 721, 722, 0, 0, 1124, 498, 653, 0, 989, 353, + 354, 355, 1114, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1041, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 992, 0, + 0, 0, 412, 2368, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 1032, 699, 648, 560, 500, 0, + 716, 0, 0, 1115, 1125, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 0, 0, 0, 0, 0, 983, + 0, 0, 1021, 1091, 1090, 1008, 1018, 0, 0, 383, + 276, 643, 770, 645, 644, 1009, 0, 1010, 1014, 1017, + 1013, 1011, 1012, 0, 1105, 0, 0, 0, 0, 0, + 0, 975, 987, 0, 993, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 984, 985, 0, 0, 0, 0, 1042, 0, 986, 0, + 988, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 1037, 1015, 1019, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 1016, 0, 1040, 1044, 405, 1131, + 1038, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 1132, 465, + 466, 467, 468, 469, 470, 430, 1120, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 1035, 0, 767, 0, + 596, 0, 0, 1112, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 1039, 0, 547, 520, 1128, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 1109, 516, 728, 765, + 766, 650, 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, + 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 1129, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 1043, 702, 703, 504, 505, + 506, 507, 1113, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 1138, 1108, 1137, 1139, + 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, + 1133, 1135, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 1004, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, + 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, + 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, + 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, + 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, + 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, + 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 1089, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 1075, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 1054, 1055, 721, 722, + 0, 0, 1124, 498, 653, 0, 989, 353, 354, 355, + 1114, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 0, 2880, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 0, 992, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 1032, 699, 648, 560, 500, 0, 716, 0, + 0, 1115, 1125, 0, 0, 0, 0, 0, 0, 0, + 0, 1110, 0, 0, 0, 0, 0, 983, 0, 0, + 1021, 1091, 1090, 1008, 1018, 0, 0, 383, 276, 643, + 770, 645, 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, + 1012, 0, 1105, 0, 0, 0, 0, 0, 0, 975, + 987, 0, 993, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 984, 985, + 0, 0, 0, 0, 1042, 0, 986, 0, 988, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 1037, 1015, 1019, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 1016, 0, 1040, 1044, 405, 1131, 1038, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 1132, 465, 466, 467, + 468, 469, 470, 430, 1120, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 1035, 0, 767, 0, 596, 0, + 0, 1112, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 1039, 0, 547, 520, 1128, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 1109, 516, 728, 765, 766, 650, + 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, + 1121, 1123, 1126, 1130, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 1129, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 1043, 702, 703, 504, 505, 506, 507, + 1113, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, + 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 1004, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, + 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, + 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, + 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, + 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, + 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, + 1052, 567, 1027, 1028, 1029, 1030, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 1089, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 1075, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 1054, 1055, 721, 722, 0, 0, + 1124, 498, 653, 0, 989, 353, 354, 355, 1114, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 992, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 1032, 699, 648, 560, 500, 0, 716, 0, 0, 1115, + 1125, 0, 0, 0, 0, 0, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 983, 0, 0, 1021, 1091, + 1090, 1008, 1018, 0, 0, 383, 276, 643, 770, 645, + 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, + 1105, 0, 0, 0, 0, 0, 0, 975, 987, 0, + 993, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 984, 985, 2359, 0, + 0, 0, 1042, 0, 986, 0, 988, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 1037, 1015, + 1019, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 1016, 0, 1040, 1044, 405, 1131, 1038, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 1132, 465, 466, 467, 468, 469, + 470, 430, 1120, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 1035, 0, 767, 0, 596, 0, 0, 1112, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 1039, 0, 547, 520, 1128, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 1109, 516, 728, 765, 766, 650, 0, 1127, + 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, + 1126, 1130, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 1129, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 1043, 702, 703, 504, 505, 506, 507, 1113, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, + 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 1004, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 1098, 1061, + 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, + 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, + 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, + 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, + 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, + 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, + 1027, 1028, 1029, 1030, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 1089, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 1075, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 1054, 1055, 721, 722, 0, 0, 1124, 498, + 653, 0, 989, 353, 354, 355, 1114, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1041, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 992, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 1032, 699, + 648, 560, 500, 0, 716, 0, 0, 1115, 1125, 0, + 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, 0, 0, 983, 0, 0, 1021, 1091, 1090, 1008, + 1018, 0, 0, 383, 276, 643, 770, 645, 644, 1009, + 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, + 0, 0, 0, 0, 0, 975, 987, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 984, 985, 0, 0, 0, 0, + 1042, 0, 986, 0, 988, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1037, 1015, 1019, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 1016, 0, + 1040, 1044, 405, 1131, 1038, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 1132, 465, 466, 467, 468, 469, 470, 430, + 1120, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 1035, 0, 767, 0, 596, 0, 0, 1112, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 1039, 0, + 547, 520, 1128, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 1109, 516, 728, 765, 766, 650, 0, 1127, 1104, 1106, + 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 1129, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 1043, + 702, 703, 504, 505, 506, 507, 1113, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, + 0, 1050, 1051, 1134, 1133, 1135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 1004, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 1098, 1061, 1062, 1063, + 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, + 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, + 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, + 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, + 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, + 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, + 1029, 1030, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 1089, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 1075, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 1054, 1055, 721, 722, 0, 0, 1124, 498, 653, 0, + 989, 353, 354, 355, 1114, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1041, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 0, 0, 0, 0, + 992, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 1032, 699, 648, 560, + 500, 0, 716, 0, 0, 1115, 1125, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 983, 0, 0, 1021, 1091, 1090, 1008, 1018, 0, + 0, 383, 276, 643, 770, 645, 644, 1009, 0, 1010, + 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, 0, 0, + 0, 0, 0, 975, 987, 0, 993, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 984, 985, 0, 0, 0, 0, 1042, 0, + 986, 0, 988, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 1037, 1015, 1019, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 1016, 0, 1040, 1044, + 405, 1131, 1038, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 1132, 465, 466, 467, 468, 469, 470, 430, 1120, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 1035, 0, + 767, 0, 596, 0, 0, 1112, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 1039, 0, 547, 520, + 1128, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 1109, 516, + 728, 765, 766, 650, 0, 1127, 1104, 1106, 1107, 1111, + 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 1129, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 1043, 702, 703, + 504, 505, 506, 507, 1113, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 1138, 1108, + 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, + 1051, 1134, 1133, 1135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 1004, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 1098, 1061, 1062, 1063, 994, 1064, + 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, + 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, + 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, + 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, + 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, + 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 1089, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 4886, 778, 4887, 4888, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 1054, 1055, + 721, 722, 0, 0, 1124, 498, 653, 0, 989, 353, + 354, 355, 1114, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1041, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 992, 0, + 0, 0, 412, 0, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 1032, 699, 648, 560, 500, 0, + 716, 0, 0, 1115, 1125, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 0, 0, 0, 0, 0, 983, + 0, 0, 1021, 1091, 1090, 1008, 1018, 0, 0, 383, + 276, 643, 770, 645, 644, 3464, 0, 3465, 1014, 1017, + 1013, 1011, 1012, 0, 1105, 0, 0, 0, 0, 0, + 0, 975, 987, 0, 993, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 984, 985, 0, 0, 0, 0, 1042, 0, 986, 0, + 988, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 1037, 1015, 1019, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 1016, 0, 1040, 1044, 405, 1131, + 1038, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 1132, 465, + 466, 467, 468, 469, 470, 430, 1120, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 1035, 0, 767, 0, + 596, 0, 0, 1112, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 1039, 0, 547, 520, 1128, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 1109, 516, 728, 765, + 766, 650, 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, + 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 1129, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 1043, 702, 703, 504, 505, + 506, 507, 1113, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 1138, 1108, 1137, 1139, + 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, + 1133, 1135, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 1004, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, + 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, + 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, + 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, + 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, + 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, + 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 1089, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 1075, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 1054, 1055, 721, 722, + 0, 0, 1124, 498, 653, 0, 989, 353, 354, 355, + 1114, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 2189, 0, 0, 0, 992, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 1032, 699, 648, 560, 500, 0, 716, 0, + 0, 1115, 1125, 0, 0, 0, 0, 0, 0, 0, + 0, 1110, 0, 0, 0, 0, 0, 983, 0, 0, + 1021, 1091, 1090, 1008, 1018, 0, 0, 383, 276, 643, + 770, 645, 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, + 1012, 0, 1105, 0, 0, 0, 0, 0, 0, 0, + 987, 0, 993, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 984, 985, + 0, 0, 0, 0, 1042, 0, 986, 0, 988, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 1037, 1015, 1019, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 1016, 0, 1040, 1044, 405, 1131, 1038, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 1132, 465, 466, 467, + 468, 469, 470, 430, 1120, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 1035, 0, 767, 0, 596, 0, + 0, 1112, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 1039, 0, 547, 520, 1128, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 2190, 2191, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 1109, 516, 728, 765, 766, 650, + 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, + 1121, 1123, 1126, 1130, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 1129, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 1043, 702, 703, 504, 505, 506, 507, + 1113, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, + 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 1004, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, + 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, + 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, + 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, + 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, + 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, + 1052, 567, 1027, 1028, 1029, 1030, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 1089, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 1075, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 1054, 1055, 721, 722, 0, 0, + 1124, 498, 653, 0, 989, 353, 354, 355, 1114, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 992, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 1032, 699, 648, 560, 500, 0, 716, 0, 0, 1115, + 1125, 0, 0, 0, 0, 0, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 1656, 0, 0, 1021, 1091, + 1090, 1008, 1018, 0, 0, 383, 276, 643, 770, 645, + 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, + 1105, 0, 0, 0, 0, 0, 0, 975, 987, 0, + 993, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 984, 985, 0, 0, + 0, 0, 1042, 0, 986, 0, 988, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 1037, 1015, + 1019, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 1016, 0, 1040, 1044, 405, 1131, 1038, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 1132, 465, 466, 467, 468, 469, + 470, 430, 1120, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 1035, 0, 767, 0, 596, 0, 0, 1112, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 1039, 0, 547, 520, 1128, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 1109, 516, 728, 765, 766, 650, 0, 1127, + 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, + 1126, 1130, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 1129, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 1043, 702, 703, 504, 505, 506, 507, 1113, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, + 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 1004, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 1098, 1061, + 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, + 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, + 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, + 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, + 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, + 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, + 1027, 1028, 1029, 1030, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 1089, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 1075, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 1054, 1055, 721, 722, 0, 0, 1124, 498, + 653, 0, 989, 353, 354, 355, 1114, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1041, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 992, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 1032, 699, + 648, 560, 500, 0, 716, 0, 0, 1115, 1125, 0, + 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, 0, 0, 983, 0, 0, 1021, 1091, 1090, 1008, + 1018, 0, 0, 383, 276, 643, 770, 645, 644, 1009, + 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, + 0, 0, 0, 0, 0, 0, 987, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 984, 985, 0, 0, 0, 0, + 1042, 0, 986, 0, 988, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1037, 1015, 1019, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 1016, 0, + 1040, 1044, 405, 1131, 1038, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 1132, 465, 466, 467, 468, 469, 470, 430, + 1120, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 1035, 0, 767, 0, 596, 0, 0, 1112, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 1039, 0, + 547, 520, 1128, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 1109, 516, 728, 765, 766, 650, 0, 1127, 1104, 1106, + 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 1129, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 1043, + 702, 703, 504, 505, 506, 507, 1113, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, + 0, 1050, 1051, 1134, 1133, 1135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 1004, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 1098, 1061, 1062, 1063, + 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, + 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, + 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, + 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, + 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, + 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, + 1029, 1030, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 1089, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 1075, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 1054, 1055, 721, 722, 0, 0, 1124, 498, 653, 0, + 989, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 206, 252, 205, 239, 207, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 240, 0, 0, 0, 0, + 0, 0, 232, 0, 412, 0, 241, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 671, + 672, 641, 673, 642, 674, 675, 174, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 245, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 0, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 0, 0, 583, 613, + 405, 603, 0, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 629, 465, 466, 467, 468, 469, 470, 430, 530, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 204, + 237, 249, 238, 86, 156, 0, 0, 762, 0, 253, + 767, 0, 596, 0, 0, 268, 0, 0, 0, 566, + 0, 0, 471, 138, 231, 230, 614, 0, 547, 520, + 281, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 291, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 157, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 738, 739, 740, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 591, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 271, 709, 712, 640, 283, 0, + 706, 720, 678, 719, 284, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 171, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 280, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 81, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 289, 378, 290, + 782, 785, 784, 759, 0, 359, 657, 482, 536, 419, + 724, 725, 74, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 285, 286, 57, 269, 272, 274, + 273, 0, 75, 707, 718, 754, 755, 9, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 279, 499, 347, 282, 348, 349, 350, 351, 178, + 287, 646, 647, 288, 764, 763, 361, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 353, 354, 355, + 356, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 206, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 1292, 699, 648, 560, 500, 0, 716, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 245, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 383, 276, 643, + 770, 645, 644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 386, 3116, 3119, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 0, 0, 0, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 0, 0, 583, 613, 405, 603, 0, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 629, 465, 466, 467, + 468, 469, 470, 430, 530, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 0, 253, 767, 3120, 596, 0, + 0, 0, 3115, 0, 3114, 566, 3111, 3117, 471, 0, + 0, 0, 614, 0, 547, 520, 809, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 3118, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 3112, 479, 480, + 421, 352, 358, 804, 404, 516, 728, 765, 766, 650, + 0, 714, 651, 661, 397, 686, 698, 697, 510, 609, + 0, 709, 712, 640, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 592, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 618, 702, 703, 504, 505, 506, 507, + 425, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 0, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 292, 293, 294, 295, 296, 297, 298, 299, 340, 300, + 301, 302, 303, 304, 305, 306, 311, 312, 313, 314, + 315, 316, 317, 318, 727, 309, 310, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 0, 0, 0, 0, 341, 786, 787, 788, 789, + 790, 0, 0, 342, 343, 344, 0, 0, 307, 308, + 335, 567, 336, 337, 338, 339, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 772, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 777, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 345, 346, 721, 722, 0, 0, + 552, 498, 653, 353, 354, 355, 356, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 206, 252, 205, + 239, 207, 0, 0, 0, 0, 0, 0, 518, 835, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 0, 699, + 648, 560, 500, 0, 716, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 842, 0, 0, 0, 0, 0, + 0, 0, 0, 841, 0, 0, 275, 0, 0, 0, + 0, 0, 0, 383, 276, 643, 770, 645, 644, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 0, 0, 0, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 0, 0, + 583, 613, 405, 603, 0, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 629, 465, 466, 467, 468, 469, 470, 430, + 530, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 837, 838, 0, 762, + 0, 253, 767, 0, 596, 0, 0, 0, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 614, 0, + 547, 520, 809, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 404, 516, 728, 765, 766, 650, 0, 714, 651, 661, + 397, 686, 698, 697, 510, 609, 0, 709, 712, 640, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 592, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 618, + 702, 703, 504, 505, 506, 507, 836, 840, 388, 621, + 537, 538, 851, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, + 0, 333, 334, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 0, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 292, 293, 294, 295, + 296, 297, 298, 299, 340, 300, 301, 302, 303, 304, + 305, 306, 311, 312, 313, 314, 315, 316, 317, 318, + 727, 309, 310, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 0, 0, 0, + 0, 341, 786, 787, 788, 789, 790, 0, 0, 342, + 343, 344, 0, 0, 307, 308, 335, 567, 336, 337, + 338, 339, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 772, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 777, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 345, 346, 721, 722, 0, 0, 552, 498, 653, 353, + 354, 355, 356, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 412, 0, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 0, 699, 648, 560, 500, 0, + 716, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1677, + 0, 0, 275, 0, 0, 1008, 1018, 0, 0, 383, + 276, 643, 770, 645, 644, 1009, 0, 1010, 1014, 1017, + 1013, 1011, 1012, 0, 386, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 0, 1015, 0, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 1016, 0, 583, 613, 405, 603, + 0, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 629, 465, + 466, 467, 468, 469, 470, 430, 530, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 0, 0, 767, 0, + 596, 0, 0, 0, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 614, 0, 547, 520, 809, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 404, 516, 728, 765, + 766, 650, 0, 714, 651, 661, 397, 686, 698, 697, + 510, 609, 0, 709, 712, 640, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 592, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 618, 702, 703, 504, 505, + 506, 507, 425, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 0, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 292, 293, 294, 295, 296, 297, 298, 299, + 340, 300, 301, 302, 303, 304, 305, 306, 311, 312, + 313, 314, 315, 316, 317, 318, 727, 309, 310, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 0, 0, 0, 0, 341, 786, 787, + 788, 789, 790, 0, 0, 342, 343, 344, 0, 0, + 307, 308, 335, 567, 336, 337, 338, 339, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 772, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 777, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 345, 346, 721, 722, + 0, 0, 552, 498, 653, 353, 354, 355, 356, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 0, 699, 648, 560, 500, 0, 716, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 383, 276, 643, 770, 645, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 386, 3116, 3119, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 0, 0, + 0, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 0, 0, 583, 613, 405, 603, 0, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 629, 465, 466, 467, 468, 469, + 470, 430, 530, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 0, 0, 767, 3120, 596, 0, 0, 0, + 3115, 0, 3114, 566, 3111, 3117, 471, 0, 0, 0, + 614, 0, 547, 520, 809, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 3118, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 3112, 479, 480, 421, 352, + 358, 804, 404, 516, 728, 765, 766, 650, 0, 714, + 651, 661, 397, 686, 698, 697, 510, 609, 0, 709, + 712, 640, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 592, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 618, 702, 703, 504, 505, 506, 507, 425, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 0, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 292, 293, + 294, 295, 296, 297, 298, 299, 340, 300, 301, 302, + 303, 304, 305, 306, 311, 312, 313, 314, 315, 316, + 317, 318, 727, 309, 310, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 0, + 0, 0, 0, 341, 786, 787, 788, 789, 790, 0, + 0, 342, 343, 344, 0, 0, 307, 308, 335, 567, + 336, 337, 338, 339, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 772, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 777, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 345, 346, 721, 722, 0, 0, 552, 498, + 653, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 1372, 0, 0, 0, 0, + 0, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 0, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 3566, 3567, 1352, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 3560, 3563, 3564, 3565, 3568, + 0, 3573, 3569, 3570, 3571, 3572, 0, 0, 3556, 3557, + 3558, 3559, 1350, 3535, 3561, 0, 3536, 514, 3537, 3538, + 3539, 3540, 3541, 1355, 3542, 3543, 3544, 3545, 3546, 3553, + 3554, 3547, 3548, 3549, 3550, 3551, 3552, 3574, 3575, 3576, + 3577, 3578, 3579, 3580, 3581, 3583, 3582, 3584, 3585, 3586, + 3587, 3588, 3589, 3590, 3591, 1383, 1385, 1387, 1389, 1392, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, + 767, 0, 596, 0, 0, 0, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 3555, 0, 547, 520, + 809, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 0, 709, 712, 640, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 0, 359, 3562, 482, 536, 419, + 724, 725, 0, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 3534, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 1849, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 206, 252, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 1292, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1846, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 253, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 0, 2505, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 3138, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 3137, 596, 0, 0, + 0, 3144, 3140, 3142, 566, 0, 3141, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 3135, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 3143, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 3138, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 3137, 596, 0, 0, 0, 3144, 3140, 3142, + 566, 0, 3141, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 3143, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 206, 252, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 1292, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 245, 3302, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 253, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 206, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 1292, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 245, 3038, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 253, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 1849, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 0, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1846, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 0, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 0, 0, 583, 613, + 405, 603, 0, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 629, 465, 466, 467, 468, 469, 470, 430, 530, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, + 767, 0, 596, 0, 0, 0, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 614, 0, 547, 520, + 809, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 0, 709, 712, 640, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 0, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 0, 2505, 353, + 354, 355, 356, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 412, 1265, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 0, 699, 648, 560, 500, 0, + 716, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 275, 1272, 1273, 0, 0, 0, 0, 383, + 276, 643, 770, 645, 644, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1276, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 0, 0, 0, 0, 0, 0, 0, 368, + 568, 1259, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 0, 0, 583, 613, 405, 603, + 916, 594, 372, 915, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 629, 465, + 466, 467, 468, 469, 470, 430, 530, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 0, 0, 767, 0, + 596, 0, 0, 0, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 614, 0, 547, 520, 809, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 1263, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 404, 516, 728, 765, + 766, 650, 0, 714, 651, 661, 397, 686, 698, 697, + 510, 609, 0, 709, 712, 640, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 1264, 744, 592, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 1267, 702, 703, 504, 505, + 506, 507, 425, 729, 1262, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 1274, 1260, 1270, 1261, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 1271, 680, 708, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 0, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 292, 293, 294, 295, 296, 297, 298, 299, + 340, 300, 301, 302, 303, 304, 305, 306, 311, 312, + 313, 314, 315, 316, 317, 318, 727, 309, 310, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 0, 0, 0, 0, 341, 786, 787, + 788, 789, 790, 0, 0, 342, 343, 344, 0, 0, + 307, 308, 335, 567, 336, 337, 338, 339, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 772, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 777, 778, 779, 776, 1258, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 345, 346, 721, 722, + 0, 0, 552, 498, 653, 353, 354, 355, 356, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 0, 699, 648, 560, 500, 0, 716, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 1272, + 1273, 0, 0, 0, 0, 383, 276, 643, 770, 645, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1276, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 0, 0, + 0, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 0, 0, 583, 613, 405, 603, 916, 594, 372, 915, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 629, 465, 466, 467, 468, 469, + 470, 430, 530, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 0, 0, 767, 0, 596, 0, 0, 0, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 614, 0, 547, 520, 809, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 404, 516, 728, 765, 766, 650, 0, 714, + 651, 661, 397, 686, 698, 697, 510, 609, 0, 709, + 712, 640, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 592, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 618, 702, 703, 504, 505, 506, 507, 425, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 1274, 2620, 1270, 2621, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 1271, + 680, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 0, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 292, 293, + 294, 295, 296, 297, 298, 299, 340, 300, 301, 302, + 303, 304, 305, 306, 311, 312, 313, 314, 315, 316, + 317, 318, 727, 309, 310, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 0, + 0, 0, 0, 341, 786, 787, 788, 789, 790, 0, + 0, 342, 343, 344, 0, 0, 307, 308, 335, 567, + 336, 337, 338, 339, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 772, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 777, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 345, 346, 721, 722, 0, 0, 552, 498, + 653, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 3859, 0, 0, 0, + 0, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 0, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 0, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 0, 0, 583, 613, + 405, 603, 0, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 629, 465, 466, 467, 468, 469, 470, 430, 530, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3862, 0, 0, 0, 0, 3861, 762, 0, 0, + 767, 0, 596, 0, 0, 0, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 614, 0, 547, 520, + 809, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 0, 709, 712, 640, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 0, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 353, 354, 355, + 356, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 2681, 0, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 0, 699, 648, 560, 500, 0, 716, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 0, 0, 2682, 0, 0, 0, 383, 276, 643, + 770, 645, 644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 386, 0, 0, 1598, 0, 1599, 1597, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 0, 0, 0, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 0, 0, 583, 613, 405, 603, 0, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 629, 465, 466, 467, + 468, 469, 470, 430, 530, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 0, 0, 767, 0, 596, 0, + 0, 0, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 614, 0, 547, 520, 809, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 404, 516, 728, 765, 766, 650, + 0, 714, 651, 661, 397, 686, 698, 697, 510, 609, + 0, 709, 712, 640, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 592, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 618, 702, 703, 504, 505, 506, 507, + 425, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 0, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 292, 293, 294, 295, 296, 297, 298, 299, 340, 300, + 301, 302, 303, 304, 305, 306, 311, 312, 313, 314, + 315, 316, 317, 318, 727, 309, 310, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 0, 0, 0, 0, 341, 786, 787, 788, 789, + 790, 0, 0, 342, 343, 344, 0, 0, 307, 308, + 335, 567, 336, 337, 338, 339, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 772, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 777, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 0, 361, 0, 345, 346, 721, 722, 0, 0, + 552, 498, 653, 353, 354, 355, 356, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 412, 1909, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 0, 699, + 648, 560, 500, 0, 716, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 1907, + 0, 0, 0, 383, 276, 643, 770, 645, 644, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1905, 0, 0, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 0, 0, + 583, 613, 405, 603, 0, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 629, 465, 466, 467, 468, 469, 470, 430, + 530, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 0, 0, 767, 0, 596, 0, 0, 0, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 614, 0, + 547, 520, 809, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 404, 516, 728, 765, 766, 650, 0, 714, 651, 661, + 397, 686, 698, 697, 510, 609, 0, 709, 712, 640, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 592, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 618, + 702, 703, 504, 505, 506, 507, 425, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 0, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 292, 293, 294, 295, + 296, 297, 298, 299, 340, 300, 301, 302, 303, 304, + 305, 306, 311, 312, 313, 314, 315, 316, 317, 318, + 727, 309, 310, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 0, 0, 0, + 0, 341, 786, 787, 788, 789, 790, 0, 0, 342, + 343, 344, 0, 0, 307, 308, 335, 567, 336, 337, + 338, 339, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 772, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 777, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 345, 346, 721, 722, 0, 0, 552, 498, 653, 353, + 354, 355, 356, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 412, 1903, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 0, 699, 648, 560, 500, 0, + 716, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 275, 0, 0, 1907, 0, 0, 0, 383, + 276, 643, 770, 645, 644, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 1905, 0, 0, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 0, 0, 583, 613, 405, 603, + 0, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 629, 465, + 466, 467, 468, 469, 470, 430, 530, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 0, 0, 767, 0, + 596, 0, 0, 0, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 614, 0, 547, 520, 809, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 404, 516, 728, 765, + 766, 650, 0, 714, 651, 661, 397, 686, 698, 697, + 510, 609, 0, 709, 712, 640, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 592, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 618, 702, 703, 504, 505, + 506, 507, 425, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 0, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 292, 293, 294, 295, 296, 297, 298, 299, + 340, 300, 301, 302, 303, 304, 305, 306, 311, 312, + 313, 314, 315, 316, 317, 318, 727, 309, 310, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 0, 0, 0, 0, 341, 786, 787, + 788, 789, 790, 0, 0, 342, 343, 344, 0, 0, + 307, 308, 335, 567, 336, 337, 338, 339, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 772, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 777, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 345, 346, 721, 722, + 0, 0, 552, 498, 653, 353, 354, 355, 356, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 412, 1867, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 0, 699, 648, 560, 500, 0, 716, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 383, 276, 643, 770, 645, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1868, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 0, 0, + 0, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 0, 0, 583, 613, 405, 603, 0, 594, 372, 1866, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 629, 465, 466, 467, 468, 469, + 470, 430, 530, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 0, 0, 767, 0, 596, 0, 0, 0, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 614, 0, 547, 520, 809, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 404, 516, 728, 765, 766, 650, 0, 714, + 651, 661, 397, 686, 698, 697, 510, 609, 0, 709, + 712, 640, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 592, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 618, 702, 703, 504, 505, 506, 507, 425, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 0, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 292, 293, + 294, 295, 296, 297, 298, 299, 340, 300, 301, 302, + 303, 304, 305, 306, 311, 312, 313, 314, 315, 316, + 317, 318, 727, 309, 310, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 0, + 0, 0, 0, 341, 786, 787, 788, 789, 790, 0, + 0, 342, 343, 344, 0, 0, 307, 308, 335, 567, + 336, 337, 338, 339, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 772, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 777, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 345, 346, 721, 722, 0, 0, 552, 498, + 653, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 1225, 0, 0, 0, + 0, 0, 0, 1230, 412, 0, 0, 481, 700, 1226, + 692, 682, 1228, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 0, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 0, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 0, 0, 583, 613, + 405, 603, 0, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 629, 465, 466, 467, 468, 469, 470, 430, 530, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, + 767, 0, 596, 0, 1229, 0, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 614, 0, 547, 520, + 809, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 0, 709, 712, 640, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 0, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 353, 354, 355, + 356, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 0, 699, 648, 560, 500, 0, 716, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5385, 0, + 275, 1091, 0, 0, 0, 0, 0, 383, 276, 643, + 770, 645, 644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 386, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 0, 0, 0, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 0, 0, 583, 613, 405, 603, 0, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 629, 465, 466, 467, + 468, 469, 470, 430, 530, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 0, 0, 767, 0, 596, 0, + 0, 0, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 614, 0, 547, 520, 809, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 404, 516, 728, 765, 766, 650, + 0, 714, 651, 661, 397, 686, 698, 697, 510, 609, + 0, 709, 712, 640, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 592, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 618, 702, 703, 504, 505, 506, 507, + 425, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 0, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 292, 293, 294, 295, 296, 297, 298, 299, 340, 300, + 301, 302, 303, 304, 305, 306, 311, 312, 313, 314, + 315, 316, 317, 318, 727, 309, 310, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 0, 0, 0, 0, 341, 786, 787, 788, 789, + 790, 0, 0, 342, 343, 344, 0, 0, 307, 308, + 335, 567, 336, 337, 338, 339, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 772, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 777, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 345, 346, 721, 722, 0, 0, + 552, 498, 653, 353, 354, 355, 356, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 0, 699, + 648, 560, 500, 0, 716, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 1907, + 0, 0, 0, 383, 276, 643, 770, 645, 644, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1905, 0, 0, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 0, 0, + 583, 613, 405, 603, 0, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 629, 465, 466, 467, 468, 469, 470, 430, + 530, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 0, 0, 767, 0, 596, 0, 0, 0, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 614, 0, + 547, 520, 809, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 404, 516, 728, 765, 766, 650, 0, 714, 651, 661, + 397, 686, 698, 697, 510, 609, 0, 709, 712, 640, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 592, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 618, + 702, 703, 504, 505, 506, 507, 425, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 0, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 292, 293, 294, 295, + 296, 297, 298, 299, 340, 300, 301, 302, 303, 304, + 305, 306, 311, 312, 313, 314, 315, 316, 317, 318, + 727, 309, 310, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 0, 0, 0, + 0, 341, 786, 787, 788, 789, 790, 0, 0, 342, + 343, 344, 0, 0, 307, 308, 335, 567, 336, 337, + 338, 339, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 772, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 777, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 345, 346, 721, 722, 0, 0, 552, 498, 653, 353, + 354, 355, 356, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 412, 0, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 0, 699, 648, 560, 500, 0, + 716, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 275, 0, 0, 1907, 0, 0, 0, 383, + 276, 643, 770, 645, 644, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 2233, 0, 0, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 0, 0, 583, 613, 405, 603, + 0, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 629, 465, + 466, 467, 468, 469, 470, 430, 530, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 0, 0, 767, 0, + 596, 0, 0, 0, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 614, 0, 547, 520, 809, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 404, 516, 728, 765, + 766, 650, 0, 714, 651, 661, 397, 686, 698, 697, + 510, 609, 0, 709, 712, 640, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 592, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 618, 702, 703, 504, 505, + 506, 507, 425, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 0, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 292, 293, 294, 295, 296, 297, 298, 299, + 340, 300, 301, 302, 303, 304, 305, 306, 311, 312, + 313, 314, 315, 316, 317, 318, 727, 309, 310, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 0, 0, 0, 0, 341, 786, 787, + 788, 789, 790, 0, 0, 342, 343, 344, 0, 0, + 307, 308, 335, 567, 336, 337, 338, 339, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 772, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 777, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 345, 346, 721, 722, + 0, 0, 552, 498, 653, 353, 354, 355, 356, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 0, 699, 648, 560, 500, 0, 716, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 383, 276, 643, 770, 645, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 386, 0, 0, 0, 0, 0, 0, 4763, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4764, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 0, 0, + 0, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 0, 0, 583, 613, 405, 603, 0, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 629, 465, 466, 467, 468, 469, + 470, 430, 530, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 0, 0, 767, 0, 596, 0, 0, 0, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 614, 0, 547, 520, 809, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 404, 516, 728, 765, 766, 650, 0, 714, + 651, 661, 397, 686, 698, 697, 510, 609, 0, 709, + 712, 640, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 592, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 618, 702, 703, 504, 505, 506, 507, 425, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 0, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 292, 293, + 294, 295, 296, 297, 298, 299, 340, 300, 301, 302, + 303, 304, 305, 306, 311, 312, 313, 314, 315, 316, + 317, 318, 727, 309, 310, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 0, + 0, 0, 0, 341, 786, 787, 788, 789, 790, 0, + 0, 342, 343, 344, 0, 0, 307, 308, 335, 567, + 336, 337, 338, 339, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 772, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 777, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 345, 346, 721, 722, 0, 0, 552, 498, + 653, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 0, 0, 0, 2681, + 0, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 0, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 2682, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 0, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 0, 0, 583, 613, + 405, 603, 0, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 629, 465, 466, 467, 468, 469, 470, 430, 530, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, + 767, 0, 596, 0, 0, 0, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 614, 0, 547, 520, + 809, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 0, 709, 712, 640, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 0, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 353, 354, 355, + 356, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 0, 699, 648, 560, 500, 0, 716, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 0, 0, 4342, 4343, 0, 0, 383, 276, 643, + 770, 645, 644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 386, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 0, 0, 0, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 0, 0, 583, 613, 405, 603, 0, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 629, 465, 466, 467, + 468, 469, 470, 430, 530, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 0, 0, 767, 0, 596, 0, + 0, 0, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 614, 0, 547, 520, 809, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 404, 516, 728, 765, 766, 650, + 0, 714, 651, 661, 397, 686, 698, 697, 510, 609, + 0, 709, 712, 640, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 592, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 618, 702, 703, 504, 505, 506, 507, + 425, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 0, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 292, 293, 294, 295, 296, 297, 298, 299, 340, 300, + 301, 302, 303, 304, 305, 306, 311, 312, 313, 314, + 315, 316, 317, 318, 727, 309, 310, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 0, 0, 0, 0, 341, 786, 787, 788, 789, + 790, 0, 0, 342, 343, 344, 0, 0, 307, 308, + 335, 567, 336, 337, 338, 339, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 772, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 777, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 345, 346, 721, 722, 0, 0, + 552, 498, 653, 353, 354, 355, 356, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 0, 699, + 648, 560, 500, 0, 716, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 4099, + 4101, 0, 0, 383, 276, 643, 770, 645, 644, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 0, 0, 0, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 0, 0, + 583, 613, 405, 603, 0, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 629, 465, 466, 467, 468, 469, 470, 430, + 530, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 0, 0, 767, 0, 596, 0, 0, 0, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 614, 0, + 547, 520, 809, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 404, 516, 728, 765, 766, 650, 0, 714, 651, 661, + 397, 686, 698, 697, 510, 609, 0, 709, 712, 640, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 592, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 618, + 702, 703, 504, 505, 506, 507, 425, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 0, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 292, 293, 294, 295, + 296, 297, 298, 299, 340, 300, 301, 302, 303, 304, + 305, 306, 311, 312, 313, 314, 315, 316, 317, 318, + 727, 309, 310, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 0, 0, 0, + 0, 341, 786, 787, 788, 789, 790, 0, 0, 342, + 343, 344, 0, 0, 307, 308, 335, 567, 336, 337, + 338, 339, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 772, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 777, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 345, 346, 721, 722, 0, 0, 552, 498, 653, 353, + 354, 355, 356, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 412, 0, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 0, 699, 648, 560, 500, 0, + 716, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3717, + 0, 0, 275, 0, 0, 3721, 0, 0, 0, 383, + 276, 643, 770, 645, 644, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 0, 0, 0, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 0, 0, 583, 613, 405, 603, + 0, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 629, 465, + 466, 467, 468, 469, 470, 430, 530, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 0, 0, 767, 0, + 596, 0, 0, 0, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 614, 0, 547, 520, 809, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 404, 516, 728, 765, + 766, 650, 0, 714, 651, 661, 397, 686, 698, 697, + 510, 609, 0, 709, 712, 640, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 592, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 618, 702, 703, 504, 505, + 506, 507, 425, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 0, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 292, 293, 294, 295, 296, 297, 298, 299, + 340, 300, 301, 302, 303, 304, 305, 306, 311, 312, + 313, 314, 315, 316, 317, 318, 727, 309, 310, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 0, 0, 0, 0, 341, 786, 787, + 788, 789, 790, 0, 0, 342, 343, 344, 0, 0, + 307, 308, 335, 567, 336, 337, 338, 339, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 772, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 777, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 345, 346, 721, 722, + 0, 0, 552, 498, 653, 353, 354, 355, 356, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 0, 699, 648, 560, 500, 0, 716, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3711, 0, 0, 275, 0, + 0, 3715, 0, 0, 0, 383, 276, 643, 770, 645, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 0, 0, + 0, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 0, 0, 583, 613, 405, 603, 0, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 629, 465, 466, 467, 468, 469, + 470, 430, 530, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 0, 0, 767, 0, 596, 0, 0, 0, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 614, 0, 547, 520, 809, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 404, 516, 728, 765, 766, 650, 0, 714, + 651, 661, 397, 686, 698, 697, 510, 609, 0, 709, + 712, 640, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 592, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 618, 702, 703, 504, 505, 506, 507, 425, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 0, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 292, 293, + 294, 295, 296, 297, 298, 299, 340, 300, 301, 302, + 303, 304, 305, 306, 311, 312, 313, 314, 315, 316, + 317, 318, 727, 309, 310, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 0, + 0, 0, 0, 341, 786, 787, 788, 789, 790, 0, + 0, 342, 343, 344, 0, 0, 307, 308, 335, 567, + 336, 337, 338, 339, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 772, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 777, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 345, 346, 721, 722, 0, 0, 552, 498, + 653, 1849, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1846, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 3231, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 1907, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 1907, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 2105, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 2104, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 5474, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 5406, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 1091, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5350, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2247, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5030, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 4995, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 4678, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4509, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 4507, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 3721, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 3338, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 3715, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 4496, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 2497, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 2499, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 0, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 4443, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 3483, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4301, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 4142, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4070, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3938, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 1907, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 2499, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 3763, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3732, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 3632, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3613, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 3490, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3452, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2802, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 3317, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 3263, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3052, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 2432, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 1468, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 2656, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 2584, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 1950, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1230, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 832, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 1233, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 970, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 969, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 4999, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 4073, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 2497, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 2499, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 0, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 2413, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 1886, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 1884, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 1787, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 921, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 922, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 856, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 0, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 0, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 943, 942, 949, 939, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 946, 947, 0, 948, 952, 0, 0, + 933, 943, 942, 949, 939, 0, 0, 0, 0, 0, + 957, 0, 0, 0, 946, 947, 0, 948, 952, 0, + 0, 933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 961, 0, + 0, 963, 0, 0, 0, 0, 962, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 961, + 0, 0, 963, 0, 0, 0, 0, 962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -11262,13 +11337,15 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 919, 921, 920, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 926, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 930, 0, - 0, 0, 0, 0, 0, 945, 0, 0, 0, 0, - 0, 0, 923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 934, 936, 935, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 941, 0, 0, 0, 0, + 0, 0, 0, 0, 934, 936, 935, 945, 0, 0, + 0, 0, 0, 0, 960, 0, 941, 0, 0, 0, + 0, 938, 0, 0, 0, 928, 0, 0, 945, 0, + 0, 0, 0, 0, 0, 960, 0, 0, 0, 0, + 0, 0, 938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -11281,9 +11358,11 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 925, 929, 935, - 0, 936, 938, 0, 0, 939, 940, 941, 0, 0, - 0, 943, 944, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 940, 944, 950, 0, + 951, 953, 0, 0, 954, 955, 956, 0, 0, 0, + 958, 959, 0, 0, 0, 0, 0, 940, 944, 950, + 0, 951, 953, 0, 0, 954, 955, 956, 0, 0, + 0, 958, 959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -11296,54 +11375,58 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 964, 965, 966, 967, 968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 949, 950, 951, 952, 953, + 0, 0, 0, 0, 0, 964, 965, 966, 967, 968, } var yyPact = [...]int{ - 6984, -1000, -1000, -356, -1000, -1000, -1000, -1000, -1000, 21448, + 7455, -1000, -1000, -341, -1000, -1000, -1000, -1000, -1000, 21575, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 80532, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 736, 80532, 1451, -298, -1000, 4209, + -1000, 1625, -1000, -1000, -1000, -1000, 546, 78174, 23147, -1000, + 80532, 946, 935, 87606, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 79955, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 736, 79955, 1378, -329, -1000, 4196, -1000, 1439, - -1000, -1000, -1000, -1000, 592, 77615, 23008, -1000, 79955, 934, - 929, 86975, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 7909, -271, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1456, 1453, -1000, 86820, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1259, + 89949, 79746, 16847, 4164, -112, -1000, -1000, 2572, 97, 3920, + 900, 165, 162, 923, 1742, 1756, 1968, 1779, 80532, 1725, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 7620, 36515, 78960, 1619, 4700, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1386, 1383, 7545, -1000, 86195, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1230, 6107, 79175, 16756, 4040, - -93, -1000, -1000, 2340, 123, 3905, 743, 172, 170, 916, - 1719, 1726, 2039, 1558, 79955, 1672, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 8008, - 36274, 78395, 1608, 4626, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1010, 1452, 1619, + 31013, 359, 353, 2447, 4961, 2299, -1000, -1000, 82, 7198, + -1000, -1000, 2055, 80532, 7455, 315, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 16847, 16847, 21575, + -390, 21575, 16847, 80532, 80532, -1000, -1000, -1000, -1000, 1451, + -298, 78174, -271, 1259, 89949, 16847, 4164, 3920, 900, 165, + 162, 923, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 820, 1381, 1608, 30814, 382, 379, 2683, 4857, 2142, - -1000, -1000, 53, 7950, -1000, -1000, 2281, 79955, 6984, 294, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 16756, 16756, 21448, -419, 21448, 16756, 79955, 79955, -1000, - -1000, -1000, -1000, 1378, -329, 77615, 1230, 6107, 16756, 4040, - 3905, 743, 172, 170, 916, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 82, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 53, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -11362,17 +11445,17 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 353, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 379, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 4700, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4626, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -11382,561 +11465,563 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 7169, -1000, 2676, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 3597, 4447, 2668, 80532, 3917, -1000, + -1000, -1000, -1000, -1000, -1000, 2447, 4889, 77388, -1000, -1000, + 4928, -1000, 80532, 242, 80532, 473, 2934, 2187, 2310, -1000, + 1335, 1966, 626, 2664, -1000, -1000, -1000, -1000, -1000, -1000, + 4254, 1156, 4924, -1000, 80532, 80532, 80532, 4473, 585, 4828, + -1000, 263, -8, -245, -263, 4535, 2765, 2765, 4893, 4893, + 4827, 4810, 1200, 1198, 1194, 2765, 1007, -1000, 2952, 2952, + 2952, 2952, 2765, 789, 1210, 4833, 4446, 4833, 298, 2952, + 317, 2765, 2765, 317, 2765, 2765, 791, -1000, 2851, 856, + 209, -187, 202, -1000, -1000, -1000, 2952, 2952, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 4778, 4777, 1399, 80532, 80532, + -1000, 689, 1191, -1000, 89970, 4710, 2209, 1381, 4531, -1000, + -1000, 4445, -1000, 637, 784, 630, 833, 728, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 580, -1000, 4784, -1000, -1000, + 609, -1000, -1000, 584, -1000, -1000, -1000, 351, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 205, + 80532, -1000, -1000, 1849, 3153, 16847, 3165, -1000, 776, 2770, + -1000, -1000, -1000, 8967, 20787, 20787, 20787, 20787, 20787, 80532, + -1000, -1000, 4307, 16847, 4444, 4439, 4438, 4437, -1000, -1000, + -1000, -1000, -1000, -1000, 4435, 2625, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 3147, -1000, -1000, -1000, 19999, + -1000, 4434, 4430, 4429, 4428, 4426, 4423, 4421, 4419, 4418, + 4417, 4416, 4413, 4411, 4309, 4410, 4223, 23933, 4409, 3915, + 3914, 4408, 4407, 4406, 3911, 4405, 4404, 4403, 4223, 4223, + 4402, 4398, 4397, 4396, 4394, 4392, 4390, 4388, 4386, 4383, + 4382, 4379, 4378, 4376, 4375, 4373, 4371, 4370, 4369, 4367, + 4365, 4364, 4361, 4354, 4353, 4352, 4351, 4350, 4346, 4345, + 4344, 4343, 4341, 4336, 4335, 4334, 4333, 4332, 4327, 4326, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 6478, - -1000, 2530, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 3560, 4386, 2528, 79955, 3903, -1000, -1000, -1000, -1000, - -1000, -1000, 2683, 4749, 76835, -1000, -1000, 4836, -1000, 79955, - 225, 79955, 494, 2943, 2523, 763, -1000, 1404, 2604, 634, - 2527, -1000, -1000, -1000, -1000, -1000, -1000, 4024, 1090, 4835, - -1000, 79955, 79955, 79955, 4402, 79955, 79955, 613, 4744, -1000, - 209, -73, -297, -314, 4425, 2781, 2781, 4791, 4791, 4742, - 4741, 1165, 1156, 1101, 2781, 994, -1000, 2748, 2748, 2748, - 2748, 2781, 738, 1160, 4751, 4385, 4751, 287, 2748, 277, - 2781, 2781, 277, 2781, 2781, 809, -1000, 2824, 817, 526, - -208, -1000, -1000, -1000, 2748, 2748, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 4712, 4711, -1000, 582, 1149, -1000, 89300, - 4645, 2275, 1366, 4424, -1000, -1000, 4384, -1000, 647, 824, - 514, 1045, 734, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 553, -1000, 4719, -1000, -1000, 629, -1000, -1000, 602, -1000, - -1000, -1000, 316, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 107, 79955, -1000, -1000, 1815, 3035, - 16756, 3289, -1000, 428, 2753, -1000, -1000, -1000, 8936, 20666, - 20666, 20666, 20666, 20666, 79955, -1000, -1000, 4240, 16756, 4383, - 4379, 4378, 4377, -1000, -1000, -1000, -1000, -1000, -1000, 4374, - 2526, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 3110, -1000, -1000, -1000, 19884, -1000, 4373, 4372, 4371, 4369, - 4366, 4365, 4364, 4363, 4362, 4361, 4360, 4358, 4354, 4242, - 4349, 4153, 23788, 4348, 3900, 3899, 4347, 4346, 4345, 3898, - 4343, 4342, 4340, 4153, 4153, 4339, 4338, 4336, 4334, 4333, - 4332, 4330, 4329, 4328, 4326, 4325, 4324, 4321, 4318, 4310, - 4309, 4308, 4306, 4305, 4304, 4303, 4302, 4300, 4297, 4296, - 4294, 4293, 4292, 4291, 4290, 4289, 4288, 4287, 4286, 4285, - 4284, 4276, 4275, 4266, 4263, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2447, 4233, 4976, + 2134, -1000, 4325, 4967, 4876, 4831, 1917, 16847, -177, 4761, + 4759, 4752, 4746, 4324, 3522, -1000, -1000, 220, 80532, 80532, + 400, 80532, -196, 585, 819, 65, 12, 812, 11, 1650, + -1000, 806, -1000, -1000, 1718, -1000, 1713, 86034, 1371, -1000, + -1000, 80532, 1257, 1257, 1257, -214, 471, 1257, 80532, 826, + 1397, 1423, 1543, 1257, 1257, 1257, 1257, 1403, 1257, 1450, + 1449, 1447, 1257, 122, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 2932, 2928, 4625, 3086, 2978, 1229, 77388, 77388, + 80532, -1000, 2331, 80532, -1000, 4289, 1645, -1000, -1000, -1000, + -1000, 44376, -215, 467, 1259, 1259, 80532, 1259, 80532, 695, + 415, 35729, 1259, 1393, 1259, 1259, 80532, 1271, -262, 252, + 85248, 84462, 3889, 689, 1173, 1168, 2225, 2919, -1000, 2795, + 80532, 80532, 2795, 2795, 34943, 34157, -1000, 80532, -1000, 4967, + 1917, -1000, 4804, 1930, -1000, 4880, 4199, 2584, 4961, 4961, + 4233, -1000, -112, -1, 1259, 1259, -216, 465, 1259, 1259, + 1259, 1259, 1259, 1445, 1259, 1259, 1259, 80532, 1259, 76602, + 1391, 1259, 808, 1259, 1259, 1259, 13695, 2055, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 21575, 3083, 3149, 314, 94, -266, 445, -1000, + -1000, 80532, 4680, 2698, -1000, -1000, -1000, 4273, 4266, -1000, + 4271, 4271, 4271, 4271, 1663, -1000, 4266, -1000, -1000, -1000, + 4266, -1000, -1000, -1000, -1000, 4271, 4271, 4271, 4271, 4271, + 4271, 4269, 4322, -1000, -1000, 4267, 4267, 4267, 4266, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 2683, 4205, 4881, 2048, -1000, 4257, 4872, 4778, - 4747, 1849, 16756, -197, 4699, 4696, 4690, 4688, 4251, 3485, - -1000, -1000, 182, 79955, 79955, 381, 79955, -238, 613, 828, - 31, 30, 827, 29, 1514, -1000, 747, -1000, -1000, 1699, - -1000, 1605, 85415, 1331, -1000, -1000, 79955, 1228, 1228, 1228, - -260, 492, 1228, 79955, 830, 1349, 1538, 1228, 1228, 1228, - 1228, 1337, 1228, 1376, 1374, 1367, 1228, 88, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 2940, 2939, 4531, 3064, - 2989, 1201, 76835, 76835, 79955, -1000, 2358, 79955, -1000, 4227, - 1569, -1000, -1000, -1000, -1000, 44075, -262, 488, 1230, 1230, - 79955, 1230, 79955, 663, 387, 35494, 1230, 1230, 1230, 79955, - 1242, -312, 248, 84635, 83855, 3612, 582, 1143, 1139, 2206, - 2843, -1000, 2711, 79955, 79955, 2711, 2711, 34714, 33934, -1000, - 79955, -1000, 4872, 1849, -1000, 4737, 2004, -1000, 4782, 4130, - 2306, 4857, 4857, 4205, -1000, -93, 28, 1230, 1230, -267, - 481, 1230, 1230, 1230, 1230, 1230, 1365, 1230, 1230, 1230, - 79955, 1230, 76055, 1230, 822, 1230, 1230, 1230, 13628, 2281, + -1000, -1000, -1000, -1000, 1804, 4263, 4264, 4264, 4263, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 21448, 3061, 3102, 292, 74, -302, - 508, -1000, -1000, 79955, 4608, 2597, -1000, -1000, -1000, 4212, - 4208, -1000, 4211, 4211, 4211, 4211, 1667, -1000, 4208, -1000, - -1000, -1000, 4208, -1000, -1000, -1000, -1000, 4211, 4211, 4211, - 4211, 4211, 4211, 4210, 4250, -1000, -1000, 4209, 4209, 4209, - 4208, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1649, 4206, 4207, 4207, - 4206, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 79955, - 4868, -1000, -1000, 16756, 79955, 1322, 4625, 4872, 4629, 4751, - 4778, 1190, 3211, -1000, -281, 79955, 452, -1000, 2522, 3483, - 1799, 2935, -1000, 1854, 634, 2928, -1000, 896, 896, -1000, - 634, 2737, -1000, 2057, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 79955, 107, 5514, -1000, -1000, -1000, 3845, 995, -1000, - 4249, 905, -1000, -1000, -1000, -1000, 79955, 4751, 8, 4739, - 2781, 2972, 2924, 2781, -1000, -1000, -1000, 1117, 4791, 20666, - 20666, -1000, -1000, 16756, -1000, 482, 45635, 2748, 2781, 2781, - -1000, -1000, 79955, -1000, -1000, -1000, 2748, 79955, 2748, 2748, - 4791, 2748, -1000, -1000, -1000, 2781, 2781, -1000, -1000, 16756, - 2668, -1000, -1000, 2748, 2748, -1000, -1000, 4791, 79955, 290, - 4791, 4791, 262, -1000, -1000, 79955, -1000, 2781, 3886, -1000, - 79955, 79955, 1228, 79955, -1000, 79955, 79955, -1000, -1000, -1000, - 987, 2195, 2115, -1000, 530, 7101, 63575, 582, 63575, 79955, - -1000, -1000, -1000, -1000, -1000, -1000, 284, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 80532, 4962, -1000, + -1000, 16847, 80532, 1367, 4699, 4967, 4703, 4833, 4876, 1224, + 3132, -1000, -227, 80532, 606, -1000, 2616, 3505, 2039, 2926, + -1000, 1434, 626, 2918, -1000, 1621, 1621, -1000, 626, 2755, + -1000, 1896, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 80532, + 205, 6275, -1000, -1000, -1000, 3859, -1000, -1000, -1000, 80532, + 4833, -17, 4809, 2765, 3000, 2999, 2765, -1000, -1000, -1000, + 1165, 4893, 20787, 20787, -1000, -1000, 16847, -1000, 506, 45948, + 2952, 2765, 2765, -1000, -1000, 80532, -1000, -1000, -1000, 2952, + 80532, 2952, 2952, 4893, 2952, -1000, -1000, -1000, 2765, 2765, + -1000, -1000, 16847, 2714, -1000, -1000, 2952, 2952, -1000, -1000, + 4893, 80532, 348, 4893, 4893, 310, -1000, -1000, 80532, -1000, + 2765, 3904, -1000, 80532, 80532, 1257, 80532, 1390, -1000, -1000, + -285, 80532, 80532, -1000, -1000, 80532, 994, -1000, 4318, 861, + -1000, -1000, 975, 2160, 2257, -1000, 520, 5560, 64026, 689, + 64026, 80532, -1000, -1000, -1000, -1000, -1000, -1000, 324, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 624, -1000, 4834, 16756, 16756, 16756, 16756, -1000, 1245, - 19102, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 20666, 20666, - 20666, 20666, 20666, 20666, 20666, 20666, 20666, 20666, 20666, 20666, - 20666, 20666, 4239, 2980, 2883, 4725, 20666, 20666, 20666, 20666, - 20666, 491, 38614, 2306, 4061, 2376, 527, 2662, 2662, 2662, - 2662, 2662, 16756, -1000, 2985, 3035, 16756, 16756, 16756, 16756, - 49535, 79955, -1000, -1000, 8936, 7074, 16756, 16756, 4900, 20666, - 16756, 4676, 16756, 16756, 16756, 4127, 9718, 79955, 16756, -1000, - 4126, 4125, -1000, -1000, 3189, 16756, -1000, -1000, 16756, -1000, - -1000, 16756, 20666, 16756, -1000, 16756, 16756, 16756, -1000, -1000, - 2073, 2073, 1520, 4676, 16756, 16756, 4676, 4676, 2901, 16756, - 16756, 4676, 4676, 4676, 2895, 4676, 4676, 4676, 4676, 4676, - 4676, 4676, 4015, 4676, 4676, 4676, 4676, 4676, 4119, 4117, - 4116, 4115, 16756, 4114, 16756, 16756, 16756, 16756, 16756, 15974, - 4872, 2683, 4737, -93, 14410, 4629, 4751, 4611, -67, 4778, - -1000, -1000, -1000, -1000, 3035, -202, 4248, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 79955, 3885, 3883, -364, -365, - 1680, -365, 2479, -1000, -239, 1707, 378, 79955, -1000, 3882, - 3481, 79955, 3879, 3480, 412, 406, 79955, 79955, 79955, 206, - 1717, 1611, 1664, -1000, -1000, 79955, 83075, -1000, 79955, 2707, - 79955, 79955, 1228, 1228, 79955, 4670, -1000, 79955, 79955, 1228, - 1228, -1000, 73715, 3878, 63575, 79955, 79955, 582, 79955, 79955, - 1228, 1228, 1228, 79955, -1000, 4563, 63575, 4536, 2184, 3023, - -1000, -1000, 79955, 16756, 3023, 1918, 4247, 1201, 1201, -1000, - 79955, 2358, 4669, 79955, 1242, -1000, 518, -1000, -1000, -1000, - -1000, 82295, 82295, 26129, 82295, -1000, 4246, 264, 79955, 79955, - 79955, 79955, 6002, 79955, 638, 4644, 1462, 73715, 75275, 2024, - 1787, -1000, -1000, 4710, 1531, 2761, 63575, 79955, 79955, 2350, - -1000, 1319, 30032, -1000, 79955, 2226, -1000, 202, -1000, 185, - 248, 2711, 248, 2711, 1317, -1000, 984, 670, 31594, 917, - 63575, 11282, -1000, -1000, 2711, 2711, 11282, 11282, 2607, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 2343, -1000, 487, 4737, + -1000, -1000, -1000, 618, -1000, 4923, 16847, 16847, 16847, 16847, + -1000, 1576, 19211, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 20787, 20787, 20787, 20787, 20787, 20787, 20787, 20787, 20787, 20787, + 20787, 20787, 20787, 20787, 4306, 3078, 3036, 4793, 20787, 20787, + 20787, 20787, 20787, 428, 38873, 2584, 4063, 2342, 493, 2712, + 2712, 2712, 2712, 2712, 16847, -1000, 2973, 3153, 16847, 16847, + 16847, 16847, 49878, 80532, -1000, -1000, 8967, 6846, 16847, 16847, + 6575, 20787, 16847, 4744, 16847, 16847, 16847, 4197, 9755, 80532, + 16847, -1000, 4196, 4194, -1000, -1000, 3320, 16847, -1000, -1000, + 16847, -1000, -1000, 16847, 20787, 16847, -1000, 16847, 16847, 16847, + -1000, -1000, 1955, 1955, 1626, 4744, 16847, 16847, 4744, 4744, + 2858, 16847, 16847, 4744, 4744, 4744, 2844, 4744, 4744, 4744, + 4744, 4744, 4744, 4744, 4124, 4744, 4744, 4744, 4744, 4744, + 4193, 4190, 4188, 4184, 16847, 4177, 16847, 16847, 16847, 16847, + 16847, 16059, 4967, 2447, 4804, -112, 14483, 4703, 4833, 4687, + -84, 4876, -1000, -1000, -1000, -1000, 3153, -182, 4316, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 80532, 3903, 3896, + -350, -355, 1674, -355, 2612, -1000, -197, 1736, 388, 80532, + -1000, 3895, 3504, 80532, 3894, 3499, 526, 525, 80532, 80532, + 80532, 247, 1740, 1721, 1723, -1000, -1000, 80532, 83676, -1000, + 80532, 2750, 80532, 80532, 1257, 1257, 80532, 4740, -1000, 80532, + 80532, 1257, 1257, 1257, -1000, 74244, 3893, 64026, 80532, 80532, + 689, 80532, 80532, 1257, 1257, 1257, 80532, -1000, 4634, 64026, + 4629, 2152, 2988, -1000, -1000, 80532, 16847, 2988, 1910, 4315, + 1229, 1229, -1000, 80532, 2331, 4739, 80532, 1271, -1000, 394, + -1000, -1000, -1000, -1000, 82890, 82890, 26292, 82890, -1000, 4313, + 308, 80532, 80532, 80532, 80532, 6334, 80532, 659, 4709, 1474, + 74244, 75816, 2338, 1884, -1000, -1000, 4776, 1681, 2832, 64026, + 80532, 80532, 80532, 2325, -1000, 1360, 30225, -1000, 80532, 2273, + -1000, 255, -1000, 240, 252, 2795, 252, 2795, 1346, -1000, + 966, 759, 31799, 893, 64026, 11331, -1000, -1000, 2795, 2795, + 11331, 11331, 2685, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 2318, -1000, 542, 4804, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -112, 16847, -1000, -1000, 4804, + 4804, 1917, 2263, 3498, 75030, 80532, 1259, 1259, 80532, 74244, + 64026, 689, 80532, 1259, 80532, 80532, 80532, -1000, 80532, -1000, + 4708, 1259, 80532, 1259, 80532, 80532, 80532, 2135, -1000, -1000, + 33371, 2577, -1000, -1000, 2987, -1000, 16847, 21575, -159, 16847, + 21575, 21575, 16847, 21575, -1000, 16847, 2297, -1000, -1000, 7632, + -1000, -1000, 3496, -1000, 3495, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3892, 3892, + -1000, 3494, -1000, -1000, -1000, -1000, 4263, 3491, -1000, -1000, + 3483, -1000, -1000, -1000, -1000, -34, 4175, 1849, -1000, 3887, + 3879, 4804, -1000, 4876, 494, 4876, 4687, 2244, 4310, 1259, + -1000, 325, -365, 2912, 2911, 2910, 4789, 80532, -1000, 1106, + 1621, -1000, -1000, 1957, -1000, 626, -1000, 1956, -1000, -1000, + -1000, 1621, 802, -1000, -1000, -1000, -1000, -1000, 2570, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -93, 16756, -1000, -1000, 4737, 4737, 1849, 2225, 3479, - 74495, 79955, 1230, 1230, 79955, 73715, 63575, 582, 79955, 1230, - 79955, 79955, 79955, -1000, 79955, -1000, 4643, 79955, 1230, 79955, - 79955, 79955, 2202, -1000, -1000, 33154, 2477, -1000, -1000, 3011, - -1000, 16756, 21448, -171, 16756, 21448, 21448, 16756, 21448, -1000, - 16756, 2487, -1000, -1000, 6620, -1000, -1000, 3477, -1000, 3476, + -1000, 31799, -1000, -1000, -1000, -1000, 1025, 8173, 81, 80, + 2314, -1000, -1000, -1000, 3482, 4834, 80532, 4893, 80532, -217, + 4893, 4893, 80532, -220, 4893, 689, -1000, 2770, 2770, 3153, + 80532, 80532, 80532, 4469, 4309, 80532, 277, 80532, 4893, 4893, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2952, 4893, 4893, + 2433, 4172, 2765, 2952, -1000, -1000, 2952, -365, -1000, 2952, + -1000, -1000, -1000, -365, 2558, -365, 80532, -1000, 80532, 80532, + -1000, -1000, -1000, -1000, 80532, -1000, 80532, -1000, 80532, -1000, + -29, -1000, -1000, 520, 64026, 70314, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 2327, -1000, -1000, -1000, 1340, 509, 2752, + -1000, -1000, 423, 321, 472, 1506, 3878, 3153, -1000, 3120, + 3030, -1000, 1209, 1103, -1000, -1000, -1000, -1000, 4307, -1000, + -1000, -1000, 4500, 3239, -1000, 2916, 2916, 2511, 2511, 2511, + 2511, 2511, 2930, 2930, 2770, 2770, -1000, -1000, -1000, 8967, + 4306, 20787, 20787, 20787, 20787, 4306, 20787, 20787, 20787, 20787, + 4305, -1000, 1480, 1480, 5461, 5918, 2712, -1000, -1000, 2682, + 2682, -1000, -1000, -1000, -1000, 16847, 266, 2977, -1000, 16847, + 3442, 2609, 3438, 2538, 2751, -1000, 4266, 16847, 2552, 724, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 3875, 3875, -1000, 3475, -1000, -1000, -1000, - -1000, 4206, 3465, -1000, -1000, 3463, -1000, -1000, -1000, -1000, - -9, 4111, 1815, -1000, 3862, 3860, 4737, -1000, 4778, 504, - 4778, 4611, 1970, 4245, 1230, -1000, 273, -377, 2918, 2915, - 2914, 4724, 79955, -1000, 1035, 896, -1000, -1000, 1797, -1000, - 634, -1000, 1796, -1000, -1000, -1000, 896, 765, -1000, -1000, - -1000, -1000, -1000, 2470, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 31594, -1000, -1000, -1000, - -1000, 1415, 7860, 51, 50, 2282, -1000, -1000, 79955, -1000, - 79955, -1000, 79955, -1000, -7, -1000, -1000, 3458, 4753, 79955, - 4791, 79955, -270, 4791, 4791, 79955, -266, 4791, 582, -1000, - 2753, 2753, 3035, 79955, 79955, 79955, 4400, 4242, 79955, 246, - 79955, 4791, 4791, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 2748, 4791, 4791, 2129, 4110, 2781, 2748, -1000, -1000, 2748, - -377, -1000, 2748, -1000, -1000, -1000, -377, 2468, -377, 79955, - -1000, -1000, -1000, -1000, -1000, 530, 63575, 69815, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 2336, -1000, -1000, -1000, 1316, - 538, 2729, -1000, -1000, 396, 303, 498, 1410, 3859, 3035, - -1000, 3047, 3037, -1000, 1250, 1219, -1000, -1000, -1000, -1000, - 4240, -1000, -1000, -1000, 3615, 4685, -1000, 2847, 2847, 2614, - 2614, 2614, 2614, 2614, 2798, 2798, 2753, 2753, -1000, -1000, - -1000, 8936, 4239, 20666, 20666, 20666, 20666, 4239, 20666, 20666, - 20666, 20666, 4238, -1000, 1421, 1421, 5605, 6039, 2662, -1000, - -1000, 2543, 2543, -1000, -1000, -1000, -1000, 16756, 247, 2973, - -1000, 16756, 3284, 2463, 3272, 2391, 2727, -1000, 4208, 16756, - 2467, 361, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 4108, 4105, 3412, 4833, 5068, 4101, 16756, -1000, - -1000, 2726, 2725, 2723, -1000, 3207, 15192, -1000, -1000, -1000, - 4100, 2465, 4096, -1000, -1000, -1000, 4095, 2722, 1870, 4092, - 3726, 4087, 4084, 4082, 4081, 2277, 2274, 2248, -1000, -1000, - -1000, -1000, 16756, 4056, 4021, 16756, 16756, 16756, 4077, 2719, - 2717, 16756, 16756, 16756, 16756, 4073, 16756, 16756, 16756, 16756, - 16756, 16756, 16756, 16756, -340, 16756, 16756, 16756, 16756, 16756, - 397, 397, 397, 397, 4016, 397, 2219, 2214, 4008, 4001, - 2452, 2245, 2244, 4737, 4872, -1000, -1000, 2714, -1000, 3035, - -1000, -1000, 4778, 4778, -1000, 4867, 4611, -200, 4237, 3452, - 2239, -1000, -1000, -326, 3789, 1313, 301, 79955, 79955, 1313, - 79955, 79955, 2912, 1313, 79955, -240, 3854, -1000, -1000, 3853, - -1000, -1000, 79955, 79955, 79955, 79955, 22, 4624, 4623, -1000, - -1000, 1693, 1577, 1676, -1000, 79955, -1000, 3852, 4637, 4630, - 4738, 1293, 79955, 79955, 37, 79955, 4236, 4235, 2450, 79955, - 79955, 563, -1000, -1000, 79955, 1953, -1000, 538, 99, 943, - 1851, 4401, 1256, 79955, 79955, 79955, 4668, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1721, -1000, 4616, - 4094, 3080, 1721, 4422, -100, -1000, 29251, 88535, 79955, 1918, - 1918, -1000, 4233, 2703, -1000, 72935, 44075, 44075, 44075, 44075, - 44075, 44075, 44075, 44075, -1000, 4484, 4444, 4232, -1000, 4500, - 4492, 4469, 852, 4483, 4457, 4429, 4227, -1000, 64355, -1000, - -1000, -1000, 2306, 2702, -1000, 537, 3546, 1448, 16756, 16756, - 4706, 4569, 4667, 4227, 2234, -1000, -1000, -1000, 2289, -1000, - 4781, 1303, 1222, 1222, 1485, 4779, 26911, -1000, 2761, 2009, - 1312, 4568, 643, -1000, 2761, -3, 1200, 2761, 2761, 2761, - 2761, 2761, 2761, 2761, 2761, 1082, 1073, 2761, 2761, 2761, - 2761, 2761, 2761, 2761, 2761, 2761, 2761, 2761, 1725, 2761, - 2761, 2761, 2761, 2761, -1000, 2761, 4231, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1099, 1020, -1000, -1000, 496, 582, - 1305, 223, 219, 559, 4705, 680, -1000, 1787, 706, -1000, - 2761, 4703, 2761, 38614, -1000, 1953, 969, 4702, 727, 79955, - 79955, 458, 2066, 2711, 248, 200, -1000, -1000, 2226, 11282, - 2226, 11282, 3445, -1000, -1000, 1298, -1000, -1000, 1851, -1000, - 79955, 79955, -1000, -1000, 4230, 2909, -1000, -1000, 23788, -1000, - 11282, 11282, -1000, -1000, 44855, 79955, -1000, 106, -1000, 183, - 4778, 2225, 2221, -1000, 3191, 4065, 4062, -1000, -1000, -1000, - -1000, -1000, -1000, -251, -1000, -1000, 79955, -1000, 79955, 79955, - 1832, -1000, 2215, 1851, 4418, 79955, 1276, -1000, -1000, 4229, - 79955, -1000, 3849, -1000, 4832, -251, 4829, 13628, -1000, -1000, - 72155, -1000, 71375, 2952, -1000, 21448, 3065, 285, -1000, 483, - -306, 283, 3013, 282, 3035, -1000, -1000, 4058, 4053, 4049, - 2689, -1000, 2687, 4036, -1000, 2685, 2684, 3444, -1000, -319, - 274, 4778, 4611, 3846, 2208, -1000, 4611, -1000, -331, -100, - -1000, 28471, 88535, 79955, 3839, 3173, 4663, 3602, -281, 16756, - 70595, 16756, 1532, 2449, 476, -1000, -1000, 896, 896, -1000, - 896, 896, -1000, -1000, 79955, 2206, 2908, 1404, 3845, -1000, - 2674, -1000, -1000, -1000, -1000, 3443, -1000, -1000, 2781, 79955, - -1000, -1000, 2342, 79955, 54995, -1000, -1000, -1000, -1000, 79955, - -1000, 582, 4400, -1000, 63575, -1000, 2781, -1000, -1000, 4791, - -1000, -1000, 16756, 16756, 236, 4791, 2781, 2781, -1000, 2748, - -1000, 79955, -1000, -377, 69815, 2044, -1000, 1297, 2438, 2433, - -1000, 63575, 614, 63575, -1000, -1000, 4765, -1000, 79955, 4618, - -1000, -1000, -1000, 3789, 2907, -372, 79955, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2671, -1000, 1421, - 1421, 5605, 4998, -1000, 1421, 1421, 5605, 4804, 20666, -1000, - 20666, -1000, 20666, -1000, -1000, -1000, -1000, 3962, -1000, 2951, - -1000, 16756, 3045, 5730, 16756, 491, 2588, 37834, 49535, 21, - 4622, 3957, 79955, 16756, -1000, -1000, 16756, 16756, 20666, -1000, - 3917, -1000, -1000, -1000, -1000, 16756, 16756, 3183, -1000, 79955, - -1000, -1000, -1000, -1000, 37834, -1000, 20666, -1000, -1000, -1000, - -1000, 16756, 16756, 16756, 2054, -341, -341, 2054, 3909, 2642, - 397, 397, -341, 3901, 3897, 3893, 2634, 397, 3847, 3843, - 3826, 3805, 3795, 3747, 3743, 3734, 4789, 3723, 3665, 2630, - 3637, 2439, -1000, 69035, -1000, -1000, -1000, 397, -1000, -351, - 16756, -351, 16756, -351, -351, 16756, 3159, 18320, 4778, 4737, - 14410, -1000, 4611, 4611, 622, -1000, -1000, 4228, 1199, 2181, - 3430, 3836, 197, -1000, 2906, -1000, 726, 59675, 79955, 4828, - 4826, -1000, 2426, 3834, 68255, -1000, 1599, 79955, -1000, -1000, - 4810, 4808, -1000, -1000, 79955, 79955, 79955, -1000, -1000, -1000, - 1573, -1000, 3833, -1000, -1000, 655, 651, 3276, 4862, 4860, - 2984, 3832, 597, 1925, 25348, 79955, 4227, 4227, 317, 2761, - 863, 992, 63575, 1107, -1000, 67475, 3105, 2902, 4417, -1000, - 1869, 4599, 79955, 66695, 1029, 1302, 4226, 890, 6620, -1000, - 4616, 4225, 79955, 4616, -1000, -331, -1000, 4606, 1817, -1000, - 4224, -1000, 2629, 4528, -1000, 2422, 2180, -1000, 2898, 2626, - 2625, 2897, -331, 346, 6984, -1000, 79955, 79955, 1929, -1000, - 2421, 380, 4399, 4399, 4399, -1000, 4399, 4399, -1000, -1000, - -1000, -1000, 4480, 3823, -1000, 4472, -1000, 4463, -1000, 4445, - -1000, -1000, -1000, -1000, 4460, -1000, -1000, -1000, 30032, -1000, - 44075, -1000, 1448, -1000, 4733, 1568, 1568, 1568, 2412, 4029, - 43294, 42514, -1000, -1000, 890, 6620, 4659, 6913, 4135, -1000, - 65915, -1000, -1000, -1000, 1348, -1000, 1568, 1568, 1228, 79955, - 3082, 1568, 3079, 4223, -1000, -1000, 1038, 79955, 79955, -1000, - 79955, 79955, 79955, 79955, 79955, 79955, 79955, -1000, -1000, 79955, - 65135, -1000, 79955, 79955, -1000, 79955, 3078, 79955, 79955, 3074, - 4592, 2761, 2761, 1501, -1000, -1000, 968, -1000, 65135, 3423, - 3422, 3418, 3417, 3414, 3822, 3818, 3815, 2761, 2761, 3413, - 3814, 64355, 3813, 2050, 3411, 3410, 3409, 3386, 3812, 1426, - -1000, 3811, 3351, 3340, 3330, 79955, 4222, 3709, -1000, -1000, - 3276, 3806, 4219, 3403, 3804, 1395, 582, 3801, 4413, 317, - 2761, 667, 79955, 2896, 2894, 37834, 2761, 38614, -1000, 992, - 957, 957, 936, 98, 32374, -1000, -1000, -1000, 79955, 79955, - 11282, -1000, -1000, 198, 125, -1000, -1000, -1000, -1000, 63575, - 3799, 917, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4611, - 16756, 4580, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 79955, 1276, -1000, -1000, -1000, 25348, -1000, -1000, 79955, -1000, - 4791, -1000, 30032, -1000, -1000, -1000, 2418, -1000, 2994, -358, - 21448, 2785, 2751, -1000, 16756, 21448, 16756, -175, 665, -188, - -1000, -1000, -1000, -1000, 3798, -1000, -1000, -1000, 3401, -1000, - 3395, -1000, 138, 418, 449, 4611, -1000, 489, 3571, -1000, - -1000, 13628, 1817, 2619, 4527, 2180, 2609, -1000, -1000, -1000, - -1000, 4723, -1000, -1000, -1000, -1000, -1000, 242, -384, -391, - 238, 3796, 79955, 3380, -1000, -1000, -1000, -1000, -1000, 1738, - -1000, -1000, -1000, 4791, 2781, 4791, 54995, 2781, 2784, -1000, - -1000, -1000, -1000, 1851, -1000, -1000, 4791, -1000, 3035, 3035, - -1000, -1000, -377, 4791, 4791, 2781, -1000, -1000, 4807, 63575, - 582, 2632, 62795, -1000, 619, 2183, 960, 3794, -1000, 1362, - 195, 3791, 3789, -1000, -1000, -1000, -1000, 20666, -1000, -1000, - 20666, 2756, 2753, -1000, -1000, -1000, 3035, 16756, 4025, 4211, - 3258, 4022, 4019, -1000, -1000, 4211, 4211, -1000, 4208, 4209, - 4208, 2543, 2543, 4017, -1000, 4218, -1000, 4622, -1000, 2606, - 3198, 3628, 5914, 397, 3609, 3581, 16756, 2416, 4013, 5704, - 2308, 2065, 3569, 83, 397, 4787, 397, -41, 397, 397, - -1000, -1000, -1000, 397, 397, 397, 397, 397, -1000, 397, - 397, 397, 397, 397, 397, 397, 397, 4217, 397, 397, - 397, 397, 16756, -1000, 87755, -1000, 397, 4576, 2209, 397, - 2168, 397, 397, 3557, 27, -230, 25, -234, 4611, 4778, - -1000, -1000, -1000, 16756, 477, 4011, 4900, 2156, 954, 954, - 3789, 3770, 79955, -1000, -1000, -1000, 3766, 1691, -242, 79955, - -1000, -393, -409, 300, 79955, 3764, 79955, 79955, 259, 2981, - 3090, -1000, 3757, -1000, -1000, 62015, 79955, 79955, 81515, 1019, - 79955, 79955, 3755, -1000, -1000, 4216, -1000, 4215, -12, 4213, - 35, 3754, 4010, 2151, -1000, -1000, 79955, -1000, -1000, -1000, - 4009, 2102, -1000, -1000, -1000, 6620, 4212, 4211, 4211, 1667, - 4208, -1000, -1000, -1000, 4208, -1000, -1000, -1000, -1000, 4211, - 4211, 4211, 4211, 4211, 4211, 4210, -1000, -1000, 4209, 4209, - 4209, 4208, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1649, 4206, 4207, 4207, 4206, -1000, -1000, -1000, -1000, + 4169, 4168, 3247, 4922, 5511, 4167, 16847, -1000, -1000, 2747, + 2743, 2742, -1000, 3459, 15271, -1000, -1000, -1000, 4165, 2547, + 4152, -1000, -1000, -1000, 4150, 2737, 2183, 4146, 3468, 4140, + 4138, 4137, 4132, 2312, 2304, 2291, -1000, -1000, -1000, -1000, + 16847, 4055, 4051, 16847, 16847, 16847, 4130, 2736, 2735, 16847, + 16847, 16847, 16847, 4129, 16847, 16847, 16847, 16847, 16847, 16847, + 16847, 16847, -315, 16847, 16847, 16847, 16847, 16847, 416, 416, + 416, 416, 4043, 416, 2528, 2493, 4037, 4018, 2604, 2290, + 2287, 4804, 4967, -1000, -1000, 2731, -1000, 3153, -1000, -1000, + 4876, 4876, -1000, 4960, 4687, -179, 4302, 3478, 2286, -1000, + -1000, -294, 3786, 1339, 344, 80532, 80532, 1339, 80532, 80532, + 2908, 1339, 80532, -198, 3877, -1000, -1000, 3874, -1000, -1000, + 80532, 80532, 80532, 80532, -6, 4697, 4696, -1000, -1000, 1735, + 1702, 1678, -1000, 80532, -1000, 3873, 4707, 4705, 4806, 1306, + 80532, 80532, 75, 80532, 4300, 4298, 2531, 80532, 80532, 80532, + 548, -1000, -1000, 80532, 1902, -1000, 509, 131, 953, 1897, + 4471, 1267, 80532, 80532, 80532, 4737, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1895, -1000, 4692, 4157, + 3109, 1895, 4514, -118, -1000, 29438, 89178, 80532, 1910, 1910, + -1000, 4297, 2726, -1000, 73458, 44376, 44376, 44376, 44376, 44376, + 44376, 44376, 44376, -1000, 4592, 4551, 4296, -1000, 4564, 4563, + 4554, 818, 4587, 4553, 4539, 4289, -1000, 64812, -1000, -1000, + -1000, 2584, 2725, -1000, 432, 3481, 1546, 16847, 16847, 4775, + 4666, 4732, 4289, 2274, -1000, -1000, -1000, 2488, -1000, 4879, + 1099, 1248, 1248, 1511, 4878, 27080, -1000, 2832, 1958, 1337, + 4653, 634, -1000, 2832, -27, 1226, 2832, 2832, 2832, 2832, + 2832, 2832, 2832, 2832, 1116, 1113, 2832, 2832, 2832, 2832, + 2832, 2832, 2832, 2832, 2832, 2832, 2832, 1754, 2832, 2832, + 2832, 2832, 2832, -1000, 2832, 4295, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1183, 1042, -1000, -1000, 470, 689, 1336, + 273, 271, 538, 4773, 693, -1000, 1884, 687, -1000, 2832, + 4772, 2832, 38873, -1000, 1902, 968, -274, 4770, 727, 80532, + 80532, 374, 2153, 2795, 252, 222, -1000, -1000, 2273, 11331, + 2273, 11331, 3477, -1000, -1000, 1322, -1000, -1000, 1897, -1000, + 80532, 80532, -1000, -1000, 4294, 2907, -1000, -1000, 23933, -1000, + 11331, 11331, -1000, -1000, 45162, 80532, -1000, 143, -1000, 232, + 4876, 2263, 2248, -1000, 3251, 4126, 4122, -1000, -1000, -1000, + -1000, -1000, -1000, -208, -1000, -1000, 80532, -1000, 80532, 80532, + 1886, -1000, 2237, 1897, 4513, 80532, 1321, -1000, -1000, 4291, + 80532, 80532, -1000, 3872, -1000, 4921, -208, 4920, 13695, -1000, + -1000, 72672, -1000, 71886, 2938, -1000, 21575, 3105, 304, -1000, + 441, -287, 302, 3035, 297, 3153, -1000, -1000, 4119, 4116, + 4115, 2708, -1000, 2707, 4112, -1000, 2704, 2696, 3476, -1000, + -269, 296, 4876, 4687, 3868, 2235, -1000, 4687, -1000, -300, + -118, -1000, 28652, 89178, 80532, 3863, 3319, 4731, 3538, -227, + 16847, 71100, 16847, 1629, 2506, 461, -1000, -1000, 1621, 1621, + -1000, 1621, 1621, -1000, -1000, 80532, 2225, 2906, 1335, 521, + 3859, -1000, -1000, 3472, -1000, -1000, 2765, 80532, -1000, -1000, + 2492, 80532, 55380, -1000, -1000, -1000, -1000, 80532, -1000, 689, + 4469, -1000, 64026, -1000, 2765, -1000, -1000, 4893, -1000, -1000, + 16847, 16847, 287, 4893, 2765, 2765, -1000, 2952, -1000, 80532, + -1000, -365, -1000, -1000, -1000, 2673, -1000, -1000, 70314, 2075, + -1000, 1314, 2498, 2485, -1000, 64026, 622, 64026, -1000, -1000, + 4848, -1000, 80532, 4694, -1000, -1000, -1000, 3786, 2903, -362, + 80532, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2672, -1000, 1480, 1480, 5461, 5744, -1000, 1480, 1480, + 5461, 5243, 20787, -1000, 20787, -1000, 20787, -1000, -1000, -1000, + -1000, 4012, -1000, 2920, -1000, 16847, 3069, 6016, 16847, 428, + 3480, 38087, 49878, -7, 4691, 4004, 80532, 16847, -1000, -1000, + 16847, 16847, 20787, -1000, 3996, -1000, -1000, -1000, -1000, 16847, + 16847, 3243, -1000, 80532, -1000, -1000, -1000, -1000, 38087, -1000, + 20787, -1000, -1000, -1000, -1000, 16847, 16847, 16847, 2143, -316, + -316, 2143, 3986, 2670, 416, 416, -316, 3979, 3972, 3963, + 2660, 416, 3958, 3907, 3885, 3876, 3866, 3860, 3842, 3821, + 4887, 3817, 3785, 2658, 3777, 2568, -1000, 69528, -1000, -1000, + -1000, 416, -1000, -328, 16847, -328, 16847, -328, -328, 16847, + 3172, 18423, 4876, 4804, 14483, -1000, 4687, 4687, 607, -1000, + -1000, 4290, 1225, 2216, 3470, 3856, 212, -1000, 2901, -1000, + 722, 60096, 80532, 4918, 4916, -1000, 2479, 3854, 68742, -1000, + 1694, 80532, -1000, -1000, 4915, 4913, -1000, -1000, 80532, 80532, + 80532, -1000, -1000, -1000, 1661, -1000, 3853, -1000, -1000, 559, + 433, 3355, 4957, 4951, 2972, 3852, 554, 2018, 25505, 80532, + 4289, -274, 4289, 343, 2832, 872, 1110, 64026, 1163, -1000, + 67956, 3112, 2900, 4510, -1000, 945, 4672, 80532, 67170, 990, + 1389, 4288, 896, 7632, -1000, 4692, 4287, 80532, 4692, -1000, + -300, -1000, 4682, 1880, -1000, 4286, -1000, 2653, 4622, -1000, + 2463, 2186, -1000, 2896, 2648, 2644, 2892, -300, 378, 7455, + -1000, 80532, 80532, 2119, -1000, 2436, 318, 4465, 4465, 4465, + -1000, 4465, 4465, -1000, -1000, -1000, -1000, 4573, 3848, -1000, + 4571, -1000, 4570, -1000, 4567, -1000, -1000, -1000, -1000, 4552, + -1000, -1000, -1000, 30225, -1000, 44376, -1000, 1546, -1000, 4805, + 1556, 1556, 1556, 2513, 4111, 43589, 42803, -1000, -1000, 896, + 7632, 4730, 6425, 4211, -1000, 66384, -1000, -1000, -1000, 1587, + -1000, 1556, 1556, 1257, 80532, 3090, 1556, 3082, 4282, -1000, + -1000, 1072, 80532, 80532, -1000, 80532, 80532, 80532, 80532, 80532, + 80532, 80532, -1000, -1000, 80532, 65598, -1000, 80532, 80532, -1000, + 80532, 3081, 80532, 80532, 3077, 4652, 2832, 2832, 1608, -1000, + -1000, 951, -1000, 65598, 3467, 3466, 3463, 3462, 3461, 3847, + 3840, 3836, 2832, 2832, 3460, 3833, 64812, 3832, 1981, 3458, + 3445, 3441, 3368, 3813, 1448, -1000, 3811, 3366, 3356, 3339, + 80532, 4281, 3716, -1000, -1000, 3355, 3808, 4280, 3440, 3800, + 1455, 689, 3798, 4509, 343, 2832, 685, 80532, 2884, 2878, + 38087, 2832, 38873, -1000, 1110, 937, 937, -1000, -279, 950, + 130, 32585, -1000, -1000, -1000, 80532, 80532, 11331, -1000, -1000, + 251, 234, -1000, -1000, -1000, -1000, 64026, 3797, 893, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 4687, 16847, 4667, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 80532, 1321, -1000, + -1000, -1000, 25505, -1000, -1000, -1000, 80532, -1000, 4893, -1000, + 30225, -1000, -1000, -1000, 2427, -1000, 3006, -346, 21575, 2948, + 2767, -1000, 16847, 21575, 16847, -161, 666, -164, -1000, -1000, + -1000, -1000, 3796, -1000, -1000, -1000, 3426, -1000, 3419, -1000, + 228, 431, 448, 4687, -1000, 450, 3377, -1000, -1000, 13695, + 1880, 2642, 4621, 2186, 2641, -1000, -1000, -1000, -1000, 4788, + -1000, -1000, -1000, -1000, -1000, 261, -373, -376, 256, 3791, + 80532, 3418, -1000, -1000, -1000, -1000, -1000, 1749, -1000, -1000, + 4893, 2765, 4893, 55380, 2765, 2781, -1000, -1000, -1000, -1000, + 1897, -1000, -1000, 4893, -1000, 3153, 3153, -1000, -1000, -365, + 4893, 4893, 2765, -1000, -1000, -1000, 4912, 64026, 689, 2705, + 63240, -1000, 599, 2317, 926, 3790, -1000, 1439, 208, 3787, + 3786, -1000, -1000, -1000, -1000, 20787, -1000, -1000, 20787, 2791, + 2770, -1000, -1000, -1000, 3153, 16847, 4104, 4271, 3128, 4103, + 4101, -1000, -1000, 4271, 4271, -1000, 4266, 4267, 4266, 2682, + 2682, 4100, -1000, 4279, -1000, 4691, -1000, 2629, 3388, 3770, + 5119, 416, 3757, 3745, 16847, 2410, 4098, 4853, 2500, 2171, + 3710, 116, 416, 4885, 416, -67, 416, 416, -1000, -1000, + -1000, 416, 416, 416, 416, 416, -1000, 416, 416, 416, + 416, 416, 416, 416, 416, 4278, 416, 416, 416, 416, + 16847, -1000, 88392, -1000, 416, 4665, 2255, 416, 2180, 416, + 416, 3705, 51, -191, 48, -192, 4687, 4876, -1000, -1000, + -1000, 16847, 482, 4095, 6575, 2182, 960, 960, 3786, 3784, + 80532, -1000, -1000, -1000, 3783, 1732, -199, 80532, -1000, -377, + -378, 341, 80532, 3778, 80532, 80532, 313, 2953, 3104, -1000, + 3776, -1000, -1000, 62454, 80532, 80532, 82104, 1037, 80532, 80532, + 3774, -1000, -1000, 4277, -1000, 4276, -35, 4274, 72, 3773, + 4091, 2181, -1000, -1000, 80532, -1000, -1000, -1000, 4077, 2170, + -1000, -1000, -1000, 7632, 4273, 4271, 4271, 1663, 4266, -1000, + -1000, -1000, 4266, -1000, -1000, -1000, -1000, 4271, 4271, 4271, + 4271, 4271, 4271, 4269, -1000, -1000, 4267, 4267, 4267, 4266, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1804, + 4263, 4264, 4264, 4263, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 4657, 4654, 3492, -1000, -1000, - -1000, 41734, 79955, 957, -1000, -1000, -1000, 1092, 654, 3379, - 921, -1000, 79955, 856, 724, 4542, 2889, 3751, 79955, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4599, - -1000, 1324, -377, 79955, 861, 22228, -1000, 1837, 4653, 79955, - -1000, 79955, 61235, -1000, -93, -1000, -1000, 24568, -1000, 2761, - 24568, 865, 2809, -1000, 16756, 2605, 4616, -1000, 3063, -100, - 14410, 2007, 79955, -100, 79955, 79955, 14410, -1000, 79955, -1000, - 79955, 16756, -1000, -1000, -331, 4007, -1000, 1190, 2075, 211, - 30032, 79955, -1000, 57335, 16756, -1000, -1000, 16756, 4204, -1000, - -1000, -1000, -346, -1000, 4006, -1000, -1000, -1000, -1000, -1000, - 4442, -1000, 306, -1000, 4203, 4567, -1000, -1000, -1000, 3750, - -1000, 2101, 55775, -1000, 2887, -1000, -1000, 2096, 54215, -1000, - 2886, -1000, -1000, 865, -1000, 1721, -1000, 2321, 1394, 27691, - -1000, 1187, 4561, 79955, 6620, -1000, 79955, -1000, 79955, 79955, - -1000, 79955, 79955, 1228, 16756, 974, 737, 698, -1000, 1066, - -1000, 903, 1650, 796, 1274, 1274, 4561, 79955, 1285, -1000, - 2079, -1000, 4622, -1000, -1000, 2078, -1000, -1000, -1000, -1000, - 79955, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 37834, - 37834, 4695, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 3746, 3741, -1000, -1000, + -1000, -1000, -1000, 4728, 4723, 4722, 3465, -1000, -1000, -1000, + 42017, 80532, 937, -1000, -1000, -1000, 1155, 569, 3410, 910, + -1000, 80532, 871, 717, 4641, 2877, 3766, 80532, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4672, -1000, + 1539, -365, 80532, 870, 22361, -1000, 1883, 4719, 80532, -1000, + 80532, 61668, -1000, -112, -1000, -1000, 24719, -1000, 2832, 24719, + 880, 2837, -1000, 16847, 2620, 4692, -1000, 3050, -118, 14483, + 2289, 80532, -118, 80532, 80532, 14483, -1000, 80532, -1000, 80532, + 16847, -1000, -1000, -300, 4071, -1000, 1224, 2030, 233, 30225, + 80532, -1000, 57738, 16847, -1000, -1000, 16847, 4261, -1000, -1000, + -1000, -321, -1000, 4065, -1000, -1000, -1000, -1000, -1000, 4183, + -1000, 291, -1000, 4260, 4651, -1000, -1000, -1000, 3764, -1000, + 2158, 56166, -1000, 2874, -1000, -1000, 2122, 54594, -1000, 2872, + -1000, -1000, 880, -1000, 1895, -1000, 1616, 1149, 27866, -1000, + 1219, 4660, 80532, 7632, -1000, 80532, -1000, 80532, 80532, -1000, + 80532, 80532, 1257, 16847, 976, 757, 753, -1000, 1068, -1000, + 965, 1707, 837, 1325, 1325, 4660, 80532, 1309, -1000, 2105, + -1000, 4691, -1000, -1000, 2083, -1000, -1000, -1000, -1000, 80532, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 38087, 38087, + 4768, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 3758, 3755, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 79955, 2602, -1000, - 2884, 3740, 35, 10500, -1000, -1000, 1273, -1000, 4411, 1359, - 3492, 41734, 2881, 2711, 3736, 3735, -1000, 37834, -1000, 957, - -1000, 3733, 3732, -1000, 3105, 2877, 1358, 79955, -1000, 1850, - 79955, 79955, -1000, 1986, -1000, 2876, 2113, -1000, -1000, -1000, - -1000, 2044, 4005, -1000, -1000, 4605, -1000, -1000, 4593, -1000, - -1000, 4000, 854, 4786, 2000, 60455, -1000, -358, 2904, -1000, - 3025, 278, 3009, 79955, -1000, -1000, -1000, 3999, 3998, -1000, - -130, 450, 4777, 4776, 4605, -146, 3730, -1000, 1813, 1998, - -100, -1000, 1654, -1000, -1000, -1000, -1000, -412, -1000, -1000, - 896, -1000, 4791, -1000, 2781, 4791, 4791, -271, -1000, -1000, - -1000, -1000, 4791, 582, -1000, 2068, -1000, -1000, -1000, -1000, - -1000, -1000, 509, -1000, 79955, -1000, 1984, 194, -1000, -1000, - -1000, 3035, -1000, 1493, 491, -1000, -1000, -1000, 1481, -1000, - -1000, -1000, -1000, -1000, -1000, 40954, -1000, -1000, -1000, 16756, - -1000, -1000, -1000, -1000, -1000, 3543, 79955, -1000, -1000, 16756, - 16756, -1000, 3997, 3725, -1000, 4202, -1000, 3996, 3724, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 80532, 2617, -1000, 2868, + 3754, 72, 10543, -1000, -1000, 1287, -1000, 4504, 1436, 3465, + 42017, 2866, 2795, 3753, 3744, -1000, 38087, -1000, 937, -1000, + 3742, 3731, -1000, -1000, 2594, 3112, 2864, 1431, 80532, -1000, + 1892, 80532, 80532, -1000, 2193, -1000, 2860, 2102, -1000, -1000, + -1000, -1000, 2075, 4058, -1000, -1000, 4681, -1000, -1000, 4654, + -1000, -1000, 4056, 865, 4884, 2061, 60882, -1000, -346, 2861, + -1000, 3064, 295, 2936, 80532, -1000, -1000, -1000, 4050, 4049, + -1000, -123, 447, 4869, 4868, 4681, -142, 3728, -1000, 1848, + 2279, -118, -1000, 1795, -1000, -1000, -1000, -1000, -382, -1000, + -1000, 1621, -1000, 4893, -1000, 2765, 4893, 4893, -221, -1000, + -1000, -1000, -1000, 4893, 689, -1000, 2110, -1000, -1000, -1000, + -1000, -1000, -1000, 491, -1000, 80532, -1000, 2009, 206, -1000, + -1000, -1000, 3153, -1000, 1532, 428, -1000, -1000, -1000, 1525, + -1000, -1000, -1000, -1000, -1000, -1000, 41231, -1000, -1000, -1000, + 16847, -1000, -1000, -1000, -1000, -1000, 3689, 80532, -1000, -1000, + 16847, 16847, -1000, 4044, 3726, -1000, 4259, -1000, 4038, 3723, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 4872, -1000, -1000, -1000, -1000, 3537, - 3995, 1189, -1000, -1000, -1000, -351, 16756, -1000, -351, 16756, - -1000, -1000, 4806, 2594, 3994, 3988, 2581, 3983, 3982, 4605, - 4611, 1815, 3977, 1949, -1000, -1000, -1000, -1000, -1000, -1000, - 3974, 4900, 1513, 3717, 1513, -1000, -1000, -1000, -1000, 59675, - 79955, -1000, -1000, -1000, 59675, 79955, 4805, 40174, 1260, -377, - 895, 4195, -1000, 901, 2981, 1651, 4194, 3714, -1000, 79955, - 4802, 79955, 3276, 1013, 3276, 1057, 79955, -251, 55775, 54215, - 33, 3367, 10500, -1000, 3712, -1000, 17, 1925, 6620, 1391, - 25348, 4594, 1837, 1837, -1000, 3710, 535, -1000, -1000, -1000, - 811, -1000, 3366, -1000, -1000, 3280, 2462, 558, -1000, -1000, - -1000, -1000, -1000, -1000, 3215, 79955, 58895, 3215, 3440, 2874, - -378, -1000, 4193, -1000, 2761, 2761, 2761, 1260, 850, 79955, - 3973, 1884, -1000, -1000, -1000, -1000, -1000, 1837, -1000, 4551, - 79955, 2048, 3965, -258, 3955, 1207, 2749, 2746, -1000, 3353, - 2580, 4526, 1547, -1000, 3953, 1875, -100, -1000, -1000, 1817, - 2415, -1000, -1000, -1000, 2866, 3035, -1000, -1000, 58115, 30032, - 57335, 1996, -1000, 2401, -1000, 2958, 3035, 79955, -1000, 2386, - -1000, -1000, -1000, 56555, -1000, 4775, 4774, 249, 55775, 2576, - 54995, 54215, 2573, 53435, 1207, -1000, 52655, 2561, -1000, 79955, - -1000, -1000, 79955, 2560, -1000, 7796, 4191, -1000, 4190, 4189, - 4395, 952, 4188, 4187, 79955, 3533, 964, 3352, 20666, 4186, - 20666, 4185, 986, 4184, -1000, -1000, -1000, -1000, -1000, 1169, - 4585, -1000, 759, -1000, -1000, -1000, -1000, 1026, 1025, -1000, - -1000, 4561, 79955, 79955, -1000, 79955, -1000, 2589, -1000, 37834, - -1000, -1000, 2545, -1000, 3709, 3702, -1000, -1000, 3952, 3035, - -1000, 2340, 582, 1343, 79955, -1000, 535, 3693, 11282, -1000, - -1000, -1000, -1000, -1000, -1000, 4542, 3691, 3215, 79955, -1000, - 79955, 1850, 1850, 4872, 30032, 79955, 14410, -331, -1000, -1000, - 4572, 2694, -1000, -1000, -1000, 79955, 4784, 4773, -1000, 1227, - 21448, -189, 660, -1000, -1000, -1000, -135, 3688, -1000, -1000, - 4772, 3680, 3512, -1000, 274, 3679, -1000, -100, -1000, 1817, - 3664, -1000, -1000, -1000, 4791, -1000, -1000, 79955, -1000, 1851, - -1000, -1000, 1735, 1087, -1000, 4693, 3945, 4687, 2821, -1000, - -1000, -1000, 3524, -1000, -1000, 3493, 3434, -341, -1000, 4872, - 397, -1000, 3934, 397, -1000, 4872, -1000, 4770, 397, 3427, - 397, 3421, -351, 4558, -1000, 3658, -1000, -1000, -1000, 3657, - -1000, -1000, -1000, 4605, -1000, 16756, -1000, 3932, -1000, 3656, - -1000, -1000, -1000, 3655, -1000, 3654, -244, -1000, -1000, 697, - 1260, -1000, 609, 79955, 953, -1000, 51875, 10500, -379, 842, - 79955, 4801, 3649, 3276, 3646, 3276, 79955, 1009, -1000, 2536, - 2524, 4652, 3643, -1000, 3929, -1000, 3642, 3641, -1000, -1000, - 6620, -1000, 3466, 4866, 4866, -1000, -1000, 4764, -1000, 1871, - 690, -1000, -1000, 3220, 996, -1000, -1000, 3636, 963, -1000, - 1850, -1000, -1000, 2854, 3150, 3550, 49535, 37834, 38614, 3635, - -1000, 79955, -1000, 7267, 24568, -1000, 1260, 4718, 841, 4737, - 779, 4862, 7473, 1737, 2733, -1000, 3349, -1000, 3348, -1000, - -1000, 4183, 79955, -1000, -1000, 1817, 79955, 16756, 4791, 1996, - 199, -331, -1000, 2621, 307, -1000, 39394, 2497, -1000, 16756, - 2496, -1000, -1000, -1000, -1000, 4182, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1737, 79955, -1000, 1187, 4525, -1000, - -1000, 79955, -1000, 7796, -1000, -1000, 3093, 3053, 20666, -1000, - -1000, 3626, 3624, 3621, 38614, 1393, 2850, 2848, 1406, 4179, - -1000, 1037, 4842, 3347, -1000, -1000, -1000, 1464, -163, 4178, - 3054, 3015, -1000, 79955, -1000, 49535, 49535, 49535, 2070, 2070, - 49535, 49535, 4175, 1274, 4135, 4769, -1000, 5584, 79955, 5506, - 79955, 4174, 2844, 20666, 8140, 8140, 8140, 8140, 8140, 20666, - -1000, -1000, -1000, 2841, -1000, -1000, -1000, -1000, -1000, -1000, - 2761, 2485, -1000, -1000, -1000, -1000, -1000, 79955, 2378, -1000, - -1000, -1000, 3440, -1000, -1000, 1832, -1000, 4751, 1996, -1000, - -1000, -1000, -1000, -1000, 4513, -1000, -348, 16756, 17538, -1000, - -358, 79955, 79955, -137, 3344, -1000, 3620, 439, -1000, -1000, - 418, -1000, 1817, -1000, -1000, 2781, -139, 262, 37834, 2825, - 37834, -1000, 37834, 3925, 557, 7, -1000, -1000, -1000, 397, - 3915, -1000, 397, -1000, 594, 16756, -1000, -351, -1000, -351, - 397, -1000, 3911, 3906, -1000, 3356, -1000, -1000, -1000, -1000, - 79955, 79955, -1000, 79955, 3619, 3342, -1000, -1000, 2491, -1000, - -1000, -1000, 3033, 3027, 2489, 3831, 3541, 79955, 832, 79955, - -251, 3618, -251, 3614, 1001, 3276, -1000, -1000, -205, -1000, - -1000, -1000, -1000, 15, -1000, -1000, -1000, 694, -1000, 970, - 3507, 3336, -1000, -1000, 687, -1000, -1000, -1000, 3215, 3613, - -1000, -1000, 192, -1000, 2810, 2480, -1000, -1000, -1000, 811, - 1177, -1000, 1837, 4651, 7146, -1000, 2009, -1000, -1000, -1000, - 79955, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1735, 2761, - -1000, 1177, 1080, 2827, -1000, 3333, -1000, -1000, 16756, 1768, - -1000, 3035, 4872, -331, -1000, 13628, -1000, 3020, 79955, 79955, - -1000, -1000, -1000, 51095, 80735, 1067, 2472, -1000, 5385, 1357, - -1000, -1000, -1000, -1000, 5605, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 3596, 3589, -1000, -1000, -1000, -1000, -1000, - 3283, 4172, 217, -1000, 4686, 4650, 16756, -1000, -1000, 4171, - 2461, 2457, 2443, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 2440, 2428, 49535, -1000, - -1000, -1000, 976, -1000, 2389, -1000, 2385, 50315, 3277, 4788, - -1000, 2761, 2761, 3585, 3584, 790, -1000, -1000, 2761, 2761, - 2761, 2761, 2761, 2761, 4162, 3583, 3580, 2761, 2761, 2761, - 2761, 2761, 2761, 2806, -1000, -1000, -1000, 2803, 2761, 2761, - 2761, 5605, 8140, 3146, 37834, 2761, 2307, 79955, -1000, -331, - -331, 4511, -1000, 79955, 3035, 1907, 359, 4161, 4159, -1000, - -1000, -1000, 4156, -1000, -1000, 4768, -130, 4791, -141, 3574, - 415, 443, -1000, 3572, 3810, -1000, -1000, 11, 4510, 4507, - 3, -1000, -1000, -1000, -1000, -1000, 1549, -1000, -1000, -1000, - 1815, 397, 397, -1000, -1000, -1000, -1000, 3570, -1000, -1000, - -1000, -1000, -1000, 79955, 3556, -1000, -1000, 176, -1000, 2778, - -1000, 79955, 821, -1000, -251, -1000, -251, 3276, 3551, -1000, - 79955, 1031, -1000, -1000, -1000, -1000, 499, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 3550, 3547, -1000, -1000, 958, 4767, - -1000, 1837, 7473, -1000, 2761, 811, -1000, 405, 958, -1000, - 886, -1000, 2681, -1000, 3275, -1000, 2359, 4751, -1000, 1813, - 2966, 16756, 3020, 3020, -1000, -1000, 2339, -1000, 648, 4897, - -1000, 879, -1000, -1000, -1000, 5385, 971, -1000, -1000, 1170, - 4154, -1000, -1000, 3800, 16756, 4153, 2761, 4152, 3350, 26, - 49535, 4390, -1000, 4098, 3902, 3856, 2313, 965, -1000, -1000, - -1000, 2302, -1000, -1000, 3267, 3266, -1000, -1000, 79955, 3265, - 3263, 3261, 3260, 3259, 3255, 79955, -1000, -1000, 3247, 3224, - 3202, 3196, 3179, 3170, 3128, 3099, 3149, 3141, 3138, -1000, - -1000, -1000, 37834, 79955, -1000, -1000, -1000, -1000, 1801, -1000, - 4648, -1000, -305, 4151, 16756, 16756, 79955, 3512, -135, -1000, - -1000, 3545, -1000, 1241, 467, 443, -1000, 4766, 433, 4761, - 4760, 1782, -1000, 4505, -1000, -1000, -1000, -1000, 1398, -112, - 401, 394, 389, 305, -1000, -1000, -1000, -1000, -1000, -1000, - 3050, 3050, -251, 3541, 3536, -1000, 79955, -1000, -1000, 3531, - -251, 911, -1000, 612, -1000, -1000, -1000, 8040, -1000, 4758, - 1038, -1000, -1000, 37834, -1000, 4860, 4859, 4858, 4853, -1000, - -1000, -1000, -1000, -1000, 3130, -1000, -1000, -331, 4798, 3035, - 2965, 2888, 3748, 80735, 4869, 4664, 3526, -1000, -1000, -1000, - -1000, 2298, -1000, 79955, 1390, 12846, -1000, 3279, -1000, 37834, - 16756, -154, 4410, -1000, 490, 2280, 8140, 2070, 8140, 8140, - 2070, 8140, 2070, 8140, 2070, 606, -1000, 3109, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2272, -1000, + -1000, -1000, -1000, -1000, -1000, 4967, -1000, -1000, -1000, -1000, + 3685, 4030, 1221, -1000, -1000, -1000, -328, 16847, -1000, -328, + 16847, -1000, -1000, 4911, 2613, 4028, 4019, 2608, 4017, 4014, + 4681, 4687, 1849, 4010, 2003, -1000, -1000, -1000, -1000, -1000, + -1000, 4000, 6575, 1582, 3722, 1582, -1000, -1000, -1000, -1000, + 60096, 80532, -1000, -1000, -1000, 60096, 80532, 4904, 40445, 1279, + -365, 899, 4258, -1000, 905, 2953, 1729, 4257, 3719, -1000, + 80532, 4901, 80532, 3355, 1018, 3355, 1142, 80532, -208, 56166, + 54594, 67, 3408, 10543, -1000, 3718, -1000, -10, 2018, 7632, + 1425, 25505, 4671, 1883, 1883, 1883, -1000, 3717, 501, -1000, + -1000, -1000, 796, -1000, 3405, -1000, -1000, 3330, 2562, 528, + -1000, -1000, -1000, -1000, -1000, -1000, 3394, 80532, 59310, 3394, + 3448, 2855, -366, -1000, 4256, -1000, 2832, 2832, 2832, 1279, + 860, 80532, 3994, 1922, -1000, -1000, -1000, -1000, -1000, 1883, + -1000, 4644, 80532, 2134, 3991, -212, 3989, 1232, 2801, 2794, + -1000, 3404, 2606, 4620, 1570, -1000, 3980, 1899, -118, -1000, + -1000, 1880, 2380, -1000, -1000, -1000, 2854, 3153, -1000, -1000, + 58524, 30225, 57738, 1936, -1000, 2357, -1000, 3053, 3153, 80532, + -1000, 2465, -1000, -1000, -1000, 56952, -1000, 4866, 4865, 312, + 56166, 2593, 55380, 54594, 2589, 53808, 1232, -1000, 53022, 2588, + -1000, 80532, -1000, -1000, 80532, 2573, -1000, 5661, 4255, -1000, + 4252, 4251, 4468, 954, 4250, 4249, 80532, 3677, 967, 3399, + 20787, 4248, 20787, 4247, 983, 4246, -1000, -1000, -1000, -1000, + -1000, 1205, 4669, -1000, 755, -1000, -1000, -1000, -1000, 1049, + 1048, -1000, -1000, 4660, 80532, 80532, -1000, 80532, -1000, 2619, + -1000, 38087, -1000, -1000, 2571, -1000, 3716, 3712, -1000, -1000, + 3978, 3153, -1000, 2572, 689, 1428, 80532, -1000, 501, 3708, + 11331, -1000, -1000, -1000, -1000, -1000, -1000, 3396, 4641, 3706, + 3394, 80532, -1000, 80532, 1892, 1892, 4967, 30225, 80532, 14483, + -300, -1000, -1000, 4659, 2756, -1000, -1000, -1000, 80532, 4882, + 4863, -1000, 1251, 21575, -167, 652, -1000, -1000, -1000, -127, + 3704, -1000, -1000, 4862, 3698, 3556, -1000, 296, 3695, -1000, + -118, -1000, 1880, 3690, -1000, -1000, -1000, 4893, -1000, -1000, + 80532, -1000, 1897, -1000, -1000, 1743, 1150, -1000, 4767, 3977, + 4766, 2917, -1000, -1000, -1000, 3672, -1000, -1000, 3601, 3595, + -316, -1000, 4967, 416, -1000, 3975, 416, -1000, 4967, -1000, + 4860, 416, 3581, 416, 3558, -328, 4661, -1000, 3688, -1000, + -1000, -1000, 3686, -1000, -1000, -1000, 4681, -1000, 16847, -1000, + 3973, -1000, 3682, -1000, -1000, -1000, 3681, -1000, 3676, -201, + -1000, -1000, 714, 1279, -1000, 589, 80532, 1006, -1000, 52236, + 10543, -367, 844, 80532, 4890, 3675, 3355, 3670, 3355, 80532, + 1014, -1000, 2561, 2559, 4718, 3669, -1000, 3971, -1000, 3666, + 3663, -1000, -1000, 7632, -1000, 2401, 4959, -1000, 4959, -1000, + -1000, 4845, -1000, 2154, 698, -1000, -1000, 3303, 971, -1000, + -1000, 3662, 980, -1000, 1892, -1000, -1000, 2853, 3292, 3602, + 49878, 38087, 38873, 3656, -1000, 80532, -1000, 6752, 24719, -1000, + 1279, 4783, 839, 4804, 660, 4957, 6829, 1761, 2784, -1000, + 3390, -1000, 3389, -1000, -1000, 4240, 80532, -1000, -1000, 1880, + 80532, 16847, 4893, 1936, 225, -300, -1000, 2683, 339, -1000, + 39659, 2554, -1000, 16847, 2544, -1000, -1000, -1000, -1000, 4239, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1761, 80532, + -1000, 1219, 4618, -1000, -1000, 80532, -1000, 5661, -1000, -1000, + 3102, 3075, 20787, -1000, -1000, 3648, 3647, 3646, 38873, 1386, + 2852, 2850, 1443, 4238, -1000, 1080, 4933, 3382, -1000, -1000, + -1000, 1521, -150, 4237, 3048, 3040, -1000, 80532, -1000, 49878, + 49878, 49878, 1824, 1824, 49878, 49878, 4236, 1325, 4211, 4859, + -1000, 4693, 80532, 3886, 80532, 4234, 2849, 20787, 8414, 8414, + 8414, 8414, 8414, 20787, -1000, -1000, -1000, 2847, -1000, -1000, + -1000, -1000, -1000, -1000, 2832, 2405, -1000, -1000, -1000, -1000, + -1000, 80532, 2356, -1000, -1000, -1000, 697, 3448, -1000, -1000, + 1886, -1000, 4833, 1936, -1000, -1000, -1000, -1000, -1000, 4612, + -1000, -324, 16847, 17635, -1000, -346, 80532, 80532, -129, 3375, + -1000, 3644, 451, -1000, -1000, 431, -1000, 1880, -1000, -1000, + 2765, -132, 310, 38087, 2846, 38087, -1000, 38087, 3970, 535, + -18, -1000, -1000, -1000, 416, 3969, -1000, 416, -1000, 550, + 16847, -1000, -328, -1000, -328, 416, -1000, 3967, 3965, -1000, + 3549, -1000, -1000, -1000, -1000, 80532, 80532, -1000, 80532, 3642, + 3371, -1000, -1000, 2537, -1000, -1000, -1000, 3028, 3026, 2535, + 3964, 3589, 80532, 835, 80532, -208, 3633, -208, 3632, 1009, + 3355, -1000, -1000, -184, -1000, -1000, -1000, -1000, -11, -1000, + -1000, -1000, 646, -1000, 949, 3546, 3364, -1000, -1000, 692, + -1000, -1000, -1000, 3394, 3630, -1000, -1000, 203, -1000, 2845, + 2533, -1000, -1000, -1000, 796, 1208, -1000, 1883, 4716, 5665, + -1000, 1958, -1000, -1000, -1000, 80532, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1743, 2832, -1000, 1208, 1095, 2863, -1000, + 3363, -1000, -1000, 16847, 1810, -1000, 3153, 4967, -300, -1000, + 13695, -1000, 3024, 80532, 80532, -1000, -1000, -1000, 51450, 81318, + 1089, 2526, -1000, 5401, 1379, -1000, -1000, -1000, -1000, 5461, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3629, 3624, + -1000, -1000, -1000, -1000, -1000, 3362, 4232, 121, -1000, 4765, + 4714, 16847, -1000, -1000, 4231, 2517, 2508, 2494, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 79955, 4148, -1000, 4147, 2207, 2205, - 2204, -1000, -1000, -137, -1000, 4144, 3038, 450, 429, 4757, - -1000, 3512, 4740, 3512, 3512, -1000, 408, 4809, 3002, -1000, - 419, 417, 403, 384, -1000, -1000, -1000, -1000, -1000, -1000, - 2981, -1000, 2981, -1000, -1000, -1000, -1000, -251, -1000, 3522, - -1000, -1000, -1000, -1000, -1000, -1000, 48755, 974, -1000, -1000, - -1000, 4141, -1000, 4140, -1000, 4139, -1000, -1000, 4683, -1000, - 4845, 4844, -1000, -1000, -1000, 3520, 4896, 245, -1000, 971, - 7473, -1000, 12846, 2200, -1000, 3035, -1000, 1274, -1000, 3166, - -1000, -1000, -1000, -1000, 4407, 4405, 4795, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 87755, - 2189, 16756, -1000, -1000, -1000, 79955, -1000, 4675, 37054, 434, - -1000, -1000, -1000, 3513, -1000, 3512, -1000, -1000, 2755, 5, - 1398, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -225, -1000, - 79955, 964, 47195, 47195, 47195, 79955, 3942, 3938, 3399, 3510, - 4138, -1000, 7473, 2166, -1000, 12846, -1000, -154, -1000, 4840, - -1000, 4799, 1518, 1518, 8140, 8140, 8140, 8140, 3739, -1000, - 4137, 3731, -1000, -1000, 79955, -1000, 2144, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 3503, 2, -1000, -1000, -1000, 3497, - 2143, 4135, 2120, -1000, 2752, -1000, -1000, 2110, -1000, 2744, - 2064, -1000, 2713, 1768, 79955, 4134, 79955, 4133, -1000, 4404, - -1000, -1000, 3431, -1000, 80735, -1000, -1000, -1000, -1000, -1000, - -1000, 3209, 1042, -1000, -1000, 16756, -1000, 1754, -1000, 2705, - -1000, 47975, -1000, -1000, -1000, -1000, -1000, -1000, 47195, 46415, - -1000, 47195, 46415, -1000, 47195, 46415, 2018, 2005, 16756, 2017, - 16756, 4888, -1000, 2014, -1000, -1000, -1000, 3728, 79955, 12064, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4521, - 79955, 79955, 1959, 4517, 1946, 3399, 3399, -1000, -1000, -1000, - -1000, 3035, 4132, 1926, -1000, -1000, 4041, -1000, -1000, 3647, - -1000, 3625, 16756, 79955, 16756, 4889, 4891, 1885, -1000, 1863, + -1000, 2467, 2464, 49878, -1000, -1000, -1000, 979, -1000, 2430, + -1000, 2412, 50664, 3358, 3768, -1000, 2832, 2832, 3621, 3618, + 783, -1000, -1000, 2832, 2832, 2832, 2832, 2832, 2832, 4230, + 3615, 3614, 2832, 2832, 2832, 2832, 2832, 2832, 2840, -1000, + -1000, -1000, 2836, 2832, 2832, 2832, 5461, 8414, 3197, 38087, + 2832, 2349, 80532, -1000, -1000, -1000, -1000, -1000, -1000, -300, + -300, 4600, -1000, 80532, 3153, 1987, 412, 4229, 4228, -1000, + -1000, -1000, 4225, -1000, -1000, 4856, -123, 4893, -135, 3613, + 426, 511, -1000, 3612, 3961, -1000, -1000, -15, 4599, 4598, + -21, -1000, -1000, -1000, -1000, -1000, 1186, -1000, -1000, -1000, + 1849, 416, 416, -1000, -1000, -1000, -1000, 3609, -1000, -1000, + -1000, -1000, -1000, 80532, 3607, -1000, -1000, 195, -1000, 2833, + -1000, 80532, 823, -1000, -208, -1000, -208, 3355, 3604, -1000, + 80532, 1054, -1000, -1000, -1000, -1000, 486, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 3602, 3600, -1000, -1000, 964, 4854, + -1000, 1883, 6829, -1000, 2832, 796, -1000, 439, 964, -1000, + 894, -1000, 2763, -1000, 3354, -1000, 2399, 4833, -1000, 1848, + 2968, 16847, 3024, 3024, -1000, -1000, 2396, -1000, 518, 4993, + -1000, 882, -1000, -1000, -1000, 5401, 972, -1000, -1000, 1215, + 4224, -1000, -1000, 3935, 16847, 4223, 2832, 4222, 3365, -4, + 49878, 4467, -1000, 4461, 4456, 4452, 2394, 973, -1000, -1000, + -1000, 2393, -1000, -1000, 3351, 3349, -1000, -1000, 80532, 3348, + 3344, 3338, 3334, 3332, 3323, 80532, -1000, -1000, 3318, 3314, + 3313, 3311, 3275, 3253, 3177, 3141, 3250, 3212, 3207, -1000, + -1000, -1000, 38087, 80532, -1000, -1000, -1000, -1000, 1825, -1000, + 4695, -1000, -255, 4221, 16847, 16847, 80532, 3556, -127, -1000, + -1000, 3599, -1000, 1262, 429, 511, -1000, 4849, 440, 4847, + 4843, 1822, -1000, 4597, -1000, -1000, -1000, -1000, 1227, -119, + 413, 411, 409, 402, -1000, -1000, -1000, -1000, -1000, -1000, + 3088, 3088, -208, 3589, 3569, -1000, 80532, -1000, -1000, 3567, + -208, 908, -1000, 597, -1000, -1000, -1000, 8151, -1000, 4840, + 1072, -1000, -1000, 38087, -1000, 4951, 4950, 4949, 4946, -1000, + -1000, -1000, -1000, -1000, 3199, -1000, -1000, -300, 4900, 3153, + 2962, 2921, 3932, 81318, 4988, 4735, 3565, -1000, -1000, -1000, + -1000, 2392, -1000, 80532, 1424, 12907, -1000, 3331, -1000, 38087, + 16847, -143, 4495, -1000, 541, 2351, 8414, 1824, 8414, 8414, + 1824, 8414, 1824, 8414, 1824, 593, -1000, 3166, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2329, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 80532, 4219, -1000, 4218, 2322, 2319, + 2275, -1000, -1000, -129, -1000, 4217, 3152, 447, 430, 4837, + -1000, 3556, 4807, 3556, 3556, -1000, 417, 4945, 3015, -1000, + 407, 375, 372, 370, -1000, -1000, -1000, -1000, -1000, -1000, + 2953, -1000, 2953, -1000, -1000, -1000, -1000, -208, -1000, 3564, + -1000, -1000, -1000, -1000, -1000, -1000, 49092, 976, -1000, -1000, + -1000, 4216, -1000, 4215, -1000, 4214, -1000, -1000, 4756, -1000, + 4942, 4941, -1000, -1000, -1000, 3561, 4992, 300, -1000, 972, + 6829, -1000, 12907, 2270, -1000, 3153, -1000, 1325, -1000, 3310, + -1000, -1000, -1000, -1000, 4491, 4490, 4898, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 88392, + 2264, 16847, -1000, -1000, -1000, 80532, -1000, 4749, 37301, 434, + -1000, -1000, -1000, 3559, -1000, 3556, -1000, -1000, 2830, -19, + 1227, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -189, -1000, + 80532, 967, 47520, 47520, 47520, 80532, 3983, 3957, 3402, 3555, + 4213, -1000, 6829, 2259, -1000, 12907, -1000, -143, -1000, 4902, + -1000, 4930, 1419, 1419, 8414, 8414, 8414, 8414, 3930, -1000, + 4212, 3929, -1000, -1000, 80532, -1000, 2258, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 3554, -23, -1000, -1000, -1000, 3552, + 2242, 4211, 2232, -1000, 2829, -1000, -1000, 2224, -1000, 2828, + 2197, -1000, 2818, 1810, 80532, 4210, 80532, 4206, -1000, 4489, + -1000, -1000, 3542, -1000, 81318, -1000, -1000, -1000, -1000, -1000, + -1000, 3126, 1086, -1000, -1000, 16847, -1000, 1786, -1000, 2815, + -1000, 48306, -1000, -1000, -1000, -1000, -1000, -1000, 47520, 46734, + -1000, 47520, 46734, -1000, 47520, 46734, 2194, 2245, 16847, 2190, + 16847, 4983, -1000, 2176, -1000, -1000, -1000, 3865, 80532, 12119, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4617, + 80532, 80532, 2174, 4616, 2015, 3402, 3402, -1000, -1000, -1000, + -1000, 3153, 4204, 2040, -1000, -1000, 4202, -1000, -1000, 4478, + -1000, 4477, 16847, 80532, 16847, 4985, 4977, 1991, -1000, 1933, -1000, -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 44, 5783, 8, 1, 5780, 5779, 5778, 228, 100, - 325, 243, 5776, 134, 357, 401, 363, 382, 5775, 356, - 355, 5774, 5773, 5772, 353, 348, 5771, 5754, 5753, 5752, - 5751, 5750, 5749, 5733, 5730, 5726, 5725, 5724, 5723, 5722, - 5721, 5720, 5709, 5705, 5704, 5701, 5700, 5699, 5698, 5697, - 5696, 5695, 5694, 5692, 5691, 5690, 5689, 5688, 5687, 5686, - 5685, 5684, 354, 5683, 5679, 5677, 5676, 5675, 5674, 5673, - 5672, 5655, 5654, 5653, 5652, 5648, 5647, 5646, 5645, 5644, - 5637, 5636, 5635, 5628, 5627, 5625, 5624, 5621, 5620, 5619, - 5618, 5617, 5615, 5613, 5612, 5611, 5609, 5605, 5597, 5591, - 5590, 5587, 239, 5586, 347, 5585, 5584, 5583, 5582, 5581, - 5578, 5577, 4579, 5575, 91, 58, 72, 5574, 5573, 5571, - 5569, 5568, 5567, 5566, 5563, 352, 206, 5562, 5559, 5557, - 5556, 5555, 5553, 5552, 5551, 5550, 5546, 5544, 5541, 5533, - 188, 5532, 5531, 351, 5529, 5526, 5525, 5524, 5522, 286, - 5521, 150, 5520, 337, 233, 5519, 5518, 5497, 5494, 5493, - 5490, 5489, 152, 167, 5488, 5487, 5486, 5485, 5484, 5483, - 5482, 5480, 5479, 5478, 5477, 5476, 196, 5475, 321, 281, - 111, 5474, 76, 5473, 315, 161, 274, 5471, 294, 5470, - 207, 5469, 205, 5468, 5466, 5464, 5463, 5462, 5459, 5458, - 5456, 5455, 5453, 5452, 5451, 5450, 5449, 5448, 5446, 5445, - 5444, 5443, 5442, 5441, 5440, 5439, 5436, 5433, 5430, 5428, - 5427, 5425, 5420, 78, 5418, 342, 5417, 116, 5416, 120, - 110, 215, 5415, 146, 5398, 237, 5396, 114, 5395, 336, - 112, 5394, 33, 50, 5393, 296, 70, 118, 5391, 5390, - 334, 4099, 320, 5389, 200, 5388, 298, 5387, 5386, 5385, - 302, 84, 45, 253, 5384, 5382, 338, 226, 5381, 5380, - 5379, 343, 5377, 301, 229, 223, 124, 172, 5376, 225, - 5374, 117, 107, 123, 61, 65, 95, 136, 258, 180, - 5372, 5370, 135, 299, 179, 256, 144, 5369, 5364, 5361, - 11, 241, 308, 5360, 224, 232, 121, 5359, 5353, 283, - 5352, 5351, 5349, 295, 209, 5348, 148, 5347, 5346, 5345, - 35, 5344, 5336, 271, 262, 5335, 5331, 153, 5330, 5329, - 149, 252, 186, 5328, 113, 177, 219, 176, 5327, 4614, - 182, 139, 5323, 105, 163, 5321, 90, 5320, 5319, 5318, - 5317, 238, 5316, 5309, 204, 5308, 102, 5307, 5302, 5300, - 103, 5283, 104, 108, 157, 145, 5277, 46, 154, 143, - 5274, 5273, 5272, 5269, 5266, 14, 6, 4, 5265, 5263, - 5262, 5261, 7, 5260, 5259, 2, 5258, 43, 5257, 81, - 5256, 5254, 5253, 5252, 5251, 5249, 5248, 5247, 5246, 5244, - 5242, 5240, 53, 5239, 5238, 5235, 5210, 13, 28, 38, - 5208, 42, 5207, 220, 5206, 5205, 216, 5204, 5203, 267, - 5201, 5200, 138, 133, 5199, 140, 5197, 250, 5196, 63, - 5195, 5194, 106, 5193, 5192, 5191, 330, 5189, 5188, 5187, - 275, 5185, 5184, 5183, 5182, 816, 5181, 5180, 5179, 5177, - 5176, 5175, 476, 333, 3, 292, 41, 5173, 194, 210, - 5171, 66, 49, 5169, 73, 158, 289, 199, 162, 5168, - 5166, 5164, 830, 175, 147, 254, 0, 155, 293, 236, - 332, 5147, 5146, 350, 5145, 331, 300, 329, 119, 345, - 323, 5144, 5142, 93, 5141, 213, 115, 68, 203, 555, - 24, 372, 5140, 2978, 18, 263, 5139, 278, 5138, 40, - 25, 12, 187, 5137, 5136, 55, 361, 5135, 5134, 5133, - 190, 272, 5131, 5130, 316, 195, 85, 5124, 1729, 5123, - 51, 5122, 5121, 57, 5119, 247, 77, 48, 5118, 5117, - 169, 259, 327, 132, 467, 208, 251, 242, 217, 307, - 311, 130, 20, 246, 5115, 2368, 212, 159, 30, 5110, - 15, 305, 285, 288, 174, 5109, 131, 5108, 324, 340, - 280, 5107, 255, 21, 75, 62, 47, 69, 22, 99, - 97, 29, 37, 5105, 5103, 5102, 5101, 5100, 23, 67, - 5099, 79, 5097, 32, 5096, 5093, 82, 64, 5092, 83, - 16, 5091, 5090, 26, 19, 31, 5087, 59, 279, 222, - 178, 141, 109, 5086, 5083, 245, 554, 5081, 192, 191, - 197, 5080, 60, 5078, 5077, 5076, 5075, 4310, 1715, 5074, - 211, 5072, 5071, 5070, 5069, 5066, 5065, 277, 341, 193, - 230, 317, 318, 339, 5064, 125, 71, 282, 5063, 5062, - 5061, 126, 184, 5060, 5059, 5058, 5057, 52, 122, 5054, - 27, 5048, 36, 34, 54, 5047, 80, 5046, 5045, 5044, - 17, 261, 5043, 5042, 5041, 9, 5040, 5036, 5, 5035, - 5033, 173, 5032, 142, 39, 218, 221, 5031, 5030, 137, - 260, 183, 5029, 5026, 170, 322, 5025, 273, 5024, 3549, - 313, 335, 5023, 287, 5022, 5020, 5019, 290, 5018, 1719, - 5016, 5012, 304, 98, 127, 5011, 303, 166, 5010, 5009, - 129, 214, 171, 165, 88, 128, 5008, 164, 284, 5007, - 270, 5006, 312, 5005, 5004, 5000, 4998, 231, 4994, 4985, - 4976, 4974, 257, 4972, 4953, 265, 309, 4938, 4936, 319, - 314, 4933, 4922, 4921, 4919, 4918, 4914, 4913, 4912, 94, - 4911, 4910, 326, 328, 4908, 4906, 96, 4905, 4904, -} - -//line mysql_sql.y:16982 + 0, 47, 5795, 7, 1, 5794, 5793, 5792, 231, 83, + 332, 244, 5791, 150, 363, 307, 368, 249, 5790, 362, + 359, 5788, 5787, 5786, 367, 365, 5785, 5782, 5781, 5780, + 5779, 5777, 5776, 5775, 5774, 5773, 5772, 5770, 5768, 5766, + 5765, 5763, 5762, 5761, 5760, 5759, 5758, 5757, 5756, 5755, + 5754, 5752, 5751, 5750, 5749, 5748, 5747, 5746, 5742, 5741, + 5740, 5739, 5737, 5736, 5725, 5721, 5720, 243, 5717, 357, + 5716, 5714, 5713, 5712, 5710, 5709, 5708, 5707, 5706, 5704, + 5703, 5702, 5701, 5700, 5699, 5697, 5696, 5695, 5694, 5693, + 5692, 5691, 5690, 5689, 5688, 5686, 5685, 5683, 5682, 5681, + 5680, 5679, 5678, 5658, 5657, 5656, 5652, 5651, 5650, 164, + 5649, 364, 5648, 5641, 5640, 5639, 5632, 5631, 5630, 4643, + 5629, 105, 66, 75, 5628, 5608, 5607, 5606, 5605, 5604, + 5603, 5602, 356, 215, 5600, 5599, 5596, 5593, 5592, 5591, + 5590, 5589, 5587, 5586, 5585, 5580, 5579, 318, 5576, 5573, + 353, 5564, 5563, 5559, 5558, 5557, 299, 5554, 139, 5553, + 352, 239, 5552, 5551, 5550, 5549, 5548, 5547, 5546, 157, + 167, 5545, 5544, 5543, 5542, 5539, 5538, 5537, 5535, 5533, + 5532, 5531, 5529, 191, 5527, 321, 227, 112, 5526, 87, + 5524, 330, 169, 281, 5522, 297, 5521, 209, 5520, 200, + 5519, 5516, 5515, 5514, 5513, 5512, 5510, 5509, 5506, 5505, + 5503, 5502, 5501, 5500, 5499, 5498, 5496, 5495, 5494, 5493, + 5492, 5491, 5490, 5489, 5485, 5483, 5480, 5479, 5477, 5476, + 90, 5475, 351, 5474, 117, 5473, 120, 113, 213, 5469, + 147, 5468, 238, 5467, 116, 5465, 343, 114, 5454, 36, + 54, 5447, 340, 63, 138, 5445, 5444, 361, 4527, 325, + 5443, 223, 5441, 306, 5440, 5439, 5438, 304, 82, 50, + 271, 5437, 5436, 345, 230, 5435, 5434, 5433, 354, 5431, + 337, 232, 229, 125, 171, 5430, 211, 5429, 123, 74, + 122, 68, 77, 103, 131, 235, 186, 5426, 5424, 121, + 264, 184, 257, 152, 5423, 5422, 5421, 11, 242, 322, + 5420, 228, 233, 119, 5419, 5418, 287, 5414, 5412, 5411, + 298, 201, 5410, 148, 5409, 5408, 5393, 38, 5392, 5389, + 280, 276, 5388, 5386, 153, 5383, 5380, 115, 256, 193, + 5377, 109, 181, 237, 180, 5375, 4690, 183, 145, 5372, + 93, 177, 5371, 59, 5367, 5361, 5358, 5357, 255, 5352, + 5350, 204, 5349, 97, 5348, 5347, 5346, 107, 5345, 111, + 106, 158, 146, 5343, 46, 155, 144, 5338, 5337, 5332, + 5331, 5330, 15, 5, 6, 5323, 5322, 5321, 5319, 8, + 5318, 5317, 9, 5316, 43, 5315, 85, 5314, 5313, 5311, + 5310, 5309, 5308, 5307, 5306, 5305, 5304, 5302, 5300, 56, + 5299, 5298, 5297, 5295, 17, 29, 31, 5294, 45, 5293, + 261, 5292, 5291, 224, 5290, 5288, 277, 5286, 5285, 135, + 134, 5284, 136, 5266, 222, 5265, 65, 5263, 5262, 96, + 5259, 5253, 5251, 347, 5250, 5248, 5244, 269, 5238, 5237, + 5234, 5233, 836, 5232, 5230, 5228, 5226, 5224, 5223, 34, + 326, 2, 296, 40, 5221, 195, 196, 5220, 62, 49, + 5219, 79, 176, 288, 199, 161, 5218, 5217, 5214, 789, + 179, 151, 433, 0, 156, 323, 221, 342, 5212, 5211, + 348, 5210, 331, 293, 333, 137, 360, 273, 5209, 5208, + 95, 5207, 217, 118, 70, 220, 429, 22, 900, 5205, + 3230, 18, 268, 5204, 283, 5202, 12, 32, 25, 190, + 5199, 5194, 57, 346, 5192, 5190, 5189, 188, 278, 5187, + 5184, 313, 208, 108, 5183, 1836, 5178, 53, 5176, 5175, + 69, 5174, 251, 27, 52, 5173, 5172, 173, 260, 334, + 143, 263, 205, 253, 248, 212, 301, 312, 127, 20, + 236, 5171, 1980, 214, 163, 30, 5169, 13, 303, 290, + 247, 178, 5168, 154, 5167, 324, 344, 285, 5162, 252, + 28, 78, 61, 48, 72, 21, 101, 100, 24, 42, + 5161, 5160, 5158, 5156, 5155, 23, 64, 5153, 92, 5152, + 35, 5150, 5149, 80, 67, 5146, 98, 14, 5145, 5144, + 33, 19, 37, 5143, 60, 295, 225, 182, 142, 99, + 5142, 5141, 216, 203, 5139, 202, 192, 194, 5138, 71, + 5136, 5133, 5130, 5129, 3940, 1768, 5128, 210, 5127, 5125, + 5124, 5123, 5122, 5120, 279, 355, 197, 234, 315, 335, + 349, 5119, 124, 73, 289, 5118, 5116, 5115, 129, 185, + 5114, 5113, 5112, 5111, 51, 126, 5110, 26, 5109, 41, + 39, 55, 5108, 81, 5107, 5105, 5103, 4, 258, 5102, + 5099, 5098, 16, 5097, 5096, 3, 5095, 5094, 175, 5093, + 141, 44, 246, 292, 5092, 5091, 132, 265, 187, 5089, + 5088, 168, 327, 5087, 284, 5086, 4094, 316, 329, 5085, + 291, 5084, 5083, 5082, 294, 5081, 1760, 5079, 5078, 314, + 110, 133, 5076, 300, 166, 5075, 5072, 130, 219, 170, + 159, 86, 128, 5071, 162, 286, 5070, 262, 5069, 302, + 5067, 5062, 5061, 5054, 226, 5048, 5047, 5045, 5044, 266, + 5042, 5041, 267, 310, 5037, 5036, 339, 320, 5034, 5033, + 5032, 5031, 5030, 5029, 5026, 5024, 102, 5020, 5019, 336, + 358, 5018, 5002, 104, 5001, 5000, +} + +//line mysql_sql.y:17030 type yySymType struct { union interface{} id int @@ -13172,299 +13257,301 @@ func (st *yySymType) zeroFillOptUnion() bool { } var yyR1 = [...]int{ - 0, 756, 760, 12, 12, 9, 13, 13, 10, 10, + 0, 763, 767, 12, 12, 9, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 168, - 168, 467, 467, 468, 468, 170, 463, 463, 462, 462, - 171, 172, 173, 733, 733, 734, 734, 732, 732, 174, - 175, 214, 731, 731, 731, 731, 731, 731, 731, 731, - 216, 216, 216, 216, 216, 216, 216, 596, 169, 169, - 169, 169, 169, 169, 169, 297, 297, 298, 298, 184, - 184, 185, 185, 186, 186, 220, 220, 220, 220, 220, - 220, 220, 159, 740, 740, 740, 741, 741, 156, 197, - 196, 199, 199, 198, 198, 195, 195, 191, 194, 194, - 193, 193, 192, 187, 189, 189, 188, 190, 190, 157, - 140, 142, 142, 141, 158, 680, 680, 679, 679, 678, - 678, 623, 623, 624, 624, 454, 454, 454, 677, 677, - 677, 676, 676, 675, 675, 673, 673, 674, 674, 671, - 671, 672, 670, 669, 669, 669, 665, 665, 665, 661, - 661, 663, 662, 662, 664, 656, 656, 659, 659, 657, - 657, 657, 657, 660, 655, 655, 655, 654, 654, 139, - 139, 139, 557, 557, 138, 138, 572, 572, 572, 572, - 572, 570, 570, 570, 570, 570, 570, 569, 569, 568, - 568, 573, 573, 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, 127, 127, 127, 127, 127, 127, - 127, 134, 132, 132, 132, 133, 746, 746, 745, 745, - 747, 747, 747, 747, 748, 748, 130, 130, 130, 131, - 567, 567, 567, 128, 129, 129, 556, 556, 562, 562, - 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, - 561, 561, 561, 566, 566, 566, 564, 564, 563, 563, - 565, 565, 117, 117, 117, 117, 117, 117, 121, 122, - 123, 123, 123, 123, 120, 119, 555, 555, 555, 555, - 555, 555, 555, 555, 555, 118, 118, 118, 118, 118, - 118, 103, 103, 103, 103, 103, 102, 102, 104, 104, - 104, 552, 552, 551, 135, 135, 136, 743, 743, 742, - 744, 744, 744, 744, 137, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 147, 147, 147, 147, 146, - 146, 146, 149, 149, 149, 148, 150, 126, 126, 126, - 126, 126, 126, 124, 124, 124, 124, 124, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 706, 706, 706, 706, - 706, 707, 707, 481, 482, 761, 484, 480, 480, 480, - 702, 702, 703, 704, 705, 705, 705, 705, 143, 310, - 310, 308, 308, 309, 309, 144, 311, 311, 311, 145, - 312, 312, 23, 307, 307, 595, 595, 20, 20, 20, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 175, 175, 474, 474, 475, 475, 177, 470, 470, + 469, 469, 178, 179, 180, 740, 740, 741, 741, 739, + 739, 181, 182, 221, 738, 738, 738, 738, 738, 738, + 738, 738, 223, 223, 223, 223, 223, 223, 223, 603, + 176, 176, 176, 176, 176, 176, 176, 304, 304, 305, + 305, 191, 191, 192, 192, 193, 193, 227, 227, 227, + 227, 227, 227, 227, 166, 747, 747, 747, 748, 748, + 163, 204, 203, 206, 206, 205, 205, 202, 202, 198, + 201, 201, 200, 200, 199, 194, 196, 196, 195, 197, + 197, 164, 147, 149, 149, 148, 165, 687, 687, 686, + 686, 685, 685, 630, 630, 631, 631, 461, 461, 461, + 684, 684, 684, 683, 683, 682, 682, 680, 680, 681, + 681, 678, 678, 679, 677, 676, 676, 676, 672, 672, + 672, 668, 668, 670, 669, 669, 671, 663, 663, 666, + 666, 664, 664, 664, 664, 667, 662, 662, 662, 661, + 661, 146, 146, 146, 564, 564, 145, 145, 579, 579, + 579, 579, 579, 577, 577, 577, 577, 577, 577, 576, + 576, 575, 575, 580, 580, 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, 134, 134, 134, 134, + 134, 134, 134, 141, 139, 139, 139, 140, 753, 753, + 752, 752, 754, 754, 754, 754, 755, 755, 137, 137, + 137, 138, 574, 574, 574, 135, 136, 136, 563, 563, + 569, 569, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 573, 573, 573, 571, 571, + 570, 570, 572, 572, 124, 124, 124, 124, 124, 124, + 128, 129, 130, 130, 130, 130, 127, 126, 562, 562, + 562, 562, 562, 562, 562, 562, 562, 125, 125, 125, + 125, 125, 125, 110, 110, 110, 110, 110, 109, 109, + 111, 111, 111, 559, 559, 558, 142, 142, 143, 750, + 750, 749, 751, 751, 751, 751, 144, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 153, 153, 153, 156, 156, 156, 155, 157, 133, + 133, 133, 133, 133, 133, 131, 131, 131, 131, 131, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 713, 713, + 713, 713, 713, 714, 714, 488, 489, 768, 491, 487, + 487, 487, 709, 709, 710, 711, 712, 712, 712, 712, + 150, 317, 317, 315, 315, 316, 316, 151, 318, 318, + 318, 152, 319, 319, 23, 314, 314, 602, 602, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 109, 109, 110, 110, 110, 110, 22, 101, - 106, 106, 106, 108, 418, 418, 419, 417, 417, 417, - 417, 417, 412, 412, 420, 420, 219, 59, 59, 59, - 59, 59, 59, 107, 107, 107, 107, 421, 421, 421, - 427, 427, 428, 428, 413, 413, 413, 413, 413, 413, - 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, - 413, 413, 413, 413, 413, 413, 397, 397, 397, 392, - 392, 392, 392, 393, 393, 394, 394, 395, 395, 395, - 395, 396, 396, 473, 473, 422, 422, 422, 424, 424, - 423, 416, 414, 414, 414, 414, 414, 414, 414, 414, - 415, 415, 415, 415, 425, 425, 426, 426, 99, 111, - 111, 524, 524, 521, 521, 521, 521, 105, 105, 105, - 105, 719, 719, 100, 100, 100, 730, 730, 627, 627, - 495, 495, 494, 494, 494, 494, 494, 494, 494, 494, - 494, 494, 494, 494, 494, 494, 494, 494, 632, 633, - 491, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 60, 61, 165, 165, 167, - 167, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 77, 231, 96, 97, 98, 75, 69, 72, 73, - 218, 221, 221, 221, 221, 68, 68, 68, 68, 541, - 541, 67, 762, 762, 466, 466, 85, 84, 71, 86, - 87, 88, 89, 90, 91, 66, 83, 83, 83, 83, - 83, 83, 83, 83, 94, 650, 650, 764, 764, 764, - 92, 93, 626, 626, 626, 82, 82, 81, 81, 80, - 79, 78, 78, 65, 65, 64, 64, 70, 203, 205, - 74, 204, 204, 206, 206, 488, 488, 488, 490, 490, - 486, 763, 763, 591, 591, 489, 489, 63, 63, 63, - 63, 95, 487, 487, 465, 485, 485, 485, 21, 21, - 19, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 20, 20, 20, 20, 20, 116, 116, 117, 117, 117, + 117, 22, 108, 113, 113, 113, 115, 425, 425, 426, + 424, 424, 424, 424, 424, 419, 419, 427, 427, 226, + 59, 59, 59, 59, 59, 59, 114, 114, 114, 114, + 428, 428, 428, 434, 434, 435, 435, 420, 420, 420, + 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, + 420, 420, 420, 420, 420, 420, 420, 420, 420, 404, + 404, 404, 399, 399, 399, 399, 400, 400, 401, 401, + 402, 402, 402, 402, 403, 403, 480, 480, 429, 429, + 429, 431, 431, 430, 423, 421, 421, 421, 421, 421, + 421, 421, 421, 422, 422, 422, 422, 432, 432, 433, + 433, 106, 118, 118, 531, 531, 528, 528, 528, 528, + 112, 112, 112, 112, 726, 726, 107, 107, 107, 737, + 737, 634, 634, 502, 502, 501, 501, 501, 501, 501, + 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, + 501, 639, 640, 498, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 60, 61, + 172, 172, 174, 174, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 84, 238, 103, 104, 105, 82, + 76, 79, 80, 225, 228, 228, 228, 228, 75, 75, + 75, 75, 548, 548, 74, 769, 769, 473, 473, 92, + 91, 78, 93, 94, 95, 96, 97, 98, 73, 90, + 90, 90, 90, 90, 90, 90, 90, 101, 657, 657, + 771, 771, 771, 99, 100, 633, 633, 633, 89, 89, + 88, 88, 87, 86, 85, 85, 72, 72, 71, 71, + 77, 210, 212, 81, 211, 211, 213, 213, 495, 495, + 495, 497, 497, 493, 770, 770, 598, 598, 496, 496, + 70, 70, 70, 70, 102, 494, 494, 472, 492, 492, + 492, 21, 21, 19, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 58, 35, 36, 34, 37, 39, 549, 549, 546, - 38, 29, 28, 31, 27, 27, 30, 32, 33, 33, - 17, 17, 17, 17, 24, 24, 25, 267, 267, 340, - 340, 713, 713, 709, 709, 710, 710, 710, 711, 711, - 712, 712, 765, 765, 765, 151, 644, 644, 644, 644, - 644, 644, 15, 15, 15, 15, 638, 638, 638, 643, - 643, 642, 641, 641, 640, 640, 639, 639, 639, 639, - 16, 16, 16, 16, 262, 262, 18, 18, 112, 112, - 113, 113, 114, 114, 114, 114, 114, 114, 116, 115, - 115, 296, 296, 637, 637, 637, 637, 637, 637, 554, - 554, 553, 553, 690, 690, 690, 691, 301, 301, 289, - 289, 289, 300, 300, 300, 300, 645, 645, 512, 692, - 692, 653, 653, 652, 652, 651, 651, 294, 294, 302, - 302, 302, 303, 303, 295, 295, 271, 271, 179, 179, - 179, 667, 667, 668, 668, 658, 658, 658, 658, 666, - 666, 622, 622, 402, 402, 456, 456, 457, 457, 249, - 245, 245, 245, 246, 246, 247, 247, 247, 247, 247, - 247, 247, 247, 247, 247, 247, 749, 749, 750, 751, - 752, 752, 753, 753, 754, 754, 754, 755, 755, 755, - 755, 755, 699, 699, 701, 701, 700, 293, 293, 284, - 284, 286, 286, 286, 285, 285, 285, 287, 288, 288, - 282, 282, 283, 283, 281, 280, 280, 279, 277, 277, - 277, 278, 278, 278, 306, 306, 306, 306, 251, 251, - 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 253, 254, 254, 256, 255, 255, 255, 255, 257, - 258, 258, 260, 259, 259, 259, 259, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, 436, 252, - 264, 264, 265, 265, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 433, 433, 434, 434, 434, 434, - 434, 177, 177, 631, 631, 432, 432, 261, 261, 263, - 263, 263, 263, 431, 431, 430, 276, 276, 275, 275, - 274, 274, 274, 268, 268, 268, 268, 268, 268, 270, - 442, 442, 441, 441, 440, 440, 440, 440, 440, 440, - 443, 444, 444, 444, 269, 269, 155, 176, 176, 178, - 291, 290, 439, 438, 438, 438, 438, 305, 305, 304, - 304, 292, 292, 273, 273, 273, 273, 437, 272, 272, - 3, 3, 1, 1, 1, 1, 7, 7, 4, 4, - 4, 2, 2, 2, 5, 5, 6, 6, 435, 739, - 739, 738, 738, 737, 735, 735, 735, 736, 736, 736, - 736, 682, 682, 682, 682, 682, 474, 474, 474, 479, - 479, 477, 477, 477, 477, 477, 483, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 52, 53, 57, 160, 160, 163, 163, 161, 161, 162, - 162, 166, 166, 164, 164, 49, 322, 323, 50, 324, - 324, 325, 325, 326, 326, 327, 328, 329, 329, 329, - 329, 531, 531, 48, 313, 313, 314, 314, 315, 315, - 316, 317, 317, 317, 321, 318, 319, 319, 758, 758, - 757, 47, 47, 40, 40, 224, 224, 225, 225, 225, - 227, 227, 398, 398, 398, 226, 226, 228, 228, 228, - 714, 716, 716, 718, 717, 717, 717, 720, 720, 720, - 720, 720, 721, 721, 721, 721, 722, 722, 41, 200, - 200, 200, 237, 237, 210, 725, 725, 725, 724, 724, - 597, 597, 726, 726, 727, 727, 460, 460, 461, 461, - 222, 223, 223, 212, 202, 236, 236, 236, 236, 236, - 238, 238, 342, 342, 201, 207, 208, 209, 211, 213, - 215, 215, 217, 715, 723, 723, 723, 550, 550, 547, - 548, 548, 545, 544, 544, 544, 729, 729, 728, 728, - 728, 475, 475, 42, 540, 540, 542, 543, 543, 543, - 543, 543, 543, 543, 543, 532, 532, 532, 532, 532, - 46, 536, 536, 538, 538, 539, 539, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 533, - 533, 535, 535, 529, 529, 530, 530, 530, 530, 530, - 530, 530, 530, 530, 45, 45, 45, 235, 235, 528, - 528, 525, 525, 525, 320, 320, 522, 522, 523, 523, - 520, 520, 520, 526, 526, 54, 55, 56, 527, 527, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 299, 299, 244, 244, 244, 244, 244, 244, 242, - 242, 242, 242, 243, 243, 240, 240, 241, 241, 229, - 229, 229, 230, 230, 44, 44, 44, 44, 44, 44, + 26, 26, 26, 26, 26, 58, 35, 36, 34, 37, + 39, 556, 556, 553, 38, 29, 28, 31, 27, 27, + 30, 32, 33, 33, 17, 17, 17, 17, 24, 24, + 25, 274, 274, 347, 347, 720, 720, 716, 716, 717, + 717, 717, 718, 718, 719, 719, 772, 772, 772, 158, + 651, 651, 651, 651, 651, 651, 15, 15, 15, 15, + 645, 645, 645, 650, 650, 649, 648, 648, 647, 647, + 646, 646, 646, 646, 16, 16, 16, 16, 269, 269, + 18, 18, 119, 119, 120, 120, 121, 121, 121, 121, + 121, 121, 123, 122, 122, 303, 303, 644, 644, 644, + 644, 644, 644, 561, 561, 560, 560, 697, 697, 697, + 698, 308, 308, 296, 296, 296, 307, 307, 307, 307, + 652, 652, 519, 699, 699, 660, 660, 659, 659, 658, + 658, 301, 301, 309, 309, 309, 310, 310, 302, 302, + 278, 278, 186, 186, 186, 674, 674, 675, 675, 665, + 665, 665, 665, 673, 673, 629, 629, 409, 409, 463, + 463, 464, 464, 256, 252, 252, 252, 253, 253, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 756, 756, 757, 758, 759, 759, 760, 760, 761, 761, + 761, 762, 762, 762, 762, 762, 706, 706, 708, 708, + 707, 300, 300, 291, 291, 293, 293, 293, 292, 292, + 292, 294, 295, 295, 289, 289, 290, 290, 288, 287, + 287, 286, 284, 284, 284, 285, 285, 285, 313, 313, + 313, 313, 258, 258, 258, 258, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 260, 261, 261, 263, 262, + 262, 262, 262, 264, 265, 265, 267, 266, 266, 266, + 266, 443, 443, 443, 443, 443, 443, 443, 443, 443, + 443, 443, 443, 259, 271, 271, 272, 272, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 440, 440, + 441, 441, 441, 441, 441, 184, 184, 638, 638, 439, + 439, 268, 268, 270, 270, 270, 270, 438, 438, 437, + 283, 283, 282, 282, 281, 281, 281, 275, 275, 275, + 275, 275, 275, 277, 449, 449, 448, 448, 447, 447, + 447, 447, 447, 447, 450, 451, 451, 451, 276, 276, + 162, 183, 183, 185, 298, 297, 446, 445, 445, 445, + 445, 312, 312, 311, 311, 299, 299, 280, 280, 280, + 280, 444, 279, 279, 3, 3, 1, 1, 1, 1, + 7, 7, 4, 4, 4, 2, 2, 2, 5, 5, + 6, 6, 442, 746, 746, 745, 745, 744, 742, 742, + 742, 743, 743, 743, 743, 689, 689, 689, 689, 689, + 481, 481, 481, 486, 486, 484, 484, 484, 484, 484, + 490, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 52, 53, 57, 167, 167, + 170, 170, 168, 168, 169, 169, 173, 173, 171, 171, + 49, 329, 330, 50, 331, 331, 332, 332, 333, 333, + 334, 335, 336, 336, 336, 336, 538, 538, 48, 320, + 320, 321, 321, 322, 322, 323, 324, 324, 324, 328, + 325, 326, 326, 765, 765, 764, 62, 67, 67, 68, + 68, 68, 68, 63, 64, 65, 66, 66, 66, 47, + 47, 40, 40, 231, 231, 232, 232, 232, 234, 234, + 405, 405, 405, 233, 233, 235, 235, 235, 721, 723, + 723, 725, 724, 724, 724, 727, 727, 727, 727, 727, + 728, 728, 728, 728, 729, 729, 41, 207, 207, 207, + 244, 244, 217, 732, 732, 732, 731, 731, 604, 604, + 733, 733, 734, 734, 467, 467, 468, 468, 229, 230, + 230, 219, 209, 243, 243, 243, 243, 243, 245, 245, + 349, 349, 208, 214, 215, 216, 218, 220, 222, 222, + 224, 722, 730, 730, 730, 557, 557, 554, 555, 555, + 552, 551, 551, 551, 736, 736, 735, 735, 735, 482, + 482, 42, 547, 547, 549, 550, 550, 550, 550, 550, + 550, 550, 550, 539, 539, 539, 539, 539, 46, 543, + 543, 545, 545, 546, 546, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 540, 540, 542, + 542, 536, 536, 537, 537, 537, 537, 537, 537, 537, + 537, 537, 45, 45, 45, 242, 242, 535, 535, 532, + 532, 532, 327, 327, 529, 529, 530, 530, 527, 527, + 527, 533, 533, 54, 55, 56, 534, 534, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 306, + 306, 251, 251, 251, 251, 251, 251, 249, 249, 249, + 249, 250, 250, 247, 247, 248, 248, 236, 236, 236, + 237, 237, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 181, 180, 180, 180, 180, 180, 183, - 183, 459, 459, 458, 458, 182, 399, 399, 51, 353, - 353, 614, 614, 609, 609, 609, 609, 609, 629, 629, - 629, 610, 610, 610, 611, 611, 611, 613, 613, 613, - 612, 612, 612, 612, 612, 628, 628, 630, 630, 630, - 574, 574, 575, 575, 575, 578, 578, 600, 600, 601, - 601, 599, 599, 607, 607, 606, 606, 605, 605, 603, - 603, 604, 602, 602, 602, 602, 594, 594, 593, 593, - 576, 576, 576, 576, 576, 577, 577, 577, 592, 592, - 598, 598, 362, 363, 363, 364, 364, 365, 232, 232, - 233, 233, 366, 367, 367, 368, 368, 369, 370, 370, - 371, 371, 372, 373, 373, 374, 374, 375, 378, 379, - 380, 380, 381, 381, 382, 386, 386, 383, 383, 384, - 384, 385, 376, 376, 377, 377, 360, 360, 361, 361, - 361, 429, 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 688, 688, 689, - 388, 388, 400, 400, 400, 400, 400, 400, 387, 387, - 389, 389, 341, 341, 339, 339, 331, 331, 331, 331, - 331, 331, 234, 234, 234, 330, 330, 330, 330, 330, - 330, 332, 332, 333, 333, 334, 334, 334, 338, 338, - 337, 337, 337, 337, 337, 335, 335, 336, 336, 336, - 336, 336, 336, 559, 559, 685, 685, 686, 686, 681, - 681, 681, 684, 684, 684, 684, 684, 684, 684, 684, - 684, 684, 684, 687, 687, 687, 683, 683, 343, 453, - 453, 453, 476, 476, 476, 476, 478, 452, 452, 452, - 359, 359, 358, 358, 356, 356, 356, 356, 356, 356, - 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, - 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, - 560, 560, 560, 558, 558, 558, 492, 492, 493, 493, - 411, 410, 410, 410, 410, 410, 408, 409, 407, 407, - 407, 407, 407, 404, 404, 403, 403, 403, 405, 405, - 405, 405, 405, 405, 534, 534, 401, 401, 391, 391, - 391, 390, 390, 390, 608, 499, 499, 499, 499, 499, - 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, - 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, - 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, - 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, - 501, 406, 406, 406, 450, 450, 450, 450, 450, 450, - 450, 450, 450, 450, 450, 450, 450, 450, 450, 451, - 451, 451, 451, 451, 451, 451, 451, 502, 502, 508, - 508, 698, 698, 697, 344, 344, 344, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 345, 354, 354, - 354, 588, 588, 588, 588, 588, 589, 589, 589, 589, - 589, 590, 590, 590, 586, 586, 587, 587, 513, 514, - 514, 635, 635, 636, 636, 579, 579, 580, 580, 581, - 585, 585, 583, 583, 584, 584, 582, 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, 649, 649, 649, 446, 446, - 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - 446, 446, 446, 446, 446, 446, 708, 708, 708, 693, - 693, 693, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 695, 695, 695, 695, 695, 695, - 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, - 695, 696, 696, 696, 696, 448, 448, 448, 448, 448, - 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, - 447, 447, 447, 447, 447, 447, 447, 447, 515, 515, - 516, 516, 646, 646, 646, 646, 646, 646, 647, 647, - 648, 648, 648, 648, 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, 500, 445, 445, 445, - 517, 509, 509, 510, 510, 511, 511, 503, 503, 503, - 503, 503, 504, 504, 506, 506, 506, 506, 506, 506, - 506, 506, 506, 506, 506, 506, 506, 506, 506, 498, - 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, - 498, 498, 498, 498, 498, 498, 505, 505, 768, 768, - 507, 507, 519, 519, 519, 518, 518, 518, 518, 518, - 518, 518, 357, 357, 357, 357, 497, 497, 497, 496, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, - 496, 346, 346, 346, 346, 346, 350, 350, 352, 352, - 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, - 352, 352, 351, 351, 351, 351, 351, 351, 349, 349, - 349, 349, 349, 347, 347, 347, 347, 347, 347, 347, - 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, - 347, 347, 347, 347, 347, 347, 347, 347, 152, 153, - 248, 248, 154, 154, 348, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 455, 455, 615, 615, 618, 618, 616, - 616, 617, 619, 619, 619, 620, 620, 620, 621, 621, - 621, 625, 625, 464, 464, 464, 472, 472, 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, 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, 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, 470, - 470, 470, 470, 470, 470, 470, 470, 470, 469, 469, - 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, - 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, - 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, - 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, - 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, - 469, 469, 469, 766, 766, 767, 767, 412, 412, 759, - 759, + 44, 188, 187, 187, 187, 187, 187, 190, 190, 466, + 466, 465, 465, 189, 406, 406, 51, 360, 360, 621, + 621, 616, 616, 616, 616, 616, 636, 636, 636, 617, + 617, 617, 618, 618, 618, 620, 620, 620, 619, 619, + 619, 619, 619, 635, 635, 637, 637, 637, 581, 581, + 582, 582, 582, 585, 585, 607, 607, 608, 608, 606, + 606, 614, 614, 613, 613, 612, 612, 610, 610, 611, + 609, 609, 609, 609, 601, 601, 600, 600, 583, 583, + 583, 583, 583, 584, 584, 584, 599, 599, 605, 605, + 369, 370, 370, 371, 371, 372, 239, 239, 240, 240, + 373, 374, 374, 375, 375, 376, 377, 377, 378, 378, + 379, 380, 380, 381, 381, 382, 385, 386, 387, 387, + 388, 388, 389, 393, 393, 390, 390, 391, 391, 392, + 383, 383, 384, 384, 367, 367, 368, 368, 368, 436, + 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 695, 695, 696, 395, 395, + 407, 407, 407, 407, 407, 407, 394, 394, 396, 396, + 348, 348, 346, 346, 338, 338, 338, 338, 338, 338, + 241, 241, 241, 337, 337, 337, 337, 337, 337, 339, + 339, 340, 340, 341, 341, 341, 345, 345, 344, 344, + 344, 344, 344, 342, 342, 343, 343, 343, 343, 343, + 343, 566, 566, 692, 692, 693, 693, 688, 688, 688, + 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, + 691, 694, 694, 694, 690, 690, 350, 460, 460, 460, + 483, 483, 483, 483, 485, 459, 459, 459, 366, 366, + 365, 365, 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, 567, 567, + 567, 565, 565, 565, 499, 499, 500, 500, 418, 417, + 417, 417, 417, 417, 415, 416, 414, 414, 414, 414, + 414, 411, 411, 410, 410, 410, 412, 412, 412, 412, + 412, 412, 541, 541, 408, 408, 398, 398, 398, 397, + 397, 397, 615, 506, 506, 506, 506, 506, 506, 506, + 506, 506, 506, 506, 506, 506, 506, 506, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 413, + 413, 413, 457, 457, 457, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 458, 458, 458, + 458, 458, 458, 458, 458, 509, 509, 515, 515, 705, + 705, 704, 351, 351, 351, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 361, 361, 361, 595, + 595, 595, 595, 595, 596, 596, 596, 596, 596, 597, + 597, 597, 593, 593, 594, 594, 520, 521, 521, 642, + 642, 643, 643, 586, 586, 587, 587, 588, 592, 592, + 590, 590, 591, 591, 589, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 656, 656, 656, 453, 453, 453, 453, + 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, + 453, 453, 453, 453, 715, 715, 715, 700, 700, 700, + 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, + 701, 701, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 703, + 703, 703, 703, 455, 455, 455, 455, 455, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 522, 522, 523, 523, + 653, 653, 653, 653, 653, 653, 654, 654, 655, 655, + 655, 655, 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, 507, 452, 452, 452, 524, 516, + 516, 517, 517, 518, 518, 510, 510, 510, 510, 510, + 511, 511, 513, 513, 513, 513, 513, 513, 513, 513, + 513, 513, 513, 513, 513, 513, 513, 505, 505, 505, + 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, + 505, 505, 505, 505, 512, 512, 775, 775, 514, 514, + 526, 526, 526, 525, 525, 525, 525, 525, 525, 525, + 364, 364, 364, 364, 504, 504, 504, 503, 503, 503, + 503, 503, 503, 503, 503, 503, 503, 503, 503, 353, + 353, 353, 353, 353, 357, 357, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 358, 358, 358, 358, 358, 358, 356, 356, 356, 356, + 356, 354, 354, 354, 354, 354, 354, 354, 354, 354, + 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, + 354, 354, 354, 354, 354, 354, 159, 160, 255, 255, + 161, 161, 355, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 462, 462, 622, 622, 625, 625, 623, 623, 624, + 626, 626, 626, 627, 627, 627, 628, 628, 628, 632, + 632, 471, 471, 471, 479, 479, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 773, 773, 774, + 774, 419, 419, 766, 766, } var yyR2 = [...]int{ @@ -13474,241 +13561,242 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, - 8, 0, 2, 0, 2, 12, 1, 3, 0, 3, - 3, 3, 5, 0, 1, 1, 1, 1, 2, 4, - 5, 6, 1, 2, 1, 2, 3, 7, 6, 5, - 10, 10, 11, 11, 12, 8, 13, 1, 5, 6, - 8, 5, 3, 5, 8, 1, 3, 3, 5, 5, - 5, 1, 1, 0, 3, 5, 7, 9, 9, 11, - 8, 6, 4, 0, 1, 1, 0, 1, 5, 2, - 2, 6, 9, 6, 9, 4, 7, 8, 0, 1, - 1, 2, 4, 6, 1, 2, 4, 0, 2, 10, - 11, 5, 7, 5, 2, 0, 2, 1, 3, 3, - 3, 0, 2, 0, 2, 1, 3, 5, 0, 2, - 3, 1, 3, 1, 1, 1, 3, 1, 3, 1, - 1, 1, 1, 0, 3, 3, 0, 3, 3, 0, - 1, 3, 0, 1, 3, 0, 2, 1, 2, 3, - 4, 3, 3, 1, 0, 1, 1, 0, 1, 8, - 5, 7, 0, 3, 8, 5, 1, 3, 3, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 4, 1, 3, 1, 2, 2, 2, 2, 2, 2, - 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, - 1, 1, 1, 1, 1, 2, 2, 2, 1, 2, - 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, - 1, 1, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 6, 3, 4, 4, 5, 1, 3, 3, 1, - 2, 2, 2, 1, 2, 2, 3, 4, 4, 6, - 1, 1, 1, 2, 4, 6, 1, 4, 1, 3, - 3, 4, 4, 4, 4, 3, 3, 2, 4, 4, - 2, 2, 2, 1, 1, 1, 1, 1, 1, 3, - 1, 3, 1, 1, 1, 1, 1, 1, 2, 3, - 3, 4, 5, 4, 2, 2, 0, 1, 4, 2, - 4, 1, 5, 3, 2, 1, 2, 2, 4, 4, - 5, 2, 1, 3, 4, 4, 1, 2, 10, 8, - 10, 1, 3, 3, 1, 1, 3, 1, 3, 2, - 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, - 4, 4, 3, 2, 4, 3, 3, 1, 1, 1, - 1, 1, 1, 2, 3, 4, 7, 1, 5, 5, - 6, 6, 6, 6, 2, 3, 3, 4, 3, 4, - 4, 5, 3, 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 2, 1, 1, 1, 1, 1, 4, 0, - 1, 1, 3, 1, 4, 4, 0, 1, 2, 4, - 0, 3, 4, 1, 1, 0, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 6, 8, 6, 8, 5, 5, 10, 7, - 4, 4, 4, 3, 1, 3, 3, 5, 5, 5, - 5, 5, 1, 3, 1, 6, 7, 4, 4, 7, - 8, 6, 6, 8, 6, 11, 10, 3, 3, 3, - 1, 1, 1, 3, 2, 4, 5, 5, 6, 5, - 5, 3, 2, 2, 1, 3, 4, 3, 7, 5, - 8, 2, 2, 1, 3, 2, 0, 1, 1, 1, + 1, 8, 8, 0, 2, 0, 2, 12, 1, 3, + 0, 3, 3, 3, 5, 0, 1, 1, 1, 1, + 2, 4, 5, 6, 1, 2, 1, 2, 3, 7, + 6, 5, 10, 10, 11, 11, 12, 8, 13, 1, + 5, 6, 8, 5, 3, 5, 8, 1, 3, 3, + 5, 5, 5, 1, 1, 0, 3, 5, 7, 9, + 9, 11, 8, 6, 4, 0, 1, 1, 0, 1, + 5, 2, 2, 6, 9, 6, 9, 4, 7, 8, + 0, 1, 1, 2, 4, 6, 1, 2, 4, 0, + 2, 10, 11, 5, 7, 5, 2, 0, 2, 1, + 3, 3, 3, 0, 2, 0, 2, 1, 3, 5, + 0, 2, 3, 1, 3, 1, 1, 1, 3, 1, + 3, 1, 1, 1, 1, 0, 3, 3, 0, 3, + 3, 0, 1, 3, 0, 1, 3, 0, 2, 1, + 2, 3, 4, 3, 3, 1, 0, 1, 1, 0, + 1, 8, 5, 7, 0, 3, 8, 5, 1, 3, + 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 4, 1, 3, 1, 2, 2, 2, 2, + 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, + 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, + 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, + 2, 1, 1, 1, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 6, 3, 4, 4, 5, 1, 3, + 3, 1, 2, 2, 2, 1, 2, 2, 3, 4, + 4, 6, 1, 1, 1, 2, 4, 6, 1, 4, + 1, 3, 3, 4, 4, 4, 4, 3, 3, 2, + 4, 4, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, + 2, 3, 3, 4, 5, 4, 2, 2, 0, 1, + 4, 2, 4, 1, 5, 3, 2, 1, 2, 2, + 4, 4, 5, 2, 1, 3, 4, 4, 1, 2, + 10, 8, 10, 1, 3, 3, 1, 1, 3, 1, + 3, 2, 1, 2, 1, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, + 1, 4, 4, 4, 3, 2, 4, 3, 3, 1, + 1, 1, 1, 1, 1, 2, 3, 4, 7, 1, + 5, 5, 6, 6, 6, 6, 2, 3, 3, 4, + 3, 4, 4, 5, 3, 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 0, 1, 2, 1, 3, - 2, 1, 2, 2, 1, 2, 3, 2, 2, 2, - 3, 5, 3, 3, 1, 1, 3, 3, 7, 4, - 3, 1, 2, 4, 5, 3, 4, 7, 7, 8, - 8, 0, 4, 7, 6, 6, 0, 3, 0, 2, - 0, 1, 1, 1, 1, 4, 2, 2, 3, 3, - 4, 5, 3, 4, 4, 2, 2, 2, 3, 0, + 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, + 4, 0, 1, 1, 3, 1, 4, 4, 0, 1, + 2, 4, 0, 3, 4, 1, 1, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 6, 8, 6, 8, 5, + 5, 10, 7, 4, 4, 4, 3, 1, 3, 3, + 5, 5, 5, 5, 5, 1, 3, 1, 6, 7, + 4, 4, 7, 8, 6, 6, 8, 6, 11, 10, + 3, 3, 3, 1, 1, 1, 3, 2, 4, 5, + 5, 6, 5, 5, 3, 2, 2, 1, 3, 4, + 3, 7, 5, 8, 2, 2, 1, 3, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, + 2, 1, 3, 2, 1, 2, 2, 1, 2, 3, + 2, 2, 2, 3, 5, 3, 3, 1, 1, 3, + 3, 7, 4, 3, 1, 2, 4, 5, 3, 4, + 7, 7, 8, 8, 0, 4, 7, 6, 6, 0, + 3, 0, 2, 0, 1, 1, 1, 1, 4, 2, + 2, 3, 3, 4, 5, 3, 4, 4, 2, 2, + 2, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 5, 0, 2, 0, - 2, 5, 7, 8, 5, 5, 7, 9, 8, 8, - 11, 5, 1, 3, 3, 3, 5, 4, 3, 3, - 3, 4, 5, 6, 5, 2, 5, 6, 5, 0, - 2, 7, 0, 1, 0, 1, 5, 5, 3, 3, - 2, 4, 4, 4, 4, 4, 1, 1, 1, 3, - 3, 1, 1, 1, 6, 0, 1, 1, 1, 1, - 5, 5, 0, 1, 1, 3, 6, 3, 6, 3, - 4, 7, 7, 5, 4, 7, 8, 3, 3, 4, - 2, 3, 4, 4, 3, 0, 2, 2, 0, 2, - 2, 1, 1, 1, 1, 0, 1, 5, 5, 6, - 4, 3, 1, 3, 1, 1, 3, 5, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, + 0, 2, 0, 2, 5, 7, 8, 5, 5, 7, + 9, 8, 8, 11, 5, 1, 3, 3, 3, 5, + 4, 3, 3, 3, 4, 5, 6, 5, 2, 5, + 6, 5, 0, 2, 7, 0, 1, 0, 1, 5, + 5, 3, 3, 2, 4, 4, 4, 4, 4, 1, + 1, 1, 3, 3, 1, 1, 1, 6, 0, 1, + 1, 1, 1, 5, 5, 0, 1, 1, 3, 6, + 3, 6, 3, 4, 7, 7, 5, 4, 7, 8, + 3, 3, 4, 2, 3, 4, 4, 3, 0, 2, + 2, 0, 2, 2, 1, 1, 1, 1, 0, 1, + 5, 5, 6, 4, 3, 1, 3, 1, 1, 3, + 5, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 4, 5, 5, 4, 4, 4, 1, 3, 1, - 4, 6, 6, 5, 4, 4, 3, 7, 3, 5, - 1, 1, 2, 2, 12, 9, 10, 1, 3, 2, - 4, 0, 2, 0, 1, 1, 1, 1, 0, 1, - 0, 1, 0, 1, 1, 6, 2, 1, 5, 4, - 4, 2, 1, 2, 1, 2, 4, 5, 5, 1, - 2, 4, 0, 2, 1, 2, 2, 6, 5, 9, - 6, 6, 6, 7, 0, 2, 1, 2, 8, 10, - 1, 2, 7, 5, 13, 13, 10, 10, 1, 0, - 2, 1, 3, 2, 1, 5, 4, 4, 2, 0, - 1, 5, 4, 0, 1, 3, 3, 1, 3, 1, - 3, 5, 1, 3, 3, 5, 1, 3, 4, 0, - 1, 0, 1, 1, 3, 1, 1, 0, 4, 0, - 4, 4, 3, 5, 1, 3, 2, 1, 0, 10, - 2, 0, 2, 0, 2, 0, 4, 7, 4, 0, - 2, 0, 2, 0, 2, 0, 4, 1, 3, 3, - 1, 1, 1, 1, 4, 7, 4, 6, 4, 5, - 6, 8, 4, 6, 5, 6, 0, 1, 4, 8, - 0, 6, 0, 4, 0, 4, 6, 1, 1, 1, - 1, 1, 2, 3, 1, 3, 6, 0, 3, 0, - 1, 0, 1, 1, 2, 4, 4, 2, 0, 5, - 0, 1, 0, 5, 3, 1, 3, 3, 0, 1, - 1, 0, 2, 2, 0, 2, 2, 4, 3, 3, - 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, - 3, 5, 1, 3, 2, 1, 1, 1, 2, 5, - 1, 3, 2, 1, 1, 1, 1, 1, 2, 2, - 1, 2, 2, 1, 2, 2, 1, 2, 2, 9, - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 2, 0, 4, 7, 6, - 6, 3, 5, 0, 2, 0, 2, 1, 3, 1, - 2, 3, 5, 0, 1, 2, 1, 3, 1, 4, - 1, 1, 1, 4, 4, 4, 3, 4, 5, 3, - 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, - 2, 2, 3, 4, 0, 2, 4, 1, 3, 4, - 1, 3, 1, 1, 2, 2, 3, 0, 1, 2, - 4, 1, 3, 1, 3, 2, 3, 1, 10, 4, - 1, 3, 3, 5, 5, 7, 0, 1, 1, 1, - 2, 0, 4, 4, 0, 3, 0, 3, 3, 0, - 1, 1, 2, 5, 2, 2, 2, 0, 2, 3, - 3, 0, 1, 3, 1, 3, 0, 1, 2, 1, - 1, 0, 1, 2, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 4, 5, 5, 4, 4, + 4, 1, 3, 1, 4, 6, 6, 5, 4, 4, + 3, 7, 3, 5, 1, 1, 2, 2, 12, 9, + 10, 1, 3, 2, 4, 0, 2, 0, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 1, 1, 6, + 2, 1, 5, 4, 4, 2, 1, 2, 1, 2, + 4, 5, 5, 1, 2, 4, 0, 2, 1, 2, + 2, 6, 5, 9, 6, 6, 6, 7, 0, 2, + 1, 2, 8, 10, 1, 2, 7, 5, 13, 13, + 10, 10, 1, 0, 2, 1, 3, 2, 1, 5, + 4, 4, 2, 0, 1, 5, 4, 0, 1, 3, + 3, 1, 3, 1, 3, 5, 1, 3, 3, 5, + 1, 3, 4, 0, 1, 0, 1, 1, 3, 1, + 1, 0, 4, 0, 4, 4, 3, 5, 1, 3, + 2, 1, 0, 10, 2, 0, 2, 0, 2, 0, + 4, 7, 4, 0, 2, 0, 2, 0, 2, 0, + 4, 1, 3, 3, 1, 1, 1, 1, 4, 7, + 4, 6, 4, 5, 6, 8, 4, 6, 5, 6, + 0, 1, 4, 8, 0, 6, 0, 4, 0, 4, + 6, 1, 1, 1, 1, 1, 2, 3, 1, 3, + 6, 0, 3, 0, 1, 0, 1, 1, 2, 4, + 4, 2, 0, 5, 0, 1, 0, 5, 3, 1, + 3, 3, 0, 1, 1, 0, 2, 2, 0, 2, + 2, 4, 3, 3, 1, 1, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 5, 1, 3, 2, 1, + 1, 1, 2, 5, 1, 3, 2, 1, 1, 1, + 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, + 1, 2, 2, 9, 0, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, + 0, 4, 7, 6, 6, 3, 5, 0, 2, 0, + 2, 1, 3, 1, 2, 3, 5, 0, 1, 2, + 1, 3, 1, 4, 1, 1, 1, 4, 4, 4, + 3, 4, 5, 3, 2, 2, 2, 2, 2, 3, + 2, 3, 2, 3, 2, 2, 3, 4, 0, 2, + 4, 1, 3, 4, 1, 3, 1, 1, 2, 2, + 3, 0, 1, 2, 4, 1, 3, 1, 3, 2, + 3, 1, 10, 4, 1, 3, 3, 5, 5, 7, + 0, 1, 1, 1, 2, 0, 4, 4, 0, 3, + 0, 3, 3, 0, 1, 1, 2, 5, 2, 2, + 2, 0, 2, 3, 3, 0, 1, 3, 1, 3, + 0, 1, 2, 1, 1, 0, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 6, 6, 10, 0, 3, 0, 2, 0, 4, 1, - 1, 0, 2, 0, 2, 7, 1, 1, 9, 1, - 3, 0, 1, 1, 3, 1, 3, 0, 1, 1, - 1, 0, 2, 14, 1, 3, 0, 1, 1, 3, - 1, 1, 2, 4, 1, 1, 1, 1, 0, 1, - 2, 9, 9, 7, 8, 1, 2, 3, 3, 3, - 0, 4, 1, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 4, 1, 1, 1, 3, 3, 4, - 3, 3, 0, 1, 1, 1, 0, 2, 7, 8, - 10, 8, 2, 2, 8, 0, 3, 3, 0, 3, - 0, 3, 0, 3, 0, 5, 1, 3, 0, 3, - 3, 0, 2, 9, 8, 0, 2, 2, 3, 3, - 0, 2, 0, 2, 4, 5, 4, 4, 4, 6, - 4, 8, 5, 1, 0, 2, 2, 1, 3, 2, - 1, 3, 2, 1, 3, 2, 0, 1, 3, 4, - 3, 1, 1, 4, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 6, 6, 10, 0, 3, + 0, 2, 0, 4, 1, 1, 0, 2, 0, 2, + 7, 1, 1, 9, 1, 3, 0, 1, 1, 3, + 1, 3, 0, 1, 1, 1, 0, 2, 14, 1, + 3, 0, 1, 1, 3, 1, 1, 2, 4, 1, + 1, 1, 1, 0, 1, 2, 8, 2, 5, 1, + 1, 1, 1, 4, 5, 5, 3, 5, 5, 9, + 9, 7, 8, 1, 2, 3, 3, 3, 0, 4, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, - 11, 0, 2, 0, 2, 1, 1, 3, 3, 2, - 2, 3, 1, 1, 3, 3, 3, 3, 3, 3, - 4, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 1, 1, 1, 3, 3, 3, 3, 3, 1, - 3, 3, 4, 0, 1, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 6, 8, 10, 0, 4, 1, - 1, 0, 3, 3, 0, 1, 0, 1, 1, 2, - 4, 4, 4, 0, 1, 4, 4, 4, 0, 2, - 8, 9, 5, 5, 8, 7, 8, 12, 12, 13, - 13, 0, 4, 0, 3, 3, 3, 2, 2, 0, - 3, 3, 3, 4, 4, 0, 3, 0, 2, 0, - 1, 1, 1, 1, 11, 9, 9, 9, 9, 9, - 9, 6, 11, 6, 9, 7, 10, 8, 11, 7, - 6, 9, 11, 2, 2, 9, 4, 5, 3, 0, - 4, 1, 3, 0, 3, 6, 0, 2, 10, 0, - 2, 0, 2, 0, 3, 2, 4, 3, 0, 2, - 1, 0, 2, 3, 0, 2, 3, 0, 2, 1, - 0, 3, 2, 4, 3, 0, 1, 0, 1, 1, - 0, 6, 0, 3, 5, 0, 4, 0, 3, 1, - 3, 4, 5, 0, 3, 1, 3, 2, 3, 1, - 2, 1, 0, 4, 6, 5, 0, 2, 0, 2, - 4, 5, 4, 5, 1, 5, 6, 5, 0, 3, - 0, 1, 4, 0, 4, 1, 3, 3, 1, 1, - 1, 1, 4, 0, 4, 1, 3, 3, 1, 1, - 1, 1, 4, 0, 4, 1, 3, 3, 4, 4, - 0, 4, 1, 3, 3, 1, 1, 0, 4, 1, - 3, 3, 1, 1, 1, 1, 0, 1, 1, 3, - 2, 3, 3, 3, 3, 4, 4, 3, 3, 3, - 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, - 3, 3, 3, 3, 1, 5, 4, 1, 3, 3, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 3, 5, 0, 3, 3, 6, - 5, 3, 1, 1, 1, 0, 5, 5, 5, 5, - 6, 0, 1, 1, 3, 1, 1, 1, 1, 1, - 7, 9, 7, 7, 9, 2, 1, 7, 9, 7, - 9, 8, 5, 0, 1, 0, 1, 1, 1, 1, - 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 3, 1, - 3, 5, 1, 1, 1, 1, 1, 1, 3, 5, - 0, 1, 1, 2, 1, 2, 2, 2, 1, 1, - 2, 2, 2, 2, 2, 3, 3, 2, 2, 1, - 5, 6, 4, 2, 1, 1, 1, 5, 7, 5, - 0, 1, 1, 1, 2, 2, 0, 1, 1, 2, - 5, 0, 1, 1, 2, 2, 3, 3, 1, 1, - 2, 2, 2, 0, 1, 2, 2, 2, 0, 4, - 7, 3, 3, 3, 0, 3, 0, 3, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, - 1, 1, 1, 3, 3, 5, 2, 2, 2, 2, - 2, 4, 1, 1, 2, 5, 6, 10, 8, 6, - 3, 6, 6, 1, 1, 1, 1, 1, 1, 3, - 9, 1, 1, 1, 4, 4, 4, 4, 5, 4, - 6, 8, 10, 6, 8, 10, 6, 6, 9, 7, - 9, 7, 7, 7, 9, 7, 7, 0, 2, 0, - 1, 1, 2, 4, 1, 2, 2, 1, 1, 2, - 2, 5, 1, 2, 2, 2, 2, 2, 0, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 1, 1, 1, 2, 5, 0, 1, 3, 0, - 1, 0, 2, 0, 2, 0, 1, 2, 4, 4, - 0, 1, 0, 2, 1, 3, 5, 9, 6, 6, - 8, 6, 6, 5, 5, 6, 6, 6, 6, 6, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 9, - 6, 6, 6, 6, 8, 1, 1, 1, 4, 6, - 4, 6, 8, 6, 6, 4, 6, 4, 4, 4, - 3, 4, 6, 6, 7, 4, 1, 1, 1, 1, + 1, 4, 1, 1, 1, 3, 3, 4, 3, 3, + 0, 1, 1, 1, 0, 2, 7, 8, 10, 8, + 2, 2, 8, 0, 3, 3, 0, 3, 0, 3, + 0, 3, 0, 5, 1, 3, 0, 3, 3, 0, + 2, 9, 8, 0, 2, 2, 3, 3, 0, 2, + 0, 2, 4, 5, 4, 4, 4, 6, 4, 8, + 5, 1, 0, 2, 2, 1, 3, 2, 1, 3, + 2, 1, 3, 2, 0, 1, 3, 4, 3, 1, + 1, 4, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 11, 0, + 2, 0, 2, 1, 1, 3, 3, 2, 2, 3, + 1, 1, 3, 3, 3, 3, 3, 3, 4, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 1, + 1, 1, 3, 3, 3, 3, 3, 1, 3, 3, + 4, 0, 1, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 6, 8, 10, 0, 4, 1, 1, 0, + 3, 3, 0, 1, 0, 1, 1, 2, 4, 4, + 4, 0, 1, 4, 4, 4, 0, 2, 8, 9, + 5, 5, 8, 7, 8, 12, 12, 13, 13, 0, + 4, 0, 3, 3, 3, 2, 2, 0, 3, 3, + 3, 4, 4, 0, 3, 0, 2, 0, 1, 1, + 1, 1, 11, 9, 9, 9, 9, 9, 9, 6, + 11, 6, 9, 7, 10, 8, 11, 7, 6, 9, + 11, 2, 2, 9, 4, 5, 3, 0, 4, 1, + 3, 0, 3, 6, 0, 2, 10, 0, 2, 0, + 2, 0, 3, 2, 4, 3, 0, 2, 1, 0, + 2, 3, 0, 2, 3, 0, 2, 1, 0, 3, + 2, 4, 3, 0, 1, 0, 1, 1, 0, 6, + 0, 3, 5, 0, 4, 0, 3, 1, 3, 4, + 5, 0, 3, 1, 3, 2, 3, 1, 2, 1, + 0, 4, 6, 5, 0, 2, 0, 2, 4, 5, + 4, 5, 1, 5, 6, 5, 0, 3, 0, 1, + 4, 0, 4, 1, 3, 3, 1, 1, 1, 1, + 4, 0, 4, 1, 3, 3, 1, 1, 1, 1, + 4, 0, 4, 1, 3, 3, 4, 4, 0, 4, + 1, 3, 3, 1, 1, 0, 4, 1, 3, 3, + 1, 1, 1, 1, 0, 1, 1, 3, 2, 3, + 3, 3, 3, 4, 4, 3, 3, 3, 3, 4, + 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 5, 4, 1, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 3, 5, 0, 3, 3, 6, 5, 3, + 1, 1, 1, 0, 5, 5, 5, 5, 6, 0, + 1, 1, 3, 1, 1, 1, 1, 1, 7, 9, + 7, 7, 9, 2, 1, 7, 9, 7, 9, 8, + 5, 0, 1, 0, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 3, 1, 3, 5, + 1, 1, 1, 1, 1, 1, 3, 5, 0, 1, + 1, 2, 1, 2, 2, 2, 1, 1, 2, 2, + 2, 2, 2, 3, 3, 2, 2, 1, 5, 6, + 4, 2, 1, 1, 1, 5, 7, 5, 0, 1, + 1, 1, 2, 2, 0, 1, 1, 2, 5, 0, + 1, 1, 2, 2, 3, 3, 1, 1, 2, 2, + 2, 0, 1, 2, 2, 2, 0, 4, 7, 3, + 3, 3, 0, 3, 0, 3, 1, 1, 1, 1, + 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, + 1, 3, 3, 5, 2, 2, 2, 2, 2, 4, + 1, 1, 2, 5, 6, 10, 8, 6, 3, 6, + 6, 1, 1, 1, 1, 1, 1, 3, 9, 1, + 1, 1, 4, 4, 4, 4, 5, 4, 6, 8, + 10, 6, 8, 10, 6, 6, 9, 7, 9, 7, + 7, 7, 9, 7, 7, 0, 2, 0, 1, 1, + 2, 4, 1, 2, 2, 1, 1, 2, 2, 5, + 1, 2, 2, 2, 2, 2, 0, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, + 1, 1, 2, 5, 0, 1, 3, 0, 1, 0, + 2, 0, 2, 0, 1, 2, 4, 4, 0, 1, + 0, 2, 1, 3, 5, 9, 6, 6, 8, 6, + 6, 5, 5, 6, 6, 6, 6, 6, 5, 6, + 6, 6, 6, 6, 6, 6, 6, 9, 6, 6, + 6, 6, 8, 1, 1, 1, 4, 6, 4, 6, + 8, 6, 6, 4, 6, 4, 4, 4, 3, 4, + 6, 6, 7, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 8, 8, 6, - 4, 2, 3, 2, 4, 2, 2, 4, 6, 2, - 2, 4, 6, 4, 2, 4, 4, 4, 0, 1, - 2, 3, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 8, 8, 6, 4, 2, + 3, 2, 4, 2, 2, 4, 6, 2, 2, 4, + 6, 4, 2, 4, 4, 4, 0, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 0, 1, 1, - 3, 0, 1, 1, 3, 1, 3, 3, 3, 3, - 2, 1, 1, 1, 3, 4, 4, 3, 4, 4, - 3, 4, 4, 3, 4, 4, 3, 4, 1, 3, - 4, 4, 6, 4, 5, 5, 4, 5, 5, 3, - 4, 4, 5, 6, 6, 1, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, - 2, 3, 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 3, 2, 2, 2, 2, 1, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, - 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, - 2, 2, 2, 2, 2, 4, 4, 1, 2, 2, - 7, 8, 3, 5, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 0, 1, 1, 3, 0, + 1, 1, 3, 1, 3, 3, 3, 3, 2, 1, + 1, 1, 3, 4, 4, 3, 4, 4, 3, 4, + 4, 3, 4, 4, 3, 4, 1, 3, 4, 4, + 6, 4, 5, 5, 4, 5, 5, 3, 4, 4, + 5, 6, 6, 1, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 0, 1, 0, 3, 0, - 3, 3, 0, 3, 5, 0, 3, 5, 0, 1, - 1, 0, 1, 1, 2, 2, 0, 1, 1, 1, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, 2, 3, + 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 2, 2, 2, 2, 1, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, + 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, + 2, 2, 2, 4, 4, 1, 2, 2, 7, 8, + 3, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 0, 1, 0, 3, 0, 3, 3, + 0, 3, 5, 0, 3, 5, 0, 1, 1, 0, + 1, 1, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -13759,557 +13847,563 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 2, 0, 2, 5, 7, 1, - 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, + 2, 5, 7, 1, 3, } var yyChk = [...]int{ - -1000, -756, -760, -12, -8, -9, -11, -154, -117, 732, - -14, -23, -156, -142, -157, -15, -151, -17, -18, -19, - -213, -21, -124, -146, -148, -150, -149, -62, -20, -143, - -144, -145, -102, -103, -127, -135, -138, -139, -140, -141, - -158, -152, -153, -155, -245, -159, -168, -169, -220, -172, - -174, -175, -208, -209, -239, 721, -118, -119, -120, -121, - -122, -123, -43, -42, -41, -40, -200, -210, -214, -216, - -170, -57, 637, 727, 766, 538, -16, -699, -638, 591, - -24, -25, -112, -26, 278, 305, -480, -125, -481, -482, - -484, -761, -63, -64, -65, -78, -79, -80, -81, -82, - -92, -93, -94, -66, -67, -68, -71, -69, -85, -84, - -86, -87, -88, -89, -90, -91, -70, -74, -203, -204, - -205, -206, -95, -72, -73, -218, -221, -171, -96, -97, - -98, -75, -60, -61, -76, -77, -100, -99, -105, -111, - -101, -106, -202, -212, -22, -219, -107, -59, -109, -110, - -108, 279, 350, 298, -104, 86, -128, -129, -130, -131, - -132, -133, -134, -136, -137, 463, 469, 525, 719, 720, - 71, -247, -249, -251, 768, 769, 772, 622, 624, 323, - 186, 187, 189, 190, 194, 197, -44, -45, -46, -47, - -48, -49, -51, -50, -52, -53, -54, -55, -56, 274, - 22, 20, 24, 64, -27, -30, -28, -31, -29, -38, - -39, -37, -32, -34, -201, -207, -33, -211, -215, -217, - -173, -58, -35, -36, 300, 299, 47, 366, 367, 368, - 467, 275, 277, 23, 40, 51, 442, -250, -254, 96, - -257, -253, 623, 276, -252, -256, 21, 284, 786, -13, - -10, -9, -187, -191, -195, -198, -199, -196, -197, -11, - -154, 131, 290, 722, -476, 459, 723, 725, 724, 99, - 107, -469, -471, 766, 538, 305, 463, 469, 719, 720, - 769, 772, 622, 624, 323, 639, 640, 641, 642, 643, - 644, 645, 646, 648, 649, 650, 651, 652, 653, 654, - 697, 698, 664, 665, 655, 656, 657, 658, 659, 660, - 661, 662, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 675, 676, 677, 678, 679, 594, 595, 699, 701, - 702, 703, 704, 647, 684, 692, 693, 694, 777, 778, - 440, 6, 7, 8, 9, 10, 441, 630, 716, 775, - 317, 341, 492, 347, 354, 421, 186, 204, 200, 229, - 219, 427, 373, 745, 746, 372, 623, 195, 321, 359, - 322, 106, 189, 577, 121, 550, 521, 192, 379, 382, - 380, 381, 336, 338, 340, 453, 343, 342, 344, 346, - 621, 377, 443, 215, 209, 335, 319, 207, 324, 428, - 49, 325, 419, 418, 234, 326, 327, 634, 546, 439, - 552, 351, 62, 519, 208, 339, 549, 715, 242, 246, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 568, 425, 406, 407, 408, 409, 569, 430, 177, 178, - 554, 744, 751, 752, 753, 755, 756, 757, 754, 424, - 571, 429, 233, 236, 237, 238, 239, 240, 241, 297, - 415, 416, 431, 432, 433, 434, 435, 437, 438, 52, - 632, 309, 572, 244, 762, 223, 232, 227, 580, 355, - 353, 420, 231, 203, 226, 320, 784, 767, 75, 248, - 247, 249, 515, 516, 517, 518, 328, 329, 457, 567, - 747, 748, 222, 210, 444, 196, 31, 575, 304, 551, - 470, 383, 57, 384, 330, 348, 356, 378, 243, 245, - 311, 316, 371, 426, 633, 523, 524, 315, 559, 560, - 352, 573, 206, 308, 337, 303, 576, 763, 749, 197, - 783, 472, 331, 190, 345, 570, 765, 579, 74, 172, - 202, 193, 739, 740, 294, 700, 187, 313, 318, 717, - 764, 332, 333, 334, 358, 357, 349, 194, 224, 310, - 230, 213, 201, 225, 188, 312, 578, 173, 713, 442, - 502, 221, 218, 314, 287, 718, 574, 553, 191, 506, - 175, 216, 360, 707, 708, 709, 712, 458, 414, 361, - 362, 214, 301, 544, 545, 365, 512, 401, 486, 522, - 493, 487, 265, 266, 369, 556, 558, 235, 710, 385, - 386, 387, 548, 388, 389, 390, 391, 396, 462, 66, - 68, 108, 111, 110, 770, 771, 73, 38, 448, 451, - 484, 785, 488, 403, 714, 631, 400, 404, 405, 452, - 34, 504, 474, 508, 507, 58, 59, 60, 63, 64, - 65, 67, 69, 70, 61, 620, 467, 481, 581, 54, - 56, 477, 478, 36, 454, 503, 526, 399, 505, 537, - 55, 535, 536, 557, 35, 456, 455, 72, 53, 511, - 513, 514, 363, 397, 465, 728, 582, 460, 476, 480, - 461, 402, 450, 482, 77, 473, 729, 468, 466, 779, - 780, 398, 635, 636, 410, 663, 445, 520, 617, 616, - 615, 614, 613, 612, 611, 610, 366, 367, 368, 489, - 490, 491, 501, 494, 495, 496, 497, 498, 499, 500, - 540, 541, 730, 731, 561, 563, 564, 628, 565, 562, - 282, 774, 773, 446, 447, 285, 733, 734, 109, 735, - 737, 736, 37, 738, 761, 758, 759, 760, 638, 566, - 625, 741, 627, 626, 685, 686, 687, 688, 689, -565, - -563, -476, 623, 323, 766, 719, 720, 469, 622, 624, - 463, 442, 769, 772, 64, 467, 305, 366, 367, 368, - 538, 440, -324, -476, 284, 773, -104, -25, -24, -16, - -638, -112, -250, -251, -765, 271, 273, 478, -339, 284, - -476, -485, 32, 519, 279, 280, -126, 520, 96, 87, - -476, -17, -140, -15, -151, -102, -245, -699, 525, -483, - -476, 366, 366, 628, -483, 284, 284, 743, 524, 565, - 628, 744, 751, 762, 560, 453, 110, 111, 739, 740, - 36, 284, 464, 311, 558, 556, 557, 561, 562, 563, - 564, -83, -650, -626, 553, 644, 552, -489, 545, 551, - 543, 555, 546, 441, 391, 388, 637, 390, 395, 274, - 733, 619, -464, 486, 522, 581, 582, 465, 523, 568, - 570, 547, 121, 220, 217, -478, 315, 500, -476, -627, - 290, -569, -540, 316, -568, -542, -571, -543, 41, 274, - 276, 275, 637, 312, 24, 467, 286, 22, 21, 468, - 298, 34, 35, 37, 23, 469, 471, 38, 472, 475, - 476, 477, 51, 481, 482, 305, 99, 107, 102, 685, - 686, 687, 688, 689, 323, 284, -323, -476, -511, -503, - 128, -506, -498, -499, -501, -454, -671, -496, 96, 157, - 158, 165, 129, 167, 787, -500, -608, 45, 131, 643, - 647, 684, 592, -446, -447, -448, -449, -450, -451, 629, - -476, -672, -670, 102, 112, 114, 118, 119, 117, 115, - 180, 211, 116, 103, 181, -251, 99, -693, 653, 659, - -470, 676, 701, 702, 703, 704, 675, 71, -634, -648, - 283, -646, 179, 217, 301, 213, 22, 163, 512, 214, - 692, 693, 694, 650, 672, 594, 595, 699, 654, 777, - 778, 664, 679, 645, 646, 648, 640, 641, 642, 644, - 655, 657, 671, -649, 667, 677, 678, 663, 695, 696, - 758, 697, 698, 680, 681, 682, 691, 690, 683, 685, - 686, 687, 688, 689, 737, 101, 100, 670, 669, 656, - 651, 652, 658, 639, 649, 660, 668, 673, 674, 451, - 121, 452, 453, 584, 443, 90, 454, 290, 519, 9, - 80, 455, 456, 457, 458, 243, 459, 591, 460, 783, - 81, 461, 450, 305, 502, 462, 216, 235, 597, 596, - 598, 588, 585, 583, 586, 587, 589, 590, 661, 662, - 666, -248, -250, -699, -251, -176, -178, 705, -749, -287, - -750, -436, 31, -751, 12, 13, 14, 15, 181, -740, - 521, 633, 102, 584, 284, 359, 440, 25, 743, 395, - 621, 743, 395, 621, 373, 191, 188, -555, 191, 127, - 197, 196, 288, 191, -555, -476, 194, 743, 193, 739, - 744, 751, 628, 369, -527, -224, 440, 502, 388, 108, - 315, -532, -528, -628, 363, 359, 285, 124, -225, 295, - 436, 294, 122, 584, 283, 479, 354, 66, 68, 41, - 54, -271, 57, 289, 48, -339, -701, 618, -700, -476, - -709, -710, 271, 272, 273, 48, 744, 751, 285, 287, - 284, 739, 628, 315, 440, -528, 502, 108, 388, 284, - -709, 762, 188, 568, 570, 521, 315, 500, 50, -562, - 512, -561, -563, 569, 580, 100, 101, 567, -464, 121, - 544, 544, -749, -436, -750, -282, -436, -281, 17, -247, - -251, -254, -258, -699, -260, 71, 621, 743, 628, 744, - 751, 285, 440, 502, 315, 286, -628, 287, 584, 283, - 366, 464, 311, 388, 395, 108, 193, 739, -264, -265, - -266, 267, 268, 269, 79, 272, 270, 76, 41, 42, - 43, -339, -8, 135, 786, -503, -503, -13, 789, -13, - -503, -476, -476, 183, -346, -350, -347, -349, -348, 775, - -352, -351, 217, 218, 179, 221, 223, 228, 224, 225, - 226, 227, 229, 230, 231, 232, 233, 236, 237, 238, - 239, 240, 241, 234, 40, 235, 301, 213, 214, 215, - 216, -355, 200, 219, 631, 260, 201, 261, 202, 262, - 203, 263, 177, 178, 264, 204, 207, 208, 209, 210, - 206, 242, 243, 244, 245, 246, 247, 248, 249, 251, - 250, 252, 253, 254, 255, 256, 257, 258, 259, 182, - -307, 102, 41, 96, 182, -339, 102, -749, -281, -282, - -287, -271, 25, -339, -330, 182, 787, -452, -476, 521, - 138, 519, -126, 520, 87, 519, -126, 520, 279, -126, - 87, -702, -703, -704, -706, 279, 520, 519, 280, 350, - -149, 182, 323, 25, -483, -483, -476, 93, -308, -309, - -339, -341, -339, -733, -732, 41, 628, -312, 32, 566, - 746, 748, 544, 754, 763, 764, 765, 92, -488, 146, - 150, -488, -432, 26, -432, 32, 32, 313, 313, 313, - -488, 353, -762, -763, 25, 148, -486, -763, -486, -486, - -488, -764, 286, 554, 52, 314, 313, -284, -285, 30, - 96, -284, 548, 544, -591, 549, 550, -490, -763, -489, - -488, -488, -489, -488, -488, 394, -488, 41, 389, 390, - 284, 287, 584, 388, 734, -762, -762, 40, 40, -542, - 315, -569, -540, 45, 92, 183, 288, 183, 92, 96, - 465, 440, 502, 466, 584, 284, 479, 287, 315, 480, - 440, 502, 284, 287, 584, 315, 440, 284, 287, 502, - 315, 480, 440, 543, 544, 287, 36, 470, 473, 474, - 544, -654, 580, -339, 183, 127, 124, 126, -503, 145, - -518, 138, 139, 140, 141, 142, 143, 144, 152, 151, - 164, 157, 158, 159, 160, 161, 162, 163, 153, 154, - 155, 156, 148, 128, 167, 784, 146, 150, 147, 130, - 125, 170, 169, -251, -503, -511, 71, -501, -501, -501, - -501, -501, -476, -608, -508, -503, 96, 96, 96, 96, - 96, 182, 115, 102, 96, -503, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, -647, - 96, 96, -515, -516, 96, 96, -496, -452, 96, 102, - 102, 96, 96, 96, 102, 96, 96, 96, -516, -516, + -1000, -763, -767, -12, -8, -9, -11, -161, -124, 732, + -14, -23, -163, -149, -164, -15, -158, -17, -18, -19, + -220, -21, -131, -153, -155, -157, -156, -69, -66, -63, + -20, -150, -151, -152, -109, -110, -134, -142, -145, -146, + -147, -148, -165, -159, -160, -162, -252, -166, -175, -176, + -227, -179, -181, -182, -215, -216, -246, 721, -125, -126, + -127, -128, -129, -130, -43, -42, -41, -40, -207, -217, + -221, -223, -177, -57, 637, 727, 766, 538, -16, -706, + -645, 591, -24, -25, -119, -26, 278, 305, -487, -132, + -488, -489, -491, -768, -70, -71, -72, -85, -86, -87, + -88, -89, -99, -100, -101, -73, -74, -75, -78, -76, + -92, -91, -93, -94, -95, -96, -97, -98, -77, -81, + -210, -211, -212, -213, -102, -79, -80, -225, -228, -178, + -103, -104, -105, -82, -60, -61, -83, -84, 298, 769, + -107, -106, -112, -118, -108, -113, -209, -219, -22, -226, + -114, -59, -65, -116, -117, -115, 279, 350, -111, 86, + -135, -136, -137, -138, -139, -140, -141, -143, -144, 463, + 469, 525, 719, 720, 71, -254, -256, -258, 774, 775, + 778, 622, 624, 323, 186, 187, 189, 190, 194, 197, + -44, -45, -46, -47, -62, -48, -49, -51, -50, -52, + -53, -54, -55, -56, 274, 22, 20, 24, 64, -27, + -30, -28, -31, -29, -38, -39, -37, -32, -34, -208, + -214, -33, -218, -222, -224, -180, -58, -64, -35, -36, + 300, 299, 47, 366, 367, 368, 467, 275, 277, 23, + 40, 51, 442, -257, -261, 96, -264, -260, 623, 276, + -259, -263, 21, 284, 792, -13, -10, -9, -194, -198, + -202, -205, -206, -203, -204, -11, -161, 131, 290, 722, + -483, 459, 723, 725, 724, 99, 107, -476, -478, 766, + 538, 305, 769, 463, 469, 719, 720, 775, 778, 622, + 624, 323, 639, 640, 641, 642, 643, 644, 645, 646, + 648, 649, 650, 651, 652, 653, 654, 697, 698, 664, + 665, 655, 656, 657, 658, 659, 660, 661, 662, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 594, 595, 699, 701, 702, 703, 704, + 647, 684, 692, 693, 694, 783, 784, 768, 770, 771, + 772, 773, 440, 6, 7, 8, 9, 10, 441, 630, + 716, 781, 317, 341, 492, 347, 354, 421, 186, 204, + 200, 229, 219, 427, 373, 745, 746, 372, 623, 195, + 321, 359, 322, 106, 189, 577, 121, 550, 521, 192, + 379, 382, 380, 381, 336, 338, 340, 453, 343, 342, + 344, 346, 621, 377, 443, 215, 209, 335, 319, 207, + 324, 428, 49, 325, 419, 418, 234, 326, 327, 634, + 546, 439, 552, 351, 62, 519, 208, 339, 549, 715, + 242, 246, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 568, 425, 406, 407, 408, 409, 569, 430, + 177, 178, 554, 744, 751, 752, 753, 755, 756, 757, + 754, 424, 571, 429, 233, 236, 237, 238, 239, 240, + 241, 297, 415, 416, 431, 432, 433, 434, 435, 437, + 438, 52, 632, 309, 572, 244, 762, 223, 232, 227, + 580, 355, 353, 420, 231, 203, 226, 320, 790, 767, + 75, 248, 247, 249, 515, 516, 517, 518, 328, 329, + 457, 567, 747, 748, 222, 210, 444, 196, 31, 575, + 304, 551, 470, 383, 57, 384, 330, 348, 356, 378, + 243, 245, 311, 316, 371, 426, 633, 523, 524, 315, + 559, 560, 352, 573, 206, 308, 337, 303, 576, 763, + 749, 197, 789, 472, 331, 190, 345, 570, 765, 579, + 74, 172, 202, 193, 739, 740, 294, 700, 187, 313, + 318, 717, 764, 332, 333, 334, 358, 357, 349, 194, + 224, 310, 230, 213, 201, 225, 188, 312, 578, 173, + 713, 442, 502, 221, 218, 314, 287, 718, 574, 553, + 191, 506, 175, 216, 360, 707, 708, 709, 712, 458, + 414, 361, 362, 214, 301, 544, 545, 365, 512, 401, + 486, 522, 493, 487, 265, 266, 369, 556, 558, 235, + 710, 385, 386, 387, 548, 388, 389, 390, 391, 396, + 462, 66, 68, 108, 111, 110, 776, 777, 73, 38, + 448, 451, 484, 791, 488, 403, 714, 631, 400, 404, + 405, 452, 34, 504, 474, 508, 507, 58, 59, 60, + 63, 64, 65, 67, 69, 70, 61, 620, 467, 481, + 581, 54, 56, 477, 478, 36, 454, 503, 526, 399, + 505, 537, 55, 535, 536, 557, 35, 456, 455, 72, + 53, 511, 513, 514, 363, 397, 465, 728, 582, 460, + 476, 480, 461, 402, 450, 482, 77, 473, 729, 468, + 466, 785, 786, 398, 635, 636, 410, 663, 445, 520, + 617, 616, 615, 614, 613, 612, 611, 610, 366, 367, + 368, 489, 490, 491, 501, 494, 495, 496, 497, 498, + 499, 500, 540, 541, 730, 731, 561, 563, 564, 628, + 565, 562, 282, 780, 779, 446, 447, 285, 733, 734, + 109, 735, 737, 736, 37, 738, 761, 758, 759, 760, + 638, 566, 625, 741, 627, 626, 685, 686, 687, 688, + 689, -572, -570, -483, 769, 623, 323, 766, 719, 720, + 469, 622, 624, 463, 442, 775, 778, 64, 467, 305, + 366, 367, 368, 538, 440, -331, -483, 284, 779, -111, + -25, -24, -16, -645, -119, -257, -258, -772, 271, 273, + 478, -346, 284, -483, -492, 32, 519, 279, 280, -133, + 520, 96, 87, -483, -17, -147, -15, -158, -109, -252, + -706, 525, -490, -483, 366, 366, 628, -490, 743, 524, + 565, 628, 744, 751, 762, 560, 453, 110, 111, 739, + 740, 36, 284, 464, 311, 558, 556, 557, 561, 562, + 563, 564, -90, -657, -633, 553, 644, 552, -496, 545, + 551, 543, 555, 546, 441, 391, 388, 637, 390, 395, + 274, 733, 768, 619, -471, 486, 522, 581, 582, 465, + 523, 568, 570, 547, 121, 220, 217, 768, 284, 284, + -485, 315, 500, -483, -634, 290, -576, -547, 316, -575, + -549, -578, -550, 41, 274, 276, 275, 637, 312, 24, + 467, 286, 22, 21, 468, 298, 34, 35, 37, 23, + 469, 471, 38, 472, 475, 476, 477, 51, 481, 482, + 305, 99, 107, 102, 685, 686, 687, 688, 689, 323, + 284, -330, -483, -518, -510, 128, -513, -505, -506, -508, + -461, -678, -503, 96, 157, 158, 165, 129, 167, 793, + -507, -615, 45, 131, 643, 647, 684, 592, -453, -454, + -455, -456, -457, -458, 629, -483, -679, -677, 102, 112, + 114, 118, 119, 117, 115, 180, 211, 116, 103, 181, + -258, 99, -700, 653, 659, -477, 676, 701, 702, 703, + 704, 675, 71, -641, -655, 283, -653, 179, 217, 301, + 213, 22, 163, 512, 214, 692, 693, 694, 650, 672, + 594, 595, 699, 654, 783, 784, 664, 679, 645, 646, + 648, 640, 641, 642, 644, 655, 657, 671, -656, 667, + 677, 678, 663, 695, 696, 758, 697, 698, 680, 681, + 682, 691, 690, 683, 685, 686, 687, 688, 689, 737, + 101, 100, 670, 669, 656, 651, 652, 658, 639, 649, + 660, 668, 673, 674, 451, 121, 452, 453, 584, 443, + 90, 454, 290, 519, 9, 80, 455, 456, 457, 458, + 243, 459, 591, 460, 789, 81, 461, 450, 305, 502, + 462, 216, 235, 597, 596, 598, 588, 585, 583, 586, + 587, 589, 590, 661, 662, 666, -255, -257, -706, -258, + -183, -185, 705, -756, -294, -757, -443, 31, -758, 12, + 13, 14, 15, 181, -747, 521, 633, 102, 584, 284, + 359, 440, 25, 743, 395, 621, 743, 395, 621, 373, + 191, 188, -562, 191, 127, 197, 196, 288, 191, -562, + -483, 194, 743, 193, 739, 744, 751, 628, 369, -534, + 768, -231, 440, 502, 388, 108, 315, -539, -535, -635, + 363, 359, 285, 124, -232, 295, 436, 294, 122, 584, + 283, 479, 354, 66, 68, 41, 54, -278, 57, 289, + 48, -346, -708, 618, -707, -483, -716, -717, 271, 272, + 273, 48, 744, 751, 285, 287, 284, 739, 628, 315, + 440, -535, 502, 768, 108, 388, 284, -716, 762, 188, + 568, 570, 521, 315, 500, 50, -569, 512, -568, -570, + 569, 580, 100, 101, 567, -471, 121, 544, 544, -756, + -443, -757, -289, -443, -288, 17, -254, -258, -261, -265, + -706, -267, 71, 621, 743, 628, 744, 751, 285, 440, + 502, 315, 286, -635, 287, 584, 283, 366, 464, 311, + 768, 388, 395, 108, 193, 739, -271, -272, -273, 267, + 268, 269, 79, 272, 270, 76, 41, 42, 43, -346, + -8, 135, 792, -510, -510, -13, 795, -13, -510, -483, + -483, 183, -353, -357, -354, -356, -355, 781, -359, -358, + 217, 218, 179, 221, 223, 228, 224, 225, 226, 227, + 229, 230, 231, 232, 233, 236, 237, 238, 239, 240, + 241, 234, 40, 235, 301, 213, 214, 215, 216, -362, + 200, 219, 631, 260, 201, 261, 202, 262, 203, 263, + 177, 178, 264, 204, 207, 208, 209, 210, 206, 242, + 243, 244, 245, 246, 247, 248, 249, 251, 250, 252, + 253, 254, 255, 256, 257, 258, 259, 182, -314, 102, + 41, 96, 182, -346, 102, -756, -288, -289, -294, -278, + 25, -346, -337, 182, 793, -459, -483, 521, 138, 519, + -133, 520, 87, 519, -133, 520, 279, -133, 87, -709, + -710, -711, -713, 279, 520, 519, 280, 350, -156, 182, + 323, 25, -490, -490, -483, 93, -740, -739, 41, 628, + -319, 32, 566, 746, 748, 544, 754, 763, 764, 765, + 92, -495, 146, 150, -495, -439, 26, -439, 32, 32, + 313, 313, 313, -495, 353, -769, -770, 25, 148, -493, + -770, -493, -493, -495, -771, 286, 554, 52, 314, 313, + -291, -292, 30, 96, -291, 548, 544, -598, 549, 550, + -497, -770, -496, -495, -495, -496, -495, -495, 394, -495, + 41, 389, 390, 284, 287, 584, 388, 768, 734, 772, + 287, -769, -769, 40, 40, 287, -315, -316, -346, -348, + -346, -549, 315, -576, -547, 45, 92, 183, 288, 183, + 92, 96, 465, 440, 502, 466, 584, 284, 479, 287, + 315, 480, 440, 502, 284, 287, 584, 315, 440, 284, + 287, 502, 315, 480, 440, 543, 544, 287, 36, 470, + 473, 474, 544, -661, 580, -346, 183, 127, 124, 126, + -510, 145, -525, 138, 139, 140, 141, 142, 143, 144, + 152, 151, 164, 157, 158, 159, 160, 161, 162, 163, + 153, 154, 155, 156, 148, 128, 167, 790, 146, 150, + 147, 130, 125, 170, 169, -258, -510, -518, 71, -508, + -508, -508, -508, -508, -483, -615, -515, -510, 96, 96, + 96, 96, 96, 182, 115, 102, 96, -510, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, -654, 96, 96, -522, -523, 96, 96, -503, -459, + 96, 102, 102, 96, 96, 96, 102, 96, 96, 96, + -523, -523, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - -749, -250, -282, 183, 96, -281, -282, -288, 29, -287, - -252, -251, -256, -260, -503, -752, 729, 41, 42, 41, - 42, 41, 42, 41, 42, 96, 112, 770, 265, -297, - -476, -298, -476, -184, 25, 787, -476, 739, -732, 389, - 628, 628, 389, 628, 274, 24, 377, 64, 378, 573, - 20, 195, 196, 197, -476, 194, 288, -476, -525, 290, - -525, -525, 745, 521, -525, -322, -476, 311, 464, 287, - 287, -225, -525, 25, -525, -525, -525, -525, 286, -525, - 284, 284, 284, -525, 591, 138, 138, 69, -640, -643, - -639, -642, 48, 132, -643, -302, 307, -271, -271, -339, - 183, -701, -293, 96, -711, 199, -274, -273, -268, -270, - -435, -437, -272, 96, -339, -251, 5, -476, 745, 521, - -627, -627, -339, -627, -476, 290, -543, -627, 619, -465, - -524, -476, -521, 220, 50, 169, -627, -627, -627, -418, - -419, -339, -712, 289, 765, -746, -745, 571, -748, 573, - 188, -563, 188, -563, 99, -542, 315, 315, 183, 138, - 32, -564, 138, 149, -563, -563, -564, -564, -387, 50, - -475, 179, -476, 102, -387, 50, -743, -742, -339, -282, - -252, -251, -256, -260, -286, -285, -287, -255, -252, -256, - -251, 71, 29, 97, 97, -282, -282, -436, -176, 628, - -627, -627, 745, 521, -627, -627, -627, -627, -627, 284, - -627, -627, -627, -483, -627, -324, 290, -627, 389, -627, - -627, -627, -261, -263, 159, -503, -476, -266, -10, -189, - -188, 132, 133, 135, 723, 459, 722, 726, 719, -563, - 50, -621, 173, 172, 96, -615, -617, 96, -616, 96, - -616, -616, -616, 218, 221, -615, -615, -616, -616, -616, - -616, -616, -616, 96, 96, -618, 96, -618, -618, -615, - -619, 212, 96, -619, -620, 96, -620, -619, -476, -595, - 20, -509, -511, -476, 288, 48, -282, -179, -287, 48, - -285, -288, -294, 307, 108, -331, 750, -476, 214, 193, - 738, 44, 182, 112, 102, -707, 233, 224, 138, -126, - 87, -149, 138, -126, -126, -149, 97, 183, -705, 118, - 119, -707, 102, -476, -147, 102, -670, -14, -20, -125, - -15, -151, -17, -19, -62, -102, 40, -153, -143, -239, - -245, -480, 298, 622, 624, -673, -671, -310, 183, 438, - 96, -311, 183, 546, 32, -476, -284, 633, -165, 32, - -488, 25, 148, -488, -488, 25, 148, -488, 315, -432, - -501, -501, -503, 440, 584, 284, -544, 597, 315, -475, - -762, -488, -488, -466, -465, -490, -485, -490, -490, -432, - -486, -488, -488, -503, 159, -490, -486, -432, -476, 544, - -432, -432, -591, -465, -488, 102, -487, -476, -487, -525, - -465, -466, -466, 41, 511, 92, 25, -570, 284, 584, - 464, 311, 287, 440, -568, -549, -546, -544, -542, -545, - -544, -573, -452, 544, -180, 527, 526, 365, 25, -503, - -503, -503, -503, 117, 128, 167, 414, 118, 119, -498, - -519, 41, 361, 362, -499, -499, -499, -499, -499, -499, - -499, -499, -499, -499, -499, -499, -501, -501, -507, -517, - -608, 96, 148, 146, 150, 147, 130, 148, 146, 150, - 147, 130, -768, 33, -501, -501, -499, -499, -501, -344, - -346, 172, 173, -389, -475, 179, 97, 183, -503, -698, - -697, 132, -503, -503, -503, -503, -533, -535, -452, 96, - -476, -499, -694, -695, 599, 600, 601, 602, 603, 604, - 605, 606, 607, 608, 609, 455, 450, 456, 454, 443, - 462, 457, 458, 216, 616, 617, 610, 611, 612, 613, - 614, 615, -509, -509, -503, -694, -499, -509, -445, 42, - 41, -511, -511, -511, 97, -503, -708, 412, 411, 413, - -453, -476, -509, 97, 97, 97, 112, -511, -511, -509, - -499, -509, -509, -509, -509, -695, -695, -696, 301, 213, - 215, 214, -445, -503, -503, -445, -445, -445, 159, -511, - -511, -445, -445, -445, -445, 159, -445, -445, -445, -445, - -445, -445, -445, -445, 97, -445, -445, -445, -445, -445, - 97, 97, 97, 97, -503, 97, -503, -503, -503, -503, - -503, 159, -511, -282, -749, -286, -178, -652, -651, -503, - 50, -179, -287, -285, -179, 680, -288, -753, 731, 96, - -452, -741, 102, 102, 787, -184, 25, 182, 284, -184, - 182, 739, 193, -184, 584, 25, -476, 102, 112, -476, - 102, 112, 284, 584, 284, 584, -339, -339, -339, 574, - 575, 192, 196, 195, -476, 194, -476, -476, 128, 167, - -476, -476, -525, -525, -476, 44, -324, -313, -476, -525, - -525, -716, -476, 103, 102, -550, -547, -544, -476, -476, - -540, -476, -465, -525, -525, -525, -339, -398, 63, 64, - 65, -544, -226, 66, 67, -245, -639, -641, -642, 134, - -339, -503, -641, -637, 71, -245, 96, 40, 96, -302, - -302, -700, 44, -292, -476, -712, 93, -438, -439, -440, - -441, -443, -444, -442, 78, 82, 84, 88, 79, 80, - 81, 547, 85, 90, 779, 83, -474, -479, 44, -476, - 102, -474, -251, -276, -275, -274, 787, -474, 96, 96, - -476, -476, -339, -339, -412, -420, -417, -413, 281, -421, - 307, 275, 448, 449, 277, 17, 276, -429, 354, -526, - 592, -393, -394, 87, 51, -396, 305, 488, 484, 785, - 317, 321, 106, 322, 521, 323, 286, 325, 326, 327, - 342, 344, 297, 328, 329, 330, 512, 331, 187, 343, - 332, 333, 334, 466, -388, 12, 396, 50, 61, 62, - 536, 535, 635, 20, 318, -476, 491, 624, 40, 45, - 277, 281, 276, -716, -714, 40, -476, -524, 40, -521, - 40, 220, 169, -472, 138, -550, -544, -476, -476, 183, - 288, -274, -276, -563, 183, 572, 574, 575, -746, -564, - -746, -564, 288, 41, 511, -567, 511, 41, -540, -561, - 568, 570, -556, 102, 512, -545, -566, 92, 179, -651, - -564, -564, -566, -566, 169, 183, -744, 573, 574, 271, - -286, -176, -280, -279, -503, -286, -286, -259, -252, -260, - -256, -251, 112, -734, -732, -476, 628, -476, -627, -627, - -341, -716, -549, -540, -476, -627, -341, -478, -478, -313, - 45, -476, -627, -476, -476, -476, -179, 183, -477, -476, - 44, 102, 182, -190, -188, 134, -503, -13, 722, -503, - -13, -13, -503, -13, -503, -625, 175, -346, 112, 112, - -455, 102, -455, 112, -619, 112, 112, 638, 97, 102, - 102, -286, -288, 706, -674, -670, -288, -179, -644, 71, - -245, 96, 40, 96, -627, 193, 214, 749, -330, 138, - 138, 138, 33, -476, 32, -126, -126, -707, 102, -149, - -707, 102, -126, -703, 182, -562, 519, 520, 183, -309, - -292, -339, 637, 112, -167, 30, -476, -432, -476, 745, - -432, -432, -476, 745, 747, -432, -543, -476, -476, -476, - -541, 93, -647, -476, 790, 100, -466, -432, -432, -490, - -432, -432, 183, 31, 97, -488, -490, -490, -330, -486, - -330, 182, -330, -465, -570, -548, -545, -572, 159, -476, - -557, 183, 20, 288, -729, -728, 503, 97, 183, -655, - 289, 591, 102, 787, 519, 265, 266, 102, 117, 414, - 118, 119, 117, 414, 118, 119, -608, -511, -507, -501, - -501, -499, -499, -507, -501, -501, -499, -499, 96, -505, - 302, -505, 127, -354, 178, 177, -354, -503, 788, -502, - -697, 134, -503, 44, 183, 44, 183, 93, 183, 97, - -615, -503, 182, 183, 97, 97, 25, 25, 148, 97, - -503, 97, 97, 97, 97, 25, 25, -503, 97, 182, - 97, 97, 97, 97, 93, 97, 183, 97, 97, 97, - 97, 183, 183, 183, -511, 97, 97, -511, -503, -511, - 97, 97, 97, -503, -503, -503, -511, 97, -503, -503, - -503, -503, -503, -503, -503, -503, 776, -503, -503, -511, - -503, -503, -580, 539, -580, -580, -580, 97, -580, 97, - 183, 97, 183, 97, 97, 183, 183, 183, -286, -282, - 183, 97, -288, -288, 20, -179, -754, 730, 96, 112, - 183, 771, -459, -458, 102, -186, 288, 193, 739, -476, - -476, -186, -476, -476, 138, -186, -476, 739, 102, 102, - -339, -465, -339, -465, 630, 48, 48, 193, 197, 197, - 196, -476, 102, 45, 45, 32, 32, 352, -476, -476, - -160, 625, -323, 96, 96, 182, -339, -339, -718, 489, - -476, -730, 183, 50, -728, 584, -222, 365, -529, -530, - 93, -235, 372, 25, -339, -339, -339, -353, 44, -245, - -640, 71, 96, 133, -245, -554, -553, 92, -645, -512, - -692, 705, -301, 97, -289, -476, -690, -691, -289, -295, - -303, -476, -637, -637, 96, 97, 183, 25, -267, -340, - -476, -274, -273, -273, -273, -273, -273, -273, -273, 78, - 89, 78, -290, 96, 78, 83, 78, 83, 78, 83, - 78, -440, 78, 78, 80, 89, -293, -479, 183, 97, - 99, -739, -738, -737, -735, 86, 289, 87, -503, -509, - 40, 40, 62, 61, -614, 44, -293, 183, 307, -338, - -473, -335, -337, 292, -493, -336, 295, 436, -686, 293, - 291, 122, 296, 350, 123, 286, 29, 417, -473, -415, - 286, 350, 293, -473, -473, 292, -397, 288, 44, 29, - 307, -414, 286, 123, -476, 292, 296, 293, 350, 291, - -472, -464, 169, 288, 52, 466, -472, 636, 307, -472, - -472, -472, -472, -472, -472, -472, -472, 324, 324, -472, - -472, -472, -472, -472, -472, -472, -472, -472, -472, -472, - 188, -472, -472, -472, -472, -472, -472, 96, 319, 320, - 352, 625, 132, 638, 627, -543, 288, 559, 559, -719, - 489, 40, 446, 446, 447, -472, 40, -472, -389, -730, - 442, 51, 40, -236, 440, -419, -416, -487, 40, 40, - -564, -745, -747, 576, 573, 579, -566, -566, 112, 288, - 96, 138, -566, -566, 50, -475, -742, 580, 574, -288, - 183, -277, 46, 47, 97, 97, -320, 741, -476, -476, - 92, -341, -630, 345, 346, 96, -324, 102, 25, -320, - -431, -430, 25, -263, -476, 102, -476, 159, 135, -13, - 133, -194, -193, -192, 136, 719, 726, 135, 135, 135, - 97, 97, 97, 97, 183, 97, 97, 97, 183, 97, - 183, 112, 767, -658, 549, -288, -179, 102, 183, -179, - -262, 774, -645, -301, 97, -690, -295, -476, 102, 112, - 102, 44, -234, 99, 107, 102, -331, -503, -476, 102, - -503, 214, 182, 521, -126, -126, -126, -126, -476, 138, - -671, 97, 112, -488, -476, -488, 182, -476, -231, -233, - -476, 102, -476, -540, -541, -475, -488, -432, -503, -503, - 553, 552, -432, -488, -488, -490, -476, -330, -572, 183, - 288, 182, 182, -546, 469, -548, 29, 20, -452, 48, - -459, 138, 787, -476, 97, -505, -505, 127, -505, -505, - 127, -501, -501, -498, 97, 135, -503, 133, -344, 217, - -503, -344, -345, -351, 233, 179, 217, 301, 216, 215, - 213, 172, 173, -387, -535, 630, -277, 97, -476, -511, - -503, -503, -499, 97, -503, -503, 25, -476, -387, -499, - -503, -503, -503, -282, -283, 776, -283, -282, 97, 97, - -579, -580, -579, -283, 97, 97, 97, 97, -579, 97, - 97, 97, 97, 97, 97, 97, 97, 27, 97, 97, - 97, 97, 183, -476, 96, -580, -766, 783, -503, -766, - -503, -766, -766, -503, 112, 114, 112, 114, -288, -286, - -651, -179, -179, 470, 96, 307, 183, 112, 102, 788, - 183, 138, 440, -185, -476, 102, -476, 25, 25, 182, - 102, -476, 102, 25, 284, -476, 25, 25, -339, -339, - -339, 197, 102, -731, 359, 440, 584, 284, 440, 359, - 584, 284, -596, 112, -363, 20, -367, 20, -161, 132, - 102, 477, -325, -326, -327, -328, -329, 148, 184, 185, - -314, -315, -316, -317, -346, -452, 775, 218, 221, 223, - 224, 225, 226, 227, 229, 230, 231, 232, 233, 236, - 237, 238, 239, 240, 241, 234, 235, 301, 213, 214, - 215, 216, 200, 219, 631, 201, 202, 203, 177, 178, - 204, 207, 208, 209, 210, 206, 242, 243, 244, 245, - 246, 247, 248, 249, 251, 250, 252, 253, 254, 255, - 256, 257, 258, 259, -476, -293, -293, -721, 551, 491, - 501, -472, 388, -495, -494, 442, 51, -632, 512, 497, - 498, -547, 315, -465, 159, -727, 109, 138, 92, 400, - 404, 406, 408, 407, 405, 401, 402, 403, -522, -523, - -520, -526, -465, 102, -714, 96, -246, -230, -229, 146, - -235, 372, 25, -245, 71, 289, 591, 96, -362, 327, - 96, -609, 385, -346, 96, -301, -640, -262, 49, 183, - 96, 97, 183, 71, 182, 183, 138, 97, 183, 97, - 183, 138, -262, -262, -553, -8, -476, -339, -267, -476, - 25, 183, -713, 182, 92, -305, -304, 92, 93, -305, - -305, -304, -304, 78, -291, 102, 78, 78, 78, 78, - 83, -275, -274, -737, -736, 32, -686, -686, -686, 183, - 97, -364, 96, -365, -232, -476, 102, -368, 96, -369, - -370, -476, 102, -609, -346, 44, -413, 281, 275, 276, - -600, 96, -343, 96, -452, -336, -685, -686, -685, -525, - -476, 123, -685, 123, 96, -576, 352, 353, -577, -598, - 355, -476, -452, -476, -476, -476, -343, -452, -452, -416, - -424, -423, -452, -427, 41, -428, -476, -476, -476, -476, - 123, -476, -476, 123, -392, 50, 58, 59, 60, -472, - -472, 220, -395, 50, 511, 513, 514, -427, 112, 112, - 112, 112, 112, 102, 102, 102, -472, -472, 112, 102, - -479, 102, -687, 196, 54, 55, 112, 112, 112, 112, - 50, 102, -400, 50, 335, 339, 336, 337, 338, 102, - 112, 50, 112, 50, 112, 50, -476, 96, -688, -689, - 102, -596, 102, 96, 112, 102, 277, -543, 102, 92, - -721, -472, 446, -563, 138, 138, -387, -472, -389, -495, - -723, 106, 492, -723, -726, 365, -238, 584, 41, -296, - 281, 276, -714, -552, -551, -452, -552, -566, 573, 577, - 578, -548, -491, 102, -556, -179, -279, -278, 53, -339, - -630, -314, -476, -432, -276, 182, 131, -13, -190, -192, - -503, -13, -503, 722, 459, 723, 102, 112, 112, 575, - -666, 533, 528, 530, -179, -667, 519, -670, -261, 97, - 71, 97, 33, 788, 788, 788, 788, 102, -476, 112, - 102, -432, -488, -432, -231, -488, -488, 148, -432, -330, - -432, -432, -488, 25, -545, -540, 159, 159, -476, 470, - -557, 102, 490, 102, 284, 788, 102, -459, -498, -498, - 97, -503, 97, -616, 44, 97, 97, -616, -616, -615, - -618, -615, -354, -354, 97, 96, -277, 97, 97, 32, - 97, 97, -579, 97, 97, -503, 182, 97, 97, 183, - 183, 97, -635, 593, -579, 27, -579, -636, 665, -579, - -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, - -579, -579, -579, -579, 96, -579, -579, -579, -579, -503, - -581, -585, -476, -580, 53, 97, 183, -580, 97, 183, - -580, -580, 97, 534, 736, 736, 534, 736, 736, -179, - -288, -511, -755, 73, 728, 72, 511, 117, 355, 97, - -694, 183, -467, 360, -467, -458, 102, -476, 102, 193, - 739, -476, 788, 788, 193, 739, -476, 102, -339, -465, - -299, 550, -242, 132, -243, 130, 52, 102, -476, 25, - -476, -476, 352, -476, 352, -476, -476, 102, 96, 96, - -166, 638, 96, -163, 626, 102, 97, 183, -452, 97, - 183, -346, 44, 44, -722, 106, -717, 102, -476, 103, - -476, -723, 181, 444, 50, 493, 494, 509, 439, 112, - 112, 499, -715, -476, -237, 284, 440, -237, -725, 62, - 138, 102, -339, -520, -464, 169, 326, -330, -476, 388, - -332, -333, -334, -343, -335, -337, -246, 44, -339, -339, - 102, -176, -332, -472, -332, -610, 387, 29, 112, 158, - -511, 97, 123, -512, -653, -652, 71, -245, -289, -645, - -476, -691, -651, -476, -476, -503, -262, 97, -294, 93, - 182, -276, -340, -476, 159, -503, -503, 96, -269, 780, - 97, 78, 788, 96, 78, 17, 27, 102, 183, -364, - 138, 183, -368, 138, -610, -245, -473, -601, -599, 307, - -422, 54, 56, -759, -343, -346, -683, -476, -683, -681, - -683, -476, -681, -681, -525, -503, -593, 356, 96, -591, - 96, -591, 123, 401, 404, 406, 408, 407, 436, 40, - 276, -425, 404, 398, 399, -558, 351, 128, 167, -558, - -422, -343, 288, 183, -277, 183, -476, -387, -387, 40, - 102, 102, -341, 97, 183, 138, 102, -163, -162, -503, - -247, -251, 288, 92, 284, -722, -717, 138, -564, 102, - 102, -387, -723, 102, 102, -727, 138, -342, 284, -465, - 183, -296, -296, -432, 25, 183, 138, -432, 97, -306, - 32, 51, 54, 55, 97, 388, -434, 27, 159, 135, - 133, 135, 135, -476, 97, 97, -622, 707, -662, -664, - 528, 29, 29, -306, -668, 712, 102, 71, -245, -645, - 214, 102, 788, -432, -488, -432, -432, 745, -432, -540, - -557, 512, -339, 183, 788, 220, -344, 220, -406, 102, - 103, -476, -503, 97, -476, -503, -503, 97, 102, 96, - 97, 102, -281, 97, 97, -514, -513, 307, -766, -503, - -766, -503, -767, 25, 97, 183, 97, 97, 97, 183, - 97, 97, -306, -179, 97, 183, 97, -694, -468, 214, - 102, -468, -185, -476, -185, -476, 25, -477, -240, 288, - -330, -244, 383, 96, 379, -242, 193, 96, 102, -476, - 25, -476, -596, 352, -596, 352, 284, -476, -320, -364, - -368, -164, 627, 112, -162, 102, -531, 632, -327, -346, - 282, -316, 50, -246, -246, 102, -720, 503, -597, 393, - 112, 50, 112, 181, 495, -633, -223, 106, -341, 41, - -296, -223, -724, 106, 138, 787, 96, -472, -472, -472, - -240, 388, -476, 97, 183, -246, -241, 60, -476, -282, - 97, 744, 97, -611, 306, 112, 158, 112, 158, 112, - 97, 71, 23, 289, 97, -645, 182, 138, -474, -276, - -476, -432, -713, 182, -113, -114, 132, -292, -500, 181, - -682, -476, 291, 29, 29, 550, -365, 97, -233, -369, - 97, -371, -476, 102, -611, 96, 97, 183, -476, -452, - 97, 183, -359, -358, -356, 117, 128, 167, 50, 484, - -357, 106, 752, 753, 169, 340, 343, 342, 318, 341, - -411, -492, 92, 700, 487, 398, 399, -526, 715, 44, - 291, 122, 123, 471, -493, 96, 96, 96, 93, 360, - 96, 96, -683, 97, -578, 357, 112, -499, 96, -499, - 96, -592, 354, 96, -536, -536, -536, -536, -536, 50, - -425, 50, -426, 423, 351, 351, -422, -452, -423, -476, - 169, -387, 97, -689, 102, 97, -543, 284, -476, -720, - 102, -566, -725, 102, -223, -341, -714, -282, -276, -551, - -651, -262, 23, 74, 148, -476, -433, 28, 29, 290, - -13, 723, 459, -402, 708, 102, 29, 102, -660, 102, - -658, 102, -645, 102, -432, -476, -182, -399, -464, 323, - 40, 97, 40, -405, 148, 20, 97, 97, 97, -283, - -281, -579, 97, -579, -282, 29, -580, 97, -580, 97, - -766, 54, 102, 102, -306, -503, 97, 102, 102, 102, - 739, 440, -240, 44, 477, 30, 644, 384, -292, 380, - 381, 382, -476, 102, -511, -247, 787, 388, -476, 25, - 102, -596, 102, -596, -476, 352, 97, 97, 44, 102, - 97, 102, 102, -318, -346, -496, -227, 20, -227, 29, - 20, 181, 443, 50, 112, 50, 496, 102, -237, 138, - 118, 119, -460, -461, 102, -533, -387, -389, 102, -476, - -360, -246, -230, -229, -361, -429, -526, -334, -240, 36, - 388, -286, -181, -362, -366, -372, -378, -379, -180, 327, - -363, -360, -612, 187, 112, 158, 112, 112, 96, -552, - -476, -503, -432, -432, -262, 774, -114, -116, 128, 167, - -476, 97, 97, 183, 96, -612, -759, -599, -602, 71, - -343, -356, 117, 117, -499, 102, 102, 102, -389, -390, - 50, 339, 335, 138, 138, -391, 50, 319, 320, -401, - 96, 350, 23, 112, 220, 716, 96, 123, 123, -339, - -533, -533, -533, -684, 400, 401, 402, 410, 404, 405, - 403, 406, 407, 408, 409, -684, -533, -533, 96, -559, - -558, -600, 29, 97, -573, 97, -573, 96, 138, -499, - -537, 297, 415, 416, 106, 20, 398, 399, 420, 419, - 418, 424, 425, 429, 430, 426, 428, 427, 431, 435, - 432, 433, 434, 437, 421, 422, 64, 423, 443, 454, - 450, -499, -536, 138, -472, 169, -476, 182, -724, -284, - -432, 74, -583, 781, -503, -511, 758, 760, 761, -476, - -476, -456, 709, 112, 102, 530, -666, -488, -623, 710, - -656, -591, -387, 138, -387, -387, 97, 85, 631, 409, - 633, -579, 97, -579, -587, -586, -590, 534, 352, 542, - -511, -766, -766, -580, 97, 97, 97, -476, -476, -339, - 102, 112, 97, 127, 127, 97, 97, -463, -462, 102, - -476, 388, -476, -320, 102, -320, 102, 352, -596, -9, - 632, -228, 70, 580, 102, 103, 490, 102, 103, 112, - 443, -223, 102, 788, 183, 138, 97, -597, -574, 307, - -246, 44, 183, -429, -464, -476, -182, -472, -574, -629, - 196, 386, 20, 112, 158, 112, -511, -282, -262, -261, - -115, 127, -116, -116, -476, 291, -3, -1, -476, 7, - -613, 196, 386, 97, -607, -603, 96, -604, -429, 309, - 148, 102, 102, 112, 96, -646, 40, 44, -503, -534, - 96, 97, 97, 97, 97, 97, -533, -577, 97, 97, - 97, -573, 112, 97, -472, -472, 102, 102, 397, -472, - -472, -472, -472, -472, -472, 96, 102, 102, -472, -472, - -472, -472, -472, -472, 138, 138, -472, -472, -472, 118, - 119, -387, -472, 182, -476, -262, -262, 75, -584, -582, - -476, -631, 20, 759, 96, 96, 96, 29, -622, -432, - -624, 711, 102, -665, 533, -659, -657, 528, 529, 530, - 531, 102, 97, 632, 75, 75, 634, -589, 130, 495, - 499, -497, 103, -500, 112, 114, 211, -580, -580, 102, - -476, 102, 788, 183, 138, -476, 388, -320, -320, -596, - 102, -321, -476, 350, 512, -461, 102, -538, -575, 359, - 29, -246, -429, -472, -597, 751, 755, -386, 757, 756, - 68, -575, 386, 112, 158, 112, 97, -284, 133, -503, - -115, -115, 97, 183, 32, -346, -7, 6, 386, -607, - -604, -606, -605, 357, 310, 96, 97, -503, -515, -472, - 96, 97, -404, -403, 629, -533, -536, 93, -536, -536, - 93, -536, 93, -536, 93, 97, -594, 358, 97, 112, - 112, -476, 112, 112, 112, 112, 112, 112, -573, 112, + 96, 96, -756, -257, -289, 183, 96, -288, -289, -295, + 29, -294, -259, -258, -263, -267, -510, -759, 729, 41, + 42, 41, 42, 41, 42, 41, 42, 96, 112, 776, + 265, -304, -483, -305, -483, -191, 25, 793, -483, 739, + -739, 389, 628, 628, 389, 628, 274, 24, 377, 64, + 378, 573, 20, 195, 196, 197, -483, 194, 288, -483, + -532, 290, -532, -532, 745, 521, -532, -329, -483, 311, + 464, 287, 287, 287, -232, -532, 25, -532, -532, -532, + -532, 286, -532, 284, 284, 284, -532, 591, 138, 138, + 69, -647, -650, -646, -649, 48, 132, -650, -309, 307, + -278, -278, -346, 183, -708, -300, 96, -718, 199, -281, + -280, -275, -277, -442, -444, -279, 96, -346, -258, 5, + -483, 745, 521, -634, -634, -346, -634, -483, 290, -550, + -634, 619, -472, -531, -483, -528, 220, 50, 169, -634, + 287, -634, -634, -425, -426, -346, -719, 289, 765, -753, + -752, 571, -755, 573, 188, -570, 188, -570, 99, -549, + 315, 315, 183, 138, 32, -571, 138, 149, -570, -570, + -571, -571, -394, 50, -482, 179, -483, 102, -394, 50, + -750, -749, -346, -289, -259, -258, -263, -267, -293, -292, + -294, -262, -259, -263, -258, 71, 29, 97, 97, -289, + -289, -443, -183, 628, -634, -634, 745, 521, -634, -634, + -634, -634, -634, 284, -634, -634, -634, -490, -634, -331, + 290, 287, -634, 389, -634, -634, -634, -268, -270, 159, + -510, -483, -273, -10, -196, -195, 132, 133, 135, 723, + 459, 722, 726, 719, -570, 50, -628, 173, 172, 96, + -622, -624, 96, -623, 96, -623, -623, -623, 218, 221, + -622, -622, -623, -623, -623, -623, -623, -623, 96, 96, + -625, 96, -625, -625, -622, -626, 212, 96, -626, -627, + 96, -627, -626, -483, -602, 20, -516, -518, -483, 288, + 48, -289, -186, -294, 48, -292, -295, -301, 307, 108, + -338, 750, -483, 214, 193, 738, 44, 182, 112, 102, + -714, 233, 224, 138, -133, 87, -156, 138, -133, -133, + -156, 97, 183, -712, 118, 119, -714, 102, -483, -154, + 102, -677, -14, -20, -132, -15, -158, -17, -19, -69, + -109, 40, -160, -150, -246, -252, -487, 298, 622, 624, + -680, -678, -483, -291, 633, -172, 32, -495, 25, 148, + -495, -495, 25, 148, -495, 315, -439, -508, -508, -510, + 440, 584, 284, -551, 597, 315, -482, -769, -495, -495, + -473, -472, -497, -492, -497, -497, -439, -493, -495, -495, + -510, 159, -497, -493, -439, -483, 544, -439, -439, -598, + -472, -495, 102, -494, -483, -494, -532, -472, 287, 773, + -473, -473, -346, -317, 183, 438, 96, -318, 183, 546, + 32, 41, 511, 92, 25, -577, 284, 584, 464, 311, + 287, 440, -575, -556, -553, -551, -549, -552, -551, -580, + -459, 544, -187, 527, 526, 365, 25, -510, -510, -510, + -510, 117, 128, 167, 414, 118, 119, -505, -526, 41, + 361, 362, -506, -506, -506, -506, -506, -506, -506, -506, + -506, -506, -506, -506, -508, -508, -514, -524, -615, 96, + 148, 146, 150, 147, 130, 148, 146, 150, 147, 130, + -775, 33, -508, -508, -506, -506, -508, -351, -353, 172, + 173, -396, -482, 179, 97, 183, -510, -705, -704, 132, + -510, -510, -510, -510, -540, -542, -459, 96, -483, -506, + -701, -702, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 455, 450, 456, 454, 443, 462, 457, + 458, 216, 616, 617, 610, 611, 612, 613, 614, 615, + -516, -516, -510, -701, -506, -516, -452, 42, 41, -518, + -518, -518, 97, -510, -715, 412, 411, 413, -460, -483, + -516, 97, 97, 97, 112, -518, -518, -516, -506, -516, + -516, -516, -516, -702, -702, -703, 301, 213, 215, 214, + -452, -510, -510, -452, -452, -452, 159, -518, -518, -452, + -452, -452, -452, 159, -452, -452, -452, -452, -452, -452, + -452, -452, 97, -452, -452, -452, -452, -452, 97, 97, + 97, 97, -510, 97, -510, -510, -510, -510, -510, 159, + -518, -289, -756, -293, -185, -659, -658, -510, 50, -186, + -294, -292, -186, 680, -295, -760, 731, 96, -459, -748, + 102, 102, 793, -191, 25, 182, 284, -191, 182, 739, + 193, -191, 584, 25, -483, 102, 112, -483, 102, 112, + 284, 584, 284, 584, -346, -346, -346, 574, 575, 192, + 196, 195, -483, 194, -483, -483, 128, 167, -483, -483, + -532, -532, -483, 44, -331, -320, -483, -532, -532, -532, + -723, -483, 103, 102, -557, -554, -551, -483, -483, -547, + -483, -472, -532, -532, -532, -346, -405, 63, 64, 65, + -551, -233, 66, 67, -252, -646, -648, -649, 134, -346, + -510, -648, -644, 71, -252, 96, 40, 96, -309, -309, + -707, 44, -299, -483, -719, 93, -445, -446, -447, -448, + -450, -451, -449, 78, 82, 84, 88, 79, 80, 81, + 547, 85, 90, 785, 83, -481, -486, 44, -483, 102, + -481, -258, -283, -282, -281, 793, -481, 96, 96, -483, + -483, -346, -346, -419, -427, -424, -420, 281, -428, 307, + 275, 448, 449, 277, 17, 276, -436, 354, -533, 592, + -400, -401, 87, 51, -403, 305, 488, 484, 791, 317, + 321, 106, 322, 521, 323, 286, 325, 326, 327, 342, + 344, 297, 328, 329, 330, 512, 331, 187, 343, 332, + 333, 334, 466, -395, 12, 396, 50, 61, 62, 536, + 535, 635, 20, 318, -483, 491, 624, 40, 45, 277, + 281, 276, -723, -721, 40, -483, -531, 40, -528, 40, + 220, 169, -479, 138, -557, -551, -346, -483, -483, 183, + 288, -281, -283, -570, 183, 572, 574, 575, -753, -571, + -753, -571, 288, 41, 511, -574, 511, 41, -547, -568, + 568, 570, -563, 102, 512, -552, -573, 92, 179, -658, + -571, -571, -573, -573, 169, 183, -751, 573, 574, 271, + -293, -183, -287, -286, -510, -293, -293, -266, -259, -267, + -263, -258, 112, -741, -739, -483, 628, -483, -634, -634, + -348, -723, -556, -547, -483, -634, -348, -485, -485, -320, + 45, -634, -483, -634, -483, -483, -483, -186, 183, -484, + -483, 44, 102, 182, -197, -195, 134, -510, -13, 722, + -510, -13, -13, -510, -13, -510, -632, 175, -353, 112, + 112, -462, 102, -462, 112, -626, 112, 112, 638, 97, + 102, 102, -293, -295, 706, -681, -677, -295, -186, -651, + 71, -252, 96, 40, 96, -634, 193, 214, 749, -337, + 138, 138, 138, 33, -483, 32, -133, -133, -714, 102, + -156, -714, 102, -133, -710, 182, -569, 519, 520, 274, + 183, 112, -174, 30, -483, -439, -483, 745, -439, -439, + -483, 745, 747, -439, -550, -483, -483, -483, -548, 93, + -654, -483, 796, 100, -473, -439, -439, -497, -439, -439, + 183, 31, 97, -495, -497, -497, -337, -493, -337, 182, + -337, -472, -346, -346, -316, -299, -346, 637, -577, -555, + -552, -579, 159, -483, -564, 183, 20, 288, -736, -735, + 503, 97, 183, -662, 289, 591, 102, 793, 519, 265, + 266, 102, 117, 414, 118, 119, 117, 414, 118, 119, + -615, -518, -514, -508, -508, -506, -506, -514, -508, -508, + -506, -506, 96, -512, 302, -512, 127, -361, 178, 177, + -361, -510, 794, -509, -704, 134, -510, 44, 183, 44, + 183, 93, 183, 97, -622, -510, 182, 183, 97, 97, + 25, 25, 148, 97, -510, 97, 97, 97, 97, 25, + 25, -510, 97, 182, 97, 97, 97, 97, 93, 97, + 183, 97, 97, 97, 97, 183, 183, 183, -518, 97, + 97, -518, -510, -518, 97, 97, 97, -510, -510, -510, + -518, 97, -510, -510, -510, -510, -510, -510, -510, -510, + 782, -510, -510, -518, -510, -510, -587, 539, -587, -587, + -587, 97, -587, 97, 183, 97, 183, 97, 97, 183, + 183, 183, -293, -289, 183, 97, -295, -295, 20, -186, + -761, 730, 96, 112, 183, 777, -466, -465, 102, -193, + 288, 193, 739, -483, -483, -193, -483, -483, 138, -193, + -483, 739, 102, 102, -346, -472, -346, -472, 630, 48, + 48, 193, 197, 197, 196, -483, 102, 45, 45, 32, + 32, 352, -483, -483, -167, 625, -330, 96, 96, 182, + -346, -346, -346, -725, 489, -483, -737, 183, 50, -735, + 584, -229, 365, -536, -537, 93, -242, 372, 25, -346, + -346, -346, -360, 44, -252, -647, 71, 96, 133, -252, + -561, -560, 92, -652, -519, -699, 705, -308, 97, -296, + -483, -697, -698, -296, -302, -310, -483, -644, -644, 96, + 97, 183, 25, -274, -347, -483, -281, -280, -280, -280, + -280, -280, -280, -280, 78, 89, 78, -297, 96, 78, + 83, 78, 83, 78, 83, 78, -447, 78, 78, 80, + 89, -300, -486, 183, 97, 99, -746, -745, -744, -742, + 86, 289, 87, -510, -516, 40, 40, 62, 61, -621, + 44, -300, 183, 307, -345, -480, -342, -344, 292, -500, + -343, 295, 436, -693, 293, 291, 122, 296, 350, 123, + 286, 29, 417, -480, -422, 286, 350, 293, -480, -480, + 292, -404, 288, 44, 29, 307, -421, 286, 123, -483, + 292, 296, 293, 350, 291, -479, -471, 169, 288, 52, + 466, -479, 636, 307, -479, -479, -479, -479, -479, -479, + -479, -479, 324, 324, -479, -479, -479, -479, -479, -479, + -479, -479, -479, -479, -479, 188, -479, -479, -479, -479, + -479, -479, 96, 319, 320, 352, 625, 132, 638, 627, + -550, 288, 559, 559, -726, 489, 40, 446, 446, 447, + -479, 40, -479, -396, -737, 442, 51, -67, 769, 40, + -243, 440, -426, -423, -494, 40, 40, -571, -752, -754, + 576, 573, 579, -573, -573, 112, 288, 96, 138, -573, + -573, 50, -482, -749, 580, 574, -295, 183, -284, 46, + 47, 97, 97, -327, 741, -483, -483, 92, -348, -637, + 345, 346, 96, -331, -346, 102, 25, -327, -438, -437, + 25, -270, -483, 102, -483, 159, 135, -13, 133, -201, + -200, -199, 136, 719, 726, 135, 135, 135, 97, 97, + 97, 97, 183, 97, 97, 97, 183, 97, 183, 112, + 767, -665, 549, -295, -186, 102, 183, -186, -269, 780, + -652, -308, 97, -697, -302, -483, 102, 112, 102, 44, + -241, 99, 107, 102, -338, -510, -483, 102, -510, 214, + 182, 521, -133, -133, -133, -133, -483, 138, -678, 112, + -495, -483, -495, 182, -483, -238, -240, -483, 102, -483, + -547, -548, -482, -495, -439, -510, -510, 553, 552, -439, + -495, -495, -497, -483, -337, 97, -579, 183, 288, 182, + 182, -553, 469, -555, 29, 20, -459, 48, -466, 138, + 793, -483, 97, -512, -512, 127, -512, -512, 127, -508, + -508, -505, 97, 135, -510, 133, -351, 217, -510, -351, + -352, -358, 233, 179, 217, 301, 216, 215, 213, 172, + 173, -394, -542, 630, -284, 97, -483, -518, -510, -510, + -506, 97, -510, -510, 25, -483, -394, -506, -510, -510, + -510, -289, -290, 782, -290, -289, 97, 97, -586, -587, + -586, -290, 97, 97, 97, 97, -586, 97, 97, 97, + 97, 97, 97, 97, 97, 27, 97, 97, 97, 97, + 183, -483, 96, -587, -773, 789, -510, -773, -510, -773, + -773, -510, 112, 114, 112, 114, -295, -293, -658, -186, + -186, 470, 96, 307, 183, 112, 102, 794, 183, 138, + 440, -192, -483, 102, -483, 25, 25, 182, 102, -483, + 102, 25, 284, -483, 25, 25, -346, -346, -346, 197, + 102, -738, 359, 440, 584, 284, 440, 359, 584, 284, + -603, 112, -370, 20, -374, 20, -168, 132, 102, 477, + -332, -333, -334, -335, -336, 148, 184, 185, -321, -322, + -323, -324, -353, -459, 781, 218, 221, 223, 224, 225, + 226, 227, 229, 230, 231, 232, 233, 236, 237, 238, + 239, 240, 241, 234, 235, 301, 213, 214, 215, 216, + 200, 219, 631, 201, 202, 203, 177, 178, 204, 207, + 208, 209, 210, 206, 242, 243, 244, 245, 246, 247, + 248, 249, 251, 250, 252, 253, 254, 255, 256, 257, + 258, 259, -483, -300, -67, -300, -728, 551, 491, 501, + -479, 388, -502, -501, 442, 51, -639, 512, 497, 498, + -554, 315, -472, 159, -734, 109, 138, 92, 400, 404, + 406, 408, 407, 405, 401, 402, 403, -529, -530, -527, + -533, -472, 102, -721, 96, -253, -237, -236, 146, -242, + 372, 25, -252, 71, 289, 591, 96, -369, 327, 96, + -616, 385, -353, 96, -308, -647, -269, 49, 183, 96, + 97, 183, 71, 182, 183, 138, 97, 183, 97, 183, + 138, -269, -269, -560, -8, -483, -346, -274, -483, 25, + 183, -720, 182, 92, -312, -311, 92, 93, -312, -312, + -311, -311, 78, -298, 102, 78, 78, 78, 78, 83, + -282, -281, -744, -743, 32, -693, -693, -693, 183, 97, + -371, 96, -372, -239, -483, 102, -375, 96, -376, -377, + -483, 102, -616, -353, 44, -420, 281, 275, 276, -607, + 96, -350, 96, -459, -343, -692, -693, -692, -532, -483, + 123, -692, 123, 96, -583, 352, 353, -584, -605, 355, + -483, -459, -483, -483, -483, -350, -459, -459, -423, -431, + -430, -459, -434, 41, -435, -483, -483, -483, -483, 123, + -483, -483, 123, -399, 50, 58, 59, 60, -479, -479, + 220, -402, 50, 511, 513, 514, -434, 112, 112, 112, + 112, 112, 102, 102, 102, -479, -479, 112, 102, -486, + 102, -694, 196, 54, 55, 112, 112, 112, 112, 50, + 102, -407, 50, 335, 339, 336, 337, 338, 102, 112, + 50, 112, 50, 112, 50, -483, 96, -695, -696, 102, + -603, 102, 96, 112, 102, 277, -550, 102, 92, -728, + -479, 446, -570, 138, 138, -394, -479, -396, -502, -730, + 106, 492, -730, 770, 771, -733, 365, -245, 584, 41, + -303, 281, 276, -721, -559, -558, -459, -559, -573, 573, + 577, 578, -555, -498, 102, -563, -186, -286, -285, 53, + -346, -637, -321, -483, -439, -283, 182, 131, -13, -197, + -199, -510, -13, -510, 722, 459, 723, 102, 112, 112, + 575, -673, 533, 528, 530, -186, -674, 519, -677, -268, + 97, 71, 97, 33, 794, 794, 794, 794, 102, -483, + 112, 102, -439, -495, -439, -238, -495, -495, 148, -439, + -337, -439, -439, -495, 25, -552, -547, 159, 159, -483, + 470, -564, 102, 490, 102, 284, 794, 102, -466, -505, + -505, 97, -510, 97, -623, 44, 97, 97, -623, -623, + -622, -625, -622, -361, -361, 97, 96, -284, 97, 97, + 32, 97, 97, -586, 97, 97, -510, 182, 97, 97, + 183, 183, 97, -642, 593, -586, 27, -586, -643, 665, + -586, -586, -586, -586, -586, -586, -586, -586, -586, -586, + -586, -586, -586, -586, -586, 96, -586, -586, -586, -586, + -510, -588, -592, -483, -587, 53, 97, 183, -587, 97, + 183, -587, -587, 97, 534, 736, 736, 534, 736, 736, + -186, -295, -518, -762, 73, 728, 72, 511, 117, 355, + 97, -701, 183, -474, 360, -474, -465, 102, -483, 102, + 193, 739, -483, 794, 794, 193, 739, -483, 102, -346, + -472, -306, 550, -249, 132, -250, 130, 52, 102, -483, + 25, -483, -483, 352, -483, 352, -483, -483, 102, 96, + 96, -173, 638, 96, -170, 626, 102, 97, 183, -459, + 97, 183, -353, 44, 44, 44, -729, 106, -724, 102, + -483, 103, -483, -730, 181, 444, 50, 493, 494, 509, + 439, 112, 112, 499, -722, -483, -244, 284, 440, -244, + -732, 62, 138, 102, -346, -527, -471, 169, 326, -337, + -483, 388, -339, -340, -341, -350, -342, -344, -253, 44, + -346, -346, 102, -183, -339, -479, -339, -617, 387, 29, + 112, 158, -518, 97, 123, -519, -660, -659, 71, -252, + -296, -652, -483, -698, -658, -483, -483, -510, -269, 97, + -301, 93, 182, -283, -347, -483, 159, -510, -510, 96, + -276, 786, 97, 78, 794, 96, 78, 17, 27, 102, + 183, -371, 138, 183, -375, 138, -617, -252, -480, -608, + -606, 307, -429, 54, 56, -766, -350, -353, -690, -483, + -690, -688, -690, -483, -688, -688, -532, -510, -600, 356, + 96, -598, 96, -598, 123, 401, 404, 406, 408, 407, + 436, 40, 276, -432, 404, 398, 399, -565, 351, 128, + 167, -565, -429, -350, 288, 183, -284, 183, -483, -394, + -394, 40, 102, 102, -348, 97, 183, 138, 102, -170, + -169, -510, -254, -258, 288, 92, 284, -729, -724, 138, + -571, 102, 102, -394, -730, 102, 102, 181, -734, 138, + -349, 284, -472, 183, -303, -303, -439, 25, 183, 138, + -439, 97, -313, 32, 51, 54, 55, 97, 388, -441, + 27, 159, 135, 133, 135, 135, -483, 97, 97, -629, + 707, -669, -671, 528, 29, 29, -313, -675, 712, 102, + 71, -252, -652, 214, 102, 794, -439, -495, -439, -439, + 745, -439, -547, -564, 512, -346, 183, 794, 220, -351, + 220, -413, 102, 103, -483, -510, 97, -483, -510, -510, + 97, 102, 96, 97, 102, -288, 97, 97, -521, -520, + 307, -773, -510, -773, -510, -774, 25, 97, 183, 97, + 97, 97, 183, 97, 97, -313, -186, 97, 183, 97, + -701, -475, 214, 102, -475, -192, -483, -192, -483, 25, + -484, -247, 288, -337, -251, 383, 96, 379, -249, 193, + 96, 102, -483, 25, -483, -603, 352, -603, 352, 284, + -483, -327, -371, -375, -171, 627, 112, -169, 102, -538, + 632, -334, -353, 282, -323, 50, -253, -253, -253, 102, + -727, 503, -604, 393, 112, 50, 112, 181, 495, -640, + -230, 106, -348, 41, -303, -230, -731, 106, 138, 793, + 96, -479, -479, -479, -247, 388, -483, 97, 183, -253, + -248, 60, -483, -289, 97, 744, 97, -618, 306, 112, + 158, 112, 158, 112, 97, 71, 23, 289, 97, -652, + 182, 138, -481, -283, -483, -439, -720, 182, -120, -121, + 132, -299, -507, 181, -689, -483, 291, 29, 29, 550, + -372, 97, -240, -376, 97, -378, -483, 102, -618, 96, + 97, 183, -483, -459, 97, 183, -366, -365, -363, 117, + 128, 167, 50, 484, -364, 106, 752, 753, 169, 340, + 343, 342, 318, 341, -418, -499, 92, 700, 487, 398, + 399, -533, 715, 44, 291, 122, 123, 471, -500, 96, + 96, 96, 93, 360, 96, 96, -690, 97, -585, 357, + 112, -506, 96, -506, 96, -599, 354, 96, -543, -543, + -543, -543, -543, 50, -432, 50, -433, 423, 351, 351, + -429, -459, -430, -483, 169, -394, 97, -696, 102, 97, + -550, 284, -483, -727, 102, -573, 112, -732, 102, -230, + -348, -721, -289, -283, -558, -658, -269, 23, 74, 148, + -483, -440, 28, 29, 290, -13, 723, 459, -409, 708, + 102, 29, 102, -667, 102, -665, 102, -652, 102, -439, + -483, -189, -406, -471, 323, 40, 97, 40, -412, 148, + 20, 97, 97, 97, -290, -288, -586, 97, -586, -289, + 29, -587, 97, -587, 97, -773, 54, 102, 102, -313, + -510, 97, 102, 102, 102, 739, 440, -247, 44, 477, + 30, 644, 384, -299, 380, 381, 382, -483, 102, -518, + -254, 793, 388, -483, 25, 102, -603, 102, -603, -483, + 352, 97, 97, 44, 102, 97, 102, 102, -325, -353, + -503, -234, 20, -234, 29, 20, 181, 443, 50, 112, + 50, 496, 102, -244, 138, 118, 119, -467, -468, 102, + -540, -394, -396, 102, -483, -367, -253, -237, -236, -368, + -436, -533, -341, -247, 36, 388, -293, -188, -369, -373, + -379, -385, -386, -187, 327, -370, -367, -619, 187, 112, + 158, 112, 112, 96, -559, -483, -510, -439, -439, -269, + 780, -121, -123, 128, 167, -483, 97, 97, 183, 96, + -619, -766, -606, -609, 71, -350, -363, 117, 117, -506, + 102, 102, 102, -396, -397, 50, 339, 335, 138, 138, + -398, 50, 319, 320, -408, 96, 350, 23, 112, 220, + 716, 96, 123, 123, -346, -540, -540, -540, -691, 400, + 401, 402, 410, 404, 405, 403, 406, 407, 408, 409, + -691, -540, -540, 96, -566, -565, -607, 29, 97, -580, + 97, -580, 96, 138, -506, -544, 297, 415, 416, 106, + 20, 398, 399, 420, 419, 418, 424, 425, 429, 430, + 426, 428, 427, 431, 435, 432, 433, 434, 437, 421, + 422, 64, 423, 443, 454, 450, -506, -543, 138, -479, + 169, -483, 182, -68, 450, 456, 454, 443, -731, -291, + -439, 74, -590, 787, -510, -518, 758, 760, 761, -483, + -483, -463, 709, 112, 102, 530, -673, -495, -630, 710, + -663, -598, -394, 138, -394, -394, 97, 85, 631, 409, + 633, -586, 97, -586, -594, -593, -597, 534, 352, 542, + -518, -773, -773, -587, 97, 97, 97, -483, -483, -346, + 102, 112, 97, 127, 127, 97, 97, -470, -469, 102, + -483, 388, -483, -327, 102, -327, 102, 352, -603, -9, + 632, -235, 70, 580, 102, 103, 490, 102, 103, 112, + 443, -230, 102, 794, 183, 138, 97, -604, -581, 307, + -253, 44, 183, -436, -471, -483, -189, -479, -581, -636, + 196, 386, 20, 112, 158, 112, -518, -289, -269, -268, + -122, 127, -123, -123, -483, 291, -3, -1, -483, 7, + -620, 196, 386, 97, -614, -610, 96, -611, -436, 309, + 148, 102, 102, 112, 96, -653, 40, 44, -510, -541, + 96, 97, 97, 97, 97, 97, -540, -584, 97, 97, + 97, -580, 112, 97, -479, -479, 102, 102, 397, -479, + -479, -479, -479, -479, -479, 96, 102, 102, -479, -479, + -479, -479, -479, -479, 138, 138, -479, -479, -479, 118, + 119, -394, -479, 182, -483, -269, -269, 75, -591, -589, + -483, -638, 20, 759, 96, 96, 96, 29, -629, -439, + -631, 711, 102, -672, 533, -666, -664, 528, 529, 530, + 531, 102, 97, 632, 75, 75, 634, -596, 130, 495, + 499, -504, 103, -507, 112, 114, 211, -587, -587, 102, + -483, 102, 794, 183, 138, -483, 388, -327, -327, -603, + 102, -328, -483, 350, 512, -468, 102, -545, -582, 359, + 29, -253, -436, -479, -604, 751, 755, -393, 757, 756, + 68, -582, 386, 112, 158, 112, 97, -291, 133, -510, + -122, -122, 97, 183, 32, -353, -7, 6, 386, -614, + -611, -613, -612, 357, 310, 96, 97, -510, -522, -479, + 96, 97, -411, -410, 629, -540, -543, 93, -543, -543, + 93, -543, 93, -543, 93, 97, -601, 358, 97, 112, + 112, -483, 112, 112, 112, 112, 112, 112, -580, 112, 112, 112, 112, 112, 112, 118, 119, 118, 119, 112, - 112, 112, -387, -476, 183, 44, 761, 96, -511, -511, - -457, -476, -660, -402, 102, -669, 289, -663, -664, 532, - -657, 29, 530, 29, 29, -183, 183, 75, -588, -589, - 499, -497, 103, -500, 705, 540, 540, 540, 540, -242, - -243, -242, -243, -320, -462, 102, -476, 102, -320, -319, - 44, 535, 470, -539, -537, -530, 29, -576, -387, -367, - -373, 20, -383, 20, -380, 20, 112, -262, 23, 24, + 112, 112, -394, -483, 183, 44, 761, 96, -518, -518, + -464, -483, -667, -409, 102, -676, 289, -670, -671, 532, + -664, 29, 530, 29, 29, -190, 183, 75, -595, -596, + 499, -504, 103, -507, 705, 540, 540, 540, 540, -249, + -250, -249, -250, -327, -469, 102, -483, 102, -327, -326, + 44, 535, 470, -546, -544, -537, 29, -583, -394, -374, + -380, 20, -390, 20, -387, 20, 112, -269, 23, 24, 133, 133, 97, -1, 8, 6, 45, 102, 97, 183, - -476, 306, 96, -510, -504, -503, 306, 97, -387, -503, - -560, 718, 717, -410, -408, -409, 92, 547, 348, 349, - 97, -684, -684, -684, -684, -411, 112, 97, -582, 96, - -177, 96, 97, 97, 97, 183, -456, -677, 96, 112, - -662, -661, -663, 29, -660, 29, -660, -660, 537, 20, - 127, 541, 541, 541, 541, -242, -242, -320, 102, -452, - 96, -593, 96, 96, 96, 40, 22, 22, 102, 6, - 550, -605, -603, -510, 97, 183, -558, 97, -409, 92, - -408, 92, 24, 23, -536, -536, -536, -536, -581, 97, - 183, -509, -476, -680, 40, 97, -676, -675, -453, -670, - 533, 534, 102, -660, 138, 633, -588, -758, -757, 735, - -573, -578, -374, -375, -376, -476, 102, -384, -385, -376, - -381, -382, -376, -552, 96, 71, 96, 71, -2, -4, - 117, 10, 50, 102, 96, 97, -504, -560, -407, 345, - 346, 40, 196, -407, 97, 96, 97, -679, -678, -454, - 97, 183, 102, 634, 102, 97, -600, 97, 183, 138, - 97, 183, 138, 97, 183, 138, -300, -476, 96, -300, - 96, 92, 102, -3, 117, 50, 347, -509, 183, 138, - -675, -375, -377, -476, 102, -385, -377, -382, -377, 97, - 183, 182, -511, 97, -511, 9, 10, 97, 97, -678, - 50, -503, 71, -476, -476, 97, 71, 97, -6, -4, - -5, -4, 96, 182, 96, 92, 92, -511, -476, -511, + -483, 306, 96, -517, -511, -510, 306, 97, -394, -510, + -567, 718, 717, -417, -415, -416, 92, 547, 348, 349, + 97, -691, -691, -691, -691, -418, 112, 97, -589, 96, + -184, 96, 97, 97, 97, 183, -463, -684, 96, 112, + -669, -668, -670, 29, -667, 29, -667, -667, 537, 20, + 127, 541, 541, 541, 541, -249, -249, -327, 102, -459, + 96, -600, 96, 96, 96, 40, 22, 22, 102, 6, + 550, -612, -610, -517, 97, 183, -565, 97, -416, 92, + -415, 92, 24, 23, -543, -543, -543, -543, -588, 97, + 183, -516, -483, -687, 40, 97, -683, -682, -460, -677, + 533, 534, 102, -667, 138, 633, -595, -765, -764, 735, + -580, -585, -381, -382, -383, -483, 102, -391, -392, -383, + -388, -389, -383, -559, 96, 71, 96, 71, -2, -4, + 117, 10, 50, 102, 96, 97, -511, -567, -414, 345, + 346, 40, 196, -414, 97, 96, 97, -686, -685, -461, + 97, 183, 102, 634, 102, 97, -607, 97, 183, 138, + 97, 183, 138, 97, 183, 138, -307, -483, 96, -307, + 96, 92, 102, -3, 117, 50, 347, -516, 183, 138, + -682, -382, -384, -483, 102, -392, -384, -389, -384, 97, + 183, 182, -518, 97, -518, 9, 10, 97, 97, -685, + 50, -510, 71, -483, -483, 97, 71, 97, -6, -4, + -5, -4, 96, 182, 96, 92, 92, -518, -483, -518, 10, 9, 97, 97, } @@ -14319,548 +14413,553 @@ var yyDef = [...]int{ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 0, 352, 353, 354, 355, - 356, 357, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, - 1255, 1256, 0, 0, 0, 0, 892, 0, 894, 882, - 860, 861, 916, 820, 0, 0, 0, 437, 0, 0, - 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, - 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, - 699, 700, 701, 702, 703, 704, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 0, 0, -2, 386, 382, 294, 295, 296, 297, - 298, 299, 300, 394, 395, 638, 0, 0, 0, 0, - 0, 1000, 1001, -2, 133, 0, 0, 0, 0, 0, - 375, 0, 366, 366, 0, 0, 1257, 1258, 1259, 1260, - 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, -2, - 0, 0, 873, 0, 821, 822, 823, 824, 825, 826, - 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, - 837, 838, 839, 840, 467, 468, 469, 463, 464, 466, - 465, 0, 0, 873, 0, 0, 0, 1016, 1050, 0, - 1070, 1071, 0, 1615, 1072, 1082, 1110, 0, 23, 0, - 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 0, 0, 18, 0, 18, 0, 0, 0, 1832, - 1833, 1834, 1835, 2456, 2809, 2777, -2, 2499, 2457, 2458, - 2700, 2701, 2588, 2604, 2449, 2858, 2859, 2860, 2861, 2862, - 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, - 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, - 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, - 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, - 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, - 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, - 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, - 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, - 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, - 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, - 2448, 2450, 2451, 2452, 2453, 2454, 2455, 2459, 2460, 2461, - 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, - 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, - 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, - 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2500, 2501, 2502, - 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, - 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, - 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, - 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, - 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, - 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, - 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, - 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, - 2583, 2584, 2585, 2586, 2587, 2589, 2590, 2591, 2592, 2593, - 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, - 2605, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, + 64, 65, 66, 67, 68, 69, 70, 0, 354, 355, + 356, 357, 358, 359, 1251, 1252, 1253, 1254, 1255, 1256, + 1257, 1258, 1259, 1260, 0, 0, 0, 0, 896, 0, + 898, 886, 864, 865, 920, 823, 0, 0, 0, 439, + 0, 0, 0, 0, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, -2, 0, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 0, 0, 388, 384, + 296, 297, 298, 299, 300, 301, 302, 396, 397, 641, + 0, 0, 0, 0, 0, 1004, 1005, -2, 135, 0, + 0, 0, 0, 0, 377, 0, 368, 368, 0, 0, + 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, + 1271, 1272, 1273, 1274, -2, 0, 0, 877, 0, 824, + 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, + 469, 470, 471, 465, 466, 468, 467, 0, 0, 877, + 0, 0, 0, 1020, 1054, 0, 1074, 1075, 0, 1633, + 1076, 1086, 1114, 0, 23, 0, 6, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 0, 0, 18, + 0, 18, 0, 0, 0, 1850, 1851, 1852, 1853, 2480, + 2833, 2801, 2417, -2, 2523, 2481, 2482, 2724, 2725, 2612, + 2628, 2473, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, + 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, + 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, + 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, + 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, + 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2416, 2418, 2419, + 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, + 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, + 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, + 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, + 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, + 2470, 2471, 2472, 2474, 2475, 2476, 2477, 2478, 2479, 2483, + 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, + 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, + 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, + 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2524, + 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, + 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, + 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, + 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, + 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2574, + 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, + 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, + 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, + 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, - 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, - 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, - 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, - 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, - 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, - 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, - 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, - 2696, 2697, 2698, 2699, 2702, 2703, 2704, 2705, 2706, 2707, + 2626, 2627, 2629, 2631, 2632, 2633, 2634, 2635, 2636, 2637, + 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, + 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, + 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, + 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, + 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, + 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, + 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, - 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, - 2728, 2729, 2730, 2731, 2732, 2733, -2, 2735, 2736, 2737, - 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, - 2748, 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, - 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, - 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2778, - 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, - 2789, 2790, 2791, 2792, 2793, 2794, -2, -2, -2, 2798, - 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, - 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, - 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, - 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, - 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 0, - 350, 348, 2424, 2449, 2456, 2457, 2458, 2499, 2588, 2604, - 2606, 2645, 2700, 2701, 2727, 2734, 2777, 2795, 2796, 2797, - 2809, 0, 0, 1289, 0, 0, 387, 862, 863, 893, - 895, 917, 1016, 1050, 0, 883, 884, 0, 818, 0, - 1775, 433, 0, 2475, 0, 0, 444, 2786, 0, 0, - 815, 427, 428, 429, 430, 431, 432, 0, 0, 0, - 1246, 0, 0, 2817, 423, 0, 0, 83, 490, 705, - 0, 0, 0, 0, 0, 795, 795, 1135, 1135, 0, - 735, 0, 0, 0, 795, 0, 750, 742, 0, 0, - 0, 795, 0, 0, 1039, 0, 1039, 0, 798, 805, - 795, 795, -2, 795, 795, 0, 790, 795, 0, 0, - 0, 756, 757, 758, 742, 742, 761, 762, 763, 773, - 774, 806, 2393, 0, 0, 381, 2591, 2808, 1836, 0, - 0, 0, 0, 0, 237, 1424, 239, 1426, 243, 251, - 0, 0, 0, 256, 257, 260, 261, 262, 263, 264, - 0, 268, 0, 270, 273, 0, 275, 276, 0, 279, - 280, 281, 0, 291, 292, 293, 1427, 1428, 1429, 1430, - 1431, 1432, 1433, 1434, -2, 0, 164, 1287, 2348, 2215, - 0, 2221, 2238, 2255, 1929, 1930, 1931, 1932, 0, 0, - 0, 0, 0, 0, 0, 1942, 1943, 0, 1989, 2862, - 2906, 2907, 0, 1953, 1954, 1955, 1956, 1957, 1958, 0, - 175, 189, 190, 2279, 2280, 2281, 2282, 2283, 2284, 2285, - 0, 2287, 2288, 2289, 0, 1914, 1832, 0, 2871, 2881, - 0, 2895, 2902, 2903, 2904, 2905, 2894, 0, 0, 2168, - 0, 2158, 0, 0, -2, -2, 0, 0, 2672, -2, - 2908, 2909, 2910, 2868, 2891, 2899, 2900, 2901, 2872, 2911, - 2912, 2875, 2898, 2864, 2865, 2866, 2859, 2860, 2861, 2863, - 2877, 2879, 2890, 0, 2886, 2896, 2897, 2784, 0, 0, - 2835, 2873, 2874, 0, 0, 0, 0, 0, 0, 2844, - 2845, 2846, 2847, 2848, 2830, 191, 192, -2, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, 2179, -2, 2181, -2, 2183, -2, -2, - 2186, -2, -2, -2, -2, -2, 2192, 2193, -2, -2, - 2196, -2, -2, -2, -2, -2, -2, -2, 2170, 2171, - 2172, 2173, 2162, 2163, 2164, 2165, 2166, 2167, -2, -2, - -2, 2349, 1016, 0, 0, 1050, 1177, 0, 1050, 1048, - 1017, 0, 0, 1020, 1097, 1100, 1103, 1106, 0, 0, - 134, 135, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 376, 377, 365, 367, 0, - 371, 0, 0, 367, 364, 358, 0, 1501, 1501, 1501, - 0, 0, 1501, 0, 0, 0, 1501, 1501, 1501, 1501, - 1501, 0, 1501, 0, 0, 0, 1501, 0, 1325, 1436, - 1437, 1438, 1439, 1499, 1500, 1616, 0, 0, 0, 0, - 2737, 969, 2575, 0, 0, 977, 1032, 0, 1034, 1037, - 878, 874, 875, 876, 877, 0, 0, 0, 638, 638, - 0, 638, 0, 0, 638, 0, 638, 638, 638, 0, - 880, 2537, 2640, 2492, 2611, 2434, 2591, 2808, 0, 323, - 2672, 328, 0, 2498, 2541, 0, 0, 2562, 0, -2, - 0, 404, 1050, 0, 1017, 1041, 0, 1051, 0, 0, - 1016, 1050, 1050, 0, 1090, 0, 0, 638, 638, 0, - 0, 638, 638, 638, 638, 638, 0, 638, 638, 638, - 0, 638, 0, 638, 0, 638, 638, 638, 0, 1111, - 1112, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, - 1123, 1084, 4, 5, 18, 0, 0, 0, 0, 0, - 0, 140, 139, 0, 2352, 2388, 2292, 2293, 2294, 0, - 2375, 2297, 2379, 2379, 2379, 2379, 0, 2329, 2375, 2331, - 2332, 2333, 2375, 2335, 2336, 2337, 2338, 2379, 2379, 2379, - 2379, 2379, 2379, 0, 0, 2347, 2318, 2377, 2377, 2377, - 2375, 2354, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, - 2306, 2307, 2308, 2309, 2310, 2311, 2382, 2382, 2385, 2385, - 2382, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, - 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 0, - 495, 493, 494, 2211, 0, 0, 0, 1050, -2, 0, - 1048, 967, 0, 819, 1766, 0, 0, 434, 1837, 0, - 0, 0, 446, 0, 0, 0, 448, 0, 0, 445, - 0, 0, 470, 0, 473, 456, 457, 458, 459, 460, - 452, 0, 217, 0, 425, 426, 422, 0, 479, 481, - 483, 486, 1762, 80, 84, 87, 0, 1039, 0, 707, - 795, 795, 795, 795, 723, 724, 725, 0, 1135, 0, - 0, 728, 729, 0, 730, 0, 0, 742, 795, 795, - 748, 749, 744, 743, 801, 802, 798, 0, 798, 798, - 1135, 0, 767, 768, 769, 795, 795, 775, 1040, 0, - 0, 777, 779, 798, 0, 803, 804, 1135, 0, 0, - 1135, 1135, 0, 787, 788, 0, 791, 795, 0, 794, - 0, 0, 1501, 0, 811, 744, 744, 2394, 2395, 383, - 0, 0, 0, 639, 0, 0, 0, 0, 0, 0, - 248, 244, 252, 255, 265, 272, 0, 284, 286, 289, - 245, 253, 258, 259, 266, 287, 246, 249, 250, 254, - 288, 290, 247, 267, 271, 285, 269, 274, 277, 278, - 283, 0, 218, 0, 0, 0, 0, 0, 2220, 0, - 0, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2258, 0, 0, 0, 0, - 0, 0, 0, -2, 2215, 0, 0, 1936, 1937, 1938, - 1939, 1940, 0, 1944, 0, 1990, 0, 0, 0, 0, - 0, 0, 2286, 2290, 0, 0, 2211, 2211, 0, 0, - 2211, 2207, 0, 0, 0, 0, 0, 0, 2211, 2141, - 0, 0, 2143, 2159, 0, 0, 2145, 2146, 0, 2149, - 2150, 2211, 0, 2211, 2154, 2211, 2211, 2211, 2135, 2136, - 0, 0, 0, 2207, 0, 0, 2207, 2207, 2207, 0, - 0, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1050, 1016, 1041, 0, 0, -2, 0, 978, 0, 1048, - 1074, 1076, 1078, 1080, 1047, 1022, 0, 1098, 1099, 1101, - 1102, 1104, 1105, 1107, 1108, 0, 136, 0, 0, 0, - 115, 0, 0, 112, 0, 0, 0, 0, 81, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 369, 0, 374, 360, 2633, 0, 359, 0, 0, - 0, 0, 1501, 1501, 0, 0, 1286, 0, 0, 1501, - 1501, 1326, 0, 0, 0, 0, 0, 0, 0, 0, - 1501, 1501, 1501, 0, 1519, 0, 0, 0, 0, 902, - 904, 899, 0, 0, 902, 0, 0, 969, 969, 976, - 0, 1033, 0, 0, 880, 879, 0, 1150, 1151, 1152, - 1193, 1236, 1236, 0, 1236, 1197, 0, 1775, 0, 0, - 0, 0, 1513, 0, 0, 0, 0, 0, 0, 0, - 620, 814, 621, 0, 0, 2396, 0, 0, 0, 523, - 524, 0, 0, 881, 0, 302, 306, 0, 309, 0, - 2640, 0, 2640, 0, 0, 316, 0, 0, 0, 0, - 0, 0, 346, 347, 0, 0, 0, 0, 337, 340, - 1758, 1759, 1421, 1422, 341, 342, 396, 397, 0, 1041, - 1073, 1075, 1077, 1079, 999, 1042, 1043, 1083, 1085, 1086, - 1087, 0, 0, 1068, 1069, 1041, 1041, 0, 1092, 0, - 0, 0, 638, 638, 0, 0, 0, 0, 0, 638, - 0, 0, 0, 856, 0, 858, 0, 0, 638, 0, - 0, 0, 978, 1137, 1139, 1241, 175, 1113, 7, 157, - 154, 0, 18, 0, 0, 18, 18, 0, 18, 351, - 0, 2391, 2389, 2390, 0, 2296, 2376, 0, 2323, 0, - 2324, 2325, 2326, 2327, 2328, 2330, 2334, 2339, 2340, 2341, - 2342, 2343, 2344, 0, 0, 2319, 0, 2320, 2321, 2322, - 2312, 2382, 0, 2314, 2315, 0, 2316, 2317, 349, 492, - 0, 0, 2212, 1290, 0, 0, 1041, 1012, 1048, 0, - 1048, 978, 0, 0, 638, 1764, 0, 1775, 0, 0, - 0, 0, 0, 435, 0, 0, 461, 462, 0, 447, - 0, 454, 0, 449, 450, 453, 0, 0, 472, 474, - 475, 476, 477, 816, 419, 420, 421, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 0, 415, 416, 417, - 418, 0, -2, 0, 0, 424, 185, 478, 0, 480, - 0, 485, 0, 487, 0, 88, 489, 0, 709, 0, - 1135, 0, 0, 1135, 1135, 0, 0, 1135, 0, 727, - 796, 797, 1136, 731, 0, 0, 739, 2168, 2591, 1413, - 744, 1135, 1135, 751, 745, 752, 800, 753, 754, 755, - 798, 1135, 1135, 1044, 0, 795, 798, 780, 799, 798, - 1775, 784, 0, 789, 792, 793, 1775, 812, 1775, 0, - 810, 759, 760, 384, 385, 0, 0, 0, 231, 232, - 233, 234, 235, 236, 238, 222, 847, 849, 1425, 0, - 1416, 0, 241, 282, 214, 0, 0, 0, 0, 2216, - 2217, 2218, 2219, 2224, 0, 0, 2227, 2230, 2233, 2236, - 0, 2262, -2, -2, 1915, 1916, 1917, 1918, 1919, 1920, - 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 2239, 2260, - 2261, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2259, 2256, 2256, 2249, 0, 1933, 1950, - 1994, 2008, 2008, 1959, 1760, 1761, 1934, 0, 0, 1987, - 1991, 0, 0, 0, 0, 0, 0, 1479, 2375, 0, - 176, 2255, 2206, 2102, 2103, 2104, 2105, 2106, 2107, 2108, - 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, - 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, - 2129, 2130, 0, 0, 2215, 0, 0, 0, 0, 2208, - 2209, 0, 0, 0, 2090, 0, 0, 2096, 2097, 2098, - 0, 1829, 0, 2169, 2142, 2160, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2131, 2132, - 2133, 2134, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1041, 1050, 1176, 1178, 0, 963, 965, - 966, 1006, 1048, 1048, 1008, 0, 978, 1024, 0, 0, - 0, 132, 137, 0, 1583, 123, 0, 0, 0, 123, - 0, 0, 0, 123, 0, 0, 0, 1397, 1515, 89, - 1396, 1517, 0, 0, 0, 0, 0, 0, 0, 378, - 379, 0, 0, 373, 361, 2633, 363, 0, 0, 0, - 0, 0, 0, 0, 1273, 0, 0, 0, 1304, 0, - 0, 0, 1341, 1342, 0, 636, 1407, 0, 0, 0, - 1423, 1483, 1497, 0, 0, 0, 1589, 1327, 1332, 1333, - 1334, 1328, 1329, 1335, 1336, 896, 905, 0, 900, 0, - 906, 0, 0, 939, 959, 934, 0, 943, 0, 0, - 0, 1035, 0, 0, 1191, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1183, 0, 0, 0, 1182, 0, - 0, 0, 0, 0, 0, 0, 1037, 1237, 0, 1239, - 1240, 1195, -2, 0, 1146, 1148, 0, 1219, 0, 2211, - 0, 0, 1591, 1037, 520, 521, 522, 532, 593, 534, - 0, 593, 593, 593, 576, 0, 0, 564, 2396, 0, - 0, 0, 0, 573, 2396, 0, 0, 2396, 2396, 2396, - 2396, 2396, 2396, 2396, 2396, 0, 0, 2396, 2396, 2396, - 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 0, 2396, - 2396, 2396, 2396, 2396, 1744, 2396, 0, 1514, 583, 584, - 585, 586, 591, 592, 0, 0, 537, 538, 0, 0, - 0, 0, 0, 631, 0, 0, 1340, 619, 0, 622, - 2396, 0, 2396, 0, 2397, 636, 0, 0, 1385, 0, - 0, 1148, 0, 0, 0, 0, 314, 315, 303, 0, - 304, 0, 0, 317, 318, 0, 320, 321, 322, 329, - 2492, 2611, 324, 326, 0, 0, 330, 343, 344, 345, - 0, 0, 335, 336, 0, 0, 399, 400, 402, 0, - 1048, 1088, 1054, 1055, 1058, 0, 0, 1091, 1093, 1094, - 1095, 1096, 1516, 1504, 85, 86, 2817, 841, 0, 0, - 844, 845, 846, 850, 0, 0, 1617, 854, 855, 0, - 0, 1394, 0, 1398, 1400, 1504, 1143, 0, 1140, 1242, - 0, 1244, 0, 0, 155, 18, 0, 148, 145, 0, - 0, 0, 0, 0, 2353, 2291, 2392, 0, 0, 0, - 0, 2373, 0, 0, 2313, 0, 0, 0, 138, 161, - 985, 1048, 978, 0, 980, 187, 978, 1014, 914, 959, - 887, 0, 943, 0, 0, 0, 0, 0, 1766, 0, - 0, 0, 0, 1838, 0, 439, 438, 0, 0, 455, - 0, 0, 451, 471, 0, 414, 0, 0, 0, 482, - 0, 1763, 488, 491, 706, 0, 708, 711, 795, 0, - 714, 715, 795, 0, 0, 721, 726, 734, 732, 0, - 736, 0, 739, 738, 0, 1415, 795, 746, 747, 1135, - 770, 771, 0, 0, 0, 1135, 795, 795, 783, 798, - 807, 0, 808, 1775, 0, 225, 1410, 0, 226, 230, - 220, 0, 0, 0, 1412, 1417, 0, 240, 0, 0, - 215, 216, 1574, 1583, 0, 0, 0, 163, 2225, 2228, - 2231, 2234, 2226, 2229, 2232, 2235, 2237, 0, 2240, 2256, - 2256, 2250, 0, 2241, 2256, 2256, 2251, 0, 0, 2243, - 0, 2246, 0, 1995, 2009, 2010, 1996, 2216, 1941, 0, - 1992, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1058, 0, 0, 0, 2078, 2080, 0, 0, 0, 2085, - 0, 2087, 2088, 2089, 2091, 0, 0, 0, 2095, 0, - 2140, 2161, 2144, 2147, 0, 2151, 0, 2153, 2155, 2156, - 2157, 0, 0, 0, 1050, 1052, 1052, 1050, 0, 0, - 2035, 2035, 1052, 0, 0, 0, 0, 2035, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1964, 0, 1965, 1966, 1967, 0, 1969, 2913, - 0, 2913, 0, 2913, 2913, 0, 0, 0, 1048, 1041, - 0, 1179, 978, 978, 0, 1009, 1018, 0, 0, 0, - 0, 0, 0, 1581, 0, 108, 0, 0, 0, 116, - 0, 111, 117, 0, 0, 113, 0, 0, 125, 90, - 0, 0, 1522, 1523, 0, 0, 0, 380, 368, 370, - 0, 362, 0, 1502, 1503, 0, 0, 0, 1663, 1673, - 1277, 0, 0, -2, 1306, 0, 1037, 1037, 1352, 2396, - 0, 640, 0, 0, 1409, 0, 1374, 0, 0, 1484, - 0, -2, 0, 0, -2, 0, 0, 1593, 0, 897, - 903, 0, 0, 0, 898, 914, 940, 0, 933, 956, - 0, 960, 0, 0, 947, 949, 938, 944, 0, 0, - 0, 974, 914, 914, 23, 1038, 0, 0, 0, 867, - 871, 0, 1187, 1187, 1187, 1156, 0, 0, 1159, 1184, - 1160, 1185, 0, 0, 1164, 0, 1166, 0, 1168, 0, - 1162, 1163, 1170, 1171, 0, 1161, 1194, 1238, 0, 1196, - 0, 1218, 1220, 1221, 1227, 0, 0, 0, 0, 0, - 0, 0, 516, 517, 1593, 0, 0, 1513, 1627, 554, - 0, 1788, 1789, 594, 0, 1796, 1805, 1805, 1501, 1878, - 0, 1805, 0, 0, 1807, 1808, 1660, 0, 0, 563, - 0, 0, 0, 0, 0, 0, 0, 577, 578, 0, - 0, 562, 0, 0, 604, 0, 0, 0, 0, 0, - 0, 2396, 2396, 0, 571, 572, 0, 575, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2396, 2396, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1735, 0, 0, 0, 0, 0, 0, 0, 1750, 1751, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1352, - 2396, 0, 0, 0, 0, 0, 2396, 0, 625, 640, - 1404, 1404, 1372, 1390, 0, 525, 526, 601, 0, 0, - 0, 307, 308, 0, 0, 313, 331, 333, 305, 0, - 0, 0, 332, 334, 338, 339, 398, 401, 403, 978, - 0, 1061, 1059, 1060, 1081, 1089, 82, 1505, 842, 843, - 0, 1617, 853, 1618, 1619, 1306, 859, 1395, 0, 1402, - 1135, 1144, 0, 1138, 1243, 1245, 176, 1141, 0, 158, - 18, 157, 149, 150, 0, 18, 0, 0, 0, 0, - 2295, 2381, 2380, 2345, 0, 2346, 2378, 2383, 0, 2386, - 0, 496, 0, 989, 0, 978, 1015, 981, 0, 1013, - 885, 0, 886, 0, 0, 891, 0, 974, 1399, 1767, - 1768, 0, 1771, 1772, 1773, 1774, 1765, 0, 0, 0, - 0, 0, 0, 0, 440, 441, 442, 443, 817, 0, - 186, 484, 710, 1135, 795, 1135, 0, 795, 795, 722, - 1670, 1671, 733, 740, 737, 1414, 1135, 764, 1045, 1046, - 776, 778, 1775, 1135, 1135, 795, 813, 809, 0, 0, - 0, 0, 0, 848, 0, 222, 0, 0, 242, 0, - 0, 0, 1583, 1578, 2210, 2244, 2247, 0, 2245, 2248, - 0, 0, 2257, 2252, 1935, 1945, 1988, 0, 0, 2379, - 0, 0, 0, 1997, 1998, 2379, 2379, 2002, 2375, 2377, - 2375, 2008, 2008, 0, 1480, 0, 1481, 1058, 177, 0, - 0, 0, 0, 2035, 0, 0, 0, 1830, 0, 0, - 0, 0, 0, 2031, 2035, 0, 2035, 2033, 2035, 2035, - 2053, 2036, 2054, 2035, 2035, 2035, 2035, 2035, 2060, 2035, - 2035, 2035, 2035, 2035, 2035, 2035, 2035, 0, 2035, 2035, - 2035, 2035, 0, 2037, 2040, 1968, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2280, 2281, 978, 1048, - 964, 1010, 1007, 0, 0, 0, 0, 0, 71, 71, - 1583, 0, 0, 109, 121, 122, 0, 0, 0, 0, - 131, 0, 0, 0, 0, 0, 0, 0, 1531, 1539, - 0, 372, 0, 91, 92, 94, 0, 0, 0, 0, - 0, 0, 0, 107, 1270, 0, 1271, 0, 1281, 0, - 1275, 0, 0, 1292, 1293, 1295, 0, 1298, 1299, 1300, - 0, 1307, 1308, 1310, 1311, 0, 2407, -2, -2, 2538, + 2718, 2719, 2720, 2721, 2722, 2723, 2726, 2727, 2728, 2729, + 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, + 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, + 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, -2, 2759, + 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, + 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, + 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, + 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, + 2800, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, + 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, -2, -2, + -2, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, + 2831, 2832, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, + 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, + 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, + 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, + 2872, 0, 352, 350, 2417, 2448, 2473, 2480, 2481, 2482, + 2523, 2612, 2628, 2630, 2669, 2724, 2725, 2751, 2758, 2801, + 2819, 2820, 2821, 2833, 0, 0, 1294, 0, 0, 389, + 866, 867, 897, 899, 921, 1020, 1054, 0, 887, 888, + 0, 821, 0, 1793, 435, 0, 2499, 0, 0, 446, + 2810, 0, 0, 818, 429, 430, 431, 432, 433, 434, + 0, 0, 0, 1250, 0, 0, 2841, 425, 85, 492, + 708, 0, 0, 0, 0, 0, 798, 798, 1139, 1139, + 0, 738, 0, 0, 0, 798, 0, 753, 745, 0, + 0, 0, 798, 0, 0, 1043, 0, 1043, 0, 801, + 808, 798, 798, -2, 798, 798, 0, 793, 798, 0, + 0, 0, 0, 759, 760, 761, 745, 745, 764, 765, + 766, 776, 777, 809, 2411, 0, 0, 0, 0, 0, + 383, 2615, 2832, 1854, 0, 0, 0, 0, 0, 239, + 1442, 241, 1444, 245, 253, 0, 0, 0, 258, 259, + 262, 263, 264, 265, 266, 0, 270, 0, 272, 275, + 0, 277, 278, 0, 281, 282, 283, 0, 293, 294, + 295, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, -2, + 0, 166, 1292, 2366, 2233, 0, 2239, 2256, 2273, 1947, + 1948, 1949, 1950, 0, 0, 0, 0, 0, 0, 0, + 1960, 1961, 0, 2007, 2886, 2930, 2931, 0, 1971, 1972, + 1973, 1974, 1975, 1976, 0, 177, 191, 192, 2297, 2298, + 2299, 2300, 2301, 2302, 2303, 0, 2305, 2306, 2307, 0, + 1932, 1850, 0, 2895, 2905, 0, 2919, 2926, 2927, 2928, + 2929, 2918, 0, 0, 2186, 0, 2176, 0, 0, -2, + -2, 0, 0, 2696, -2, 2932, 2933, 2934, 2892, 2915, + 2923, 2924, 2925, 2896, 2935, 2936, 2899, 2922, 2888, 2889, + 2890, 2883, 2884, 2885, 2887, 2901, 2903, 2914, 0, 2910, + 2920, 2921, 2808, 0, 0, 2859, 2897, 2898, 0, 0, + 0, 0, 0, 0, 2868, 2869, 2870, 2871, 2872, 2854, + 193, 194, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, 2197, -2, + 2199, -2, 2201, -2, -2, 2204, -2, -2, -2, -2, + -2, 2210, 2211, -2, -2, 2214, -2, -2, -2, -2, + -2, -2, -2, 2188, 2189, 2190, 2191, 2180, 2181, 2182, + 2183, 2184, 2185, -2, -2, -2, 2367, 1020, 0, 0, + 1054, 1181, 0, 1054, 1052, 1021, 0, 0, 1024, 1101, + 1104, 1107, 1110, 0, 0, 136, 137, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 378, 379, 367, 369, 0, 373, 0, 0, 369, 366, + 360, 0, 1519, 1519, 1519, 0, 0, 1519, 0, 0, + 0, 0, 1519, 1519, 1519, 1519, 1519, 0, 1519, 0, + 0, 0, 1519, 0, 1343, 1454, 1455, 1456, 1457, 1517, + 1518, 1634, 0, 0, 0, 0, 2761, 973, 2599, 0, + 0, 981, 1036, 0, 1038, 1041, 882, 878, 879, 880, + 881, 0, 0, 0, 641, 641, 0, 641, 0, 0, + 641, 0, 641, 0, 641, 641, 0, 884, 2561, 2664, + 2516, 2635, 2458, 2615, 2832, 0, 325, 2696, 330, 0, + 2522, 2565, 0, 0, 2586, 0, -2, 0, 406, 1054, + 0, 1021, 1045, 0, 1055, 0, 0, 1020, 1054, 1054, + 0, 1094, 0, 0, 641, 641, 0, 0, 641, 641, + 641, 641, 641, 0, 641, 641, 641, 0, 641, 0, + 0, 641, 0, 641, 641, 641, 0, 1115, 1116, 1118, + 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1088, + 4, 5, 18, 0, 0, 0, 0, 0, 0, 142, + 141, 0, 2370, 2406, 2310, 2311, 2312, 0, 2393, 2315, + 2397, 2397, 2397, 2397, 0, 2347, 2393, 2349, 2350, 2351, + 2393, 2353, 2354, 2355, 2356, 2397, 2397, 2397, 2397, 2397, + 2397, 0, 0, 2365, 2336, 2395, 2395, 2395, 2393, 2372, + 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, + 2326, 2327, 2328, 2329, 2400, 2400, 2403, 2403, 2400, 2373, + 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, + 2384, 2385, 2386, 2387, 2388, 2389, 2390, 0, 497, 495, + 496, 2229, 0, 0, 0, 1054, -2, 0, 1052, 971, + 0, 822, 1784, 0, 0, 436, 1855, 0, 0, 0, + 448, 0, 0, 0, 450, 0, 0, 447, 0, 0, + 472, 0, 475, 458, 459, 460, 461, 462, 454, 0, + 219, 0, 427, 428, 424, 0, 82, 86, 89, 0, + 1043, 0, 710, 798, 798, 798, 798, 726, 727, 728, + 0, 1139, 0, 0, 731, 732, 0, 733, 0, 0, + 745, 798, 798, 751, 752, 747, 746, 804, 805, 801, + 0, 801, 801, 1139, 0, 770, 771, 772, 798, 798, + 778, 1044, 0, 0, 780, 782, 801, 0, 806, 807, + 1139, 0, 0, 1139, 1139, 0, 790, 791, 0, 794, + 798, 0, 797, 0, 0, 1519, 0, 0, 814, 1336, + 0, 747, 747, 2412, 2413, 0, 481, 483, 485, 488, + 1780, 385, 0, 0, 0, 642, 0, 0, 0, 0, + 0, 0, 250, 246, 254, 257, 267, 274, 0, 286, + 288, 291, 247, 255, 260, 261, 268, 289, 248, 251, + 252, 256, 290, 292, 249, 269, 273, 287, 271, 276, + 279, 280, 285, 0, 220, 0, 0, 0, 0, 0, + 2238, 0, 0, 2283, 2284, 2285, 2286, 2287, 2288, 2289, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2276, 0, 0, + 0, 0, 0, 0, 0, -2, 2233, 0, 0, 1954, + 1955, 1956, 1957, 1958, 0, 1962, 0, 2008, 0, 0, + 0, 0, 0, 0, 2304, 2308, 0, 0, 2229, 2229, + 0, 0, 2229, 2225, 0, 0, 0, 0, 0, 0, + 2229, 2159, 0, 0, 2161, 2177, 0, 0, 2163, 2164, + 0, 2167, 2168, 2229, 0, 2229, 2172, 2229, 2229, 2229, + 2153, 2154, 0, 0, 0, 2225, 0, 0, 2225, 2225, + 2225, 0, 0, 2225, 2225, 2225, 2225, 2225, 2225, 2225, + 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1054, 1020, 1045, 0, 0, -2, 0, 982, + 0, 1052, 1078, 1080, 1082, 1084, 1051, 1026, 0, 1102, + 1103, 1105, 1106, 1108, 1109, 1111, 1112, 0, 138, 0, + 0, 0, 117, 0, 0, 114, 0, 0, 0, 0, + 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 371, 0, 376, 362, 2657, 0, 361, + 0, 0, 0, 0, 1519, 1519, 0, 0, 1291, 0, + 0, 1519, 1519, 1519, 1344, 0, 0, 0, 0, 0, + 0, 0, 0, 1519, 1519, 1519, 0, 1537, 0, 0, + 0, 0, 906, 908, 903, 0, 0, 906, 0, 0, + 973, 973, 980, 0, 1037, 0, 0, 884, 883, 0, + 1154, 1155, 1156, 1197, 1240, 1240, 0, 1240, 1201, 0, + 1793, 0, 0, 0, 0, 1531, 0, 0, 0, 0, + 0, 0, 0, 623, 817, 624, 0, 0, 2414, 0, + 0, 0, 0, 526, 527, 0, 0, 885, 0, 304, + 308, 0, 311, 0, 2664, 0, 2664, 0, 0, 318, + 0, 0, 0, 0, 0, 0, 348, 349, 0, 0, + 0, 0, 339, 342, 1776, 1777, 1439, 1440, 343, 344, + 398, 399, 0, 1045, 1077, 1079, 1081, 1083, 1003, 1046, + 1047, 1087, 1089, 1090, 1091, 0, 0, 1072, 1073, 1045, + 1045, 0, 1096, 0, 0, 0, 641, 641, 0, 0, + 0, 0, 0, 641, 0, 0, 0, 860, 0, 862, + 0, 641, 0, 641, 0, 0, 0, 982, 1141, 1143, + 1245, 177, 1117, 7, 159, 156, 0, 18, 0, 0, + 18, 18, 0, 18, 353, 0, 2409, 2407, 2408, 0, + 2314, 2394, 0, 2341, 0, 2342, 2343, 2344, 2345, 2346, + 2348, 2352, 2357, 2358, 2359, 2360, 2361, 2362, 0, 0, + 2337, 0, 2338, 2339, 2340, 2330, 2400, 0, 2332, 2333, + 0, 2334, 2335, 351, 494, 0, 0, 2230, 1295, 0, + 0, 1045, 1016, 1052, 0, 1052, 982, 0, 0, 641, + 1782, 0, 1793, 0, 0, 0, 0, 0, 437, 0, + 0, 463, 464, 0, 449, 0, 456, 0, 451, 452, + 455, 0, 0, 474, 476, 477, 478, 479, 819, 421, + 422, 423, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 0, 417, 418, 419, 420, 0, -2, 0, 0, + 426, 187, 90, 491, 0, 712, 0, 1139, 0, 0, + 1139, 1139, 0, 0, 1139, 0, 730, 799, 800, 1140, + 734, 0, 0, 742, 2186, 2615, 1431, 747, 1139, 1139, + 754, 748, 755, 803, 756, 757, 758, 801, 1139, 1139, + 1048, 0, 798, 801, 783, 802, 801, 1793, 787, 0, + 792, 795, 796, 1793, 815, 1793, 0, 813, 0, 0, + 762, 763, 1333, 480, 0, 482, 0, 487, 0, 489, + 0, 386, 387, 0, 0, 0, 233, 234, 235, 236, + 237, 238, 240, 224, 851, 853, 1443, 0, 1434, 0, + 243, 284, 216, 0, 0, 0, 0, 2234, 2235, 2236, + 2237, 2242, 0, 0, 2245, 2248, 2251, 2254, 0, 2280, + -2, -2, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, + 1941, 1942, 1943, 1944, 1945, 1946, 2257, 2278, 2279, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2277, 2274, 2274, 2267, 0, 1951, 1968, 2012, 2026, + 2026, 1977, 1778, 1779, 1952, 0, 0, 2005, 2009, 0, + 0, 0, 0, 0, 0, 1497, 2393, 0, 178, 2273, + 2224, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, + 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, + 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, + 0, 0, 2233, 0, 0, 0, 0, 2226, 2227, 0, + 0, 0, 2108, 0, 0, 2114, 2115, 2116, 0, 1847, + 0, 2187, 2160, 2178, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2149, 2150, 2151, 2152, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1045, 1054, 1180, 1182, 0, 967, 969, 970, 1010, + 1052, 1052, 1012, 0, 982, 1028, 0, 0, 0, 134, + 139, 0, 1601, 125, 0, 0, 0, 125, 0, 0, + 0, 125, 0, 0, 0, 1415, 1533, 91, 1414, 1535, + 0, 0, 0, 0, 0, 0, 0, 380, 381, 0, + 0, 375, 363, 2657, 365, 0, 0, 0, 0, 0, + 0, 0, 1278, 0, 0, 0, 1309, 0, 0, 0, + 0, 1359, 1360, 0, 639, 1425, 0, 0, 0, 1441, + 1501, 1515, 0, 0, 0, 1607, 1345, 1350, 1351, 1352, + 1346, 1347, 1353, 1354, 900, 909, 0, 904, 0, 910, + 0, 0, 943, 963, 938, 0, 947, 0, 0, 0, + 1039, 0, 0, 1195, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1187, 0, 0, 0, 1186, 0, 0, + 0, 0, 0, 0, 0, 1041, 1241, 0, 1243, 1244, + 1199, -2, 0, 1150, 1152, 0, 1223, 0, 2229, 0, + 0, 1609, 1041, 523, 524, 525, 535, 596, 537, 0, + 596, 596, 596, 579, 0, 0, 567, 2414, 0, 0, + 0, 0, 576, 2414, 0, 0, 2414, 2414, 2414, 2414, + 2414, 2414, 2414, 2414, 0, 0, 2414, 2414, 2414, 2414, + 2414, 2414, 2414, 2414, 2414, 2414, 2414, 0, 2414, 2414, + 2414, 2414, 2414, 1762, 2414, 0, 1532, 586, 587, 588, + 589, 594, 595, 0, 0, 540, 541, 0, 0, 0, + 0, 0, 634, 0, 0, 1358, 622, 0, 625, 2414, + 0, 2414, 0, 2415, 639, 0, 0, 0, 1403, 0, + 0, 1152, 0, 0, 0, 0, 316, 317, 305, 0, + 306, 0, 0, 319, 320, 0, 322, 323, 324, 331, + 2516, 2635, 326, 328, 0, 0, 332, 345, 346, 347, + 0, 0, 337, 338, 0, 0, 401, 402, 404, 0, + 1052, 1092, 1058, 1059, 1062, 0, 0, 1095, 1097, 1098, + 1099, 1100, 1534, 1522, 87, 88, 2841, 845, 0, 0, + 848, 849, 850, 854, 0, 0, 1635, 858, 859, 0, + 0, 0, 1412, 0, 1416, 1418, 1522, 1147, 0, 1144, + 1246, 0, 1248, 0, 0, 157, 18, 0, 150, 147, + 0, 0, 0, 0, 0, 2371, 2309, 2410, 0, 0, + 0, 0, 2391, 0, 0, 2331, 0, 0, 0, 140, + 163, 989, 1052, 982, 0, 984, 189, 982, 1018, 918, + 963, 891, 0, 947, 0, 0, 0, 0, 0, 1784, + 0, 0, 0, 0, 1856, 0, 441, 440, 0, 0, + 457, 0, 0, 453, 473, 0, 416, 0, 0, 0, + 0, 493, 709, 0, 711, 714, 798, 0, 717, 718, + 798, 0, 0, 724, 729, 737, 735, 0, 739, 0, + 742, 741, 0, 1433, 798, 749, 750, 1139, 773, 774, + 0, 0, 0, 1139, 798, 798, 786, 801, 810, 0, + 811, 1793, 1338, 1337, 484, 0, 1781, 490, 0, 227, + 1428, 0, 228, 232, 222, 0, 0, 0, 1430, 1435, + 0, 242, 0, 0, 217, 218, 1592, 1601, 0, 0, + 0, 165, 2243, 2246, 2249, 2252, 2244, 2247, 2250, 2253, + 2255, 0, 2258, 2274, 2274, 2268, 0, 2259, 2274, 2274, + 2269, 0, 0, 2261, 0, 2264, 0, 2013, 2027, 2028, + 2014, 2234, 1959, 0, 2010, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1062, 0, 0, 0, 2096, 2098, + 0, 0, 0, 2103, 0, 2105, 2106, 2107, 2109, 0, + 0, 0, 2113, 0, 2158, 2179, 2162, 2165, 0, 2169, + 0, 2171, 2173, 2174, 2175, 0, 0, 0, 1054, 1056, + 1056, 1054, 0, 0, 2053, 2053, 1056, 0, 0, 0, + 0, 2053, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1982, 0, 1983, 1984, + 1985, 0, 1987, 2937, 0, 2937, 0, 2937, 2937, 0, + 0, 0, 1052, 1045, 0, 1183, 982, 982, 0, 1013, + 1022, 0, 0, 0, 0, 0, 0, 1599, 0, 110, + 0, 0, 0, 118, 0, 113, 119, 0, 0, 115, + 0, 0, 127, 92, 0, 0, 1540, 1541, 0, 0, + 0, 382, 370, 372, 0, 364, 0, 1520, 1521, 0, + 0, 0, 1681, 1691, 1282, 0, 0, -2, 1311, 0, + 1041, 0, 1041, 1370, 2414, 0, 643, 0, 0, 1427, + 0, 1392, 0, 0, 1502, 0, -2, 0, 0, -2, + 0, 0, 1611, 0, 901, 907, 0, 0, 0, 902, + 918, 944, 0, 937, 960, 0, 964, 0, 0, 951, + 953, 942, 948, 0, 0, 0, 978, 918, 918, 23, + 1042, 0, 0, 0, 871, 875, 0, 1191, 1191, 1191, + 1160, 0, 0, 1163, 1188, 1164, 1189, 0, 0, 1168, + 0, 1170, 0, 1172, 0, 1166, 1167, 1174, 1175, 0, + 1165, 1198, 1242, 0, 1200, 0, 1222, 1224, 1225, 1231, + 0, 0, 0, 0, 0, 0, 0, 519, 520, 1611, + 0, 0, 1531, 1645, 557, 0, 1806, 1807, 597, 0, + 1814, 1823, 1823, 1519, 1896, 0, 1823, 0, 0, 1825, + 1826, 1678, 0, 0, 566, 0, 0, 0, 0, 0, + 0, 0, 580, 581, 0, 0, 565, 0, 0, 607, + 0, 0, 0, 0, 0, 0, 2414, 2414, 0, 574, + 575, 0, 578, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2414, 2414, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1753, 0, 0, 0, 0, + 0, 0, 0, 1768, 1769, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1370, 2414, 0, 0, 0, 0, + 0, 2414, 0, 628, 643, 1422, 1422, 1335, 0, 1390, + 1408, 0, 528, 529, 604, 0, 0, 0, 309, 310, + 0, 0, 315, 333, 335, 307, 0, 0, 0, 334, + 336, 340, 341, 400, 403, 405, 982, 0, 1065, 1063, + 1064, 1085, 1093, 84, 1523, 846, 847, 0, 1635, 857, + 1636, 1637, 1311, 863, 1334, 1413, 0, 1420, 1139, 1148, + 0, 1142, 1247, 1249, 178, 1145, 0, 160, 18, 159, + 151, 152, 0, 18, 0, 0, 0, 0, 2313, 2399, + 2398, 2363, 0, 2364, 2396, 2401, 0, 2404, 0, 498, + 0, 993, 0, 982, 1019, 985, 0, 1017, 889, 0, + 890, 0, 0, 895, 0, 978, 1417, 1785, 1786, 0, + 1789, 1790, 1791, 1792, 1783, 0, 0, 0, 0, 0, + 0, 0, 442, 443, 444, 445, 820, 0, 188, 713, + 1139, 798, 1139, 0, 798, 798, 725, 1688, 1689, 736, + 743, 740, 1432, 1139, 767, 1049, 1050, 779, 781, 1793, + 1139, 1139, 798, 816, 812, 486, 0, 0, 0, 0, + 0, 852, 0, 224, 0, 0, 244, 0, 0, 0, + 1601, 1596, 2228, 2262, 2265, 0, 2263, 2266, 0, 0, + 2275, 2270, 1953, 1963, 2006, 0, 0, 2397, 0, 0, + 0, 2015, 2016, 2397, 2397, 2020, 2393, 2395, 2393, 2026, + 2026, 0, 1498, 0, 1499, 1062, 179, 0, 0, 0, + 0, 2053, 0, 0, 0, 1848, 0, 0, 0, 0, + 0, 2049, 2053, 0, 2053, 2051, 2053, 2053, 2071, 2054, + 2072, 2053, 2053, 2053, 2053, 2053, 2078, 2053, 2053, 2053, + 2053, 2053, 2053, 2053, 2053, 0, 2053, 2053, 2053, 2053, + 0, 2055, 2058, 1986, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2298, 2299, 982, 1052, 968, 1014, + 1011, 0, 0, 0, 0, 0, 73, 73, 1601, 0, + 0, 111, 123, 124, 0, 0, 0, 0, 133, 0, + 0, 0, 0, 0, 0, 0, 1549, 1557, 0, 374, + 0, 93, 94, 96, 0, 0, 0, 0, 0, 0, + 0, 109, 1275, 0, 1276, 0, 1286, 0, 1280, 0, + 0, 1297, 1298, 1300, 0, 1303, 1304, 1305, 0, 1312, + 1313, 1315, 1316, 0, 2431, -2, -2, 2562, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, -2, -2, 2466, -2, -2, -2, -2, + -2, -2, -2, 2490, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, -2, 1305, 0, 0, 1356, 1353, 1354, - 1355, 0, 0, 1404, 641, 642, 643, 644, 0, 0, - 0, 1408, 0, 0, 0, 1365, 0, 0, 0, 1485, - 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, -2, - 1508, 0, 1775, 0, 0, 1781, 1563, 0, 0, 0, - 1570, 0, 0, 1003, 0, -2, -2, 1781, 1561, 2396, - 1781, 1601, 0, 1590, 0, 0, 901, 910, 0, 959, - 961, 0, 0, 959, 0, 0, 0, 970, 0, 971, - 0, 0, 911, 912, 914, 0, 1192, 967, 0, -2, - 0, 0, 869, 0, 0, 1153, 1188, 0, 0, 1154, - 1155, 1157, 1174, 1186, 0, 1180, 1165, 1167, 1169, 1172, - 0, 1147, 0, 1222, 0, 0, 1224, 1225, 1226, 0, - 1199, 512, 0, 1665, 0, 1668, 1669, 514, 0, 1675, - 0, 1678, 1679, 1601, 1592, 0, 533, 593, 593, 0, - 547, 0, 595, 0, 0, 1795, 1826, 1806, 1826, 1826, - 1879, 1826, 1826, 1501, 0, 1648, 0, 0, 1654, 0, - 1661, 0, 0, 0, 0, 0, 595, 0, 0, 565, - 561, 598, 1058, 548, 550, 551, 552, 602, 603, 605, - 0, 607, 608, 609, 567, 579, 580, 581, 582, 0, - 0, 0, 574, 587, 588, 589, 590, 549, 1711, 1712, - 1713, 1714, 1717, 1718, 1719, 1720, 0, 0, 1723, 1724, - 1725, 1726, 1727, 1823, 1824, 1825, 1728, 1729, 1730, 1731, - 1732, 1733, 1734, 1752, 1753, 1754, 1755, 1756, 1757, 1736, - 1737, 1738, 1739, 1740, 1741, 1742, 1743, 0, 0, 1747, - 0, 0, 1275, 0, 541, 542, 0, 544, 0, 0, - 1356, 0, 0, 0, 0, 0, 623, 0, 626, 1404, - 634, 0, 0, 635, 1374, 0, 1392, 0, 1386, 1387, - 0, 0, 931, 1135, 391, 0, 1135, 301, 310, 311, - 312, 319, 0, 660, 325, 1064, 1056, 1057, 0, 851, - 852, 0, 0, 1126, 1145, 0, 153, 156, 0, 151, - 0, 0, 0, 0, 143, 141, 2374, 0, 0, 162, - 991, 202, 0, 0, 1064, 983, 0, 188, 915, 0, - 959, 968, 0, 1776, 1777, 1778, 1779, 0, 1839, 436, - 0, 712, 1135, 716, 795, 1135, 1135, 0, 741, 781, - 785, 782, 1135, 0, 1411, 222, 227, 228, 229, 223, - 221, 1418, 0, 1420, 0, 1576, 0, 0, 2253, 2254, - 2242, 1993, 1946, 2323, 0, 1949, 1951, 1999, 2000, 2003, - 2004, 2005, 2006, 2007, 1952, 0, 1482, 2079, 2081, 0, - 2083, 2084, 2086, 2092, 2093, 0, 0, 2148, 2152, 0, - 0, 2139, 0, 0, 2048, 0, 2049, 0, 0, 2051, - 2052, 2055, 2056, 2057, 2058, 2059, 2061, 2062, 2063, 2064, - 2065, 2066, 2067, 2068, 0, 2070, 2071, 2072, 2073, 0, - 0, 2029, 2041, 1970, 2914, 2913, 0, 1973, 2913, 0, - 1976, 1977, 2915, 0, 0, 0, 0, 0, 0, 1064, - 978, 1049, 0, 0, 1027, 1028, 1029, 1030, 1031, 1023, - 0, 0, 73, 0, 73, 1582, 1584, 124, 126, 0, - 0, 118, 119, 120, 0, 0, 0, 1241, 1545, 1775, - 1533, 0, 1525, 0, 1539, 0, 0, 0, 93, 0, - 95, 0, 2594, 0, 0, 0, 0, 1504, 0, 0, - 1283, 0, 0, 1274, 0, 1285, 1301, 1297, 0, 0, - 0, 1312, 0, 0, 1323, 0, 0, 1344, 1345, 1346, - 1370, 1358, 0, 646, 647, 0, 0, 0, 659, 655, - 656, 657, 637, 1403, 1381, 0, 0, 1381, 1368, 0, - 0, 1380, 0, 1509, 2396, 2396, 2396, 1545, 0, 0, - 0, 1782, 1783, 1785, 1786, 1787, 1565, 0, 1569, 1547, - 0, 1050, 0, 0, 0, 1604, 0, 0, 1595, 0, - 0, 908, 0, 957, 0, 962, 959, 937, 948, 936, - 950, 945, 946, 975, 0, 972, 913, 1036, 1236, 0, - 0, 1135, 868, 871, 872, 0, 1189, 0, 1158, 0, - 1181, 1173, 1149, 1231, 1228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1604, 519, 0, 0, 1629, 0, - 566, 596, 0, 0, 2919, -2, 0, 1827, 0, 0, - 1809, 1827, 0, 0, 1826, 0, 1625, 0, 0, 0, - 0, 0, 1658, 0, 1441, 1441, 1441, 1441, 1441, 0, - 0, 610, 0, 614, 615, 612, 1873, 0, 0, 613, - 555, 595, 0, 0, 600, 0, 606, 1715, 1716, 0, - 1721, 1722, 0, 1746, 0, 0, 536, 539, 0, 1279, - 1280, -2, 0, 0, 0, 618, 0, 0, 0, 627, - 628, 624, 633, 1405, 1406, 1365, 0, 1381, 0, 1391, - 0, 1388, 1389, 1050, 0, 0, 0, 914, 327, 1005, - 0, 0, 1062, 1063, 857, 0, 1124, 0, 1142, 0, - 18, 0, 0, 146, 2384, 2387, 993, 0, 990, 203, - 0, 0, 0, 1011, 985, 0, 982, 959, 890, 889, - 0, 1770, 1780, 713, 1135, 718, 719, 0, 786, 224, - 219, 1419, 1586, 0, 1577, 0, 0, 0, 1898, 1961, - 1962, 1963, 0, 2094, 1831, 0, 0, 1052, 2032, 0, - 2035, 2034, 0, 2035, 2038, 1050, 2030, 0, 0, 0, - 0, 0, 2913, 0, 1979, 0, 1981, 1982, 1983, 0, - 1985, 1986, 2350, 1064, 1025, 0, 1021, 0, 69, 0, - 72, 70, 110, 0, 114, 0, 0, 130, 1520, 0, - 1545, 1524, 0, 0, 0, 1526, 0, 0, 0, 0, - 0, 96, 0, 0, 0, 0, 0, 0, 105, 0, - 0, 0, 0, 1282, 0, 1276, 0, 0, 1294, 1296, - 0, 1309, 0, 1330, 1330, 1357, 1343, 0, 1324, 0, - 0, 648, 649, 0, 652, 658, 1359, 0, 0, 1362, - 1363, 1361, 1364, 0, 0, 1378, 0, 0, 0, 0, - 1495, 0, 1498, -2, 0, 1567, 1545, 0, 0, 1041, - 0, 1663, -2, 1610, 0, 1602, 0, 1594, 0, 1597, - 907, 0, 0, 942, 958, 935, 0, 0, 1135, 1135, - -2, 914, 870, 0, 918, 920, 0, 0, 1175, 0, - 0, 1232, 1234, 1229, 1230, 0, 1666, 513, 1667, 1676, - 515, 1677, 1680, 1681, 1610, 0, 1628, 0, 1642, 597, - 2917, 0, 1828, -2, 1842, 1844, 0, 0, 1514, 1848, - 1849, 0, 0, 0, 0, 0, 0, 0, 0, 1906, - 1859, 0, 0, 0, 1864, 1865, 1866, 0, 0, 0, - 0, 2274, 2275, 0, 1877, 0, 0, 0, 0, 0, - 0, 0, 0, 1803, 1627, 0, 1649, 0, 0, 0, - 0, 0, 0, 0, 527, 528, 529, 530, 531, 0, - 559, 560, 1441, 0, 1874, 1875, 556, 557, 599, 553, - 2396, 569, 1745, 1748, 1749, 540, 543, 0, 0, 632, - 629, 630, 1368, 1373, 1384, 1393, 932, 1039, 1135, 392, - 393, 389, 1065, 1066, 0, 1401, 2042, 0, 0, 147, - 152, 0, 0, 995, 0, 992, 0, 986, 988, 213, - 989, 984, 888, 1769, 717, 795, 171, 205, 0, 0, - 0, 1948, 0, 0, 0, 0, 2082, 2137, 2138, 2035, - 0, 2050, 2035, 2074, 2026, 0, 1971, 2913, 1974, 2913, - 0, 2916, 0, 0, 2351, 0, 1019, 74, 128, 127, - 0, 0, 1521, 0, 0, 0, 1537, 1538, 0, 1540, - 1541, 1542, 0, 0, 0, 0, 78, 0, 0, 0, - 1504, 0, 1504, 0, 0, 0, 1664, 1674, 0, 1284, - 1278, 1288, 1302, 0, 1315, 1313, 1322, 1337, 1321, 0, - 0, 0, 645, 650, 0, 653, 654, 1382, 1381, 0, - 1366, 1367, 0, 1376, 0, 0, 1510, 1511, 1512, 1370, - 1620, 1564, 0, 0, -2, 1708, 0, 1784, 1571, 1548, - 0, 1004, 1555, 1556, 1557, 1558, 1559, 1560, 1586, 2396, - 1662, 1620, 1598, 0, 1605, 0, 1603, 1596, 0, 941, - 951, 973, 1050, 914, 865, 0, 921, 929, 0, 0, - 928, 1190, 1223, 0, 0, 1607, 0, 1630, -2, 0, - 2920, 1843, 1845, 1846, 1847, 1850, 1851, 1852, 1853, 1854, - 1911, 1912, 1913, 0, 0, 1857, 1908, 1909, 1910, 1858, - 0, 0, 0, 1863, 0, 0, 0, 2272, 2273, 1904, - 0, 0, 0, 1810, 1812, 1813, 1814, 1815, 1816, 1817, - 1818, 1819, 1820, 1821, 1822, 1811, 0, 0, 0, 1802, - 1804, 535, 1660, 1650, 0, 1652, 0, 0, 0, 0, - 1442, 2396, 2396, 0, 0, 0, 1452, 1453, 2396, 2396, - 2396, 2396, 2396, 2396, 0, 0, 0, 2396, 2396, 2396, - 2396, 2396, 2396, 0, 1471, 1472, 1473, 0, 2396, 2396, - 2396, 558, 611, 0, 0, 2396, 0, 0, 1383, 914, - 914, 0, 1109, 0, 1125, 1133, 2835, 2837, 2834, 142, - 144, 159, 0, 994, 204, 0, 991, 1135, 173, 0, - 196, 0, 1587, 0, 0, 2001, 1960, 0, 0, 0, - 0, 2047, 1053, 2069, 2039, 2027, 0, 2021, 2022, 2023, - 2028, 0, 0, 1978, 1980, 1984, 1026, 0, 1546, 1534, - 1535, 1536, 1532, 0, 0, 1543, 1544, 0, 76, 0, - 99, 0, 0, 100, 1504, 101, 1504, 0, 0, 1272, - 0, 0, 1338, 1339, 1347, 1348, 0, 1350, 1351, 1371, - 651, 1360, 1369, 1375, 1378, 0, 1443, 1496, 1622, 0, - 1566, 0, 1513, 1710, 2396, 1370, 1573, 0, 1622, 1588, - 0, 1600, 0, 1612, 0, 1606, 0, 1039, 866, 919, - 0, 0, 929, 929, 1233, 1235, 0, 1200, 0, -2, - 518, 0, 1609, 2918, 1631, -2, 0, 1639, 1641, 0, - 0, 1855, 1856, 0, 0, 2158, 2396, 0, 0, 1893, - 0, 1441, 1441, 1441, 1441, 1441, 0, 1646, 1651, 1653, - 1655, 0, 1659, 1657, 0, 0, 1449, 1450, 0, 0, - 0, 0, 0, 0, 0, 0, 1461, 1462, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, - 617, 568, 0, 0, 546, 388, 390, 1067, 2043, 2044, - 0, 1127, 0, 0, 0, 0, 0, 0, 993, 720, - 160, 0, 172, 193, 0, 206, 207, 0, 0, 0, - 0, 1579, 1947, 0, 1901, 1903, 1902, 2024, 0, 0, - 0, 0, 0, 0, 2276, 2277, 2278, 1972, 1975, 129, - 1539, 1539, 1504, 78, 0, 98, 0, 102, 103, 0, - 1504, 0, 1314, 0, 1349, 1377, 1379, 1440, 1554, 0, - 1660, 1568, 1709, 0, 1572, 1673, 1683, 1697, 1690, 1695, - 1696, 1562, 1599, 1611, 0, 1614, 909, 914, 0, 930, - 0, 0, 0, 0, 0, 0, 0, 1207, 1608, 1632, - 1640, 0, 1635, 0, 0, 0, 1907, 0, 1862, 0, - 0, 1870, 1881, 1894, 0, 0, 1790, 0, 1792, 1793, - 0, 1797, 0, 1799, 0, 0, 1626, 0, 1656, 1447, - 1448, 1451, 1454, 1455, 1456, 1457, 1458, 1459, 0, 1463, - 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1474, 1475, 1476, - 1477, 1478, 570, 545, 0, 0, 1134, 0, 0, 0, - 0, 997, 987, 995, 174, 178, 0, 202, 199, 0, - 208, 0, 0, 0, 0, 1575, 0, 1899, 0, 2011, - 0, 0, 0, 0, 2016, 2017, 2018, 2019, 2020, 1527, - 1539, 1528, 1539, 75, 77, 79, 97, 1504, 104, 0, - 1316, 1317, 1331, 1444, 1445, 1446, 0, 1648, 1715, 1672, - 1682, 0, 1688, 0, 1689, 0, 1613, 864, 0, 923, - 0, 0, 1198, 1201, 1202, 0, 0, 0, 1634, 0, - -2, 1643, 0, 0, 2213, 2222, 2223, 1860, 1867, 0, - 1869, 1871, 1872, 1880, 1882, 1883, 0, 1895, 1896, 1897, - 1905, 1441, 1441, 1441, 1441, 1801, 1647, 1460, 2045, 2040, - 0, 2211, 1129, 1130, 996, 0, 979, 165, 0, 0, - 197, 198, 200, 0, 209, 0, 211, 212, 0, 0, - 0, 2012, 2013, 2014, 2015, 1529, 1530, 106, 1318, 1623, - 0, 1625, 0, 0, 0, 0, 0, 0, 1211, 0, - 0, 1636, -2, 0, 1645, 0, 1861, 1870, 1884, 0, - 1885, 0, 0, 0, 1791, 1794, 1798, 1800, 0, 1128, - 0, 0, 998, 1585, 0, 179, 0, 181, 183, 184, - 194, 195, 201, 210, 0, 0, 2025, 1303, 1319, 0, - 0, 1627, 0, 1685, 0, 1702, 1703, 0, 1699, 0, - 0, 1692, 0, 922, 0, 0, 0, 0, 1203, 0, - 1208, 1209, 0, 1204, 0, 1644, 2214, 1868, 1886, 1888, - 1889, 0, 0, 1887, 2046, 2211, 1131, 166, 167, 0, - 180, 0, 1580, 1900, 1320, 1624, 1621, 1684, 0, 0, - 1698, 0, 0, 1691, 0, 0, 0, 952, 0, 0, - 0, 0, 1210, 0, 1890, 1892, 1891, 0, 0, 0, - 182, 1686, 1687, 1704, 1705, 1700, 1701, 1693, 1694, 0, - 0, 0, 0, 0, 0, 1216, 1214, 1205, 1132, 168, - 169, 170, 0, 954, 953, 926, 0, 927, 1212, 0, - 1213, 0, 0, 0, 0, 0, 0, 0, 955, 0, - 1217, 1215, 924, 925, + -2, -2, 1310, 0, 0, 0, 1374, 1371, 1372, 1373, + 0, 0, 1422, 644, 645, 646, 647, 0, 0, 0, + 1426, 0, 0, 0, 1383, 0, 0, 0, 1503, 1504, + 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, -2, 1526, + 0, 1793, 0, 0, 1799, 1581, 0, 0, 0, 1588, + 0, 0, 1007, 0, -2, -2, 1799, 1579, 2414, 1799, + 1619, 0, 1608, 0, 0, 905, 914, 0, 963, 965, + 0, 0, 963, 0, 0, 0, 974, 0, 975, 0, + 0, 915, 916, 918, 0, 1196, 971, 0, -2, 0, + 0, 873, 0, 0, 1157, 1192, 0, 0, 1158, 1159, + 1161, 1178, 1190, 0, 1184, 1169, 1171, 1173, 1176, 0, + 1151, 0, 1226, 0, 0, 1228, 1229, 1230, 0, 1203, + 515, 0, 1683, 0, 1686, 1687, 517, 0, 1693, 0, + 1696, 1697, 1619, 1610, 0, 536, 596, 596, 0, 550, + 0, 598, 0, 0, 1813, 1844, 1824, 1844, 1844, 1897, + 1844, 1844, 1519, 0, 1666, 0, 0, 1672, 0, 1679, + 0, 0, 0, 0, 0, 598, 0, 0, 568, 564, + 601, 1062, 551, 553, 554, 555, 605, 606, 608, 0, + 610, 611, 612, 570, 582, 583, 584, 585, 0, 0, + 0, 577, 590, 591, 592, 593, 552, 1729, 1730, 1731, + 1732, 1735, 1736, 1737, 1738, 0, 0, 1741, 1742, 1743, + 1744, 1745, 1841, 1842, 1843, 1746, 1747, 1748, 1749, 1750, + 1751, 1752, 1770, 1771, 1772, 1773, 1774, 1775, 1754, 1755, + 1756, 1757, 1758, 1759, 1760, 1761, 0, 0, 1765, 0, + 0, 1280, 0, 544, 545, 0, 547, 0, 0, 1374, + 0, 0, 0, 0, 0, 626, 0, 629, 1422, 637, + 0, 0, 638, 1327, 0, 1392, 0, 1410, 0, 1404, + 1405, 0, 0, 935, 1139, 393, 0, 1139, 303, 312, + 313, 314, 321, 0, 663, 327, 1068, 1060, 1061, 0, + 855, 856, 0, 0, 1130, 1149, 0, 155, 158, 0, + 153, 0, 0, 0, 0, 145, 143, 2392, 0, 0, + 164, 995, 204, 0, 0, 1068, 987, 0, 190, 919, + 0, 963, 972, 0, 1794, 1795, 1796, 1797, 0, 1857, + 438, 0, 715, 1139, 719, 798, 1139, 1139, 0, 744, + 784, 788, 785, 1139, 0, 1429, 224, 229, 230, 231, + 225, 223, 1436, 0, 1438, 0, 1594, 0, 0, 2271, + 2272, 2260, 2011, 1964, 2341, 0, 1967, 1969, 2017, 2018, + 2021, 2022, 2023, 2024, 2025, 1970, 0, 1500, 2097, 2099, + 0, 2101, 2102, 2104, 2110, 2111, 0, 0, 2166, 2170, + 0, 0, 2157, 0, 0, 2066, 0, 2067, 0, 0, + 2069, 2070, 2073, 2074, 2075, 2076, 2077, 2079, 2080, 2081, + 2082, 2083, 2084, 2085, 2086, 0, 2088, 2089, 2090, 2091, + 0, 0, 2047, 2059, 1988, 2938, 2937, 0, 1991, 2937, + 0, 1994, 1995, 2939, 0, 0, 0, 0, 0, 0, + 1068, 982, 1053, 0, 0, 1031, 1032, 1033, 1034, 1035, + 1027, 0, 0, 75, 0, 75, 1600, 1602, 126, 128, + 0, 0, 120, 121, 122, 0, 0, 0, 1245, 1563, + 1793, 1551, 0, 1543, 0, 1557, 0, 0, 0, 95, + 0, 97, 0, 2618, 0, 0, 0, 0, 1522, 0, + 0, 1288, 0, 0, 1279, 0, 1290, 1306, 1302, 0, + 0, 0, 1317, 0, 0, 0, 1341, 0, 0, 1362, + 1363, 1364, 1388, 1376, 0, 649, 650, 0, 0, 0, + 662, 658, 659, 660, 640, 1421, 1399, 0, 0, 1399, + 1386, 0, 0, 1398, 0, 1527, 2414, 2414, 2414, 1563, + 0, 0, 0, 1800, 1801, 1803, 1804, 1805, 1583, 0, + 1587, 1565, 0, 1054, 0, 0, 0, 1622, 0, 0, + 1613, 0, 0, 912, 0, 961, 0, 966, 963, 941, + 952, 940, 954, 949, 950, 979, 0, 976, 917, 1040, + 1240, 0, 0, 1139, 872, 875, 876, 0, 1193, 0, + 1162, 0, 1185, 1177, 1153, 1235, 1232, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1622, 522, 0, 0, + 1647, 0, 569, 599, 0, 0, 2943, -2, 0, 1845, + 0, 0, 1827, 1845, 0, 0, 1844, 0, 1643, 0, + 0, 0, 0, 0, 1676, 0, 1459, 1459, 1459, 1459, + 1459, 0, 0, 613, 0, 617, 618, 615, 1891, 0, + 0, 616, 558, 598, 0, 0, 603, 0, 609, 1733, + 1734, 0, 1739, 1740, 0, 1764, 0, 0, 539, 542, + 0, 1284, 1285, -2, 0, 0, 0, 621, 0, 0, + 0, 630, 631, 627, 636, 1423, 1424, 0, 1383, 0, + 1399, 0, 1409, 0, 1406, 1407, 1054, 0, 0, 0, + 918, 329, 1009, 0, 0, 1066, 1067, 861, 0, 1128, + 0, 1146, 0, 18, 0, 0, 148, 2402, 2405, 997, + 0, 994, 205, 0, 0, 0, 1015, 989, 0, 986, + 963, 894, 893, 0, 1788, 1798, 716, 1139, 721, 722, + 0, 789, 226, 221, 1437, 1604, 0, 1595, 0, 0, + 0, 1916, 1979, 1980, 1981, 0, 2112, 1849, 0, 0, + 1056, 2050, 0, 2053, 2052, 0, 2053, 2056, 1054, 2048, + 0, 0, 0, 0, 0, 2937, 0, 1997, 0, 1999, + 2000, 2001, 0, 2003, 2004, 2368, 1068, 1029, 0, 1025, + 0, 71, 0, 74, 72, 112, 0, 116, 0, 0, + 132, 1538, 0, 1563, 1542, 0, 0, 0, 1544, 0, + 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, + 0, 107, 0, 0, 0, 0, 1287, 0, 1281, 0, + 0, 1299, 1301, 0, 1314, 0, 1348, 1326, 1348, 1375, + 1361, 0, 1342, 0, 0, 651, 652, 0, 655, 661, + 1377, 0, 0, 1380, 1381, 1379, 1382, 0, 0, 1396, + 0, 0, 0, 0, 1513, 0, 1516, -2, 0, 1585, + 1563, 0, 0, 1045, 0, 1681, -2, 1628, 0, 1620, + 0, 1612, 0, 1615, 911, 0, 0, 946, 962, 939, + 0, 0, 1139, 1139, -2, 918, 874, 0, 922, 924, + 0, 0, 1179, 0, 0, 1236, 1238, 1233, 1234, 0, + 1684, 516, 1685, 1694, 518, 1695, 1698, 1699, 1628, 0, + 1646, 0, 1660, 600, 2941, 0, 1846, -2, 1860, 1862, + 0, 0, 1532, 1866, 1867, 0, 0, 0, 0, 0, + 0, 0, 0, 1924, 1877, 0, 0, 0, 1882, 1883, + 1884, 0, 0, 0, 0, 2292, 2293, 0, 1895, 0, + 0, 0, 0, 0, 0, 0, 0, 1821, 1645, 0, + 1667, 0, 0, 0, 0, 0, 0, 0, 530, 531, + 532, 533, 534, 0, 562, 563, 1459, 0, 1892, 1893, + 559, 560, 602, 556, 2414, 572, 1763, 1766, 1767, 543, + 546, 0, 0, 635, 632, 633, 0, 1386, 1391, 1402, + 1411, 936, 1043, 1139, 394, 395, 391, 1069, 1070, 0, + 1419, 2060, 0, 0, 149, 154, 0, 0, 999, 0, + 996, 0, 990, 992, 215, 993, 988, 892, 1787, 720, + 798, 173, 207, 0, 0, 0, 1966, 0, 0, 0, + 0, 2100, 2155, 2156, 2053, 0, 2068, 2053, 2092, 2044, + 0, 1989, 2937, 1992, 2937, 0, 2940, 0, 0, 2369, + 0, 1023, 76, 130, 129, 0, 0, 1539, 0, 0, + 0, 1555, 1556, 0, 1558, 1559, 1560, 0, 0, 0, + 0, 80, 0, 0, 0, 1522, 0, 1522, 0, 0, + 0, 1682, 1692, 0, 1289, 1283, 1293, 1307, 0, 1320, + 1318, 1340, 1355, 1339, 0, 0, 0, 648, 653, 0, + 656, 657, 1400, 1399, 0, 1384, 1385, 0, 1394, 0, + 0, 1528, 1529, 1530, 1388, 1638, 1582, 0, 0, -2, + 1726, 0, 1802, 1589, 1566, 0, 1008, 1573, 1574, 1575, + 1576, 1577, 1578, 1604, 2414, 1680, 1638, 1616, 0, 1623, + 0, 1621, 1614, 0, 945, 955, 977, 1054, 918, 869, + 0, 925, 933, 0, 0, 932, 1194, 1227, 0, 0, + 1625, 0, 1648, -2, 0, 2944, 1861, 1863, 1864, 1865, + 1868, 1869, 1870, 1871, 1872, 1929, 1930, 1931, 0, 0, + 1875, 1926, 1927, 1928, 1876, 0, 0, 0, 1881, 0, + 0, 0, 2290, 2291, 1922, 0, 0, 0, 1828, 1830, + 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, + 1829, 0, 0, 0, 1820, 1822, 538, 1678, 1668, 0, + 1670, 0, 0, 0, 0, 1460, 2414, 2414, 0, 0, + 0, 1470, 1471, 2414, 2414, 2414, 2414, 2414, 2414, 0, + 0, 0, 2414, 2414, 2414, 2414, 2414, 2414, 0, 1489, + 1490, 1491, 0, 2414, 2414, 2414, 561, 614, 0, 0, + 2414, 0, 0, 1328, 1329, 1330, 1331, 1332, 1401, 918, + 918, 0, 1113, 0, 1129, 1137, 2859, 2861, 2858, 144, + 146, 161, 0, 998, 206, 0, 995, 1139, 175, 0, + 198, 0, 1605, 0, 0, 2019, 1978, 0, 0, 0, + 0, 2065, 1057, 2087, 2057, 2045, 0, 2039, 2040, 2041, + 2046, 0, 0, 1996, 1998, 2002, 1030, 0, 1564, 1552, + 1553, 1554, 1550, 0, 0, 1561, 1562, 0, 78, 0, + 101, 0, 0, 102, 1522, 103, 1522, 0, 0, 1277, + 0, 0, 1356, 1357, 1365, 1366, 0, 1368, 1369, 1389, + 654, 1378, 1387, 1393, 1396, 0, 1461, 1514, 1640, 0, + 1584, 0, 1531, 1728, 2414, 1388, 1591, 0, 1640, 1606, + 0, 1618, 0, 1630, 0, 1624, 0, 1043, 870, 923, + 0, 0, 933, 933, 1237, 1239, 0, 1204, 0, -2, + 521, 0, 1627, 2942, 1649, -2, 0, 1657, 1659, 0, + 0, 1873, 1874, 0, 0, 2176, 2414, 0, 0, 1911, + 0, 1459, 1459, 1459, 1459, 1459, 0, 1664, 1669, 1671, + 1673, 0, 1677, 1675, 0, 0, 1467, 1468, 0, 0, + 0, 0, 0, 0, 0, 0, 1479, 1480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, + 620, 571, 0, 0, 549, 390, 392, 1071, 2061, 2062, + 0, 1131, 0, 0, 0, 0, 0, 0, 997, 723, + 162, 0, 174, 195, 0, 208, 209, 0, 0, 0, + 0, 1597, 1965, 0, 1919, 1921, 1920, 2042, 0, 0, + 0, 0, 0, 0, 2294, 2295, 2296, 1990, 1993, 131, + 1557, 1557, 1522, 80, 0, 100, 0, 104, 105, 0, + 1522, 0, 1319, 0, 1367, 1395, 1397, 1458, 1572, 0, + 1678, 1586, 1727, 0, 1590, 1691, 1701, 1715, 1708, 1713, + 1714, 1580, 1617, 1629, 0, 1632, 913, 918, 0, 934, + 0, 0, 0, 0, 0, 0, 0, 1211, 1626, 1650, + 1658, 0, 1653, 0, 0, 0, 1925, 0, 1880, 0, + 0, 1888, 1899, 1912, 0, 0, 1808, 0, 1810, 1811, + 0, 1815, 0, 1817, 0, 0, 1644, 0, 1674, 1465, + 1466, 1469, 1472, 1473, 1474, 1475, 1476, 1477, 0, 1481, + 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1492, 1493, 1494, + 1495, 1496, 573, 548, 0, 0, 1138, 0, 0, 0, + 0, 1001, 991, 999, 176, 180, 0, 204, 201, 0, + 210, 0, 0, 0, 0, 1593, 0, 1917, 0, 2029, + 0, 0, 0, 0, 2034, 2035, 2036, 2037, 2038, 1545, + 1557, 1546, 1557, 77, 79, 81, 99, 1522, 106, 0, + 1321, 1322, 1349, 1462, 1463, 1464, 0, 1666, 1733, 1690, + 1700, 0, 1706, 0, 1707, 0, 1631, 868, 0, 927, + 0, 0, 1202, 1205, 1206, 0, 0, 0, 1652, 0, + -2, 1661, 0, 0, 2231, 2240, 2241, 1878, 1885, 0, + 1887, 1889, 1890, 1898, 1900, 1901, 0, 1913, 1914, 1915, + 1923, 1459, 1459, 1459, 1459, 1819, 1665, 1478, 2063, 2058, + 0, 2229, 1133, 1134, 1000, 0, 983, 167, 0, 0, + 199, 200, 202, 0, 211, 0, 213, 214, 0, 0, + 0, 2030, 2031, 2032, 2033, 1547, 1548, 108, 1323, 1641, + 0, 1643, 0, 0, 0, 0, 0, 0, 1215, 0, + 0, 1654, -2, 0, 1663, 0, 1879, 1888, 1902, 0, + 1903, 0, 0, 0, 1809, 1812, 1816, 1818, 0, 1132, + 0, 0, 1002, 1603, 0, 181, 0, 183, 185, 186, + 196, 197, 203, 212, 0, 0, 2043, 1308, 1324, 0, + 0, 1645, 0, 1703, 0, 1720, 1721, 0, 1717, 0, + 0, 1710, 0, 926, 0, 0, 0, 0, 1207, 0, + 1212, 1213, 0, 1208, 0, 1662, 2232, 1886, 1904, 1906, + 1907, 0, 0, 1905, 2064, 2229, 1135, 168, 169, 0, + 182, 0, 1598, 1918, 1325, 1642, 1639, 1702, 0, 0, + 1716, 0, 0, 1709, 0, 0, 0, 956, 0, 0, + 0, 0, 1214, 0, 1908, 1910, 1909, 0, 0, 0, + 184, 1704, 1705, 1722, 1723, 1718, 1719, 1711, 1712, 0, + 0, 0, 0, 0, 0, 1220, 1218, 1209, 1136, 170, + 171, 172, 0, 958, 957, 930, 0, 931, 1216, 0, + 1217, 0, 0, 0, 0, 0, 0, 0, 959, 0, + 1221, 1219, 928, 929, } var yyTok1 = [...]int{ @@ -14869,14 +14968,14 @@ var yyTok1 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 129, 3, 3, 3, 162, 152, 3, 96, 97, 159, 157, 183, 158, 182, 160, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 789, 786, - 139, 138, 140, 3, 790, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 795, 792, + 139, 138, 140, 3, 796, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 164, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 787, 151, 788, 165, + 3, 3, 3, 793, 151, 794, 165, } var yyTok2 = [...]int{ @@ -15011,7 +15110,8 @@ var yyTok3 = [...]int{ 58095, 770, 58096, 771, 58097, 772, 58098, 773, 58099, 774, 58100, 775, 58101, 776, 58102, 777, 58103, 778, 58104, 779, 58105, 780, 58106, 781, 58107, 782, 58108, 783, 58109, 784, - 58110, 785, 0, + 58110, 785, 58111, 786, 58112, 787, 58113, 788, 58114, 789, + 58115, 790, 58116, 791, 0, } var yyErrorMessages = [...]struct { @@ -15361,7 +15461,7 @@ yydefault: case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:1177 +//line mysql_sql.y:1180 { if yyDollar[1].statementUnion() != nil { yylex.(*Lexer).AppendStmt(yyDollar[1].statementUnion()) @@ -15369,7 +15469,7 @@ yydefault: } case 4: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:1183 +//line mysql_sql.y:1186 { yylex.(*Lexer).AppendTopLevelSemicolon(yyDollar[2].pos) if yyDollar[3].statementUnion() != nil { @@ -15379,7 +15479,7 @@ yydefault: case 5: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1192 +//line mysql_sql.y:1195 { yyLOCAL = tree.NewCompoundStmt(yyDollar[2].statementsUnion()) } @@ -15387,7 +15487,7 @@ yydefault: case 6: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.Statement -//line mysql_sql.y:1198 +//line mysql_sql.y:1201 { yyLOCAL = []tree.Statement{yyDollar[1].statementUnion()} } @@ -15395,7 +15495,7 @@ yydefault: case 7: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Statement -//line mysql_sql.y:1202 +//line mysql_sql.y:1205 { yyLOCAL = append(yyDollar[1].statementsUnion(), yyDollar[3].statementUnion()) } @@ -15403,7 +15503,7 @@ yydefault: case 17: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1217 +//line mysql_sql.y:1220 { yyLOCAL = yyDollar[1].statementUnion() } @@ -15411,7 +15511,7 @@ yydefault: case 18: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1221 +//line mysql_sql.y:1224 { yyLOCAL = tree.Statement(nil) } @@ -15419,7 +15519,7 @@ yydefault: case 19: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1227 +//line mysql_sql.y:1230 { yyLOCAL = yyDollar[1].statementUnion() } @@ -15427,7 +15527,7 @@ yydefault: case 20: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1231 +//line mysql_sql.y:1234 { yyLOCAL = yyDollar[1].statementUnion() } @@ -15435,7 +15535,7 @@ yydefault: case 22: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1236 +//line mysql_sql.y:1239 { yyLOCAL = yyDollar[1].statementUnion() } @@ -15443,23 +15543,23 @@ yydefault: case 23: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1240 +//line mysql_sql.y:1243 { yyLOCAL = tree.Statement(nil) } yyVAL.union = yyLOCAL - case 58: + case 60: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1280 +//line mysql_sql.y:1285 { yyLOCAL = yyDollar[1].selectUnion() } yyVAL.union = yyLOCAL - case 69: + case 71: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1296 +//line mysql_sql.y:1301 { var timestamp = yyDollar[2].str var isS3 = false @@ -15471,10 +15571,10 @@ yydefault: yyLOCAL = tree.NewBackupStart(timestamp, isS3, dir, parallelism, option, backuptype, backupts) } yyVAL.union = yyLOCAL - case 70: + case 72: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1307 +//line mysql_sql.y:1312 { var timestamp = yyDollar[2].str var isS3 = true @@ -15486,34 +15586,34 @@ yydefault: yyLOCAL = tree.NewBackupStart(timestamp, isS3, dir, parallelism, option, backuptype, backupts) } yyVAL.union = yyLOCAL - case 71: + case 73: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:1319 +//line mysql_sql.y:1324 { yyVAL.str = "" } - case 72: + case 74: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:1323 +//line mysql_sql.y:1328 { yyVAL.str = yyDollar[2].str } - case 73: + case 75: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:1328 +//line mysql_sql.y:1333 { yyVAL.str = "" } - case 74: + case 76: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:1332 +//line mysql_sql.y:1337 { yyVAL.str = yyDollar[2].str } - case 75: + case 77: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1338 +//line mysql_sql.y:1343 { yyLOCAL = &tree.CreateCDC{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15527,71 +15627,71 @@ yydefault: } } yyVAL.union = yyLOCAL - case 76: + case 78: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:1353 +//line mysql_sql.y:1358 { yyLOCAL = yyDollar[1].strsUnion() } yyVAL.union = yyLOCAL - case 77: + case 79: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:1357 +//line mysql_sql.y:1362 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].strsUnion()...) } yyVAL.union = yyLOCAL - case 78: + case 80: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:1361 +//line mysql_sql.y:1366 { yyLOCAL = []string{} } yyVAL.union = yyLOCAL - case 79: + case 81: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:1365 +//line mysql_sql.y:1370 { yyLOCAL = append(yyLOCAL, yyDollar[1].str) yyLOCAL = append(yyLOCAL, yyDollar[3].str) } yyVAL.union = yyLOCAL - case 80: + case 82: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1372 +//line mysql_sql.y:1377 { yyLOCAL = &tree.ShowCDC{ Option: yyDollar[3].allCDCOptionUnion(), } } yyVAL.union = yyLOCAL - case 81: + case 83: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1380 +//line mysql_sql.y:1385 { yyLOCAL = &tree.PauseCDC{ Option: yyDollar[3].allCDCOptionUnion(), } } yyVAL.union = yyLOCAL - case 82: + case 84: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1388 +//line mysql_sql.y:1393 { yyLOCAL = tree.NewDropCDC(yyDollar[4].allCDCOptionUnion(), yyDollar[3].boolValUnion(), yyDollar[5].boolValUnion()) } yyVAL.union = yyLOCAL - case 83: + case 85: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1393 +//line mysql_sql.y:1398 { yyLOCAL = &tree.AllOrNotCDC{ All: true, @@ -15599,26 +15699,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 84: + case 86: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1400 +//line mysql_sql.y:1405 { yyLOCAL = yyDollar[1].allCDCOptionUnion() } yyVAL.union = yyLOCAL - case 85: + case 87: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1406 +//line mysql_sql.y:1411 { yyLOCAL = yyDollar[1].allCDCOptionUnion() } yyVAL.union = yyLOCAL - case 86: + case 88: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1411 +//line mysql_sql.y:1416 { yyLOCAL = &tree.AllOrNotCDC{ All: false, @@ -15626,10 +15726,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 87: + case 89: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1420 +//line mysql_sql.y:1425 { yyLOCAL = &tree.AllOrNotCDC{ All: true, @@ -15637,10 +15737,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 88: + case 90: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1427 +//line mysql_sql.y:1432 { yyLOCAL = &tree.AllOrNotCDC{ All: false, @@ -15648,30 +15748,30 @@ yydefault: } } yyVAL.union = yyLOCAL - case 89: + case 91: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1436 +//line mysql_sql.y:1441 { yyLOCAL = &tree.ResumeCDC{ TaskName: tree.Identifier(yyDollar[4].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 90: + case 92: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1444 +//line mysql_sql.y:1449 { yyLOCAL = &tree.RestartCDC{ TaskName: tree.Identifier(yyDollar[4].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 91: + case 93: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1452 +//line mysql_sql.y:1457 { yyLOCAL = &tree.CreateSnapShot{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15680,10 +15780,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 92: + case 94: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1462 +//line mysql_sql.y:1467 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELCLUSTER, @@ -15694,10 +15794,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 93: + case 95: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1472 +//line mysql_sql.y:1477 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELACCOUNT, @@ -15708,10 +15808,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 94: + case 96: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1482 +//line mysql_sql.y:1487 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELACCOUNT, @@ -15722,10 +15822,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 95: + case 97: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1492 +//line mysql_sql.y:1497 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELDATABASE, @@ -15736,10 +15836,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 96: + case 98: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1502 +//line mysql_sql.y:1507 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELTABLE, @@ -15750,10 +15850,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 97: + case 99: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1512 +//line mysql_sql.y:1517 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELTABLE, @@ -15766,10 +15866,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 98: + case 100: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1524 +//line mysql_sql.y:1529 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELDATABASE, @@ -15782,10 +15882,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 99: + case 101: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1536 +//line mysql_sql.y:1541 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELACCOUNT, @@ -15797,10 +15897,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 100: + case 102: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1549 +//line mysql_sql.y:1554 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15812,10 +15912,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 101: + case 103: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1560 +//line mysql_sql.y:1565 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15827,10 +15927,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 102: + case 104: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1571 +//line mysql_sql.y:1576 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15843,10 +15943,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 103: + case 105: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1583 +//line mysql_sql.y:1588 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15859,10 +15959,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 104: + case 106: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1595 +//line mysql_sql.y:1600 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15876,10 +15976,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 105: + case 107: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1608 +//line mysql_sql.y:1613 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15891,10 +15991,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 106: + case 108: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1619 +//line mysql_sql.y:1624 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15908,10 +16008,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 107: + case 109: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:1634 +//line mysql_sql.y:1639 { value, ok := signedIntegral(yylex, yyDollar[1].item) if !ok { @@ -15920,10 +16020,10 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 108: + case 110: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1643 +//line mysql_sql.y:1648 { var account tree.Identifier var database tree.Identifier @@ -15956,24 +16056,24 @@ yydefault: yyLOCAL = result } yyVAL.union = yyLOCAL - case 109: + case 111: yyDollar = yyS[yypt-6 : yypt+1] -//line mysql_sql.y:1675 +//line mysql_sql.y:1680 { yylex.Error(restoreSnapshotFromSyntaxHint) goto ret1 } - case 110: + case 112: yyDollar = yyS[yypt-8 : yypt+1] -//line mysql_sql.y:1680 +//line mysql_sql.y:1685 { yylex.Error(restoreSnapshotFromSyntaxHint) goto ret1 } - case 111: + case 113: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1685 +//line mysql_sql.y:1690 { var account tree.Identifier var database tree.Identifier @@ -16011,10 +16111,10 @@ yydefault: yyLOCAL = result } yyVAL.union = yyLOCAL - case 112: + case 114: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1722 +//line mysql_sql.y:1727 { yyLOCAL = &tree.RestoreSnapShot{ Level: tree.RESTORELEVELCLUSTER, @@ -16022,10 +16122,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 113: + case 115: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1729 +//line mysql_sql.y:1734 { result := &tree.RestoreSnapShot{ Level: tree.RESTORELEVELACCOUNT, @@ -16040,25 +16140,25 @@ yydefault: yyLOCAL = result } yyVAL.union = yyLOCAL - case 114: + case 116: yyDollar = yyS[yypt-8 : yypt+1] -//line mysql_sql.y:1743 +//line mysql_sql.y:1748 { yylex.Error(restoreSnapshotFromSyntaxHint) goto ret1 } - case 115: + case 117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:1750 +//line mysql_sql.y:1755 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 116: + case 118: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:1754 +//line mysql_sql.y:1759 { yyLOCAL = tree.IdentifierList{ tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16066,10 +16166,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 117: + case 119: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:1763 +//line mysql_sql.y:1768 { yyLOCAL = tree.IdentifierList{ tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16077,10 +16177,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 118: + case 120: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:1770 +//line mysql_sql.y:1775 { yyLOCAL = tree.IdentifierList{ tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16089,46 +16189,46 @@ yydefault: } } yyVAL.union = yyLOCAL - case 119: + case 121: yyDollar = yyS[yypt-5 : yypt+1] -//line mysql_sql.y:1780 +//line mysql_sql.y:1785 { yyVAL.str = yyDollar[4].cstrUnion().Compare() } - case 120: + case 122: yyDollar = yyS[yypt-5 : yypt+1] -//line mysql_sql.y:1784 +//line mysql_sql.y:1789 { yyVAL.str = strings.ToLower(yyDollar[4].str) } - case 121: + case 123: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:1790 +//line mysql_sql.y:1795 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 122: + case 124: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:1794 +//line mysql_sql.y:1799 { yyVAL.str = yyDollar[1].str } - case 123: + case 125: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:1799 +//line mysql_sql.y:1804 { yyVAL.str = "" } - case 124: + case 126: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:1803 +//line mysql_sql.y:1808 { yyVAL.str = yyDollar[3].cstrUnion().Compare() } - case 125: + case 127: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1809 +//line mysql_sql.y:1814 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELACCOUNT, @@ -16137,10 +16237,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 126: + case 128: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1817 +//line mysql_sql.y:1822 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELDATABASE, @@ -16150,10 +16250,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 127: + case 129: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1826 +//line mysql_sql.y:1831 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELDATABASE, @@ -16164,10 +16264,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 128: + case 130: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1836 +//line mysql_sql.y:1841 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELTABLE, @@ -16178,10 +16278,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 129: + case 131: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1846 +//line mysql_sql.y:1851 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELTABLE, @@ -16193,10 +16293,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 130: + case 132: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1857 +//line mysql_sql.y:1862 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELACCOUNT, @@ -16207,10 +16307,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 131: + case 133: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1867 +//line mysql_sql.y:1872 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELCLUSTER, @@ -16219,10 +16319,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 132: + case 134: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1877 +//line mysql_sql.y:1882 { var connectionId uint64 switch v := yyDollar[3].item.(type) { @@ -16242,20 +16342,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 133: + case 135: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.KillOption -//line mysql_sql.y:1897 +//line mysql_sql.y:1902 { yyLOCAL = tree.KillOption{ Exist: false, } } yyVAL.union = yyLOCAL - case 134: + case 136: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.KillOption -//line mysql_sql.y:1903 +//line mysql_sql.y:1908 { yyLOCAL = tree.KillOption{ Exist: true, @@ -16263,10 +16363,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 135: + case 137: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.KillOption -//line mysql_sql.y:1910 +//line mysql_sql.y:1915 { yyLOCAL = tree.KillOption{ Exist: true, @@ -16274,20 +16374,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 136: + case 138: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.StatementOption -//line mysql_sql.y:1918 +//line mysql_sql.y:1923 { yyLOCAL = tree.StatementOption{ Exist: false, } } yyVAL.union = yyLOCAL - case 137: + case 139: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.StatementOption -//line mysql_sql.y:1924 +//line mysql_sql.y:1929 { yyLOCAL = tree.StatementOption{ Exist: true, @@ -16295,10 +16395,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 138: + case 140: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1933 +//line mysql_sql.y:1938 { yyLOCAL = &tree.CallStmt{ Name: yyDollar[2].procNameUnion(), @@ -16306,30 +16406,30 @@ yydefault: } } yyVAL.union = yyLOCAL - case 139: + case 141: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1942 +//line mysql_sql.y:1947 { yyLOCAL = &tree.LeaveStmt{ Name: tree.Identifier(yyDollar[2].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 140: + case 142: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1950 +//line mysql_sql.y:1955 { yyLOCAL = &tree.IterateStmt{ Name: tree.Identifier(yyDollar[2].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 141: + case 143: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1958 +//line mysql_sql.y:1963 { yyLOCAL = &tree.WhileStmt{ Name: "", @@ -16338,10 +16438,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 142: + case 144: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1966 +//line mysql_sql.y:1971 { yyLOCAL = &tree.WhileStmt{ Name: tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16350,10 +16450,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 143: + case 145: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1976 +//line mysql_sql.y:1981 { yyLOCAL = &tree.RepeatStmt{ Name: "", @@ -16362,10 +16462,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 144: + case 146: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1984 +//line mysql_sql.y:1989 { yyLOCAL = &tree.RepeatStmt{ Name: tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16374,10 +16474,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 145: + case 147: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1994 +//line mysql_sql.y:1999 { yyLOCAL = &tree.LoopStmt{ Name: "", @@ -16385,10 +16485,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 146: + case 148: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2001 +//line mysql_sql.y:2006 { yyLOCAL = &tree.LoopStmt{ Name: tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16396,10 +16496,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 147: + case 149: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2010 +//line mysql_sql.y:2015 { yyLOCAL = &tree.IfStmt{ Cond: yyDollar[2].exprUnion(), @@ -16409,42 +16509,42 @@ yydefault: } } yyVAL.union = yyLOCAL - case 148: + case 150: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.ElseIfStmt -//line mysql_sql.y:2020 +//line mysql_sql.y:2025 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 149: + case 151: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.ElseIfStmt -//line mysql_sql.y:2024 +//line mysql_sql.y:2029 { yyLOCAL = yyDollar[1].elseIfClauseListUnion() } yyVAL.union = yyLOCAL - case 150: + case 152: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.ElseIfStmt -//line mysql_sql.y:2030 +//line mysql_sql.y:2035 { yyLOCAL = []*tree.ElseIfStmt{yyDollar[1].elseIfClauseUnion()} } yyVAL.union = yyLOCAL - case 151: + case 153: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.ElseIfStmt -//line mysql_sql.y:2034 +//line mysql_sql.y:2039 { yyLOCAL = append(yyDollar[1].elseIfClauseListUnion(), yyDollar[2].elseIfClauseUnion()) } yyVAL.union = yyLOCAL - case 152: + case 154: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.ElseIfStmt -//line mysql_sql.y:2040 +//line mysql_sql.y:2045 { yyLOCAL = &tree.ElseIfStmt{ Cond: yyDollar[2].exprUnion(), @@ -16452,10 +16552,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 153: + case 155: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2049 +//line mysql_sql.y:2054 { yyLOCAL = &tree.CaseStmt{ Expr: yyDollar[2].exprUnion(), @@ -16464,26 +16564,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 154: + case 156: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.WhenStmt -//line mysql_sql.y:2059 +//line mysql_sql.y:2064 { yyLOCAL = []*tree.WhenStmt{yyDollar[1].whenClause2Union()} } yyVAL.union = yyLOCAL - case 155: + case 157: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.WhenStmt -//line mysql_sql.y:2063 +//line mysql_sql.y:2068 { yyLOCAL = append(yyDollar[1].whenClauseList2Union(), yyDollar[2].whenClause2Union()) } yyVAL.union = yyLOCAL - case 156: + case 158: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.WhenStmt -//line mysql_sql.y:2069 +//line mysql_sql.y:2074 { yyLOCAL = &tree.WhenStmt{ Cond: yyDollar[2].exprUnion(), @@ -16491,26 +16591,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 157: + case 159: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.Statement -//line mysql_sql.y:2078 +//line mysql_sql.y:2083 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 158: + case 160: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.Statement -//line mysql_sql.y:2082 +//line mysql_sql.y:2087 { yyLOCAL = yyDollar[2].statementsUnion() } yyVAL.union = yyLOCAL - case 159: + case 161: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2088 +//line mysql_sql.y:2093 { ep := &tree.ExportParam{ Outfile: true, @@ -16527,10 +16627,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 160: + case 162: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2106 +//line mysql_sql.y:2111 { yyLOCAL = &tree.Load{ Local: yyDollar[3].boolValUnion(), @@ -16543,76 +16643,76 @@ yydefault: yyLOCAL.(*tree.Load).Param.Strict = yyDollar[11].unsignedOptUnion() } yyVAL.union = yyLOCAL - case 161: + case 163: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2120 +//line mysql_sql.y:2125 { yyLOCAL = &tree.DumpTable{Table: yyDollar[3].tableNameUnion(), Path: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 162: + case 164: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2124 +//line mysql_sql.y:2129 { yyLOCAL = &tree.DumpTable{Table: yyDollar[3].tableNameUnion(), Path: yyDollar[5].str, MetadataOnly: true} } yyVAL.union = yyLOCAL - case 163: + case 165: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2130 +//line mysql_sql.y:2135 { yyLOCAL = &tree.LoadTable{Table: yyDollar[3].tableNameUnion(), Path: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 164: + case 166: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2136 +//line mysql_sql.y:2141 { yyLOCAL = &tree.LoadExtension{ Name: tree.Identifier(yyDollar[2].str), } } yyVAL.union = yyLOCAL - case 165: + case 167: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:2143 +//line mysql_sql.y:2148 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 166: + case 168: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:2147 +//line mysql_sql.y:2152 { yyLOCAL = yyDollar[2].updateExprsUnion() } yyVAL.union = yyLOCAL - case 167: + case 169: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:2153 +//line mysql_sql.y:2158 { yyLOCAL = tree.UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 168: + case 170: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:2157 +//line mysql_sql.y:2162 { yyLOCAL = append(yyDollar[1].updateExprsUnion(), yyDollar[3].updateExprUnion()) } yyVAL.union = yyLOCAL - case 169: + case 171: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UpdateExpr -//line mysql_sql.y:2163 +//line mysql_sql.y:2168 { yyLOCAL = &tree.UpdateExpr{ Names: []*tree.UnresolvedName{yyDollar[1].unresolvedNameUnion()}, @@ -16620,10 +16720,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 170: + case 172: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UpdateExpr -//line mysql_sql.y:2170 +//line mysql_sql.y:2175 { yyLOCAL = &tree.UpdateExpr{ Names: []*tree.UnresolvedName{yyDollar[1].unresolvedNameUnion()}, @@ -16631,18 +16731,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 171: + case 173: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:2178 +//line mysql_sql.y:2183 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 172: + case 174: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:2182 +//line mysql_sql.y:2187 { str := strings.ToLower(yyDollar[2].str) if str == "true" { @@ -16655,18 +16755,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 173: + case 175: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2194 +//line mysql_sql.y:2199 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 174: + case 176: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2198 +//line mysql_sql.y:2203 { str := strings.ToLower(yyDollar[2].str) if str == "true" { @@ -16679,61 +16779,61 @@ yydefault: } } yyVAL.union = yyLOCAL - case 175: + case 177: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:2212 +//line mysql_sql.y:2217 { yyLOCAL = tree.NewUnresolvedName(yyDollar[1].cstrUnion()) } yyVAL.union = yyLOCAL - case 176: + case 178: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:2216 +//line mysql_sql.y:2221 { tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(tblNameCStr, yyDollar[3].cstrUnion()) } yyVAL.union = yyLOCAL - case 177: + case 179: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:2221 +//line mysql_sql.y:2226 { dbNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(dbNameCStr, tblNameCStr, yyDollar[5].cstrUnion()) } yyVAL.union = yyLOCAL - case 178: + case 180: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.LoadColumn -//line mysql_sql.y:2228 +//line mysql_sql.y:2233 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 179: + case 181: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.LoadColumn -//line mysql_sql.y:2232 +//line mysql_sql.y:2237 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 180: + case 182: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.LoadColumn -//line mysql_sql.y:2236 +//line mysql_sql.y:2241 { yyLOCAL = yyDollar[2].loadColumnsUnion() } yyVAL.union = yyLOCAL - case 181: + case 183: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.LoadColumn -//line mysql_sql.y:2242 +//line mysql_sql.y:2247 { switch yyDollar[1].loadColumnUnion().(type) { case *tree.UnresolvedName: @@ -16743,10 +16843,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 182: + case 184: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.LoadColumn -//line mysql_sql.y:2251 +//line mysql_sql.y:2256 { switch yyDollar[3].loadColumnUnion().(type) { case *tree.UnresolvedName: @@ -16756,74 +16856,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 183: + case 185: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.LoadColumn -//line mysql_sql.y:2262 +//line mysql_sql.y:2267 { yyLOCAL = yyDollar[1].unresolvedNameUnion() } yyVAL.union = yyLOCAL - case 184: + case 186: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.LoadColumn -//line mysql_sql.y:2266 +//line mysql_sql.y:2271 { yyLOCAL = yyDollar[1].varExprUnion() } yyVAL.union = yyLOCAL - case 185: + case 187: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.VarExpr -//line mysql_sql.y:2272 +//line mysql_sql.y:2277 { yyLOCAL = []*tree.VarExpr{yyDollar[1].varExprUnion()} } yyVAL.union = yyLOCAL - case 186: + case 188: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.VarExpr -//line mysql_sql.y:2276 +//line mysql_sql.y:2281 { yyLOCAL = append(yyDollar[1].varExprsUnion(), yyDollar[3].varExprUnion()) } yyVAL.union = yyLOCAL - case 187: + case 189: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.VarExpr -//line mysql_sql.y:2282 +//line mysql_sql.y:2287 { yyLOCAL = []*tree.VarExpr{yyDollar[1].varExprUnion()} } yyVAL.union = yyLOCAL - case 188: + case 190: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.VarExpr -//line mysql_sql.y:2286 +//line mysql_sql.y:2291 { yyLOCAL = append(yyDollar[1].varExprsUnion(), yyDollar[3].varExprUnion()) } yyVAL.union = yyLOCAL - case 189: + case 191: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.VarExpr -//line mysql_sql.y:2292 +//line mysql_sql.y:2297 { yyLOCAL = yyDollar[1].varExprUnion() } yyVAL.union = yyLOCAL - case 190: + case 192: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.VarExpr -//line mysql_sql.y:2296 +//line mysql_sql.y:2301 { yyLOCAL = yyDollar[1].varExprUnion() } yyVAL.union = yyLOCAL - case 191: + case 193: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.VarExpr -//line mysql_sql.y:2302 +//line mysql_sql.y:2307 { v := strings.ToLower(yyDollar[1].str) var isGlobal bool @@ -16842,10 +16942,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 192: + case 194: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.VarExpr -//line mysql_sql.y:2322 +//line mysql_sql.y:2327 { // vs := strings.Split($1, ".") // var r string @@ -16864,18 +16964,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 193: + case 195: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:2341 +//line mysql_sql.y:2346 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 194: + case 196: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:2345 +//line mysql_sql.y:2350 { value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -16884,10 +16984,10 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 195: + case 197: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:2351 +//line mysql_sql.y:2356 { value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -16896,18 +16996,18 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 196: + case 198: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Lines -//line mysql_sql.y:2358 +//line mysql_sql.y:2363 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 197: + case 199: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Lines -//line mysql_sql.y:2362 +//line mysql_sql.y:2367 { yyLOCAL = &tree.Lines{ StartingBy: yyDollar[2].str, @@ -16917,10 +17017,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 198: + case 200: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Lines -//line mysql_sql.y:2371 +//line mysql_sql.y:2376 { yyLOCAL = &tree.Lines{ StartingBy: yyDollar[3].str, @@ -16930,42 +17030,42 @@ yydefault: } } yyVAL.union = yyLOCAL - case 199: + case 201: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:2381 +//line mysql_sql.y:2386 { yyVAL.str = "" } - case 201: + case 203: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:2388 +//line mysql_sql.y:2393 { yyVAL.str = yyDollar[3].str } - case 202: + case 204: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:2393 +//line mysql_sql.y:2398 { yyVAL.str = "\n" } - case 204: + case 206: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:2400 +//line mysql_sql.y:2405 { yyVAL.str = yyDollar[3].str } - case 205: + case 207: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2405 +//line mysql_sql.y:2410 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 206: + case 208: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2409 +//line mysql_sql.y:2414 { res := &tree.Fields{ Terminated: &tree.Terminated{ @@ -16992,26 +17092,26 @@ yydefault: yyLOCAL = res } yyVAL.union = yyLOCAL - case 207: + case 209: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Fields -//line mysql_sql.y:2437 +//line mysql_sql.y:2442 { yyLOCAL = []*tree.Fields{yyDollar[1].fieldsUnion()} } yyVAL.union = yyLOCAL - case 208: + case 210: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.Fields -//line mysql_sql.y:2441 +//line mysql_sql.y:2446 { yyLOCAL = append(yyDollar[1].fieldsListUnion(), yyDollar[2].fieldsUnion()) } yyVAL.union = yyLOCAL - case 209: + case 211: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2447 +//line mysql_sql.y:2452 { yyLOCAL = &tree.Fields{ Terminated: &tree.Terminated{ @@ -17020,10 +17120,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 210: + case 212: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2455 +//line mysql_sql.y:2460 { str := yyDollar[4].str if str != "\\" && len(str) > 1 { @@ -17044,10 +17144,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 211: + case 213: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2475 +//line mysql_sql.y:2480 { str := yyDollar[3].str if str != "\\" && len(str) > 1 { @@ -17067,10 +17167,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 212: + case 214: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2494 +//line mysql_sql.y:2499 { str := yyDollar[3].str if str != "\\" && len(str) > 1 { @@ -17090,50 +17190,50 @@ yydefault: } } yyVAL.union = yyLOCAL - case 214: + case 216: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.DuplicateKey -//line mysql_sql.y:2519 +//line mysql_sql.y:2524 { yyLOCAL = &tree.DuplicateKeyError{} } yyVAL.union = yyLOCAL - case 215: + case 217: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.DuplicateKey -//line mysql_sql.y:2523 +//line mysql_sql.y:2528 { yyLOCAL = &tree.DuplicateKeyIgnore{} } yyVAL.union = yyLOCAL - case 216: + case 218: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.DuplicateKey -//line mysql_sql.y:2527 +//line mysql_sql.y:2532 { yyLOCAL = &tree.DuplicateKeyReplace{} } yyVAL.union = yyLOCAL - case 217: + case 219: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2532 +//line mysql_sql.y:2537 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 218: + case 220: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2536 +//line mysql_sql.y:2541 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 219: + case 221: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2542 +//line mysql_sql.y:2547 { yyLOCAL = &tree.Grant{ Typ: tree.GrantTypePrivilege, @@ -17147,10 +17247,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 220: + case 222: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2555 +//line mysql_sql.y:2560 { yyLOCAL = &tree.Grant{ Typ: tree.GrantTypeRole, @@ -17162,10 +17262,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 221: + case 223: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2566 +//line mysql_sql.y:2571 { yyLOCAL = &tree.Grant{ Typ: tree.GrantTypeProxy, @@ -17178,26 +17278,26 @@ yydefault: } yyVAL.union = yyLOCAL - case 222: + case 224: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2579 +//line mysql_sql.y:2584 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 223: + case 225: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2583 +//line mysql_sql.y:2588 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 224: + case 226: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2593 +//line mysql_sql.y:2598 { yyLOCAL = &tree.Revoke{ Typ: tree.RevokeTypePrivilege, @@ -17211,10 +17311,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 225: + case 227: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2606 +//line mysql_sql.y:2611 { yyLOCAL = &tree.Revoke{ Typ: tree.RevokeTypeRole, @@ -17226,30 +17326,30 @@ yydefault: } } yyVAL.union = yyLOCAL - case 226: + case 228: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.PrivilegeLevel -//line mysql_sql.y:2619 +//line mysql_sql.y:2624 { yyLOCAL = &tree.PrivilegeLevel{ Level: tree.PRIVILEGE_LEVEL_TYPE_STAR, } } yyVAL.union = yyLOCAL - case 227: + case 229: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.PrivilegeLevel -//line mysql_sql.y:2625 +//line mysql_sql.y:2630 { yyLOCAL = &tree.PrivilegeLevel{ Level: tree.PRIVILEGE_LEVEL_TYPE_STAR_STAR, } } yyVAL.union = yyLOCAL - case 228: + case 230: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.PrivilegeLevel -//line mysql_sql.y:2631 +//line mysql_sql.y:2636 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) yyLOCAL = &tree.PrivilegeLevel{ @@ -17258,10 +17358,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 229: + case 231: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.PrivilegeLevel -//line mysql_sql.y:2639 +//line mysql_sql.y:2644 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) @@ -17272,10 +17372,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 230: + case 232: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.PrivilegeLevel -//line mysql_sql.y:2649 +//line mysql_sql.y:2654 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) yyLOCAL = &tree.PrivilegeLevel{ @@ -17284,74 +17384,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 231: + case 233: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2659 +//line mysql_sql.y:2664 { yyLOCAL = tree.OBJECT_TYPE_TABLE } yyVAL.union = yyLOCAL - case 232: + case 234: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2663 +//line mysql_sql.y:2668 { yyLOCAL = tree.OBJECT_TYPE_DATABASE } yyVAL.union = yyLOCAL - case 233: + case 235: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2667 +//line mysql_sql.y:2672 { yyLOCAL = tree.OBJECT_TYPE_FUNCTION } yyVAL.union = yyLOCAL - case 234: + case 236: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2671 +//line mysql_sql.y:2676 { yyLOCAL = tree.OBJECT_TYPE_PROCEDURE } yyVAL.union = yyLOCAL - case 235: + case 237: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2675 +//line mysql_sql.y:2680 { yyLOCAL = tree.OBJECT_TYPE_VIEW } yyVAL.union = yyLOCAL - case 236: + case 238: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2679 +//line mysql_sql.y:2684 { yyLOCAL = tree.OBJECT_TYPE_ACCOUNT } yyVAL.union = yyLOCAL - case 237: + case 239: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Privilege -//line mysql_sql.y:2685 +//line mysql_sql.y:2690 { yyLOCAL = []*tree.Privilege{yyDollar[1].privilegeUnion()} } yyVAL.union = yyLOCAL - case 238: + case 240: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Privilege -//line mysql_sql.y:2689 +//line mysql_sql.y:2694 { yyLOCAL = append(yyDollar[1].privilegesUnion(), yyDollar[3].privilegeUnion()) } yyVAL.union = yyLOCAL - case 239: + case 241: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Privilege -//line mysql_sql.y:2695 +//line mysql_sql.y:2700 { yyLOCAL = &tree.Privilege{ Type: yyDollar[1].privilegeTypeUnion(), @@ -17359,10 +17459,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 240: + case 242: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Privilege -//line mysql_sql.y:2702 +//line mysql_sql.y:2707 { yyLOCAL = &tree.Privilege{ Type: yyDollar[1].privilegeTypeUnion(), @@ -17370,434 +17470,434 @@ yydefault: } } yyVAL.union = yyLOCAL - case 241: + case 243: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.UnresolvedName -//line mysql_sql.y:2711 +//line mysql_sql.y:2716 { yyLOCAL = []*tree.UnresolvedName{yyDollar[1].unresolvedNameUnion()} } yyVAL.union = yyLOCAL - case 242: + case 244: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.UnresolvedName -//line mysql_sql.y:2715 +//line mysql_sql.y:2720 { yyLOCAL = append(yyDollar[1].unresolveNamesUnion(), yyDollar[3].unresolvedNameUnion()) } yyVAL.union = yyLOCAL - case 243: + case 245: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2721 +//line mysql_sql.y:2726 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALL } yyVAL.union = yyLOCAL - case 244: + case 246: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2725 +//line mysql_sql.y:2730 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_ACCOUNT } yyVAL.union = yyLOCAL - case 245: + case 247: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2729 +//line mysql_sql.y:2734 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_ACCOUNT } yyVAL.union = yyLOCAL - case 246: + case 248: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2733 +//line mysql_sql.y:2738 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_ACCOUNT } yyVAL.union = yyLOCAL - case 247: + case 249: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2737 +//line mysql_sql.y:2742 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_UPGRADE_ACCOUNT } yyVAL.union = yyLOCAL - case 248: + case 250: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2741 +//line mysql_sql.y:2746 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALL } yyVAL.union = yyLOCAL - case 249: + case 251: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2745 +//line mysql_sql.y:2750 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_TABLE } yyVAL.union = yyLOCAL - case 250: + case 252: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2749 +//line mysql_sql.y:2754 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_VIEW } yyVAL.union = yyLOCAL - case 251: + case 253: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2753 +//line mysql_sql.y:2758 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE } yyVAL.union = yyLOCAL - case 252: + case 254: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2757 +//line mysql_sql.y:2762 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_USER } yyVAL.union = yyLOCAL - case 253: + case 255: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2761 +//line mysql_sql.y:2766 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_USER } yyVAL.union = yyLOCAL - case 254: + case 256: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2765 +//line mysql_sql.y:2770 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_USER } yyVAL.union = yyLOCAL - case 255: + case 257: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2769 +//line mysql_sql.y:2774 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_TABLESPACE } yyVAL.union = yyLOCAL - case 256: + case 258: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2773 +//line mysql_sql.y:2778 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_TRIGGER } yyVAL.union = yyLOCAL - case 257: + case 259: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2777 +//line mysql_sql.y:2782 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DELETE } yyVAL.union = yyLOCAL - case 258: + case 260: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2781 +//line mysql_sql.y:2786 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_TABLE } yyVAL.union = yyLOCAL - case 259: + case 261: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2785 +//line mysql_sql.y:2790 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_VIEW } yyVAL.union = yyLOCAL - case 260: + case 262: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2789 +//line mysql_sql.y:2794 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_EXECUTE } yyVAL.union = yyLOCAL - case 261: + case 263: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2793 +//line mysql_sql.y:2798 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_INDEX } yyVAL.union = yyLOCAL - case 262: + case 264: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2797 +//line mysql_sql.y:2802 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_INSERT } yyVAL.union = yyLOCAL - case 263: + case 265: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2801 +//line mysql_sql.y:2806 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SELECT } yyVAL.union = yyLOCAL - case 264: + case 266: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2805 +//line mysql_sql.y:2810 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SUPER } yyVAL.union = yyLOCAL - case 265: + case 267: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2809 +//line mysql_sql.y:2814 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_DATABASE } yyVAL.union = yyLOCAL - case 266: + case 268: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2813 +//line mysql_sql.y:2818 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_DATABASE } yyVAL.union = yyLOCAL - case 267: + case 269: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2817 +//line mysql_sql.y:2822 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SHOW_DATABASES } yyVAL.union = yyLOCAL - case 268: + case 270: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2821 +//line mysql_sql.y:2826 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CONNECT } yyVAL.union = yyLOCAL - case 269: + case 271: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2825 +//line mysql_sql.y:2830 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_MANAGE_GRANTS } yyVAL.union = yyLOCAL - case 270: + case 272: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2829 +//line mysql_sql.y:2834 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_OWNERSHIP } yyVAL.union = yyLOCAL - case 271: + case 273: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2833 +//line mysql_sql.y:2838 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SHOW_TABLES } yyVAL.union = yyLOCAL - case 272: + case 274: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2837 +//line mysql_sql.y:2842 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_TABLE } yyVAL.union = yyLOCAL - case 273: + case 275: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2841 +//line mysql_sql.y:2846 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_UPDATE } yyVAL.union = yyLOCAL - case 274: + case 276: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2845 +//line mysql_sql.y:2850 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_GRANT_OPTION } yyVAL.union = yyLOCAL - case 275: + case 277: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2849 +//line mysql_sql.y:2854 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_REFERENCES } yyVAL.union = yyLOCAL - case 276: + case 278: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2853 +//line mysql_sql.y:2858 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_REFERENCE } yyVAL.union = yyLOCAL - case 277: + case 279: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2857 +//line mysql_sql.y:2862 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_REPLICATION_SLAVE } yyVAL.union = yyLOCAL - case 278: + case 280: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2861 +//line mysql_sql.y:2866 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_REPLICATION_CLIENT } yyVAL.union = yyLOCAL - case 279: + case 281: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2865 +//line mysql_sql.y:2870 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_USAGE } yyVAL.union = yyLOCAL - case 280: + case 282: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2869 +//line mysql_sql.y:2874 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_RELOAD } yyVAL.union = yyLOCAL - case 281: + case 283: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2873 +//line mysql_sql.y:2878 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_FILE } yyVAL.union = yyLOCAL - case 282: + case 284: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2877 +//line mysql_sql.y:2882 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_TEMPORARY_TABLES } yyVAL.union = yyLOCAL - case 283: + case 285: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2881 +//line mysql_sql.y:2886 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_LOCK_TABLES } yyVAL.union = yyLOCAL - case 284: + case 286: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2885 +//line mysql_sql.y:2890 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_VIEW } yyVAL.union = yyLOCAL - case 285: + case 287: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2889 +//line mysql_sql.y:2894 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SHOW_VIEW } yyVAL.union = yyLOCAL - case 286: + case 288: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2893 +//line mysql_sql.y:2898 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_ROLE } yyVAL.union = yyLOCAL - case 287: + case 289: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2897 +//line mysql_sql.y:2902 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_ROLE } yyVAL.union = yyLOCAL - case 288: + case 290: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2901 +//line mysql_sql.y:2906 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_ROLE } yyVAL.union = yyLOCAL - case 289: + case 291: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2905 +//line mysql_sql.y:2910 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_ROUTINE } yyVAL.union = yyLOCAL - case 290: + case 292: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2909 +//line mysql_sql.y:2914 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_ROUTINE } yyVAL.union = yyLOCAL - case 291: + case 293: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2913 +//line mysql_sql.y:2918 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_EVENT } yyVAL.union = yyLOCAL - case 292: + case 294: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2917 +//line mysql_sql.y:2922 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SHUTDOWN } yyVAL.union = yyLOCAL - case 293: + case 295: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2921 +//line mysql_sql.y:2926 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_TRUNCATE } yyVAL.union = yyLOCAL - case 301: + case 303: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2936 +//line mysql_sql.y:2941 { yyLOCAL = &tree.SetLogserviceSettings{ Name: yyDollar[4].str, @@ -17805,10 +17905,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 302: + case 304: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2945 +//line mysql_sql.y:2950 { yyLOCAL = &tree.SetTransaction{ Scope: tree.TransactionScopeNext, @@ -17816,10 +17916,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 303: + case 305: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2952 +//line mysql_sql.y:2957 { yyLOCAL = &tree.SetTransaction{ Scope: tree.TransactionScopeGlobal, @@ -17827,10 +17927,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 304: + case 306: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2959 +//line mysql_sql.y:2964 { yyLOCAL = &tree.SetTransaction{ Scope: tree.TransactionScopeSession, @@ -17838,10 +17938,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 305: + case 307: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2968 +//line mysql_sql.y:2973 { var connID uint32 switch v := yyDollar[5].item.(type) { @@ -17858,26 +17958,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 306: + case 308: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.TransactionCharacteristic -//line mysql_sql.y:2986 +//line mysql_sql.y:2991 { yyLOCAL = []*tree.TransactionCharacteristic{yyDollar[1].transactionCharacteristicUnion()} } yyVAL.union = yyLOCAL - case 307: + case 309: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.TransactionCharacteristic -//line mysql_sql.y:2990 +//line mysql_sql.y:2995 { yyLOCAL = append(yyDollar[1].transactionCharacteristicListUnion(), yyDollar[3].transactionCharacteristicUnion()) } yyVAL.union = yyLOCAL - case 308: + case 310: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.TransactionCharacteristic -//line mysql_sql.y:2996 +//line mysql_sql.y:3001 { yyLOCAL = &tree.TransactionCharacteristic{ IsLevel: true, @@ -17885,68 +17985,68 @@ yydefault: } } yyVAL.union = yyLOCAL - case 309: + case 311: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.TransactionCharacteristic -//line mysql_sql.y:3003 +//line mysql_sql.y:3008 { yyLOCAL = &tree.TransactionCharacteristic{ Access: yyDollar[1].accessModeUnion(), } } yyVAL.union = yyLOCAL - case 310: + case 312: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IsolationLevelType -//line mysql_sql.y:3011 +//line mysql_sql.y:3016 { yyLOCAL = tree.ISOLATION_LEVEL_REPEATABLE_READ } yyVAL.union = yyLOCAL - case 311: + case 313: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IsolationLevelType -//line mysql_sql.y:3015 +//line mysql_sql.y:3020 { yyLOCAL = tree.ISOLATION_LEVEL_READ_COMMITTED } yyVAL.union = yyLOCAL - case 312: + case 314: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IsolationLevelType -//line mysql_sql.y:3019 +//line mysql_sql.y:3024 { yyLOCAL = tree.ISOLATION_LEVEL_READ_UNCOMMITTED } yyVAL.union = yyLOCAL - case 313: + case 315: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IsolationLevelType -//line mysql_sql.y:3023 +//line mysql_sql.y:3028 { yyLOCAL = tree.ISOLATION_LEVEL_SERIALIZABLE } yyVAL.union = yyLOCAL - case 314: + case 316: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AccessModeType -//line mysql_sql.y:3029 +//line mysql_sql.y:3034 { yyLOCAL = tree.ACCESS_MODE_READ_WRITE } yyVAL.union = yyLOCAL - case 315: + case 317: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AccessModeType -//line mysql_sql.y:3033 +//line mysql_sql.y:3038 { yyLOCAL = tree.ACCESS_MODE_READ_ONLY } yyVAL.union = yyLOCAL - case 316: + case 318: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3039 +//line mysql_sql.y:3044 { yyLOCAL = &tree.SetRole{ SecondaryRole: false, @@ -17954,10 +18054,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 317: + case 319: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3046 +//line mysql_sql.y:3051 { yyLOCAL = &tree.SetRole{ SecondaryRole: true, @@ -17965,10 +18065,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 318: + case 320: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3053 +//line mysql_sql.y:3058 { yyLOCAL = &tree.SetRole{ SecondaryRole: true, @@ -17976,90 +18076,90 @@ yydefault: } } yyVAL.union = yyLOCAL - case 319: + case 321: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3062 +//line mysql_sql.y:3067 { dr := yyDollar[4].setDefaultRoleUnion() dr.Users = yyDollar[6].usersUnion() yyLOCAL = dr } yyVAL.union = yyLOCAL - case 320: + case 322: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.SetDefaultRole -//line mysql_sql.y:3092 +//line mysql_sql.y:3097 { yyLOCAL = &tree.SetDefaultRole{Type: tree.SET_DEFAULT_ROLE_TYPE_NONE, Roles: nil} } yyVAL.union = yyLOCAL - case 321: + case 323: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.SetDefaultRole -//line mysql_sql.y:3096 +//line mysql_sql.y:3101 { yyLOCAL = &tree.SetDefaultRole{Type: tree.SET_DEFAULT_ROLE_TYPE_ALL, Roles: nil} } yyVAL.union = yyLOCAL - case 322: + case 324: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.SetDefaultRole -//line mysql_sql.y:3100 +//line mysql_sql.y:3105 { yyLOCAL = &tree.SetDefaultRole{Type: tree.SET_DEFAULT_ROLE_TYPE_NORMAL, Roles: yyDollar[1].rolesUnion()} } yyVAL.union = yyLOCAL - case 323: + case 325: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3106 +//line mysql_sql.y:3111 { yyLOCAL = &tree.SetVar{Assignments: yyDollar[2].varAssignmentExprsUnion()} } yyVAL.union = yyLOCAL - case 324: + case 326: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3112 +//line mysql_sql.y:3117 { yyLOCAL = &tree.SetPassword{Password: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 325: + case 327: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3116 +//line mysql_sql.y:3121 { yyLOCAL = &tree.SetPassword{User: yyDollar[4].userUnion(), Password: yyDollar[6].str} } yyVAL.union = yyLOCAL - case 327: + case 329: yyDollar = yyS[yypt-4 : yypt+1] -//line mysql_sql.y:3123 +//line mysql_sql.y:3128 { yyVAL.str = yyDollar[3].str } - case 328: + case 330: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.VarAssignmentExpr -//line mysql_sql.y:3129 +//line mysql_sql.y:3134 { yyLOCAL = []*tree.VarAssignmentExpr{yyDollar[1].varAssignmentExprUnion()} } yyVAL.union = yyLOCAL - case 329: + case 331: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.VarAssignmentExpr -//line mysql_sql.y:3133 +//line mysql_sql.y:3138 { yyLOCAL = append(yyDollar[1].varAssignmentExprsUnion(), yyDollar[3].varAssignmentExprUnion()) } yyVAL.union = yyLOCAL - case 330: + case 332: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3139 +//line mysql_sql.y:3144 { yyLOCAL = &tree.VarAssignmentExpr{ System: true, @@ -18069,10 +18169,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 331: + case 333: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3148 +//line mysql_sql.y:3153 { yyLOCAL = &tree.VarAssignmentExpr{ System: true, @@ -18083,10 +18183,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 332: + case 334: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3158 +//line mysql_sql.y:3163 { yyLOCAL = &tree.VarAssignmentExpr{ System: true, @@ -18097,10 +18197,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 333: + case 335: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3168 +//line mysql_sql.y:3173 { yyLOCAL = &tree.VarAssignmentExpr{ System: true, @@ -18110,10 +18210,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 334: + case 336: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3177 +//line mysql_sql.y:3182 { yyLOCAL = &tree.VarAssignmentExpr{ System: true, @@ -18123,10 +18223,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 335: + case 337: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3186 +//line mysql_sql.y:3191 { vs := strings.Split(yyDollar[1].str, ".") var isGlobal bool @@ -18150,10 +18250,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 336: + case 338: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3209 +//line mysql_sql.y:3214 { v := strings.ToLower(yyDollar[1].str) var isGlobal bool @@ -18178,10 +18278,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 337: + case 339: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3233 +//line mysql_sql.y:3238 { yyLOCAL = &tree.VarAssignmentExpr{ SetNames: true, @@ -18190,10 +18290,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 338: + case 340: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3241 +//line mysql_sql.y:3246 { yyLOCAL = &tree.VarAssignmentExpr{ SetNames: true, @@ -18202,10 +18302,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 339: + case 341: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3249 +//line mysql_sql.y:3254 { yyLOCAL = &tree.VarAssignmentExpr{ SetNames: true, @@ -18215,10 +18315,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 340: + case 342: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3258 +//line mysql_sql.y:3263 { yyLOCAL = &tree.VarAssignmentExpr{ SetNames: true, @@ -18227,10 +18327,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 341: + case 343: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3266 +//line mysql_sql.y:3271 { yyLOCAL = &tree.VarAssignmentExpr{ CharsetRequest: true, @@ -18239,10 +18339,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 342: + case 344: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3274 +//line mysql_sql.y:3279 { yyLOCAL = &tree.VarAssignmentExpr{ CharsetRequest: true, @@ -18251,260 +18351,260 @@ yydefault: } } yyVAL.union = yyLOCAL - case 343: + case 345: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:3284 +//line mysql_sql.y:3289 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 344: + case 346: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:3288 +//line mysql_sql.y:3293 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 345: + case 347: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:3292 +//line mysql_sql.y:3297 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 346: + case 348: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3298 +//line mysql_sql.y:3303 { yyVAL.str = string(yyDollar[1].str) } - case 347: + case 349: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3302 +//line mysql_sql.y:3307 { yyVAL.str = yyDollar[1].str } - case 348: + case 350: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3308 +//line mysql_sql.y:3313 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 349: + case 351: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:3312 +//line mysql_sql.y:3317 { yyVAL.str = yyDollar[1].cstrUnion().Compare() + "." + yyDollar[3].cstrUnion().Compare() } - case 350: + case 352: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:3318 +//line mysql_sql.y:3323 { yyLOCAL = []string{yyDollar[1].str} } yyVAL.union = yyLOCAL - case 351: + case 353: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:3322 +//line mysql_sql.y:3327 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 358: + case 360: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3336 +//line mysql_sql.y:3341 { yyLOCAL = &tree.SavePoint{Name: tree.Identifier(yyDollar[2].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 359: + case 361: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3342 +//line mysql_sql.y:3347 { yyLOCAL = &tree.ReleaseSavePoint{Name: tree.Identifier(yyDollar[3].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 360: + case 362: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3348 +//line mysql_sql.y:3353 { yyLOCAL = &tree.RollbackToSavePoint{Name: tree.Identifier(yyDollar[3].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 361: + case 363: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3353 +//line mysql_sql.y:3358 { yyLOCAL = &tree.RollbackToSavePoint{Name: tree.Identifier(yyDollar[4].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 362: + case 364: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3358 +//line mysql_sql.y:3363 { yyLOCAL = &tree.RollbackToSavePoint{Name: tree.Identifier(yyDollar[5].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 363: + case 365: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3363 +//line mysql_sql.y:3368 { yyLOCAL = &tree.RollbackToSavePoint{Name: tree.Identifier(yyDollar[4].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 364: + case 366: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3369 +//line mysql_sql.y:3374 { yyLOCAL = &tree.RollbackTransaction{Type: yyDollar[2].completionTypeUnion()} } yyVAL.union = yyLOCAL - case 365: + case 367: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3375 +//line mysql_sql.y:3380 { yyLOCAL = &tree.CommitTransaction{Type: yyDollar[2].completionTypeUnion()} } yyVAL.union = yyLOCAL - case 366: + case 368: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3380 +//line mysql_sql.y:3385 { yyLOCAL = tree.COMPLETION_TYPE_NO_CHAIN } yyVAL.union = yyLOCAL - case 367: + case 369: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3384 +//line mysql_sql.y:3389 { yyLOCAL = tree.COMPLETION_TYPE_NO_CHAIN } yyVAL.union = yyLOCAL - case 368: + case 370: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3388 +//line mysql_sql.y:3393 { yyLOCAL = tree.COMPLETION_TYPE_CHAIN } yyVAL.union = yyLOCAL - case 369: + case 371: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3392 +//line mysql_sql.y:3397 { yyLOCAL = tree.COMPLETION_TYPE_CHAIN } yyVAL.union = yyLOCAL - case 370: + case 372: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3396 +//line mysql_sql.y:3401 { yyLOCAL = tree.COMPLETION_TYPE_RELEASE } yyVAL.union = yyLOCAL - case 371: + case 373: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3400 +//line mysql_sql.y:3405 { yyLOCAL = tree.COMPLETION_TYPE_RELEASE } yyVAL.union = yyLOCAL - case 372: + case 374: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3404 +//line mysql_sql.y:3409 { yyLOCAL = tree.COMPLETION_TYPE_NO_CHAIN } yyVAL.union = yyLOCAL - case 373: + case 375: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3408 +//line mysql_sql.y:3413 { yyLOCAL = tree.COMPLETION_TYPE_NO_CHAIN } yyVAL.union = yyLOCAL - case 374: + case 376: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3412 +//line mysql_sql.y:3417 { yyLOCAL = tree.COMPLETION_TYPE_NO_CHAIN } yyVAL.union = yyLOCAL - case 375: + case 377: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3418 +//line mysql_sql.y:3423 { yyLOCAL = &tree.BeginTransaction{} } yyVAL.union = yyLOCAL - case 376: + case 378: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3422 +//line mysql_sql.y:3427 { yyLOCAL = &tree.BeginTransaction{} } yyVAL.union = yyLOCAL - case 377: + case 379: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3426 +//line mysql_sql.y:3431 { yyLOCAL = &tree.BeginTransaction{} } yyVAL.union = yyLOCAL - case 378: + case 380: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3430 +//line mysql_sql.y:3435 { m := tree.MakeTransactionModes(tree.READ_WRITE_MODE_READ_WRITE) yyLOCAL = &tree.BeginTransaction{Modes: m} } yyVAL.union = yyLOCAL - case 379: + case 381: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3435 +//line mysql_sql.y:3440 { m := tree.MakeTransactionModes(tree.READ_WRITE_MODE_READ_ONLY) yyLOCAL = &tree.BeginTransaction{Modes: m} } yyVAL.union = yyLOCAL - case 380: + case 382: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3440 +//line mysql_sql.y:3445 { yyLOCAL = &tree.BeginTransaction{} } yyVAL.union = yyLOCAL - case 381: + case 383: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3446 +//line mysql_sql.y:3451 { name := yyDollar[2].cstrUnion() secondaryRole := false @@ -18518,10 +18618,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 382: + case 384: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3459 +//line mysql_sql.y:3464 { name := yylex.(*Lexer).GetDbOrTblNameCStr("") secondaryRole := false @@ -18535,10 +18635,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 383: + case 385: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3472 +//line mysql_sql.y:3477 { name := yylex.(*Lexer).GetDbOrTblNameCStr("") secondaryRole := false @@ -18552,10 +18652,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 384: + case 386: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3485 +//line mysql_sql.y:3490 { name := yylex.(*Lexer).GetDbOrTblNameCStr("") secondaryRole := true @@ -18569,10 +18669,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 385: + case 387: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3498 +//line mysql_sql.y:3503 { name := yylex.(*Lexer).GetDbOrTblNameCStr("") secondaryRole := true @@ -18586,10 +18686,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 386: + case 388: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3513 +//line mysql_sql.y:3518 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[1].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18598,10 +18698,10 @@ yydefault: yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 387: + case 389: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3521 +//line mysql_sql.y:3526 { yyDollar[2].statementUnion().(*tree.Update).With = yyDollar[1].withClauseUnion() if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[2].statementUnion()); intoErr != "" { @@ -18611,10 +18711,10 @@ yydefault: yyLOCAL = yyDollar[2].statementUnion() } yyVAL.union = yyLOCAL - case 388: + case 390: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3532 +//line mysql_sql.y:3537 { // Single-table syntax yyLOCAL = &tree.Update{ @@ -18629,10 +18729,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 389: + case 391: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3546 +//line mysql_sql.y:3551 { // Multiple-table syntax yyLOCAL = &tree.Update{ @@ -18646,10 +18746,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 390: + case 392: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3559 +//line mysql_sql.y:3564 { // PostgreSQL-style UPDATE target SET ... FROM source_tables WHERE ... // The target table is kept in Tables; FROM-clause sources are stored @@ -18666,236 +18766,236 @@ yydefault: } } yyVAL.union = yyLOCAL - case 391: + case 393: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:3577 +//line mysql_sql.y:3582 { yyLOCAL = tree.UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 392: + case 394: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:3581 +//line mysql_sql.y:3586 { yyLOCAL = append(yyDollar[1].updateExprsUnion(), yyDollar[3].updateExprUnion()) } yyVAL.union = yyLOCAL - case 393: + case 395: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UpdateExpr -//line mysql_sql.y:3587 +//line mysql_sql.y:3592 { yyLOCAL = &tree.UpdateExpr{Names: []*tree.UnresolvedName{yyDollar[1].unresolvedNameUnion()}, Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 396: + case 398: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3597 +//line mysql_sql.y:3602 { yyLOCAL = &tree.LockTableStmt{TableLocks: yyDollar[3].tableLocksUnion()} } yyVAL.union = yyLOCAL - case 397: + case 399: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableLock -//line mysql_sql.y:3603 +//line mysql_sql.y:3608 { yyLOCAL = []tree.TableLock{yyDollar[1].tableLockUnion()} } yyVAL.union = yyLOCAL - case 398: + case 400: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.TableLock -//line mysql_sql.y:3607 +//line mysql_sql.y:3612 { yyLOCAL = append(yyDollar[1].tableLocksUnion(), yyDollar[3].tableLockUnion()) } yyVAL.union = yyLOCAL - case 399: + case 401: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableLock -//line mysql_sql.y:3613 +//line mysql_sql.y:3618 { yyLOCAL = tree.TableLock{Table: *yyDollar[1].tableNameUnion(), LockType: yyDollar[2].tableLockTypeUnion()} } yyVAL.union = yyLOCAL - case 400: + case 402: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableLockType -//line mysql_sql.y:3619 +//line mysql_sql.y:3624 { yyLOCAL = tree.TableLockRead } yyVAL.union = yyLOCAL - case 401: + case 403: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableLockType -//line mysql_sql.y:3623 +//line mysql_sql.y:3628 { yyLOCAL = tree.TableLockReadLocal } yyVAL.union = yyLOCAL - case 402: + case 404: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableLockType -//line mysql_sql.y:3627 +//line mysql_sql.y:3632 { yyLOCAL = tree.TableLockWrite } yyVAL.union = yyLOCAL - case 403: + case 405: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableLockType -//line mysql_sql.y:3631 +//line mysql_sql.y:3636 { yyLOCAL = tree.TableLockLowPriorityWrite } yyVAL.union = yyLOCAL - case 404: + case 406: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3637 +//line mysql_sql.y:3642 { yyLOCAL = &tree.UnLockTableStmt{} } yyVAL.union = yyLOCAL - case 414: + case 416: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3652 +//line mysql_sql.y:3657 { yyLOCAL = &tree.SetVar{Assignments: yyDollar[2].varAssignmentExprsUnion()} } yyVAL.union = yyLOCAL - case 418: + case 420: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3659 +//line mysql_sql.y:3664 { yyLOCAL = yyDollar[1].selectUnion() } yyVAL.union = yyLOCAL - case 419: + case 421: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3665 +//line mysql_sql.y:3670 { yyLOCAL = tree.NewPrepareStmt(tree.Identifier(yyDollar[2].str), yyDollar[4].statementUnion()) } yyVAL.union = yyLOCAL - case 420: + case 422: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3669 +//line mysql_sql.y:3674 { yyLOCAL = tree.NewPrepareString(tree.Identifier(yyDollar[2].str), yyDollar[4].str) } yyVAL.union = yyLOCAL - case 421: + case 423: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3673 +//line mysql_sql.y:3678 { yyLOCAL = tree.NewPrepareVar(tree.Identifier(yyDollar[2].str), yyDollar[4].varExprUnion()) } yyVAL.union = yyLOCAL - case 422: + case 424: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3679 +//line mysql_sql.y:3684 { yyLOCAL = &tree.ExecuteSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 423: + case 425: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3685 +//line mysql_sql.y:3690 { yyLOCAL = tree.NewExecute(tree.Identifier(yyDollar[2].str)) } yyVAL.union = yyLOCAL - case 424: + case 426: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3689 +//line mysql_sql.y:3694 { yyLOCAL = tree.NewExecuteWithVariables(tree.Identifier(yyDollar[2].str), yyDollar[4].varExprsUnion()) } yyVAL.union = yyLOCAL - case 425: + case 427: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3695 +//line mysql_sql.y:3700 { yyLOCAL = tree.NewDeallocate(tree.Identifier(yyDollar[3].str), false) } yyVAL.union = yyLOCAL - case 426: + case 428: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3701 +//line mysql_sql.y:3706 { yyLOCAL = tree.NewReset(tree.Identifier(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 432: + case 434: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3712 +//line mysql_sql.y:3717 { yyLOCAL = yyDollar[1].selectUnion() } yyVAL.union = yyLOCAL - case 433: + case 435: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3718 +//line mysql_sql.y:3723 { yyLOCAL = &tree.ShowColumns{Table: yyDollar[2].unresolvedObjectNameUnion()} } yyVAL.union = yyLOCAL - case 434: + case 436: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3722 +//line mysql_sql.y:3727 { yyLOCAL = &tree.ShowColumns{Table: yyDollar[2].unresolvedObjectNameUnion(), ColName: yyDollar[3].unresolvedNameUnion()} } yyVAL.union = yyLOCAL - case 435: + case 437: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3726 +//line mysql_sql.y:3731 { yyLOCAL = tree.NewExplainFor("", integralToUint64(yyDollar[4].item)) } yyVAL.union = yyLOCAL - case 436: + case 438: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3730 +//line mysql_sql.y:3735 { yyLOCAL = tree.NewExplainFor(yyDollar[4].str, integralToUint64(yyDollar[7].item)) } yyVAL.union = yyLOCAL - case 437: + case 439: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3734 +//line mysql_sql.y:3739 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 438: + case 440: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3740 +//line mysql_sql.y:3745 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[5].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18907,10 +19007,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[5].statementUnion(), options) } yyVAL.union = yyLOCAL - case 439: + case 441: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3751 +//line mysql_sql.y:3756 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[5].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18922,10 +19022,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[5].statementUnion(), options) } yyVAL.union = yyLOCAL - case 440: + case 442: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3762 +//line mysql_sql.y:3767 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[6].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18938,10 +19038,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[6].statementUnion(), options) } yyVAL.union = yyLOCAL - case 441: + case 443: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3774 +//line mysql_sql.y:3779 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[6].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18954,10 +19054,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[6].statementUnion(), options) } yyVAL.union = yyLOCAL - case 442: + case 444: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3786 +//line mysql_sql.y:3791 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[6].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18970,10 +19070,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[6].statementUnion(), options) } yyVAL.union = yyLOCAL - case 443: + case 445: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3798 +//line mysql_sql.y:3803 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[6].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18986,10 +19086,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[6].statementUnion(), options) } yyVAL.union = yyLOCAL - case 444: + case 446: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3810 +//line mysql_sql.y:3815 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[2].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18998,10 +19098,10 @@ yydefault: yyLOCAL = tree.NewExplainStmt(yyDollar[2].statementUnion(), "text") } yyVAL.union = yyLOCAL - case 445: + case 447: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3818 +//line mysql_sql.y:3823 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[3].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19013,10 +19113,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[3].statementUnion(), options) } yyVAL.union = yyLOCAL - case 446: + case 448: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3829 +//line mysql_sql.y:3834 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[3].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19028,10 +19128,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[3].statementUnion(), options) } yyVAL.union = yyLOCAL - case 447: + case 449: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3840 +//line mysql_sql.y:3845 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[4].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19044,10 +19144,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[4].statementUnion(), options) } yyVAL.union = yyLOCAL - case 448: + case 450: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3852 +//line mysql_sql.y:3857 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[3].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19059,10 +19159,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[3].statementUnion(), options) } yyVAL.union = yyLOCAL - case 449: + case 451: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3863 +//line mysql_sql.y:3868 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[4].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19075,10 +19175,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[4].statementUnion(), options) } yyVAL.union = yyLOCAL - case 450: + case 452: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3875 +//line mysql_sql.y:3880 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[4].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19091,10 +19191,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[4].statementUnion(), options) } yyVAL.union = yyLOCAL - case 451: + case 453: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3887 +//line mysql_sql.y:3892 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[5].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19103,18 +19203,18 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[5].statementUnion(), yyDollar[3].explainOptionsUnion()) } yyVAL.union = yyLOCAL - case 452: + case 454: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3895 +//line mysql_sql.y:3900 { yyLOCAL = tree.MakeExplainStmt(yyDollar[3].statementUnion(), nil) } yyVAL.union = yyLOCAL - case 453: + case 455: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3899 +//line mysql_sql.y:3904 { options := []tree.OptionElem{ tree.MakeOptionElem(tree.VerboseOption, "NULL"), @@ -19122,10 +19222,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[4].statementUnion(), options) } yyVAL.union = yyLOCAL - case 454: + case 456: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3906 +//line mysql_sql.y:3911 { options := []tree.OptionElem{ tree.MakeOptionElem(tree.AnalyzeOption, "NULL"), @@ -19133,10 +19233,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[4].statementUnion(), options) } yyVAL.union = yyLOCAL - case 455: + case 457: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3913 +//line mysql_sql.y:3918 { options := []tree.OptionElem{ tree.MakeOptionElem(tree.AnalyzeOption, "NULL"), @@ -19145,170 +19245,170 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[5].statementUnion(), options) } yyVAL.union = yyLOCAL - case 470: + case 472: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.OptionElem -//line mysql_sql.y:3951 +//line mysql_sql.y:3956 { yyLOCAL = []tree.OptionElem{yyDollar[1].explainOptionUnion()} } yyVAL.union = yyLOCAL - case 471: + case 473: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.OptionElem -//line mysql_sql.y:3955 +//line mysql_sql.y:3960 { yyLOCAL = append(yyDollar[1].explainOptionsUnion(), yyDollar[3].explainOptionUnion()) } yyVAL.union = yyLOCAL - case 472: + case 474: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.OptionElem -//line mysql_sql.y:3961 +//line mysql_sql.y:3966 { yyLOCAL = tree.MakeOptionElem(yyDollar[1].str, yyDollar[2].str) } yyVAL.union = yyLOCAL - case 473: + case 475: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3967 +//line mysql_sql.y:3972 { yyVAL.str = yyDollar[1].str } - case 474: + case 476: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3972 +//line mysql_sql.y:3977 { yyVAL.str = "true" } - case 475: + case 477: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3973 +//line mysql_sql.y:3978 { yyVAL.str = "false" } - case 476: + case 478: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3974 +//line mysql_sql.y:3979 { yyVAL.str = yyDollar[1].str } - case 477: + case 479: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3975 +//line mysql_sql.y:3980 { yyVAL.str = yyDollar[1].str } - case 478: + case 480: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3979 +//line mysql_sql.y:3984 { stmt := tree.NewAnalyzeStmt(yyDollar[3].analyzeTableEntriesUnion()) stmt.FullScan = yyDollar[4].boolValUnion() yyLOCAL = stmt } yyVAL.union = yyLOCAL - case 479: + case 481: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:3987 +//line mysql_sql.y:3992 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 480: + case 482: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:3991 +//line mysql_sql.y:3996 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 481: + case 483: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.AnalyzeTableEntry -//line mysql_sql.y:3997 +//line mysql_sql.y:4002 { yyLOCAL = []*tree.AnalyzeTableEntry{yyDollar[1].analyzeTableEntryUnion()} } yyVAL.union = yyLOCAL - case 482: + case 484: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.AnalyzeTableEntry -//line mysql_sql.y:4001 +//line mysql_sql.y:4006 { yyLOCAL = append(yyDollar[1].analyzeTableEntriesUnion(), yyDollar[3].analyzeTableEntryUnion()) } yyVAL.union = yyLOCAL - case 483: + case 485: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AnalyzeTableEntry -//line mysql_sql.y:4007 +//line mysql_sql.y:4012 { yyLOCAL = &tree.AnalyzeTableEntry{Table: yyDollar[1].tableNameUnion()} } yyVAL.union = yyLOCAL - case 484: + case 486: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.AnalyzeTableEntry -//line mysql_sql.y:4011 +//line mysql_sql.y:4016 { yyLOCAL = &tree.AnalyzeTableEntry{Table: yyDollar[1].tableNameUnion(), Cols: yyDollar[3].identifierListUnion()} } yyVAL.union = yyLOCAL - case 485: + case 487: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4017 +//line mysql_sql.y:4022 { yyLOCAL = tree.NewCheckTableStmt(yyDollar[3].tableNamesUnion(), yyDollar[4].checkTableOptionUnion()) } yyVAL.union = yyLOCAL - case 486: + case 488: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.CheckTableOption -//line mysql_sql.y:4023 +//line mysql_sql.y:4028 { yyLOCAL = tree.CheckTableOptionNone } yyVAL.union = yyLOCAL - case 487: + case 489: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.CheckTableOption -//line mysql_sql.y:4027 +//line mysql_sql.y:4032 { yyLOCAL = tree.CheckTableOptionExtended } yyVAL.union = yyLOCAL - case 488: + case 490: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.CheckTableOption -//line mysql_sql.y:4031 +//line mysql_sql.y:4036 { yyLOCAL = tree.CheckTableOptionForUpgrade } yyVAL.union = yyLOCAL - case 489: + case 491: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4037 +//line mysql_sql.y:4042 { yyLOCAL = tree.NewShowProfileStmt(yyDollar[3].int64ValUnion(), yyDollar[4].limitUnion()) } yyVAL.union = yyLOCAL - case 490: + case 492: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:4043 +//line mysql_sql.y:4048 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 491: + case 493: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:4047 +//line mysql_sql.y:4052 { value, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -19317,10 +19417,10 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 492: + case 494: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4055 +//line mysql_sql.y:4060 { yyLOCAL = &tree.UpgradeStatement{ Target: yyDollar[3].upgrade_targetUnion(), @@ -19328,10 +19428,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 493: + case 495: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Target -//line mysql_sql.y:4064 +//line mysql_sql.y:4069 { yyLOCAL = &tree.Target{ AccountName: yyDollar[1].str, @@ -19339,10 +19439,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 494: + case 496: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Target -//line mysql_sql.y:4071 +//line mysql_sql.y:4076 { yyLOCAL = &tree.Target{ AccountName: "", @@ -19350,18 +19450,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 495: + case 497: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:4079 +//line mysql_sql.y:4084 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 496: + case 498: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:4083 +//line mysql_sql.y:4088 { res, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -19374,10 +19474,10 @@ yydefault: yyLOCAL = res } yyVAL.union = yyLOCAL - case 512: + case 515: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4113 +//line mysql_sql.y:4119 { yyLOCAL = &tree.AlterIcebergCatalog{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19385,10 +19485,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 513: + case 516: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4120 +//line mysql_sql.y:4126 { yyLOCAL = &tree.AlterIcebergCatalog{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19396,10 +19496,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 514: + case 517: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4129 +//line mysql_sql.y:4135 { yyLOCAL = &tree.AlterMongoDBConnection{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19408,10 +19508,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 515: + case 518: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4137 +//line mysql_sql.y:4143 { yyLOCAL = &tree.AlterMongoDBConnection{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19420,10 +19520,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 516: + case 519: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4145 +//line mysql_sql.y:4151 { yyLOCAL = &tree.AlterMongoDBConnection{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19431,10 +19531,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 517: + case 520: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4152 +//line mysql_sql.y:4158 { yyLOCAL = &tree.AlterMongoDBConnection{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19442,10 +19542,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 518: + case 521: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4161 +//line mysql_sql.y:4167 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].tableNameUnion() @@ -19467,10 +19567,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 519: + case 522: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4184 +//line mysql_sql.y:4190 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].tableNameUnion() @@ -19479,10 +19579,10 @@ yydefault: yyLOCAL = tree.NewAlterView(ifExists, name, colNames, asSource) } yyVAL.union = yyLOCAL - case 520: + case 523: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4194 +//line mysql_sql.y:4200 { var table = yyDollar[3].tableNameUnion() alterTable := tree.NewAlterTable(table) @@ -19490,10 +19590,10 @@ yydefault: yyLOCAL = alterTable } yyVAL.union = yyLOCAL - case 521: + case 524: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4201 +//line mysql_sql.y:4207 { var table = yyDollar[3].tableNameUnion() alterTable := tree.NewAlterTable(table) @@ -19501,10 +19601,10 @@ yydefault: yyLOCAL = alterTable } yyVAL.union = yyLOCAL - case 522: + case 525: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4208 +//line mysql_sql.y:4214 { var table = yyDollar[3].tableNameUnion() alterTable := tree.NewAlterTable(table) @@ -19512,36 +19612,36 @@ yydefault: yyLOCAL = alterTable } yyVAL.union = yyLOCAL - case 523: + case 526: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4217 +//line mysql_sql.y:4223 { alterTables := yyDollar[3].renameTableOptionsUnion() renameTables := tree.NewRenameTable(alterTables) yyLOCAL = renameTables } yyVAL.union = yyLOCAL - case 524: + case 527: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.AlterTable -//line mysql_sql.y:4225 +//line mysql_sql.y:4231 { yyLOCAL = []*tree.AlterTable{yyDollar[1].renameTableOptionUnion()} } yyVAL.union = yyLOCAL - case 525: + case 528: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.AlterTable -//line mysql_sql.y:4229 +//line mysql_sql.y:4235 { yyLOCAL = append(yyDollar[1].renameTableOptionsUnion(), yyDollar[3].renameTableOptionUnion()) } yyVAL.union = yyLOCAL - case 526: + case 529: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AlterTable -//line mysql_sql.y:4235 +//line mysql_sql.y:4241 { var table = yyDollar[1].tableNameUnion() alterTable := tree.NewAlterTable(table) @@ -19550,10 +19650,10 @@ yydefault: yyLOCAL = alterTable } yyVAL.union = yyLOCAL - case 527: + case 530: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4245 +//line mysql_sql.y:4251 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -19567,10 +19667,10 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterReIndex(name, io) } yyVAL.union = yyLOCAL - case 528: + case 531: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4258 +//line mysql_sql.y:4264 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -19584,10 +19684,10 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterReIndex(name, io) } yyVAL.union = yyLOCAL - case 529: + case 532: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4271 +//line mysql_sql.y:4277 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -19601,10 +19701,10 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterReIndex(name, io) } yyVAL.union = yyLOCAL - case 530: + case 533: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4284 +//line mysql_sql.y:4290 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -19618,10 +19718,10 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterReIndex(name, io) } yyVAL.union = yyLOCAL - case 531: + case 534: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4297 +//line mysql_sql.y:4303 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -19635,34 +19735,34 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterReIndex(name, io) } yyVAL.union = yyLOCAL - case 532: + case 535: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:4312 +//line mysql_sql.y:4318 { yyLOCAL = []tree.AlterTableOption{yyDollar[1].alterTableOptionUnion()} } yyVAL.union = yyLOCAL - case 533: + case 536: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:4316 +//line mysql_sql.y:4322 { yyLOCAL = append(yyDollar[1].alterTableOptionsUnion(), yyDollar[3].alterTableOptionUnion()) } yyVAL.union = yyLOCAL - case 534: + case 537: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterPartitionOption -//line mysql_sql.y:4322 +//line mysql_sql.y:4328 { yyLOCAL = yyDollar[1].alterPartitionOptionUnion() } yyVAL.union = yyLOCAL - case 535: + case 538: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.AlterPartitionOption -//line mysql_sql.y:4326 +//line mysql_sql.y:4332 { yyDollar[3].partitionByUnion().Num = uint64(yyDollar[4].int64ValUnion()) var PartBy = yyDollar[3].partitionByUnion() @@ -19685,10 +19785,10 @@ yydefault: yyLOCAL = tree.AlterPartitionOption(opt) } yyVAL.union = yyLOCAL - case 536: + case 539: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4350 +//line mysql_sql.y:4356 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -19697,10 +19797,10 @@ yydefault: yyLOCAL = tree.NewAlterPitr(ifExists, name, pitrValue, pitrUnit) } yyVAL.union = yyLOCAL - case 537: + case 540: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4360 +//line mysql_sql.y:4366 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19708,10 +19808,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 538: + case 541: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4367 +//line mysql_sql.y:4373 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19719,10 +19819,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 539: + case 542: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4374 +//line mysql_sql.y:4380 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19732,10 +19832,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 540: + case 543: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4383 +//line mysql_sql.y:4389 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19744,10 +19844,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 541: + case 544: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4391 +//line mysql_sql.y:4397 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19756,10 +19856,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 542: + case 545: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4399 +//line mysql_sql.y:4405 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19768,30 +19868,30 @@ yydefault: } } yyVAL.union = yyLOCAL - case 543: + case 546: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4409 +//line mysql_sql.y:4415 { var oldName = yyDollar[5].cstrUnion().Compare() var newName = yyDollar[8].cstrUnion().Compare() yyLOCAL = tree.NewAlterRole(true, oldName, newName) } yyVAL.union = yyLOCAL - case 544: + case 547: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4415 +//line mysql_sql.y:4421 { var oldName = yyDollar[3].cstrUnion().Compare() var newName = yyDollar[6].cstrUnion().Compare() yyLOCAL = tree.NewAlterRole(false, oldName, newName) } yyVAL.union = yyLOCAL - case 545: + case 548: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4421 +//line mysql_sql.y:4427 { var roleName = yyDollar[3].cstrUnion().Compare() var ruleSQL = yyDollar[6].str @@ -19801,10 +19901,10 @@ yydefault: yyLOCAL = tree.NewAlterRoleAddRule(roleName, ruleName, ruleSQL, dbName, tblName) } yyVAL.union = yyLOCAL - case 546: + case 549: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4430 +//line mysql_sql.y:4436 { var roleName = yyDollar[3].cstrUnion().Compare() var dbName = yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[8].cstrUnion().Origin()).Compare() @@ -19812,10 +19912,10 @@ yydefault: yyLOCAL = tree.NewAlterRoleDropRule(roleName, dbName, tblName) } yyVAL.union = yyLOCAL - case 547: + case 550: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterPartitionOption -//line mysql_sql.y:4439 +//line mysql_sql.y:4445 { var typ = tree.AlterPartitionAddPartition var partitions = yyDollar[3].partitionsUnion() @@ -19826,10 +19926,10 @@ yydefault: yyLOCAL = tree.AlterPartitionOption(opt) } yyVAL.union = yyLOCAL - case 548: + case 551: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterPartitionOption -//line mysql_sql.y:4449 +//line mysql_sql.y:4455 { var typ = tree.AlterPartitionDropPartition var partitionNames = yyDollar[3].PartitionNamesUnion() @@ -19846,10 +19946,10 @@ yydefault: yyLOCAL = tree.AlterPartitionOption(opt) } yyVAL.union = yyLOCAL - case 549: + case 552: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterPartitionOption -//line mysql_sql.y:4465 +//line mysql_sql.y:4471 { var typ = tree.AlterPartitionTruncatePartition var partitionNames = yyDollar[3].PartitionNamesUnion() @@ -19866,52 +19966,52 @@ yydefault: yyLOCAL = tree.AlterPartitionOption(opt) } yyVAL.union = yyLOCAL - case 550: + case 553: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:4483 +//line mysql_sql.y:4489 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 551: + case 554: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:4487 +//line mysql_sql.y:4493 { yyLOCAL = yyDollar[1].PartitionNamesUnion() } yyVAL.union = yyLOCAL - case 552: + case 555: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:4493 +//line mysql_sql.y:4499 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 553: + case 556: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:4497 +//line mysql_sql.y:4503 { yyLOCAL = append(yyDollar[1].PartitionNamesUnion(), tree.Identifier(yyDollar[3].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 554: + case 557: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4503 +//line mysql_sql.y:4509 { var def = yyDollar[2].tableDefUnion() opt := tree.NewAlterOptionAdd(def) yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 555: + case 558: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4509 +//line mysql_sql.y:4515 { var typ = tree.AlterTableModifyColumn var newColumn = yyDollar[3].columnTableDefUnion() @@ -19920,10 +20020,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 556: + case 559: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4517 +//line mysql_sql.y:4523 { // Type OldColumnName NewColumn Position var typ = tree.AlterTableChangeColumn @@ -19934,10 +20034,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 557: + case 560: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4527 +//line mysql_sql.y:4533 { var typ = tree.AlterTableRenameColumn var oldColumnName = yyDollar[3].unresolvedNameUnion() @@ -19946,10 +20046,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 558: + case 561: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4535 +//line mysql_sql.y:4541 { var typ = tree.AlterTableAlterColumn var columnName = yyDollar[3].unresolvedNameUnion() @@ -19960,10 +20060,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 559: + case 562: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4545 +//line mysql_sql.y:4551 { var typ = tree.AlterTableAlterColumn var columnName = yyDollar[3].unresolvedNameUnion() @@ -19974,10 +20074,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 560: + case 563: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4555 +//line mysql_sql.y:4561 { var typ = tree.AlterTableAlterColumn var columnName = yyDollar[3].unresolvedNameUnion() @@ -19988,10 +20088,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 561: + case 564: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4565 +//line mysql_sql.y:4571 { var orderByClauseType = tree.AlterTableOrderByColumn var orderByColumnList = yyDollar[3].alterColumnOrderByUnion() @@ -19999,42 +20099,42 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 562: + case 565: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4572 +//line mysql_sql.y:4578 { yyLOCAL = tree.AlterTableOption(yyDollar[2].alterTableOptionUnion()) } yyVAL.union = yyLOCAL - case 563: + case 566: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4576 +//line mysql_sql.y:4582 { yyLOCAL = tree.AlterTableOption(yyDollar[2].alterTableOptionUnion()) } yyVAL.union = yyLOCAL - case 564: + case 567: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4580 +//line mysql_sql.y:4586 { yyLOCAL = tree.AlterTableOption(yyDollar[1].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 565: + case 568: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4584 +//line mysql_sql.y:4590 { yyLOCAL = tree.AlterTableOption(yyDollar[3].alterTableOptionUnion()) } yyVAL.union = yyLOCAL - case 566: + case 569: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4588 +//line mysql_sql.y:4594 { var column = yyDollar[3].columnTableDefUnion() var position = yyDollar[4].alterColPositionUnion() @@ -20042,38 +20142,38 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 567: + case 570: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4595 +//line mysql_sql.y:4601 { yyLOCAL = tree.NewAlterOptionAlgorithm(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 568: + case 571: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4599 +//line mysql_sql.y:4605 { opt := tree.NewTableOptionCharset(yyDollar[4].str) opt.Collate = yyDollar[7].str yyLOCAL = opt } yyVAL.union = yyLOCAL - case 569: + case 572: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4605 +//line mysql_sql.y:4611 { opt := tree.NewTableOptionCharset(yyDollar[5].str) opt.Convert = true yyLOCAL = opt } yyVAL.union = yyLOCAL - case 570: + case 573: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4611 +//line mysql_sql.y:4617 { opt := tree.NewTableOptionCharset(yyDollar[5].str) opt.Collate = yyDollar[8].str @@ -20081,181 +20181,181 @@ yydefault: yyLOCAL = opt } yyVAL.union = yyLOCAL - case 571: + case 574: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4618 +//line mysql_sql.y:4624 { opt := tree.NewTableOptionCharset(yyDollar[1].str) opt.NonCharsetSyntax = true yyLOCAL = opt } yyVAL.union = yyLOCAL - case 572: + case 575: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4624 +//line mysql_sql.y:4630 { opt := tree.NewTableOptionCharset(yyDollar[1].str) opt.NonCharsetSyntax = true yyLOCAL = opt } yyVAL.union = yyLOCAL - case 573: + case 576: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4630 +//line mysql_sql.y:4636 { opt := tree.NewTableOptionCharset(yyDollar[1].str) opt.NonCharsetSyntax = true yyLOCAL = opt } yyVAL.union = yyLOCAL - case 574: + case 577: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4636 +//line mysql_sql.y:4642 { yyLOCAL = tree.NewAlterOptionLock(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 575: + case 578: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4640 +//line mysql_sql.y:4646 { opt := tree.NewTableOptionCharset(yyDollar[1].str) opt.NonCharsetSyntax = true yyLOCAL = opt } yyVAL.union = yyLOCAL - case 576: + case 579: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:4647 +//line mysql_sql.y:4653 { yyVAL.str = "" } - case 593: + case 596: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:4678 +//line mysql_sql.y:4684 { yyVAL.str = "" } - case 594: + case 597: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:4682 +//line mysql_sql.y:4688 { yyVAL.str = string("COLUMN") } - case 595: + case 598: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ColumnPosition -//line mysql_sql.y:4687 +//line mysql_sql.y:4693 { var typ = tree.ColumnPositionNone var relativeColumn *tree.UnresolvedName yyLOCAL = tree.NewColumnPosition(typ, relativeColumn) } yyVAL.union = yyLOCAL - case 596: + case 599: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ColumnPosition -//line mysql_sql.y:4693 +//line mysql_sql.y:4699 { var typ = tree.ColumnPositionFirst var relativeColumn *tree.UnresolvedName yyLOCAL = tree.NewColumnPosition(typ, relativeColumn) } yyVAL.union = yyLOCAL - case 597: + case 600: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ColumnPosition -//line mysql_sql.y:4699 +//line mysql_sql.y:4705 { var typ = tree.ColumnPositionAfter var relativeColumn = yyDollar[2].unresolvedNameUnion() yyLOCAL = tree.NewColumnPosition(typ, relativeColumn) } yyVAL.union = yyLOCAL - case 598: + case 601: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.AlterColumnOrder -//line mysql_sql.y:4707 +//line mysql_sql.y:4713 { yyLOCAL = []*tree.AlterColumnOrder{yyDollar[1].alterColumnOrderUnion()} } yyVAL.union = yyLOCAL - case 599: + case 602: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.AlterColumnOrder -//line mysql_sql.y:4711 +//line mysql_sql.y:4717 { yyLOCAL = append(yyDollar[1].alterColumnOrderByUnion(), yyDollar[3].alterColumnOrderUnion()) } yyVAL.union = yyLOCAL - case 600: + case 603: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AlterColumnOrder -//line mysql_sql.y:4717 +//line mysql_sql.y:4723 { var column = yyDollar[1].unresolvedNameUnion() var direction = yyDollar[2].directionUnion() yyLOCAL = tree.NewAlterColumnOrder(column, direction) } yyVAL.union = yyLOCAL - case 601: + case 604: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4725 +//line mysql_sql.y:4731 { var name = yyDollar[1].unresolvedObjectNameUnion() yyLOCAL = tree.NewAlterOptionTableName(name) } yyVAL.union = yyLOCAL - case 602: + case 605: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4732 +//line mysql_sql.y:4738 { var dropType = tree.AlterTableDropIndex var name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) yyLOCAL = tree.NewAlterOptionDrop(dropType, name) } yyVAL.union = yyLOCAL - case 603: + case 606: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4738 +//line mysql_sql.y:4744 { var dropType = tree.AlterTableDropKey var name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) yyLOCAL = tree.NewAlterOptionDrop(dropType, name) } yyVAL.union = yyLOCAL - case 604: + case 607: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4744 +//line mysql_sql.y:4750 { var dropType = tree.AlterTableDropColumn var name = tree.Identifier(yyDollar[1].cstrUnion().Compare()) yyLOCAL = tree.NewAlterOptionDrop(dropType, name) } yyVAL.union = yyLOCAL - case 605: + case 608: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4750 +//line mysql_sql.y:4756 { var dropType = tree.AlterTableDropColumn var name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) yyLOCAL = tree.NewAlterOptionDrop(dropType, name) } yyVAL.union = yyLOCAL - case 606: + case 609: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4756 +//line mysql_sql.y:4762 { var dropType = tree.AlterTableDropForeignKey var name = tree.Identifier(yyDollar[3].cstrUnion().Compare()) @@ -20263,10 +20363,10 @@ yydefault: } yyVAL.union = yyLOCAL - case 607: + case 610: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4763 +//line mysql_sql.y:4769 { yyLOCAL = &tree.AlterOptionDrop{ Typ: tree.AlterTableDropConstraint, @@ -20274,38 +20374,38 @@ yydefault: } } yyVAL.union = yyLOCAL - case 608: + case 611: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4770 +//line mysql_sql.y:4776 { yyLOCAL = tree.NewAlterOptionDrop(tree.AlterTableDropCheck, tree.Identifier(yyDollar[2].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 609: + case 612: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4774 +//line mysql_sql.y:4780 { var dropType = tree.AlterTableDropPrimaryKey var name = tree.Identifier("") yyLOCAL = tree.NewAlterOptionDrop(dropType, name) } yyVAL.union = yyLOCAL - case 610: + case 613: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4782 +//line mysql_sql.y:4788 { var indexName = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var visibility = yyDollar[3].indexVisibilityUnion() yyLOCAL = tree.NewAlterOptionAlterIndex(indexName, visibility) } yyVAL.union = yyLOCAL - case 611: + case 614: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4788 +//line mysql_sql.y:4794 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -20321,62 +20421,62 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterAutoUpdate(name, io) } yyVAL.union = yyLOCAL - case 612: + case 615: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4803 +//line mysql_sql.y:4809 { var checkType = yyDollar[1].str var enforce = yyDollar[3].boolValUnion() yyLOCAL = tree.NewAlterOptionAlterCheck(checkType, enforce) } yyVAL.union = yyLOCAL - case 613: + case 616: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4809 +//line mysql_sql.y:4815 { var checkType = yyDollar[1].str var enforce = yyDollar[3].boolValUnion() yyLOCAL = tree.NewAlterOptionAlterCheck(checkType, enforce) } yyVAL.union = yyLOCAL - case 614: + case 617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.VisibleType -//line mysql_sql.y:4817 +//line mysql_sql.y:4823 { yyLOCAL = tree.VISIBLE_TYPE_VISIBLE } yyVAL.union = yyLOCAL - case 615: + case 618: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.VisibleType -//line mysql_sql.y:4821 +//line mysql_sql.y:4827 { yyLOCAL = tree.VISIBLE_TYPE_INVISIBLE } yyVAL.union = yyLOCAL - case 616: + case 619: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:4827 +//line mysql_sql.y:4833 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 617: + case 620: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:4831 +//line mysql_sql.y:4837 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 618: + case 621: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4837 +//line mysql_sql.y:4843 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].exprUnion() @@ -20393,74 +20493,74 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 619: + case 622: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4855 +//line mysql_sql.y:4861 { yyLOCAL = &tree.AlterDatabase{Name: tree.Identifier(yyDollar[3].str), Options: yyDollar[4].createOptionsUnion()} } yyVAL.union = yyLOCAL - case 620: + case 623: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4859 +//line mysql_sql.y:4865 { yyLOCAL = &tree.AlterDatabase{Options: yyDollar[3].createOptionsUnion()} } yyVAL.union = yyLOCAL - case 621: + case 624: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:4865 +//line mysql_sql.y:4871 { yyLOCAL = []tree.CreateOption{yyDollar[1].createOptionUnion()} } yyVAL.union = yyLOCAL - case 622: + case 625: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:4869 +//line mysql_sql.y:4875 { yyLOCAL = append(yyDollar[1].createOptionsUnion(), yyDollar[2].createOptionUnion()) } yyVAL.union = yyLOCAL - case 623: + case 626: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:4875 +//line mysql_sql.y:4881 { yyLOCAL = tree.NewCreateOptionCharset(false, yyDollar[4].str) } yyVAL.union = yyLOCAL - case 624: + case 627: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:4879 +//line mysql_sql.y:4885 { yyLOCAL = tree.NewCreateOptionCharset(true, yyDollar[5].str) } yyVAL.union = yyLOCAL - case 625: + case 628: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:4883 +//line mysql_sql.y:4889 { yyLOCAL = tree.NewCreateOptionCollate(false, yyDollar[3].str) } yyVAL.union = yyLOCAL - case 626: + case 629: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:4887 +//line mysql_sql.y:4893 { yyLOCAL = tree.NewCreateOptionCollate(true, yyDollar[4].str) } yyVAL.union = yyLOCAL - case 627: + case 630: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4893 +//line mysql_sql.y:4899 { var accountName = "" var dbName = yyDollar[3].str @@ -20476,10 +20576,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 628: + case 631: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4908 +//line mysql_sql.y:4914 { var accountName = "" var dbName = yyDollar[3].str @@ -20495,10 +20595,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 629: + case 632: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4923 +//line mysql_sql.y:4929 { var accountName = yyDollar[4].str var dbName = "" @@ -20514,10 +20614,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 630: + case 633: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4938 +//line mysql_sql.y:4944 { assignments := []*tree.VarAssignmentExpr{ { @@ -20530,20 +20630,20 @@ yydefault: yyLOCAL = &tree.SetVar{Assignments: assignments} } yyVAL.union = yyLOCAL - case 631: + case 634: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.AlterAccountAuthOption -//line mysql_sql.y:4951 +//line mysql_sql.y:4957 { yyLOCAL = tree.AlterAccountAuthOption{ Exist: false, } } yyVAL.union = yyLOCAL - case 632: + case 635: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.AlterAccountAuthOption -//line mysql_sql.y:4957 +//line mysql_sql.y:4963 { yyLOCAL = tree.AlterAccountAuthOption{ Exist: true, @@ -20553,10 +20653,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 633: + case 636: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4968 +//line mysql_sql.y:4974 { // Create temporary variables with meaningful names ifExists := yyDollar[3].boolValUnion() @@ -20569,10 +20669,10 @@ yydefault: yyLOCAL = tree.NewAlterUser(ifExists, users, role, miscOpt, commentOrAttribute) } yyVAL.union = yyLOCAL - case 634: + case 637: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4980 +//line mysql_sql.y:4986 { ifExists := yyDollar[3].boolValUnion() var Username = yyDollar[4].usernameRecordUnion().Username @@ -20584,10 +20684,10 @@ yydefault: yyLOCAL = tree.NewAlterUser(ifExists, users, nil, miscOpt, commentOrAttribute) } yyVAL.union = yyLOCAL - case 635: + case 638: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4991 +//line mysql_sql.y:4997 { ifExists := yyDollar[3].boolValUnion() var Username = yyDollar[4].usernameRecordUnion().Username @@ -20599,18 +20699,18 @@ yydefault: yyLOCAL = tree.NewAlterUser(ifExists, users, nil, miscOpt, commentOrAttribute) } yyVAL.union = yyLOCAL - case 636: + case 639: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Role -//line mysql_sql.y:5003 +//line mysql_sql.y:5009 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 637: + case 640: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Role -//line mysql_sql.y:5007 +//line mysql_sql.y:5013 { var UserName = yyDollar[3].str yyLOCAL = tree.NewRole( @@ -20618,66 +20718,66 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 638: + case 641: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5015 +//line mysql_sql.y:5021 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 639: + case 642: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5019 +//line mysql_sql.y:5025 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 640: + case 643: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5024 +//line mysql_sql.y:5030 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 641: + case 644: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5028 +//line mysql_sql.y:5034 { yyLOCAL = yyDollar[1].userMiscOptionUnion() } yyVAL.union = yyLOCAL - case 642: + case 645: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5044 +//line mysql_sql.y:5050 { yyLOCAL = tree.NewUserMiscOptionAccountUnlock() } yyVAL.union = yyLOCAL - case 643: + case 646: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5048 +//line mysql_sql.y:5054 { yyLOCAL = tree.NewUserMiscOptionAccountLock() } yyVAL.union = yyLOCAL - case 644: + case 647: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5052 +//line mysql_sql.y:5058 { yyLOCAL = tree.NewUserMiscOptionPasswordExpireNone() } yyVAL.union = yyLOCAL - case 645: + case 648: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5056 +//line mysql_sql.y:5062 { Value, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -20688,34 +20788,34 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 646: + case 649: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5064 +//line mysql_sql.y:5070 { yyLOCAL = tree.NewUserMiscOptionPasswordExpireNever() } yyVAL.union = yyLOCAL - case 647: + case 650: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5068 +//line mysql_sql.y:5074 { yyLOCAL = tree.NewUserMiscOptionPasswordExpireDefault() } yyVAL.union = yyLOCAL - case 648: + case 651: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5072 +//line mysql_sql.y:5078 { yyLOCAL = tree.NewUserMiscOptionPasswordHistoryDefault() } yyVAL.union = yyLOCAL - case 649: + case 652: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5076 +//line mysql_sql.y:5082 { Value, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -20726,18 +20826,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 650: + case 653: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5084 +//line mysql_sql.y:5090 { yyLOCAL = tree.NewUserMiscOptionPasswordReuseIntervalDefault() } yyVAL.union = yyLOCAL - case 651: + case 654: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5088 +//line mysql_sql.y:5094 { Value, ok := signedIntegral(yylex, yyDollar[4].item) if !ok { @@ -20748,34 +20848,34 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 652: + case 655: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5096 +//line mysql_sql.y:5102 { yyLOCAL = tree.NewUserMiscOptionPasswordRequireCurrentNone() } yyVAL.union = yyLOCAL - case 653: + case 656: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5100 +//line mysql_sql.y:5106 { yyLOCAL = tree.NewUserMiscOptionPasswordRequireCurrentDefault() } yyVAL.union = yyLOCAL - case 654: + case 657: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5104 +//line mysql_sql.y:5110 { yyLOCAL = tree.NewUserMiscOptionPasswordRequireCurrentOptional() } yyVAL.union = yyLOCAL - case 655: + case 658: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5108 +//line mysql_sql.y:5114 { Value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -20786,10 +20886,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 656: + case 659: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5116 +//line mysql_sql.y:5122 { Value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -20800,38 +20900,38 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 657: + case 660: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5124 +//line mysql_sql.y:5130 { yyLOCAL = tree.NewUserMiscOptionPasswordLockTimeUnbounded() } yyVAL.union = yyLOCAL - case 658: + case 661: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:5130 +//line mysql_sql.y:5136 { yyVAL.item = nil } - case 659: + case 662: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5135 +//line mysql_sql.y:5141 { yyVAL.item = nil } - case 705: + case 708: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5190 +//line mysql_sql.y:5196 { yyLOCAL = &tree.ShowSQLTasks{} } yyVAL.union = yyLOCAL - case 706: + case 709: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5196 +//line mysql_sql.y:5202 { stmt := &tree.ShowSQLTaskRuns{} if yyDollar[4].str != "" { @@ -20845,38 +20945,38 @@ yydefault: yyLOCAL = stmt } yyVAL.union = yyLOCAL - case 707: + case 710: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5210 +//line mysql_sql.y:5216 { yyVAL.str = "" } - case 708: + case 711: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:5214 +//line mysql_sql.y:5220 { yyVAL.str = yyDollar[2].cstrUnion().Compare() } - case 709: + case 712: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:5219 +//line mysql_sql.y:5225 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 710: + case 713: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:5223 +//line mysql_sql.y:5229 { yyLOCAL = sqlTaskInt64(yyDollar[2].item) } yyVAL.union = yyLOCAL - case 711: + case 714: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5229 +//line mysql_sql.y:5235 { yyLOCAL = &tree.ShowIcebergCatalogs{ Like: yyDollar[4].comparisionExprUnion(), @@ -20884,10 +20984,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 712: + case 715: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5237 +//line mysql_sql.y:5243 { yyLOCAL = &tree.ShowIcebergNamespaces{ Catalog: tree.Identifier(yyDollar[5].cstrUnion().Compare()), @@ -20896,10 +20996,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 713: + case 716: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5245 +//line mysql_sql.y:5251 { yyLOCAL = &tree.ShowIcebergNamespaces{ Catalog: tree.Identifier(yyDollar[6].cstrUnion().Compare()), @@ -20908,10 +21008,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 714: + case 717: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5253 +//line mysql_sql.y:5259 { yyLOCAL = &tree.ShowIcebergNamespaces{ Like: yyDollar[4].comparisionExprUnion(), @@ -20919,10 +21019,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 715: + case 718: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5260 +//line mysql_sql.y:5266 { yyLOCAL = &tree.ShowIcebergTables{ Like: yyDollar[4].comparisionExprUnion(), @@ -20930,10 +21030,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 716: + case 719: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5267 +//line mysql_sql.y:5273 { yyLOCAL = &tree.ShowIcebergTables{ Catalog: tree.Identifier(yyDollar[5].cstrUnion().Compare()), @@ -20942,10 +21042,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 717: + case 720: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5275 +//line mysql_sql.y:5281 { yyLOCAL = &tree.ShowIcebergTables{ Catalog: tree.Identifier(yyDollar[5].cstrUnion().Compare()), @@ -20955,10 +21055,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 718: + case 721: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5284 +//line mysql_sql.y:5290 { yyLOCAL = &tree.ShowIcebergTables{ Catalog: tree.Identifier(yyDollar[6].cstrUnion().Compare()), @@ -20967,10 +21067,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 719: + case 722: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5292 +//line mysql_sql.y:5298 { yyLOCAL = &tree.ShowIcebergTables{ Namespace: yyDollar[6].str, @@ -20979,10 +21079,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 720: + case 723: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5300 +//line mysql_sql.y:5306 { yyLOCAL = &tree.ShowIcebergTables{ Namespace: yyDollar[6].str, @@ -20992,10 +21092,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 721: + case 724: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5311 +//line mysql_sql.y:5317 { yyLOCAL = &tree.ShowMongoDBConnections{ Like: yyDollar[4].comparisionExprUnion(), @@ -21003,50 +21103,50 @@ yydefault: } } yyVAL.union = yyLOCAL - case 722: + case 725: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:5320 +//line mysql_sql.y:5326 { yyVAL.str = yyDollar[1].str } - case 723: + case 726: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5326 +//line mysql_sql.y:5332 { yyLOCAL = &tree.ShowLogserviceReplicas{} } yyVAL.union = yyLOCAL - case 724: + case 727: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5332 +//line mysql_sql.y:5338 { yyLOCAL = &tree.ShowLogserviceStores{} } yyVAL.union = yyLOCAL - case 725: + case 728: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5338 +//line mysql_sql.y:5344 { yyLOCAL = &tree.ShowLogserviceSettings{} } yyVAL.union = yyLOCAL - case 726: + case 729: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5344 +//line mysql_sql.y:5350 { yyLOCAL = &tree.ShowRules{ RoleName: yyDollar[5].cstrUnion().Compare(), } } yyVAL.union = yyLOCAL - case 727: + case 730: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5352 +//line mysql_sql.y:5358 { yyLOCAL = &tree.ShowCollation{ Like: yyDollar[3].comparisionExprUnion(), @@ -21054,50 +21154,50 @@ yydefault: } } yyVAL.union = yyLOCAL - case 728: + case 731: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5361 +//line mysql_sql.y:5367 { yyLOCAL = &tree.ShowStages{ Like: yyDollar[3].comparisionExprUnion(), } } yyVAL.union = yyLOCAL - case 729: + case 732: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5369 +//line mysql_sql.y:5375 { yyLOCAL = &tree.ShowSnapShots{ Where: yyDollar[3].whereUnion(), } } yyVAL.union = yyLOCAL - case 730: + case 733: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5377 +//line mysql_sql.y:5383 { yyLOCAL = &tree.ShowPitr{ Where: yyDollar[3].whereUnion(), } } yyVAL.union = yyLOCAL - case 731: + case 734: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5385 +//line mysql_sql.y:5391 { yyLOCAL = &tree.ShowRecoveryWindow{ Level: tree.RECOVERYWINDOWLEVELACCOUNT, } } yyVAL.union = yyLOCAL - case 732: + case 735: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5391 +//line mysql_sql.y:5397 { yyLOCAL = &tree.ShowRecoveryWindow{ Level: tree.RECOVERYWINDOWLEVELDATABASE, @@ -21105,10 +21205,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 733: + case 736: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5398 +//line mysql_sql.y:5404 { yyLOCAL = &tree.ShowRecoveryWindow{ Level: tree.RECOVERYWINDOWLEVELTABLE, @@ -21117,10 +21217,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 734: + case 737: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5406 +//line mysql_sql.y:5412 { yyLOCAL = &tree.ShowRecoveryWindow{ Level: tree.RECOVERYWINDOWLEVELACCOUNT, @@ -21128,34 +21228,34 @@ yydefault: } } yyVAL.union = yyLOCAL - case 735: + case 738: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5415 +//line mysql_sql.y:5421 { yyLOCAL = &tree.ShowGrants{ShowGrantType: tree.GrantForUser} } yyVAL.union = yyLOCAL - case 736: + case 739: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5419 +//line mysql_sql.y:5425 { yyLOCAL = &tree.ShowGrants{Username: yyDollar[4].usernameRecordUnion().Username, Hostname: yyDollar[4].usernameRecordUnion().Hostname, Roles: yyDollar[5].rolesUnion(), ShowGrantType: tree.GrantForUser} } yyVAL.union = yyLOCAL - case 737: + case 740: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5423 +//line mysql_sql.y:5429 { yyLOCAL = &tree.ShowGrants{CurrentUser: true, Roles: yyDollar[6].rolesUnion(), ShowGrantType: tree.GrantForUser} } yyVAL.union = yyLOCAL - case 738: + case 741: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5427 +//line mysql_sql.y:5433 { s := &tree.ShowGrants{} roles := []*tree.Role{ @@ -21166,44 +21266,44 @@ yydefault: yyLOCAL = s } yyVAL.union = yyLOCAL - case 739: + case 742: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.Role -//line mysql_sql.y:5438 +//line mysql_sql.y:5444 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 740: + case 743: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.Role -//line mysql_sql.y:5442 +//line mysql_sql.y:5448 { yyLOCAL = yyDollar[2].rolesUnion() } yyVAL.union = yyLOCAL - case 741: + case 744: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5448 +//line mysql_sql.y:5454 { yyLOCAL = &tree.ShowTableStatus{DbName: yyDollar[5].str, Like: yyDollar[6].comparisionExprUnion(), Where: yyDollar[7].whereUnion()} } yyVAL.union = yyLOCAL - case 742: + case 745: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5453 +//line mysql_sql.y:5459 { } - case 744: + case 747: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5457 +//line mysql_sql.y:5463 { } - case 746: + case 749: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5462 +//line mysql_sql.y:5468 { yyLOCAL = &tree.ShowFunctionOrProcedureStatus{ Like: yyDollar[4].comparisionExprUnion(), @@ -21212,10 +21312,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 747: + case 750: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5472 +//line mysql_sql.y:5478 { yyLOCAL = &tree.ShowFunctionOrProcedureStatus{ Like: yyDollar[4].comparisionExprUnion(), @@ -21224,68 +21324,68 @@ yydefault: } } yyVAL.union = yyLOCAL - case 748: + case 751: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5482 +//line mysql_sql.y:5488 { yyLOCAL = &tree.ShowRolesStmt{ Like: yyDollar[3].comparisionExprUnion(), } } yyVAL.union = yyLOCAL - case 749: + case 752: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5490 +//line mysql_sql.y:5496 { yyLOCAL = &tree.ShowNodeList{} } yyVAL.union = yyLOCAL - case 750: + case 753: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5496 +//line mysql_sql.y:5502 { yyLOCAL = &tree.ShowLocks{} } yyVAL.union = yyLOCAL - case 751: + case 754: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5502 +//line mysql_sql.y:5508 { yyLOCAL = &tree.ShowTableNumber{DbName: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 752: + case 755: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5508 +//line mysql_sql.y:5514 { yyLOCAL = &tree.ShowColumnNumber{Table: yyDollar[3].unresolvedObjectNameUnion(), DbName: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 753: + case 756: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5514 +//line mysql_sql.y:5520 { yyLOCAL = &tree.ShowTableValues{Table: yyDollar[3].unresolvedObjectNameUnion(), DbName: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 754: + case 757: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5520 +//line mysql_sql.y:5526 { yyLOCAL = &tree.ShowTableSize{Table: yyDollar[3].unresolvedObjectNameUnion(), DbName: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 755: + case 758: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5526 +//line mysql_sql.y:5532 { s := yyDollar[2].statementUnion().(*tree.ShowTarget) s.Like = yyDollar[3].comparisionExprUnion() @@ -21293,74 +21393,74 @@ yydefault: yyLOCAL = s } yyVAL.union = yyLOCAL - case 756: + case 759: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5535 +//line mysql_sql.y:5541 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowConfig} } yyVAL.union = yyLOCAL - case 757: + case 760: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5539 +//line mysql_sql.y:5545 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowCharset} } yyVAL.union = yyLOCAL - case 758: + case 761: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5543 +//line mysql_sql.y:5549 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowEngines} } yyVAL.union = yyLOCAL - case 759: + case 762: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5547 +//line mysql_sql.y:5553 { yyLOCAL = &tree.ShowTarget{DbName: yyDollar[3].str, Type: tree.ShowTriggers} } yyVAL.union = yyLOCAL - case 760: + case 763: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5551 +//line mysql_sql.y:5557 { yyLOCAL = &tree.ShowTarget{DbName: yyDollar[3].str, Type: tree.ShowEvents} } yyVAL.union = yyLOCAL - case 761: + case 764: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5555 +//line mysql_sql.y:5561 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowPlugins} } yyVAL.union = yyLOCAL - case 762: + case 765: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5559 +//line mysql_sql.y:5565 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowPrivileges} } yyVAL.union = yyLOCAL - case 763: + case 766: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5563 +//line mysql_sql.y:5569 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowProfiles} } yyVAL.union = yyLOCAL - case 764: + case 767: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5569 +//line mysql_sql.y:5575 { yyLOCAL = &tree.ShowIndex{ TableName: yyDollar[4].unresolvedObjectNameUnion(), @@ -21369,20 +21469,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 765: + case 768: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5578 +//line mysql_sql.y:5584 { } - case 766: + case 769: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:5580 +//line mysql_sql.y:5586 { } - case 770: + case 773: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5589 +//line mysql_sql.y:5595 { yyLOCAL = &tree.ShowVariables{ Global: yyDollar[2].boolValUnion(), @@ -21391,10 +21491,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 771: + case 774: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5599 +//line mysql_sql.y:5605 { yyLOCAL = &tree.ShowStatus{ Global: yyDollar[2].boolValUnion(), @@ -21403,74 +21503,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 772: + case 775: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5608 +//line mysql_sql.y:5614 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 773: + case 776: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5612 +//line mysql_sql.y:5618 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 774: + case 777: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5616 +//line mysql_sql.y:5622 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 775: + case 778: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5622 +//line mysql_sql.y:5628 { yyLOCAL = &tree.ShowWarnings{Limit: yyDollar[3].limitUnion()} } yyVAL.union = yyLOCAL - case 776: + case 779: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5626 +//line mysql_sql.y:5632 { yyLOCAL = &tree.ShowWarnings{Count: true} } yyVAL.union = yyLOCAL - case 777: + case 780: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5632 +//line mysql_sql.y:5638 { yyLOCAL = &tree.ShowErrors{Limit: yyDollar[3].limitUnion()} } yyVAL.union = yyLOCAL - case 778: + case 781: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5636 +//line mysql_sql.y:5642 { yyLOCAL = &tree.ShowErrors{Count: true} } yyVAL.union = yyLOCAL - case 779: + case 782: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5642 +//line mysql_sql.y:5648 { yyLOCAL = &tree.ShowProcessList{Full: yyDollar[2].fullOptUnion()} } yyVAL.union = yyLOCAL - case 780: + case 783: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5648 +//line mysql_sql.y:5654 { yyLOCAL = &tree.ShowSequences{ DBName: yyDollar[3].str, @@ -21478,10 +21578,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 781: + case 784: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5657 +//line mysql_sql.y:5663 { yyLOCAL = &tree.ShowTables{ Open: false, @@ -21493,10 +21593,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 782: + case 785: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5668 +//line mysql_sql.y:5674 { yyLOCAL = &tree.ShowTables{ Open: true, @@ -21507,10 +21607,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 783: + case 786: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5680 +//line mysql_sql.y:5686 { yyLOCAL = &tree.ShowDatabases{ Like: yyDollar[3].comparisionExprUnion(), @@ -21519,18 +21619,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 784: + case 787: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5688 +//line mysql_sql.y:5694 { yyLOCAL = &tree.ShowDatabases{Like: yyDollar[3].comparisionExprUnion(), Where: yyDollar[4].whereUnion()} } yyVAL.union = yyLOCAL - case 785: + case 788: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5694 +//line mysql_sql.y:5700 { yyLOCAL = &tree.ShowColumns{ Ext: false, @@ -21543,10 +21643,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 786: + case 789: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5706 +//line mysql_sql.y:5712 { yyLOCAL = &tree.ShowColumns{ Ext: true, @@ -21559,134 +21659,134 @@ yydefault: } } yyVAL.union = yyLOCAL - case 787: + case 790: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5720 +//line mysql_sql.y:5726 { yyLOCAL = &tree.ShowAccounts{Like: yyDollar[3].comparisionExprUnion()} } yyVAL.union = yyLOCAL - case 788: + case 791: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5726 +//line mysql_sql.y:5732 { yyLOCAL = &tree.ShowPublications{Like: yyDollar[3].comparisionExprUnion()} } yyVAL.union = yyLOCAL - case 789: + case 792: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5732 +//line mysql_sql.y:5738 { yyLOCAL = &tree.ShowPublicationCoverage{Name: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 790: + case 793: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5738 +//line mysql_sql.y:5744 { yyLOCAL = &tree.ShowAccountUpgrade{} } yyVAL.union = yyLOCAL - case 791: + case 794: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5744 +//line mysql_sql.y:5750 { yyLOCAL = &tree.ShowSubscriptions{Like: yyDollar[3].comparisionExprUnion()} } yyVAL.union = yyLOCAL - case 792: + case 795: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5748 +//line mysql_sql.y:5754 { yyLOCAL = &tree.ShowSubscriptions{All: true, Like: yyDollar[4].comparisionExprUnion()} } yyVAL.union = yyLOCAL - case 793: + case 796: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5754 +//line mysql_sql.y:5760 { yyLOCAL = &tree.ShowCcprSubscriptions{TaskId: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 794: + case 797: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5758 +//line mysql_sql.y:5764 { yyLOCAL = &tree.ShowCcprSubscriptions{} } yyVAL.union = yyLOCAL - case 795: + case 798: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ComparisonExpr -//line mysql_sql.y:5763 +//line mysql_sql.y:5769 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 796: + case 799: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ComparisonExpr -//line mysql_sql.y:5767 +//line mysql_sql.y:5773 { yyLOCAL = tree.NewComparisonExpr(tree.LIKE, nil, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 797: + case 800: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ComparisonExpr -//line mysql_sql.y:5771 +//line mysql_sql.y:5777 { yyLOCAL = tree.NewComparisonExpr(tree.ILIKE, nil, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 798: + case 801: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5776 +//line mysql_sql.y:5782 { yyVAL.str = "" } - case 799: + case 802: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:5780 +//line mysql_sql.y:5786 { yyVAL.str = yyDollar[2].cstrUnion().Compare() } - case 800: + case 803: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5786 +//line mysql_sql.y:5792 { yyLOCAL = yyDollar[2].unresolvedObjectNameUnion() } yyVAL.union = yyLOCAL - case 805: + case 808: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5799 +//line mysql_sql.y:5805 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 806: + case 809: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5803 +//line mysql_sql.y:5809 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 807: + case 810: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5809 +//line mysql_sql.y:5815 { yyLOCAL = &tree.ShowCreateTable{ Name: yyDollar[4].unresolvedObjectNameUnion(), @@ -21694,10 +21794,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 808: + case 811: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5817 +//line mysql_sql.y:5823 { yyLOCAL = &tree.ShowCreateView{ Name: yyDollar[4].unresolvedObjectNameUnion(), @@ -21705,10 +21805,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 809: + case 812: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5824 +//line mysql_sql.y:5830 { yyLOCAL = &tree.ShowCreateDatabase{ IfNotExists: yyDollar[4].ifNotExistsUnion(), @@ -21717,94 +21817,94 @@ yydefault: } } yyVAL.union = yyLOCAL - case 810: + case 813: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5832 +//line mysql_sql.y:5838 { yyLOCAL = &tree.ShowCreatePublications{Name: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 811: + case 814: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5838 +//line mysql_sql.y:5844 { yyLOCAL = &tree.ShowBackendServers{} } yyVAL.union = yyLOCAL - case 812: + case 815: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5844 +//line mysql_sql.y:5850 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedObjectName(tblName) } yyVAL.union = yyLOCAL - case 813: + case 816: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5849 +//line mysql_sql.y:5855 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedObjectName(dbName, tblName) } yyVAL.union = yyLOCAL - case 814: + case 817: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:5857 +//line mysql_sql.y:5863 { yyVAL.str = yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) } - case 815: + case 818: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5863 +//line mysql_sql.y:5869 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedObjectName(tblName) } yyVAL.union = yyLOCAL - case 816: + case 819: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5868 +//line mysql_sql.y:5874 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedObjectName(dbName, tblName) } yyVAL.union = yyLOCAL - case 817: + case 820: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5874 +//line mysql_sql.y:5880 { yyLOCAL = tree.NewUnresolvedObjectName(yyDollar[1].cstrUnion().Compare(), yyDollar[3].cstrUnion().Compare(), yyDollar[5].cstrUnion().Compare()) } yyVAL.union = yyLOCAL - case 818: + case 821: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5880 +//line mysql_sql.y:5886 { yyLOCAL = tree.NewTruncateTable(yyDollar[2].tableNameUnion()) } yyVAL.union = yyLOCAL - case 819: + case 822: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5884 +//line mysql_sql.y:5890 { yyLOCAL = tree.NewTruncateTable(yyDollar[3].tableNameUnion()) } yyVAL.union = yyLOCAL - case 841: + case 845: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5915 +//line mysql_sql.y:5922 { yyLOCAL = &tree.DropSQLTask{ IfExists: yyDollar[3].boolValUnion(), @@ -21812,10 +21912,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 842: + case 846: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5924 +//line mysql_sql.y:5931 { yyLOCAL = &tree.DropIcebergCatalog{ IfExists: yyDollar[4].boolValUnion(), @@ -21823,10 +21923,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 843: + case 847: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5933 +//line mysql_sql.y:5940 { yyLOCAL = &tree.DropMongoDBConnection{ IfExists: yyDollar[4].boolValUnion(), @@ -21834,56 +21934,56 @@ yydefault: } } yyVAL.union = yyLOCAL - case 844: + case 848: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5942 +//line mysql_sql.y:5949 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].tableNamesUnion() yyLOCAL = tree.NewDropSequence(ifExists, name) } yyVAL.union = yyLOCAL - case 845: + case 849: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5950 +//line mysql_sql.y:5957 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].exprUnion() yyLOCAL = tree.NewDropAccount(ifExists, name) } yyVAL.union = yyLOCAL - case 846: + case 850: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5958 +//line mysql_sql.y:5965 { var ifExists = yyDollar[3].boolValUnion() var users = yyDollar[4].usersUnion() yyLOCAL = tree.NewDropUser(ifExists, users) } yyVAL.union = yyLOCAL - case 847: + case 851: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:5966 +//line mysql_sql.y:5973 { yyLOCAL = []*tree.User{yyDollar[1].userUnion()} } yyVAL.union = yyLOCAL - case 848: + case 852: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:5970 +//line mysql_sql.y:5977 { yyLOCAL = append(yyDollar[1].usersUnion(), yyDollar[3].userUnion()) } yyVAL.union = yyLOCAL - case 849: + case 853: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.User -//line mysql_sql.y:5976 +//line mysql_sql.y:5983 { var Username = yyDollar[1].usernameRecordUnion().Username var Hostname = yyDollar[1].usernameRecordUnion().Hostname @@ -21895,20 +21995,20 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 850: + case 854: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5989 +//line mysql_sql.y:5996 { var ifExists = yyDollar[3].boolValUnion() var roles = yyDollar[4].rolesUnion() yyLOCAL = tree.NewDropRole(ifExists, roles) } yyVAL.union = yyLOCAL - case 851: + case 855: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5997 +//line mysql_sql.y:6004 { var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) var tableName = yyDollar[6].tableNameUnion() @@ -21916,10 +22016,10 @@ yydefault: yyLOCAL = tree.NewDropIndex(name, tableName, ifExists) } yyVAL.union = yyLOCAL - case 852: + case 856: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6006 +//line mysql_sql.y:6013 { var ifExists = yyDollar[4].boolValUnion() var names = yyDollar[5].tableNamesUnion() @@ -21928,48 +22028,48 @@ yydefault: yyLOCAL = stmt } yyVAL.union = yyLOCAL - case 853: + case 857: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6016 +//line mysql_sql.y:6023 { var ifExists = yyDollar[3].boolValUnion() var names = yyDollar[4].tableNamesUnion() yyLOCAL = tree.NewDropView(ifExists, names) } yyVAL.union = yyLOCAL - case 854: + case 858: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6024 +//line mysql_sql.y:6031 { var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) var ifExists = yyDollar[3].boolValUnion() yyLOCAL = tree.NewDropDatabase(name, ifExists) } yyVAL.union = yyLOCAL - case 855: + case 859: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6030 +//line mysql_sql.y:6037 { var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) var ifExists = yyDollar[3].boolValUnion() yyLOCAL = tree.NewDropDatabase(name, ifExists) } yyVAL.union = yyLOCAL - case 856: + case 860: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6038 +//line mysql_sql.y:6045 { yyLOCAL = tree.NewDeallocate(tree.Identifier(yyDollar[3].str), true) } yyVAL.union = yyLOCAL - case 857: + case 861: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6044 +//line mysql_sql.y:6051 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].functionNameUnion() @@ -21979,30 +22079,30 @@ yydefault: yyLOCAL = dropFunction } yyVAL.union = yyLOCAL - case 858: + case 862: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6055 +//line mysql_sql.y:6062 { var name = yyDollar[3].procNameUnion() var ifExists = false yyLOCAL = tree.NewDropProcedure(name, ifExists) } yyVAL.union = yyLOCAL - case 859: + case 863: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6061 +//line mysql_sql.y:6068 { var name = yyDollar[5].procNameUnion() var ifExists = true yyLOCAL = tree.NewDropProcedure(name, ifExists) } yyVAL.union = yyLOCAL - case 860: + case 864: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6069 +//line mysql_sql.y:6076 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[1].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -22011,10 +22111,10 @@ yydefault: yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 861: + case 865: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6077 +//line mysql_sql.y:6084 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[1].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -22023,10 +22123,10 @@ yydefault: yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 862: + case 866: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6085 +//line mysql_sql.y:6092 { yyDollar[2].statementUnion().(*tree.Delete).With = yyDollar[1].withClauseUnion() if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[2].statementUnion()); intoErr != "" { @@ -22036,10 +22136,10 @@ yydefault: yyLOCAL = yyDollar[2].statementUnion() } yyVAL.union = yyLOCAL - case 863: + case 867: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6094 +//line mysql_sql.y:6101 { yyDollar[2].statementUnion().(*tree.Delete).With = yyDollar[1].withClauseUnion() if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[2].statementUnion()); intoErr != "" { @@ -22049,10 +22149,10 @@ yydefault: yyLOCAL = yyDollar[2].statementUnion() } yyVAL.union = yyLOCAL - case 864: + case 868: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6105 +//line mysql_sql.y:6112 { // Single-Table Syntax t := &tree.AliasedTableExpr{ @@ -22074,10 +22174,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 865: + case 869: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6126 +//line mysql_sql.y:6133 { // Multiple-Table Syntax yyLOCAL = &tree.Delete{ @@ -22091,10 +22191,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 866: + case 870: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6141 +//line mysql_sql.y:6148 { // Multiple-Table Syntax yyLOCAL = &tree.Delete{ @@ -22108,36 +22208,36 @@ yydefault: } } yyVAL.union = yyLOCAL - case 867: + case 871: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExprs -//line mysql_sql.y:6156 +//line mysql_sql.y:6163 { yyLOCAL = tree.TableExprs{yyDollar[1].tableNameUnion()} } yyVAL.union = yyLOCAL - case 868: + case 872: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableExprs -//line mysql_sql.y:6160 +//line mysql_sql.y:6167 { yyLOCAL = append(yyDollar[1].tableExprsUnion(), yyDollar[3].tableNameUnion()) } yyVAL.union = yyLOCAL - case 869: + case 873: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.TableName -//line mysql_sql.y:6166 +//line mysql_sql.y:6173 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) prefix := tree.ObjectNamePrefix{ExplicitSchema: false} yyLOCAL = tree.NewTableName(tree.Identifier(tblName), prefix, nil) } yyVAL.union = yyLOCAL - case 870: + case 874: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.TableName -//line mysql_sql.y:6172 +//line mysql_sql.y:6179 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) @@ -22145,49 +22245,49 @@ yydefault: yyLOCAL = tree.NewTableName(tree.Identifier(tblName), prefix, nil) } yyVAL.union = yyLOCAL - case 871: + case 875: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6181 +//line mysql_sql.y:6188 { } - case 872: + case 876: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:6183 +//line mysql_sql.y:6190 { } - case 873: + case 877: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6186 +//line mysql_sql.y:6193 { yyVAL.str = "" } - case 878: + case 882: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6195 +//line mysql_sql.y:6202 { yyVAL.str = "" } - case 880: + case 884: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6199 +//line mysql_sql.y:6206 { yyVAL.str = "" } - case 881: + case 885: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:6203 +//line mysql_sql.y:6210 { yyVAL.str = "ignore" } - case 882: + case 886: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6211 +//line mysql_sql.y:6218 { } - case 885: + case 889: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6217 +//line mysql_sql.y:6224 { rep := yyDollar[5].replaceUnion() if intoErr := tree.ValidateSelectIntoNotAllowed(rep.Rows); intoErr != "" { @@ -22203,10 +22303,10 @@ yydefault: yyLOCAL = rep } yyVAL.union = yyLOCAL - case 886: + case 890: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6234 +//line mysql_sql.y:6241 { vc := tree.NewValuesClause(yyDollar[2].rowsExprsUnion()) yyLOCAL = &tree.Replace{ @@ -22214,20 +22314,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 887: + case 891: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6241 +//line mysql_sql.y:6248 { yyLOCAL = &tree.Replace{ Rows: yyDollar[1].selectUnion(), } } yyVAL.union = yyLOCAL - case 888: + case 892: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6247 +//line mysql_sql.y:6254 { vc := tree.NewValuesClause(yyDollar[5].rowsExprsUnion()) yyLOCAL = &tree.Replace{ @@ -22237,10 +22337,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 889: + case 893: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6256 +//line mysql_sql.y:6263 { vc := tree.NewValuesClause(yyDollar[4].rowsExprsUnion()) yyLOCAL = &tree.Replace{ @@ -22248,10 +22348,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 890: + case 894: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6263 +//line mysql_sql.y:6270 { yyLOCAL = &tree.Replace{ Columns: yyDollar[2].insertColumnsUnion().Identifiers, @@ -22260,10 +22360,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 891: + case 895: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6271 +//line mysql_sql.y:6278 { if yyDollar[2].assignmentsUnion() == nil { yylex.Error("the set list of replace can not be empty") @@ -22286,10 +22386,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 893: + case 897: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6296 +//line mysql_sql.y:6303 { yyDollar[2].statementUnion().(*tree.Insert).With = yyDollar[1].withClauseUnion() if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[2].statementUnion()); intoErr != "" { @@ -22299,19 +22399,19 @@ yydefault: yyLOCAL = yyDollar[2].statementUnion() } yyVAL.union = yyLOCAL - case 895: + case 899: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6306 +//line mysql_sql.y:6313 { yyDollar[2].statementUnion().(*tree.MultiInsert).With = yyDollar[1].withClauseUnion() yyLOCAL = yyDollar[2].statementUnion() } yyVAL.union = yyLOCAL - case 896: + case 900: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6316 +//line mysql_sql.y:6323 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[4].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -22320,10 +22420,10 @@ yydefault: yyLOCAL = &tree.MultiInsert{Targets: yyDollar[3].multiInsertTargetsUnion(), Source: yyDollar[4].selectUnion()} } yyVAL.union = yyLOCAL - case 897: + case 901: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6324 +//line mysql_sql.y:6331 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[5].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -22332,10 +22432,10 @@ yydefault: yyLOCAL = &tree.MultiInsert{Whens: yyDollar[3].multiInsertWhensUnion(), Else: yyDollar[4].multiInsertTargetsUnion(), Source: yyDollar[5].selectUnion()} } yyVAL.union = yyLOCAL - case 898: + case 902: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6332 +//line mysql_sql.y:6339 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[5].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -22344,98 +22444,98 @@ yydefault: yyLOCAL = &tree.MultiInsert{First: true, Whens: yyDollar[3].multiInsertWhensUnion(), Else: yyDollar[4].multiInsertTargetsUnion(), Source: yyDollar[5].selectUnion()} } yyVAL.union = yyLOCAL - case 899: + case 903: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.MultiInsertWhen -//line mysql_sql.y:6342 +//line mysql_sql.y:6349 { yyLOCAL = []*tree.MultiInsertWhen{yyDollar[1].multiInsertWhenUnion()} } yyVAL.union = yyLOCAL - case 900: + case 904: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.MultiInsertWhen -//line mysql_sql.y:6346 +//line mysql_sql.y:6353 { yyLOCAL = append(yyDollar[1].multiInsertWhensUnion(), yyDollar[2].multiInsertWhenUnion()) } yyVAL.union = yyLOCAL - case 901: + case 905: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.MultiInsertWhen -//line mysql_sql.y:6352 +//line mysql_sql.y:6359 { yyLOCAL = &tree.MultiInsertWhen{Cond: yyDollar[2].exprUnion(), Targets: yyDollar[4].multiInsertTargetsUnion()} } yyVAL.union = yyLOCAL - case 902: + case 906: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.MultiInsertTarget -//line mysql_sql.y:6357 +//line mysql_sql.y:6364 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 903: + case 907: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.MultiInsertTarget -//line mysql_sql.y:6361 +//line mysql_sql.y:6368 { yyLOCAL = yyDollar[2].multiInsertTargetsUnion() } yyVAL.union = yyLOCAL - case 904: + case 908: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.MultiInsertTarget -//line mysql_sql.y:6367 +//line mysql_sql.y:6374 { yyLOCAL = []*tree.MultiInsertTarget{yyDollar[1].multiInsertTargetUnion()} } yyVAL.union = yyLOCAL - case 905: + case 909: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.MultiInsertTarget -//line mysql_sql.y:6371 +//line mysql_sql.y:6378 { yyLOCAL = append(yyDollar[1].multiInsertTargetsUnion(), yyDollar[2].multiInsertTargetUnion()) } yyVAL.union = yyLOCAL - case 906: + case 910: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.MultiInsertTarget -//line mysql_sql.y:6377 +//line mysql_sql.y:6384 { yyLOCAL = &tree.MultiInsertTarget{Table: yyDollar[2].tableNameUnion()} } yyVAL.union = yyLOCAL - case 907: + case 911: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.MultiInsertTarget -//line mysql_sql.y:6381 +//line mysql_sql.y:6388 { yyLOCAL = &tree.MultiInsertTarget{Table: yyDollar[2].tableNameUnion(), Values: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 908: + case 912: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.MultiInsertTarget -//line mysql_sql.y:6385 +//line mysql_sql.y:6392 { yyLOCAL = &tree.MultiInsertTarget{Table: yyDollar[2].tableNameUnion(), Columns: yyDollar[4].insertColumnsUnion().Identifiers, ColumnNames: yyDollar[4].insertColumnsUnion().Names} } yyVAL.union = yyLOCAL - case 909: + case 913: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.MultiInsertTarget -//line mysql_sql.y:6389 +//line mysql_sql.y:6396 { yyLOCAL = &tree.MultiInsertTarget{Table: yyDollar[2].tableNameUnion(), Columns: yyDollar[4].insertColumnsUnion().Identifiers, ColumnNames: yyDollar[4].insertColumnsUnion().Names, Values: yyDollar[8].exprsUnion()} } yyVAL.union = yyLOCAL - case 910: + case 914: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6395 +//line mysql_sql.y:6402 { ins := yyDollar[4].insertUnion() if intoErr := tree.ValidateSelectIntoNotAllowed(ins.Rows); intoErr != "" { @@ -22459,10 +22559,10 @@ yydefault: yyLOCAL = ins } yyVAL.union = yyLOCAL - case 911: + case 915: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6418 +//line mysql_sql.y:6425 { ins := yyDollar[5].insertUnion() if intoErr := tree.ValidateSelectIntoNotAllowed(ins.Rows); intoErr != "" { @@ -22482,10 +22582,10 @@ yydefault: yyLOCAL = ins } yyVAL.union = yyLOCAL - case 912: + case 916: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6437 +//line mysql_sql.y:6444 { ins := yyDollar[5].insertUnion() if intoErr := tree.ValidateSelectIntoNotAllowed(ins.Rows); intoErr != "" { @@ -22506,10 +22606,10 @@ yydefault: yyLOCAL = ins } yyVAL.union = yyLOCAL - case 913: + case 917: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6457 +//line mysql_sql.y:6464 { ins := yyDollar[5].insertUnion() if intoErr := tree.ValidateSelectIntoNotAllowed(ins.Rows); intoErr != "" { @@ -22533,43 +22633,43 @@ yydefault: yyLOCAL = ins } yyVAL.union = yyLOCAL - case 914: + case 918: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.SelectExprs -//line mysql_sql.y:6481 +//line mysql_sql.y:6488 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 915: + case 919: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.SelectExprs -//line mysql_sql.y:6485 +//line mysql_sql.y:6492 { yyLOCAL = yyDollar[2].selectExprsUnion() } yyVAL.union = yyLOCAL - case 916: + case 920: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6491 +//line mysql_sql.y:6498 { yyLOCAL = yyDollar[1].mergeUnion() } yyVAL.union = yyLOCAL - case 917: + case 921: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6495 +//line mysql_sql.y:6502 { yyDollar[2].mergeUnion().With = yyDollar[1].withClauseUnion() yyLOCAL = yyDollar[2].mergeUnion() } yyVAL.union = yyLOCAL - case 918: + case 922: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.Merge -//line mysql_sql.y:6502 +//line mysql_sql.y:6509 { yyLOCAL = &tree.Merge{ Target: yyDollar[3].tableExprUnion(), @@ -22579,10 +22679,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 919: + case 923: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.Merge -//line mysql_sql.y:6511 +//line mysql_sql.y:6518 { yyLOCAL = &tree.Merge{ Target: yyDollar[3].tableExprUnion(), @@ -22593,26 +22693,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 920: + case 924: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.MergeClauses -//line mysql_sql.y:6523 +//line mysql_sql.y:6530 { yyLOCAL = tree.MergeClauses{yyDollar[1].mergeClauseUnion()} } yyVAL.union = yyLOCAL - case 921: + case 925: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MergeClauses -//line mysql_sql.y:6527 +//line mysql_sql.y:6534 { yyLOCAL = append(yyDollar[1].mergeClausesUnion(), yyDollar[2].mergeClauseUnion()) } yyVAL.union = yyLOCAL - case 922: + case 926: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6533 +//line mysql_sql.y:6540 { yyLOCAL = &tree.MergeClause{ Matched: true, @@ -22622,10 +22722,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 923: + case 927: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6542 +//line mysql_sql.y:6549 { yyLOCAL = &tree.MergeClause{ Matched: true, @@ -22634,10 +22734,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 924: + case 928: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6550 +//line mysql_sql.y:6557 { yyLOCAL = &tree.MergeClause{ Matched: false, @@ -22648,10 +22748,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 925: + case 929: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6560 +//line mysql_sql.y:6567 { yyLOCAL = &tree.MergeClause{ Matched: false, @@ -22662,10 +22762,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 926: + case 930: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6570 +//line mysql_sql.y:6577 { yyLOCAL = &tree.MergeClause{ Matched: false, @@ -22675,10 +22775,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 927: + case 931: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6579 +//line mysql_sql.y:6586 { yyLOCAL = &tree.MergeClause{ Matched: false, @@ -22688,9 +22788,9 @@ yydefault: } } yyVAL.union = yyLOCAL - case 928: + case 932: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:6590 +//line mysql_sql.y:6597 { if !strings.EqualFold(yyDollar[1].cstrUnion().Origin(), "matched") { yylex.Error("expected MATCHED") @@ -22698,42 +22798,42 @@ yydefault: } yyVAL.str = yyDollar[1].cstrUnion().Origin() } - case 929: + case 933: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:6599 +//line mysql_sql.y:6606 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 930: + case 934: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:6603 +//line mysql_sql.y:6610 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 931: + case 935: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6609 +//line mysql_sql.y:6616 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 932: + case 936: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6613 +//line mysql_sql.y:6620 { yyLOCAL = append(yyDollar[1].identifierListUnion(), tree.Identifier(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 933: + case 937: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6619 +//line mysql_sql.y:6626 { vc := tree.NewValuesClause(yyDollar[2].rowsExprsUnion()) yyLOCAL = &tree.Insert{ @@ -22741,20 +22841,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 934: + case 938: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6626 +//line mysql_sql.y:6633 { yyLOCAL = &tree.Insert{ Rows: yyDollar[1].selectUnion(), } } yyVAL.union = yyLOCAL - case 935: + case 939: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6632 +//line mysql_sql.y:6639 { vc := tree.NewValuesClause(yyDollar[5].rowsExprsUnion()) yyLOCAL = &tree.Insert{ @@ -22764,10 +22864,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 936: + case 940: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6641 +//line mysql_sql.y:6648 { vc := tree.NewValuesClause(yyDollar[4].rowsExprsUnion()) yyLOCAL = &tree.Insert{ @@ -22775,10 +22875,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 937: + case 941: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6648 +//line mysql_sql.y:6655 { yyLOCAL = &tree.Insert{ Columns: yyDollar[2].insertColumnsUnion().Identifiers, @@ -22787,10 +22887,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 938: + case 942: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6656 +//line mysql_sql.y:6663 { if yyDollar[2].assignmentsUnion() == nil { yylex.Error("the set list of insert can not be empty") @@ -22812,66 +22912,66 @@ yydefault: } } yyVAL.union = yyLOCAL - case 939: + case 943: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:6678 +//line mysql_sql.y:6685 { yyLOCAL = []*tree.UpdateExpr{} } yyVAL.union = yyLOCAL - case 940: + case 944: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:6682 +//line mysql_sql.y:6689 { yyLOCAL = yyDollar[1].updateExprsUnion() } yyVAL.union = yyLOCAL - case 941: + case 945: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:6688 +//line mysql_sql.y:6695 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 942: + case 946: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:6692 +//line mysql_sql.y:6699 { yyLOCAL = []*tree.UpdateExpr{nil} } yyVAL.union = yyLOCAL - case 943: + case 947: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.Assignment -//line mysql_sql.y:6698 +//line mysql_sql.y:6705 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 944: + case 948: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Assignment -//line mysql_sql.y:6702 +//line mysql_sql.y:6709 { yyLOCAL = []*tree.Assignment{yyDollar[1].assignmentUnion()} } yyVAL.union = yyLOCAL - case 945: + case 949: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Assignment -//line mysql_sql.y:6706 +//line mysql_sql.y:6713 { yyLOCAL = append(yyDollar[1].assignmentsUnion(), yyDollar[3].assignmentUnion()) } yyVAL.union = yyLOCAL - case 946: + case 950: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Assignment -//line mysql_sql.y:6712 +//line mysql_sql.y:6719 { yyLOCAL = &tree.Assignment{ Column: tree.Identifier(yyDollar[1].unresolvedNameUnion().ColName()), @@ -22880,10 +22980,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 947: + case 951: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.InsertColumns -//line mysql_sql.y:6722 +//line mysql_sql.y:6729 { yyLOCAL = tree.InsertColumns{ Identifiers: tree.IdentifierList{tree.Identifier(yyDollar[1].unresolvedNameUnion().ColName())}, @@ -22891,236 +22991,236 @@ yydefault: } } yyVAL.union = yyLOCAL - case 948: + case 952: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.InsertColumns -//line mysql_sql.y:6729 +//line mysql_sql.y:6736 { yyLOCAL = yyDollar[1].insertColumnsUnion() yyLOCAL.Identifiers = append(yyDollar[1].insertColumnsUnion().Identifiers, tree.Identifier(yyDollar[3].unresolvedNameUnion().ColName())) yyLOCAL.Names = append(yyDollar[1].insertColumnsUnion().Names, yyDollar[3].unresolvedNameUnion()) } yyVAL.union = yyLOCAL - case 949: + case 953: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:6737 +//line mysql_sql.y:6744 { yyLOCAL = tree.NewUnresolvedName(yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin())) } yyVAL.union = yyLOCAL - case 950: + case 954: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:6741 +//line mysql_sql.y:6748 { tblName := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(tblName, yyDollar[3].cstrUnion()) } yyVAL.union = yyLOCAL - case 951: + case 955: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:6746 +//line mysql_sql.y:6753 { dbName := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(dbName, tblName, yyDollar[5].cstrUnion()) } yyVAL.union = yyLOCAL - case 952: + case 956: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6754 +//line mysql_sql.y:6761 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 953: + case 957: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6758 +//line mysql_sql.y:6765 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[3].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 954: + case 958: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6762 +//line mysql_sql.y:6769 { yyLOCAL = append(yyDollar[1].identifierListUnion(), tree.Identifier(yyDollar[3].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 955: + case 959: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6766 +//line mysql_sql.y:6773 { yyLOCAL = append(yyDollar[1].identifierListUnion(), tree.Identifier(yyDollar[5].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 956: + case 960: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:6772 +//line mysql_sql.y:6779 { yyLOCAL = []tree.Exprs{yyDollar[1].exprsUnion()} } yyVAL.union = yyLOCAL - case 957: + case 961: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:6776 +//line mysql_sql.y:6783 { yyLOCAL = append(yyDollar[1].rowsExprsUnion(), yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 958: + case 962: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:6782 +//line mysql_sql.y:6789 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 959: + case 963: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6787 +//line mysql_sql.y:6794 { } - case 961: + case 965: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:6791 +//line mysql_sql.y:6798 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 963: + case 967: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:6798 +//line mysql_sql.y:6805 { yyLOCAL = tree.Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 964: + case 968: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:6802 +//line mysql_sql.y:6809 { yyLOCAL = append(yyDollar[1].exprsUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 966: + case 970: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:6809 +//line mysql_sql.y:6816 { yyLOCAL = &tree.DefaultVal{} } yyVAL.union = yyLOCAL - case 967: + case 971: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6814 +//line mysql_sql.y:6821 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 968: + case 972: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6818 +//line mysql_sql.y:6825 { yyLOCAL = yyDollar[3].identifierListUnion() } yyVAL.union = yyLOCAL - case 969: + case 973: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.InsertPartitionClause -//line mysql_sql.y:6823 +//line mysql_sql.y:6830 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 970: + case 974: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.InsertPartitionClause -//line mysql_sql.y:6827 +//line mysql_sql.y:6834 { yyLOCAL = &tree.InsertPartitionClause{Names: yyDollar[3].identifierListUnion()} } yyVAL.union = yyLOCAL - case 971: + case 975: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.InsertPartitionClause -//line mysql_sql.y:6831 +//line mysql_sql.y:6838 { yyLOCAL = &tree.InsertPartitionClause{Values: yyDollar[3].partitionValuesUnion()} } yyVAL.union = yyLOCAL - case 972: + case 976: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.PartitionValues -//line mysql_sql.y:6837 +//line mysql_sql.y:6844 { yyLOCAL = tree.PartitionValues{{Name: tree.Identifier(yyDollar[1].cstrUnion().Compare()), Expr: yyDollar[3].exprUnion()}} } yyVAL.union = yyLOCAL - case 973: + case 977: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.PartitionValues -//line mysql_sql.y:6841 +//line mysql_sql.y:6848 { yyLOCAL = append(yyDollar[1].partitionValuesUnion(), tree.PartitionValue{Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), Expr: yyDollar[5].exprUnion()}) } yyVAL.union = yyLOCAL - case 974: + case 978: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6847 +//line mysql_sql.y:6854 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 975: + case 979: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6851 +//line mysql_sql.y:6858 { yyLOCAL = append(yyDollar[1].identifierListUnion(), tree.Identifier(yyDollar[3].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 976: + case 980: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:6857 +//line mysql_sql.y:6864 { yyLOCAL = yyDollar[2].tableNameUnion() } yyVAL.union = yyLOCAL - case 977: + case 981: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:6861 +//line mysql_sql.y:6868 { yyLOCAL = yyDollar[1].tableNameUnion() } yyVAL.union = yyLOCAL - case 978: + case 982: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.SelectInto -//line mysql_sql.y:6867 +//line mysql_sql.y:6874 { yyLOCAL = &tree.SelectInto{} } yyVAL.union = yyLOCAL - case 979: + case 983: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.SelectInto -//line mysql_sql.y:6871 +//line mysql_sql.y:6878 { yyLOCAL = &tree.SelectInto{Export: &tree.ExportParam{ Outfile: true, @@ -23135,23 +23235,23 @@ yydefault: }} } yyVAL.union = yyLOCAL - case 980: + case 984: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.SelectInto -//line mysql_sql.y:6885 +//line mysql_sql.y:6892 { yyLOCAL = &tree.SelectInto{UserVars: yyDollar[2].varExprsUnion()} } yyVAL.union = yyLOCAL - case 981: + case 985: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6890 +//line mysql_sql.y:6897 { yyVAL.str = "" } - case 982: + case 986: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:6894 +//line mysql_sql.y:6901 { str := strings.ToLower(yyDollar[2].str) if str != "csv" && str != "jsonline" && str != "parquet" { @@ -23160,18 +23260,18 @@ yydefault: } yyVAL.str = str } - case 983: + case 987: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:6904 +//line mysql_sql.y:6911 { yyLOCAL = uint64(0) } yyVAL.union = yyLOCAL - case 984: + case 988: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:6908 +//line mysql_sql.y:6915 { size, err := util.ParseDataSize(yyDollar[2].str) if err != nil { @@ -23181,10 +23281,10 @@ yydefault: yyLOCAL = size } yyVAL.union = yyLOCAL - case 985: + case 989: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:6918 +//line mysql_sql.y:6925 { yyLOCAL = &tree.Fields{ Terminated: &tree.Terminated{ @@ -23196,10 +23296,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 986: + case 990: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:6929 +//line mysql_sql.y:6936 { yyLOCAL = &tree.Fields{ Terminated: &tree.Terminated{ @@ -23211,10 +23311,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 987: + case 991: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:6940 +//line mysql_sql.y:6947 { str := yyDollar[7].str if str != "\\" && len(str) > 1 { @@ -23237,10 +23337,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 988: + case 992: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:6962 +//line mysql_sql.y:6969 { str := yyDollar[4].str if str != "\\" && len(str) > 1 { @@ -23263,10 +23363,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 989: + case 993: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Lines -//line mysql_sql.y:6985 +//line mysql_sql.y:6992 { yyLOCAL = &tree.Lines{ TerminatedBy: &tree.Terminated{ @@ -23275,10 +23375,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 990: + case 994: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Lines -//line mysql_sql.y:6993 +//line mysql_sql.y:7000 { yyLOCAL = &tree.Lines{ TerminatedBy: &tree.Terminated{ @@ -23287,18 +23387,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 991: + case 995: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:7002 +//line mysql_sql.y:7009 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 992: + case 996: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:7006 +//line mysql_sql.y:7013 { str := strings.ToLower(yyDollar[2].str) if str == "true" { @@ -23311,18 +23411,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 993: + case 997: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:7019 +//line mysql_sql.y:7026 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 994: + case 998: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:7023 +//line mysql_sql.y:7030 { value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -23331,43 +23431,43 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 995: + case 999: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:7030 +//line mysql_sql.y:7037 { yyLOCAL = []string{} } yyVAL.union = yyLOCAL - case 996: + case 1000: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:7034 +//line mysql_sql.y:7041 { yyLOCAL = yyDollar[3].strsUnion() } yyVAL.union = yyLOCAL - case 997: + case 1001: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:7040 +//line mysql_sql.y:7047 { yyLOCAL = make([]string, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].cstrUnion().Compare()) } yyVAL.union = yyLOCAL - case 998: + case 1002: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:7045 +//line mysql_sql.y:7052 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].cstrUnion().Compare()) } yyVAL.union = yyLOCAL - case 999: + case 1003: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7054 +//line mysql_sql.y:7061 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23381,18 +23481,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1001: + case 1005: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7070 +//line mysql_sql.y:7077 { yyLOCAL = yyDollar[1].selectUnion() } yyVAL.union = yyLOCAL - case 1002: + case 1006: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7074 +//line mysql_sql.y:7081 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23406,26 +23506,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1003: + case 1007: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7094 +//line mysql_sql.y:7101 { yyLOCAL = yyDollar[1].selectUnion() } yyVAL.union = yyLOCAL - case 1004: + case 1008: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7098 +//line mysql_sql.y:7105 { yyLOCAL = tree.NewSelect(&tree.ValuesClause{Rows: yyDollar[2].rowsExprsUnion(), RowWord: true}, yyDollar[3].orderByUnion(), yyDollar[4].limitUnion()) } yyVAL.union = yyLOCAL - case 1005: + case 1009: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7104 +//line mysql_sql.y:7111 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23443,10 +23543,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1006: + case 1010: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7121 +//line mysql_sql.y:7128 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23464,10 +23564,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1007: + case 1011: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7138 +//line mysql_sql.y:7145 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23485,10 +23585,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1008: + case 1012: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7155 +//line mysql_sql.y:7162 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23506,10 +23606,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1009: + case 1013: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7172 +//line mysql_sql.y:7179 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23527,10 +23627,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1010: + case 1014: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7189 +//line mysql_sql.y:7196 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23548,10 +23648,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1011: + case 1015: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7206 +//line mysql_sql.y:7213 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[2].selectStatementUnion()) if intoErr != "" { @@ -23569,10 +23669,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1012: + case 1016: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7223 +//line mysql_sql.y:7230 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[2].selectStatementUnion()) if intoErr != "" { @@ -23590,10 +23690,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1013: + case 1017: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7240 +//line mysql_sql.y:7247 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[2].selectStatementUnion()) if intoErr != "" { @@ -23611,10 +23711,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1014: + case 1018: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7257 +//line mysql_sql.y:7264 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[2].selectStatementUnion()) if intoErr != "" { @@ -23632,10 +23732,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1015: + case 1019: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7274 +//line mysql_sql.y:7281 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[2].selectStatementUnion()) if intoErr != "" { @@ -23653,26 +23753,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1016: + case 1020: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.TimeWindow -//line mysql_sql.y:7292 +//line mysql_sql.y:7299 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1017: + case 1021: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.TimeWindow -//line mysql_sql.y:7296 +//line mysql_sql.y:7303 { yyLOCAL = yyDollar[1].timeWindowUnion() } yyVAL.union = yyLOCAL - case 1018: + case 1022: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.TimeWindow -//line mysql_sql.y:7302 +//line mysql_sql.y:7309 { yyLOCAL = &tree.TimeWindow{ Interval: yyDollar[1].timeIntervalUnion(), @@ -23682,10 +23782,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1019: + case 1023: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.Interval -//line mysql_sql.y:7313 +//line mysql_sql.y:7320 { str := fmt.Sprintf("%v", yyDollar[5].item) v, errStr := util.GetInt64(yyDollar[5].item) @@ -23700,18 +23800,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1020: + case 1024: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Sliding -//line mysql_sql.y:7328 +//line mysql_sql.y:7335 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1021: + case 1025: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Sliding -//line mysql_sql.y:7332 +//line mysql_sql.y:7339 { str := fmt.Sprintf("%v", yyDollar[3].item) v, errStr := util.GetInt64(yyDollar[3].item) @@ -23725,44 +23825,44 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1022: + case 1026: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:7346 +//line mysql_sql.y:7353 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1023: + case 1027: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:7350 +//line mysql_sql.y:7357 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1024: + case 1028: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Fill -//line mysql_sql.y:7355 +//line mysql_sql.y:7362 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1025: + case 1029: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Fill -//line mysql_sql.y:7359 +//line mysql_sql.y:7366 { yyLOCAL = &tree.Fill{ Mode: yyDollar[3].fillModeUnion(), } } yyVAL.union = yyLOCAL - case 1026: + case 1030: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Fill -//line mysql_sql.y:7365 +//line mysql_sql.y:7372 { yyLOCAL = &tree.Fill{ Mode: tree.FillValue, @@ -23770,50 +23870,50 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1027: + case 1031: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FillMode -//line mysql_sql.y:7374 +//line mysql_sql.y:7381 { yyLOCAL = tree.FillPrev } yyVAL.union = yyLOCAL - case 1028: + case 1032: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FillMode -//line mysql_sql.y:7378 +//line mysql_sql.y:7385 { yyLOCAL = tree.FillNext } yyVAL.union = yyLOCAL - case 1029: + case 1033: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FillMode -//line mysql_sql.y:7382 +//line mysql_sql.y:7389 { yyLOCAL = tree.FillNone } yyVAL.union = yyLOCAL - case 1030: + case 1034: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FillMode -//line mysql_sql.y:7386 +//line mysql_sql.y:7393 { yyLOCAL = tree.FillNull } yyVAL.union = yyLOCAL - case 1031: + case 1035: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FillMode -//line mysql_sql.y:7390 +//line mysql_sql.y:7397 { yyLOCAL = tree.FillLinear } yyVAL.union = yyLOCAL - case 1032: + case 1036: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.With -//line mysql_sql.y:7396 +//line mysql_sql.y:7403 { yyLOCAL = &tree.With{ IsRecursive: false, @@ -23821,10 +23921,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1033: + case 1037: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.With -//line mysql_sql.y:7403 +//line mysql_sql.y:7410 { yyLOCAL = &tree.With{ IsRecursive: true, @@ -23832,26 +23932,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1034: + case 1038: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.CTE -//line mysql_sql.y:7412 +//line mysql_sql.y:7419 { yyLOCAL = []*tree.CTE{yyDollar[1].cteUnion()} } yyVAL.union = yyLOCAL - case 1035: + case 1039: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.CTE -//line mysql_sql.y:7416 +//line mysql_sql.y:7423 { yyLOCAL = append(yyDollar[1].cteListUnion(), yyDollar[3].cteUnion()) } yyVAL.union = yyLOCAL - case 1036: + case 1040: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.CTE -//line mysql_sql.y:7422 +//line mysql_sql.y:7429 { // stmt has an EMPTY alternative used for bare trailing semicolons. // Inside a CTE body that produces a nil Stmt and panics in Format @@ -23866,106 +23966,106 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1037: + case 1041: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:7437 +//line mysql_sql.y:7444 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1038: + case 1042: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:7441 +//line mysql_sql.y:7448 { yyLOCAL = yyDollar[2].identifierListUnion() } yyVAL.union = yyLOCAL - case 1039: + case 1043: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7446 +//line mysql_sql.y:7453 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1040: + case 1044: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7450 +//line mysql_sql.y:7457 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1041: + case 1045: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7455 +//line mysql_sql.y:7462 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1042: + case 1046: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7459 +//line mysql_sql.y:7466 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1043: + case 1047: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7463 +//line mysql_sql.y:7470 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1044: + case 1048: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7469 +//line mysql_sql.y:7476 { yyLOCAL = &tree.Limit{Count: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1045: + case 1049: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7473 +//line mysql_sql.y:7480 { yyLOCAL = &tree.Limit{Offset: yyDollar[2].exprUnion(), Count: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1046: + case 1050: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7477 +//line mysql_sql.y:7484 { yyLOCAL = &tree.Limit{Offset: yyDollar[4].exprUnion(), Count: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1047: + case 1051: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7483 +//line mysql_sql.y:7490 { yyLOCAL = &tree.Limit{Offset: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1048: + case 1052: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.RankOption -//line mysql_sql.y:7488 +//line mysql_sql.y:7495 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1049: + case 1053: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.RankOption -//line mysql_sql.y:7492 +//line mysql_sql.y:7499 { // Parse option strings to extract key=value pairs into a map optionMap := make(map[string]string) @@ -24003,198 +24103,198 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1050: + case 1054: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7530 +//line mysql_sql.y:7537 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1051: + case 1055: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7534 +//line mysql_sql.y:7541 { yyLOCAL = yyDollar[1].orderByUnion() } yyVAL.union = yyLOCAL - case 1052: + case 1056: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7539 +//line mysql_sql.y:7546 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1053: + case 1057: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7543 +//line mysql_sql.y:7550 { yyLOCAL = yyDollar[4].orderByUnion() } yyVAL.union = yyLOCAL - case 1054: + case 1058: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7549 +//line mysql_sql.y:7556 { yyLOCAL = yyDollar[3].orderByUnion() } yyVAL.union = yyLOCAL - case 1055: + case 1059: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7555 +//line mysql_sql.y:7562 { yyLOCAL = tree.OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL - case 1056: + case 1060: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7559 +//line mysql_sql.y:7566 { yyLOCAL = append(yyDollar[1].orderByUnion(), yyDollar[3].orderUnion()) } yyVAL.union = yyLOCAL - case 1057: + case 1061: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Order -//line mysql_sql.y:7565 +//line mysql_sql.y:7572 { yyLOCAL = &tree.Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].directionUnion(), NullsPosition: yyDollar[3].nullsPositionUnion()} } yyVAL.union = yyLOCAL - case 1058: + case 1062: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Direction -//line mysql_sql.y:7570 +//line mysql_sql.y:7577 { yyLOCAL = tree.DefaultDirection } yyVAL.union = yyLOCAL - case 1059: + case 1063: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Direction -//line mysql_sql.y:7574 +//line mysql_sql.y:7581 { yyLOCAL = tree.Ascending } yyVAL.union = yyLOCAL - case 1060: + case 1064: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Direction -//line mysql_sql.y:7578 +//line mysql_sql.y:7585 { yyLOCAL = tree.Descending } yyVAL.union = yyLOCAL - case 1061: + case 1065: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.NullsPosition -//line mysql_sql.y:7583 +//line mysql_sql.y:7590 { yyLOCAL = tree.DefaultNullsPosition } yyVAL.union = yyLOCAL - case 1062: + case 1066: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:7587 +//line mysql_sql.y:7594 { yylex.Error("NULLS FIRST is not supported in MySQL syntax") return 1 } - case 1063: + case 1067: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:7591 +//line mysql_sql.y:7598 { yylex.Error("NULLS LAST is not supported in MySQL syntax") return 1 } - case 1064: + case 1068: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.SelectLockInfo -//line mysql_sql.y:7596 +//line mysql_sql.y:7603 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1065: + case 1069: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.SelectLockInfo -//line mysql_sql.y:7600 +//line mysql_sql.y:7607 { yyLOCAL = &tree.SelectLockInfo{ LockType: tree.SelectLockForUpdate, } } yyVAL.union = yyLOCAL - case 1066: + case 1070: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.SelectLockInfo -//line mysql_sql.y:7606 +//line mysql_sql.y:7613 { yyLOCAL = &tree.SelectLockInfo{ LockType: tree.SelectLockForShare, } } yyVAL.union = yyLOCAL - case 1067: + case 1071: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.SelectLockInfo -//line mysql_sql.y:7612 +//line mysql_sql.y:7619 { yyLOCAL = &tree.SelectLockInfo{ LockType: tree.SelectLockForShare, } } yyVAL.union = yyLOCAL - case 1068: + case 1072: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7620 +//line mysql_sql.y:7627 { yyLOCAL = &tree.ParenSelect{Select: yyDollar[2].selectUnion()} } yyVAL.union = yyLOCAL - case 1069: + case 1073: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7624 +//line mysql_sql.y:7631 { yyLOCAL = &tree.ParenSelect{Select: &tree.Select{Select: yyDollar[2].selectStatementUnion()}} } yyVAL.union = yyLOCAL - case 1070: + case 1074: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7628 +//line mysql_sql.y:7635 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1071: + case 1075: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7632 +//line mysql_sql.y:7639 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1072: + case 1076: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7637 +//line mysql_sql.y:7644 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1073: + case 1077: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7641 +//line mysql_sql.y:7648 { yyLOCAL = &tree.UnionClause{ Type: yyDollar[2].unionTypeRecordUnion().Type, @@ -24205,10 +24305,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1074: + case 1078: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7651 +//line mysql_sql.y:7658 { yyLOCAL = &tree.UnionClause{ Type: yyDollar[2].unionTypeRecordUnion().Type, @@ -24219,10 +24319,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1075: + case 1079: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7661 +//line mysql_sql.y:7668 { yyLOCAL = &tree.UnionClause{ Type: yyDollar[2].unionTypeRecordUnion().Type, @@ -24233,10 +24333,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1076: + case 1080: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7671 +//line mysql_sql.y:7678 { yyLOCAL = &tree.UnionClause{ Type: yyDollar[2].unionTypeRecordUnion().Type, @@ -24247,170 +24347,170 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1077: + case 1081: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7681 +//line mysql_sql.y:7688 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1078: + case 1082: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7685 +//line mysql_sql.y:7692 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1079: + case 1083: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7689 +//line mysql_sql.y:7696 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1080: + case 1084: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7693 +//line mysql_sql.y:7700 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1081: + case 1085: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7701 +//line mysql_sql.y:7708 { yyLOCAL = &tree.ParenSelect{Select: tree.NewSelect(yyDollar[2].selectStatementUnion(), yyDollar[3].orderByUnion(), yyDollar[4].limitUnion())} } yyVAL.union = yyLOCAL - case 1082: + case 1086: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7707 +//line mysql_sql.y:7714 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1083: + case 1087: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7711 +//line mysql_sql.y:7718 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1084: + case 1088: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7717 +//line mysql_sql.y:7724 { yyLOCAL = makeSelectStarFromTable(yyDollar[2].tableNameUnion()) } yyVAL.union = yyLOCAL - case 1085: + case 1089: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7722 +//line mysql_sql.y:7729 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1086: + case 1090: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7726 +//line mysql_sql.y:7733 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1087: + case 1091: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7730 +//line mysql_sql.y:7737 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1088: + case 1092: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7734 +//line mysql_sql.y:7741 { yyLOCAL = &tree.ValuesClause{Rows: yyDollar[2].rowsExprsUnion(), RowWord: true} } yyVAL.union = yyLOCAL - case 1089: + case 1093: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7740 +//line mysql_sql.y:7747 { yyLOCAL = &tree.ParenSelect{Select: tree.NewSelect(yyDollar[2].selectStatementUnion(), yyDollar[3].orderByUnion(), yyDollar[4].limitUnion())} } yyVAL.union = yyLOCAL - case 1090: + case 1094: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7746 +//line mysql_sql.y:7753 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1091: + case 1095: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7750 +//line mysql_sql.y:7757 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1092: + case 1096: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7756 +//line mysql_sql.y:7763 { yyLOCAL = &tree.ValuesClause{Rows: yyDollar[2].rowsExprsUnion(), RowWord: true} } yyVAL.union = yyLOCAL - case 1093: + case 1097: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7762 +//line mysql_sql.y:7769 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1094: + case 1098: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7766 +//line mysql_sql.y:7773 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1095: + case 1099: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7770 +//line mysql_sql.y:7777 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1096: + case 1100: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7774 +//line mysql_sql.y:7781 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1097: + case 1101: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7780 +//line mysql_sql.y:7787 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UNION, @@ -24419,10 +24519,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1098: + case 1102: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7788 +//line mysql_sql.y:7795 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UNION, @@ -24431,10 +24531,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1099: + case 1103: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7796 +//line mysql_sql.y:7803 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UNION, @@ -24443,10 +24543,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1100: + case 1104: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7805 +//line mysql_sql.y:7812 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.EXCEPT, @@ -24455,10 +24555,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1101: + case 1105: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7813 +//line mysql_sql.y:7820 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.EXCEPT, @@ -24467,10 +24567,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1102: + case 1106: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7821 +//line mysql_sql.y:7828 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.EXCEPT, @@ -24479,10 +24579,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1103: + case 1107: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7829 +//line mysql_sql.y:7836 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.INTERSECT, @@ -24491,10 +24591,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1104: + case 1108: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7837 +//line mysql_sql.y:7844 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.INTERSECT, @@ -24503,10 +24603,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1105: + case 1109: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7845 +//line mysql_sql.y:7852 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.INTERSECT, @@ -24515,10 +24615,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1106: + case 1110: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7853 +//line mysql_sql.y:7860 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UT_MINUS, @@ -24527,10 +24627,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1107: + case 1111: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7861 +//line mysql_sql.y:7868 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UT_MINUS, @@ -24539,10 +24639,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1108: + case 1112: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7869 +//line mysql_sql.y:7876 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UT_MINUS, @@ -24551,10 +24651,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1109: + case 1113: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7879 +//line mysql_sql.y:7886 { yyLOCAL = &tree.SelectClause{ Distinct: tree.QuerySpecOptionDistinct&yyDollar[2].selectOptionsUnion() != 0, @@ -24570,146 +24670,146 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1110: + case 1114: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7896 +//line mysql_sql.y:7903 { yyLOCAL = tree.QuerySpecOptionNone } yyVAL.union = yyLOCAL - case 1111: + case 1115: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7900 +//line mysql_sql.y:7907 { yyLOCAL = yyDollar[1].selectOptionsUnion() } yyVAL.union = yyLOCAL - case 1112: + case 1116: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7906 +//line mysql_sql.y:7913 { yyLOCAL = yyDollar[1].selectOptionUnion() } yyVAL.union = yyLOCAL - case 1113: + case 1117: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7910 +//line mysql_sql.y:7917 { yyLOCAL = yyDollar[1].selectOptionsUnion() | yyDollar[2].selectOptionUnion() } yyVAL.union = yyLOCAL - case 1114: + case 1118: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7916 +//line mysql_sql.y:7923 { yyLOCAL = tree.QuerySpecOptionSqlSmallResult } yyVAL.union = yyLOCAL - case 1115: + case 1119: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7920 +//line mysql_sql.y:7927 { yyLOCAL = tree.QuerySpecOptionSqlBigResult } yyVAL.union = yyLOCAL - case 1116: + case 1120: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7924 +//line mysql_sql.y:7931 { yyLOCAL = tree.QuerySpecOptionSqlBufferResult } yyVAL.union = yyLOCAL - case 1117: + case 1121: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7928 +//line mysql_sql.y:7935 { yyLOCAL = tree.QuerySpecOptionStraightJoin } yyVAL.union = yyLOCAL - case 1118: + case 1122: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7932 +//line mysql_sql.y:7939 { yyLOCAL = tree.QuerySpecOptionHighPriority } yyVAL.union = yyLOCAL - case 1119: + case 1123: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7936 +//line mysql_sql.y:7943 { yyLOCAL = tree.QuerySpecOptionSqlCalcFoundRows } yyVAL.union = yyLOCAL - case 1120: + case 1124: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7940 +//line mysql_sql.y:7947 { yyLOCAL = tree.QuerySpecOptionSqlNoCache } yyVAL.union = yyLOCAL - case 1121: + case 1125: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7944 +//line mysql_sql.y:7951 { yyLOCAL = tree.QuerySpecOptionAll } yyVAL.union = yyLOCAL - case 1122: + case 1126: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7948 +//line mysql_sql.y:7955 { yyLOCAL = tree.QuerySpecOptionDistinct } yyVAL.union = yyLOCAL - case 1123: + case 1127: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7952 +//line mysql_sql.y:7959 { yyLOCAL = tree.QuerySpecOptionDistinctRow } yyVAL.union = yyLOCAL - case 1124: + case 1128: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Where -//line mysql_sql.y:7974 +//line mysql_sql.y:7981 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1125: + case 1129: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Where -//line mysql_sql.y:7978 +//line mysql_sql.y:7985 { yyLOCAL = &tree.Where{Type: tree.AstHaving, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1126: + case 1130: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.GroupByClause -//line mysql_sql.y:7983 +//line mysql_sql.y:7990 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1127: + case 1131: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.GroupByClause -//line mysql_sql.y:7987 +//line mysql_sql.y:7994 { exprsList := []tree.Exprs{yyDollar[3].exprsUnion()} yyLOCAL = &tree.GroupByClause{ @@ -24720,10 +24820,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1128: + case 1132: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.GroupByClause -//line mysql_sql.y:7997 +//line mysql_sql.y:8004 { yyLOCAL = &tree.GroupByClause{ GroupByExprsList: yyDollar[6].rowsExprsUnion(), @@ -24734,10 +24834,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1129: + case 1133: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.GroupByClause -//line mysql_sql.y:8007 +//line mysql_sql.y:8014 { yyLOCAL = &tree.GroupByClause{ GroupByExprsList: []tree.Exprs{yyDollar[5].exprsUnion()}, @@ -24747,10 +24847,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1130: + case 1134: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.GroupByClause -//line mysql_sql.y:8016 +//line mysql_sql.y:8023 { yyLOCAL = &tree.GroupByClause{ GroupByExprsList: []tree.Exprs{yyDollar[5].exprsUnion()}, @@ -24760,106 +24860,106 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1131: + case 1135: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:8027 +//line mysql_sql.y:8034 { yyLOCAL = []tree.Exprs{yyDollar[2].exprsUnion()} } yyVAL.union = yyLOCAL - case 1132: + case 1136: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:8031 +//line mysql_sql.y:8038 { yyLOCAL = append(yyDollar[1].rowsExprsUnion(), yyDollar[4].exprsUnion()) } yyVAL.union = yyLOCAL - case 1133: + case 1137: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8037 +//line mysql_sql.y:8044 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1134: + case 1138: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8041 +//line mysql_sql.y:8048 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1135: + case 1139: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Where -//line mysql_sql.y:8046 +//line mysql_sql.y:8053 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1136: + case 1140: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Where -//line mysql_sql.y:8050 +//line mysql_sql.y:8057 { yyLOCAL = &tree.Where{Type: tree.AstWhere, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1137: + case 1141: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectExprs -//line mysql_sql.y:8056 +//line mysql_sql.y:8063 { yyLOCAL = tree.SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL - case 1138: + case 1142: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectExprs -//line mysql_sql.y:8060 +//line mysql_sql.y:8067 { yyLOCAL = append(yyDollar[1].selectExprsUnion(), yyDollar[3].selectExprUnion()) } yyVAL.union = yyLOCAL - case 1139: + case 1143: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectExpr -//line mysql_sql.y:8066 +//line mysql_sql.y:8073 { yyLOCAL = tree.SelectExpr{Expr: tree.StarExpr()} } yyVAL.union = yyLOCAL - case 1140: + case 1144: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.SelectExpr -//line mysql_sql.y:8070 +//line mysql_sql.y:8077 { yyLOCAL = tree.SelectExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].cstrUnion()} } yyVAL.union = yyLOCAL - case 1141: + case 1145: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectExpr -//line mysql_sql.y:8074 +//line mysql_sql.y:8081 { yyLOCAL = tree.SelectExpr{Expr: tree.NewUnresolvedNameWithStar(yyDollar[1].cstrUnion())} } yyVAL.union = yyLOCAL - case 1142: + case 1146: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.SelectExpr -//line mysql_sql.y:8078 +//line mysql_sql.y:8085 { yyLOCAL = tree.SelectExpr{Expr: tree.NewUnresolvedNameWithStar(yyDollar[1].cstrUnion(), yyDollar[3].cstrUnion())} } yyVAL.union = yyLOCAL - case 1143: + case 1147: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.From -//line mysql_sql.y:8083 +//line mysql_sql.y:8090 { prefix := tree.ObjectNamePrefix{ExplicitSchema: false} tn := tree.NewTableName(tree.Identifier(""), prefix, nil) @@ -24868,28 +24968,28 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1144: + case 1148: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.From -//line mysql_sql.y:8091 +//line mysql_sql.y:8098 { yyLOCAL = yyDollar[1].fromUnion() } yyVAL.union = yyLOCAL - case 1145: + case 1149: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.From -//line mysql_sql.y:8097 +//line mysql_sql.y:8104 { yyLOCAL = &tree.From{ Tables: tree.TableExprs{yyDollar[2].tableExprUnion()}, } } yyVAL.union = yyLOCAL - case 1146: + case 1150: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8105 +//line mysql_sql.y:8112 { if t, ok := yyDollar[1].tableExprUnion().(*tree.JoinTableExpr); ok { yyLOCAL = t @@ -24900,18 +25000,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1147: + case 1151: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8115 +//line mysql_sql.y:8122 { yyLOCAL = &tree.JoinTableExpr{Left: yyDollar[1].tableExprUnion(), Right: yyDollar[3].tableExprUnion(), JoinType: tree.JOIN_TYPE_CROSS} } yyVAL.union = yyLOCAL - case 1149: + case 1153: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8122 +//line mysql_sql.y:8129 { if !strings.EqualFold(yyDollar[2].str, "OJ") { yylex.Error("expected OJ in table reference escape") @@ -24920,26 +25020,26 @@ yydefault: yyLOCAL = yyDollar[3].tableExprUnion() } yyVAL.union = yyLOCAL - case 1151: + case 1155: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8133 +//line mysql_sql.y:8140 { yyLOCAL = yyDollar[1].joinTableExprUnion() } yyVAL.union = yyLOCAL - case 1152: + case 1156: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8137 +//line mysql_sql.y:8144 { yyLOCAL = yyDollar[1].applyTableExprUnion() } yyVAL.union = yyLOCAL - case 1153: + case 1157: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8143 +//line mysql_sql.y:8150 { if strings.Contains(yyDollar[2].str, ":") { ss := strings.SplitN(yyDollar[2].str, ":", 2) @@ -24960,10 +25060,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1154: + case 1158: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8163 +//line mysql_sql.y:8170 { yyLOCAL = &tree.JoinTableExpr{ Left: yyDollar[1].tableExprUnion(), @@ -24973,10 +25073,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1155: + case 1159: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8172 +//line mysql_sql.y:8179 { if yyDollar[4].joinCondUnion() == nil { yylex.Error("outer join requires ON/USING clause") @@ -24990,10 +25090,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1156: + case 1160: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8185 +//line mysql_sql.y:8192 { yyLOCAL = &tree.JoinTableExpr{ Left: yyDollar[1].tableExprUnion(), @@ -25002,10 +25102,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1157: + case 1161: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8193 +//line mysql_sql.y:8200 { yyLOCAL = &tree.JoinTableExpr{ Left: yyDollar[1].tableExprUnion(), @@ -25015,10 +25115,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1158: + case 1162: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8202 +//line mysql_sql.y:8209 { if !hasAsofLeftFactorAlias(yyDollar[1].tableExprUnion()) { yylex.Error("native ASOF JOIN requires an aliased left table factor") @@ -25033,10 +25133,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1159: + case 1163: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ApplyTableExpr -//line mysql_sql.y:8218 +//line mysql_sql.y:8225 { yyLOCAL = &tree.ApplyTableExpr{ Left: yyDollar[1].tableExprUnion(), @@ -25045,27 +25145,27 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1160: + case 1164: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8228 +//line mysql_sql.y:8235 { yyVAL.str = tree.APPLY_TYPE_CROSS } - case 1161: + case 1165: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8232 +//line mysql_sql.y:8239 { yyVAL.str = tree.APPLY_TYPE_OUTER } - case 1162: + case 1166: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8238 +//line mysql_sql.y:8245 { yyVAL.str = tree.JOIN_TYPE_NATURAL } - case 1163: + case 1167: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8242 +//line mysql_sql.y:8249 { switch yyDollar[2].str { case tree.JOIN_TYPE_LEFT: @@ -25076,86 +25176,86 @@ yydefault: yyVAL.str = tree.JOIN_TYPE_NATURAL_FULL } } - case 1164: + case 1168: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8255 +//line mysql_sql.y:8262 { yyVAL.str = tree.JOIN_TYPE_LEFT } - case 1165: + case 1169: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8259 +//line mysql_sql.y:8266 { yyVAL.str = tree.JOIN_TYPE_LEFT } - case 1166: + case 1170: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8263 +//line mysql_sql.y:8270 { yyVAL.str = tree.JOIN_TYPE_RIGHT } - case 1167: + case 1171: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8267 +//line mysql_sql.y:8274 { yyVAL.str = tree.JOIN_TYPE_RIGHT } - case 1168: + case 1172: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8271 +//line mysql_sql.y:8278 { yyVAL.str = tree.JOIN_TYPE_FULL } - case 1169: + case 1173: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8275 +//line mysql_sql.y:8282 { yyVAL.str = tree.JOIN_TYPE_FULL } - case 1170: + case 1174: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8281 +//line mysql_sql.y:8288 { yyVAL.str = tree.JOIN_TYPE_DEDUP } - case 1171: + case 1175: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8287 +//line mysql_sql.y:8294 { yyVAL.str = tree.JOIN_TYPE_ASOF } - case 1172: + case 1176: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8291 +//line mysql_sql.y:8298 { yyVAL.str = tree.JOIN_TYPE_ASOF_LEFT } - case 1173: + case 1177: yyDollar = yyS[yypt-4 : yypt+1] -//line mysql_sql.y:8295 +//line mysql_sql.y:8302 { yyVAL.str = tree.JOIN_TYPE_ASOF_LEFT } - case 1174: + case 1178: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8300 +//line mysql_sql.y:8307 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1175: + case 1179: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8304 +//line mysql_sql.y:8311 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1176: + case 1180: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8310 +//line mysql_sql.y:8317 { stmt := &tree.ValuesStatement{ Rows: yyDollar[2].rowsExprsUnion(), @@ -25169,132 +25269,132 @@ yydefault: yyLOCAL = stmt } yyVAL.union = yyLOCAL - case 1177: + case 1181: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:8325 +//line mysql_sql.y:8332 { yyLOCAL = []tree.Exprs{yyDollar[1].exprsUnion()} } yyVAL.union = yyLOCAL - case 1178: + case 1182: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:8329 +//line mysql_sql.y:8336 { yyLOCAL = append(yyDollar[1].rowsExprsUnion(), yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1179: + case 1183: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:8335 +//line mysql_sql.y:8342 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1180: + case 1184: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8341 +//line mysql_sql.y:8348 { yyVAL.str = yyDollar[1].str } - case 1181: + case 1185: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8347 +//line mysql_sql.y:8354 { yyVAL.str = yyDollar[2].str } - case 1182: + case 1186: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8353 +//line mysql_sql.y:8360 { yyVAL.str = tree.JOIN_TYPE_STRAIGHT } - case 1183: + case 1187: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8359 +//line mysql_sql.y:8366 { yyVAL.str = tree.JOIN_TYPE_INNER } - case 1184: + case 1188: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8363 +//line mysql_sql.y:8370 { yyVAL.str = tree.JOIN_TYPE_INNER } - case 1185: + case 1189: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8367 +//line mysql_sql.y:8374 { yyVAL.str = tree.JOIN_TYPE_CROSS } - case 1186: + case 1190: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8371 +//line mysql_sql.y:8378 { yyVAL.str = tree.JOIN_TYPE_CENTROIDX + ":" + yyDollar[2].str } - case 1187: + case 1191: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.JoinCond -//line mysql_sql.y:8377 +//line mysql_sql.y:8384 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1188: + case 1192: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.JoinCond -//line mysql_sql.y:8381 +//line mysql_sql.y:8388 { yyLOCAL = yyDollar[1].joinCondUnion() } yyVAL.union = yyLOCAL - case 1189: + case 1193: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.JoinCond -//line mysql_sql.y:8387 +//line mysql_sql.y:8394 { yyLOCAL = &tree.OnJoinCond{Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1190: + case 1194: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.JoinCond -//line mysql_sql.y:8391 +//line mysql_sql.y:8398 { yyLOCAL = &tree.UsingJoinCond{Cols: yyDollar[3].identifierListUnion()} } yyVAL.union = yyLOCAL - case 1191: + case 1195: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:8397 +//line mysql_sql.y:8404 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 1192: + case 1196: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:8401 +//line mysql_sql.y:8408 { yyLOCAL = append(yyDollar[1].identifierListUnion(), tree.Identifier(yyDollar[3].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 1193: + case 1197: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8407 +//line mysql_sql.y:8414 { yyLOCAL = yyDollar[1].aliasedTableExprUnion() } yyVAL.union = yyLOCAL - case 1194: + case 1198: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8411 +//line mysql_sql.y:8418 { yyLOCAL = &tree.AliasedTableExpr{ Expr: yyDollar[1].parenTableExprUnion(), @@ -25305,10 +25405,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1195: + case 1199: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8421 +//line mysql_sql.y:8428 { if yyDollar[2].str != "" { yyLOCAL = &tree.AliasedTableExpr{ @@ -25322,26 +25422,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1196: + case 1200: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8434 +//line mysql_sql.y:8441 { yyLOCAL = yyDollar[2].tableExprUnion() } yyVAL.union = yyLOCAL - case 1197: + case 1201: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ParenTableExpr -//line mysql_sql.y:8442 +//line mysql_sql.y:8449 { yyLOCAL = &tree.ParenTableExpr{Expr: yyDollar[1].selectStatementUnion().(*tree.ParenSelect).Select} } yyVAL.union = yyLOCAL - case 1198: + case 1202: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8448 +//line mysql_sql.y:8455 { name := tree.NewUnresolvedName(tree.NewCStr("json_table", 1)) yyLOCAL = &tree.TableFunction{ @@ -25350,10 +25450,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1199: + case 1203: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8457 +//line mysql_sql.y:8464 { name := tree.NewUnresolvedName(yyDollar[1].cstrUnion()) yyLOCAL = &tree.TableFunction{ @@ -25366,34 +25466,34 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1200: + case 1204: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.JSONTableColumn -//line mysql_sql.y:8471 +//line mysql_sql.y:8478 { yyLOCAL = []*tree.JSONTableColumn{yyDollar[1].jsonTableColumnUnion()} } yyVAL.union = yyLOCAL - case 1201: + case 1205: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.JSONTableColumn -//line mysql_sql.y:8473 +//line mysql_sql.y:8480 { yyLOCAL = append(yyDollar[1].jsonTableColumnsUnion(), yyDollar[3].jsonTableColumnUnion()) } yyVAL.union = yyLOCAL - case 1202: + case 1206: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8477 +//line mysql_sql.y:8484 { yyLOCAL = &tree.JSONTableColumn{Name: yyDollar[1].cstrUnion().Origin(), Kind: "ordinality"} } yyVAL.union = yyLOCAL - case 1203: + case 1207: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8479 +//line mysql_sql.y:8486 { yyLOCAL = yyDollar[5].jsonTableColumnUnion() yyLOCAL.Name = yyDollar[1].cstrUnion().Origin() @@ -25402,118 +25502,118 @@ yydefault: yyLOCAL.Path = yyDollar[4].str } yyVAL.union = yyLOCAL - case 1204: + case 1208: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8481 +//line mysql_sql.y:8488 { yyLOCAL = &tree.JSONTableColumn{Name: yyDollar[1].cstrUnion().Origin(), Kind: "exists", Type: yyDollar[2].columnTypeUnion(), Path: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 1205: + case 1209: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8483 +//line mysql_sql.y:8490 { yyLOCAL = &tree.JSONTableColumn{Kind: "nested", Path: yyDollar[3].str, Children: yyDollar[6].jsonTableColumnsUnion()} } yyVAL.union = yyLOCAL - case 1206: + case 1210: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8486 +//line mysql_sql.y:8493 { yyVAL.str = "" } - case 1207: + case 1211: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8488 +//line mysql_sql.y:8495 { yyVAL.str = yyDollar[1].str } - case 1208: + case 1212: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8492 +//line mysql_sql.y:8499 { yyLOCAL = &tree.JSONTableResponse{Action: "null"} } yyVAL.union = yyLOCAL - case 1209: + case 1213: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8494 +//line mysql_sql.y:8501 { yyLOCAL = &tree.JSONTableResponse{Action: "error"} } yyVAL.union = yyLOCAL - case 1210: + case 1214: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8496 +//line mysql_sql.y:8503 { yyLOCAL = &tree.JSONTableResponse{Action: "default", Default: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1211: + case 1215: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8499 +//line mysql_sql.y:8506 { yyLOCAL = &tree.JSONTableColumn{} } yyVAL.union = yyLOCAL - case 1212: + case 1216: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8501 +//line mysql_sql.y:8508 { yyLOCAL = &tree.JSONTableColumn{OnEmpty: yyDollar[1].jsonTableResponseUnion(), OnError: yyDollar[4].jsonTableResponseUnion()} } yyVAL.union = yyLOCAL - case 1213: + case 1217: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8503 +//line mysql_sql.y:8510 { yyLOCAL = &tree.JSONTableColumn{OnEmpty: yyDollar[4].jsonTableResponseUnion(), OnError: yyDollar[1].jsonTableResponseUnion(), ReversePolicies: yyDollar[4].jsonTableResponseUnion() != nil} } yyVAL.union = yyLOCAL - case 1214: + case 1218: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8506 +//line mysql_sql.y:8513 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1215: + case 1219: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8508 +//line mysql_sql.y:8515 { yyLOCAL = yyDollar[1].jsonTableResponseUnion() } yyVAL.union = yyLOCAL - case 1216: + case 1220: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8511 +//line mysql_sql.y:8518 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1217: + case 1221: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8513 +//line mysql_sql.y:8520 { yyLOCAL = yyDollar[1].jsonTableResponseUnion() } yyVAL.union = yyLOCAL - case 1218: + case 1222: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AliasedTableExpr -//line mysql_sql.y:8517 +//line mysql_sql.y:8524 { yyLOCAL = &tree.AliasedTableExpr{ Expr: yyDollar[1].tableNameUnion(), @@ -25524,34 +25624,34 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1219: + case 1223: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.IndexHint -//line mysql_sql.y:8528 +//line mysql_sql.y:8535 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1221: + case 1225: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.IndexHint -//line mysql_sql.y:8535 +//line mysql_sql.y:8542 { yyLOCAL = []*tree.IndexHint{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL - case 1222: + case 1226: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.IndexHint -//line mysql_sql.y:8539 +//line mysql_sql.y:8546 { yyLOCAL = append(yyDollar[1].indexHintListUnion(), yyDollar[2].indexHintUnion()) } yyVAL.union = yyLOCAL - case 1223: + case 1227: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.IndexHint -//line mysql_sql.y:8545 +//line mysql_sql.y:8552 { yyLOCAL = &tree.IndexHint{ IndexNames: yyDollar[4].strsUnion(), @@ -25560,182 +25660,182 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1224: + case 1228: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexHintType -//line mysql_sql.y:8555 +//line mysql_sql.y:8562 { yyLOCAL = tree.HintUse } yyVAL.union = yyLOCAL - case 1225: + case 1229: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexHintType -//line mysql_sql.y:8559 +//line mysql_sql.y:8566 { yyLOCAL = tree.HintIgnore } yyVAL.union = yyLOCAL - case 1226: + case 1230: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexHintType -//line mysql_sql.y:8563 +//line mysql_sql.y:8570 { yyLOCAL = tree.HintForce } yyVAL.union = yyLOCAL - case 1227: + case 1231: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IndexHintScope -//line mysql_sql.y:8568 +//line mysql_sql.y:8575 { yyLOCAL = tree.HintForScan } yyVAL.union = yyLOCAL - case 1228: + case 1232: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexHintScope -//line mysql_sql.y:8572 +//line mysql_sql.y:8579 { yyLOCAL = tree.HintForJoin } yyVAL.union = yyLOCAL - case 1229: + case 1233: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IndexHintScope -//line mysql_sql.y:8576 +//line mysql_sql.y:8583 { yyLOCAL = tree.HintForOrderBy } yyVAL.union = yyLOCAL - case 1230: + case 1234: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IndexHintScope -//line mysql_sql.y:8580 +//line mysql_sql.y:8587 { yyLOCAL = tree.HintForGroupBy } yyVAL.union = yyLOCAL - case 1231: + case 1235: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8585 +//line mysql_sql.y:8592 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1232: + case 1236: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8589 +//line mysql_sql.y:8596 { yyLOCAL = []string{yyDollar[1].cstrUnion().Compare()} } yyVAL.union = yyLOCAL - case 1233: + case 1237: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8593 +//line mysql_sql.y:8600 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].cstrUnion().Compare()) } yyVAL.union = yyLOCAL - case 1234: + case 1238: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8597 +//line mysql_sql.y:8604 { yyLOCAL = []string{yyDollar[1].str} } yyVAL.union = yyLOCAL - case 1235: + case 1239: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8601 +//line mysql_sql.y:8608 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1236: + case 1240: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8607 +//line mysql_sql.y:8614 { yyVAL.str = "" } - case 1237: + case 1241: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8611 +//line mysql_sql.y:8618 { yyVAL.str = yyDollar[1].str } - case 1238: + case 1242: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8615 +//line mysql_sql.y:8622 { yyVAL.str = yyDollar[2].str } - case 1239: + case 1243: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8621 +//line mysql_sql.y:8628 { yyVAL.str = yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) } - case 1240: + case 1244: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8625 +//line mysql_sql.y:8632 { yyVAL.str = yylex.(*Lexer).GetDbOrTblName(yyDollar[1].str) } - case 1241: + case 1245: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:8631 +//line mysql_sql.y:8638 { yyLOCAL = tree.NewCStr("", 1) } yyVAL.union = yyLOCAL - case 1242: + case 1246: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:8635 +//line mysql_sql.y:8642 { yyLOCAL = yyDollar[1].cstrUnion() } yyVAL.union = yyLOCAL - case 1243: + case 1247: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:8639 +//line mysql_sql.y:8646 { yyLOCAL = yyDollar[2].cstrUnion() } yyVAL.union = yyLOCAL - case 1244: + case 1248: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:8643 +//line mysql_sql.y:8650 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1245: + case 1249: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:8647 +//line mysql_sql.y:8654 { yyLOCAL = tree.NewCStr(yyDollar[2].str, 1) } yyVAL.union = yyLOCAL - case 1246: + case 1250: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8653 +//line mysql_sql.y:8660 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1270: + case 1275: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8696 +//line mysql_sql.y:8704 { yyLOCAL = &tree.CreateIcebergCatalog{ IfNotExists: yyDollar[4].ifNotExistsUnion(), @@ -25744,10 +25844,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1271: + case 1276: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8706 +//line mysql_sql.y:8714 { yyLOCAL = &tree.CreateMongoDBConnection{ IfNotExists: yyDollar[4].ifNotExistsUnion(), @@ -25756,10 +25856,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1272: + case 1277: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8716 +//line mysql_sql.y:8724 { cronExpr := "" timezone := "" @@ -25779,18 +25879,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1273: + case 1278: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.SQLTaskSchedule -//line mysql_sql.y:8736 +//line mysql_sql.y:8744 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1274: + case 1279: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.SQLTaskSchedule -//line mysql_sql.y:8740 +//line mysql_sql.y:8748 { yyLOCAL = &tree.SQLTaskSchedule{ CronExpr: yyDollar[2].str, @@ -25798,82 +25898,82 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1275: + case 1280: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8748 +//line mysql_sql.y:8756 { yyVAL.str = "" } - case 1276: + case 1281: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8752 +//line mysql_sql.y:8760 { yyVAL.str = yyDollar[2].str } - case 1277: + case 1282: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8757 +//line mysql_sql.y:8765 { yyLOCAL = tree.Expr(nil) } yyVAL.union = yyLOCAL - case 1278: + case 1283: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8761 +//line mysql_sql.y:8769 { yyLOCAL = yyDollar[3].exprUnion() } yyVAL.union = yyLOCAL - case 1279: + case 1284: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8767 +//line mysql_sql.y:8775 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1280: + case 1285: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8771 +//line mysql_sql.y:8779 { yyLOCAL = tree.NewSubquery(yyDollar[1].selectUnion(), false) } yyVAL.union = yyLOCAL - case 1281: + case 1286: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:8776 +//line mysql_sql.y:8784 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1282: + case 1287: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:8780 +//line mysql_sql.y:8788 { yyLOCAL = sqlTaskInt64(yyDollar[2].item) } yyVAL.union = yyLOCAL - case 1283: + case 1288: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8785 +//line mysql_sql.y:8793 { yyVAL.str = "" } - case 1284: + case 1289: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8789 +//line mysql_sql.y:8797 { yyVAL.str = yyDollar[2].str } - case 1285: + case 1290: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8795 +//line mysql_sql.y:8803 { var Language = yyDollar[3].str var Name = tree.Identifier(yyDollar[5].str) @@ -25885,135 +25985,135 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1286: + case 1291: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8808 +//line mysql_sql.y:8816 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1287: + case 1292: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8814 +//line mysql_sql.y:8822 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1288: + case 1293: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8820 +//line mysql_sql.y:8828 { yyLOCAL = tree.NewCreateProcedure( yyDollar[2].sourceOptionalUnion(), yyDollar[4].procNameUnion(), yyDollar[6].procArgsUnion(), yyDollar[8].str, yyDollar[9].str, ) } yyVAL.union = yyLOCAL - case 1289: + case 1294: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ProcedureName -//line mysql_sql.y:8828 +//line mysql_sql.y:8836 { prefix := tree.ObjectNamePrefix{ExplicitSchema: false} yyLOCAL = tree.NewProcedureName(tree.Identifier(yyDollar[1].cstrUnion().Compare()), prefix) } yyVAL.union = yyLOCAL - case 1290: + case 1295: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ProcedureName -//line mysql_sql.y:8833 +//line mysql_sql.y:8841 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) prefix := tree.ObjectNamePrefix{SchemaName: tree.Identifier(dbName), ExplicitSchema: true} yyLOCAL = tree.NewProcedureName(tree.Identifier(yyDollar[3].cstrUnion().Compare()), prefix) } yyVAL.union = yyLOCAL - case 1291: + case 1296: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.ProcedureArgs -//line mysql_sql.y:8840 +//line mysql_sql.y:8848 { yyLOCAL = tree.ProcedureArgs(nil) } yyVAL.union = yyLOCAL - case 1293: + case 1298: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ProcedureArgs -//line mysql_sql.y:8847 +//line mysql_sql.y:8855 { yyLOCAL = tree.ProcedureArgs{yyDollar[1].procArgUnion()} } yyVAL.union = yyLOCAL - case 1294: + case 1299: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ProcedureArgs -//line mysql_sql.y:8851 +//line mysql_sql.y:8859 { yyLOCAL = append(yyDollar[1].procArgsUnion(), yyDollar[3].procArgUnion()) } yyVAL.union = yyLOCAL - case 1295: + case 1300: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ProcedureArg -//line mysql_sql.y:8857 +//line mysql_sql.y:8865 { yyLOCAL = tree.ProcedureArg(yyDollar[1].procArgDeclUnion()) } yyVAL.union = yyLOCAL - case 1296: + case 1301: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ProcedureArgDecl -//line mysql_sql.y:8863 +//line mysql_sql.y:8871 { yyLOCAL = tree.NewProcedureArgDecl(yyDollar[1].procArgTypeUnion(), yyDollar[2].unresolvedNameUnion(), yyDollar[3].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1297: + case 1302: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.InOutArgType -//line mysql_sql.y:8868 +//line mysql_sql.y:8876 { yyLOCAL = tree.TYPE_IN } yyVAL.union = yyLOCAL - case 1298: + case 1303: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.InOutArgType -//line mysql_sql.y:8872 +//line mysql_sql.y:8880 { yyLOCAL = tree.TYPE_IN } yyVAL.union = yyLOCAL - case 1299: + case 1304: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.InOutArgType -//line mysql_sql.y:8876 +//line mysql_sql.y:8884 { yyLOCAL = tree.TYPE_OUT } yyVAL.union = yyLOCAL - case 1300: + case 1305: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.InOutArgType -//line mysql_sql.y:8880 +//line mysql_sql.y:8888 { yyLOCAL = tree.TYPE_INOUT } yyVAL.union = yyLOCAL - case 1301: + case 1306: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8885 +//line mysql_sql.y:8893 { yyVAL.str = "sql" } - case 1302: + case 1307: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8889 +//line mysql_sql.y:8897 { yyVAL.str = yyDollar[2].str } - case 1303: + case 1308: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8895 +//line mysql_sql.y:8903 { if yyDollar[13].str == "" { yylex.Error("no function body error") @@ -26045,127 +26145,236 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1304: + case 1309: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.FunctionName -//line mysql_sql.y:8928 +//line mysql_sql.y:8936 { prefix := tree.ObjectNamePrefix{ExplicitSchema: false} yyLOCAL = tree.NewFuncName(tree.Identifier(yyDollar[1].cstrUnion().Compare()), prefix) } yyVAL.union = yyLOCAL - case 1305: + case 1310: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.FunctionName -//line mysql_sql.y:8933 +//line mysql_sql.y:8941 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) prefix := tree.ObjectNamePrefix{SchemaName: tree.Identifier(dbName), ExplicitSchema: true} yyLOCAL = tree.NewFuncName(tree.Identifier(yyDollar[3].cstrUnion().Compare()), prefix) } yyVAL.union = yyLOCAL - case 1306: + case 1311: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.FunctionArgs -//line mysql_sql.y:8940 +//line mysql_sql.y:8948 { yyLOCAL = tree.FunctionArgs(nil) } yyVAL.union = yyLOCAL - case 1308: + case 1313: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FunctionArgs -//line mysql_sql.y:8947 +//line mysql_sql.y:8955 { yyLOCAL = tree.FunctionArgs{yyDollar[1].funcArgUnion()} } yyVAL.union = yyLOCAL - case 1309: + case 1314: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.FunctionArgs -//line mysql_sql.y:8951 +//line mysql_sql.y:8959 { yyLOCAL = append(yyDollar[1].funcArgsUnion(), yyDollar[3].funcArgUnion()) } yyVAL.union = yyLOCAL - case 1310: + case 1315: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FunctionArg -//line mysql_sql.y:8957 +//line mysql_sql.y:8965 { yyLOCAL = tree.FunctionArg(yyDollar[1].funcArgDeclUnion()) } yyVAL.union = yyLOCAL - case 1311: + case 1316: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.FunctionArgDecl -//line mysql_sql.y:8963 +//line mysql_sql.y:8971 { yyLOCAL = tree.NewFunctionArgDecl(nil, yyDollar[1].columnTypeUnion(), nil) } yyVAL.union = yyLOCAL - case 1312: + case 1317: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FunctionArgDecl -//line mysql_sql.y:8967 +//line mysql_sql.y:8975 { yyLOCAL = tree.NewFunctionArgDecl(yyDollar[1].unresolvedNameUnion(), yyDollar[2].columnTypeUnion(), nil) } yyVAL.union = yyLOCAL - case 1313: + case 1318: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FunctionArgDecl -//line mysql_sql.y:8971 +//line mysql_sql.y:8979 { yyLOCAL = tree.NewFunctionArgDecl(yyDollar[1].unresolvedNameUnion(), yyDollar[2].columnTypeUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 1314: + case 1319: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8977 +//line mysql_sql.y:8985 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1315: + case 1320: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ReturnType -//line mysql_sql.y:8983 +//line mysql_sql.y:8991 { yyLOCAL = tree.NewReturnType(yyDollar[1].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1316: + case 1321: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8989 +//line mysql_sql.y:8997 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1317: + case 1322: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8993 +//line mysql_sql.y:9001 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1318: + case 1323: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8998 +//line mysql_sql.y:9006 { yyVAL.str = "" } - case 1320: + case 1325: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:9005 +//line mysql_sql.y:9013 { yyVAL.str = yyDollar[2].str } - case 1321: + case 1326: + yyDollar = yyS[yypt-8 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9020 + { + yyLOCAL = &tree.CreateMaterializedView{Name: yyDollar[5].tableNameUnion(), IfNotExists: yyDollar[4].ifNotExistsUnion(), IntervalSeconds: yyDollar[6].int64ValUnion(), AsSource: yyDollar[8].selectUnion()} + } + yyVAL.union = yyLOCAL + case 1327: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9023 + { + yyLOCAL = 0 + } + yyVAL.union = yyLOCAL + case 1328: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9025 + { + n := sqlTaskInt64(yyDollar[4].item) + if n <= 0 || n > 31536000/yyDollar[5].int64ValUnion() { + yylex.Error("invalid materialized view refresh interval") + goto ret1 + } + yyLOCAL = n * yyDollar[5].int64ValUnion() + } + yyVAL.union = yyLOCAL + case 1329: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9032 + { + yyLOCAL = 1 + } + yyVAL.union = yyLOCAL + case 1330: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9033 + { + yyLOCAL = 60 + } + yyVAL.union = yyLOCAL + case 1331: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9034 + { + yyLOCAL = 3600 + } + yyVAL.union = yyLOCAL + case 1332: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9035 + { + yyLOCAL = 86400 + } + yyVAL.union = yyLOCAL + case 1333: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9038 + { + yyLOCAL = &tree.RefreshMaterializedView{Name: yyDollar[4].tableNameUnion()} + } + yyVAL.union = yyLOCAL + case 1334: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9041 + { + yyLOCAL = &tree.DropMaterializedView{Name: yyDollar[5].tableNameUnion(), IfExists: yyDollar[4].boolValUnion()} + } + yyVAL.union = yyLOCAL + case 1335: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9044 + { + yyLOCAL = &tree.AlterMaterializedView{Name: yyDollar[4].tableNameUnion(), IntervalSeconds: yyDollar[5].int64ValUnion()} + } + yyVAL.union = yyLOCAL + case 1336: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9047 + { + yyLOCAL = &tree.ShowMaterializedViews{} + } + yyVAL.union = yyLOCAL + case 1337: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9048 + { + yyLOCAL = &tree.ShowMaterializedViews{Name: yyDollar[5].tableNameUnion(), Runs: true} + } + yyVAL.union = yyLOCAL + case 1338: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9049 + { + yyLOCAL = &tree.ShowMaterializedViews{Name: yyDollar[5].tableNameUnion(), Create: true} + } + yyVAL.union = yyLOCAL + case 1339: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9011 +//line mysql_sql.y:9053 { var Replace bool var Name = yyDollar[5].tableNameUnion() @@ -26185,10 +26394,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1322: + case 1340: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9030 +//line mysql_sql.y:9072 { var Replace = yyDollar[2].sourceOptionalUnion() var Name = yyDollar[5].tableNameUnion() @@ -26208,10 +26417,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1323: + case 1341: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9051 +//line mysql_sql.y:9093 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = yyDollar[4].exprUnion() @@ -26227,10 +26436,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1324: + case 1342: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9066 +//line mysql_sql.y:9108 { var FromUri = yyDollar[4].str var SubscriptionAccountName = yyDollar[5].cstrUnion().Compare() @@ -26248,81 +26457,81 @@ yydefault: yyLOCAL = cs } yyVAL.union = yyLOCAL - case 1325: + case 1343: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:9085 +//line mysql_sql.y:9127 { yyVAL.str = yyDollar[1].str } - case 1326: + case 1344: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:9089 +//line mysql_sql.y:9131 { yyVAL.str = yyVAL.str + yyDollar[2].str } - case 1327: + case 1345: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:9095 +//line mysql_sql.y:9137 { yyVAL.str = "ALGORITHM = " + yyDollar[3].str } - case 1328: + case 1346: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:9099 +//line mysql_sql.y:9141 { yyVAL.str = "DEFINER = " } - case 1329: + case 1347: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:9103 +//line mysql_sql.y:9145 { yyVAL.str = "SQL SECURITY " + yyDollar[3].str } - case 1330: + case 1348: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:9108 +//line mysql_sql.y:9150 { yyVAL.str = "" } - case 1331: + case 1349: yyDollar = yyS[yypt-4 : yypt+1] -//line mysql_sql.y:9112 +//line mysql_sql.y:9154 { yyVAL.str = "WITH " + yyDollar[2].str + " CHECK OPTION" } - case 1337: + case 1355: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:9126 +//line mysql_sql.y:9168 { yyVAL.str = "" } - case 1340: + case 1358: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:9134 +//line mysql_sql.y:9176 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1341: + case 1359: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:9140 +//line mysql_sql.y:9182 { var str = yyDollar[1].cstrUnion().Compare() yyLOCAL = tree.NewNumVal(str, str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 1342: + case 1360: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:9145 +//line mysql_sql.y:9187 { yyLOCAL = tree.NewParamExpr(yylex.(*Lexer).GetParamIndex()) } yyVAL.union = yyLOCAL - case 1343: + case 1361: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.AccountAuthOption -//line mysql_sql.y:9151 +//line mysql_sql.y:9193 { var Equal = yyDollar[2].str var AdminName = yyDollar[3].exprUnion() @@ -26334,36 +26543,36 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1344: + case 1362: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:9164 +//line mysql_sql.y:9206 { var str = yyDollar[1].str yyLOCAL = tree.NewNumVal(str, str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 1345: + case 1363: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:9169 +//line mysql_sql.y:9211 { var str = yyDollar[1].cstrUnion().Compare() yyLOCAL = tree.NewNumVal(str, str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 1346: + case 1364: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:9174 +//line mysql_sql.y:9216 { yyLOCAL = tree.NewParamExpr(yylex.(*Lexer).GetParamIndex()) } yyVAL.union = yyLOCAL - case 1347: + case 1365: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AccountIdentified -//line mysql_sql.y:9180 +//line mysql_sql.y:9222 { yyLOCAL = *tree.NewAccountIdentified( tree.AccountIdentifiedByPassword, @@ -26371,10 +26580,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1348: + case 1366: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AccountIdentified -//line mysql_sql.y:9187 +//line mysql_sql.y:9229 { yyLOCAL = *tree.NewAccountIdentified( tree.AccountIdentifiedByPassword, @@ -26382,10 +26591,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1349: + case 1367: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.AccountIdentified -//line mysql_sql.y:9194 +//line mysql_sql.y:9236 { yyLOCAL = *tree.NewAccountIdentified( tree.AccountIdentifiedByRandomPassword, @@ -26393,10 +26602,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1350: + case 1368: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AccountIdentified -//line mysql_sql.y:9201 +//line mysql_sql.y:9243 { yyLOCAL = *tree.NewAccountIdentified( tree.AccountIdentifiedWithSSL, @@ -26404,10 +26613,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1351: + case 1369: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AccountIdentified -//line mysql_sql.y:9208 +//line mysql_sql.y:9250 { yyLOCAL = *tree.NewAccountIdentified( tree.AccountIdentifiedWithSSL, @@ -26415,20 +26624,20 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1352: + case 1370: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.AccountStatus -//line mysql_sql.y:9216 +//line mysql_sql.y:9258 { as := tree.NewAccountStatus() as.Exist = false yyLOCAL = *as } yyVAL.union = yyLOCAL - case 1353: + case 1371: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AccountStatus -//line mysql_sql.y:9222 +//line mysql_sql.y:9264 { as := tree.NewAccountStatus() as.Exist = true @@ -26436,10 +26645,10 @@ yydefault: yyLOCAL = *as } yyVAL.union = yyLOCAL - case 1354: + case 1372: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AccountStatus -//line mysql_sql.y:9229 +//line mysql_sql.y:9271 { as := tree.NewAccountStatus() as.Exist = true @@ -26447,10 +26656,10 @@ yydefault: yyLOCAL = *as } yyVAL.union = yyLOCAL - case 1355: + case 1373: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AccountStatus -//line mysql_sql.y:9236 +//line mysql_sql.y:9278 { as := tree.NewAccountStatus() as.Exist = true @@ -26458,20 +26667,20 @@ yydefault: yyLOCAL = *as } yyVAL.union = yyLOCAL - case 1356: + case 1374: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.AccountComment -//line mysql_sql.y:9244 +//line mysql_sql.y:9286 { ac := tree.NewAccountComment() ac.Exist = false yyLOCAL = *ac } yyVAL.union = yyLOCAL - case 1357: + case 1375: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AccountComment -//line mysql_sql.y:9250 +//line mysql_sql.y:9292 { ac := tree.NewAccountComment() ac.Exist = true @@ -26479,10 +26688,10 @@ yydefault: yyLOCAL = *ac } yyVAL.union = yyLOCAL - case 1358: + case 1376: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9259 +//line mysql_sql.y:9301 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Users = yyDollar[4].usersUnion() @@ -26498,10 +26707,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1359: + case 1377: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9276 +//line mysql_sql.y:9318 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26518,10 +26727,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1360: + case 1378: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9292 +//line mysql_sql.y:9334 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26539,10 +26748,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1361: + case 1379: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9309 +//line mysql_sql.y:9351 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26559,30 +26768,30 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1362: + case 1380: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9327 +//line mysql_sql.y:9369 { yyLOCAL = &tree.AccountsSetOption{ All: true, } } yyVAL.union = yyLOCAL - case 1363: + case 1381: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9333 +//line mysql_sql.y:9375 { yyLOCAL = &tree.AccountsSetOption{ SetAccounts: yyDollar[2].identifierListUnion(), } } yyVAL.union = yyLOCAL - case 1364: + case 1382: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9341 +//line mysql_sql.y:9383 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26600,20 +26809,20 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1365: + case 1383: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.StageStatus -//line mysql_sql.y:9359 +//line mysql_sql.y:9401 { yyLOCAL = tree.StageStatus{ Exist: false, } } yyVAL.union = yyLOCAL - case 1366: + case 1384: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.StageStatus -//line mysql_sql.y:9365 +//line mysql_sql.y:9407 { yyLOCAL = tree.StageStatus{ Exist: true, @@ -26621,10 +26830,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1367: + case 1385: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.StageStatus -//line mysql_sql.y:9372 +//line mysql_sql.y:9414 { yyLOCAL = tree.StageStatus{ Exist: true, @@ -26632,20 +26841,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1368: + case 1386: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.StageComment -//line mysql_sql.y:9380 +//line mysql_sql.y:9422 { yyLOCAL = tree.StageComment{ Exist: false, } } yyVAL.union = yyLOCAL - case 1369: + case 1387: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.StageComment -//line mysql_sql.y:9386 +//line mysql_sql.y:9428 { yyLOCAL = tree.StageComment{ Exist: true, @@ -26653,18 +26862,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1370: + case 1388: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:9395 +//line mysql_sql.y:9437 { yyLOCAL = int64(0) } yyVAL.union = yyLOCAL - case 1371: + case 1389: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:9399 +//line mysql_sql.y:9441 { switch v := yyDollar[3].item.(type) { case int64: @@ -26676,20 +26885,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1372: + case 1390: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.StageUrl -//line mysql_sql.y:9411 +//line mysql_sql.y:9453 { yyLOCAL = tree.StageUrl{ Exist: false, } } yyVAL.union = yyLOCAL - case 1373: + case 1391: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.StageUrl -//line mysql_sql.y:9417 +//line mysql_sql.y:9459 { yyLOCAL = tree.StageUrl{ Exist: true, @@ -26697,20 +26906,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1374: + case 1392: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.StageCredentials -//line mysql_sql.y:9425 +//line mysql_sql.y:9467 { yyLOCAL = tree.StageCredentials{ Exist: false, } } yyVAL.union = yyLOCAL - case 1375: + case 1393: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.StageCredentials -//line mysql_sql.y:9431 +//line mysql_sql.y:9473 { yyLOCAL = tree.StageCredentials{ Exist: true, @@ -26718,61 +26927,61 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1376: + case 1394: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9440 +//line mysql_sql.y:9482 { yyLOCAL = yyDollar[1].strsUnion() } yyVAL.union = yyLOCAL - case 1377: + case 1395: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9444 +//line mysql_sql.y:9486 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].strsUnion()...) } yyVAL.union = yyLOCAL - case 1378: + case 1396: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9449 +//line mysql_sql.y:9491 { yyLOCAL = []string{} } yyVAL.union = yyLOCAL - case 1379: + case 1397: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9453 +//line mysql_sql.y:9495 { yyLOCAL = append(yyLOCAL, yyDollar[1].str) yyLOCAL = append(yyLOCAL, yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1380: + case 1398: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:9460 +//line mysql_sql.y:9502 { yyVAL.str = yyDollar[3].str } - case 1381: + case 1399: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:9465 +//line mysql_sql.y:9507 { yyVAL.str = "" } - case 1382: + case 1400: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:9469 +//line mysql_sql.y:9511 { yyVAL.str = yyDollar[2].str } - case 1383: + case 1401: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9475 +//line mysql_sql.y:9517 { var ifNotExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26783,10 +26992,10 @@ yydefault: yyLOCAL = tree.NewAlterStage(ifNotExists, name, urlOption, credentialsOption, statusOption, comment) } yyVAL.union = yyLOCAL - case 1384: + case 1402: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9487 +//line mysql_sql.y:9529 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26797,154 +27006,154 @@ yydefault: yyLOCAL = tree.NewAlterPublication(ifExists, name, accountsSet, dbName, table, comment) } yyVAL.union = yyLOCAL - case 1385: + case 1403: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9498 +//line mysql_sql.y:9540 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1386: + case 1404: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9502 +//line mysql_sql.y:9544 { yyLOCAL = &tree.AccountsSetOption{ All: true, } } yyVAL.union = yyLOCAL - case 1387: + case 1405: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9508 +//line mysql_sql.y:9550 { yyLOCAL = &tree.AccountsSetOption{ SetAccounts: yyDollar[2].identifierListUnion(), } } yyVAL.union = yyLOCAL - case 1388: + case 1406: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9514 +//line mysql_sql.y:9556 { yyLOCAL = &tree.AccountsSetOption{ AddAccounts: yyDollar[3].identifierListUnion(), } } yyVAL.union = yyLOCAL - case 1389: + case 1407: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9520 +//line mysql_sql.y:9562 { yyLOCAL = &tree.AccountsSetOption{ DropAccounts: yyDollar[3].identifierListUnion(), } } yyVAL.union = yyLOCAL - case 1390: + case 1408: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:9527 +//line mysql_sql.y:9569 { yyVAL.str = "" } - case 1391: + case 1409: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:9531 +//line mysql_sql.y:9573 { yyVAL.str = yyDollar[2].str } - case 1392: + case 1410: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.TableNames -//line mysql_sql.y:9536 +//line mysql_sql.y:9578 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1393: + case 1411: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableNames -//line mysql_sql.y:9540 +//line mysql_sql.y:9582 { yyLOCAL = yyDollar[2].tableNamesUnion() } yyVAL.union = yyLOCAL - case 1394: + case 1412: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9546 +//line mysql_sql.y:9588 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) yyLOCAL = tree.NewDropPublication(ifExists, name) } yyVAL.union = yyLOCAL - case 1395: + case 1413: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9554 +//line mysql_sql.y:9596 { var ifExists = yyDollar[4].boolValUnion() var taskID = yyDollar[5].str yyLOCAL = tree.NewDropCcprSubscription(ifExists, taskID) } yyVAL.union = yyLOCAL - case 1396: + case 1414: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9562 +//line mysql_sql.y:9604 { var taskID = yyDollar[4].str yyLOCAL = tree.NewResumeCcprSubscription(taskID) } yyVAL.union = yyLOCAL - case 1397: + case 1415: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9569 +//line mysql_sql.y:9611 { var taskID = yyDollar[4].str yyLOCAL = tree.NewPauseCcprSubscription(taskID) } yyVAL.union = yyLOCAL - case 1398: + case 1416: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9576 +//line mysql_sql.y:9618 { var ifNotExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) yyLOCAL = tree.NewDropStage(ifNotExists, name) } yyVAL.union = yyLOCAL - case 1399: + case 1417: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9584 +//line mysql_sql.y:9626 { var ifExists = yyDollar[5].boolValUnion() var path = yyDollar[6].str yyLOCAL = tree.NewRemoveStageFiles(ifExists, path) } yyVAL.union = yyLOCAL - case 1400: + case 1418: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9592 +//line mysql_sql.y:9634 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) yyLOCAL = tree.NewDropSnapShot(ifExists, name, "", "") } yyVAL.union = yyLOCAL - case 1401: + case 1419: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9598 +//line mysql_sql.y:9640 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26953,10 +27162,10 @@ yydefault: yyLOCAL = tree.NewDropSnapShot(ifExists, name, accountName, pubName) } yyVAL.union = yyLOCAL - case 1402: + case 1420: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9608 +//line mysql_sql.y:9650 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26968,16 +27177,16 @@ yydefault: } yyVAL.union = yyLOCAL - case 1403: + case 1421: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:9621 +//line mysql_sql.y:9663 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1404: + case 1422: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.AccountCommentOrAttribute -//line mysql_sql.y:9626 +//line mysql_sql.y:9668 { var Exist = false var IsComment bool @@ -26990,10 +27199,10 @@ yydefault: } yyVAL.union = yyLOCAL - case 1405: + case 1423: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AccountCommentOrAttribute -//line mysql_sql.y:9638 +//line mysql_sql.y:9680 { var Exist = true var IsComment = true @@ -27005,10 +27214,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1406: + case 1424: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AccountCommentOrAttribute -//line mysql_sql.y:9649 +//line mysql_sql.y:9691 { var Exist = true var IsComment = false @@ -27020,26 +27229,26 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1407: + case 1425: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:9757 +//line mysql_sql.y:9799 { yyLOCAL = []*tree.User{yyDollar[1].userUnion()} } yyVAL.union = yyLOCAL - case 1408: + case 1426: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:9761 +//line mysql_sql.y:9803 { yyLOCAL = append(yyDollar[1].usersUnion(), yyDollar[3].userUnion()) } yyVAL.union = yyLOCAL - case 1409: + case 1427: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.User -//line mysql_sql.y:9767 +//line mysql_sql.y:9809 { var Username = yyDollar[1].usernameRecordUnion().Username var Hostname = yyDollar[1].usernameRecordUnion().Hostname @@ -27051,26 +27260,26 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1410: + case 1428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:9780 +//line mysql_sql.y:9822 { yyLOCAL = []*tree.User{yyDollar[1].userUnion()} } yyVAL.union = yyLOCAL - case 1411: + case 1429: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:9784 +//line mysql_sql.y:9826 { yyLOCAL = append(yyDollar[1].usersUnion(), yyDollar[3].userUnion()) } yyVAL.union = yyLOCAL - case 1412: + case 1430: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.User -//line mysql_sql.y:9790 +//line mysql_sql.y:9832 { var Username = yyDollar[1].usernameRecordUnion().Username var Hostname = yyDollar[1].usernameRecordUnion().Hostname @@ -27082,50 +27291,50 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1413: + case 1431: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UsernameRecord -//line mysql_sql.y:9803 +//line mysql_sql.y:9845 { yyLOCAL = &tree.UsernameRecord{Username: yyDollar[1].str, Hostname: "%"} } yyVAL.union = yyLOCAL - case 1414: + case 1432: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UsernameRecord -//line mysql_sql.y:9807 +//line mysql_sql.y:9849 { yyLOCAL = &tree.UsernameRecord{Username: yyDollar[1].str, Hostname: yyDollar[3].str} } yyVAL.union = yyLOCAL - case 1415: + case 1433: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UsernameRecord -//line mysql_sql.y:9811 +//line mysql_sql.y:9853 { yyLOCAL = &tree.UsernameRecord{Username: yyDollar[1].str, Hostname: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1416: + case 1434: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.AccountIdentified -//line mysql_sql.y:9816 +//line mysql_sql.y:9858 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1417: + case 1435: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AccountIdentified -//line mysql_sql.y:9820 +//line mysql_sql.y:9862 { yyLOCAL = yyDollar[1].userIdentifiedUnion() } yyVAL.union = yyLOCAL - case 1418: + case 1436: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AccountIdentified -//line mysql_sql.y:9826 +//line mysql_sql.y:9868 { yyLOCAL = &tree.AccountIdentified{ Typ: tree.AccountIdentifiedByPassword, @@ -27133,20 +27342,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1419: + case 1437: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.AccountIdentified -//line mysql_sql.y:9833 +//line mysql_sql.y:9875 { yyLOCAL = &tree.AccountIdentified{ Typ: tree.AccountIdentifiedByRandomPassword, } } yyVAL.union = yyLOCAL - case 1420: + case 1438: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AccountIdentified -//line mysql_sql.y:9839 +//line mysql_sql.y:9881 { yyLOCAL = &tree.AccountIdentified{ Typ: tree.AccountIdentifiedWithSSL, @@ -27154,16 +27363,16 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1421: + case 1439: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:9848 +//line mysql_sql.y:9890 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1423: + case 1441: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9855 +//line mysql_sql.y:9897 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Roles = yyDollar[4].rolesUnion() @@ -27173,26 +27382,26 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1424: + case 1442: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Role -//line mysql_sql.y:9866 +//line mysql_sql.y:9908 { yyLOCAL = []*tree.Role{yyDollar[1].roleUnion()} } yyVAL.union = yyLOCAL - case 1425: + case 1443: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Role -//line mysql_sql.y:9870 +//line mysql_sql.y:9912 { yyLOCAL = append(yyDollar[1].rolesUnion(), yyDollar[3].roleUnion()) } yyVAL.union = yyLOCAL - case 1426: + case 1444: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Role -//line mysql_sql.y:9876 +//line mysql_sql.y:9918 { var UserName = yyDollar[1].cstrUnion().Compare() yyLOCAL = tree.NewRole( @@ -27200,114 +27409,114 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1427: + case 1445: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9885 +//line mysql_sql.y:9927 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1428: + case 1446: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9889 +//line mysql_sql.y:9931 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1429: + case 1447: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9893 +//line mysql_sql.y:9935 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1430: + case 1448: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9897 +//line mysql_sql.y:9939 { yyLOCAL = tree.NewCStr("lag", 1) } yyVAL.union = yyLOCAL - case 1431: + case 1449: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9901 +//line mysql_sql.y:9943 { yyLOCAL = tree.NewCStr("lead", 1) } yyVAL.union = yyLOCAL - case 1432: + case 1450: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9905 +//line mysql_sql.y:9947 { yyLOCAL = tree.NewCStr("first_value", 1) } yyVAL.union = yyLOCAL - case 1433: + case 1451: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9909 +//line mysql_sql.y:9951 { yyLOCAL = tree.NewCStr("last_value", 1) } yyVAL.union = yyLOCAL - case 1434: + case 1452: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9913 +//line mysql_sql.y:9955 { yyLOCAL = tree.NewCStr("nth_value", 1) } yyVAL.union = yyLOCAL - case 1435: + case 1453: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IndexCategory -//line mysql_sql.y:9918 +//line mysql_sql.y:9960 { yyLOCAL = tree.INDEX_CATEGORY_NONE } yyVAL.union = yyLOCAL - case 1436: + case 1454: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IndexCategory -//line mysql_sql.y:9922 +//line mysql_sql.y:9964 { yyLOCAL = tree.INDEX_CATEGORY_FULLTEXT } yyVAL.union = yyLOCAL - case 1437: + case 1455: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IndexCategory -//line mysql_sql.y:9926 +//line mysql_sql.y:9968 { yyLOCAL = tree.INDEX_CATEGORY_FULLTEXT2 } yyVAL.union = yyLOCAL - case 1438: + case 1456: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IndexCategory -//line mysql_sql.y:9930 +//line mysql_sql.y:9972 { yyLOCAL = tree.INDEX_CATEGORY_SPATIAL } yyVAL.union = yyLOCAL - case 1439: + case 1457: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IndexCategory -//line mysql_sql.y:9934 +//line mysql_sql.y:9976 { yyLOCAL = tree.INDEX_CATEGORY_UNIQUE } yyVAL.union = yyLOCAL - case 1440: + case 1458: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9940 +//line mysql_sql.y:9982 { io := yyDollar[11].indexOptionUnion() if io == nil { @@ -27336,70 +27545,70 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1441: + case 1459: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9969 +//line mysql_sql.y:10011 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1442: + case 1460: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9973 +//line mysql_sql.y:10015 { yyLOCAL = mergeIndexOption(yyDollar[1].indexOptionUnion(), yyDollar[2].indexOptionUnion()) } yyVAL.union = yyLOCAL - case 1443: + case 1461: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9978 +//line mysql_sql.y:10020 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1444: + case 1462: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9982 +//line mysql_sql.y:10024 { yyLOCAL = mergeIndexOption(yyDollar[1].indexOptionUnion(), yyDollar[2].indexOptionUnion()) } yyVAL.union = yyLOCAL - case 1445: + case 1463: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9988 +//line mysql_sql.y:10030 { yyLOCAL = yyDollar[1].indexOptionUnion() } yyVAL.union = yyLOCAL - case 1446: + case 1464: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9992 +//line mysql_sql.y:10034 { io := tree.NewIndexOption() io.IType = yyDollar[1].indexTypeUnion() yyLOCAL = io } yyVAL.union = yyLOCAL - case 1447: + case 1465: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10000 +//line mysql_sql.y:10042 { io := tree.NewIndexOption() io.KeyBlockSize = integralToUint64(yyDollar[3].item) yyLOCAL = io } yyVAL.union = yyLOCAL - case 1448: + case 1466: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10006 +//line mysql_sql.y:10048 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27415,60 +27624,60 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1449: + case 1467: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10019 +//line mysql_sql.y:10061 { io := tree.NewIndexOption() io.AlgoParamVectorOpType = yyDollar[2].str yyLOCAL = io } yyVAL.union = yyLOCAL - case 1450: + case 1468: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10025 +//line mysql_sql.y:10067 { io := tree.NewIndexOption() io.Comment = yyDollar[2].str yyLOCAL = io } yyVAL.union = yyLOCAL - case 1451: + case 1469: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10031 +//line mysql_sql.y:10073 { io := tree.NewIndexOption() io.ParserName = yyDollar[3].cstrUnion().Compare() yyLOCAL = io } yyVAL.union = yyLOCAL - case 1452: + case 1470: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10037 +//line mysql_sql.y:10079 { io := tree.NewIndexOption() io.Visible = tree.VISIBLE_TYPE_VISIBLE yyLOCAL = io } yyVAL.union = yyLOCAL - case 1453: + case 1471: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10043 +//line mysql_sql.y:10085 { io := tree.NewIndexOption() io.Visible = tree.VISIBLE_TYPE_INVISIBLE yyLOCAL = io } yyVAL.union = yyLOCAL - case 1454: + case 1472: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10049 +//line mysql_sql.y:10091 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27483,10 +27692,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1455: + case 1473: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10061 +//line mysql_sql.y:10103 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27501,10 +27710,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1456: + case 1474: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10073 +//line mysql_sql.y:10115 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27519,10 +27728,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1457: + case 1475: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10085 +//line mysql_sql.y:10127 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27537,10 +27746,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1458: + case 1476: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10097 +//line mysql_sql.y:10139 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27555,10 +27764,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1459: + case 1477: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10109 +//line mysql_sql.y:10151 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27573,40 +27782,40 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1460: + case 1478: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10121 +//line mysql_sql.y:10163 { io := tree.NewIndexOption() io.IncludeColumns = yyDollar[3].unresolveNamesUnion() yyLOCAL = io } yyVAL.union = yyLOCAL - case 1461: + case 1479: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10127 +//line mysql_sql.y:10169 { io := tree.NewIndexOption() io.Quantization = yyDollar[2].str yyLOCAL = io } yyVAL.union = yyLOCAL - case 1462: + case 1480: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10133 +//line mysql_sql.y:10175 { io := tree.NewIndexOption() io.DistributionMode = yyDollar[2].str yyLOCAL = io } yyVAL.union = yyLOCAL - case 1463: + case 1481: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10139 +//line mysql_sql.y:10181 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27621,10 +27830,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1464: + case 1482: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10151 +//line mysql_sql.y:10193 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27639,10 +27848,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1465: + case 1483: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10163 +//line mysql_sql.y:10205 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27657,10 +27866,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1466: + case 1484: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10175 +//line mysql_sql.y:10217 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27675,10 +27884,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1467: + case 1485: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10187 +//line mysql_sql.y:10229 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27693,10 +27902,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1468: + case 1486: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10199 +//line mysql_sql.y:10241 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27711,10 +27920,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1469: + case 1487: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10211 +//line mysql_sql.y:10253 { io := tree.NewIndexOption() io.PositionFree = true @@ -27722,10 +27931,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1470: + case 1488: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10218 +//line mysql_sql.y:10260 { io := tree.NewIndexOption() io.PositionFree = false @@ -27733,60 +27942,60 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1471: + case 1489: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10225 +//line mysql_sql.y:10267 { io := tree.NewIndexOption() io.Async = true yyLOCAL = io } yyVAL.union = yyLOCAL - case 1472: + case 1490: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10231 +//line mysql_sql.y:10273 { io := tree.NewIndexOption() io.ForceSync = true yyLOCAL = io } yyVAL.union = yyLOCAL - case 1473: + case 1491: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10237 +//line mysql_sql.y:10279 { io := tree.NewIndexOption() io.Merge = true yyLOCAL = io } yyVAL.union = yyLOCAL - case 1474: + case 1492: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10243 +//line mysql_sql.y:10285 { io := tree.NewIndexOption() io.AutoUpdate = true yyLOCAL = io } yyVAL.union = yyLOCAL - case 1475: + case 1493: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10249 +//line mysql_sql.y:10291 { io := tree.NewIndexOption() io.AutoUpdate = false yyLOCAL = io } yyVAL.union = yyLOCAL - case 1476: + case 1494: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10255 +//line mysql_sql.y:10297 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27801,10 +28010,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1477: + case 1495: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10267 +//line mysql_sql.y:10309 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27819,10 +28028,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1478: + case 1496: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10279 +//line mysql_sql.y:10321 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27837,26 +28046,26 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1479: + case 1497: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:10294 +//line mysql_sql.y:10336 { yyLOCAL = []*tree.KeyPart{yyDollar[1].keyPartUnion()} } yyVAL.union = yyLOCAL - case 1480: + case 1498: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:10298 +//line mysql_sql.y:10340 { yyLOCAL = append(yyDollar[1].keyPartsUnion(), yyDollar[3].keyPartUnion()) } yyVAL.union = yyLOCAL - case 1481: + case 1499: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.KeyPart -//line mysql_sql.y:10304 +//line mysql_sql.y:10346 { // Order is parsed but just ignored as MySQL dtree. var ColName = yyDollar[1].unresolvedNameUnion() @@ -27871,10 +28080,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1482: + case 1500: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.KeyPart -//line mysql_sql.y:10318 +//line mysql_sql.y:10360 { var ColName *tree.UnresolvedName var Length int @@ -27888,98 +28097,98 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1483: + case 1501: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10332 +//line mysql_sql.y:10374 { yyLOCAL = tree.INDEX_TYPE_INVALID } yyVAL.union = yyLOCAL - case 1484: + case 1502: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10336 +//line mysql_sql.y:10378 { yyLOCAL = yyDollar[1].indexTypeUnion() } yyVAL.union = yyLOCAL - case 1485: + case 1503: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10342 +//line mysql_sql.y:10384 { yyLOCAL = tree.INDEX_TYPE_BTREE } yyVAL.union = yyLOCAL - case 1486: + case 1504: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10346 +//line mysql_sql.y:10388 { yyLOCAL = tree.INDEX_TYPE_IVFFLAT } yyVAL.union = yyLOCAL - case 1487: + case 1505: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10350 +//line mysql_sql.y:10392 { yyLOCAL = tree.INDEX_TYPE_HNSW } yyVAL.union = yyLOCAL - case 1488: + case 1506: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10354 +//line mysql_sql.y:10396 { yyLOCAL = tree.INDEX_TYPE_IVFPQ } yyVAL.union = yyLOCAL - case 1489: + case 1507: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10358 +//line mysql_sql.y:10400 { yyLOCAL = tree.INDEX_TYPE_CAGRA } yyVAL.union = yyLOCAL - case 1490: + case 1508: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10362 +//line mysql_sql.y:10404 { yyLOCAL = tree.INDEX_TYPE_MASTER } yyVAL.union = yyLOCAL - case 1491: + case 1509: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10366 +//line mysql_sql.y:10408 { yyLOCAL = tree.INDEX_TYPE_HASH } yyVAL.union = yyLOCAL - case 1492: + case 1510: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10370 +//line mysql_sql.y:10412 { yyLOCAL = tree.INDEX_TYPE_RTREE } yyVAL.union = yyLOCAL - case 1493: + case 1511: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10374 +//line mysql_sql.y:10416 { yyLOCAL = tree.INDEX_TYPE_BSI } yyVAL.union = yyLOCAL - case 1494: + case 1512: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10380 +//line mysql_sql.y:10422 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].str) @@ -27993,10 +28202,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1495: + case 1513: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10394 +//line mysql_sql.y:10436 { var t = tree.NewCloneDatabase() t.IfNotExists = yyDollar[3].ifNotExistsUnion() @@ -28007,10 +28216,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1496: + case 1514: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10404 +//line mysql_sql.y:10446 { var DbName = tree.Identifier(yyDollar[4].str) var FromUri = yyDollar[6].str @@ -28028,100 +28237,100 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1497: + case 1515: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.SubscriptionOption -//line mysql_sql.y:10422 +//line mysql_sql.y:10464 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1498: + case 1516: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.SubscriptionOption -//line mysql_sql.y:10426 +//line mysql_sql.y:10468 { var From = tree.Identifier(yyDollar[2].str) var Publication = tree.Identifier(yyDollar[4].cstrUnion().Compare()) yyLOCAL = tree.NewSubscriptionOption(From, Publication) } yyVAL.union = yyLOCAL - case 1501: + case 1519: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10437 +//line mysql_sql.y:10479 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1502: + case 1520: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10441 +//line mysql_sql.y:10483 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1503: + case 1521: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10445 +//line mysql_sql.y:10487 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1504: + case 1522: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10450 +//line mysql_sql.y:10492 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1505: + case 1523: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10454 +//line mysql_sql.y:10496 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1506: + case 1524: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:10459 +//line mysql_sql.y:10501 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1507: + case 1525: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:10463 +//line mysql_sql.y:10505 { yyLOCAL = yyDollar[1].createOptionsUnion() } yyVAL.union = yyLOCAL - case 1508: + case 1526: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:10469 +//line mysql_sql.y:10511 { yyLOCAL = []tree.CreateOption{yyDollar[1].createOptionUnion()} } yyVAL.union = yyLOCAL - case 1509: + case 1527: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:10473 +//line mysql_sql.y:10515 { yyLOCAL = append(yyDollar[1].createOptionsUnion(), yyDollar[2].createOptionUnion()) } yyVAL.union = yyLOCAL - case 1510: + case 1528: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:10479 +//line mysql_sql.y:10521 { var IsDefault = yyDollar[1].defaultOptionalUnion() var Charset = yyDollar[4].str @@ -28131,10 +28340,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1511: + case 1529: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:10488 +//line mysql_sql.y:10530 { var IsDefault = yyDollar[1].defaultOptionalUnion() var Collate = yyDollar[4].str @@ -28144,35 +28353,35 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1512: + case 1530: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:10497 +//line mysql_sql.y:10539 { var Encrypt = yyDollar[4].str yyLOCAL = tree.NewCreateOptionEncryption(Encrypt) } yyVAL.union = yyLOCAL - case 1513: + case 1531: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10503 +//line mysql_sql.y:10545 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1514: + case 1532: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10507 +//line mysql_sql.y:10549 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1515: + case 1533: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10513 +//line mysql_sql.y:10555 { var taskID uint64 switch v := yyDollar[4].item.(type) { @@ -28189,10 +28398,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1516: + case 1534: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10531 +//line mysql_sql.y:10573 { var taskID uint64 switch v := yyDollar[4].item.(type) { @@ -28209,10 +28418,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1517: + case 1535: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10549 +//line mysql_sql.y:10591 { var taskID uint64 switch v := yyDollar[4].item.(type) { @@ -28229,26 +28438,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1518: + case 1536: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10566 +//line mysql_sql.y:10608 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1519: + case 1537: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10570 +//line mysql_sql.y:10612 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1520: + case 1538: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10576 +//line mysql_sql.y:10618 { t := tree.NewDataBranchCreateTable() t.CreateTable.Table = *yyDollar[5].tableNameUnion() @@ -28259,10 +28468,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1521: + case 1539: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10586 +//line mysql_sql.y:10628 { t := tree.NewDataBranchCreateDatabase() t.DstDatabase = tree.Identifier(yyDollar[5].str) @@ -28272,30 +28481,30 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1522: + case 1540: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10595 +//line mysql_sql.y:10637 { t := tree.NewDataBranchDeleteTable() t.TableName = *yyDollar[5].tableNameUnion() yyLOCAL = t } yyVAL.union = yyLOCAL - case 1523: + case 1541: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10601 +//line mysql_sql.y:10643 { t := tree.NewDataBranchDeleteDatabase() t.DatabaseName = tree.Identifier(yyDollar[5].str) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1524: + case 1542: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10607 +//line mysql_sql.y:10649 { t := tree.NewDataBranchDiff() t.TargetTable = *yyDollar[4].tableNameUnion() @@ -28305,10 +28514,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1525: + case 1543: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10616 +//line mysql_sql.y:10658 { t := tree.NewDataBranchMerge() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28317,10 +28526,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1526: + case 1544: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10624 +//line mysql_sql.y:10666 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28330,10 +28539,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1527: + case 1545: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10633 +//line mysql_sql.y:10675 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28344,10 +28553,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1528: + case 1546: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10643 +//line mysql_sql.y:10685 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28358,10 +28567,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1529: + case 1547: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10653 +//line mysql_sql.y:10695 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28373,10 +28582,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1530: + case 1548: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10664 +//line mysql_sql.y:10706 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28388,54 +28597,54 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1531: + case 1549: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:10676 +//line mysql_sql.y:10718 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1532: + case 1550: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:10680 +//line mysql_sql.y:10722 { yyLOCAL = yyDollar[3].identifierListUnion() } yyVAL.union = yyLOCAL - case 1533: + case 1551: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10685 +//line mysql_sql.y:10727 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1534: + case 1552: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10689 +//line mysql_sql.y:10731 { yyLOCAL = &tree.DiffOutputOpt{ As: *yyDollar[3].tableNameUnion(), } } yyVAL.union = yyLOCAL - case 1535: + case 1553: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10695 +//line mysql_sql.y:10737 { yyLOCAL = &tree.DiffOutputOpt{ DirPath: yyDollar[3].str, } } yyVAL.union = yyLOCAL - case 1536: + case 1554: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10701 +//line mysql_sql.y:10743 { x, errStr := util.GetInt64(yyDollar[3].item) if errStr != "" { @@ -28447,68 +28656,68 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1537: + case 1555: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10708 +//line mysql_sql.y:10750 { yyLOCAL = &tree.DiffOutputOpt{ Count: true, } } yyVAL.union = yyLOCAL - case 1538: + case 1556: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10714 +//line mysql_sql.y:10756 { yyLOCAL = &tree.DiffOutputOpt{ Summary: true, } } yyVAL.union = yyLOCAL - case 1539: + case 1557: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:10722 +//line mysql_sql.y:10764 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1540: + case 1558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:10726 +//line mysql_sql.y:10768 { yyLOCAL = &tree.ConflictOpt{ Opt: tree.CONFLICT_FAIL, } } yyVAL.union = yyLOCAL - case 1541: + case 1559: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:10732 +//line mysql_sql.y:10774 { yyLOCAL = &tree.ConflictOpt{ Opt: tree.CONFLICT_SKIP, } } yyVAL.union = yyLOCAL - case 1542: + case 1560: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:10738 +//line mysql_sql.y:10780 { yyLOCAL = &tree.ConflictOpt{ Opt: tree.CONFLICT_ACCEPT, } } yyVAL.union = yyLOCAL - case 1543: + case 1561: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PickKeys -//line mysql_sql.y:10746 +//line mysql_sql.y:10788 { yyLOCAL = &tree.PickKeys{ Type: tree.PickKeysValues, @@ -28516,10 +28725,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1544: + case 1562: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PickKeys -//line mysql_sql.y:10753 +//line mysql_sql.y:10795 { yyLOCAL = &tree.PickKeys{ Type: tree.PickKeysSubquery, @@ -28527,74 +28736,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1545: + case 1563: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ToAccountOpt -//line mysql_sql.y:10762 +//line mysql_sql.y:10804 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1546: + case 1564: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ToAccountOpt -//line mysql_sql.y:10766 +//line mysql_sql.y:10808 { yyLOCAL = &tree.ToAccountOpt{ AccountName: tree.Identifier(yyDollar[3].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 1547: + case 1565: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10774 +//line mysql_sql.y:10816 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1548: + case 1566: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10778 +//line mysql_sql.y:10820 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1549: + case 1567: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:10783 +//line mysql_sql.y:10825 { yyVAL.str = "" } - case 1550: + case 1568: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10784 +//line mysql_sql.y:10826 { yyVAL.str = "ignore" } - case 1551: + case 1569: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10785 +//line mysql_sql.y:10827 { yyVAL.str = "replace" } - case 1552: + case 1570: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10788 +//line mysql_sql.y:10830 { yyVAL.str = "ignore" } - case 1553: + case 1571: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10789 +//line mysql_sql.y:10831 { yyVAL.str = "replace" } - case 1554: + case 1572: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10793 +//line mysql_sql.y:10835 { t := tree.NewCreateTable() t.Temporary = yyDollar[2].boolValUnion() @@ -28607,10 +28816,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1555: + case 1573: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10805 +//line mysql_sql.y:10847 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28620,10 +28829,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1556: + case 1574: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10814 +//line mysql_sql.y:10856 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28633,10 +28842,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1557: + case 1575: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10823 +//line mysql_sql.y:10865 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28646,10 +28855,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1558: + case 1576: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10832 +//line mysql_sql.y:10874 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28659,10 +28868,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1559: + case 1577: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10841 +//line mysql_sql.y:10883 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28672,10 +28881,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1560: + case 1578: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10850 +//line mysql_sql.y:10892 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28685,10 +28894,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1561: + case 1579: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10859 +//line mysql_sql.y:10901 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28697,10 +28906,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1562: + case 1580: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10867 +//line mysql_sql.y:10909 { t := tree.NewCreateTable() t.IsClusterTable = true @@ -28713,10 +28922,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1563: + case 1581: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10879 +//line mysql_sql.y:10921 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[6].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28731,10 +28940,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1564: + case 1582: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10893 +//line mysql_sql.y:10935 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[9].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28750,10 +28959,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1565: + case 1583: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10908 +//line mysql_sql.y:10950 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[7].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28769,10 +28978,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1566: + case 1584: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10913 +//line mysql_sql.y:10955 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[10].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28789,10 +28998,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1567: + case 1585: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10918 +//line mysql_sql.y:10960 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[8].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28808,10 +29017,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1568: + case 1586: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10923 +//line mysql_sql.y:10965 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[11].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28828,10 +29037,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1569: + case 1587: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10928 +//line mysql_sql.y:10970 { t := tree.NewCreateTable() t.IsAsLike = true @@ -28842,10 +29051,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1570: + case 1588: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10938 +//line mysql_sql.y:10980 { t := tree.NewCreateTable() t.Temporary = yyDollar[2].boolValUnion() @@ -28855,10 +29064,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1571: + case 1589: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10947 +//line mysql_sql.y:10989 { t := tree.NewCloneTable() t.CreateTable.Temporary = yyDollar[2].boolValUnion() @@ -28872,10 +29081,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1572: + case 1590: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10960 +//line mysql_sql.y:11002 { var TableName = yyDollar[5].tableNameUnion() var FromUri = yyDollar[7].str @@ -28899,19 +29108,19 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1573: + case 1591: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:10985 +//line mysql_sql.y:11027 { yyLOCAL = yyDollar[1].loadParamUnion() yyLOCAL.Tail = yyDollar[2].tailParamUnion() } yyVAL.union = yyLOCAL - case 1574: + case 1592: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:10992 +//line mysql_sql.y:11034 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -28922,10 +29131,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1575: + case 1593: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:11002 +//line mysql_sql.y:11044 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -28939,10 +29148,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1576: + case 1594: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:11015 +//line mysql_sql.y:11057 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -28951,10 +29160,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1577: + case 1595: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:11023 +//line mysql_sql.y:11065 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -28964,10 +29173,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1578: + case 1596: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:11032 +//line mysql_sql.y:11074 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -28976,55 +29185,55 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1579: + case 1597: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:11041 +//line mysql_sql.y:11083 { yyVAL.str = "" } - case 1580: + case 1598: yyDollar = yyS[yypt-4 : yypt+1] -//line mysql_sql.y:11045 +//line mysql_sql.y:11087 { yyVAL.str = yyDollar[4].str } - case 1581: + case 1599: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:11051 +//line mysql_sql.y:11093 { yyLOCAL = yyDollar[1].strsUnion() } yyVAL.union = yyLOCAL - case 1582: + case 1600: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:11055 +//line mysql_sql.y:11097 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].strsUnion()...) } yyVAL.union = yyLOCAL - case 1583: + case 1601: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:11060 +//line mysql_sql.y:11102 { yyLOCAL = []string{} } yyVAL.union = yyLOCAL - case 1584: + case 1602: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:11064 +//line mysql_sql.y:11106 { yyLOCAL = append(yyLOCAL, yyDollar[1].str) yyLOCAL = append(yyLOCAL, yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1585: + case 1603: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.TailParameter -//line mysql_sql.y:11071 +//line mysql_sql.y:11113 { yyLOCAL = &tree.TailParameter{ Charset: yyDollar[1].str, @@ -29036,22 +29245,22 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1586: + case 1604: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:11083 +//line mysql_sql.y:11125 { yyVAL.str = "" } - case 1587: + case 1605: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:11087 +//line mysql_sql.y:11129 { yyVAL.str = yyDollar[2].str } - case 1588: + case 1606: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:11093 +//line mysql_sql.y:11135 { var Name = yyDollar[4].tableNameUnion() var Type = yyDollar[5].columnTypeUnion() @@ -29073,10 +29282,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1589: + case 1607: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11114 +//line mysql_sql.y:11156 { locale := "" fstr := "bigint" @@ -29091,44 +29300,44 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1590: + case 1608: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11128 +//line mysql_sql.y:11170 { yyLOCAL = yyDollar[2].columnTypeUnion() } yyVAL.union = yyLOCAL - case 1591: + case 1609: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.TypeOption -//line mysql_sql.y:11132 +//line mysql_sql.y:11174 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1592: + case 1610: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.TypeOption -//line mysql_sql.y:11136 +//line mysql_sql.y:11178 { yyLOCAL = &tree.TypeOption{ Type: yyDollar[2].columnTypeUnion(), } } yyVAL.union = yyLOCAL - case 1593: + case 1611: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:11142 +//line mysql_sql.y:11184 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1594: + case 1612: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:11146 +//line mysql_sql.y:11188 { yyLOCAL = &tree.IncrementByOption{ Minus: false, @@ -29136,10 +29345,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1595: + case 1613: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:11153 +//line mysql_sql.y:11195 { yyLOCAL = &tree.IncrementByOption{ Minus: false, @@ -29147,10 +29356,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1596: + case 1614: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:11160 +//line mysql_sql.y:11202 { yyLOCAL = &tree.IncrementByOption{ Minus: true, @@ -29158,10 +29367,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1597: + case 1615: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:11167 +//line mysql_sql.y:11209 { yyLOCAL = &tree.IncrementByOption{ Minus: true, @@ -29169,42 +29378,42 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1598: + case 1616: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11174 +//line mysql_sql.y:11216 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1599: + case 1617: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11178 +//line mysql_sql.y:11220 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1600: + case 1618: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11182 +//line mysql_sql.y:11224 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1601: + case 1619: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.MinValueOption -//line mysql_sql.y:11186 +//line mysql_sql.y:11228 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1602: + case 1620: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.MinValueOption -//line mysql_sql.y:11190 +//line mysql_sql.y:11232 { yyLOCAL = &tree.MinValueOption{ Minus: false, @@ -29212,10 +29421,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1603: + case 1621: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.MinValueOption -//line mysql_sql.y:11197 +//line mysql_sql.y:11239 { yyLOCAL = &tree.MinValueOption{ Minus: true, @@ -29223,18 +29432,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1604: + case 1622: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.MaxValueOption -//line mysql_sql.y:11204 +//line mysql_sql.y:11246 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1605: + case 1623: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.MaxValueOption -//line mysql_sql.y:11208 +//line mysql_sql.y:11250 { yyLOCAL = &tree.MaxValueOption{ Minus: false, @@ -29242,10 +29451,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1606: + case 1624: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.MaxValueOption -//line mysql_sql.y:11215 +//line mysql_sql.y:11257 { yyLOCAL = &tree.MaxValueOption{ Minus: true, @@ -29253,46 +29462,46 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1607: + case 1625: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.CycleOption -//line mysql_sql.y:11222 +//line mysql_sql.y:11264 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1608: + case 1626: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.CycleOption -//line mysql_sql.y:11226 +//line mysql_sql.y:11268 { yyLOCAL = &tree.CycleOption{ Cycle: false, } } yyVAL.union = yyLOCAL - case 1609: + case 1627: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CycleOption -//line mysql_sql.y:11232 +//line mysql_sql.y:11274 { yyLOCAL = &tree.CycleOption{ Cycle: true, } } yyVAL.union = yyLOCAL - case 1610: + case 1628: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:11238 +//line mysql_sql.y:11280 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1611: + case 1629: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:11242 +//line mysql_sql.y:11284 { yyLOCAL = &tree.StartWithOption{ Minus: false, @@ -29300,10 +29509,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1612: + case 1630: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:11249 +//line mysql_sql.y:11291 { yyLOCAL = &tree.StartWithOption{ Minus: false, @@ -29311,10 +29520,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1613: + case 1631: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:11256 +//line mysql_sql.y:11298 { yyLOCAL = &tree.StartWithOption{ Minus: true, @@ -29322,10 +29531,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1614: + case 1632: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:11263 +//line mysql_sql.y:11305 { yyLOCAL = &tree.StartWithOption{ Minus: true, @@ -29333,58 +29542,58 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1615: + case 1633: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11270 +//line mysql_sql.y:11312 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1616: + case 1634: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11274 +//line mysql_sql.y:11316 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1617: + case 1635: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11279 +//line mysql_sql.y:11321 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1618: + case 1636: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11283 +//line mysql_sql.y:11325 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1619: + case 1637: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11287 +//line mysql_sql.y:11329 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1620: + case 1638: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.PartitionOption -//line mysql_sql.y:11292 +//line mysql_sql.y:11334 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1621: + case 1639: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.PartitionOption -//line mysql_sql.y:11296 +//line mysql_sql.y:11338 { yyDollar[3].partitionByUnion().Num = uint64(yyDollar[4].int64ValUnion()) var PartBy = yyDollar[3].partitionByUnion() @@ -29397,18 +29606,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1622: + case 1640: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ClusterByOption -//line mysql_sql.y:11309 +//line mysql_sql.y:11351 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1623: + case 1641: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ClusterByOption -//line mysql_sql.y:11313 +//line mysql_sql.y:11355 { var ColumnList = []*tree.UnresolvedName{yyDollar[3].unresolvedNameUnion()} yyLOCAL = tree.NewClusterByOption( @@ -29417,10 +29626,10 @@ yydefault: } yyVAL.union = yyLOCAL - case 1624: + case 1642: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.ClusterByOption -//line mysql_sql.y:11321 +//line mysql_sql.y:11363 { var ColumnList = yyDollar[4].unresolveNamesUnion() yyLOCAL = tree.NewClusterByOption( @@ -29428,18 +29637,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1625: + case 1643: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11329 +//line mysql_sql.y:11371 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1626: + case 1644: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11333 +//line mysql_sql.y:11375 { var IsSubPartition = true var PType = yyDollar[3].partitionByUnion().PType @@ -29453,42 +29662,42 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1627: + case 1645: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:11347 +//line mysql_sql.y:11389 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1628: + case 1646: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:11351 +//line mysql_sql.y:11393 { yyLOCAL = yyDollar[2].partitionsUnion() } yyVAL.union = yyLOCAL - case 1629: + case 1647: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:11357 +//line mysql_sql.y:11399 { yyLOCAL = []*tree.Partition{yyDollar[1].partitionUnion()} } yyVAL.union = yyLOCAL - case 1630: + case 1648: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:11361 +//line mysql_sql.y:11403 { yyLOCAL = append(yyDollar[1].partitionsUnion(), yyDollar[3].partitionUnion()) } yyVAL.union = yyLOCAL - case 1631: + case 1649: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Partition -//line mysql_sql.y:11367 +//line mysql_sql.y:11409 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Values = yyDollar[3].valuesUnion() @@ -29502,10 +29711,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1632: + case 1650: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Partition -//line mysql_sql.y:11380 +//line mysql_sql.y:11422 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Values = yyDollar[3].valuesUnion() @@ -29519,42 +29728,42 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1633: + case 1651: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:11394 +//line mysql_sql.y:11436 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1634: + case 1652: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:11398 +//line mysql_sql.y:11440 { yyLOCAL = yyDollar[2].subPartitionsUnion() } yyVAL.union = yyLOCAL - case 1635: + case 1653: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:11404 +//line mysql_sql.y:11446 { yyLOCAL = []*tree.SubPartition{yyDollar[1].subPartitionUnion()} } yyVAL.union = yyLOCAL - case 1636: + case 1654: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:11408 +//line mysql_sql.y:11450 { yyLOCAL = append(yyDollar[1].subPartitionsUnion(), yyDollar[3].subPartitionUnion()) } yyVAL.union = yyLOCAL - case 1637: + case 1655: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.SubPartition -//line mysql_sql.y:11414 +//line mysql_sql.y:11456 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Options []tree.TableOption @@ -29564,10 +29773,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1638: + case 1656: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.SubPartition -//line mysql_sql.y:11423 +//line mysql_sql.y:11465 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Options = yyDollar[3].tableOptionsUnion() @@ -29577,26 +29786,26 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1639: + case 1657: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11434 +//line mysql_sql.y:11476 { yyLOCAL = []tree.TableOption{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 1640: + case 1658: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11438 +//line mysql_sql.y:11480 { yyLOCAL = append(yyDollar[1].tableOptionsUnion(), yyDollar[2].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 1641: + case 1659: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11444 +//line mysql_sql.y:11486 { if option, ok := yyDollar[1].tableOptionUnion().(*tree.TableOptionAutoIDCache); ok { option.Free() @@ -29606,37 +29815,37 @@ yydefault: yyLOCAL = yyDollar[1].tableOptionUnion() } yyVAL.union = yyLOCAL - case 1642: + case 1660: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:11454 +//line mysql_sql.y:11496 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1643: + case 1661: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:11458 +//line mysql_sql.y:11500 { expr := tree.NewMaxValue() var valueList = tree.Exprs{expr} yyLOCAL = tree.NewValuesLessThan(valueList) } yyVAL.union = yyLOCAL - case 1644: + case 1662: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:11464 +//line mysql_sql.y:11506 { var valueList = yyDollar[5].exprsUnion() yyLOCAL = tree.NewValuesLessThan(valueList) } yyVAL.union = yyLOCAL - case 1645: + case 1663: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:11469 +//line mysql_sql.y:11511 { var valueList = yyDollar[4].exprsUnion() yyLOCAL = tree.NewValuesIn( @@ -29644,18 +29853,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1646: + case 1664: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11477 +//line mysql_sql.y:11519 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1647: + case 1665: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11481 +//line mysql_sql.y:11523 { res, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -29668,18 +29877,18 @@ yydefault: yyLOCAL = res } yyVAL.union = yyLOCAL - case 1648: + case 1666: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11492 +//line mysql_sql.y:11534 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1649: + case 1667: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11496 +//line mysql_sql.y:11538 { res, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -29692,10 +29901,10 @@ yydefault: yyLOCAL = res } yyVAL.union = yyLOCAL - case 1650: + case 1668: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11508 +//line mysql_sql.y:11550 { rangeTyp := tree.NewRangeType() rangeTyp.Expr = yyDollar[3].exprUnion() @@ -29704,10 +29913,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1651: + case 1669: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11516 +//line mysql_sql.y:11558 { rangeTyp := tree.NewRangeType() rangeTyp.ColumnList = yyDollar[4].unresolveNamesUnion() @@ -29716,10 +29925,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1652: + case 1670: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11524 +//line mysql_sql.y:11566 { listTyp := tree.NewListType() listTyp.Expr = yyDollar[3].exprUnion() @@ -29728,10 +29937,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1653: + case 1671: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11532 +//line mysql_sql.y:11574 { listTyp := tree.NewListType() listTyp.ColumnList = yyDollar[4].unresolveNamesUnion() @@ -29740,10 +29949,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1655: + case 1673: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11543 +//line mysql_sql.y:11585 { keyTyp := tree.NewKeyType() keyTyp.Linear = yyDollar[1].boolValUnion() @@ -29753,10 +29962,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1656: + case 1674: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11552 +//line mysql_sql.y:11594 { keyTyp := tree.NewKeyType() keyTyp.Linear = yyDollar[1].boolValUnion() @@ -29767,10 +29976,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1657: + case 1675: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11562 +//line mysql_sql.y:11604 { Linear := yyDollar[1].boolValUnion() Expr := yyDollar[4].exprUnion() @@ -29780,18 +29989,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1658: + case 1676: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11572 +//line mysql_sql.y:11614 { yyLOCAL = 2 } yyVAL.union = yyLOCAL - case 1659: + case 1677: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11576 +//line mysql_sql.y:11618 { value, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -29800,551 +30009,551 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 1660: + case 1678: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11583 +//line mysql_sql.y:11625 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1661: + case 1679: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11587 +//line mysql_sql.y:11629 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1662: + case 1680: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.IcebergTableParam -//line mysql_sql.y:11593 +//line mysql_sql.y:11635 { yyLOCAL = tree.NewIcebergTableParam(yyDollar[4].icebergOptionsUnion()) } yyVAL.union = yyLOCAL - case 1663: + case 1681: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IcebergOptions -//line mysql_sql.y:11598 +//line mysql_sql.y:11640 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1664: + case 1682: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.IcebergOptions -//line mysql_sql.y:11602 +//line mysql_sql.y:11644 { yyLOCAL = yyDollar[3].icebergOptionsUnion() } yyVAL.union = yyLOCAL - case 1665: + case 1683: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IcebergOptions -//line mysql_sql.y:11608 +//line mysql_sql.y:11650 { yyLOCAL = tree.IcebergOptions{yyDollar[1].icebergOptionUnion()} } yyVAL.union = yyLOCAL - case 1666: + case 1684: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IcebergOptions -//line mysql_sql.y:11612 +//line mysql_sql.y:11654 { yyLOCAL = append(yyDollar[1].icebergOptionsUnion(), yyDollar[3].icebergOptionUnion()) } yyVAL.union = yyLOCAL - case 1667: + case 1685: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IcebergOption -//line mysql_sql.y:11618 +//line mysql_sql.y:11660 { yyLOCAL = tree.NewIcebergOption(tree.Identifier(yyDollar[1].str), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1668: + case 1686: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11624 +//line mysql_sql.y:11666 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1669: + case 1687: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11628 +//line mysql_sql.y:11670 { yyVAL.str = yyDollar[1].str } - case 1670: + case 1688: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11634 +//line mysql_sql.y:11676 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1671: + case 1689: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11638 +//line mysql_sql.y:11680 { yyVAL.str = yyDollar[1].str } - case 1672: + case 1690: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.MongoDBTableParam -//line mysql_sql.y:11644 +//line mysql_sql.y:11686 { yyLOCAL = tree.NewMongoDBTableParam(yyDollar[4].mongodbOptionsUnion()) } yyVAL.union = yyLOCAL - case 1673: + case 1691: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.MongoDBOptions -//line mysql_sql.y:11649 +//line mysql_sql.y:11691 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1674: + case 1692: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.MongoDBOptions -//line mysql_sql.y:11653 +//line mysql_sql.y:11695 { yyLOCAL = yyDollar[3].mongodbOptionsUnion() } yyVAL.union = yyLOCAL - case 1675: + case 1693: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.MongoDBOptions -//line mysql_sql.y:11659 +//line mysql_sql.y:11701 { yyLOCAL = tree.MongoDBOptions{yyDollar[1].mongodbOptionUnion()} } yyVAL.union = yyLOCAL - case 1676: + case 1694: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.MongoDBOptions -//line mysql_sql.y:11663 +//line mysql_sql.y:11705 { yyLOCAL = append(yyDollar[1].mongodbOptionsUnion(), yyDollar[3].mongodbOptionUnion()) } yyVAL.union = yyLOCAL - case 1677: + case 1695: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.MongoDBOption -//line mysql_sql.y:11669 +//line mysql_sql.y:11711 { yyLOCAL = tree.NewMongoDBOption(tree.Identifier(yyDollar[1].str), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1678: + case 1696: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11675 +//line mysql_sql.y:11717 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1679: + case 1697: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11679 +//line mysql_sql.y:11721 { yyVAL.str = yyDollar[1].str } - case 1680: + case 1698: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11685 +//line mysql_sql.y:11727 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1681: + case 1699: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11689 +//line mysql_sql.y:11731 { yyVAL.str = yyDollar[1].str } - case 1682: + case 1700: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.DataStreamTableParam -//line mysql_sql.y:11695 +//line mysql_sql.y:11737 { yyLOCAL = tree.NewDataStreamTableParam(yyDollar[4].datastreamOptionsUnion()) } yyVAL.union = yyLOCAL - case 1683: + case 1701: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.DataStreamOptions -//line mysql_sql.y:11700 +//line mysql_sql.y:11742 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1684: + case 1702: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.DataStreamOptions -//line mysql_sql.y:11704 +//line mysql_sql.y:11746 { yyLOCAL = yyDollar[3].datastreamOptionsUnion() } yyVAL.union = yyLOCAL - case 1685: + case 1703: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.DataStreamOptions -//line mysql_sql.y:11710 +//line mysql_sql.y:11752 { yyLOCAL = tree.DataStreamOptions{yyDollar[1].datastreamOptionUnion()} } yyVAL.union = yyLOCAL - case 1686: + case 1704: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.DataStreamOptions -//line mysql_sql.y:11714 +//line mysql_sql.y:11756 { yyLOCAL = append(yyDollar[1].datastreamOptionsUnion(), yyDollar[3].datastreamOptionUnion()) } yyVAL.union = yyLOCAL - case 1687: + case 1705: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DataStreamOption -//line mysql_sql.y:11720 +//line mysql_sql.y:11762 { yyLOCAL = tree.NewDataStreamOption(tree.Identifier(yyDollar[1].str), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1688: + case 1706: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.ForeignTableParam -//line mysql_sql.y:11726 +//line mysql_sql.y:11768 { yyLOCAL = tree.NewForeignTableParam(yyDollar[3].str, yyDollar[4].foreignTableOptionsUnion()) } yyVAL.union = yyLOCAL - case 1689: + case 1707: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.KafkaTableParam -//line mysql_sql.y:11732 +//line mysql_sql.y:11774 { yyLOCAL = tree.NewKafkaTableParam(yyDollar[4].kafkaTableOptionsUnion()) } yyVAL.union = yyLOCAL - case 1690: + case 1708: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.KafkaTableOptions -//line mysql_sql.y:11737 +//line mysql_sql.y:11779 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1691: + case 1709: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.KafkaTableOptions -//line mysql_sql.y:11741 +//line mysql_sql.y:11783 { yyLOCAL = yyDollar[3].kafkaTableOptionsUnion() } yyVAL.union = yyLOCAL - case 1692: + case 1710: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.KafkaTableOptions -//line mysql_sql.y:11747 +//line mysql_sql.y:11789 { yyLOCAL = tree.KafkaTableOptions{yyDollar[1].kafkaTableOptionUnion()} } yyVAL.union = yyLOCAL - case 1693: + case 1711: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.KafkaTableOptions -//line mysql_sql.y:11751 +//line mysql_sql.y:11793 { yyLOCAL = append(yyDollar[1].kafkaTableOptionsUnion(), yyDollar[3].kafkaTableOptionUnion()) } yyVAL.union = yyLOCAL - case 1694: + case 1712: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.KafkaTableOption -//line mysql_sql.y:11757 +//line mysql_sql.y:11799 { yyLOCAL = tree.NewKafkaTableOption(tree.Identifier(yyDollar[1].str), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1695: + case 1713: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11763 +//line mysql_sql.y:11805 { yyVAL.str = "esql" } - case 1696: + case 1714: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11767 +//line mysql_sql.y:11809 { yyVAL.str = "sql" } - case 1697: + case 1715: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.ForeignTableOptions -//line mysql_sql.y:11772 +//line mysql_sql.y:11814 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1698: + case 1716: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.ForeignTableOptions -//line mysql_sql.y:11776 +//line mysql_sql.y:11818 { yyLOCAL = yyDollar[3].foreignTableOptionsUnion() } yyVAL.union = yyLOCAL - case 1699: + case 1717: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ForeignTableOptions -//line mysql_sql.y:11782 +//line mysql_sql.y:11824 { yyLOCAL = tree.ForeignTableOptions{yyDollar[1].foreignTableOptionUnion()} } yyVAL.union = yyLOCAL - case 1700: + case 1718: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ForeignTableOptions -//line mysql_sql.y:11786 +//line mysql_sql.y:11828 { yyLOCAL = append(yyDollar[1].foreignTableOptionsUnion(), yyDollar[3].foreignTableOptionUnion()) } yyVAL.union = yyLOCAL - case 1701: + case 1719: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ForeignTableOption -//line mysql_sql.y:11792 +//line mysql_sql.y:11834 { yyLOCAL = tree.NewForeignTableOption(tree.Identifier(yyDollar[1].str), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1702: + case 1720: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11798 +//line mysql_sql.y:11840 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1703: + case 1721: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11802 +//line mysql_sql.y:11844 { yyVAL.str = yyDollar[1].str } - case 1704: + case 1722: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11808 +//line mysql_sql.y:11850 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1705: + case 1723: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11812 +//line mysql_sql.y:11854 { yyVAL.str = yyDollar[1].str } - case 1706: + case 1724: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11817 +//line mysql_sql.y:11859 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1707: + case 1725: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11821 +//line mysql_sql.y:11863 { yyLOCAL = yyDollar[1].tableOptionsUnion() } yyVAL.union = yyLOCAL - case 1708: + case 1726: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11827 +//line mysql_sql.y:11869 { yyLOCAL = []tree.TableOption{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 1709: + case 1727: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11831 +//line mysql_sql.y:11873 { yyLOCAL = append(yyDollar[1].tableOptionsUnion(), yyDollar[3].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 1710: + case 1728: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11835 +//line mysql_sql.y:11877 { yyLOCAL = append(yyDollar[1].tableOptionsUnion(), yyDollar[2].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 1711: + case 1729: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11841 +//line mysql_sql.y:11883 { yyLOCAL = tree.NewTableOptionAUTOEXTEND_SIZE(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1712: + case 1730: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11845 +//line mysql_sql.y:11887 { yyLOCAL = tree.NewTableOptionAutoIncrement(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1713: + case 1731: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11849 +//line mysql_sql.y:11891 { yyLOCAL = tree.NewTableOptionAutoIDCache(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1714: + case 1732: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11853 +//line mysql_sql.y:11895 { yyLOCAL = tree.NewTableOptionAvgRowLength(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1715: + case 1733: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11857 +//line mysql_sql.y:11899 { yyLOCAL = tree.NewTableOptionCharset(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1716: + case 1734: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11861 +//line mysql_sql.y:11903 { yyLOCAL = tree.NewTableOptionCollate(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1717: + case 1735: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11865 +//line mysql_sql.y:11907 { yyLOCAL = tree.NewTableOptionChecksum(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1718: + case 1736: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11869 +//line mysql_sql.y:11911 { str := util.DealCommentString(yyDollar[3].str) yyLOCAL = tree.NewTableOptionComment(str) } yyVAL.union = yyLOCAL - case 1719: + case 1737: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11874 +//line mysql_sql.y:11916 { yyLOCAL = tree.NewTableOptionCompression(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1720: + case 1738: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11878 +//line mysql_sql.y:11920 { yyLOCAL = tree.NewTableOptionConnection(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1721: + case 1739: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11882 +//line mysql_sql.y:11924 { yyLOCAL = tree.NewTableOptionDataDirectory(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1722: + case 1740: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11886 +//line mysql_sql.y:11928 { yyLOCAL = tree.NewTableOptionIndexDirectory(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1723: + case 1741: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11890 +//line mysql_sql.y:11932 { yyLOCAL = tree.NewTableOptionDelayKeyWrite(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1724: + case 1742: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11894 +//line mysql_sql.y:11936 { yyLOCAL = tree.NewTableOptionEncryption(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1725: + case 1743: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11898 +//line mysql_sql.y:11940 { yyLOCAL = tree.NewTableOptionEngine(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1726: + case 1744: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11902 +//line mysql_sql.y:11944 { yyLOCAL = tree.NewTableOptionEngineAttr(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1727: + case 1745: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11906 +//line mysql_sql.y:11948 { yyLOCAL = tree.NewTableOptionInsertMethod(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1728: + case 1746: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11910 +//line mysql_sql.y:11952 { yyLOCAL = tree.NewTableOptionKeyBlockSize(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1729: + case 1747: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11914 +//line mysql_sql.y:11956 { yyLOCAL = tree.NewTableOptionMaxRows(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1730: + case 1748: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11918 +//line mysql_sql.y:11960 { yyLOCAL = tree.NewTableOptionMinRows(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1731: + case 1749: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11922 +//line mysql_sql.y:11964 { t := tree.NewTableOptionPackKeys() value, ok := signedIntegral(yylex, yyDollar[3].item) @@ -30355,161 +30564,161 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1732: + case 1750: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11930 +//line mysql_sql.y:11972 { t := tree.NewTableOptionPackKeys() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1733: + case 1751: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11936 +//line mysql_sql.y:11978 { yyLOCAL = tree.NewTableOptionPassword(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1734: + case 1752: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11940 +//line mysql_sql.y:11982 { yyLOCAL = tree.NewTableOptionRowFormat(yyDollar[3].rowFormatTypeUnion()) } yyVAL.union = yyLOCAL - case 1735: + case 1753: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11944 +//line mysql_sql.y:11986 { yyLOCAL = tree.NewTTableOptionStartTrans(true) } yyVAL.union = yyLOCAL - case 1736: + case 1754: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11948 +//line mysql_sql.y:11990 { yyLOCAL = tree.NewTTableOptionSecondaryEngineAttr(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1737: + case 1755: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11952 +//line mysql_sql.y:11994 { t := tree.NewTableOptionStatsAutoRecalc() t.Value = integralToUint64(yyDollar[3].item) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1738: + case 1756: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11958 +//line mysql_sql.y:12000 { t := tree.NewTableOptionStatsAutoRecalc() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1739: + case 1757: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11964 +//line mysql_sql.y:12006 { t := tree.NewTableOptionStatsPersistent() t.Value = integralToUint64(yyDollar[3].item) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1740: + case 1758: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11970 +//line mysql_sql.y:12012 { t := tree.NewTableOptionStatsPersistent() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1741: + case 1759: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11976 +//line mysql_sql.y:12018 { t := tree.NewTableOptionStatsSamplePages() t.Value = integralToUint64(yyDollar[3].item) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1742: + case 1760: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11982 +//line mysql_sql.y:12024 { t := tree.NewTableOptionStatsSamplePages() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1743: + case 1761: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11988 +//line mysql_sql.y:12030 { yyLOCAL = tree.NewTableOptionTablespace(yyDollar[3].cstrUnion().Compare(), "") } yyVAL.union = yyLOCAL - case 1744: + case 1762: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11992 +//line mysql_sql.y:12034 { yyLOCAL = tree.NewTableOptionTablespace("", yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1745: + case 1763: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11996 +//line mysql_sql.y:12038 { yyLOCAL = tree.NewTableOptionUnion(yyDollar[4].tableNamesUnion()) } yyVAL.union = yyLOCAL - case 1746: + case 1764: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:12000 +//line mysql_sql.y:12042 { var Preperties = yyDollar[3].propertiesUnion() yyLOCAL = tree.NewTableOptionProperties(Preperties) } yyVAL.union = yyLOCAL - case 1747: + case 1765: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.Property -//line mysql_sql.y:12007 +//line mysql_sql.y:12049 { yyLOCAL = []tree.Property{yyDollar[1].propertyUnion()} } yyVAL.union = yyLOCAL - case 1748: + case 1766: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Property -//line mysql_sql.y:12011 +//line mysql_sql.y:12053 { yyLOCAL = append(yyDollar[1].propertiesUnion(), yyDollar[3].propertyUnion()) } yyVAL.union = yyLOCAL - case 1749: + case 1767: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Property -//line mysql_sql.y:12017 +//line mysql_sql.y:12059 { var Key = yyDollar[1].str var Value = yyDollar[3].str @@ -30519,86 +30728,86 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1750: + case 1768: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:12028 +//line mysql_sql.y:12070 { yyVAL.str = " " + yyDollar[1].str + " " + yyDollar[2].str } - case 1751: + case 1769: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:12032 +//line mysql_sql.y:12074 { yyVAL.str = " " + yyDollar[1].str + " " + yyDollar[2].str } - case 1752: + case 1770: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12038 +//line mysql_sql.y:12080 { yyLOCAL = tree.ROW_FORMAT_DEFAULT } yyVAL.union = yyLOCAL - case 1753: + case 1771: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12042 +//line mysql_sql.y:12084 { yyLOCAL = tree.ROW_FORMAT_DYNAMIC } yyVAL.union = yyLOCAL - case 1754: + case 1772: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12046 +//line mysql_sql.y:12088 { yyLOCAL = tree.ROW_FORMAT_FIXED } yyVAL.union = yyLOCAL - case 1755: + case 1773: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12050 +//line mysql_sql.y:12092 { yyLOCAL = tree.ROW_FORMAT_COMPRESSED } yyVAL.union = yyLOCAL - case 1756: + case 1774: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12054 +//line mysql_sql.y:12096 { yyLOCAL = tree.ROW_FORMAT_REDUNDANT } yyVAL.union = yyLOCAL - case 1757: + case 1775: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12058 +//line mysql_sql.y:12100 { yyLOCAL = tree.ROW_FORMAT_COMPACT } yyVAL.union = yyLOCAL - case 1762: + case 1780: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableNames -//line mysql_sql.y:12072 +//line mysql_sql.y:12114 { yyLOCAL = tree.TableNames{yyDollar[1].tableNameUnion()} } yyVAL.union = yyLOCAL - case 1763: + case 1781: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableNames -//line mysql_sql.y:12076 +//line mysql_sql.y:12118 { yyLOCAL = append(yyDollar[1].tableNamesUnion(), yyDollar[3].tableNameUnion()) } yyVAL.union = yyLOCAL - case 1764: + case 1782: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.TableName -//line mysql_sql.y:12085 +//line mysql_sql.y:12127 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) prefix := tree.ObjectNamePrefix{ExplicitSchema: false} @@ -30606,10 +30815,10 @@ yydefault: yyLOCAL.IcebergRef = yyDollar[3].icebergRefSpecUnion() } yyVAL.union = yyLOCAL - case 1765: + case 1783: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.TableName -//line mysql_sql.y:12092 +//line mysql_sql.y:12134 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) @@ -30618,85 +30827,85 @@ yydefault: yyLOCAL.IcebergRef = yyDollar[5].icebergRefSpecUnion() } yyVAL.union = yyLOCAL - case 1766: + case 1784: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12101 +//line mysql_sql.y:12143 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1767: + case 1785: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12105 +//line mysql_sql.y:12147 { raw := fmt.Sprintf("%v", yyDollar[3].item) yyLOCAL = tree.NewIcebergSnapshotRef(tree.NewNumVal(raw, raw, false, tree.P_int64)) } yyVAL.union = yyLOCAL - case 1768: + case 1786: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12110 +//line mysql_sql.y:12152 { yyLOCAL = tree.NewIcebergSnapshotRef(tree.NewNumVal(yyDollar[3].str, yyDollar[3].str, false, tree.P_char)) } yyVAL.union = yyLOCAL - case 1769: + case 1787: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12114 +//line mysql_sql.y:12156 { yyLOCAL = tree.NewIcebergTimestampRef(tree.NewNumVal(yyDollar[6].str, yyDollar[6].str, false, tree.P_char)) } yyVAL.union = yyLOCAL - case 1770: + case 1788: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12118 +//line mysql_sql.y:12160 { yyLOCAL = tree.NewIcebergTimestampRef(tree.NewNumVal(yyDollar[5].str, yyDollar[5].str, false, tree.P_char)) } yyVAL.union = yyLOCAL - case 1771: + case 1789: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12122 +//line mysql_sql.y:12164 { yyLOCAL = tree.NewIcebergNamedRef(tree.Identifier(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 1772: + case 1790: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12128 +//line mysql_sql.y:12170 { yyVAL.str = yyDollar[1].str } - case 1773: + case 1791: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12132 +//line mysql_sql.y:12174 { yyVAL.str = yyDollar[1].str } - case 1774: + case 1792: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12136 +//line mysql_sql.y:12178 { yyVAL.str = yyDollar[1].str } - case 1775: + case 1793: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12141 +//line mysql_sql.y:12183 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1776: + case 1794: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12145 +//line mysql_sql.y:12187 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ATTIMESTAMPTIME, @@ -30704,10 +30913,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1777: + case 1795: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12152 +//line mysql_sql.y:12194 { var str = yyDollar[4].cstrUnion().Compare() yyLOCAL = &tree.AtTimeStamp{ @@ -30717,10 +30926,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1778: + case 1796: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12161 +//line mysql_sql.y:12203 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ATTIMESTAMPSNAPSHOT, @@ -30729,10 +30938,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1779: + case 1797: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12169 +//line mysql_sql.y:12211 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ATMOTIMESTAMP, @@ -30740,10 +30949,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1780: + case 1798: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12176 +//line mysql_sql.y:12218 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ASOFTIMESTAMP, @@ -30751,74 +30960,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1781: + case 1799: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.TableDefs -//line mysql_sql.y:12184 +//line mysql_sql.y:12226 { yyLOCAL = tree.TableDefs(nil) } yyVAL.union = yyLOCAL - case 1783: + case 1801: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDefs -//line mysql_sql.y:12191 +//line mysql_sql.y:12233 { yyLOCAL = tree.TableDefs{yyDollar[1].tableDefUnion()} } yyVAL.union = yyLOCAL - case 1784: + case 1802: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableDefs -//line mysql_sql.y:12195 +//line mysql_sql.y:12237 { yyLOCAL = append(yyDollar[1].tableDefsUnion(), yyDollar[3].tableDefUnion()) } yyVAL.union = yyLOCAL - case 1785: + case 1803: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12201 +//line mysql_sql.y:12243 { yyLOCAL = tree.TableDef(yyDollar[1].columnTableDefUnion()) } yyVAL.union = yyLOCAL - case 1786: + case 1804: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12205 +//line mysql_sql.y:12247 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1787: + case 1805: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12209 +//line mysql_sql.y:12251 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1788: + case 1806: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12215 +//line mysql_sql.y:12257 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1789: + case 1807: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12219 +//line mysql_sql.y:12261 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1790: + case 1808: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12225 +//line mysql_sql.y:12267 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].str @@ -30832,10 +31041,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1791: + case 1809: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12238 +//line mysql_sql.y:12280 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].str @@ -30849,10 +31058,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1792: + case 1810: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12251 +//line mysql_sql.y:12293 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].str @@ -30868,10 +31077,10 @@ yydefault: yyLOCAL = fti } yyVAL.union = yyLOCAL - case 1793: + case 1811: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12266 +//line mysql_sql.y:12308 { keyTyp := tree.INDEX_TYPE_INVALID if yyDollar[3].strsUnion()[1] != "" { @@ -30917,10 +31126,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1794: + case 1812: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12311 +//line mysql_sql.y:12353 { keyTyp := tree.INDEX_TYPE_INVALID if yyDollar[3].strsUnion()[1] != "" { @@ -30965,10 +31174,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1795: + case 1813: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12356 +//line mysql_sql.y:12398 { if yyDollar[1].str != "" { switch v := yyDollar[2].tableDefUnion().(type) { @@ -30985,18 +31194,18 @@ yydefault: yyLOCAL = yyDollar[2].tableDefUnion() } yyVAL.union = yyLOCAL - case 1796: + case 1814: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12371 +//line mysql_sql.y:12413 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1797: + case 1815: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12377 +//line mysql_sql.y:12419 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -31010,10 +31219,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1798: + case 1816: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12390 +//line mysql_sql.y:12432 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -31027,10 +31236,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1799: + case 1817: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12403 +//line mysql_sql.y:12445 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -31044,10 +31253,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1800: + case 1818: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12416 +//line mysql_sql.y:12458 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -31061,10 +31270,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1801: + case 1819: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12429 +//line mysql_sql.y:12471 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var KeyParts = yyDollar[6].keyPartsUnion() @@ -31080,10 +31289,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1802: + case 1820: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12444 +//line mysql_sql.y:12486 { var Expr = yyDollar[3].exprUnion() var Enforced = yyDollar[5].boolValUnion() @@ -31093,107 +31302,107 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1803: + case 1821: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12454 +//line mysql_sql.y:12496 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1805: + case 1823: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:12460 +//line mysql_sql.y:12502 { yyVAL.str = "" } - case 1806: + case 1824: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12464 +//line mysql_sql.y:12506 { yyVAL.str = yyDollar[1].str } - case 1809: + case 1827: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:12474 +//line mysql_sql.y:12516 { yyLOCAL = make([]string, 2) yyLOCAL[0] = yyDollar[1].str yyLOCAL[1] = "" } yyVAL.union = yyLOCAL - case 1810: + case 1828: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:12480 +//line mysql_sql.y:12522 { yyLOCAL = make([]string, 2) yyLOCAL[0] = yyDollar[1].str yyLOCAL[1] = yyDollar[3].str } yyVAL.union = yyLOCAL - case 1811: + case 1829: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:12486 +//line mysql_sql.y:12528 { yyLOCAL = make([]string, 2) yyLOCAL[0] = yyDollar[1].cstrUnion().Origin() yyLOCAL[1] = yyDollar[3].str } yyVAL.union = yyLOCAL - case 1826: + case 1844: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:12511 +//line mysql_sql.y:12553 { yyVAL.str = "" } - case 1827: + case 1845: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12515 +//line mysql_sql.y:12557 { yyVAL.str = yyDollar[1].cstrUnion().Origin() } - case 1828: + case 1846: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ColumnTableDef -//line mysql_sql.y:12521 +//line mysql_sql.y:12563 { yyLOCAL = tree.NewColumnTableDef(yyDollar[1].unresolvedNameUnion(), yyDollar[2].columnTypeUnion(), yyDollar[3].columnAttributesUnion()) } yyVAL.union = yyLOCAL - case 1829: + case 1847: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12527 +//line mysql_sql.y:12569 { yyLOCAL = tree.NewUnresolvedName(yyDollar[1].cstrUnion()) } yyVAL.union = yyLOCAL - case 1830: + case 1848: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12531 +//line mysql_sql.y:12573 { tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(tblNameCStr, yyDollar[3].cstrUnion()) } yyVAL.union = yyLOCAL - case 1831: + case 1849: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12536 +//line mysql_sql.y:12578 { dbNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(dbNameCStr, tblNameCStr, yyDollar[5].cstrUnion()) } yyVAL.union = yyLOCAL - case 1832: + case 1850: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:12544 +//line mysql_sql.y:12586 { if rejectSQLModeReservedFunctionName(yylex, yyDollar[1].str) { goto ret1 @@ -31201,18 +31410,18 @@ yydefault: yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1833: + case 1851: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:12548 +//line mysql_sql.y:12590 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1834: + case 1852: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:12552 +//line mysql_sql.y:12594 { if rejectSQLModeReservedFunctionName(yylex, yyDollar[1].str) { goto ret1 @@ -31220,10 +31429,10 @@ yydefault: yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1835: + case 1853: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:12556 +//line mysql_sql.y:12598 { if rejectSQLModeReservedFunctionName(yylex, yyDollar[1].str) { goto ret1 @@ -31231,222 +31440,222 @@ yydefault: yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1836: + case 1854: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:12562 +//line mysql_sql.y:12604 { yyLOCAL = yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) } yyVAL.union = yyLOCAL - case 1837: + case 1855: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12568 +//line mysql_sql.y:12610 { yyLOCAL = tree.NewUnresolvedName(yyDollar[1].cstrUnion()) } yyVAL.union = yyLOCAL - case 1838: + case 1856: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12572 +//line mysql_sql.y:12614 { tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(tblNameCStr, yyDollar[3].cstrUnion()) } yyVAL.union = yyLOCAL - case 1839: + case 1857: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12577 +//line mysql_sql.y:12619 { dbNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(dbNameCStr, tblNameCStr, yyDollar[5].cstrUnion()) } yyVAL.union = yyLOCAL - case 1840: + case 1858: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:12584 +//line mysql_sql.y:12626 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1841: + case 1859: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:12588 +//line mysql_sql.y:12630 { yyLOCAL = yyDollar[1].columnAttributesUnion() } yyVAL.union = yyLOCAL - case 1842: + case 1860: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:12594 +//line mysql_sql.y:12636 { yyLOCAL = []tree.ColumnAttribute{yyDollar[1].columnAttributeUnion()} } yyVAL.union = yyLOCAL - case 1843: + case 1861: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:12598 +//line mysql_sql.y:12640 { yyLOCAL = append(yyDollar[1].columnAttributesUnion(), yyDollar[2].columnAttributeUnion()) } yyVAL.union = yyLOCAL - case 1844: + case 1862: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12604 +//line mysql_sql.y:12646 { yyLOCAL = tree.NewAttributeNull(true) } yyVAL.union = yyLOCAL - case 1845: + case 1863: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12608 +//line mysql_sql.y:12650 { yyLOCAL = tree.NewAttributeNull(false) } yyVAL.union = yyLOCAL - case 1846: + case 1864: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12612 +//line mysql_sql.y:12654 { yyLOCAL = tree.NewAttributeNull(false) } yyVAL.union = yyLOCAL - case 1847: + case 1865: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12616 +//line mysql_sql.y:12658 { yyLOCAL = tree.NewAttributeDefault(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1848: + case 1866: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12620 +//line mysql_sql.y:12662 { yyLOCAL = tree.NewAttributeAutoIncrement() } yyVAL.union = yyLOCAL - case 1849: + case 1867: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12624 +//line mysql_sql.y:12666 { yyLOCAL = yyDollar[1].columnAttributeUnion() } yyVAL.union = yyLOCAL - case 1850: + case 1868: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12628 +//line mysql_sql.y:12670 { str := util.DealCommentString(yyDollar[2].str) yyLOCAL = tree.NewAttributeComment(tree.NewNumVal(str, str, false, tree.P_char)) } yyVAL.union = yyLOCAL - case 1851: + case 1869: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12633 +//line mysql_sql.y:12675 { yyLOCAL = tree.NewAttributeMongoDBPath(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1852: + case 1870: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12637 +//line mysql_sql.y:12679 { yyLOCAL = tree.NewAttributeMongoDBConvert(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1853: + case 1871: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12641 +//line mysql_sql.y:12683 { yyLOCAL = tree.NewAttributeCollate(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1854: + case 1872: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12645 +//line mysql_sql.y:12687 { yyLOCAL = tree.NewAttributeColumnFormat(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1855: + case 1873: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12649 +//line mysql_sql.y:12691 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1856: + case 1874: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12653 +//line mysql_sql.y:12695 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1857: + case 1875: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12657 +//line mysql_sql.y:12699 { yyLOCAL = tree.NewAttributeStorage(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1858: + case 1876: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12661 +//line mysql_sql.y:12703 { yyLOCAL = tree.NewAttributeAutoRandom(int(yyDollar[2].int64ValUnion())) } yyVAL.union = yyLOCAL - case 1859: + case 1877: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12665 +//line mysql_sql.y:12707 { yyLOCAL = yyDollar[1].attributeReferenceUnion() } yyVAL.union = yyLOCAL - case 1860: + case 1878: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12669 +//line mysql_sql.y:12711 { yyLOCAL = tree.NewAttributeCheckConstraint(yyDollar[4].exprUnion(), true, yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1861: + case 1879: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12673 +//line mysql_sql.y:12715 { yyLOCAL = tree.NewAttributeCheckConstraint(yyDollar[4].exprUnion(), yyDollar[6].boolValUnion(), yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1862: + case 1880: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12677 +//line mysql_sql.y:12719 { name := tree.NewUnresolvedColName(yyDollar[3].str) var es tree.Exprs = nil @@ -31461,10 +31670,10 @@ yydefault: yyLOCAL = tree.NewAttributeOnUpdate(expr) } yyVAL.union = yyLOCAL - case 1863: + case 1881: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12691 +//line mysql_sql.y:12733 { v, errStr := util.GetInt64(yyDollar[2].item) if errStr != "" { @@ -31478,130 +31687,130 @@ yydefault: yyLOCAL = tree.NewAttributeSRID(uint32(v)) } yyVAL.union = yyLOCAL - case 1864: + case 1882: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12704 +//line mysql_sql.y:12746 { yyLOCAL = tree.NewAttributeLowCardinality() } yyVAL.union = yyLOCAL - case 1865: + case 1883: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12708 +//line mysql_sql.y:12750 { yyLOCAL = tree.NewAttributeVisable(true) } yyVAL.union = yyLOCAL - case 1866: + case 1884: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12712 +//line mysql_sql.y:12754 { yyLOCAL = tree.NewAttributeVisable(false) } yyVAL.union = yyLOCAL - case 1867: + case 1885: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12716 +//line mysql_sql.y:12758 { yyLOCAL = tree.NewAttributeCharset(yyDollar[5].str) } yyVAL.union = yyLOCAL - case 1868: + case 1886: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12720 +//line mysql_sql.y:12762 { yyLOCAL = tree.NewAttributeGeneratedAlways(yyDollar[5].exprUnion(), yyDollar[7].boolValUnion()) } yyVAL.union = yyLOCAL - case 1869: + case 1887: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12724 +//line mysql_sql.y:12766 { yyLOCAL = tree.NewAttributeGeneratedAlways(yyDollar[3].exprUnion(), yyDollar[5].boolValUnion()) } yyVAL.union = yyLOCAL - case 1870: + case 1888: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12729 +//line mysql_sql.y:12771 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1871: + case 1889: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12733 +//line mysql_sql.y:12775 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1872: + case 1890: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12737 +//line mysql_sql.y:12779 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1873: + case 1891: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12743 +//line mysql_sql.y:12785 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1874: + case 1892: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12747 +//line mysql_sql.y:12789 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1875: + case 1893: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12751 +//line mysql_sql.y:12793 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1876: + case 1894: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:12756 +//line mysql_sql.y:12798 { yyVAL.str = "" } - case 1877: + case 1895: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12760 +//line mysql_sql.y:12802 { yyVAL.str = yyDollar[1].str } - case 1878: + case 1896: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12766 +//line mysql_sql.y:12808 { yyVAL.str = "" } - case 1879: + case 1897: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:12770 +//line mysql_sql.y:12812 { yyVAL.str = yyDollar[2].cstrUnion().Compare() } - case 1880: + case 1898: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AttributeReference -//line mysql_sql.y:12776 +//line mysql_sql.y:12818 { var TableName = yyDollar[2].tableNameUnion() var KeyParts = yyDollar[3].keyPartsUnion() @@ -31617,10 +31826,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1881: + case 1899: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:12793 +//line mysql_sql.y:12835 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: tree.REFERENCE_OPTION_INVALID, @@ -31628,10 +31837,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1882: + case 1900: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:12800 +//line mysql_sql.y:12842 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: yyDollar[1].referenceOptionTypeUnion(), @@ -31639,10 +31848,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1883: + case 1901: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:12807 +//line mysql_sql.y:12849 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: tree.REFERENCE_OPTION_INVALID, @@ -31650,10 +31859,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1884: + case 1902: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:12814 +//line mysql_sql.y:12856 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: yyDollar[1].referenceOptionTypeUnion(), @@ -31661,10 +31870,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1885: + case 1903: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:12821 +//line mysql_sql.y:12863 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: yyDollar[2].referenceOptionTypeUnion(), @@ -31672,170 +31881,170 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1886: + case 1904: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12830 +//line mysql_sql.y:12872 { yyLOCAL = yyDollar[3].referenceOptionTypeUnion() } yyVAL.union = yyLOCAL - case 1887: + case 1905: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12836 +//line mysql_sql.y:12878 { yyLOCAL = yyDollar[3].referenceOptionTypeUnion() } yyVAL.union = yyLOCAL - case 1888: + case 1906: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12842 +//line mysql_sql.y:12884 { yyLOCAL = tree.REFERENCE_OPTION_RESTRICT } yyVAL.union = yyLOCAL - case 1889: + case 1907: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12846 +//line mysql_sql.y:12888 { yyLOCAL = tree.REFERENCE_OPTION_CASCADE } yyVAL.union = yyLOCAL - case 1890: + case 1908: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12850 +//line mysql_sql.y:12892 { yyLOCAL = tree.REFERENCE_OPTION_SET_NULL } yyVAL.union = yyLOCAL - case 1891: + case 1909: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12854 +//line mysql_sql.y:12896 { yyLOCAL = tree.REFERENCE_OPTION_NO_ACTION } yyVAL.union = yyLOCAL - case 1892: + case 1910: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12858 +//line mysql_sql.y:12900 { yyLOCAL = tree.REFERENCE_OPTION_SET_DEFAULT } yyVAL.union = yyLOCAL - case 1893: + case 1911: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:12863 +//line mysql_sql.y:12905 { yyLOCAL = tree.MATCH_INVALID } yyVAL.union = yyLOCAL - case 1895: + case 1913: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:12870 +//line mysql_sql.y:12912 { yyLOCAL = tree.MATCH_FULL } yyVAL.union = yyLOCAL - case 1896: + case 1914: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:12874 +//line mysql_sql.y:12916 { yyLOCAL = tree.MATCH_PARTIAL } yyVAL.union = yyLOCAL - case 1897: + case 1915: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:12878 +//line mysql_sql.y:12920 { yyLOCAL = tree.MATCH_SIMPLE } yyVAL.union = yyLOCAL - case 1898: + case 1916: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12883 +//line mysql_sql.y:12925 { yyLOCAL = tree.FULLTEXT_DEFAULT } yyVAL.union = yyLOCAL - case 1899: + case 1917: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12887 +//line mysql_sql.y:12929 { yyLOCAL = tree.FULLTEXT_NL } yyVAL.union = yyLOCAL - case 1900: + case 1918: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12891 +//line mysql_sql.y:12933 { yyLOCAL = tree.FULLTEXT_NL_QUERY_EXPANSION } yyVAL.union = yyLOCAL - case 1901: + case 1919: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12895 +//line mysql_sql.y:12937 { yyLOCAL = tree.FULLTEXT_BOOLEAN } yyVAL.union = yyLOCAL - case 1902: + case 1920: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12899 +//line mysql_sql.y:12941 { yyLOCAL = tree.FULLTEXT_QUERY_EXPANSION } yyVAL.union = yyLOCAL - case 1903: + case 1921: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12903 +//line mysql_sql.y:12945 { yyLOCAL = tree.FULLTEXT_BM25 } yyVAL.union = yyLOCAL - case 1904: + case 1922: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:12908 +//line mysql_sql.y:12950 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1905: + case 1923: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:12912 +//line mysql_sql.y:12954 { yyLOCAL = yyDollar[2].keyPartsUnion() } yyVAL.union = yyLOCAL - case 1906: + case 1924: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:12917 +//line mysql_sql.y:12959 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 1907: + case 1925: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:12921 +//line mysql_sql.y:12963 { value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -31844,114 +32053,114 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 1914: + case 1932: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Subquery -//line mysql_sql.y:12939 +//line mysql_sql.y:12981 { yyLOCAL = &tree.Subquery{Select: yyDollar[1].selectStatementUnion(), Exists: false} } yyVAL.union = yyLOCAL - case 1915: + case 1933: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12945 +//line mysql_sql.y:12987 { yyLOCAL = tree.NewBinaryExpr(tree.BIT_AND, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1916: + case 1934: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12949 +//line mysql_sql.y:12991 { yyLOCAL = tree.NewBinaryExpr(tree.BIT_OR, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1917: + case 1935: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12953 +//line mysql_sql.y:12995 { yyLOCAL = tree.NewBinaryExpr(tree.BIT_XOR, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1918: + case 1936: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12957 +//line mysql_sql.y:12999 { yyLOCAL = tree.NewBinaryExpr(tree.PLUS, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1919: + case 1937: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12961 +//line mysql_sql.y:13003 { yyLOCAL = tree.NewBinaryExpr(tree.MINUS, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1920: + case 1938: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12965 +//line mysql_sql.y:13007 { yyLOCAL = tree.NewBinaryExpr(tree.MULTI, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1921: + case 1939: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12969 +//line mysql_sql.y:13011 { yyLOCAL = tree.NewBinaryExpr(tree.DIV, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1922: + case 1940: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12973 +//line mysql_sql.y:13015 { yyLOCAL = tree.NewBinaryExpr(tree.INTEGER_DIV, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1923: + case 1941: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12977 +//line mysql_sql.y:13019 { yyLOCAL = tree.NewBinaryExpr(tree.MOD, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1924: + case 1942: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12981 +//line mysql_sql.y:13023 { yyLOCAL = tree.NewBinaryExpr(tree.MOD, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1925: + case 1943: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12985 +//line mysql_sql.y:13027 { yyLOCAL = tree.NewBinaryExpr(tree.LEFT_SHIFT, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1926: + case 1944: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12989 +//line mysql_sql.y:13031 { yyLOCAL = tree.NewBinaryExpr(tree.RIGHT_SHIFT, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1927: + case 1945: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12993 +//line mysql_sql.y:13035 { name := tree.NewUnresolvedColName("json_extract") yyLOCAL = &tree.FuncExpr{ @@ -31961,10 +32170,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1928: + case 1946: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13002 +//line mysql_sql.y:13044 { extractName := tree.NewUnresolvedColName("json_extract") inner := &tree.FuncExpr{ @@ -31980,42 +32189,42 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1929: + case 1947: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13017 +//line mysql_sql.y:13059 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1930: + case 1948: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13023 +//line mysql_sql.y:13065 { yyLOCAL = yyDollar[1].unresolvedNameUnion() } yyVAL.union = yyLOCAL - case 1931: + case 1949: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13027 +//line mysql_sql.y:13069 { yyLOCAL = yyDollar[1].varExprUnion() } yyVAL.union = yyLOCAL - case 1932: + case 1950: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13031 +//line mysql_sql.y:13073 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1933: + case 1951: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13035 +//line mysql_sql.y:13077 { name := tree.NewUnresolvedColName("concat") yyLOCAL = &tree.FuncExpr{ @@ -32025,66 +32234,66 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1934: + case 1952: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13044 +//line mysql_sql.y:13086 { yyLOCAL = tree.NewParentExpr(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1935: + case 1953: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13048 +//line mysql_sql.y:13090 { yyLOCAL = tree.NewTuple(append(yyDollar[2].exprsUnion(), yyDollar[4].exprUnion())) } yyVAL.union = yyLOCAL - case 1936: + case 1954: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13052 +//line mysql_sql.y:13094 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_PLUS, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1937: + case 1955: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13056 +//line mysql_sql.y:13098 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_MINUS, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1938: + case 1956: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13060 +//line mysql_sql.y:13102 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_TILDE, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1939: + case 1957: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13064 +//line mysql_sql.y:13106 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_MARK, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1940: + case 1958: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13068 +//line mysql_sql.y:13110 { yyLOCAL = tree.NewNotExpr(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1941: + case 1959: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13072 +//line mysql_sql.y:13114 { hint := strings.ToLower(yyDollar[2].cstrUnion().Compare()) switch hint { @@ -32127,35 +32336,35 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1942: + case 1960: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13114 +//line mysql_sql.y:13156 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1943: + case 1961: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13118 +//line mysql_sql.y:13160 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 1944: + case 1962: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13122 +//line mysql_sql.y:13164 { yyDollar[2].subqueryUnion().Exists = true yyLOCAL = yyDollar[2].subqueryUnion() } yyVAL.union = yyLOCAL - case 1945: + case 1963: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13127 +//line mysql_sql.y:13169 { yyLOCAL = &tree.CaseExpr{ Expr: yyDollar[2].exprUnion(), @@ -32164,58 +32373,58 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1946: + case 1964: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13135 +//line mysql_sql.y:13177 { yyLOCAL = tree.NewCastExpr(yyDollar[3].exprUnion(), yyDollar[5].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1947: + case 1965: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13139 +//line mysql_sql.y:13181 { yyLOCAL = tree.NewCastExpr(yyDollar[3].exprUnion(), makeCharsetCastCharType(yyDollar[6].lengthOptUnion(), yyDollar[9].str)) } yyVAL.union = yyLOCAL - case 1948: + case 1966: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13143 +//line mysql_sql.y:13185 { yyLOCAL = tree.NewSerialExtractExpr(yyDollar[3].exprUnion(), yyDollar[5].exprUnion(), yyDollar[7].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1949: + case 1967: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13147 +//line mysql_sql.y:13189 { yyLOCAL = tree.NewBitCastExpr(yyDollar[3].exprUnion(), yyDollar[5].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1950: + case 1968: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13151 +//line mysql_sql.y:13193 { yyLOCAL = tree.NewCastExpr(yyDollar[1].exprUnion(), yyDollar[3].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1951: + case 1969: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13155 +//line mysql_sql.y:13197 { yyLOCAL = tree.NewCastExpr(yyDollar[3].exprUnion(), yyDollar[5].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1952: + case 1970: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13159 +//line mysql_sql.y:13201 { name := tree.NewUnresolvedColName(yyDollar[1].str) es := tree.NewNumVal(yyDollar[5].str, yyDollar[5].str, false, tree.P_char) @@ -32226,66 +32435,66 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1953: + case 1971: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13169 +//line mysql_sql.y:13211 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1954: + case 1972: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13173 +//line mysql_sql.y:13215 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1955: + case 1973: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13177 +//line mysql_sql.y:13219 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1956: + case 1974: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13181 +//line mysql_sql.y:13223 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1957: + case 1975: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13185 +//line mysql_sql.y:13227 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1958: + case 1976: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13189 +//line mysql_sql.y:13231 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1959: + case 1977: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13193 +//line mysql_sql.y:13235 { yyLOCAL = &tree.CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } yyVAL.union = yyLOCAL - case 1960: + case 1978: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13197 +//line mysql_sql.y:13239 { val, err := tree.NewFullTextMatchFuncExpression(yyDollar[3].keyPartsUnion(), yyDollar[7].exprUnion(), yyDollar[8].fullTextSearchTypeUnion()) if err != nil { @@ -32295,34 +32504,34 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1961: + case 1979: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13207 +//line mysql_sql.y:13249 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 1962: + case 1980: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13211 +//line mysql_sql.y:13253 { yyLOCAL = tree.NewParamExpr(yylex.(*Lexer).GetParamIndex()) } yyVAL.union = yyLOCAL - case 1963: + case 1981: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13215 +//line mysql_sql.y:13257 { yyLOCAL = tree.NewUnresolvedName(yyDollar[1].cstrUnion()) } yyVAL.union = yyLOCAL - case 1964: + case 1982: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13221 +//line mysql_sql.y:13263 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32332,10 +32541,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1965: + case 1983: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13230 +//line mysql_sql.y:13272 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32345,10 +32554,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1966: + case 1984: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13239 +//line mysql_sql.y:13281 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32358,10 +32567,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1967: + case 1985: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13248 +//line mysql_sql.y:13290 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32371,10 +32580,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1968: + case 1986: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13257 +//line mysql_sql.y:13299 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32385,10 +32594,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1969: + case 1987: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13267 +//line mysql_sql.y:13309 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32398,10 +32607,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1970: + case 1988: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13276 +//line mysql_sql.y:13318 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32412,10 +32621,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1971: + case 1989: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13286 +//line mysql_sql.y:13328 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32426,10 +32635,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1972: + case 1990: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13296 +//line mysql_sql.y:13338 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32440,10 +32649,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1973: + case 1991: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13306 +//line mysql_sql.y:13348 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32454,10 +32663,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1974: + case 1992: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13316 +//line mysql_sql.y:13358 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32468,10 +32677,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1975: + case 1993: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13326 +//line mysql_sql.y:13368 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32482,10 +32691,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1976: + case 1994: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13336 +//line mysql_sql.y:13378 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32496,10 +32705,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1977: + case 1995: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13346 +//line mysql_sql.y:13388 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32510,10 +32719,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1978: + case 1996: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13356 +//line mysql_sql.y:13398 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32524,10 +32733,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1979: + case 1997: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13368 +//line mysql_sql.y:13410 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32542,10 +32751,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1980: + case 1998: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13380 +//line mysql_sql.y:13422 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32560,10 +32769,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1981: + case 1999: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13392 +//line mysql_sql.y:13434 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32577,10 +32786,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1982: + case 2000: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13403 +//line mysql_sql.y:13445 { val, err := tree.NewSamplePercentFuncExpression2(yyDollar[5].item.(float64), true, nil) if err != nil { @@ -32590,10 +32799,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1983: + case 2001: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13413 +//line mysql_sql.y:13455 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32608,10 +32817,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1984: + case 2002: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13425 +//line mysql_sql.y:13467 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32626,10 +32835,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1985: + case 2003: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13437 +//line mysql_sql.y:13479 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32643,10 +32852,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1986: + case 2004: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13448 +//line mysql_sql.y:13490 { val, err := tree.NewSamplePercentFuncExpression2(yyDollar[5].item.(float64), false, yyDollar[3].exprsUnion()) if err != nil { @@ -32656,58 +32865,58 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1987: + case 2005: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13458 +//line mysql_sql.y:13500 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1988: + case 2006: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13462 +//line mysql_sql.y:13504 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1989: + case 2007: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13467 +//line mysql_sql.y:13509 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1990: + case 2008: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13471 +//line mysql_sql.y:13513 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1991: + case 2009: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.When -//line mysql_sql.y:13477 +//line mysql_sql.y:13519 { yyLOCAL = []*tree.When{yyDollar[1].whenClauseUnion()} } yyVAL.union = yyLOCAL - case 1992: + case 2010: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.When -//line mysql_sql.y:13481 +//line mysql_sql.y:13523 { yyLOCAL = append(yyDollar[1].whenClauseListUnion(), yyDollar[2].whenClauseUnion()) } yyVAL.union = yyLOCAL - case 1993: + case 2011: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.When -//line mysql_sql.y:13487 +//line mysql_sql.y:13529 { yyLOCAL = &tree.When{ Cond: yyDollar[2].exprUnion(), @@ -32715,9 +32924,9 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1994: + case 2012: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:13496 +//line mysql_sql.y:13538 { t := yyVAL.columnTypeUnion() str := strings.ToLower(t.InternalType.FamilyString) @@ -32730,10 +32939,10 @@ yydefault: } } } - case 1995: + case 2013: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13508 +//line mysql_sql.y:13550 { name := yyDollar[1].str if yyDollar[2].str != "" { @@ -32751,10 +32960,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1996: + case 2014: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13525 +//line mysql_sql.y:13567 { locale := "" yyLOCAL = &tree.T{ @@ -32769,10 +32978,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1998: + case 2016: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13542 +//line mysql_sql.y:13584 { locale := "" yyLOCAL = &tree.T{ @@ -32785,10 +32994,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1999: + case 2017: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13554 +//line mysql_sql.y:13596 { locale := "" yyLOCAL = &tree.T{ @@ -32803,10 +33012,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2000: + case 2018: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13568 +//line mysql_sql.y:13610 { locale := "" oid := uint32(defines.MYSQL_TYPE_STRING) @@ -32826,18 +33035,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2001: + case 2019: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13587 +//line mysql_sql.y:13629 { yyLOCAL = makeCharsetCastCharType(yyDollar[2].lengthOptUnion(), yyDollar[5].str) } yyVAL.union = yyLOCAL - case 2002: + case 2020: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13591 +//line mysql_sql.y:13633 { locale := "" yyLOCAL = &tree.T{ @@ -32850,10 +33059,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2003: + case 2021: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13603 +//line mysql_sql.y:13645 { locale := "" yyLOCAL = &tree.T{ @@ -32868,10 +33077,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2004: + case 2022: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13617 +//line mysql_sql.y:13659 { locale := "" yyLOCAL = &tree.T{ @@ -32887,10 +33096,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2005: + case 2023: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13632 +//line mysql_sql.y:13674 { locale := "" yyLOCAL = &tree.T{ @@ -32906,10 +33115,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2006: + case 2024: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13647 +//line mysql_sql.y:13689 { name := yyDollar[1].str if yyDollar[2].str != "" { @@ -32927,10 +33136,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2007: + case 2025: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13664 +//line mysql_sql.y:13706 { locale := "" yyLOCAL = &tree.T{ @@ -32945,112 +33154,112 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2008: + case 2026: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:13680 +//line mysql_sql.y:13722 { yyVAL.str = "" } - case 2012: + case 2030: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13689 +//line mysql_sql.y:13731 { yyLOCAL = &tree.FrameBound{Type: tree.Following, UnBounded: true} } yyVAL.union = yyLOCAL - case 2013: + case 2031: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13693 +//line mysql_sql.y:13735 { yyLOCAL = &tree.FrameBound{Type: tree.Following, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2014: + case 2032: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13697 +//line mysql_sql.y:13739 { yyLOCAL = &tree.FrameBound{Type: tree.Following, Expr: tree.NewParamExpr(yylex.(*Lexer).GetParamIndex())} } yyVAL.union = yyLOCAL - case 2015: + case 2033: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13701 +//line mysql_sql.y:13743 { yyLOCAL = &tree.FrameBound{Type: tree.Following, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2016: + case 2034: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13707 +//line mysql_sql.y:13749 { yyLOCAL = &tree.FrameBound{Type: tree.CurrentRow} } yyVAL.union = yyLOCAL - case 2017: + case 2035: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13711 +//line mysql_sql.y:13753 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, UnBounded: true} } yyVAL.union = yyLOCAL - case 2018: + case 2036: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13715 +//line mysql_sql.y:13757 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2019: + case 2037: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13719 +//line mysql_sql.y:13761 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, Expr: tree.NewParamExpr(yylex.(*Lexer).GetParamIndex())} } yyVAL.union = yyLOCAL - case 2020: + case 2038: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13723 +//line mysql_sql.y:13765 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2021: + case 2039: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FrameType -//line mysql_sql.y:13729 +//line mysql_sql.y:13771 { yyLOCAL = tree.Rows } yyVAL.union = yyLOCAL - case 2022: + case 2040: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FrameType -//line mysql_sql.y:13733 +//line mysql_sql.y:13775 { yyLOCAL = tree.Range } yyVAL.union = yyLOCAL - case 2023: + case 2041: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FrameType -//line mysql_sql.y:13737 +//line mysql_sql.y:13779 { yyLOCAL = tree.Groups } yyVAL.union = yyLOCAL - case 2024: + case 2042: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:13743 +//line mysql_sql.y:13785 { yyLOCAL = &tree.FrameClause{ Type: yyDollar[1].frameTypeUnion(), @@ -33059,10 +33268,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2025: + case 2043: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:13751 +//line mysql_sql.y:13793 { yyLOCAL = &tree.FrameClause{ Type: yyDollar[1].frameTypeUnion(), @@ -33072,163 +33281,163 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2026: + case 2044: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:13761 +//line mysql_sql.y:13803 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2027: + case 2045: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:13765 +//line mysql_sql.y:13807 { yyLOCAL = yyDollar[1].frameClauseUnion() } yyVAL.union = yyLOCAL - case 2028: + case 2046: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:13771 +//line mysql_sql.y:13813 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 2029: + case 2047: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:13776 +//line mysql_sql.y:13818 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2030: + case 2048: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:13780 +//line mysql_sql.y:13822 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 2031: + case 2049: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:13785 +//line mysql_sql.y:13827 { yyVAL.str = "," } - case 2032: + case 2050: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:13789 +//line mysql_sql.y:13831 { yyVAL.str = yyDollar[2].str } - case 2033: + case 2051: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:13794 +//line mysql_sql.y:13836 { yyVAL.str = "1,vector_l2_ops,random,false" } - case 2034: + case 2052: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:13798 +//line mysql_sql.y:13840 { yyVAL.str = yyDollar[2].str } - case 2035: + case 2053: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.WindowSpec -//line mysql_sql.y:13803 +//line mysql_sql.y:13845 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2037: + case 2055: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.WindowSpec -//line mysql_sql.y:13810 +//line mysql_sql.y:13852 { yyLOCAL = makeWindowSpec(yyDollar[2].cstrUnion(), nil, nil, nil) yyLOCAL.ReferencedOnly = true } yyVAL.union = yyLOCAL - case 2038: + case 2056: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.WindowSpec -//line mysql_sql.y:13815 +//line mysql_sql.y:13857 { yyLOCAL = yyDollar[3].windowSpecUnion() } yyVAL.union = yyLOCAL - case 2039: + case 2057: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.WindowSpec -//line mysql_sql.y:13821 +//line mysql_sql.y:13863 { yyLOCAL = makeWindowSpec(yyDollar[1].cstrUnion(), yyDollar[2].exprsUnion(), yyDollar[3].orderByUnion(), yyDollar[4].frameClauseUnion()) } yyVAL.union = yyLOCAL - case 2040: + case 2058: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:13830 +//line mysql_sql.y:13872 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2041: + case 2059: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:13834 +//line mysql_sql.y:13876 { yyLOCAL = yyDollar[1].cstrUnion() } yyVAL.union = yyLOCAL - case 2042: + case 2060: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.WindowDefinitions -//line mysql_sql.y:13839 +//line mysql_sql.y:13881 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2043: + case 2061: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.WindowDefinitions -//line mysql_sql.y:13843 +//line mysql_sql.y:13885 { yyLOCAL = yyDollar[2].windowDefinitionsUnion() } yyVAL.union = yyLOCAL - case 2044: + case 2062: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.WindowDefinitions -//line mysql_sql.y:13849 +//line mysql_sql.y:13891 { yyLOCAL = tree.WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL - case 2045: + case 2063: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.WindowDefinitions -//line mysql_sql.y:13853 +//line mysql_sql.y:13895 { yyLOCAL = append(yyDollar[1].windowDefinitionsUnion(), yyDollar[3].windowDefinitionUnion()) } yyVAL.union = yyLOCAL - case 2046: + case 2064: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.WindowDefinition -//line mysql_sql.y:13859 +//line mysql_sql.y:13901 { yyLOCAL = &tree.WindowDefinition{Name: yyDollar[1].cstrUnion(), Spec: yyDollar[4].windowSpecUnion()} } yyVAL.union = yyLOCAL - case 2047: + case 2065: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13865 +//line mysql_sql.y:13907 { functionName := yyDollar[1].str arguments := yyDollar[4].exprsUnion() @@ -33271,10 +33480,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2048: + case 2066: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13907 +//line mysql_sql.y:13949 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33287,10 +33496,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2049: + case 2067: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13919 +//line mysql_sql.y:13961 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33303,10 +33512,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2050: + case 2068: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13931 +//line mysql_sql.y:13973 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33319,10 +33528,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2051: + case 2069: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13943 +//line mysql_sql.y:13985 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33334,10 +33543,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2052: + case 2070: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13954 +//line mysql_sql.y:13996 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33349,10 +33558,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2053: + case 2071: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13965 +//line mysql_sql.y:14007 { name := tree.NewUnresolvedColName(yyDollar[1].str) es := tree.NewNumVal("*", "*", false, tree.P_star) @@ -33364,10 +33573,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2054: + case 2072: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13976 +//line mysql_sql.y:14018 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33378,10 +33587,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2055: + case 2073: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13986 +//line mysql_sql.y:14028 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33394,10 +33603,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2056: + case 2074: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13998 +//line mysql_sql.y:14040 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33409,10 +33618,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2057: + case 2075: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14009 +//line mysql_sql.y:14051 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33424,10 +33633,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2058: + case 2076: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14020 +//line mysql_sql.y:14062 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33439,10 +33648,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2059: + case 2077: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14031 +//line mysql_sql.y:14073 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33454,10 +33663,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2060: + case 2078: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14042 +//line mysql_sql.y:14084 { name := tree.NewUnresolvedColName(yyDollar[1].str) es := tree.NewNumVal("*", "*", false, tree.P_star) @@ -33469,10 +33678,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2061: + case 2079: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14053 +//line mysql_sql.y:14095 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33484,10 +33693,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2062: + case 2080: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14064 +//line mysql_sql.y:14106 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33499,10 +33708,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2063: + case 2081: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14075 +//line mysql_sql.y:14117 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33514,10 +33723,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2064: + case 2082: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14086 +//line mysql_sql.y:14128 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33529,10 +33738,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2065: + case 2083: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14097 +//line mysql_sql.y:14139 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33544,10 +33753,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2066: + case 2084: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14108 +//line mysql_sql.y:14150 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33559,10 +33768,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2067: + case 2085: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14119 +//line mysql_sql.y:14161 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33574,10 +33783,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2068: + case 2086: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14130 +//line mysql_sql.y:14172 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33589,10 +33798,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2069: + case 2087: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14141 +//line mysql_sql.y:14183 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33604,10 +33813,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2070: + case 2088: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14152 +//line mysql_sql.y:14194 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33619,10 +33828,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2071: + case 2089: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14163 +//line mysql_sql.y:14205 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33634,10 +33843,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2072: + case 2090: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14174 +//line mysql_sql.y:14216 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33649,10 +33858,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2073: + case 2091: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14185 +//line mysql_sql.y:14227 { functionName := yyDollar[1].str if strings.EqualFold(functionName, "array_agg") { @@ -33670,10 +33879,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2074: + case 2092: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14202 +//line mysql_sql.y:14244 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33685,10 +33894,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2078: + case 2096: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14220 +//line mysql_sql.y:14262 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33699,10 +33908,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2079: + case 2097: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14230 +//line mysql_sql.y:14272 { name := tree.NewUnresolvedColName(yyDollar[1].str) exprs := tree.Exprs{yyDollar[3].exprUnion()} @@ -33714,10 +33923,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2080: + case 2098: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14241 +//line mysql_sql.y:14283 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33727,10 +33936,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2081: + case 2099: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14250 +//line mysql_sql.y:14292 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33740,10 +33949,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2082: + case 2100: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14259 +//line mysql_sql.y:14301 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33753,10 +33962,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2083: + case 2101: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14268 +//line mysql_sql.y:14310 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -33768,10 +33977,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2084: + case 2102: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14279 +//line mysql_sql.y:14321 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33781,10 +33990,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2085: + case 2103: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14288 +//line mysql_sql.y:14330 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33794,10 +34003,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2086: + case 2104: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14297 +//line mysql_sql.y:14339 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33809,10 +34018,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2087: + case 2105: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14308 +//line mysql_sql.y:14350 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33822,10 +34031,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2088: + case 2106: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14317 +//line mysql_sql.y:14359 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33835,10 +34044,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2089: + case 2107: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14326 +//line mysql_sql.y:14368 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33848,10 +34057,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2090: + case 2108: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14335 +//line mysql_sql.y:14377 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33861,10 +34070,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2091: + case 2109: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14344 +//line mysql_sql.y:14386 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(0), "0", false, tree.P_int64) @@ -33877,10 +34086,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2092: + case 2110: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14356 +//line mysql_sql.y:14398 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(1), "1", false, tree.P_int64) @@ -33892,10 +34101,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2093: + case 2111: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14367 +//line mysql_sql.y:14409 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(2), "2", false, tree.P_int64) @@ -33909,10 +34118,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2094: + case 2112: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14380 +//line mysql_sql.y:14422 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(3), "3", false, tree.P_int64) @@ -33925,10 +34134,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2095: + case 2113: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14392 +//line mysql_sql.y:14434 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33938,16 +34147,16 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2102: + case 2120: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:14413 +//line mysql_sql.y:14455 { yyVAL.str = yyDollar[1].str } - case 2135: + case 2153: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14455 +//line mysql_sql.y:14497 { name := tree.NewUnresolvedColName(yyDollar[1].str) var es tree.Exprs = nil @@ -33961,10 +34170,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2136: + case 2154: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14468 +//line mysql_sql.y:14510 { name := tree.NewUnresolvedColName(yyDollar[1].str) var es tree.Exprs = nil @@ -33978,10 +34187,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2137: + case 2155: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14481 +//line mysql_sql.y:14523 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -33993,10 +34202,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2138: + case 2156: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14492 +//line mysql_sql.y:14534 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -34008,10 +34217,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2139: + case 2157: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14503 +//line mysql_sql.y:14545 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToUpper(yyDollar[3].str) @@ -34023,10 +34232,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2140: + case 2158: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14515 +//line mysql_sql.y:14557 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34036,10 +34245,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2141: + case 2159: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14524 +//line mysql_sql.y:14566 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34048,10 +34257,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2142: + case 2160: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14532 +//line mysql_sql.y:14574 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34060,10 +34269,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2143: + case 2161: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14540 +//line mysql_sql.y:14582 { name := tree.NewUnresolvedColName(yyDollar[1].str) var es tree.Exprs = nil @@ -34077,10 +34286,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2144: + case 2162: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14553 +//line mysql_sql.y:14595 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34090,10 +34299,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2145: + case 2163: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14562 +//line mysql_sql.y:14604 { name := tree.NewUnresolvedColName(yyDollar[1].str) exprs := make([]tree.Expr, 1) @@ -34105,10 +34314,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2146: + case 2164: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14573 +//line mysql_sql.y:14615 { name := tree.NewUnresolvedColName(yyDollar[1].str) exprs := make([]tree.Expr, 1) @@ -34120,10 +34329,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2147: + case 2165: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14584 +//line mysql_sql.y:14626 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34133,10 +34342,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2148: + case 2166: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14593 +//line mysql_sql.y:14635 { charName := tree.NewUnresolvedColName(yyDollar[1].str) charExpr := &tree.FuncExpr{ @@ -34153,10 +34362,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2149: + case 2167: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14609 +//line mysql_sql.y:14651 { val := tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_char) name := tree.NewUnresolvedColName(yyDollar[1].str) @@ -34167,10 +34376,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2150: + case 2168: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14619 +//line mysql_sql.y:14661 { val := tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_char) name := tree.NewUnresolvedColName(yyDollar[1].str) @@ -34181,10 +34390,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2151: + case 2169: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14629 +//line mysql_sql.y:14671 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34194,10 +34403,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2152: + case 2170: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14638 +//line mysql_sql.y:14680 { es := tree.Exprs{yyDollar[3].exprUnion()} es = append(es, yyDollar[5].exprUnion()) @@ -34209,10 +34418,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2153: + case 2171: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14649 +//line mysql_sql.y:14691 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34222,10 +34431,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2154: + case 2172: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14658 +//line mysql_sql.y:14700 { val := tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_char) name := tree.NewUnresolvedColName(yyDollar[1].str) @@ -34236,10 +34445,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2155: + case 2173: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14668 +//line mysql_sql.y:14710 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34249,10 +34458,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2156: + case 2174: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14677 +//line mysql_sql.y:14719 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34262,10 +34471,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2157: + case 2175: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14686 +//line mysql_sql.y:14728 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34275,34 +34484,34 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2158: + case 2176: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14696 +//line mysql_sql.y:14738 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2159: + case 2177: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14700 +//line mysql_sql.y:14742 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 2160: + case 2178: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14706 +//line mysql_sql.y:14748 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2161: + case 2179: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14710 +//line mysql_sql.y:14752 { ival, errStr := util.GetInt64(yyDollar[2].item) if errStr != "" { @@ -34313,20 +34522,20 @@ yydefault: yyLOCAL = tree.NewNumVal(ival, str, false, tree.P_int64) } yyVAL.union = yyLOCAL - case 2168: + case 2186: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:14729 +//line mysql_sql.y:14771 { } - case 2169: + case 2187: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:14731 +//line mysql_sql.y:14773 { } - case 2206: + case 2224: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14775 +//line mysql_sql.y:14817 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -34338,531 +34547,531 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2207: + case 2225: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.FuncType -//line mysql_sql.y:14787 +//line mysql_sql.y:14829 { yyLOCAL = tree.FUNC_TYPE_DEFAULT } yyVAL.union = yyLOCAL - case 2208: + case 2226: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FuncType -//line mysql_sql.y:14791 +//line mysql_sql.y:14833 { yyLOCAL = tree.FUNC_TYPE_DISTINCT } yyVAL.union = yyLOCAL - case 2209: + case 2227: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FuncType -//line mysql_sql.y:14795 +//line mysql_sql.y:14837 { yyLOCAL = tree.FUNC_TYPE_ALL } yyVAL.union = yyLOCAL - case 2210: + case 2228: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Tuple -//line mysql_sql.y:14801 +//line mysql_sql.y:14843 { yyLOCAL = tree.NewTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 2211: + case 2229: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14806 +//line mysql_sql.y:14848 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2212: + case 2230: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14810 +//line mysql_sql.y:14852 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 2213: + case 2231: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14816 +//line mysql_sql.y:14858 { yyLOCAL = tree.Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2214: + case 2232: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14820 +//line mysql_sql.y:14862 { yyLOCAL = append(yyDollar[1].exprsUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2215: + case 2233: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14826 +//line mysql_sql.y:14868 { yyLOCAL = tree.Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2216: + case 2234: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14830 +//line mysql_sql.y:14872 { yyLOCAL = append(yyDollar[1].exprsUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2217: + case 2235: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14837 +//line mysql_sql.y:14879 { yyLOCAL = tree.NewAndExpr(yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2218: + case 2236: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14841 +//line mysql_sql.y:14883 { yyLOCAL = tree.NewOrExpr(yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2219: + case 2237: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14845 +//line mysql_sql.y:14887 { yyLOCAL = tree.NewXorExpr(yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2220: + case 2238: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14849 +//line mysql_sql.y:14891 { yyLOCAL = tree.NewNotExpr(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 2221: + case 2239: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14853 +//line mysql_sql.y:14895 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 2222: + case 2240: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14858 +//line mysql_sql.y:14900 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 2223: + case 2241: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14862 +//line mysql_sql.y:14904 { yyLOCAL = tree.NewMaxValue() } yyVAL.union = yyLOCAL - case 2224: + case 2242: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14868 +//line mysql_sql.y:14910 { yyLOCAL = tree.NewIsNullExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2225: + case 2243: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14872 +//line mysql_sql.y:14914 { yyLOCAL = tree.NewIsNotNullExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2226: + case 2244: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14876 +//line mysql_sql.y:14918 { yyLOCAL = tree.NewIsNotNullExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2227: + case 2245: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14880 +//line mysql_sql.y:14922 { yyLOCAL = tree.NewIsUnknownExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2228: + case 2246: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14884 +//line mysql_sql.y:14926 { yyLOCAL = tree.NewIsNotUnknownExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2229: + case 2247: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14888 +//line mysql_sql.y:14930 { yyLOCAL = tree.NewIsNotUnknownExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2230: + case 2248: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14892 +//line mysql_sql.y:14934 { yyLOCAL = tree.NewIsTrueExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2231: + case 2249: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14896 +//line mysql_sql.y:14938 { yyLOCAL = tree.NewIsNotTrueExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2232: + case 2250: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14900 +//line mysql_sql.y:14942 { yyLOCAL = tree.NewIsNotTrueExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2233: + case 2251: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14904 +//line mysql_sql.y:14946 { yyLOCAL = tree.NewIsFalseExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2234: + case 2252: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14908 +//line mysql_sql.y:14950 { yyLOCAL = tree.NewIsNotFalseExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2235: + case 2253: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14912 +//line mysql_sql.y:14954 { yyLOCAL = tree.NewIsNotFalseExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2236: + case 2254: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14916 +//line mysql_sql.y:14958 { yyLOCAL = tree.NewComparisonExpr(yyDollar[2].comparisonOpUnion(), yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2237: + case 2255: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14920 +//line mysql_sql.y:14962 { yyLOCAL = tree.NewSubqueryComparisonExpr(yyDollar[2].comparisonOpUnion(), yyDollar[3].comparisonOpUnion(), yyDollar[1].exprUnion(), yyDollar[4].subqueryUnion()) yyLOCAL = tree.NewSubqueryComparisonExpr(yyDollar[2].comparisonOpUnion(), yyDollar[3].comparisonOpUnion(), yyDollar[1].exprUnion(), yyDollar[4].subqueryUnion()) } yyVAL.union = yyLOCAL - case 2239: + case 2257: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14928 +//line mysql_sql.y:14970 { yyLOCAL = tree.NewComparisonExpr(tree.IN, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2240: + case 2258: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14932 +//line mysql_sql.y:14974 { yyLOCAL = tree.NewComparisonExpr(tree.NOT_IN, yyDollar[1].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2241: + case 2259: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14936 +//line mysql_sql.y:14978 { yyLOCAL = tree.NewComparisonExpr(tree.NOT_IN, yyDollar[1].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2242: + case 2260: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14940 +//line mysql_sql.y:14982 { yyLOCAL = tree.NewComparisonExpr(tree.MEMBER_OF, yyDollar[1].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2243: + case 2261: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14944 +//line mysql_sql.y:14986 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.LIKE, yyDollar[1].exprUnion(), yyDollar[3].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2244: + case 2262: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14948 +//line mysql_sql.y:14990 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.NOT_LIKE, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2245: + case 2263: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14952 +//line mysql_sql.y:14994 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.NOT_LIKE, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2246: + case 2264: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14956 +//line mysql_sql.y:14998 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.ILIKE, yyDollar[1].exprUnion(), yyDollar[3].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2247: + case 2265: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14960 +//line mysql_sql.y:15002 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.NOT_ILIKE, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2248: + case 2266: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14964 +//line mysql_sql.y:15006 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.NOT_ILIKE, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2249: + case 2267: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14968 +//line mysql_sql.y:15010 { yyLOCAL = tree.NewComparisonExpr(tree.REG_MATCH, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2250: + case 2268: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14972 +//line mysql_sql.y:15014 { yyLOCAL = tree.NewComparisonExpr(tree.NOT_REG_MATCH, yyDollar[1].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2251: + case 2269: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14976 +//line mysql_sql.y:15018 { yyLOCAL = tree.NewComparisonExpr(tree.NOT_REG_MATCH, yyDollar[1].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2252: + case 2270: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14980 +//line mysql_sql.y:15022 { yyLOCAL = tree.NewRangeCond(false, yyDollar[1].exprUnion(), yyDollar[3].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2253: + case 2271: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14984 +//line mysql_sql.y:15026 { yyLOCAL = tree.NewRangeCond(true, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[6].exprUnion()) } yyVAL.union = yyLOCAL - case 2254: + case 2272: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14988 +//line mysql_sql.y:15030 { yyLOCAL = tree.NewRangeCond(true, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[6].exprUnion()) } yyVAL.union = yyLOCAL - case 2256: + case 2274: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14994 +//line mysql_sql.y:15036 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2257: + case 2275: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14998 +//line mysql_sql.y:15040 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 2260: + case 2278: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15008 +//line mysql_sql.y:15050 { yyLOCAL = yyDollar[1].tupleUnion() } yyVAL.union = yyLOCAL - case 2261: + case 2279: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15012 +//line mysql_sql.y:15054 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 2262: + case 2280: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15019 +//line mysql_sql.y:15061 { yyLOCAL = tree.ALL } yyVAL.union = yyLOCAL - case 2263: + case 2281: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15023 +//line mysql_sql.y:15065 { yyLOCAL = tree.ANY } yyVAL.union = yyLOCAL - case 2264: + case 2282: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15027 +//line mysql_sql.y:15069 { yyLOCAL = tree.SOME } yyVAL.union = yyLOCAL - case 2265: + case 2283: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15033 +//line mysql_sql.y:15075 { yyLOCAL = tree.EQUAL } yyVAL.union = yyLOCAL - case 2266: + case 2284: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15037 +//line mysql_sql.y:15079 { yyLOCAL = tree.LESS_THAN } yyVAL.union = yyLOCAL - case 2267: + case 2285: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15041 +//line mysql_sql.y:15083 { yyLOCAL = tree.GREAT_THAN } yyVAL.union = yyLOCAL - case 2268: + case 2286: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15045 +//line mysql_sql.y:15087 { yyLOCAL = tree.LESS_THAN_EQUAL } yyVAL.union = yyLOCAL - case 2269: + case 2287: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15049 +//line mysql_sql.y:15091 { yyLOCAL = tree.GREAT_THAN_EQUAL } yyVAL.union = yyLOCAL - case 2270: + case 2288: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15053 +//line mysql_sql.y:15095 { yyLOCAL = tree.NOT_EQUAL } yyVAL.union = yyLOCAL - case 2271: + case 2289: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15057 +//line mysql_sql.y:15099 { yyLOCAL = tree.NULL_SAFE_EQUAL } yyVAL.union = yyLOCAL - case 2272: + case 2290: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:15063 +//line mysql_sql.y:15105 { yyLOCAL = tree.NewAttributePrimaryKey() } yyVAL.union = yyLOCAL - case 2273: + case 2291: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:15067 +//line mysql_sql.y:15109 { yyLOCAL = tree.NewAttributeUniqueKey() } yyVAL.union = yyLOCAL - case 2274: + case 2292: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:15071 +//line mysql_sql.y:15113 { yyLOCAL = tree.NewAttributeUnique() } yyVAL.union = yyLOCAL - case 2275: + case 2293: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:15075 +//line mysql_sql.y:15117 { yyLOCAL = tree.NewAttributeKey() } yyVAL.union = yyLOCAL - case 2276: + case 2294: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15081 +//line mysql_sql.y:15123 { str := fmt.Sprintf("%v", yyDollar[1].item) switch v := yyDollar[1].item.(type) { @@ -34876,35 +35085,35 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2277: + case 2295: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15094 +//line mysql_sql.y:15136 { fval := yyDollar[1].item.(float64) yyLOCAL = tree.NewNumVal(fval, yylex.(*Lexer).scanner.LastToken, false, tree.P_float64) } yyVAL.union = yyLOCAL - case 2278: + case 2296: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15099 +//line mysql_sql.y:15141 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_decimal) } yyVAL.union = yyLOCAL - case 2279: + case 2297: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15105 +//line mysql_sql.y:15147 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 2280: + case 2298: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15109 +//line mysql_sql.y:15151 { str := fmt.Sprintf("%v", yyDollar[1].item) switch v := yyDollar[1].item.(type) { @@ -34918,101 +35127,101 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2281: + case 2299: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15122 +//line mysql_sql.y:15164 { fval := yyDollar[1].item.(float64) yyLOCAL = tree.NewNumVal(fval, yylex.(*Lexer).scanner.LastToken, false, tree.P_float64) } yyVAL.union = yyLOCAL - case 2282: + case 2300: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15127 +//line mysql_sql.y:15169 { yyLOCAL = tree.NewNumVal(true, "true", false, tree.P_bool) } yyVAL.union = yyLOCAL - case 2283: + case 2301: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15131 +//line mysql_sql.y:15173 { yyLOCAL = tree.NewNumVal(false, "false", false, tree.P_bool) } yyVAL.union = yyLOCAL - case 2284: + case 2302: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15135 +//line mysql_sql.y:15177 { yyLOCAL = tree.NewNumVal("null", "null", false, tree.P_null) } yyVAL.union = yyLOCAL - case 2285: + case 2303: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15139 +//line mysql_sql.y:15181 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_hexnum) } yyVAL.union = yyLOCAL - case 2286: + case 2304: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15143 +//line mysql_sql.y:15185 { yyLOCAL = tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_ScoreBinaryHexnum) } yyVAL.union = yyLOCAL - case 2287: + case 2305: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15147 +//line mysql_sql.y:15189 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_decimal) } yyVAL.union = yyLOCAL - case 2288: + case 2306: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15151 +//line mysql_sql.y:15193 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_bit) } yyVAL.union = yyLOCAL - case 2289: + case 2307: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15155 +//line mysql_sql.y:15197 { yyLOCAL = tree.NewParamExpr(yylex.(*Lexer).GetParamIndex()) } yyVAL.union = yyLOCAL - case 2290: + case 2308: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15159 +//line mysql_sql.y:15201 { yyLOCAL = tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_ScoreBinary) } yyVAL.union = yyLOCAL - case 2291: + case 2309: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15165 +//line mysql_sql.y:15207 { yyLOCAL = yyDollar[1].columnTypeUnion() yyLOCAL.InternalType.Unsigned = yyDollar[2].unsignedOptUnion() yyLOCAL.InternalType.Zerofill = yyDollar[3].zeroFillOptUnion() } yyVAL.union = yyLOCAL - case 2295: + case 2313: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15174 +//line mysql_sql.y:15216 { locale := "" yyLOCAL = &tree.T{ @@ -35026,27 +35235,27 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2296: + case 2314: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15189 +//line mysql_sql.y:15231 { yyLOCAL = yyDollar[1].columnTypeUnion() yyLOCAL.InternalType.DisplayWith = yyDollar[2].lengthOptUnion() } yyVAL.union = yyLOCAL - case 2297: + case 2315: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15194 +//line mysql_sql.y:15236 { yyLOCAL = yyDollar[1].columnTypeUnion() } yyVAL.union = yyLOCAL - case 2298: + case 2316: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15200 +//line mysql_sql.y:15242 { locale := "" yyLOCAL = &tree.T{ @@ -35059,10 +35268,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2299: + case 2317: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15212 +//line mysql_sql.y:15254 { locale := "" yyLOCAL = &tree.T{ @@ -35075,10 +35284,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2300: + case 2318: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15224 +//line mysql_sql.y:15266 { locale := "" yyLOCAL = &tree.T{ @@ -35091,10 +35300,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2301: + case 2319: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15236 +//line mysql_sql.y:15278 { locale := "" yyLOCAL = &tree.T{ @@ -35108,10 +35317,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2302: + case 2320: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15249 +//line mysql_sql.y:15291 { locale := "" yyLOCAL = &tree.T{ @@ -35125,10 +35334,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2303: + case 2321: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15262 +//line mysql_sql.y:15304 { locale := "" yyLOCAL = &tree.T{ @@ -35142,10 +35351,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2304: + case 2322: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15275 +//line mysql_sql.y:15317 { locale := "" yyLOCAL = &tree.T{ @@ -35159,10 +35368,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2305: + case 2323: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15288 +//line mysql_sql.y:15330 { locale := "" yyLOCAL = &tree.T{ @@ -35176,10 +35385,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2306: + case 2324: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15301 +//line mysql_sql.y:15343 { locale := "" yyLOCAL = &tree.T{ @@ -35193,10 +35402,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2307: + case 2325: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15314 +//line mysql_sql.y:15356 { locale := "" yyLOCAL = &tree.T{ @@ -35210,10 +35419,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2308: + case 2326: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15327 +//line mysql_sql.y:15369 { locale := "" yyLOCAL = &tree.T{ @@ -35227,10 +35436,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2309: + case 2327: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15340 +//line mysql_sql.y:15382 { locale := "" yyLOCAL = &tree.T{ @@ -35244,10 +35453,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2310: + case 2328: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15353 +//line mysql_sql.y:15395 { locale := "" yyLOCAL = &tree.T{ @@ -35261,10 +35470,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2311: + case 2329: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15366 +//line mysql_sql.y:15408 { locale := "" yyLOCAL = &tree.T{ @@ -35278,10 +35487,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2312: + case 2330: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15381 +//line mysql_sql.y:15423 { locale := "" if yyDollar[2].lengthScaleOptUnion().DisplayWith > 255 { @@ -35309,10 +35518,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2313: + case 2331: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15408 +//line mysql_sql.y:15450 { // DOUBLE PRECISION is the SQL-standard synonym for DOUBLE (float64). locale := "" @@ -35341,10 +35550,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2314: + case 2332: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15436 +//line mysql_sql.y:15478 { locale := "" if yyDollar[2].lengthScaleOptUnion().DisplayWith > 255 { @@ -35386,10 +35595,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2315: + case 2333: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15478 +//line mysql_sql.y:15520 { locale := "" if yyDollar[2].lengthScaleOptUnion().Scale != tree.NotDefineDec && yyDollar[2].lengthScaleOptUnion().Scale > yyDollar[2].lengthScaleOptUnion().DisplayWith { @@ -35438,10 +35647,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2316: + case 2334: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15526 +//line mysql_sql.y:15568 { locale := "" if yyDollar[2].lengthScaleOptUnion().Scale != tree.NotDefineDec && yyDollar[2].lengthScaleOptUnion().Scale > yyDollar[2].lengthScaleOptUnion().DisplayWith { @@ -35490,10 +35699,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2317: + case 2335: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15574 +//line mysql_sql.y:15616 { locale := "" width := int32(64) @@ -35515,10 +35724,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2318: + case 2336: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15597 +//line mysql_sql.y:15639 { locale := "" yyLOCAL = &tree.T{ @@ -35531,10 +35740,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2319: + case 2337: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15609 +//line mysql_sql.y:15651 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -35555,10 +35764,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2320: + case 2338: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15629 +//line mysql_sql.y:15671 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -35579,10 +35788,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2321: + case 2339: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15649 +//line mysql_sql.y:15691 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -35603,10 +35812,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2322: + case 2340: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15669 +//line mysql_sql.y:15711 { locale := "" yyLOCAL = &tree.T{ @@ -35621,10 +35830,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2323: + case 2341: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15685 +//line mysql_sql.y:15727 { locale := "" yyLOCAL = &tree.T{ @@ -35638,10 +35847,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2324: + case 2342: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15698 +//line mysql_sql.y:15740 { locale := "" yyLOCAL = &tree.T{ @@ -35655,10 +35864,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2325: + case 2343: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15711 +//line mysql_sql.y:15753 { locale := "" yyLOCAL = &tree.T{ @@ -35672,10 +35881,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2326: + case 2344: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15724 +//line mysql_sql.y:15766 { locale := "" yyLOCAL = &tree.T{ @@ -35689,10 +35898,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2327: + case 2345: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15737 +//line mysql_sql.y:15779 { locale := "" yyLOCAL = &tree.T{ @@ -35705,10 +35914,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2328: + case 2346: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15749 +//line mysql_sql.y:15791 { locale := "" yyLOCAL = &tree.T{ @@ -35721,10 +35930,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2329: + case 2347: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15761 +//line mysql_sql.y:15803 { locale := "" yyLOCAL = &tree.T{ @@ -35737,10 +35946,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2330: + case 2348: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15773 +//line mysql_sql.y:15815 { locale := "" yyLOCAL = &tree.T{ @@ -35754,10 +35963,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2331: + case 2349: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15786 +//line mysql_sql.y:15828 { locale := "" yyLOCAL = &tree.T{ @@ -35770,10 +35979,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2332: + case 2350: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15798 +//line mysql_sql.y:15840 { locale := "" yyLOCAL = &tree.T{ @@ -35786,10 +35995,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2333: + case 2351: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15810 +//line mysql_sql.y:15852 { locale := "" yyLOCAL = &tree.T{ @@ -35802,10 +36011,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2334: + case 2352: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15822 +//line mysql_sql.y:15864 { locale := "" yyLOCAL = &tree.T{ @@ -35819,10 +36028,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2335: + case 2353: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15835 +//line mysql_sql.y:15877 { locale := "" yyLOCAL = &tree.T{ @@ -35835,10 +36044,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2336: + case 2354: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15847 +//line mysql_sql.y:15889 { locale := "" yyLOCAL = &tree.T{ @@ -35851,10 +36060,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2337: + case 2355: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15859 +//line mysql_sql.y:15901 { locale := "" yyLOCAL = &tree.T{ @@ -35867,10 +36076,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2338: + case 2356: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15871 +//line mysql_sql.y:15913 { locale := "" yyLOCAL = &tree.T{ @@ -35883,10 +36092,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2339: + case 2357: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15883 +//line mysql_sql.y:15925 { locale := "" yyLOCAL = &tree.T{ @@ -35900,10 +36109,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2340: + case 2358: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15896 +//line mysql_sql.y:15938 { locale := "" yyLOCAL = &tree.T{ @@ -35917,10 +36126,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2341: + case 2359: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15909 +//line mysql_sql.y:15951 { locale := "" yyLOCAL = &tree.T{ @@ -35934,10 +36143,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2342: + case 2360: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15922 +//line mysql_sql.y:15964 { locale := "" yyLOCAL = &tree.T{ @@ -35951,10 +36160,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2343: + case 2361: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15935 +//line mysql_sql.y:15977 { locale := "" yyLOCAL = &tree.T{ @@ -35968,10 +36177,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2344: + case 2362: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15948 +//line mysql_sql.y:15990 { locale := "" yyLOCAL = &tree.T{ @@ -35985,10 +36194,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2345: + case 2363: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15961 +//line mysql_sql.y:16003 { locale := "" yyLOCAL = &tree.T{ @@ -36002,10 +36211,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2346: + case 2364: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15974 +//line mysql_sql.y:16016 { locale := "" yyLOCAL = &tree.T{ @@ -36019,10 +36228,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2347: + case 2365: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15987 +//line mysql_sql.y:16029 { locale := "" yyLOCAL = &tree.T{ @@ -36036,20 +36245,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2348: + case 2366: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:16002 +//line mysql_sql.y:16044 { yyLOCAL = &tree.Do{ Exprs: yyDollar[2].exprsUnion(), } } yyVAL.union = yyLOCAL - case 2349: + case 2367: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:16010 +//line mysql_sql.y:16052 { yyDollar[2].selectUnion().IsPerform = true if intoErr := tree.ValidatePerformSelectIntoPlacement(yyDollar[2].selectUnion()); intoErr != "" { @@ -36059,10 +36268,10 @@ yydefault: yyLOCAL = yyDollar[2].selectUnion() } yyVAL.union = yyLOCAL - case 2350: + case 2368: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:16021 +//line mysql_sql.y:16063 { yyLOCAL = &tree.Select{Select: yyDollar[1].selectStatementUnion(), TimeWindow: yyDollar[2].timeWindowUnion(), OrderBy: yyDollar[3].orderByUnion(), Limit: yyDollar[4].limitUnion(), RankOption: yyDollar[5].rankOptionUnion(), Ep: tree.SelectIntoExportOr(yyDollar[1].selectStatementUnion(), yyDollar[6].selectIntoUnion().Export), IntoVars: yyDollar[6].selectIntoUnion().UserVars, SelectLockInfo: yyDollar[7].selectLockInfoUnion()} if intoErr := tree.ValidatePerformSelectIntoPlacement(yyLOCAL); intoErr != "" { @@ -36071,10 +36280,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2351: + case 2369: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:16029 +//line mysql_sql.y:16071 { yyLOCAL = &tree.Select{Select: yyDollar[2].selectStatementUnion(), TimeWindow: yyDollar[3].timeWindowUnion(), OrderBy: yyDollar[4].orderByUnion(), Limit: yyDollar[5].limitUnion(), RankOption: yyDollar[6].rankOptionUnion(), Ep: tree.SelectIntoExportOr(yyDollar[2].selectStatementUnion(), yyDollar[7].selectIntoUnion().Export), IntoVars: yyDollar[7].selectIntoUnion().UserVars, SelectLockInfo: yyDollar[8].selectLockInfoUnion(), With: yyDollar[1].withClauseUnion()} if intoErr := tree.ValidatePerformSelectIntoPlacement(yyLOCAL); intoErr != "" { @@ -36083,10 +36292,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2352: + case 2370: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:16039 +//line mysql_sql.y:16081 { yyLOCAL = &tree.Declare{ Variables: yyDollar[2].strsUnion(), @@ -36095,10 +36304,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2353: + case 2371: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:16048 +//line mysql_sql.y:16090 { yyLOCAL = &tree.Declare{ Variables: yyDollar[2].strsUnion(), @@ -36107,51 +36316,51 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2354: + case 2372: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:16058 +//line mysql_sql.y:16100 { yyLOCAL = tree.NewSpatialType(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 2373: + case 2391: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:16086 +//line mysql_sql.y:16128 { yyLOCAL = make([]string, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].str) } yyVAL.union = yyLOCAL - case 2374: + case 2392: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:16091 +//line mysql_sql.y:16133 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 2375: + case 2393: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16097 +//line mysql_sql.y:16139 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 2377: + case 2395: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16104 +//line mysql_sql.y:16146 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 2378: + case 2396: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16108 +//line mysql_sql.y:16150 { value, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36160,18 +36369,18 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 2379: + case 2397: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16115 +//line mysql_sql.y:16157 { yyLOCAL = int32(-1) } yyVAL.union = yyLOCAL - case 2380: + case 2398: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16119 +//line mysql_sql.y:16161 { value, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36180,10 +36389,10 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 2381: + case 2399: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16127 +//line mysql_sql.y:16169 { value, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36192,10 +36401,10 @@ yydefault: yyLOCAL = tree.GetDisplayWith(value) } yyVAL.union = yyLOCAL - case 2382: + case 2400: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16135 +//line mysql_sql.y:16177 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.NotDefineDisplayWidth, @@ -36203,10 +36412,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2383: + case 2401: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16142 +//line mysql_sql.y:16184 { value, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36218,10 +36427,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2384: + case 2402: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16151 +//line mysql_sql.y:16193 { width, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36237,10 +36446,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2385: + case 2403: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16164 +//line mysql_sql.y:16206 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: 10, // MySQL default precision for DECIMAL/NUMERIC @@ -36248,10 +36457,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2386: + case 2404: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16171 +//line mysql_sql.y:16213 { value, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36263,10 +36472,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2387: + case 2405: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16180 +//line mysql_sql.y:16222 { width, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36282,104 +36491,104 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2388: + case 2406: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:16193 +//line mysql_sql.y:16235 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 2389: + case 2407: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:16197 +//line mysql_sql.y:16239 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 2390: + case 2408: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:16201 +//line mysql_sql.y:16243 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 2391: + case 2409: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:16207 +//line mysql_sql.y:16249 { } - case 2392: + case 2410: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:16209 +//line mysql_sql.y:16251 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 2396: + case 2414: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:16219 +//line mysql_sql.y:16261 { yyVAL.str = "" } - case 2397: + case 2415: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:16223 +//line mysql_sql.y:16265 { yyVAL.str = string(yyDollar[1].str) } - case 2913: + case 2937: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:16942 +//line mysql_sql.y:16990 { } - case 2914: + case 2938: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:16945 +//line mysql_sql.y:16993 { } - case 2915: + case 2939: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:16949 +//line mysql_sql.y:16997 { } - case 2916: + case 2940: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:16952 +//line mysql_sql.y:17000 { } - case 2917: + case 2941: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:16962 +//line mysql_sql.y:17010 { yyLOCAL = yyDollar[4].alterTableOptionsUnion() } yyVAL.union = yyLOCAL - case 2918: + case 2942: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:16966 +//line mysql_sql.y:17014 { yyLOCAL = append(yyDollar[1].alterTableOptionsUnion(), yyDollar[6].alterTableOptionsUnion()...) } yyVAL.union = yyLOCAL - case 2919: + case 2943: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:16972 +//line mysql_sql.y:17020 { position := tree.NewColumnPosition(tree.ColumnPositionNone, nil) yyLOCAL = tree.AlterTableOptions{tree.NewAlterAddCol(yyDollar[1].columnTableDefUnion(), position)} } yyVAL.union = yyLOCAL - case 2920: + case 2944: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:16977 +//line mysql_sql.y:17025 { position := tree.NewColumnPosition(tree.ColumnPositionNone, nil) yyLOCAL = append(yyDollar[1].alterTableOptionsUnion(), tree.NewAlterAddCol(yyDollar[3].columnTableDefUnion(), position)) diff --git a/pkg/sql/parsers/dialect/mysql/mysql_sql.y b/pkg/sql/parsers/dialect/mysql/mysql_sql.y index ae48ecd95bd3b..fe111ef0e7123 100644 --- a/pkg/sql/parsers/dialect/mysql/mysql_sql.y +++ b/pkg/sql/parsers/dialect/mysql/mysql_sql.y @@ -755,6 +755,9 @@ func makeWindowSpec(refName *tree.CStr, partitionBy tree.Exprs, orderBy tree.Ord %type create_account_stmt create_user_stmt create_role_stmt %type create_ddl_stmt create_table_stmt create_database_stmt create_index_stmt create_view_stmt create_function_stmt create_extension_stmt create_procedure_stmt create_sequence_stmt create_iceberg_catalog_stmt create_mongodb_connection_stmt %type pause_daemon_task_stmt cancel_daemon_task_stmt resume_daemon_task_stmt create_sql_task_stmt drop_sql_task_stmt alter_sql_task_stmt show_sql_tasks_stmt show_sql_task_runs_stmt +%type create_materialized_view_stmt refresh_materialized_view_stmt drop_materialized_view_stmt alter_materialized_view_stmt show_materialized_views_stmt +%type mv_refresh_policy mv_interval_unit +%token MATERIALIZED REFRESH MANUAL EVERY VIEWS REFRESHES %type show_stmt show_create_stmt show_columns_stmt show_databases_stmt show_target_filter_stmt show_table_status_stmt show_grants_stmt show_collation_stmt show_accounts_stmt show_roles_stmt show_stages_stmt show_snapshots_stmt show_upgrade_stmt show_rules_on_role_stmt show_iceberg_stmt show_mongodb_connections_stmt %type show_tables_stmt show_sequences_stmt show_process_stmt show_errors_stmt show_warnings_stmt show_target %type show_procedure_status_stmt show_function_status_stmt show_node_list_stmt show_locks_stmt @@ -1260,6 +1263,8 @@ normal_stmt: | reset_stmt | execute_stmt | show_stmt +| show_materialized_views_stmt +| refresh_materialized_view_stmt | alter_stmt | analyze_stmt | check_table_stmt @@ -4103,6 +4108,7 @@ alter_stmt: | alter_pitr_stmt | alter_role_stmt | alter_sql_task_stmt +| alter_materialized_view_stmt | alter_iceberg_catalog_stmt | alter_mongodb_connection_stmt | rename_stmt @@ -5907,6 +5913,7 @@ drop_ddl_stmt: | drop_pitr_stmt | drop_cdc_stmt | drop_sql_task_stmt +| drop_materialized_view_stmt | drop_iceberg_catalog_stmt | drop_mongodb_connection_stmt @@ -8681,6 +8688,7 @@ create_ddl_stmt: | create_database_stmt | create_index_stmt | create_view_stmt +| create_materialized_view_stmt | create_function_stmt | create_extension_stmt | create_sequence_stmt @@ -9006,6 +9014,40 @@ func_handler: $$ = $2 } + +create_materialized_view_stmt: + CREATE MATERIALIZED VIEW not_exists_opt table_name mv_refresh_policy AS ctas_select_stmt + { $$ = &tree.CreateMaterializedView{Name:$5, IfNotExists:$4, IntervalSeconds:$6, AsSource:$8} } + +mv_refresh_policy: + REFRESH MANUAL { $$ = 0 } +| REFRESH EVERY INTERVAL INTEGRAL mv_interval_unit + { + n := sqlTaskInt64($4) + if n <= 0 || n > 31536000 / $5 { yylex.Error("invalid materialized view refresh interval"); goto ret1 } + $$ = n * $5 + } + +mv_interval_unit: + SECOND { $$ = 1 } +| MINUTE { $$ = 60 } +| HOUR { $$ = 3600 } +| DAY { $$ = 86400 } + +refresh_materialized_view_stmt: + REFRESH MATERIALIZED VIEW table_name { $$ = &tree.RefreshMaterializedView{Name:$4} } + +drop_materialized_view_stmt: + DROP MATERIALIZED VIEW exists_opt table_name { $$ = &tree.DropMaterializedView{Name:$5, IfExists:$4} } + +alter_materialized_view_stmt: + ALTER MATERIALIZED VIEW table_name mv_refresh_policy { $$ = &tree.AlterMaterializedView{Name:$4, IntervalSeconds:$5} } + +show_materialized_views_stmt: + SHOW MATERIALIZED VIEWS { $$ = &tree.ShowMaterializedViews{} } +| SHOW MATERIALIZED VIEW REFRESHES table_name { $$ = &tree.ShowMaterializedViews{Name:$5, Runs:true} } +| SHOW CREATE MATERIALIZED VIEW table_name { $$ = &tree.ShowMaterializedViews{Name:$5, Create:true} } + create_view_stmt: CREATE view_list_opt VIEW not_exists_opt table_name column_list_opt AS ctas_select_stmt view_tail { @@ -16418,7 +16460,13 @@ equal_opt: //| MYSQL_COMPATIBILITY_MODE non_reserved_keyword: - ACCOUNT + MATERIALIZED +| REFRESH +| MANUAL +| EVERY +| VIEWS +| REFRESHES +| ACCOUNT | JSON_TABLE_PATH | JSON_TABLE_NESTED | JSON_TABLE_ORDINALITY diff --git a/pkg/sql/parsers/tree/materialized_view.go b/pkg/sql/parsers/tree/materialized_view.go new file mode 100644 index 0000000000000..6308a579004c5 --- /dev/null +++ b/pkg/sql/parsers/tree/materialized_view.go @@ -0,0 +1,119 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tree + +import "strconv" + +// A zero interval means manual refresh. Positive intervals are normalized seconds. +type CreateMaterializedView struct { + statementImpl + Name *TableName + AsSource *Select + IfNotExists bool + IntervalSeconds int64 +} + +func formatMVPolicy(ctx *FmtCtx, seconds int64) { + if seconds == 0 { + ctx.WriteString("refresh manual") + } else { + ctx.WriteString("refresh every interval ") + ctx.WriteString(strconv.FormatInt(seconds, 10)) + ctx.WriteString(" second") + } +} + +func (n *CreateMaterializedView) Format(ctx *FmtCtx) { + ctx.WriteString("create materialized view ") + if n.IfNotExists { + ctx.WriteString("if not exists ") + } + n.Name.Format(ctx) + ctx.WriteByte(' ') + formatMVPolicy(ctx, n.IntervalSeconds) + ctx.WriteString(" as ") + n.AsSource.Format(ctx) +} +func (*CreateMaterializedView) GetStatementType() string { return "Create Materialized View" } +func (*CreateMaterializedView) GetQueryType() string { return QueryTypeDDL } +func (*CreateMaterializedView) StmtKind() StmtKind { return defaultStatusTyp } + +type RefreshMaterializedView struct { + statementImpl + Name *TableName +} + +func (n *RefreshMaterializedView) Format(ctx *FmtCtx) { + ctx.WriteString("refresh materialized view ") + n.Name.Format(ctx) +} +func (*RefreshMaterializedView) GetStatementType() string { return "Refresh Materialized View" } +func (*RefreshMaterializedView) GetQueryType() string { return QueryTypeDDL } +func (*RefreshMaterializedView) StmtKind() StmtKind { return frontendStatusTyp } + +type DropMaterializedView struct { + statementImpl + Name *TableName + IfExists bool +} + +func (n *DropMaterializedView) Format(ctx *FmtCtx) { + ctx.WriteString("drop materialized view ") + if n.IfExists { + ctx.WriteString("if exists ") + } + n.Name.Format(ctx) +} +func (*DropMaterializedView) GetStatementType() string { return "Drop Materialized View" } +func (*DropMaterializedView) GetQueryType() string { return QueryTypeDDL } +func (*DropMaterializedView) StmtKind() StmtKind { return frontendStatusTyp } + +type AlterMaterializedView struct { + statementImpl + Name *TableName + IntervalSeconds int64 +} + +func (n *AlterMaterializedView) Format(ctx *FmtCtx) { + ctx.WriteString("alter materialized view ") + n.Name.Format(ctx) + ctx.WriteByte(' ') + formatMVPolicy(ctx, n.IntervalSeconds) +} +func (*AlterMaterializedView) GetStatementType() string { return "Alter Materialized View" } +func (*AlterMaterializedView) GetQueryType() string { return QueryTypeDDL } +func (*AlterMaterializedView) StmtKind() StmtKind { return frontendStatusTyp } + +type ShowMaterializedViews struct { + showImpl + Name *TableName + Runs bool + Create bool +} + +func (n *ShowMaterializedViews) Format(ctx *FmtCtx) { + if n.Create { + ctx.WriteString("show create materialized view ") + n.Name.Format(ctx) + } else if n.Runs { + ctx.WriteString("show materialized view refreshes ") + n.Name.Format(ctx) + } else { + ctx.WriteString("show materialized views") + } +} +func (*ShowMaterializedViews) GetStatementType() string { return "Show Materialized Views" } +func (*ShowMaterializedViews) GetQueryType() string { return QueryTypeOth } +func (*ShowMaterializedViews) StmtKind() StmtKind { return compositeResRowType } diff --git a/pkg/sql/plan/build.go b/pkg/sql/plan/build.go index 04dc8726f6007..faa2294bafea1 100644 --- a/pkg/sql/plan/build.go +++ b/pkg/sql/plan/build.go @@ -773,6 +773,8 @@ func BuildPlan(ctx CompilerContext, stmt tree.Statement, isPrepareStmt bool) (re return buildAlterSequence(stmt, ctx) case *tree.DropView: return buildDropView(stmt, ctx) + case *tree.CreateMaterializedView: + return buildCreateMaterializedView(stmt, ctx, isPrepareStmt) case *tree.CreateView: return buildCreateView(stmt, ctx) case *tree.AlterView: diff --git a/pkg/sql/plan/build_constraint_util.go b/pkg/sql/plan/build_constraint_util.go index 0f6f718aa4de7..1da8afc965252 100644 --- a/pkg/sql/plan/build_constraint_util.go +++ b/pkg/sql/plan/build_constraint_util.go @@ -494,6 +494,15 @@ func getUpdateTableInfo(ctx CompilerContext, stmt *tree.Update) (*dmlTableInfo, } func checkTableType(ctx context.Context, tableDef *TableDef, op string) error { + if tableDef.TableType == catalog.SystemMaterializedViewRel { + account, err := defines.GetAccountId(ctx) + if err != nil { + return err + } + if !defines.HasMaterializedViewWrite(ctx, account, tableDef.TblId) { + return moerr.NewInvalidInput(ctx, "materialized view is read only") + } + } if tableDef.TableType == catalog.SystemSourceRel { return moerr.NewInvalidInput(ctx, "cannot insert/update/delete from source") } else if tableDef.TableType == catalog.SystemExternalRel { diff --git a/pkg/sql/plan/build_ddl.go b/pkg/sql/plan/build_ddl.go index 5c7ea3c2aca89..7218ffc7e2760 100644 --- a/pkg/sql/plan/build_ddl.go +++ b/pkg/sql/plan/build_ddl.go @@ -2823,6 +2823,9 @@ func buildCreateTable( case *tree.TableOptionProperties: properties := make([]*plan.Property, len(opt.Preperties)) for idx, property := range opt.Preperties { + if property.Key == catalog.MaterializedViewProperty || (property.Key == catalog.SystemRelAttr_Kind && property.Value == catalog.SystemMaterializedViewRel) { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view properties are reserved") + } properties[idx] = &plan.Property{ Key: property.Key, Value: property.Value, @@ -7728,6 +7731,9 @@ func getForeignKeyData(ctx CompilerContext, dbName string, tableDef *TableDef, d if err != nil { return nil, err } + if parentTableDef != nil && parentTableDef.TableType == catalog.SystemMaterializedViewRel { + return nil, moerr.NewNotSupported(ctx.GetContext(), "foreign keys referencing materialized views") + } if err := validateTableIndexDefinitions(parentTableDef); err != nil { return nil, err } diff --git a/pkg/sql/plan/build_dml_util.go b/pkg/sql/plan/build_dml_util.go index 2ea5a6f10e707..cdd318feb6ee8 100644 --- a/pkg/sql/plan/build_dml_util.go +++ b/pkg/sql/plan/build_dml_util.go @@ -1090,7 +1090,7 @@ func buildDeletePlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindC // both UK and SK. To handle SK case, we will have flags to indicate if it's UK or SK. // Temporary DELETE is transactional row DML. A physical replacement would // enter the persistent-table lifecycle using its private physical name. - canTruncate := delCtx.isUnrestrictedDelete && !delCtx.tableDef.IsTemporary + canTruncate := delCtx.isUnrestrictedDelete && !delCtx.tableDef.IsTemporary && delCtx.tableDef.TableType != catalog.SystemMaterializedViewRel enabled, err := IsForeignKeyChecksEnabled(ctx) if err != nil { @@ -1115,10 +1115,18 @@ func buildDeletePlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindC } } + if canTruncate { + dependent, err := hasMaterializedViewDependents(ctx, delCtx.tableDef) + if err != nil { + return err + } + canTruncate = !dependent + } + lastNodeId := appendDeleteSourceScan() if !delCtx.skipTargetDelete { // create delete index plans - err = buildDeleteIndexPlans(ctx, builder, bindCtx, delCtx) + err = buildDeleteIndexPlans(ctx, builder, bindCtx, delCtx, canTruncate) if err != nil { return err } @@ -7089,7 +7097,7 @@ func indexNeedsRewriteForUpdate(tableDef *TableDef, indexdef *IndexDef, updateCo } // make delete index plans here -func buildDeleteIndexPlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindContext, delCtx *dmlPlanCtx) error { +func buildDeleteIndexPlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindContext, delCtx *dmlPlanCtx, canTruncate bool) error { isUpdate := delCtx.updateColLength > 0 @@ -7099,26 +7107,9 @@ func buildDeleteIndexPlans(ctx CompilerContext, builder *QueryBuilder, bindCtx * // both UK and SK. To handle SK case, we will have flags to indicate if it's UK or SK. hasUniqueKey := haveUniqueKey(delCtx.tableDef) hasSecondaryKey := haveSecondaryKey(delCtx.tableDef) - // Keep temporary index maintenance on the same row-delete path as its base - // table; skipping it would leave stale index entries after DELETE. - canTruncate := delCtx.isUnrestrictedDelete && !delCtx.tableDef.IsTemporary - - accountId, err := ctx.GetAccountId() - if err != nil { - return err - } - - enabled, err := IsForeignKeyChecksEnabled(ctx) - if err != nil { - return err - } - - if enabled && len(delCtx.tableDef.RefChildTbls) > 0 || - delCtx.tableDef.ViewSql != nil || - (util.TableIsClusterTable(delCtx.tableDef.GetTableType()) && accountId != catalog.System_Account) || - delCtx.objRef.PubInfo != nil { - canTruncate = false - } + // Share the base-table decision, including MV dependencies, partitions and + // delete_opt_to_truncate. Otherwise skipped index deletes leave stale keys. + var err error if (hasUniqueKey || hasSecondaryKey) && !canTruncate { typMap := make(map[string]plan.Type) diff --git a/pkg/sql/plan/build_show.go b/pkg/sql/plan/build_show.go index ad4fc3a91dd79..2f9201ca911a1 100644 --- a/pkg/sql/plan/build_show.go +++ b/pkg/sql/plan/build_show.go @@ -24,10 +24,12 @@ import ( "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/common/pubsub" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" "github.com/matrixorigin/matrixone/pkg/common/sqlquote" "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/defines" "github.com/matrixorigin/matrixone/pkg/frontend/databranchutils" + "github.com/matrixorigin/matrixone/pkg/mv" "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/sql/parsers" "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" @@ -159,6 +161,26 @@ func buildShowCreateTable(stmt *tree.ShowCreateTable, ctx CompilerContext) (*Pla if err = ValidateSnapshotScope(snapshot, dbName, tblName, tableDef.DbId, SnapshotTableID(tableDef)); err != nil { return nil, err } + if tableDef.TableType == catalog.SystemMaterializedViewRel { + if IsSnapshotValid(snapshot) { + return nil, moerr.NewNotSupported(ctx.GetContext(), "historical materialized view export") + } + account, err := ctx.GetAccountId() + if err != nil { + return nil, err + } + value, ok := moruntime.ServiceRuntime(ctx.GetProcess().GetService()).GetGlobalVariables(mv.RuntimeKey) + service, valid := value.(*mv.Service) + if !ok || !valid { + return nil, moerr.NewInternalError(ctx.GetContext(), "materialized view service is unavailable") + } + state, err := service.State(ctx.GetContext(), mv.Key{Account: account, ID: tableDef.TblId}) + if err != nil { + return nil, err + } + sql := fmt.Sprintf("SELECT %s AS `Table`, %s AS `Create Table`", formatStrLit(tblName), formatStrLit(state.CreateSQL())) + return returnByRewriteSQL(ctx, sql, plan.DataDefinition_SHOW_CREATETABLE) + } if tableDef.TableType == catalog.SystemViewRel { var newStmt *tree.ShowCreateView if stmt.Name.NumParts == 1 { @@ -368,7 +390,7 @@ func buildShowTables(stmt *tree.ShowTables, ctx CompilerContext) (*Plan, error) var tableType string if stmt.Full { - tableType = fmt.Sprintf(", case relkind when 'v' then 'VIEW' when '%s' then 'CLUSTER TABLE' else 'BASE TABLE' end as Table_type", catalog.SystemClusterRel) + tableType = fmt.Sprintf(", case relkind when 'v' then 'VIEW' when 'm' then 'MATERIALIZED VIEW' when '%s' then 'CLUSTER TABLE' else 'BASE TABLE' end as Table_type", catalog.SystemClusterRel) } subName := dbName diff --git a/pkg/sql/plan/build_table_clone.go b/pkg/sql/plan/build_table_clone.go index 3cc4185a56bf3..93aa332fc4911 100644 --- a/pkg/sql/plan/build_table_clone.go +++ b/pkg/sql/plan/build_table_clone.go @@ -94,6 +94,9 @@ func buildCloneTable( "table %v-%v does not exist", stmt.SrcTable.Schema(), stmt.SrcTable.Name()) } + if srcTblDef.TableType == catalog.SystemMaterializedViewRel { + return nil, moerr.NewNotSupported(ctx.GetContext(), "CLONE of materialized views") + } var ( dstTableName string dstDatabaseName string diff --git a/pkg/sql/plan/explain/sql_json_test.go b/pkg/sql/plan/explain/sql_json_test.go index a2c10bcb55196..fe8f96fa7fe40 100644 --- a/pkg/sql/plan/explain/sql_json_test.go +++ b/pkg/sql/plan/explain/sql_json_test.go @@ -1310,3 +1310,59 @@ func TestBuildSQLJSONPlanRejectsMalformedIndexSearchMetadata(t *testing.T) { }) } } + +func TestBuildSQLJSONPlanIndexSearchMetadataBoundaries(t *testing.T) { + for _, tc := range []struct { + name string + spec *plan.IndexSearchScan + }{ + {"missing metadata", nil}, + {"missing index", &plan.IndexSearchScan{}}, + {"unpaired algorithm expression", &plan.IndexSearchScan{ + Index: &plan.IndexDef{IndexName: "idx"}, AlgoExprs: []*plan.Expr{sqlJSONTestInt32(1)}, + }}, + {"empty algorithm expression name", &plan.IndexSearchScan{ + Index: &plan.IndexDef{IndexName: "idx"}, AlgoExprs: []*plan.Expr{sqlJSONTestInt32(1)}, AlgoExprNames: []string{""}, + }}, + {"malformed plugin options", &plan.IndexSearchScan{ + Index: &plan.IndexDef{IndexName: "idx", IndexAlgo: "ivfflat"}, AlgoOptions: []byte(`{`), + }}, + } { + t.Run(tc.name, func(t *testing.T) { + _, err := BuildSQLJSONPlan(t.Context(), &plan.Query{ + StmtType: plan.Query_SELECT, Steps: []int32{0}, + Nodes: []*plan.Node{{NodeType: plan.Node_INDEX_SEARCH_SCAN, IndexSearchScan: tc.spec}}, + }) + require.Error(t, err) + }) + } + + for _, tc := range []struct { + name string + node *plan.Node + }{ + {"fulltext", fulltextSearchScanNode(t)}, + {"opaque settings", &plan.Node{ + NodeType: plan.Node_INDEX_SEARCH_SCAN, + IndexSearchScan: &plan.IndexSearchScan{ + Index: &plan.IndexDef{IndexName: "idx", IndexAlgo: "unregistered"}, + AlgoOptions: []byte{0, 0xff, 1}, + }, + }}, + } { + t.Run(tc.name, func(t *testing.T) { + data, err := BuildSQLJSONPlan(t.Context(), &plan.Query{ + StmtType: plan.Query_SELECT, Steps: []int32{0}, Nodes: []*plan.Node{tc.node}, + }) + require.NoError(t, err) + var decoded sqlJSONPlan + require.NoError(t, json.Unmarshal(data, &decoded)) + require.Len(t, decoded.MatrixOne.Nodes, 1) + require.Contains(t, decoded.MatrixOne.Nodes[0].Expressions, fmt.Sprintf("algo_options=0x%X", tc.node.IndexSearchScan.AlgoOptions)) + if tc.name == "fulltext" { + require.Equal(t, "Fulltext Index Scan", decoded.MatrixOne.Nodes[0].Operator) + require.Contains(t, decoded.MatrixOne.Nodes[0].Expressions, "index=ft_body") + } + }) + } +} diff --git a/pkg/sql/plan/materialized_view.go b/pkg/sql/plan/materialized_view.go new file mode 100644 index 0000000000000..97152ff4b95d3 --- /dev/null +++ b/pkg/sql/plan/materialized_view.go @@ -0,0 +1,318 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plan + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "time" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/mv" + pb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/matrixorigin/matrixone/pkg/vm/process" +) + +// PreparedPlanDependsOnMaterializedViewDependencies identifies a destructive +// DELETE optimization whose eligibility is not captured by table schema versions. +// Another session can create an MV without changing the source definition. +func PreparedPlanDependsOnMaterializedViewDependencies(p *Plan) bool { + q := p.GetQuery() + if q == nil || q.GetStmtType() != pb.Query_DELETE { + return false + } + for _, node := range q.GetNodes() { + if node.GetNodeType() == pb.Node_DELETE && node.GetDeleteCtx().GetCanTruncate() { + return true + } + } + return false +} + +// ValidateMaterializedViewSelect is a bounded definition-time AST check. This +// deliberately admits a smaller language than ordinary SELECT in the first release. +func ValidateMaterializedViewSelect(ctx CompilerContext, stmt *tree.Select) error { + if stmt == nil || stmt.With != nil || stmt.Limit != nil || len(stmt.OrderBy) != 0 || stmt.RankOption != nil || stmt.TimeWindow != nil || stmt.SelectLockInfo != nil || stmt.Ep != nil || len(stmt.IntoVars) != 0 { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view requires a deterministic native-table SELECT without CTE, ORDER BY, LIMIT, window, snapshot or locking clauses") + } + clause, ok := stmt.Select.(*tree.SelectClause) + if !ok || clause.Distinct || len(clause.Windows) != 0 || clause.IntoExport != nil || len(clause.IntoVars) != 0 { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view query shape") + } + count := 0 + var walk func(reflect.Value, int) error + walk = func(v reflect.Value, depth int) error { + if !v.IsValid() { + return nil + } + if depth > 128 || count > 4096 { + return moerr.NewInvalidInput(ctx.GetContext(), "materialized view definition exceeds binding budget") + } + count++ + if v.Kind() == reflect.Interface { + if v.IsNil() { + return nil + } + return walk(v.Elem(), depth+1) + } + if v.Kind() == reflect.Pointer { + if v.IsNil() { + return nil + } + if v.CanInterface() { + switch n := v.Interface().(type) { + case *tree.VarExpr, *tree.Subquery, *tree.Select, *tree.SampleExpr, *tree.ParamExpr, *tree.DefaultVal: + return moerr.NewNotSupported(ctx.GetContext(), "materialized view variable or subquery") + case *tree.JoinTableExpr: + if n.Right != nil && n.JoinType != tree.JOIN_TYPE_INNER && n.JoinType != "" { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view supports inner joins only") + } + case *tree.GroupByClause: + if n.Cube || n.Rollup || n.GroupingSets { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view grouping sets") + } + case *tree.TableName: + if n.AtTsExpr != nil { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view historical source") + } + case *tree.FuncExpr: + if n.WindowSpec != nil || n.Type == tree.FUNC_TYPE_DISTINCT || n.FuncName == nil { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view aggregate/function shape") + } + name := strings.ToLower(n.FuncName.Compare()) + ref, ok := n.Func.FunctionReference.(*tree.UnresolvedName) + if !ok || ref.NumParts != 1 || n.IsGeneric && mysql.IsSQLModeSensitiveFunctionName(name) { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view qualified or user-defined function") + } + switch name { + case "sum", "count", "min", "max", "avg", "cast", "abs", "coalesce", "ifnull", "if", "year", "month", "date", "date_trunc", "concat", "concat_ws": + default: + return moerr.NewNotSupportedf(ctx.GetContext(), "materialized view function %s", name) + } + } + } + return walk(v.Elem(), depth+1) + } + switch v.Kind() { + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + if v.Type().Field(i).PkgPath == "" { + if err := walk(v.Field(i), depth+1); err != nil { + return err + } + } + } + case reflect.Slice: + for i := 0; i < v.Len(); i++ { + if err := walk(v.Index(i), depth+1); err != nil { + return err + } + } + } + return nil + } + return walk(reflect.ValueOf(clause), 0) +} + +func buildCreateMaterializedView(stmt *tree.CreateMaterializedView, ctx CompilerContext, isPrepare bool) (*Plan, error) { + enabled, enableErr := ctx.ResolveVariable("experimental_materialized_view", true, false) + if enableErr != nil { + return nil, enableErr + } + if enabled != int8(1) && enabled != int64(1) && enabled != uint64(1) && enabled != true { + return nil, moerr.NewNotSupported(ctx.GetContext(), "enable experimental_materialized_view before creating a materialized view") + } + if err := RequirePersistedProtocolVersionForAuthoring(ctx.GetContext(), ctx.GetProcess(), defines.MORPCVersion122); err != nil { + return nil, err + } + if stmt.IntervalSeconds != 0 && stmt.IntervalSeconds < 60 { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view refresh interval must be at least 60 seconds") + } + if err := ValidateMaterializedViewSelect(ctx, stmt.AsSource); err != nil { + return nil, err + } + db := string(stmt.Name.SchemaName) + if db == "" { + db = ctx.DefaultDatabase() + } + if !catalog.IsMaterializedViewDatabase(db) { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view requires a user database") + } + account, err := ctx.GetAccountId() + if err != nil { + return nil, err + } + inferred, err := inferViewColumns(&materializedViewSourceContext{CompilerContext: ctx, database: db}, stmt.AsSource, nil, db, string(stmt.Name.ObjectName), true) + if err != nil { + return nil, err + } + if len(inferred.dependencies) == 0 || len(inferred.dependencies) > 16 || len(inferred.columns) > 256 { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view requires 1..16 native sources and at most 256 columns") + } + names := make(map[string]struct{}, len(inferred.columns)) + for _, column := range inferred.columns { + name := strings.ToLower(column.Name) + if _, duplicate := names[name]; duplicate { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view output names must be unique; use explicit aliases") + } + names[name] = struct{}{} + } + precision := resolveDivPrecisionIncrement(ctx) + definition := catalog.MVDefinition{FormatVersion: catalog.MVDefinitionFormatVersion, DivPrecisionIncrement: &precision, TimeZoneKind: "fixed", TimeZone: "UTC", Database: db, IntervalSeconds: stmt.IntervalSeconds, LowerCaseTableNames: ctx.GetLowerCaseTableNames(), OwnerUser: defines.GetUserId(ctx.GetContext()), OwnerRole: defines.GetRoleId(ctx.GetContext()), OwnerName: materializedViewOwnerName(ctx.GetUserName())} + if mode := parserSQLModeFromContext(ctx); mode != nil { + definition.SQLMode = *mode + } + if proc := ctx.GetProcess(); proc != nil && proc.GetSessionInfo().TimeZone != nil { + zone := proc.GetSessionInfo().TimeZone + if name := process.TimeZoneLocationName(zone); name != "" { + definition.TimeZoneKind, definition.TimeZone = "named", name + } else if process.IsFixedTimeZone(zone) { + definition.TimeZone = zone.String() + } else { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "select an explicit named or fixed time_zone before creating a materialized view") + } + _, offset := time.Now().In(zone).Zone() + definition.TimeZoneOffset = int32(offset) + } + for _, d := range inferred.dependencies { + _, sourceDef, resolveErr := ctx.Resolve(d.DatabaseName, d.RelationName, nil) + if resolveErr != nil { + return nil, resolveErr + } + if sourceDef == nil || sourceDef.IsTemporary { + return nil, moerr.NewNotSupported(ctx.GetContext(), "materialized view temporary source") + } + if d.AccountID != account || d.DatabaseName != db || d.RelationKind != catalog.SystemOrdinaryRel || d.SubscriptionName != "" || IsSnapshotValid(d.Snapshot) { + return nil, moerr.NewNotSupported(ctx.GetContext(), "materialized view sources must be persistent native tables in the same account/database") + } + definition.Sources = append(definition.Sources, catalog.MVSource{AccountID: d.AccountID, DatabaseID: d.DatabaseID, TableID: d.RelationID, LogicalID: d.LogicalID, Version: d.Version, Database: d.DatabaseName, Table: d.RelationName}) + } + source := stmt.AsSource + if stable, ok := viewSelectWithExpandedStars(source, inferred.expandedSelectLists); ok { + source = stable + } + definition.Query = tree.StringWithOpts(source, dialect.MYSQL, tree.WithQuoteIdentifier(), tree.WithSingleQuoteString(), tree.WithModeIndependentStringLiterals()) + stableStatement := *stmt + stableStatement.AsSource = source + definition.CreateSQL = tree.StringWithOpts(&stableStatement, dialect.MYSQL, tree.WithQuoteIdentifier(), tree.WithSingleQuoteString(), tree.WithModeIndependentStringLiterals()) + if len(definition.Query) > 65536 { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view query exceeds 64 KiB") + } + ctas := &tree.CreateTable{Table: *stmt.Name, IfNotExists: stmt.IfNotExists, IsAsSelect: true, AsSource: source} + p, err := buildCreateTable(ctx, ctas, nil, isPrepare) + if err != nil { + return nil, err + } + c := p.GetDdl().GetCreateTable() + c.CreateAsSelectSql = "" + p.GetDdl().Query = nil + c.TableDef.TableType = catalog.SystemMaterializedViewRel + data, err := json.Marshal(definition) + if err != nil { + return nil, err + } + for _, d := range c.TableDef.Defs { + if props := d.GetProperties(); props != nil { + for _, pr := range props.Properties { + if pr.Key == catalog.SystemRelAttr_Kind { + pr.Value = catalog.SystemMaterializedViewRel + } + if pr.Key == catalog.SystemRelAttr_CreateSQL { + pr.Value = definition.CreateSQL + } + } + } + } + c.TableDef.Defs = append(c.TableDef.Defs, &pb.TableDef_DefType{Def: &pb.TableDef_DefType_Properties{Properties: &pb.PropertiesDef{Properties: []*pb.Property{{Key: catalog.MaterializedViewProperty, Value: string(data)}}}}}) + return p, nil +} + +// Reject unsupported source kinds at resolution, before view expansion or an +// external connector can run. Capturing dependencies after expansion alone is +// too late to enforce the P1 native-source contract. +type materializedViewSourceContext struct { + CompilerContext + database string +} + +func (c *materializedViewSourceContext) Resolve(database, table string, snapshot *Snapshot) (*ObjectRef, *TableDef, error) { + if database == "" { + database = c.DefaultDatabase() + } + if database != c.database || IsSnapshotValid(snapshot) { + return nil, nil, moerr.NewNotSupported(c.GetContext(), "materialized view sources require the current native database") + } + ref, def, err := c.CompilerContext.Resolve(database, table, snapshot) + if err != nil || def == nil { + return ref, def, err + } + if def.TableType != catalog.SystemOrdinaryRel || def.IsTemporary || ref != nil && (ref.PubInfo != nil || ref.SubscriptionName != "") { + return nil, nil, moerr.NewNotSupported(c.GetContext(), "materialized view sources must be persistent native tables") + } + return ref, def, nil +} + +// The wire username may include account and role, unlike mo_user.user_name. +func materializedViewOwnerName(wire string) string { + parts := strings.Split(wire, ":") + if len(parts) >= 2 { + return parts[1] + } + return wire +} + +// hasMaterializedViewDependents prevents a row DELETE from replacing the +// physical identity pinned by an MV. Resolve admits pre-migration catalogs; +// the indexed probe shares the statement transaction and tenant identity. +func hasMaterializedViewDependents(ctx CompilerContext, table *TableDef) (bool, error) { + proc := ctx.GetProcess() + if proc == nil { + return false, nil + } + if _, available := moruntime.ServiceRuntime(proc.GetService()).GetGlobalVariables(mv.RuntimeKey); !available { + return false, nil + } + _, dependencies, err := ctx.Resolve(catalog.MO_CATALOG, catalog.MO_MV_DEPENDENCIES, nil) + if moerr.IsMoErrCode(err, moerr.ErrNoSuchTable) { + return false, nil + } + if err != nil { + return false, err + } + if dependencies == nil { + return false, nil + } + account, err := ctx.GetAccountId() + if err != nil { + return false, err + } + result, err := runSql(ctx, fmt.Sprintf("select mv_id from mo_catalog.mo_mv_dependencies where account_id=%d and source_table_id=%d limit 1", account, table.TblId)) + if err != nil { + return false, err + } + defer result.Close() + found := false + result.ReadRows(func(n int, _ []*vector.Vector) bool { found = n > 0; return !found }) + return found, nil +} diff --git a/pkg/sql/plan/materialized_view_delete_test.go b/pkg/sql/plan/materialized_view_delete_test.go new file mode 100644 index 0000000000000..d59ee02238e35 --- /dev/null +++ b/pkg/sql/plan/materialized_view_delete_test.go @@ -0,0 +1,122 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plan + +import ( + "context" + "errors" + "fmt" + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/mv" + pb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/vm/process" + "github.com/stretchr/testify/require" +) + +type materializedViewDeleteContext struct { + *MockCompilerContext + sql executor.SQLExecutor + catalogError error + missing bool +} + +func (c *materializedViewDeleteContext) getInternalSQLExecutor(*process.Process) (executor.SQLExecutor, bool) { + return c.sql, true +} +func (c *materializedViewDeleteContext) Resolve(db, name string, snapshot *Snapshot) (*ObjectRef, *TableDef, error) { + if db == catalog.MO_CATALOG && name == catalog.MO_MV_DEPENDENCIES { + if c.catalogError != nil { + return nil, nil, c.catalogError + } + if c.missing { + return nil, nil, nil + } + return &ObjectRef{SchemaName: db, ObjName: name}, &TableDef{Name: name}, nil + } + return c.MockCompilerContext.Resolve(db, name, snapshot) +} +func TestMaterializedViewSourceDeleteRetainsRelation(t *testing.T) { + for _, name := range []string{"dependent", "independent", "pre-migration", "missing catalog error", "catalog failure", "probe failure"} { + t.Run(name, func(t *testing.T) { + proc := newPlanTestProcess(t) + proc.ReplaceTopCtx(defines.AttachAccountId(context.Background(), 0)) + base := NewMockCompilerContext(true, proc) + c := &materializedViewDeleteContext{MockCompilerContext: base, missing: name == "pre-migration"} + injected := errors.New("metadata unavailable") + if name == "catalog failure" { + c.catalogError = injected + } + if name == "missing catalog error" { + c.catalogError = moerr.NewNoSuchTable(proc.Ctx, catalog.MO_CATALOG, catalog.MO_MV_DEPENDENCIES) + } + setPlanTestGlobalVariable(t, proc.GetService(), mv.RuntimeKey, true) + mp := mpool.MustNewZero() + t.Cleanup(func() { defer mpool.DeleteMPool(mp); require.Zero(t, mp.CurrNB()) }) + calls := 0 + table := base.tables["nation"] + c.sql = executor.NewMemExecutor(func(sql string) (executor.Result, error) { + calls++ + require.Equal(t, fmt.Sprintf("select mv_id from mo_catalog.mo_mv_dependencies where account_id=0 and source_table_id=%d limit 1", table.TblId), sql) + if name == "probe failure" { + return executor.Result{}, injected + } + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType()}, mp) + if name == "dependent" { + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint64{99})) + } + return r.GetResult(), nil + }) + dml := &DMLContext{tableDefs: []*TableDef{table}, objRefs: []*ObjectRef{{SchemaName: "tpch", ObjName: "nation"}}, isClusterTable: []bool{false}} + // This modern-planner hint only requests legacy planning; it does + // not execute a truncate. Probe once at physical eligibility below. + allowed, err := canDeleteRewriteToTruncate(c, dml) + require.NoError(t, err) + require.True(t, allowed) + require.Zero(t, calls) + stmt, err := mysql.ParseOne(c.GetContext(), "delete from tpch.nation", 1) + require.NoError(t, err) + defer stmt.Free() + p, err := buildDelete(stmt.(*tree.Delete), c, false) + if name == "catalog failure" || name == "probe failure" { + require.ErrorIs(t, err, injected) + return + } + require.NoError(t, err) + found := false + for _, n := range p.GetQuery().Nodes { + if n.NodeType == pb.Node_DELETE && n.DeleteCtx.TableDef.TblId == table.TblId { + found = true + require.Equal(t, name != "dependent", n.DeleteCtx.CanTruncate) + } + } + require.True(t, found) + if name == "dependent" || name == "independent" { + require.Equal(t, 1, calls, "index eligibility must reuse the base-table decision") + } else { + require.Zero(t, calls) + } + }) + } +} diff --git a/pkg/sql/plan/materialized_view_test.go b/pkg/sql/plan/materialized_view_test.go new file mode 100644 index 0000000000000..a51b238a0b560 --- /dev/null +++ b/pkg/sql/plan/materialized_view_test.go @@ -0,0 +1,247 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plan + +import ( + "context" + "testing" + "time" + + "github.com/matrixorigin/matrixone/pkg/vm/process" + + "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/catalog" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/defines" + pb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewRefreshDeleteRetainsRelation(t *testing.T) { + for _, kind := range []string{catalog.SystemOrdinaryRel, catalog.SystemMaterializedViewRel} { + t.Run(kind, func(t *testing.T) { + proc := newPlanTestProcess(t) + ctx := NewMockCompilerContext(true, proc) + table := ctx.tables["nation"] + table.TableType = kind + ctx.SetContext(defines.WithMaterializedViewWrite( + defines.AttachAccountId(proc.Ctx, 0), 0, table.TblId, []byte("refresh"))) + stmt, err := mysql.ParseOne(ctx.GetContext(), "delete from tpch.nation", 1) + require.NoError(t, err) + defer stmt.Free() + // Unrestricted DELETE reaches the legacy planner, which must keep + // the MV's physical identity for the refresh publication transaction. + p, err := buildDelete(stmt.(*tree.Delete), ctx, false) + require.NoError(t, err) + found := false + for _, node := range p.GetQuery().Nodes { + if node.NodeType == pb.Node_DELETE && node.DeleteCtx.TableDef.TblId == table.TblId { + found = true + require.Equal(t, kind == catalog.SystemOrdinaryRel, node.DeleteCtx.CanTruncate) + } + } + require.True(t, found, "expected an origin-table DELETE node") + }) + } +} + +func TestMaterializedViewSelectContract(t *testing.T) { + ctx := NewMockCompilerContext2(gomock.NewController(t)) + ctx.EXPECT().GetContext().Return(context.Background()).AnyTimes() + for _, tc := range []struct { + sql string + allowed bool + }{ + {"select k,sum(v),count(*),min(v),max(v),avg(v) from t where v>0 group by k", true}, + {"select a.k,b.v from a inner join b on a.k=b.k", true}, + {"select a.k,b.v from a left join b on a.k=b.k", false}, + {"select rand() from t", false}, {"select now() from t", false}, + {"select distinct k from t", false}, {"select count(distinct k) from t", false}, + {"select k from t limit 1", false}, {"select k from t order by k", false}, + {"select @secret from t", false}, {"select k from t where k in (select k from s)", false}, + {"with x as (select * from t) select * from x", false}, + {"select row_number() over (order by k) from t", false}, + {"select k from t union all select k from s", false}, + {"select sample(k, 1 rows) from t", false}, + {"select ? from t", false}, + {"select uuid() from t", false}, + {"select sum (v) from t", false}, + {"select current_timestamp() from t", false}, + {"select k from t for update", false}, + {"select a.k from a cross join b", false}, + {"select a.k from a right join b on a.k=b.k", false}, + {"select k,sum(v) from t group by k with rollup", false}, + {"select k from t {MO_TS = 123}", false}, + {"select k from t {SNAPSHOT = 'snapshot'}", false}, + {"select cast(v as decimal(20,2)),abs(v),coalesce(v,0) from t where k is not null", true}, + {"select k,sum(v) from t group by k having sum(v)>10", true}, + {"select concat(k,'x') from t", true}, + } { + t.Run(tc.sql, func(t *testing.T) { + stmts, err := mysql.Parse(context.Background(), tc.sql, 1) + require.NoError(t, err) + defer stmts[0].Free() + err = ValidateMaterializedViewSelect(ctx, stmts[0].(*tree.Select)) + if tc.allowed { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } +} + +type materializedViewPlanContext struct { + *MockCompilerContext + enabled bool +} + +func (c *materializedViewPlanContext) ResolveVariable(name string, system, global bool) (interface{}, error) { + if name == "experimental_materialized_view" { + if c.enabled { + return int8(1), nil + } + return int8(0), nil + } + return c.MockCompilerContext.ResolveVariable(name, system, global) +} +func TestMaterializedViewCreatePlan(t *testing.T) { + for _, scenario := range []string{"aggregate", "star", "gate disabled", "old protocol", "old authoring floor", "temporary source", "view source", "cross database", "short interval", "duplicate headings"} { + t.Run(scenario, func(t *testing.T) { + proc := newPlanTestProcess(t) + proc.GetSessionInfo().TimeZone = time.UTC + base := NewMockCompilerContext(false, proc) + base.SetContext(proc.Ctx) + ctx := &materializedViewPlanContext{base, true} + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.MOProtocolVersion, int64(defines.MORPCVersion122)) + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.PersistedExpressionProtocolAuthoringFloor, int64(defines.MORPCVersion122)) + query := "create materialized view stored refresh manual as select n_regionkey,sum(n_nationkey) as s,count(*) as n from nation group by n_regionkey" + switch scenario { + case "star": + query = "create materialized view stored refresh manual as select * from nation" + case "gate disabled": + ctx.enabled = false + case "old protocol": + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.MOProtocolVersion, int64(defines.MORPCVersion121)) + case "old authoring floor": + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.PersistedExpressionProtocolAuthoringFloor, int64(defines.MORPCVersion121)) + case "temporary source": + base.tables["nation"].IsTemporary = true + case "view source": + base.tables["nation"].TableType = catalog.SystemViewRel + case "cross database": + query = "create materialized view bvt_test1.stored refresh manual as select * from tpch.nation" + case "short interval": + query = "create materialized view stored refresh every interval 1 second as select * from nation" + case "duplicate headings": + query = "create materialized view stored refresh manual as select n_nationkey as x,n_regionkey as x from nation" + } + stmt, err := mysql.ParseOne(proc.Ctx, query, 1) + require.NoError(t, err) + defer stmt.Free() + p, err := BuildPlan(ctx, stmt, false) + if scenario != "aggregate" && scenario != "star" { + require.Error(t, err) + return + } + require.NoError(t, err) + create := p.GetDdl().GetCreateTable() + require.NotNil(t, create) + require.Empty(t, create.CreateAsSelectSql) + require.Nil(t, p.GetDdl().Query) + require.Equal(t, catalog.SystemMaterializedViewRel, create.TableDef.TableType) + definition, err := catalog.MaterializedViewDefinition(create.TableDef) + require.NoError(t, err) + require.Len(t, definition.Sources, 1) + require.Equal(t, "nation", definition.Sources[0].Table) + require.Equal(t, "tpch", definition.Database) + require.NotContains(t, definition.Query, "select *") + if scenario == "aggregate" { + require.Equal(t, "n_regionkey", create.TableDef.Cols[0].Name) + require.Equal(t, "s", create.TableDef.Cols[1].Name) + require.Equal(t, "n", create.TableDef.Cols[2].Name) + } + }) + } +} + +func TestMaterializedViewCatalogPlans(t *testing.T) { + ctx := NewMockCompilerContext(false, newPlanTestProcess(t)) + for _, ddl := range catalog.MaterializedViewCatalogDDLs { + stmt, err := mysql.ParseOne(context.Background(), ddl, 1) + require.NoError(t, err) + func() { + defer stmt.Free() + p, err := BuildPlan(ctx, stmt, false) + require.NoError(t, err) + kind := "" + for _, def := range p.GetDdl().GetCreateTable().TableDef.Defs { + if props := def.GetProperties(); props != nil { + for _, property := range props.Properties { + if property.Key == catalog.SystemRelAttr_Kind { + kind = property.Value + } + } + } + } + require.Equal(t, catalog.SystemClusterRel, kind) + require.NotNil(t, FindColumn(p.GetDdl().GetCreateTable().TableDef.Cols, "account_id")) + require.NotNil(t, p.GetDdl().GetCreateTable().TableDef.Pkey) + }() + } +} + +func TestMaterializedViewAuthoringTimeZoneIdentity(t *testing.T) { + for _, name := range []string{"America/New_York", "fixed named like IANA", "Local"} { + t.Run(name, func(t *testing.T) { + zone, err := time.LoadLocation("America/New_York") + require.NoError(t, err) + if name == "fixed named like IANA" { + zone = time.FixedZone("America/New_York", 3600) + } + if name == "Local" { + zone = time.Local + if process.IsFixedTimeZone(zone) { + t.Skip("this host's Local has no rules; fixed identity is covered separately") + } + } + proc := newPlanTestProcess(t) + proc.GetSessionInfo().TimeZone = zone + ctx := &materializedViewPlanContext{NewMockCompilerContext(false, proc), true} + ctx.SetContext(proc.Ctx) + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.MOProtocolVersion, int64(defines.MORPCVersion122)) + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.PersistedExpressionProtocolAuthoringFloor, int64(defines.MORPCVersion122)) + stmt, err := mysql.ParseOne(proc.Ctx, "create materialized view stored refresh manual as select * from nation", 1) + require.NoError(t, err) + defer stmt.Free() + p, err := BuildPlan(ctx, stmt, false) + if name == "Local" { + require.ErrorContains(t, err, "explicit named or fixed time_zone") + return + } + require.NoError(t, err) + def, err := catalog.MaterializedViewDefinition(p.GetDdl().GetCreateTable().TableDef) + require.NoError(t, err) + want := "named" + if name == "fixed named like IANA" { + want = "fixed" + } + require.Equal(t, want, def.TimeZoneKind) + require.Equal(t, "America/New_York", def.TimeZone) + }) + } +} diff --git a/pkg/sql/plan/nullif_rebind_test.go b/pkg/sql/plan/nullif_rebind_test.go index 8069c95ae431c..e742295e1b0c1 100644 --- a/pkg/sql/plan/nullif_rebind_test.go +++ b/pkg/sql/plan/nullif_rebind_test.go @@ -58,6 +58,9 @@ func TestInitNullMapRebindReturnsSameRules(t *testing.T) { require.NoError(t, InitNullMap(param, nil)) require.Equal(t, tc.want, param.NullMap, "rebind %d", pass) } + for i, assignment := range param.Tail.Assignments { + require.Nil(t, assignment.Expr, "assignment %d must be consumed before serialization", i) + } // The stored external-table parameter must retain the same rules // after repeated binding and a remote JSON round trip. raw, err := json.Marshal(param) diff --git a/pkg/sql/plan/query_builder.go b/pkg/sql/plan/query_builder.go index 8c735373ad161..637258342333b 100644 --- a/pkg/sql/plan/query_builder.go +++ b/pkg/sql/plan/query_builder.go @@ -13087,6 +13087,9 @@ func (builder *QueryBuilder) buildTable(stmt tree.TableExpr, ctx *BindContext, t return 0, "", err } + if tableDef.TableType == catalog.SystemMaterializedViewRel && obj.PubInfo != nil { + return 0, "", moerr.NewNotSupported(builder.GetContext(), "materialized views through subscriptions/publications") + } // Empty-result rewrites can remove scans, not semantic dependencies. // Capture evidence before optimization, including intermediate Views, // snapshots, and ordinary tables that may later be replaced by Views. @@ -13327,6 +13330,8 @@ func (builder *QueryBuilder) buildTable(stmt tree.TableExpr, ctx *BindContext, t } } else if tableDef.TableType == catalog.SystemSourceRel { return 0, "", moerr.NewNotSupportedf(builder.GetContext(), "source table %s.%s", schema, table) + } else if tableDef.TableType == catalog.SystemMaterializedViewRel && (builder.isHistoricalSnapshot(snapshot) || IsSnapshotValid(builder.compCtx.GetSnapshot())) { + return 0, "", moerr.NewNotSupported(builder.GetContext(), "historical materialized view reads") } else if tableDef.TableType == catalog.SystemViewRel { // CREATE OR REPLACE VIEW and ALTER VIEW change the current catalog // object. A same-named View resolved from an explicit historical diff --git a/pkg/tests/issues/issue_29400_test.go b/pkg/tests/issues/issue_29400_test.go index feb95b0331121..d212eba723f3c 100644 --- a/pkg/tests/issues/issue_29400_test.go +++ b/pkg/tests/issues/issue_29400_test.go @@ -623,7 +623,10 @@ func TestIssue29400CopyAlterRetainedGatePromotionFastFails(t *testing.T) { execSQLRequire(t, ctx, db0, "create table "+solo+".fk_guard(i int)") holder, err := db0.BeginTx(ctx, nil) require.NoError(t, err) - operationCtx, cancelOperation := context.WithTimeout(ctx, 15*time.Second) + // The waiter stays blocked while we inspect catalogs and commit + // its lock holder. Bound it by the existing test deadline rather + // than charging that coordination/commit I/O to a second timer. + operationCtx, cancelOperation := context.WithCancel(ctx) defer cancelOperation() var done chan error finished := false diff --git a/pkg/tests/sqlintegration/materialized_view_semantics_test.go b/pkg/tests/sqlintegration/materialized_view_semantics_test.go new file mode 100644 index 0000000000000..fa986df312862 --- /dev/null +++ b/pkg/tests/sqlintegration/materialized_view_semantics_test.go @@ -0,0 +1,230 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sqlintegration + +import ( + "context" + "database/sql" + "fmt" + "strings" + "testing" + "time" + + "github.com/go-sql-driver/mysql" + "github.com/matrixorigin/matrixone/pkg/embed" + "github.com/stretchr/testify/require" +) + +// One authenticated shared fixture covers persisted semantics and live reads. +// Values and wire column scales are independent oracles, not plan self-checks. +func TestMaterializedViewCapturedSemantics(t *testing.T) { + runSQLIntegration(t, func(c embed.Cluster) { + cn, err := c.GetCNService(0) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + defer cancel() + port := cn.GetServiceConfig().CN.Frontend.Port + db, err := sql.Open("mysql", fmt.Sprintf("dump:111@tcp(127.0.0.1:%d)/", port)) + require.NoError(t, err) + defer db.Close() + conn, err := db.Conn(ctx) + require.NoError(t, err) + defer conn.Close() + const schema = "mv_captured_semantics" + views := []string{"precision_0", "precision_4", "precision_10", "precision_30", "mode_mv", "named_mv", "fixed_mv", "failure_mv"} + cleanup := make([]string, 0, len(views)+3) + cleanup = append(cleanup, "drop user if exists mv_semantics_reader", "drop role if exists mv_semantics_role") + for _, v := range views { + cleanup = append(cleanup, "drop materialized view if exists "+schema+"."+v) + } + cleanup = append(cleanup, "drop database if exists "+schema) + defer func() { cleanupSQLIntegration(t, cn, cleanup...) }() + exec := func(q string, args ...any) { + t.Helper() + _, err := conn.ExecContext(ctx, q, args...) + require.NoError(t, err, q) + } + scalar := func(q string) string { + t.Helper() + var s string + require.NoError(t, conn.QueryRowContext(ctx, q).Scan(&s), q) + return s + } + reject := func(q, reason string) { + t.Helper() + _, err := conn.ExecContext(ctx, q) + require.ErrorContains(t, err, reason, q) + } + empty := func(q sqlQuerier) { + t.Helper() + rows, err := q.QueryContext(ctx, "select * from precision_10 limit 0") + require.NoError(t, err) + defer rows.Close() + cols, err := rows.ColumnTypes() + require.NoError(t, err) + require.Len(t, cols, 1) + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + } + exec("create database " + schema) + exec("use " + schema) + exec("set experimental_materialized_view=1") + exec("set time_zone='+00:00'") + exec("create table facts(a decimal(10,0))") + exec("insert into facts values(1)") + for _, precision := range []int{0, 4, 10, 30} { + name := fmt.Sprintf("precision_%d", precision) + exec(fmt.Sprintf("set div_precision_increment=%d", precision)) + exec("create materialized view " + name + " refresh manual as select a/3 as q from facts") + reject("select * from "+name+" limit 0", "MV_NOT_POPULATED") + reject("select * from "+name+" where false", "MV_NOT_POPULATED") + exec("set div_precision_increment=4") + exec("refresh materialized view " + name) + rows, err := conn.QueryContext(ctx, "select q from "+name) + require.NoError(t, err) + func() { + defer rows.Close() + cols, err := rows.ColumnTypes() + require.NoError(t, err) + require.Len(t, cols, 1) + _, scale, ok := cols[0].DecimalSize() + require.True(t, ok) + require.Equal(t, int64(precision), scale) + require.True(t, rows.Next()) + var got string + require.NoError(t, rows.Scan(&got)) + want := "0" + if precision > 0 { + want = "0." + strings.Repeat("3", precision) + } + require.Equal(t, want, got) + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + }() + } + empty(conn) + func() { + rows, err := conn.QueryContext(ctx, "select * from facts limit 0") + require.NoError(t, err) + defer rows.Close() + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + }() + exec("set sql_mode='NO_UNSIGNED_SUBTRACTION'") + exec("create materialized view mode_mv refresh manual as select cast(a as unsigned)-2 as q from facts") + exec("set sql_mode=''") + exec("refresh materialized view mode_mv") + require.Equal(t, "-1", scalar("select q from mode_mv")) + exec("create table dates(id int,ts timestamp)") + exec("insert into dates values(1,'2024-01-15 12:00:00'),(2,'2024-07-15 12:00:00')") + exec("set time_zone='America/New_York'") + exec("create materialized view named_mv refresh manual as select id,cast(ts as datetime) as local_dt from dates") + exec("set time_zone='+08:00'") + exec("create materialized view fixed_mv refresh manual as select id,cast(ts as datetime) as local_dt from dates") + exec("set time_zone='+00:00'") + exec("refresh materialized view named_mv") + exec("refresh materialized view fixed_mv") + require.Equal(t, "2024-01-15 07:00:00", scalar("select local_dt from named_mv where id=1")) + require.Equal(t, "2024-07-15 08:00:00", scalar("select local_dt from named_mv where id=2")) + require.Equal(t, "2024-01-15 20:00:00", scalar("select local_dt from fixed_mv where id=1")) + require.Equal(t, "2024-07-15 20:00:00", scalar("select local_dt from fixed_mv where id=2")) + exec("create role mv_semantics_role") + exec("create user mv_semantics_reader identified by 'mv-fixture-only'") + exec("grant select on table " + schema + ".precision_10 to mv_semantics_role") + exec("grant mv_semantics_role to mv_semantics_reader") + readerConfig := mysql.NewConfig() + readerConfig.User, readerConfig.Passwd = "sys:mv_semantics_reader:mv_semantics_role", "mv-fixture-only" + readerConfig.Net, readerConfig.Addr, readerConfig.DBName = "tcp", fmt.Sprintf("127.0.0.1:%d", port), schema + readerConnector, err := mysql.NewConnector(readerConfig) + require.NoError(t, err) + reader := sql.OpenDB(readerConnector) + defer reader.Close() + reader.SetMaxOpenConns(1) + func() { + rows, err := reader.QueryContext(ctx, "select * from precision_10 limit 0") + if rows != nil { + defer rows.Close() + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + } + require.Error(t, err, "MV grant alone does not grant source SELECT") + }() + exec("grant select on table " + schema + ".facts to mv_semantics_role") + empty(reader) + p, err := reader.PrepareContext(ctx, "select * from precision_10 limit 0") + require.NoError(t, err) + defer p.Close() + preparedEmpty := func() { + t.Helper() + rows, err := p.QueryContext(ctx) + require.NoError(t, err) + defer rows.Close() + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + } + preparedEmpty() + exec("revoke select on table " + schema + ".facts from mv_semantics_role") + func() { + rows, err := p.QueryContext(ctx) + if rows != nil { + defer rows.Close() + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + } + require.Error(t, err, "prepared LIMIT 0 must recheck live source grants") + }() + exec("grant select on table " + schema + ".facts to mv_semantics_role") + preparedEmpty() + exec("create table failure_source(id int,v bigint)") + exec("insert into failure_source values(1,0)") + exec("create materialized view failure_mv refresh manual as select id,v+9223372036854775807 as v from failure_source") + exec("refresh materialized view failure_mv") + before := scalar("select concat(last_run,':',successful_sequence,':',source_physical,':',source_logical) from mo_catalog.mo_materialized_views where database_name='" + schema + "' and name='failure_mv'") + exec("update failure_source set v=1") + _, err = conn.ExecContext(ctx, "refresh materialized view failure_mv") + require.Error(t, err) + require.Equal(t, "9223372036854775807", scalar("select v from failure_mv")) + require.Equal(t, before, scalar("select concat(last_run,':',successful_sequence,':',source_physical,':',source_logical) from mo_catalog.mo_materialized_views where database_name='"+schema+"' and name='failure_mv'")) + _, err = conn.ExecContext(ctx, "alter table facts add column unrelated int") + require.Error(t, err, "dependency guard survives integration") + old := scalar("select rel_id from mo_catalog.mo_tables where reldatabase='" + schema + "' and relname='precision_4'") + exec("drop materialized view precision_4") + require.Equal(t, "0", scalar("select count(*) from mo_catalog.mo_materialized_views where database_name='"+schema+"' and name='precision_4'")) + exec("set div_precision_increment=10") + exec("create materialized view precision_4 refresh manual as select a/3 as q from facts") + exec("set div_precision_increment=0") + exec("refresh materialized view precision_4") + require.Equal(t, "0.3333333333", scalar("select q from precision_4")) + require.NotEqual(t, old, scalar("select rel_id from mo_catalog.mo_tables where reldatabase='"+schema+"' and relname='precision_4'")) + inventory, err := conn.QueryContext(ctx, "show table_number from mo_catalog") + require.NoError(t, err) + func() { + defer inventory.Close() + require.True(t, inventory.Next()) + var count int + require.NoError(t, inventory.Scan(&count)) + require.Equal(t, 65, count, "main's 61 catalogs plus the four MV catalogs") + require.False(t, inventory.Next()) + require.NoError(t, inventory.Err()) + }() + + }) +} + +// The existing database/sql types share this small interface; statements have a +// different call shape and are checked directly above. +type sqlQuerier interface { + QueryContext(context.Context, string, ...any) (*sql.Rows, error) +} diff --git a/pkg/tests/sqlintegration/multicn/view_description_test.go b/pkg/tests/sqlintegration/multicn/view_description_test.go index 4cd298fea50e8..c08201968ea1a 100644 --- a/pkg/tests/sqlintegration/multicn/view_description_test.go +++ b/pkg/tests/sqlintegration/multicn/view_description_test.go @@ -94,8 +94,13 @@ func TestViewDescriptionTwoCN(t *testing.T) { require.False(t, rows.Next()) require.NoError(t, rows.Err()) } + // Push mode permits a peer to start at its older applied snapshot. A + // cross-CN freshness assertion needs an explicit commit-frontier handoff; + // this SELECT does not advance the prepared session's DDL generation. + syncCommits := func() { exec(first, "select mo_ctl('cn','synccommit','')") } check := func(width int, value string) { t.Helper() + syncCommits() for _, db := range []*sql.DB{first, second} { for _, name := range []string{"v", "nested"} { var gotWidth int @@ -149,7 +154,13 @@ func TestViewDescriptionTwoCN(t *testing.T) { checkPrepared("varchar(90)") sourceID = identity("src") exec(first, "restore table view_description_two_cn.src {snapshot='view_description_restore'}") - require.NotEqual(t, sourceID, identity("src"), "restore must exercise physical replacement") + restoredID := identity("src") + require.NotEqual(t, sourceID, restoredID, "restore must exercise physical replacement") + syncCommits() + var peerSourceID uint64 + require.NoError(t, second.QueryRowContext(ctx, + "select rel_id from mo_catalog.mo_tables where reldatabase='view_description_two_cn' and relname='src'").Scan(&peerSourceID)) + require.Equal(t, restoredID, peerSourceID, "peer must see restored source before prepared metadata validation") require.Equal(t, viewID, identity("v"), "source restore must not recreate the dependent View") checkPrepared("varchar(60)") check(60, "saved") diff --git a/pkg/util/executor/options.go b/pkg/util/executor/options.go index fca4c4c630591..6a4cca43a8ff8 100644 --- a/pkg/util/executor/options.go +++ b/pkg/util/executor/options.go @@ -675,3 +675,10 @@ func (opts StatementOption) WithDisableLock() StatementOption { func (opts StatementOption) DisableLock() bool { return opts.disableLock } + +// WithParserSQLMode captures the authoring mode of persisted executable SQL. +func (opts Options) WithParserSQLMode(mode string) Options { + opts.parserSQLMode = mode + return opts +} +func (opts Options) ParserSQLMode() string { return opts.parserSQLMode } diff --git a/pkg/util/executor/types.go b/pkg/util/executor/types.go index 1fc05f651f696..4e09a33f658dc 100644 --- a/pkg/util/executor/types.go +++ b/pkg/util/executor/types.go @@ -68,6 +68,7 @@ type Options struct { error_chan chan error sql string forceRebuildPlan bool + parserSQLMode string resolveVariableFunc func(varName string, isSystemVar, isGlobalVar bool) (interface{}, error) adjustTableExtraFunc func(*api.SchemaExtra) error keepTxnAlive bool diff --git a/proto/task.proto b/proto/task.proto index 612415586f9a0..47233ec1b27ad 100644 --- a/proto/task.proto +++ b/proto/task.proto @@ -90,6 +90,8 @@ option (gogoproto.protosizer_all) = true; InitCdcLosslessStart = 15; // CDC source patterns with lossless identifier encoding. InitCdcSourcePatternV1 = 16; + // Native materialized view reconciliation and fenced refresh tasks. + MaterializedView = 17; } // TaskMetadata is a task metadata abstraction that can be scheduled for execution at any CN node. diff --git a/test/distributed/cases/dml/select/sp_table.result b/test/distributed/cases/dml/select/sp_table.result index a2f5658739bff..0c99ceb9d423e 100644 --- a/test/distributed/cases/dml/select/sp_table.result +++ b/test/distributed/cases/dml/select/sp_table.result @@ -33,9 +33,13 @@ mo_index_update r mo_indexes r mo_iscp_log r mo_locks v +mo_materialized_views cluster mo_merge_settings r mo_mongodb_connections r mo_mongodb_tables r +mo_mv_account_state cluster +mo_mv_dependencies cluster +mo_mv_refresh_runs cluster mo_mysql_compatibility_mode r mo_partition_metadata r mo_partition_tables r diff --git a/test/distributed/cases/dml/show/database_statistics.result b/test/distributed/cases/dml/show/database_statistics.result index 75a36f6ce6cc3..bd3e70a5448a1 100644 --- a/test/distributed/cases/dml/show/database_statistics.result +++ b/test/distributed/cases/dml/show/database_statistics.result @@ -9,7 +9,7 @@ show table_number from mysql; 6 show table_number from mo_catalog; ➤ Number of tables in mo_catalog[-5,64,0] 𝄀 -61 +65 show table_number from system; [unknown result because it is related to issue#23182] use mo_task; @@ -350,7 +350,7 @@ show table_number from mysql; 6 show table_number from mo_catalog; ➤ Number of tables in mo_catalog[-5,64,0] 𝄀 -38 +42 show table_number from system_metrics; ➤ Number of tables in system_metrics[-5,64,0] 𝄀 11 diff --git a/test/distributed/cases/dml/show/show.result b/test/distributed/cases/dml/show/show.result index 5eac71c91c350..d3f77394bbbe5 100644 --- a/test/distributed/cases/dml/show/show.result +++ b/test/distributed/cases/dml/show/show.result @@ -285,9 +285,13 @@ mo_index_update 𝄀 mo_indexes 𝄀 mo_iscp_log 𝄀 mo_locks 𝄀 +mo_materialized_views 𝄀 mo_merge_settings 𝄀 mo_mongodb_connections 𝄀 mo_mongodb_tables 𝄀 +mo_mv_account_state 𝄀 +mo_mv_dependencies 𝄀 +mo_mv_refresh_runs 𝄀 mo_mysql_compatibility_mode 𝄀 mo_partition_metadata 𝄀 mo_partition_tables 𝄀 @@ -319,7 +323,7 @@ mo_view_dependencies 𝄀 mo_view_refresh show table_number from mo_catalog; ➤ Number of tables in mo_catalog[-5,64,0] 𝄀 -61 +65 show column_number from mo_database; ➤ Number of columns in mo_database[-5,64,0] 𝄀 9 diff --git a/test/distributed/cases/git4data/clone/clone_sys_db_table_to_new_db_table.result b/test/distributed/cases/git4data/clone/clone_sys_db_table_to_new_db_table.result index f40ec66cb0cde..737bcb71b49be 100644 --- a/test/distributed/cases/git4data/clone/clone_sys_db_table_to_new_db_table.result +++ b/test/distributed/cases/git4data/clone/clone_sys_db_table_to_new_db_table.result @@ -157,9 +157,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables @@ -228,9 +232,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables diff --git a/test/distributed/cases/mo_cloud/mo_cloud.result b/test/distributed/cases/mo_cloud/mo_cloud.result index 4de1d00cd829a..15f0ec01f6cc5 100644 --- a/test/distributed/cases/mo_cloud/mo_cloud.result +++ b/test/distributed/cases/mo_cloud/mo_cloud.result @@ -822,8 +822,12 @@ mo_catalog ¦ mo_iceberg_tables ¦ r ¦ accountadmin 𝄀 mo_catalog ¦ mo_increment_columns ¦ ¦ accountadmin 𝄀 mo_catalog ¦ mo_indexes ¦ r ¦ accountadmin 𝄀 mo_catalog ¦ mo_locks ¦ v ¦ accountadmin 𝄀 +mo_catalog ¦ mo_materialized_views ¦ cluster ¦ - 𝄀 mo_catalog ¦ mo_mongodb_connections ¦ r ¦ accountadmin 𝄀 mo_catalog ¦ mo_mongodb_tables ¦ r ¦ accountadmin 𝄀 +mo_catalog ¦ mo_mv_account_state ¦ cluster ¦ - 𝄀 +mo_catalog ¦ mo_mv_dependencies ¦ cluster ¦ - 𝄀 +mo_catalog ¦ mo_mv_refresh_runs ¦ cluster ¦ - 𝄀 mo_catalog ¦ mo_mysql_compatibility_mode ¦ r ¦ accountadmin 𝄀 mo_catalog ¦ mo_partition_metadata ¦ r ¦ accountadmin 𝄀 mo_catalog ¦ mo_partition_tables ¦ r ¦ accountadmin 𝄀 diff --git a/test/distributed/cases/snapshot/cluster/restore_cluster_table.result b/test/distributed/cases/snapshot/cluster/restore_cluster_table.result index 27711a9aa3f3f..244f78234f5c0 100644 --- a/test/distributed/cases/snapshot/cluster/restore_cluster_table.result +++ b/test/distributed/cases/snapshot/cluster/restore_cluster_table.result @@ -434,9 +434,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables @@ -566,9 +570,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables diff --git a/test/distributed/cases/snapshot/cluster_level_snapshot_restore_cluster.result b/test/distributed/cases/snapshot/cluster_level_snapshot_restore_cluster.result index f74eb980517e6..c09f662a62b4c 100644 --- a/test/distributed/cases/snapshot/cluster_level_snapshot_restore_cluster.result +++ b/test/distributed/cases/snapshot/cluster_level_snapshot_restore_cluster.result @@ -471,9 +471,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables @@ -619,9 +623,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables diff --git a/test/distributed/cases/tenant/privilege/create_user_default_role.result b/test/distributed/cases/tenant/privilege/create_user_default_role.result index ff608cc79276f..7f272e35d23cf 100644 --- a/test/distributed/cases/tenant/privilege/create_user_default_role.result +++ b/test/distributed/cases/tenant/privilege/create_user_default_role.result @@ -50,9 +50,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables diff --git a/test/distributed/cases/view/materialized_view.result b/test/distributed/cases/view/materialized_view.result new file mode 100644 index 0000000000000..996db27dfdb7a --- /dev/null +++ b/test/distributed/cases/view/materialized_view.result @@ -0,0 +1,114 @@ +drop database if exists mv_bvt; +create database mv_bvt; +use mv_bvt; +create table facts(id int primary key,k int,v bigint); +insert into facts values(1,1,10),(2,1,20),(3,2,null); +set experimental_materialized_view=0; +create materialized view totals refresh manual as select k,count(*) as n,sum(v) as s from facts group by facts.k; +not supported: enable experimental_materialized_view before creating a materialized view +set experimental_materialized_view=1; +create materialized view totals refresh manual as select k,count(*) as n,sum(v) as s from facts group by facts.k; +select * from totals order by k; +invalid input: MV_NOT_POPULATED: refresh materialized view before querying it +refresh materialized view totals; +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 2 ¦ 30 𝄀 +2 ¦ 1 ¦ null +insert into facts values(4,2,7); +update facts set v=11 where id=1; +delete from facts where id=2; +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 2 ¦ 30 𝄀 +2 ¦ 1 ¦ null +refresh materialized view totals; +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 1 ¦ 11 𝄀 +2 ¦ 2 ¦ 7 +refresh materialized view totals; +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 1 ¦ 11 𝄀 +2 ¦ 2 ¦ 7 +create materialized view if not exists totals refresh manual as select id from facts; +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 1 ¦ 11 𝄀 +2 ¦ 2 ¦ 7 +show create materialized view totals; +➤ Materialized View[12,0,0] ¦ Create Materialized View[12,0,0] 𝄀 +totals ¦ create materialized view `mv_bvt`.`totals` refresh manual as select `facts`.`k` as `k`, count(*) as `n`, sum(`facts`.`v`) as `s` from `facts` group by `facts`.`k` +insert into totals(k) values(9); +invalid input: materialized view is read only +update totals set s=0; +invalid input: materialized view is read only +delete from totals; +invalid input: materialized view is read only +truncate table totals; +invalid input: materialized view is read only; use DROP/ALTER MATERIALIZED VIEW +drop table totals; +invalid input: materialized view is read only; use DROP/ALTER MATERIALIZED VIEW +alter table totals add column extra int; +invalid input: materialized view is read only; use DROP/ALTER MATERIALIZED VIEW +alter table totals add column (batch_x int,batch_y varchar(8)); +invalid input: materialized view is read only; use DROP/ALTER MATERIALIZED VIEW +alter table facts add column extra int; +invalid input: source has dependent materialized views; drop them before changing its schema/identity +alter table facts add column (batch_x int,batch_y varchar(8)); +invalid input: source has dependent materialized views; drop them before changing its schema/identity +truncate table facts; +invalid input: source has dependent materialized views; drop them before changing its schema/identity +drop table facts; +invalid input: source has dependent materialized views; drop them before changing its schema/identity +drop database mv_bvt; +invalid input: database contains materialized views; drop them first +select database(); +➤ database()[12,65535,0] 𝄀 +mv_bvt +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 1 ¦ 11 𝄀 +2 ¦ 2 ¦ 7 +select id,k,v from facts order by id; +➤ id[4,32,0] ¦ k[4,32,0] ¦ v[-5,64,0] 𝄀 +1 ¦ 1 ¦ 11 𝄀 +3 ¦ 2 ¦ null 𝄀 +4 ¦ 2 ¦ 7 +begin; +refresh materialized view totals; +internal error: unclassified statement appears in uncommitted transaction +rollback; +create materialized view unsupported refresh manual as select rand() from facts; +not supported: materialized view function rand +create materialized view unsupported refresh manual as select distinct k from facts; +not supported: materialized view query shape +create materialized view unsupported refresh manual as select * from totals; +not supported: materialized view sources must be persistent native tables +create materialized view unsupported refresh every interval 1 second as select * from facts; +invalid input: materialized view refresh interval must be at least 60 seconds +show tables; +➤ Tables_in_mv_bvt[12,5000,0] 𝄀 +facts 𝄀 +totals +alter materialized view totals refresh every interval 1 minute; +show create materialized view totals; +➤ Materialized View[12,0,0] ¦ Create Materialized View[12,0,0] 𝄀 +totals ¦ create materialized view `mv_bvt`.`totals` refresh every interval 60 second as select `facts`.`k` as `k`, count(*) as `n`, sum(`facts`.`v`) as `s` from `facts` group by `facts`.`k` +alter materialized view totals refresh manual; +show create materialized view totals; +➤ Materialized View[12,0,0] ¦ Create Materialized View[12,0,0] 𝄀 +totals ¦ create materialized view `mv_bvt`.`totals` refresh manual as select `facts`.`k` as `k`, count(*) as `n`, sum(`facts`.`v`) as `s` from `facts` group by `facts`.`k` +drop materialized view totals; +drop materialized view if exists totals; +alter table facts add column extra int; +alter table facts add column (batch_x int,batch_y varchar(8)); +select id,k,v,extra,batch_x,batch_y from facts order by id; +➤ id[4,32,0] ¦ k[4,32,0] ¦ v[-5,64,0] ¦ extra[4,32,0] ¦ batch_x[4,32,0] ¦ batch_y[12,8,0] 𝄀 +1 ¦ 1 ¦ 11 ¦ null ¦ null ¦ null 𝄀 +3 ¦ 2 ¦ null ¦ null ¦ null ¦ null 𝄀 +4 ¦ 2 ¦ 7 ¦ null ¦ null ¦ null +drop table facts; +drop database mv_bvt; +set experimental_materialized_view=0; diff --git a/test/distributed/cases/view/materialized_view.sql b/test/distributed/cases/view/materialized_view.sql new file mode 100644 index 0000000000000..f52fa0fe7d453 --- /dev/null +++ b/test/distributed/cases/view/materialized_view.sql @@ -0,0 +1,65 @@ +-- Native materialized views: deferred/manual publication and dependency guards. +drop database if exists mv_bvt; +create database mv_bvt; +use mv_bvt; +create table facts(id int primary key,k int,v bigint); +insert into facts values(1,1,10),(2,1,20),(3,2,null); +set experimental_materialized_view=0; +create materialized view totals refresh manual as select k,count(*) as n,sum(v) as s from facts group by facts.k; +set experimental_materialized_view=1; +-- Qualify the grouping key so SHOW CREATE is stable in both transaction modes. +create materialized view totals refresh manual as select k,count(*) as n,sum(v) as s from facts group by facts.k; +select * from totals order by k; +refresh materialized view totals; +select k,n,s from totals order by k; +insert into facts values(4,2,7); +update facts set v=11 where id=1; +delete from facts where id=2; +-- A source commit does not update the previous materialization. +select k,n,s from totals order by k; +refresh materialized view totals; +select k,n,s from totals order by k; +refresh materialized view totals; +select k,n,s from totals order by k; +-- IF NOT EXISTS preserves the existing definition and populated rows. +create materialized view if not exists totals refresh manual as select id from facts; +select k,n,s from totals order by k; +show create materialized view totals; +-- Writes and destructive source DDL must leave both relations intact. +insert into totals(k) values(9); +update totals set s=0; +delete from totals; +truncate table totals; +drop table totals; +alter table totals add column extra int; +alter table totals add column (batch_x int,batch_y varchar(8)); +alter table facts add column extra int; +alter table facts add column (batch_x int,batch_y varchar(8)); +truncate table facts; +drop table facts; +drop database mv_bvt; +select database(); +select k,n,s from totals order by k; +select id,k,v from facts order by id; +begin; +refresh materialized view totals; +rollback; +-- Unsupported definitions must not create a relation. +create materialized view unsupported refresh manual as select rand() from facts; +create materialized view unsupported refresh manual as select distinct k from facts; +create materialized view unsupported refresh manual as select * from totals; +create materialized view unsupported refresh every interval 1 second as select * from facts; +show tables; +alter materialized view totals refresh every interval 1 minute; +show create materialized view totals; +alter materialized view totals refresh manual; +show create materialized view totals; +drop materialized view totals; +drop materialized view if exists totals; +-- Removing the dependency permits ordinary source DDL again. +alter table facts add column extra int; +alter table facts add column (batch_x int,batch_y varchar(8)); +select id,k,v,extra,batch_x,batch_y from facts order by id; +drop table facts; +drop database mv_bvt; +set experimental_materialized_view=0; diff --git a/test/distributed/cases/zz_accesscontrol/create_account.result b/test/distributed/cases/zz_accesscontrol/create_account.result index ed41c82811128..945628fedb67e 100644 --- a/test/distributed/cases/zz_accesscontrol/create_account.result +++ b/test/distributed/cases/zz_accesscontrol/create_account.result @@ -180,8 +180,12 @@ mo_iceberg_residency_policy mo_iceberg_tables mo_indexes mo_locks +mo_materialized_views mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables diff --git a/test/materialized_view/README.md b/test/materialized_view/README.md new file mode 100644 index 0000000000000..b978473fbd745 --- /dev/null +++ b/test/materialized_view/README.md @@ -0,0 +1,131 @@ +# Materialized-view validation + +Read [the design](../../docs/design/materialized_views.md) for the feature +contract, implementation and limitations. This directory contains the native +SQL runner and recovery probe. The feature is experimental and disabled by default. + +## Run SQL validation + +Use the Go version in `go.mod` and an isolated MatrixOne cluster: + +```bash +go build -mod=readonly -o /tmp/mv-validation ./test/materialized_view +export MV_DSN='dump:111@tcp(127.0.0.1:6001)/?timeout=5s&readTimeout=330s&writeTimeout=330s' +export MV_SECOND_DSN='dump:111@tcp(127.0.0.1:6002)/?timeout=5s&readTimeout=330s&writeTimeout=330s' +/tmp/mv-validation -dsn "$MV_DSN" -functional -output /tmp/mv-functional.json +/tmp/mv-validation -dsn "$MV_DSN" -edge-check -output /tmp/mv-failure.json +/tmp/mv-validation -dsn "$MV_DSN" -consumer-check -second-dsn "$MV_SECOND_DSN" \ + -output /tmp/mv-consumers.json +/tmp/mv-validation -dsn "$MV_DSN" -second-dsn "$MV_SECOND_DSN" \ + -output /tmp/mv-multi-cn.json +``` + +The runner owns and removes its `mv_validation`, `mv_consumer_validation`, +`mv_validation_failure` and `mv_validation_multi_cn` fixtures, plus test accounts +and roles. Do not run it against a shared or production cluster. Each invocation +writes passed cases, timings and any error to `-output`, and exits nonzero on +failure. `-keep` retains the main fixture for restart checks. + +| Mode | Coverage | +| --- | --- | +| `-functional` | Small SQL fixtures: manual/scheduled refresh, exact numeric/NULL results, empty aggregates, joins, captured session semantics, read-only/dependency guards, permissions and account lifecycle | +| `-edge-check` | Native failure rollback, preservation of last-good rows/provenance and dependency cleanup | +| `-consumer-check` | 17 branch, prepared DELETE, DUMP/LOAD, index/affected-row and SHOW CREATE contracts | +| `-second-dsn` alone | Causal two-CN visibility, concurrent refresh, relation identity and terminal history | +| `-tenant-check` | Account lifecycle subset for focused diagnosis | +| `-restart-check` | Previously retained fixture after stopping and restarting the same cluster/data directory | +| No mode flag | Main SQL checks and benchmark experiments | + +Scheduled checks poll durable publication with a 120-second outer deadline; the +minimum policy period is 60 seconds. Two-CN cases require shared storage/TN/LOG +and use `mo_ctl('cn','synccommit','')` at commit handoffs. They prove visibility +after that causal handoff, consistent with MO's normal asynchronous snapshots. + +The prepared DELETE case creates its comparison tables before PREPARE, then +creates the dependent MV through the second session/CN. It executes the same +prepared handle and verifies affected rows, indexes and MV publication. Keeping +DDL off the prepared statement's own session prevents its DDL generation from +masking stale truncate eligibility. Consumer checks also reject both populated +and unpopulated branch endpoints and export the current altered refresh policy. + +`-catalog-missing` is a separate kernel-guard fixture for a pre-MV catalog with +all four MV catalogs absent and automatic upgrade disabled. A test-only frontend +login bypass isolates compiler admission. It is not mixed-version/login evidence; +use the native recovery driver below for that contract. + +## BVT integration + +The existing BVT group-0 entrypoint invokes the wrapper after mo-tester. It reuses +the two Compose CNs, runs functional/failure/consumer/two-CN contracts, validates +nonempty successful JSON reports and merges runner coverage with server coverage. +It starts no additional MatrixOne services. To reuse local endpoints: + +```bash +MV_BVT_DSN="$MV_DSN" MV_BVT_SECOND_DSN="$MV_SECOND_DSN" \ + bash optools/run_materialized_view_bvt.sh "$PWD" /tmp/mv-bvt-report +``` + +The standalone SQL contract also lives in +[`test/distributed/cases/view/materialized_view.sql`](../distributed/cases/view/materialized_view.sql). +Unit and failure-injection tests live beside their owning packages, including +`pkg/mv`, `pkg/catalog`, planner/compiler/frontend and bootstrap versions. + +## Native upgrade, crash and replay validation + +Build the normal native dependencies first using the repository build workflow. +The full driver needs a fault-tagged current binary and a clean pre-MV +4.0.17/protocol-121 binary from its own checkout: + +```bash +make build BUILD_TAGS=matrixone_mv_faults BIN_NAME=mo-service-mv-recovery +go build -mod=readonly -o /tmp/mv-native-probe ./test/materialized_view/native_probe +python3 optools/materialized_view_recovery.py \ + --service "$PWD/mo-service-mv-recovery" \ + --old-service /path/to/clean-main417/mo-service \ + --old-version 4.0.17 --old-protocol 121 \ + --probe /tmp/mv-native-probe --work-dir /tmp/mv-recovery-new-empty-directory +``` + +The work directory must be new/empty. The driver owns isolated processes and +storage, records their exits, and cleans up its services. The migration startup +fault exists only in the tagged build. `--refresh-only` accepts a normal current +binary and omits the old binary/migration stages. + +The full suite checks authenticated old-catalog operation, mixed-old admission, +absence of executor-17 work on old CNs, interrupted catalog installation, +restart/repeated upgrade, retained ordinary data, downgrade refusal with a +populated periodic MV, lost commit acknowledgement, and before/after-commit +crash plus same-run replay. An expected SIGKILL or rejected downgrade is checked +explicitly rather than treated as an unexplained process failure. + +## Performance experiments and retained evidence + +```bash +/tmp/mv-validation -dsn "$MV_DSN" -rows 1000000 -output /tmp/mv-performance.json +``` + +The default benchmark uses deterministic integer data: one million facts and +128 groups. It checks full result equality, records EXPLAIN and refresh time, +warms both queries, and retains 50 alternating paired samples with a median +ratio. Companion cases cover explicit rollup, a repeated join and a +high-cardinality control. Results describe explicit MV queries and warm local +reads; they do not measure automatic rewrite or production/cold-cache latency. + +[Retained reports and source/binary identities](https://github.com/matrixorigin/matrixone/pull/30085#issuecomment-6141628463) +are kept outside the design document. Product inputs published as `0626df5d` +passed all required CI, 7,984 owning-package test roots, 17 native consumer cases +in each RC/SI deployment, and all 13 native compatibility/crash/replay groups. +The report records that local new binaries were built from the staged merged +product inputs with `vcs.modified=true`; the old comparison binary was clean. +Those results describe the retained pre-merge product inputs; protocol-122 +merge validation is recorded separately in the linked report. + +Historical performance samples were measured on prototype +`dd38098853ea197699ed3fac3e69dc53975ac061` on 2026-10-13, on one local CN/TN/LOG +with four CPUs and 16 GiB RAM. Grouped aggregation, explicit rollup and join +showed median ratios of 7.43x, 8.89x and 5.36x; the high-cardinality control was +1.04x. Full refresh took 151.270 ms, 40.947 ms and 34.560 ms for the respective +stored summaries (rollup reused the grouped summary). These are historical +feasibility observations, not performance claims for the current revision. +Re-run the command above on the intended revision and deployment before using +those ratios for a capacity or rollout decision. diff --git a/test/materialized_view/additional.go b/test/materialized_view/additional.go new file mode 100644 index 0000000000000..b7381407fd3b4 --- /dev/null +++ b/test/materialized_view/additional.go @@ -0,0 +1,596 @@ +// Copyright 2026 Matrix Origin +// Licensed under the Apache License, Version 2.0. +package main + +import ( + "context" + "database/sql" + "errors" + "fmt" + "math/big" + "os" + "reflect" + "sync" + "time" + + mysql "github.com/go-sql-driver/mysql" +) + +func typedAggregateOracle() { + actual := rows("select k,n,nv,s,lo,hi,av from totals order by k") + expected := [][]string{{"", "1", "1", "7", "7", "7", "7"}, {"1", "2", "2", "30", "10", "20", "15"}, {"2", "2", "1", "-2", "-2", "-2", "-2"}} + if len(actual) != len(expected) { + panic("typed oracle group count") + } + for i := range actual { + for j, value := range actual[i] { + want := expected[i][j] + if want == "" { + if value != want { + panic("typed oracle NULL") + } + continue + } + got, ok := new(big.Rat).SetString(value) + if !ok { + panic("invalid numeric aggregate") + } + target, _ := new(big.Rat).SetString(want) + if got.Cmp(target) != 0 { + panic(fmt.Sprintf("typed aggregate oracle group %d column %d", i, j)) + } + } + } + pass("independent typed aggregate oracle") +} + +func runAdditionalCases(dsn string) { + before := rows("select * from totals order by k") + exec("refresh materialized view totals") + exec("refresh materialized view totals") + if !reflect.DeepEqual(before, rows("select * from totals order by k")) { + panic("repeated refresh duplicated or changed rows") + } + pass("repeat refresh idempotent rows") + exec("create materialized view if not exists totals refresh manual as select * from facts") + if !reflect.DeepEqual(before, rows("select * from totals order by k")) { + panic("IF NOT EXISTS replaced existing definition") + } + pass("IF NOT EXISTS no replacement") + expectError("object kind collision", "create materialized view facts refresh manual as select * from dimension") + expectError("duplicate output heading", "create materialized view duplicate_names refresh manual as select k as x,v as x from facts") + expectError("minimum schedule interval", "create materialized view too_frequent refresh every interval 1 second as select * from facts") + expectError("MV nesting", "create materialized view nested refresh manual as select * from totals") + expectError("outer join", "create materialized view outer_join refresh manual as select * from facts f left join dimension d on f.k=d.k") + expectError("random sample", "create materialized view sampled refresh manual as select sample(k,1 rows) from facts") + exec("create temporary table temp_source(id int)") + expectError("temporary source", "create materialized view temporary_mv refresh manual as select * from temp_source") + exec("drop table temp_source") + exec("create materialized view grouped_empty refresh manual as select k,count(*) as n from facts where id<0 group by k") + exec("refresh materialized view grouped_empty") + if len(rows("select * from grouped_empty")) != 0 { + panic("grouped empty returned rows") + } + pass("grouped empty has zero rows") + exec("drop materialized view grouped_empty") + exec("create materialized view all_null refresh manual as select count(*) as n,count(v) as nv,sum(v) as s,avg(v) as av from facts where id=3") + exec("refresh materialized view all_null") + if !reflect.DeepEqual(rows("select n,nv,s,av from all_null"), [][]string{{"1", "0", "", ""}}) { + panic("all NULL aggregate oracle") + } + pass("all NULL typed oracle") + exec("drop materialized view all_null") + exec("create materialized view projected refresh manual as select id,k,v from facts where v>0") + exec("refresh materialized view projected") + equal("projection and filter", "select id,k,v from facts where v>0 order by id", "select * from projected order by id") + exec("drop materialized view projected") + exec("update dimension set label='ONE' where k=1") + exec("refresh materialized view joined") + equal("dimension mutation", "select d.label,sum(f.v),count(*) from facts f inner join dimension d on f.k=d.k group by d.label order by d.label", "select * from joined order by label") + exec("set sql_mode='PIPES_AS_CONCAT,NO_BACKSLASH_ESCAPES'") + exec("create materialized view mode_capture refresh manual as select id,'a' || 'b' as label from facts") + exec("set sql_mode=''") + exec("refresh materialized view mode_capture") + actual := rows("select label from mode_capture") + for _, row := range actual { + if row[0] != "ab" { + panic("captured SQL mode changed") + } + } + pass("captured SQL mode") + exec("drop materialized view mode_capture") + exec("set sql_mode='NO_BACKSLASH_ESCAPES'") + exec("create table `slash\\source`(v int)") + exec("insert into `slash\\source` values(17)") + exec("create materialized view escaped_source refresh manual as select v from `slash\\source`") + exec("set sql_mode=''") + exec("refresh materialized view escaped_source") + equal("captured context with escaped source identity", "select v from `slash\\source`", "select v from escaped_source") + exec("drop materialized view escaped_source") + exec("drop table `slash\\source`") + exec("set time_zone='+00:00'") + exec("create table tz_source(ts timestamp)") + exec("insert into tz_source values('2025-12-31 20:00:00')") + exec("set time_zone='+08:00'") + exec("create materialized view tz_mv refresh manual as select year(ts) as y from tz_source") + exec("set time_zone='+00:00'") + exec("refresh materialized view tz_mv") + if !reflect.DeepEqual(rows("select y from tz_mv"), [][]string{{"2026"}}) { + panic("fixed-offset authoring timezone was lost") + } + pass("captured fixed-offset timezone") + exec("drop materialized view tz_mv") + exec("drop table tz_source") + exec("begin") + expectError("create MV in user transaction", "create materialized view in_txn refresh manual as select * from facts") + exec("rollback") + expectError("rename dependent source", "alter table facts rename to renamed_facts") + expectError("foreign key into MV", "create table references_mv(k int,foreign key(k) references totals(k))") + stmt, err := db.PrepareContext(ctx, "select k,s,n from totals order by k") + if err != nil { + panic(err) + } + func() { + defer stmt.Close() + want := rows("select k,sum(v),count(*) from facts group by k order by k") + if !reflect.DeepEqual(preparedRows(stmt), want) { + panic("prepared read differs from base query before refresh") + } + exec("refresh materialized view totals") + if !reflect.DeepEqual(preparedRows(stmt), want) { + panic("prepared read differs from base query after refresh") + } + }() + pass("prepared read after refresh") + concurrencyCases(dsn) + privilegeCases(dsn) + tenantIsolationCases(dsn) +} + +func concurrencyCases(dsn string) { + config, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + config.DBName = "mv_validation" + reader, err := openConfigured(config) + if err != nil { + panic(err) + } + defer reader.Close() + reader.SetMaxOpenConns(2) + exec("create table atomic_source(id int primary key,v int)") + exec("insert into atomic_source values(1,1),(2,1),(3,1),(4,1)") + exec("create materialized view atomic_mv refresh manual as select count(*) as n,sum(v) as s,min(v) as lo,max(v) as hi from atomic_source") + exec("refresh materialized view atomic_mv") + started := make(chan struct{}) + stop := make(chan struct{}) + failures := make(chan error, 1) + var wg sync.WaitGroup + wg.Go(func() { + close(started) + for { + select { + case <-stop: + return + default: + } + var n, s, lo, hi int64 + err := reader.QueryRowContext(ctx, "select n,s,lo,hi from atomic_mv").Scan(&n, &s, &lo, &hi) + if err != nil { + failures <- err + return + } + if n != 4 || lo != hi || s != 4*lo { + failures <- fmt.Errorf("reader observed partial or mixed publication: %d %d %d %d", n, s, lo, hi) + return + } + } + }) + <-started + for version := 2; version <= 6; version++ { + exec(fmt.Sprintf("update atomic_source set v=%d", version)) + exec("refresh materialized view atomic_mv") + } + close(stop) + wg.Wait() + select { + case err := <-failures: + panic(err) + default: + } + pass("concurrent readers see complete publications") + // Separate connections issue refresh at once; conflicts can be rejected, but + // the final committed view must still match a complete source snapshot. + start := make(chan struct{}) + errs := make(chan error, 2) + for i := 0; i < 2; i++ { + wg.Go(func() { <-start; _, err := reader.ExecContext(ctx, "refresh materialized view atomic_mv"); errs <- err }) + } + close(start) + wg.Wait() + close(errs) + successes := 0 + for err := range errs { + if err == nil { + successes++ + } + } + if successes == 0 { + panic("both concurrent refreshes failed") + } + equal("concurrent refresh publication", "select count(*),sum(v),min(v),max(v) from atomic_source", "select * from atomic_mv") + exec("drop materialized view atomic_mv") + exec("drop table atomic_source") +} + +func privilegeCases(dsn string) { + exec("create role mv_validation_reader") + defer exec("drop role mv_validation_reader") + exec("create user mv_validation_user identified by 'mv-validation-only'") + defer exec("drop user mv_validation_user") + exec("grant select on table mv_validation.totals to mv_validation_reader") + exec("grant mv_validation_reader to mv_validation_user") + config, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + config.User = "sys:mv_validation_user:mv_validation_reader" + config.Passwd = "mv-validation-only" + config.DBName = "mv_validation" + restricted, err := openConfigured(config) + if err != nil { + panic(err) + } + defer restricted.Close() + restricted.SetMaxOpenConns(1) + if err = restricted.PingContext(ctx); err != nil { + panic(err) + } + if _, err = restricted.ExecContext(ctx, "select * from totals"); err == nil { + panic("MV grant alone bypassed source privilege") + } + pass("MV grant requires source SELECT") + exec("grant select on table mv_validation.facts to mv_validation_reader") + want := rows("select * from totals order by k") + if !reflect.DeepEqual(queryRows(restricted, "select * from totals order by k"), want) { + panic("authorized read differs from owner read") + } + pass("MV plus source grant permits read") + prepared, err := restricted.PrepareContext(ctx, "select * from totals order by k") + if err != nil { + panic(err) + } + defer prepared.Close() + if !reflect.DeepEqual(preparedRows(prepared), want) { + panic("authorized prepared read differs from owner read") + } + exec("revoke select on table mv_validation.facts from mv_validation_reader") + r, err := prepared.QueryContext(ctx) + if err == nil { + defer r.Close() + if len(decodeRows(r)) != 0 { + panic("prepared read exposed rows after source ACL revocation") + } + err = r.Err() + } + requireServerRejection("prepared source ACL revocation", err) + pass("prepared source ACL revocation") + if _, err = restricted.ExecContext(ctx, "refresh materialized view totals"); err == nil { + panic("nonowner refreshed MV") + } + pass("nonowner refresh rejected") + if _, err = restricted.ExecContext(ctx, "drop materialized view totals"); err == nil { + panic("nonowner dropped MV") + } + pass("nonowner drop rejected") + result, err := restricted.QueryContext(ctx, "show materialized views") + if err != nil { + panic(err) + } + defer result.Close() + if result.Next() { + panic("SHOW exposed another owner's definitions") + } + if err = result.Err(); err != nil { + panic(err) + } + pass("SHOW owner isolation") +} + +// runRestartCheck verifies persisted objects without modifying their sources. +// Use with main's -keep flag and restart the service between the two invocations. +func runRestartCheck() { + exec("use mv_validation") + equal("restart persisted materialization", "select k,sum(v),count(*) from bench group by k order by k", "select k,s,n from bench_mv order by k") + if len(rows("show materialized view refreshes bench_mv")) == 0 { + panic("history lost on restart") + } + pass("restart persisted history") + exec("refresh materialized view bench_mv") + pass("refresh after restart") +} + +// Keep imports/context checks explicit for the test harness's cancellation mode. +func timeoutRead(dsn string) { + config, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + config.DBName = "mv_validation" + probe, err := openConfigured(config) + if err != nil { + panic(err) + } + defer probe.Close() + cancelled, cancel := context.WithCancel(context.Background()) + cancel() + r, err := probe.QueryContext(cancelled, "select * from totals") + if err == nil { + defer r.Close() + decodeRows(r) + err = r.Err() + } + if !errors.Is(err, context.Canceled) { + panic("cancelled query did not terminate") + } + pass("cancelled client read") +} + +func tenantIsolationCases(dsn string) { + for _, name := range []string{"mv_validation_a", "mv_validation_b"} { + exec("create account " + name + " admin_name='admin' identified by 'mv-validation-only'") + } + defer func() { + for _, name := range []string{"mv_validation_a", "mv_validation_b"} { + if _, err := db.ExecContext(ctx, "drop account if exists "+name); err != nil { + fmt.Fprintln(os.Stderr, "tenant cleanup:", err) + } + } + }() + tenants := make([]*sql.DB, 0, 2) + for i, name := range []string{"mv_validation_a", "mv_validation_b"} { + cfg, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + cfg.User = name + ":admin" + cfg.Passwd = "mv-validation-only" + cfg.DBName = "" + connection, err := openConfigured(cfg) + if err != nil { + panic(err) + } + defer connection.Close() + connection.SetMaxOpenConns(1) + for _, q := range []string{"create database mv_validation", "use mv_validation", "set experimental_materialized_view=1", "create table facts(k int,v int)", fmt.Sprintf("insert into facts values(1,%d)", (i+1)*10), "create materialized view totals refresh manual as select k,sum(v) as s from facts group by k", "refresh materialized view totals"} { + if _, err = connection.ExecContext(ctx, q); err != nil { + panic(fmt.Errorf("tenant %s: %w", name, err)) + } + } + tenants = append(tenants, connection) + } + for i, connection := range tenants { + var amount int + if err := connection.QueryRowContext(ctx, "select s from totals").Scan(&amount); err != nil { + panic(err) + } + if amount != (i+1)*10 { + panic("tenant materialization crossed accounts") + } + if _, err := connection.ExecContext(ctx, "drop database mv_validation"); err == nil { + panic("DROP DATABASE bypassed surviving MV restriction") + } else { + requireServerRejection("tenant DROP DATABASE RESTRICT", err) + } + if _, err := connection.ExecContext(ctx, "create materialized view periodic refresh every interval 1 minute as select k,sum(v) as s from facts group by k"); err != nil { + panic(err) + } + if _, err := connection.ExecContext(ctx, "refresh materialized view periodic"); err != nil { + panic(err) + } + } + scheduledAccountLifecycleCases("mv_validation_a", dsn) + pass("same-name multi-tenant source and MV isolation") + pass("tenant DROP DATABASE restricts surviving MVs") + // Surviving manual/populated and periodic MVs are intentionally retained. + // Administrative deletion must retire them; explicit DROP MV masks the bug. + for _, name := range []string{"mv_validation_a", "mv_validation_b"} { + account := rows("select account_id from mo_catalog.mo_account where account_name='" + name + "'")[0][0] + if name == "mv_validation_a" { + accountRetirementRollbackCase(name, account, dsn) + } + exec("drop account " + name) + for _, table := range []string{"mo_materialized_views", "mo_mv_dependencies", "mo_mv_refresh_runs", "mo_mv_account_state"} { + if rows("select count(*) from mo_catalog." + table + " where account_id=" + account)[0][0] != "0" { + panic("DROP ACCOUNT leaked " + table) + } + } + if rows("select count(*) from mo_catalog.mo_tables where account_id=" + account)[0][0] != "0" { + panic("DROP ACCOUNT leaked native objects") + } + if rows("select count(*) from mo_task.sys_async_task where task_metadata_executor=17 and json_extract(cast(task_metadata_context as varchar),'$.Key.Account')=" + account)[0][0] != "0" { + panic("DROP ACCOUNT leaked queued MV tasks") + } + } + pass("DROP ACCOUNT retires surviving populated and periodic MVs") +} + +// NewConnector preserves account:user:role usernames; reparsing FormatDSN +// would interpret their first colon as the password separator. +func openConfigured(cfg *mysql.Config) (*sql.DB, error) { + connector, err := mysql.NewConnector(cfg) + if err != nil { + return nil, err + } + return sql.OpenDB(connector), nil +} + +func runNativeFailureAndCleanup() { + // Own this fixture independently of the benchmark/restart deployment. + exec("create database if not exists mv_validation_failure") + exec("use mv_validation_failure") + exec("set experimental_materialized_view=1") + exec("drop materialized view if exists failure_mv") + exec("drop table if exists failure_source") + exec("create table failure_source(id int,v bigint)") + exec("insert into failure_source values(1,0)") + exec("create materialized view failure_mv refresh manual as select id,v+9223372036854775807 as v from failure_source") + exec("refresh materialized view failure_mv") + old := rows("select * from failure_mv") + exec("update failure_source set v=1") + expectError("native source-expression refresh failure", "refresh materialized view failure_mv") + if !reflect.DeepEqual(old, rows("select * from failure_mv")) { + panic("failed native refresh changed last-good result") + } + pass("native failed refresh preserves rows") + runs := rows("show materialized view refreshes failure_mv") + if len(runs) < 2 || runs[0][1] != "FAILED" { + panic("native failed refresh history missing") + } + pass("native failed refresh diagnostic") + exec("drop materialized view failure_mv") + if len(rows("show materialized views")) != 0 { + panic("drop left MV metadata") + } + pass("drop removes MV state") + exec("drop database mv_validation_failure") + pass("dependency cleanup permits database drop") +} + +// Make the real reconciler due immediately and poll its durable terminal +// refresh history, rather than waiting through several full policy intervals; +// source rows and last-good metadata are the independent public oracles. +func scheduledAccountLifecycleCases(name string, dsn string) { + account := rows("select account_id from mo_catalog.mo_account where account_name='" + name + "'")[0][0] + definition := rows("select mv_id,epoch from mo_catalog.mo_materialized_views where account_id=" + account + " and name='periodic'")[0] + exec("update mo_catalog.mo_materialized_views set next_due=date_add(current_timestamp(),interval 1 day) where account_id=" + account + " and name='periodic'") + cfg, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + cfg.User = name + ":admin" + cfg.Passwd = "mv-validation-only" + cfg.DBName = "mv_validation" + for _, status := range []string{"suspend", "restricted"} { + func() { + // Own a fresh session for each status transition; suspension kills it. + active, err := openConfigured(cfg) + if err != nil { + panic(err) + } + defer active.Close() + active.SetMaxOpenConns(1) + before := rows("select successful_sequence,last_run,source_physical,source_logical from mo_catalog.mo_materialized_views where account_id=" + account + " and name='periodic'") + oldRows := queryRows(active, "select * from periodic order by k") + if _, err := active.ExecContext(ctx, "update facts set v=v+1"); err != nil { + panic(err) + } + exec("alter account " + name + " " + status) + awaitScheduledMaterializedViewTask(account, definition, false) + after := rows("select successful_sequence,last_run,source_physical,source_logical from mo_catalog.mo_materialized_views where account_id=" + account + " and name='periodic'") + if !reflect.DeepEqual(before, after) { + panic(status + " account published MV metadata") + } + exec("alter account " + name + " open") + recovered, err := openConfigured(cfg) + if err != nil { + panic(err) + } + defer recovered.Close() + recovered.SetMaxOpenConns(1) + if !reflect.DeepEqual(oldRows, queryRows(recovered, "select * from periodic order by k")) { + panic(status + " account changed last-good rows") + } + pass("scheduled refresh blocked for " + status + " account preserves rows and provenance") + awaitScheduledMaterializedViewTask(account, definition, true) + if !reflect.DeepEqual(queryRows(recovered, "select k,sum(v) as s from facts group by k order by k"), queryRows(recovered, "select * from periodic order by k")) { + panic("reopened account refresh mismatch") + } + // Keep the normal reconciler away from the next status-boundary fixture. + exec("update mo_catalog.mo_materialized_views set next_due=date_add(current_timestamp(),interval 1 day) where account_id=" + account + " and name='periodic'") + pass("scheduled refresh resumes after reopening " + status + " account") + }() + } +} + +func awaitScheduledMaterializedViewTask(account string, definition []string, success bool) { + predicate := "account_id=" + account + " and mv_id=" + definition[0] + before := rows("select requested_sequence from mo_catalog.mo_materialized_views where " + predicate)[0][0] + // A system account may update its MV lifecycle catalog, but public sessions + // cannot insert internal mo_task rows. Let the real reconciler own dispatch. + exec("update mo_catalog.mo_materialized_views set next_due=current_timestamp() where " + predicate) + deadline := time.Now().Add(90 * time.Second) + for time.Now().Before(deadline) { + result := rows("select status,run_id from mo_catalog.mo_mv_refresh_runs where " + predicate + " and sequence>" + before + " order by sequence desc limit 1") + if len(result) == 1 && (result[0][0] == "SUCCEEDED" || result[0][0] == "FAILED") { + if len(result[0][1]) != 64 { + panic("scheduled run is not a typed task envelope") + } + queued := rows("select task_status from mo_task.sys_async_task where task_metadata_id='mv:" + result[0][1][:40] + "'") + // FAILED history precedes bounded retries. Await queue completion + // before changing account state. taskService.cleanupTasks deletes + // only Completed rows: terminal typed history plus an absent queue + // row also proves completion/GC in this exclusively owned fixture. + // A present Created/Running row is never treated as terminal. + if len(queued) > 1 { + panic("duplicate typed task queue identity") + } + if len(queued) == 1 && queued[0][0] != "2" { + select { + case <-ctx.Done(): + panic(ctx.Err()) + case <-time.After(200 * time.Millisecond): + } + continue + } + if (result[0][0] == "SUCCEEDED") != success { + panic(fmt.Sprintf("scheduled task expected success=%v got %v", success, result)) + } + return + } + select { + case <-ctx.Done(): + panic(ctx.Err()) + case <-time.After(200 * time.Millisecond): + } + } + panic(fmt.Sprintf("account-lifecycle task did not terminate; state=%v history=%v queue=%v", rows("select epoch,interval_seconds,next_due,requested_sequence,successful_sequence from mo_catalog.mo_materialized_views where "+predicate), rows("select status,run_id,sequence from mo_catalog.mo_mv_refresh_runs where "+predicate+" order by sequence desc limit 3"), rows("select task_metadata_id,task_status,result_code from mo_task.sys_async_task where task_metadata_executor=17 and json_extract(cast(task_metadata_context as varchar),'$.Key.Account')="+account))) +} + +// Corrupt only a task-owned retirement target name to force failure after the +// first MV has been dropped in the account transaction. This exercises real +// rollback without a product hook, sleeps or scheduler luck. +func accountRetirementRollbackCase(name, account, dsn string) { + cfg, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + cfg.User = name + ":admin" + cfg.Passwd = "mv-validation-only" + cfg.DBName = "mv_validation" + connection, err := openConfigured(cfg) + if err != nil { + panic(err) + } + defer connection.Close() + connection.SetMaxOpenConns(1) + beforeRows := queryRows(connection, "select * from totals order by k") + beforePeriodic := queryRows(connection, "select * from periodic order by k") + exec("update mo_catalog.mo_materialized_views set name='retirement_missing' where account_id=" + account + " and name='periodic'") + defer exec("update mo_catalog.mo_materialized_views set name='periodic' where account_id=" + account + " and name='retirement_missing'") + query := "select mv_id,epoch,interval_seconds,next_due,successful_sequence,last_run from mo_catalog.mo_materialized_views where account_id=" + account + " order by mv_id" + before := rows(query) + _, err = db.ExecContext(ctx, "drop account "+name) + requireServerRejection("account retirement injected missing target", err) + if !reflect.DeepEqual(before, rows(query)) { + panic("failed account deletion changed MV policy/state") + } + if !reflect.DeepEqual(beforeRows, queryRows(connection, "select * from totals order by k")) || !reflect.DeepEqual(beforePeriodic, queryRows(connection, "select * from periodic order by k")) { + panic("failed account deletion lost native MV rows") + } + if rows("select count(*) from mo_catalog.mo_account where account_id=" + account)[0][0] != "1" { + panic("failed account deletion removed account") + } + pass("DROP ACCOUNT failure rolls back retired objects, policy and metadata") +} diff --git a/test/materialized_view/catalog.go b/test/materialized_view/catalog.go new file mode 100644 index 0000000000000..6578e090e561e --- /dev/null +++ b/test/materialized_view/catalog.go @@ -0,0 +1,47 @@ +// Copyright 2026 Matrix Origin +// Licensed under the Apache License, Version 2.0. +package main + +import ( + "fmt" + "os" +) + +// Use only an isolated, initialized pre-MV catalog with automatic upgrade off. +// If normal authentication rejects the old cluster at tenant-version admission, +// a test-only skipCheckUser session can isolate this kernel guard. It does not +// establish mixed-version/login compatibility; privilege checks remain enabled. +func runMissingMaterializedViewCatalog() { + if rows("select count(*) from mo_catalog.mo_tables where account_id=0 and reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state')")[0][0] != "0" { + panic("catalog-missing requires all four MV catalogs absent") + } + exec("set experimental_materialized_view=0") + exec("drop database if exists mv_validation_pre_migration") + exec("create database mv_validation_pre_migration") + defer func() { + original := recover() + _, err := db.ExecContext(ctx, "drop database if exists mv_validation_pre_migration") + if original != nil { + if err != nil { + fmt.Fprintln(os.Stderr, "fixture cleanup:", err) + } + panic(original) + } + if err != nil { + panic(err) + } + }() + exec("create table mv_validation_pre_migration.facts(id int primary key,v int)") + exec("insert into mv_validation_pre_migration.facts values(1,7)") + for _, item := range []struct{ name, sql string }{ + {"ordinary ALTER before MV migration", "alter table mv_validation_pre_migration.facts add column extra int"}, + {"ordinary CREATE INDEX before MV migration", "create index v_idx on mv_validation_pre_migration.facts(v)"}, + {"ordinary DROP INDEX before MV migration", "drop index v_idx on mv_validation_pre_migration.facts"}, + {"ordinary TRUNCATE before MV migration", "truncate table mv_validation_pre_migration.facts"}, + {"ordinary DROP TABLE before MV migration", "drop table mv_validation_pre_migration.facts"}, + {"ordinary DROP DATABASE before MV migration", "drop database mv_validation_pre_migration"}, + } { + exec(item.sql) + pass(item.name) + } +} diff --git a/test/materialized_view/consumers.go b/test/materialized_view/consumers.go new file mode 100644 index 0000000000000..3dc4af68d52e3 --- /dev/null +++ b/test/materialized_view/consumers.go @@ -0,0 +1,281 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "context" + "fmt" + "reflect" + "strings" + "time" + + mysql "github.com/go-sql-driver/mysql" +) + +func runConsumerCases(dsn, secondDSN string) { + db.SetMaxOpenConns(1) + exec("create database mv_consumer_validation") + defer func() { + failure := recover() + cleanup, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + var failures []string + for _, name := range []string{"stored_copy", "policy_copy", "policy", "stored"} { + if _, err := db.ExecContext(cleanup, "drop materialized view if exists mv_consumer_validation."+name); err != nil { + failures = append(failures, err.Error()) + } + } + if _, err := db.ExecContext(cleanup, "drop database mv_consumer_validation"); err != nil { + failures = append(failures, err.Error()) + } + if len(failures) > 0 { + panic(fmt.Sprintf("consumer cleanup: %v; original=%v", failures, failure)) + } + if failure != nil { + panic(failure) + } + }() + exec("use mv_consumer_validation") + exec("set experimental_materialized_view=1") + exec("set time_zone='+00:00'") + exec("set delete_opt_to_truncate=1") + exec("create table facts(id int primary key,k int unique,skey int,index sk(skey))") + // Complete fixture DDL before PREPARE so the cached DELETE owner stays unchanged. + exec("create table comparison(id int not null,k int,skey int)") + const insert = "insert into facts values(1,11,10),(2,22,20)" + exec(insert) + if secondDSN == "" { + secondDSN = dsn + } + config, err := mysql.ParseDSN(secondDSN) + if err != nil { + panic(err) + } + config.DBName = "mv_consumer_validation" + other, err := openConfigured(config) + if err != nil { + panic(err) + } + defer other.Close() + other.SetMaxOpenConns(1) + otherExec := func(sql string) { + if _, err := other.ExecContext(ctx, sql); err != nil { + panic(err) + } + } + otherExec("set experimental_materialized_view=1") + otherExec("set time_zone='+00:00'") + // This statement predates dependency creation: cached eligibility must not + // turn valid source DML into a rejected physical-identity replacement. Use + // another session/CN so the owner's session DDL generation cannot mask it. + prepared, err := db.PrepareContext(ctx, "delete from facts") + if err != nil { + panic(err) + } + defer prepared.Close() + // Cross-CN assertions use the existing causal commit-frontier handoff. + rows("select mo_ctl('cn','synccommit','')") + otherExec("create materialized view stored refresh manual as select id,k,skey from facts") + rows("select mo_ctl('cn','synccommit','')") + // Branch mutations run on the other session too; they must not invalidate + // the prepared DELETE owner's DDL generation, even on rejected statements. + func() { + result, err := other.QueryContext(ctx, "data branch diff comparison against comparison") + if err != nil { + panic(err) + } + defer result.Close() + if len(decodeRows(result)) != 0 { + panic("ordinary branch diff should remain empty") + } + if err := result.Err(); err != nil { + panic(err) + } + }() + pass("ordinary native branch readers remain supported") + checkBranchRejection := func() { + for _, statement := range []string{ + "data branch diff stored against comparison", + "data branch diff comparison against stored", + "data branch diff stored against comparison output as forbidden_diff", + "data branch merge stored into comparison", + "data branch merge comparison into stored", + } { + _, err := other.ExecContext(ctx, statement) + requireServerRejection("MV branch endpoint", err) + if !strings.Contains(err.Error(), "materialized view") { + panic(err) + } + } + if got := rows("select count(*) from mo_catalog.mo_tables where reldatabase='mv_consumer_validation' and relname='forbidden_diff'"); !reflect.DeepEqual(got, [][]string{{"0"}}) { + panic("rejected branch diff created an output table") + } + } + checkBranchRejection() + pass("unpopulated MV branch readers reject both endpoints before diff output") + const dependentRead = "select (select (select s.id)) from stored s" + for _, suffix := range []string{"", " limit 0", " where false"} { + _, err := db.ExecContext(ctx, dependentRead+suffix) + requireServerRejection("dependent unpopulated MV scan", err) + if !strings.Contains(err.Error(), "MV_NOT_POPULATED") { + panic(err) + } + } + pass("dependent scans retain unpopulated MV admission including empty results") + otherExec("refresh materialized view stored") + rows("select mo_ctl('cn','synccommit','')") + const publication = "select successful_sequence,last_run,source_physical,source_logical from mo_catalog.mo_materialized_views where account_id=0 and database_name='mv_consumer_validation' and name='stored'" + before := rows(publication) + checkBranchRejection() + if !reflect.DeepEqual(before, rows(publication)) || !reflect.DeepEqual(rows("select count(*) from comparison"), [][]string{{"0"}}) || !reflect.DeepEqual(rows("select id,k,skey from facts order by id"), rows("select id,k,skey from stored order by id")) { + panic("rejected branch operation changed MV publication or source rows") + } + pass("populated MV branch operations remain unsupported with unchanged publication") + if !reflect.DeepEqual(rows(dependentRead+" order by s.id"), [][]string{{"1"}, {"2"}}) || len(rows(dependentRead+" limit 0")) != 0 || len(rows(dependentRead+" where false")) != 0 { + panic("populated dependent MV scan changed result semantics") + } + evidence.RawPlan = rows("explain " + dependentRead) + pass("dependent scans read populated MV including empty-result controls") + exec("set experimental_materialized_view=0") + for _, statement := range []string{ + "insert into stored select f.id,(select (select f.k)),f.skey from facts f", + "update stored s set k=(select (select s.k))", + "delete from stored where id=(select (select stored.id))", + } { + _, err := db.ExecContext(ctx, statement) + requireServerRejection("dependent MV write target", err) + if !strings.Contains(err.Error(), "materialized view is read only") { + panic(err) + } + } + if !reflect.DeepEqual(before, rows(publication)) || !reflect.DeepEqual(rows("select count(*) from stored"), [][]string{{"2"}}) { + panic("rejected dependent DML changed MV publication") + } + pass("dependent insert update and delete keep MV read only") + deleted, err := prepared.ExecContext(ctx) + if err != nil { + panic(fmt.Errorf("prepared source DELETE after MV creation: %w", err)) + } + if !reflect.DeepEqual(rows("select count(*) from facts"), [][]string{{"0"}}) || !reflect.DeepEqual(rows("select count(*) from stored"), [][]string{{"2"}}) || !reflect.DeepEqual(before, rows(publication)) { + panic("prepared source DELETE changed MV publication") + } + affected, err := deleted.RowsAffected() + if err != nil || affected != 2 { + panic(fmt.Sprintf("prepared DELETE affected rows: %d %v", affected, err)) + } + pass("prepared unrestricted source DELETE preserves MV publication") + if !reflect.DeepEqual(rows("select count(*) from facts force index(sk) where skey=10"), [][]string{{"0"}}) { + panic("source DELETE left secondary index rows") + } + exec(insert) + pass("source DELETE maintains secondary and unique indexes") + _, err = db.ExecContext(ctx, "truncate table facts") + requireServerRejection("explicit source TRUNCATE remains protected", err) + if !strings.Contains(err.Error(), "dependent materialized views") { + panic(err) + } + pass("explicit source TRUNCATE remains protected") + tablesBefore := rows("select relname from mo_catalog.mo_tables where account_id=0 and reldatabase='mv_consumer_validation' order by relname") + _, err = db.ExecContext(ctx, "alter table facts algorithm=copy, add column copy_col int") + requireServerRejection("dependent source ALTER COPY", err) + if !strings.Contains(err.Error(), "dependent materialized views") { + panic(err) + } + if !reflect.DeepEqual(before, rows(publication)) || !reflect.DeepEqual(tablesBefore, rows("select relname from mo_catalog.mo_tables where account_id=0 and reldatabase='mv_consumer_validation' order by relname")) { + panic("rejected ALTER COPY changed publication or left a prepared relation") + } + pass("ALTER COPY rejects dependent source without preparation residue") + + deleted, err = db.ExecContext(ctx, "delete from facts") + if err != nil { + panic(err) + } + affected, err = deleted.RowsAffected() + if err != nil || affected != 2 { + panic(fmt.Sprintf("direct DELETE affected rows: %d %v", affected, err)) + } + if !reflect.DeepEqual(rows("select count(*) from facts"), [][]string{{"0"}}) || !reflect.DeepEqual(before, rows(publication)) { + panic("direct source DELETE changed identity/publication") + } + pass("direct unrestricted source DELETE keeps dependency identity") + deleted, err = db.ExecContext(ctx, "delete from facts") + if err != nil { + panic(err) + } + affected, err = deleted.RowsAffected() + if err != nil || affected != 0 { + panic(fmt.Sprintf("empty DELETE affected rows: %d %v", affected, err)) + } + pass("empty dependent source DELETE returns zero affected rows") + for _, verb := range []string{"dump table stored to ", "load table stored from "} { + _, err := db.ExecContext(ctx, verb+"'file:///tmp/mv-consumer-missing-dump'") + requireServerRejection("native dump/load MV admission", err) + if !strings.Contains(err.Error(), "DUMP TABLE and LOAD TABLE with views") { + panic(fmt.Errorf("expected MV kind rejection before file access: %w", err)) + } + if !reflect.DeepEqual(rows("select count(*) from stored"), [][]string{{"2"}}) || !reflect.DeepEqual(before, rows(publication)) { + panic("dump/load changed MV rows or provenance") + } + pass("MV rejected at native boundary: " + verb) + } + replay := func(name, target string) { + ddl := rows("show create table " + name) + explicit := rows("show create materialized view " + name) + if len(ddl) != 1 || len(ddl[0]) != 2 || len(explicit) != 1 || ddl[0][1] != explicit[0][1] || !strings.HasPrefix(ddl[0][1], "create materialized view ") || strings.Contains(ddl[0][1], "mo_materialized_view") { + panic(fmt.Sprintf("inconsistent MV export: %v %v", ddl, explicit)) + } + old := "`mv_consumer_validation`.`" + name + "`" + renamed := strings.Replace(ddl[0][1], old, "`mv_consumer_validation`.`"+target+"`", 1) + if renamed == ddl[0][1] { + panic("export omitted qualified target") + } + exec(renamed) + } + exec("set experimental_materialized_view=1") + replay("stored", "stored_copy") + exec("refresh materialized view stored_copy") + if !reflect.DeepEqual(rows("select count(*) from stored_copy"), [][]string{{"0"}}) { + panic("replayed manual MV did not refresh from current source") + } + pass("SHOW CREATE TABLE round-trips a manual MV") + exec("create materialized view policy refresh every interval 60 second as select id from facts") + initialPolicy := rows("show create table policy") + if len(initialPolicy) != 1 || !strings.Contains(initialPolicy[0][1], "every interval 60 second") { + panic("initial export lost periodic policy") + } + rows("select mo_ctl('cn','synccommit','')") + preparedPolicy, err := db.PrepareContext(ctx, "show create table policy") + if err != nil { + panic(err) + } + defer preparedPolicy.Close() + if !reflect.DeepEqual(preparedRows(preparedPolicy), initialPolicy) { + panic("initial prepared SHOW disagrees with current policy") + } + otherExec("alter materialized view policy refresh every interval 120 second") + rows("select mo_ctl('cn','synccommit','')") + preparedDDL := preparedRows(preparedPolicy) + if len(preparedDDL) != 1 || len(preparedDDL[0]) != 2 || !strings.Contains(preparedDDL[0][1], "every interval 120 second") || !reflect.DeepEqual(preparedDDL, rows("show create table policy")) { + panic("prepared SHOW retained the other CN's old policy") + } + pass("prepared SHOW CREATE observes policy altered on another CN") + replay("policy", "policy_copy") + if !reflect.DeepEqual(rows("select interval_seconds from mo_catalog.mo_materialized_views where account_id=0 and database_name='mv_consumer_validation' and name='policy_copy'"), [][]string{{"120"}}) { + panic("export replay lost current altered policy") + } + exec("alter materialized view policy refresh manual") + exec("alter materialized view policy_copy refresh manual") + pass("SHOW CREATE TABLE exports the authoritative altered refresh policy") +} diff --git a/test/materialized_view/main.go b/test/materialized_view/main.go new file mode 100644 index 0000000000000..7bcb5966b9711 --- /dev/null +++ b/test/materialized_view/main.go @@ -0,0 +1,342 @@ +// Copyright 2026 Matrix Origin +// Licensed under the Apache License, Version 2.0. +// Runs independent SQL correctness checks and a paired warm-query benchmark. +package main + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + "flag" + "fmt" + "os" + "reflect" + "sort" + "time" + + mysql "github.com/go-sql-driver/mysql" +) + +type report struct { + Experiments []pairedExperiment `json:"experiments"` + Started time.Time `json:"started"` + Cases []string `json:"passed_cases"` + Rows int `json:"source_rows"` + RefreshMS float64 `json:"refresh_ms"` + BaselineMS []float64 `json:"baseline_ms"` + MaterializedMS []float64 `json:"materialized_ms"` + Speedup float64 `json:"median_speedup"` + RawPlan [][]string `json:"raw_plan"` + MVPlan [][]string `json:"materialized_plan"` + MaterializedRows int `json:"materialized_rows"` + Error string `json:"error,omitempty"` +} + +var evidence report +var db *sql.DB +var ctx context.Context + +func exec(q string) { + if _, err := db.ExecContext(ctx, q); err != nil { + panic(fmt.Errorf("%s: %w", q, err)) + } +} +func rows(q string) [][]string { + return queryRows(db, q) +} +func queryRows(connection *sql.DB, q string) [][]string { + r, err := connection.QueryContext(ctx, q) + if err != nil { + panic(fmt.Errorf("%s: %w", q, err)) + } + defer r.Close() + out := decodeRows(r) + if err = r.Err(); err != nil { + panic(err) + } + return out +} +func preparedRows(stmt *sql.Stmt) [][]string { + r, err := stmt.QueryContext(ctx) + if err != nil { + panic(err) + } + defer r.Close() + out := decodeRows(r) + if err = r.Err(); err != nil { + panic(err) + } + return out +} + +// Callers own closing the result and checking its terminal stream error. +func decodeRows(r *sql.Rows) [][]string { + cols, err := r.Columns() + if err != nil { + panic(err) + } + out := make([][]string, 0) + for r.Next() { + values := make([]sql.RawBytes, len(cols)) + ptr := make([]any, len(cols)) + for i := range values { + ptr[i] = &values[i] + } + if err = r.Scan(ptr...); err != nil { + panic(err) + } + line := make([]string, len(cols)) + for i, v := range values { + if v == nil { + line[i] = "" + } else { + line[i] = string(v) + } + } + out = append(out, line) + } + return out +} +func expectError(name, q string) { + _, err := db.ExecContext(ctx, q) + requireServerRejection(name, err) + pass(name) +} +func requireServerRejection(name string, err error) { + if err == nil { + panic(name + ": expected rejection") + } + var serverError *mysql.MySQLError + if !errors.As(err, &serverError) || serverError.Number == 1046 { + panic(fmt.Errorf("%s: unexpected failure: %w", name, err)) + } +} +func equal(name, a, b string) { + if !reflect.DeepEqual(rows(a), rows(b)) { + panic(name + ": result mismatch") + } + pass(name) +} +func pass(name string) { evidence.Cases = append(evidence.Cases, name); fmt.Println("PASS", name) } +func measure(q string) float64 { + start := time.Now() + rows(q) + return float64(time.Since(start).Microseconds()) / 1000 +} +func median(a []float64) float64 { + b := append([]float64(nil), a...) + sort.Float64s(b) + if len(b)%2 == 0 { + return (b[len(b)/2-1] + b[len(b)/2]) / 2 + } + return b[len(b)/2] +} +func main() { + dsn := flag.String("dsn", "dump:111@tcp(127.0.0.1:6001)/?timeout=5s&readTimeout=330s&writeTimeout=330s", "isolated local cluster DSN") + output := flag.String("output", "/workspace/mv-build/sql-results.json", "evidence JSON") + n := flag.Int("rows", 1000000, "benchmark source rows") + catalogMissing := flag.Bool("catalog-missing", false, "isolated pre-MV kernel fixture only: validate ordinary DDL without catalogs") + consumerCheck := flag.Bool("consumer-check", false, "verify MV native loading, source DELETE and SHOW export consumers") + tenantCheck := flag.Bool("tenant-check", false, "run isolated account lifecycle contracts only") + functional := flag.Bool("functional", false, "run SQL contracts without performance experiments") + keep := flag.Bool("keep", false, "retain test database for restart checks") + edge := flag.Bool("edge-check", false, "verify native failure rollback and clean retained fixtures") + restart := flag.Bool("restart-check", false, "check a retained database after restarting service") + scheduled := flag.Bool("scheduled", true, "verify background refresh (up to 120 seconds)") + secondDSN := flag.String("second-dsn", "", "run cross-CN checks using a second SQL endpoint instead of the main suite") + flag.Parse() + evidence.Started = time.Now().UTC() + evidence.Rows = *n + if *functional || *tenantCheck { + evidence.Rows = 0 // No generated benchmark source is created in this mode. + } + defer func() { + if failure := recover(); failure != nil { + evidence.Error = fmt.Sprint(failure) + } + data, _ := json.MarshalIndent(evidence, "", " ") + if err := os.WriteFile(*output, data, 0644); err != nil { + fmt.Fprintln(os.Stderr, err) + } + if evidence.Error != "" { + fmt.Fprintln(os.Stderr, evidence.Error) + os.Exit(1) + } + }() + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(context.Background(), 15*time.Minute) + defer cancel() + var err error + db, err = sql.Open("mysql", *dsn) + if err != nil { + panic(err) + } + defer db.Close() + db.SetMaxOpenConns(4) + if err = db.PingContext(ctx); err != nil { + panic(err) + } + if *catalogMissing { + evidence.Rows = 0 + runMissingMaterializedViewCatalog() + return + } + if *consumerCheck { + evidence.Rows = 0 + runConsumerCases(*dsn, *secondDSN) + return + } + if *tenantCheck { + tenantIsolationCases(*dsn) + return + } + if *secondDSN != "" { + runMultiCN(*secondDSN) + return + } + if *edge { + runNativeFailureAndCleanup() + return + } + if *restart { + runRestartCheck() + return + } + exec("create database if not exists mv_validation") + exec("use mv_validation") + // Pin one connection because USE and session variables are session-local. + db.SetMaxOpenConns(1) + for _, name := range []string{"bench_mv", "joined", "empty_total", "totals", "unsupported", "gated", "escaped_source"} { + exec("drop materialized view if exists " + name) + } + exec("drop table if exists `slash\\source`") + for _, name := range []string{"facts", "dimension", "bench"} { + exec("drop table if exists " + name) + } + exec("set experimental_materialized_view=0") + exec("create table facts (id int primary key,k int,v decimal(18,2))") + exec("insert into facts values(1,1,10),(2,1,20),(3,2,null),(4,null,7),(5,2,-2)") + expectError("experimental gate", "create materialized view gated refresh manual as select * from facts") + exec("set experimental_materialized_view=1") + const aggregate = "select k,count(*) as n,count(v) as nv,sum(v) as s,min(v) as lo,max(v) as hi,avg(v) as av from facts group by k" + exec("create materialized view totals refresh manual as " + aggregate) + expectError("deferred population", "select * from totals") + exec("refresh materialized view totals") + equal("NULL and aggregate semantics", aggregate+" order by k", "select * from totals order by k") + typedAggregateOracle() + saved := rows("select * from totals order by k") + exec("insert into facts values(6,1,90),(7,3,12)") + exec("update facts set v=25 where id=1") + exec("delete from facts where id=2") + if !reflect.DeepEqual(saved, rows("select * from totals order by k")) { + panic("manual view changed before refresh") + } + pass("last committed materialization") + exec("refresh materialized view totals") + equal("insert update delete refresh", aggregate+" order by k", "select * from totals order by k") + for _, q := range []string{"insert into totals(k) values(4)", "update totals set k=4", "delete from totals", "truncate table totals", "replace into totals(k) values(4)", "alter table totals add x int", "drop table totals"} { + expectError("read only: "+q, q) + } + for _, q := range []string{"alter table facts add x int", "truncate table facts", "drop table facts", "drop database mv_validation"} { + expectError("dependency restrict: "+q, q) + } + if !reflect.DeepEqual(rows("select database()"), [][]string{{"mv_validation"}}) { + panic("failed dependency DROP changed current database") + } + pass("failed DROP preserves current database") + for _, source := range []string{"select rand() from facts", "select now() from facts", "select distinct k from facts", "select count(distinct k) from facts", "select * from facts limit 1", "select row_number() over(order by id) from facts", "select * from totals"} { + expectError("unsupported definition: "+source, "create materialized view unsupported refresh manual as "+source) + } + exec("create table dimension(k int primary key,label varchar(20))") + exec("insert into dimension values(1,'one'),(2,'two')") + const joined = "select d.label,sum(f.v) as s,count(*) as n from facts f inner join dimension d on f.k=d.k group by d.label" + exec("create materialized view joined refresh manual as " + joined) + exec("refresh materialized view joined") + equal("inner join refresh", joined+" order by label", "select * from joined order by label") + exec("create materialized view empty_total refresh manual as select count(*) as n,sum(v) as s from facts where id<0") + exec("refresh materialized view empty_total") + equal("empty aggregate", "select count(*),sum(v) from facts where id<0", "select * from empty_total") + exec("begin") + expectError("refresh in user transaction", "refresh materialized view totals") + exec("rollback") + exec("alter materialized view totals refresh every interval 1 minute") + creation := rows("show create materialized view totals") + if len(creation) != 1 { + panic("SHOW CREATE missing") + } + pass("SHOW CREATE") + if *scheduled { + exec("insert into facts values(8,4,123)") + deadline := time.Now().Add(120 * time.Second) + matched := false + for time.Now().Before(deadline) { + if reflect.DeepEqual(rows(aggregate+" order by k"), rows("select * from totals order by k")) { + matched = true + break + } + time.Sleep(2 * time.Second) + } + if !matched { + panic("scheduled refresh did not publish within 120 seconds") + } + pass("scheduled refresh") + } + exec("alter materialized view totals refresh manual") + state := rows("show materialized views") + if len(state) != 3 { + panic("SHOW list mismatch") + } + pass("SHOW state and full source timestamp") + history := rows("show materialized view refreshes totals") + if len(history) == 0 { + panic("missing refresh history") + } + pass("refresh history") + runAdditionalCases(*dsn) + timeoutRead(*dsn) + if *functional || *tenantCheck { + for _, name := range []string{"joined", "empty_total", "totals"} { + exec("drop materialized view " + name) + } + exec("drop database mv_validation") + pass("drop cleanup") + return + } + // Explicit view scan versus the same raw aggregation: P1 has no automatic rewrite. + exec("create table bench(id bigint,k int,v bigint)") + exec(fmt.Sprintf("insert into bench select result,result%%128,result%%1000 from generate_series(1,%d) g", *n)) + const baseline = "select k,sum(v) as s,count(*) as n from bench group by k" + const materialized = "select k,s,n from bench_mv" + exec("create materialized view bench_mv refresh manual as " + baseline) + start := time.Now() + exec("refresh materialized view bench_mv") + evidence.RefreshMS = float64(time.Since(start).Microseconds()) / 1000 + equal("benchmark result equality", baseline+" order by k", materialized+" order by k") + evidence.RawPlan = rows("explain " + baseline) + evidence.MVPlan = rows("explain " + materialized) + evidence.MaterializedRows = len(rows(materialized)) + rows(baseline) + rows(materialized) + for i := 0; i < 50; i++ { + if i%2 == 0 { + evidence.BaselineMS = append(evidence.BaselineMS, measure(baseline)) + evidence.MaterializedMS = append(evidence.MaterializedMS, measure(materialized)) + } else { + evidence.MaterializedMS = append(evidence.MaterializedMS, measure(materialized)) + evidence.BaselineMS = append(evidence.BaselineMS, measure(baseline)) + } + } + evidence.Speedup = median(evidence.BaselineMS) / median(evidence.MaterializedMS) + fmt.Printf("rows=%d refresh_ms=%.3f raw_median_ms=%.3f mv_median_ms=%.3f speedup=%.2fx\n", *n, evidence.RefreshMS, median(evidence.BaselineMS), median(evidence.MaterializedMS), evidence.Speedup) + performanceCases() + if *keep { + pass("retained restart fixture") + return + } + for _, name := range []string{"bench_mv", "joined", "empty_total", "totals"} { + exec("drop materialized view " + name) + } + exec("drop database mv_validation") + pass("drop cleanup") +} diff --git a/test/materialized_view/multi_cn.go b/test/materialized_view/multi_cn.go new file mode 100644 index 0000000000000..90ce5cb9ccb14 --- /dev/null +++ b/test/materialized_view/multi_cn.go @@ -0,0 +1,169 @@ +// Copyright 2026 Matrix Origin +// +// 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, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package main + +import ( + "database/sql" + "errors" + "fmt" + "strings" + "sync" + + mysql "github.com/go-sql-driver/mysql" +) + +// The second CN shares the same TN and storage. No fixture from the benchmark +// is reused: the topology checks own a small, separate database. +func runMultiCN(secondDSN string) { + const database = "mv_validation_multi_cn" + evidence.Rows = 4 + db.SetMaxOpenConns(1) + exec("create database if not exists " + database) + exec("use " + database) + exec("set experimental_materialized_view=1") + exec("drop materialized view if exists atomic_mv") + exec("drop table if exists atomic_source") + defer func() { + exec("drop materialized view if exists atomic_mv") + exec("drop table if exists atomic_source") + exec("drop database " + database) + }() + exec("create table atomic_source(id int primary key,v bigint)") + exec("insert into atomic_source values(1,1),(2,1),(3,1),(4,1)") + exec("create materialized view atomic_mv refresh manual as select count(*) as n,sum(v) as s,min(v) as lo,max(v) as hi from atomic_source") + config, err := mysql.ParseDSN(secondDSN) + if err != nil { + panic(err) + } + config.DBName = database + other, err := openConfigured(config) + if err != nil { + panic(err) + } + defer other.Close() + other.SetMaxOpenConns(1) + if err = other.PingContext(ctx); err != nil { + panic(err) + } + // Push mode permits an independently connected CN to start at its older + // applied snapshot. Hand off the actual commit frontier before assertions + // spanning connections, using MO's existing bounded synchronization API. + // This is a causal barrier, not a timing assumption or a query retry. + syncCommits := func() { rows("select mo_ctl('cn','synccommit','')") } + syncCommits() + if _, err = other.ExecContext(ctx, "select * from atomic_mv"); err == nil { + panic("second CN accepted an unpopulated view") + } else { + var serverError *mysql.MySQLError + if !errors.As(err, &serverError) || serverError.Number != 20301 || !strings.Contains(serverError.Message, "MV_NOT_POPULATED") { + panic(fmt.Errorf("second CN population check: %w", err)) + } + } + pass("second CN rejects unpopulated view") + exec("refresh materialized view atomic_mv") + syncCommits() + read := func(connection *sql.DB) int64 { + var n, s, lo, hi int64 + if err := connection.QueryRowContext(ctx, "select n,s,lo,hi from atomic_mv").Scan(&n, &s, &lo, &hi); err != nil { + panic(err) + } + if n != 4 || lo != hi || s != 4*lo { + panic(fmt.Sprintf("partial cross-CN publication: %d %d %d %d", n, s, lo, hi)) + } + return lo + } + if read(other) != 1 { + panic("second CN did not see first publication") + } + pass("cross-CN publication visibility") + if _, err = other.ExecContext(ctx, "refresh materialized view atomic_mv"); err != nil { + panic(fmt.Errorf("standalone second-CN refresh: %w", err)) + } + syncCommits() + if read(db) != 1 { + panic("first CN did not see the second CN's publication") + } + pass("second CN can refresh independently") + var originalID uint64 + if err = db.QueryRowContext(ctx, "select rel_id from mo_catalog.mo_tables where reldatabase='"+database+"' and relname='atomic_mv'").Scan(&originalID); err != nil { + panic(err) + } + var previousPhysical int64 + var previousLogical uint32 + for version := int64(2); version <= 6; version++ { + publisher, reader := db, other + if version%2 == 1 { + publisher, reader = other, db + } + if _, err = publisher.ExecContext(ctx, fmt.Sprintf("update atomic_source set v=%d", version)); err != nil { + panic(err) + } + syncCommits() + start := make(chan struct{}) + results := make(chan error, 2) + var wg sync.WaitGroup + for _, connection := range []*sql.DB{db, other} { + wg.Go(func() { + <-start + _, refreshErr := connection.ExecContext(ctx, "refresh materialized view atomic_mv") + results <- refreshErr + }) + } + close(start) + wg.Wait() + close(results) + succeeded := 0 + for refreshErr := range results { + if refreshErr == nil { + succeeded++ + } else { + var serverError *mysql.MySQLError + if !errors.As(refreshErr, &serverError) || serverError.Number != 20619 { + panic(fmt.Errorf("unexpected cross-CN refresh failure: %w", refreshErr)) + } + fmt.Println("concurrent refresh rejected:", refreshErr) + } + } + syncCommits() + readerVersion, publisherVersion := read(reader), read(publisher) + if succeeded == 0 || readerVersion != version || publisherVersion != version { + panic(fmt.Sprintf("cross-CN refresh did not publish the latest complete fixture: expected=%d successful_requests=%d reader=%d publisher=%d metadata=%v history=%v", + version, succeeded, readerVersion, publisherVersion, + rows("select requested_sequence,successful_sequence,source_physical,source_logical from mo_catalog.mo_materialized_views where database_name='"+database+"' and name='atomic_mv'"), + rows("select sequence,status,source_physical,source_logical from mo_catalog.mo_mv_refresh_runs where mv_id=(select mv_id from mo_catalog.mo_materialized_views where database_name='"+database+"' and name='atomic_mv') order by sequence"))) + } + var id uint64 + var physical int64 + var logical uint32 + if err = reader.QueryRowContext(ctx, "select mv_id,source_physical,source_logical from mo_catalog.mo_materialized_views where database_name='"+database+"' and name='atomic_mv'").Scan(&id, &physical, &logical); err != nil { + panic(err) + } + if id != originalID || physical < previousPhysical || (physical == previousPhysical && logical < previousLogical) { + panic("cross-CN identity or source timestamp regressed") + } + previousPhysical, previousLogical = physical, logical + pass(fmt.Sprintf("two-CN concurrent publication version %d", version)) + } + var successes, pending int + if err = other.QueryRowContext(ctx, "select count(*) from mo_catalog.mo_mv_refresh_runs where mv_id=? and status='SUCCEEDED'", originalID).Scan(&successes); err != nil { + panic(err) + } + if err = other.QueryRowContext(ctx, "select count(*) from mo_catalog.mo_mv_refresh_runs where mv_id=? and status='RUNNING'", originalID).Scan(&pending); err != nil { + panic(err) + } + if successes < 7 || pending != 0 { + panic(fmt.Sprintf("cross-CN history not terminal: successful=%d pending=%d", successes, pending)) + } + pass("cross-CN terminal history") +} diff --git a/test/materialized_view/native_probe/check.py b/test/materialized_view/native_probe/check.py new file mode 100644 index 0000000000000..40bac42022ef7 --- /dev/null +++ b/test/materialized_view/native_probe/check.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Exercise the recovery SQL bridge against an existing native BVT endpoint.""" + +import json +import pathlib +import subprocess +import sys + + +def check(binary, dsn): + def request(sql, query=True): + return json.dumps({"dsn": dsn, "sql": sql, "query": query}) + + statements = [ + "{", # Malformed JSON must not terminate the following requests. + json.dumps({"dsn": "invalid-dsn", "sql": "select 1", "query": True}), + request("select 1,cast(null as char),cast('bridge' as char) union all select 2,'value','tail'"), + request("set @mv_native_probe_value=23", query=False), + request("select @mv_native_probe_value"), + request("select 1 where false"), + request("select * from mo_catalog.__mv_native_probe_missing__"), + request("insert into mo_catalog.__mv_native_probe_missing__ values(1)", query=False), + request("select @mv_native_probe_value+1"), + ] + result = subprocess.run( + [binary], input="\n".join(statements) + "\n", text=True, + capture_output=True, timeout=90, + ) + if result.returncode: + raise RuntimeError("SQL bridge failed: " + result.stderr) + responses = [json.loads(line) for line in result.stdout.splitlines()] + assert len(responses) == len(statements), responses + assert responses[0]["error"].startswith("unexpected end of JSON input"), responses[0] + assert "invalid DSN" in responses[1]["error"], responses[1] + expected = { + 2: [["1", "", "bridge"], ["2", "value", "tail"]], + 3: None, + 4: [["23"]], # Same DSN reuses its session across Exec and Query. + 5: [], # Zero rows and SQL NULL remain distinct protocol values. + 8: [["24"]], # SQL errors must not poison the stream/session. + } + for index, rows in expected.items(): + assert responses[index] == {"rows": rows, "error": ""}, (index, responses[index]) + for index in (6, 7): + assert responses[index]["rows"] is None and "Error 1146" in responses[index]["error"], (index, responses[index]) + return {"passed_requests": len(responses), "process_exit": result.returncode} + + +if __name__ == "__main__": + if len(sys.argv) != 3: + raise SystemExit("Usage: check.py ") + # Two independent client lifetimes exercise the same native instance. Only + # connection-local state is changed; EOF closes the bridge's SQL resources. + print(json.dumps({"runs": [check(str(pathlib.Path(sys.argv[1]).resolve()), sys.argv[2]) for _ in range(2)]})) diff --git a/test/materialized_view/native_probe/main.go b/test/materialized_view/native_probe/main.go new file mode 100644 index 0000000000000..0b6f1a2e0b718 --- /dev/null +++ b/test/materialized_view/native_probe/main.go @@ -0,0 +1,103 @@ +// Copyright 2026 Matrix Origin +// Licensed under the Apache License, Version 2.0. + +// A small JSON-lines SQL client for the process-owning native recovery driver. +package main + +import ( + "bufio" + "context" + "database/sql" + "encoding/json" + "fmt" + "os" + "time" + + _ "github.com/go-sql-driver/mysql" +) + +type request struct { + DSN string `json:"dsn"` + SQL string `json:"sql"` + Query bool `json:"query"` +} + +func run(db *sql.DB, q request) ([][]string, error) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + if !q.Query { + _, err := db.ExecContext(ctx, q.SQL) + return nil, err + } + r, err := db.QueryContext(ctx, q.SQL) + if err != nil { + return nil, err + } + defer r.Close() + cols, err := r.Columns() + if err != nil { + return nil, err + } + out := make([][]string, 0) + for r.Next() { + values := make([]sql.NullString, len(cols)) + ptrs := make([]any, len(cols)) + for i := range values { + ptrs[i] = &values[i] + } + if err = r.Scan(ptrs...); err != nil { + return nil, err + } + line := make([]string, len(cols)) + for i, v := range values { + line[i] = v.String + if !v.Valid { + line[i] = "" + } + } + out = append(out, line) + } + return out, r.Err() +} + +func main() { + dbs := map[string]*sql.DB{} + defer func() { + for _, db := range dbs { + db.Close() + } + }() + in := bufio.NewScanner(os.Stdin) + in.Buffer(make([]byte, 4096), 1<<20) + out := json.NewEncoder(os.Stdout) + for in.Scan() { + var q request + var data [][]string + err := json.Unmarshal(in.Bytes(), &q) + if err == nil { + connection := dbs[q.DSN] + if connection == nil { + connection, err = sql.Open("mysql", q.DSN) + if err == nil { + connection.SetMaxOpenConns(1) + dbs[q.DSN] = connection + } + } + if err == nil { + data, err = run(connection, q) + } + } + message := "" + if err != nil { + message = err.Error() + } + if err := out.Encode(map[string]any{"rows": data, "error": message}); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + } + if err := in.Err(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/test/materialized_view/performance.go b/test/materialized_view/performance.go new file mode 100644 index 0000000000000..30b3c366019c5 --- /dev/null +++ b/test/materialized_view/performance.go @@ -0,0 +1,57 @@ +// Copyright 2026 Matrix Origin +// Licensed under the Apache License, Version 2.0. +package main + +import ( + "fmt" + "time" +) + +type pairedExperiment struct { + Name string `json:"name"` + RefreshMS float64 `json:"refresh_ms"` + ResultRows int `json:"result_rows"` + RawMS, MVMS []float64 + Ratio float64 `json:"median_ratio"` +} + +func paired(name, raw, stored string, refreshMS float64) pairedExperiment { + equal(name+" result equality", raw+" order by 1", stored+" order by 1") + result := pairedExperiment{Name: name, RefreshMS: refreshMS, ResultRows: len(rows(stored))} + rows(raw) + rows(stored) + for i := 0; i < 50; i++ { + if i%2 == 0 { + result.RawMS = append(result.RawMS, measure(raw)) + result.MVMS = append(result.MVMS, measure(stored)) + } else { + result.MVMS = append(result.MVMS, measure(stored)) + result.RawMS = append(result.RawMS, measure(raw)) + } + } + result.Ratio = median(result.RawMS) / median(result.MVMS) + fmt.Printf("experiment=%s rows=%d raw_ms=%.3f mv_ms=%.3f ratio=%.2fx\n", name, result.ResultRows, median(result.RawMS), median(result.MVMS), result.Ratio) + return result +} +func performanceCases() { + // Explicit rollup uses mergeable SUM/COUNT, with an independent raw oracle. + evidence.Experiments = append(evidence.Experiments, paired("B02 explicit rollup", "select k div 16 as g,sum(v) as s,count(*) as n from bench group by k div 16", "select k div 16 as g,sum(s) as s,sum(n) as n from bench_mv group by k div 16", 0)) + exec("create table bench_dimension(k int primary key,label int)") + exec("insert into bench_dimension select result-1,(result-1)%8 from generate_series(1,128) g") + const joined = "select d.label,sum(b.v) as s,count(*) as n from bench b inner join bench_dimension d on b.k=d.k group by d.label" + exec("create materialized view bench_join_mv refresh manual as " + joined) + start := time.Now() + exec("refresh materialized view bench_join_mv") + elapsed := float64(time.Since(start).Microseconds()) / 1000 + evidence.Experiments = append(evidence.Experiments, paired("B03 repeated join", joined, "select label,s,n from bench_join_mv", elapsed)) + exec("drop materialized view bench_join_mv") + exec("drop table bench_dimension") + // A small, near-source-grain control exposes weak/no improvement and costs. + const granular = "select id,sum(v) as s,count(*) as n from bench where id<=10000 group by id" + exec("create materialized view bench_grain_mv refresh manual as " + granular) + start = time.Now() + exec("refresh materialized view bench_grain_mv") + elapsed = float64(time.Since(start).Microseconds()) / 1000 + evidence.Experiments = append(evidence.Experiments, paired("B05 high cardinality control", granular, "select id,s,n from bench_grain_mv", elapsed)) + exec("drop materialized view bench_grain_mv") +}