From 24a05ce15a85b85099a8d0d14358d54f5871ad2a Mon Sep 17 00:00:00 2001 From: Gemma Lamont Date: Thu, 4 Apr 2024 11:02:01 +0200 Subject: [PATCH] [NOID] Backport runMany updates --- core/src/main/java/apoc/cypher/Cypher.java | 4 +- .../main/java/apoc/cypher/CypherExtended.java | 237 ++-- .../java/apoc/cypher/CypherExtendedTest.java | 44 + .../runManyStatementsWithFailure.cypher | 1024 +++++++++++++++++ 4 files changed, 1198 insertions(+), 111 deletions(-) create mode 100644 full/src/test/resources/runManyStatementsWithFailure.cypher diff --git a/core/src/main/java/apoc/cypher/Cypher.java b/core/src/main/java/apoc/cypher/Cypher.java index f246c0097c..07b2d30179 100644 --- a/core/src/main/java/apoc/cypher/Cypher.java +++ b/core/src/main/java/apoc/cypher/Cypher.java @@ -239,7 +239,7 @@ private Object consumeResult(Result result, BlockingQueue queue, bool } } - private String removeShellControlCommands(String stmt) { + public static String removeShellControlCommands(String stmt) { Matcher matcher = shellControl.matcher(stmt.trim()); if (matcher.find()) { // an empty file get transformed into ":begin\n:commit" and that statement is not matched by the pattern @@ -257,7 +257,7 @@ private boolean isPeriodicOperation(String stmt) { return stmt.matches("(?is).*using\\s+periodic.*"); } - private Map toMap(QueryStatistics stats, long time, long rows) { + protected static Map toMap(QueryStatistics stats, long time, long rows) { final Map map = map( "rows", rows, "time", time); diff --git a/full/src/main/java/apoc/cypher/CypherExtended.java b/full/src/main/java/apoc/cypher/CypherExtended.java index e0df83f02b..c965b4691d 100644 --- a/full/src/main/java/apoc/cypher/CypherExtended.java +++ b/full/src/main/java/apoc/cypher/CypherExtended.java @@ -45,10 +45,12 @@ import java.util.List; import java.util.Map; import java.util.Scanner; +import java.util.Spliterator; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -59,6 +61,7 @@ import org.neo4j.graphdb.QueryStatistics; import org.neo4j.graphdb.Result; import org.neo4j.graphdb.Transaction; +import org.neo4j.graphdb.security.AuthorizationViolationException; import org.neo4j.internal.helpers.collection.Iterators; import org.neo4j.logging.Log; import org.neo4j.procedure.Context; @@ -76,7 +79,6 @@ @Extended public class CypherExtended { - public static final String COMPILED_PREFIX = "CYPHER runtime=" + Util.COMPILED; public static final int PARTITIONS = 100 * Runtime.getRuntime().availableProcessors(); public static final int MAX_BATCH = 10000; @@ -134,42 +136,84 @@ private Stream runNonSchemaFiles( @SuppressWarnings("unchecked") final Map parameters = (Map) config.getOrDefault("parameters", Collections.emptyMap()); - final boolean schemaOperation = false; - return runFiles(fileNames, config, parameters, schemaOperation, defaultStatistics); + return runFiles(fileNames, config, parameters, defaultStatistics); } // This runs the files sequentially private Stream runFiles( - List fileNames, - Map config, - Map parameters, - boolean schemaOperation, - boolean defaultStatistics) { + List fileNames, Map config, Map params, boolean defaultStatistics) { boolean reportError = Util.toBoolean(config.get("reportError")); boolean addStatistics = Util.toBoolean(config.getOrDefault("statistics", defaultStatistics)); - int timeout = Util.toInteger(config.getOrDefault("timeout", 10)); - int queueCapacity = Util.toInteger(config.getOrDefault("queueCapacity", 100)); - var result = fileNames.stream().flatMap(fileName -> { + return fileNames.stream().flatMap(fileName -> { final Reader reader = readerForFile(fileName); - final Scanner scanner = createScannerFor(reader); - return runManyStatements( - scanner, - parameters, - schemaOperation, - addStatistics, - timeout, - queueCapacity, - reportError, - fileName) - .onClose(() -> Util.close( - scanner, - (e) -> log.info( - "Cannot close the scanner for file " + fileName - + " because the following exception", - e))); + AtomicBoolean hasFailed = new AtomicBoolean(false); + return Iterators.stream(new Scanner(reader).useDelimiter(";\r?\n")) + .map(Cypher::removeShellControlCommands) + .filter(s -> !s.isBlank()) + .flatMap(s -> streamInNewTx(s, params, addStatistics, fileName, reportError, hasFailed)); }); + } + + private Stream streamInNewTx( + String cypher, + Map params, + boolean stats, + String fileName, + boolean reportError, + AtomicBoolean hasFailed) { + if (hasFailed.get()) return null; + else if (isPeriodicOperation(cypher)) + return streamInNewExplicitTx(cypher, params, stats, fileName, reportError); + final var innerTx = db.beginTx(); + try { + // Hello fellow wanderer, + // At this point you may have questions like; + // - "Why do we execute this statement in a new transaction?" + // My guess is as good as yours. This is the way of the apoc. Safe travels. + + final var results = new RunManyResultSpliterator(innerTx.execute(cypher, params), stats, fileName, tx); + return StreamSupport.stream(results, false).onClose(results::close).onClose(innerTx::commit); + } catch (AuthorizationViolationException accessModeException) { + // We meet again, few people make it this far into this world! + // I hope you're not still seeking answers, there are few to give. + // It has been written, in some long forgotten commits, + // that failures of this kind should be avoided. The ancestors + // were brave and used a regex based cypher parser to avoid + // trying to execute schema changing statements all together. + // We don't have that courage, and try to forget about it + // after the fact instead. + // One can only hope that by keeping this tradition alive, + // in some form, we make some poor souls happier. + innerTx.close(); + return Stream.empty(); + } catch (Throwable t) { + innerTx.close(); + hasFailed.set(true); + if (reportError) { + String error = t.getMessage(); + return Stream.of(new RowResult(-1, Map.of("error", error), fileName)); + } else { + return null; + } + } + } - return result; + private Stream streamInNewExplicitTx( + String cypher, Map params, boolean stats, String fileName, boolean reportError) { + try { + final var results = new RunManyResultSpliterator( + db.executeTransactionally(cypher, params, result -> result), stats, fileName, tx); + return StreamSupport.stream(results, false).onClose(results::close); + } catch (AuthorizationViolationException accessModeException) { + return Stream.empty(); + } catch (Throwable t) { + if (reportError) { + String error = t.getMessage(); + return Stream.of(new RowResult(-1, Map.of("error", error), fileName)); + } else { + return null; + } + } } @Procedure(mode = Mode.SCHEMA) @@ -186,34 +230,8 @@ public Stream runSchemaFile( public Stream runSchemaFiles( @Name("file") List fileNames, @Name(value = "config", defaultValue = "{}") Map config) { - final boolean schemaOperation = true; final Map parameters = Collections.emptyMap(); - return runFiles(fileNames, config, parameters, schemaOperation, true); - } - - private Stream runManyStatements( - Scanner scanner, - Map params, - boolean schemaOperation, - boolean addStatistics, - int timeout, - int queueCapacity, - boolean reportError, - String fileName) { - BlockingQueue queue = runInSeparateThreadAndSendTombstone( - queueCapacity, - internalQueue -> { - if (schemaOperation) { - runSchemaStatementsInTx( - scanner, internalQueue, params, addStatistics, timeout, reportError, fileName); - } else { - runDataStatementsInTx( - scanner, internalQueue, params, addStatistics, timeout, reportError, fileName); - } - }, - RowResult.TOMBSTONE); - return StreamSupport.stream( - new QueueBasedSpliterator<>(queue, RowResult.TOMBSTONE, terminationGuard, Integer.MAX_VALUE), false); + return runFiles(fileNames, config, parameters, true); } private BlockingQueue runInSeparateThreadAndSendTombstone( @@ -246,7 +264,6 @@ private void runDataStatementsInTx( BlockingQueue queue, Map params, boolean addStatistics, - long timeout, boolean reportError, String fileName) { while (scanner.hasNext()) { @@ -294,43 +311,6 @@ private void collectError(BlockingQueue queue, boolean reportError, E QueueUtil.put(queue, result, 10); } - private Scanner createScannerFor(Reader reader) { - Scanner scanner = new Scanner(reader); - scanner.useDelimiter(";\r?\n"); - return scanner; - } - - private void runSchemaStatementsInTx( - Scanner scanner, - BlockingQueue queue, - Map params, - boolean addStatistics, - long timeout, - boolean reportError, - String fileName) { - while (scanner.hasNext()) { - String stmt = removeShellControlCommands(scanner.next()); - if (stmt.trim().isEmpty()) continue; - boolean schemaOperation; - try { - schemaOperation = isSchemaOperation(stmt); - } catch (Exception e) { - collectError(queue, reportError, e, fileName); - return; - } - if (schemaOperation) { - Util.inTx(db, pools, txInThread -> { - try (Result result = txInThread.execute(stmt, params)) { - return consumeResult(result, queue, addStatistics, tx, fileName); - } catch (Exception e) { - collectError(queue, reportError, e, fileName); - return null; - } - }); - } - } - } - private static final Pattern shellControl = Pattern.compile("^:?\\b(begin|commit|rollback)\\b", Pattern.CASE_INSENSITIVE); @@ -419,10 +399,6 @@ public static String withParamMapping(String fragment, Collection keys) return declaration + fragment; } - public static String compiled(String fragment) { - return fragment.substring(0, 6).equalsIgnoreCase("cypher") ? fragment : COMPILED_PREFIX + fragment; - } - @Procedure @Description( "apoc.cypher.parallel(fragment, `paramMap`, `keyList`) yield value - executes fragments in parallel through a list defined in `paramMap` with a key `keyList`") @@ -445,18 +421,6 @@ public Stream parallel( parallelParams.replace(key, v); return tx.execute(statement, parallelParams).stream().map(MapResult::new); }); - - /* - params.entrySet().stream() - .filter( e -> asCollection(e.getValue()).size() > 100) - .map( (e) -> (Map.Entry)(Map.Entry)e ) - .max( (max,e) -> e.getValue().size() ) - .map( (e) -> e.getValue().parallelStream().map( (v) -> { - Map map = new HashMap<>(params); - map.put(e.getKey(),as) - })); - return db.execute(statement,params).stream().map(MapResult::new); - */ } @Procedure @@ -590,3 +554,58 @@ private Future>> submit( }); } } + +class RunManyResultSpliterator implements Spliterator, AutoCloseable { + private final Result result; + private final long start; + private boolean statistics; + private String fileName; + private int rowCount; + + private Transaction transaction; + + RunManyResultSpliterator(Result result, boolean statistics, String fileName, Transaction transaction) { + this.result = result; + this.start = System.currentTimeMillis(); + this.statistics = statistics; + this.fileName = fileName; + this.transaction = transaction; + } + + @Override + public boolean tryAdvance(Consumer action) { + if (result.hasNext()) { + Map res = EntityUtil.anyRebind(transaction, result.next()); + action.accept(new CypherExtended.RowResult(rowCount++, res, fileName)); + return true; + } else if (statistics) { + final var stats = + CypherExtended.toMap(result.getQueryStatistics(), System.currentTimeMillis() - start, rowCount); + statistics = false; + action.accept(new CypherExtended.RowResult(-1, stats, fileName)); + return true; + } + close(); + return false; + } + + @Override + public Spliterator trySplit() { + return null; + } + + @Override + public long estimateSize() { + return result.hasNext() ? Long.MAX_VALUE : 1; + } + + @Override + public int characteristics() { + return Spliterator.ORDERED; + } + + @Override + public void close() { + result.close(); + } +} diff --git a/full/src/test/java/apoc/cypher/CypherExtendedTest.java b/full/src/test/java/apoc/cypher/CypherExtendedTest.java index a75c8411e3..d39191ef44 100644 --- a/full/src/test/java/apoc/cypher/CypherExtendedTest.java +++ b/full/src/test/java/apoc/cypher/CypherExtendedTest.java @@ -25,6 +25,8 @@ import static apoc.util.TestUtil.testCallEmpty; import static apoc.util.TestUtil.testResult; import static apoc.util.Util.map; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.awaitility.Awaitility.await; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.containsStringIgnoringCase; import static org.hamcrest.Matchers.hasEntry; @@ -38,10 +40,12 @@ import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.time.Duration; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -740,4 +744,44 @@ private void assertCreateDeleteFile(Result r) { assertEquals(-1L, row.get("row")); assertEquals(1L, toLong(result.get("nodesDeleted"))); } + + @Test + public void runManyCloseTransactionsWithRandomFailures() { + final var rnd = new Random(); + final var seed = rnd.nextLong(); + rnd.setSeed(seed); + + // The outer query also fails at a random row + final var failureRow = rnd.nextInt(1024); + + assertThatThrownBy(() -> { + try (final var tx = db.beginTx()) { + final var q = + "CALL apoc.cypher.runFile('runManyStatementsWithFailure.cypher', {}) YIELD row, result " + + "RETURN row, result, 1 / (result.x - $x) AS boom"; + try (final var result = tx.execute(q, Map.of("x", failureRow))) { + result.accept(r -> true); + } + } + }) + .hasRootCauseInstanceOf(org.neo4j.exceptions.ArithmeticException.class); + + assertNoOpenTransactionsEventually(); + } + + private void assertNoOpenTransactionsEventually() { + await("transactions closed") + .pollInterval(Duration.ofMillis(200)) + .atMost(Duration.ofSeconds(10)) + .pollInSameThread() + .untilAsserted(this::assertNoOpenTransactions); + } + + private void assertNoOpenTransactions() { + testResult(db, "SHOW TRANSACTIONS", r -> { + Map row = r.next(); + assertEquals("SHOW TRANSACTIONS", row.get("currentQuery")); + assertFalse(r.hasNext()); + }); + } } diff --git a/full/src/test/resources/runManyStatementsWithFailure.cypher b/full/src/test/resources/runManyStatementsWithFailure.cypher new file mode 100644 index 0000000000..3eb9d5b4ad --- /dev/null +++ b/full/src/test/resources/runManyStatementsWithFailure.cypher @@ -0,0 +1,1024 @@ +UNWIND range(0, 171) AS x RETURN x; +UNWIND range(1, 57) AS x RETURN x; +UNWIND range(2, 271) AS x RETURN x; +UNWIND range(3, 155) AS x RETURN x; +UNWIND range(4, 329) AS x RETURN x; +UNWIND range(5, 122) AS x RETURN x; +UNWIND range(6, 127) AS x RETURN x; +UNWIND range(7, 96) AS x RETURN x; +UNWIND range(8, 489) AS x RETURN x; +UNWIND range(9, 255) AS x RETURN x; +UNWIND range(10, 494) AS x RETURN x; +UNWIND range(11, 436) AS x RETURN x; +UNWIND range(12, 101) AS x RETURN x; +UNWIND range(13, 144) AS x RETURN x; +UNWIND range(14, 172) AS x RETURN x; +UNWIND range(15, 30) AS x RETURN x; +UNWIND range(16, 124) AS x RETURN x; +UNWIND range(17, 249) AS x RETURN x; +UNWIND range(18, 225) AS x RETURN x; +UNWIND range(19, 452) AS x RETURN x; +UNWIND range(20, 330) AS x RETURN x; +UNWIND range(21, 26) AS x RETURN x; +UNWIND range(22, 349) AS x RETURN x; +UNWIND range(23, 133) AS x RETURN x; +UNWIND range(24, 403) AS x RETURN x; +UNWIND range(25, 223) AS x RETURN x; +UNWIND range(26, 341) AS x RETURN x; +UNWIND range(27, 190) AS x RETURN x; +UNWIND range(28, 188) AS x RETURN x; +UNWIND range(29, 287) AS x RETURN x; +UNWIND range(30, 322) AS x RETURN x; +UNWIND range(31, 99) AS x RETURN x; +UNWIND range(32, 30) AS x RETURN x; +UNWIND range(33, 492) AS x RETURN x; +UNWIND range(34, 208) AS x RETURN x; +UNWIND range(35, 98) AS x RETURN x; +UNWIND range(36, 491) AS x RETURN x; +UNWIND range(37, 136) AS x RETURN x; +UNWIND range(38, 405) AS x RETURN x; +UNWIND range(39, 89) AS x RETURN x; +UNWIND range(40, 300) AS x RETURN x; +UNWIND range(41, 293) AS x RETURN x; +UNWIND range(42, 29) AS x RETURN x; +UNWIND range(43, 508) AS x RETURN x; +UNWIND range(44, 67) AS x RETURN x; +UNWIND range(45, 465) AS x RETURN x; +UNWIND range(46, 293) AS x RETURN x; +UNWIND range(47, 408) AS x RETURN x; +UNWIND range(48, 460) AS x RETURN x; +UNWIND range(49, 382) AS x RETURN x; +UNWIND range(50, 42) AS x RETURN x; +UNWIND range(51, 97) AS x RETURN x; +UNWIND range(52, 503) AS x RETURN x; +UNWIND range(53, 288) AS x RETURN x; +UNWIND range(54, 334) AS x RETURN x; +UNWIND range(55, 61) AS x RETURN x; +UNWIND range(56, 423) AS x RETURN x; +UNWIND range(57, 337) AS x RETURN x; +UNWIND range(58, 308) AS x RETURN x; +UNWIND range(59, 60) AS x RETURN x; +UNWIND range(60, 141) AS x RETURN x; +UNWIND range(61, 109) AS x RETURN x; +UNWIND range(62, 21) AS x RETURN x; +UNWIND range(63, 53) AS x RETURN x; +UNWIND range(64, 302) AS x RETURN x; +UNWIND range(65, 266) AS x RETURN x; +UNWIND range(66, 95) AS x RETURN x; +UNWIND range(67, 17) AS x RETURN x; +UNWIND range(68, 44) AS x RETURN x; +UNWIND range(69, 84) AS x RETURN x; +UNWIND range(70, 15) AS x RETURN x; +UNWIND range(71, 145) AS x RETURN x; +UNWIND range(72, 358) AS x RETURN x; +UNWIND range(73, 52) AS x RETURN x; +UNWIND range(74, 452) AS x RETURN x; +UNWIND range(75, 159) AS x RETURN x; +UNWIND range(76, 25) AS x RETURN x; +UNWIND range(77, 12) AS x RETURN x; +UNWIND range(78, 384) AS x RETURN x; +UNWIND range(79, 319) AS x RETURN x; +UNWIND range(80, 156) AS x RETURN x; +UNWIND range(81, 153) AS x RETURN x; +UNWIND range(82, 263) AS x RETURN x; +UNWIND range(83, 442) AS x RETURN x; +UNWIND range(84, 474) AS x RETURN x; +UNWIND range(85, 254) AS x RETURN x; +UNWIND range(86, 14) AS x RETURN x; +UNWIND range(87, 94) AS x RETURN x; +UNWIND range(88, 43) AS x RETURN x; +UNWIND range(89, 398) AS x RETURN x; +UNWIND range(90, 281) AS x RETURN x; +UNWIND range(91, 298) AS x RETURN x; +UNWIND range(92, 484) AS x RETURN x; +UNWIND range(93, 109) AS x RETURN x; +UNWIND range(94, 1) AS x RETURN x; +UNWIND range(95, 153) AS x RETURN x; +UNWIND range(96, 72) AS x RETURN x; +UNWIND range(97, 308) AS x RETURN x; +UNWIND range(98, 128) AS x RETURN x; +UNWIND range(99, 151) AS x RETURN x; +UNWIND range(100, 320) AS x RETURN x; +UNWIND range(101, 478) AS x RETURN x; +UNWIND range(102, 101) AS x RETURN x; +UNWIND range(103, 314) AS x RETURN x; +UNWIND range(104, 336) AS x RETURN x; +UNWIND range(105, 252) AS x RETURN x; +UNWIND range(106, 160) AS x RETURN x; +UNWIND range(107, 304) AS x RETURN x; +UNWIND range(108, 196) AS x RETURN x; +UNWIND range(109, 472) AS x RETURN x; +UNWIND range(110, 430) AS x RETURN x; +UNWIND range(111, 269) AS x RETURN x; +UNWIND range(112, 146) AS x RETURN x; +UNWIND range(113, 375) AS x RETURN x; +UNWIND range(114, 477) AS x RETURN x; +UNWIND range(115, 325) AS x RETURN x; +UNWIND range(116, 121) AS x RETURN x; +UNWIND range(117, 34) AS x RETURN x; +UNWIND range(118, 414) AS x RETURN x; +UNWIND range(119, 146) AS x RETURN x; +UNWIND range(120, 155) AS x RETURN x; +UNWIND range(121, 65) AS x RETURN x; +UNWIND range(122, 36) AS x RETURN x; +UNWIND range(123, 479) AS x RETURN x; +UNWIND range(124, 193) AS x RETURN x; +UNWIND range(125, 151) AS x RETURN x; +UNWIND range(126, 473) AS x RETURN x; +UNWIND range(127, 122) AS x RETURN x; +UNWIND range(128, 301) AS x RETURN x; +UNWIND range(129, 158) AS x RETURN x; +UNWIND range(130, 392) AS x RETURN x; +UNWIND range(131, 20) AS x RETURN x; +UNWIND range(132, 90) AS x RETURN x; +UNWIND range(133, 64) AS x RETURN x; +UNWIND range(134, 130) AS x RETURN x; +UNWIND range(135, 247) AS x RETURN x; +UNWIND range(136, 201) AS x RETURN x; +UNWIND range(137, 324) AS x RETURN x; +UNWIND range(138, 194) AS x RETURN x; +UNWIND range(139, 416) AS x RETURN x; +UNWIND range(140, 237) AS x RETURN x; +UNWIND range(141, 425) AS x RETURN x; +UNWIND range(142, 383) AS x RETURN x; +UNWIND range(143, 261) AS x RETURN x; +UNWIND range(144, 354) AS x RETURN x; +UNWIND range(145, 187) AS x RETURN x; +UNWIND range(146, 82) AS x RETURN x; +UNWIND range(147, 82) AS x RETURN x; +UNWIND range(148, 278) AS x RETURN x; +UNWIND range(149, 250) AS x RETURN x; +UNWIND range(150, 391) AS x RETURN x; +UNWIND range(151, 132) AS x RETURN x; +UNWIND range(152, 310) AS x RETURN x; +UNWIND range(153, 195) AS x RETURN x; +UNWIND range(154, 422) AS x RETURN x; +UNWIND range(155, 419) AS x RETURN x; +UNWIND range(156, 235) AS x RETURN x; +UNWIND range(157, 180) AS x RETURN x; +UNWIND range(158, 511) AS x RETURN x; +UNWIND range(159, 169) AS x RETURN x; +UNWIND range(160, 30) AS x RETURN x; +UNWIND range(161, 320) AS x RETURN x; +UNWIND range(162, 318) AS x RETURN x; +UNWIND range(163, 3) AS x RETURN x; +UNWIND range(164, 262) AS x RETURN x; +UNWIND range(165, 226) AS x RETURN x; +UNWIND range(166, 475) AS x RETURN x; +UNWIND range(167, 29) AS x RETURN x; +UNWIND range(168, 159) AS x RETURN x; +UNWIND range(169, 303) AS x RETURN x; +UNWIND range(170, 26) AS x RETURN x; +UNWIND range(171, 330) AS x RETURN x; +UNWIND range(172, 431) AS x RETURN x; +UNWIND range(173, 452) AS x RETURN x; +UNWIND range(174, 67) AS x RETURN x; +UNWIND range(175, 281) AS x RETURN x; +UNWIND range(176, 266) AS x RETURN x; +UNWIND range(177, 417) AS x RETURN x; +UNWIND range(178, 213) AS x RETURN x; +UNWIND range(179, 15) AS x RETURN x; +UNWIND range(180, 110) AS x RETURN x; +UNWIND range(181, 294) AS x RETURN x; +UNWIND range(182, 352) AS x RETURN x; +UNWIND range(183, 388) AS x RETURN x; +UNWIND range(184, 385) AS x RETURN x; +UNWIND range(185, 401) AS x RETURN x; +UNWIND range(186, 237) AS x RETURN x; +UNWIND range(187, 438) AS x RETURN x; +UNWIND range(188, 409) AS x RETURN x; +UNWIND range(189, 507) AS x RETURN x; +UNWIND range(190, 278) AS x RETURN x; +UNWIND range(191, 70) AS x RETURN x; +UNWIND range(192, 106) AS x RETURN x; +UNWIND range(193, 40) AS x RETURN x; +UNWIND range(194, 324) AS x RETURN x; +UNWIND range(195, 353) AS x RETURN x; +UNWIND range(196, 404) AS x RETURN x; +UNWIND range(197, 251) AS x RETURN x; +UNWIND range(198, 409) AS x RETURN x; +UNWIND range(199, 258) AS x RETURN x; +UNWIND range(200, 257) AS x RETURN x; +UNWIND range(201, 259) AS x RETURN x; +UNWIND range(202, 449) AS x RETURN x; +UNWIND range(203, 61) AS x RETURN x; +UNWIND range(204, 135) AS x RETURN x; +UNWIND range(205, 175) AS x RETURN x; +UNWIND range(206, 446) AS x RETURN x; +UNWIND range(207, 107) AS x RETURN x; +UNWIND range(208, 501) AS x RETURN x; +UNWIND range(209, 454) AS x RETURN x; +UNWIND range(210, 283) AS x RETURN x; +UNWIND range(211, 4) AS x RETURN x; +UNWIND range(212, 267) AS x RETURN x; +UNWIND range(213, 379) AS x RETURN x; +UNWIND range(214, 479) AS x RETURN x; +UNWIND range(215, 447) AS x RETURN x; +UNWIND range(216, 488) AS x RETURN x; +UNWIND range(217, 413) AS x RETURN x; +UNWIND range(218, 329) AS x RETURN x; +UNWIND range(219, 267) AS x RETURN x; +UNWIND range(220, 236) AS x RETURN x; +UNWIND range(221, 283) AS x RETURN x; +UNWIND range(222, 137) AS x RETURN x; +UNWIND range(223, 272) AS x RETURN x; +UNWIND range(224, 362) AS x RETURN x; +UNWIND range(225, 504) AS x RETURN x; +UNWIND range(226, 235) AS x RETURN x; +UNWIND range(227, 438) AS x RETURN x; +UNWIND range(228, 136) AS x RETURN x; +UNWIND range(229, 71) AS x RETURN x; +UNWIND range(230, 474) AS x RETURN x; +UNWIND range(231, 92) AS x RETURN x; +UNWIND range(232, 412) AS x RETURN x; +UNWIND range(233, 77) AS x RETURN x; +UNWIND range(234, 507) AS x RETURN x; +UNWIND range(235, 428) AS x RETURN x; +UNWIND range(236, 406) AS x RETURN x; +UNWIND range(237, 295) AS x RETURN x; +UNWIND range(238, 386) AS x RETURN x; +UNWIND range(239, 212) AS x RETURN x; +UNWIND range(240, 15) AS x RETURN x; +UNWIND range(241, 143) AS x RETURN x; +UNWIND range(242, 150) AS x RETURN x; +UNWIND range(243, 505) AS x RETURN x; +UNWIND range(244, 281) AS x RETURN x; +UNWIND range(245, 443) AS x RETURN x; +UNWIND range(246, 400) AS x RETURN x; +UNWIND range(247, 13) AS x RETURN x; +UNWIND range(248, 408) AS x RETURN x; +UNWIND range(249, 397) AS x RETURN x; +UNWIND range(250, 333) AS x RETURN x; +UNWIND range(251, 447) AS x RETURN x; +UNWIND range(252, 48) AS x RETURN x; +UNWIND range(253, 91) AS x RETURN x; +UNWIND range(254, 487) AS x RETURN x; +UNWIND range(255, 114) AS x RETURN x; +UNWIND range(256, 229) AS x RETURN x; +UNWIND range(257, 374) AS x RETURN x; +UNWIND range(258, 400) AS x RETURN x; +UNWIND range(259, 30) AS x RETURN x; +UNWIND range(260, 25) AS x RETURN x; +UNWIND range(261, 11) AS x RETURN x; +UNWIND range(262, 276) AS x RETURN x; +UNWIND range(263, 184) AS x RETURN x; +UNWIND range(264, 100) AS x RETURN x; +UNWIND range(265, 364) AS x RETURN x; +UNWIND range(266, 501) AS x RETURN x; +UNWIND range(267, 156) AS x RETURN x; +UNWIND range(268, 291) AS x RETURN x; +UNWIND range(269, 154) AS x RETURN x; +UNWIND range(270, 408) AS x RETURN x; +UNWIND range(271, 459) AS x RETURN x; +UNWIND range(272, 442) AS x RETURN x; +UNWIND range(273, 306) AS x RETURN x; +UNWIND range(274, 492) AS x RETURN x; +UNWIND range(275, 86) AS x RETURN x; +UNWIND range(276, 196) AS x RETURN x; +UNWIND range(277, 281) AS x RETURN x; +UNWIND range(278, 30) AS x RETURN x; +UNWIND range(279, 333) AS x RETURN x; +UNWIND range(280, 372) AS x RETURN x; +UNWIND range(281, 464) AS x RETURN x; +UNWIND range(282, 73) AS x RETURN x; +UNWIND range(283, 302) AS x RETURN x; +UNWIND range(284, 489) AS x RETURN x; +UNWIND range(285, 169) AS x RETURN x; +UNWIND range(286, 33) AS x RETURN x; +UNWIND range(287, 116) AS x RETURN x; +UNWIND range(288, 479) AS x RETURN x; +UNWIND range(289, 333) AS x RETURN x; +UNWIND range(290, 104) AS x RETURN x; +UNWIND range(291, 316) AS x RETURN x; +UNWIND range(292, 179) AS x RETURN x; +UNWIND range(293, 340) AS x RETURN x; +UNWIND range(294, 143) AS x RETURN x; +UNWIND range(295, 506) AS x RETURN x; +UNWIND range(296, 3) AS x RETURN x; +UNWIND range(297, 122) AS x RETURN x; +UNWIND range(298, 56) AS x RETURN x; +UNWIND range(299, 440) AS x RETURN x; +UNWIND range(300, 367) AS x RETURN x; +UNWIND range(301, 286) AS x RETURN x; +UNWIND range(302, 395) AS x RETURN x; +UNWIND range(303, 402) AS x RETURN x; +UNWIND range(304, 437) AS x RETURN x; +UNWIND range(305, 95) AS x RETURN x; +UNWIND range(306, 95) AS x RETURN x; +UNWIND range(307, 494) AS x RETURN x; +UNWIND range(308, 42) AS x RETURN x; +UNWIND range(309, 120) AS x RETURN x; +UNWIND range(310, 316) AS x RETURN x; +UNWIND range(311, 79) AS x RETURN x; +UNWIND range(312, 321) AS x RETURN x; +UNWIND range(313, 157) AS x RETURN x; +UNWIND range(314, 247) AS x RETURN x; +UNWIND range(315, 465) AS x RETURN x; +UNWIND range(316, 164) AS x RETURN x; +UNWIND range(317, 190) AS x RETURN x; +UNWIND range(318, 416) AS x RETURN x; +UNWIND range(319, 369) AS x RETURN x; +UNWIND range(320, 208) AS x RETURN x; +UNWIND range(321, 485) AS x RETURN x; +UNWIND range(322, 202) AS x RETURN x; +UNWIND range(323, 288) AS x RETURN x; +UNWIND range(324, 394) AS x RETURN x; +UNWIND range(325, 378) AS x RETURN x; +UNWIND range(326, 243) AS x RETURN x; +UNWIND range(327, 509) AS x RETURN x; +UNWIND range(328, 246) AS x RETURN x; +UNWIND range(329, 158) AS x RETURN x; +UNWIND range(330, 219) AS x RETURN x; +UNWIND range(331, 350) AS x RETURN x; +UNWIND range(332, 458) AS x RETURN x; +UNWIND range(333, 493) AS x RETURN x; +UNWIND range(334, 200) AS x RETURN x; +UNWIND range(335, 443) AS x RETURN x; +UNWIND range(336, 232) AS x RETURN x; +UNWIND range(337, 149) AS x RETURN x; +UNWIND range(338, 56) AS x RETURN x; +UNWIND range(339, 66) AS x RETURN x; +UNWIND range(340, 455) AS x RETURN x; +UNWIND range(341, 370) AS x RETURN x; +UNWIND range(342, 33) AS x RETURN x; +UNWIND range(343, 345) AS x RETURN x; +UNWIND range(344, 497) AS x RETURN x; +UNWIND range(345, 208) AS x RETURN x; +UNWIND range(346, 115) AS x RETURN x; +UNWIND range(347, 443) AS x RETURN x; +UNWIND range(348, 413) AS x RETURN x; +UNWIND range(349, 305) AS x RETURN x; +UNWIND range(350, 46) AS x RETURN x; +UNWIND range(351, 422) AS x RETURN x; +UNWIND range(352, 76) AS x RETURN x; +UNWIND range(353, 104) AS x RETURN x; +UNWIND range(354, 499) AS x RETURN x; +UNWIND range(355, 37) AS x RETURN x; +UNWIND range(356, 50) AS x RETURN x; +UNWIND range(357, 484) AS x RETURN x; +UNWIND range(358, 507) AS x RETURN x; +UNWIND range(359, 308) AS x RETURN x; +UNWIND range(360, 82) AS x RETURN x; +UNWIND range(361, 181) AS x RETURN x; +UNWIND range(362, 110) AS x RETURN x; +UNWIND range(363, 226) AS x RETURN x; +UNWIND range(364, 509) AS x RETURN x; +UNWIND range(365, 355) AS x RETURN x; +UNWIND range(366, 343) AS x RETURN x; +UNWIND range(367, 2) AS x RETURN x; +UNWIND range(368, 286) AS x RETURN x; +UNWIND range(369, 9) AS x RETURN x; +UNWIND range(370, 293) AS x RETURN x; +UNWIND range(371, 307) AS x RETURN x; +UNWIND range(372, 124) AS x RETURN x; +UNWIND range(373, 283) AS x RETURN x; +UNWIND range(374, 166) AS x RETURN x; +UNWIND range(375, 57) AS x RETURN x; +UNWIND range(376, 34) AS x RETURN x; +UNWIND range(377, 168) AS x RETURN x; +UNWIND range(378, 86) AS x RETURN x; +UNWIND range(379, 211) AS x RETURN x; +UNWIND range(380, 34) AS x RETURN x; +UNWIND range(381, 157) AS x RETURN x; +UNWIND range(382, 454) AS x RETURN x; +UNWIND range(383, 399) AS x RETURN x; +UNWIND range(384, 264) AS x RETURN x; +UNWIND range(385, 473) AS x RETURN x; +UNWIND range(386, 326) AS x RETURN x; +UNWIND range(387, 437) AS x RETURN x; +UNWIND range(388, 69) AS x RETURN x; +UNWIND range(389, 16) AS x RETURN x; +UNWIND range(390, 55) AS x RETURN x; +UNWIND range(391, 107) AS x RETURN x; +UNWIND range(392, 306) AS x RETURN x; +UNWIND range(393, 104) AS x RETURN x; +UNWIND range(394, 159) AS x RETURN x; +UNWIND range(395, 502) AS x RETURN x; +UNWIND range(396, 248) AS x RETURN x; +UNWIND range(397, 380) AS x RETURN x; +UNWIND range(398, 501) AS x RETURN x; +UNWIND range(399, 111) AS x RETURN x; +UNWIND range(400, 420) AS x RETURN x; +UNWIND range(401, 317) AS x RETURN x; +UNWIND range(402, 406) AS x RETURN x; +UNWIND range(403, 291) AS x RETURN x; +UNWIND range(404, 19) AS x RETURN x; +UNWIND range(405, 394) AS x RETURN x; +UNWIND range(406, 249) AS x RETURN x; +UNWIND range(407, 488) AS x RETURN x; +UNWIND range(408, 447) AS x RETURN x; +UNWIND range(409, 367) AS x RETURN x; +UNWIND range(410, 292) AS x RETURN x; +UNWIND range(411, 445) AS x RETURN x; +UNWIND range(412, 202) AS x RETURN x; +UNWIND range(413, 189) AS x RETURN x; +UNWIND range(414, 303) AS x RETURN x; +UNWIND range(415, 30) AS x RETURN x; +UNWIND range(416, 87) AS x RETURN x; +UNWIND range(417, 354) AS x RETURN x; +UNWIND range(418, 511) AS x RETURN x; +UNWIND range(419, 13) AS x RETURN x; +UNWIND range(420, 14) AS x RETURN x; +UNWIND range(421, 222) AS x RETURN x; +UNWIND range(422, 496) AS x RETURN x; +UNWIND range(423, 146) AS x RETURN x; +UNWIND range(424, 465) AS x RETURN x; +UNWIND range(425, 155) AS x RETURN x; +UNWIND range(426, 404) AS x RETURN x; +UNWIND range(427, 336) AS x RETURN x; +UNWIND range(428, 452) AS x RETURN x; +UNWIND range(429, 470) AS x RETURN x; +UNWIND range(430, 131) AS x RETURN x; +UNWIND range(431, 469) AS x RETURN x; +UNWIND range(432, 213) AS x RETURN x; +UNWIND range(433, 308) AS x RETURN x; +UNWIND range(434, 15) AS x RETURN x; +UNWIND range(435, 144) AS x RETURN x; +UNWIND range(436, 339) AS x RETURN x; +UNWIND range(437, 290) AS x RETURN x; +UNWIND range(438, 234) AS x RETURN x; +UNWIND range(439, 192) AS x RETURN x; +UNWIND range(440, 464) AS x RETURN x; +UNWIND range(441, 248) AS x RETURN x; +UNWIND range(442, 475) AS x RETURN x; +UNWIND range(443, 116) AS x RETURN x; +UNWIND range(444, 370) AS x RETURN x; +UNWIND range(445, 399) AS x RETURN x; +UNWIND range(446, 382) AS x RETURN x; +UNWIND range(447, 436) AS x RETURN x; +UNWIND range(448, 8) AS x RETURN x; +UNWIND range(449, 175) AS x RETURN x; +UNWIND range(450, 364) AS x RETURN x; +UNWIND range(451, 488) AS x RETURN x; +UNWIND range(452, 324) AS x RETURN x; +UNWIND range(453, 21) AS x RETURN x; +UNWIND range(454, 36) AS x RETURN x; +UNWIND range(455, 413) AS x RETURN x; +UNWIND range(456, 334) AS x RETURN x; +UNWIND range(457, 70) AS x RETURN x; +UNWIND range(458, 266) AS x RETURN x; +UNWIND range(459, 383) AS x RETURN x; +UNWIND range(460, 463) AS x RETURN x; +UNWIND range(461, 54) AS x RETURN x; +UNWIND range(462, 459) AS x RETURN x; +UNWIND range(463, 410) AS x RETURN x; +UNWIND range(464, 402) AS x RETURN x; +UNWIND range(465, 67) AS x RETURN x; +UNWIND range(466, 378) AS x RETURN x; +UNWIND range(467, 23) AS x RETURN x; +UNWIND range(468, 160) AS x RETURN x; +UNWIND range(469, 160) AS x RETURN x; +UNWIND range(470, 468) AS x RETURN x; +UNWIND range(471, 73) AS x RETURN x; +UNWIND range(472, 370) AS x RETURN x; +UNWIND range(473, 9) AS x RETURN x; +UNWIND range(474, 467) AS x RETURN x; +UNWIND range(475, 406) AS x RETURN x; +UNWIND range(476, 261) AS x RETURN x; +UNWIND range(477, 379) AS x RETURN x; +UNWIND range(478, 363) AS x RETURN x; +UNWIND range(479, 257) AS x RETURN x; +UNWIND range(480, 176) AS x RETURN x; +UNWIND range(481, 377) AS x RETURN x; +UNWIND range(482, 144) AS x RETURN x; +UNWIND range(483, 292) AS x RETURN x; +UNWIND range(484, 203) AS x RETURN x; +UNWIND range(485, 310) AS x RETURN x; +UNWIND range(486, 151) AS x RETURN x; +UNWIND range(487, 375) AS x RETURN x; +UNWIND range(488, 279) AS x RETURN x; +UNWIND range(489, 171) AS x RETURN x; +UNWIND range(490, 32) AS x RETURN x; +UNWIND range(491, 237) AS x RETURN x; +UNWIND range(492, 370) AS x RETURN x; +UNWIND range(493, 139) AS x RETURN x; +UNWIND range(494, 426) AS x RETURN x; +UNWIND range(495, 472) AS x RETURN x; +UNWIND range(496, 416) AS x RETURN x; +UNWIND range(497, 141) AS x RETURN x; +UNWIND range(498, 366) AS x RETURN x; +UNWIND range(499, 502) AS x RETURN x; +UNWIND range(500, 27) AS x RETURN x; +UNWIND range(501, 233) AS x RETURN x; +UNWIND range(502, 30) AS x RETURN x; +UNWIND range(503, 398) AS x RETURN x; +UNWIND range(504, 247) AS x RETURN x; +UNWIND range(505, 160) AS x RETURN x; +UNWIND range(506, 454) AS x RETURN x; +UNWIND range(507, 355) AS x RETURN x; +UNWIND range(508, 12) AS x RETURN x; +UNWIND range(509, 374) AS x RETURN x; +UNWIND range(510, 385) AS x RETURN x; +UNWIND range(511, 161) AS x RETURN x; +UNWIND range(512, 354) AS x RETURN x; +UNWIND range(513, 303) AS x RETURN x; +UNWIND range(514, 83) AS x RETURN x; +UNWIND range(515, 337) AS x RETURN x; +UNWIND range(516, 126) AS x RETURN x; +UNWIND range(517, 135) AS x RETURN x; +UNWIND range(518, 7) AS x RETURN x; +UNWIND range(519, 3) AS x RETURN x; +UNWIND range(520, 258) AS x RETURN x; +UNWIND range(521, 493) AS x RETURN x; +UNWIND range(522, 234) AS x RETURN x; +UNWIND range(523, 26) AS x RETURN x; +UNWIND range(524, 456) AS x RETURN x; +UNWIND range(525, 375) AS x RETURN x; +UNWIND range(526, 136) AS x RETURN x; +UNWIND range(527, 204) AS x RETURN x; +UNWIND range(528, 497) AS x RETURN x; +UNWIND range(529, 283) AS x RETURN x; +UNWIND range(530, 370) AS x RETURN x; +UNWIND range(531, 494) AS x RETURN x; +UNWIND range(532, 92) AS x RETURN x; +UNWIND range(533, 405) AS x RETURN x; +UNWIND range(534, 344) AS x RETURN x; +UNWIND range(535, 266) AS x RETURN x; +UNWIND range(536, 53) AS x RETURN x; +UNWIND range(537, 288) AS x RETURN x; +UNWIND range(538, 285) AS x RETURN x; +UNWIND range(539, 369) AS x RETURN x; +UNWIND range(540, 266) AS x RETURN x; +UNWIND range(541, 44) AS x RETURN x; +UNWIND range(542, 41) AS x RETURN x; +UNWIND range(543, 157) AS x RETURN x; +UNWIND range(544, 457) AS x RETURN x; +UNWIND range(545, 448) AS x RETURN x; +UNWIND range(546, 278) AS x RETURN x; +UNWIND range(547, 313) AS x RETURN x; +UNWIND range(548, 8) AS x RETURN x; +UNWIND range(549, 359) AS x RETURN x; +UNWIND range(550, 369) AS x RETURN x; +UNWIND range(551, 308) AS x RETURN x; +UNWIND range(552, 270) AS x RETURN x; +UNWIND range(553, 270) AS x RETURN x; +UNWIND range(554, 180) AS x RETURN x; +UNWIND range(555, 260) AS x RETURN x; +UNWIND range(556, 209) AS x RETURN x; +UNWIND range(557, 86) AS x RETURN x; +UNWIND range(558, 308) AS x RETURN x; +UNWIND range(559, 151) AS x RETURN x; +UNWIND range(560, 473) AS x RETURN x; +UNWIND range(561, 154) AS x RETURN x; +UNWIND range(562, 57) AS x RETURN x; +UNWIND range(563, 171) AS x RETURN x; +UNWIND range(564, 164) AS x RETURN x; +UNWIND range(565, 327) AS x RETURN x; +UNWIND range(566, 498) AS x RETURN x; +UNWIND range(567, 301) AS x RETURN x; +UNWIND range(568, 251) AS x RETURN x; +UNWIND range(569, 350) AS x RETURN x; +UNWIND range(570, 113) AS x RETURN x; +UNWIND range(571, 10) AS x RETURN x; +UNWIND range(572, 418) AS x RETURN x; +UNWIND range(573, 299) AS x RETURN x; +UNWIND range(574, 142) AS x RETURN x; +UNWIND range(575, 178) AS x RETURN x; +UNWIND range(576, 437) AS x RETURN x; +UNWIND range(577, 134) AS x RETURN x; +UNWIND range(578, 217) AS x RETURN x; +UNWIND range(579, 87) AS x RETURN x; +UNWIND range(580, 450) AS x RETURN x; +UNWIND range(581, 221) AS x RETURN x; +UNWIND range(582, 373) AS x RETURN x; +UNWIND range(583, 50) AS x RETURN x; +UNWIND range(584, 463) AS x RETURN x; +UNWIND range(585, 74) AS x RETURN x; +UNWIND range(586, 0) AS x RETURN x; +UNWIND range(587, 195) AS x RETURN x; +UNWIND range(588, 219) AS x RETURN x; +UNWIND range(589, 462) AS x RETURN x; +UNWIND range(590, 17) AS x RETURN x; +UNWIND range(591, 86) AS x RETURN x; +UNWIND range(592, 44) AS x RETURN x; +UNWIND range(593, 178) AS x RETURN x; +UNWIND range(594, 477) AS x RETURN x; +UNWIND range(595, 398) AS x RETURN x; +UNWIND range(596, 427) AS x RETURN x; +UNWIND range(597, 191) AS x RETURN x; +UNWIND range(598, 394) AS x RETURN x; +UNWIND range(599, 99) AS x RETURN x; +UNWIND range(600, 177) AS x RETURN x; +UNWIND range(601, 137) AS x RETURN x; +UNWIND range(602, 77) AS x RETURN x; +UNWIND range(603, 67) AS x RETURN x; +UNWIND range(604, 389) AS x RETURN x; +UNWIND range(605, 269) AS x RETURN x; +UNWIND range(606, 348) AS x RETURN x; +UNWIND range(607, 110) AS x RETURN x; +UNWIND range(608, 268) AS x RETURN x; +UNWIND range(609, 89) AS x RETURN x; +UNWIND range(610, 198) AS x RETURN x; +UNWIND range(611, 319) AS x RETURN x; +UNWIND range(612, 157) AS x RETURN x; +UNWIND range(613, 368) AS x RETURN x; +UNWIND range(614, 215) AS x RETURN x; +UNWIND range(615, 149) AS x RETURN x; +UNWIND range(616, 128) AS x RETURN x; +UNWIND range(617, 215) AS x RETURN x; +UNWIND range(618, 327) AS x RETURN x; +UNWIND range(619, 86) AS x RETURN x; +UNWIND range(620, 54) AS x RETURN x; +UNWIND range(621, 472) AS x RETURN x; +UNWIND range(622, 168) AS x RETURN x; +UNWIND range(623, 384) AS x RETURN x; +UNWIND range(624, 324) AS x RETURN x; +UNWIND range(625, 270) AS x RETURN x; +UNWIND range(626, 8) AS x RETURN x; +UNWIND range(627, 497) AS x RETURN x; +UNWIND range(628, 485) AS x RETURN x; +UNWIND range(629, 428) AS x RETURN x; +UNWIND range(630, 216) AS x RETURN x; +UNWIND range(631, 447) AS x RETURN x; +UNWIND range(632, 35) AS x RETURN x; +UNWIND range(633, 259) AS x RETURN x; +UNWIND range(634, 285) AS x RETURN x; +UNWIND range(635, 451) AS x RETURN x; +UNWIND range(636, 45) AS x RETURN x; +UNWIND range(637, 426) AS x RETURN x; +UNWIND range(638, 91) AS x RETURN x; +UNWIND range(639, 32) AS x RETURN x; +UNWIND range(640, 293) AS x RETURN x; +UNWIND range(641, 440) AS x RETURN x; +UNWIND range(642, 322) AS x RETURN x; +UNWIND range(643, 507) AS x RETURN x; +UNWIND range(644, 24) AS x RETURN x; +UNWIND range(645, 318) AS x RETURN x; +UNWIND range(646, 273) AS x RETURN x; +UNWIND range(647, 177) AS x RETURN x; +UNWIND range(648, 454) AS x RETURN x; +UNWIND range(649, 263) AS x RETURN x; +UNWIND range(650, 359) AS x RETURN x; +UNWIND range(651, 423) AS x RETURN x; +UNWIND range(652, 50) AS x RETURN x; +UNWIND range(653, 81) AS x RETURN x; +UNWIND range(654, 133) AS x RETURN x; +UNWIND range(655, 168) AS x RETURN x; +UNWIND range(656, 245) AS x RETURN x; +UNWIND range(657, 248) AS x RETURN x; +UNWIND range(658, 297) AS x RETURN x; +UNWIND range(659, 221) AS x RETURN x; +UNWIND range(660, 100) AS x RETURN x; +UNWIND range(661, 74) AS x RETURN x; +UNWIND range(662, 49) AS x RETURN x; +UNWIND range(663, 297) AS x RETURN x; +UNWIND range(664, 117) AS x RETURN x; +UNWIND range(665, 266) AS x RETURN x; +UNWIND range(666, 360) AS x RETURN x; +UNWIND range(667, 316) AS x RETURN x; +UNWIND range(668, 97) AS x RETURN x; +UNWIND range(669, 325) AS x RETURN x; +UNWIND range(670, 477) AS x RETURN x; +UNWIND range(671, 409) AS x RETURN x; +UNWIND range(672, 146) AS x RETURN x; +UNWIND range(673, 37) AS x RETURN x; +UNWIND range(674, 373) AS x RETURN x; +UNWIND range(675, 343) AS x RETURN x; +UNWIND range(676, 314) AS x RETURN x; +UNWIND range(677, 337) AS x RETURN x; +UNWIND range(678, 4) AS x RETURN x; +UNWIND range(679, 498) AS x RETURN x; +UNWIND range(680, 23) AS x RETURN x; +UNWIND range(681, 458) AS x RETURN x; +UNWIND range(682, 212) AS x RETURN x; +UNWIND range(683, 439) AS x RETURN x; +UNWIND range(684, 107) AS x RETURN x; +UNWIND range(685, 266) AS x RETURN x; +UNWIND range(686, 127) AS x RETURN x; +UNWIND range(687, 127) AS x RETURN x; +UNWIND range(688, 357) AS x RETURN x; +UNWIND range(689, 159) AS x RETURN x; +UNWIND range(690, 398) AS x RETURN x; +UNWIND range(691, 45) AS x RETURN x; +UNWIND range(692, 310) AS x RETURN x; +UNWIND range(693, 185) AS x RETURN x; +UNWIND range(694, 419) AS x RETURN x; +UNWIND range(695, 42) AS x RETURN x; +UNWIND range(696, 63) AS x RETURN x; +UNWIND range(697, 341) AS x RETURN x; +UNWIND range(698, 311) AS x RETURN x; +UNWIND range(699, 148) AS x RETURN x; +UNWIND range(700, 128) AS x RETURN x; +UNWIND range(701, 448) AS x RETURN x; +UNWIND range(702, 268) AS x RETURN x; +UNWIND range(703, 447) AS x RETURN x; +UNWIND range(704, 78) AS x RETURN x; +UNWIND range(705, 403) AS x RETURN x; +UNWIND range(706, 332) AS x RETURN x; +UNWIND range(707, 34) AS x RETURN x; +UNWIND range(708, 414) AS x RETURN x; +UNWIND range(709, 319) AS x RETURN x; +UNWIND range(710, 457) AS x RETURN x; +UNWIND range(711, 79) AS x RETURN x; +UNWIND range(712, 205) AS x RETURN x; +UNWIND range(713, 147) AS x RETURN x; +UNWIND range(714, 127) AS x RETURN x; +UNWIND range(715, 260) AS x RETURN x; +UNWIND range(716, 343) AS x RETURN x; +UNWIND range(717, 96) AS x RETURN x; +UNWIND range(718, 333) AS x RETURN x; +UNWIND range(719, 51) AS x RETURN x; +UNWIND range(720, 471) AS x RETURN x; +UNWIND range(721, 251) AS x RETURN x; +UNWIND range(722, 396) AS x RETURN x; +UNWIND range(723, 42) AS x RETURN x; +UNWIND range(724, 81) AS x RETURN x; +UNWIND range(725, 278) AS x RETURN x; +UNWIND range(726, 436) AS x RETURN x; +UNWIND range(727, 63) AS x RETURN x; +UNWIND range(728, 473) AS x RETURN x; +UNWIND range(729, 130) AS x RETURN x; +UNWIND range(730, 441) AS x RETURN x; +UNWIND range(731, 452) AS x RETURN x; +UNWIND range(732, 154) AS x RETURN x; +UNWIND range(733, 209) AS x RETURN x; +UNWIND range(734, 21) AS x RETURN x; +UNWIND range(735, 497) AS x RETURN x; +UNWIND range(736, 345) AS x RETURN x; +UNWIND range(737, 253) AS x RETURN x; +UNWIND range(738, 243) AS x RETURN x; +UNWIND range(739, 348) AS x RETURN x; +UNWIND range(740, 386) AS x RETURN x; +UNWIND range(741, 5) AS x RETURN x; +UNWIND range(742, 398) AS x RETURN x; +UNWIND range(743, 452) AS x RETURN x; +UNWIND range(744, 229) AS x RETURN x; +UNWIND range(745, 161) AS x RETURN x; +UNWIND range(746, 380) AS x RETURN x; +UNWIND range(747, 289) AS x RETURN x; +UNWIND range(748, 293) AS x RETURN x; +UNWIND range(749, 332) AS x RETURN x; +UNWIND range(750, 122) AS x RETURN x; +UNWIND range(751, 31) AS x RETURN x; +UNWIND range(752, 86) AS x RETURN x; +UNWIND range(753, 344) AS x RETURN x; +UNWIND range(754, 402) AS x RETURN x; +UNWIND range(755, 146) AS x RETURN x; +UNWIND range(756, 16) AS x RETURN x; +UNWIND range(757, 352) AS x RETURN x; +UNWIND range(758, 427) AS x RETURN x; +UNWIND range(-516, 938) AS y RETURN y, 1/y; +UNWIND range(760, 459) AS x RETURN x; +UNWIND range(761, 117) AS x RETURN x; +UNWIND range(762, 38) AS x RETURN x; +UNWIND range(763, 357) AS x RETURN x; +UNWIND range(764, 339) AS x RETURN x; +UNWIND range(765, 55) AS x RETURN x; +UNWIND range(766, 289) AS x RETURN x; +UNWIND range(767, 64) AS x RETURN x; +UNWIND range(768, 444) AS x RETURN x; +UNWIND range(769, 292) AS x RETURN x; +UNWIND range(770, 206) AS x RETURN x; +UNWIND range(771, 91) AS x RETURN x; +UNWIND range(772, 486) AS x RETURN x; +UNWIND range(773, 292) AS x RETURN x; +UNWIND range(774, 158) AS x RETURN x; +UNWIND range(775, 238) AS x RETURN x; +UNWIND range(776, 101) AS x RETURN x; +UNWIND range(777, 164) AS x RETURN x; +UNWIND range(778, 90) AS x RETURN x; +UNWIND range(779, 122) AS x RETURN x; +UNWIND range(780, 482) AS x RETURN x; +UNWIND range(781, 508) AS x RETURN x; +UNWIND range(782, 179) AS x RETURN x; +UNWIND range(783, 456) AS x RETURN x; +UNWIND range(784, 337) AS x RETURN x; +UNWIND range(785, 380) AS x RETURN x; +UNWIND range(786, 319) AS x RETURN x; +UNWIND range(787, 22) AS x RETURN x; +UNWIND range(788, 45) AS x RETURN x; +UNWIND range(789, 16) AS x RETURN x; +UNWIND range(790, 131) AS x RETURN x; +UNWIND range(791, 134) AS x RETURN x; +UNWIND range(792, 105) AS x RETURN x; +UNWIND range(793, 140) AS x RETURN x; +UNWIND range(794, 216) AS x RETURN x; +UNWIND range(795, 499) AS x RETURN x; +UNWIND range(796, 138) AS x RETURN x; +UNWIND range(797, 243) AS x RETURN x; +UNWIND range(798, 310) AS x RETURN x; +UNWIND range(799, 374) AS x RETURN x; +UNWIND range(800, 506) AS x RETURN x; +UNWIND range(801, 98) AS x RETURN x; +UNWIND range(802, 229) AS x RETURN x; +UNWIND range(803, 483) AS x RETURN x; +UNWIND range(804, 432) AS x RETURN x; +UNWIND range(805, 260) AS x RETURN x; +UNWIND range(806, 112) AS x RETURN x; +UNWIND range(807, 429) AS x RETURN x; +UNWIND range(808, 365) AS x RETURN x; +UNWIND range(809, 462) AS x RETURN x; +UNWIND range(810, 314) AS x RETURN x; +UNWIND range(811, 337) AS x RETURN x; +UNWIND range(812, 490) AS x RETURN x; +UNWIND range(813, 495) AS x RETURN x; +UNWIND range(814, 110) AS x RETURN x; +UNWIND range(815, 48) AS x RETURN x; +UNWIND range(816, 31) AS x RETURN x; +UNWIND range(817, 370) AS x RETURN x; +UNWIND range(818, 108) AS x RETURN x; +UNWIND range(819, 328) AS x RETURN x; +UNWIND range(820, 79) AS x RETURN x; +UNWIND range(821, 128) AS x RETURN x; +UNWIND range(822, 365) AS x RETURN x; +UNWIND range(823, 159) AS x RETURN x; +UNWIND range(824, 410) AS x RETURN x; +UNWIND range(825, 449) AS x RETURN x; +UNWIND range(826, 409) AS x RETURN x; +UNWIND range(827, 187) AS x RETURN x; +UNWIND range(828, 212) AS x RETURN x; +UNWIND range(829, 130) AS x RETURN x; +UNWIND range(830, 489) AS x RETURN x; +UNWIND range(831, 497) AS x RETURN x; +UNWIND range(832, 485) AS x RETURN x; +UNWIND range(833, 173) AS x RETURN x; +UNWIND range(834, 210) AS x RETURN x; +UNWIND range(835, 296) AS x RETURN x; +UNWIND range(836, 217) AS x RETURN x; +UNWIND range(837, 405) AS x RETURN x; +UNWIND range(838, 228) AS x RETURN x; +UNWIND range(839, 218) AS x RETURN x; +UNWIND range(840, 500) AS x RETURN x; +UNWIND range(841, 315) AS x RETURN x; +UNWIND range(842, 419) AS x RETURN x; +UNWIND range(843, 232) AS x RETURN x; +UNWIND range(844, 421) AS x RETURN x; +UNWIND range(845, 140) AS x RETURN x; +UNWIND range(846, 494) AS x RETURN x; +UNWIND range(847, 379) AS x RETURN x; +UNWIND range(848, 364) AS x RETURN x; +UNWIND range(849, 510) AS x RETURN x; +UNWIND range(850, 311) AS x RETURN x; +UNWIND range(851, 506) AS x RETURN x; +UNWIND range(852, 289) AS x RETURN x; +UNWIND range(853, 15) AS x RETURN x; +UNWIND range(854, 243) AS x RETURN x; +UNWIND range(855, 332) AS x RETURN x; +UNWIND range(856, 457) AS x RETURN x; +UNWIND range(857, 420) AS x RETURN x; +UNWIND range(858, 55) AS x RETURN x; +UNWIND range(859, 390) AS x RETURN x; +UNWIND range(860, 183) AS x RETURN x; +UNWIND range(861, 283) AS x RETURN x; +UNWIND range(862, 236) AS x RETURN x; +UNWIND range(863, 84) AS x RETURN x; +UNWIND range(864, 482) AS x RETURN x; +UNWIND range(865, 180) AS x RETURN x; +UNWIND range(866, 289) AS x RETURN x; +UNWIND range(867, 460) AS x RETURN x; +UNWIND range(868, 175) AS x RETURN x; +UNWIND range(869, 56) AS x RETURN x; +UNWIND range(870, 392) AS x RETURN x; +UNWIND range(871, 18) AS x RETURN x; +UNWIND range(872, 298) AS x RETURN x; +UNWIND range(873, 195) AS x RETURN x; +UNWIND range(874, 263) AS x RETURN x; +UNWIND range(875, 478) AS x RETURN x; +UNWIND range(876, 391) AS x RETURN x; +UNWIND range(877, 322) AS x RETURN x; +UNWIND range(878, 412) AS x RETURN x; +UNWIND range(879, 226) AS x RETURN x; +UNWIND range(880, 142) AS x RETURN x; +UNWIND range(881, 163) AS x RETURN x; +UNWIND range(882, 511) AS x RETURN x; +UNWIND range(883, 19) AS x RETURN x; +UNWIND range(884, 235) AS x RETURN x; +UNWIND range(885, 258) AS x RETURN x; +UNWIND range(886, 432) AS x RETURN x; +UNWIND range(887, 3) AS x RETURN x; +UNWIND range(888, 252) AS x RETURN x; +UNWIND range(889, 317) AS x RETURN x; +UNWIND range(890, 72) AS x RETURN x; +UNWIND range(891, 492) AS x RETURN x; +UNWIND range(892, 180) AS x RETURN x; +UNWIND range(893, 490) AS x RETURN x; +UNWIND range(894, 120) AS x RETURN x; +UNWIND range(895, 255) AS x RETURN x; +UNWIND range(896, 408) AS x RETURN x; +UNWIND range(897, 283) AS x RETURN x; +UNWIND range(898, 304) AS x RETURN x; +UNWIND range(899, 456) AS x RETURN x; +UNWIND range(900, 15) AS x RETURN x; +UNWIND range(901, 481) AS x RETURN x; +UNWIND range(902, 261) AS x RETURN x; +UNWIND range(903, 147) AS x RETURN x; +UNWIND range(904, 393) AS x RETURN x; +UNWIND range(905, 42) AS x RETURN x; +UNWIND range(906, 267) AS x RETURN x; +UNWIND range(907, 193) AS x RETURN x; +UNWIND range(908, 353) AS x RETURN x; +UNWIND range(909, 42) AS x RETURN x; +UNWIND range(910, 444) AS x RETURN x; +UNWIND range(911, 510) AS x RETURN x; +UNWIND range(912, 204) AS x RETURN x; +UNWIND range(913, 95) AS x RETURN x; +UNWIND range(914, 97) AS x RETURN x; +UNWIND range(915, 210) AS x RETURN x; +UNWIND range(916, 195) AS x RETURN x; +UNWIND range(917, 50) AS x RETURN x; +UNWIND range(918, 421) AS x RETURN x; +UNWIND range(919, 319) AS x RETURN x; +UNWIND range(920, 283) AS x RETURN x; +UNWIND range(921, 204) AS x RETURN x; +UNWIND range(922, 301) AS x RETURN x; +UNWIND range(923, 349) AS x RETURN x; +UNWIND range(924, 287) AS x RETURN x; +UNWIND range(925, 84) AS x RETURN x; +UNWIND range(926, 398) AS x RETURN x; +UNWIND range(927, 359) AS x RETURN x; +UNWIND range(928, 261) AS x RETURN x; +UNWIND range(929, 229) AS x RETURN x; +UNWIND range(930, 133) AS x RETURN x; +UNWIND range(931, 72) AS x RETURN x; +UNWIND range(932, 189) AS x RETURN x; +UNWIND range(933, 129) AS x RETURN x; +UNWIND range(934, 412) AS x RETURN x; +UNWIND range(935, 37) AS x RETURN x; +UNWIND range(936, 143) AS x RETURN x; +UNWIND range(937, 436) AS x RETURN x; +UNWIND range(938, 133) AS x RETURN x; +UNWIND range(939, 464) AS x RETURN x; +UNWIND range(940, 505) AS x RETURN x; +UNWIND range(941, 34) AS x RETURN x; +UNWIND range(942, 128) AS x RETURN x; +UNWIND range(943, 100) AS x RETURN x; +UNWIND range(944, 391) AS x RETURN x; +UNWIND range(945, 503) AS x RETURN x; +UNWIND range(946, 48) AS x RETURN x; +UNWIND range(947, 385) AS x RETURN x; +UNWIND range(948, 314) AS x RETURN x; +UNWIND range(949, 115) AS x RETURN x; +UNWIND range(950, 295) AS x RETURN x; +UNWIND range(951, 470) AS x RETURN x; +UNWIND range(952, 95) AS x RETURN x; +UNWIND range(953, 368) AS x RETURN x; +UNWIND range(954, 329) AS x RETURN x; +UNWIND range(955, 221) AS x RETURN x; +UNWIND range(956, 182) AS x RETURN x; +UNWIND range(957, 312) AS x RETURN x; +UNWIND range(958, 276) AS x RETURN x; +UNWIND range(959, 52) AS x RETURN x; +UNWIND range(960, 253) AS x RETURN x; +UNWIND range(961, 501) AS x RETURN x; +UNWIND range(962, 164) AS x RETURN x; +UNWIND range(963, 125) AS x RETURN x; +UNWIND range(964, 178) AS x RETURN x; +UNWIND range(965, 181) AS x RETURN x; +UNWIND range(966, 452) AS x RETURN x; +UNWIND range(967, 288) AS x RETURN x; +UNWIND range(968, 289) AS x RETURN x; +UNWIND range(969, 279) AS x RETURN x; +UNWIND range(970, 52) AS x RETURN x; +UNWIND range(971, 234) AS x RETURN x; +UNWIND range(972, 493) AS x RETURN x; +UNWIND range(973, 373) AS x RETURN x; +UNWIND range(974, 366) AS x RETURN x; +UNWIND range(975, 138) AS x RETURN x; +UNWIND range(976, 79) AS x RETURN x; +UNWIND range(977, 238) AS x RETURN x; +UNWIND range(978, 349) AS x RETURN x; +UNWIND range(979, 164) AS x RETURN x; +UNWIND range(980, 409) AS x RETURN x; +UNWIND range(981, 190) AS x RETURN x; +UNWIND range(982, 104) AS x RETURN x; +UNWIND range(983, 478) AS x RETURN x; +UNWIND range(984, 232) AS x RETURN x; +UNWIND range(985, 430) AS x RETURN x; +UNWIND range(986, 381) AS x RETURN x; +UNWIND range(987, 367) AS x RETURN x; +UNWIND range(988, 268) AS x RETURN x; +UNWIND range(989, 307) AS x RETURN x; +UNWIND range(990, 207) AS x RETURN x; +UNWIND range(991, 313) AS x RETURN x; +UNWIND range(992, 23) AS x RETURN x; +UNWIND range(993, 178) AS x RETURN x; +UNWIND range(994, 86) AS x RETURN x; +UNWIND range(995, 350) AS x RETURN x; +UNWIND range(996, 135) AS x RETURN x; +UNWIND range(997, 173) AS x RETURN x; +UNWIND range(998, 475) AS x RETURN x; +UNWIND range(999, 119) AS x RETURN x; +UNWIND range(1000, 406) AS x RETURN x; +UNWIND range(1001, 473) AS x RETURN x; +UNWIND range(1002, 47) AS x RETURN x; +UNWIND range(1003, 186) AS x RETURN x; +UNWIND range(1004, 222) AS x RETURN x; +UNWIND range(1005, 0) AS x RETURN x; +UNWIND range(1006, 293) AS x RETURN x; +UNWIND range(1007, 268) AS x RETURN x; +UNWIND range(1008, 482) AS x RETURN x; +UNWIND range(1009, 32) AS x RETURN x; +UNWIND range(1010, 486) AS x RETURN x; +UNWIND range(1011, 140) AS x RETURN x; +UNWIND range(1012, 172) AS x RETURN x; +UNWIND range(1013, 34) AS x RETURN x; +UNWIND range(1014, 148) AS x RETURN x; +UNWIND range(1015, 45) AS x RETURN x; +UNWIND range(1016, 127) AS x RETURN x; +UNWIND range(1017, 467) AS x RETURN x; +UNWIND range(1018, 467) AS x RETURN x; +UNWIND range(1019, 54) AS x RETURN x; +UNWIND range(1020, 443) AS x RETURN x; +UNWIND range(1021, 231) AS x RETURN x; +UNWIND range(1022, 302) AS x RETURN x; +UNWIND range(1023, 56) AS x RETURN x; \ No newline at end of file