/*
 * Copyright 2015 Higher Frequency Trading http://www.higherfrequencytrading.com
 *
 * 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 org.jetbrains.intellij.build.io;

import com.dynatrace.hash4j.hashing.Hashing;
import com.intellij.util.lang.CharSequenceAccess;
import com.intellij.util.lang.Xxh3;
import com.intellij.util.lang.Xxh3Impl;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;

import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;

public class XxHash3Test {
  @Test
  public void xxh3WithoutSeeds() {
    int maxLen = XXH3Test_HASHES.HASHES_OF_LOOPING_BYTES_WITHOUT_SEED.length;
    for (int len = 0; len < maxLen; len++) {
      System.out.println("Testing: len=" + len);
      test(XXH3Test_HASHES.HASHES_OF_LOOPING_BYTES_WITHOUT_SEED, len);
    }
  }

  @Test
  public void string() {
    testString("com/intellij/profiler/async/windows/WinAsyncProfilerLocator", 2833214887294487028L);
    testString("test", -7004795540881933248L);
    testString("тест буковок", -2011715203481716521L);
  }

  private static void testString(String s, long expected) {
    assertThat(Xxh3.hash(s.getBytes(StandardCharsets.UTF_8))).describedAs("Hash as bytes of: " + s).isEqualTo(expected);
  }

  @Test
  public void unencodedString() {
    testUnencodedString("com/intellij/profiler/async/windows/WinAsyncProfilerLocator", -7916769887311287428L);
    testUnencodedString("test", -1876252253805819900L);
    testUnencodedString("тест буковок", -3590458601327935281L);
  }

  @Test
  public void packages() {
    checkPackage("com.intellij.util.lang", -9217824570049207139L);
    checkPackage("com.intellij.idea", -635775336887217634L);
    checkPackage("kotlin.coroutines.jvm.internal", -3930079881136890558L);
  }

  @Test
  public void checkInputStreamAccessor() throws IOException {
    var dummyText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque rutrum lacinia nibh, ac ornare dolor bibendum at. " +
    "Nam imperdiet quam at elit bibendum, in imperdiet nisi semper. Phasellus volutpat, libero sit amet dictum molestie, " +
    "ligula nisi efficitur leo, ac vulputate leo ex vel turpis. Nulla facilisi. Curabitur in ligula ut ligula vehicula dapibus " +
    "nec at mi. Proin vehicula egestas nulla, nec fermentum lacus aliquet nec. Sed fermentum turpis enim, eget cursus augue varius quis. " +
    "Quisque fermentum nec felis at bibendum. Duis quis felis eu ante facilisis accumsan vitae eget ex. Suspendisse rhoncus leo a auctor " +
    "interdum. Proin et sagittis est. Curabitur placerat ex vel velit egestas, a convallis purus bibendum. Integer pellentesque commodo nulla, " +
    "a dapibus dolor semper ac. Praesent elementum tortor velit, ac mollis dui molestie nec. Sed tincidunt, arcu ac condimentum ullamcorper, " +
    "arcu lectus bibendum nulla, volutpat rutrum odio nulla id leo. In dignissim sapien orci, in consectetur risus venenatis a. Aenean congue dui nec.";
    checkHashing("com/intellij/profiler/async/windows/WinAsyncProfilerLocator".getBytes(StandardCharsets.UTF_8));
    checkHashing(dummyText.getBytes(StandardCharsets.UTF_8));
    checkHashing("test".getBytes(StandardCharsets.UTF_8));
    checkHashing("".getBytes(StandardCharsets.UTF_8));
  }

  @ParameterizedTest
  @MethodSource("byteArraySizeRangeProvider")
  public void checkInputStreamAccessorOnDifferentSizes(int byteArraySize) throws IOException {
    // We need to check the corner cases when we're getting data from both buffers
      byte[] byteArray = new byte[byteArraySize];
      Random random = new Random();
      random.nextBytes(byteArray);
      checkHashing(byteArray);
  }

  private static Stream<Integer> byteArraySizeRangeProvider() {
    return IntStream.rangeClosed(0, 10_000).boxed();
  }

  private static void checkPackage(String s, long expected) {
    String input = s.replace('.', '/');
    assertThat(Xxh3Impl.hash(input, CharSequenceAccess.INSTANCE, 0, input.length() * 2, 0)).describedAs("Hash as string of: " + s).isEqualTo(expected);
  }

  private static void testUnencodedString(String s, long expected) {
    assertThat(Xxh3Impl.hash(s, CharSequenceAccess.INSTANCE, 0, s.length() * 2, 0)).describedAs("Hash as string of: " + s).isEqualTo(expected);
    assertThat(Hashing.xxh3_64().hashCharsToLong(s)).describedAs("Hash as string of: " + s).isEqualTo(expected);
  }

  private static void checkHashing(byte[] bytes) throws IOException {
    assertThat(Xxh3.hash(bytes)).isEqualTo(Hashing.xxh3_64().hashBytesToLong(bytes));
  }

  @SuppressWarnings("SameParameterValue")
  private static void test(long[] hashesOfLoopingBytes, int len) {
    byte[] data = new byte[len];
    for (int j = 0; j < data.length; j++) {
      data[j] = (byte)j;
    }
    HashFunctionTest.test(data, hashesOfLoopingBytes[len]);
  }
}

/**
 * Test data is output of the following program with xxh3 implementation
 * from https://github.com/Cyan4973/xxHash
 * <p>
 * #include "xxhash.c"
 * #include <stdlib.h>
 * #include <stdio.h>
 * int main()
 * {
 * const int N = 2048 + 1; // 2 full blocks
 * char* src = (char*) malloc(N);
 * for (int i = 0; i < N; i++) {
 * src[i] = (char) i;
 * }
 * <p>
 * printf("class XXH3Test_HASHES {\n");
 * printf("    public static final long[] HASHES_OF_LOOPING_BYTES_WITHOUT_SEED = {\n");
 * for (int i = 0; i <= N; i++) {
 * printf("        %lldL,\n", (long long) XXH3_64bits(src, i));
 * }
 * printf("    };\n");
 * <p>
 * printf("    public static final long[] HASHES_OF_LOOPING_BYTES_WITH_SEED_42 = {\n");
 * for (int i = 0; i <= N; i++) {
 * printf("        %lldL,\n", (long long) XXH3_64bits_withSeed(src, i, 42));
 * }
 * printf("    };\n");
 * printf("}\n");
 * }
 */

final class XXH3Test_HASHES {
  public static final long[] HASHES_OF_LOOPING_BYTES_WITHOUT_SEED = {
    3244421341483603138L,
    -4302098779834749733L,
    -2998166160713018281L,
    6864218090047839419L,
    6979084321315492338L,
    -5731546056562700354L,
    -6460328875922888956L,
    923809989133364073L,
    4187271766389786872L,
    -1629980255024596516L,
    -6095164084758671497L,
    2086176710598203789L,
    6543284205211650379L,
    -5213522776729965383L,
    5545158833176453687L,
    6191585008302141506L,
    -8983023575487778597L,
    -6993173599622040792L,
    -679721864292929835L,
    6982591615625134866L,
    2917394212576059053L,
    -6639923505334063205L,
    -2362153139612899683L,
    4776590923197089330L,
    -1506670496010913414L,
    -2647877581130602390L,
    -3024194937172852654L,
    -6786232254807398843L,
    29867523197922776L,
    -4755612273762186448L,
    7027486771791057426L,
    5707990981978323197L,
    3829001002278603781L,
    -1833995589090992552L,
    -2859822223207566521L,
    -822061951152501107L,
    6172313773566651166L,
    3002688263104272481L,
    2442729726468942826L,
    838920225343106725L,
    -3625228911788322244L,
    -3085758516746786139L,
    -8838726273629984649L,
    147628805604629229L,
    -8609901492927370359L,
    2523698187551014389L,
    6168573373090741088L,
    -1129058501854041166L,
    6287935907341083849L,
    7111303459234964792L,
    2178159668141251214L,
    3355500812482858732L,
    7998592630692471773L,
    -3657590562873574961L,
    -6707964006400412490L,
    5984672195388902266L,
    -4866191761727097338L,
    -3867761180105420740L,
    5010507633288345206L,
    -6360606695257557456L,
    891304432194930768L,
    891409307892263904L,
    -4666213895286452910L,
    -6150244752716240152L,
    7027844749552840021L,
    7577525643630617296L,
    -2909908046638187264L,
    1269898915928975170L,
    -1296685705337969741L,
    6880380907958913107L,
    -5157697080261523794L,
    -2384830554205610823L,
    7117698599495882683L,
    8436634904183317409L,
    -8685705461888375606L,
    -2099116977851507310L,
    7784639995868301609L,
    620173983152449558L,
    7875300522364621790L,
    -8571663595578279581L,
    -6074103631611676465L,
    4991809556790719000L,
    7182703058112323703L,
    6700847687881865453L,
    2471686449789799931L,
    5615843466129961201L,
    108638713672822205L,
    3583360813653880832L,
    4747956906537059928L,
    5998273219519720430L,
    -8227785307205256168L,
    -7813674951517583442L,
    -6588167816065898573L,
    -6862603585040654361L,
    5081695234398607736L,
    1329474798079286264L,
    2849157965221752315L,
    -1791866940674927372L,
    4332646258279960296L,
    4180229147886927001L,
    22042537110060316L,
    -2696513067094881964L,
    4479930798836342597L,
    7717940613376663979L,
    6494116526350833911L,
    -197304122858742249L,
    -4396092174831810083L,
    289832483284799872L,
    -1407793616753546142L,
    8107749310172792421L,
    -634728965402563086L,
    -5703942985817925313L,
    1530829577509875692L,
    725468970373613536L,
    -8861952843133984162L,
    2677458900969433422L,
    3204987178703259401L,
    -5308372023803773091L,
    -4001659458034098463L,
    -4307920379982142578L,
    -7679947731286800682L,
    893843933290517983L,
    4059405294108459720L,
    1831062127804751133L,
    -2762239301578822450L,
    6439416643289274311L,
    7794216615102176353L,
    1300299527667998511L,
    -8807326403944725397L,
    -1407864491810865574L,
    5562548832393267847L,
    -1909668463603883104L,
    -3001908439859224423L,
    -8229811775093055754L,
    -2185505997709248158L,
    8747474804119761845L,
    3375976894941005122L,
    -8687541524345519584L,
    7475418969225723061L,
    1090519453973870407L,
    -8039787237657230770L,
    1464043301476531850L,
    4392840094176543368L,
    -9069431037609626595L,
    184117852034042369L,
    3048613549567428513L,
    8360545369892314479L,
    4218067793502522363L,
    -1984361661054820977L,
    3359102789277797744L,
    7846237042486223698L,
    8441054814755521322L,
    -6067811722142115057L,
    -7157356563671886865L,
    -2021770978571166827L,
    2181025843643822270L,
    -544448869202488473L,
    7057264048203590026L,
    4363323697043225181L,
    288118730444504008L,
    6623265038156431800L,
    -1346676098681766085L,
    6693111459824679536L,
    -5826625922074103454L,
    -3486949479332473670L,
    -5491430220943863042L,
    -7571085429759204806L,
    -5040253774339356206L,
    3305212073815689334L,
    -4916812550925428252L,
    3791981966901325707L,
    -122684436810232675L,
    -4859495698099370447L,
    -7070496757192133073L,
    -868377069569577871L,
    8419145116270703784L,
    6800486273015600197L,
    4633342516797787668L,
    -1661577990952520136L,
    -334342790235531239L,
    -8872817819424402897L,
    -409486044664079154L,
    6190926389261136345L,
    -1300830024987992860L,
    -3395638269793024332L,
    -8493538135787539363L,
    -6621335634487712846L,
    1973828869629126484L,
    -8925429074145354136L,
    -2678123694384376779L,
    -4225602364907809934L,
    -7257068922279808299L,
    -7485343360991292969L,
    2406538583069093177L,
    926637182534700777L,
    4630670481086444853L,
    7851742083103622018L,
    -98392444236074312L,
    1142322156420818107L,
    7462750549553202851L,
    -852719212082297085L,
    1478659643974205762L,
    -6521398709638030532L,
    1345928530210989700L,
    -3363927467796334767L,
    -4501085897120438635L,
    -1855175868195079840L,
    -8957269249266743558L,
    -5499424421497234822L,
    6823468430111213664L,
    -8349332096263306503L,
    -796191064979922279L,
    3070550474559678794L,
    -7237539936935226606L,
    -1467576285689886091L,
    8020665312084081577L,
    6549665319606165521L,
    8265205303228562057L,
    2959656348340404166L,
    3479620626361283295L,
    -1809040706699436602L,
    -6118995013506825485L,
    -3703429629123416796L,
    5314878427138221245L,
    -3374786619071663812L,
    -6020893708387338112L,
    -2099692294850961452L,
    5628155794800251850L,
    -4036147416511180551L,
    -7941600054572002747L,
    -7483400491927447614L,
    -720567278261368781L,
    3314031855271606298L,
    -5471631794645557473L,
    8887891228392664673L,
    -7960828123610685614L,
    -766265380117391950L,
    -4017904512890559451L,
    3478074185490226921L,
    -7553920981498126005L,
    3988562325861820517L,
    209643423615708418L,
    -2464819451665246158L,
    -8631718977760664612L,
    -4893221336143393409L,
    2390264798730683615L,
    -8300749389255144164L,
    -3549775289570958064L,
    6514441262456966668L,
    -7301663820335638615L,
    4181559756778549411L,
    6215253578855337690L,
    -7323335092456459405L,
    -1860577032441476467L,
    3644299936077808538L,
    -5161174126835724701L,
    -7779787747613135503L,
    -3446338450597548406L,
    -2662609220502962318L,
    208946340318274486L,
    922869894074454969L,
    -8428909140908329623L,
    -6875524699939418906L,
    5154230294972327697L,
    -5868880138852165350L,
    -2697155020815738737L,
    6278899766774254324L,
    -6124877505863871039L,
    6113186870348198684L,
    1328797232741421065L,
    8936960355443139766L,
    9069883653377839816L,
    -6698244186639407697L,
    6633988379507542818L,
    4243888593320380368L,
    1299920470993756698L,
    2315187937474071861L,
    806120923801759332L,
    -8537792935927015380L,
    -751623313460664870L,
    2455098182130434513L,
    -3041072155357054618L,
    -5209258140949481980L,
    -7784651030341623624L,
    -8624281235662545565L,
    -5185374153462168974L,
    -8728622305551122108L,
    3633316488676598179L,
    2341850275669250720L,
    8998800880957295269L,
    -2791108801739767859L,
    4207716787796156879L,
    -4083554261407892809L,
    2977762250156739855L,
    -6066243213313847782L,
    -3134677742513834402L,
    -5231660756514911289L,
    -7916346081138370244L,
    9105509708951212631L,
    -3071680532260795719L,
    -3152428524199455707L,
    -5276930195233923125L,
    1981446637702558747L,
    -8822786060285469479L,
    -3086453182842996354L,
    -7521798164704108718L,
    -7460429880600038351L,
    -5031515429775225415L,
    5662627828449328757L,
    2804157867790593789L,
    -6183934836359652529L,
    2425310972806241292L,
    -7877162957672040682L,
    -4575453773921540745L,
    -6152892230011262930L,
    -1554429781063399588L,
    6395550633581619922L,
    948199150697514149L,
    4123518706442132507L,
    -8620024481834864148L,
    -4627311960537433998L,
    -1517263476517287336L,
    3087156144310177979L,
    802387854806242344L,
    -8223164854162179626L,
    -8876883825341271093L,
    6189924694943538938L,
    -558048344469199000L,
    -6388815497071843014L,
    7970082794223216108L,
    8943146030443257086L,
    1919558538884824162L,
    -5413821296846136841L,
    8482255996292420949L,
    -2059351044571046226L,
    8122315934009425936L,
    -6002133579485340781L,
    6439465961707132723L,
    2763117897158909339L,
    4241846593057682886L,
    -3156374353704014890L,
    3611310604513156987L,
    2539868227324188707L,
    -3160603853021599046L,
    -6694565052629228305L,
    -2829087677596299075L,
    -3855421753196086451L,
    8353874633819013271L,
    -2485914493713180581L,
    2924901647540244351L,
    140830235769158231L,
    8924525771772034372L,
    1991645829771754924L,
    -6409133430531739321L,
    -2477349252564343349L,
    7592298137540200578L,
    -8706120837264950112L,
    2330049856518978017L,
    -1333715564956417750L,
    5321303278236129003L,
    1316603583801631000L,
    -2052093890021786856L,
    -2212919092132307727L,
    -1138248150179747101L,
    -7297574785915472699L,
    3159392081609537393L,
    5438969032594710113L,
    -1117946266762888661L,
    -3513962250060316650L,
    -95470470775096400L,
    -928547845419412355L,
    3064209748165139149L,
    5570740544374382296L,
    -4848606292970499536L,
    1249733847255258336L,
    -9081876379081045111L,
    -3178350430540128617L,
    4580722282117591455L,
    4910338723691444614L,
    -3861107435455294057L,
    2455351552393139588L,
    -3098045343671378301L,
    1276702104227748441L,
    -8725606894849543465L,
    -7043526197674754455L,
    2543751490914779898L,
    1111188191726666289L,
    3299681536744686092L,
    -4968407975804173061L,
    -8443232222924958642L,
    2692856020311995538L,
    -7295992543900831720L,
    -835426980056055153L,
    -7189216512060259212L,
    1546667140862204220L,
    -5157738526808785307L,
    -8400112152363165211L,
    -2562446629278342489L,
    -3984312152746163924L,
    263973571859894620L,
    5863738959863392730L,
    -3750469576779228200L,
    2859093520615066384L,
    239574671716835044L,
    1758244848125395099L,
    4692926060224877180L,
    2328985435627410056L,
    -712944964417726519L,
    7575628018175957835L,
    -6461647485226712981L,
    -9175844658802936237L,
    -1791894645853433273L,
    -3209291319104719345L,
    8435774909159574457L,
    3068904622159492539L,
    6405574310234631665L,
    -7236310029621050895L,
    1939741827857698370L,
    -2711876483320863546L,
    -5191337944005182792L,
    851301927202074099L,
    7817558216393575797L,
    -924173671401578135L,
    -8870424728276452684L,
    -5612135981154918473L,
    5352840780989627332L,
    3115501649750915797L,
    -7282764488136203731L,
    -4410122159075968274L,
    -5112841868993719465L,
    1606611627835962209L,
    -2564625118517656156L,
    -7347999176364584697L,
    -7520586016175454443L,
    -3582872246453049220L,
    -7208670274224679141L,
    1407185043226639926L,
    5548472899324259498L,
    -3424704481698318306L,
    -8898045228081312865L,
    -5032961205984329240L,
    2319704565344125424L,
    -1858090959206557106L,
    -1847512527385111193L,
    -218817722784924760L,
    -4644538017574761086L,
    527762499588866419L,
    7682925460546142196L,
    2618673582975102782L,
    -8339358073633623035L,
    4632344075623474881L,
    -2634725682046056737L,
    3264353773883015103L,
    3450256920483368564L,
    -8453373497678191816L,
    4324811352547234228L,
    5231611966727557421L,
    3935063678731059941L,
    6338309551930394802L,
    6622686033142507173L,
    -5278373537512798709L,
    -9063940204441257539L,
    -6333833756325058415L,
    3799491381076234981L,
    5050905817684546674L,
    -796624655126841621L,
    8334872366472578300L,
    -5288752267258476166L,
    4335956913966038392L,
    -2247074774901543705L,
    8474035569080943503L,
    -3170167932314701995L,
    6999756768956410897L,
    -4451078577344071588L,
    -8433054951584831409L,
    -2640652121643463448L,
    -7045594934288710931L,
    -4036935141669708886L,
    -7734407512972194081L,
    2053541054148333962L,
    -566653752431971002L,
    1898804146829115409L,
    8507984725723339263L,
    -3742788731083462619L,
    -614166854038590657L,
    8147682807535759575L,
    2813322236228401990L,
    -7697111451322995338L,
    8023578719528819358L,
    -1666048881205334172L,
    2861705383918865808L,
    -2067264870309406817L,
    1544932780962992751L,
    5752963315823730718L,
    5563418456763501584L,
    -956763705026909993L,
    -6723021793890249884L,
    8199491799885937348L,
    8254326245904567972L,
    696534455436688862L,
    -4526166123204455007L,
    -1244479971115743946L,
    -4712028527008594695L,
    3845317619056596538L,
    1397508695414938292L,
    5199778266100306999L,
    7649610185133409821L,
    -7736979936936405855L,
    -1871499676764587199L,
    4089210433244498057L,
    -5319342193649020117L,
    6510328602034064204L,
    1177990759783856649L,
    -6211536889696831922L,
    -2806444732697667079L,
    -5534324430749159010L,
    -6189402282341917673L,
    6327177260956086170L,
    -8199327532062722025L,
    1757637089703623521L,
    -1083020196125888231L,
    -4027554827881183115L,
    2536452110533397141L,
    -5283309880767903892L,
    -8726185014741079280L,
    5870565960746070417L,
    -5981985584772708231L,
    -1932877698882443840L,
    -1002343255004640521L,
    4369245457815499473L,
    574307157338267836L,
    -9022123090729501652L,
    289683520338718123L,
    -5791631171477648402L,
    -7088072188409060385L,
    -4659987534525277948L,
    -6573587402478059370L,
    -9147189283662432041L,
    -4621406226758810332L,
    3827992897413425855L,
    8237187128340177815L,
    -2575127860924571660L,
    -5807831166865245102L,
    -5362714198312494492L,
    4800564949032048849L,
    6232971559544384156L,
    5346264270546834545L,
    4418021854956695145L,
    -2503709442294180811L,
    -6705525727229877941L,
    2807916716409994404L,
    -140901784876025870L,
    8341454749980902529L,
    -1877846120130857988L,
    -5151008775080326365L,
    4141948371168606708L,
    -2991396496641036974L,
    -8231846204849830109L,
    8817247101288954387L,
    8987037987198023072L,
    -3653961272252403667L,
    -5540876112254432380L,
    6630760576601451124L,
    3952853764187760519L,
    -2752207231177565438L,
    -8990910782429153994L,
    275029084438740989L,
    4377008995333363792L,
    7821963094129670639L,
    5910345261804604591L,
    -4676534586425310858L,
    -893427896035022872L,
    -5107326322974521170L,
    5928147272454832468L,
    -6838714257802993131L,
    3828181535474040080L,
    108432455104664877L,
    6134860905554719891L,
    -9006906057728028416L,
    -8785087250130628623L,
    5107258923997586783L,
    -4184502077870950738L,
    -4196994343382319067L,
    -3602525630290645804L,
    -721602986806918388L,
    -685749048932716724L,
    -2226124441764103982L,
    -8444470437189672337L,
    5967905323104782609L,
    -774529365691330376L,
    5317411683068394421L,
    8753729036148149823L,
    -2600284926580864832L,
    1501264369203023713L,
    -5589106565383836539L,
    2671769607792597675L,
    -571916257780128106L,
    -466398102722097434L,
    -8668321984643614166L,
    7631202114905008803L,
    -8647922451448787023L,
    8025381490498356948L,
    6049280950696679244L,
    -7696482417187458362L,
    7140438358861456746L,
    -4921885565559803566L,
    -7027307783313071980L,
    4879598629629415952L,
    -7342155744245645378L,
    -2263378697656156016L,
    3707257119850556629L,
    2267112971575522392L,
    4213162373130191016L,
    8934898250536865564L,
    -2149765792894599153L,
    -5375160376931751557L,
    2196544121130659101L,
    1698916734136113996L,
    3433172695894846834L,
    -2849259564218003615L,
    3254138956861413927L,
    1285929622626453198L,
    -2349127797610817522L,
    -1191286947825336074L,
    -9055971338481310193L,
    -3525928115330914396L,
    -3227633136719463166L,
    -133501853014392460L,
    1099153576792978915L,
    -648473507797745243L,
    -8947946509829984393L,
    -183277647411867477L,
    -8972836557830117056L,
    7599024178448012477L,
    -4558685557381095142L,
    4767843848744584145L,
    -1522308275842184404L,
    -8584574042672861403L,
    -1734332735592240813L,
    -5832090116698921823L,
    -8717779938268738600L,
    -1881355893097809021L,
    7715529933819950784L,
    -2289162375063823266L,
    5628801095532857454L,
    4961594313236250573L,
    4618832900030681591L,
    -2860026598356511432L,
    1961029532371905567L,
    -7427116119564073711L,
    -7663272674507523073L,
    -1432342159197328837L,
    -6656742466964663442L,
    1884610673731472834L,
    -3810094228658892044L,
    -6616291605664442115L,
    -6089433736056798518L,
    -7473225570871869756L,
    -2962461410122376636L,
    -7732736326487208707L,
    -4443012182604465346L,
    -6157220788020380465L,
    4600227015044805999L,
    4469639125734518912L,
    -7792518910888390519L,
    1994555386333163764L,
    4369373061497876631L,
    -4738249058452865067L,
    -5995135073617675417L,
    8575145712582277328L,
    -3326852669647946366L,
    -2007891227481667403L,
    7761466597038557448L,
    -7224144129768088459L,
    -6066361559768252258L,
    -4068105427650671702L,
    -5560889521429203904L,
    -4762527649365520713L,
    2694767757294725688L,
    -98412761475871782L,
    -1686751510820366009L,
    -8638747288926132295L,
    -3606421426295459375L,
    703911580424568845L,
    3806874684410471199L,
    -5118211203482914183L,
    3783835693585708905L,
    -4147496567901501893L,
    4328139758484363106L,
    3028068134370267202L,
    -5966389813687232408L,
    2195469898148267913L,
    -3080166474377317430L,
    6412533502918649688L,
    -4801061500654703956L,
    -554194900129906123L,
    1486000469436139740L,
    -6971589411333019409L,
    2647463349908157318L,
    -6754094203714628854L,
    2314399046579224435L,
    -6177383374280917075L,
    -5619632493646738964L,
    -7301831206207675015L,
    -5527516975398904813L,
    -7206298956882517419L,
    -1535337994919517848L,
    725107219148423471L,
    1938195538047669437L,
    1028829726878266547L,
    3981352596771855719L,
    4637441575637536278L,
    -567364300216533096L,
    4215820779392244698L,
    5791138156269639416L,
    527001488112788484L,
    -4390338125863921979L,
    5557055272452535368L,
    -205316410586789577L,
    6952133288635206796L,
    -7457518070084443694L,
    2002018537802900078L,
    1561023860546606398L,
    3006183850758749007L,
    -1361037422909233361L,
    -4203933835330884180L,
    7500988945823273736L,
    -3010872765453549672L,
    -3781827987408697259L,
    7460277383018710734L,
    5250710645655626569L,
    1109553850343924028L,
    -6498085059809326090L,
    -5879222670885240061L,
    6210613100795379620L,
    -5759675374559290972L,
    2824738880545011656L,
    3213468672819532759L,
    514328750496380347L,
    4470285007717204101L,
    2269240343629252129L,
    8714859525098129755L,
    -6932578361476642118L,
    3219949239213817308L,
    -974585298959970878L,
    6482527911604968876L,
    889153561428168470L,
    -8207616222981108363L,
    2386860797138412452L,
    -6749686321997906685L,
    -1105424552884318985L,
    -3137963539903752699L,
    -5296550634024189868L,
    2919221292190747486L,
    -3991521756182858814L,
    3802413126716557908L,
    4556158013211621930L,
    -1956520472596138305L,
    -1667618395239727751L,
    -4948155010712448139L,
    -2667546434479018044L,
    -5192951416537530780L,
    4474564860866849514L,
    6795504197096101870L,
    348555520492747776L,
    -9152654684800879935L,
    -139520144005307559L,
    8655115078308054377L,
    4640578432082008138L,
    8526214307008571064L,
    -7079091919397494753L,
    -4852301075482608956L,
    -6726381834527599283L,
    -467175742480032731L,
    5092513639393893997L,
    -916781769295487406L,
    -3306005301217276910L,
    5711239369216246603L,
    7411369067342514714L,
    -137089609471843551L,
    2197853544547148264L,
    6994895994975015585L,
    -3993584670641567357L,
    7324113989979846776L,
    4848201612974985071L,
    -2319141888027790806L,
    -7727572350242351429L,
    3611228677421118756L,
    3254031939911056022L,
    1315862663037871882L,
    2762719496333050774L,
    2441476684596910583L,
    -1751985778109806355L,
    3156518557955714028L,
    -7474525109128332157L,
    -402634945481420093L,
    3711042493776857096L,
    -526618219268616930L,
    -8956423818433397438L,
    3318951429850234648L,
    -4065748355754556535L,
    -2974465318794034149L,
    9156201933336414671L,
    -1224004278953882958L,
    -5567810197150710613L,
    7645667176564158039L,
    7437954892140634061L,
    8595047667824297631L,
    -4227841629446459104L,
    -4073313779073810355L,
    764623093768368301L,
    4502563456929761688L,
    1027370723462817766L,
    7668869338814612684L,
    -4780350365503382825L,
    -6389061999435806787L,
    -2133237830821026919L,
    -618977682776693149L,
    467656057704319257L,
    -6754479852919060751L,
    -121796624546305099L,
    -6164861615484187016L,
    -8568598162483564153L,
    -8182644091745100549L,
    -3989631051916738549L,
    -3812515520109109155L,
    5458479505950940580L,
    -4068063356781230185L,
    -2830766632873229698L,
    -7592354330098913572L,
    5323147076973602219L,
    462800867816435413L,
    4002154584204048905L,
    -803837213195276249L,
    270846859760410932L,
    339186719055655409L,
    -1681073433226249949L,
    -3172364168133842187L,
    4471576722877991666L,
    5796602822306813285L,
    -7918394505018135767L,
    -8099706435104488972L,
    3225305587851029418L,
    -4366886220054887809L,
    7732358946751522729L,
    -228816160482375387L,
    -6429545033940023762L,
    -4874531170284168803L,
    -7919754354938613725L,
    4818550076091948962L,
    3907701057522316102L,
    -2162109673539899314L,
    -6296577330837677905L,
    -5038523314786213767L,
    -4182256071671167089L,
    2347804671767305901L,
    8781747195783722684L,
    5464112250608435856L,
    270499223000052613L,
    5387476652934255975L,
    -2665753069813354951L,
    -6640316903187366435L,
    5182130073111288069L,
    3324630100168604545L,
    6092224834024861844L,
    -7314979478990434840L,
    2475323565628074124L,
    3744881942029260381L,
    -4468245448047387416L,
    -2514532843437356755L,
    -8460931029051770120L,
    6058982121000846509L,
    -5771467892492359246L,
    4284427580292476574L,
    -4502826197302040607L,
    -8909965133023702444L,
    -5152825667036557377L,
    -9001319942906464381L,
    8783326653870239059L,
    7169538748654303504L,
    -7206711339673245443L,
    -959892259265562431L,
    -1673323329893911437L,
    -5827914418805049723L,
    -820830695253715046L,
    -5782181341435499931L,
    2663734005752892035L,
    6987511185271585413L,
    1292089443730939651L,
    5587170596809636807L,
    8237809229146017083L,
    -2235781308356196513L,
    5423273201690025713L,
    -827014178432784464L,
    4410575469603649344L,
    -4472642034035214939L,
    5360193252716249224L,
    -4572235983836835323L,
    -5433653902594010857L,
    4134790485921001466L,
    4485288889906709425L,
    1685824402735587758L,
    6091818520229922279L,
    -212523426857309616L,
    8873690209863775893L,
    -8812432523459654235L,
    8103047819338531286L,
    4614534509558570387L,
    4229082172984667846L,
    5484460792243331111L,
    -2385763800014084246L,
    7030455160712580607L,
    -4237997225503760625L,
    -8124291737715145061L,
    6327782024255912635L,
    -1059957986215325879L,
    -4603394046555224246L,
    -412280426794415941L,
    -3912022758691365061L,
    8274283857906326279L,
    -6679687570538459747L,
    -6155809572519276859L,
    -341344339192464824L,
    4137861550441588415L,
    -6618940267671493988L,
    -7291675023689911653L,
    -7953871974818004574L,
    -397153165830243551L,
    4399741193484513820L,
    -7321827371527026850L,
    1338155597001139997L,
    -7945100475342274903L,
    4522579580699730675L,
    -1777997817650119183L,
    -5064101783437092203L,
    1113553310062801693L,
    -5709720543205442481L,
    772882345518435045L,
    8903336589907078605L,
    -8789465120959251318L,
    -7834044567177051539L,
    1770279151425541006L,
    -4941283968572768930L,
    -8127231558741248281L,
    737747628416269099L,
    1574449851957266285L,
    -471282776174276539L,
    6739952936193376447L,
    -2424982200476312714L,
    176022186483763915L,
    347356729555692814L,
    7550980861784622262L,
    -6474882761637742162L,
    6769254801287215843L,
    -7346044586598503820L,
    1815045574884249754L,
    -4240219227462571370L,
    -649819224919779208L,
    -3697860834931443057L,
    4209607762757612835L,
    5512379227441488333L,
    2554702396243693813L,
    -33063197416101018L,
    6204387436027047110L,
    1121696558750946811L,
    -67713675745955613L,
    2900236341998750711L,
    4072627124871947361L,
    3411250942283240973L,
    3459019187218245290L,
    -4931935198846519054L,
    8420402881327935528L,
    -2700073972687127894L,
    4135622085465759778L,
    3115364578959809417L,
    7905907040079822152L,
    3117202331600018366L,
    -6912405766950946927L,
    -4526890208931001416L,
    -8362196017109360491L,
    7990163642449120866L,
    8921333090931858791L,
    -7835160532401884454L,
    2597345228860385242L,
    -2019901582135813985L,
    -734731610197007345L,
    -4478738615320414333L,
    -7971363857175568029L,
    -4550695664824391599L,
    7004896942426055925L,
    3243444764663891458L,
    8221182849925835178L,
