From 07c1e8347e3384e6d981a193d181af73bd417b94 Mon Sep 17 00:00:00 2001 From: Quentin Bourgerie Date: Thu, 1 Dec 2022 20:10:40 +0100 Subject: [PATCH] refactor(tests): Refactor test tools to easiest run tests with description files and different compilation options --- compiler/Makefile | 57 +- .../end_to_end_benchmark.cpp | 21 +- .../end_to_end_apply_lookup_table.yaml | 340 - .../end_to_end_apply_lookup_table_gen.py | 5 +- .../end_to_end_fixture/end_to_end_fhe.yaml | 320 - .../end_to_end_leveled.yaml | 9575 ----------------- ...nd_to_end_linalg_apply_lookup_table_gen.py | 72 +- .../{ => tests_cpu}/bug_report.zip | Bin .../end_to_end_clear_tensor.yaml | 0 .../end_to_end_encrypted_tensor.yaml | 0 .../tests_cpu/end_to_end_fhe.yaml | 148 + .../{ => tests_cpu}/end_to_end_fhelinalg.yaml | 0 .../tests/end_to_end_tests/CMakeLists.txt | 2 +- .../end_to_end_tests/end_to_end_jit_fhe.cc | 274 - .../tests/end_to_end_tests/end_to_end_test.cc | 297 + 15 files changed, 524 insertions(+), 10587 deletions(-) delete mode 100644 compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table.yaml delete mode 100644 compiler/tests/end_to_end_fixture/end_to_end_fhe.yaml delete mode 100644 compiler/tests/end_to_end_fixture/end_to_end_leveled.yaml rename compiler/tests/end_to_end_fixture/{ => tests_cpu}/bug_report.zip (100%) rename compiler/tests/end_to_end_fixture/{ => tests_cpu}/end_to_end_clear_tensor.yaml (100%) rename compiler/tests/end_to_end_fixture/{ => tests_cpu}/end_to_end_encrypted_tensor.yaml (100%) create mode 100644 compiler/tests/end_to_end_fixture/tests_cpu/end_to_end_fhe.yaml rename compiler/tests/end_to_end_fixture/{ => tests_cpu}/end_to_end_fhelinalg.yaml (100%) delete mode 100644 compiler/tests/end_to_end_tests/end_to_end_jit_fhe.cc create mode 100644 compiler/tests/end_to_end_tests/end_to_end_test.cc diff --git a/compiler/Makefile b/compiler/Makefile index 3356d8784..93c5d94ab 100644 --- a/compiler/Makefile +++ b/compiler/Makefile @@ -235,22 +235,31 @@ run-rust-tests: rust-bindings ## end-to-end-tests -build-end-to-end-tests: build-end-to-end-jit-test build-end-to-end-jit-fhe build-end-to-end-jit-encrypted-tensor build-end-to-end-jit-fhelinalg build-end-to-end-jit-lambda +FIXTURE_CPU_DIR=tests/end_to_end_fixture/tests_cpu -run-end-to-end-tests: build-end-to-end-tests - find $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests -name end_to_end* $(FIND_EXECUTABLE_ARG) -type f | xargs -n1 ./run_test_bin.sh +$(FIXTURE_CPU_DIR)/%.yaml: tests/end_to_end_fixture/%_gen.py + mkdir -p $(FIXTURE_CPU_DIR) + $(Python3_EXECUTABLE) $< > $@ + +$(FIXTURE_CPU_DIR)/bug_report.yaml: + unzip -o $(FIXTURE_CPU_DIR)/bug_report.zip -d $(FIXTURE_CPU_DIR) + +generate-cpu-tests: $(FIXTURE_CPU_DIR)/end_to_end_leveled.yaml $(FIXTURE_CPU_DIR)/end_to_end_apply_lookup_table.yaml $(FIXTURE_CPU_DIR)/end_to_end_linalg_apply_lookup_table.yaml $(FIXTURE_CPU_DIR)/bug_report.yaml + +build-end-to-end-tests: build-end-to-end-jit-test build-end-to-end-test build-end-to-end-jit-encrypted-tensor build-end-to-end-jit-fhelinalg build-end-to-end-jit-lambda + +run-end-to-end-tests: build-end-to-end-tests generate-cpu-tests + $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests/end_to_end_jit_test + $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests/end_to_end_jit_encrypted_tensor + $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests/end_to_end_jit_fhelinalg + $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests/end_to_end_jit_lambda + $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests/end_to_end_test --loop-parallelize --jit $(FIXTURE_CPU_DIR)/*.yaml build-end-to-end-jit-test: build-initialized cmake --build $(BUILD_DIR) --target end_to_end_jit_test -generate-end-to-end-tests: - $(Python3_EXECUTABLE) ./tests/end_to_end_fixture/end_to_end_linalg_apply_lookup_table_gen.py \ - --n-lut 2 --n-ct 4 \ - > ./tests/end_to_end_fixture/end_to_end_linalg_2_apply_lookup_table.yaml - unzip -o tests/end_to_end_fixture/bug_report.zip -d tests/end_to_end_fixture/ - -build-end-to-end-jit-fhe: build-initialized generate-end-to-end-tests - cmake --build $(BUILD_DIR) --target end_to_end_jit_fhe +build-end-to-end-test: build-initialized + cmake --build $(BUILD_DIR) --target end_to_end_test build-end-to-end-jit-encrypted-tensor: build-initialized cmake --build $(BUILD_DIR) --target end_to_end_jit_encrypted_tensor @@ -272,24 +281,26 @@ run-end-to-end-dataflow-tests: build-end-to-end-dataflow-tests $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests/end_to_end_jit_auto_parallelization $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests/end_to_end_jit_distributed -## GPU tests - -build-end-to-end-gpu-tests: build-initialized - cmake --build $(BUILD_DIR) --target end_to_end_gpu_test - -run-end-to-end-gpu-tests: build-end-to-end-gpu-tests - $(BUILD_DIR)/tools/concretelang/tests/end_to_end_tests/end_to_end_gpu_test - # benchmark -generate-benchmarks: - $(Python3_EXECUTABLE) ./tests/end_to_end_fixture/end_to_end_linalg_apply_lookup_table_gen.py > tests/end_to_end_fixture/end_to_end_linalg_apply_lookup_table.yaml - $(Python3_EXECUTABLE) ./tests/end_to_end_fixture/end_to_end_linalg_leveled_gen.py > tests/end_to_end_fixture/end_to_end_linalg_leveled.yaml +BENCHMARK_CPU_DIR=tests/end_to_end_fixture/benchmarks_cpu + +$(BENCHMARK_CPU_DIR)/end_to_end_linalg_apply_lookup_table.yaml: tests/end_to_end_fixture/end_to_end_linalg_apply_lookup_table_gen.py + $(Python3_EXECUTABLE) $< --n-ct 64 128 1024 > $@ + +$(BENCHMARK_CPU_DIR)/%.yaml: tests/end_to_end_fixture/%_gen.py + mkdir -p $(FIXTURE_CPU_DIR) + $(Python3_EXECUTABLE) $< > $@ + +$(BENCHMARK_CPU_DIR): + mkdir -p $@ + +generate-cpu-benchmarks: $(BENCHMARK_CPU_DIR) $(BENCHMARK_CPU_DIR)/end_to_end_linalg_apply_lookup_table.yaml $(BENCHMARK_CPU_DIR)/end_to_end_apply_lookup_table.yaml build-benchmarks: build-initialized cmake --build $(BUILD_DIR) --target end_to_end_benchmark -run-benchmarks: build-benchmarks generate-benchmarks +run-benchmarks: build-benchmarks generate-cpu-benchmarks $(BUILD_DIR)/bin/end_to_end_benchmark --benchmark_out=benchmarks_results.json --benchmark_out_format=json build-mlbench: build-initialized diff --git a/compiler/tests/end_to_end_benchmarks/end_to_end_benchmark.cpp b/compiler/tests/end_to_end_benchmarks/end_to_end_benchmark.cpp index 6479fcc43..af7f2d453 100644 --- a/compiler/tests/end_to_end_benchmarks/end_to_end_benchmark.cpp +++ b/compiler/tests/end_to_end_benchmarks/end_to_end_benchmark.cpp @@ -146,20 +146,11 @@ static int registerEndToEndTestFromFile(std::string prefix, std::string path, return 1; } -auto _ = { - registerEndToEndTestFromFile( - "FHE", "tests/end_to_end_fixture/end_to_end_fhe.yaml"), - registerEndToEndTestFromFile( - "EncryptedTensor", - "tests/end_to_end_fixture/end_to_end_encrypted_tensor.yaml"), - registerEndToEndTestFromFile( - "FHELinalg", "tests/end_to_end_fixture/end_to_end_fhelinalg.yaml"), - registerEndToEndTestFromFile( - "FHELinalgTLU", - "tests/end_to_end_fixture/end_to_end_linalg_apply_lookup_table.yaml"), - registerEndToEndTestFromFile( - "FHELinalgLeveled", - "tests/end_to_end_fixture/end_to_end_linalg_leveled.yaml"), -}; +auto _ = {registerEndToEndTestFromFile( + "FHELinalg", "tests/end_to_end_fixture/benchmarks_cpu/" + "end_to_end_apply_lookup_table.yaml"), + registerEndToEndTestFromFile( + "FHELinalgTLU", "tests/end_to_end_fixture/benchmarks_cpu/" + "end_to_end_linalg_apply_lookup_table.yaml")}; BENCHMARK_MAIN(); diff --git a/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table.yaml b/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table.yaml deleted file mode 100644 index d60483561..000000000 --- a/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table.yaml +++ /dev/null @@ -1,340 +0,0 @@ -# /!\ DO NOT EDIT MANUALLY THIS FILE MANUALLY -# /!\ THIS FILE HAS BEEN GENERATED THANKS THE end_to_end_levelled_gen.py scripts -# This reference file aims to test all levelled ops with all bitwidth than we known that the compiler/optimizer support. - - -description: identity_apply_lookup_table_1bits -program: | - func.func @main(%arg0: !FHE.eint<1>) -> !FHE.eint<1> { - %tlu = arith.constant dense<[0,1]> : tensor<2xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<1>, tensor<2xi64>) -> (!FHE.eint<1>) - return %1: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - outputs: - - scalar: 1 ---- -description: identity_apply_lookup_table_2bits -program: | - func.func @main(%arg0: !FHE.eint<2>) -> !FHE.eint<2> { - %tlu = arith.constant dense<[1,0,3,3]> : tensor<4xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<2>, tensor<4xi64>) -> (!FHE.eint<2>) - return %1: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 1 - - inputs: - - scalar: 1 - outputs: - - scalar: 0 - - inputs: - - scalar: 3 - outputs: - - scalar: 3 ---- -description: identity_apply_lookup_table_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>) -> !FHE.eint<3> { - %tlu = arith.constant dense<[3,5,2,4,7,6,0,0]> : tensor<8xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<3>, tensor<8xi64>) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 3 - - inputs: - - scalar: 4 - outputs: - - scalar: 7 - - inputs: - - scalar: 7 - outputs: - - scalar: 0 ---- -description: identity_apply_lookup_table_4bits -program: | - func.func @main(%arg0: !FHE.eint<4>) -> !FHE.eint<4> { - %tlu = arith.constant dense<[10,1,6,7,7,14,8,1,5,9,13,8,9,4,3,0]> : tensor<16xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<4>, tensor<16xi64>) -> (!FHE.eint<4>) - return %1: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 10 - - inputs: - - scalar: 3 - outputs: - - scalar: 7 - - inputs: - - scalar: 15 - outputs: - - scalar: 0 ---- -description: identity_apply_lookup_table_5bits -program: | - func.func @main(%arg0: !FHE.eint<5>) -> !FHE.eint<5> { - %tlu = arith.constant dense<[5,30,15,15,0,18,3,24,17,19,29,19,19,14,7,0,1,9,25,31,0,31,10,20,23,3,30,11,18,23,28,2]> : tensor<32xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<5>, tensor<32xi64>) -> (!FHE.eint<5>) - return %1: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 5 - - inputs: - - scalar: 0 - outputs: - - scalar: 5 - - inputs: - - scalar: 31 - outputs: - - scalar: 2 ---- -description: identity_apply_lookup_table_6bits -program: | - func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { - %tlu = arith.constant dense<[0,36,53,5,38,40,52,17,15,4,41,42,58,31,56,1,1,39,41,57,35,38,55,11,46,18,27,0,14,35,53,12,57,42,20,11,4,6,4,47,63,52,3,12,36,52,40,14,15,20,35,58,23,15,13,53,21,48,49,5,41,35,0,31]> : tensor<64xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<6>, tensor<64xi64>) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 5 - outputs: - - scalar: 40 - - inputs: - - scalar: 63 - outputs: - - scalar: 31 ---- -description: identity_apply_lookup_table_7bits -program: | - func.func @main(%arg0: !FHE.eint<7>) -> !FHE.eint<7> { - %tlu = arith.constant dense<[94,0,113,50,36,34,48,93,3,98,42,77,112,103,21,73,127,0,10,114,43,58,127,23,59,2,121,98,62,35,94,123,67,82,46,99,20,81,50,27,14,41,58,65,36,10,86,43,104,11,2,51,80,32,54,0,38,19,46,42,115,56,60,104,77,30,24,125,2,3,94,98,107,13,112,40,72,19,95,72,26,66,120,52,67,108,61,14,96,4,67,109,11,124,86,77,121,109,75,56,16,24,29,21,110,25,80,60,121,118,117,61,83,33,104,32,100,123,123,121,70,85,31,13,71,56,24,79]> : tensor<128xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<7>, tensor<128xi64>) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 94 - - inputs: - - scalar: 41 - outputs: - - scalar: 41 - - inputs: - - scalar: 127 - outputs: - - scalar: 79 ---- -description: identity_apply_lookup_table_8bits -program: | - func.func @main(%arg0: !FHE.eint<8>) -> !FHE.eint<8> { - %tlu = arith.constant dense<[18,40,182,207,11,166,111,93,249,129,223,118,44,216,125,24,67,210,239,3,234,204,230,35,214,254,189,197,215,43,32,11,104,212,138,182,235,165,125,156,111,232,2,27,211,217,151,53,51,174,148,181,29,67,35,39,137,73,41,151,131,46,218,178,108,3,31,9,138,27,173,199,167,61,85,97,44,34,162,88,33,133,232,255,36,0,203,34,197,126,181,254,80,190,136,189,129,209,112,35,120,91,168,116,36,176,25,67,103,252,35,114,30,29,241,33,146,17,221,84,253,2,69,101,140,44,117,253,66,111,91,85,167,39,203,150,158,145,198,199,18,92,43,83,177,41,93,174,149,201,89,242,224,219,73,28,235,209,105,186,128,214,63,16,106,164,94,24,116,191,195,51,136,184,91,93,123,238,87,160,147,72,199,87,13,58,81,120,116,183,64,203,220,164,25,32,170,14,214,28,20,210,68,22,227,122,83,135,200,61,141,5,0,136,207,207,181,139,4,167,92,173,26,74,52,238,177,219,51,227,105,18,117,34,51,158,181,58,171,55,252,252,18,173,87,193,70,234,53,48,94,59,80,154,124,163]> : tensor<256xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<8>, tensor<256xi64>) -> (!FHE.eint<8>) - return %1: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 18 - - inputs: - - scalar: 58 - outputs: - - scalar: 41 - - inputs: - - scalar: 255 - outputs: - - scalar: 163 ---- -description: identity_apply_lookup_table_9bits -program: | - func.func @main(%arg0: !FHE.eint<9>) -> !FHE.eint<9> { - %tlu = arith.constant dense<[433,106,201,300,269,377,326,38,167,136,13,504,391,208,504,22,504,335,473,264,227,262,209,455,468,473,450,60,400,56,370,237,151,280,4,100,492,305,343,30,54,153,276,353,357,185,407,411,29,417,371,309,119,435,342,502,7,105,497,137,182,384,339,376,420,209,148,373,496,259,126,298,65,20,292,324,464,112,431,138,237,360,478,347,43,63,415,404,454,265,444,91,111,419,339,332,274,369,330,226,225,427,131,396,228,314,385,369,128,295,24,186,292,355,325,134,3,226,377,168,444,417,284,324,26,224,248,365,435,201,437,197,417,135,125,94,72,246,340,135,195,213,475,108,323,102,340,327,83,223,256,133,347,107,414,457,467,7,149,485,476,392,171,46,0,360,179,38,89,74,499,226,123,343,96,339,282,206,32,115,454,353,428,315,313,178,173,233,132,441,93,347,401,419,194,404,429,185,463,375,164,361,190,4,497,498,205,414,365,343,226,419,73,218,439,26,374,22,460,207,354,90,51,486,302,208,61,444,303,506,104,128,394,459,397,327,94,6,173,245,414,15,169,166,309,427,82,391,220,321,169,322,114,348,334,229,219,246,100,415,221,178,508,174,93,114,161,268,224,233,336,66,456,499,125,138,112,218,155,184,120,321,448,197,344,290,463,3,188,238,165,171,211,344,70,148,390,284,115,390,322,92,476,102,357,379,197,109,329,100,182,333,405,507,159,81,35,237,243,250,392,254,281,21,429,229,470,400,153,494,119,165,383,385,389,198,396,346,74,507,438,78,318,72,199,301,133,47,187,170,451,138,242,313,475,345,387,125,206,338,197,186,388,17,197,447,350,152,131,325,424,164,58,177,439,152,161,402,353,462,241,135,437,235,46,496,500,127,417,337,157,12,118,302,374,288,290,115,87,124,409,174,498,363,52,489,110,64,332,374,73,146,260,263,131,48,76,293,116,493,48,109,466,179,49,71,346,433,494,285,3,74,84,490,321,375,20,208,42,498,28,410,343,180,304,450,102,265,258,372,364,233,345,380,373,100,90,68,105,10,12,104,225,421,167,416,378,289,410,99,217,306,344,210,276,222,156,72,274,409,408,39,234,123,284,152,146,195,172,211,301,310,0,138,195,390,219,355,441,454,403,162,50,242,358,20,171,118,128,484,365,105]> : tensor<512xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<9>, tensor<512xi64>) -> (!FHE.eint<9>) - return %1: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 433 - - inputs: - - scalar: 194 - outputs: - - scalar: 194 - - inputs: - - scalar: 511 - outputs: - - scalar: 105 ---- -description: identity_apply_lookup_table_10bits -program: | - func.func @main(%arg0: !FHE.eint<10>) -> !FHE.eint<10> { - %tlu = arith.constant dense<[225,652,783,118,545,151,908,901,38,769,266,6,893,262,614,934,331,370,341,382,370,690,819,258,332,669,521,627,968,389,628,181,235,193,811,591,62,332,559,588,661,120,786,345,525,222,604,236,105,213,518,612,560,552,922,158,389,143,959,485,37,571,625,95,352,496,208,288,62,394,396,605,832,413,346,999,150,403,389,804,595,127,484,773,348,460,154,753,83,908,998,135,180,592,413,0,727,719,842,764,643,573,323,144,880,457,596,116,741,767,824,318,952,560,145,885,953,521,492,190,79,742,206,417,900,912,228,839,318,791,859,366,7,509,790,866,158,758,592,155,559,495,626,523,983,846,999,798,90,290,566,849,675,71,877,827,624,421,68,437,13,101,787,875,264,864,721,197,380,100,385,765,157,901,976,230,504,936,662,30,255,531,772,660,874,586,123,451,214,316,741,250,605,681,552,188,209,691,296,59,490,478,541,225,606,238,677,382,216,272,867,167,669,508,65,791,200,384,87,805,367,447,410,729,345,134,216,503,463,101,297,913,976,880,43,110,453,374,915,751,790,365,907,523,929,903,119,282,560,199,239,694,608,356,850,599,405,510,514,264,266,261,294,934,612,449,629,571,676,901,261,38,675,88,945,719,340,370,265,1015,132,945,24,606,386,851,899,589,267,397,484,81,154,966,687,610,533,916,682,890,441,145,613,985,244,469,183,612,196,111,226,779,994,97,238,403,880,11,993,537,97,351,301,774,601,856,493,550,51,16,919,730,771,858,430,634,413,770,645,377,967,783,846,419,180,359,886,263,691,358,761,947,925,695,625,395,451,717,890,311,600,507,252,504,836,117,371,470,185,349,614,907,718,594,985,236,3,165,391,797,78,779,969,523,784,60,635,103,703,699,129,914,693,284,448,853,728,585,904,978,395,476,373,947,849,439,15,131,106,472,213,284,826,725,590,879,833,844,267,281,359,779,858,749,418,897,1022,656,257,528,545,33,172,486,808,328,205,106,595,754,416,919,324,415,662,64,741,287,79,83,783,819,505,396,685,10,500,617,848,70,21,734,707,336,320,129,818,864,363,1019,466,338,697,406,783,911,540,327,283,216,313,826,216,972,269,914,78,974,788,583,695,300,235,245,91,44,783,1021,599,971,589,510,413,607,110,722,644,540,705,49,945,343,569,720,41,474,752,194,943,273,20,678,320,646,236,662,79,74,162,680,678,1014,661,802,373,160,426,383,300,611,809,761,871,923,763,304,383,650,324,273,771,613,606,471,285,614,635,158,203,450,477,316,647,691,244,585,471,960,1008,401,680,243,533,606,922,143,752,785,266,657,131,999,585,797,195,455,464,226,644,445,858,100,134,32,81,631,374,757,293,631,283,51,590,955,598,607,8,312,797,668,991,418,186,895,894,977,476,111,656,968,571,247,1004,7,908,288,724,747,75,221,40,0,212,109,604,205,165,431,573,103,946,580,494,972,697,887,997,1008,132,617,548,336,466,165,734,373,494,291,944,640,561,185,265,50,737,176,1009,524,710,636,499,932,99,358,36,286,626,147,422,428,35,782,29,947,60,1016,337,835,797,155,131,33,757,435,886,411,228,56,277,679,746,330,541,241,925,957,570,792,114,272,448,868,994,635,13,769,763,258,834,147,500,762,460,670,551,469,589,945,282,371,140,241,960,257,420,778,874,288,510,284,698,706,732,65,205,339,559,593,420,199,309,710,649,527,786,157,693,956,554,466,642,797,401,35,888,275,912,535,652,355,877,696,706,788,131,81,940,38,42,970,549,362,552,879,795,644,435,406,677,803,542,775,984,600,239,911,394,147,845,999,824,997,999,914,455,60,24,160,364,295,884,104,382,367,116,996,1002,16,948,218,1000,208,814,224,606,852,791,655,172,595,119,567,354,411,301,994,337,727,411,589,432,983,862,389,377,231,737,881,994,796,244,65,68,725,456,764,370,929,374,483,560,99,985,581,961,611,71,513,129,199,665,100,589,620,178,411,96,555,787,354,301,100,336,112,234,889,939,451,520,211,942,576,372,916,96,482,875,389,341,280,2,509,1021,455,108,203,243,796,374,863,65,464,370,210,398,533,111,879,197,801,618,130,539,744,375,147,911,839,1004,797,419,737,304,945,848,184,319,472,442,901,819,250,573,106,467,273,45,992,574,22,225,614,649,773,332,573,170,759,400,315,273,196,316,665,142,877,829,181,81,541,198,28,714,645,484,484,340,951,498,178,598,181,778,555,955,414,827,142,1011,432,632,381,56,449,872,903,965,143,631,1001,308,288,87,974,930,541,51,473,437,772,192,891,154,468,389,378,856,273,964,312,160,241,337,584]> : tensor<1024xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<10>, tensor<1024xi64>) -> (!FHE.eint<10>) - return %1: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 225 - - inputs: - - scalar: 73 - outputs: - - scalar: 413 - - inputs: - - scalar: 1023 - outputs: - - scalar: 584 ---- -description: identity_apply_lookup_table_11bits -program: | - func.func @main(%arg0: !FHE.eint<11>) -> !FHE.eint<11> { - %tlu = arith.constant dense<[740,1439,350,1353,364,1200,739,1440,1294,573,1367,416,312,412,171,1121,178,814,108,1864,421,632,2,785,143,707,1365,1520,754,1117,1893,1144,662,1234,1543,823,177,1050,760,644,1133,89,1050,1724,243,1647,1619,590,658,1145,608,347,804,1382,1428,1407,1516,387,1682,205,51,561,1567,481,1682,268,623,2011,231,866,1863,1630,813,1744,65,88,272,301,383,219,165,434,408,1968,1228,1028,1008,947,1198,1064,1934,1265,394,1435,1358,870,1421,1540,726,1295,1053,974,1194,1689,1227,479,1243,534,1134,811,1492,1719,765,1154,1689,1661,120,1664,1375,184,1134,1734,978,598,190,1791,1582,763,1113,717,1676,318,293,2003,159,887,1948,315,1528,339,1832,1384,1401,1625,2031,1821,796,1076,1322,650,1748,1297,640,1703,38,1506,193,1584,214,1069,1146,689,1558,231,1534,1372,1345,1365,1858,1568,434,1350,614,931,2037,484,151,2035,122,82,1126,89,750,79,1137,155,1877,1537,265,115,1873,395,1088,247,1859,1529,1213,54,1316,468,1150,19,1007,1733,724,637,1726,1220,1193,208,656,185,1669,96,278,1155,1416,830,1884,1193,1866,102,1628,1119,108,907,930,91,1841,583,1447,870,887,1082,1029,1097,1880,140,744,1249,1851,718,2029,1551,1028,1942,1716,66,1863,1389,328,1285,551,335,1871,1833,985,662,473,1241,915,1854,797,1801,1419,893,99,1562,871,1279,1746,1608,255,1665,1891,626,241,1710,1335,1546,1738,1304,511,1375,1067,987,1677,974,55,5,407,42,1639,1073,1381,870,1611,1909,952,1451,152,1361,1557,2014,1170,63,1369,1565,1317,945,1192,497,362,1247,103,1291,312,2037,1471,142,1312,193,1145,373,833,36,1786,25,1996,72,50,524,920,147,1731,394,519,948,1116,1550,456,46,1251,35,209,1175,61,1653,1205,524,1453,1543,506,1455,110,679,1886,1683,1258,1901,946,1601,939,594,1486,2043,1113,101,376,184,584,690,34,986,523,620,1163,360,420,1918,1201,1996,2001,1247,1994,1840,586,1163,605,1570,714,1484,753,1319,368,1546,770,1401,1007,75,1966,1075,500,1961,2042,1115,1667,272,1343,832,1805,1830,260,515,915,593,1168,382,839,664,1291,150,1596,1243,642,904,1096,1753,294,1588,1761,344,1343,917,516,415,755,203,677,1799,1686,1660,1322,187,735,310,1993,1907,1459,594,1815,1107,1817,1849,1221,345,301,1391,1624,1971,1339,1964,1178,1656,629,939,633,416,1822,1678,1351,96,1725,513,1526,431,1404,365,1142,1195,474,1039,1860,1226,85,1703,106,1515,1630,1494,256,1617,1210,1036,1243,811,950,381,431,790,799,372,1058,2018,1834,1348,1914,830,1828,1875,172,721,240,1391,198,262,1456,1417,1564,77,1720,393,469,1858,521,1134,1016,1188,284,1524,1088,970,892,1165,1259,1538,421,967,1111,1758,2001,1539,111,2018,848,1779,594,818,1981,490,978,28,1827,309,1818,1393,1383,1578,1838,197,540,127,171,1107,62,842,1226,649,1243,739,843,864,166,31,1779,1942,1406,1883,1849,1045,1761,1853,1516,1833,371,875,355,1193,250,1687,1277,744,1844,279,1146,1864,1577,1261,828,815,1679,1060,1985,606,2021,810,1790,512,2003,902,733,1091,287,797,16,1987,282,2045,1286,233,1509,267,1361,823,893,1323,323,532,475,511,631,1500,270,270,80,1507,447,373,1766,43,1179,1382,1751,916,1019,535,1314,1312,833,1302,789,441,580,1837,1000,1959,792,342,273,1972,1498,1672,773,1249,342,250,1618,1802,574,1565,139,158,327,1594,990,42,2005,327,665,492,822,1142,339,25,173,1401,490,1155,884,980,2033,851,249,549,161,444,876,1753,1543,956,165,1620,1018,354,272,1709,1512,1191,1569,1889,1857,201,87,1348,280,1030,1889,1394,767,1596,1240,61,1012,1211,1527,1657,458,797,1263,1016,28,1176,1411,466,1685,1286,84,1301,1655,1307,922,2009,448,366,387,1845,805,7,1400,1360,1483,651,2028,386,1334,1541,785,1786,1917,1614,1925,846,1105,1257,110,620,1054,1890,1795,128,1885,300,684,1260,1919,627,957,254,1024,1809,413,1627,930,1010,1011,1252,1211,1045,63,1758,1528,1637,657,1062,1743,897,143,1001,726,1773,1553,1260,1973,1430,1485,626,1199,1730,267,1929,498,808,1974,947,47,772,1930,1521,254,646,1398,1452,1352,1416,200,492,1765,18,1026,197,1245,505,1253,1636,362,157,1179,657,442,395,1329,1352,344,1539,1648,11,1849,1458,1679,1977,131,1910,996,1980,1959,1534,2005,157,949,67,1592,203,1399,1103,301,602,79,1249,1035,1527,133,926,1210,1604,315,544,1829,1195,637,1340,557,285,250,1179,1767,795,1053,126,72,1099,97,1230,1574,1291,1482,1782,1881,32,1714,1064,1222,286,1686,1147,1611,1315,468,964,1599,772,689,884,1181,1727,829,603,1647,1235,360,90,1562,585,1970,223,1886,1809,1735,1848,1011,803,201,1756,1839,48,375,967,629,579,1659,1735,318,968,293,1029,1633,55,1500,1454,38,561,264,1658,1217,1346,1086,16,1213,194,1291,415,1418,20,1124,1806,1656,52,455,1693,1925,1294,1650,750,975,819,1056,407,1785,859,774,1737,120,1089,1099,855,508,1734,808,1724,1060,908,931,62,1477,1854,442,588,1554,384,1025,1748,717,1626,1136,1131,1173,1614,1293,1000,1091,1897,401,261,26,703,1435,2027,1773,1961,525,813,1456,568,58,1041,1238,863,985,220,1229,391,282,273,708,1579,431,1758,125,1372,1529,1864,1722,1819,6,903,693,1911,1528,26,1659,715,1829,1117,433,1556,477,887,440,1981,439,732,151,697,1673,640,1638,403,455,1074,550,963,1788,1438,1573,1976,1918,2025,645,59,2000,1498,445,1823,966,345,1227,1681,1055,671,84,90,1063,757,178,1610,294,580,379,551,127,1231,13,1187,486,1915,1419,359,331,2032,1846,1444,1106,203,691,162,1978,80,540,393,1893,8,145,1776,236,1244,1689,1374,1147,101,1723,1403,2014,1017,1083,1210,1298,524,897,1307,522,1987,1981,784,1307,636,1798,512,7,665,67,1851,1784,372,511,420,428,1749,625,1782,511,1224,623,1190,1962,993,1700,68,91,781,1677,937,328,646,1374,1164,610,1923,232,1552,261,1576,1463,925,1717,278,357,535,251,1914,932,1771,187,1058,966,390,344,1612,1041,1631,1584,1829,1024,1482,625,876,1028,1631,956,1663,522,797,865,1897,1264,1549,275,41,1228,1452,51,1131,144,1528,2046,754,1957,1550,676,1138,1156,2034,303,1920,1841,933,254,459,812,1605,360,494,1808,1296,1802,1541,919,943,1603,1190,1008,274,94,1488,1823,426,47,1301,993,1079,1354,108,1055,595,1090,147,1183,1906,787,807,1959,573,609,1964,244,1772,438,1758,1146,487,190,204,912,80,510,1158,1476,813,980,506,1694,588,1915,693,1441,602,1426,1158,632,1154,1178,238,281,525,1983,731,574,1081,293,941,1429,107,504,837,1017,1841,1049,268,1588,838,943,765,73,906,584,474,1168,1375,1886,766,1253,294,1200,1724,518,1008,966,631,513,367,1215,1217,1661,1301,814,1792,1750,1188,1690,1684,340,1255,1570,241,878,1085,1950,667,740,1609,1352,1588,1620,919,318,48,2023,1467,1323,1962,653,504,367,1017,777,1179,1626,997,1570,1862,1449,2029,1061,6,1338,597,1027,75,1770,1291,413,78,723,1306,363,767,80,1187,1588,913,1616,394,2041,1212,969,99,921,1663,1178,563,335,283,132,1382,1749,103,241,437,1815,1004,2022,1387,619,1558,1372,2030,1067,1030,909,1229,145,1448,637,478,1476,1810,752,1154,27,392,1771,1231,1587,215,1967,831,1182,525,860,942,1934,1778,1198,1197,1633,260,884,650,1396,63,274,1508,200,119,314,1737,750,1421,1548,669,590,360,77,1673,1966,700,588,1253,1693,1133,75,1516,2025,1905,1944,1851,1992,655,438,672,492,1278,1744,1010,371,1644,1138,1393,11,271,1305,789,150,2001,988,762,1883,108,456,859,476,743,619,103,99,414,1780,1961,1782,393,886,820,1323,849,1970,1424,1088,1818,135,1462,850,1978,1355,313,1722,972,269,968,232,1810,1169,1194,1324,1250,1739,855,838,206,1582,1590,1714,43,577,974,357,262,121,1199,1196,777,515,1417,123,1780,507,1058,1502,513,1318,206,2000,862,1458,141,1878,46,995,855,805,1885,1773,746,1370,82,2006,518,1610,1451,513,1481,474,176,847,1425,1299,254,1171,833,1435,2035,1764,931,265,745,13,437,1350,984,778,121,1323,1637,1413,168,1268,783,1038,469,0,1315,1633,1422,1798,600,1526,1027,1348,1125,1512,863,1947,626,2025,579,1826,425,781,1919,1137,401,362,680,1517,970,806,1578,323,1307,1980,655,754,1954,1508,746,1639,1714,44,340,564,1945,1739,172,81,2047,645,1619,711,255,1860,1631,1373,106,754,1627,1184,1515,937,1234,413,1933,2034,1388,649,54,904,1049,161,529,497,431,1552,1585,1086,839,1886,2046,976,1110,507,165,1289,1966,652,1112,1405,1397,406,1208,1614,557,1825,702,516,837,637,1100,681,396,1792,1733,150,1769,1377,689,1651,1857,394,198,122,16,711,411,1318,107,1108,1449,722,627,2026,454,934,1698,113,714,1791,359,1832,40,1947,94,2043,1188,98,571,601,1947,696,1151,954,1311,816,1003,126,387,320,1573,503,1703,1036,852,1483,332,1656,370,2011,943,313,149,1900,524,2031,657,423,1951,1647,1693,439,449,1317,512,791,909,136,468,53,210,336,1805,392,1414,411,1189,419,1576,1690,350,972,1465,301,1872,1338,1175,766,1266,746,968,2039,1014,464,1269,893,1554,970,1935,486,1917,856,2020,1775,832,1411,2010,916,1007,1199,446,353,1048,722,1832,137,1352,1223,1500,2031,297,1811,726,1347,2039,1998,1151,1655,1858,1751,235,1048,1620,1699,1914,1454,544,802,1578,860,37,228,850,1079,1898,547,2023,355,1089,349,1684,1253,355,814,1378,91,62,62,497,251,590,874,158,1371,51,516,1732,902,1769,1833,1283,679,492,1124,411,1677,300,256,1866,733,846,1152,1280,96,1908,1803,29,1413,69,697,1310,786,618,16,1911,1361,1227,9,1929,730,1100,1728,1255,1948,1782,845,855,954,633,1456,1435,1899,153,2004,111,1612,1560,1797,1058,76,1211,1579,975,827,1301,1508,1521,510,364,1548,880,1122,645,1812,1660,671,1890,279,1555,597,815,2042,1798,68,1225,1560,943,1952,1994,730,475,1296,1762,1174,1149,1052,284,625,1998,869,601,1157,1602,1443,715,947,589,2019,696,1503,1502,1285,29,91,2041,1973,449,1341,488,1178,1308,999,423,1633,105,687,109,1952,377,260,1462,384,267,179,611,964,1818,1551,497,732,874,912,884,1094,760,95,1026,508,1297,1266,1857,160,225,1446,580,1886,1284,1019,335,1151,277,1913,1395,1126,1802]> : tensor<2048xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<11>, tensor<2048xi64>) -> (!FHE.eint<11>) - return %1: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 740 - - inputs: - - scalar: 272 - outputs: - - scalar: 255 - - inputs: - - scalar: 2047 - outputs: - - scalar: 1802 ---- -description: identity_apply_lookup_table_12bits -program: | - func.func @main(%arg0: !FHE.eint<12>) -> !FHE.eint<12> { - %tlu = arith.constant dense<[2050,1838,701,2222,1134,2336,231,1943,3773,385,3364,3929,264,1583,2907,1024,163,3098,1214,1903,2996,4074,1686,2719,3713,1885,2307,259,1378,1140,164,2474,366,1044,1257,2181,2776,1023,3155,694,741,3331,3923,1175,3120,2910,670,1241,1927,4010,652,3588,240,923,204,3695,714,3836,427,3765,238,3722,2803,43,1798,711,2560,563,674,2912,3095,1472,1735,3998,786,800,2,3750,3340,1600,894,764,3144,1795,3469,894,2010,131,1254,2502,3718,2452,826,2050,981,175,1535,3764,3642,110,1618,254,1616,2361,3755,1313,3562,69,3293,1103,3161,493,3061,1304,356,2748,889,2880,1469,1101,1548,710,1137,2609,131,928,3187,1713,3811,2445,75,3089,68,3543,2351,330,2470,2676,3317,870,2480,1572,1501,793,547,3527,960,1856,1032,3011,2822,3173,3068,3463,947,3533,82,2424,1553,3843,3198,3336,47,1579,3773,1795,300,2123,4085,2353,1074,3210,1195,719,987,3174,574,3555,2386,3837,3390,1397,2467,341,924,955,2273,1113,458,1537,506,3477,921,3722,2680,1449,1037,3763,3394,2258,1236,1671,2856,312,341,2085,1454,1235,1498,1719,3462,3584,1416,3068,2773,3451,239,677,963,686,744,425,860,3135,1081,1015,3684,2599,705,1459,701,365,1733,954,3931,351,936,2121,2741,3960,2567,355,2991,709,681,796,3318,2938,2901,779,515,2322,1955,46,2409,3217,1135,2203,1078,2671,713,2451,199,3655,3941,3499,2046,940,1646,3758,2722,673,2122,375,2885,2524,1838,928,211,1447,414,3295,1903,1199,3969,4000,894,1128,2417,703,1143,3373,2231,1134,3958,3392,869,3541,3734,1435,2053,3949,1059,877,3875,1660,616,3267,3228,3675,3835,2185,299,1667,107,3979,4019,1494,2666,1770,132,1693,316,2476,2,3038,1093,1583,1228,1681,2127,2744,1577,920,2773,3688,1539,3772,3886,2416,1183,454,2047,3891,97,3247,3339,1895,1342,3720,2238,3203,951,2155,1846,2791,169,1334,281,3949,2438,71,3816,959,1373,766,4037,1574,1987,1287,370,4011,919,3288,4082,797,1331,3985,1720,1323,2977,2864,2766,2922,426,3792,239,2037,3201,3434,2613,1472,2803,1407,1080,1167,336,200,361,1684,1725,191,2870,1451,409,128,2171,2353,2471,386,1222,2947,3870,781,1812,884,3403,3339,2693,3952,656,2509,1214,3464,27,902,2412,3830,554,2692,3048,3817,399,1980,3456,3239,3621,518,3827,605,2874,1903,1945,1612,2112,958,4020,50,177,1436,1018,3015,2497,3692,3824,1074,2439,2024,3866,3752,2365,2736,494,1174,782,319,1503,1877,564,391,3108,3536,3782,3306,2452,2598,2436,2192,1762,3183,3256,251,879,782,1007,743,3199,2063,3544,654,1930,758,3332,596,1129,2792,564,3787,3324,3893,1501,835,2292,1836,1242,3452,219,1794,2236,2114,2557,2583,749,2076,2297,2869,2962,1903,4027,3649,1092,1060,1873,1048,2777,3947,3404,290,3413,2872,2034,3647,1993,1316,3947,2473,262,2961,2335,506,1650,2287,1004,3590,178,784,3870,3868,3199,459,160,1894,473,550,2333,3330,1619,332,1938,1088,2473,1174,2577,682,2052,2180,1426,2757,2062,10,306,989,2771,2850,3,3080,3034,1618,3652,2695,2410,3421,3107,3791,1070,3245,2499,570,643,2246,3138,3045,664,1719,2491,1699,1283,3655,3995,3058,2882,1534,2416,583,3082,2157,1215,3451,2160,1401,5,3572,3368,4054,436,1963,3521,902,3868,389,232,1610,647,1821,2916,338,47,2492,2367,2683,2498,297,1565,1120,3633,2748,820,537,3620,659,3936,1269,603,3226,3640,3384,3868,4013,3031,466,3333,961,2645,3362,897,605,1773,2018,2318,234,1566,1929,2486,3867,391,4044,3421,3748,166,92,3697,1621,2263,1445,3988,781,109,1704,3506,3561,2358,3198,1473,2888,58,2151,876,1097,2609,273,305,1113,2519,3001,3048,249,115,714,2906,3341,2335,3196,3605,865,2541,2305,1504,2219,2743,838,3362,990,2606,2394,1510,3044,657,2928,1292,3636,2863,1396,935,1904,2992,4023,2713,2880,316,998,1182,2281,1775,3172,3686,2908,2538,3799,2639,422,3430,4054,3888,1287,2597,2290,1858,2125,1300,2862,477,288,1844,2487,3475,2028,3052,2488,3606,86,2540,2277,2620,2722,573,950,1062,3797,988,688,418,3005,1729,3254,2925,2286,145,2612,2338,4011,141,17,3871,1557,226,3693,3713,3653,943,3314,1190,3903,1183,860,2150,2810,114,1264,1860,2469,3975,579,3126,2069,2197,3385,986,2370,3804,2863,1056,229,1697,1251,1978,928,1639,1169,905,2659,1964,2646,2309,4054,3721,2166,321,2749,235,133,2282,196,2695,950,19,2034,2867,2982,4085,2807,653,11,855,1382,566,3253,587,2344,2037,607,515,503,3773,1154,1991,258,281,3886,1413,2064,1138,136,721,1144,3442,3676,590,3512,2566,589,568,3036,1795,3564,1339,3686,2415,3076,1024,3787,934,3206,1907,1684,2552,2758,3984,832,323,3195,3141,367,61,2343,1339,208,473,505,4062,3355,3275,3048,960,289,1305,692,3982,688,2466,1652,1576,946,2750,3186,3371,1655,2086,2195,3882,2530,3814,1173,3988,3418,419,3995,2691,3033,2940,391,3332,516,2101,393,964,2721,2993,3786,1943,3001,2800,3040,3917,3477,92,3095,112,3461,1981,2050,3328,1801,1863,3997,149,1488,590,2003,3621,3674,1100,1359,723,3218,3562,1602,784,3064,331,4067,3593,377,1353,3870,1046,3690,2324,617,2515,1348,3438,1103,1441,3008,879,3983,3405,905,3121,2794,3210,369,615,2594,1959,1968,1324,3820,618,2305,1992,1280,2187,2970,478,1899,4010,2835,853,3951,1793,1530,956,594,3548,3646,3979,3067,2737,3263,884,615,3721,1048,2116,2842,3892,3179,2614,2517,3790,3229,3969,1230,2304,2575,3489,672,765,755,2789,197,1950,3574,3177,687,1522,3642,4041,373,2951,2046,2974,3413,1054,2473,3080,2113,3693,3541,3336,3321,749,1073,372,2112,2651,2098,3248,3545,2717,583,1562,1503,3470,2937,2835,1150,2184,3111,925,3351,3917,40,3201,857,1496,798,1449,2896,1404,2878,3915,1895,1863,1638,3541,4056,1317,2859,2491,3748,672,2889,753,767,2024,2960,3491,3831,387,1575,421,1530,3331,3496,2618,3555,3713,515,523,3459,1134,3582,2747,1164,1888,1959,2866,2816,566,1078,3695,1879,711,1723,3393,482,1805,4024,1054,3413,3665,663,2979,929,902,2072,1058,3063,1640,441,358,457,664,1757,1541,1264,2992,2969,1476,1774,2086,2432,3387,2254,3145,2276,3567,1970,28,1423,706,3108,647,2001,1695,3243,41,1487,2844,382,182,1844,2166,2730,1784,1439,86,2617,2546,3095,1148,836,2624,3985,2246,2116,3275,2016,1232,3970,3578,2762,3495,510,3238,1462,3836,1639,1021,1271,128,2825,1611,3500,1076,1233,3428,1385,687,2757,3561,3632,3494,2084,1412,1787,1009,2251,3111,221,747,190,685,2507,1834,2208,897,748,1199,3746,3370,1322,364,3274,426,3836,1768,3630,999,3535,2669,3802,1641,1576,2668,368,1872,3499,2908,448,1599,1068,2941,2690,3606,3452,1944,4012,3923,3806,1997,1415,3283,2275,309,501,3390,1437,724,3592,970,809,930,1198,3005,2763,3325,712,1653,1335,4053,1780,2628,303,2567,248,312,85,1110,3398,19,3755,1350,1376,3579,357,1366,2409,3861,1780,3211,1195,67,1760,925,2965,1233,3397,3823,2523,2305,2721,3496,1387,1127,2809,1707,2099,3045,3422,466,2486,1999,3836,307,2477,1256,3421,132,2744,3504,1912,490,2452,784,1077,2005,706,1428,4077,952,408,3883,3412,749,1727,1039,3425,2328,3416,2408,3675,3389,643,2451,652,114,3372,1866,2441,2751,988,373,3758,1759,3543,3981,3653,3757,2024,3207,1321,622,400,1202,2855,2083,1898,2332,1653,1105,2085,513,2513,2334,3106,3956,1027,3489,2219,3417,1537,354,3512,1841,3175,808,3154,553,310,3029,1711,1628,1919,4033,2857,3878,1420,2255,924,1305,2299,1266,53,3542,3775,3419,1101,1697,2510,2421,904,3268,2094,3702,853,3757,3548,1814,270,2304,434,485,2230,1202,2953,1825,3316,1576,680,2803,1927,922,3741,1970,185,1553,638,2314,2347,3006,225,4033,742,3965,787,3293,390,3077,3268,1474,3831,3496,2536,4048,839,1960,2840,1239,1716,3450,2710,1577,774,2168,3278,563,679,3071,536,3103,3732,3730,803,3552,2772,1112,2528,1627,3884,4090,868,1490,150,1506,927,3762,3858,2556,3150,3591,523,1727,1738,3001,1338,2598,1193,3030,4032,1058,209,426,4020,3142,3203,2984,3963,91,3020,1703,213,793,3840,107,4002,1405,3009,1904,2603,2725,4078,107,1497,983,3882,3571,708,3764,455,1117,2049,23,2263,344,2393,2373,1942,4081,1104,2399,3312,1728,498,1987,353,3871,1478,1076,3648,1800,2840,1094,1355,4036,3902,1269,1125,3911,1527,1561,2483,2858,2693,4005,900,764,1791,3006,1834,3065,3084,2832,3257,3653,13,1803,4054,2410,3367,1280,408,2928,2715,887,2718,1240,3036,1432,1791,2942,1118,2681,1972,366,2720,4030,3901,1518,995,3158,2863,648,3587,612,2740,2254,1852,1764,827,1489,955,2003,1368,2136,99,1266,3905,204,2388,3079,1110,1836,760,207,3104,1057,3405,1665,3587,423,248,1470,62,3684,3046,2331,954,1634,1389,230,3503,1945,1360,3312,3186,1535,3273,2713,3520,1807,3573,1104,3818,2557,1636,7,3479,1265,2344,550,3949,2597,1649,1637,1476,3298,3926,4028,3322,3377,542,3835,1761,1499,3399,3789,1753,1445,1951,740,1274,2993,1967,2357,615,1672,1810,3028,3097,423,2013,258,3560,1714,1233,616,3687,609,1027,2074,437,3183,2008,2239,1279,4095,369,478,627,441,1089,3690,850,2375,1707,2629,2874,2472,1637,1683,3106,3285,3044,2136,606,3777,640,216,365,1839,2936,516,2112,1444,3644,3762,3255,468,3908,1797,1725,3534,1046,4047,83,844,2365,2215,2848,3769,3102,3412,404,2490,581,458,344,3275,2965,2300,2374,705,3508,525,3919,3695,3883,2005,835,2269,1033,566,856,2743,2532,3068,1658,823,184,3377,2324,3493,4021,3901,4078,1491,3880,1406,579,293,1667,3540,2982,734,2849,1113,3241,3820,3575,22,1509,2370,569,3739,494,243,3301,3130,1144,2204,956,2275,2863,1313,2969,3702,2506,231,1480,1489,3289,775,4019,1309,2215,425,3860,1313,1649,120,1276,1546,3660,1583,1410,736,984,309,1349,2451,1408,2449,471,3694,3028,58,3044,3748,1420,1708,1764,2895,2469,118,408,1709,180,3924,890,2748,391,1902,1047,2836,2117,2311,804,3183,1673,1221,1305,545,1492,2624,2209,3155,3529,258,1552,3198,3159,1853,3898,1650,3097,122,2986,720,913,40,3388,3409,3578,3325,497,1765,425,1446,3276,1222,367,1304,3361,2510,197,1033,37,1382,1931,921,1808,3155,3901,3450,1943,1458,633,1904,3593,1834,2473,1769,3047,2074,3447,630,810,2110,1803,3015,3035,1184,637,2846,1878,1309,2080,2498,406,1199,2088,2287,408,2422,1011,1678,514,1219,2593,2858,1316,128,920,1074,2342,3895,268,637,1295,26,1943,1720,3037,1808,2386,941,3745,246,2435,3642,2918,71,2105,1684,2416,1496,2882,3582,2108,522,563,3938,3800,1280,2118,2829,2790,1049,1115,2351,2373,3565,2045,1641,2071,4019,2486,3352,1485,1813,1549,3138,3576,2729,2689,2106,4077,2612,3968,3513,1918,2044,2574,3428,3207,816,73,3180,2609,2564,2064,3216,3321,2879,3984,1475,2920,3254,3330,2592,1721,1350,981,668,790,3739,1913,2225,3966,3844,772,4063,1986,1241,1758,2379,2762,1218,1355,2636,3540,1673,2810,2083,3507,646,510,1567,1307,10,688,968,3289,1637,335,1562,837,2258,4032,4004,1056,1061,3666,2125,3795,2882,2287,3833,2216,1257,2176,166,320,905,3902,1969,1539,1157,2897,3836,1298,2861,715,576,3701,1318,108,1193,1553,1708,2706,3519,390,4047,822,2748,2471,384,1317,3620,135,3629,1535,3979,2692,1734,1574,892,808,3902,1862,3024,1698,848,1760,1016,1436,996,2976,3889,2032,264,3861,2098,1432,400,3157,266,160,2440,1211,2533,2502,1498,2154,1755,3834,1069,985,1684,468,2765,2210,3332,1584,1998,1560,705,615,2859,2253,228,1505,1228,1552,1081,3589,3041,1403,3807,3080,3105,2358,1344,2464,2527,3842,490,2203,1744,87,3906,967,3813,45,1684,1728,647,473,792,193,611,1342,2142,2466,2268,2274,3989,2391,913,1349,3967,2819,345,2197,699,646,1725,723,3094,1559,1109,1100,2710,1084,906,2766,3052,2233,3113,1605,1703,3829,883,1482,2493,2394,410,3795,3246,628,3216,3713,211,2382,3593,2879,1516,2367,3516,3235,3427,2184,1754,3640,2419,2408,173,2893,3261,2777,3372,2996,2574,3568,1165,2618,902,363,2300,1608,742,1075,2830,622,2844,157,3295,94,1288,619,2498,2104,1359,440,1976,3036,3938,805,1706,3174,1381,2264,261,1934,1720,1250,1419,1936,1695,1266,588,3258,3003,2496,1981,1890,4089,576,632,57,1680,1919,644,3428,1539,3461,734,3323,3122,1407,3242,2772,3504,813,271,2277,2281,1141,1756,1627,183,1211,3579,3565,3255,2941,673,2315,2687,4059,2850,3544,1293,2439,3480,2753,1123,3666,2414,2344,1719,2625,1258,1307,2959,3215,2345,4045,1542,3710,3322,3296,1500,3896,180,3718,1358,1439,2438,545,383,3258,1786,1918,2094,639,538,1075,1184,3772,1787,1838,3167,647,689,807,3265,1285,1637,2715,1958,1581,663,268,649,2205,2205,2061,599,1816,649,3140,1445,1464,1739,2390,2236,3736,1637,104,488,1204,565,3938,942,2721,3066,2701,481,455,1548,1225,2478,285,2316,1719,1072,246,3875,2082,3130,3772,3713,2705,171,1776,2487,2057,2487,2809,1021,1680,835,2729,2518,815,724,2136,3297,507,1850,4052,3285,804,3820,3340,26,3074,1018,3834,790,1582,1875,2297,2066,3106,1119,3267,0,1691,2096,3566,726,500,3971,3836,2016,11,2672,1752,2204,2344,1225,2818,1486,2619,3060,778,3460,1737,2413,1151,1114,3691,253,264,3365,4072,2274,3052,2806,3174,1883,2800,442,3002,4017,245,2323,3875,2468,636,1354,1329,658,3332,1496,975,817,990,2317,435,1424,2487,104,1005,3787,3133,354,1297,2758,3608,3677,3293,2626,203,4090,3118,168,1745,1191,2559,777,363,3354,788,953,3012,2666,1346,1076,2855,851,1471,1396,1671,2591,3168,2244,1012,2203,1176,1002,2871,648,556,2869,1754,3622,3227,2274,1067,1996,3823,1544,680,2680,3565,288,1472,4079,721,1740,1552,117,3832,331,2639,1244,1587,1472,1902,732,932,1084,3602,721,1177,2600,921,1796,1930,2145,3158,225,2414,3282,1699,1776,1620,901,314,3683,3503,461,2536,3175,2462,2443,3080,2169,1050,3176,95,2010,562,1253,3091,2487,1276,799,1990,947,293,2699,3407,940,3381,132,1507,242,1937,492,537,2998,3450,3660,1792,3936,1990,1763,3497,2408,1107,3707,2147,3421,2538,727,793,1236,2939,428,3400,3110,1494,3303,306,3061,655,1535,3972,3787,3354,1099,1818,1996,2844,3968,325,2105,2534,525,3862,763,1275,4056,3389,602,1598,3717,2898,3884,3438,2268,1603,3095,2953,1459,1541,218,1569,2177,3135,1504,2132,3577,2749,1519,3419,2794,204,1311,3309,3547,4026,2435,2291,1620,1418,1203,2121,1989,141,3388,3688,2897,1466,301,2201,2947,2496,3830,2766,1268,3854,2263,3014,271,1541,822,3584,1767,711,1981,3409,3872,3130,2589,3999,463,1739,3051,3487,3346,3179,102,3542,3399,1780,3555,3774,3603,3397,2737,2240,491,3457,3890,3765,3644,2618,4046,3956,3769,1682,3241,1798,2276,171,1777,928,3915,2263,2683,1816,1074,1416,117,1619,258,3570,28,3110,1272,3502,2859,3937,3956,2061,3373,2593,1802,1907,2903,3965,2893,1395,494,1822,64,2411,1223,2371,638,1390,1152,3935,2440,3395,2571,1431,1556,769,710,2286,3068,324,1194,355,1148,1263,3350,2206,2086,331,3892,866,1527,1731,1393,490,3264,1030,1569,2046,285,2389,3086,1844,598,2139,1219,1905,2047,2910,2151,430,1367,24,3307,397,2464,2080,1266,3446,1521,3865,2889,1381,3436,2705,3735,2339,3067,2425,3875,3746,2132,453,2836,3846,904,3840,829,748,3673,3430,71,3529,2426,2822,2269,3525,932,669,103,3603,3631,1430,2115,2183,3640,93,212,3912,2706,1430,2198,1493,1582,2343,2616,2210,1596,3682,1023,1488,909,540,3320,2619,13,1441,1658,2714,2125,3001,1149,3658,3578,2647,2261,1627,3565,567,2556,2133,3807,2534,466,603,1789,474,1303,3271,2957,788,3550,3363,1994,419,2757,2853,1430,2721,18,896,3359,2540,3870,1197,1154,3221,1810,2384,611,4095,1804,3912,3452,4058,2748,99,2953,2079,3308,1073,3391,3179,3887,2944,4013,892,1846,4052,732,2854,2084,3486,3105,2147,3177,2678,382,538,1838,2066,2776,344,3534,1244,498,2601,1299,1794,298,561,3322,3741,3521,789,1910,1745,503,2905,78,1913,86,1231,754,466,4095,395,3382,280,3909,2283,2566,2621,2089,1212,1131,1711,1420,1676,301,549,2386,2505,2248,2357,552,3976,3328,2336,3468,3316,3092,1273,3067,3573,2418,2831,791,446,2102,3436,4049,3415,1033,2669,1506,480,3945,1606,1015,3547,3747,2771,4006,2369,289,2661,3425,929,131,854,357,3194,690,4001,515,333,1442,847,2987,481,3102,4009,3996,2697,3851,3225,1776,1276,2361,585,1532,1342,2144,1941,996,203,1699,1208,2937,1452,1730,2144,2140,1636,2808,2634,2403,2333,1213,3563,41,2007,933,703,1181,3425,2301,3107,3818,2256,2132,3105,643,2399,3309,1124,3016,3416,702,3609,2905,1317,1738,1248,707,3711,2751,1749,1000,589,96,3690,3077,2325,1192,1165,27,546,1408,1591,761,3116,743,1200,367,1331,827,529,352,1528,3808,1803,1450,710,3282,801,3123,2484,3909,81,4022,2314,3276,41,3537,1951,259,744,1250,3498,1886,2694,3904,4,644,575,748,3520,4083,1507,1366,2014,1511,2973,790,2135,1329,2842,2166,1848,1163,2946,3029,1036,2000,2,2139,716,117,2169,2681,1769,3107,3712,1341,3149,511,3685,2450,4003,3594,1299,1772,2715,265,624,3494,3962,780,3823,3302,1521,102,69,342,62,3084,1602,59,1920,497,3096,362,3805,1500,992,3204,4040,1426,813,476,199,584,2960,1622,3946,79,1919,2324,1584,1493,1623,481,2370,1584,1754,2187,2200,2447,2927,1689,1919,1925,2582,310,2867,1186,1181,2188,2348,2874,3964,3348,319,942,353,587,814,2398,1134,2808,1291,3014,1887,1826,3369,149,2762,2139,81,1510,1849,390,2955,189,368,2013,3533,1902,3731,249,1031,1337,656,3910,2216,1999,190,3266,1546,297,4010,2472,2973,3146,1354,2719,3665,1019,2915,1956,1508,3133,849,1905,469,923,3353,1967,1206,3528,4065,1786,3439,3529,1931,2224,3055,604,784,2288,962,1224,417,3707,2736,398,1704,1345,2734,1247,790,3053,192,3788,2216,3832,1535,1472,2012,2207,1084,1406,2332,3196,1528,1721,3155,2035,3168,1130,2347,503,3652,3570,2769,3165,2534,1562,3801,3026,3507,2900,3375,3897,1065,455,3298,412,2720,1521,3558,2700,3672,1134,3566,199,457,4028,1319,3373,161,1118,2019,3132,1954,3047,1474,1181,3960,1191,3903,3734,739,53,2752,2074,2116,1525,2091,3503,2185,582,1949,2053,1537,892,3670,26,3933,3717,2448,3994,300,282,2126,2904,2696,3859,4061,2935,1339,1099,2222,789,450,1213,3129,2458,1077,2416,4075,452,2169,918,2386,2726,449,1668,3197,3303,1427,859,1415,2416,1397,2525,1890,856,825,3532,1349,556,1037,2544,3494,207,1024,2161,1459,1732,3117,662,3870,3581,2592,631,607,3117,2148,1923,2748,2979,19,1634,3729,2284,2307,3772,3528,2113,1679,873,2312,376,2356,2966,2058,1068,2188,3075,1302,652,3737,3765,3162,552,169,1664,3767,1083,3814,1204,2203,3624,3556,2773,1045,3526,1100,2695,1155,2552,970,2075,2745,2289,3569,2392,177,3246,3785,2540,2028,36,520,1417,483,2433,2726,1428,3117,3929,172,2649,965,2368,4094,103,3386,3014,2374,615,2802,529,1803,17,2853,1630,3257,1010,1905,2761,780,3985,2686,1828,672,1407,2947,2553,3958,4044,2165,3311,677,1524,3783,238,1725,1541,145,1298,3602,1873,2593,2698,305,3593,666,2180,872,1625,114,2277,3399,3425,1809,764,1519,1511,2672,1041,1894,1736,614,570,3159,951,2210,3813,4059,3780,2690,2541,3953,793,1350,2186,531,1965,1871,2132,3509,4047,182,3875,1967,1735,2920,828,1572,3697,3996,428,3630,3465,2404,1111,2211,1116,1042,2638,3815,3220,2084,1864,1392,871,525,2039,619,3560,1301,315,1263,3261,3552,2336,30,1609,2139,2493,3996,2872,3051,2839,1372,4024,3394,788,1366,2656,2951,3512,2325,596,2963,857,1199,1445,2136,851,2487,682,1549,3500,2651,1366,1371,2691,1465,161,2845,3413,3138,3110,1432,209,2637,3529,3817,3609,3109,2830,925,2415,903,1338,1947,1948,854,1092,4035,280,3303,3226,1274,3721,3003,873,3316,2231,3911,1620,1419,198,348,2925,258,2215,1593,2298,2971,415,2979,3212,3904,767,663,1669,1719,192,803,1407,2058,3741,2367,4049,1840,2024,2258,2619,116,175,1981,1162,1171,3813,3149,2233,1987,3620,1539,3491,967,2806,3914,3156,2908,3656,1032,465,2001,1404,3781,4063,1245,1979,720,441,3444,854,739,1586,867,592,117,2459,2656,1327,450,11,1106,216,3608,2176,621,3516,1224,2135,513,1275,349,47,3686,2278,1260,3058,434,977,2259,2173,1753,3710,965,507,750,1877,546,3553,2854,1778,2943,3547,361,3045,817,2556,1924,211,2867,801,853,3204,3507,1753,2941,2291,71,1464,1662,1828,2611,223,2109,701,1391,706,3001,1177,1932,1780,4029,1913,381,1925,2723,3294,1268,1716,2697,3121,4083,1489,1208,2205,2251,3261,3490,2027,1272,2938,939,801,2938,1534,2204,2582,2137,2011,1041,1791,1057,609,1012,2649,3540,3451,1031,2240,268,241,1351,4012,3671,1574,2050,1979,1609,2974,1214,1330,3738,3596,2962,3559,3825,413,2234,1006,2982,2807,3398,66,3708,2353,3533,2296,3763,4095,1872,1823,3720,873,871,1695,3993,1042,2003,860,2881,441,2394,3187,414,405,884,2891,3363,2018,1661,3254,832,761,2623,2776,174,608,2216,3642,324,3485,3123,1078,56,4084,3922,3636,1125,3559,2114,883,545,985,2971,2925,3542,1834,1905,1030,2997,1629,2080,3943,3479,2213,1674,1929,2369,832,515,2713,2237,1640,716,195,1762,219,3121,513,2824,102,97,2411,95,669,3632,1212,3836,2413,2253,4046,3740,3152,1763,88,2349,3462,2322,1336,673,4092,2568,846,1170,2537,699,3623,1688,1932,1545,3568,3425,255,2481,1377,2610,728,1423,1262,3239,2374,2877,401,3976,111,1473,2695,2324,2728,1096,1396,3200,2935,1577,898,3104,2518,2428,522,2014,904,3093]> : tensor<4096xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<12>, tensor<4096xi64>) -> (!FHE.eint<12>) - return %1: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 2050 - - inputs: - - scalar: 3703 - outputs: - - scalar: 2139 - - inputs: - - scalar: 4095 - outputs: - - scalar: 3093 ---- -description: identity_apply_lookup_table_13bits -program: | - func.func @main(%arg0: !FHE.eint<13>) -> !FHE.eint<13> { - %tlu = arith.constant dense<[6713,6701,6467,2245,2331,2266,5516,3392,6147,7101,5547,1632,6696,7188,1806,3608,2883,5408,3401,1350,4163,7994,3484,5635,6607,7392,5542,4716,5980,5109,6898,3781,1,1169,6334,431,6408,7497,436,6029,7024,4649,2072,6719,1988,5191,1093,7783,2708,3907,7617,7369,4442,1857,2216,4464,4454,2990,405,7500,6214,6560,4522,1876,3788,3414,3092,4205,6049,8096,777,3259,612,4095,7299,745,3647,6206,6536,2332,5363,7181,5591,5959,4478,5631,2675,2444,6018,1764,109,6733,3351,7038,6375,1211,1273,2166,2249,231,6014,1871,11,2057,7998,6721,218,1419,7007,7984,7482,6219,4225,5241,6088,2969,2040,6430,7585,3308,1111,4884,4913,5000,4416,6050,1694,5990,7636,4261,5910,2621,6442,5424,4054,4201,6164,6059,3463,2753,1144,429,4638,7820,1477,5944,6293,6341,3088,1579,1406,535,1192,8190,7589,5487,1968,2855,5736,6950,3499,7162,7856,7040,6281,764,1935,3508,1772,5173,4862,6532,1692,3569,7203,3604,3334,5673,927,1241,6992,5060,2286,3469,6049,5265,111,1601,601,1583,6486,4650,2198,6097,1859,1171,6958,3357,758,5444,1492,4461,2974,1708,1487,7073,8188,7940,2003,2981,2100,1344,1553,4753,6129,1447,4712,5394,7557,8034,3971,1338,3584,6775,6691,2329,2388,3677,4545,3982,7724,742,260,7878,5777,2269,2493,5944,8065,2320,3266,2638,3434,689,24,6981,6009,4501,1544,712,5409,4165,1632,6133,4352,4907,2419,262,4494,5285,1372,7632,4405,1053,8180,4050,4957,7800,2170,741,131,7146,3146,5417,3495,96,416,7324,2318,3551,2914,7998,5949,7525,5347,1859,2957,8082,2385,3389,3362,1634,6483,1522,452,6731,2965,6275,6257,4130,6355,858,1736,6633,3534,2979,2764,3537,106,6103,465,1248,4273,4619,5736,322,7920,790,6340,3369,5930,5007,2235,5436,7505,7015,205,7775,3939,7036,8049,5635,5626,941,7833,4403,1948,2386,2156,6879,919,5742,3338,1933,3917,5645,6099,8001,3075,1164,7176,2035,7946,2941,4870,2868,1439,887,3371,6111,661,269,7495,1325,540,5458,8093,1341,4506,306,1551,8110,6977,1133,5811,6937,5650,7157,2599,7856,7981,5014,4635,7627,7212,2726,7409,6144,5769,534,3909,5757,6039,6982,3926,7127,3905,1975,6327,7066,4767,6035,957,4377,2024,2887,7691,6523,1209,4663,2833,1974,5224,3328,5899,7716,2787,1229,2812,4360,319,6118,3466,4825,5865,5129,6774,84,4356,443,3111,6864,6610,7918,2766,7383,2798,6452,6499,2171,560,1310,1027,2058,6432,1173,4009,2938,7278,1377,6802,4321,3251,3276,5311,564,3522,1881,2538,2526,5811,2396,7337,6929,910,5947,7996,13,2657,3862,3316,7101,7512,6558,906,4739,3231,1009,7200,8077,5297,7719,1408,5870,1560,340,4651,6505,730,5339,3031,7258,5577,3937,1370,5545,7151,3231,3624,4319,1288,4529,3748,5457,4958,7553,4282,6429,4341,1232,5204,5768,7799,2340,7005,1723,235,4204,1295,2061,3737,5886,5349,1744,2866,8075,302,130,3233,4572,4698,7849,5377,1434,3528,4435,411,7929,5731,7318,2777,3288,364,5972,1956,7413,7064,6686,1676,5940,7415,6890,5688,4316,7922,4164,8129,69,1196,5461,2810,1649,5016,5256,1784,492,6266,3440,5498,414,288,1365,4035,6329,3957,8020,5457,7294,3217,7499,4498,6009,2723,4922,6741,6637,4395,6591,7522,371,2145,969,2203,8151,4031,5097,5683,7739,5796,688,225,4491,4333,7752,5867,1518,8029,4513,7855,2190,8158,1390,2719,5335,3903,5803,3605,5506,666,7396,2542,6153,2433,1976,835,4945,7425,5232,2334,7714,993,7087,8112,2058,1273,3718,517,2346,198,7273,1702,2565,5436,2718,4667,8,5311,7377,375,1622,6275,4879,4710,2414,2548,3934,4102,5725,7190,2058,4764,1927,5467,1520,5203,3586,6515,3399,5580,4275,2323,6387,3678,5918,4222,1307,5903,47,2583,954,4958,2003,1160,1677,5414,678,6402,810,3123,2116,4902,6853,3643,1983,437,5182,1390,1650,1441,88,6764,3292,3797,6397,6316,5774,7410,2420,2756,1385,2129,5839,3737,959,4260,5516,550,7355,6621,7710,4450,3539,7146,8019,5663,5097,4964,3305,1867,6151,1093,333,1982,3554,430,5664,5152,1564,12,5213,7155,7242,7146,7223,6985,7155,2353,1531,5139,3286,2455,2590,5052,4532,3853,1522,5919,4282,3324,5776,2834,8065,2063,5792,78,8009,774,7923,7023,2243,3142,8054,7375,3805,5973,3251,8010,6330,5069,4955,7066,1562,7913,6724,7995,925,7856,2396,3389,3772,3983,8046,4601,4187,7592,2208,6829,113,4494,2884,2393,1504,3340,7852,3945,1339,5546,7103,820,7565,6580,1202,120,5042,6001,8133,6615,6885,3700,7134,7644,5302,7125,1875,2904,2425,1711,4695,7085,7230,2314,6750,5216,2005,7016,1078,862,5766,1945,6661,695,3807,3119,1518,411,3417,6561,731,8080,1680,6479,7902,7586,2491,3141,7240,1680,6374,1843,7655,1628,7813,0,4819,535,5628,7326,4852,4718,806,2728,4834,5713,2687,911,2122,7442,5608,1307,2355,892,426,1510,718,1839,3409,252,7543,3241,4332,899,3568,3189,1945,4312,2924,5087,3287,2045,2383,2069,7228,7197,6678,4120,2115,5769,4646,5952,6479,4588,7145,142,2629,7249,698,4457,4675,240,2259,2130,363,4785,1649,4481,1671,4616,3615,636,7438,4302,3476,2194,5871,1187,4908,1000,2407,5791,7361,6874,3321,6552,1318,4137,6879,1208,6731,2544,6715,7971,4427,2801,7727,5553,6897,3442,6383,6002,5485,2333,5092,4914,6265,7050,4650,3610,5116,1227,4793,1129,3527,2941,372,1760,7387,2311,4535,7380,401,74,988,710,5688,2460,2303,1680,4157,1860,2245,4568,3756,2358,1008,1952,7790,3788,6583,1473,751,6412,5529,5696,6469,4172,5022,4776,8081,3484,500,6428,11,2653,5697,3176,5504,4204,690,762,2459,2232,3068,6223,4971,3764,6416,346,4685,3609,3049,5015,6460,3015,7571,6630,1601,6251,6590,2216,324,6287,4117,4371,7836,3809,650,5144,4249,5301,7687,5524,1891,5335,2750,2494,3022,3215,1668,5483,1636,7390,1120,4967,490,2645,6771,2945,690,3095,3136,4366,4571,3572,5325,3365,6708,7522,716,5506,4210,2401,5623,1230,7057,6121,3372,1735,7195,5527,3171,751,4673,3143,6201,1527,6987,6329,4327,266,2056,2830,2013,607,5914,1843,4521,5072,3113,6903,6397,813,2399,4762,3829,7269,2815,3013,589,6921,3349,4098,2287,416,1604,4220,1960,6918,4289,4405,7542,2407,7220,5694,7402,5951,7543,3276,826,7597,3926,1000,5708,5392,3395,3286,4863,1816,2181,3796,765,1802,1128,1212,345,3098,1689,1246,2329,6725,7451,1216,7969,5890,1481,2254,3517,3879,1431,2027,2484,1221,34,5599,1922,5476,3790,2843,4763,6336,3413,6122,1272,2789,7953,840,3208,4909,6925,5652,7792,3477,3415,4225,6054,4846,824,2635,4760,2039,7005,5535,5781,5852,6860,3804,7656,6465,6751,6070,4746,2780,2096,8042,3045,2837,1739,7667,132,6140,4582,3195,6252,1230,6581,6627,3576,3767,999,4522,5880,2655,3627,5448,1787,5014,6695,8104,34,4387,6644,5092,5556,4319,2814,5819,3492,6705,4626,7605,7565,6454,246,191,1721,1071,8075,2795,6386,6101,1728,2942,2682,5801,2705,7313,3837,6561,3112,227,4515,3362,2907,6627,3187,3616,7832,3707,6153,2651,4013,7066,1549,1188,3370,7932,1304,4912,1331,5084,3568,504,7651,2207,672,1196,2650,3208,5137,1647,6806,413,5888,3566,2566,207,149,4690,7107,3189,7283,6679,2362,2187,3126,3392,228,1048,8132,3113,290,2242,6280,7075,8170,4740,4291,6564,5698,2956,6975,6489,5756,5912,7713,1967,6576,300,6115,4920,4835,6537,4271,900,3403,1384,1050,777,5977,123,1865,3484,4185,3821,2372,4638,3631,1441,117,7773,5853,7636,6453,6904,7927,4432,7007,7590,4289,1345,1517,5790,2857,6143,8180,6309,6442,3585,4798,4101,4750,6281,6101,7747,2078,5783,337,4234,559,1021,1463,4784,6534,7494,2069,2467,2283,1307,912,5926,5284,7431,1038,549,1988,4383,4680,4515,327,4183,314,1976,3651,875,1489,4968,4988,4405,8091,6436,4068,7377,5793,5032,6509,5544,723,287,6002,7766,4611,3436,512,2848,6021,4328,2823,2245,6287,4717,984,3818,3659,960,6394,1313,418,6688,3390,1838,184,3394,4408,2079,1616,198,5642,1814,6326,2190,4259,4276,6723,1642,7984,4531,3302,7018,6714,470,7341,4653,4854,741,6009,4560,1889,5780,510,1959,7778,6314,5565,2870,7008,5729,1521,5936,4785,991,6485,7296,6678,6719,6993,4032,1317,3708,557,4598,6191,5128,2038,4528,6185,2977,3319,4181,3173,1632,3536,17,6682,7941,939,7062,5828,5432,1609,7381,6955,917,5439,7096,2713,1935,6049,3186,1496,5317,7486,710,4791,1165,2011,5388,5250,2644,7230,3830,4864,2067,6819,6998,1555,4857,1659,4481,7710,1527,5869,6115,1980,7372,8051,6387,1727,1049,5937,7697,5456,6415,5110,3865,79,3897,2047,6056,6427,7434,3336,1777,1752,510,3732,4332,3791,4318,7347,5977,2532,4664,3838,3721,2926,2911,4259,6601,7561,7952,7271,2829,8161,880,4648,6497,5743,4533,2155,8109,7059,3962,6796,7177,2089,2320,4131,6469,3045,2977,3619,1477,474,4189,5425,6432,2811,2478,1356,6563,3691,813,2820,7035,7658,4869,6057,1369,5977,6326,6197,6147,3628,3611,3417,2348,433,1705,978,970,8123,5722,84,7904,4108,5457,2653,2377,8133,194,2753,3768,7267,5907,231,4244,4735,3365,2038,267,7826,6775,3874,2102,1689,2642,362,5803,8109,4016,5769,7924,7707,5399,1793,6070,8083,3450,774,28,3164,7645,1119,3920,6449,4453,3695,5735,2148,7339,5151,5185,2298,7064,6178,2429,100,5418,203,5339,2289,5599,7848,3328,6851,7490,5186,5421,4305,780,5108,5479,2537,7511,2310,86,4924,5759,2099,2616,5326,2989,2368,2172,8084,3364,96,4836,3602,946,6051,7961,1886,6623,510,7867,6141,4623,5848,4886,8002,6167,161,3445,8042,2420,4552,2665,7599,7483,3437,5560,6607,2067,6222,3366,5157,2851,3339,870,2716,227,7978,5343,3757,3281,6697,6478,3624,1138,2979,3262,1445,7903,2615,2850,2798,6431,6611,7571,7481,4709,7191,588,4334,5200,2913,1975,3614,2139,3576,6374,2435,4950,7553,5646,7067,3712,3819,7177,6435,6990,7712,5818,7834,4364,4916,953,5293,8014,3091,6749,2035,5494,4987,1873,70,6383,4257,7373,4310,7467,5888,1081,4758,5358,782,868,7672,1605,1290,4163,4,6324,2108,4404,959,5854,4485,5643,4156,5261,652,2951,5432,1413,3897,906,1438,5507,1762,6522,5437,5761,3883,5520,1959,8081,2612,3054,4532,6778,4976,5639,2194,7573,7830,3870,1348,4959,7555,4785,5872,4233,1161,6818,7910,5367,3934,7244,6576,8113,2184,7039,3063,4334,24,1188,5239,3337,6,1800,1784,5201,6473,5049,3962,1153,3748,7168,2618,2345,2766,2614,3547,3610,5794,5317,3198,7,754,4306,6392,2959,1181,4607,7398,3280,2877,4658,6915,5809,4549,485,602,674,2401,7384,4533,4394,5794,4298,8002,4673,5056,7083,4601,5387,8054,1863,6563,3729,3944,4552,3109,288,5313,1641,516,7918,209,6620,4539,2911,209,4260,1472,2285,6227,1305,2077,6399,4359,1626,2438,5279,4539,3053,4163,3332,769,2636,7155,648,3903,5409,4257,7543,4125,1949,3798,5951,1433,5213,2616,6339,3434,4443,7464,6900,108,4365,1114,1196,4632,7522,6320,6809,6844,5541,4599,2079,7695,2262,481,3211,6118,2022,3217,4380,3371,1663,7956,4460,7204,1288,6447,3845,6686,3772,8115,4271,3891,6658,6356,4952,3564,5005,4798,7507,3617,6950,988,5200,5395,1700,2319,2725,6262,4966,266,2793,1526,2355,8186,1171,7861,3497,6010,2026,2825,4045,4169,4765,4161,891,4469,4407,4179,2144,1442,570,7326,8117,804,7578,680,1152,3473,6970,1503,7127,6176,2065,4551,7431,374,5045,5776,3711,4970,2078,7454,502,5026,409,8018,1737,3026,3732,1209,4300,783,1749,682,678,5525,6283,7410,3397,7253,5238,2518,107,6618,3985,968,4881,661,7987,2306,7738,7151,7098,5680,3568,2601,5917,7897,3027,5984,5196,3633,687,2165,6694,1836,3665,4479,1693,7492,5014,5326,6308,2225,4560,79,1439,2961,6208,6671,2498,8029,7015,8109,2234,6946,6014,2125,4530,1147,4830,963,2401,2870,1140,5347,5435,3708,2451,1028,3275,1202,2981,4686,6319,1484,3942,4778,6961,5660,2644,3296,4971,1926,5756,1486,1776,7397,2488,2360,2733,770,6136,6068,8009,539,4975,861,5410,6021,7480,2328,6314,2605,7370,493,6668,1028,3830,3809,4196,5796,93,1702,1354,3626,803,1890,4666,2764,533,3654,479,6796,1322,3778,1971,1175,7064,3455,8010,5361,7883,54,7272,3509,5060,2274,4689,5700,7322,6696,4871,3202,2037,1122,3169,171,6612,4381,6892,1858,3534,4849,2931,1226,5324,6618,7982,6055,880,1333,4086,1038,1182,6083,1742,2026,4337,917,1956,4165,6568,1265,7788,7312,1790,3847,980,5779,3330,4412,1696,7779,4754,51,7727,1913,2621,6033,1858,694,4873,4778,6470,1045,2481,1325,3335,3541,4681,2159,6873,6034,1526,4540,3783,3022,4356,5233,6108,7379,2761,731,2708,4034,781,4541,6006,3296,2703,7802,2738,7221,8005,3788,7338,933,7813,4916,5744,5692,7995,7966,5255,7380,4947,7458,2586,5415,5067,3666,3729,7551,3776,3182,6845,5686,4740,2000,4074,5176,729,4833,412,4474,3438,5346,2961,5255,7339,7360,1329,2504,3540,4609,3813,6652,6811,4267,7482,1807,2996,5641,4888,5064,7020,89,6898,7139,6830,5595,1378,3117,4673,8118,1224,4815,3736,2173,4725,3080,2961,1657,295,4692,7174,5348,5422,3026,6810,1264,5711,7,1409,6428,1296,2205,8012,4449,6273,3570,2717,1198,4702,6097,6513,3461,5525,3973,1015,3672,2025,6543,7478,4071,6123,2920,4397,4695,3631,6613,5162,1174,2792,1056,1993,3432,1244,3643,3375,4973,3740,6794,4885,4811,3449,6547,8015,4233,2072,2353,2866,6580,3027,7438,6500,4383,1990,1381,4893,6372,5029,2684,2221,8156,80,6714,7429,4690,7857,209,1185,474,5079,3178,306,3577,4112,3669,1325,4524,2197,6575,6938,3118,5490,1515,4826,5380,4646,5453,1609,2374,291,3084,2693,991,3128,5916,1234,5054,729,3036,1251,5996,1039,351,6063,291,5627,4862,7900,607,6283,153,7698,3680,5180,4579,4186,1843,2938,478,4164,5035,6414,261,3040,6272,6318,4356,4925,7957,5883,5332,2610,383,5231,615,4110,1207,3781,5516,7792,7609,515,6941,6945,1840,7033,1701,4882,1225,6308,4720,67,4848,5253,8124,4671,200,6857,2449,5482,3942,5231,3543,8044,3060,1475,5735,3587,1771,3653,4780,6650,6603,4649,7102,4395,7035,2020,2127,862,3456,3728,502,2209,173,6699,4679,1105,3493,7337,5414,4131,5425,4305,527,6198,2602,4441,3400,4781,2989,2191,7102,5359,3194,6708,3435,3812,4387,6754,2156,1848,2945,7158,7907,4023,92,6683,1277,7039,5289,3314,514,2190,3352,5080,3562,1023,7187,1925,6243,123,2339,1953,2266,1228,7834,3950,7951,1448,3173,1039,8099,8021,1949,3222,7866,123,8109,742,4099,1625,3919,217,2755,7226,2285,5012,1977,5308,3820,4375,6787,1879,7009,6083,5769,2462,2447,4736,1487,4007,6426,7741,3544,7599,5437,6746,2674,4098,1225,2425,3746,4896,6604,1621,5698,700,29,1032,1108,2041,2784,1081,7324,7587,6400,2997,3822,5363,3786,5507,6254,5441,1433,5516,2620,6218,697,6640,3478,1901,7901,6730,7483,1080,1074,5231,7747,7927,288,1828,2505,3187,5345,5411,1513,4613,222,171,4193,7109,2332,7561,2149,5886,3947,829,3181,4190,1503,7225,3521,3218,4862,3255,3011,7045,2769,166,155,5866,7431,7415,5611,5867,1142,1723,872,5087,2809,2294,3296,4961,3817,730,7856,1694,4184,359,5676,698,4533,2897,3793,4652,6305,6968,6789,6574,6406,4327,2012,2196,6017,4817,2631,4644,3989,4456,3625,6313,8084,5950,2762,5639,4023,2877,72,2929,3029,7606,1463,3734,3343,1241,5546,5665,3811,6310,7029,1310,7020,5417,2381,6614,4771,5705,6508,4059,5883,2974,3340,6206,3726,482,2559,6114,6860,3433,4720,6497,5451,7416,7867,2011,566,5846,7012,2229,7146,3895,6594,3034,5186,2112,2383,6714,1940,6641,811,3801,8079,5784,3772,6659,3976,7533,6420,6979,5167,1582,7930,7998,3987,7904,2160,7853,7611,4540,5748,3770,1542,4176,2674,2111,4978,1479,1623,1428,2941,962,7481,3935,7706,5038,710,2026,2253,5936,2747,186,2610,2398,2150,5355,2616,3581,357,557,6960,4733,3297,1431,68,840,2832,2166,7937,5299,3757,1616,4390,6640,506,1284,6771,794,2796,75,6917,5492,7334,6635,3742,24,6091,7213,145,3557,709,5815,318,3162,409,3853,276,2173,516,6351,3065,8099,5434,3261,2088,8066,6087,330,1371,653,5516,1891,3659,1728,2468,4766,3206,5885,5087,1916,7280,2538,383,6646,2548,1511,897,3729,6697,3682,4737,7078,7504,908,7232,7092,4310,8096,4048,795,2165,6050,152,2274,642,798,5631,286,4933,319,6651,1904,6872,2950,461,401,5669,4562,7443,4418,6840,6551,4625,3424,3900,545,6123,6579,786,3498,5729,6088,4905,8140,6637,4225,5085,3001,1134,7165,1100,7232,6460,8097,5978,5675,6311,3384,1246,3479,1128,3862,6092,3138,3545,7866,1660,1168,4449,4052,7859,5051,7283,2638,2949,7903,4143,912,4992,559,5626,110,22,5586,2019,7196,4427,7590,2121,2945,2447,2659,5908,858,7803,172,1420,1263,1641,4778,7247,5940,1019,7877,4821,796,6438,2439,531,5510,2636,3209,1050,2196,7526,3620,3958,5279,4393,212,1680,1440,4571,2508,2207,6191,6387,4710,7716,2801,151,914,282,4403,3632,4607,4941,5237,5790,7287,3444,6223,7874,3915,6532,6087,465,4051,576,2204,740,6583,3175,1342,6382,1722,4559,6370,326,7725,2211,5685,392,7373,2447,3791,3826,6380,2557,7899,1939,448,842,6410,8117,6638,1504,8068,7363,680,8073,311,4992,803,6812,6494,2745,4177,2117,3809,4982,5355,4909,7429,4888,4847,469,4621,5631,7831,7074,349,971,5323,8149,475,5050,7678,685,6379,2242,5545,3591,6799,3456,1502,7599,4219,5162,2790,241,1356,4560,3229,3927,1863,5742,6980,543,2208,8067,1125,3470,6466,6160,3231,5246,2163,3095,7897,5403,4829,1303,844,6885,4904,999,6578,2316,2361,7843,2752,6494,2577,6130,1079,7452,7344,3913,1154,7971,778,5020,553,1410,2120,6252,7120,26,5330,2020,6804,4539,3562,3533,3085,5134,4090,480,7093,3211,5487,3888,6330,5384,5617,6636,7208,2096,2210,165,7011,4717,2856,7801,4618,3119,3963,535,2104,1702,4228,948,2878,1020,3063,6831,2842,7879,2292,6387,7258,6169,1321,20,3069,5279,7534,2807,182,2178,446,2871,3716,8158,3612,2317,25,2909,2161,3154,3606,3972,5554,6519,8059,2547,5229,7520,3623,1681,3650,3036,5432,1691,7246,5460,7328,631,3224,3403,2126,3086,8173,5868,1956,5512,1837,1525,6361,8049,5553,2135,1960,2313,3891,6760,7085,473,4158,1034,2548,6223,8168,423,6054,2428,5892,767,1697,5322,8057,1589,162,5442,3247,1853,3524,484,418,6133,4130,4370,1388,6661,1013,283,5267,6261,3152,611,5929,1446,4060,1675,7546,2287,7162,2361,1472,7570,5413,1574,3854,3787,4005,1802,2775,1159,5335,3160,7313,1808,120,2844,2418,3511,21,2770,1547,6360,6233,4442,6374,1006,5135,6010,6647,7973,609,7189,2125,1630,6228,5086,2715,1762,1629,1538,1419,7131,1314,6006,8059,5115,4417,3315,3145,4182,407,7512,323,2237,1633,3928,6015,3227,1395,2508,3070,1127,2138,1125,3700,1183,7974,3643,156,420,5075,2501,2991,5767,7951,546,4237,2136,1717,759,4463,171,6611,3129,2480,6539,7906,1112,4757,3953,470,3000,4577,1779,5159,5803,1888,6546,1148,5264,7173,2463,5140,283,7146,6357,2758,1815,6896,743,1719,3615,2100,1661,7048,824,2218,4852,4095,7907,1755,1763,5889,4729,1318,6626,7644,6628,6806,3977,3231,7022,3961,89,7426,7301,6879,3229,7016,472,2549,5040,6110,5460,205,440,2530,5785,7212,2949,7904,7785,7556,7971,6231,6634,8058,1026,5458,5898,6832,4912,3611,3100,4216,4566,6642,7781,3297,5751,3721,8046,1812,5099,1435,3056,483,5,4315,5558,3786,4325,1957,6049,496,4887,3571,6499,2097,2404,1086,2504,3445,6667,6392,3574,6477,2807,3085,1774,7061,4319,2448,6964,1406,4931,1325,3672,1515,2341,2678,2389,3797,1803,7722,2300,2863,3760,1037,1184,4807,3275,3303,4968,1986,1710,74,6065,5719,6495,7718,672,3119,7262,2496,8054,4917,3788,2965,3723,2332,3402,3351,6157,3328,525,1680,6684,2581,8012,421,6225,6373,6689,5422,4805,73,8023,4564,4443,5213,599,4508,4093,5410,2048,4883,1576,5019,5675,4962,6061,6350,5786,7794,1936,1562,4739,544,1223,1571,2743,5345,629,5493,6615,688,3171,6595,7590,5824,433,6583,7782,3112,6778,4807,7066,7058,652,1030,1249,648,3108,8153,4613,4059,5400,1362,7993,7931,4383,97,1715,2785,666,3423,3086,4108,1406,803,2840,7752,3191,6537,5300,7783,1355,8140,913,5987,864,896,2798,1291,6867,1723,7768,1931,766,1907,860,4945,2692,697,7446,7766,6326,5121,2797,4225,4232,5399,2927,3920,6502,7894,4043,7615,4332,1116,1955,2508,6467,7146,3532,3000,2306,2059,1224,3708,4033,2195,3044,7284,5022,6995,147,867,3956,5575,6538,1517,3449,6172,2851,1714,2927,4785,7090,1155,3401,6762,4178,3711,5558,1093,3994,7357,7095,1871,1917,6806,375,4365,3326,5841,43,4921,8098,3854,2570,835,328,5083,7233,7015,4786,492,2706,4791,3070,328,6144,6387,7500,3453,3199,7593,5835,2186,3116,618,6150,2262,4076,7623,1548,1876,553,5725,4452,387,376,2924,4871,1485,7481,6802,4540,5720,3065,7393,6242,2924,7637,6179,5724,241,3455,5734,236,7963,2654,5851,2881,2056,3957,2905,1309,7823,6403,435,6807,863,1910,5348,1045,4437,7106,4467,8159,3272,1733,6585,2611,3596,5732,5258,185,870,6331,7474,232,4299,3114,6911,4509,4453,3637,5544,428,7497,7593,1112,6955,2983,3553,7113,3590,4696,5783,5928,2565,3726,2044,5079,7824,7336,7450,4622,2507,6458,4815,1768,4367,7868,5779,6266,3410,5310,2367,2427,6735,6789,2375,583,918,2608,2899,2830,3842,5113,875,975,916,4490,6485,6506,7465,6705,1977,4017,7664,7581,3691,6468,676,2762,7488,7314,1068,4483,2608,4952,3228,6946,747,6984,3194,1336,805,3306,1759,6505,7026,8076,7467,3366,2736,6618,3844,6054,4303,5787,2293,5130,5226,1799,3766,3800,1953,6880,3385,1470,1787,216,7380,3806,7428,6197,5004,158,1326,20,5601,5690,1587,8069,1084,2387,2951,4526,4568,4489,5169,5905,866,6030,7362,4199,5513,2490,1435,4043,6203,6251,3631,6645,5935,5846,4512,1384,7657,5429,388,1565,1189,3114,5346,7407,4198,6933,7830,6966,2366,5521,2418,5123,786,4037,1065,7714,4745,6258,3443,5980,4896,5661,3296,6495,3323,5450,137,2453,317,6714,3767,99,6009,254,1884,5001,1456,3370,5468,3653,1860,529,4656,3312,7360,1332,889,2820,1200,7039,3976,2279,945,8024,4124,1081,3628,731,8043,7846,2116,6746,6296,6219,6444,281,1974,4148,215,6491,4400,831,3348,1555,6972,7028,7819,7386,1321,1065,7942,5729,2189,627,3202,4909,6600,3613,7509,5360,4575,7478,2615,7496,1458,2863,4408,870,2939,5972,5400,2012,4526,4335,1642,1166,149,4953,4052,1207,4348,1248,5716,4072,6433,1164,6241,4423,1673,7000,6798,2135,357,6021,5422,5353,4846,1668,4364,344,3153,5582,695,2126,4945,6494,1033,677,5377,6067,6592,7919,4082,2586,3467,1831,3241,2516,6297,4205,801,7666,6451,3830,1144,3349,2685,4662,3663,4449,7536,896,7947,2268,6945,4090,266,4493,6101,7178,3303,6951,1824,3428,964,163,5832,2391,1111,7373,6756,6738,8127,4270,738,4434,1044,3098,2460,1804,2833,2434,8180,1828,7114,7714,935,1034,6707,4226,4289,6039,2432,4476,1866,2555,7236,1428,7865,1285,3819,8036,2809,4846,7683,4461,7949,6750,1195,5378,6523,4001,7547,7579,5637,5683,5581,5029,7959,143,1610,3804,2467,1944,4702,1469,6453,2303,5996,87,3464,5021,1374,1123,1482,878,921,2437,493,645,5220,4766,1795,5496,2059,6329,7195,1000,7808,8155,3211,5284,4162,7061,969,6750,1850,2302,5915,3986,1141,6766,433,4986,825,5080,6696,7219,7574,626,5917,6581,5800,7981,6194,8117,6736,4327,523,2848,4712,4921,895,7835,8076,5454,6834,1980,6989,5054,436,7617,2236,7327,3184,4401,1737,4605,2281,2958,2255,523,1732,801,6125,6328,4856,4521,667,4530,6751,4241,5519,4518,6018,3925,1699,529,1447,4830,2751,6649,4216,305,5257,6169,1693,7408,2498,3696,1536,433,7385,7407,1797,2900,653,2853,6228,7787,1822,444,4409,2555,5762,3493,6580,5526,3165,3924,65,1065,376,6230,2998,1479,38,4496,6068,6748,179,4333,2135,540,3246,6281,7593,7835,3983,4378,8143,7154,494,7161,7822,2022,5776,669,6589,5074,7686,7672,3127,6721,2129,3712,5534,49,2036,318,7169,508,1995,7839,3616,1354,6531,5949,1880,2170,6540,2586,5892,3753,177,8142,3988,699,1066,3726,4406,6532,4155,1330,2775,4347,2420,3594,2418,267,341,2489,5058,1661,3646,7819,8063,1353,6326,7605,1208,4510,7659,1210,7080,6583,1644,1247,5976,5896,6096,4305,5085,3293,2319,5561,4985,6791,5144,2250,1333,5298,3656,1790,5544,586,4775,1763,7062,5631,5420,6064,3765,1920,1257,4049,456,7283,7702,2635,3293,4605,3177,7860,160,814,5523,243,373,3622,96,1253,5167,2548,5423,5833,5296,7580,3282,6506,7412,4757,4638,2657,4768,1735,2790,6243,4504,1601,3794,4918,701,3200,53,2644,6592,7221,6280,2638,7462,6098,7426,771,5558,4754,4910,1778,263,7928,3578,3334,6656,7624,5148,7184,7211,2271,1848,5744,4585,7003,329,1572,359,7847,2823,672,782,1422,383,1891,2655,2939,5644,6642,4731,6666,5540,8142,7685,2191,6261,4722,3917,6228,5864,5520,4176,1713,7643,1900,5146,5780,4521,2986,2734,1566,5025,1791,3258,1971,4040,7560,2075,1629,323,549,2872,5452,2,6092,7964,6003,207,7304,158,5722,5373,2078,7472,2149,40,6144,4971,5008,5904,341,3525,2666,4238,3275,3692,3705,2055,3613,5287,200,5040,5287,5519,2146,564,5585,7626,2374,615,6825,4746,847,2639,370,2285,6134,5267,7722,7085,4956,323,7529,6958,7382,5549,7707,5549,585,281,145,3898,4389,4164,7443,1721,132,1598,5489,617,6288,2897,384,6576,4383,6133,1833,8095,5956,1637,2972,6290,2911,6783,912,3910,7284,3950,5844,6690,3240,7886,5721,614,3511,6679,3926,342,2623,2223,2592,5751,5421,85,4475,492,394,4824,2890,7083,2537,5311,441,2668,6984,5019,3376,7992,2855,5610,5788,7822,4212,6174,5535,7550,64,8000,6283,1015,2341,5760,7799,7020,290,3963,1042,2848,422,6047,1419,7037,3190,7383,5330,6043,6945,7945,6021,2756,3582,5763,1133,5579,5644,5961,7307,3981,3063,4351,933,741,4724,7316,307,5321,6053,2533,4858,7705,4653,4867,531,2958,1203,1398,3929,7554,4170,5686,6535,708,6278,3140,6696,6240,1176,1935,4088,1074,8086,7011,6479,8150,5614,714,3250,2212,6290,622,1717,384,4421,7037,5700,2216,5292,5132,2053,7689,7964,3841,3195,6622,7447,1232,7695,6182,450,5471,7131,5730,5814,5182,1248,4498,5964,3483,7727,469,4697,8106,5339,7217,5247,6312,8176,827,5638,5417,4870,6373,5251,7891,5974,3201,6964,7766,3810,3133,2230,445,6818,5074,707,6402,6379,4715,4513,1408,1655,6097,7908,4887,762,1857,4417,4353,4599,2580,6220,1226,1887,5158,1477,6328,4885,7002,1213,5477,840,5512,4732,6044,5375,5221,3982,7935,5713,2482,4128,2296,1591,5848,5894,4085,3327,15,7401,1380,6927,7772,3801,3470,3862,3778,6106,5649,3564,6191,6802,4184,2824,6004,2710,7385,7497,3855,1759,2802,5100,7612,6957,5658,5007,6340,4479,4332,5245,7818,5972,3247,5038,2933,6447,3653,6702,794,3677,2549,3501,2567,4867,6041,6849,3356,847,8048,3655,7216,5375,3942,6855,2401,1798,2552,1362,4642,3237,1893,5731,744,4881,4203,4543,5526,6052,5138,585,7301,2183,7702,2321,7336,81,3164,7998,4312,2720,4987,688,1763,3996,1433,1693,156,5335,1528,5054,6729,1901,5705,3274,5397,6038,2684,5595,2564,5942,6375,4876,7361,3724,3220,5261,4852,1050,4801,4979,2032,6497,6661,6830,6090,3363,104,409,7215,5632,149,2695,6914,5764,1720,4465,890,3106,510,4150,1046,5327,2453,2029,7554,2895,4916,7447,1374,1197,2812,3901,246,5873,4882,4379,7378,6793,3525,6626,6266,4119,8007,6558,6503,4459,7305,1490,4372,7760,5363,3181,2667,6102,3985,7644,4572,6956,4497,1577,2825,2071,7373,4551,2047,7642,3482,7315,3395,2744,6408,7214,5371,5576,4738,7035,3589,6542,5281,5188,5366,737,360,6209,819,1835,7416,7022,1411,3433,3124,4568,4100,4634,6558,4260,3758,4987,969,7687,6556,2156,270,2745,5246,415,5928,6849,7893,405,7270,6623,3794,1020,7199,5857,2950,7068,4824,980,3356,4113,3111,1168,2106,5121,2921,2357,2885,4407,3896,3171,7588,3577,6815,616,8061,4673,5480,735,4320,2706,3304,1822,1806,4821,2271,1440,139,7014,4332,5198,783,2695,7111,4426,3518,5972,7329,1527,7186,3583,170,4072,4251,792,69,7363,8093,6814,1119,802,1050,5059,2544,4119,1224,4586,6040,5098,6534,842,7037,6009,7151,7779,5547,1646,3321,1255,751,4337,1588,1754,7213,6628,2511,2962,6915,4060,3391,186,3519,6567,478,5509,1455,3734,7787,4147,2609,5705,5004,6560,6479,1014,1824,5923,2546,764,6654,5692,3902,1519,1372,6527,7642,739,7762,1452,7402,7603,2616,3548,6408,5041,4656,8189,2231,7830,7742,4575,1849,2773,2338,7095,3881,704,6443,11,5256,2967,568,8149,2041,1592,7408,1335,5998,1117,4477,3208,6421,2936,6388,6860,7661,2731,3465,2299,4299,6177,4141,6121,2099,1776,7896,2375,3797,7965,7914,2279,1382,3031,6210,3242,4133,4979,4849,3398,916,3121,3812,1574,2773,681,6525,1361,6524,4256,4143,594,2843,1867,1749,328,4670,3927,3752,4307,4756,2779,3325,902,7081,5212,4208,1355,4102,7504,4767,6061,8135,4516,7193,6685,4598,5246,7807,7598,4677,6329,1215,2632,6468,5409,4517,2945,5783,3121,524,6145,6727,5468,7816,3246,7076,816,2488,6313,2648,7744,3810,2093,429,7439,551,6914,4906,6411,7023,3012,5983,7662,1734,1724,2498,5177,2762,7652,4266,5805,2769,4206,5580,4328,7953,8111,4789,391,1867,7578,6422,3300,6769,7643,6780,6220,7367,8146,831,4689,5686,3207,4278,7367,904,3156,7729,4107,6616,1148,3506,410,5901,2160,5676,2188,5707,7374,6419,1186,786,2662,3004,5569,3615,1605,1331,3303,1264,5000,4512,1146,6406,6049,7680,2682,4227,6207,5627,5545,4277,3887,570,965,4140,3707,3170,385,1127,7819,4850,3981,7692,76,1041,4539,6569,2356,3417,235,1315,7834,311,446,2018,693,2376,6314,4551,5133,4488,3610,4179,2735,6515,6841,2462,5323,3766,7795,6584,2097,5091,7827,4246,3684,2963,1908,2991,6578,1506,7163,3145,1323,6162,5684,1132,5637,5658,5391,1439,11,7170,6327,6314,1660,1230,4748,458,6855,5526,55,463,948,5443,1999,107,1504,5506,5119,8191,3950,5785,6765,1851,5894,5005,2414,1740,754,3193,6777,2654,3033,7470,3713,6967,79,6579,6600,6764,4315,64,7211,36,3387,1116,7466,3499,234,211,2850,6981,2146,7458,7105,224,4864,5695,869,130,1151,5701,4665,2681,7372,1153,4871,4903,7074,876,2399,7896,4686,1720,1075,7026,7647,3446,2837,2003,543,3543,1584,6705,8124,7997,7395,6194,6176,6464,1381,4372,8136,7549,4779,5573,1448,7536,7548,1945,7287,4038,7933,4370,6615,1093,8138,1891,3893,2354,3348,3580,2112,429,2655,6151,592,1635,2661,3409,3006,7351,6992,1940,4728,3363,4259,23,5592,1849,4234,5781,6740,873,6363,2196,2405,7535,6612,4690,6163,330,5191,1450,5567,7785,479,2510,349,2739,3187,4127,1953,5086,2151,374,6123,417,635,29,1928,7587,646,3400,6399,2413,2210,202,3518,5050,4340,7986,4710,5912,6717,921,5342,7753,4788,670,2347,3554,5275,7423,4871,409,6096,2740,2868,2412,1986,2486,3486,2820,4680,7024,2836,4527,3297,4797,6982,1527,7965,5574,5369,4772,2522,4641,4564,5071,5944,2571,5647,7801,2794,2453,1115,5163,5970,4746,2316,1712,6902,1398,626,2050,2507,390,3937,215,8053,5353,1246,2237,703,5786,4344,3114,3800,1923,1108,6487,2431,4939,6660,1973,683,7922,7494,5341,4170,4184,2047,1210,6357,6857,5030,1354,3273,1317,587,3603,2532,6959,821,4668,7410,3502,506,4253,28,1959,2758,1410,5641,2275,7176,520,3331,2256,2504,5321,5147,3830,279,6909,244,1307,2106,7962,6299,4160,8001,8086,3871,658,884,5657,7748,6576,2636,1788,7090,3712,1452,6777,8147,7797,2939,3066,2102,5535,4868,7271,4201,4825,2605,4444,1813,6822,5015,4535,6430,4836,6880,5547,7140,143,3612,5367,1673,1958,3565,1613,3866,1149,7619,6507,5927,2659,3096,7651,5401,6500,1865,4376,4568,6417,4898,831,1850,2581,7765,3320,279,1133,5450,2703,6885,421,2142,3718,2526,4838,4093,2977,2888,7927,4555,3743,4458,2293,3101,2174,7642,7845,4361,8159,1151,2741,3665,6105,1042,5602,1864,7114,1664,4257,1117,5067,2914,1022,977,4427,5071,4581,1527,5457,4933,1291,5890,8057,1946,4008,2073,7755,3431,6265,6540,7894,6484,5536,4153,5686,3073,2613,5907,5710,3837,6187,2131,7369,7089,8100,4130,4486,4859,8058,1045,2981,4050,2896,1222,4559,1135,6054,4713,7245,3001,6932,769,2480,2478,3381,4638,3361,2887,5299,6451,2350,4724,5470,5973,3630,963,7400,4761,7162,4849,2024,2857,4438,7873,5731,2624,6179,5708,5398,4925,2493,916,6120,2151,4654,7728,92,3149,2949,3090,6413,326,7262,1349,5100,1366,6049,8004,4878,5310,7854,7845,4556,43,7622,6696,1435,1323,1923,17,47,7088,5324,3503,2847,271,7633,2315,5929,2561,2838,102,2103,2821,8043,6083,2321,1841,7536,7960,3259,5811,1617,5205,2362,5376,5714,2001,540,15,3684,6628,6444,351,3777,2318,7200,2096,7554,6251,916,1672,6033,54,2131,3698,4770,6728,4695,1110,89,2409,7999,5837,7544,4015,1294,4792,3752,1718,3664,7974,7193,4537,3288,337,7231,1138,7333,1758,6081,6921,4717,7995,750,2433,6424,5541,1912,5656,1084,6097,5351,7909,3526,2283,7630,5336,4584,8151,2597,2588,130,4820,440,6607,1821,5839,3080,2025,5394,1887,7880,4795,222,687,7295,7141,2790,592,2437,6316,7766,5621,2596,7982,4086,5901,1137,4239,6512,2504,3103,2009,7213,4117,3664,1186,649,2441,3421,1822,7434,6118,7075,4472,1976,1582,3166,7323,2485,5700,5329,5817,4397,2932,5386,684,7319,490,4177,2855,1784,189,6582,7527,8090,2165,1721,2905,8114,4198,219,1786,5143,4641,2846,6952,420,987,5497,6480,2259,7662,4472,1406,3637,5273,8191,5512,7197,825,5455,2671,2112,1784,7859,444,5365,7223,1163,5618,2390,7394,2521,1960,1395,7392,7094,3805,4292,1461,6311,4152,1134,329,3395,7370,3967,4246,4380,5464,5117,6998,2564,4948,2644,2750,1117,8172,3059,6255,3508,7310,4548,7255,4846,2563,5561,1970,5079,7814,586,4980,5582,1804,7314,3519,1112,3912,7452,7802,3478,5304,2312,210,2808,6797,511,2290,8091,2996,1714,8142,1807,905,3309,2226,5215,2443,3293,8009,6792,4527,7809,281,6861,7990,5696,6521,8032,2633,2016,3250,2363,2099,2265,979,7486,6371,6393,8128,4580,6514,7459,5209,6568,5166,3774,1053,3385,1254,7524,5175,1507,1757,2196,4150,2424,5842,891,4416,3329,6806,7401,4783,5906,3186,2811,4104,175,5744,1557,4014,4562,4093,204,6543,3805,5882,7887,4530,135,1175,7519,2542,2069,7271,1166,4413,2969,3922,1860,4591,6879,2657,3263,1350,289,1430,1788,1900,6345,3863,2903,6239,999,2543,2062,1449,5513,7396,1048,883,3907,5109,4101,1855,3658,8038,412,7775,22,617,5622,6344,1278,7626,7509,5790,6098,4153,7134,6748,7915,6687,4574,4768,6697,6264,4892,3652,5610,833,3327,354,6626,1942,7408,4333,5574,1897,2649,5484,7635,1022,5001,5090,7254,8038,3753,2363,7608,6325,4252,5015,6404,1405,6231,6247,4625,5182,7304,7881,756,504,1729,6012,3551,5519,4561,4421,4743,109,1730,6299,2914,3270,4760,2034,4452,5485,6668,8117,5645,6493,6125,5533,8145,2378,6824,2331,4126,4706,1176,6594,4922,7561,1599,6117,4358,4460,7941,939,5491,4198,5894,2679,3386,4641,4362,4494,7410,3672,1929,6422,1960,1666,4339,2770,7459,1960,3066,6986,4768,8115,7830,149,3384,1706,7241,3954,4048,6890,683,855,4981,475,6966,6906,4823,1406,5229,2745,7502,5294,800,7400,6025,3552,790,3127,1380,4589,1653,5551,4894,1533,2056,6625,7790,5132,7905,2264,1704,4132,6947,111,5254,7599,5401,7406,7602,6405,7335,4521,3644,3705,4287,3243,1945,4529,2145,3130,759,3661,3955,7348,7725,1031,4303,2451,6393,1532,4403,6835,7842,1887,1690,5867,2229,4932,5945,857,2418,3289,8084,6080,5559,5130,158,2801,4811,2936,3356,7052,1397,818,2824,6661,2629,4645,4593,2506,2863,4416,3828,1135,4499,4852,6067,2074,1677,5016,1642,3858,1097,5436,6796,1051,6349,3848,3510,375,3810,5699,5126,4302,1361,2633,6929,3796,3063,873,455,2062,5973,7392,2018,5425,1906,2179,4324,2653,6521,5910,1551,5352,3937,3173,593,7246,7555,480,6457,400,229,5316,5496,691,7024,3551,6168,1661,6412,3607,7093,1421,300,7062,2743,6743,3031,2902,2386,3352,8185,5612,2636,4735,2662,5486,523,5005,1280,3135,527,1598,7792,2920,1531,1625,3489,4457,346,7275,3467,5469,1335,202,277,344,7629,4641,7404,3593,429,2723,5474,5413,7383,2154,5483,3005,5749,107,7874,5414,3819,4782,3457,1258,4445,1594,2271,1604,4526,7769,2167,5741,5929,6520,7943,3564,2115,6266,2215,4487,1812,4952,1944,1313,3506,6864,5755,1865,1052,6990,5534,2477,7882,3041,6044,3007,573,5062,6312,4550,6632,4565,6513,408,2097,951,2063,2187,1326,6680,594,6360,1367,6754,4613,2382,4087,1055,2159,6073,7463,7551,6642,3960,7910,5558,2292,5713,3902,3426,5544,6528,2835,6758,6811,3676,5253,921,3779,1286,2580,1546,1793,1063,7545,7701,3789,5797,5387,3766,5401,1015,4086,5877,2628,4841,4224,2782,3316,3429,3804,4105,4223,2257,3774,5903,6453,307,885,4519,2640,6379,2041,4376,762,5798,3046,6827,7185,2348,3509,2580,1033,1439,3207,7258,55,3414,8186,4095,4576,5892,4626,6483,557,4746,607,1158,2539,4092,115,361,2822,1765,5483,357,2479,7897,2962,3343,4849,1244,5359,773,2695,3468,4283,996,1712,1299,7271,4000,6453,5700,5629,690,3626,6461,6453,4039,1716,6786,746,7959,6757,1164,4204,7456,5737,4448,3011,21,5787,1370,5949,4867,5877,118,298,485,462,5596,7637,4917,6497,1942,5676,2964,2951,5404,1226,1738,7249,4108,1505,1950,558,3029,1266,2766,7974,7164,2881,3517,7030,2499,1318,7199,8188,3931,1979,6294,1680,5236,4341,2345,1742,5489,3425,6691,6092,4728,5106,3232,2885,2469,657,968,5246,4789,1107,1849,6525,6664,2701,3381,6664,354,6829,5573,4497,2559,2962,1089,3334,6362,3448,4363,4858,4265,6396,4812,3042,6536,3165,7421,5210,2366,4883,7431,5113,7356,5841,5711,5446,4449,3362,4648,6913,4174,1688,4195,3525,4059,3647,3613,6893,2368,3655,2490,7471,66,5674,4180,2398,5379,3046,2127,2131,7757,6049,5864,7196,7101,7830,6596,6102,2689,6576,5358,7586,1729,1874,994,559,7669,5221,6674,3746,5493,4915,6181,6469,7985,4549,6340,1456,6699,4865,778,2835,584,7962,5937,4459,5986,195,1930,2423,4994,5138,2847,5667,3548,1584,3885,3430,1029,5189,4411,7646,7409,5414,1005,7135,5448,6064,5830,4814,1410,7445,4289,6291,5722,2199,8045,4983,2375,3609,5273,6024,825,5324,6489,6367,262,1268,98,6055,3275,7579,1196,2416,1079,627,5273,4899,2991,2290,3097,7919,938,5559,8117,2235,2344,1073,3149,1626,6556,5570,6724,2380,720,6444,4687,6881,7267,6911,4686,7826,3349,7329,412,2057,7441,6920,6766,6484,537,7463,3927,2821,3706,56,2886,7969,682,6882,5116,6129,5222,7452,5258,2217,4973,4068,2652,3846,3379,13,2446,7237,4016,850,2594,5420,5242,6426,4657,3203,5537,1118,7073,2010,434,4774,5306,6121,3405,2685,2583,3145,3555,1852,1325,685,5009,2762,6233,3440,582,4985,6393,1390,7808,6123,1327,4833,1496,997,8031,7023,2344,4197,3632,1475,5872,6439,7236,3111,3846,5170,3172,4015,5977,4619,1159,7197,6071,6062,7181,6339,2151,6163,4753,8104,1161,1736,2768,844,4056,7241,2920,1925,3325,4985,4415,6643,5668,46,2520,631,659,2367,2131,2295,2489,2567,483,7463,451,5712,2789,2442,7376,1498,1830,6987,2130,6883,3288,7345,6514,5716,2511,2313,2694,6018,7127,2621,5555,839,1475,3443,5331,3437,2599,910,6277,3603,7534,3447,7912,4290,3825,5802,2026,1997,1432,544,4710,2373,811,951,1051,618,6144,273,4218,1896,1382,5711,2458,7758,1432,2754,89,1800,1974,1214,460,2651,6672,4978,2579,7146,2102,1208,1914,4728,2928,1403,4328,5310,7305,3212,5045,4046,5055,4945,5360,7940,1431,4082,4455,7226,3489,7941,7259,3597,7484,4053,3756,4643,78,1042,6061,3128,2935,1079,1359,7613,3818,7087,2110,6672,2410,6948,7388,1718,7488,3946,3678,7208,2664,6573,1930,3832,7832,5266,3062,5409,1321,4870,5091,2745,7679,749,4546,5494,5743,3408,1694,2301,3698,1596,6254,7922,1343,1361,5407,2747,2552,1685,6880,5565,5207,2545,7357,2683,7068,731,779,8009,899,720,7091,4937,3987,2115,6944,7536,5193,3178,2792,7950,3129,229,303,5947,7384,2708,2401,2900,728,4070,2567,1484,5630,3210,456,2547,6657,3036,3826,2140,6182,464,7324,2926,2117,1825,5444,5670,1660,2923,5678,3850,255,1439,3732,747,2524,3847,796,4886,906,3205,4852,893,446,3150,2370,5855,6996,1030,4170,300,114,3960,900,835,3820,4348,3695,2243,3164,3408,3407,5755,8083,1607,5706,1850,451,1147,3108,2320,2938,6897,6092,7709,364,5797,6320,6622,862,1386,3529,462,3855,7367,870,2262,7594,7954,4119,4304,8116,702,3896,3334,1706,3761,7276,4792,3773,2235,4729,5718,5534,1822,171,5862,1802,3697,510,1333,3009,1383,5205,5686,6829,7772,455,1258,3925,1056,2126,5865,5848,6322,3082,2475,5128,6840,140,2546,7354,1562,2053,7154,1532,3891,4034,1689,7259,4644,5995,2675,3127,4212,1209,2293,7605,6306,749,111,7037,6174,7801,7679,5866,5196,3264,8180,915,5698,6988,542,7191,705,6982,2061,408,4881,309,3121,3879,1971,7058,6770,1564,5197,5083,2550,2220,6922,3427,2882,3391,3275,2776,6440,5362,6525,147,4471,148,7264,6831,1148,6367,3200,1326,1126,8138,2316,3279,2879,5614,5229,7917,7118,7622,5395,1134,6720,5707,6169,783,6820,5840,621,363,3034,937,8062,2081,6734,7430,3811,6308,5846,3738,6171,7227,1867,6559,259,2275,781,1503,1550,4927,2166,4651,4754,4490,6523,6970,3622,2495,2368,1056,993,4072,2997,2753,751,1102,1725,3039,4338,1859,6293,131,7896,4362,4932,1223,2318,8123,4002,1643,7239,1582,3304,2404,5267,2314,473,2789,4803,535,5969,6494,2326,6394,7278,5123,892,1832,4104,1770,149,7100,1710,4678,2382,5396,6374,5040,6897,6354,6220,445,2707,226,5975,440,2278,7051,4146,2674,4329,6959,7179,5102,7909,6448,1458,6993,8168,2219,2328,5389,1139,1848,655,1711,147,882,6438,6523,7615,1072,1364,2966,1064,7461,5160,7888,684,4278,7262,4488,7543,7614,4304,7146,5294,5917,4937,4356,5764,32,6407,140,7278,2774,3462,4116,5099,7069,209,7492,2413,6525,2985,2804,8063,6306,2001,387,7486,2892,4015,1503,1928,4398,6812,7788,3085,4596,7649,5468,7833,3021,1883,29,4103,6618,2,5578,4484,1981,377,4826,4531,4802,1564,4536,1738,7508,7876,5304,6650,1550,8134,4445,6231,6210,7350,2846,323,3677,5140,4278,7503,7066,3518,6138,7225,5368,4443,6616,7145,2757,3021,2701,193,4345,2790,6157,6202,2728,7112,4580,8186,6267,1415,151,1355,580,4785,2626,3800,5820,445,2527,816,7982,3053,2680,6720,5853,617,2013,6987,4121,3791,4567,2825,6339,6571,3399,6268,990,6129,7434,7824,5314,218,802,307,6196,7133,2877,4905,7435,6302,180,1716,4164,4895,3071,4004,3478,2918,6837,5919,2840,3423,1192,6150,3963,4929,1777,6533,3763,433,515,247,7705,3077,738,4478,2848,1774,6923,3916,2263,1989,6790,6991,2233,1339,5618,967,1706,4743,4152,7430,413,2222,5387,6755,2305,7212,6334,5394,687,4094,5094,5900,2914,1590,4537,6592,3355,2874,391,3754,6115,2000,7282,4679,6575,2335,7828,6505,6448,5380,514,3296,2923,669,6104,3557,3466,1945,5628,6275,5184,8137,4153,6724,4600,2520,7044,7521,5600,3083,6429,226,4799,7216,3683,2593,5628,3451,2587,5664,8076,4620,7939,3043,5113,118,5813,1925,3975,2144,1252,2646,5074,1115,3231,4813,582,6042,6663,5341,1123,4381,2301,6422,1708,5424,1762,7393,1892,6062,1327,2522,4727,6095,7731,1237,3720,1139,7208,6099,3234,633,2470,283,4722,4942,6693,5194,4451,5537,7654,5717,2815,2872,2382,5242,5482,6903,5774,1842,4726,4322,6167,1755,6759,4240,1855,4835,4305,1117,3752,7941,1463,1693,2940,6369,3117,5647,2149,6902,4027,2837,7431,3306,4437,3091,1619,67,7537,7372,7247,3270,7686,4814,5570,6037,5626,4291,2995,4827,606,6175,4723,2529,6759,2409,6973,3447,3509,3744,3728,8117,1351,5977,4531,7026,4985,5385,1928,7335,3052,5202,522,2957,5791,6700,352,4703,1478,4418,6824,5565,5112,238,3803,3541,1780,1964,4699,6112,3839,552,7306,7348,2757,4490,4186,5110,886,5013,7844,7858,3823,7444,440,3455,2149,3768,5561,3730,1426,3612,898,5681,5423,1203,2531,1782,2768,4209,5582,1422,2824,958,5893,4420,1579,2469,2501,6958,6340,1065,6030,4624,6360,5301,2842,1081,1801,5680,6228,7258,0,205,6275,7490,10,7149,2768,3771,5634,3014,3516,4080,4412,1887,2204,501,184,5972,7430,17,5115,6067,788,347,2706,5618,197,7891,2609,1537,5263,4432,5517,5960,4906,4709,7923,2308]> : tensor<8192xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<13>, tensor<8192xi64>) -> (!FHE.eint<13>) - return %1: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 6713 - - inputs: - - scalar: 7710 - outputs: - - scalar: 882 - - inputs: - - scalar: 8191 - outputs: - - scalar: 2308 ---- -description: identity_apply_lookup_table_14bits -program: | - func.func @main(%arg0: !FHE.eint<14>) -> !FHE.eint<14> { - %tlu = arith.constant dense<[934,13944,966,3955,9137,427,3929,9854,4000,3295,7466,15677,117,2369,13275,4544,10684,11008,14223,1664,8418,12263,1306,225,13041,3201,8764,14559,5530,11901,6563,5290,91,7892,14268,6419,13011,1417,12412,3013,2863,3006,7554,8159,10123,2929,12561,5316,1487,7097,5505,8576,2563,3128,11586,4294,9920,8514,6094,12406,13858,13292,10591,8056,6972,14463,12318,9693,6014,10513,2372,15552,6396,14019,13239,4795,13413,2263,12547,4967,5382,15561,11536,9848,10003,15443,7956,3305,1857,12574,4020,8543,4775,8091,10656,11861,6253,11812,1665,5095,3587,11946,1556,12395,5205,2256,12026,2954,2112,5085,648,104,16333,15284,7428,3587,6466,15618,1285,2866,12981,15913,10889,13168,8458,6595,15643,3687,8155,8599,9889,11775,15353,1108,2567,9434,16250,5718,4103,8815,10466,6958,13039,5230,15116,5907,2935,10579,1516,4460,2070,11714,3406,16196,5326,5598,14558,5397,8565,6138,16080,7826,13664,12657,5713,970,5385,9658,2654,9476,11948,4257,15329,9871,10494,15042,4541,4776,3728,2125,12437,16253,2379,11769,11857,8178,6767,9785,7142,1573,13002,12649,13058,2168,3799,6342,3604,3092,14525,11622,2949,1073,7493,6517,3920,7116,918,2804,16050,4303,11559,9156,15271,3345,10672,12639,14362,5149,7819,4479,10982,14657,15738,5106,14237,3886,3325,3819,2096,7287,10470,11827,11135,3,6993,9534,12753,6148,3026,13393,10978,3779,10141,9777,11377,8851,13102,338,5927,4426,14973,11485,5832,4734,6568,10200,1122,5486,13499,3285,5870,9221,15428,9764,6780,4647,14454,14933,2809,12964,9390,16076,16077,8387,173,6696,15267,8809,487,12984,4082,2334,11690,2897,3419,323,9498,14219,12330,3787,11385,15507,883,341,16259,4196,13364,1406,1941,5498,16105,11505,13548,12007,13786,3693,15069,5969,7693,4286,11585,14966,16149,15947,9556,11465,8060,6923,10887,13980,4751,7525,10075,12437,13593,11992,9702,6345,4169,9467,13217,9676,9345,14172,10360,9959,14317,7460,6364,16291,5163,6339,1436,7177,15523,10758,11663,9078,7639,2513,1766,9177,5510,1617,13287,85,5757,6347,409,15144,6407,3052,14363,3565,3978,297,3532,15167,10074,7882,13028,4901,13920,13317,3836,5049,3385,11977,14682,1067,8486,5720,5764,15946,15838,6361,14972,14645,14511,9120,15387,14425,2075,16002,9534,10685,14734,8043,7105,5633,14088,8058,14695,13880,4406,9115,15420,13113,11656,4117,7297,5181,11780,273,5251,5406,172,3378,15447,6736,9343,4441,1627,9231,14872,14081,15347,1716,6410,14665,9133,11081,7809,3658,1577,1130,3613,7122,3660,11773,192,9659,15197,13378,12869,13840,2062,2058,10372,1532,5566,9222,10860,11415,9301,6916,12343,14440,14081,11727,6861,4779,9202,15913,5552,1374,9320,6627,3661,5467,39,16332,3497,15110,12072,17,2981,8322,1980,2425,8298,5827,5372,428,637,13866,8140,1240,3708,9721,9070,1869,4611,12201,7250,500,6485,12519,2661,9403,4571,3981,13591,10612,6990,9297,8792,13154,5134,8836,15480,10782,10332,2229,15074,13137,4385,6090,7202,15294,6841,8853,12881,8132,7694,1888,6116,12011,13336,1376,970,7102,9471,12030,15108,5486,10496,7248,5410,8529,13411,7289,11848,9309,11149,7707,4681,8113,2741,10405,14517,3070,11749,2100,12949,5269,12972,11638,14123,15011,3944,28,14829,15306,14424,11674,15492,10305,1305,10264,7611,13742,15012,7654,2898,8490,12303,2088,16231,12288,9356,5889,7728,2236,5537,10238,14539,5245,2983,9803,9451,15042,411,724,12672,1689,9508,10209,13568,12514,1360,16216,6840,13847,14165,14745,7341,12432,9180,9275,9107,6725,13836,3842,6827,15921,3682,8255,248,982,674,13701,14623,2615,7080,8275,11046,1528,3770,6968,14244,10815,12375,15832,3060,2046,935,2633,5100,4670,11414,8018,6959,3889,5434,14177,13431,9966,16209,9564,13373,9613,10957,9881,13346,11789,3290,11809,9086,849,15032,11256,1265,473,12661,16363,14517,7920,2991,16365,1588,14698,15460,8669,14150,1512,5840,9373,5571,9870,403,14300,1390,13183,12579,931,7393,4543,16381,10249,6053,15453,4083,11074,6130,10318,6279,1793,746,12525,14538,8617,13454,1922,9556,1116,9392,7909,5994,5958,3820,6092,5748,10182,623,10059,5398,9238,13334,11889,4450,3727,1277,4764,1688,4918,2483,6987,12717,6953,2045,12234,7943,1008,8741,10706,13781,13660,5383,10933,14752,6525,9856,418,2418,16107,1381,5852,1662,14493,11206,1604,7177,14471,5458,7532,3678,14157,11885,5887,15833,8551,2082,13423,15977,173,3476,15083,2776,143,11087,12117,13739,55,4038,13726,8854,12192,12145,7314,9738,7645,13055,15706,8139,4634,3997,9680,13128,4104,9890,2908,678,12415,360,7040,10596,9725,9754,14478,378,11067,4578,6816,5171,10471,5732,7892,6841,2558,8195,15996,14623,16014,7425,3039,12832,10620,13046,625,12257,139,970,15864,14834,13617,11660,4930,2821,2191,13847,3453,8498,16284,270,5354,6581,2367,4756,12392,8446,6533,4147,4628,6628,11486,12092,6195,6977,12709,8918,14520,7062,293,6095,2324,1786,15287,13616,15279,1772,9513,11338,228,15075,170,14,2334,12463,10203,6336,11106,13317,10042,4787,9934,1760,8448,4163,15436,11865,6303,12547,9963,12615,15196,9199,2484,2189,2735,9229,9146,9662,11751,7310,16090,936,15548,4246,5614,960,14446,6299,16112,4995,10203,7999,2588,9232,1436,14389,7795,5781,12890,3177,9145,7620,7339,10431,14156,10676,11326,983,85,4258,2694,14676,12726,8760,14117,10511,15742,9998,3005,8546,2329,5004,11716,10345,5562,6797,10938,8875,10912,82,15694,15142,893,14142,2532,8872,7130,8926,15143,955,15360,12449,8372,14040,7888,12552,6240,3777,2320,14743,3933,12551,2653,7333,5761,688,3384,11945,3694,16231,3088,11050,9913,4733,7844,8986,288,16368,13332,7850,4797,6281,5906,4004,6993,3190,10105,9235,15816,15550,281,6553,5771,11043,5041,9060,10197,12669,1423,9395,2010,4380,15074,12178,13918,1116,11241,14744,9029,9303,14682,12564,7111,10818,14352,12019,347,14901,4509,12487,14051,10405,14374,6794,4642,11604,15118,3614,2102,4697,15526,7904,15803,9057,8632,4371,12115,11677,3301,12158,9089,1278,3637,5320,11908,7333,6579,15206,13913,4569,14070,11301,7484,12006,11892,12567,2681,16382,15729,8631,15693,15730,2208,11796,14204,14620,10865,10661,11206,6899,576,9701,8017,2558,14928,7893,10569,10356,15979,1346,2689,10369,13159,4822,6548,7294,13642,13292,6025,11908,2605,8503,14935,4159,4720,4424,887,2960,6434,4909,2974,12168,163,9402,12988,16348,182,9751,4997,16227,4728,11356,972,14884,90,12948,9699,3287,1277,1858,11978,14212,125,10481,7651,14627,563,8466,11538,12058,6399,6714,15850,2849,2215,9043,2899,5636,15246,9419,5733,1109,3077,8169,5774,16326,14414,1414,8778,15505,8301,3287,2242,4822,15164,15506,4304,5239,1072,2370,9032,8405,14947,7051,11049,13903,3251,14228,13428,15446,14309,8537,10055,8920,16236,8491,9743,9455,5451,15895,10922,10329,5216,885,7127,10471,9710,1170,15853,12717,15779,929,6449,2860,11467,15805,10795,6434,8731,10126,4995,840,5057,10504,4943,15437,7734,3067,1325,16322,3124,16328,7805,3063,2792,10938,11475,396,10872,6546,12542,14640,3931,7643,7189,144,5798,1220,11103,7959,9901,9443,911,14865,108,2507,6012,1825,5525,14360,4430,7633,4324,10909,11167,6637,1642,13253,485,15234,12084,7453,15990,13087,2530,2115,10870,5772,2275,12948,3622,15153,4470,4908,13084,13960,210,11402,8273,2977,3817,10584,3129,8758,6284,205,2050,4187,15388,11028,3264,15912,6888,3306,5141,373,3607,5201,7837,4834,11642,13802,9642,2203,1702,7414,11127,3593,11066,12029,9714,10530,11002,13367,5029,8879,15065,13973,8174,10157,2079,15883,16013,692,9743,7188,12169,12136,7312,9766,14248,46,12795,83,14712,1936,1093,7954,9306,14567,11872,15915,12267,11944,569,3658,14047,3910,6438,15001,1659,15433,10044,3172,13383,16019,5893,16134,10395,15769,4848,6483,10407,1530,16277,11000,5606,9548,12696,7391,14577,12379,9338,15422,11825,9011,3149,781,3648,5964,9875,15031,13387,9532,1225,7259,9192,7666,16295,12343,13155,6567,5946,13231,4087,14508,12923,5135,8279,1887,3755,2514,566,12556,8432,3839,10243,12136,9809,12043,3430,15871,866,2364,10528,2433,14399,16171,9239,12801,15166,4344,15927,14642,8610,8227,6976,2843,9436,7822,2142,5769,907,985,87,1908,15707,10526,10879,4703,11085,8136,1682,5776,11332,398,11255,14987,12247,4353,11244,3643,6610,14151,5018,5493,11980,10025,3369,4784,2258,8772,9027,14185,6530,534,6653,6154,1708,14440,10374,7285,101,6821,10895,849,11366,10215,1601,15335,3333,10566,15950,11418,7048,15816,2125,7960,14175,11568,16213,3189,11371,9792,1102,9948,1312,4350,315,15809,14839,1782,671,597,14026,12095,13720,1679,10304,2681,4503,11578,6471,2406,10587,13395,6824,12969,5883,5586,9016,6141,15766,6187,4540,16142,4261,16080,8288,9447,12968,7585,8992,8635,5983,12268,9311,9437,284,12975,16073,14014,12531,13337,3159,5793,10736,13474,2213,12249,4497,2295,15980,3186,11495,8090,6476,9165,2278,5468,14697,3378,2993,7832,963,16024,3357,11716,12233,6468,1840,5480,5413,762,5826,10326,15415,200,15405,6464,4155,6597,4364,9147,15890,8010,14107,4482,11891,9486,9071,2417,10208,1414,15932,8188,15492,4290,15042,14893,3289,9289,2554,10207,14974,15128,6479,12818,270,14411,3242,8943,6560,1101,6030,4586,2066,13598,1866,951,633,8930,13997,8419,11051,9070,5205,13908,15894,7631,417,9400,12251,15201,6112,13147,1632,4593,2524,11645,8965,5652,3453,16009,6757,12838,3857,4358,7620,7370,9310,3074,11118,12690,15416,16170,7711,15645,13876,2098,14267,15708,12644,16178,12629,5180,3747,3408,3817,12561,5915,5843,5197,5793,9945,16013,2940,5,2729,12853,15960,9324,1282,6857,5071,15167,2819,4157,9408,9260,8016,11874,670,5460,12902,177,7386,7774,13910,14542,2999,5667,15936,2944,7117,9206,1216,9966,4156,2888,3790,14088,10993,12137,12281,2945,1473,3458,7439,12437,9134,11522,5968,13281,8912,3226,5191,9968,12173,4835,5252,9642,10950,2730,11003,5836,2401,204,10302,13683,7852,3299,11725,8918,5175,13847,11851,12897,15273,5884,2830,3353,746,1038,3180,5752,8863,9820,1774,2510,12402,11400,14102,4220,110,7043,5635,15405,5240,213,6911,2519,11943,2408,4225,5060,9514,5520,4880,6382,8097,1236,1625,9600,14787,4352,8965,4809,14781,11381,7106,13396,5207,12013,11825,2186,155,12090,8234,9772,15613,253,550,16012,138,5217,11552,11663,5424,13359,16345,13470,1558,16051,13617,9128,1932,4556,10420,3191,8716,6684,4845,14418,9907,10460,8363,7979,5162,2171,1478,11062,6105,5656,1796,10078,13884,9164,9998,11446,562,8847,12391,8880,5260,12184,12767,11729,8774,10631,16265,332,9780,785,11685,11191,729,2120,12158,10773,1297,2116,9117,8613,1177,15560,9191,8203,10839,3163,12176,3016,13332,5409,12825,6478,1161,7065,2756,15718,15457,2292,10496,296,11981,6862,715,8197,15384,11515,7949,2426,12010,14018,11138,1929,8160,5825,8429,4846,12284,14375,11329,10066,10231,13210,12969,15439,6791,8963,5999,6265,15272,8356,15149,6176,11854,16173,5422,13477,6132,14308,12702,5771,9556,3446,6057,15076,3831,10136,13296,11562,12072,10251,14881,15144,1709,4915,13814,1044,6036,15330,12620,14993,8199,5189,840,5807,3875,15794,10103,12156,10173,12910,8875,3620,9118,14720,11418,12658,2911,10245,14252,11939,10357,14150,8914,6808,532,13771,3562,8171,2836,13100,8468,15965,8309,2744,6094,14400,7855,10826,13694,2677,9462,13746,10523,1750,14633,1202,14087,8392,14061,7200,8737,13113,9430,3097,7768,10366,2643,10776,12415,10603,3002,5151,6976,6334,4713,3395,12145,15781,11773,12713,1654,9904,15468,11529,15293,1663,10293,10068,1709,792,7462,247,2595,9596,9797,13222,12515,2916,581,13593,14692,5496,11279,14593,11518,1206,2849,14023,4654,12765,9306,14520,14426,7563,1701,13763,4249,11488,3716,11328,3608,15878,12420,10656,6763,7512,13819,627,12116,16049,2875,8074,15700,12897,14915,13966,15466,9156,5712,13315,1782,11845,1464,11268,4723,3542,12828,4097,12168,5350,10856,15818,13540,847,9023,12476,6025,2630,8791,12154,2804,14428,4203,15379,9620,14679,12266,2024,11560,7629,947,1402,5043,15332,9179,14439,5478,6104,2546,6390,12272,9579,13914,3310,8981,15438,14067,2167,6649,652,12492,12444,15406,15010,1739,10602,13072,3369,9165,2599,3157,11503,16264,6713,10381,11549,4772,5598,7159,11693,9241,7950,13671,6,5604,15967,3966,1320,729,10093,13423,7712,3032,8353,6639,14762,12569,3484,14925,931,4515,2250,2034,6168,5282,12007,4791,1873,7932,2334,14068,15086,2788,1211,1374,9344,10896,15942,13848,8542,7608,6491,14947,8479,14547,6754,7751,7576,2903,5250,16306,13213,805,12388,1856,11601,6546,9800,8070,4726,1744,9632,6306,7946,6976,3667,8492,2490,10398,4578,9287,15875,5832,5003,1027,2934,7120,8533,15994,2015,15330,9240,15716,5311,11039,4601,7803,8584,9041,11806,9254,7932,1699,14904,16029,13968,4851,6579,12842,13798,1695,11683,9724,5582,11842,3778,9538,1396,5563,2152,4784,15701,14754,12648,12122,7003,9611,9875,2994,8996,1899,367,9428,1396,3872,15651,1771,12149,7196,5561,12721,6522,1201,2858,7125,15271,2740,7759,13851,11042,959,1098,14927,3344,13155,543,15150,8363,2117,4418,8450,8083,14750,6777,805,1960,4353,14439,13749,11012,14882,8469,11754,4275,5836,1761,6134,11188,7945,8421,16147,11889,3167,15341,10308,4101,1115,2150,6581,13265,8014,6505,10056,10449,13520,14276,4333,9257,5533,14512,12955,11842,11620,4699,4021,4783,1147,12869,9966,1788,15835,7669,6267,9104,1202,10979,682,2688,4428,2311,7770,656,14008,1120,11223,5946,12303,8377,11691,9597,9560,3558,1292,10601,10465,14984,15004,139,3744,10829,13650,15949,9734,2770,12267,15052,14159,890,4757,1961,7700,3802,4241,10309,3036,8224,9623,3118,15386,9356,14732,15107,7374,8654,8224,5644,4641,3356,6797,6780,9804,287,9167,7276,12991,13911,12380,6873,13610,10242,7386,3545,9063,4856,5998,15016,1004,5825,7091,3901,13925,6839,5718,3791,2247,3964,7910,9915,4772,6966,15959,3456,12823,2755,7559,16020,6904,5746,15254,5234,12646,7006,15899,13739,7291,9281,10267,6367,1862,935,8693,52,10629,12370,3656,870,13716,4185,7266,7567,2560,3538,8224,7348,6851,9981,11475,12406,7471,1661,11028,987,1708,10480,4839,11790,5732,421,8095,5767,14937,6850,4344,7579,8436,3912,1309,15242,16257,14155,5696,13607,10715,8015,4622,245,16360,14686,12297,4352,10410,7287,15549,6027,14228,8102,1567,7567,1024,1256,5026,10032,5271,10183,8638,4542,1770,14373,13144,6300,12496,3762,5119,6986,8558,4053,9549,8284,13300,1318,13796,3334,9416,9126,3451,1255,13348,5917,6843,6524,14988,6735,12169,6129,7076,8345,2829,16049,4678,10610,8805,11166,433,3091,1564,9164,13947,5160,7156,608,6393,13153,6604,16183,15141,2064,13010,7965,8343,16308,3732,10495,4951,5377,5875,15019,15640,13815,6301,14242,14445,4073,3954,6598,12386,15563,3680,15747,6770,13393,3784,3884,13530,5178,3274,13136,13914,6959,3087,10882,2714,6074,3350,1356,13456,9621,7571,8325,9905,4600,1299,2083,5303,4627,13830,14838,9555,15134,13937,491,8284,8575,15239,265,8925,2877,9822,7034,8826,3985,13191,6451,689,8256,8022,12061,9015,4579,2932,7089,12981,2717,5388,2648,15588,6830,304,942,8649,10462,12432,14458,1656,3977,15352,8540,12766,1556,3168,1551,14322,12198,13932,14092,1138,1615,7819,5963,7325,5779,15463,2394,14346,8764,3050,10482,6881,10471,10716,14016,3917,12746,12595,12567,16099,5845,1130,12154,509,3456,14728,11814,3195,10079,16027,14560,10333,11437,10355,2061,3287,11929,7301,10376,5650,10953,9254,7666,2863,1597,315,1442,6315,20,4851,2083,8234,4126,7395,5845,3183,2492,11515,12581,4659,8471,10293,4320,2977,11702,11712,15476,8249,16020,7123,7119,1233,3258,6261,11507,6489,79,15044,5256,9781,7639,4738,7845,14894,8025,8364,50,9381,191,13014,9942,8373,13467,1667,14791,15498,2385,8677,12550,2599,5685,8064,12163,15987,12943,12158,4588,8784,1743,3200,288,3584,6795,4283,13784,6939,10545,4531,4113,3294,1875,5804,9179,10613,844,5834,7113,1161,13549,3196,3812,4471,10619,2713,15772,6355,13251,6751,10838,9197,13149,11232,864,11302,8733,5170,13423,3742,2665,526,2407,6181,8324,3689,7739,2068,1175,11024,9524,13846,518,9752,11547,10583,12279,6954,13702,8861,16005,3536,5229,11591,1024,8890,7498,16172,11134,71,1453,1443,16129,4488,14619,8043,1565,3557,16166,9231,13355,13099,12859,6668,268,10154,1812,9430,8615,14816,3248,13092,13863,14019,8246,15490,1930,2197,14292,7639,15141,761,13724,13982,14627,15091,4628,8945,614,9967,5299,5968,8920,12575,2816,9232,4886,8235,5086,3154,4091,11634,16254,16158,633,3905,6182,5926,5203,2410,13621,13979,4539,1294,1234,16109,9518,15092,11633,7733,15485,9905,465,4113,917,4805,12305,1923,10019,12215,910,12659,6700,4900,5124,9026,15480,1131,10795,2557,70,13858,1501,15903,14658,2773,13673,14330,14434,8361,3364,8609,57,3777,6194,15384,11002,11067,1892,9984,3523,13922,9536,4742,5956,12441,13342,10519,10733,4433,5470,4003,13114,6090,1319,13438,5342,999,12438,6420,3510,8178,1692,4525,10939,13886,15333,15536,9701,6979,2419,7289,5098,3829,15119,15444,9223,1137,474,16334,5609,5272,8434,6216,2166,5045,10256,186,12927,13512,14524,10956,12323,7077,5705,9627,10945,11580,10893,14622,12957,6332,10006,118,5822,831,940,8768,14056,10869,11544,11047,11050,7088,3306,15280,6638,5730,15271,8466,15838,6413,885,7805,15387,10419,15000,2915,10775,6514,3384,8663,7398,2194,7845,13073,7608,13740,1529,1678,15218,15995,5432,11064,7912,6717,11463,15203,7624,3462,1062,5687,11913,8875,15110,8095,15166,5830,915,13356,13867,311,3486,5871,15998,4614,12529,13958,4496,15718,10686,1203,9419,6976,5373,11651,5850,1549,12367,12798,5150,3919,7665,11788,14975,14685,2602,2737,6414,12675,15418,10545,12426,10809,1208,1786,15312,9283,9229,11399,4851,10194,8047,16103,1552,3613,1094,2529,1589,13150,11307,14465,2440,3993,11710,5607,7395,4155,645,6806,15611,1843,6908,13701,9074,9934,11108,13205,3348,11141,7550,1875,15118,14894,2123,8238,8327,1669,12178,15124,11656,1297,13113,12579,12725,9212,9055,9056,7186,5216,10689,12004,3711,10804,8379,6968,3729,14631,979,16159,4778,15239,13150,5444,2114,12091,4033,12326,4224,3574,11788,1403,9909,942,9505,8921,13991,15082,9686,15468,12557,7943,11905,11682,10771,6727,10902,14879,7330,11303,6876,8841,11358,12167,10519,8807,2683,9762,2598,8521,1735,8292,3863,100,9600,14507,14248,1510,16316,9766,3406,3305,10989,1189,1331,12874,14528,6878,6065,8087,1750,3149,10269,3741,9885,8818,2885,13883,403,384,6121,4993,2799,7381,3619,10071,1260,7534,8921,3774,14108,9686,13709,1796,13101,5722,4968,15903,4699,3115,6194,5117,3212,4009,5082,206,10170,7612,15615,12342,8529,13906,7511,4870,5436,14621,2364,9060,10796,15150,11282,1883,14114,12903,9660,2977,6530,8519,5337,11968,7646,14492,10002,6108,911,89,15771,349,15003,8302,8167,7933,7175,4457,10922,13092,8786,8993,13381,1852,3037,2511,6622,13006,11335,10577,13446,9960,8158,14336,8445,8426,6903,1498,11019,5944,9736,8924,2686,2867,13559,13905,12453,8228,12283,7462,9956,2627,15552,9477,5013,3380,9146,14156,16083,2218,14726,2048,2136,11276,8247,4058,8511,1595,15732,9930,14882,8278,7858,313,13902,7968,11483,3007,15128,16159,9292,12611,4954,10288,6487,826,3520,6922,9501,673,5607,13211,8725,3422,5967,16249,4593,12265,13512,13799,2199,7587,6454,12535,12723,946,1304,11546,7708,12366,16334,4219,5588,942,16166,5571,13199,2327,484,10494,9405,9432,977,15198,8145,13457,2362,10918,1459,12368,4143,1802,15749,1218,4878,6885,1332,1472,13853,14228,11205,6403,13300,16330,8654,5381,14742,9283,11020,13164,5632,2208,14374,13948,6340,3032,16094,11124,14632,126,10308,9098,3804,11037,4752,8660,11280,8651,3924,9353,13973,2686,11346,6222,15735,12215,3099,8831,1449,7667,5577,1315,16319,9719,6227,5946,4106,13877,11968,14998,2022,10667,12158,7112,8395,9309,3740,11956,4224,12225,81,7180,5164,8159,7859,13027,16233,8458,7929,16060,5737,13484,1683,1085,1458,7610,3701,1852,15226,11372,6547,14054,10441,12045,6734,2885,9459,5613,6387,13553,14522,3700,7891,10923,9340,7265,8996,1388,12003,7028,8862,7352,15608,13824,2973,2811,3443,3689,8545,14859,2865,15914,15621,12681,14747,11950,14507,1551,7615,1955,9226,3975,3598,2640,10403,13450,492,3206,14875,2801,14575,2806,1942,5343,5170,8332,13439,15801,3362,8024,10225,8490,15822,3568,9936,1646,689,9876,665,4880,12530,12262,6318,8896,497,15189,11624,1436,453,3424,844,14812,1226,1272,8138,13563,5434,3994,13751,8324,12276,6907,11973,3156,13508,4626,15772,15464,955,3932,1345,5634,10845,175,1386,11584,10567,1393,13509,12699,962,15296,5508,9035,9898,1439,13788,13396,15528,773,7268,10691,8727,157,6004,16221,12578,5847,14525,12326,11699,11755,9783,13920,7495,7248,3432,793,13742,14641,12464,8078,4164,3006,10372,15515,10493,2988,7236,5254,9130,9723,4248,11576,1332,14895,5936,887,15519,3608,10452,1775,13805,15462,8630,14468,14758,7144,7610,315,13725,9338,11326,15972,9603,14210,15233,178,9614,7159,1254,14493,16357,4837,7613,9880,9879,8664,12072,14212,8078,6464,7963,15490,11178,7796,5595,13647,14807,5011,3267,1897,10648,15721,7286,12242,38,1388,10635,128,2097,10605,7281,1824,12766,13189,7293,9458,3581,1206,10240,8378,8219,15923,3562,2938,1982,5742,14141,13675,7774,2636,16315,11814,1454,8479,4854,12466,6693,14119,14444,3187,15838,1393,896,7857,9856,2405,8689,13303,7356,13419,7706,7908,2153,5056,15919,12852,4132,8407,10473,1081,9315,2458,9271,11065,8658,8853,3950,9212,1789,7550,9669,10851,6198,15444,13461,10236,5716,14316,15987,15784,2423,6670,14405,6888,16018,5794,13848,11210,15118,13514,271,3735,16233,13121,702,11807,10112,13868,3766,13379,3393,7414,12648,6653,1320,4731,7704,6239,3099,14886,13617,1747,7066,9356,2389,2873,12183,2473,1697,3228,10156,10966,4171,15363,14062,9602,691,12123,10982,490,11514,5859,1879,5698,11329,11712,11254,15608,13238,8812,8895,9956,4377,1949,8033,6362,10295,4298,10134,1269,12483,484,11763,3496,2792,8943,9534,7706,7862,3764,2175,81,15228,5865,15015,15803,2985,8717,8890,4284,16329,16181,6021,12123,5214,15961,8291,4543,1209,7792,9890,967,15727,12189,815,8876,10730,14748,6657,8954,14464,1969,8968,1481,7467,13220,4828,9437,8480,11632,9847,8832,7227,13257,42,5120,10231,5422,3360,253,987,9381,9834,11388,869,14231,2536,4372,1160,16041,1422,5568,14928,16373,7120,10675,15631,2443,8624,11147,15171,15714,5688,3702,3523,2380,14164,7586,11053,1679,8183,4113,5068,6458,5143,11341,4451,13775,14625,13625,3145,3271,15029,500,289,2848,4111,4867,9499,2213,13166,10201,6449,3119,8313,11246,8411,9713,1753,2283,9474,2998,15883,1906,7404,5900,10442,9323,12270,14543,15168,4811,13323,14863,1959,8274,950,12861,8504,112,3436,10479,432,6386,14074,14111,3648,15608,11811,15818,12113,734,12579,46,13402,12135,10586,12620,421,11091,8774,2138,6710,4163,4762,16258,3369,580,3819,10058,5747,867,4639,712,8486,2835,14992,13651,14435,14095,9536,15087,7612,5702,3342,15355,8358,786,13620,478,3865,8539,10409,16236,12602,1318,3707,9392,15319,14377,13800,7606,3796,6475,11995,10069,3457,15241,13398,6386,2444,8417,176,12981,7918,9029,11832,5051,14940,797,11394,9597,7198,2338,13882,6385,4428,5717,12236,4176,2647,7882,3920,13397,14425,2067,10722,12183,13456,10604,10912,15937,6490,5645,12574,163,15337,6444,10783,2217,12216,10710,15873,14846,8959,399,8607,14462,4418,4813,7680,7936,12298,8976,15096,13835,4540,2009,2326,11519,14911,3909,13635,14958,13564,3347,10822,10547,6545,15671,400,6041,508,482,9398,7337,2001,16236,10648,2314,7794,15722,9498,16379,3127,2295,13924,11644,7390,12144,7890,16000,1027,1214,3170,7964,511,12031,8074,1617,7752,12221,2965,10671,9819,2126,14744,12114,13090,3055,11258,3959,8147,1391,6748,12235,3794,11072,10662,15594,8175,2093,13604,1537,11304,2412,13407,5995,9841,4448,13720,2240,5277,958,2551,9324,9442,5615,1010,12268,10924,11586,10770,10957,501,12488,4612,7443,2953,13405,8768,14630,4081,8726,921,8731,10897,4797,3770,14582,7513,118,11382,1131,7115,14790,9540,6814,6792,11068,16015,7699,4240,1504,9052,266,7866,14493,16077,7847,5091,13681,10355,8491,442,10219,10886,3178,8710,14259,8668,2089,14029,9956,2726,753,5780,4209,7963,981,13411,8974,14306,15218,7154,8168,6544,12604,13070,9377,2869,9620,2030,3408,6198,4190,16170,13454,9074,11157,12039,15545,12082,8377,1697,16137,4353,11208,3461,5230,5676,12955,4246,1795,9019,15096,15315,11439,3896,2507,7219,9451,15428,13618,8840,14436,12451,12853,1487,13329,1910,11733,12859,8514,8155,10823,13722,0,4704,264,10559,12218,2119,8634,12380,13167,2331,15693,5524,16063,10597,3217,2928,1112,2004,1092,3596,2059,13834,15928,5965,5178,8715,3744,15580,14652,15307,4519,9157,2289,5747,6561,9956,7357,11617,3233,5638,6302,15846,13147,14734,1121,10202,7139,12119,13780,2755,3030,12613,5901,15519,13043,4815,10565,820,3153,4966,14815,10355,344,12118,13241,5905,14971,9406,4932,9323,3025,3245,4278,8895,5609,5958,12268,2235,11989,15750,1836,11038,5684,2454,5616,1814,5034,2101,8497,2138,7592,14327,2893,3848,14639,2557,3980,11224,4591,10239,16023,13938,8997,10249,289,4088,8796,14817,13962,898,6363,3214,5978,3843,9747,13759,7884,10807,11482,13130,10034,9112,5092,15032,1907,16298,6142,8165,6532,12803,13252,15881,105,4047,2211,7786,15740,3715,9158,6222,7960,1349,11048,13896,8872,9358,16136,10984,5744,6179,13461,13955,4774,14550,10437,14461,13824,1072,9365,11823,15968,13104,16312,7047,15767,5508,14878,5489,12685,3762,14065,14851,5050,6340,1706,3737,12114,15388,12112,12337,13233,6542,10859,1892,7882,11111,7521,9790,9305,3510,16117,3035,1652,6479,10155,15089,2674,9464,9643,12073,4510,11962,8917,1349,3476,8093,3041,2873,9471,8754,1484,12108,13414,5657,13830,13474,8997,7082,13041,10854,3888,5558,5042,95,16070,6509,16136,16315,1149,12958,12966,5086,10105,12189,5470,7682,5246,8826,14548,5561,5202,2804,8503,4568,2779,7712,6996,3237,6645,13889,14078,13478,1485,14349,6614,8055,4933,15841,9091,5801,13061,13726,9604,7927,11244,16368,11108,7034,1075,1638,4993,6923,13234,3704,3411,2516,9039,2112,2047,237,11701,294,8536,15257,13418,15475,6094,2704,11106,11165,5813,6129,1368,6328,8089,10494,11534,14428,15443,10175,10376,7294,10323,3836,1184,9366,1296,14377,2207,9924,13332,6766,12365,12350,12560,3021,12506,1016,15904,4294,1405,11493,11992,6921,6132,9685,7444,1692,14159,3087,5484,10764,3423,5164,3886,4215,9015,12877,338,10713,4996,13637,14750,6408,5862,3714,10145,14626,4943,546,11104,7683,2618,4020,2282,10297,9979,12739,9045,15159,16164,8125,8378,6726,15445,3449,1806,4469,12302,11985,8542,1083,14803,11116,10733,11874,1376,3680,12765,3126,4119,13638,5482,4151,9183,7216,11926,14422,8118,2027,3424,13185,13821,4948,13972,3725,11582,10182,2405,11838,2224,7970,12517,15846,3028,9197,6690,11571,13450,3669,12638,170,4993,14854,14492,15180,10160,10555,14770,1215,1355,13034,14004,9589,13388,16111,15408,2437,7470,13047,852,10767,10256,3955,2540,4416,7577,15719,14692,5480,6335,3109,16239,6941,10665,15691,8105,4186,8838,11990,14824,1249,364,6429,1874,3034,2635,8181,5553,8149,1160,7530,2477,6121,9136,1184,8602,10511,12978,4304,13952,14921,13928,6023,5341,1507,11648,13296,12192,15328,4494,10802,3143,10850,13592,8994,16016,13066,11830,16114,8201,5515,1004,16020,12734,531,12717,12628,2016,10482,9494,15319,12529,2909,12119,5183,14256,8646,3701,434,2231,2373,3726,14411,14362,5836,16166,11171,16173,8101,11297,5019,299,9534,6488,12843,15140,4200,13869,10912,7298,14594,10444,12055,2645,13808,1927,6754,1503,7491,9146,10694,10140,12584,5586,10160,4660,3788,9409,2189,15816,4126,2767,10296,49,15333,16220,3301,7776,12059,16093,857,9892,10379,11346,1849,4812,14549,16198,10185,4581,15781,5675,256,15465,1989,15706,5156,2445,1038,13875,12839,15932,16018,2555,9593,1960,1413,16126,15574,2678,11016,16120,12515,7950,4459,15027,16329,3437,4201,6076,656,15978,4882,7470,10532,11613,8178,5569,16359,14805,11002,16177,2339,343,8900,5629,14145,13046,533,10163,9503,13667,1158,514,8847,3771,10229,10938,8442,12839,11156,288,8408,15266,2758,6971,5558,15092,1768,9353,14379,10765,14537,2168,15188,1869,9974,7309,7668,10956,1493,8826,9509,3276,11342,11721,14183,11547,6629,2014,14099,8548,8469,8198,8803,2882,7925,6438,10771,5892,2768,7377,3750,2637,13694,1771,6062,9893,15641,5645,9173,2492,8485,2346,2409,5864,8452,3674,14265,2006,334,15601,12110,12330,10963,5017,15198,2224,4132,1931,2998,9950,4666,5654,9793,5995,12916,14746,976,8848,3808,4304,9029,6282,8139,4629,6372,15779,16112,11324,16086,13792,15801,10720,12817,6221,2451,10069,4855,15082,4676,12888,6487,15233,15239,1578,9290,7937,7958,14642,4039,12937,12508,7931,7980,3963,3305,1838,12179,6394,13415,4549,6234,264,6713,13356,7253,9361,2693,1998,12640,10533,13979,4062,3133,828,11452,14778,6328,7110,15564,1611,3227,628,4305,6866,5327,15108,14864,891,4455,11848,4235,13225,3114,4030,7948,10365,5924,534,15226,981,13436,8875,1660,318,8831,14665,8568,2171,1868,3025,3287,15028,15415,5263,12675,12639,13370,5373,10543,189,3211,9632,10858,11727,12185,11407,15169,12893,7696,4125,2360,14692,2653,12736,7741,14071,10535,2902,9474,2405,16048,13566,15123,1735,5006,5602,15262,7555,6730,13944,236,13846,11055,12010,16182,8430,3031,2992,7295,8265,4641,7025,3290,13448,9373,9564,13281,15537,13672,11509,8374,11180,15228,12434,6606,9986,13288,12938,6361,15686,13468,7221,3548,3472,5863,10325,7254,10301,11768,4818,4224,9160,10609,7490,3771,12278,15369,3363,16205,1386,6586,5724,10668,1941,7168,1747,8648,7458,9146,10328,5939,15690,13812,14445,9100,3845,6116,3753,11124,6728,6338,15991,15602,5848,10985,874,12954,2642,9253,14378,7934,9423,12433,8552,13455,1265,7152,14464,5737,15328,7534,3959,16086,12963,8590,6269,5664,12576,6861,2362,7317,5270,2570,6677,1399,979,13953,1961,16099,976,11720,11267,13430,2773,11535,10264,7581,9175,3520,15084,3968,7095,191,12321,1671,7323,1494,4186,14037,9700,14132,11829,3123,12377,2267,2825,14905,4278,688,13725,11610,12681,11952,9117,11124,16043,906,15359,14758,7145,2746,5526,1296,7124,15461,15020,6555,8458,10605,6311,14381,12716,16297,7773,635,11261,8325,10882,4400,10770,6116,2150,6751,4656,4919,445,10376,3542,5030,19,13050,1111,8837,3774,1308,1399,801,1729,1082,12355,14257,3412,6862,12422,939,10997,7019,4924,11931,6290,1629,7345,9089,11851,14813,8630,8365,5887,4471,12299,12188,3995,15287,534,9370,15221,13987,6510,3158,12760,2136,14157,7654,8007,13389,15118,15131,5703,4437,1396,455,5272,12591,10709,10362,2521,4221,115,16165,14256,12233,2874,9780,5511,10753,16043,1913,5251,13159,8223,12308,4565,3600,14668,3387,8597,14406,12663,8713,9510,11594,12080,13086,152,12457,14386,2120,13807,6951,14458,15553,12235,8819,13756,3803,8936,4133,15521,6176,2381,6788,6499,9009,13085,4225,15550,15925,12298,9414,6746,41,13819,16158,8820,1740,6789,7703,11254,6368,10687,928,7749,6370,4248,5913,3463,14801,9176,3534,401,4916,13957,12587,9121,9132,3493,12948,2789,11649,14860,3365,3947,1232,14510,3690,3300,738,13376,12707,5298,10638,12889,7468,12334,11909,2877,2076,716,8368,13030,6599,14035,13353,4565,6312,6399,13337,11072,8790,10539,7206,13557,7705,12671,9784,11692,11740,15105,3266,13750,11402,3821,1901,15542,299,3341,988,14061,9217,15103,8956,14837,16165,15076,11110,1458,8825,9698,9064,4392,482,13551,13466,3307,6873,4697,6713,190,6790,7055,5690,1015,9262,7518,16263,11469,11991,15596,6171,13130,7098,9636,665,14326,12622,1761,11128,4521,7351,13287,7014,2847,12921,5459,3594,11447,5529,16294,2760,6310,5256,14684,5684,14403,13640,15708,938,4713,11454,5006,11537,7145,8337,12938,6852,14207,13021,9760,10086,7864,483,7245,1693,8126,15571,10476,7179,11941,15715,4867,1602,8314,5393,4289,10550,5377,4019,1803,5021,14466,4376,3767,2460,285,12972,15556,2365,14110,10008,2983,3421,11796,15988,4950,7063,8459,8116,11869,12684,16110,12449,4099,8519,14138,12459,9573,16268,11288,1265,8154,15093,5135,12405,3734,8675,5473,1914,11856,11884,12413,5367,7360,15222,12484,5638,15794,3449,1950,13050,9939,528,8273,3485,365,5708,1354,6545,4597,9910,9186,11048,11736,6171,1570,1466,3854,776,10292,12076,7058,475,3290,14322,3799,10695,9162,10178,9237,15052,11366,4491,10902,9148,16039,15821,8185,4385,6121,12248,13045,12539,7863,10711,11863,9436,10510,2013,1213,10667,2215,16321,7516,6901,15792,574,7794,14070,15838,13455,3423,10652,12552,1380,4972,12755,15887,13302,2130,11113,4795,10560,14912,567,6833,11581,961,5450,8414,2954,11683,11778,1793,1481,11254,1962,5232,1908,14787,10734,6507,3108,12813,14499,4341,16143,3762,13166,3017,13159,2002,3010,16301,3625,8196,6908,6252,15822,10127,5228,6100,1497,3626,7122,3926,2964,11646,1515,7029,2350,2876,5098,9010,13762,7111,4016,11154,14413,13633,15667,13684,1632,10691,2038,1892,2224,15344,10781,14403,1605,5787,2442,5172,6382,6918,12044,4417,1347,4799,15368,1380,395,4561,872,34,1283,11937,5779,12931,9453,10333,9498,731,14695,13811,16368,15173,16022,6612,3661,3290,2975,11506,5158,9093,8881,16102,6281,4327,11613,14188,7352,7357,10888,3040,5042,9872,14741,8927,11371,504,248,2986,3013,2290,8323,59,11352,15838,11,3705,3820,14761,10787,7415,538,7795,3248,12418,4486,3377,2671,13323,1066,10773,4222,7957,10320,3848,6359,7015,15344,11989,11200,15845,2287,8715,12963,16098,10586,544,10337,14443,15100,13782,2451,9192,3558,15925,15080,8248,9725,11965,1465,5186,15964,6688,1287,1277,14991,12907,12127,3057,7902,3500,10709,14545,12493,14818,11056,987,14536,11940,8660,10852,6810,9015,7205,15538,11884,10914,6154,9951,13652,14095,15211,9261,4985,2730,4375,1468,12206,13067,3989,11786,7105,4675,307,14201,5412,14641,8673,10108,15812,15048,12611,4963,847,9012,13662,4264,895,10065,13089,8722,4735,9539,13305,15893,1720,2611,3572,15597,726,4560,5838,13017,8717,1411,9177,9978,3537,13772,14365,10926,10413,8409,10565,4588,14856,15278,4345,6320,3322,7872,2114,5181,12681,4107,15679,1823,12182,1825,6591,7087,14420,713,12118,7515,13641,12435,14295,185,11191,10036,1276,11224,372,9433,6770,12486,819,3363,6736,4575,13857,7557,4796,1933,2315,5483,2731,8133,2506,4306,12098,7870,12407,6800,3328,13581,1072,9110,7073,12032,15850,4681,6809,2152,3385,2618,450,11790,7542,3898,3996,2773,14274,6550,12797,14536,8431,4560,5411,2541,8091,5986,10553,10887,7069,14730,1629,1095,14832,3207,2881,2457,12173,6349,6336,3881,7852,7315,14659,3961,2215,14453,10561,12369,11323,1270,14050,14442,9477,11074,2891,1087,6891,7109,12746,6132,9860,301,14719,15648,3380,8112,11987,4438,7236,6549,15331,4556,8863,7520,6875,10813,2765,13982,1106,1355,3040,10934,13682,4875,12370,8561,2160,8924,13803,4626,15573,3523,1949,3617,2989,3704,15402,7389,1739,14291,14323,2104,7122,8227,14509,4582,3759,13058,6787,13370,15235,2004,4262,7440,3679,2189,3567,2827,3553,6877,12882,3914,109,10328,10608,3988,16066,5201,3402,7324,8924,7923,9317,7113,8324,13263,15799,11996,4780,2316,1218,11359,1704,10559,1140,9787,2530,12689,15432,2402,5790,8648,5518,25,9741,3497,12566,356,13028,10321,3780,1536,11798,13732,11105,13707,15228,7732,10358,5764,11762,11244,3399,9922,12364,7935,10383,5912,9218,11361,6651,15057,12400,5155,270,9467,8650,2865,15285,12266,5743,1022,6320,15592,9287,11338,13309,6205,4767,6351,16344,10001,4854,6715,8848,13144,14678,2988,10058,10470,4373,15097,4919,1856,1222,5359,8692,1082,11696,9651,3804,7760,9395,15549,1287,10222,11461,14977,5632,6883,10181,13323,7111,8304,10050,4659,14143,1873,4705,2556,10671,13003,567,236,2355,13135,417,6364,3636,12395,6678,10869,15246,6148,10591,11558,8621,7521,9031,12157,1764,2756,10484,10598,14457,14890,5277,12031,7668,4155,12169,15583,3508,2101,5481,4358,3688,1895,6806,3698,2832,9564,13839,10278,5001,6812,1332,9101,10567,8247,10806,7211,9402,10199,14187,5302,1642,14193,9594,5586,9339,11894,14401,11743,11621,13618,7258,6960,234,7652,11692,8349,12011,7074,1633,4205,7952,4581,6237,15232,11779,15923,9426,10891,6501,13765,15968,10216,12140,7075,3451,6501,4677,11048,3762,1240,11338,9962,5579,11635,4031,3170,2548,1433,233,14501,9443,2075,1733,8430,16099,3915,16230,14418,15291,10255,4982,8794,13322,8716,8784,6755,12894,3117,13184,11722,15492,14720,12364,1714,6141,949,6527,1519,15563,9544,8139,1184,1055,14205,2831,14119,2261,11502,1074,12411,11917,5648,7899,3790,8711,13843,16166,5363,190,14131,761,7045,15449,15702,5956,11806,7967,11096,2182,9092,11841,8777,3564,3024,6596,3780,2944,6166,9100,8594,5731,7182,2413,3885,3029,9254,6153,11891,11049,688,1525,835,5645,3575,11086,1591,4231,9657,793,6630,4281,13327,15994,9702,15616,7844,14147,1526,2920,3747,8906,9477,15308,8734,3188,11625,5315,7787,12978,16313,4943,4430,561,15659,7479,7488,9965,3987,1563,5879,12504,13427,7408,9146,6376,7464,8957,3981,2836,11543,8081,8055,1535,10017,11538,4132,8935,11322,8297,10334,2,12323,14116,10039,2707,2184,4850,23,14379,4482,1159,5140,13554,10503,10995,1912,2687,1208,2224,12027,2442,13622,4944,16126,10432,9923,1319,11983,4511,15424,11070,8298,4456,3371,13289,4911,9381,14924,4500,7594,1376,4190,3257,4265,16212,7116,13898,12295,6731,15941,4614,10857,5162,11995,1900,15577,804,9208,11588,15659,5296,5764,10621,9195,14885,6981,13384,3406,1622,984,9913,3019,15243,13092,13558,3327,3017,15151,10292,7975,5184,3141,9551,13685,14679,1298,11641,13429,10934,3849,1686,5161,12177,14224,4986,14677,6955,7090,9911,1825,4181,586,8881,6223,8560,10904,4895,6180,9236,3252,4671,12925,13492,6074,10851,8198,4395,1363,14284,8948,3359,14594,14104,4651,14014,1601,1181,5918,9626,9605,10978,12728,13257,7560,8568,15978,8505,16077,382,8042,12127,10672,8535,4601,4520,8333,2114,16370,4310,8876,8373,16121,4753,6981,14909,14287,3769,8366,13400,6675,900,12135,11264,2496,7911,14571,11210,3192,11869,9560,14473,139,3796,444,13889,16139,14853,9178,10893,7683,5344,3680,6404,3564,14692,420,3521,7073,5113,3419,1848,14966,7019,14711,15403,3546,12309,9000,534,10595,206,11467,9044,13495,12303,194,82,14153,4318,15575,310,6065,5560,2329,1415,3830,2186,15447,6054,11332,15412,8976,14285,1009,10750,15136,10439,14702,4961,7967,11618,13212,2925,8958,1722,12717,12112,11143,1462,7642,5875,6169,1111,1542,8734,11403,14449,23,10708,5191,8512,7406,11899,9678,2378,14086,8531,15939,2268,4575,8579,8869,13413,3655,13512,8433,2348,1904,8452,7877,15243,4755,14112,15350,8656,1577,15088,13613,14022,14806,9570,9537,15098,15390,4911,6780,9333,3425,10433,10657,11498,10305,12797,14254,9746,1209,3789,2071,5183,4624,14343,4450,15338,7530,11042,9890,9988,7772,15037,15339,11816,14703,11344,9338,15380,13897,1851,12837,5411,4349,16222,10745,4389,8700,11954,1061,12177,623,8882,14054,2224,3513,15925,13603,6705,4366,11304,133,16294,11356,12378,14401,13243,13030,2677,345,10964,11018,13893,5182,5222,3896,13377,13424,13499,5738,10029,4356,3490,1059,14896,14927,1705,9704,1968,14531,1395,10188,10566,3964,3155,8182,5442,11648,15945,9297,15893,9543,16049,7563,8276,12280,13298,6539,13775,15550,16343,4927,12111,3446,13843,2662,5139,6689,13423,4735,9876,14293,2511,5229,10154,12423,5922,8845,111,7279,3223,1510,603,1827,5041,1606,12670,8306,6360,3919,16324,2950,11079,14785,3797,7748,16228,5836,5419,559,1332,4766,13387,14486,2947,4087,15325,6636,15491,6065,2710,11330,5669,10898,10107,6328,15317,16059,5955,8231,8580,4940,5428,817,13152,14930,6520,1211,11939,9798,13148,9815,2456,2651,146,11920,6521,10660,15920,1769,9648,9151,10625,3764,5390,14363,8205,1142,15026,8013,13548,2842,16276,16122,3982,15059,12263,9434,9873,12373,928,2392,4198,711,3803,2632,7726,7254,269,4717,12975,10526,2946,1519,3609,5992,11259,15847,237,15220,2683,11341,14814,9767,11870,10925,2880,4387,13358,2691,16045,5965,12156,10505,10263,14024,11309,4719,10682,8720,7612,14885,8038,10285,7541,11513,2978,1772,3847,378,4575,9542,10091,585,11547,12234,263,7147,10072,9615,2812,543,483,8419,14014,8934,5465,13897,14510,8871,3323,7487,9246,1053,16275,8353,1614,14279,3685,7440,3305,6270,11126,12796,10315,13018,12316,12422,9623,1233,1756,4031,5998,8360,15651,15452,14899,15761,12978,9906,16285,6988,5117,4693,2286,6661,810,4740,3242,2809,1304,3335,7833,935,10318,7724,10385,2883,12957,9270,12589,12003,5985,8764,2815,4948,11414,14002,10542,10714,7096,11906,10219,1131,428,14638,3090,5122,4080,14081,7226,12114,15552,4977,3343,5902,10065,2282,818,1980,14637,14602,9680,8428,10986,1988,3944,16138,8164,7862,6774,12215,2484,11226,1774,14027,2352,16310,8480,7243,8748,2943,12161,200,7494,10686,291,11853,1692,16234,9433,11967,4635,7890,13182,2070,12138,4234,6713,7319,4203,4921,15646,13358,13955,1286,13187,8932,3280,15440,1059,7033,11516,1234,10538,11367,11519,1385,15471,3562,13914,7894,6111,11902,1124,1196,14222,11109,3341,11454,2203,6043,10224,1527,10095,9941,6143,6577,9245,9965,13234,14794,15025,11562,15665,7018,14561,3300,5217,1431,14263,10954,14071,6486,4253,16002,6396,11235,7166,1816,10889,4834,8864,15593,11953,11479,7422,6047,9536,3770,5573,8337,14140,767,1535,9571,2926,9588,9908,1922,5148,10495,3250,6699,1934,7248,5596,13640,10031,15551,7929,15559,12529,1394,12764,12567,13064,14284,1333,3348,13946,10869,7897,15006,8287,7829,14494,10179,13718,7821,16368,1643,15095,7618,14108,2228,2141,4130,7833,6485,14005,71,15874,7279,9040,14608,493,15902,7203,2177,1705,90,6832,11193,2424,8234,13610,1422,9336,10432,11181,4583,13612,10933,8475,5645,11425,10303,7383,11359,6181,274,14287,16218,4985,9795,13319,13493,3579,12427,3553,8328,4548,12332,15896,6090,14876,11316,15072,15886,10027,14024,16137,4530,13678,2019,15874,3007,15466,3933,10472,2205,632,12873,3936,8133,13156,921,6186,7650,9601,15611,13115,6249,1358,5248,11023,1993,10359,9952,10637,5968,5699,1126,11701,11019,749,11600,7609,1486,7793,12388,6334,15333,14363,3777,5314,6593,5761,1956,8420,418,6597,4709,7907,1230,7160,14602,6260,14920,2579,15894,6474,12880,3037,14779,6966,9848,7855,6087,15005,1736,6746,4830,16320,8908,15813,3830,12528,9814,14826,425,5474,14183,12761,13626,1484,14955,5202,12587,300,12755,4469,5594,7766,8907,11325,6909,12920,856,3975,13846,298,2380,6901,9380,14433,4458,2987,12092,5698,456,13026,14460,9085,2495,4319,12332,6369,11275,1338,9412,11065,2965,16309,8454,10855,15385,803,4372,3635,7799,12810,9685,541,13088,3577,10722,388,11506,2644,5406,13230,14350,6524,4059,13110,14821,307,7629,15954,8542,124,10273,12413,4815,3045,3498,7221,2480,12036,9150,7062,12237,13767,330,7659,304,12608,1987,11095,6412,15665,11936,8530,6903,11064,14029,1745,14361,15647,13086,8472,630,4463,9725,13872,15240,5844,10543,10102,1,3531,12538,7009,138,4474,10019,15915,1898,3463,9086,10565,14606,1688,6932,7722,13189,175,2621,6563,6607,3264,2063,6342,5726,12918,1142,1037,11747,15368,6708,5599,7396,8101,6172,6861,3825,9201,6605,2397,8847,8814,12779,412,9361,5796,7184,10619,9973,7602,2948,13419,7372,16079,8842,13855,4078,2059,860,12442,13139,3,12389,5699,14184,6990,2261,8718,7592,2072,11652,7369,1275,4500,15383,9330,1017,14704,6829,1266,12807,9496,1245,6402,11636,11250,3369,3783,4146,7943,8196,10271,9463,12975,15003,1035,1095,9217,2221,6967,5974,10773,2590,13429,616,4123,15516,4028,1071,596,7617,11188,6623,6221,5101,6469,9649,5930,16184,1290,11018,3249,1464,15402,11133,8616,11982,12000,14643,3057,15108,11828,4954,11432,9494,10118,15280,703,2502,1520,1272,4358,15213,3453,10279,5172,8688,1219,13814,5335,13298,2370,7991,773,3795,7429,2547,3915,7836,8278,7062,14073,11678,14568,4517,10870,7142,1902,15,14616,3994,2405,13217,13205,11570,582,14355,15625,12396,6356,15499,13595,5272,9322,14392,2767,4896,3196,3373,5487,7015,11860,16162,4547,5090,15330,12170,6344,1477,6547,10167,11970,3765,9015,2952,10747,6589,6203,15536,6316,2806,5421,3754,1585,3845,2270,12494,10764,4387,2761,15674,13744,2667,235,14103,2749,1485,8652,2641,14920,6164,209,10340,14297,1841,2421,14250,1290,547,4673,11785,174,6982,14606,9927,15190,2265,12421,11847,8922,11756,2561,12276,13511,11429,14628,8842,12546,6507,5273,4975,9516,5342,11122,4679,674,11964,11273,6118,5133,7717,2166,12213,12733,10069,915,11386,11984,8427,2315,7257,11399,2402,8370,13850,10845,7113,13449,9398,15794,9226,8269,1778,1259,8430,5684,6324,15793,6871,13417,3804,8269,7510,5623,750,8674,5994,14691,8279,5838,919,15216,37,13598,3246,5343,1955,3755,647,15890,4895,7302,12623,8291,6585,4069,6527,11062,6416,246,2749,11435,10433,14246,5833,9081,7235,13783,13893,13632,5958,9538,3271,15991,7153,14103,5872,12640,4196,1599,4218,7975,4678,5896,1106,15608,5254,5152,239,13107,11391,7182,6506,4383,1507,2042,5849,15603,14220,3480,52,3055,11709,2354,78,11657,13974,3404,7205,1121,2500,6526,11181,13102,15379,3112,12100,10890,267,13940,14775,3467,6385,7425,6117,13124,10569,11118,14450,1115,12783,6879,14644,12590,9076,14164,10003,12709,11675,3894,2838,5663,3867,4994,6197,12913,2338,3664,11154,14505,1958,9923,4001,12871,2706,13043,12019,1350,262,6446,13271,2264,14016,8292,5283,4994,636,9020,13233,16277,3902,9204,942,3913,14997,9792,827,2688,7465,4075,2878,5155,3827,16245,3487,3524,2376,15600,7592,12998,7887,628,9468,6116,12950,12629,2989,5523,14392,11414,10823,1995,6390,6927,4811,11438,8753,3593,12256,7971,11953,16034,8196,5578,1072,14770,12341,8211,6694,14424,11613,2677,9353,6001,15678,11191,13832,4791,6356,1397,3722,14633,7022,14149,4686,601,2854,5749,8622,12292,3410,5066,13687,12390,6048,2480,9633,862,15825,7429,8837,3635,15982,11080,3495,9871,8863,7350,3032,6115,13988,1572,12531,7930,10055,9936,9794,1330,1348,11641,14962,3809,8068,5343,7816,9227,8121,6407,9757,4047,10037,7328,7057,11661,2564,11944,421,15968,712,9427,8642,13894,3503,13552,9023,13744,16073,10815,6708,1789,5715,11286,746,6726,2320,15467,10765,13679,8720,2883,3920,16194,10678,49,5131,3696,11661,6801,9642,5767,8125,10111,5687,11697,9679,15062,10426,2113,7225,13259,2463,7586,3457,3688,1108,3989,1137,8580,11954,9623,13014,9954,11520,1539,3389,15039,15059,7227,13091,5579,13094,7643,2430,9139,8274,9688,330,11041,2833,7891,2095,8803,3890,2229,5555,4063,14023,4071,8295,9803,16358,8643,7226,7441,3886,11809,9537,2014,14300,6375,8948,6646,3958,7664,3265,188,5609,935,6891,8491,4847,15653,3330,16326,8232,6556,6808,14611,552,1167,6298,7859,539,13546,15932,7609,3697,13248,10090,1179,3497,10784,11130,4828,1224,13673,4491,4403,14919,2096,14076,13806,8977,6754,6599,984,8588,6096,9111,149,7883,11370,10335,6221,13211,10660,10421,16125,14798,10562,14986,12708,10326,2472,14267,1224,13991,5354,2781,12892,5907,9236,2012,4485,7340,8537,14385,4940,15797,13673,10965,6624,9853,11955,11395,11314,859,6905,3933,7795,7305,4001,6215,10032,8188,7043,1819,13309,3585,9558,14238,10266,769,3099,6711,5092,3135,9801,5576,9847,6453,7967,14365,9239,15434,16149,4162,6786,6349,14746,6865,11710,12770,13172,16106,780,6844,11833,12401,16370,158,14379,14853,2062,13205,12829,447,8117,3213,11997,1585,9411,12009,13627,3812,2040,5911,3097,487,4768,9830,13697,16179,13072,11342,14980,12000,2056,8918,7173,12352,2026,6869,16057,2317,63,1635,6334,15608,14563,5024,16114,12795,15575,3764,9558,5020,3711,3212,15498,12327,12435,715,8939,13025,13809,14485,13724,13974,4255,4614,13573,1818,4537,2525,11795,14421,6315,781,15476,9823,3086,6667,13815,10094,5832,16293,7409,8041,13268,5649,11410,1204,3425,11920,11823,4584,2555,12380,2259,4215,12511,3569,10910,705,15122,13616,13879,12988,8995,14833,8190,3608,11473,87,3655,3319,15182,11020,3657,2580,5100,15024,5510,16336,1652,4462,5139,5601,14863,4113,2419,8941,3185,5992,13410,11869,7870,8634,1912,8023,8547,7436,2994,15367,1303,7316,5571,10296,38,2927,8069,383,14064,16173,2856,12544,5549,14745,5805,10941,7419,4021,4771,2800,10123,9165,2830,931,9847,3352,8228,12439,12281,13074,14298,13205,14605,7489,9954,11247,7255,10365,12332,11862,2573,2990,7157,5102,9726,10432,14430,12050,10938,5416,6842,14087,1830,15833,6410,1890,1975,3177,8026,14259,11691,13210,15559,8606,105,2734,5431,13391,6697,12003,3924,608,6168,10607,16034,8251,4906,13575,5472,5242,1048,16143,2621,12268,14507,9127,2322,7376,14527,2477,13092,6769,13667,12407,8138,4830,8508,7037,11430,15954,11723,9631,13460,14606,14759,7493,10006,2828,8949,16341,15698,6977,7028,4518,13975,7186,4251,15664,9012,12084,15857,6173,9879,10692,7572,15791,15080,4299,14526,3973,4271,9218,11221,7955,13178,15851,11549,3040,9489,15867,8497,4472,441,3582,4942,11489,4670,11989,12426,14227,7632,6334,3228,11430,9872,1192,14722,9612,12866,10128,11237,16341,2406,2471,1791,4233,4377,4784,974,12621,8307,11186,4398,751,649,7358,9690,4464,15988,4179,16104,9095,7373,15757,11418,3650,2892,6026,6139,1975,10881,3655,7295,1073,12813,3028,6349,15787,1268,1889,3671,4462,2994,11100,7459,9199,10986,15415,16308,12270,10595,6654,12186,655,10153,4657,1917,10482,10347,1305,1644,14176,5852,6153,15787,12353,104,12969,5756,9361,15524,14751,1383,6024,9547,715,9135,13009,4460,13815,9701,627,10356,12989,13363,1093,12097,11470,16136,12418,7888,7059,1336,14869,8111,10800,5983,2121,9670,14205,1824,2113,2219,6195,8285,11164,2142,16070,11489,4070,12224,3897,5301,532,9837,11453,5626,993,11201,13670,13394,12751,7865,16018,4257,12482,7782,3457,2922,8027,7375,13572,2083,5067,14723,11787,14578,7131,8300,8158,15541,2601,4338,13598,9967,7150,8846,7397,2702,9776,14215,14042,849,14816,7132,10090,2918,15158,15839,5217,11842,13836,14646,10028,5934,14532,10220,12315,14802,13014,15230,3359,5548,7772,4480,4490,10569,8598,7140,14521,1414,10832,3764,8570,6514,14316,13820,8402,164,4167,1660,4428,7467,3813,2050,3461,7286,2472,9569,2097,14347,6335,15869,4476,13322,9994,10152,2467,12148,4465,15372,8105,13822,2487,2467,12791,8139,11099,10384,14720,5788,9584,13744,5999,5626,3404,2933,5501,13029,919,13606,8994,2945,14198,5050,4280,14382,1411,11688,6028,8597,2368,7995,1811,7796,15328,4781,10752,15122,10943,10679,4561,12441,15025,3717,13192,13890,12390,1735,4154,11809,3824,4374,13193,16229,6483,12982,14434,10620,8146,3397,8519,7378,6281,6608,16001,11230,10073,10277,15672,16061,9398,333,8409,8351,3652,8162,4084,4350,2632,2176,2443,4113,9769,12071,8571,7861,1135,267,5597,801,16189,5669,2047,12005,15989,2351,657,12198,11225,15942,3114,936,14934,8578,7332,12562,7516,13378,1281,10066,6034,876,13698,13460,13812,16079,2587,12792,954,4439,2249,563,1492,8776,12698,375,2244,5099,9087,291,2441,10634,2072,553,5842,1105,5658,6691,11668,14168,7977,13670,11075,4086,13983,6649,6174,11961,8517,12145,14182,2966,5611,14941,7606,8170,6127,1661,2031,12600,12921,10985,5341,4791,11269,3196,4151,9261,8236,13516,1968,8620,9288,12110,12648,15668,530,1757,14826,13094,3610,12882,1162,11481,16002,13111,6366,4834,14617,9590,11270,14951,6383,290,9795,7180,9744,1940,13729,13771,625,7964,14041,8295,15123,13542,2012,15914,4790,11678,5172,12491,5452,14828,4986,5664,7707,4396,4399,15598,6190,13521,14158,6511,1347,3185,11320,12027,7233,10830,1189,16195,7165,4250,4133,976,10617,3096,9799,15344,11338,12150,8681,13117,1243,1919,11602,11847,16334,6923,12129,10408,9931,11983,13325,10510,3586,2662,2703,4621,3048,12713,8842,1952,12014,39,4135,9237,4526,3701,8341,10197,5941,16360,5223,3284,12529,1356,11632,10959,15850,8167,6891,5692,8259,3916,7173,938,10406,4207,2200,4351,1891,6687,9043,627,5083,1552,16075,8296,12029,8063,13848,7920,1004,8299,8275,814,3732,9256,10501,7050,8307,1046,1054,11491,2087,6570,3921,13699,12720,8101,4515,4674,13296,5252,8376,5604,13460,15409,8509,5652,8541,504,13519,12716,2514,13356,8740,2113,5091,524,4928,6921,12686,318,610,7118,9007,6646,4667,2952,15541,2565,14890,16289,8453,6762,8355,10759,7204,7483,2195,8290,1359,3485,12080,14935,7415,8883,13661,3930,13127,13398,7474,2773,10981,14725,15901,1436,11606,10753,11389,12740,16247,6194,10966,2756,11118,11532,9931,15399,9438,15212,11287,3214,1138,16029,7614,14638,9051,3003,7177,4702,5191,108,11981,632,2846,13073,10947,10958,13758,1390,14680,8592,5873,5279,5632,12964,14585,8869,4742,16243,11146,708,4477,9949,7915,5117,1585,15468,10967,14208,10168,14684,2780,5865,3338,3639,15605,12920,15362,5788,5612,16212,5985,16325,267,16316,4881,191,15738,2995,15691,10546,2135,12498,3685,9615,15784,8572,11397,8804,7650,2322,9277,15030,1348,3988,258,8813,6419,898,15724,3313,16047,3065,13662,12641,9151,10121,9739,8070,5683,12750,4626,8517,3932,14204,444,11872,4975,12290,16108,16165,16035,11331,7114,12379,11101,13891,11327,6493,12100,16033,15737,12380,12103,4032,6377,10411,2059,7665,9395,8971,3670,3000,5412,4363,2643,13454,15844,11927,15854,6373,5074,6686,5090,10495,1,933,11343,5802,6502,10098,9515,8377,3104,13805,5023,12115,1999,1898,9,15623,4349,1576,10459,12163,4028,9563,3859,14453,7063,8233,3051,819,14531,5773,7044,14993,4872,8378,4605,15510,13188,9540,1956,4145,447,6743,1145,13525,13564,15385,1051,1573,457,12652,15670,10297,10923,3200,13594,14023,15467,6932,13312,1562,339,15636,13957,10467,4165,9068,14306,486,2836,11157,12252,5396,16045,14840,4396,9581,4996,4957,13888,1590,3710,9252,15815,16280,15458,2897,1953,12483,6336,15476,8872,9038,9990,10006,6597,16068,16115,10526,9299,10343,7823,7549,12602,8537,5345,10223,12437,2347,4414,12110,4274,16365,577,7912,13938,10304,13115,9740,2997,13544,2500,10288,4218,3398,4601,4012,3277,11896,6777,11447,1503,2974,4073,12871,3428,2619,11030,11538,12911,12745,10980,5915,2322,14819,14358,11602,3628,10033,15082,5862,3589,12211,11312,1138,13595,11906,10318,304,7257,7873,11423,3811,3958,3605,5984,9415,8750,15929,9034,7945,7856,13622,2587,15227,13728,14734,15329,1543,14309,2174,6309,9615,15715,8786,1613,8290,7823,9452,7127,415,11690,13491,16126,7055,3258,5414,12451,14730,13353,13911,4675,11642,2989,3555,10106,15785,2290,11010,16188,8722,7269,4323,5965,13467,5119,704,14743,12566,2895,10006,14525,14588,4331,1677,11858,15467,16024,1504,12837,4829,2780,11737,12741,8871,1596,10174,10469,15467,8367,4091,2768,4259,9321,4188,14471,14722,2136,12895,11401,8443,8619,13434,7985,680,5560,4693,3124,578,12893,3604,5299,13678,10046,12770,10574,13100,6916,12444,6883,6050,11511,4531,11076,4373,7457,14031,10449,8994,10018,5750,2532,8918,3532,15706,14192,13472,16258,11168,14497,2569,14535,14743,11719,5259,14038,11427,5272,9417,12245,11310,2839,10923,8215,1368,10374,14228,2532,9518,8608,7466,3987,6720,4542,16132,85,5304,10911,11952,2759,1201,11248,13424,5644,7825,8093,9208,179,3459,13470,90,5677,2711,4473,7649,14033,12562,5853,14786,16276,7216,15893,1214,1764,12573,7492,12457,2493,4382,4210,7531,15850,6786,3592,6395,14284,7417,12166,16042,16301,16179,9817,9124,7575,15488,2416,7681,12458,15130,6832,1200,3528,9618,11282,12557,15495,11628,2789,13699,11668,15286,8426,2738,6722,3640,7786,1274,2384,9850,1998,12523,15343,10169,16116,4492,10408,8947,489,1849,13650,5011,12482,1348,8151,13718,9257,2153,5308,14476,3583,15209,13927,8001,1042,15058,8323,13887,8853,13735,1544,1857,15733,9957,5673,13472,13238,11824,11666,8991,9826,14180,16247,15795,6647,10940,3938,12047,12564,5265,11943,14658,1997,3134,4708,2060,1967,10094,1954,1393,10845,3959,2451,8496,12553,13211,8517,15781,5719,4670,15870,5875,6680,6201,14858,16376,7754,3464,15107,2768,6172,3637,12268,14443,4902,7577,5540,10248,2172,1336,14686,758,5130,15268,8533,2855,7580,14701,2865,2147,2209,9840,3067,12203,4699,10879,9244,2881,13662,942,5662,240,14286,5825,11763,11168,5614,7690,4217,14938,2920,4749,138,7868,3005,15765,11696,8535,8268,7459,8557,5085,3088,12533,12395,4873,12285,10220,6796,127,4878,13868,14733,7516,7050,6554,16348,7998,2304,10354,9435,7027,2759,11437,1843,12340,14583,4293,6539,15169,12594,3412,8415,5917,11709,1160,3680,2331,3197,11001,3104,2605,3246,10974,12853,10954,2996,12635,47,13380,9610,10992,13016,7211,2660,12672,3253,13849,6276,3462,1050,15877,479,9193,4016,12468,3626,12730,16272,5050,16274,11455,2878,5897,8808,14121,3676,5122,5214,3162,13768,9365,3930,13083,1703,12204,3449,5502,4351,2439,9581,9662,4457,15299,14573,10980,35,9240,14225,9641,537,9178,11001,995,11734,7440,6923,6359,1204,11264,7858,9302,3149,15152,15106,2467,7489,8320,7085,10773,15370,13382,4574,1716,4324,2167,13153,9003,1093,847,9378,15344,7049,2796,10090,11420,1771,4078,1449,10853,16214,5891,10370,10584,10310,3845,9527,12461,12411,14701,2114,13774,13958,3140,11917,5010,4770,9456,12468,12459,8363,16214,4713,10463,3044,9245,3260,7941,8672,5659,9766,4134,15637,14909,3995,4634,1947,13084,1653,11030,6764,7129,14203,15329,4597,15302,10716,8526,12658,6152,2599,694,3381,15822,14455,11786,1443,11667,12193,10895,11262,16080,8757,11369,3910,3756,4368,14481,4972,9146,605,14744,6303,10467,11748,15600,8206,15690,4508,12551,3000,346,9534,13223,9757,908,9572,14540,3940,10985,12481,12817,3043,2925,13089,4956,9588,2589,7737,5498,15576,6106,14241,253,3313,9672,5033,7480,10837,11410,9271,2888,1843,1937,2579,11970,8743,12859,12307,11173,8372,3725,539,3705,4350,3920,4881,6222,14333,16023,10138,15324,4503,3428,6657,12220,9687,14157,10343,8139,4110,3585,689,17,11562,9353,6416,10123,4427,15014,1670,453,10040,1820,10730,9673,15150,9130,14649,9337,167,8302,14331,15979,13220,14729,15876,3031,16231,10605,10976,3317,2957,14575,3360,12355,1521,3247,11101,6097,16280,72,6788,263,7646,10259,4555,3332,15043,5045,15977,706,15369,721,7836,7151,3808,4190,1571,4548,10516,6653,2223,13284,14174,12522,925,3620,8379,4004,2136,6025,11470,11315,9604,8655,12024,5257,11743,2229,14063,3931,6931,5413,1899,13779,14353,10378,14057,4411,12686,8252,1840,1279,27,466,2309,9389,1156,15272,14818,7621,1417,3105,11348,14632,1367,8619,9652,11983,9735,14709,6829,2214,15152,920,14551,3013,12669,5708,212,1790,5900,3420,547,14805,14213,294,1972,10321,1207,8444,8692,14657,13491,12044,8200,15043,4669,3748,7309,2775,2375,7591,15413,4702,10020,15278,14280,3914,5637,6183,11906,4371,6713,1539,1530,8119,600,15690,6486,13825,1427,14620,11643,8050,3229,16225,2070,6023,1160,4974,5744,8873,13277,2771,1046,9961,14152,11953,4679,4160,15388,15557,10643,6385,10503,4668,15035,2854,4456,13273,12933,10019,4312,14454,522,16188,5227,201,16292,8890,789,272,9261,1651,11236,15568,15722,9094,12725,15017,10009,8436,13730,67,3323,9878,6237,16052,12696,1969,11041,10211,7512,3366,9291,702,618,4003,16088,7097,16113,13831,14436,5771,15488,12708,12293,6153,9081,15941,682,10510,5206,9510,9505,9251,7816,7647,2,7095,14372,6076,20,15251,10349,5790,8521,8084,7329,5991,10210,16346,5714,8932,14514,291,12478,2793,11978,9803,8773,4922,15096,7900,356,6603,2918,7606,5584,4771,15700,3938,10060,15747,15037,12541,6310,1001,11900,11847,9711,1803,13525,3957,9813,16078,8331,13569,2700,12842,16151,2245,6064,13167,3621,1164,5683,9554,2584,15380,1552,7183,16014,13157,10404,10620,10583,16035,16020,310,10346,12543,15607,16266,1223,13501,1140,1959,7573,5569,1908,10506,6749,3227,8628,611,10605,12832,12423,5542,8825,1198,6710,12694,11496,5908,68,8958,2006,14180,5280,15936,6995,3728,11563,9673,11587,3152,11761,14838,8911,721,4940,13858,13099,4408,2968,3904,15024,1952,2440,9827,6287,2032,14242,5626,11749,7927,792,11860,5548,15959,8751,978,15621,1268,8501,15426,16364,13424,11956,7061,15076,13147,843,10828,7023,13175,8825,16062,9704,10414,4877,3610,12587,4577,11945,14476,4134,2066,15529,7835,3461,3900,14346,3295,5057,282,6805,14487,1461,85,9215,10703,9264,11172,6273,2871,12630,967,6845,11950,10737,4681,2760,10252,956,5723,3331,5013,8269,14517,3494,9444,8762,3764,13027,15425,8299,13236,3408,9930,10253,2568,14706,15173,12520,6198,14803,15345,751,3963,11442,12194,4831,12582,3922,13254,10091,13966,15519,758,7536,2476,14496,15391,593,1856,6523,14996,12554,2386,931,6367,9142,12404,6685,6880,940,11406,10704,2208,476,5046,1265,7374,14247,15604,691,14393,13208,13935,6544,16117,13674,2453,10221,779,7205,14498,3617,5398,8294,6672,7797,15652,15040,10650,8269,8025,16126,8782,6047,8992,14873,8688,3828,135,13887,1484,4240,10536,15877,13939,12457,13997,2517,7450,329,7933,3766,10056,3909,6876,9746,5788,10532,10795,15962,7172,12645,10564,2759,15672,12276,6850,8074,2665,15591,11357,16058,8840,7150,15129,422,656,7951,8490,1667,15798,7188,14622,13658,5738,10931,4498,199,12188,9319,1268,3923,13686,3614,15731,14913,13269,9058,14021,8388,9506,1078,602,10220,2537,7601,11287,16231,12677,286,2798,3736,10529,16105,11420,15624,14195,2235,12640,7534,9049,14984,11273,3610,7878,15980,5363,3190,12375,6314,7071,3228,10703,14660,863,2040,2773,12365,1688,14270,1084,2656,15320,5316,15770,12900,3125,14073,16117,5523,11074,496,11861,5829,10142,15236,1562,5854,2959,15627,6873,4774,4533,11758,12650,4730,4169,9496,2905,1846,4291,5609,11958,1370,930,16151,6239,7106,7112,75,6893,12770,2787,8777,4921,1978,11469,10793,8167,9151,4587,7310,2183,8143,5283,9270,4509,14715,10541,13378,13112,4370,8937,10464,9419,9376,14397,5428,14598,8818,12777,14985,9194,8678,7852,14859,7652,10606,15273,13280,8917,1619,7194,12652,11737,13553,13160,4927,2855,11177,4670,13600,5630,6201,13317,13402,1817,9376,4844,10449,12548,10821,12388,13235,2065,2098,8959,2035,4364,1036,7809,3890,3813,8504,15730,7552,15063,9990,6922,7151,9417,14256,11989,5880,12123,5687,1910,10576,5350,4443,1401,3453,6054,5070,15787,12844,6730,7154,6005,10269,12005,12315,5404,10198,13287,3924,15968,15477,15052,10169,6132,1437,3194,7729,6723,4527,13131,5398,11593,11575,6620,1004,4625,12950,198,4175,15207,5651,4186,9559,8043,2875,3535,15218,11604,10161,5813,3501,5292,7390,13995,10081,9728,9935,13674,14559,1372,391,2269,1805,7514,14054,10820,13933,2787,9825,2990,4617,11078,7845,8739,5902,15506,4916,11167,10637,1908,10437,3923,15277,5292,8781,4926,9972,7409,4789,11675,9496,8865,5764,13238,1273,12588,12364,1819,333,12878,65,7110,13847,15622,6372,2746,15043,12547,9523,16003,10044,2918,8940,6468,12091,8478,778,6470,5606,13471,13487,10360,6880,12200,2111,6040,13749,8217,15194,1501,10998,8005,1484,1027,15443,9444,1,1669,6187,8299,7951,4236,2359,3323,9849,8629,12715,13448,8678,15541,12895,3014,2729,9848,2055,5168,10677,9063,3277,7432,2221,14165,11782,11771,3979,16073,2209,4748,3571,10991,12786,1919,14244,3330,3547,15643,4471,7268,10104,5562,5903,11305,1830,12584,16021,7410,11505,14815,2184,8876,13282,2248,11074,1168,14504,9611,8138,396,1042,629,2163,13849,14404,2996,14209,1157,4930,7938,1068,4469,14827,4135,7217,14226,6480,10257,4975,9653,3924,15340,1230,3924,8481,5065,3720,14577,10968,11417,12706,7647,7779,3090,11515,16382,16005,16044,14743,10936,417,13808,16222,13474,8733,15230,16140,15658,3655,6643,13124,15595,15275,3648,5184,2854,10417,4809,2260,6728,11824,6726,1908,14135,4884,6508,7097,3073,13673,9988,4444,7233,15699,15534,2782,13634,2448,6703,14030,6614,4344,7440,4683,14286,9620,16287,2250,3432,8825,14478,4262,2699,15373,1582,6651,7424,9128,11271,396,1148,4865,15506,8236,9539,14766,14658,9110,8828,9717,1946,12733,11538,10402,14793,5114,6707,14827,4419,15308,13097,5926,2928,13295,2333,981,1601,7642,10292,15391,2203,13183,8712,2705,280,5638,14958,4102,3162,6283,12732,15959,495,5324,3167,3807,2384,999,14365,14319,727,11373,9508,12528,12121,13785,6501,13713,10130,12973,5238,9622,2363,15362,12133,11438,3802,1545,2728,4530,5569,13467,7651,10668,11498,10157,10572,1798,8303,11472,83,9268,11816,3247,13169,671,9407,15810,12280,15950,14092,15944,6424,4211,13325,2185,15974,7634,13897,1961,10606,5475,2882,3385,6696,14935,16054,5476,13004,6242,7644,15728,269,12580,2027,5706,16207,12586,13796,3494,14174,3499,5909,13123,10956,13842,7313,11870,2746,7846,3412,7889,12333,8113,4384,4466,6973,4356,12579,6870,15539,14979,12199,8372,16027,16021,6887,58,6677,3602,5911,13810,13007,383,2713,310,10958,4128,5400,2556,13316,6270,10064,9577,1251,8146,3844,2551,8919,8694,6130,7257,10280,2780,3405,1935,5170,13000,4019,1979,6236,14915,13824,6929,2797,9071,1869,13961,11916,14728,11770,14910,1491,2628,15597,13579,13853,3871,12313,12904,3488,1642,11613,6904,389,1280,7821,6903,14154,5595,15388,2500,5295,14770,1141,14757,13855,14816,12561,5880,5673,4018,7800,10867,304,10624,14022,4479,13929,4954,8652,2682,4139,4633,4950,8876,2914,16161,7585,5196,86,16162,15228,1109,1290,11842,1212,3658,7969,3870,12784,10567,3951,11932,7391,7292,11530,5766,5944,15587,11863,4227,12145,7948,10588,13443,11816,2428,983,8835,15190,5024,7831,14370,13549,13565,16249,13204,8896,16243,5351,10527,11623,1808,572,214,7388,7787,4910,5874,15486,9179,3145,13996,2271,15413,6415,5925,1526,14145,10468,9615,1652,14846,12695,9157,14099,11743,10881,7867,7188,6091,2029,12678,7479,13192,10754,16314,8354,2670,12655,5263,14154,1456,14702,7530,14200,12879,12201,1908,10042,15782,6994,16326,4385,9823,12472,4427,11121,13339,10519,4554,4651,10226,3444,7284,9014,3880,10421,1477,4142,3452,1154,7968,1645,12112,8921,11963,11838,10124,338,11286,12719,5770,5680,2334,11331,7304,5295,9117,8188,1458,1997,16281,15642,14381,11096,13132,203,7736,9507,6566,4162,15272,13641,3884,6600,8842,2577,11689,2193,6672,11424,101,11397,9289,5765,14607,14613,15266,16038,5758,11168,8982,2185,5903,2448,9626,7019,12947,6656,11117,2205,1023,1794,15036,11858,11433,11029,13927,14770,10901,1221,626,4416,583,13537,12105,15187,3250,5500,11143,5048,4079,8854,328,11328,13018,7061,5168,2786,4684,12233,3219,3479,13874,2932,8545,6764,7006,12428,7459,5583,1327,13728,2787,467,9070,669,13033,3229,15396,7466,16312,3508,2589,4018,10822,9556,8530,15683,11989,8265,8186,15435,14523,6506,1245,7436,9335,9193,6864,225,5175,12031,1065,9522,2423,11765,5274,11610,3465,2435,14224,2497,4717,11945,15520,14265,13512,15276,12915,8790,8957,11960,1387,15323,6405,8861,15862,14442,3928,7825,7971,1835,5555,12107,9181,12991,2744,9447,14739,6494,8852,6311,14224,8138,495,15908,8677,10325,16254,4778,11328,7506,11539,4794,2572,7517,7552,8646,11754,1898,7443,16265,10640,8334,8253,13938,16065,4381,13105,12435,5141,7738,7935,920,7788,15444,10461,627,4646,4677,2641,5768,2222,16115,1375,3947,6750,8162,15356,4693,11429,303,6774,10712,14134,14818,1842,3066,15875,12939,12671,12959,879,7826,8730,10660,3048,3194,11881,16056,10814,9493,2142,11073,6381,13749,11163,2348,12813,11154,6005,2883,7190,3056,5499,5860,1135,3297,11027,119,4574,12598,6800,1679,8111,2206,8448,938,3707,16,727,9680,12492,15164,11881,8063,2734,448,13941,2551,2666,7022,256,3905,2715,1570,534,8114,13152,3052,16267,12999,14445,13660,3699,4256,13409,5017,8566,7706,3205,13969,11362,15544,11686,12548,6575,13308,11314,16242,4524,6253,10966,4123,11194,13632,14772,3458,7746,13814,12436,10552,11219,5918,11292,11360,14107,5423,8671,14142,3940,8932,2890,2409,11436,3874,12149,5694,7147,284,7372,10686,7355,14331,714,904,5762,4157,5790,6258,7017,203,2833,5525,10278,6352,2488,594,5804,15141,5995,9688,12022,6572,11372,5961,5607,229,7215,2160,1365,7763,10046,8828,3264,6190,5068,7323,4195,9521,11720,3532,5644,10608,4118,1121,1740,7870,8710,6123,10709,7820,8021,12717,9356,12667,9579,1581,1198,5200,6045,14065,669,10113,14462,10811,15330,14620,1206,13673,3749,15378,8284,3630,7632,16112,15716,137,3993,225,6680,4311,5757,10433,5228,14828,14792,7508,9950,3517,6427,10779,3627,5616,460,993,4785,12030,12617,15386,8365,10886,1486,599,201,1538,1393,11060,15204,9970,6116,5798,12078,2643,15038,11069,14236,5970,16308,3284,13566,16002,6208,1626,5596,12189,6270,14014,15656,317,16066,7993,2059,13850,14636,13248,11678,1424,565,13461,16072,13112,10216,15755,2200,14458,4655,2867,3409,7076,9071,14520,14819,15884,656,6292,7118,15775,11558,2914,5494,15844,6997,4050,690,12193,4270,6720,783,1919,14581,6109,3892,7000,623,8506,13968,3570,10240,3571,11114,9112,1238,985,13225,7403,3143,6913,2035,4752,11982,10263,11389,5260,4661,11922,15465,7541,10834,12964,2260,835,3684,7861,6327,1895,15505,12670,8563,4950,3282,4387,5092,5154,16377,9732,14686,9770,13365,12641,12407,9703,5647,3355,3141,10583,467,8825,12557,10359,9785,7956,11674,1375,10895,10705,14246,12626,5993,4006,14352,8409,6058,3341,10990,3375,1163,15915,2450,3729,12254,5476,9433,14341,9396,15448,14437,13749,11172,4611,10882,2012,14081,1811,4338,4893,246,553,11876,7730,8286,9132,12096,9311,16190,13182,4181,9691,6996,2544,7922,11587,768,15084,10078,10543,7446,7368,73,13414,8693,4316,7289,2183,5474,10412,6756,7019,1021,973,13018,6330,4752,4028,9587,2309,14638,13549,5117,3181,10310,15018,2476,4813,15705,12694,14523,14156,12855,12440,7293,2820,8208,444,5191,5668,3034,8665,2806,7357,13182,12697,13919,2650,14464,14896,6001,13822,7206,8927,1674,3494,8962,8465,7428,16187,2868,7137,9731,7679,6581,4562,5067,515,8711,14050,13438,9675,2350,3006,4708,12578,5936,1399,5426,757,696,15667,16148,11405,6860,559,1527,9371,776,1881,15540,1485,3713,8735,5875,15502,11040,15285,14847,12794,11173,7002,2712,15060,14519,273,1147,5050,5338,9164,4397,9729,1154,3283,7578,14011,2085,3783,13718,9412,10613,5338,3815,3370,14477,11588,11094,13748,10788,1355,1675,1480,5111,12206,1067,14131,13414,11880,9576,11387,15068,9822,5335,2318,4346,7487,6303,6846,7382,10602,10897,1268,4206,6863,3700,12594,13092,9549,5057,4360,2493,3326,8717,6864,12817,16205,16124,4922,13842,11242,14621,1062,16365,910,1455,15717,12084,15855,11687,15350,8585,9535,9205,3847,11217,1982,8417,13212,7749,6112,7530,719,1077,8961,8981,14760,7684,5604,14565,16365,9301,9388,3035,13047,6236,13152,547,8462,1232,6067,10922,3241,12233,1269,6287,10324,12827,566,2992,8857,2640,11712,6656,5325,2041,12643,6141,2438,14059,14520,13031,383,9880,12320,1265,6400,12840,1208,14326,4324,7718,8889,9421,771,16038,2761,15420,9612,7414,14924,13346,12110,2279,5069,11519,16228,5637,2368,2669,3854,10649,12762,12143,9395,2042,10742,9916,11385,6157,1430,15354,9571,5198,4560,12046,9339,12433,3665,15108,380,12340,4496,1597,2850,11874,14083,8572,10573,520,7651,12603,6336,16155,9563,73,2753,5802,9191,1827,1955,229,7907,15000,10006,10725,6681,9412,14349,894,4429,5462,6058,12438,12968,9191,8483,12812,12688,12759,1980,4547,7882,12711,6538,11537,1367,9495,12090,4574,6807,7899,9226,6676,4105,5381,12126,2781,14427,1938,8947,327,14442,12110,10880,5107,5248,14846,12426,13815,10256,10323,8880,9422,7472,1322,4328,5378,12591,2944,9733,9778,11605,14969,11352,12461,6526,2404,1087,300,5417,7205,1929,5085,2141,14672,3034,11638,14147,4026,7959,9093,15787,476,14027,2803,15154,2203,10903,2758,9436,14344,8396,3699,3990,3540,549,4063,10231,14689,7941,9375,7905,5384,6971,4512,14262,1982,14017,14266,13842,13533,3694,13661,9690,621,4677,13765,13985,9400,14374,7168,12910,7572,7279,13227,9953,6542,14759,4022,450,8301,6939,12936,1189,19,11074,11911,8739,15981,9010,871,782,10273,9159,4279,14003,15989,14709,10384,8216,15262,5606,1580,15751,14511,101,13033,5100,211,12687,8027,6474,11601,12383,8252,15008,10102,10677,4188,1535,12778,11013,9690,11425,2805,12414,3195,7603,5029,10186,15031,3184,1030,1381,15583,11037,1623,4653,16148,1149,3534,6082,12038,11924,13719,14190,5520,3412,2453,2605,11280,317,13570,3107,12966,14023,2785,3029,305,5871,1866,12910,4539,5317,5397,15044,8871,3381,11005,8653,11728,8044,2524,5162,11661,16269,13427,13719,3012,10423,1727,2065,9182,10187,8593,13448,5177,7103,8208,681,5296,11546,8162,13689,9316,8891,8640,9133,9457,1160,11391,6523,3619,12301,3540,9057,849,10170,9286,13676,14609,6749,930,9631,8276,11351,7656,8152,15819,14121,2514,2121,8137,12913,2684,11549,6113,15598,9851,3295,4054,8281,6846,5,3709,7464,5667,12077,5394,6358,14177,8142,2785,3943,4774,8581,5889,3077,486,14111,13793,12456,9580,4225,1492,8038,15471,6567,724,15117,4523,1107,10731,5529,6456,8052,7740,4412,15617,15084,6149,4101,472,13146,14457,7772,11554,13044,15384,10580,10222,7121,9015,10224,13883,7808,7458,6622,3827,7046,8120,5358,2116,5384,10515,2371,11680,5503,11843,615,11325,15258,6291,1228,4992,13269,15316,11057,2427,10346,15938,11520,15761,11808,3248,15138,10345,14213,3494,10546,5650,9912,5970,5344,14502,9944,13248,11656,3425,6019,15020,6572,434,9787,14588,4555,11832,10753,2601,13338,11096,9204,14779,15485,6550,7807,14317,2543,1476,4493,13302,10548,11364,9938,9917,14122,11097,3968,4609,7196,6931,3231,13844,16115,6828,1803,3987,10408,16351,16313,3465,249,13135,6049,2420,8852,4872,6597,5327,1746,4873,7868,14342,14771,3202,9997,14870,895,950,11138,11831,8569,1368,14639,14513,476,5929,2473,9654,28,7636,3928,14535,9485,11117,14578,9327,7738,4339,3061,8534,14958,2774,12069,6353,7423,12437,532,7094,11330,1645,6477,11311,15114,770,9979,11910,14671,12613,7312,15054,10794,5915,8072,6253,15276,13381,10172,1353,14719,2355,5027,14024,14885,690,11652,11255,9924,7015,7101,12845,8494,9012,10424,12875,4756,11656,11641,2784,10658,8043,1637,5652,8243,11091,5183,16004,6186,15661,2977,10865,9167,13553,9188,13111,3160,12324,15575,14688,4151,1005,15836,15490,134,15426,8747,5015,5839,9902,3035,13806,9523,13251,2475,10205,8812,5238,15081,13885,14466,15190,320,13236,12735,11447,11577,1196,8433,12274,14144,9185,9679,8506,2694,7666,7617,4096,12373,11632,16145,5114,11014,12350,11448,2636,11273,15374,4038,4602,1650,2527,1729,9694,13108,14688,14488,9955,15307,9492,3650,6386,1720,2892,6384,16145,12308,9327,5344,1601,15425,11874,12999,15666,7613,12695,14695,6465,13672,14001,1878,653,11304,16266,15461,2242,4911,10853,4930,9503,14384,675,2715,13529,9482,13670,7910,2602,10712,1310,4217,1338,14090,9261,4970,2042,1411,10118,15673,15369,8491,7553,5705,14897,12121,1488,7943,2280,235,14209,12347,3648,9559,4211,12335,7342,2074,2610,13618,14548,3115,4504,4778,13510,10836,10287,13681,5241,8043,15844,389,9454,11572,8519,7196,54,16264,2671,16103,3574,5920,4622,10961,1436,2885,2550,9053,1581,3245,9832,15891,8142,14381,1112,14791,6010,8952,13423,13390,10074,13727,6541,12766,12934,5436,437,10877,7138,8166,14572,12930,9765,9959,9601,11130,8577,16150,3888,3754,891,8686,878,6899,9337,4618,10702,10484,9749,12213,7847,5083,2903,2750,116,1598,14848,5477,4359,8971,12791,9071,9603,9555,7584,7789,11240,8176,51,5447,11111,2440,15626,5973,6884,3789,11230,12125,6000,11034,5246,14856,13267,12222,12054,12847,8490,13802,15370,13850,4634,9241,1732,5605,4518,1810,4466,13279,5756,15288,6223,3244,10990,7130,699,12802,4121,3489,3585,7605,11148,16065,10365,12619,257,1347,6290,13343,5751,15498,4735,13505,4159,12800,8332,340,13594,2394,10561,3767,12472,12406,6820,16124,13735,15155,10550,6928,5564,8885,13281,3997,2622,10225,14948,3412,1534,8617,3930,6471,6704,6009,5917,814,12232,14237,14927,3132,11472,13022,13577,5213,6555,15455,9221,3029,5260,2640,6412,11448,8057,10991,284,8521,7321,14184,10788,2724,15908,11054,4907,7228,15349,3793,6168,14167,3828,8851,14798,13211,16215,12558,14505,6379,3472,11613,6172,15087,332,576,4075,8743,5979,15444,3667,4488,11973,1031,7646,15746,3299,6728,2192,7824,14439,15367,7912,11883,13498,13888,13014,11876,12593,6772,14321,10917,15417,12345,9209,15181,15226,554,10055,6073,2693,2085,14251,15373,3198,13347,14743,8762,4878,14633,7871,6911,11205,8597,9325,922,2522,14957,2058,5548,9063,13721,12295,14399,5050,12082,9045,9130,15817,9580,15964,16013,2553,1855,2799,7399,1904,6540,4687,7227,6564,13373,4169,5830,7468,3508,5589,8743,8982,2252,420,4826,14243,11251,9176,12424,9729,9903,12695,13742,5100,7198,8070,14730,4421,14293,2219,15172,9537,15095,3496,12718,4028,12210,1100,1778,8899,630,11220,10600,15031,12814,15819,8008,13325,226,7843,7942,9849,4424,14158,3168,2929,721,4001,3443,5114,1873,15196,13522,8212,13288,5125,11865,10078,7201,994,1454,8991,7437,11855,11961,12612,3765,14845,14202,11225,7198,6735,6782,14189,11162,13556,13518,15341,14269,8260,1886,407,9838,7732,8814,10784,10740,5818,9178,9799,716,9264,2531,13671,14988,9701,10465,15697,15790,1544,7219,3269,16124,797,851,336,12299,15076,5269,10858,7517,11912,14792,8117,11847,329,7598,13425,13448,3365,12780,12113,2048,13789,12527,9337,4337,5547,6051,2043,15193,12951,13040,1722,4255,3326,13126,5788,14461,13892,13492,10955,3281,6017,2631,13750,15016,13655,8982,8856,6115,13622,13543,5507,8690,2227,2021,7354,9143,9783,9440,15999,7520,11586,10012,9196,11339,509,8906,15535,15918,8247,6013,10067,1016,3212,471,6449,11561,10801,15683,7538,15459,16183,14391,13399,5625,13506,14655,5490,4309,8578,3611,2550,15421,10755,12485,3650,846,5647,3488,11020,944,12348,12218,12808,15303,15019,894,12275,14690,205,6891,16184,15859,7756,5813,15141,14177,3183,2936,10728,12764,3660,10350,4593,11959,33,49,6115,11105,12124,5122,2974,4015,132,14807,11150,6308,10052,229,16120,1490,2131,4478,15923,4326,1617,6634,16115,6552,1334,1153,9318,3006,10037,12448,16322,13093,9545,16143,5125,5510,2076,2851,292,3517,712,9399,11570,2881,15686,6479,15807,8967,6837,2057,752,7402,8784,9579,6098,1291,13909,7136,6389,11537,1289,10769,3835,5640,10468,4011,283,9041,14889,10049,6509,7516,13014,9108,15715,4265,8593,3051,15625,1695,8944,9248,10655,4235,12831,1782,3471,952,8531,16029,3731,8985,171,5717,4954,15680,12625,128,6633,7289,1407,4041,7286,14505,5646,171,15176,2276,1259,14326,13924,8108,5067,685,5843,4885,140,13442,9207,13570,7044,4297,10348,9260,13844,5332,10175,11324,9902,11477,3746,14007,9304,14333,1702,13360,15264,4324,4518,8340,5352,12563,11278,13505,3070,410,5617,13065,10988,13288,2919,13004,7540,1208,8988,5036,7300,857,4896,9408,10599,5506,15211,1718,3121,6260,3836,12237,6306,7087,1382,12242,9124,3472,4024,7733,14243,13437,1072,9320,14249,7319,1505,15934,2754,8150,1886,15197,7944,8402,5756,7778,2919,16272,5944,12513,7190,11807,12211,14171,6394,9732,8258,14169,8986,12147,1535,14933,7907,5613,15209,15512,1605,16128,3898,12131,6461,4866,10900,14808,13069,424,3786,3959,1253,6878,2771,8010,6547,1334,16059,2751,14875,5154,6305,10892,12506,3875,12663,12535,333,4386,748,4218,13616,2657,14792,13496,666,13084,11676,14259,3792,329,16040,3944,12612,9477,12741,13075,1380,13506,1250,9459,8565,4256,2515,7350,4389,9648,5828,12023,15364,15282,1784,8137,13042,12277,1095,1152,4546,11261,13571,15944,6762,15366,14051,2078,7380,14071,15530,2354,15962,12458,2026,2085,1318,7140,975,4338,7426,2105,13973,12716,176,9100,4239,2187,10645,5505,13389,9745,14457,1189,1957,7897,12148,8569,8140,9101,15287,5857,6019,2352,9392,7972,8191,9637,12263,418,7589,10634,3618,861,4833,7964,11310,14325,13341,10678,6129,13022,38,2752,2397,11840,9423,9664,4582,13711,5126,14854,5768,672,3630,14630,8558,7403,11426,12789,13184,10928,8035,3988,973,8627,6327,16087,12773,12,1562,10910,8861,4729,12847,13527,3791,2349,2823,8949,4664,13204,1259,5368,15107,11743,375,12602,4864,2468,7932,2311,1661,10523,13842,11483,5038,3874,14674,11503,10610,10752,9821,5113,14710,14813,10231,11036,143,14332,16299,13506,14385,8007,4870,7364,4720,10861,10905,15278,9680,7932,12363,489,13124,6430,12026,5528,12660,774,1206,12599,9842,480,16343,15443,1381,6310,14886,16186,2884,204,7633,12990,13960,9761,13513,15911,1060,14290,10752,13944,8720,4715,5447,12082,14775,10545,13746,5863,12498,3460,12441,5898,1120,15405,8533,7522,11700,7438,9502,4170,4423,3152,4076,4123,1900,1076,4512,3495,4727,7608,2045,11799,4338,9021,11078,13452,627,7556,6034,4686,2836,8037,5304,14115,1350,5356,8221,11387,7306,3290,8578,10710,8805,6545,10286,2785,14620,1202,15298,41,15816,1426,10636,15569,1517,5813,284,4456,12537,8466,12879,3900,3456,10870,7084,9860,15821,1454,10989,9419,2715,10987,4027,4999,4789,12952,12299,11034,5219,9151,2703,6348,8910,10950,9490,9587,8700,1640,14351,11182,15316,8017,15304,14172,14222,10401,14645,12383,9867,8501,5129,4204,5408,4847,1128,8533,5735,2698,9441,6537,4636,5250,16250,11917,5370,8426,14091,8014,4205,985,1024,10200,8939,2503,6162,2739,9089,14015,14340,11046,15013,5753,3452,5458,3301,1208,13577,721,12392,7270,9044,11021,559,8474,825,14019,2321,7968,16142,13259,8551,13481,1434,568,13139,6147,2706,8238,32,10609,2488,5906,16372,3522,6456,7135,9212,11332,11588,7942,5619,10694,13441,11853,514,1461,848,6735,1038,8306,3335,3531,594,6563,2679,12419,12160,11437,9908,15507,2791,10997,9938,12656,12554,10477,7213,5345,9815,13336,2006,14925,9695,7679,10763,7301,8501,6002,8738,14456,13131,13217,10630,4504,7232,13829,15791,866,9247,3419,16142,16008,254,3731,9972,2391,14311,2934,1796,16024,396,9033,8269,11411,10239,16107,14373,343,15501,10386,11839,1516,9421,369,12602,7054,12202,7183,1409,11702,7373,6191,4531,14883,14008,193,3982,2183,2572,12574,11764,11551,7677,13328,1221,8683,425,14725,10008,13088,8843,12340,4988,3237,11623,13809,10076,4002,10397,3957,1223,11324,15839,2467,14764,4166,11906,4620,6908,3987,3956,7136,8037,7272,1363,10056,951,14352,12901,8290,2641,2105,12413,13933,5986,5353,1608,14501,10975,8499,8515,817,13720,4553,9949,8454,59,13293,10659,11021,6417,2974,13522,5713,3992,13995,2836,6735,7780,978,261,2133,12031,6641,12725,12767,13009,14978,5500,13481,7094,4377,10515,2253,11484,11985,5105,3797,13125,9616,6841,10183,14417,11491,3375,8922,13901,3477,9606,13318,11578,10644,3010,4291,6001,13120,1021,930,11108,11685,10159,10633,6332,8846,11197,12348,13070,13432,12908,16185,2784,7196,10911,11869,2366,15599,480,14962,11234,4945,12560,13725,12383,2904,1099,3956,15532,9525,15126,8837,13749,1033,4712,3284,1913,5335,10175,6197,13432,15171,7591,9662,405,10995,7226,8696,5387,804,10378,12728,8902,4731,13812,12010,6966,11961,14757,13255,14984,9824,12177,10284,8104,121,14396,8538,14304,5428,9350,11669,9081,7664,9929,12387,9354,8935,10151,14825,2611,1202,6622,15958,2260,10125,9864,5546,11212,1242,11289,13145,13044,11318,1496,4147,6362,8077,1319,1394,5690,5071,12065,3845,8050,7065,3878,3062,8921,15031,7489,8529,6028,3627,733,11552,13139,6549,8460,13037,7488,4497,4613,11913,1150,6244,4490,3650,9288,9311,6167,11458,4349,14978,14826,2265,12077,2461,9127,2621,4414,9296,9044,11415,10729,4389,16353,7140,12765,12370,5339,3680,7539,15442,7824,0,907,14623,12480,2730,5383,4564,6386,514,13949,13549,10291,4791,7322,3879,5358,360,10238,9117,3538,6313,6681,15276,13058,334,2474,14210,1122,915,502,13099,11017,844,6250,9345,14746,2240,8345,3453,2756,8017,4136,7686,3335,15801,15916,15793,1610,14987,8935,337,10135,11294,5161,12093,7304,2386,9433,5021,12409,16161,11459,12056,5760,12205,15689,15048,4125,13582,14883,4694,15490,3347,1563,6810,1429,3519,3378,8,1214,15709,6887,1873,3146,7720,11149,11409,10873,11343,2615,9428,14562,2780,8611,3338,2942,12487,11311,12877,11897,11832,11381,7938,15559,15097,5079,9911,12953,13597,3294,8799,2267,15585,7573,8513,8449,15737,7307,14831,14923,4970,9368,9537,15597,1981,13456,3854,6597,2003,10765,13073,15781,13931,11035,3885,3145,4401,8357,1085,3856,3505,4554,6041,9852,664,13413,11653,10298,10368,6986,3501,13863,2994,1932,13782,1302,313,5568,3554,5765,13185,11203,6478,14718,1880,14642,301,16227,16074,16220,15956,6767,9021,5043,3344,15898,14597,5533,4692,8103,2678,1915,12519,13648,6580,4116,3385,9467,3018,7351,12564,8651,1164,1649,4821,145,61,4929,9295,2000,10213,5532,6768,3682,3163,682,8408,15215,13011,15054,14967,10820,5361,15286,9518,4547,6998,3408,1102,11633,10819,2735,7505,9942,14117,7758,15529,7255,4728,8816,10593,4595,13956,5891,10154,7586,14712,3428,11100,9911,13708,4583,15564,3526,12509,8648,11289,14873,9494,4101,12659,4915,3208,5501,9942,15164,13684,3722,23,9813,8699,6455,13169,13739,14614,4908,8684,264,81,367,2971,6995,14937,2225,14313,5742,3454,443,14932,8971,7520,6657,3534,8833,8293,3173,2665,2227,5498,5673,2672,3634,3993,14186,125,3680,2683,9430,11127,8272,12691,11585,1548,13571,13493,3866,7664,6794,11440,14565,6323,10953,12238,7926,10720,1279,2768,2288,9735,7852,3505,6314,15515,11425,12637,7059,9760,5133,15390,13000,6458,6663,1602,13743,731,663,15064,14835,7159,8503,5278,1308,324,676,4519,15964,10408,11775,892,13362,16186,14043,13098,946,9271,7321,6210,6873,1299,12489,4177,15275,4368,15349,4057,7954,2870,13830,3259,1357,14080,15136,7423,8382,6507,312,7419,629,15102,15797,2289,5669,14294,2555,14440,7463,16132,2498,503,8585,1612,6236,3109,15811,11346,7315,3805,10433,7029,9136,9353,4559,1996,7617,15914,11623,7219,9492,9232,5222,2950,2000,10192,10794,5217,14342,11930,7640,4282,6490,6617,11153,11971,9658,4913,8350,2187,15380,1957,11239,9018,2705,3323,4070,15447,8922,15729,895,11783,4032,766,10125,3020,6700,4629,1892,664,8572,15661,9469,4420,12220,3492,15785,9200,4922,7962,5025,4464,2507,13366,7056,13543,6219,14186,16237,10503,861,1931,8352,6456,60,3712,11672,5604,4911,4446,8570,6604,3420,5734,1210,5746,1887,7555,15178,10184,9628,12249,15470,8267,11194,6522,4164,8413,10011,2960,15398,12295,9498,6321,10843,12218,5169,14940,3023,8658,5278,9267,13395,6624,9785,13723,7543,8701,15742,72,12676,12699,5671,6849,16273,841,4533,13538,8918,6772,14400,5852,8160,7715,5154,10083,14159,14385,2520,3932,10102,11910,1168,13768,13009,2489,7330,13378,9992,5707,8296,7728,9784,4295,13529,311,13012,8811,7334,15536,14065,6393,4823,13410,14972,996,8833,7280,1013,11095,2033,5230,16058,12164,3497,5612,15885,14508,11150,10978,14368,5363,15024,14648,1505,14096,9346,16070,6548,13223,16383,12838,14978,8626,5513,6234,3184,1598,12521,8313,13923,3239,4755,115,1251,6092,9729,5272,10203,2368,3082,15907,6851,1305,7323,2230,13401,13049,1291,1232,342,14015,8712,4066,5140,15672,9024,477,4539,3807,11877,6683,166,6091,9518,16264,6440,7586,7161,1672,12152,9267,7965,99,15037,1239,8284,292,1199,11093,5527,13675,13214,2597,25,16172,10500,10644,11516,9595,6236,8985,4932,7375,3970,4935,304,450,9439,13978,9151,13183,774,14338,2923,11629,5081,2107,15974,9615,13691,10139,13979,3292,1753,192,13606,1211,7563,8469,6918,4143,5273,14327,915,3378,12547,608,1426,1693,9082,9280,10380,4140,10467,16104,9528,10315,13059,1709,1593,8349,3482,2696,15809,13249,15348,13894,12799,8664,15288,6991,9290,1810,8820,12502,10921,2889,7239,4417,10181,15753,13445,5743,12975,5876,14388,6335,10158,14291,16299,7260,1960,15981,13522,1611,13510,13490,8723,6390,11593,4019,7995,2401,3348,482,12280,12620,573,2505,860,16195,6096,14638,3853,14896,15732,1333,11583,174,12469,6867,9459,2977,1680,8488,5634,3645,8591,4944,7924,12144,3253,5003,12421,10431,14804,4559,5181,14989,15387,15510,15486,3834,11606,1735,9258,7831,9688,8033,854,2278,4996,8035,10277,10852,12961,7798,13428,11181,15912,6180,1557,7004,13352,6204,11226,5253,8657,1227,8965,12247,15279,5475,1653,4893,8705,10420,665,4151,14500,14039,11610,9986,11289,6220,10170,10164,10874,8244,3606,331,15735,2913,10807,6165,9658,3489,11366,9143,14010,7000,3490,14600,11326,3976,16294,96,15053,1315,1182,8319,8551,13950,5104,4041,13693,2413,9620,8912,4367,5989,3160,8371,477,1515,464,9482,14404,3220,15832,5847,5677,14948,2165,8702,13725,9003,4275,15765,6986,106,10105,642,10565,15853,3784,3222,5346,228,14893,15584,5163,11386,5827,12318,11306,1964,9846,6561,6447,2787,8241,289,8548,11816,1929,13313,13693,7215,3604,902,6859,6907,419,4388,11649,4011,13381,15095,190,2131,12005,5979,15206,1531,8962,9369,3777,9153,6008,7693,588,10551,633,7307,15507,2771,14080,15614,3889,1195,5776,8353,3817,12755,12569,14787,14274,11142,3507,11849,13952,13263,14319,10343,5318,542,787,5394,9702,10561,7893,13470,7784,674,8977,2152,13952,13269,4509,10418,12800,157,2915,1152,14269,10877,6246,4558,8440,4579,14260,86,11028,11696,6941,16252,11662,818,2279,8916,2327,419,5324,10411,2665,15029,3229,12546,6833,8518,12344,15409,2047,10726,5565,1325,13107,12404,4126,15667,1401,14502,10500,15137,14972,12671,4719,10268,16318,12248,3113,13879,3056,9667,13969,7853,5893,10209,12746,9216,8737,8530,13122,15469,10243,2559,11411,9307,3954,13674,2578,4776,6363,954,5881,5508,15628,3729,11285,15795,9694,13430,14950,8169,6154,3171,2617,3497,9404,7060,2645,840,15282,13561,2449,7429,12814,3236,14545,485,15895,7607,8854,6493,3345,6611,7943,641,15919,10838,12937,2824,4435,9535,15084,8089,11059,1493,11546,11647,7819,15849,5134,1053,13874,5753,4342,5164,15482,10322,3550,15591,11745,14356,10274,15138,8566,15518,4655,10685,10355,7930,7637,14308,12165,15943,15296,8417,9260,13576,3908,15785,13845,7186,765,6891,3681,1955,13207,15071,3925,3626,15354,8493,10448,7740,9944,11486,3255,9164,10802,2628,6772,6553,11799,525,5380,9179,7984,9910,10671,5546,3891,8626,9076,6975,6709,10057,1432,684,10407,6215,14457,2038,167,15490,11286,2963,13397,15444,13520,12943,12130,2242,10341,12492,4154,4759,11788,11683,6119,493,5182,4556,3491,12842,827,8949,8667,11939,2873,15316,562,16170,14511,14684,4460,3657,11436,15260,5419,10554,9693,4268,8278,1628,9900,12263,14899,924,7843,1286,4202,4710,8489,15270,6635,44,8434,4787,7204,5504,1088,8303,8889,8975,8068,12591,11322,8926,109,1823,10643,9650,14561,4307,12181,12409,4062,15709,6142,2266,13792,2896,5263,10596,1295,9734,798,9403,13817,13487,14356,15581,2408,12821,12604,5791,323,1411,10237,772,3309,660,14141,15810,8587,8716,16293,12040,11222,6059,1192,11575,10892,11903,8154,12634,4212,3025,2983,6839,11390,7939,14469,15127,4400,14509,3047,12201,14250,8883,814,9909,8804,12362,8564,11972,5335,3920,6902,13501,16013,11948,14639,14339,5594,8866,4464,13683,3690,684,2818,8269,2262,11020,12809,15952,12931,15552,12601,8716,8098,9532,4736,6165,9116,503,13505,14746,6592,5845,2582,115,5538,11242,1505,8537,1863,2315,10477,14037,9206,8790,8071,8609,6299,9145,9671,7654,12742,9704,3993,9475,3976,2477,3662,11218,10811,12103,2623,658,1299,6566,15997,414,6286,247,10639,2372,6878,2786,6512,139,2129,15727,5365,585,2277,1441,3277,14757,10193,11428,4381,9266,4267,2558,15768,12150,9914,5607,3713,4595,4707,13670,183,9916,6001,12799,14768,7595,618,818,11361,15138,486,13151,14843,2758,8284,5292,7411,10573,15348,5293,8296,1621,16313,16084,12882,10431,7511,4100,2651,8472,5900,1949,11228,11926,3017,8293,402,8226,1551,16218,14347,1041,7836,11309,14739,5456,5778,884,11763,3576,6616,5,15546,10321,58,1838,13437,15771,1616,725,9310,1911,3900,5996,897,2691,3304,11184,2239,12232,13660,4622,750,15717,3408,11913,8374,1281,13781,7175,8968,1974,537,3801,13218,10057,6459,4835,280,5102,9881,12349,5441,9094,1489,13028,8666,7142,1660,816,203,6598,10626,15883,13155,8725,12653,14924,2033,8914,8108,15166,3287,15016,3781,3799,16330,10178,13101,8584,16186,7646,11471,7998,1387,5479,6326,9148,2776,6080,15667,1121,213,11694,9264,9904,2026,13557,5738,5799,6435,9565,12646,9708,469,10905,5413,15116,5433,1301,15384,6935,12322,12021,5677,10079,16364,10750,11253,12612,7487,9213,10977,3014,1774,14495,11930,10808,14076,15316,2016,2118,14211,4432,5042,13038,7800,254,6526,14399,15608,2136,12934,2078,16257,14049,8171,4479,12984,1030,5656,8352,1607,15466,12162,5066,4401,12097,12386,4162,10207,13982,2619,6434,11182,861,11722,12349,9292,3993,14420,7094,7816,6856,9886,12795,6886,14921,13669,4600,2003,5135,5204,14159,1401,16142,11007,8434,13203,16365,4722,15538,11288,2048,10233,9303,2984,8953,7220,13466,8923,12970,7528,11107,2852,8647,3519,7371,5691,16356,4125,8634,7509,6032,107,12358,7828,2802,14232,4387,5617,5200,5546,6808,5935,7195,14341,2527,5529,13511,6112,2687,9452,4633,12694,16271,1764]> : tensor<16384xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<14>, tensor<16384xi64>) -> (!FHE.eint<14>) - return %1: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 934 - - inputs: - - scalar: 13231 - outputs: - - scalar: 6541 - - inputs: - - scalar: 16383 - outputs: - - scalar: 1764 ---- -description: identity_apply_lookup_table_15bits -program: | - func.func @main(%arg0: !FHE.eint<15>) -> !FHE.eint<15> { - %tlu = arith.constant dense<[27663,6645,16815,7082,10162,20331,18392,19950,8845,27159,22505,8121,27697,19436,1076,18026,18130,22929,13802,12424,23061,29412,1293,24560,1639,24291,10320,18981,3768,1485,10401,10059,5952,29582,27691,25496,25691,10004,32542,21262,684,22622,4095,4240,17023,30334,27008,1659,16115,21168,22955,8063,10372,2244,29330,1571,11154,15745,6075,31009,21932,29524,10203,1780,28841,5963,20896,6951,30727,6899,5173,26409,28953,2238,25557,822,297,22816,9070,21001,21119,25837,3497,24554,17991,21817,305,16492,30415,800,22327,30808,16142,26580,6936,598,19170,10806,21087,1794,23026,30258,5688,5771,10803,25239,15147,1851,1208,8579,25543,4617,30858,16350,15617,21908,5330,25214,13613,12581,16407,3518,12536,9132,7784,12729,2394,9772,8573,32581,14765,14996,3121,14662,11571,17605,22669,19843,10336,14389,28956,21297,20991,22680,26423,1468,6462,12603,18989,16155,3557,18234,26242,25133,19681,15721,11132,531,28624,32461,28624,15393,15415,2611,31021,1654,6903,19590,7004,19008,26526,10933,7853,5355,14536,7876,4730,24777,18323,11463,3621,18133,5429,17383,1426,26659,13146,14505,10304,18050,15199,23396,11425,32198,22889,16973,24225,22847,14616,12006,2274,29908,31888,16782,28558,5844,524,9876,272,4596,10349,16732,21246,398,1701,32661,20233,7228,3180,29156,23574,23254,19590,10735,10073,6726,3216,25545,26936,28277,26212,13893,2340,1569,28655,29717,25071,27450,24829,9690,26170,3907,10441,831,32456,13636,19589,28495,1447,10883,26924,9872,10227,16507,10914,17951,5366,13641,10671,31140,7582,9865,30118,28320,25090,29625,15883,24302,4918,14579,8536,31960,18363,8375,27561,23281,24219,25677,18603,32127,8299,31919,7620,28946,28101,10502,19532,7524,22571,13002,20015,30443,3067,8120,2274,5409,15571,26002,16525,29160,19509,12689,6590,16565,20473,17894,12417,11466,24203,23415,25360,23215,30485,8595,10046,18015,21298,30570,1609,18085,4525,25430,5971,10880,26886,7426,3699,3498,3191,18480,9537,32585,26801,30295,14935,3173,18971,9308,14526,26875,28005,16293,28647,19241,27375,29378,18263,25523,6114,25152,15204,26563,22508,2240,11255,6681,1051,19556,1200,28993,13048,30215,31585,19100,16036,28397,5542,2664,29245,2085,22627,465,19643,4186,24117,2610,18751,20479,10509,29214,12371,11540,5422,5132,26545,21804,5737,25085,13299,10428,26570,28461,17654,14637,16916,10558,4699,13719,5282,9378,25553,5694,486,4444,24640,15804,17210,11257,11500,18867,16807,23375,15715,1291,5654,12732,25912,9485,27902,9596,13353,17893,2295,20872,10177,19687,26086,27161,21408,2577,10965,24940,31426,28684,8676,24332,3072,11459,25700,11198,11381,4602,18169,193,20392,5447,23496,27612,23844,29695,13793,20101,5725,16326,22173,7125,21117,18920,28814,8374,16418,12204,19119,22176,2779,8332,26847,8767,19919,17483,9723,23788,10417,29041,1440,22337,25934,12073,10721,28891,31547,8789,6395,8545,19690,32682,32741,7681,28691,32139,5764,4873,21275,31567,12993,31587,10240,23888,1608,15633,8934,26324,5883,12338,3328,4375,31277,24913,17009,17608,3081,30043,11081,9586,12466,8102,23839,14727,5117,3530,3309,20678,26751,1222,15227,13925,8126,27187,27090,27051,24493,3889,30047,23513,6704,1509,32462,13093,14768,29912,32195,31614,490,13867,14010,9758,7624,15952,14997,16006,13565,13892,9886,11772,31063,12657,26294,377,9916,25793,10610,1832,10631,16713,20350,23335,21490,30957,6024,3356,1552,30228,22788,1443,21307,7674,24040,12521,12751,17006,6499,10145,5452,11470,3250,12130,11971,6533,5023,32727,20530,12264,6220,31424,6170,31831,13326,2841,11855,584,12955,6307,7037,279,19147,18539,17285,31490,29876,27921,21732,9383,7111,22625,19103,13852,29579,9851,8055,30908,28395,9076,7997,26908,10907,2135,26592,14831,31956,18878,28156,12899,5370,15072,24956,15619,17100,15479,19617,486,22503,22843,30782,4636,28787,21329,18137,10426,31258,32219,13378,27962,9084,20115,23904,17113,11227,18956,7663,3965,6059,25924,21509,566,1586,1428,10045,5787,32131,30912,12386,1838,26993,26057,20414,14115,25253,14337,23981,10081,27098,20428,23064,21655,11105,17310,10376,20156,28135,24735,2500,12075,31694,32699,16267,29405,30237,30609,15465,16836,11778,31116,17030,2957,16755,11694,26574,263,25069,17971,16982,1128,13419,20230,32326,6210,19127,14096,15256,32514,5655,9823,8106,13706,20725,22277,1118,3081,4863,29490,9334,25837,11082,21420,27568,16346,23233,13564,15778,24444,19368,31938,15667,22208,4051,21931,27752,7937,30702,7241,4755,30828,27846,4980,20170,481,31318,11936,30028,8066,1607,17735,9544,21491,11011,3761,12800,21330,18640,14098,2304,15643,6356,14330,22474,26477,28724,30659,17893,21011,18771,4434,27120,17221,2546,7810,14869,12391,25378,25386,19993,12130,18651,1512,23806,28223,18982,31385,7019,16589,6446,13407,11825,21323,3827,2381,13630,551,11906,27267,5148,30169,29446,22981,7437,21042,864,13875,30123,10965,18258,15452,18473,10646,3963,12493,18476,8741,16918,6720,5666,6725,17919,9320,12783,11292,24083,17045,23152,29483,19973,9150,1040,6939,17192,15315,1498,8395,15128,1197,16767,12140,19630,26671,1775,29305,28276,22374,30985,32107,2661,8272,25352,30104,5736,12538,9275,19841,1740,19609,2371,11805,3758,6348,32457,26931,27090,20379,5937,16953,16312,6872,15965,27958,10549,20879,7774,27358,31250,9652,3789,20075,21518,1160,30162,1540,21837,12790,19162,25145,1118,32656,14094,21881,21418,23777,8616,27926,8289,22842,16126,9325,18215,23580,8031,28397,8245,27132,7561,18275,3556,22710,12096,20649,23448,7779,11048,25862,1681,28897,12140,2424,29757,28107,9787,30951,17976,24260,27449,4213,21877,18601,15836,20281,17248,28433,4105,28209,14748,11176,20179,30317,16713,29323,282,27116,150,2031,9416,104,28725,7874,14479,12698,15534,1565,2955,23994,16571,273,27377,13614,24544,9383,9404,135,709,29946,529,12552,9630,16300,17648,21373,11914,9570,23276,14226,7663,22589,19589,16413,24119,23169,31847,21412,21662,26702,27400,7400,7261,1154,14075,7320,3559,16682,1474,21698,727,614,28488,24700,22114,25929,25118,12802,29104,23441,17820,8595,27121,18957,9072,25668,12460,29322,16195,16333,8904,13321,13557,6282,10178,22903,3762,4660,21446,23476,1701,30272,13849,9117,648,12518,21254,14670,18170,24881,13005,13225,21474,31952,11246,17757,6337,3128,12038,13938,8952,14125,8871,4486,32473,8908,30140,7805,8385,12069,11070,26552,15197,474,18619,27742,12493,22767,4623,14898,12093,17560,32032,24444,7853,29042,2886,11414,18706,494,18768,15163,17724,11704,24586,5968,21548,23471,15039,26723,25466,11478,2889,29513,23999,12031,30519,22888,18430,20275,14357,13177,24686,28574,22114,29400,26053,23078,10461,6443,5982,5449,31687,26763,23578,21092,7532,10359,22822,17142,31568,25345,1010,21797,4675,23601,3690,6487,7075,1845,26217,29209,9996,27762,18781,1874,19399,15564,6880,14408,7387,12976,28154,1565,19984,8279,6642,5598,14967,30669,20529,5832,12133,2320,13682,21032,12254,13921,16803,894,13803,11728,10859,28715,1115,9890,12428,27721,21861,9340,14795,6752,25986,22621,26534,11516,7578,18512,30151,489,11866,10825,28235,21443,14919,20597,31779,9595,5505,1839,26844,16155,6739,6068,23540,30107,13046,21000,8876,30477,20354,5433,11835,7989,1758,18987,24218,5624,13061,28519,7152,27036,20761,30291,12739,25570,8421,6675,3277,14002,28094,25197,23956,25309,32085,29792,7154,4992,13507,29081,16891,29048,4799,14928,26467,30001,16963,30403,1736,26997,18080,24170,11640,18383,4049,18391,31587,24760,30521,19601,32027,3903,22588,22906,22804,22076,6042,11061,21518,10654,21425,7403,3222,3073,17337,13341,14253,12406,3995,12773,2952,16541,16803,18301,23978,2010,18474,31785,16976,24919,29583,22329,23631,22439,30612,28523,6511,18857,27052,23626,25462,16715,19068,23019,23182,16601,9163,13389,12217,4787,3588,1634,25407,28994,28181,27948,31796,17518,27474,3315,15259,12809,5425,19413,4092,19129,29535,23571,1629,26045,23929,10453,24407,24742,6098,20621,1736,4802,15392,28548,18949,19751,15146,10063,16434,25199,8546,11850,19562,19586,19568,15513,2466,20034,16523,25251,2795,20032,5307,488,3943,28464,14404,12961,3145,22022,18681,9114,22659,767,5282,11084,15520,22435,3619,1277,21016,26035,28793,20370,11363,9641,24167,26790,7831,5468,22200,24571,26618,16650,2214,2804,3398,9845,28721,4931,13656,2827,23324,11444,349,7262,14781,16140,12595,2110,9111,22822,30205,23327,17153,27112,31224,26939,7612,18807,29365,10355,17501,24496,17063,8554,24953,24291,30185,8997,26717,11289,28581,29813,15790,25908,22364,20058,26531,13606,22643,8448,10138,21870,17007,7278,22965,3396,24255,30494,28556,24778,29504,10686,14253,22803,4529,18360,20096,29375,16757,20960,13715,17190,17717,4711,14231,7598,19066,28496,17140,20210,28784,14938,26045,28744,9116,3606,32679,8418,16694,25935,9287,22081,28444,5946,24898,22920,20345,303,27291,17811,28900,5586,14246,32163,19951,31216,29610,27896,7295,18439,24566,20080,21101,29552,26340,14134,14077,31839,6660,2501,15751,24855,29620,8412,8505,32322,16132,19780,17882,15885,13850,3308,23169,26134,5174,4858,10286,23112,10245,22724,32509,14988,402,7662,2785,30850,9565,1471,29999,7513,32418,2490,1173,31612,20424,15889,21402,25336,14564,107,28829,6524,10699,16608,18519,25683,8960,1813,12956,12577,5302,9195,27389,15506,16640,6182,23378,1970,17370,10061,10931,6851,7937,167,24471,11436,24991,21511,4254,5494,29212,24758,11568,18184,8410,133,7941,19701,9251,9626,19571,26676,29541,18512,8633,14197,29667,21224,2572,29596,2821,27394,24626,14164,22712,15614,6926,5201,8282,24180,14596,12462,21000,23752,12819,24591,9363,32114,5750,25106,1881,29157,9678,10904,4542,29948,453,1586,14345,17435,22618,11983,12067,17101,16138,7691,12387,13326,28914,5568,17865,23986,1983,7533,25153,6340,28633,24219,32053,26933,12284,12388,23763,19213,17880,13297,8367,26260,4480,22368,11304,3550,27490,17573,16100,32233,14446,8740,29154,31888,21092,11575,6021,5465,19960,625,1793,2047,32534,3927,29900,3912,5433,2468,18902,32234,20913,5276,4486,16526,18991,14835,22748,29813,30733,5602,19775,501,15686,24030,30474,7808,2872,20103,25346,29978,592,29541,15554,19373,17503,30068,21635,6885,10689,13167,28709,26746,22029,16060,29119,14533,19730,32559,2593,13527,31220,4002,24042,20545,1394,19503,18782,22676,3224,27151,5568,24979,16004,22280,11522,15003,27777,8252,17791,10531,15516,31724,18471,25360,31271,29813,31658,21809,30469,6209,20458,30301,23119,15858,24925,30938,354,28148,10994,6869,13396,20023,8538,29029,10904,9245,20785,29884,21428,2654,11007,7376,3276,3691,31307,26770,4926,8678,6882,23187,30281,10784,18444,7723,22546,4419,28523,5294,27252,13828,17163,26244,6807,10937,27865,22061,1050,22977,15750,23253,22228,13278,6627,9566,3592,23352,22795,24765,23972,14962,5822,14466,30315,719,26350,15689,11848,13251,24404,29337,13365,30080,329,2610,30340,24646,17994,12938,17184,20594,19879,14718,6403,22485,15996,21715,22157,20245,23156,15112,12540,10186,21818,5418,14877,29277,28903,23042,2560,4748,31418,12812,1994,23056,4838,14169,10139,17117,1345,16880,13317,8796,23058,4444,7618,20621,26322,8899,716,22037,13449,2525,13436,24279,3873,32072,17415,1373,24713,11507,23216,4339,14751,26395,5881,16238,23588,26430,32433,20299,18286,7878,27549,29309,7433,12302,6068,6238,18038,3771,18265,20484,23614,17433,2110,14545,30483,9839,6187,20461,7696,6624,24830,24215,25505,29288,3223,14463,31378,8381,16493,2157,27361,6820,12241,132,11417,27988,21944,9702,16743,2046,5064,4094,20899,11917,7797,30118,14103,27930,27080,29139,12768,17141,16132,15905,17879,13745,32679,20180,21904,26600,10911,18937,30519,16399,8419,13689,25476,28302,68,20275,17056,20867,5031,25781,18887,14902,21400,21307,1018,16178,20449,10921,21067,3026,17094,14340,1085,20823,24791,25756,11782,32402,2498,17206,14338,17252,13427,7593,31484,100,17503,13760,15741,732,12330,4361,12077,32339,25007,4745,27886,20495,7293,21095,32572,27016,31865,6885,19389,3815,14436,15620,7948,19504,5662,4854,23998,12588,13121,10952,24049,14267,31850,32603,6650,8091,5664,24535,7730,20328,16101,4239,21646,8274,24529,31200,32419,28205,23838,7549,17369,4107,22087,15169,3301,8658,4658,19888,9828,2982,25307,1531,6304,31899,25627,7398,23406,1658,25555,18052,5359,25016,19244,32616,14412,24103,7150,11880,13539,32515,9220,3820,3111,5677,3887,23542,3571,19098,25795,11799,25468,16355,2003,17438,1725,13423,2694,15853,1195,22240,9951,6976,13629,20785,26492,28389,433,31927,2309,19770,21386,5393,13561,23737,25722,30569,15810,32576,20994,28824,3052,32600,14825,8503,13994,6072,18935,9434,755,31456,5998,17337,13754,5784,12113,26030,18421,8722,6287,21827,15045,5578,3939,26849,30338,25457,3232,29145,27893,29208,18308,1541,26369,8925,17402,2011,23733,10505,6881,16336,6034,6359,28287,5137,18640,18298,1637,32302,4160,19853,32282,17723,23093,5066,17962,8029,1305,13377,16551,3323,2246,27805,11951,22939,31461,2880,21913,23388,21847,13442,26498,9167,10523,18758,28385,19529,18601,192,7515,29685,28317,77,28661,11473,21402,17984,5250,19436,21916,8054,21824,5767,5588,15232,1045,20460,28834,29245,23804,17054,14042,19603,4917,18341,16168,25587,29521,22764,18372,7952,18578,21944,8846,27603,14202,8559,19191,24397,520,30887,15982,29936,11402,31909,23127,13271,21998,3257,14525,6651,10415,30079,24641,20054,23260,23133,12809,16720,7054,16859,22780,13055,17591,23102,14028,21186,13264,21481,27048,12071,16001,31023,9961,19290,4011,9387,3096,925,14481,13951,30380,16868,1255,3762,15141,30163,3003,6121,18870,10361,15805,6030,1062,2874,13933,21897,5592,5643,272,8943,15957,29822,11179,9997,21910,2037,16920,9099,12627,9565,26799,11868,18812,24920,5684,4278,4194,28746,10654,7147,8945,21938,4419,18601,26867,3401,306,1894,24055,6710,23131,27518,23556,129,11230,28412,13425,24411,32535,29401,32402,922,4436,9541,16312,10508,15596,15375,32526,6558,30664,2355,17121,30106,30830,23756,15731,2607,30786,13424,3987,132,26299,17038,5818,5411,4359,15757,26048,27943,26503,9465,13795,10559,21890,20199,16522,5974,10141,5550,136,7843,17208,8832,8287,19654,15205,16400,11977,15551,4958,28693,22974,11612,7201,28669,7431,12686,31728,22198,3215,11674,29195,7886,17961,20792,24272,22506,3352,27010,16319,12127,16370,12100,24619,31859,25225,8025,13499,10529,3355,16138,4466,21991,24798,5102,9021,22682,21280,30801,20125,23276,11741,440,5414,3304,25477,20769,12576,1738,28786,11689,9854,11818,20091,6834,30198,7758,14619,22832,29451,23091,26055,5132,19552,25142,22711,4107,4539,26714,4979,2053,4093,4266,9719,1839,26888,8725,15046,6872,10984,17637,24093,25357,29219,7173,29684,18549,19661,28325,28190,23136,26050,10292,24653,20598,27579,8573,28638,18304,22153,5522,7599,13712,14379,30249,1231,11797,18453,5366,10859,20123,31678,2542,27801,30468,1752,11912,6453,16599,18779,8040,11365,20636,32234,31599,14110,21217,29645,24883,17640,22486,17873,27562,13891,17959,24276,22274,17183,24271,27134,25353,13650,21988,4695,16721,14419,14915,19429,9609,25795,15862,27078,11344,5480,31979,15319,8158,19556,2522,9241,4835,4140,1249,8752,8160,7236,17761,23566,12504,1009,135,24621,28914,740,16129,31331,16464,7138,31088,12152,24838,968,27757,502,13982,30857,28937,1261,7566,24816,3142,25610,8075,7862,1890,22252,11717,13167,17816,25046,17690,4210,7616,30906,10531,15979,3842,30771,5185,2874,4231,20818,24300,16997,15728,15376,18136,1077,30932,7908,11905,25263,29194,25093,2397,7310,23697,7262,27663,29438,10670,4271,16019,29439,24117,7094,8104,24957,430,2712,49,29136,23064,26316,993,4339,1468,9213,19908,6292,32053,18005,7609,24645,4007,10079,20608,652,19557,25558,23726,21465,7255,29420,6871,21212,5607,12316,20391,17800,9573,21220,17169,24783,21941,17748,5441,25844,11279,19698,24165,2364,1658,22280,20156,13889,29878,32208,3279,30121,4737,22760,12927,19391,19070,4238,10516,5891,20636,3424,6840,12127,161,1438,4443,1047,18993,21181,26878,11717,23403,27765,21151,17411,20518,28471,21618,7782,13361,2126,21762,14435,21741,26583,16396,841,1334,25183,22230,29184,11041,9571,30690,35,16320,30892,22877,27692,25214,12048,2498,14723,14241,47,5141,30178,20637,9467,11449,3953,21166,10704,17153,10269,8987,7314,5671,14582,3244,1876,31498,31040,18874,8609,32556,8781,11923,23164,9806,7598,25425,21461,20045,13212,27918,15298,1651,22063,14110,29618,30526,4343,30079,23585,13002,15487,8954,17000,229,17625,15407,1644,14315,25513,25207,2593,7680,7429,17002,5694,11435,13082,28479,16937,2843,25102,26095,13936,4354,17427,13452,29552,4383,18097,21030,12766,5686,1771,27393,21114,29473,28223,19943,22961,3920,24570,32556,10354,6156,31899,27734,21614,32494,21196,13925,2163,9357,2678,21319,9123,6892,3006,1085,26838,12523,4564,1824,31549,21502,9459,32434,8607,28853,5458,22759,9659,16947,5002,8138,29926,16476,2362,28577,32351,28220,2332,31312,14697,24316,31345,19729,21840,2266,5965,6083,5574,24721,26888,9948,18903,4647,3354,22619,25762,20767,14526,17758,2473,12511,14678,30397,19467,8548,17491,9191,563,6942,24599,26243,28731,26111,25939,29557,8801,29499,30725,171,24602,18419,13682,3117,10901,24762,13551,19009,22467,31275,4049,14797,432,17890,23878,24528,27214,10284,12092,25055,7205,12889,29406,19681,2366,12946,27200,25515,3158,3699,7655,16292,19778,13777,19890,6859,7425,20106,4424,20655,16865,28723,10531,13153,22989,16455,5362,6570,9774,18027,6764,26271,2474,10366,14904,29140,11225,3188,1760,9216,4733,9409,29102,13180,31171,4674,3275,17326,26360,24164,17753,19992,10558,8006,13034,29557,11518,1715,21732,5880,13661,7638,11630,28582,14692,21901,2600,28251,12525,6699,16913,20790,237,13000,27279,30536,15938,15512,18382,17359,4906,7539,27854,4107,32304,20088,15806,238,14762,26717,6747,7132,24281,6381,13828,16169,20304,3376,6261,32074,6524,16460,18662,19699,332,20024,16776,7512,25527,25018,1629,23147,31210,3628,10100,4710,32316,25278,10034,19286,4444,11867,21299,7760,2817,9496,18485,18405,536,963,30775,24422,27563,21471,18591,2214,25426,2509,22878,10948,17161,14429,2842,11250,3555,11555,17055,20172,29969,31688,10972,28175,5980,27688,25469,24756,24575,994,29119,18068,20690,22447,1152,10351,16339,13452,9109,22549,22066,20282,2375,4986,24946,18070,10761,8384,9937,31109,25164,7472,5377,12989,9095,6115,1116,27449,23376,157,19042,193,28452,21776,30636,20700,15234,9344,2195,746,29975,15977,7314,12676,17155,29572,10349,26877,30042,10471,18767,16262,28404,31871,1626,18945,26356,28604,28742,13088,8365,2645,27333,18445,17383,7294,23706,14362,15126,6733,11316,23912,6004,14102,1680,24600,12012,10764,28749,14251,13156,6360,9383,29693,17956,18810,24426,2285,2629,6340,2408,2679,14610,9763,28673,26874,8866,12996,13548,14552,3651,28723,32496,21209,25340,9707,23241,15893,31991,32145,30223,31519,4591,8982,27797,25152,15213,24297,31743,88,29843,14051,2916,16769,3630,10038,22651,32043,21405,28345,2326,28060,596,32083,21809,17970,1033,11235,16162,82,12393,16292,1780,19113,17483,25525,23127,22479,8654,5263,21745,15190,27141,30631,1825,21157,30617,20298,16086,9372,14874,17940,29541,31623,28923,4470,5856,20866,8693,557,3181,15950,28040,23337,6030,3204,1186,15559,23697,22662,13434,1172,15047,13584,3069,21844,14666,30493,14554,9689,26153,24540,5453,8148,27481,16918,12048,11001,24325,25058,11885,26205,18970,26610,20516,5733,19367,9228,550,11107,6596,27055,26974,19571,7571,21303,14542,29174,12613,24827,15186,11454,13965,7354,7198,32482,1937,12924,28909,18552,16285,22344,13217,2110,576,14658,26021,19683,22982,1780,2272,19332,19314,27786,29872,11588,15891,14821,11487,17265,7127,23539,10678,5963,22577,5570,29004,15384,20033,13766,18061,16865,16061,22054,383,18118,30695,4201,30833,12535,17382,3502,3067,32385,27624,31975,6724,26713,26974,4128,12729,6145,19186,25051,2364,27677,12189,1806,27872,9917,25737,30558,2889,30362,13424,21965,10757,24144,16779,8970,26522,17797,5696,2577,7140,31029,4771,1505,21322,2168,14848,19288,1486,5941,19571,10662,15398,13568,15429,502,4627,30385,13957,30390,16842,2455,13154,22073,16137,7665,367,18007,6288,7905,16020,20151,27754,206,3517,3875,23007,13898,4019,31317,6197,24496,22801,13453,19128,24529,27074,15339,22172,17999,5466,16900,7253,32137,493,12261,1270,31338,28728,2505,21293,1265,1267,19732,15409,9865,20647,29157,2475,10843,11143,2138,26829,18393,94,6636,6213,6431,18290,21110,31962,20277,19408,31692,16505,23066,12730,972,17176,21004,19745,17301,25775,31732,7549,2085,7265,8075,31613,25259,18475,12030,1372,20292,42,20040,3269,20752,21451,493,25492,28920,14289,13611,16386,20872,2741,18659,15542,17669,25399,22212,27267,3652,4521,21626,6514,20240,18418,29920,29555,11132,22354,22299,7157,29414,16186,11669,13737,11580,23339,31248,11139,28787,21815,6861,25525,1284,8045,26712,25271,25559,2454,24429,9654,6322,4376,18947,14402,32,18259,20927,29015,7316,16882,11917,29348,18643,9748,2745,32034,25575,16387,28375,13116,32181,30946,18745,18523,32257,21417,473,21523,3887,24170,8126,4816,13611,7481,22795,17069,30612,6045,31658,32327,6706,22667,1612,763,530,23494,26735,16456,4044,7186,32275,29248,32756,30602,7526,219,12636,18703,28008,11171,5076,27628,14995,623,14102,30527,28045,2429,22668,9667,21505,28119,7108,8064,30281,2773,21906,13340,3484,16528,601,17542,19115,13006,25508,19148,109,28040,31624,7853,28722,2092,4132,30619,31001,19652,3768,16285,8478,4389,12389,28876,10305,18982,4494,24614,11242,28557,12965,7901,21726,15655,7675,17419,29951,9249,26555,2421,14140,10415,21112,25895,26735,9711,12777,24599,17408,1392,24693,15482,17398,16130,5163,18767,3846,30921,22397,27148,11831,12207,22242,25411,11209,8474,10671,1521,5463,8045,24510,2832,13964,17484,11576,26334,3628,16784,16058,14624,26169,15847,7490,22663,15016,10468,4536,20514,15238,21362,1526,24269,8751,26995,3702,20966,11960,13063,28266,16558,11699,17297,5136,32672,27542,29973,32716,16813,11794,18064,553,15167,2116,9697,11071,20335,16550,21739,22246,27658,22919,6742,4038,11038,25046,23860,21170,14658,6156,7453,19003,32354,2323,23832,20173,28221,32473,22356,9588,16119,9492,23100,19000,21929,23457,8990,10991,1547,19431,23193,30742,6581,20412,12623,6329,16000,13509,29301,13546,24101,11560,10410,24188,2998,21250,16040,4856,25284,27774,14393,11305,16075,32241,28854,31908,11036,5044,6497,18953,25727,15107,6750,19403,16221,32294,15983,5904,24174,15632,4767,2617,2347,22315,2433,21809,15567,8005,31025,1979,517,29698,30176,21506,2833,23238,6815,17160,23641,887,15450,32166,30977,4028,25367,28268,4879,12871,32251,23242,26804,8635,20651,31084,1061,18891,30569,10437,4474,6320,32735,31520,15185,6244,11723,13657,3191,24714,4915,32080,13390,13102,14498,3964,5312,24936,5518,31260,19550,18716,13937,5695,16748,4681,8603,3225,3164,10876,18813,32692,29557,7390,3406,12874,20273,9984,8747,9751,8544,26619,2546,24931,12387,25846,13537,13695,29014,25496,12162,29365,28503,19981,26428,28163,7847,11143,20014,28261,12438,26824,27524,29218,9919,10631,22195,5398,11185,10787,5316,21828,11033,4716,481,30197,29636,21885,3593,25757,21348,11171,20662,25627,2561,29078,9928,4926,488,21096,32440,29010,6767,27681,13329,19190,19189,18409,27942,12524,4412,27636,9397,4686,28445,12607,27389,2040,5035,15941,6256,31154,18857,31181,8620,29238,10172,18948,3610,31389,3235,21338,1993,708,9574,28446,27624,13819,3837,18514,18378,29269,28878,8125,11440,444,30222,13668,2313,1243,17044,25871,27970,2195,13078,11382,25984,8821,3290,5956,13349,30265,14582,29679,31254,21561,2731,7740,547,32204,23763,22137,18007,14363,12692,18603,16041,9328,13183,13885,30646,6454,22139,18708,25456,21762,23406,8441,9495,24738,29114,724,29184,24715,23808,22721,10323,26119,18489,30523,19092,18875,22970,13360,18251,13687,200,27504,11044,14649,8676,928,13995,9801,28469,28869,20757,2950,17558,14221,10093,9668,12392,28455,5608,17324,404,25563,28741,4081,26463,28274,9030,8521,26578,3196,2264,13579,30065,7250,18542,7429,22177,5758,28148,11945,24573,2726,10262,20356,9568,21354,27941,26196,23549,12351,13062,13680,8605,619,24735,4260,17467,14883,4398,10805,3837,13440,20209,4943,2169,15001,13219,9579,6978,3908,17706,25621,11663,9103,32522,2484,2993,32083,7750,8347,26093,2899,31855,24113,16477,18472,25880,14919,3238,30873,10476,2210,19847,25362,24456,22441,22230,8126,11071,4619,22763,4435,32078,671,29062,29736,6374,29653,27001,20426,10473,3123,402,24753,18235,9457,561,14804,12799,28780,29925,2230,17289,30585,30635,3651,17849,15871,11192,12931,27127,12226,30977,16983,13884,13983,27122,31167,22071,13731,12768,24948,11179,31493,23718,1537,16857,4713,10723,19624,19233,2477,562,5839,20497,22554,18251,23192,17009,19572,7474,32572,18696,28081,20636,24877,12134,16550,10512,18447,17899,20338,3883,7898,30757,24242,5637,17027,30320,12325,5847,8958,32435,15999,18808,20906,18184,13161,31687,1723,16225,20541,6777,13370,779,11376,10358,31285,20303,22426,7902,26269,4306,18664,29801,18905,29728,26760,14560,5170,9981,460,9088,6168,2303,18326,17885,29810,9105,1468,3051,11576,22431,20944,7639,10978,21721,19161,5960,18202,29767,30675,18020,20339,14203,32473,9507,17525,14285,4626,10105,1370,27303,15603,30386,18381,6402,18131,15949,13268,21676,29353,24623,28868,11603,11449,4650,23073,28267,26170,14865,10477,15975,8385,1505,23876,2030,334,22083,15756,31679,20274,16328,1029,16505,31199,22566,6292,25083,25771,4382,24307,16210,31473,23877,15865,478,12815,1069,852,1766,17778,30120,8986,4019,14843,18226,22589,30257,27103,21055,20292,1268,12946,25172,15472,11677,28254,23756,27867,7765,20028,28978,26832,22130,2226,31935,15689,27979,7014,13220,14847,30251,23926,25175,31490,126,13513,11481,7016,2920,26333,19677,18989,2137,25898,20359,28089,15929,1702,12027,484,14267,3654,1553,23341,16762,331,15730,15871,6474,32626,8169,4747,12431,1233,31404,14167,32190,5409,13193,4552,13588,25199,16172,11389,20540,8269,3499,21078,20602,19439,14005,24607,30054,19080,19367,12558,19773,12743,28306,21597,22025,2434,30934,17306,22290,9416,23316,3520,15099,27318,17162,17062,2142,17332,4772,24250,21616,30189,4375,6717,9661,26589,20638,19890,9409,27,2456,3118,11044,17587,32037,24216,29257,10819,15561,18958,2975,16308,22907,10991,20549,20003,4186,8876,12877,31956,9690,13600,29361,17525,27447,15786,23151,13410,26063,13524,23775,22787,6929,19608,1401,7907,454,12900,26932,18541,27605,24450,7587,28945,28813,4881,31224,26724,28467,7479,24069,32741,4558,20714,26404,1679,10822,19910,27258,18308,21379,25838,26029,956,15390,4015,23841,28124,2873,5695,19263,19287,5174,7934,13135,23835,3825,693,3357,6942,20111,31996,9303,15278,6512,22687,29349,17248,16127,19418,18130,3684,13877,31509,17115,7630,22785,29923,21071,2105,32095,5014,22307,31581,30339,14771,8571,20534,21664,22263,13237,28008,9817,25919,14066,6421,22131,7476,21634,22411,20206,965,1534,24607,4842,20467,9885,7613,25850,31622,1701,15360,23815,5790,10185,32610,14007,21460,22225,9596,22293,26265,17174,18348,3337,17645,29675,21270,32181,4729,638,11556,15832,25402,28544,26969,31432,5814,26127,27488,29168,4299,18030,1788,11214,9660,15079,30378,13168,4518,5806,4461,8272,9938,15933,13852,25280,26336,20674,4144,13887,17298,30181,11951,5328,7077,90,10886,15539,12875,32385,755,23425,30745,15852,32445,9789,18772,358,32332,27205,27366,29619,25938,16280,12259,420,26280,6989,1710,24228,6299,8851,29121,15845,5415,19702,4638,5339,18470,17904,25334,21234,28746,17713,24323,2517,3586,23461,19588,7337,17988,5405,189,26077,28188,16716,6163,23177,19917,27700,16854,31014,4900,9243,19246,19161,28239,7241,3687,15136,17732,3586,28323,28561,12426,31358,18367,21960,9938,293,7150,30155,9631,32757,28261,5089,31696,10871,24494,24185,19378,27555,23884,1476,6117,7015,29946,23265,21889,11520,2310,13098,19496,19101,28215,3173,27521,21908,19843,23750,21415,31606,7309,11029,29096,20072,22598,30857,19945,30037,27260,12265,15194,16667,31139,21136,27045,6524,18243,14332,13820,27976,23651,593,1404,5946,13429,21062,13320,22133,19428,20429,29016,16120,20142,11058,10213,21628,20573,13811,12171,15727,22044,22728,16249,29423,16661,8100,296,23969,6758,60,2929,18878,29827,16207,2301,14500,7385,26311,5714,14997,23231,20606,32697,29699,7215,23250,23895,18020,28079,13152,24471,4282,27871,7661,17834,9693,23248,9572,6062,22980,25094,177,10965,9328,28611,6275,18912,19390,6609,7189,8557,24710,2857,7124,30556,3584,28805,31282,15389,11505,31811,7154,21468,25579,32312,26771,24962,26570,31762,31947,28210,27691,20542,7808,27786,19119,5008,2524,7979,24460,3293,25041,17290,27073,1669,17063,13020,29821,21128,992,18216,26127,6401,12198,24481,22191,9150,20847,7863,32461,4907,20473,11934,8137,11307,26100,4381,8838,5139,30486,8982,29352,3414,4299,19445,5956,1294,22564,12617,7693,18383,11914,18775,25386,5756,13011,31832,7897,12202,6084,5248,4028,32357,29783,28286,24390,22363,26870,20040,19655,45,30958,341,10378,27653,2152,13461,8633,16896,2428,1079,14014,3565,28729,27690,13385,28091,18275,6484,15272,30721,15968,3124,22884,27772,18340,32726,4689,20376,28522,29739,19626,6924,5927,15586,1119,21759,28501,22953,19264,8479,5207,22365,25951,6210,28325,29998,12304,22335,18424,19402,23834,26196,1941,19136,15271,9730,16165,24398,602,18891,19089,9988,15481,5800,25474,20734,6428,23168,10931,837,15795,3326,22700,2335,27824,30591,30266,9113,22578,2583,4870,32170,2863,30988,5175,32297,9450,8884,21546,28315,25060,17452,12222,2039,29600,10731,16086,15873,20063,26440,13203,13460,31550,22528,6507,1207,22033,4883,7877,31330,11548,4026,4893,2535,19533,12973,20088,22367,28399,29178,1719,4250,18216,26266,5461,13376,17488,19609,27166,23770,30915,20420,9605,19298,4654,16840,2122,4462,28322,25456,3177,6514,21118,13261,28988,6482,6332,32714,830,20748,7913,13475,32441,2056,19570,8605,4278,16772,7850,21725,17328,18059,24631,6326,32398,2786,31591,10880,27752,4940,1021,3732,31032,27677,6734,14060,15510,28756,19073,11695,13886,26915,15737,8986,26101,53,13097,27123,29515,25868,6759,16077,22639,21060,20355,29511,17642,19275,11757,4267,18632,18970,10432,14983,20416,13558,21636,25700,14895,21982,6325,8140,2062,11968,18479,1489,30165,20429,16126,25512,19739,25979,11445,12670,30648,17123,14682,15638,8536,2841,11675,2768,5445,5457,18275,3552,29815,1683,24032,7325,402,22166,4592,30789,6291,30429,1708,14502,13419,21371,11318,3527,32285,25586,7558,4490,24292,31662,30327,28016,19146,19285,277,32254,20451,5021,29730,2204,1793,32432,5945,29389,21671,9277,8196,4418,8777,16940,18091,8786,15236,11644,18152,22512,8673,12516,2170,25260,31460,16307,30065,9573,4710,21775,21183,7857,23486,9740,14504,8148,23568,14161,29402,32613,26798,21993,9847,4652,10859,15979,20911,27104,28949,15984,20642,31561,7421,11372,40,21277,3420,13959,17111,15042,18826,31257,2645,29992,1542,2514,23696,14475,8877,24216,29462,9147,18499,25579,28766,1965,14440,9991,7938,22301,4040,16177,24184,22429,29442,15622,32190,9780,4186,6913,24957,24159,18152,26411,31338,317,29039,20301,8622,28149,22216,13125,23371,1311,17954,27200,7678,25868,6572,1876,16756,31886,1634,9245,13149,27446,21789,8065,28882,21019,19657,14891,5620,22012,30808,28008,4509,26892,21665,2506,28735,5041,5772,14470,28102,30714,29726,618,15941,15204,11293,3610,1468,21277,6162,28668,30279,31380,21080,20000,28863,4830,28635,7192,13564,6787,27269,27021,9451,22853,13713,21336,13907,30128,18009,30073,25732,28817,4606,10785,30488,31076,13028,25381,23071,12500,21044,9683,11922,26318,25244,14194,13786,24184,27002,17103,19176,18433,32461,30590,6686,27003,23505,25908,20671,13477,19110,5662,20522,26609,5476,5898,29672,28113,5934,25976,20405,22007,21776,4666,6036,31534,206,30688,26508,5579,11396,18449,28179,17966,5139,23049,4360,10730,4116,6759,26286,27119,10362,29680,17366,3206,6259,21279,31833,15590,32738,9785,5833,12241,9235,16276,26044,16079,11533,31480,25904,12483,22278,6923,11386,28719,15887,5199,8776,16165,19250,15569,9372,32214,21409,8828,12205,12997,22594,31575,19391,15264,12756,24062,15127,16654,71,17093,25588,1203,25255,17801,12322,14259,23999,9850,17638,7737,14303,13467,32185,5720,17573,303,3830,3262,29996,17427,25713,27374,16244,15876,18312,27568,7933,4399,1652,1320,12042,18978,32442,16822,15405,27148,32318,23810,20638,28591,9159,526,5764,4171,7544,7513,1785,29,30259,31248,18693,21194,8830,9149,13597,5641,21124,7521,15086,8462,30547,19034,26192,4316,23920,13540,31198,18889,21792,30672,280,9302,13158,26063,12451,15920,19088,29941,1803,9268,32214,17617,27190,1234,13540,22238,952,24063,14073,12310,30888,17296,12684,3239,28950,31686,19669,26594,30424,21498,11209,30583,16762,7615,22083,18484,11854,17297,3990,27950,29215,22065,28445,21257,23644,26548,8193,22677,28899,17441,18786,2443,11896,1733,29866,21555,13453,27814,303,31758,20639,2109,16348,16604,6873,2291,24053,13122,23805,15571,27693,4394,19606,6299,29579,6521,7734,13213,22128,619,31053,5285,23732,16606,14947,4177,5664,12974,13883,902,5017,16857,5319,11879,15775,8295,19085,5811,23576,27857,5623,14010,18269,7702,3484,5992,14132,30158,23912,2969,26863,28139,26900,21443,13515,253,9613,19456,17893,23314,31017,7936,15436,21665,1822,22147,14755,5146,31102,23376,28204,1966,14979,30825,10171,960,12929,23815,6750,15704,31135,28355,20592,15286,25339,1648,16994,19014,23304,15744,13207,4120,2014,19559,1754,10842,7205,23596,18251,142,25277,17951,27757,9993,26608,14478,3306,26826,32459,17311,18205,28082,6157,24339,8800,32371,31664,414,613,30936,10878,11663,29736,18699,18916,12927,8267,16457,1472,7001,26833,29248,6311,26486,7226,1647,1735,1071,13957,10180,32680,2520,26650,31726,25810,28777,8780,1225,24466,27401,28644,14265,14337,27319,17966,20539,15019,568,8500,29509,7323,27293,20778,22488,25212,5401,29037,19765,21234,10095,6738,2853,1812,7646,3511,22209,21774,2974,1370,5607,16488,28740,12984,27541,9312,32503,10693,17085,32690,17952,6066,14273,29089,1470,15641,23282,24253,1633,21909,17381,5046,18300,13865,28450,26003,16360,27874,26542,2203,8076,8434,18468,6213,20643,23813,11234,6174,31041,5088,17539,5682,17334,21446,25559,32417,13995,6161,26420,20950,30877,16761,12634,19659,25327,4695,3516,29160,23978,8672,1524,12738,25977,27726,14605,22959,1422,16835,13166,1579,3707,16783,10580,9233,26245,4903,30640,5485,15297,28305,17872,6405,9386,15178,27739,23062,4458,1455,6991,31631,23181,5253,19225,23436,29332,14032,25883,21374,6172,14273,29531,21270,29296,17649,19610,25776,10154,9987,13973,20049,3443,767,4317,21824,7684,19175,16984,15852,32223,21027,21053,3185,17078,3522,6233,25246,6097,27312,4360,144,3192,22686,27843,30062,7959,20064,7215,20747,9517,8283,15524,21759,14620,18217,9947,4871,1980,24373,30072,9837,30840,991,28754,21921,10158,12049,3052,20357,27997,9574,19497,23994,1483,30309,24296,8072,24428,26084,8666,21465,1692,17242,5918,8922,3954,17792,18984,29817,21529,15015,24198,21123,4652,12875,5798,27818,27125,21062,11616,5182,14550,18839,7940,3138,25516,21351,185,30015,27086,21275,3713,18541,5967,14638,9655,14319,20244,23432,19560,28283,25872,18069,18806,21538,29477,19416,3971,4310,28543,7010,23886,1515,28939,1408,9117,23796,15565,6067,25878,16742,12954,7034,32565,21618,11677,18087,29879,25714,17927,31427,14252,22996,22879,2287,5127,23416,17614,22541,32361,29406,17905,10050,12153,18810,14598,2267,29191,745,20613,23907,28716,7782,5067,25077,1956,2721,26475,27061,23386,18201,5004,22492,951,24008,18988,6987,15338,4609,26428,26282,26037,27154,14659,25730,30713,15398,18312,29142,24163,7364,15018,17615,32670,31505,4798,30053,15556,25366,13939,28078,28402,25734,13977,29654,26227,27832,3683,32572,19397,18620,298,17370,13574,24036,15402,23843,23220,11800,32272,14159,31571,10909,22721,28062,20804,28650,3705,10552,14432,23224,6675,26712,9200,23993,30386,4851,16754,13747,9963,12290,20653,16669,31501,27394,4396,112,9601,2736,3727,7236,10467,28722,15951,15038,32662,148,7649,14882,3266,13087,21118,18819,18693,14549,11885,575,16255,13996,30506,1675,7425,21075,1621,30570,15896,28433,16103,1507,16370,26667,14584,10764,9467,12717,5549,15551,7041,3673,9724,13402,22495,23144,13119,2944,7306,20145,29351,3221,19404,26159,30818,20876,22775,18091,15783,32083,17454,15918,14310,13624,29505,15940,17840,19554,15970,18264,680,31060,29320,9246,23443,21532,15719,23853,28246,20872,10126,32521,17151,26861,22806,28981,29621,2446,24463,23346,4091,5936,21059,5186,10886,11422,19745,17270,24349,9072,5363,28244,26955,26715,5492,24168,12864,3624,32602,14807,29604,2905,27741,26711,17084,27590,17948,16612,11899,20618,796,23171,30900,21082,16127,1819,10871,19158,8917,22937,15489,3838,28527,20538,30244,19392,30941,14333,4319,22124,23830,25837,5835,21121,1333,28928,32271,28741,5931,19616,2167,29156,24573,28378,8720,27416,12834,3965,2024,15940,22333,600,20337,31156,24003,32263,1271,23257,20128,10420,7202,7641,3150,22796,18051,5838,22207,31789,24305,13565,4425,20982,16139,25145,32415,7938,31575,21322,9815,655,22164,20680,29495,7,4738,20966,32493,14238,4659,25841,4724,2894,27388,28961,16496,28426,20763,22752,17305,25444,31007,12003,19571,22158,2292,13834,18264,18020,9693,20487,6577,19551,21875,27984,27261,29011,11528,4710,20851,3367,998,25772,27878,14448,29050,12911,10241,24985,20544,85,7340,2825,20594,25696,23278,21465,1667,32625,26122,25932,5194,23141,2478,27948,6704,2683,10319,24726,17897,19592,3044,26600,25656,29034,5825,28133,25778,17044,4120,26228,11225,22465,30791,30800,2240,30452,18568,19282,26148,10774,23782,14838,26706,26941,12852,8822,17754,21045,2954,32266,1972,15675,28783,15148,24368,18771,9978,1450,25104,10471,4477,7726,22052,30190,20940,4315,5987,3088,18823,13449,8938,25401,24261,14598,25123,21104,10896,4679,18270,3693,31040,7735,13767,17155,6191,21379,22680,24065,13445,676,14998,30937,19077,13109,21390,17535,10447,18597,30258,21826,31709,25395,20666,2370,23623,20351,28231,8080,9236,12263,18002,21165,25961,14326,11866,28006,25882,11470,29018,19708,10724,1793,21068,8458,13969,10253,27535,27825,11982,27427,16514,468,1805,27367,27272,7183,32276,12287,14484,2962,16903,11230,603,29944,1227,10754,22144,25903,31680,20317,14634,26614,28658,27107,9898,24092,19450,8274,8869,26633,29065,18080,4333,20383,14391,13560,31686,30799,9173,22757,8540,17963,1978,6852,13126,27582,27894,9567,27590,25151,26218,17508,14447,22504,20592,14578,3995,20840,25915,29615,5975,31323,17818,26013,23809,6861,19110,16079,19706,14172,28135,29917,14755,11724,26264,4385,23407,10474,29570,24168,11582,22381,20543,21173,31152,15276,20645,19472,28967,3408,32430,14138,9508,22273,20573,28757,461,13633,5280,12064,18698,7326,16831,15907,11598,6355,29058,547,7990,18992,2751,1961,2341,22942,28833,25101,27157,13941,16798,15884,22963,11482,27727,27677,22599,31277,26863,17103,25994,3944,1271,29311,30872,5201,21467,5291,323,24844,6580,29866,32633,20433,31523,28579,5527,21618,4092,8243,10104,15165,92,15172,19378,26479,12710,30917,4559,2446,19302,5175,18517,24012,11837,24235,32720,23912,29779,21370,16819,30488,8145,16179,9915,19115,8393,19077,11250,11747,16153,28105,28356,11857,28765,25802,25557,6641,24605,26920,8377,29337,17705,5700,9281,12986,13990,26092,12418,17888,12722,10881,31606,15790,8182,28529,625,16782,29073,10050,12419,26255,30663,19925,25259,31815,5172,32145,4635,10920,21268,30911,6389,8592,32369,20971,17693,7785,23004,4807,16453,4615,4730,24498,25448,26789,30681,11968,2266,21616,18093,24075,25168,7700,18068,19740,5559,23537,32146,6473,9698,25923,19073,26181,9571,16787,26460,4627,7724,6194,3331,16659,26037,20981,522,28529,8804,25059,22333,23122,30993,23402,22973,13238,26293,16220,6756,6799,25509,28466,17142,24486,23947,5839,8426,11062,20277,6856,16317,28523,6745,32207,14927,14656,20655,22453,22394,28392,3284,8685,26063,14249,23337,5657,1484,22992,10706,19757,28763,6169,26734,1679,30260,5412,32588,31054,5623,18249,27548,14120,15657,30685,24109,13834,19230,3592,7910,1156,20467,19918,4200,3480,15207,4808,16725,26769,7274,3207,9097,872,24533,27521,29087,10649,29496,13993,2742,12508,11909,16609,1671,4720,28587,19436,1577,4300,15106,21398,7266,22386,10886,29690,26200,30508,10772,25178,17459,4987,9969,6774,16555,28099,3855,14637,32482,6876,7860,9826,18265,22912,9779,4603,31610,22150,6574,8114,14706,31384,4482,14505,32070,22838,1631,19101,5535,25064,6734,20140,16055,27078,24695,30090,11908,31165,8623,25153,15143,18458,22147,17637,16570,8800,20369,2935,28762,9994,14745,32287,5289,28608,11045,1782,25317,19744,21900,6252,4460,8744,11296,2615,23213,31989,14104,13801,18850,12071,26526,6966,7475,29359,13037,5155,32321,19564,10619,23170,17914,13267,29401,6905,31753,5000,16316,27106,30333,1839,28278,27137,29828,25925,27800,18341,31621,7219,21319,30186,18168,7708,9845,12867,15102,13709,10917,4288,25739,25205,26964,16700,19003,30049,9373,25430,16858,21831,31201,28838,28260,23569,28425,21101,13081,29349,26492,6225,13851,14810,26714,15822,15542,18398,31271,15027,28913,27494,18407,27900,22213,6008,23209,7037,6403,3644,4174,6938,342,21624,9205,23218,29011,25646,31690,8941,13142,27250,6476,25939,12061,22881,17912,13040,31043,24794,13276,7727,13027,7075,5299,28873,16988,7253,2488,27662,22863,25848,26782,8691,3837,7345,31880,4592,23355,7316,9946,28213,9339,7182,25756,12200,7132,10451,14580,1955,19971,30323,1357,10576,18981,15435,14286,9290,15542,7257,28835,30169,11438,161,12489,11098,16970,29018,27910,1385,22143,26404,12061,2451,29251,31540,15010,19560,2418,15592,29695,28354,9203,12743,9949,4338,30609,31664,20663,27817,20534,1885,12054,2465,1485,1425,4359,6958,30372,27332,29211,22292,9706,6790,18545,7243,22446,3479,5577,9976,17525,30174,14137,26151,7183,21772,10778,8952,18565,31614,9573,11845,1592,4434,3469,4405,27774,14528,22517,30482,18747,16254,15900,12390,21637,3027,8273,25261,430,22588,31718,15257,3869,21134,3834,32451,4578,12593,31683,9639,16331,9256,25257,1749,29724,20824,2630,11786,30545,2113,13586,18767,9059,4604,19916,741,1468,22147,25013,4357,11198,10426,29649,7243,15422,26236,1203,20397,29588,29895,2558,1595,15450,20001,22883,32475,30554,24614,23909,17946,16858,18990,28630,22528,27476,28405,1092,22095,25340,29510,18267,28287,11157,4443,9390,32654,24151,20877,31100,11135,23457,13950,20106,7092,15452,4147,20463,27000,31789,11610,18208,4093,26261,8843,23891,9323,13177,30740,27815,15561,16874,11670,7012,15580,29301,32400,15587,8432,27904,22745,996,6319,31288,32078,30933,1660,1081,20191,10570,19169,1465,24612,29599,30760,8567,10374,20246,12067,28305,22214,12547,30889,21387,6667,20881,16634,1847,23801,32488,2882,27290,5511,10962,10225,6065,15427,11527,12028,3055,32311,10923,14270,24206,24137,11757,16915,7921,1243,18056,26060,25074,17045,25214,14801,315,6913,1113,4859,12388,16215,24635,11076,9786,13343,9700,15000,29096,9874,30039,20512,23032,21761,6375,24029,17841,30235,17359,17981,19012,2210,31428,10948,4032,20205,28156,21917,11030,15030,11295,21520,25348,25220,18871,11871,31070,19565,12087,11719,17346,20875,5986,10206,21238,21671,14513,11902,30050,24485,19470,2365,14077,30598,29944,17729,30704,5475,15053,18179,21539,6618,4078,2198,11583,20107,11038,14951,11970,11133,17690,20800,9676,23816,18551,1217,8571,4735,11695,29980,2229,12213,9847,30079,23192,20099,20255,24217,17970,18645,10681,1762,3662,24791,9909,11573,16429,12404,11968,9649,30084,32367,32422,10736,22143,19287,8940,14452,30427,25838,31568,19457,17763,28099,17236,19810,23559,9703,6764,24822,7376,27618,21006,18626,1556,3989,16421,9031,153,19776,10690,6579,7252,19416,3366,16208,23378,27929,9072,31868,17515,18043,4645,13214,8228,2759,14405,24579,5068,28697,18005,26929,11449,24962,4171,11357,14903,17601,26420,30811,26294,19916,10335,23375,11166,18967,7356,5628,2915,13573,28504,17961,14672,28366,23555,16123,19943,13350,7661,1861,9437,22226,6363,10876,13156,8510,17539,16092,25871,20607,13436,4099,5581,15255,4726,20135,421,25472,5729,20970,17443,21312,9774,14194,22913,32125,25774,19432,7732,3644,26016,27175,8062,19149,19713,14467,8464,26805,20571,30638,6659,21268,8152,25630,16097,5231,13489,2835,2797,23430,24035,12333,27622,30274,11965,2174,10366,9927,16882,29729,18192,23660,17192,23708,16960,8412,7885,998,4005,10228,9496,21883,18988,20494,13725,7497,23059,22109,30752,9290,9076,965,58,28879,3698,30522,23734,17227,3009,27403,7225,30727,16906,1997,3124,18201,24975,1551,16253,10041,3918,23613,23995,6830,8086,19846,15569,21659,7738,10047,25767,21659,9581,20529,10256,16782,7507,9830,24471,1187,25501,6701,4121,25009,557,16628,11678,7932,18824,5380,3271,10379,13791,7598,28464,9195,11198,6182,5276,8443,3695,18426,369,10648,11449,22512,21084,14398,30454,28801,18977,24784,25625,17740,16633,28158,28603,460,15716,30741,26251,26244,25508,26595,31687,15793,29190,31125,30868,16193,15922,26602,3945,12063,18340,26922,32557,1396,7178,29791,22870,22566,20320,14513,9412,7141,18344,22575,3549,31798,16113,9394,16752,5069,11992,9921,13616,19849,17327,904,8341,12155,29982,2076,17277,3400,12924,3709,18535,31269,19706,7358,19605,14276,19909,23764,14819,20742,24824,13270,25228,17247,16349,7118,11994,31795,22616,20829,13500,30169,19708,25165,8067,28736,15223,12930,19255,30376,8661,15495,15014,12313,10438,6495,32672,4781,1037,6634,22357,20703,23799,23229,16281,16620,16461,12725,5933,18243,22317,3825,25829,9713,19052,19789,27431,28762,2468,3405,2193,13342,24051,9700,9191,1395,24354,1740,9348,4310,1105,22967,31080,186,20579,24776,6489,30412,26907,16283,14701,5142,12682,32599,8687,23963,10969,1955,18514,13952,14556,16707,20917,12585,3323,23678,27803,5935,260,30866,20614,23245,21970,6827,32008,6489,19473,12339,24272,19284,4433,28621,22784,12754,21925,10654,26452,19561,20916,20359,25671,16060,11015,6350,21382,25384,6607,7558,14149,13190,25303,29974,28978,9948,25675,19368,21383,8739,23186,4016,12030,9999,15499,1490,17604,16248,15067,17012,26689,1991,5139,26059,21190,19936,2629,24365,1703,24692,5971,27390,4164,4501,18076,6321,1944,15206,2187,6005,4563,14049,21548,15591,10703,32398,21907,27944,10212,30541,1724,1000,26874,4457,6194,16692,18301,15194,12728,12639,24498,27303,9383,1979,12715,22693,775,7608,23628,7594,13921,25680,8722,31202,4529,23366,23129,31487,459,15957,23267,13497,17619,18541,15771,12486,24387,12800,8821,32011,31428,16063,31386,12901,26188,3574,16255,19394,23281,28598,7086,5431,8438,7607,31871,438,10857,27351,29966,23141,6256,28574,2566,17805,27411,2985,10859,23231,7317,15813,6179,31119,22250,25446,19622,21027,22534,26812,3221,4346,14381,21197,5079,24927,24113,6685,27240,21217,31549,13855,15592,12762,1825,27861,30096,2568,7536,19967,20684,21287,7602,29580,17608,3739,20704,12458,31556,23980,29793,27114,23620,22335,6698,27121,21398,7504,18488,24144,25563,6988,1042,8842,20895,17401,17724,8675,4615,18342,18522,4545,24017,9993,24362,14019,7640,29799,32391,20867,20753,10001,23392,31364,27875,18443,25039,2904,31586,17248,11528,24520,4063,31598,32359,3292,12788,26945,12386,29310,31174,419,19680,24265,82,22643,17630,9045,22340,22222,26162,31894,19786,11030,6414,1126,11116,30038,26019,334,5486,12389,1005,14021,26096,28504,2189,7160,20739,27049,29362,16442,23082,16393,19966,19378,31136,31656,25281,32127,17762,13765,22839,813,29731,29845,9140,10837,29851,27917,20020,635,24956,22216,25437,8766,1685,18362,16947,25833,8039,7169,9257,16630,7032,30026,25030,28227,26127,9193,11632,15810,30004,24281,22592,30762,12979,19588,22187,2720,4624,28670,11278,14937,25814,15726,15741,32660,381,8889,10907,22787,29878,2613,17681,12753,19126,20997,395,3935,18495,8197,755,18662,24612,10545,5716,24460,460,27548,10563,30287,24894,3133,7080,28870,28987,9560,6459,32570,23898,15970,7057,20294,18007,31971,23310,6263,15814,32036,783,11374,26394,19070,15128,8066,10175,23462,3866,29130,9982,10671,13222,12272,31452,16468,25208,2472,16112,20728,23451,20381,28307,32361,25880,27990,6411,19275,25642,24831,17757,5056,16988,29772,6443,15579,605,8947,18120,9087,30109,13287,8072,12638,1255,1889,19083,28996,22675,23407,20086,23925,26555,6314,30404,13174,12018,24395,18775,30871,4675,28468,16594,9586,8243,27599,10439,9540,2513,3999,6105,19497,16217,14118,15947,5563,17263,22995,10991,7761,4758,30088,23489,29294,29705,27701,16195,4261,20313,2780,24153,27246,9535,21869,25343,18266,16597,15007,5394,12645,32233,22373,8999,18378,25238,5445,16196,12385,4601,6888,11754,23901,19756,5302,6292,18373,19578,12399,31375,14192,2852,21533,4341,18126,27887,7857,28841,30836,13920,15088,25306,9062,23158,16763,7872,15001,13338,17423,17030,26916,28909,15375,26887,24356,21703,26717,16120,1633,5702,5654,27673,1123,8742,7753,31177,15680,10784,8301,4268,9893,26716,27978,29718,22728,31557,30161,26387,22584,6555,5682,29820,12244,17742,15062,20438,6029,29830,5758,15583,28063,8456,24778,28048,18629,2000,25978,10696,1866,27457,4742,20108,7744,20804,22975,3257,8125,2367,21669,16377,10498,4602,1451,31199,31109,20537,15762,1671,12521,6242,2355,15565,31933,30774,15379,9955,12051,26066,8953,2927,17386,24308,2015,10874,25103,981,27441,24211,29179,11966,11796,4222,4899,17073,17290,11117,13991,13324,8589,12180,16629,10430,20027,30898,1470,32581,24404,7995,31581,28589,14790,3258,12121,26020,29357,32195,19733,1862,22342,860,8745,9126,21384,5844,29456,19955,2688,23277,18727,9835,8645,28374,2510,21158,17804,21741,11885,30415,31036,30639,23638,25859,20022,6207,9106,23081,6667,14836,16394,7313,12238,15033,7013,8403,12252,27736,26426,27861,21481,12034,15148,1415,24298,15096,10234,3397,761,1895,3912,183,2733,25954,16012,19230,27970,31986,11474,15633,18939,22456,2247,16291,23948,28202,32761,10430,26004,5761,25095,17150,16822,20175,22429,5373,11716,24716,25415,5191,24371,15858,23146,31628,16068,4874,32764,25023,2174,26875,1143,15675,13023,6669,4184,25047,7291,26924,21002,7381,6890,14312,6009,21746,9094,8148,3628,10500,29023,5983,24423,13276,2064,12865,3819,19424,9410,9335,25757,32074,26776,31496,7983,18526,5913,5641,2376,11004,20215,27843,12458,9701,14605,16415,30766,4757,28032,28285,4035,23291,10042,21318,29132,16216,23934,8501,13327,10116,23992,22921,24093,5149,21018,31748,24731,11805,31120,7280,29966,21380,25161,20942,7435,29719,18162,21750,12376,18581,28265,14529,18464,28364,24064,27103,28708,21147,28164,11836,28598,2159,2342,1458,23970,4419,21075,18790,20452,7733,22973,2929,15739,29139,5892,10073,5461,31715,16292,11741,28946,26881,9147,24730,31348,2333,27288,11318,22978,3121,13531,19122,2936,24429,25693,17530,8523,8758,13824,8904,2267,14600,6822,25322,18100,5456,5773,14008,26275,19611,16407,943,16245,21391,24754,2936,23869,7816,9937,12752,8088,7412,18999,8462,9552,23368,6905,4667,3159,19349,19658,21409,30520,29664,31269,23270,20590,14287,1457,11881,7372,5298,15953,13771,19236,824,29850,730,20091,16997,4009,11798,20934,18068,22330,30091,12072,2241,1086,15641,8648,19433,18628,31355,5247,15979,30266,18821,20290,17076,25303,25804,18874,9556,6840,30845,13373,30590,5416,28909,5310,32715,27543,26496,26473,15091,16730,7897,5284,16814,13625,30719,541,11497,8725,21130,15863,6004,26576,26352,4569,8961,4210,25965,26931,6314,21129,9202,31814,13493,17478,8459,3649,24775,20820,31849,23267,17191,13806,29314,21027,129,14987,2960,2297,11230,14255,24976,25554,12011,3065,7653,12619,23867,19161,10776,8638,18665,20587,13593,11482,3060,145,19497,30038,31630,7492,27155,19147,23135,22899,31476,20613,9573,1781,4912,25027,27233,18929,29294,8952,16881,18462,25986,24422,26935,11702,5175,1048,26103,29710,5889,16310,17588,14996,26261,5447,24982,5209,23428,24059,1360,23029,22567,6678,13612,12904,11880,28328,27201,20424,3187,42,245,10888,10679,8647,21823,15900,21096,31078,32260,11604,5731,9654,13803,12916,7418,20295,9129,7373,25533,5688,26259,30752,30793,2142,1655,933,14444,32127,1869,29934,22878,11073,19020,18422,21636,30809,5482,8219,2057,29768,20925,11619,14744,29153,5641,25983,9329,6724,24337,31730,16874,3138,10133,26742,2315,15970,30492,14461,25565,6627,10900,29763,26815,30622,9712,16540,8933,13786,18132,18467,11954,21038,11347,19869,28386,13918,1072,20764,7119,19620,8817,22282,12229,11923,26754,9597,9457,30406,11200,9273,31902,7044,11776,22358,9175,7178,20358,6078,26592,9539,29220,18145,8830,2272,7174,24261,16485,32575,21583,31203,22361,4115,13697,23531,23064,27254,26837,4322,16014,19060,28034,15943,7269,23831,2742,422,10527,705,31743,6247,10683,22266,19473,2100,12749,13086,28515,20793,31574,24787,6395,26012,21830,3265,12793,5125,22027,1077,28568,17754,29432,22319,13633,1893,31402,11711,23712,14859,8082,21119,11800,25732,8071,22048,29071,6145,6513,26712,12197,31606,19025,20852,26655,23455,25032,8129,20852,20209,30772,24832,4765,28472,21377,153,32489,29506,23596,23314,15060,15591,24545,28157,30515,28493,19743,23413,13444,20136,20451,3448,27767,1907,7778,11646,9623,23134,312,17849,27453,9219,8525,22190,10523,19950,6240,29953,7171,5218,14052,2315,29371,6247,17878,8593,2204,2727,3138,25396,16217,10896,3756,19055,14064,9334,17751,13557,9962,3204,5964,32199,13290,31255,6232,19903,5329,7924,11179,7900,12741,9578,12630,29584,14127,16378,7785,18050,6853,29355,27030,29425,21779,14036,15910,17746,2697,18519,20291,29102,8326,21644,16619,15497,1050,10221,8649,19083,2501,20736,18375,10678,25405,32213,6857,18844,19536,24622,17716,7124,9851,20264,25461,22110,10766,1576,4052,9601,13996,13852,8697,1419,23525,22205,20987,18114,25889,24187,25112,3332,27556,6322,28476,25692,14981,12253,23986,7767,32037,10759,11982,3168,1890,10861,17091,9576,26566,29796,32492,11169,5566,17980,25844,18821,25220,14699,27820,26516,12322,21817,12283,15486,25952,5746,1175,24916,30476,15861,25688,23694,26062,13690,10774,2182,23545,8036,30908,6653,1265,15094,32116,20268,10068,18027,29320,11643,13627,26175,29140,22728,26946,27427,2489,6605,4329,25932,3053,2418,4921,4658,20758,19588,2090,13242,25642,19944,26093,2923,17952,1398,9157,29291,26760,12992,28975,17756,8887,8024,14228,28939,3457,21081,7479,1903,25637,16288,9521,31819,10565,1424,7976,3980,13808,4055,27883,1625,29352,21738,21313,29913,14230,27969,14519,32077,17557,8550,9340,29859,1338,29280,10383,6774,14023,6839,12681,28617,15129,15615,29426,18139,5813,18392,19170,27053,19352,32591,12802,2348,17919,10622,13060,21895,20505,32718,13213,6485,31052,14994,26102,30448,1518,23051,18277,27659,15873,14543,17140,30608,18843,29389,10919,14879,16740,24265,15015,28881,14126,12872,4644,22818,171,24327,16506,25251,10106,2457,23947,1058,6679,2151,27068,6545,28337,9908,13269,24026,7278,1786,19659,8057,16418,8438,9346,8265,10607,13732,11901,10625,5306,32063,32055,20029,11721,7979,11083,2836,28421,14372,32363,13368,24531,31670,23239,6066,19258,25507,9222,4641,24792,28931,27353,17041,2792,11183,30284,27628,30447,20785,9781,28171,30344,27638,17117,31537,536,11932,22816,11603,19758,30536,26488,19801,9360,3532,31990,30062,5283,15230,23787,18558,7783,5432,6691,16413,6990,4813,5229,22922,11152,5507,20223,23829,13854,9883,28263,12938,8503,32608,17673,1498,14941,29679,27515,23987,10260,26524,18990,21367,1944,26400,23435,12351,19652,5643,21019,3240,9997,20222,11322,2176,22692,14116,30795,29333,3446,5580,5853,29878,9966,31734,27608,18058,6807,21250,23135,29030,24028,29371,29476,5495,26668,12076,11606,21444,15688,24454,28238,8340,4536,12098,13907,8563,5165,23108,21759,1862,4792,17512,20308,5688,21153,9625,27264,32649,9306,3029,3789,25552,12697,8074,17275,26555,23359,4357,20618,28572,29586,10347,30398,20117,22330,8879,6500,31311,22978,22393,26057,9273,32659,2152,5817,9703,2354,30446,25245,5895,4619,22103,18806,2120,24215,28484,15744,27930,26101,15700,19136,15697,19679,32692,10949,12039,27621,27127,10533,21524,4716,24937,20564,17566,6543,26534,2204,15665,23125,11758,22489,2959,25008,3171,30988,28280,31767,18280,28325,32112,11467,10705,29144,32140,3575,22954,7740,2459,14304,10118,25402,32374,4909,30316,15080,24553,30102,31884,8533,19840,29546,13468,16939,16099,8176,10689,32401,19831,27673,13711,13005,9335,127,15637,9218,11750,30350,26644,13169,13847,6178,28262,31990,23880,27414,20487,26420,27883,15167,23553,9160,31132,18395,1250,17565,15290,13534,23433,2108,16208,6134,5751,13544,31133,29872,25433,11233,14657,2977,22482,31004,1840,23275,15976,7733,29522,4422,27171,28521,29065,2328,22402,21531,880,5310,7746,4175,4738,5707,28443,29667,28783,5998,20751,4132,18775,22413,11570,21833,30779,28284,32403,13910,9974,10341,28068,26428,1679,29609,6331,14430,16909,4074,15940,22082,20758,28118,22475,21372,3670,19037,9636,23650,4576,10848,11160,12088,922,29975,1128,21878,28404,29394,11075,22488,3410,3701,12313,10015,5560,553,14604,5682,30495,27808,14383,11528,31623,16489,7541,18074,6734,26846,4136,5806,13962,29515,17534,10184,28591,5521,32289,15395,19070,928,7923,29617,26506,16206,7812,31350,6080,23333,26914,21557,23124,31685,32382,22927,19981,21190,30316,11759,8494,14450,8956,23747,2536,26869,172,14387,2829,781,27015,23002,5810,31584,32614,3866,30028,19247,23663,15601,3773,2455,7170,14771,6099,10451,27355,15497,23972,25554,8480,16273,1413,9886,27806,25593,1845,2817,21626,18876,12361,18914,20108,28345,4790,18046,23752,21542,29751,27198,28634,32060,7563,8179,23345,21373,19908,22661,18733,8481,20212,27480,32716,5981,17600,31963,29765,1000,4525,850,20146,7202,14842,10303,19985,29581,14421,28133,21450,7747,28561,28794,13490,26851,25164,7535,25776,15810,14993,10780,10512,2052,15392,19121,24657,18375,1042,12600,1094,1986,9784,11730,17254,21304,5776,4838,27799,1817,24374,12844,24436,31831,26963,25260,18335,22622,30657,11361,10264,25558,24481,723,18334,28669,602,27170,3028,29680,21220,12369,19984,26927,15162,23259,22361,23202,11491,26107,5990,31110,20510,29496,17233,32589,3376,8116,493,14715,3701,14466,1050,14972,31671,8344,20463,7452,25544,7671,25828,5324,5157,29567,9193,24517,5249,10473,21288,22866,13560,6314,23893,2112,5456,4777,22764,16423,3295,23141,7276,6616,9331,5659,27493,28237,6812,16442,7137,10177,1558,7245,6414,13284,15449,28064,18630,18705,1063,1028,20084,15514,4190,31880,7310,27832,11354,23313,8148,14364,17195,12547,15808,1036,9811,10302,30334,13879,5823,4538,5460,10761,23464,22321,8387,18015,25869,31852,25943,19730,255,19004,8519,5804,3504,19243,8150,27113,5815,25259,8244,12469,18838,17730,29678,10806,3013,17999,26623,20359,32633,30945,19418,17302,1698,30940,6404,6121,15335,7607,11337,15440,15292,20762,3877,30590,17453,12154,25062,6468,9611,26301,402,6112,6359,26000,10367,29837,3331,13552,2444,31867,8113,14151,18268,26906,30316,18523,27016,16229,28829,613,29925,18873,6843,9264,15503,21497,7905,11782,7367,13767,21668,14484,25000,25776,235,26708,29089,2723,20694,19002,26509,24494,19907,16754,19274,4128,17280,9480,22590,18851,6850,19466,20656,9503,31661,12243,1470,22005,1363,1891,25222,15800,30163,1339,25830,1526,30652,29521,17726,6426,4346,2818,18283,27992,2521,22312,12787,10353,3412,28618,30387,11154,27837,5861,4935,6380,14852,22689,29575,12841,11010,16830,27562,25336,27548,21017,16440,13337,5078,3505,8373,24797,8126,218,7102,7997,371,30525,22142,25720,11864,4219,23827,24288,17193,13168,11248,6679,28725,12812,16096,20558,10153,20785,23068,15288,32295,17881,26697,27084,5873,6413,1016,8997,5595,20296,18985,9790,27432,9761,17149,17408,10255,3366,4515,28947,13796,28454,20321,17511,13773,16932,619,15680,5288,27018,6439,9448,26898,11630,20396,7590,16387,2787,4069,253,10994,25343,27982,27602,12881,26869,28805,29769,6963,20047,7626,22438,21364,14494,24197,3275,22806,26089,26492,28247,10137,31509,2119,6065,14865,29534,22218,14209,22857,13679,24200,12165,11210,29668,24157,26030,23992,8891,10609,27936,11489,22015,20109,14613,18298,28186,3708,8072,26525,19180,27322,21442,10519,15618,4821,26427,30427,11801,3264,10643,9347,628,16301,483,15351,17346,22211,2277,17857,31987,1609,28768,31974,31925,12890,10860,18947,18023,11583,10783,4262,2172,24062,7268,4380,25348,18610,25919,27017,21672,28432,4046,10984,17882,5855,10067,17838,13908,3019,20145,1930,6000,405,711,501,6060,25462,3840,9074,26062,9261,31947,4656,32328,12087,22767,12279,28060,9166,29414,23127,32051,3778,3055,20918,22437,12987,16187,18151,4710,30904,7483,29068,29488,3879,6918,9996,8614,7692,30851,5456,29400,19744,11560,8835,16527,6884,3983,25799,30023,13625,24823,12570,7430,32298,24948,16894,15194,32687,18482,16148,12990,6748,25810,1407,15135,31884,20700,31430,28830,21736,373,17204,8777,6058,27149,10606,18529,8433,17026,17598,25260,4208,17940,9434,15261,26979,31447,19149,23997,20095,2239,22595,7130,29542,28451,27359,14315,15197,21975,31707,14287,4494,25851,1667,4812,565,19156,18985,22827,1791,756,4174,19724,15314,4083,1098,14134,24455,718,1863,9558,17243,12395,16134,13803,8433,25046,13422,23833,7797,30832,11130,29238,30410,25205,21090,21965,7359,23534,5325,19357,18439,15018,31168,29558,1724,21096,6962,8191,3806,28859,12589,7029,12278,6002,31028,30172,4371,13801,14930,807,21651,18436,25592,10527,7828,18280,26794,30792,1290,9386,21292,8824,6015,24725,31991,12680,8759,1059,24943,351,19907,22537,30253,16430,20220,5936,10517,5082,16969,14887,6063,16244,11141,16974,5392,4243,28721,9538,16,2613,21494,12266,19818,30082,10121,14119,11847,1328,18144,7511,15024,28455,11120,3579,5243,6057,17932,9804,32495,24163,3532,15976,16767,23421,21064,22305,23325,6192,29984,13433,26826,23280,11608,22197,20957,19648,196,25175,29712,3280,22725,5548,25794,15977,30520,12047,24243,26484,14811,28292,18297,28516,1326,11997,23890,1443,10333,8567,21349,10713,23568,5607,31434,5655,20931,4740,13869,27783,28983,29914,16256,27347,29852,95,23282,14266,26694,29543,11749,31744,95,19605,10928,23759,6719,30827,19726,30869,23036,9789,15470,24151,25431,9585,16831,30347,30759,3204,32672,12140,23739,114,15854,18881,28223,20377,6954,4179,13135,12681,10472,2126,18890,9492,4553,21125,20947,25096,21007,27322,14415,5076,30858,294,24682,12287,17994,2239,31079,14475,26741,15267,1826,4849,18639,8875,10081,5385,18258,5471,19198,15905,10289,3570,24734,26054,3647,15629,13822,19080,13767,18210,5400,19459,26261,941,14467,14584,22233,24747,11831,23779,12711,11622,4289,30482,23654,27863,15857,4704,8587,30369,5104,8669,3931,32116,7587,13267,18019,31565,6302,13495,22219,2317,7540,8789,5929,18947,16158,18842,25010,29347,15923,30406,21825,9084,16160,6738,25340,27809,15697,9089,3657,24887,32749,32580,423,2145,3208,30342,32112,26504,9513,30313,9133,3671,20800,14343,18832,28301,13901,19884,23394,30869,16815,5408,9445,16859,30584,23369,11545,14203,28878,21683,11262,21699,29005,11892,26514,21644,28137,15393,4647,14015,5690,17681,8821,19357,3834,29761,21448,20062,425,22613,25889,23385,16742,29494,20082,12185,3712,13828,11825,24627,20199,23498,5785,24481,22788,27290,26930,28079,14685,27306,3532,9656,28163,17575,3998,27734,16650,5025,2320,17729,23846,20845,31503,12413,9762,7384,24528,1736,27586,10794,31054,7914,12807,1208,25514,17661,22357,2757,6657,741,15434,16928,16968,19718,25449,24585,9266,1327,2205,30924,15122,10395,24558,8084,12868,31468,23806,9611,12368,14697,15399,24196,19505,15023,7014,20943,3164,4053,11990,23431,10467,30161,23941,24572,19643,15289,25104,16920,27553,26322,5260,11856,6079,22281,10786,4919,10080,16601,20633,6714,29855,26276,5215,5068,2060,25938,17650,15271,30538,2630,22716,32153,7290,32519,26376,7679,15536,17189,8365,21889,506,20602,1859,14023,4631,19043,23127,10370,24273,16399,25214,3433,2190,31051,31979,17892,2833,21941,21222,32544,32055,7741,22309,26884,14607,1862,28998,1652,13881,22870,22289,11856,11331,8768,24030,14751,22379,4895,21267,8013,12788,21630,30893,24926,11715,11574,17370,8005,2102,7990,30528,5243,3148,22573,21168,12549,30697,6797,28909,21855,10827,27692,26720,19407,5792,26919,27315,31027,32443,22516,1500,18034,1903,26400,9798,32266,14043,9684,5084,29800,5226,16588,3501,30792,8578,6876,27693,24104,7468,29165,32236,23697,6346,1542,24962,31064,10526,19868,22974,28520,5339,20950,5772,12740,31507,15961,13746,17943,18529,2090,26219,15789,2062,30299,11092,13712,24485,22939,16087,20337,8344,10869,10759,24979,24689,19039,19762,23363,28974,27634,4774,18618,13804,817,19960,15428,29248,30050,13423,12963,15980,5426,22351,25034,4696,8768,3932,3879,5038,9083,16543,24744,28431,12998,22579,20928,15731,14002,1875,11687,16619,21963,22484,10811,27986,9364,13620,20596,20824,498,28451,16137,10264,1478,15636,32542,4767,32136,11471,10419,32570,18745,10970,405,2690,17231,9600,10269,15765,17196,5421,10180,9864,26847,4770,10413,6196,21075,17745,19126,27409,957,12579,20248,9121,22015,17539,1996,25816,804,19753,11411,9476,13800,12983,6778,10218,16002,27078,1620,12778,3718,29823,10904,27247,14924,16331,5585,21535,31844,5332,13960,4742,20037,29058,2540,16528,23665,25612,5671,8582,4053,5290,15447,13343,22135,8338,3768,8289,28794,31904,16037,1852,3581,3943,18297,2457,2911,22757,4697,31711,30892,27403,6390,15988,21120,17762,24026,21462,25869,26108,19160,31234,19330,17523,18044,9372,7725,14670,19775,14031,7323,4162,2488,25681,23088,11400,14811,14655,1656,13278,7941,13885,13979,1528,20478,30761,146,4241,12992,23492,6241,9318,361,1932,26594,17274,32470,22682,7436,25805,2297,6496,20339,320,25367,19675,28940,23502,284,7220,2243,153,2938,23367,7488,2389,30448,30730,17352,8308,24683,18323,28810,7329,15101,16908,27004,6684,23453,5440,23775,19892,7078,2358,26376,16107,10901,30189,21344,14231,4696,13693,26746,18054,9102,32037,10703,26075,10496,4933,7836,15183,29093,19265,19917,18606,30801,26746,23074,18455,24379,31845,1206,9780,23443,22383,6351,20824,650,8312,2769,1870,17679,10471,10992,15280,17849,31711,21713,28086,5828,7338,9642,4751,32684,26441,2467,25074,3476,2423,26740,29468,11013,2824,14600,8406,25914,14203,9431,31397,5052,18040,16177,16256,19673,22027,3238,14579,1726,14148,32421,9708,6247,29203,29938,24965,2229,9224,17949,30010,19957,6129,29657,24767,29600,5406,31048,19200,5302,26516,6638,32754,18970,14724,23368,27700,32011,9587,228,2910,26984,19881,23005,20967,9946,4944,25205,8596,2639,26955,14044,15283,18379,23180,8247,2148,17214,5472,3851,25459,12098,1895,16585,26609,24876,2058,18133,885,13731,3444,19724,1677,30327,11391,10103,12027,16750,22831,22953,4211,7953,7843,25382,29883,11939,21486,16994,23773,15399,2993,9656,23645,21589,16010,26699,9829,23668,12908,22087,27005,31509,29192,5715,8718,2986,25879,4597,16668,17946,31962,8907,22006,14308,3088,31291,19632,28846,16026,13440,6395,29360,11963,21676,15908,11554,23710,28535,21978,15526,29365,17687,9031,26440,30997,25397,3125,3659,14143,1104,25694,11934,27358,15290,23874,28552,24495,10587,31773,14030,30514,4789,11564,27354,12667,248,4658,22245,8687,23228,25128,12924,21065,16167,23503,20988,21301,4121,27259,12470,24433,3818,14171,13247,18511,14621,31460,8033,21832,10715,6769,16742,7490,31504,7557,24848,10870,20213,8635,2509,13374,14454,16080,28991,25018,2520,4294,4999,12332,12598,6612,2713,1726,599,19127,23376,30618,20134,18553,17364,3513,24162,23692,10104,29108,8754,19577,3871,17601,3525,27509,20469,1507,941,4489,6322,30251,11376,14937,148,2347,5978,31161,21716,16509,15203,5949,21996,1982,7092,32578,16972,1681,17685,19750,19939,15485,30208,26955,1231,12978,12701,2651,11109,10545,30340,19386,3692,28289,28025,9170,2446,14662,5282,12482,26271,11375,9345,18745,23736,11404,24748,12397,18658,21787,27089,16628,13027,20348,25807,15323,15524,19981,19435,24973,18600,5464,5579,3487,7656,1642,5400,29462,8116,28981,16290,25501,19154,17871,25802,11814,30154,3662,1496,18159,14274,31613,28532,8782,5487,15483,996,1887,6393,17626,3834,18283,3612,25201,2334,19093,28511,5329,31103,18326,9349,18844,7693,29651,32690,9537,3072,8215,874,24397,5025,6859,9419,27065,13197,30915,27755,31622,29118,28056,2011,32243,11445,8669,30033,14862,2543,31197,14368,29877,12293,27660,11341,14351,26914,11979,8431,1200,3755,13679,23656,22656,14402,15313,12818,5979,27933,32365,32388,6363,849,24655,20341,18830,6133,24229,19956,10368,5829,16051,6172,6270,28580,21281,31677,20858,20660,17373,22273,16238,14297,20781,443,19115,15890,600,22149,5059,26121,15290,32073,5498,15470,26309,9734,5122,21576,23086,17440,4860,24605,8806,21526,28880,6454,24822,8349,3926,12689,12731,18237,8041,16892,3106,5162,2143,31412,21324,17570,20694,1491,2882,24535,22657,14778,2010,3895,23805,1186,26709,13581,183,6355,13847,32293,8477,626,20417,26502,25337,24642,22620,2818,21042,22326,4617,27589,24937,10343,4697,18196,14812,9184,7990,3820,20138,4442,12398,15249,23235,13887,19994,26702,9596,17112,19552,21724,15933,692,25747,27556,25451,19805,28166,18792,9826,5102,11808,30718,19171,13247,29566,9820,4308,19861,22379,20879,7836,24730,10507,15115,23685,25720,13583,20002,3661,26443,13943,8520,1898,2409,12825,20499,19141,627,2112,15820,23177,6272,13879,29474,16132,10480,32265,24299,22345,7985,2926,8074,8683,6375,4863,8183,17877,20155,1705,28968,25456,1693,25276,21982,28525,22021,31572,30354,16533,31863,2754,27155,1793,9110,1648,14121,26378,9108,31422,1607,24688,27959,23130,23191,30760,28266,30307,27887,11641,584,10658,31387,4,22980,19986,19081,11496,31623,27570,31774,21966,13652,16573,253,8507,29686,25813,1818,7925,20579,22727,24814,12486,18827,14556,26362,27247,8615,20295,29343,16881,9851,8635,24655,26506,14748,6260,7558,2905,6938,24630,16657,17895,26636,15962,19811,16962,32509,20547,12956,24003,20834,11131,15286,26644,17648,16641,24167,18644,28894,7584,13981,21519,2054,21289,25866,5594,20229,2831,16604,18243,18557,19259,18997,14295,12026,1224,11178,6235,30328,12325,28185,114,13969,14688,11223,17486,31439,9287,15573,7325,12924,6689,25031,8151,12675,16131,258,26467,2948,2238,4890,3465,12879,2048,20304,21976,5564,6900,17224,22417,5122,23588,9227,5448,14775,13074,15002,11159,32652,30611,2983,29919,19197,4870,22066,17369,5881,1292,9024,17978,24994,26531,5366,17064,17406,32130,18662,192,22084,21573,16227,8676,11337,13485,14161,2781,1344,10764,20660,24671,3823,23570,17219,17933,5634,29904,20757,11433,19544,20782,19848,16818,304,1519,16234,11172,10299,31076,32731,14938,32654,6568,2692,4643,17474,10643,18460,29714,28236,27415,26447,12398,30379,6287,7550,7650,5222,30509,28769,9972,12731,15002,23577,21671,27841,7871,13482,30546,17005,25547,25893,23612,21200,12130,22763,17692,7052,29442,2350,29802,15789,23818,14756,11336,23987,26554,18931,11263,8055,14096,21886,5936,11032,32473,19684,1151,19165,25344,29629,18400,13482,4995,5040,32680,31720,10993,21918,8617,15097,26267,29130,31289,7871,13513,29602,6697,18584,13306,17808,2311,32048,22258,29986,30031,68,18298,22374,16040,10375,7594,28963,12020,971,24268,2272,24435,26347,10695,25256,7400,25645,20687,29265,7626,2426,9947,10352,26770,32502,11377,13686,423,28353,29583,8941,12540,28149,4026,26071,32326,12214,18077,31949,4959,17733,31822,18139,1697,13085,11643,11802,30243,5240,8180,29976,20155,16229,17286,8958,17730,36,3569,20155,13244,32494,15159,9380,17679,24349,2780,6566,22660,15832,14205,29101,996,19713,26459,18886,16032,25235,24422,20001,4471,20269,15216,30596,1010,13507,17154,27438,8049,17913,3370,27330,4988,26145,28361,12942,23377,17453,29645,8338,25380,9594,22930,3957,27094,14223,9015,32374,16846,23517,636,32359,32139,10323,25565,22833,12092,17512,10884,26523,2936,4705,1370,10672,16884,23246,23302,9585,32066,5384,9344,19500,17392,15679,14604,17299,31671,5879,10347,13312,17747,25989,32480,18752,7354,31006,26559,10963,11363,4731,31607,12664,155,26829,18833,22437,13489,21188,24797,13841,224,2731,20307,19176,10468,14827,9682,24647,14822,10834,11905,4926,28722,29580,11138,19826,28383,25686,25393,19337,15278,25588,24438,29679,27683,22746,29552,29862,1254,21694,8947,12586,25649,20102,27512,26320,3205,22585,6096,14492,18760,22566,30079,2639,29609,13369,18679,5547,13783,19356,26285,21508,1744,25158,31702,17883,28337,2551,21295,32621,22003,15084,11574,16417,21631,23706,23874,11769,30191,781,21183,16715,10126,11004,3082,22857,20889,11914,3994,25340,25466,10513,22869,22691,5026,11168,24765,27578,10688,25156,11023,14953,30489,3580,13628,1548,21554,26435,8088,19193,5699,2253,13365,26502,23077,967,22727,16567,8255,26417,11737,13321,27065,21959,16074,15526,17359,30162,8789,23074,25507,5201,9535,11419,11863,10403,22997,29417,1313,4256,29520,21863,29782,22603,15895,27227,12102,31109,16616,14198,19662,26125,19761,11069,12271,31072,11905,14692,19490,9915,4218,24064,13857,14602,19713,24139,27055,31985,19966,29371,19042,6850,5804,16202,16036,29758,8465,8953,23785,20026,28808,9088,3196,290,7892,22951,5641,27298,9819,17650,28676,8130,24331,1789,28534,31760,3790,22958,889,31010,3310,27861,19209,18327,174,20510,3800,15295,21633,28128,23497,31937,28739,20678,502,18392,15804,9987,1205,29889,29142,27507,5889,7424,12982,6374,6220,18755,20620,31159,16486,6309,11022,6317,24997,26551,6481,17714,4966,16935,16456,16557,20064,16664,31905,20725,28981,32187,9119,7553,7005,27044,8497,2494,24307,7010,26346,3199,10277,11450,18033,32365,10884,29152,24451,18814,5859,14222,14316,30397,3185,17540,6406,15603,25324,766,27171,13431,7733,6780,1947,3133,3373,6408,8129,6699,24427,25535,20512,17431,24552,15001,2557,22897,25582,15938,501,23544,7203,11100,32459,29234,19633,21057,13861,30236,12165,27710,31585,9777,27482,21000,19750,16424,7948,27646,14799,19631,20950,31754,18551,30243,24851,10914,25528,15625,25689,19070,30388,1478,17319,25675,11404,16354,6560,5685,22650,19024,11203,2126,2276,31799,31953,15049,28733,5026,16539,22684,3757,28170,15877,3807,29391,20012,6733,7351,15558,6031,7,18540,25426,8485,6937,14907,15644,31538,2394,28872,13615,6331,21917,12435,22051,11634,16441,20899,17309,18768,32196,17123,18482,6832,11967,164,1621,30467,20745,32162,20530,22479,933,19340,5578,13844,7889,27604,14742,4623,27619,30554,23298,31507,27984,2942,1587,22244,19790,7270,29234,18135,9403,5035,25476,19250,25482,29804,18462,21280,22692,5522,32279,30810,27877,27311,14115,26160,26239,28460,4157,7263,14618,6117,24436,31150,24097,20862,24120,10104,26597,11463,28584,22290,5353,12959,126,7804,28479,2334,15434,1949,1747,6565,12177,9,6542,11911,10875,20110,22961,24475,20635,23072,15794,32481,29152,24438,20967,4599,21088,13143,22981,12369,25209,17379,25572,16256,11036,18860,13377,22768,11952,12990,25156,16509,9764,3966,16606,19072,18997,4850,26922,22293,7058,11051,25078,24161,12416,2174,7854,31175,32300,20471,8782,11170,10328,25075,12606,15427,30911,13251,17898,267,27498,2088,9833,8483,12354,27364,1485,18317,8929,30894,16194,17884,23980,30736,8697,16161,12336,31416,20563,25654,13507,31318,27476,19270,27916,5427,164,22489,10792,24646,8049,7704,1463,28457,23483,13301,3974,14638,18808,8806,23105,26077,20420,29977,20392,8987,1360,24267,14801,25458,25456,3128,26062,14520,2278,30225,31081,4847,28842,32288,27469,11383,13320,31646,2041,7248,21057,14003,3166,2432,10822,23476,15444,6059,12120,29797,8555,12131,21174,20882,22430,12678,30433,5206,28479,2803,31708,6360,23316,12957,5378,5625,20054,25921,27379,18244,12535,14199,31034,19324,11437,16692,18871,31108,3669,10874,26342,25900,25009,817,32439,18383,14463,21384,26780,15940,12961,20084,13348,28274,15426,4846,30428,31793,29231,25791,21312,27038,23411,14213,22801,23701,25696,24805,10819,23344,21115,6086,13849,12078,25723,9204,13870,23429,26212,5159,5365,24896,27677,9272,10449,1482,28543,25469,11409,30338,5146,18739,29100,3945,15556,8536,32461,25962,9987,21218,5764,17838,24267,18490,8918,23176,24022,20878,26348,11405,16009,17233,27954,16392,14960,31833,12617,28142,22944,30881,12123,20901,4903,8850,7044,3765,20102,1039,29616,25738,28276,14394,15492,30279,24627,11489,15769,1725,9895,32046,9334,29686,4229,18406,22088,20116,20547,20596,19553,20400,409,11611,22926,27802,21092,19708,21304,2664,19587,3054,28463,297,24228,18959,15624,5727,2218,30902,27,15312,21039,23727,10747,14160,10138,31826,26070,28672,32185,11230,14788,12372,27615,14891,11836,15147,202,30497,21678,1171,21164,26113,11787,2357,16721,16135,11385,14196,8197,26210,3213,24693,18136,10425,9568,7294,23689,27852,19636,9035,3197,2057,23288,28567,6998,27922,12162,133,15089,24720,27921,8079,146,11315,1383,5482,15442,24694,15626,5228,8029,6759,859,5267,4817,28296,17711,1921,12377,22049,28698,6469,18173,15112,11927,21353,19543,25207,23013,26896,14935,7362,23235,6783,15455,14346,25257,29503,5237,25366,13410,6967,14847,20037,5682,12389,16594,32116,30290,14358,31040,20179,22231,14930,28570,29966,4984,14856,11362,13229,17313,1323,10320,4025,6153,20737,11887,14432,11564,6888,13269,5833,6134,22080,4801,29824,8464,25642,3445,8414,4958,28976,3374,22504,1084,15282,1160,23208,22982,26939,5333,18698,14647,12676,2963,23686,24689,16236,15685,30049,28394,5165,2052,21225,1539,31817,31618,4457,4747,24524,7622,15090,22642,12164,11560,9741,31545,23626,20938,32202,13836,26949,27088,18987,1619,19986,19782,5499,2138,32750,1542,12290,541,24002,29877,11650,32018,10135,5383,14995,15717,988,29681,31429,2292,8827,26821,4146,1337,28131,23916,4383,6787,25361,16046,9929,17289,25413,23714,15357,25191,14112,8031,4969,29408,24729,7635,11423,1715,16007,15668,10198,5775,27826,23472,25124,7002,12582,5350,21218,5272,23145,19038,30465,7209,20215,5624,3288,5467,18603,32400,13260,17481,16577,17227,18094,122,21384,25106,20240,32296,4970,4338,2905,11400,9838,27382,29914,6018,23832,16702,8779,29928,23238,19773,9965,4610,6353,12800,4757,31136,21434,7404,11804,20812,29883,17021,31900,25829,15483,1534,20439,6962,19545,32182,25323,30351,29900,12141,2664,32463,1626,22951,20612,15538,32641,28143,12191,14845,22640,25329,7609,23167,14212,15982,29909,30797,26139,17732,20804,28588,25725,11014,31135,17018,20730,14840,19716,20015,30152,7712,233,10989,14856,25460,28186,8126,31116,3532,32183,18213,970,14599,5971,18455,5376,14316,22769,29138,13924,16226,32245,8577,7551,23768,16372,23208,25196,5991,22935,24995,13088,19134,32468,13352,12125,10584,14893,8389,30999,15184,26986,17347,14328,21238,29325,16128,16367,801,1723,9522,2061,18120,20626,13741,2756,13298,13600,31352,4829,973,3896,30413,29688,22917,17603,32600,13241,26206,10693,32719,18581,6648,1563,22221,12315,4973,1655,31324,3916,22575,27301,25348,3267,27627,14170,4495,5022,2997,24621,29751,25218,2286,18550,19096,5970,12440,2452,24794,7903,17483,31465,12166,7156,19658,30776,31612,688,12335,12358,15797,31911,3678,23014,30292,28208,32389,12321,20250,27356,25267,24185,7374,121,21392,3693,11475,10571,2573,12345,3509,22309,20765,14059,11432,23199,4571,24923,12034,6357,32510,16831,8150,25086,17117,4460,16422,2478,24472,32076,11869,29073,16844,21700,30473,22418,22310,28633,17999,28248,31735,6867,11927,12137,2876,23604,16658,19270,3400,32394,3864,22253,13996,24043,18177,25299,8306,3250,6438,21659,28307,20803,7546,23624,21078,23738,574,23052,8896,14096,16152,15730,11615,18912,29795,30277,17269,31798,23674,3269,317,2689,23064,5900,30641,20393,26294,11603,9398,7583,25066,9159,6932,29210,25117,16691,11725,14419,18386,30784,1001,29281,31652,6362,9469,7706,30974,9701,1163,10363,23688,7290,29274,5149,17645,16575,18108,25367,32722,24432,8342,9059,25703,15531,26001,23614,21848,28308,28566,7753,19242,10069,31869,17981,17485,18351,30701,21105,18558,21381,20125,21163,30785,11739,15683,2841,16528,19024,26860,5807,14782,16395,10824,2078,495,5294,11028,3659,16156,23826,6852,22598,5397,24939,16248,27781,12289,12126,28491,1117,5995,29952,26348,13714,22977,4308,9401,12787,2143,6259,12838,3163,26861,10510,30621,27772,4830,8449,23099,24710,10573,1061,17954,7962,30900,1283,8609,23253,28392,8126,22390,5784,15400,22398,1607,2215,23145,12537,8258,17066,8967,27616,191,18377,28059,13196,30717,2945,12433,32413,5842,4737,1850,19556,5191,12022,447,9686,11127,29627,7166,8427,23061,32556,10835,27620,10532,25782,5278,10338,25471,28657,3644,15483,21546,7774,27698,17597,16712,15963,3819,22468,17575,12083,23850,26226,28493,18468,23018,24877,29419,13000,14091,17169,30671,19730,5568,16375,8374,5300,26833,4201,2986,20311,19358,18969,32573,5637,2447,29545,13717,912,13074,7945,5667,13353,1874,8771,2626,30863,24208,1162,10217,14116,18544,19651,10963,18405,22297,28208,22170,12169,17878,5914,26745,19456,5057,11729,10612,7249,21615,29167,27574,8816,25023,8638,22582,20487,9371,21754,6632,28958,2147,2466,28206,4899,6225,22999,21486,9012,18654,31508,20478,12370,964,18036,4388,10117,2628,14656,22385,12603,13087,31800,24147,14160,19048,4880,16269,9639,5492,16879,21755,26371,2532,14361,9430,8989,11203,10689,15134,11862,31778,15080,29547,21396,3565,16140,32344,6146,15019,19930,21020,17086,21423,17636,15788,4234,16067,30875,31950,5198,19235,17311,21675,6176,27733,22439,9492,18657,29423,12824,13093,19206,26661,17459,28734,7988,32668,4650,22501,10084,21697,6058,25244,14521,29100,21769,7254,8801,30984,8399,4001,25464,19577,12314,29169,27772,23208,26750,23835,24660,24036,10071,23375,5843,25475,4226,21557,28648,22802,11689,16052,18247,28154,163,29306,25293,6746,14890,5455,2898,15581,12397,23362,28003,8063,23581,17294,8241,26598,23204,24619,11597,3596,10526,13616,5086,7378,20700,24972,10620,9164,21164,11013,17401,14155,889,136,10031,16552,22219,17775,4534,28497,16923,14725,3768,26514,28987,3660,4863,8112,30384,10418,6575,17090,5903,4552,22089,31972,13545,19695,8252,28927,2061,556,26800,23646,18960,22936,2336,26906,30212,25461,10735,5064,18124,9462,29612,8460,2297,6684,24581,9595,29964,593,13224,12785,27965,32736,26434,7056,5781,12120,6893,5632,16974,25147,5568,20068,31466,30325,30407,1654,24987,15281,21122,17006,19636,16167,17408,25313,4780,29873,22162,3611,17572,17922,23626,20930,25489,4197,19107,17676,29171,24671,3487,15924,24269,2381,18022,279,336,9181,32520,7894,5460,32521,15305,1795,7527,31,16218,13216,9863,22313,20100,4973,24690,9614,12047,29674,14029,9279,15542,10904,657,6508,28293,24308,14317,23485,24185,24701,29990,27429,32082,15788,32220,32062,28017,31683,7404,29606,23524,1323,7427,24070,10351,18097,10252,20501,6544,31084,30393,8050,26121,29349,28037,73,30715,13557,2887,2417,18920,24130,17634,19110,11901,16059,30584,19732,26669,26383,32529,3882,6388,11968,18148,30725,30682,22666,7260,22158,30249,24435,12015,12106,18451,30494,31203,13184,16873,9912,14744,19653,16016,24892,26490,244,6355,19948,28780,3746,7729,24259,28975,1070,9192,20411,22958,986,26562,9490,19,16613,27879,14265,14536,29112,2666,24408,26684,8040,10478,17795,12251,24209,18073,30607,4875,30948,2041,16587,31949,26428,469,24999,19529,28900,4973,25714,6955,11313,30887,10880,1311,21271,26221,2029,32650,29343,8528,3199,7532,30578,26957,7034,25819,2470,20770,13707,16709,38,15608,14789,2928,8696,10901,28193,8885,22816,3761,29354,29241,32609,3214,32765,4648,23418,3224,9742,22541,20596,13266,27729,7013,15048,5146,18514,32252,28789,17690,25255,22462,31008,8293,23253,19207,32487,11622,4369,599,6197,26363,23443,6820,21960,12873,8753,9085,19361,30891,23173,16401,23739,27636,32335,10208,13879,13578,1482,14254,23541,1189,614,30672,20484,22949,23209,16694,24745,19534,17561,17701,1714,21108,15228,17254,2096,16155,9049,21236,19011,25135,22707,5272,15632,10265,29804,1633,5300,7331,27411,18427,642,21113,15052,8050,12222,23201,3000,6668,2888,27707,30422,13885,9583,28912,10185,20136,6940,12411,5977,8606,30200,3878,13183,20982,3651,3914,7433,16447,26749,5107,8952,30749,21103,6532,4258,32189,14446,25703,10535,2338,23536,1032,11863,25259,4698,15917,22715,13954,8487,18846,8257,32277,18506,13483,24071,17448,18145,10817,27753,7114,22655,6050,10266,18762,28057,31128,7766,15790,510,17291,13977,19740,18401,28876,12861,4260,11317,31537,28079,1534,31030,3320,13537,1492,919,17058,4806,12091,22429,13478,16025,2959,7370,4743,9716,4291,32234,27204,19255,25376,7133,31588,21750,4146,12538,32004,32425,11113,2827,9740,15622,29465,1231,22368,19502,10582,1463,4544,15733,30891,29321,29266,29029,18669,15235,32666,13860,19464,31826,1246,28496,19180,26024,30887,25837,3508,2485,8734,22695,18506,9963,9714,14484,21026,13161,20034,7775,4614,17852,4423,9056,23206,25701,11052,12996,19957,17852,29937,24599,15277,31909,664,23738,32222,8244,2149,20802,11262,16732,10174,13514,17351,5894,6104,12740,32390,9098,21442,25049,1778,30300,8352,16975,19261,23502,30465,7948,9555,2073,6733,1091,10219,4942,14102,20714,10035,4895,20754,3120,5509,13963,28277,1731,5754,32051,31015,18380,20359,888,3522,30825,6841,4795,26797,12457,29263,32537,28088,30712,20507,6808,25853,23110,18985,14126,4585,31555,12356,18997,28432,19540,13226,13550,26218,20704,19204,6657,18259,19290,23057,15245,25448,5144,13549,5969,5232,5383,16057,9612,29604,28616,26898,30926,15736,22705,15813,16634,30214,21463,23240,4941,9108,7399,5744,1739,10713,8948,11341,8897,19973,10947,11004,8720,878,30842,20448,7252,22955,23148,6369,14848,17647,18733,15,3472,28586,30978,10768,15828,2085,8364,4261,6442,3201,19302,17138,20538,17026,13710,24809,8908,24538,20640,1903,4059,12486,22954,14395,1256,26077,9063,5867,15655,8145,21806,8424,12893,29108,25136,11465,12533,23377,14015,19146,29068,21885,26095,7806,29663,21121,22809,28824,16973,28905,24798,4337,16172,11831,16234,6056,31733,8428,26910,30137,5651,15068,25520,19718,16236,2122,21750,680,14291,22128,11064,9478,7717,27600,24581,32162,13196,13149,9074,14100,26717,18698,24027,19762,30460,13537,10730,13770,25821,15882,24463,10422,31377,15709,24400,23352,16460,27612,4868,1286,11885,17342,5495,27698,23089,28460,4266,31902,2387,18066,4002,20765,6990,27534,31212,9978,2178,25850,10433,7047,12657,2338,28120,20383,4205,9921,1404,31076,4421,2212,16905,3511,5191,20534,24771,27025,10850,24170,31576,14141,6831,22366,9060,24360,5791,24585,16747,31760,14290,30102,14921,2175,13341,23363,8388,905,26357,4560,4058,17055,9415,8728,22609,5734,32001,16101,29979,19108,5958,24122,23885,18437,3312,9143,6936,15878,7150,9578,10993,12150,19921,27644,24242,7501,29158,13125,18024,30982,9044,20787,14748,13485,1757,14769,14111,4472,25577,28965,22911,19675,31416,27584,24618,23253,20136,28363,26117,19305,20490,21410,30680,25355,21922,3743,22724,11675,11303,20372,17817,15810,9473,10473,18319,25491,9518,14676,18400,17358,11308,29545,21639,29833,21388,9043,26936,10534,28461,8931,14254,12976,19257,18066,23986,5283,6408,31742,32230,24023,20496,22792,10939,16757,7404,11827,8472,30604,17960,6677,20955,21401,22433,32588,21236,11627,31209,24066,29731,24984,13127,1291,16696,22567,27983,808,7115,30946,19809,17702,2544,11908,4556,24226,7324,6509,4045,16495,25253,13642,482,5051,22755,4933,4311,25714,23577,10262,414,22618,22451,31661,29886,4450,13719,15474,12400,11683,25230,14749,1358,13395,14626,16429,1334,21601,10045,13914,8004,467,17517,15775,1910,6942,5614,11682,14711,15472,12833,26115,16031,7058,29181,6256,21149,7969,21463,30909,17871,21341,18757,389,13565,2692,15245,28326,13793,29651,10099,18846,2548,12163,637,4573,2060,14611,5647,18445,14690,4436,8475,30163,29022,28909,30803,25822,7393,14835,28181,10705,18755,8087,27022,8308,8247,27362,32529,24677,11074,15062,57,16703,2063,17926,5860,17877,13515,2891,28467,11374,24518,23895,8082,31501,30323,3191,10328,12615,3959,19621,17634,30979,3837,5810,13778,13207,32737,10805,29765,8623,14558,14233,31413,30961,11651,9352,23177,29566,26712,8753,4012,12318,1483,5310,13698,432,10580,13487,25867,13536,12060,18675,12901,16619,165,18726,18358,30499,15242,9663,13977,31541,4187,22996,2106,22527,973,6234,4502,27830,19907,13846,23197,11071,8889,2671,6898,2917,1708,21248,10982,28876,4303,27530,16876,11723,3045,365,31223,11985,26439,12565,2071,7011,31242,3246,30069,18193,523,39,26152,28863,9608,183,28562,24620,18310,5604,3053,2399,1553,5484,25858,818,18567,22613,21505,22799,28102,9071,8586,12218,27337,4008,18038,2104,9037,9286,7930,3736,1034,29170,8314,29102,18850,12992,7005,11249,24093,22133,3531,17881,19548,2712,3023,1832,18206,28912,14048,29820,12839,25067,18365,22369,17761,15197,16879,9615,20341,6670,30138,8438,7607,25548,20757,12861,10372,25473,12243,24208,16663,6130,10898,29691,7852,18328,23128,31952,24223,23712,1887,26447,1428,7204,27704,15262,16616,13277,27371,1909,19888,15774,340,16560,19952,24883,3121,13532,20216,14042,7633,8262,17949,9139,9089,25606,9142,26421,18549,13869,25079,10625,30548,18109,25309,14193,25833,15858,20625,10781,16998,5239,26299,30023,21716,13275,14553,25352,28876,23511,30917,8701,7646,15651,539,4345,31965,17903,6876,2328,16842,18327,24020,20220,29313,17127,8454,21621,20322,2265,18206,4750,7532,11303,30570,8094,20626,21506,20627,29943,7417,12093,30560,9232,24295,13882,16101,25640,31715,26570,8239,97,2627,27477,6285,31976,28964,14686,19883,19025,27261,15098,28841,27676,26476,22050,18234,5626,1486,892,25286,6103,25471,793,1820,12276,15523,30405,4607,32501,5865,28416,14724,9028,14819,8905,3228,14573,26114,27314,29358,31634,9943,18289,375,7255,4133,24367,30693,19366,15408,17886,26544,17669,24389,29186,26002,17427,4839,2076,1006,9481,1018,18766,16064,7947,28809,3262,3507,10971,26059,5570,14819,27340,3218,25735,2113,28537,3358,14215,8270,8352,5991,23905,6858,22364,21479,21521,12546,7287,28055,8996,10602,9039,23814,21142,12749,11130,18648,27839,26425,22618,9468,14623,14613,11784,25832,19525,16630,2585,25659,21065,24561,22410,10767,25511,21278,14276,31464,22284,31219,20293,20200,7688,2909,30289,19853,27594,525,17667,2732,13639,31562,9820,22450,669,16723,27026,5664,6883,32244,11321,5842,8451,23763,11948,24818,21121,13595,24411,3352,2356,9123,9949,7208,29779,28691,32378,20636,22668,20526,30941,14404,1179,25718,31549,30683,7468,3792,9304,18601,24389,14941,15302,6408,3446,15331,23535,446,5513,4259,15949,20634,22216,14140,17021,24548,20359,42,31394,9327,9179,31031,2036,13902,14743,20441,13605,21192,4437,1828,31383,6631,7069,28812,320,15334,9768,3192,24669,5891,26623,23111,18850,5311,7815,19892,14965,7696,16498,10832,1313,10538,28962,254,6400,19406,9775,24614,12544,27785,1147,12785,1289,682,17024,632,16958,9015,20866,26572,23198,16428,3278,9885,11011,11684,3500,29780,5992,10443,19447,31116,19155,9599,24010,5532,28610,10780,19034,15550,25469,27021,2055,20192,24033,24828,2500,26418,12401,13826,21697,8689,21434,23475,31016,17151,4673,2143,29200,11735,20863,22108,23965,6698,15113,17881,3435,22132,21096,11641,11079,19428,3954,22822,27983,24209,27305,7871,28946,1163,19839,21978,27308,21941,26837,15721,22881,2917,14998,4719,14871,23019,7826,8005,26873,23426,28851,23669,4980,21934,23641,6995,23013,3145,20632,546,8112,22207,9943,4308,5473,17105,24822,28882,14018,26309,20435,17463,14677,24753,28150,24160,10829,10934,31851,1608,20524,32127,8024,26350,14735,29318,29365,16522,17370,27511,31207,13776,32708,31324,30857,17141,6254,28984,16692,31960,13719,9771,9355,11972,24820,15132,2914,17814,21727,14887,16338,10072,12796,30892,27556,12224,29674,9852,27532,20811,11374,13930,30456,8120,10620,10212,17513,28840,26187,10467,7909,23923,4616,32397,18668,2082,32543,23597,29762,797,9072,22726,26489,14144,29693,2045,13809,17983,11475,20248,28155,22432,26146,28795,17723,24956,950,12971,6871,23629,28326,4523,17652,11896,9121,16401,21249,7077,6973,6096,6742,10361,19122,8416,19163,22670,24138,31894,12428,14652,24686,8266,2339,30821,474,15569,4007,21759,26149,20705,27157,2769,15797,7272,30323,337,6284,30694,1871,31239,6433,20479,12828,15621,5669,4707,4271,11326,24809,27545,10513,28938,30234,541,21137,16234,6211,20741,7381,4929,24755,31598,3055,167,23903,23544,8678,32177,23700,13831,17496,5480,23267,22979,4663,24910,20251,21523,12517,20549,28829,2622,2399,15536,30184,8003,15420,21538,27677,11824,1960,23859,7893,21505,26993,30516,26059,26593,13281,24269,16422,2790,15596,25605,31623,25370,21963,16881,20052,7671,28133,5635,10328,19320,19626,22871,30859,30778,32540,22882,23230,10809,356,31517,19304,13883,22953,28962,17408,31783,18009,29180,2978,28212,1513,24006,16131,9412,27899,32550,21642,29070,16479,5489,19108,16200,9454,30623,2144,4153,3542,29454,11805,6159,7666,9749,24490,19613,27648,14946,30131,1361,31822,4081,3516,31380,12199,6401,3677,24167,25247,4763,23498,2111,21062,3776,24618,6427,28774,14482,20018,18598,18975,17714,27632,4533,28724,27997,3521,11947,32170,5028,6354,15513,32757,16702,3136,12457,17755,8566,12218,29785,27751,5922,29058,5880,16281,1056,16315,20181,25213,24453,22825,24033,2754,25848,25424,31493,31529,13947,16132,19,22208,26680,3671,22984,32142,24442,25278,7990,9124,13905,19129,1529,17941,7882,13285,6018,6684,21492,11885,29599,17825,13689,23623,9057,24772,31240,5584,24019,15401,7642,5494,7492,25645,30908,4636,7946,9241,16505,29910,27985,1137,4435,5931,6139,16051,10900,25561,23839,3648,23105,6260,25539,12712,11273,31160,25051,6000,23396,23120,13213,3589,25610,15927,6922,10753,28051,10529,6521,4392,1600,9647,29722,13044,29108,4249,10803,7129,12999,32051,25756,12944,14624,17920,11671,19544,22198,21553,24823,31552,27097,6415,23856,13216,30011,12187,12076,12342,6679,11171,589,22576,21764,4281,25978,15545,19546,23629,2680,8983,7469,13019,12615,27042,22638,26940,15935,6644,15714,30550,18623,17548,23278,16592,16094,14985,291,31644,25231,15802,7739,26528,27453,10189,24198,12704,8898,18393,8614,10372,22654,214,26745,2144,12381,1952,11690,15128,11989,21376,26185,6166,22496,29670,20891,2410,12667,22087,32630,17690,11514,316,18308,32334,23991,2872,23023,6293,6071,7650,21875,9821,4719,14891,10549,27296,21341,763,29219,8655,18469,17590,24278,15652,8740,13723,1997,32639,24314,4739,4262,2546,16288,32094,32460,163,13513,434,686,14814,24692,24153,3447,32062,19213,5891,19488,21422,15948,13935,2231,6120,32508,29564,30779,4529,10145,26026,30754,1371,15198,3101,11039,8780,11304,7521,6151,5545,18164,29208,6688,28553,4839,16033,31665,31467,5728,1348,12268,14042,4423,18930,14259,4934,15765,3629,13467,24584,11581,27644,26718,32259,6212,21260,21125,9397,28950,17909,7790,14370,19515,1313,16380,32567,13622,8677,13857,32633,28106,17925,9339,479,20276,30838,4962,31410,2017,9450,20667,19867,5124,993,28256,6027,9265,30311,12793,22507,28517,10239,30443,19723,22052,7872,8039,964,641,4653,7165,4248,24229,27480,24623,12565,2104,8822,27314,27904,8856,25312,16341,29854,12498,32315,5231,27324,28561,704,8594,19444,2746,22861,29514,3911,14161,30984,8746,25179,5194,958,26672,26152,24093,24299,12314,7166,3289,16240,25398,14027,6437,9882,12708,2192,26221,24776,4997,30156,9477,25765,20995,27002,18319,18359,14691,14698,32589,4508,18263,15925,8422,5881,19302,31852,17560,21687,365,20013,7997,30274,24361,29746,9626,14667,16426,9985,2661,14425,21468,11967,21036,1208,1885,27429,1128,17247,4837,10037,6868,6719,26695,29701,26051,1296,30228,451,22114,2426,23709,13691,31450,17227,7855,27515,18451,22503,17323,5499,28840,12448,32703,6901,24713,17076,22961,11076,6986,24532,10429,16211,17643,12232,22462,30109,10223,24755,9283,32436,17160,19699,13991,12603,4989,8770,8251,1125,23960,1380,20509,2398,22864,9865,6535,9785,25073,3969,223,4618,22921,24744,31,17239,18566,20347,29532,9977,19073,26639,3934,7947,18548,29628,29919,30254,4789,29928,6737,13634,3983,6192,27113,3025,27378,25771,27517,28340,20366,8744,22203,24036,22614,17981,10649,5190,8118,16879,823,14449,7316,5852,3948,7686,4613,5658,1962,26605,30266,9713,21234,3728,6487,19995,27769,18969,26277,27865,24890,11890,758,4967,21696,4434,3033,3298,23375,1804,1545,32583,2522,28057,16642,3948,10227,6141,2232,17251,17960,18375,17951,10706,27595,17403,7039,31660,5503,12460,13388,1579,22895,21740,14842,14770,13766,12334,16238,32719,607,21960,27673,30063,10100,19580,30503,25774,31507,20421,30410,28892,17478,6876,9849,16426,3907,314,29271,8898,9675,4770,6325,1223,18853,16188,11752,11237,27576,25038,20676,32312,7079,21240,20604,27087,17342,10541,8731,14604,12648,23754,2212,635,13122,20615,30437,13614,417,25893,13033,16919,17233,22168,15033,25785,2356,21809,26956,24166,8149,7517,13469,3641,13028,13356,13482,23374,7394,2430,29509,6410,30491,8669,19599,22235,6168,5295,27997,693,31724,19341,1882,9903,20401,7197,10108,18313,32249,27731,18859,7878,13746,13857,29747,6298,32086,5045,8237,18540,3800,19547,26577,27532,5772,8940,8865,29901,17307,10508,21345,28228,4839,6089,7523,9349,3058,15444,4962,3855,2175,26131,19261,4766,6084,21637,26305,23334,4309,17738,29774,20531,1740,10528,19708,19757,30733,8678,12097,19958,12553,11442,9449,29853,2783,32712,16431,26639,6182,16516,32557,23758,14083,6359,7100,17240,5860,26007,20137,5900,531,1284,28082,14580,27091,5009,23782,20784,10434,22770,22443,9822,20445,27752,14871,15544,16702,19318,32068,7379,9975,1047,24976,3143,26132,21453,9974,25841,27109,2847,24227,11323,12391,25411,31096,7380,13080,18796,17344,11054,1676,5775,13788,6566,11517,1628,5643,21022,23891,28220,24290,17896,27099,6754,14520,29532,28523,20134,19036,5601,10057,19556,3887,32691,12038,8584,6415,13559,31636,9037,12161,26230,11825,19033,9825,10414,24880,7377,26571,1329,12754,227,27365,11791,6317,16775,24648,28867,29859,28022,4462,16997,22333,2608,17008,19116,7923,25283,24263,12394,7174,8322,17975,26624,32515,4799,5568,13677,29161,19643,11833,31141,11620,22027,31081,5513,10158,25205,1024,10241,28043,17254,17903,28195,8710,3259,23032,20197,27864,27714,14393,10522,14449,24791,346,17797,27032,22903,27754,26590,12715,3464,23160,14566,22263,26813,30108,14413,12131,27761,23772,8298,21032,12965,8789,32267,3367,17328,21593,26861,21915,3924,1498,18656,1978,26332,32758,575,30231,20511,1349,32699,15898,14287,6243,25774,32349,7374,1211,14727,30262,26014,11784,10729,27831,5652,4774,19302,28600,8234,20947,1625,19173,1258,19448,22221,21939,12979,26415,28328,7734,8724,24500,884,24850,6013,16445,11149,3959,10504,18729,3321,28739,12607,3990,2133,14035,23826,7250,17110,1310,19635,2941,24059,13037,5244,3666,5035,26195,31094,24729,14149,21915,6440,29886,19573,10691,25456,13419,7240,13104,19981,26910,26942,31092,15004,24176,2069,28540,25591,13884,4168,7231,2954,18046,28824,14497,27237,17732,8878,25814,8725,8356,12330,11118,70,9031,2614,9930,14888,17249,25883,15114,7545,6385,26622,10400,28757,5721,28293,14917,8658,2893,14562,26095,6190,15588,8832,18839,25799,30136,5824,12540,14224,10669,28387,25450,24562,10305,27152,18184,7145,1148,27929,25321,30085,16773,3698,30800,21027,5051,21196,3620,20072,2791,18621,23497,506,18498,20893,6029,26904,26620,6131,10436,10557,10751,1362,7175,31540,16445,26583,15397,12435,31721,10752,646,5532,4919,14588,25897,13544,4479,18781,26527,16815,28749,13566,16088,32760,7377,32649,2965,31692,11871,13940,6978,20267,14993,4576,19669,19036,20083,31466,26808,26627,604,23185,14464,1543,24094,1518,27241,28372,31845,26312,22128,23852,24403,13782,19847,26697,30252,2579,21443,9110,2784,19633,6401,10149,29201,16567,3916,4913,32394,3640,26387,1153,26803,23468,5900,26575,2546,19478,21562,4333,21938,8667,26804,10380,16409,24165,23299,28160,17917,1492,12568,23928,31474,11703,19085,14130,22323,22426,27878,10110,5184,5238,16730,17504,32640,17924,31396,13117,16993,8294,24708,32179,19217,3552,6346,8739,2099,19455,12221,20539,9381,7220,20644,31958,25365,13528,11180,30768,31485,11084,19938,8371,20988,31164,17581,10475,24755,15462,10689,10036,19920,25376,5202,31775,25192,11445,16730,183,26510,14199,1372,2098,14240,12739,3563,17970,25092,18807,6336,54,30930,7878,27259,27386,12002,18507,4315,19343,30209,11108,26231,17377,15529,3857,12021,26820,20936,24211,30531,31184,29603,22920,17290,7714,1954,20146,15582,14814,278,21569,6281,16938,9489,21185,3960,6998,2797,18824,24596,4286,1421,29856,13411,26281,26829,20210,32423,8367,15819,7062,10285,31215,19369,17464,19897,14384,26337,19407,10765,7696,1763,14703,18747,13174,17273,14347,32350,12181,18404,26343,10061,10374,7067,1554,29485,17361,28605,22687,3930,1045,7775,9800,6059,1413,23621,12560,14080,11223,24513,7480,22181,23862,967,19389,28235,17891,3693,13220,14301,17235,32297,17082,17995,22407,16526,9371,22578,30309,10565,29448,21940,13636,8238,22736,2253,16086,14009,1962,19666,785,29565,31465,18307,29909,6904,1103,3628,15548,27597,13331,18265,1412,20487,13671,25557,6290,25973,5439,26979,15967,24820,21913,6176,6353,13773,19197,23671,21623,16883,11291,27637,16720,3932,10542,9983,31378,2914,27575,16448,24859,12059,6939,32,21930,11794,23892,1393,6154,19451,1715,15944,8236,6223,5410,15595,3192,3010,18593,21702,5279,11813,13569,15244,4828,10488,13300,5213,7539,10149,28668,5742,6709,10512,26936,29695,835,9812,27066,4594,4297,16445,26757,21335,16099,10237,19407,17635,22142,7295,21208,12945,16398,2395,15610,1240,18669,29644,26870,21138,20767,14078,28785,15020,14195,8248,1655,19478,19296,21439,18446,17532,16497,369,2035,26521,26404,7657,26429,25536,10353,16920,10277,12176,2607,21006,6633,3169,1078,27772,7265,28356,28114,809,6560,19011,9587,3828,1409,3308,28141,27098,25400,25493,6907,26899,21338,21895,5969,139,4714,12654,10241,25263,3375,6411,17785,9914,10255,483,13146,15487,17493,28067,13534,8201,8303,2036,23874,12024,17789,2538,3904,894,29047,14858,22797,11533,3732,20648,24224,79,24302,21921,25625,23029,16109,23807,9081,11974,20769,13798,14264,6811,11761,23375,27568,22891,11821,26690,17051,24760,32231,14945,13768,29193,22051,2267,10930,22162,1730,12169,17355,29025,12201,24738,21709,26661,21070,31811,648,32068,7456,4603,21926,8931,9354,10131,990,9119,22341,31888,32127,11084,12005,6743,6646,5732,31660,2964,18607,11081,19358,6699,27694,26438,115,26183,20411,8305,29665,12783,23612,15028,11434,5364,18977,5188,10426,451,22932,2559,124,19943,27642,13564,18061,20857,15039,2539,20389,13755,13198,30499,8632,18583,28346,22594,1508,25647,13221,4433,19921,23065,29394,29014,9033,7858,23421,9260,4282,24424,8208,14361,10501,6883,12412,7536,839,30693,604,1663,14018,14598,29694,16534,25832,15344,21504,23201,24776,4080,17521,20809,17574,19489,32497,19359,10352,18765,2406,2128,12534,13812,23377,17601,26952,6099,951,3187,7439,19454,27744,4011,9612,26957,24429,24025,20906,14204,6387,10109,644,7493,2528,11725,26816,18553,10144,14240,31511,6979,18188,7562,4190,5688,31125,938,23029,26749,8899,22043,5281,28379,24997,14699,16899,5988,4889,9826,1336,11200,25420,25612,18539,18957,8451,31949,21448,30481,28575,25632,1768,11857,29810,14598,20465,3394,8994,13900,1489,5655,4776,20338,11855,20642,5923,22492,12958,31781,13609,7399,15997,10930,7000,27077,30881,6616,20695,7785,4958,5993,11953,16347,10395,22013,20065,14172,30634,19175,10038,16082,15987,13464,1644,12235,20046,17466,8180,14661,17522,1395,27236,21825,5265,16189,21585,23785,15930,25732,25568,1975,1979,21868,28241,13859,8260,2209,12295,32268,13037,1808,13675,4850,19045,1234,27033,8535,24039,4115,19542,8240,3183,13276,3566,32080,32246,25116,23643,16480,6014,10340,17447,979,4289,28025,17885,551,20108,1313,23545,18953,15971,1784,17191,22341,32141,22603,18009,31467,18229,7841,20658,3868,27886,5658,4303,25346,13933,22490,10287,22086,26133,13577,1744,22053,4853,12823,25069,16986,7686,24258,3357,31525,10663,1049,8811,25008,32530,14778,25168,6066,12718,19281,21229,8830,14843,20880,9496,12076,15500,10409,1748,31802,8347,25872,18724,9695,31996,6412,3333,19725,6573,28521,17778,5090,4175,1137,12581,8739,19680,8296,29695,12041,16751,14717,14376,27662,19203,23441,9643,17094,14295,23834,9516,19356,13541,6012,12938,11698,12541,31250,29164,17107,4957,2947,2820,8879,31406,8015,6096,12875,19373,12139,19211,20223,8831,23708,5122,1061,4423,17990,15852,15,32347,20573,3811,21637,20996,17964,18406,2130,20217,30941,29966,4008,13402,25447,27682,18456,10635,6310,6196,14617,4788,18990,1464,31721,8238,31934,30074,17342,22870,31656,6867,24569,7036,18255,30598,6272,2938,17127,20321,6924,29793,3099,23452,25286,17134,17932,10103,30911,19232,15345,16961,10214,13115,19857,30421,20338,29455,12918,6820,5107,4187,8597,15156,1133,24639,26150,24802,14182,30165,22959,32187,14535,24870,2799,7510,19532,15632,26761,22250,24857,3165,9304,17567,27268,10248,23481,27506,23520,32460,11288,13851,20734,26131,11045,8393,22210,16875,30125,30542,30183,31003,15900,23310,28351,20849,10024,23103,21584,13164,21152,31727,12871,17767,7662,7045,17375,23185,628,3710,22767,15489,17766,14666,1627,30178,17313,10306,8183,14878,28529,12399,5002,25350,20096,7563,31552,19383,32009,14866,14131,24652,16818,562,14926,26345,2828,16353,32032,4377,9437,23959,21271,29612,5759,29274,8043,6885,26965,2739,28789,7395,19502,16525,18347,14222,32149,11516,16164,26351,12463,19733,22505,15147,5359,25858,2563,1732,1189,17953,27549,2542,31915,20820,4902,22696,15820,6275,19283,16312,21719,2967,6876,3842,23751,24157,21576,29924,15282,8288,28631,1354,25364,5357,4179,20552,13391,18345,30588,25270,5800,2027,28133,21824,30419,22743,14406,19540,12413,10118,32612,16879,32194,9490,31703,27423,7116,18483,13878,29465,23705,7162,27140,27374,19478,16822,9073,5218,3033,29095,11690,24802,2872,6422,27973,13506,32747,2290,11517,8155,12809,25682,10522,20583,4358,14605,19408,30048,19130,32601,19099,9496,17848,8406,29772,27292,13196,28228,10377,5192,5561,18918,16501,7970,8233,6208,14096,14681,16047,20307,17054,5666,12858,26343,15461,32405,12088,27208,1732,24522,12427,21243,29701,13232,30023,3963,16743,31936,32548,25886,3908,19841,2386,5182,13682,22172,5681,18371,14204,1310,12837,17174,1015,25056,27773,30698,2028,6738,8700,30251,116,30010,9099,9786,15604,28250,11781,28755,28118,22510,22014,30392,21114,19268,6363,23341,11597,16581,15342,7426,21673,4658,14141,3416,11437,14267,17837,23517,8860,6981,13025,22425,22240,21212,31325,19819,27849,18501,24570,25492,22872,6910,31196,12824,17653,18193,29868,26946,7451,8217,11962,21648,30752,12902,14430,13359,11525,8232,28818,11034,25956,7343,10103,29170,24347,30510,29938,11939,16023,2360,11402,17332,22140,18047,4538,12682,11971,31755,7176,12279,7313,19405,6997,936,25609,5770,14998,21981,17878,4457,1757,126,11873,29258,28871,9934,27754,9910,4195,14406,408,21370,10091,9544,32179,10498,30887,15790,6953,21389,31508,27713,23378,11596,23937,21129,11862,17794,572,18873,16588,10517,1242,6150,3236,14210,4412,16058,20837,21568,11148,24624,30637,10002,31012,22522,28153,19568,14176,4977,7534,15113,10275,15484,1055,16635,10870,20378,25162,29074,11197,20223,11529,10002,1941,3248,23569,24557,13012,29554,6733,10395,8435,30135,29799,10230,26857,17503,10455,3797,4174,25698,14484,1310,13908,7622,13245,5859,12974,7093,21509,22934,8109,3892,17150,13652,23592,30526,21746,13487,7091,28179,301,15253,1701,3796,18419,19895,9367,31961,13721,26190,26744,15439,22839,19757,19088,25085,10494,31624,24522,21098,5525,1808,22878,7100,27030,6764,26201,1819,15273,14803,30750,14331,10410,9786,26471,19873,32149,13258,18564,14952,15138,15476,4247,9792,30032,16362,23374,4033,24777,16869,16403,12608,21635,13229,8617,5931,631,21273,14017,22576,15640,28033,24459,23471,19791,14999,4830,26934,25236,6116,27138,12907,11576,30551,17897,29277,32177,21179,28450,27044,13661,25859,26171,7579,27347,19235,12036,11100,12083,4235,12142,13577,18636,27541,7453,27057,10481,21187,31430,25427,31768,12445,6554,32334,20409,26467,8933,29873,6509,15691,7041,641,21026,25454,3051,22610,9206,11220,27945,20230,29480,31063,20708,27352,31768,25202,27246,28896,25302,8466,20111,14503,18010,6579,24167,12617,900,23105,22554,30941,22431,7773,25125,21010,23899,26671,20256,14705,23095,25611,21179,7578,19644,23489,31973,3521,9383,4087,12684,20828,11157,10203,28550,6768,32085,27798,16215,32288,11224,20578,18079,22816,29932,1181,25894,3454,25144,24656,20036,31682,23726,2462,16605,11303,17386,19081,9783,27226,198,19621,13529,30378,13876,27606,27514,13438,1474,10657,25011,4792,30474,4914,18787,22819,7937,27862,19022,1465,20769,27464,12182,16235,24127,16833,21683,17696,15850,15523,18240,8276,27581,9753,30803,20481,21558,7003,9316,19136,31306,27184,22466,13580,958,4533,10828,27856,23031,12611,20090,26409,23246,16369,18295,19060,16639,19433,6869,31692,28913,21341,5496,2956,21562,3273,4571,1249,20773,2094,4795,21839,29394,16507,17893,22121,2418,2031,6311,20236,19993,32550,14595,15364,1695,15207,5461,1985,8631,6266,24263,11502,19967,2576,15431,9293,27130,22377,5337,22475,12797,28771,7609,27518,14845,17474,23629,27139,27595,32129,20960,7491,7816,7345,23048,19237,12394,17201,25345,15702,69,28331,5993,21803,9892,28521,3368,28324,12084,23026,29517,37,3757,41,15161,2248,11353,21784,4997,2053,17828,17765,12548,7759,27066,12999,22935,2722,6089,29193,440,15534,15907,28511,17343,31688,21042,11719,3128,16837,26975,3983,30680,12118,4607,29702,22566,22896,31464,21069,20473,27922,11716,1412,9726,30708,9462,14278,23657,21374,19916,18500,5035,1177,16960,21589,6395,11908,8382,20476,4900,3364,17010,17596,10266,18238,13502,32413,26472,10654,8399,3267,340,14327,630,11986,30823,21310,28344,21133,30231,32156,16892,12379,22633,11856,6898,22527,14597,29122,57,15116,20100,19477,21697,23035,23285,20379,7326,15461,26608,25923,384,27687,27848,478,27249,22700,5667,17164,10692,1240,12733,30041,12836,19523,9143,3588,16493,7139,17788,22274,26196,15140,32212,27789,28192,10012,4264,25895,16257,10721,29251,19749,27841,8543,28355,16872,4995,14115,5346,24666,7846,19759,888,2266,14712,27302,11201,24673,24115,23646,22390,7951,4972,15350,30565,31934,2475,18789,27238,6522,20122,2996,28847,5568,6142,11568,30338,6884,13495,170,2254,12760,15231,22098,30824,11270,16899,16222,17006,23478,30798,32223,28438,30480,31249,6538,4753,22205,32325,16952,32407,12155,8419,11577,2226,9859,25517,15230,32027,21182,28548,517,22132,16882,11433,30198,20074,4746,30911,31580,23095,7180,29617,21425,16611,16291,28384,26188,18663,2992,21590,10707,20086,21139,23489,27523,9409,5341,29794,30889,21378,13098,21576,21865,2052,29866,6974,15057,3002,21395,20533,16204,16394,7929,25725,7800,29380,4987,7174,32005,284,29897,2272,23660,25521,26426,20165,9072,9002,1853,11731,24048,16672,13633,21808,12307,5921,22285,30084,1878,6324,10210,15271,17921,8846,5019,22335,26056,19536,10829,9263,28306,8751,22764,17709,666,16263,10394,25957,3897,19114,1701,48,8510,5894,23266,2722,10848,25767,1975,28138,15310,11174,6074,176,23787,10033,11539,29223,4580,7235,65,31281,24226,30470,27366,17495,14813,20524,24265,15514,5528,3381,9549,22237,24588,27714,10919,12303,19524,25189,15913,14844,29939,26867,15680,19800,346,11540,25968,26860,20061,26420,3722,18010,26068,13600,13415,20262,22300,18519,18846,12204,14526,20717,16727,22794,30820,11735,13555,5853,7555,31372,5616,31057,246,27105,24612,21188,19777,23997,6921,11335,28061,32696,1109,1317,19115,6118,10909,17916,29302,26575,26598,14891,4147,7697,19031,3410,4096,1249,28643,22430,7034,7970,29994,28213,19899,20166,10777,8997,5045,16676,30419,23106,5831,16266,28818,18044,17559,6199,13100,25493,21755,29772,5531,30758,26003,7013,31037,26223,7697,17696,25211,31781,24261,30380,3924,5960,16627,26625,7968,10654,27201,12707,27769,11212,4257,13349,25483,31453,29788,21283,11086,9183,30577,21424,20460,31842,10879,4619,30854,12610,20182,21662,6360,24174,27280,31826,9870,13603,26594,11394,14723,13870,20423,26881,20563,20547,1367,18435,27354,6499,31818,21059,28182,18326,31937,11661,22974,22608,5261,27408,6306,5916,27225,6161,8915,21038,23996,12045,26701,24992,5618,12678,28859,25363,6806,14004,5635,5800,12567,892,1376,10190,28803,23466,21394,8035,7052,15185,13675,4038,16622,2254,25985,2206,30023,18936,3545,31933,16482,4704,17424,26233,30595,1202,2437,16180,22950,53,15471,18859,12504,4710,367,22101,13924,5097,17239,2994,23806,26192,2880,18312,27282,7140,29236,28068,13222,25301,20124,28816,6300,19335,6271,13151,12478,20569,21509,13230,25654,28558,9690,10286,18567,22484,1489,4876,20220,2830,13861,32301,30090,10981,8058,7472,5398,13613,3433,29673,17698,16164,20971,3447,32511,30678,20181,13937,14698,13132,2500,30636,30325,16774,25375,9720,1314,6563,4477,28672,23426,29542,13674,19151,6042,23433,24515,7795,23429,1379,13866,11510,12852,25111,27059,2968,13950,28454,24525,4075,25760,15767,25508,29804,12368,29283,1269,26857,29705,28406,18298,15271,21752,5949,8809,19646,21661,3129,5271,20373,1407,6014,23450,12396,29728,8801,20210,21791,16614,24987,14593,32223,26842,8639,26034,375,28837,8631,23975,29317,23516,4871,20709,28247,9728,20904,31108,23976,29753,6435,30269,10925,3644,18991,27213,29115,9477,25394,27848,20085,23404,3486,24492,25900,9965,6320,9558,13684,6096,25977,29646,31237,19466,4963,11092,26524,22918,29620,13116,28148,26915,28756,16989,22868,999,2075,3287,3182,25936,23070,13666,16856,6700,15550,26724,4270,8133,1291,18881,25339,21530,8702,22579,11380,11628,29971,20312,8099,29108,1612,27999,26033,16834,28700,15860,8216,3625,21672,17809,31894,4972,26182,10741,11002,6483,4813,20737,10019,6363,67,20464,30139,23050,11028,14055,17408,17553,1215,15497,5851,30892,6240,1264,15885,26946,15599,29037,3244,28806,13593,28707,20215,8841,10016,26703,5369,29290,11062,5017,12491,5412,5312,25823,11001,8429,12909,23287,23267,10174,24209,21834,6566,8906,26870,23815,4669,13162,6442,1407,18150,4122,9729,8849,5489,21964,10330,3326,17887,11644,811,18014,7966,19958,24441,5325,2968,2012,3782,31807,8404,7145,31716,15626,14567,32387,10180,5462,13851,29264,25116,19943,13286,26450,26163,27276,28888,1662,22437,20871,28723,21580,20289,7241,11825,17691,3308,13411,15464,7240,5810,14769,7111,11459,11386,14282,20950,23525,30447,19086,16227,8146,19507,6645,32461,14722,30034,9030,14824,27527,25430,30504,10895,15339,17947,12021,6121,27526,28408,29160,26307,12796,9317,23374,15453,23840,15127,8720,30000,9049,18885,13992,28839,14718,28450,13133,17703,18899,11095,21549,2554,8756,22927,24772,26783,1915,25154,6178,12808,9430,11182,21473,5999,1779,3400,20721,12469,18003,15737,31645,18687,22792,30606,3557,11477,25494,23011,11748,7638,197,31277,24090,28323,8427,25632,5204,31303,7129,31045,23087,29174,20185,16884,29324,25129,13832,28144,27720,26970,23598,9950,23830,8150,25089,1652,30708,25290,26802,25416,16881,11211,13909,20739,29160,5693,6827,14115,11616,23783,19843,26347,2703,19049,12548,22917,10030,2061,19673,23162,2002,32295,9413,22030,17099,21306,12204,586,12843,17743,20111,23575,7396,19903,16912,3134,24401,7592,4961,7093,20217,23728,7674,18029,5743,8372,23567,6014,16407,20430,9521,10760,10528,17313,10619,8849,26499,2453,12344,3147,6108,32246,18408,19104,25881,7002,23517,20788,26374,17631,28495,12809,27481,30433,20303,18651,23275,20726,15006,24312,30590,19170,1896,15219,25282,24846,14816,1131,14224,13711,11471,19886,30222,26750,30183,7133,32180,22933,20839,24601,17996,18891,24097,576,12519,13742,7467,25187,2068,10280,31260,8853,25614,21330,25371,16778,1168,23531,23820,20143,25780,10796,26033,32534,25203,17728,15114,15257,2187,19839,26575,13983,30915,13282,13286,22862,28657,18270,23364,21416,281,9631,19366,22662,3865,10795,3859,21794,21559,24853,8679,2126,28399,16694,1297,24308,22297,21150,27417,15343,8885,7413,19647,1370,15224,32262,22529,14698,2660,3525,11639,26029,31795,30294,1346,5137,7606,23961,25806,19374,21627,21811,12383,4579,7664,18420,15918,10144,355,8772,21961,17999,16222,10078,1011,17311,20910,23749,4973,29480,13127,24798,24643,7504,8347,11816,21601,22781,6897,10099,26150,21647,31265,20941,28837,5939,16071,14257,18008,16516,11456,11084,247,27275,13295,24968,1375,7531,3951,3431,22112,24104,22565,6123,252,4709,19853,9231,15609,17646,4723,12730,347,246,31783,25361,1622,12018,16523,18799,9690,31675,2067,17836,19,18869,12748,8310,851,2151,32630,11433,15410,23404,29746,11940,13227,16354,18602,14441,22452,130,6397,2564,10007,6693,2926,21367,12493,26742,20125,32403,17445,20062,15790,31783,496,2582,27194,6240,14608,14422,30166,8553,30091,20915,22832,19187,22310,1944,1770,30188,7179,11128,15152,11775,17844,8702,9587,29996,17957,29648,11032,5106,12992,22150,15054,18406,32745,30892,476,3625,16472,30905,29538,21556,27343,9628,15494,11032,29462,29058,14728,31403,21668,17644,692,15751,23396,2351,29891,9250,22088,22212,16628,2712,23621,10957,21285,10276,20854,32634,27209,2758,26741,27475,22070,32548,28512,27834,6558,22766,8967,17863,6893,10482,25744,20616,21999,28485,17083,25461,30591,10935,23286,9556,996,8846,3826,643,12693,24967,12911,14000,28930,745,16549,21748,17118,19989,17012,19651,25956,27215,1469,7067,10222,18104,22791,19557,31415,23756,17702,26577,27396,28238,32046,26375,16585,29185,8468,21110,8580,23525,1344,18396,1118,3751,8862,29367,7084,11881,14898,10858,10468,31768,26965,29969,17479,18586,27810,9211,7909,18792,1339,12263,948,31427,23280,27671,13817,18505,20836,29934,16365,4197,31454,12693,1443,9988,27731,27974,6198,4986,17176,3300,8649,3431,6757,4159,9992,9440,9843,20434,1239,1038,12169,3007,16552,121,22381,25058,20227,30568,7172,28408,20048,14540,12164,23289,27743,21536,29903,18716,10453,6069,32116,4813,21032,13107,8179,6364,12224,11977,8205,21082,7755,7596,20233,634,19606,22809,27968,10678,20632,5828,31919,11249,13929,8084,140,17268,4372,31581,6346,29643,14293,28441,23134,17831,8472,29653,1353,23078,14372,5085,15352,5777,16113,26559,14761,8678,13154,7494,21436,15308,6489,28878,27660,26899,19782,17973,5897,28533,24361,2527,2996,11731,28221,26739,27627,18573,21540,31550,22166,5772,2627,14287,27371,15747,26043,7074,13414,4387,7046,19083,31549,15298,9563,15435,30650,25798,23096,23007,30542,24984,17436,15210,24489,5646,18724,30547,32433,26921,23442,21944,21047,17650,27118,21172,8939,31153,31514,1571,881,20083,20085,2257,23544,3974,836,756,16634,31290,7909,6865,16422,5662,29367,3747,31696,17880,26029,12293,32722,26594,21295,27246,21485,2492,30295,9179,1728,27636,28488,25125,10190,26652,29330,26438,30984,12900,19814,18498,13795,462,8247,5889,14525,31379,7351,17138,25969,24250,6375,27488,28106,3599,21520,17821,21661,2091,5908,7609,12125,215,24630,29869,13350,31859,10534,18270,5164,13590,28102,7155,12046,6229,19525,4446,22872,498,24775,17600,5244,31481,14128,571,28735,2028,31509,18606,10746,23889,17875,31503,14853,7848,12574,16561,24934,11821,24738,12997,13016,24533,14658,19752,15692,7397,30963,26272,7178,9039,11480,3451,27176,10219,28695,5883,7833,15166,27398,14623,619,6648,30303,17224,20615,25512,20132,11955,529,20169,18238,15191,19822,18104,7149,6169,32560,27931,9115,26637,22313,489,9416,20125,28343,26409,23726,30011,7586,29726,10526,21268,14106,9451,21929,25868,3471,1143,18976,32088,32611,19267,26666,12036,943,5735,10813,149,21425,13867,27748,10847,31428,32082,30110,21144,8589,14237,6266,4894,20964,22169,23998,26290,15327,27457,3925,10374,26465,17445,20370,24857,7562,24647,24781,22757,11902,15057,27904,9617,4831,3247,19673,9543,3117,8243,28331,28560,18007,5991,28132,9094,12285,27670,19019,29815,15698,10165,23146,31605,14143,13538,5558,29852,7453,6907,24285,14795,44,10705,3509,7062,23714,649,20993,811,27740,25221,13576,31770,5126,28596,14409,10303,477,5859,1772,30462,12573,1178,15809,18423,9317,15762,32666,32227,2275,29527,3884,11931,575,15019,27332,2114,1823,4025,15176,16905,31658,29588,30007,7328,6216,25468,19366,27384,492,29657,24980,13714,30164,4270,26035,26523,17906,31025,11857,16537,5681,27526,15449,5669,10665,3654,32747,5401,11260,8656,26514,20794,27759,23146,575,13646,27792,15635,5028,29125,8723,1706,980,16205,19231,16909,29710,26508,22453,31798,5806,4175,19655,17431,13423,22770,31078,10569,17540,1638,17683,20711,27801,19984,22440,23212,28665,6630,27080,15381,20335,31941,25003,26397,11115,9744,30492,30257,14236,30565,263,8260,14123,20941,29051,28281,25642,17918,6040,20221,25789,29627,3201,20088,16480,8038,30075,5565,1456,18667,16270,8674,16863,16132,25049,18329,10407,27516,23558,16251,1081,9974,9450,24882,21215,31937,12802,856,19383,25129,7023,4614,16621,6706,31291,31654,15944,7884,27715,14658,11676,18288,24011,21510,32426,11800,4532,7696,30297,7365,7604,3854,29051,13533,20771,19499,9499,21501,620,12599,24189,20976,30022,26041,29608,2749,13479,19248,3459,24758,16267,13346,26310,26086,29376,6626,30309,15134,24593,75,13386,20460,19668,1342,23204,21062,24317,20028,6535,22016,11073,5265,10284,7823,31163,8494,18046,3692,28271,5736,2678,24021,8376,10002,3062,24742,2758,29334,10262,23602,21700,11479,17232,26708,30015,25474,26950,26038,17441,22402,9173,7551,3914,1387,11709,18985,9510,3316,15327,30437,14450,28738,27755,6058,22457,24100,11205,3524,6333,6381,32697,32638,9217,9230,14367,14461,12089,21698,18993,21432,22907,3893,30989,11033,31748,29495,17050,30760,4878,32518,22318,3813,28259,21979,14588,5947,24439,8566,10854,6017,24667,25385,16891,11991,17337,14563,6397,13086,18996,10592,4213,28321,10400,10830,5316,22302,53,21532,7986,9077,22556,22030,26501,7457,16716,18606,14174,245,1471,32657,12070,14413,7267,8219,27555,28302,98,26909,10498,27926,18181,9041,17068,29007,26809,19797,21264,4943,21339,28621,32326,31811,25609,30515,29243,15196,589,16356,21770,15199,2749,27508,20364,1447,28788,14014,13954,20508,26841,8596,7344,13872,2607,25802,3852,28511,13383,2122,25409,8533,30684,23038,9024,22987,21987,21558,32645,8422,26370,29674,25664,4666,28427,23358,26767,5281,32533,12131,5466,30059,5971,4095,25150,15813,12146,10117,26261,6115,13144,9811,10029,22044,22067,30655,22624,2776,27776,29402,23293,4204,6074,20893,28170,27451,6798,21919,1662,18711,23239,7452,26238,19380,8812,1733,7252,32599,25334,26586,12312,19872,29194,25729,2373,7986,15485,12759,9683,13777,5228,11685,6847,29076,21536,30565,17006,13219,16705,3713,9212,29526,30737,9735,29194,28924,20355,3133,12007,12320,14401,24331,5783,10872,1451,21933,31023,21424,18503,7491,2764,82,16185,19346,26720,11776,5060,30292,18284,1336,2678,32585,16484,3351,27933,21933,14172,9448,18746,20396,19740,26113,25805,3173,27476,20358,32683,20011,9519,5028,9451,11727,5784,11100,16955,31452,4791,19879,4038,6864,17721,16471,30137,22750,29824,10474,13104,18378,22689,8277,8078,10679,13864,11061,24145,21484,9910,15346,6187,20595,3732,12180,32601,21911,12179,24049,22856,32201,5722,20825,904,1411,12253,22482,16482,21408,31890,27797,10897,26733,4309,18123,8103,12266,32021,23622,8188,10655,4851,11455,26276,17382,3319,12604,2410,17068,20355,1185,1161,931,24341,22610,6393,27047,3361,651,28820,29325,7573,21051,21258,30643,23927,22721,21838,9495,15091,10973,6719,572,11600,16003,14512,24044,412,14521,6537,25872,6649,20833,6034,25502,1403,16026,22175,23097,5006,22715,16450,16347,2746,3876,28158,27966,29222,3910,29007,20163,26612,6625,4769,7667,4707,13531,27809,19631,18751,9443,7698,15121,25825,23793,5928,9361,20164,16233,26139,9428,6221,2190,12703,3386,25419,17276,17264,19922,8597,7255,20756,25552,25451,27955,20932,18245,19203,19769,29308,25032,29981,10097,12897,21429,15166,11676,5779,7232,428,19282,8053,5020,26722,25383,29930,17497,24070,23165,19403,23300,29172,8903,9658,5216,16068,15469,5578,17868,5622,17564,273,24372,31853,18698,557,23021,32725,20930,7423,16739,22048,13551,25907,1473,245,30187,13035,23814,8155,22999,2743,31707,16248,13584,1848,3709,30998,24090,21676,30455,30132,20046,9682,20624,26312,21905,20636,14883,10650,12076,7240,14306,13693,26414,1250,18530,3744,13139,14015,6761,25708,10929,15404,22040,26177,11764,11234,20127,3491,22225,12486,6334,22951,23809,11209,12687,2018,20911,20306,25376,30326,4194,31223,32377,6941,28896,10524,23050,9431,3001,27775,15647,15047,3631,10071,21920,27928,21625,14756,28969,9965,23351,12087,22981,29405,12275,3434,31484,13651,9238,19481,21374,13963,14138,32706,14031,12704,28559,32692,27502,9215,3699,3040,18498,23439,10198,21007,4588,5862,19710,31718,11860,24860,22892,32007,17986,19599,1574,28741,26278,24946,15191,13865,6549,31882,10610,26774,13639,7577,19194,20583,21822,19960,4745,27620,18865,4840,19240,13865,29589,19640,6841,25397,11793,14073,4747,7159,13533,506,2281,18170,289,21653,14751,5005,17523,4797,14787,23033,3438,30546,31421,674,189,1617,3167,10659,29710,32152,23906,6522,22700,22602,8918,30929,9274,17081,3319,26931,16374,9642,2157,1817,19980,26457,5529,1725,26080,13812,13942,20359,13596,26316,11584,31531,23514,12531,1371,17526,18837,17587,6383,7912,3405,31561,19533,16383,2363,23219,976,30955,29817,20136,4519,5492,30845,12415,9493,1537,3154,22441,8697,12740,4399,21382,27185,15078,866,9445,4325,12723,28737,2431,25276,2020,8253,19385,22748,22903,23234,7139,30026,16701,2589,23599,25608,23165,3126,13795,24766,24043,18751,17208,21470,22008,12424,4551,964,20020,8975,27863,24966,16138,5218,24845,24810,24242,846,3721,14303,28872,28734,28005,27663,28283,21879,21176,15349,17378,17916,3196,25880,11954,12077,6026,30354,989,24831,7728,29675,19691,5000,31478,26968,14700,29806,17626,16132,32642,12511,15995,14069,15968,18861,18542,21766,18054,7567,9989,31559,23230,11764,29779,4435,25100,1329,3310,21982,3714,1396,14916,26376,16595,5648,24802,4793,21849,492,14742,25679,10140,12716,9265,26843,12040,11681,27521,11838,10622,26140,22934,31835,5055,6234,959,14629,25301,30457,32315,9106,28228,31046,26000,14641,17859,4490,28239,12025,15655,14646,16926,3320,1228,30633,18621,3426,7588,22350,16869,26485,20127,1736,12400,20299,6307,3919,21008,5000,9103,26199,27319,11316,20795,30576,32153,17068,8787,11730,9879,25117,1467,5880,31815,16659,29765,14341,1834,26156,20482,19115,26223,21903,20581,27189,27261,9608,27320,9940,24908,27328,28117,13683,30816,12790,30850,2949,13941,12447,22258,20684,7767,1549,13784,5577,12469,13999,20875,27704,8953,86,29086,7754,8739,8534,26860,19818,17172,25907,22719,2942,30112,24252,986,22938,12461,15688,11900,26320,13454,11973,23469,13129,21518,14811,4051,24366,22322,4702,1097,3363,6281,27467,9830,12273,28623,15161,26028,5418,7118,27149,31867,28351,10713,18902,4692,9178,734,17183,32693,21295,17376,13170,14343,8747,5979,8610,1609,16349,12691,21310,14617,11549,14260,18860,16949,13099,31762,28697,7165,23263,12647,20117,19138,23193,28865,28258,5332,22251,12141,18246,3410,22782,9487,16472,4729,28090,2362,5300,22523,478,13185,9802,11879,14591,13837,15005,13356,3991,2164,5829,2626,22482,25184,20825,21061,6799,1126,18214,32563,5264,22985,12575,22506,5997,26839,3400,3939,25496,12223,16221,22793,21123,5386,31602,10827,4426,7333,31857,9617,11998,26591,3809,1382,2270,17898,16984,26946,4804,25302,19176,30590,3922,21027,18589,31289,26274,28884,32751,14306,893,15318,24464,5863,185,7602,294,22242,28599,1434,6370,13280,119,22169,32032,16624,10540,16364,25728,23769,21846,11312,18205,32164,1499,27548,6800,30728,22352,24098,25572,18094,13472,4412,26582,29973,3243,28896,12714,14815,119,28646,13677,19649,17454,26562,7963,19785,21937,15068,2069,11899,2404,19218,11110,27494,25548,209,6690,32228,15459,13490,4854,9624,22512,14876,21992,22296,22370,21351,13852,10718,27799,10864,13765,22853,27297,13986,6883,20401,23670,16308,7988,25663,20435,6132,9645,4220,7444,5848,23164,11051,26547,22619,1127,23885,404,20916,10420,30702,11942,9194,5738,28806,6586,16728,9360,14151,5906,5875,28018,9469,1303,6930,22782,17468,13350,23861,27952,3250,19229,5420,6897,604,27414,24193,16569,2582,23122,28877,14462,7998,31741,7471,8539,1256,496,6229,32578,1619,553,29107,3316,26153,20231,6724,9282,7139,2367,30093,12920,6892,16497,1436,21542,13572,28070,445,9995,31622,10575,27456,6875,30370,4207,8546,13633,6933,15001,18501,15976,25367,1618,22683,28710,24883,31244,18325,29025,26285,3720,4737,4508,18355,14766,18783,21765,32351,20838,20241,1655,2989,9506,16829,5979,18828,6628,5334,23392,31062,24244,7434,556,6000,8273,16262,19306,24807,16554,16985,14884,6753,11056,20890,30612,11411,26240,12132,31837,17612,30393,14567,1253,20308,20019,30444,15205,19185,6527,20772,5367,32490,30793,25520,12818,3527,23371,23205,17041,21325,16522,2394,3310,22705,20347,11303,24685,6168,6592,15545,19820,21026,8117,8107,15578,117,30972,22211,5447,26910,31906,27153,31500,31566,24114,25786,32009,10820,14713,8767,11769,12136,31869,1753,13078,1051,23073,5143,19127,6262,22180,15858,29979,22448,30874,31593,11234,28479,19500,17897,10050,6549,1281,7684,5605,24908,11835,8601,6970,19140,17131,5023,30720,3141,22074,20569,5280,4492,14323,16828,3172,27700,32191,16923,1757,15918,12460,22927,17227,29037,10342,4583,17316,10298,28048,2178,10623,11326,16712,8522,25167,7980,11871,26036,23541,21091,16068,5368,21014,15474,15032,18024,19702,20505,25168,7619,15068,18331,15775,27793,4609,13014,28383,9001,12461,10220,167,22495,20407,12249,12632,31133,28813,29938,10614,23088,28354,19988,929,3248,21163,2822,2732,16204,31872,4506,21144,32612,19908,24757,4747,27265,12930,17091,9858,5541,20049,23836,10398,13464,28481,4291,23142,31698,25830,9505,11983,23642,32648,9281,19224,3271,25206,12110,23974,27115,938,9471,21174,32243,4231,4553,31089,18439,10690,15348,31299,4229,15367,25670,31631,17318,11310,192,4759,11857,4459,12176,19687,7159,26490,23545,2556,19688,8797,27726,17387,18626,9023,28935,8695,31248,11248,19588,7693,8361,502,23129,5896,26074,24143,19629,3119,25067,26605,24559,25836,29385,1396,15869,5308,10193,27119,994,12476,3249,2021,14671,10498,29423,14076,16134,7691,6943,26591,32341,28186,16380,6598,27204,11954,13887,32082,3559,32755,17108,14135,15327,7378,22954,7016,29367,11540,8916,16264,24486,14795,851,5785,10528,13449,7163,20648,19740,31115,29154,22681,18962,6900,13561,5409,25329,28443,19120,8450,25655,18995,5221,16474,15007,19151,20310,9416,12430,4583,16657,306,10778,19739,23489,25639,8741,32723,20079,31689,3317,14861,25783,17636,1848,3717,459,28231,24365,16317,14660,26775,494,10357,14478,24098,17100,11861,30677,400,29543,17633,6765,4044,12348,22457,30393,5940,20441,13858,12536,8295,12297,23258,2009,13740,15717,29624,26285,10763,8495,10568,19600,31165,8459,10646,29538,28614,24621,13586,10746,32408,4650,26163,5274,10074,27837,4205,9820,4274,28267,19468,7844,26020,25223,29111,11421,8923,25648,8830,24635,7734,30509,32724,21104,30929,24791,8745,5587,20529,13647,23462,23322,5730,20953,27021,24952,1390,8902,13247,29720,6946,13887,24974,17578,16720,25561,18653,26787,20898,19853,12521,11489,27571,27656,19548,32019,2078,8642,28387,26498,5034,24629,13170,13773,4889,31623,17126,24504,7924,15197,15632,23361,16823,19153,32129,23265,9502,4869,15925,32016,28547,2515,32623,4338,25076,18300,30707,24139,3821,26698,17350,31467,3483,25989,7363,2485,13331,26148,25092,21235,3483,18630,12022,6375,27007,27381,16075,1475,978,1690,28939,25998,28757,8679,5891,20317,20613,29845,32608,20248,2699,5151,25999,6266,17096,26290,29035,12037,17806,28698,12760,10917,1394,23290,20376,4509,32567,1171,18593,22214,23369,18525,19562,19621,18619,7957,32687,7052,7612,14069,349,21012,13898,13300,17101,23167,12740,28395,19106,16366,19506,8975,16316,22309,9908,25468,22405,30085,18383,8537,3506,31293,856,20929,14531,24785,28256,1334,8093,21261,28327,17815,7524,23320,17578,29492,30855,28299,3324,26346,30610,16082,15647,24627,1574,1146,16803,27242,28382,9926,15851,10858,29108,24743,6236,32132,10201,10365,21146,1638,31372,10844,21008,30387,31655,5844,5306,3209,21492,2879,1711,23255,13989,25287,32542,29453,31032,2178,20960,31924,10902,30430,2968,17502,12570,26937,26094,14568,10125,10438,20709,30915,13200,14861,650,16592,24049,2965,8532,1232,26220,31268,19188,30771,10226,4401,17936,15778,4585,199,11743,5494,12650,30589,32167,13322,7762,29564,31259,18791,17664,22708,20297,7506,10117,9172,1675,3456,2825,15657,9736,12660,21701,10750,28697,5611,31269,29532,2494,20305,29868,19209,22479,25414,4411,32498,28042,24715,17670,30611,9055,20311,2179,8939,14702,32622,4471,3122,389,16290,4342,15863,29931,13404,29456,23925,28716,4359,24676,11854,5297,18437,14038,26648,4021,31843,20621,7395,13830,22408,10883,25404,7805,8998,18094,31085,3201,29590,11697,17058,6285,1359,18867,27989,29711,3845,3389,7196,21974,27139,2662,15984,16565,6864,28595,31546,19840,23562,6005,30679,1182,9042,26629,30132,1544,2062,19740,9870,8633,31380,909,15246,1989,609,24999,369,1557,13347,12310,2529,6128,12967,11497,21754,9344,32367,4515,10497,31697,23174,20273,19826,16070,18850,22802,6564,17744,25245,20104,27624,28459,27552,27554,16273,19899,9597,6768,23621,1289,25098,31276,23017,15849,21456,13811,24024,18456,15958,14148,1286,916,18240,12080,19182,1462,10699,23911,2189,2527,11537,18119,15935,14395,21834,7100,31727,6658,15458,9683,13838,7250,3869,15039,29949,11424,586,15832,23717,11096,30514,24484,8790,629,27542,20753,14449,28753,29755,1546,11034,22940,5135,26546,3658,10128,4340,9920,18134,3630,1503,26910,28590,16135,20990,464,27543,1866,13177,24640,6271,16999,6147,22118,19462,5896,31169,2262,29376,1159,25383,28301,13596,22633,31102,3665,27742,2435,6466,25875,14532,20067,17836,14537,11543,1759,11266,18379,5186,22166,25793,32197,24117,19866,5032,4486,17037,29620,21685,5485,23813,2746,20902,8009,26181,3542,12954,30254,13191,4894,22886,6007,17798,28327,11796,11762,21040,7130,14401,8612,25476,5789,24059,2519,24801,20831,19666,7955,30467,18865,2371,9228,14249,16331,22560,16307,30741,8416,14984,351,30812,22336,29572,22427,12078,16651,22489,3795,22024,12392,12675,4564,5129,22102,9763,9093,4565,30688,21564,31507,10458,12436,24238,5716,22719,22543,10584,24725,4436,24934,24141,19577,1102,2899,5895,13209,25798,10792,337,6831,27319,31098,18255,2843,5713,20037,14344,25040,16850,13351,30275,19208,25486,17916,31938,12376,15917,18878,11079,31359,24331,25316,11093,18086,8680,18948,22184,11117,24038,5684,12327,419,15506,32099,9900,4018,17118,11606,11935,23703,27524,23568,26004,8814,24836,26349,22990,19328,29846,23349,29598,16963,4042,31664,12529,11733,26850,2704,22583,32139,28394,5768,21880,20158,13271,15625,25695,3922,20551,2600,20356,26601,580,19327,16515,2181,20907,14296,8532,13786,5396,26705,6597,27335,23428,23268,32674,7158,13029,6756,15873,7937,25590,17319,27251,2484,7506,5619,11384,23636,28758,32541,10954,531,13607,708,29864,18878,25432,19344,2026,11467,8976,27546,2338,29413,29406,7320,25470,6161,20863,21013,18720,27347,13057,14738,17005,189,7092,30018,7980,15485,31619,26000,24233,7223,21476,32019,20525,22299,20887,15452,15963,10933,10508,28215,15955,11013,10783,20492,6913,7541,13265,7098,31247,21214,545,27300,21885,10506,12055,24404,7506,31321,15670,31001,5157,29244,15088,30991,9676,29723,3301,10308,32746,5649,29673,3369,31823,18860,23006,13308,20786,17886,11308,13836,11471,18641,32473,12765,15169,7145,4510,15160,19945,11702,21999,9417,9103,20396,5448,23591,30013,1549,16773,26224,5475,31522,26104,425,19935,31421,1261,17317,21205,9590,6397,3144,31221,26005,18570,32613,27258,15413,10307,28246,11283,27151,16536,23374,22368,21927,29341,23988,31183,6105,27140,5173,32242,24890,2249,31337,19157,14436,14063,3464,13289,14887,22822,12587,14950,31192,12283,8024,15882,7348,5948,25875,9065,22541,24779,21140,10328,29072,26216,28581,27329,30713,10992,12507,5459,13452,22339,825,14897,18134,4045,30877,17395,1272,18981,6833,20444,7098,29933,7963,23683,26655,8550,24520,23493,19702,29007,26459,10737,25190,30829,17010,12512,14689,8984,26080,23222,2514,23784,28281,27924,29620,5016,1538,19234,15831,32271,13594,24721,12895,1492,23000,29416,7961,13483,1432,20090,31322,20476,24011,21723,412,23824,13606,15419,1660,17571,300,28895,2547,31399,5945,8904,13386,17829,10302,22603,8597,27446,2946,16873,1318,22787,12885,2851,17635,3960,14276,5686,15923,269,15428,4535,28232,7284,4946,22495,13518,19040,8613,581,1012,26217,14002,22898,32691,24340,17568,15612,7754,12084,2223,11332,6213,13724,14186,5661,4741,23002,4174,23478,23193,6564,9226,27330,7343,5502,5669,20167,2445,27487,25065,12061,6277,1485,5467,19878,14864,29470,7832,31800,6353,13619,225,17744,32009,21050,25398,7105,23598,10603,12702,4829,17042,83,18484,28977,2812,18126,2298,32586,1778,8141,18499,10975,7366,16311,6095,22480,12917,4219,21538,18127,26819,11190,3691,7186,26910,4395,27819,19347,31153,4165,6513,16710,17867,8451,24465,1939,14150,24953,3225,16117,19032,6210,14486,10486,26449,12015,20214,278,6542,5732,17682,5970,20975,1749,6034,22095,18710,3447,29070,24518,14836,14484,17740,3110,7190,10794,17475,25783,3353,15906,11166,13250,2667,27281,14196,29981,27672,3441,21611,12244,10044,27539,4914,6958,23757,7599,3764,5494,14351,8509,30443,19332,12143,19922,23459,14495,14240,28933,30429,18811,1885,24142,8484,25345,3217,24648,17944,26940,1813,19992,1588,9346,25838,31178,8914,19054,20914,12255,4658,26563,12541,15530,20283,15688,18534,18164,2039,13101,1120,4943,9296,32135,8287,670,13157,29313,13332,26969,5299,9452,6773,17995,1945,4735,13226,9855,819,5286,30598,1430,26980,18593,6635,16778,23345,25635,4538,15419,24095,3976,22148,19977,23680,16726,26728,25398,601,5930,1830,17546,5991,247,30557,14637,30738,11797,11957,2442,21925,28078,10547,28805,31222,11523,23535,27445,20570,23236,27470,16762,25758,27646,12098,12351,8178,2669,13529,854,31675,499,5253,14249,30161,20750,20058,24111,13085,26701,15453,27291,26133,18411,7718,20800,14899,810,7223,23245,14803,32018,19042,4572,7096,9719,5280,9833,24735,31423,10499,21388,22582,5641,4663,21878,28671,1822,9388,6926,26724,26729,15105,3177,9668,28700,8698,29711,29945,32714,22933,30746,14817,16994,19147,12003,12025,25468,22063,3665,582,9104,29875,30080,19208,20880,16776,28108,23209,22946,10729,28853,21588,4459,116,1558,10661,21774,10867,29990,15136,18623,9686,11981,29095,27276,8431,31106,16687,27160,30650,27418,30870,22530,16308,24350,5801,30884,28200,15564,22217,29931,20568,17530,13172,31511,25461,7585,13980,97,5354,29332,14406,16882,5606,24820,18864,4027,21381,16484,1938,29605,13022,14236,3465,1168,18933,26840,32084,8713,25752,25145,7099,18899,23053,2076,8582,17469,10331,9651,30896,7998,16144,5343,5154,16867,5342,22089,5400,5971,27499,32444,32500,24912,10230,8114,1728,26248,7102,28116,26703,2624,12164,21131,29883,694,9157,5312,4664,451,23103,13384,28711,12405,3588,6496,20354,6837,29802,12624,30164,19736,30804,5710,18426,5904,31962,32700,715,9204,28329,28317,24310,13891,29118,1301,27670,11703,13710,21952,35,17865,30015,7950,12348,5880,32479,4306,27072,27222,26489,27757,7201,26934,18846,31759,14879,6060,17442,29833,15545,4302,1304,21190,1624,21097,2566,31638,26858,31055,24615,5301,18742,1472,8705,14232,12147,23937,21650,8970,28784,15873,18661,26391,17726,15956,10055,5107,13443,4122,22030,10243,11631,30121,16372,11688,32476,2198,13000,29568,12833,8529,29426,24013,12668,15081,22293,31141,24394,20281,20180,30835,22327,2706,18744,4107,25852,21951,15289,14522,29127,13796,6215,19117,3862,6351,23971,30324,22343,24469,21570,8455,20076,5806,536,27413,12284,22907,2385,13563,27926,24598,19620,17792,31432,6618,10610,23625,5845,1316,776,25922,3495,23351,26459,2628,28145,18686,13625,13893,16492,18271,2894,26804,7448,11855,10359,6452,28291,10219,15600,1940,11106,22151,29538,10106,1685,26116,17750,30217,22258,22516,30421,29740,29758,7764,15235,23689,1497,24368,27838,4330,5641,10736,22669,6896,27406,30918,17059,1753,594,5868,28041,21339,19255,772,14081,21859,24455,448,11063,7806,3143,28013,14685,23108,27398,592,29659,31299,14379,19009,23087,2658,494,7057,9509,26349,2874,24101,9520,30715,17318,17389,27181,18938,21540,20823,21241,17050,26529,10026,15219,17631,12497,1429,21621,8940,3999,17291,18242,8490,18017,11030,7563,27112,22011,2989,27312,26462,24339,9510,2918,3012,26997,269,11053,32368,24047,5210,32762,9589,28710,4446,9742,19900,12899,8799,23734,7370,32355,2026,6606,9491,23977,1819,490,4485,12727,31448,20040,4078,18195,10533,11597,30942,23407,19456,29323,9250,13324,24115,22171,1651,12665,17063,24096,2459,11014,15030,13916,21777,15044,22680,20187,25618,17490,9182,12165,21662,5864,13823,31307,953,14309,30782,19772,16823,17118,28801,18710,13829,24804,14034,6914,30000,46,498,20907,12733,29193,31138,8049,25417,2955,5543,2599,29665,28694,30184,31156,1779,10345,29121,25119,2045,1555,5432,17946,3836,4286,30740,17381,14628,1857,10093,9490,4167,1635,4673,16632,32379,31162,15020,4317,18252,29688,14910,6327,16149,22946,18853,28866,15136,21368,9591,15606,24516,13166,29918,31413,14580,22963,24083,5441,13547,16665,9264,3036,3978,2700,16205,1470,23622,5986,21054,31144,28813,594,11637,27596,20380,632,2063,26123,30401,17258,30220,25225,18847,6803,5417,3569,28246,3487,31066,7653,26783,19181,27689,1055,30078,22995,16915,20204,27880,14424,9518,29356,26156,11405,3882,20255,26726,19590,13036,22984,17357,15025,17127,10412,26042,27075,20856,19882,3274,29254,4244,5512,7452,5301,4304,7579,19962,5562,26019,13933,32408,31489,641,4916,7870,25717,31897,31898,6081,11211,5216,5324,8890,15452,15681,16838,11083,24647,19653,11276,25632,11354,6895,15040,12885,8152,14157,24870,2328,21874,22958,2149,27209,9759,19121,30724,29019,22205,17436,30544,1716,32407,21843,15727,8392,24944,31252,307,5879,3325,557,26090,30232,7868,13939,16662,30227,21915,1410,19069,7986,14326,9044,23757,16383,32675,14201,12582,13264,20141,21664,30914,12818,7385,11179,25091,29843,7984,24888,12177,1812,23509,25000,24553,6192,20422,15632,13505,27084,6062,22709,24848,23189,19186,7501,20994,16579,30609,10057,28215,17188,10509,11281,1981,17076,16764,14753,13250,18709,20913,28646,18354,25838,16274,24794,17484,4032,16959,31221,25743,6772,17926,26375,4403,19556,12152,29231,27665,29062,11921,20932,11279,21200,28401,27178,23502,17093,20172,11731,7781,16206,6614,6378,14533,26817,30069,9795,1982,15693,29183,13498,32025,28927,14086,3214,19213,1741,989,32128,9151,25705,20827,25182,17437,1429,4628,21915,8101,3604,4273,23769,6264,17013,16163,12340,11372,6242,4856,27008,2128,20249,7193,18785,3758,29134,2866,3307,3519,2244,16647,19466,8227,12210,2876,23753,24449,5622,12742,22029,31943,301,30129,19610,29012,2947,18756,19942,15318,13986,25160,12138,9859,29888,2814,14934,8705,13863,27987,10417,1460,29765,2474,16192,23851,5546,28172,10070,30058,15278,29230,28234,32037,3776,13043,24866,12936,10320,21566,9550,14742,10341,16341,21043,11818,17542,8354,26119,20374,16968,28169,25863,23863,1886,31464,25618,5644,12479,19688,9628,28649,22567,7359,1906,5770,23234,21490,355,6210,11769,24796,13670,26641,13210,3636,30378,29594,30771,22218,19612,25309,11366,8761,24156,7494,20814,29947,6124,27080,29598,23047,2516,18266,20701,8650,4860,12966,3095,9688,20273,25180,19841,9101,21698,21801,560,8364,26875,20430,25705,27411,32228,30303,1647,28955,27358,12289,29777,14741,457,18191,27740,3091,956,25749,13398,1508,21880,3216,13683,19122,4331,7525,14681,31226,21748,4189,30415,18585,13951,22826,32572,27647,2145,15552,5374,7154,17751,15674,22211,6103,31390,12638,8380,28785,16092,5955,27177,6922,8238,22693,15223,30723,13798,27046,31508,31424,32481,16365,15034,13038,633,9075,27182,20872,19979,21865,32209,28361,12837,8970,3233,15428,16618,28559,28890,98,19593,20818,2579,28800,18848,13008,32417,14566,10743,29336,8505,14106,2018,12684,16514,11813,2188,17186,2777,5491,19091,17076,28685,21249,4676,9300,17690,6233,16791,19173,23718,19007,18356,24460,13398,18334,4299,32683,245,26684,10555,13528,15901,831,14014,24271,16620,8671,32221,3715,12957,30070,11489,19907,15132,9065,7121,25967,19455,13907,10147,28059,16597,24823,10159,22515,12616,24834,19766,25541,12249,10531,11273,18071,14960,14415,25817,20309,12396,30775,15745,5467,31154,11228,4468,12106,30707,24919,27074,22610,29859,2950,18283,25418,1127,9958,15338,14563,19811,19998,775,27550,2388,18157,17394,12692,13430,18285,13857,7149,20998,29590,32119,3539,12088,20513,24854,12732,28109,12671,31412,23007,2516,30350,16670,30736,18502,30352,13345,126,10598,6779,7967,16566,21841,23806,22276,14689,22375,23863,7375,28591,16199,11325,1577,9398,31540,8516,1835,31422,31783,18926,27488,5331,13401,14031,32396,1172,892,28331,23501,25997,6961,2190,6336,3365,13271,14885,22181,23812,18013,12823,4462,25449,25873,686,24130,26675,9459,3595,27568,23926,6911,23871,8324,10246,20778,29350,5192,6212,30252,15919,13279,7735,22192,28786,19262,31961,18057,20843,17725,28990,16945,304,22372,32123,23054,21729,32267,29073,13986,28340,11710,14306,19431,13327,9541,2718,8920,9122,959,5821,18372,28757,6756,3062,17313,18942,21124,19606,2856,7955,13216,7849,28769,7571,22431,21611,9626,3142,17495,12495,24616,29236,30789,26047,22268,7034,30093,12033,5443,4968,2821,12196,30473,7497,1324,30348,29605,13221,23265,844,10904,10680,26980,31025,22697,16153,16500,26780,17109,15074,7634,314,24117,30611,13521,11445,28941,18024,31121,30978,6247,31581,18107,7147,18382,3219,4901,24514,1641,7241,10596,18450,32224,23728,4417,12817,26603,6969,19689,23658,28472,31349,10283,3657,31586,4173,12906,9041,10671,4783,46,14845,20154,3053,16053,12300,29629,28594,28545,4557,15644,18698,31993,8470,11466,9999,29762,21725,19263,2075,2240,23376,3552,28905,20986,25242,29462,12665,13760,14262,16993,20115,7940,1040,26336,31246,9582,7884,26005,6955,16413,3069,22937,30543,7408,11293,29281,12239,11424,7704,5193,22236,23700,17050,28356,17421,31337,31508,21688,9342,14323,26672,7912,13367,19602,5479,5613,11972,17318,14378,23127,12686,24598,14269,20488,10116,3893,32343,11015,28470,28567,10313,21194,2658,14384,31578,32309,10889,2272,29730,15344,27977,8544,232,2878,29506,21152,26031,26661,11838,26435,17920,23326,3532,4103,5748,7719,28166,12997,14762,5297,7403,3895,14723,17954,1476,17133,11889,1582,27490,31687,22828,19378,14878,11265,13861,17687,7094,1467,29836,7299,24196,24836,11747,19219,32428,27134,2538,314,22087,16449,4067,11780,22237,1587,28723,12546,16691,5957,31986,27016,17910,6458,14302,16549,28352,11943,12527,30238,12858,4324,6748,4805,24571,8129,12716,19844,7316,25858,9473,2061,9765,5974,2731,18528,7835,28494,14986,3292,2335,17748,28031,17849,10868,10316,4298,10224,13207,4741,30485,14768,21287,1619,15258,12907,20724,16880,7707,9947,11505,18487,20877,15495,16330,27032,2767,2986,25835,1759,11061,16911,30025,11939,26028,17699,13369,25698,21793,1937,13390,13590,25611,19866,26587,483,25829,27375,9013,21038,29355,5660,2298,6783,19685,8560,2078,22191,14591,31557,4137,25962,25094,30500,21067,23525,23089,18515,21856,30842,17804,11717,12703,12665,14106,32705,2861,6683,19840,8824,31132,23195,24884,29237,2535,2811,30915,19367,14985,4330,11240,20732,15029,21525,26767,7605,10860,31197,24382,12493,13989,28762,6000,520,7444,26167,11755,23411,18821,3136,20664,10952,15211,30318,22946,6378,19171,17336,793,28000,14259,9558,4195,8121,22253,8634,27078,11169,15862,32638,23120,2077,10510,30295,4552,13439,31622,15679,12360,17900,11705,5144,6343,11091,6538,25437,1712,19267,17557,12924,237,6676,15863,21963,17943,29555,29796,26928,26500,32344,1931,18799,11210,1204,32543,2862,31062,19286,2721,5582,12939,9309,7636,17860,22134,11318,8168,5572,6851,12725,4003,22939,1243,15763,7308,12362,21530,29284,31591,26472,25798,10645,26599,623,16413,4902,21625,5556,12913,26766,12619,16835,7486,18560,10278,23519,2090,19074,32548,7278,24961,23374,21193,27697,26712,18749,13152,30732,28051,2800,1222,32278,11339,22186,27601,6598,27112,30154,22018,22608,19807,12551,20429,3861,31323,16433,17741,26761,4027,22953,5502,20702,13897,20542,14123,803,16502,4469,1034,7797,1320,18505,24634,15331,12016,25060,26904,19244,15151,31558,10279,3459,6122,22774,6531,24585,30754,18023,30893,21549,31457,6180,17202,14480,25209,23334,4651,32361,8934,25703,13600,3317,1321,24994,2092,12779,25880,9134,13974,28362,10384,97,17014,29868,24878,17653,15065,23552,29557,20960,11124,2906,24639,15580,10166,12053,32672,5679,1776,30691,14062,6772,4755,6264,4035,7440,1378,497,15746,30001,26282,15310,12152,9443,29872,25219,1642,10363,5949,6673,6935,10214,9871,1822,27493,8059,3237,10355,5545,27848,6123,10195,24797,19789,1468,15320,11061,6173,14718,27978,11735,19912,27911,23175,29648,5020,3681,17425,10008,7232,29602,29855,17596,26335,2634,11095,1653,14124,16919,30281,14925,5744,2309,7465,27406,30090,8884,29597,28278,27611,24100,26127,4049,3065,23592,4252,12291,14623,12342,26354,4710,14115,10409,21802,17965,3346,4929,24690,19053,3581,16355,8433,19753,25975,20594,27527,18706,3428,4062,4952,3101,13476,5430,22060,23729,5696,10454,27470,26838,3984,19960,21530,6182,17579,31524,7371,30774,2536,31619,32444,15636,26809,8698,22027,15277,25281,20326,18778,16529,10244,26228,10660,25527,14468,29206,6212,12880,12360,15095,256,24071,3727,8576,24230,21140,31717,10011,28149,10005,32590,24888,31588,5388,15623,32495,24310,14188,19748,27479,6011,17827,4437,10011,29943,9426,4171,13565,23634,9262,2268,16891,4548,17821,26524,3331,13160,16640,9352,29964,5524,19060,234,19199,31058,27221,14414,8737,27255,8472,13021,3209,2217,23059,28020,3031,16618,27855,9043,21840,25153,7869,2263,123,6557,9775,19459,22770,11756,462,17046,567,14005,8667,562,19947,13976,31068,9171,23775,5657,1210,2930,22914,2461,817,31283,1749,19764,30740,17427,31714,2902,7047,18996,2265,20490,30388,25008,8562,13287,26750,21334,17938,20631,850,3542,19316,13156,31156,2683,7015,18688,21308,19676,2308,14202,4906,19538,12358,30588,12193,614,30756,23901,9974,3884,20338,17767,21560,23424,11256,12976,27501,29208,16153,24369,31637,11580,129,2656,62,17212,18312,12921,19709,26632,8891,29559,2336,9439,5176,32599,16663,16825,6543,3583,17574,10789,31030,20960,28470,5216,27305,5230,7453,380,11821,24831,15233,9887,15998,29470,24793,22051,4882,5151,5828,16390,11209,31858,7879,6277,16299,7870,9849,31074,5851,21449,12003,24752,20718,4694,356,21879,30211,20947,2235,15636,3984,2341,22189,14595,29567,4632,1900,5695,5408,5192,12117,21272,30660,27655,14236,12647,29745,27102,29282,19686,18020,19904,18243,14430,29285,18099,2866,2236,17354,31290,18896,12116,652,26622,26248,25155,24163,25211,17909,5545,29020,18209,27912,13539,23596,18704,20360,10253,820,30346,3186,8566,13808,13504,26298,7184,27303,29644,6173,16404,7796,9632,14971,7255,6666,25618,23947,13354,19723,9671,20422,31127,26487,17600,9824,3464,16438,29059,646,7790,13458,19908,27984,31196,15155,31816,11098,14515,27251,23684,7277,28915,27803,30464,30492,21086,12062,19501,29256,16444,28305,17618,22578,17658,3166,1998,559,28182,8335,12247,9086,2587,22305,20725,6846,15301,3544,5052,11599,27963,12663,130,18058,11406,29824,15847,4519,14351,850,13552,799,30409,9193,15737,19242,7631,633,5223,31608,30308,13123,15259,13232,8981,4260,5012,9063,4063,3057,395,30714,29336,10193,27980,15298,5754,16577,2554,31633,1649,24140,10661,17844,9907,25646,24044,23653,23083,23300,30115,12463,8894,23062,28511,10624,19890,11720,14108,25912,30705,14571,30199,11962,32525,9138,15724,18243,24184,20981,18215,6500,4793,10422,16647,28291,11830,2731,18408,30790,13760,28310,11361,27870,13256,462,7376,3022,27954,17281,11838,4483,5015,27674,4913,18199,29322,783,22465,13820,12500,13527,3606,5099,9204,28814,5521,20398,7663,28237,25520,20157,25041,23985,17821,12412,17731,8332,16280,28184,21182,31653,5707,11621,30730,6342,20908,32642,26011,9785,25302,19581,32753,5196,21631,18181,6799,22934,26685,1585,17074,29856,17746,5455,14514,8344,20537,7042,3220,24465,20197,2364,10710,27869,17908,25735,1688,32272,4803,29117,15597,18309,20977,25248,19120,30702,19596,5889,14277,11435,23442,27465,11042,9912,24816,1770,20605,32360,32243,17621,5676,32633,30656,32505,31416,9162,11956,18553,23562,11356,15380,32662,23221,22626,20673,27526,18949,14688,18478,11977,1321,3288,30576,25715,6817,4900,5934,24939,8180,23627,14700,9585,2496,12578,16572,25356,5817,31141,18880,10324,25131,6847,7365,5873,29649,32545,22689,27207,5363,6346,24135,24043,22146,27715,7948,25258,24078,30754,31075,31893,28567,16520,18416,13977,14220,29481,16041,2022,21798,7806,23673,3759,27019,4614,17355,25487,337,31732,20626,6900,1541,26746,15759,22533,2891,31331,15299,17313,22569,13008,6799,15916,20734,21741,25368,674,13758,16068,18824,10416,14515,23332,8794,6315,25921,20753,27320,21130,21767,5829,5018,21947,26634,4505,9382,2382,27566,251,12249,2101,18668,27072,8822,7389,28155,24458,5845,25123,28085,18997,9148,8917,20444,29310,26649,24767,30340,22349,14031,10250,1303,19429,7016,28289,13242,27459,24092,31885,717,18944,4414,24642,7351,12666,15678,4829,18280,11066,14028,30973,24030,14621,27288,18102,9469,9717,14582,30925,7166,778,4253,31170,15101,11463,3836,1091,6960,29532,20708,12911,20989,22688,13182,14954,14253,24503,10221,399,26230,7544,17856,682,11423,18581,15497,4532,21936,9485,31095,8791,23860,14739,10201,7180,15205,18455,10997,23426,14406,15831,5212,25538,7927,10160,29268,30008,6369,14320,14244,20770,2725,21611,22170,7074,32117,12133,21587,14455,572,18334,11063,29073,26638,12684,5830,24101,8784,9880,14144,17374,7915,3791,3856,17499,27690,3332,13308,5883,5157,24905,8262,31259,3872,15902,32374,23968,19876,19227,1638,13382,29255,10620,17953,28877,692,6020,5190,6873,15977,1398,30680,20398,30015,17524,15538,30446,30353,19403,12413,13465,20082,6671,13907,24712,17551,7836,9499,26468,7933,16700,3828,896,3476,3186,17091,3700,9748,4917,4696,12545,20286,28028,5602,29228,17503,8534,4643,5090,26046,19911,15762,2512,19999,10236,13334,23501,27844,8775,12622,21762,13529,22106,15611,18605,25966,8007,31157,10894,30670,436,26882,16332,21997,29825,32568,25698,14851,9549,32271,2563,25306,18590,26721,21419,29349,13187,28032,22013,17452,26783,7546,25816,31318,9504,25073,13122,2472,26057,11813,14050,26018,24574,11852,12833,20559,5035,1880,29963,29287,15859,7116,31953,23227,19138,12289,12167,5018,4154,17175,8450,8229,606,13791,14645,23181,4968,32204,20613,25655,18140,10251,7142,2704,1670,8131,8144,22270,8555,9838,800,10711,5206,30913,2588,17667,31294,4592,2868,8560,26205,6067,10323,31765,1177,15151,19476,533,24910,12018,17650,6959,11596,6273,22628,28598,26699,11547,23333,12133,29771,22460,27818,8703,8510,46,25409,9700,17280,22339,15977,10462,8675,16439,2268,21322,15297,24573,20130,24509,1046,24254,25731,4530,19871,25268,2317,29768,29775,24737,16670,24538,1396,23543,27673,6983,17208,26488,32513,29332,15826,2948,4776,14469,21177,7761,20426,24096,18558,5706,2939,18943,4828,11075,7986,20090,26596,22971,13872,25402,3629,19633,24607,11305,15986,5351,13951,2254,17361,32335,26982,27197,31757,1616,13612,26347,6597,26591,3640,27601,15907,3549,18133,28451,10611,13114,10563,791,16834,30812,16072,29190,3332,11258,31974,22315,24250,24254,11164,18262,14314,10496,25481,5444,32254,9076,11260,27953,6433,17698,2397,19934,9865,19199,26940,23462,24221,26272,16871,3251,18877,2790,30785,21072,19283,15079,15389,10974,12889,19058,27456,16528,2656,14643,2690,2517,5114,31325,4348,29657,17060,30909,11845,18506,19995,23276,32695,18708,10024,25009,11905,30804,26639,16742,32253,20618,2676,31582,13328,13248,13449,15771,6759,4371,5323,27029,19977,6513,15372,28665,12426,13051,3277,18493,9771,9417,3592,27337,5362,14677,22537,19174,32159,1028,13174,14714,29632,8976,20256,5501,30143,8093,13092,28590,26249,3681,26335,21451,10669,30368,14930,7128,20632,8112,32571,23461,6995,6182,5776,17597,26898,2275,17008,24911,31946,27617,17499,13023,347,23193,16521,3413,14261,10449,14981,10469,6969,4165,15557,8930,22448,31500,15313,10732,8790,8250,15509,26737,18274,10360,4642,1764,3441,13756,21289,28300,4251,12987,20507,4997,30092,31300,28407,20543,22004,21460,14015,6530,2584,22031,17617,9566,16909,939,30041,5563,16220,7477,3471,13572,2112,11362,505,22224,10402,21641,25285,329,4358,30914,15232,23862,17185,16864,5209,22849,31412,15079,3622,24409,22272,3511,3449,16152,25308,25279,18686,3080,21787,14599,4284,2983,8835,22130,1380,9993,19774,17432,1983,25849,32493,21740,14310,6358,6851,28273,3059,8776,8937,9905,9460,31892,29340,19148,17715,15534,9423,24281,31492,8748,23575,27572,6335,20507,22770,32440,2192,15487,11749,979,28222,2357,24593,30180,9820,30318,29861,16275,3406,13156,2805,18548,16409,8664,18883,26236,18196,12080,26089,32427,31378,6188,18221,18524,15432,21045,18727,14542,11809,28120,18521,2962,23406,13507,27159,12338,24060,4450,3732,26415,3304,16734,24665,10724,5802,18193,6229,1340,30916,3763,31329,20679,16419,264,5421,8773,24647,32418,3576,13336,20801,26721,2971,3205,3089,8248,18531,14619,18015,23502,22220,12844,10411,19642,32537,13411,18696,23346,31929,31403,31309,9491,11320,13360,18925,5836,11707,2894,21378,25464,26410,4519,30452,8865,23152,20146,950,20754,5363,25374,10119,4044,1395,15949,9934,21972,12603,7635,7278,24104,28393,29517,10184,24978,27585,7566,20201,15876,13834,20834,17791,15032,27110,17782,11942,32695,7202,16759,28501,30345,16805,15676,10818,532,30802,20933,5711,5018,8174,4306,21552,18431,4980,28463,3202,10785,7101,30285,17558,22351,27613,1286,13074,23198,21463,2662,4572,25209,4169,22923,19866,20276,19420,6457,23274,18595,265,4157,19190,20363,19730,31260,4325,10987,12587,1291,21609,148,16633,29866,30065,4353,30226,29455,11050,1823,23097,2157,10838,21289,11324,20590,22556,22748,11631,15271,26872,28074,13810,23801,2121,25751,5830,22631,25674,24137,29186,13746,1377,27214,8541,2378,7224,14784,14760,3168,16854,10122,27847,23739,8277,27880,31023,30141,106,22316,7188,28081,1702,8336,22865,32215,27384,28967,21429,9440,18798,2535,11262,24817,16704,8654,4547,5445,22134,8741,10251,2113,20483,18683,7238,1314,17083,9705,9563,7954,11273,16233,10235,2148,30989,26738,4312,13543,12270,20039,21593,9037,25374,5958,28594,15496,11497,12083,7962,23178,18722,13109,3609,24644,26479,15754,22093,17502,21310,11007,17503,1186,26726,13783,6961,318,20972,28898,2936,1360,10774,29849,21707,4615,27641,2686,11444,19140,28828,20185,6756,16745,3018,28151,12691,21754,14101,2038,3479,19487,8285,4333,26805,26464,31275,27668,17790,5968,20481,21764,3701,16542,28253,19950,22568,7049,29757,10081,20481,24857,21456,29722,26209,20809,15399,923,6460,32710,26088,31578,11164,32577,725,18768,2385,198,30761,20541,13229,20561,20969,6277,20705,26436,8684,13417,27167,1705,18615,229,23470,3438,28051,22436,487,30470,7038,26740,26153,23629,19393,1478,3738,1704,6786,14668,11607,20142,29780,9778,6633,8433,20675,13571,20581,26898,5183,14980,3824,15596,5255,16785,20785,20123,27697,3168,27098,2254,1521,19021,1802,23719,9177,863,21803,31509,2345,4221,13962,13994,18921,30275,20422,28586,27088,7199,17598,26689,10454,9130,4321,8327,7480,14338,7327,7833,20147,5193,17707,225,11813,32613,14466,24248,16741,32107,9267,11763,3139,30180,26583,27686,32456,32179,17923,24932,30491,5581,26062,29981,22643,29495,26268,112,1342,3434,26178,412,31185,19750,12801,13915,10598,12575,11150,9383,7870,4455,25978,18364,8053,18042,22115,22492,4552,9094,9413,24553,17847,27180,14233,24066,19162,6636,25978,22159,69,31062,8970,27776,24887,2197,18824,32608,29201,19212,4511,8573,9718,3123,19686,9153,18788,1460,5931,8147,5385,6958,6866,6391,1337,14534,9187,8294,28389,6758,14413,15875,16931,4545,2826,7574,30193,28920,22926,17941,449,2916,18096,4228,14446,31181,1538,24166,15586,5655,26094,30880,5324,12525,24130,3178,14707,2248,29026,13569,19,2520,18266,25650,11952,29604,6865,9055,11669,23202,22737,23460,20282,27489,19082,5380,29082,30044,1776,8306,23136,11483,31388,16481,9483,17143,29775,10868,26044,3182,5031,8291,20775,29044,10928,29880,21784,12721,21571,2100,23661,2882,24414,27610,25069,12128,9963,961,30472,28305,31310,20946,19228,28113,20897,30679,2004,21951,18033,458,27471,31614,10713,30407,12724,7368,20020,8438,5271,6527,15130,20578,21178,20292,31193,19168,17842,763,25204,8530,30686,29357,9590,8240,948,19519,10846,5133,3214,12219,1702,6264,29302,25955,32432,13748,31236,8960,1584,22475,27229,25974,24058,26315,15410,18478,24822,28158,20779,19800,19155,29567,23419,4264,3158,7200,28334,19580,22642,17164,13979,2951,20852,9485,13131,30082,945,22531,28444,24504,10431,6197,14217,250,2733,25020,10039,17820,5438,11027,2039,28084,29399,14003,32219,27493,9030,30356,31823,22234,4309,27388,17109,9616,20995,14556,14835,10100,4934,19542,27,21138,11479,8282,11148,27835,9340,12423,5193,22275,22750,8847,30983,7156,11481,31134,21528,9457,20598,931,12451,17472,28450,15942,1839,21805,11779,16070,28466,10488,30038,1383,30200,496,4487,11037,17054,7821,16643,4931,16172,23986,29606,25665,17378,28563,7119,29814,2064,20399,10071,5672,28663,31863,22626,20495,11057,2621,25826,18487,10095,23243,31482,17476,27037,16520,30667,19408,19777,47,8401,2413,23391,23144,5869,17914,2165,25085,13326,21246,19118,824,2043,4026,19057,31816,24641,5467,31723,2761,31297,20355,15024,17917,27199,24238,1953,1025,18723,27896,32193,23265,2500,22015,922,18098,29723,23922,13231,8970,16020,26997,14374,4568,68,30669,2906,18667,11709,22693,20735,8370,4682,14635,11292,4523,21514,5847,26174,7140,20999,2927,5745,19537,10932,8000,21504,2378,4854,4379,9985,17908,18891,23034,28638,1062,27771,30896,7234,8991,8510,19726,4171,16827,9941,2742,28413,32583,4684,6900,27440,9899,9585,14064,1029,13501,25537,18593,12517,15040,25644,13103,25793,9746,17243,6015,2674,904,32301,1779,18766,27416,27640,26130,4105,5051,16281,32574,22523,5273,32679,9752,14068,4584,30764,27137,28166,10542,299,11683,22110,4593,8179,8943,708,22508,20689,4744,26228,20136,1091,7014,30823,24437,30721,5120,4828,32559,30836,27298,27793,3138,29850,17956,22551,1216,13534,32577,25412,12246,25307,27014,12669,25341,6360,14293,26410,13566,747,1146,31031,9972,5636,9635,25511,21859,3969,32746,30888,30487,9897,22659,12540,2076,31490,9647,32345,31447,18019,32472,13742,16119,11101,6526,8504,7273,12862,24229,24895,18573,22676,29177,7570,3365,20614,21591,13834,15546,25316,7745,30636,25205,23912,29267,30607,19659,8831,11465,10220,13777,15914,19369,12057,28228,4047,22402,22783,25689,17927,9847,9791,20074,22545,6000,23932,17930,30371,26533,9982,2903,26409,25967,18909,27514,14127,12540,29870,13861,23209,13479,11174,22895,4985,12752,17844,14301,25618,13547,15408,1367,11909,23927,20984,4667,4278,22518,29227,3949,25100,12315,911,18843,11373,7056,30394,10033,13798,21946,31007,13746,28036,12696,29336,24524,31414,7278,3873,15739,19073,1100,14147,15449,11823,1426,2228,7315,347,32337,23391,19227,24596,23413,8862,14322,25005,18258,9714,28809,5329,11480,4192,31291,31247,9333,32470,16766,22156,2557,14630,20077,18529,24711,32003,14931,30512,19148,19109,22585,4843,2265,31160,313,3980,1918,5432,20661,21743,7061,25072,16121,19763,28419,26205,32207,25545,29272,16892,15159,17794,32109,27987,23063,11541,29243,14938,30826,24625,29910,18922,23523,26443,6402,25521,8044,20180,5003,6963,27627,28278,23717,13323,13723,11120,20980,7872,25330,22179,11456,6316,9187,4122,3819,7136,15852,18253,25853,13049,12488,2483,15539,8251,29840,11710,28807,12095,26291,11848,29056,27918,25529,11528,16810,8155,4967,28788,19476,3746,18584,8194,5313,535,28767,25770,11292,9896,10071,30497,16884,19162,10956,29135,25620,9902,28639,28478,6906,8331,17763,8484,15820,24473,3092,15886,19325,5167,13725,17102,10975,20427,6767,29081,9563,6727,20684,13568,18141,10389,24198,12726,18169,26272,25135,1495,16710,5090,5972,10115,2977,12098,18089,28357,31684,9371,1932,31441,5911,12790,13002,14074,27319,17745,17146,25302,17572,25834,9248,2325,21240,5848,29476,18945,11383,22037,17742,10160,10092,11779,2451,23857,1422,27178,2618,26225,28407,6630,25486,19365,32455,30398,3637,23381,6948,6078,13446,14118,5394,18249,13669,14566,19515,23257,28599,2247,24154,17879,17555,17363,27397,10039,11572,27963,10748,23590,18859,2551,31001,2406,25653,5755,23170,11795,30767,12682,1262,4032,23515,8770,19637,4244,25340,23750,32172,13439,26411,12720,7915,18400,22893,1168,383,21351,617,16573,11460,28023,19859,10736,2952,12786,27600,4065,25013,29113,2704,32288,32098,9042,11933,13292,24179,4375,13814,21182,18639,7398,31060,13086,2798,6586,3670,7162,14044,9927,28389,6578,29813,4797,813,16534,14904,9984,20992,4008,16040,22357,28892,19529,6411,21305,20446,21840,30144,6814,19629,30025,30146,1806,15500,24745,21518,28260,2859,17254,25801,10379,7550,12796,17242,14803,24630,20783,17963,12234,12436,6377,3056,4148,21024,24467,27116,5993,1897,21854,14928,22938,30249,32754,22326,7524,18000,6664,3958,1350,22549,28539,29399,26212,6300,10032,7497,19363,14718,2679,12573,28794,7854,28078,15151,26995,25567,22002,29384,13617,20961,14524,31494,18473,8167,4323,30434,1750,3950,20382,27392,19751,31865,17350,7246,21679,29399,20822,5735,6215,7851,18103,18458,9543,29304,3247,14342,23229,12840,13086,14052,23175,30859,31668,12827,28690,15185,1418,404,30897,4801,21397,18750,27740,19689,17606,19388,3890,30108,15426,3071,21322,23145,25462,26652,22096,164,8830,31593,23984,8567,25949,14994,23169,21614,210,32558,29498,5545,17360,4435,25542,13663,8202,21534,1524,6111,25827,22422,31882,31595,26765,10976,32398,7480,16653,10726,23712,19368,7971,16305,27035,27228,7148,2010,19340,20703,29235,16417,32056,32558,19781,13293,23163,30011,2772,13456,28967,14115,27032,24474,23303,28836,5733,28440,13778,6301,19610,1879,14254,10283,2198,16685,18859,27778,17617,20541,9664,28000,20011,8708,20902,22172,6202,3618,30877,12072,14828,6521,16528,24734,10495,7176,10028,25954,6977,21655,32379,24413,20308,29637,19357,169,21437,7616,1831,16977,27671,8411,32652,19123,28375,27089,14683,5083,11116,2246,13108,16307,28874,24751,30729,29281,27697,9148,3403,16245,1820,14658,2745,4981,17542,2977,14475,3379,1499,11671,5839,14496,13508,4697,31463,31854,31672,5391,25048,27810,15010,8234,11288,17136,29211,25890,14234,19044,28250,18426,17909,3710,25069,13739,2085,3192,31458,31332,8243,29751,18163,19691,5068,14632,25517,16659,2708,17354,21271,4566,27574,8642,17723,23679,17952,5811,25522,9184,11688,10602,19826,4984,1282,4178,21821,23636,13615,8442,4814,2775,17614,31733,4919,21811,29493,3354,27455,21447,19775,2450,22761,1343,150,3868,22971,21214,26116,7535,4728,23531,24895,29036,18079,21609,29332,30385,1318,17115,11462,24681,5118,30214,30114,22732,24523,23393,18742,2729,28996,26417,791,25748,13185,22764,27278,5118,4790,136,4184,20732,309,10704,19944,12258,8938,8729,27371,21179,25910,6644,535,7168,2682,5300,15450,8200,29085,15130,9117,18984,6415,10497,15550,10825,29721,14715,10284,19739,5198,2929,18975,1265,10144,23295,17351,14375,19067,24586,32494,16297,3201,12830,8095,23594,27571,12663,9676,29381,11936,21985,18703,23342,17955,9529,2548,22758,13150,16965,17241,4773,1815,32693,32061,28568,20659,662,31222,23366,13204,209,18622,29784,3554,12353,25639,171,22679,1819,29600,4057,18752,18931,28184,5989,32087,27889,25425,25854,19293,26036,14083,16117,7154,30668,8675,16035,28458,1622,25724,8414,26182,23102,18489,8365,20680,27065,14575,2192,16582,27786,30028,10234,7751,24520,4541,13405,8134,26375,22418,22336,4157,22778,9515,20623,28394,19930,9908,14566,3464,4370,17388,594,8526,15564,21596,4521,22224,9398,11518,1637,14562,13819,13997,31415,18779,28056,8512,7926,9,10828,11618,24405,15374,16260,393,21909,19091,29527,9499,28286,28659,21073,1162,8990,12715,928,1287,21540,15728,13755,8375,28238,31718,640,20867,23003,9899,28698,3869,4935,31934,30552,5680,13141,4000,32647,13790,199,6981,18896,22024,24504,26621,12519,19928,28091,22603,6266,982,27426,32056,25449,2723,19046,6570,11493,3973,11311,30682,19122,31469,26755,12697,23275,26817,18342,20722,22443,32343,17558,20077,3741,21795,11523,25555,28263,9917,17858,12564,24595,1008,2885,15152,3964,15877,16943,21714,12708,1499,19530,22849,6783,12070,4225,6859,32431,20918,12367,13491,15401,5515,18183,32703,27771,18403,25494,9725,32038,28814,29390,3024,27119,24096,24937,886,14825,24938,25227,8817,24567,23329,9115,6372,30582,30430,8244,15457,7615,3990,26998,14976,416,13472,7711,20671,16917,21218,23014,25017,17931,23516,8818,3797,3118,28838,23318,22927,9946,16171,26878,25764,20540,2420,14789,25253,25155,28118,3682,6583,14151,8896,4527,1892,19066,24476,987,17695,25888,3946,23111,25632,26094,1153,6958,26921,23298,8551,15997,25022,21248,15045,5972,17305,28927,6114,12590,22588,32765,6920,4314,27877,28011,24157,11334,19141,30732,4650,19271,7497,28914,9562,31114,21199,8969,17797,14723,31413,18986,17309,20870,17608,20825,12140,22276,27484,9799,26982,2865,30868,25439,2608,12121,23456,8095,4244,11311,7534,25907,15672,7521,2464,14623,13013,3020,16642,2375,8362,21498,29799,2407,19417,16838,29410,28690,11310,29610,15743,24386,24140,31264,18425,8649,18646,9494,31909,12844,12195,16990,3916,30026,13605,21852,10820,25282,29510,20406,28893,23994,8769,4781,13649,6010,8153,16541,17378,16481,6868,13767,11232,5797,19928,22869,11129,9511,17209,30355,18138,22571,14144,24607,9594,25474,13495,29317,4450,10513,31320,20413,10547,11458,4042,13932,25382,19612,27692,21389,22956,30522,31853,23837,23137,16360,25303,1338,14138,10143,11460,9490,13467,3583,20334,15161,18455,3973,18590,29975,9921,28356,12088,20250,12888,803,30030,25019,15252,17718,28083,19271,3592,32033,19477,2734,25268,14927,23664,18010,4700,30984,12855,32643,30305,8080,6986,13090,14962,3538,20627,960,29793,27397,11072,23555,15300,18228,11997,20937,24402,26151,14169,23914,14086,2465,31161,12722,17082,7412,13722,4394,21116,977,26942,17821,18320,12808,32642,14378,16705,3608,23418,15988,9097,31965,15624,31248,12173,15464,4815,19534,17600,10661,12700,13061,29440,29728,51,17594,24487,15895,23901,24870,7404,15451,15075,4836,19391,10644,26121,14396,5542,30107,5454,18194,27976,21085,535,10243,9862,163,1307,23398,20289,1589,24333,30593,26023,33,6058,1981,16995,11393,10287,20232,11630,16087,13817,6390,11964,25099,14532,32154,21814,22486,31644,15863,16352,25967,30898,5402,13106,1392,13510,22750,28084,4832,21758,4393,21622,4069,6971,12631,16551,24791,24931,2111,9556,4191,22758,23802,3576,18844,21403,15967,9749,15009,11121,5409,26564,12848,17046,1368,27082,29477,24707,18238,5796,27819,21340,25802,12070,27111,30608,8344,4608,20619,5581,9823,11147,10634,14732,9201,20283,23996,20508,6902,21034,6967,19284,8496,22403,30635,467,22764,26436,12035,8263,26282,22953,11570,22776,24649,11066,6670,11158,12339,2959,1523,8595,23985,16977,3403,23397,2312,18355,2116,18938,26468,3743,22205,8660,2754,29569,7236,9190,27230,23123,4116,6783,425,26070,25225,1004,25190,27063,29477,30087,30318,26133,19024,28459,22015,26707,61,1720,10470,9022,18593,27234,18397,5707,9811,29436,3659,25789,572,24821,26447,23525,21167,2141,24382,18575,25586,18523,15729,10318,23989,25337,25010,4166,17474,29048,25718,28339,9494,29967,11769,2052,3493,20236,5478,28108,10477,20053,27128,21831,11914,21892,32654,20022,22615,24378,29080,20351,28297,28600,25329,18336,25053,22285,6544,16070,31615,26745,5184,1403,13267,28422,30271,22521,27965,14503,25204,14661,25705,20961,11756,7245,9714,24781,14100,30879,25673,16933,21232,16975,27108,13324,6772,7664,14719,25090,28245,22464,24568,24364,1055,17910,4535,31599,27040,6724,17496,8010,2985,3810,30259,695,20458,27830,632,19242,4723,13950,6172,10916,5461,32462,31430,28541,25327,28160,15536,20938,30763,26669,4354,16996,19729,21026,9076,31968,31952,15245,11264,22975,15717,9365,5228,30506,28988,2031,26700,21431,10208,22794,30153,9406,27368,10552,31258,20254,13410,14072,10197,9243,16419,27491,18018,11126,5534,32604,3057,17087,15845,25720,27731,24694,32005,22698,6360,23974,16624,300,24172,3464,25424,13878,5003,24874,10884,14690,1133,15586,18028,1710,26067,14877,31561,26127,27327,28760,30968,6009,8906,6600,22577,31801,5740,23599,18590,18045,19374,14953,135,5583,31788,5218,10186,13282,23340,25744,21004,10194,14239,10613,1022,18848,30482,12130,8253,20245,30705,14514,953,24635,4346,4095,10999,1646,4633,13283,18098,8073,5514,17267,30933,11995,8743,9363,23097,6428,9838,32709,23082,9018,9975,5804,12948,29932,28964,17652,6398,19900,8248,16397,26299,19806,21553,21073,23838,14710,11695,23298,28296,29126,14659,25999,11947,2735,12723,17865,31952,30447,26967,8962,12345,22789,5135,31133,20741,15077,11996,25503,23690,5065,20755,27346,624,10380,2621,31945,11751,16872,8099,19368,23353,18242,7673,14910,15406,10253,14559,32659,8788,14114,22542,8232,25444,15138,27901,26451,15717,731,24417,8262,4954,27458,17325,28672,12565,28848,11170,1558,23025,9368,9043,7105,16324,4540,30484,1819,19478,29769,17522,30268,14054,21579,10913,12560,31295,2430,9259,7961,30434,28764,10207,20367,13056,32435,11848,14434,7709,12641,24095,26601,17363,3910,1440,3195,16572,898,13069,20083,12940,1565,10652,20525,6234,1260,9227,10035,22159,766,2267,32061,28033,15636,16669,23917,27463,17050,2837,31971,32292,5382,7553,26565,10092,1491,32245,17373,26130,9805,32101,28445,5086,20661,25638,7840,9472,22013,1886,13649,8550,30172,2057,20111,14443,14712,32238,169,12783,26315,26900,32246,31084,28479,6207,10814,17544,6978,20590,19093,26532,4751,13177,26613,18992,13033,5176,23133,22244,20090,18966,6585,10295,14270,10444,15620,21329,32649,1366,29875,31407,32097,1,13439,22025,19551,11880,9480,17179,29487,24162,7403,24554,15876,5712,9280,15679,28251,22785,24799,213,10750,4095,558,14843,8104,20811,20675,8604,8556,30937,103,14691,15958,20049,20432,27641,4172,13598,7877,22397,23916,16956,22563,3907,26638,29149,11862,11875,9345,23303,15946,28302,19374,17427,17288,30217,21171,26405,8617,9684,29944,3630,27977,12272,2689,13959,24675,18140,5396,25679,17022,3935,28349,29776,18070,3717,23589,27428,15083,28211,11428,11895,30901,1771,15599,19664,21678,19483,844,5536,1485,18184,13635,29737,12843,6550,25713,7022,5393,10125,29497,8295,5506,18633,21370,2743,20472,2258,31258,18814,14191,17750,24124,19424,1936,24276,4615,2638,27533,25908,3828,25082,4003,12130,30235,28914,53,21118,2607,1227,5836,10111,27592,920,11383,18303,13487,23007,5301,2096,32663,14842,26891,26932,25784,2711,29322,29376,5451,22172,28154,13455,24582,9646,32175,10183,992,21621,2627,8639,3991,7858,226,3595,10824,8666,11071,23985,22841,8168,24733,25544,23151,17417,31552,2007,8729,217,27796,32423,24935,15190,7525,1776,25815,6535,18157,20405,5866,25323,32008,9780,24462,14504,1117,15446,15826,14454,31,219,26738,8203,4768,31168,14060,3605,28029,10270,22074,21993,12686,28851,29711,9687,11816,14015,14713,32458,24322,23745,23639,15521,15624,10296,8502,16510,31473,12926,1995,22619,3588,4823,17185,30945,12733,1753,28205,15989,13008,22676,27297,30882,26058,5030,3269,23233,14064,4465,15616,22067,14925,31144,23103,16736,10052,28891,7179,30750,2199,12606,9143,1891,1232,18586,24973,25131,8595,2156,19977,27243,17380,25319,13064,5440,18687,22704,3927,28452,890,7721,20109,19291,18050,27679,30977,2300,11213,9159,14949,6152,1836,12381,29012,8984,3779,12203,28977,1084,32087,31364,32424,23530,15138,15071,23424,7192,15314,14749,26340,22607,28108,22758,11478,6516,20914,9642,29635,16175,30371,7357,8614,8224,14426,9224,12744,9139,23714,5405,21372,15414,25899,3959,24000,32756,12356,18173,31704,2846,21750,19266,32148,17709,4551,12565,9138,17959,17682,10196,30025,312,4606,10326,2267,29094,5743,29533,7561,2986,18270,29574,30140,8452,17969,4959,32673,28802,32542,10625,965,28832,15073,21406,10609,21984,19630,29213,3657,11947,22977,18891,1440,1579,14215,11046,19398,27257,20072,29870,25859,21902,22539,3940,16262,14585,18447,27155,30715,21585,16640,24136,21243,5071,9544,21924,27963,23974,16326,4378,3938,19073,1375,8822,7479,22687,25941,12297,25826,19974,9930,3306,7558,1019,29883,28279,2829,701,16025,6145,24189,23067,28438,32698,6265,13288,12038,29062,13119,17062,15189,698,9086,18784,16796,20412,8779,8857,27989,20686,31326,6480,11140,17757,32371,21040,15741,30330,18822,3046,9047,15829,27820,32412,6745,18609,32390,26922,31327,8879,28770,29791,25637,30521,12712,4089,23362,10474,19193,24794,12132,2680,10414,18769,21732,5103,19674,29452,29481,15953,28904,4883,31349,12678,25228,7280,14110,22754,2620,29284,20718,23414,9788,15936,7999,28540,27246,3039,16140,13038,3312,1848,4576,32607,32353,26632,10849,30231,22531,444,26176,19219,7419,8964,26845,15264,8520,958,9055,26644,21975,3391,29612,25812,4585,25242,1792,24266,26890,7646,19496,23938,1655,29823,21686,9701,9074,12751,25559,7425,31960,8445,20359,15891,569,2875,6435,3192,19668,7790,29973,8398,10576,19299,31750,1752,31859,25013,5954,25513,1903,18543,21355,15428,22814,23302,2529,26145,12111,6960,28329,30674,4548,21558,14173,7865,1841,15127,26518,19675,9630,17092,14509,30533,1371,14551,24701,27857,24630,25900,21668,24723,26234,17943,1379,27170,24983,10202,21932,29359,7421,31195,29997,13781,5402,23957,5926,3095,25638,18434,22879,16622,32713,16224,30026,26744,20085,3154,19654,22090,27419,2446,32036,31028,577,24326,23427,32679,25749,13550,11172,4829,18854,17833,352,1096,13751,10159,27187,23425,9326,11688,15079,26219,31044,18020,17430,32662,17647,20113,10901,10720,8524,26478,31677,6926,25763,27945,9099,11970,929,21642,8749,4546,16472,13638,7151,14766,1355,17541,12853,14931,14443,4447,26298,30075,2294,6131,9610,27486,23696,19088,25938,23784,24328,25602,9117,19215,32233,27115,21393,27517,14544,6618,8505,21509,29196,20758,21148,5894,2325,16051,9495,1789,26256,1515,22199,20477,4172,2185,15653,6221,5443,4896,10972,26958,13879,3892,11865,10695,22057,24230,18884,21393,17146,11485,19482,17628,4118,8652,22235,14841,15558,29509,27217,10335,19664,8266,14559,20819,23311,25620,13956,22258,4118,18168,18946,18698,10301,25665,17472,30966,19610,14359,4486,26651,1291,19032,19731,21426,30671,21081,7486,29298,1505,5758,27226,25780,8824,31726,28426,14391,7601,27819,28680,21699,9690,8977,26561,18642,18414,4950,15163,20423,7099,1039,25413,25670,16742,15179,20781,17187,792,2544,27950,16659,23305,29745,20586,27533,2205,15400,24079,2712,32758,21496,31675,31916,28860,8651,22579,5489,24376,116,31713,24575,14254,20967,26427,7882,14961,19013,12366,5268,21720,4594,7516,25828,28574,316,31071,5908,26921,14171,9985,21561,12995,20290,25963,9032,15596,26127,7216,31844,7809,8236,24778,1890,27748,3285,19414,26578,23675,29616,30332,5638,10386,19616,26023,7575,9626,7371,19906,7503,24197,5927,13924,21709,26487,10106,8035,5005,11057,30737,31545,11776,106,8614,331,31644,23278,12982,23838,29370,26688,16593,6068,29799,804,1080,27488,17250,20471,25850,21465,3330,27354,12934,27,9097,20067,14326,27985,8055,13152,31038,31215,13655,1573,27212,14097,30773,18646,15521,10684,29738,7340,9306,15382,7204,9222,18033,31102,16925,30536,16254,21792,5255,24437,11920,29066,10387,28004,22948,17617,27580,28239,24687,23911,9766,24252,28440,32634,1944,24364,26389,3869,25129,3044,19309,14178,16916,1407,16561,20259,4379,25824,20393,26562,27038,32400,11662,4634,9052,22108,32012,25787,18419,23593,6542,5015,25955,15140,16335,3709,15954,29174,2744,4717,4000,32703,24197,19004,18536,21221,19024,1361,32547,23206,19643,16990,27289,5675,13163,5400,22616,25071,30707,16282,25848,29129,13658,31625,5182,2351,11192,6217,3086,15848,4795,23606,29151,25937,8646,25250,25789,25126,27852,15304,9997,2271,9713,9868,17861,24530,28822,14940,552,9473,17093,11690,7935,807,13399,6434,7264,13846,26983,17148,14535,3342,20295,4388,27693,17938,29910,30494,14483,25024,31086,11038,8396,31783,23975,8281,31149,3554,25365,3073,26747,27826,32153,31743,17504,29830,7186,10203,30896,14385,3578,22169,26657,13023,29195,30961,31810,4825,11004,18828,5022,846,24468,13101,14426,18718,14043,27232,15781,11308,1078,26846,29055,9481,22744,13013,14986,6239,30126,32609,31362,18812,1775,16263,12925,4313,32135,1545,10655,29359,12578,12019,17608,11319,22846,25504,10412,16997,13342,15965,3550,22749,22212,31501,4422,9424,20310,15720,15291,28504,9964,19977,26865,21135,24031,6720,16081,6277,28833,15914,29308,18297,19327,9202,28820,15231,10930,32724,31635,5046,18187,22296,15591,14613,27720,18580,19717,10683,25598,10527,14329,5433,17613,15380,7248,15831,20146,8007,346,13324,26375,31609,20937,1266,14078,30135,17710,6538,28341,31475,31083,3241,11218,32473,28429,15345,18801,17780,8318,4193,26677,14450,11140,27359,31333,30580,20105,3022,24464,17661,23616,20191,17995,21602,20540,9480,11179,22205,18649,1201,11510,31314,8362,31015,27974,13946,26386,10084,17258,24509,19627,26531,16418,31757,25173,16577,14266,27491,19782,3937,29499,15626,24608,9419,5153,14350,13400,8883,9849,21619,14883,28524,28496,18036,17475,20965,27235,20846,11422,29954,30242,11379,19475,8948,30094,9648,4770,9681,13597,19440,28115,5373,21915,25707,17220,678,2283,6431,20865,3723,6024,9637,8741,20367,17390,30475,18570,11491,1214,13685,3871,26882,18988,26679,20678,28738,17844,9369,21777,7775,23481,22221,1421,836,7229,15064,7667,8957,17796,18750,8822,11374,32685,13935,21225,13722,10350,28946,29683,26658,16985,6122,12285,23941,14769,29965,22999,29376,5806,2891,32514,4527,9302,12866,19874,22758,19275,29822,18156,7351,20313,12633,7428,4700,20385,20183,13781,11469,5682,8241,15127,29414,32660,20269,25847,4401,9609,24369,19621,31868,18683,9554,9375,7718,7925,30594,31579,25379,20383,24040,11447,14722,2298,29810,743,22434,2127,23437,2935,1428,26832,23165,169,18036,13708,8646,11424,28170,22457,32043,29345,31031,12870,11172,29460,32327,25746,5222,22099,21179,15108,23388,16168,12831,8273,23423,28224,21076,29675,26376,7002,17464,10236,17471,13314,22436,17685,25238,12866,3587,17357,32731,24918,31487,3319,28101,1454,18699,1899,12402,17786,2042,10453,18973,2154,20302,30988,26729,23207,24528,1068,22191,13885,19851,13300,12112,28458,19729,21760,14447,14588,4020,15394,31421,29119,9851,9328,826,10421,5211,29356,8032,286,2064,27929,27933,18072,15634,24840,23904,26381,14088,527,15206,3946,27605,19620,24269,17100,16627,5042,11781,8336,23909,11289,606,4824,11125,28017,19190,27503,6640,12027,4048,23305,32388,25100,13414,7872,29726,8880,25177,4295,22142,1627,6362,24155,26388,19122,27208,19886,18545,407,10964,25030,249,11425,11465,21396,32494,24323,10322,10877,3557,2325,25982,3254,9331,28709,14213,14495,17128,24612,28400,21489,32115,6339,18152,27129,1911,28051,25352,21366,4646,22918,19119,4757,32403,29219,21213,9624,24858,16935,4505,32287,3902,27067,28228,24718,12415,14095,21963,11918,792,19026,5479,11487,24502,21363,16560,32013,21712,31401,16697,11148,9975,31129,4795,21515,8541,16482,24217,1075,8370,12843,19873,29749,3733,20675,8437,11482,184,28288,24990,30591,769,6022,19317,7745,17144,23276,10610,74,32079,16546,1243,3085,11543,14463,8344,23598,26937,4712,13218,31251,3604,14368,18927,25848,14213,3093,21201,26680,16127,26120,28474,13810,10520,29248,21990,28555,4071,27117,13432,29126,8307,11360,31260,18586,26747,10280,12503,14469,17712,30999,178,26981,29521,4848,17272,31050,16049,2236,2611,16491,27812,519,13890,32747,8266,4310,20346,22357,12248,23102,12828,25110,13157,26913,27797,9662,9616,23766,4731,5714,31105,18621,18956,30987,17133,4069,28578,22966,8129,23961,7928,6410,14324,18023,4433,7934,5212,30470,9373,20782,20083,14190,25578,15767,5432,15658,18196,24990,31457,29488,29451,15886,29737,6824,3725,28350,11238,3512,23783,26583,7445,226,15608,17187,29064,21871,25239,10231,28388,31150,26462,5695,14904,16971,7567,17323,17299,5117,12151,10179,28443,1093,11855,22364,27848,15350,6917,25471,21088,21614,30352,8601,7986,2331,30137,16539,27587,3484,30408,3796,30852,672,14468,22267,20845,20072,23772,7789,12736,14523,26826,19552,9491,812,28877,28298,5404,10435,8861,22218,19637,22035,25974,24781,27576,1603,27935,5902,24734,25510,916,20922,20327,30641,18154,11153,18041,12286,8704,26638,17180,26866,3873,16089,17910,2023,633,8673,21072,17323,22687,11413,24159,30409,20671,293,13037,6898,17398,10086,26770,14299,27510,18502,24545,23550,9735,22966,15921,23903,25249,29702,24480,15514,25846,2228,22617,5143,25876,26393,31373,15882,12813,12923,30437,10250,610,27705,1581,1566,5461,19069,21755,26157,15779,580,397,22509,25448,6195,8451,4156,13815,12050,30389,8687,15910,20997,27836,572,9980,30206,27574,30851,21424,20728,5184,31744,12855,20773,13731,10663,9825,17466,1814,10141,25888,11791,15725,5245,16445,5746,23020,8473,9558,28015,29477,25349,19033,27700,9810,11302,1304,16162,2990,18806,23273,6625,14194,17197,19212,9510,24749,1799,20331,30501,1791,1427,22986,24807,5083,6320,1590,18672,30142,9271,5177,29588,7316,8713,21345,26391,14347,7618,3286,26472,410,15488,5343,15430,25899,10574,32751,16376,17666,4528,14112,25856,21340,826,4117,27311,31417,24319,4430,2335,12692,18106,6180,624,20813,4415,4413,28993,2536,26235,12515,25621,28442,8242,15475,8708,11250,23754,10603,17906,1826,10961,7910,30647,5867,15224,23378,15659,8863,14011,1581,22468,17599,17147,26288,10676,11548,28412,20065,25971,21721,7851,2633,30317,16768,967,7929,11130,9433,16252,30807,15749,22472,26338,16176,32469,5647,5566,9752,29225,11935,9321,3342,18331,23065,15196,11826,30821,2265,25467,25954,18687,16224,19487,16110,31067,11177,9470,27791,16421,12540,7804,11607,26817,19479,18370,28390,13550,28385,3355,27443,11288,28289,10916,1748,19619,23990,23033,17218,21250,27288,5204,26787,32209,2297,32528,10847,22195,13834,18547,13229,523,8752,26081,4251,1826,10111,15812,20525,9361,9320,7516,3475,16009,12834,9043,1148,19190,1777,9432,32614,27788,6320,21663,14476,12799,26378,32054,11574,27319,12752,4504,28826,26209,17893,1270,16413,14660,20282,5129,24335,1995,30911,16552,14698,31716,13060,18285,6661,6554,28290,12914,17653,18779,11803,24694,12398,1324,12294,27449,24783,11555,25091,32070,7814,2494,27228,28014,6931,23920,27863,21863,7307,8384,19968,9642,8211,1804,21503,30731,4888,17546,14681,12306,8292,21664,30709,13824,13989,5054,11445,26500,24304,3520,32122,31215,24611,23224,27728,13813,15691,3638,12984,28172,10045,24046,29667,11219,19230,29807,25965,2619,20693,12041,24443,11792,14698,19550,429,4115,3770,6918,12281,29150,5863,4100,27851,32564,22164,24501,7625,19018,18016,22367,29838,16261,2708,11272,2346,23207,23053,14795,15637,22586,1693,19013,15836,28680,18377,6978,20923,21790,22395,26003,22176,8685,8671,27256,8211,6951,7973,22267,8089,13216,30939,25595,900,14652,19776,21842,5241,5645,18916,11338,11454,19542,27721,22687,7332,32125,2575,23381,14526,3162,6368,24974,141,31503,1241,21239,10224,26239,25623,13568,1551,16932,7548,16107,18778,27432,28193,15771,3998,22680,16421,6066,18573,242,23342,14583,18061,28483,14128,20829,24677,1407,30194,27109,6922,14033,19436,23001,24832,10750,28752,25719,11820,19683,22116,15814,29766,416,12957,8825,16984,27203,7668,5720,12621,13589,19061,15991,31302,4349,16757,29749,28075,6232,31804,15933,46,28212,13631,26983,2212,16074,5257,9309,15243,2471,24078,12669,17106,21972,1810,19209,2267,26415,2418,17508,22890,18663,4719,13898,3704,16998,27805,28573,31182,11392,32024,6741,13005,14005,13373,10344,32559,15383,6107,5536,23891,30090,12735,6681,24688,29965,16387,19792,6246,23072,19654,6557,17984,18003,30105,6226,1857,23023,27558,16283,18840,25515,30805,18050,9867,25660,3029,6492,1490,21316,17991,14938,18611,14747,5833,27667,14086,909,28596,8021,2263,13982,7343,9483,2251,18592,2088,20350,30386,2251,30768,11971,10603,31477,16438,3968,5343,28165,1441,24698,19456,16114,4517,18524,9808,30571,12326,14698,32156,20775,24493,7986,11810,4711,2172,3510,19073,30891,27775,28884,25815,7185,21885,19253,25614,7993,2424,23502,1337,4577,32621,12719,30942,2015,9973,11546,4903,17003,14559,7318,1381,18964,23200,13540,13548,30591,32415,206,22066,5457,17148,9512,4066,1614,31929,25209,20462,18408,26722,15169,31531,5317,14635,29900,3801,17665,6468,29804,25948,16237,16353,24235,32176,31255,4243,267,24127,25573,5526,13813,5350,8205,10800,18634,29440,15155,16794,29975,17626,27744,23660,26637,3688,15948,16869,6517,5300,7705,9546,12316,12262,29273,12009,5102,19218,25148,28063,23125,2400,2254,23578,13768,17795,29826,12367,6540,30438,24653,10554,26200,1463,2070,19372,22255,27462,10619,4003,28753,14699,21774,7172,12767,4730,31414,9819,1479,27971,11628,8270,27204,22792,19592,26320,7783,17937,4072,29145,18273,6600,25292,8822,7374,1409,22763,12140,14733,27217,26892,386,8659,27440,9751,5446,5294,7616,17219,13759,25653,11459,23939,28187,21127,24765,6496,7507,11975,6536,32198,12818,341,16549,29421,14788,13279,7367,13519,3959,29603,19707,23576,31591,4002,14719,27980,6227,792,9953,9165,5633,30755,14005,29755,12745,25872,15979,3688,27032,8237,31733,8692,26638,23009,12519,31114,3262,30462,7281,19805,15783,25497,17729,12285,8512,28405,4537,10791,7117,1124,25927,8399,16936,15786,32171,11823,25205,27122,27429,26283,15250,17084,29216,9090,7200,465,6538,12267,17780,9667,10239,22850,4985,17150,32117,16805,28052,22892,28122,20571,19157,3063,25817,23424,20807,27612,5538,1873,30948,19383,32304,16358,21590,5894,12567,32314,29227,30170,10501,20904,17635,20860,27111,22381,10320,12719,29183,12566,7933,1841,3293,27401,30449,8210,7360,27676,20982,7869,12458,9360,188,15686,20375,8605,9628,20860,1820,9950,1371,31184,9774,27665,6312,20620,29529,13066,16713,1271,4554,11208,24461,31011,15159,18886,23640,29686,15322,5180,27243,4129,18590,30130,3739,12323,26794,3568,24360,20358,25904,25512,30862,11872,29968,20046,27608,22382,3952,4294,11185,16019,5023,19950,12862,19264,10355,22301,15055,30861,28348,30238,17649,12847,4602,31318,2682,31973,22753,28976,19338,14945,14902,16679,14668,18828,14132,4093,9475,6078,5982,21120,20910,18812,25033,15230,28638,3047,31342,6592,10355,30407,8873,16389,6712,32327,16940,15504,4670,24181,24259,21230,21236,6257,22157,10717,27230,7683,23629,31745,14163,15691,7627,30649,14700,9640,22929,26201,14895,2164,7386,19772,18479,24242,642,5962,30664,6014,1043,21252,12093,23386,5493,9751,30136,11804,8090,25592,20485,27668,13116,9595,23582,7919,8157,23257,9216,28087,4701,13467,4524,6934,13984,5975,15919,14226,16740,27383,20802,31026,18693,26316,8821,2156,14869,17906,12336,18104,6186,31302,18888,26069,8995,30427,20123,10056,20342,3807,25728,9245,7841,11825,5075,16903,2629,21472,3831,8235,15212,7807,16207,5534,5197,27128,6407,32212,6309,2346,25717,17358,32357,15838,32326,24831,6411,12010,936,25037,3262,7127,10850,14867,12466,31966,11800,24601,20074,23214,2222,24593,21201,25986,16683,25020,3036,6626,13137,2121,27974,18810,4258,7007,19602,26040,12866,4312,9881,2147,15122,14286,21839,22357,16498,4293,18594,21531,12998,11003,7520,17424,24303,17225,14432,2327,19825,4327,31038,28125,27165,14330,356,21864,24118,16812,25606,8007,21532,3882,2986,31200,4719,10181,13363,23153,10209,8905,28563,24583,1926,16046,22815,11427,31123,7208,28483,28269,27917,4668,19040,31919,21180,26926,23959,24906,3897,13275,20013,21961,5275,3500,28089,21887,15510,3884,27060,6933,14036,11401,32526,17890,32216,4752,16980,26459,29316,8279,10632,21651,13159,5544,11092,8471,15808,17187,10725,10217,14725,6975,23497,7238,12178,11719,23046,28515,23462,26016,32074,12312,21338,27779,10701,20929,9121,32149,7628,8576,3541,25882,21095,24467,17580,6443,32405,5075,29383,2376,2161,24606,4596,5141,17980,14048,25156,8974,1693,24022,19376,8251,1675,21008,3934,10829,23115,6530,22940,22030,7516,21868,25413,13219,28865,28395,2966,20938,12988,16990,9083,27828,22608,21191,29262,12902,1967,28169,9665,4768,24392,9058,28337,7495,11899,8783,2366,19796,15080,24132,8944,20379,3215,16864,23615,8304,26449,7153,32186,624,820,12290,3409,6026,31691,10293,20646,859,9736,18189,4076,32203,16884,22558,2479,3584,10745,12011,16454,3365,6379,31516,13377,10287,29151,5805,11259,29688,20152,12294,28701,2691,26196,17530,24389,21,13989,8363,13794,15788,15781,10022,20423,3198,14192,22136,7607,3053,20389,3576,17992,7420,18305,12163,6736,4668,31154,21140,24391,31583,364,26765,26534,4960,13561,24002,13848,24306,13695,8995,25428,335,19267,31307,32749,13466,28460,22029,17625,19977,27331,24217,15398,13157,2486,14862,29080,4688,20928,9492,11851,902,3342,21304,17682,20828,1760,30182,23190,17421,28603,29595,30881,15998,3730,23703,8726,27665,30959,25976,15669,2708,4031,9270,27042,16354,1229,11714,12432,10096,5815,30920,13674,32312,31901,17687,16474,18779,6549,22363,12072,7652,14282,9290]> : tensor<32768xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<15>, tensor<32768xi64>) -> (!FHE.eint<15>) - return %1: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 27663 - - inputs: - - scalar: 3261 - outputs: - - scalar: 24540 - - inputs: - - scalar: 32767 - outputs: - - scalar: 9290 ---- -description: identity_apply_lookup_table_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>) -> !FHE.eint<16> { - %tlu = arith.constant dense<[58610,19993,6109,49209,4755,47098,407,4183,38102,15361,60094,3911,32836,50063,4856,31562,18533,16410,42711,23516,4095,54373,22140,58516,57751,64109,54033,16957,40024,62447,10784,36522,61328,38241,44328,23985,53383,2258,25992,26064,20993,6290,61974,51746,22652,55175,28405,518,40685,18656,7614,37225,36813,43060,61577,19847,1634,18923,63280,52993,51260,56241,44132,12612,42402,32398,57983,64173,48045,42738,55071,40134,4037,35247,43167,61418,46290,41113,46138,13739,61430,48480,47375,26071,61171,20708,14002,22669,52112,58630,45767,49365,56220,31499,59278,3356,58294,23542,39312,52523,41136,31822,15367,16994,49476,60046,16339,35994,21504,64242,45185,50736,52359,17539,59897,30198,12547,53400,7534,48052,21936,64760,60784,26207,39106,24319,55291,30969,48165,10501,19737,6959,7272,26040,55642,59389,11394,49826,31396,21993,3790,49345,26385,23880,2579,15996,64632,42124,17068,28248,13084,16666,4415,2137,1394,64587,53337,55324,14106,47468,5472,35282,21563,32249,17258,37673,39447,4848,64319,31904,23062,27033,5958,14014,33944,26531,34899,64139,3331,61793,57223,38114,32566,15057,53,6334,13342,42227,34212,34724,3818,7658,25373,20880,38977,51949,57999,36418,12625,35822,57377,29694,59486,49394,59041,30199,42955,24885,13208,43452,4105,5588,16356,19479,43553,5322,41395,50731,21139,27777,36621,44627,12438,27370,18744,26973,40518,25319,36136,43917,38410,33257,35024,61776,50890,44448,5299,62881,51306,9649,60343,15764,26770,21644,45925,48100,15228,18079,27211,2427,33641,36410,6299,29640,1007,48961,25481,32513,14970,41987,61326,15591,36983,46989,3086,36921,24926,1832,60930,63520,12375,60939,20712,35589,7924,21969,45165,2527,61411,26932,20871,6957,52984,6060,44081,15179,51706,6515,39993,49863,31210,13864,16055,6708,24438,58788,17705,29870,8135,56710,60110,65512,60252,28589,49985,29306,58123,62383,20016,50498,8661,26725,53070,51556,15549,56917,31304,50136,50803,10865,6121,17308,28005,4700,6269,27367,64238,24270,25227,29585,15051,21192,16575,21202,55068,28950,50854,55264,64281,54035,60269,34042,35320,2397,46038,61574,36415,49716,7648,54377,6338,59865,36455,63157,5514,16045,30450,38245,38083,2007,33050,61241,16726,10356,45779,44789,64433,54288,50855,29656,16087,62343,30311,16439,37085,32864,37368,26789,43728,47274,13612,11857,23972,23589,16589,14545,1542,18120,37788,60879,4233,15539,4563,15555,37883,37511,13225,1863,45906,23231,20906,4373,38659,45835,22382,13515,25963,51637,43396,37208,2873,2531,38513,28338,56164,50023,44504,63282,30594,21734,43115,18858,6920,59995,3209,58040,47072,31611,48957,55706,34662,15890,41029,62278,42860,24935,27470,22013,13705,58055,54171,5180,27194,60604,34643,39498,59656,9769,10500,63615,21790,45296,13158,43596,26407,31787,53247,26918,59158,3233,8048,27131,58977,57138,49974,65049,34103,46983,28914,54005,8709,48699,4858,6544,24309,20553,51329,22660,36362,48029,56891,641,63996,21501,10039,23653,16912,11052,1461,40656,12674,37180,35530,12031,63554,29874,25692,57147,23202,21248,22455,25187,9958,30972,22822,35337,1018,58529,58147,13236,50391,44465,59583,14421,59763,6689,12104,60124,51102,64818,28664,59405,13656,64514,59321,41806,46607,40908,36592,1280,34534,14627,40817,64584,13284,28312,63093,13660,36590,42972,48384,48180,15378,37132,21790,19661,8584,5425,20824,46601,16363,61182,4897,33853,38127,30455,37034,22863,39555,32940,6487,42686,57488,21349,54135,41506,23208,59344,61807,16189,12973,65182,11728,51864,57701,39037,36851,1072,45580,19682,57859,32739,52276,27453,46523,6818,30399,28037,43609,15201,50042,26423,36497,11623,8650,51726,46383,24230,24889,41224,10283,61709,18198,59825,57282,9693,51399,28170,4887,608,52444,21074,55664,38248,23077,55300,40181,38125,23075,12735,26940,39373,38959,59745,64575,19131,60593,52039,57295,20411,12439,27800,52574,64632,48397,27957,34724,52539,20879,52736,41318,35675,61121,47681,6725,57062,11917,1750,51573,46894,40017,3563,1564,54767,7147,64695,10067,55240,59874,41904,36525,57321,51547,63307,50282,56658,30838,15108,38541,52379,34858,51825,24157,7092,36083,620,1037,14152,27502,43671,45759,64927,50609,54707,60647,46792,40526,64701,41408,19898,57230,33739,21315,39919,16558,56970,27485,936,19184,63494,53595,3441,41364,29471,51986,1165,57734,391,53589,1942,20378,34854,55638,5282,59967,50245,7821,5327,7304,45987,36923,58068,3698,5873,6882,3320,8974,47510,13571,20684,12849,27050,52773,44583,65190,2122,63956,43897,6913,34965,48181,52470,46091,37816,42615,60134,52278,23188,13790,53437,34102,20570,55393,62414,42077,29747,35478,34202,41579,45445,20962,5167,6877,50736,12016,29705,50516,17263,50099,43140,36043,7680,48093,46476,15986,51956,148,8443,49926,23141,12574,55146,62221,909,39532,27485,56708,18322,2004,26696,15646,49786,24254,22662,6429,19838,44475,12904,27863,1188,8476,7961,39689,28194,16581,1434,19596,38833,45781,35762,60259,20406,29589,52398,18186,56015,25359,21912,9197,37421,20775,2106,29214,58145,44426,6479,899,48175,43486,1402,40635,19270,62171,989,13729,11741,9128,8916,11371,33092,49365,23435,28157,62756,32859,46281,12017,21198,33451,13890,3254,13908,55180,53903,18525,25681,57596,59251,2811,5310,55592,59264,46913,641,57055,11620,30368,38372,4028,39595,8521,12109,8386,39880,64896,37529,5195,37472,36836,28446,8517,3184,59365,39890,45228,6304,49866,51725,9962,44034,61895,35259,62178,13831,34919,12394,55489,42434,25917,50545,64974,16306,36142,48288,3545,13815,33586,26420,56282,30950,18007,2036,21035,9702,61073,39403,4657,18154,50200,59220,53045,52251,61379,35317,12509,10217,44187,32722,31003,28310,36750,43753,31226,34870,16837,11240,5826,34144,33671,13956,51720,5514,20744,38048,31479,37026,35134,51519,18369,7842,56471,43138,8973,45869,1032,31529,49095,41072,64893,1624,60087,17956,49288,18371,36938,24102,29553,29507,15323,45042,29219,19517,11253,14514,41011,54911,10263,65435,4878,41414,41244,2230,32876,11824,51002,62246,1346,26258,29035,13015,46128,56682,8765,27244,47335,29358,61656,4417,31144,33727,60855,46692,32855,31953,8928,39188,14163,56880,54351,60988,65277,26098,63933,12251,47842,54630,34155,24700,47528,30421,36135,10424,38492,55684,48808,58256,21433,27252,64722,11282,41784,49122,1050,3369,34591,52544,19193,7917,22703,8077,4052,47376,51016,39754,36144,60609,16771,31096,46202,29252,60045,28451,64963,25374,46981,29719,51799,50283,17329,56374,5401,50844,48131,25999,46532,1098,45986,43931,53001,8672,26272,54798,3042,38279,21863,20259,42320,49761,63812,6199,61110,7201,44706,7806,44484,26124,13655,40766,33091,25653,21350,7929,60008,41502,64092,29629,16815,49812,23575,35077,23765,51291,55673,28751,57739,10479,22616,40007,35171,23617,24474,35877,64076,44249,9529,51258,16398,62449,37363,8756,14662,31297,56267,25810,41480,4560,34553,49096,21734,52600,2283,11956,9388,15864,47583,47867,44813,30313,13905,64891,63270,37327,60492,2934,32292,3074,23547,56360,8494,27068,56334,50553,54066,10443,46634,42502,16929,62494,36789,49427,57778,3079,52369,23713,21971,27848,47236,18417,64658,47077,41381,28748,17661,126,49709,8275,38860,51324,65167,27658,54815,28111,56932,52774,10259,58550,48039,32330,39347,38751,19928,27770,62928,62731,1070,54522,56583,1533,17473,47005,55161,58314,44913,31090,38673,575,61959,17006,56749,14455,58279,18051,19259,40799,1603,25017,25967,60500,18832,23741,50198,38587,56838,62174,29027,24487,19425,45533,61004,61132,51502,45012,55534,63498,4870,24262,53893,57689,28822,2455,48580,9007,2825,49275,33020,50060,50217,41958,60208,64710,7635,59969,32037,10867,60838,42082,52108,47909,27751,25421,58543,61092,35675,44428,5826,13873,47117,36013,27118,40281,43393,20323,19457,56317,30534,28325,58420,43759,55883,37063,6046,54577,50928,32207,19671,24389,40047,3841,45234,40631,24156,52990,58751,38650,25228,13221,43361,23314,13637,42779,469,53295,17288,45044,25943,58407,47698,29587,19888,14651,29298,56321,27062,62962,24507,19615,58644,38024,6042,18116,57293,58173,32486,57789,56642,1161,65513,55861,22442,52420,32562,23138,62858,11477,18627,57132,41711,52399,21287,50953,53155,33862,54834,34884,2885,41244,15256,56961,30702,7740,20068,41254,48068,23400,10105,49267,35045,25591,44864,33839,18802,64023,26163,56154,4110,58064,22967,50649,40267,9855,30487,37192,29097,40729,53968,43848,6352,3289,3281,10153,20845,27868,21668,51823,20494,35879,9952,61144,39842,22460,40353,49040,28884,40839,8639,21041,9877,44392,63127,9574,21693,50322,25717,25317,17869,43897,44497,57168,47275,51602,13861,12459,24920,23726,12857,34457,15732,8903,30890,62166,51802,44341,49687,41652,29197,60583,9008,2733,47303,54453,17379,19999,15665,21200,10065,18670,16197,40225,58360,7684,20131,17119,8927,54938,64030,15128,60292,32114,24149,13792,46211,59223,14180,43475,30790,47913,14955,32487,60795,58746,6796,16799,32730,37992,23561,47058,29270,48227,12136,9972,3601,53054,29045,33185,26269,44633,64156,59772,20481,36850,8429,58527,63301,990,10061,13510,31959,60016,37356,7538,39618,6404,47806,47884,42802,11162,58455,9788,53891,59634,53182,41811,54855,26751,49511,15032,54439,5778,59769,33339,47936,26164,36052,43994,62476,19369,11998,29955,4728,16898,50966,53453,11040,26274,55707,9128,6096,16841,21962,19703,24193,3038,5387,25262,9027,17864,49250,5371,16039,38924,17465,21207,48702,20346,64908,13165,14078,62844,20393,32408,59695,49355,12655,30981,56715,13641,21523,3935,43436,5998,63716,44014,41095,4069,18395,44251,42540,11789,64895,25556,32235,45719,36271,3172,54888,14179,1589,56491,48581,27470,62113,48476,13551,28995,28411,62891,20755,26215,24198,39299,1186,62192,22279,41136,46468,47429,36540,31900,28210,3083,34862,23916,55032,7446,21080,34035,1316,8017,40309,22727,56429,11238,61995,15834,10167,53043,48453,50159,53672,50844,58398,48083,26622,23482,37010,5347,2986,33177,381,3803,60913,54523,3892,10426,4716,54814,61833,36785,45202,39418,42820,49995,42090,16916,60770,4018,42467,24453,8136,46797,13790,60274,61100,60887,46047,59806,7496,27981,23425,45963,52349,14817,21906,44111,21093,12184,1932,27369,57118,36236,51909,61298,11167,19159,55363,31914,8012,34023,39970,61037,64378,60591,51737,35051,15564,50418,59906,4815,28687,58360,51895,6986,23651,48859,15521,53677,25044,30001,37731,27862,34588,34053,18808,17465,47555,24300,1663,62444,3390,22416,26565,5133,63527,15231,17900,26107,6479,60358,64233,13786,25239,8064,27651,42979,25799,65301,20114,2037,26839,54253,12912,47381,18692,18610,1329,11724,59154,25259,35216,35457,49124,56831,50772,64082,6729,5863,46944,38159,58635,47575,42946,4789,22871,41999,61136,22853,62315,32852,45409,28872,25040,24946,47397,22541,39070,7549,27088,16361,22425,39001,16813,32357,40481,56120,41681,37147,46839,3036,20926,40763,60484,24927,38295,13,34184,51778,36141,1425,41471,54965,19429,32511,50030,26168,41398,9620,26682,29653,14450,24313,63027,12115,52015,51615,42835,54341,15962,9009,23194,23840,25171,19539,4039,12880,24850,62846,22679,21181,60624,59934,37376,65506,31329,14190,41540,3493,27891,20841,40259,3717,3838,64846,3796,28032,23060,12182,49082,33272,62512,64826,33640,9822,36110,33973,17142,17000,10313,39363,42398,57247,37180,64608,3041,24087,51057,9536,41492,52731,61592,59806,64211,12466,34483,33463,85,55895,12623,14991,24151,14124,63555,54032,46188,40279,8781,48124,57713,5849,52700,45983,38273,34506,20742,40251,48191,14122,13723,39955,59739,15148,44534,9629,18570,27463,43916,54731,64757,2974,43695,17708,2673,17328,39947,9789,41013,35025,48605,33876,24920,43438,6223,15873,24684,58799,35009,41813,30439,54708,56048,33114,49689,65335,57781,58294,33097,63467,64426,57336,46112,57035,36608,14447,3985,1564,54115,5251,24046,18730,23794,16102,13841,40660,13917,18777,61721,25976,36727,24900,61426,25788,20960,54547,12120,14087,35495,33305,30022,31763,37821,29450,49916,39348,21749,36656,55760,44941,8229,31243,26881,21917,61961,8693,46556,24688,35686,6637,65235,24351,8986,21244,31428,3143,7945,32654,27921,37063,47359,12365,15920,35098,43788,37055,15915,13055,61792,40716,56603,16088,26614,14504,7179,50671,13276,10678,58195,49709,53556,35458,64403,27270,49589,21738,42420,38863,42110,31222,8225,47954,62423,42807,53734,51695,905,41216,31009,24734,32039,44511,18376,54051,3149,35410,37258,8743,51970,44861,26785,56295,1590,48430,41351,44359,12810,52751,31764,33950,62996,10856,1138,22001,35280,38602,45066,19834,16645,52061,32848,17036,28684,30297,9203,15850,58129,52115,12374,29920,58048,48883,19707,15574,38371,36729,42997,12283,42845,15282,54792,33655,24675,28763,30125,11211,48882,38309,64282,47522,33364,14532,39181,23388,36931,7809,3851,47450,61832,59138,23701,8735,31245,29401,19845,60964,54865,13464,51119,50801,26031,13605,21843,50532,21370,23503,51842,58412,29945,22091,50576,64133,8256,59635,54123,55840,16448,63483,63225,39558,8191,19043,12998,51035,58656,57919,36883,55026,2350,56319,49517,43810,5899,45193,6185,32415,55877,12154,26961,13820,36816,45886,62766,34636,43417,5684,35284,30197,24692,54643,36290,31668,55793,12900,3689,45220,13979,57365,11283,33021,59118,16304,24850,39238,6115,23793,53673,45061,54589,14569,51730,13505,33572,2824,52639,19115,61847,43653,32664,65241,3887,30010,65230,6615,29993,44977,42858,11480,19962,27928,7428,17600,42076,62070,48091,58254,8105,48753,3385,18560,19303,64392,11048,32038,43478,53633,50150,4853,28997,4090,30135,23324,10617,63770,40479,23014,4304,42262,50383,50272,61679,41924,24918,31813,45216,5577,41204,65496,38739,3746,29691,32638,19699,60906,55894,47982,20131,11852,52761,29463,8508,23774,41920,4958,64231,3551,12314,16682,57796,10416,22290,65065,58239,26755,21255,7229,35222,14269,4329,31735,44428,21444,2901,47225,13148,10600,58849,50697,28832,29739,23879,21458,7951,63173,6608,39819,24123,10279,25186,34430,25687,49652,24349,44011,54948,59984,20712,18281,38802,33684,13838,18415,30673,65283,26737,17292,24501,49521,58258,37883,16628,52940,37518,30445,63486,38155,42472,10416,51028,8950,14407,44498,64189,64626,60646,49913,23882,31873,22154,56376,16940,8226,52865,19162,34157,52739,53243,18757,22308,27980,5050,23147,64618,44517,64790,18959,16872,40192,31533,17181,45278,3624,52518,3804,36887,59266,14859,43813,17683,54932,7931,36555,64874,64767,47238,49553,28922,31411,31215,38262,24016,22785,31362,21143,13061,57580,38276,40327,55749,45905,4078,28619,30825,21029,50178,54760,11293,16615,9268,14997,26031,29929,15817,8770,65375,12187,65298,26878,48495,20353,50526,2623,37556,14413,41637,28695,22497,24046,8794,13321,11891,59339,10184,33284,7019,51468,63565,62613,64997,22298,20709,48453,28897,6967,46100,19566,33511,25921,18480,49023,55147,23354,54128,45903,45894,2384,36969,31117,17644,9987,46339,65520,57690,35990,28617,27086,123,42910,13101,6454,62139,740,461,44524,6352,24060,47160,3496,39253,46070,47007,27459,30716,42102,2632,33483,14968,45535,34233,48566,17462,5257,28254,48978,19458,45628,25226,4652,4638,43820,14103,12258,50827,54522,27125,51257,8802,14429,5591,25075,14946,40894,37502,28849,28754,14667,60552,64551,3628,26503,55330,49864,10207,40637,26806,28594,3574,14748,25004,24967,7092,2391,50021,23038,50951,26667,55997,24754,44202,40196,8611,27866,18231,2011,45077,26970,36339,42823,16749,50510,12793,15178,24979,57786,16409,16906,51311,58487,8179,7166,60324,26802,34045,54291,58932,51277,32654,54160,31136,15114,58686,59705,5411,27881,13701,52212,30828,55154,32437,19280,60477,63807,57962,44215,16062,1758,20309,10888,11179,11901,2670,27957,27587,50439,1143,18921,14034,53399,35132,22422,4993,146,180,7485,22320,40242,3177,35532,34620,54760,27513,62781,25554,731,38353,21114,55094,33633,35291,26917,63604,63264,61258,23672,49252,17480,3781,13047,27926,6410,50547,48695,63493,30902,24874,48538,62315,50504,11830,30387,45255,62471,25294,861,58316,42049,50423,31366,39879,13100,4107,10346,62987,20613,13131,60781,22118,17808,44475,10293,1507,43600,62243,9648,60119,2538,21777,61889,39533,41907,61208,11592,61406,43573,32790,36578,61810,38440,52084,25045,40439,10059,65511,8867,60119,54811,30367,18371,9401,442,31443,40039,44317,20049,31515,50113,15974,1446,4564,28078,32240,39428,7344,45638,22542,40252,10133,17760,35621,23209,52877,49115,38569,7912,58825,15615,29164,43022,42658,22302,31282,59205,48913,55334,50796,65078,17060,54631,56099,37458,6905,54148,16926,3701,14125,3945,17199,62009,51692,27100,10855,3953,48355,42128,19002,64686,65288,48262,307,16307,15022,49722,5137,10958,48559,5682,18781,25378,58007,64578,27525,9571,41493,24154,42486,24438,44234,13430,56371,60958,22217,5865,60542,12565,25651,19992,17251,40975,22772,27295,19410,32179,29097,25149,35570,20548,30715,15343,53473,59191,18579,3249,254,18156,37307,55691,3055,47153,36973,386,37143,17846,10179,47203,32277,59450,38465,52050,9812,3791,4731,51043,31321,41750,49039,64759,30543,49730,62989,16144,59137,41235,60642,24400,48997,45431,34117,54266,44925,15663,32636,1487,9256,34552,46672,11092,59576,12917,19093,54101,43286,23583,8304,62754,34406,42820,57322,54692,51089,18244,65418,39025,9463,17430,32108,32118,34888,30800,21548,19395,6897,13652,13390,62028,26600,19871,43851,51538,9517,30332,6111,29114,28092,46885,21863,38460,990,43376,24903,55151,28120,21609,11509,4897,17687,63531,62429,17425,25304,12581,37221,59577,5683,2178,1452,46075,47180,38647,268,43533,55517,8440,29788,22895,49453,32528,64684,2541,6902,29185,23936,61393,55709,54202,17040,4547,31075,57116,37677,56914,56648,56057,18791,63439,40366,46180,32676,34096,11200,62313,45391,19370,25400,39544,3328,58895,55157,37382,22509,53118,19197,20529,34036,5209,33025,57726,25742,45985,41793,59581,16044,29908,15798,15962,29799,8316,16367,58349,46284,11738,14458,15376,59866,2923,33476,25905,39863,63537,38112,37132,56369,43649,1206,61271,40413,18013,42661,48895,31429,22615,57018,53444,61084,53852,23897,5979,64450,12731,17185,54845,33631,47921,707,56195,21682,32775,2439,430,34420,10006,20489,57598,38091,36516,30120,40395,9198,55512,36745,7148,47935,8118,64998,34688,35140,50371,9881,55795,25324,43607,58600,11374,59599,50985,10957,6088,55877,16309,47931,5488,34480,3118,44608,26851,18199,26605,23116,61536,26375,48445,38234,40984,64117,12129,20188,5977,12351,26643,39991,46477,65063,37910,57846,11475,3431,8452,61579,41364,5745,64158,27362,18241,30736,33599,59370,15845,20907,21799,42624,55370,27254,32064,4388,31332,10930,52755,50159,41524,59745,63709,5998,33206,9448,22149,24119,62444,15190,38411,49469,3928,1682,30092,48428,33799,63298,20172,43563,59934,37348,30505,20446,27693,9452,20671,42585,24331,62246,43165,30775,298,59562,605,51573,14273,35130,48565,15720,13526,29534,38252,48079,59171,51692,45974,45816,64342,19134,13834,52597,6155,51145,21378,33219,19629,23441,1411,2949,34356,47096,45,49987,60979,62262,2366,56050,38821,62830,9168,57480,57987,38782,2562,397,17634,42905,40950,16933,23788,16554,31954,35448,39009,46550,57458,14676,45691,7611,32779,19256,36377,65108,56775,36693,16079,49899,51017,50433,9479,50926,8745,51826,36478,21716,34022,64133,51536,64953,34773,61210,64064,25059,45249,39881,31240,28683,40913,33616,9428,9016,24682,47336,21848,39435,49212,41973,7792,57187,47002,3554,14577,22272,1719,16552,17937,65230,41517,27553,27670,15237,45014,8336,16122,15790,14996,24260,17306,59314,53360,5443,8285,61049,48425,15717,13477,49061,37159,56836,4747,63117,20058,45231,34985,4408,56269,7729,15944,31238,28046,24518,32793,32315,6889,34542,14114,38813,763,57239,34460,13646,36196,18441,27957,13678,6144,350,52207,36436,12727,17409,41724,54599,46675,49956,8782,6422,55878,24802,21215,21958,9411,33611,9873,24391,8794,42870,35446,14310,1020,32982,37796,19380,30030,6997,39208,34724,7075,22951,7269,38250,10812,34872,23986,54945,65095,7695,36608,21880,58689,56097,20489,53266,30627,62972,3217,56720,33077,1487,41546,23613,58280,28447,49496,46148,19511,27325,54406,9605,46291,26836,47044,1014,2093,11293,6081,17172,18991,5404,40219,52491,49399,4491,49357,6906,50288,50778,48899,61962,10600,27512,59250,39342,47066,16949,60584,48178,21526,19709,54579,3711,6417,5287,868,53453,12744,55619,21090,16424,6438,20659,46636,62542,5939,21744,39826,15736,30443,41229,36121,8277,57283,27196,50049,29421,30063,59903,22050,45476,58667,2113,40833,63659,49968,47136,52796,16411,55757,38597,43084,21109,60559,11582,52414,47626,8992,23304,33733,55591,23907,63307,45300,58160,1142,35676,50181,49018,50490,4503,43085,30391,38452,45771,4860,15685,42586,3719,47230,58665,7236,6144,49378,7744,28292,45472,4565,11022,36294,28494,63362,63800,28364,58839,9477,42005,28042,36583,14721,19665,49485,31693,42065,30130,1012,48796,4142,5262,16418,12944,36864,4397,13161,64069,21852,26831,44285,9912,17266,39821,40207,30331,40452,33470,55070,43463,63638,31150,32920,10480,27598,24589,33242,22408,37766,37253,6529,6261,20715,65410,59590,28764,27087,57764,7097,3005,15139,45552,25101,29381,64717,17568,1719,32247,10488,29156,35644,14337,18763,7753,14857,5218,60665,53335,24672,30907,43832,35960,32497,60809,6971,49987,3172,14256,33668,33151,11903,31058,50947,58404,907,3333,45504,52587,30304,60654,44937,22398,21609,5689,42631,32774,16428,490,38913,58962,40413,11492,25061,36179,27125,11609,48717,19356,50406,47927,36937,3982,63508,57193,30560,6523,12337,61007,10085,27727,51159,7150,39314,36395,10081,25602,26463,60963,5857,60790,42141,56134,20782,12099,53751,31297,17688,25642,50285,59860,10478,20919,13104,8444,5131,45504,48929,3928,14808,24643,32740,10740,15069,58713,10471,56101,39389,35853,22993,38294,10006,9116,14943,51421,7261,17166,30949,37014,45250,50151,53912,62969,5893,11937,13291,3623,5780,27549,53790,13949,6709,34962,42196,15583,21636,34415,42273,16346,11832,19303,53619,56213,26992,55973,14860,7391,33719,1504,4194,1495,26484,6646,2297,2748,51118,62050,61551,14035,35464,15571,55520,2280,18979,57726,23330,61623,30908,37019,12680,47453,25999,60690,27520,55132,3037,49949,50032,44350,57798,37249,26804,36814,54364,2646,55297,6523,24887,41465,32212,56396,10888,61848,2789,21219,59475,21285,62883,48456,17760,43743,47215,53594,50787,64205,24355,57815,15855,5789,35089,64691,11597,2190,62210,57868,17641,51198,40113,43625,4059,13460,46279,35920,32468,4495,52957,52342,43277,2327,57808,64168,45103,15143,7081,32873,30181,5728,40669,2255,36064,30739,28358,1848,47146,38320,26562,19440,43279,57431,15300,23243,647,48297,24898,39016,49795,30984,32775,5686,46876,2401,12025,21920,49029,3828,37222,16666,35721,36687,8332,48934,33435,30748,27062,7227,54215,26550,10926,42989,25011,37780,42280,20399,54942,791,12189,59045,48743,8607,60646,45678,19946,38723,39830,34610,28953,25952,12544,6373,13526,46221,35696,60212,50019,52185,42319,12367,47779,18176,18523,13215,14128,4639,8180,59379,57837,38051,59944,62200,59912,28845,34711,47200,29419,48728,54477,43735,58084,48871,13666,44617,3096,60935,13802,55808,31018,17260,41916,26024,5200,37074,7029,37333,3615,41423,55299,56416,50992,64152,49445,47645,1182,47508,61814,31026,64173,58875,31391,53730,37361,13510,57333,35967,63567,1671,43675,57764,5116,5706,8159,57399,61106,33217,37352,50484,43625,60563,41372,21622,31134,38166,38299,39575,14210,11931,46917,29320,53844,35291,57095,950,11228,28674,58911,9791,27465,17063,45062,14371,38286,28731,8238,56198,7081,40682,16305,1530,21522,45217,50323,28075,54504,26935,8469,27605,63882,41988,61696,18496,47066,41460,40650,5065,54421,42757,13173,50209,3919,58666,44631,5404,36773,22702,5546,18372,12248,31407,64529,23735,39845,3067,63907,64847,39288,42559,49794,43693,8121,13981,35078,10449,24555,28734,42767,23871,56330,50477,63212,31690,3105,5060,0,27827,28505,38075,11646,2209,26321,54843,43677,19437,2721,31,32644,48460,6278,5182,34161,38615,3015,9557,12067,58887,19752,26335,20586,58302,8321,13454,4023,11249,53949,46462,17736,34131,32168,55106,11909,42369,22948,21500,28138,13940,20623,25075,39101,27352,56021,6309,348,33214,58165,21666,10299,41260,4480,11789,23292,49463,55745,9112,38677,50525,5936,55588,39663,32473,37596,3444,15553,22888,32216,35757,7996,51569,58843,2521,55759,53306,62168,22489,37691,54855,55503,47259,2940,25136,1343,58861,49769,44311,35686,64194,43806,542,6362,44126,15796,13382,20856,29255,9852,13415,15444,48024,56940,23129,12618,34436,46376,5186,58749,8121,11421,24445,55968,48122,55258,6584,61605,5610,34099,25448,48106,53779,25567,47353,25621,15323,53967,7509,59794,50264,47398,31441,61179,19982,12188,30051,4560,37920,28532,64,20309,28295,45658,17321,56600,37151,7597,31333,65156,37927,58563,27368,52256,21722,1335,13733,52393,46772,56731,12323,743,44753,7495,45698,56209,15601,63103,46361,42807,20027,20072,41858,25088,39707,4567,296,3808,4830,6188,41623,13452,54718,48916,15752,22687,28879,29715,23377,7740,45216,25544,16886,33739,27190,38748,1550,51174,18472,27213,17909,56124,33586,55601,38773,52647,37275,37853,15881,4865,60216,14927,694,22087,42319,56855,8432,39925,55982,30103,41581,59576,25504,11950,12563,901,34911,14551,49405,42440,13821,50859,54153,27429,60280,36759,48812,29894,1158,2739,19548,56526,9642,2638,37108,6407,62047,14412,2559,46246,22373,29546,5262,19696,23539,59256,41217,12994,32432,3612,61375,21290,50573,26277,20177,14440,24031,36724,9635,28703,50413,9647,42165,57771,52810,60165,54293,51845,65250,13157,43819,57856,61310,11279,51098,24820,12605,14827,39929,55418,24210,11936,55301,1382,8133,26763,57923,13353,61917,7901,58368,30167,46602,22704,43263,56087,43392,11503,3807,50571,57241,62406,52628,12750,18218,1407,32463,37230,30376,49091,14048,33767,65057,27900,6460,28354,41174,39080,8819,49071,34194,52285,44965,58465,51347,39722,12182,20665,3878,29795,33596,34632,18987,9787,19408,5980,45358,19053,5314,13295,12268,9589,23373,61142,13379,6358,21649,57810,46728,45743,47992,37973,13442,21779,12830,7922,43596,51766,18278,21176,36853,14053,45079,60063,61674,55985,10512,62786,23736,4006,55737,23169,59020,43911,42833,2274,23736,23231,39768,47201,19464,33062,44875,15998,2368,6599,13235,61689,2886,16936,17304,62827,28578,31875,37161,4574,21868,46641,7450,11174,3209,10803,6273,53710,33936,51043,13885,47453,15607,17763,42156,24871,14735,27122,16589,49615,8811,11613,6407,60349,26219,47038,47881,39381,59573,64187,1342,7607,13779,47492,35267,42536,42575,62262,64783,61999,27547,13875,49753,25394,56501,28149,45576,45540,67,47581,49856,63781,24337,36269,19896,25530,16540,49459,45646,21281,46111,44270,1518,45154,39322,28154,48376,8667,15981,54272,36982,28315,53628,44645,37923,43350,51904,54887,9950,43029,11338,52867,54652,37915,41887,30036,38374,28644,5375,15853,41556,59933,61197,34805,23501,33082,33190,12736,61228,3394,5538,38556,61408,28259,50822,26783,6644,44672,40394,53844,49725,353,13661,16327,45493,65046,987,15535,43810,60300,19781,15713,6598,41141,3804,21618,47026,4201,56142,17643,12091,65089,31292,17632,2965,36640,56222,1239,2906,1583,43551,5118,22527,35015,30609,56969,64628,23573,61716,15164,26139,15495,56760,2925,12900,63835,34790,12939,10588,22590,50945,15261,13452,36285,40203,62653,35636,16372,11221,32426,18955,17748,34873,1046,26028,51562,9895,52728,24497,35764,43069,5376,9817,63235,51197,11580,28186,43913,2909,38792,5421,39097,21337,50659,20984,34950,62633,47443,56462,2389,19221,34636,4005,45963,11515,43505,40648,36986,18673,47511,35516,53759,39319,7915,14646,59236,54425,62059,53691,28869,45602,45114,14782,17602,53372,5333,37516,55216,32220,35392,48803,44864,19683,30573,44788,12998,7108,37582,33800,24126,35629,53922,12461,27220,43397,42833,49257,17841,58510,56981,47514,18698,62528,15633,21656,20335,37262,17344,63695,15365,59614,42772,2800,30087,56141,10194,52260,47827,5813,13697,41532,62031,62158,15793,7798,1695,7996,39855,38242,30516,24948,12342,3912,33908,838,3941,25156,14036,19334,39760,27052,31309,53926,42024,32177,11976,32903,12439,50566,6003,4248,1522,28076,50241,39290,57638,54317,56877,51114,22257,49877,26100,10668,61331,50806,24574,32158,60897,45041,64433,46870,4372,43900,59030,35645,16968,52477,6751,54335,7031,22805,28673,52683,64877,25688,43799,48050,379,14592,39260,46976,15701,44700,32827,13850,35224,22705,4539,19403,42056,36450,2837,57610,864,29067,60245,5145,29454,23327,42907,6152,38457,27873,41097,10602,13226,62911,49082,59259,42325,54560,52644,62528,466,33247,21580,44792,32037,38521,18278,60657,47539,19552,17768,2733,7634,8332,15275,32340,43652,3393,41323,21447,28124,47947,2461,65047,56277,5215,25673,46819,1577,44293,33709,15324,7027,57380,41820,40457,6661,14380,21673,33025,7784,37239,55745,32576,39811,58211,33785,50907,25493,1748,27616,35128,51200,35647,64330,50483,28827,21000,58418,56346,63813,35007,52365,41749,8379,32411,43294,44734,50622,27902,10636,52241,42225,174,5042,9363,4170,2273,37332,41014,34426,15049,11756,3000,46973,16360,17583,46100,23735,57566,62163,12565,59479,2680,3917,7361,53282,13193,9158,2285,1561,59773,26294,45015,22083,53873,31353,53626,37080,62306,45783,21977,56278,26480,55691,51448,52596,11886,56986,16205,7024,17453,56063,50937,62386,2728,42262,48760,31757,9574,1786,47989,12249,8354,1000,30278,18561,26833,57818,54390,55766,51939,7163,51520,10083,59695,20398,11786,18838,42333,17193,32365,3263,33796,16231,28532,25563,40805,21368,23845,35755,56714,24114,55358,3712,10931,35527,48815,63464,38349,47623,65500,15694,58108,40083,26861,28690,55752,9907,29875,26709,24881,18794,60905,2436,61236,58522,57165,7397,47471,31014,1665,62722,7793,36167,53004,36167,42014,54538,27892,39705,63025,33139,36345,28395,4590,52762,13154,13489,39982,15289,65355,6274,40265,46841,54724,5925,6706,53340,56527,29588,53313,31426,46454,42565,63718,19105,33001,59214,60009,45680,33676,9004,27990,6184,52484,19851,62120,18189,63741,3633,8712,5841,54934,57592,44616,59183,53297,34895,48885,35360,52118,32249,53600,30711,60586,54958,34395,32896,42933,6570,19167,22666,13702,19266,43696,24396,18807,30694,33845,62911,221,31626,12157,37743,34269,43375,20328,12081,47419,36284,63553,41897,54464,35069,6142,51172,14450,38852,46080,19348,61642,56778,6904,1274,9525,13994,36195,32794,53346,34253,55080,37757,37533,2039,24290,43019,2460,49058,35719,28394,62734,60196,32875,35845,47790,28574,51734,61067,15156,4577,10079,9780,4769,11372,8437,26783,23631,64648,52731,18488,15099,59308,3666,53728,62986,11413,46628,52495,37733,32226,28727,17866,60320,53292,49989,22890,59463,38017,26589,10962,33812,10547,50770,12004,43563,63643,44173,3179,6333,48968,49712,55466,49350,58775,8823,30029,29877,59614,3321,27606,15863,12118,57618,4978,45822,47113,43447,33296,30727,16536,18417,37889,55620,56620,2877,61876,14933,51975,6980,3583,51109,63999,9071,7624,52331,14351,22716,4378,64265,56385,53919,35714,383,29591,38258,53559,7052,15574,22230,5091,26948,38668,15393,34697,56915,40748,6822,22174,23466,56876,46591,16200,49437,43177,54931,46801,53609,26197,46873,44751,62442,6359,20864,51496,41458,9947,61788,37113,59609,60832,44971,62768,44731,62471,36972,8831,60770,61343,53287,57050,50745,27220,591,24529,53230,61546,52558,27251,13779,8526,22470,13322,9383,1936,56006,725,13077,11142,30607,13684,7745,33817,64784,11839,38209,21172,35343,31562,41154,40528,13660,28587,61661,35386,54723,63880,13240,16145,27940,49087,45801,18957,11464,42138,39296,724,29070,4650,22320,22454,64210,41643,27745,54239,8618,23232,9926,61144,4813,62807,31372,51317,34996,8631,14002,21344,14229,43720,35651,25917,59314,21627,47738,53940,54699,21477,56356,1252,18240,30118,65043,19283,15023,6448,60236,40211,36010,50277,42711,20927,29152,6226,5675,52064,1874,25355,20272,52718,21483,29741,25571,56870,59807,49324,19897,43619,40095,49587,30233,48320,48575,15781,7753,55212,9418,5654,41977,44737,28192,32939,36363,2535,661,7931,1953,62906,63521,58926,51209,52241,53715,28561,48210,11436,1860,7421,49378,22333,6251,51553,16452,47144,57957,43447,57911,44758,43534,42663,59214,51977,7948,11916,14719,31020,54752,18867,17476,6040,56813,20131,6424,12417,31304,1219,55184,42791,55364,16072,49975,56661,5617,23363,60275,47827,49442,39590,40377,37741,63174,3824,28534,55284,44,14115,20722,32896,42372,13555,59456,42644,35562,58519,40864,2139,47180,12759,49793,51292,43004,31245,43232,56359,11042,49319,53440,11318,53174,21130,42731,35402,26460,298,1546,24700,46258,60274,51767,13180,47380,48939,24958,20029,8904,50497,11907,1912,60546,1430,19123,40488,47280,7414,3374,42393,26370,2171,36335,28376,43252,46573,7199,28309,19928,40670,45697,29378,39909,53459,16075,59654,9081,37123,64472,7155,51585,57389,16462,14343,6337,36795,23403,23242,56618,34884,11644,4120,10455,15288,64959,49406,64436,54188,35801,4399,58044,38630,42244,41558,54751,9446,17327,64221,1546,32227,14901,41076,9733,47495,40598,3179,55170,9761,36217,30134,55629,63004,3749,42360,39831,18182,5176,64920,47273,4291,48998,35037,12137,39480,42299,46597,29002,47869,35726,47460,56939,46664,39765,47977,23563,9501,63272,59672,47803,15772,53415,2734,26207,48747,59720,5720,25136,55376,65163,23577,22879,28176,39247,1266,60771,38170,58056,6258,33749,4778,15112,7263,48922,28629,57937,31993,1346,25612,61717,16502,59253,870,2842,30064,58076,3137,7209,61958,38268,3045,29060,1299,31768,24240,14155,39582,32101,25874,55279,34815,44397,52713,48375,32868,29350,40671,55930,39469,40575,28054,30980,21230,37362,5182,19539,2693,32382,33855,7453,17804,35871,2162,24138,3042,2743,41941,54810,4619,39259,58830,16877,52713,16996,51306,52736,42726,65080,38971,28056,40197,16712,28445,24463,44809,62069,21008,59300,64691,28185,17069,23571,25978,42644,7994,23533,44986,41035,27872,26669,32030,22079,16687,4267,26016,19027,28753,39539,42170,27945,60064,24875,19346,45928,54224,50028,22139,43779,40907,51268,504,58756,17877,59870,11279,17785,41870,4924,10639,35747,5690,63489,26591,57164,16134,38122,30106,28042,6936,56385,35026,17747,33943,56306,5226,2282,33025,55786,2532,9878,20319,12899,17502,60366,23849,49032,5577,44130,51567,41689,12525,52318,17400,45821,37402,45501,24183,11540,40844,63584,18781,20782,30797,64133,6966,3711,525,36647,29454,60490,5403,22583,26732,14942,61678,62797,58305,1111,13408,20799,47883,46210,64410,31071,65056,33472,12798,14459,55232,45913,48739,20863,27230,52909,44117,1195,56430,56131,27621,36562,9967,48754,49472,27882,33055,45415,63185,41072,44367,31726,23278,45242,13666,14338,46973,5342,32762,2259,22635,1249,52633,49697,22689,19403,2308,35384,47415,22386,13092,44643,17152,63223,19696,10164,23771,21822,53696,53176,65120,61665,867,19142,54441,13510,38214,2228,6023,41504,60567,28440,30214,37106,46789,4259,53860,52127,44577,36173,11947,46388,41205,23889,5234,39657,28333,29531,24764,9023,49794,17839,2299,18207,4814,269,15355,30290,15113,48216,38711,8897,57381,18360,17250,44249,38393,9104,60277,2722,46938,10589,15179,12375,50945,49432,5048,48668,28721,32704,24268,44528,13868,52650,47325,49843,38622,35166,30046,36104,57818,3752,14358,54318,14733,18562,20312,487,19010,13999,30534,24357,30733,36468,12749,56499,56080,49209,25884,22229,9984,26445,61039,10421,57406,58573,45027,29077,25560,26108,27445,35767,19646,54599,35277,47241,1170,30470,15559,64717,46436,64743,25902,65015,26539,5140,23117,33653,6306,8602,57483,28157,35633,8395,44822,24458,55745,4227,11121,53199,48884,46532,55068,28425,37699,28940,52274,16160,24889,12484,54817,9729,60171,48279,11691,17087,16444,49259,28140,1987,33105,19161,49559,60210,3736,27482,62710,10123,4258,15399,28501,63191,56839,45450,41413,15733,1016,52537,4937,16697,21419,42038,5062,22411,37237,15593,22144,33044,59540,35676,50693,18959,65091,18081,44256,37050,32168,54361,42640,36624,48114,20402,54723,33061,3195,8976,41476,43896,32349,23067,19878,2414,21599,57109,27196,1441,15110,41079,46780,10660,48964,55714,43834,23860,23955,26524,26652,53175,61309,47118,40663,22712,50470,4524,55422,58451,27697,10991,40906,63834,13359,8701,18760,20301,11318,26524,29988,39828,55858,20340,3617,41996,63738,54459,33137,13525,54002,46800,6933,4925,53312,59846,64801,50247,8754,43541,61205,50902,35609,59941,19171,4908,39985,32260,6676,62070,27128,48160,9492,41619,16330,21634,15721,53363,35227,64757,22380,42301,28784,29481,47979,52126,42227,57053,47135,29523,50478,9656,37273,22372,2624,14112,2608,7376,4741,13786,21990,25417,11869,21137,22186,10474,13278,39257,58457,45691,45417,31069,3323,18565,12999,32887,57310,59545,44417,43181,43294,4040,26347,53002,31238,47085,16057,26168,35730,58249,45511,41746,48355,45395,11982,31814,38111,19718,27704,55883,27407,42501,3807,8228,55863,24758,17692,62658,62814,62718,49666,50925,57460,26249,47648,13558,5419,62037,8724,41180,1054,27867,29547,34095,41858,22995,59646,33772,14147,22921,38660,39021,10602,20719,64549,2066,20482,57729,25910,61894,5523,17619,32604,12978,1431,25169,44959,15078,49681,53035,55810,34346,64731,41254,62424,6917,46618,51517,9621,18379,31470,49614,25690,27309,44546,47523,23309,55083,44670,11784,53463,40443,57185,56931,63752,35867,36244,6281,64989,48189,10528,11221,11270,36016,13893,45436,13123,61146,62473,11866,373,32330,10806,42694,775,52148,35632,52623,46614,48796,1585,12849,46307,36463,51093,23394,16726,42828,15348,57873,15945,20027,7921,32673,52202,56325,32631,47306,37176,63100,63502,3226,56563,26606,45334,230,54671,30920,59967,9157,4588,63610,23132,21567,17085,57624,22895,31505,9496,33248,60832,49643,21385,1676,42664,62657,43728,670,2777,8064,33408,20273,46250,3327,6481,36774,55642,16694,64010,54752,26020,54242,50331,57809,16133,37390,7409,46214,6956,57380,41345,42419,29949,11148,28512,35723,62055,38499,48233,57079,46878,1605,59033,28819,39414,59278,35035,39398,34584,36991,60052,32466,799,17743,12784,33873,57278,34838,43623,3515,41375,12975,58245,22880,8233,61902,49330,18836,58183,51508,41051,17587,47583,39141,32301,29648,34834,9115,6689,48219,37301,6684,65313,44718,13944,2173,34616,34641,64643,5343,62285,56399,3068,54673,54549,14428,62257,42624,10598,13217,25356,56592,53949,32617,50330,28035,2926,50930,54454,75,55875,29718,25379,8270,4245,10506,40541,1783,33246,52598,37690,56038,28063,59638,19967,1578,48267,63912,52777,44174,2575,57429,59801,44089,8148,20188,41500,21552,4453,48352,3986,57005,16186,41021,673,2818,49678,45807,2000,11975,50118,2846,38158,27655,53387,5376,27642,48437,47888,63117,33357,5527,36480,24325,815,48980,28570,30157,14119,13582,29408,26845,31901,24780,13927,30079,56641,50634,17793,21036,19884,8238,1629,46352,61697,6256,22775,25395,58192,40395,63143,49214,13243,62203,49097,55930,23885,31815,48078,16070,7621,39319,41294,50931,32856,56997,22931,64602,44503,51299,22905,3215,1089,25010,15976,49849,2265,11118,42918,32531,6302,26848,2559,41776,62199,60758,2762,2747,62524,19297,33117,55940,61765,38093,43321,18350,1149,16410,9848,18791,38338,9187,3107,37160,42498,42581,37296,54113,16893,53779,47254,6254,41741,25385,32833,19122,8588,38884,59986,1315,28589,24408,7763,44658,6056,65328,24244,36866,6674,59324,31850,33837,24099,13282,7178,50166,27970,20740,261,46079,27911,51956,61209,2802,15563,30262,5672,55446,53957,60944,10137,47936,61475,10747,37130,34968,50035,13985,3526,47947,42517,8544,28499,7843,31991,23547,20509,39340,50467,37726,7766,11637,2019,14218,37461,41087,39307,56022,46912,57088,2022,4204,44488,12335,10236,14188,57356,7177,30607,9501,6573,51320,12623,22982,50306,24520,24546,64612,31351,42445,64037,5278,5663,2211,25813,41698,4629,24905,32550,32773,45545,18945,38577,32132,37502,63599,27170,63845,29704,19479,14655,1213,45226,53930,33679,35306,39510,54130,39184,28355,64655,23972,37959,29440,41411,23764,12433,23638,15328,10057,46305,19188,55266,16287,56580,10569,20922,27442,3447,32496,43459,49986,2429,3744,51912,62677,30441,61650,62114,1509,13647,49535,23609,11375,55762,12754,56237,13889,43244,15643,62856,46364,47352,48803,3595,42448,50871,48398,30935,20912,39495,36052,50475,57620,15608,48634,37796,44925,27070,16400,32321,62895,55097,31888,63871,60217,46250,14831,7756,57711,15971,62026,61575,35555,31102,17904,48050,63936,23513,49115,30123,5989,10827,49041,14967,32951,46218,60242,55686,32175,11446,6255,27750,188,64813,63257,63261,22871,39257,64422,22607,64805,60891,7221,29862,4056,13373,60685,19789,26596,42687,16333,8202,10173,49007,27346,8590,62138,31150,43271,44527,13627,12624,10754,29926,4516,47257,52424,32619,26607,9438,54408,3225,35043,54892,30922,17313,29001,5138,23027,41736,61262,16413,55345,52307,21071,35876,34863,4860,38142,40898,45614,53194,28907,58995,16187,65464,23584,19431,31352,51349,60250,24716,15765,38147,40335,44179,56293,50694,5001,48720,43247,29213,20790,11949,24196,22984,26962,12223,46924,55832,59096,61825,3667,46021,42976,12120,37467,32117,36784,41527,53317,24916,3904,1339,22421,20599,61025,1451,44327,59476,1053,4996,15618,64583,59658,26085,35057,57117,63872,41727,8549,38334,9030,56016,12886,21519,19360,63835,50055,17351,42228,20989,32979,31936,17760,17967,17547,15431,63595,45198,56985,32233,51569,12203,40404,20601,63844,30139,29808,10675,10781,17853,62434,59707,26520,20110,10019,16275,39852,6068,29891,35295,49721,46657,42690,36739,53044,59012,40871,52715,1803,960,5144,23431,24623,62996,7060,59309,29868,3099,9076,5317,1790,11829,48403,48101,22606,31135,50738,30027,5983,34319,8303,39958,37027,18875,1915,40879,38157,2881,26807,60921,37495,35429,56498,46531,10177,29877,42820,9089,54539,8186,15709,63481,17686,33735,42169,44799,5361,46219,5244,60251,32907,30063,44306,8476,38433,19299,62131,42767,53677,49544,25336,3880,41089,21678,20393,51327,64661,4209,20078,5516,27881,4585,1154,33944,42430,14355,61969,61694,34994,12307,24970,19471,46972,63061,19766,41896,12212,1386,1315,17189,47815,57897,39652,7273,36189,49881,30330,3817,25698,60612,54311,28243,54225,7026,43704,36446,42034,6878,35789,32651,14931,42023,40902,2662,54762,24868,47858,21247,26941,23555,24909,32346,41029,15300,41663,12352,35271,61336,8538,7619,6759,16805,55574,20997,47083,42781,45998,45431,1012,32956,17754,12238,14040,7861,30041,3749,28003,38984,7762,15127,9904,50510,39330,21144,58705,55708,22793,2668,47454,17723,46280,35058,60940,35903,57318,11614,31126,65010,5031,34625,12050,40202,36245,42839,32377,57163,9893,270,41960,21632,44095,23146,20632,35250,56843,10734,5963,32758,55489,38198,38357,56583,12248,46213,33726,53006,64135,46438,2073,52177,29008,44238,44724,1994,46415,3697,38457,53707,50828,29477,22024,8107,32527,13214,64766,43541,57828,60250,58192,5054,24754,12782,39195,15160,14846,58585,60522,50401,8865,15175,24064,35,5115,34584,62911,53104,51617,13487,39884,3943,64341,56829,6443,10667,61812,63337,6865,50028,9041,17508,64289,61951,7630,60982,59334,36615,59986,56221,56721,18283,22472,9846,2588,22904,49198,29278,39373,8093,62197,53235,7544,58029,37444,30687,1550,29535,20010,62954,65440,35638,48195,22317,12225,30600,454,34992,16807,51173,11731,9496,22034,60133,27697,57777,2873,55291,31794,57036,7590,6168,58100,25931,27192,4007,17542,31612,8685,6721,48946,43530,57232,18968,6646,27381,28515,35671,21044,17850,22144,51716,26642,63375,48232,13781,13903,11997,29675,16380,18314,27476,54847,64063,28073,6763,17184,25344,53623,55346,14253,11102,58497,13021,25167,15681,47759,22170,44306,36630,31134,51679,46076,50087,54471,49942,61744,54170,15864,23029,20401,55482,59121,12416,54415,35166,62938,58455,26426,36430,8967,40118,27379,57696,126,61183,3030,61969,29929,27755,38785,7124,12976,19349,18984,22392,49147,45246,17204,40914,1280,23395,62694,5239,30540,34689,48234,15864,92,43371,26880,45881,64516,50969,1611,38035,9904,64717,27445,64028,23596,59024,27035,53654,4403,24291,2378,61769,26207,56305,579,12234,24377,29422,6979,37195,9117,48979,29275,56615,52462,42963,30935,17095,56625,57799,21725,24467,29862,6241,10781,59628,38472,65135,22618,57266,11892,58625,10345,25895,25350,13264,8106,33167,65229,10917,56112,7092,61206,7215,58368,17035,25395,3585,54958,35966,21062,14209,44765,38641,21505,59454,45112,52478,62749,43333,64456,49764,15997,15543,31282,5845,7889,53200,57605,52330,50667,65198,51448,40174,65289,22895,4846,28544,19093,45247,52369,12131,19893,58778,35935,10271,63768,28011,14246,12107,21735,53610,1924,62594,4096,24251,50252,22303,59955,62835,46158,35365,19174,24780,57288,26375,25468,25904,60749,55894,64976,36949,40742,47020,36532,33122,9288,36974,9530,46102,50847,36505,57380,31272,42772,33992,655,46252,61952,19262,27884,41701,8937,5,43008,9012,19761,19444,53841,42448,59568,61827,26816,28235,47096,46900,48391,6411,20048,325,51102,34359,53956,6635,18917,4863,38510,5248,15859,22141,40084,59622,53313,51587,34801,59951,15684,30176,31176,50645,9615,55762,51118,20685,32405,48214,64384,21082,53180,17640,9899,14002,11243,1837,32581,6402,40632,50622,17884,20970,17704,47076,40686,56203,49878,13601,46713,50830,45650,32264,49347,41146,18506,55809,21007,38147,31371,1760,34141,25758,61675,42459,3352,60502,28311,8037,54093,15600,30950,11053,62258,47390,41879,8826,48629,38653,28226,29175,28471,4858,28037,59256,2654,10568,47643,56435,47546,61736,8655,8835,15975,14211,35470,7004,41133,19474,45563,62445,6727,27185,58158,28877,13712,23609,5795,14735,48603,19577,37034,34017,25396,35730,64765,632,37769,52227,14341,39671,62390,52704,49120,20146,1216,1750,59969,38894,25156,50925,22783,44467,9752,26808,11841,34114,64159,46516,30156,47792,44760,33571,61898,27284,53487,63029,25646,47030,42704,37190,34835,29740,5401,3400,59902,32947,14166,55147,37303,4828,35080,18966,24341,17547,3023,5119,47969,38295,46930,62579,4474,4585,50534,37101,11281,49528,23006,46961,3177,17748,57227,51969,5666,63361,20557,30499,43210,36787,19326,53465,45606,43518,55567,44915,29166,19231,14980,8111,25998,54758,1026,8145,933,16000,14861,7544,25964,40047,55343,746,8684,19084,46782,65224,6979,19935,27136,3276,34426,55418,2342,16991,35023,56447,9443,61963,9389,11523,60727,12062,57843,51891,26722,54394,33016,27096,42341,54964,45536,33647,17118,1237,57238,14474,31433,41285,25202,20007,57203,20649,15286,4573,6964,25816,30951,37577,27641,23881,53021,38490,12773,56353,63399,2259,60692,28717,8919,21658,8341,12786,17704,16799,7643,27868,59517,13663,54981,36733,54906,35255,18678,41292,31115,13668,31947,5021,29786,26469,36919,532,5952,16362,1554,47885,888,34824,18003,30949,12577,6862,60154,61865,38809,49912,65191,3173,42444,56967,14435,886,23459,52919,37201,48689,14705,3291,37482,2163,63862,42259,29916,58810,42891,55888,63148,64028,59960,10592,10477,22747,20682,63198,40072,24924,17804,35233,47719,3450,28014,31235,1833,60622,5671,44213,65072,20753,46329,7578,33677,42090,16798,3618,30363,64752,38118,47862,49574,10639,48559,26716,18707,5240,28871,11372,11269,18963,16469,58139,58718,43422,37614,5932,25363,8219,62289,21446,55887,10483,12923,2407,24528,57900,19418,44349,48174,3040,20043,40452,18584,51342,37311,49989,47853,62840,16939,51736,53818,57030,14691,5564,27255,57922,10312,26236,5411,40879,55770,25916,53743,63869,20253,36787,22611,11368,30767,8164,42340,41956,48184,55317,47850,57178,17168,35762,22000,19548,45252,254,1211,57132,56892,21914,51019,51420,45871,7679,4387,21883,58902,40607,9760,14732,59967,27052,62310,33530,49265,12729,44290,55137,41327,28431,28862,51397,24087,22260,9127,54249,39527,13048,27287,19110,51585,18484,13726,32862,1135,47286,39053,38489,52802,64448,1598,13322,11555,35913,13546,47917,52517,44289,39598,40469,23273,20869,32649,21401,57435,41014,33492,12447,62044,59219,56001,40975,40629,50144,55086,2373,17080,20287,10599,6401,12556,54724,17658,5855,25332,20108,9269,65148,30528,4984,16077,54539,35507,32905,18600,3216,20847,30034,15248,50784,12224,63451,49767,43027,567,47794,10558,6481,60902,50724,60883,50139,49337,42845,24084,8146,36258,23588,44836,12138,61617,32856,9249,35252,53039,58079,46618,46744,39253,10775,2709,52695,61314,28170,49930,38966,32276,11815,27644,37818,2228,13212,49073,25022,37083,4741,27324,40382,45907,45899,58986,35626,42043,17181,12624,3185,4786,13194,49830,40975,19903,26581,54052,62407,45370,19462,18480,43580,60335,51642,42192,44730,36148,44710,7220,35792,6941,55503,59962,16251,15282,6317,1931,6148,28335,53614,58429,8809,3010,56946,4744,59792,58422,46839,34816,60648,24741,38394,25018,54768,8059,61125,36577,46602,47418,4896,20605,17162,3055,60232,58801,53422,15846,51690,19081,2292,48940,55387,43806,43390,16483,61278,31629,42654,23950,46904,34616,7204,15970,37249,49304,45393,30812,9028,17043,27901,18910,36104,38300,11371,45347,41046,52899,29505,39274,42105,16346,42320,7464,33544,64695,49175,38294,10283,23163,50368,26948,54487,31301,48599,60979,41525,14236,13352,21529,41493,16034,20761,53064,2494,14731,49299,59697,9767,14082,44300,50400,45531,41300,20864,14186,12188,61507,54015,22334,15992,43022,32701,58970,65216,54090,32740,58098,3333,37499,13730,29458,28030,27415,24833,13209,49010,2619,41960,30341,24911,29312,48618,7079,43774,20072,56046,16226,60468,59670,39054,35583,36456,56063,36748,17195,59626,17711,22835,51375,47964,31217,20684,55246,51479,1302,58640,37137,59496,20910,28791,49267,30438,15541,2567,20227,5273,4389,10367,42894,10907,22533,10416,46538,40224,1373,64866,45903,7015,6126,53847,9637,52052,12171,21884,50229,17057,10085,61288,13594,18577,27540,32458,65054,57686,35669,13053,47320,12977,20353,33695,8478,43018,10176,54410,10247,23573,39965,1759,34419,64240,31394,50656,48063,15538,43300,27864,24676,5243,9182,38906,49302,12460,39286,8856,55242,62583,46304,23506,18185,27515,7922,10343,59460,8025,36243,35782,34304,12142,35647,28218,3632,18808,54014,4567,52155,7970,2731,9897,24465,11832,61867,36820,49619,23139,41210,33624,19139,39895,47143,28540,43487,3359,4385,9947,30788,44463,47,40194,12394,35926,31700,9123,5890,16717,25536,64740,21988,23946,50635,60639,8935,60407,25126,23029,8955,12510,39233,45019,10528,40504,12771,19594,44990,30719,52023,18975,35571,9562,31996,20363,3969,41016,65470,5542,1337,41446,56492,9651,21506,40970,41825,60801,43579,33465,12563,14426,62299,51234,22318,38874,33762,45846,39437,32030,46941,14126,47692,51807,38973,24179,28099,27979,1019,33589,21670,28979,28617,14164,48441,41298,65176,35954,51679,20476,44519,62471,52871,4519,14013,58576,33733,44026,47599,16427,11929,6591,29882,30875,21384,16556,23905,31168,13469,24309,44299,64459,55473,27298,50722,10863,36085,48628,13648,29399,56887,49957,41961,11894,54576,31360,26186,64318,24055,60456,22979,9195,50238,64681,22177,34192,20859,40504,4595,4772,10652,49194,33418,7093,42851,37372,48255,42735,23752,46531,46519,37018,3321,58777,39413,10364,41497,27089,625,48822,37567,17056,23061,58238,45056,19146,562,38236,59189,42761,27143,51499,3367,25750,56120,37978,61822,10618,41819,52160,56730,18584,53885,37665,19868,43283,21244,54776,58216,34404,47803,36584,53401,21189,49845,29580,40180,54919,12208,31921,64715,16022,59101,43517,55161,63381,22374,4164,54254,62180,4180,34478,43286,17404,10764,7464,43178,53259,12512,54764,44452,49215,4552,41027,42004,40919,39549,47552,48807,41040,27332,62235,6968,43843,50185,28296,60559,9746,32177,34541,45084,16157,1044,35869,7323,41842,21139,52640,38399,46144,16582,43353,65133,57132,46094,50023,57613,25531,1375,63747,1924,48498,26721,58022,13307,41990,17003,41559,46791,65015,49515,55809,63489,14419,30644,28874,50489,57801,37500,40718,16559,39951,6151,52517,44621,21458,1501,1713,25313,55732,37174,30955,46641,25784,15927,25950,35040,44901,12102,42707,48742,37102,8276,13953,15898,28443,33861,20697,60066,9328,52721,5138,790,46062,19860,10771,8445,10643,18505,50669,18793,20594,6741,11308,12894,62772,61294,62737,14399,21990,47732,31983,1079,22496,25209,37359,20250,7582,37872,28719,43033,57,33107,550,48668,60875,22232,59765,43974,26019,25830,42496,54616,41452,6910,62985,49097,9619,18204,57639,63845,61405,38159,9488,25804,47264,48636,40371,54619,57271,63991,25915,24771,51078,595,40625,56857,15957,24070,54595,44275,42481,44458,58215,57414,34285,1907,54978,12137,12309,6142,38507,60323,18809,18225,35829,726,7388,44260,24153,60127,38160,1881,1692,33913,34609,30524,57702,2540,50328,18599,42578,9963,18300,55950,34907,57224,30466,56255,56502,45973,29042,27849,39982,20873,2850,289,651,52579,52598,4424,21778,35615,43585,31025,27550,6383,7718,56621,4555,15872,29104,39194,47460,18814,16238,56694,46470,61245,32261,17730,33882,5027,61919,17300,49785,40373,22349,58316,9002,59674,37968,12244,18593,65366,3733,38293,62773,32309,26773,62478,36222,3377,12138,60294,61638,43154,18156,26242,26736,43119,51128,54390,37172,50889,39899,57773,25630,40571,7759,46481,19992,7014,47496,31748,54026,43223,58205,40745,27850,6984,3816,35496,7927,21295,8723,36908,197,42537,21142,15107,20131,9831,62159,47790,44174,54014,22709,37002,23813,28137,22182,10362,32054,63280,11241,59538,17660,8182,19411,31376,46352,8051,63548,29567,58552,39127,19749,9488,53434,32966,28389,60511,679,24532,29887,4839,44184,5493,41291,59957,30705,63417,53552,38145,39597,509,11618,60014,5946,58455,29549,1332,9264,427,7269,20946,37278,56442,55868,44998,15978,44857,28628,5697,50968,50660,18474,56459,53795,51393,58396,24984,51069,1370,136,41259,37450,23982,1907,65200,28173,9046,37638,44079,8010,38950,22114,58332,15601,24097,28998,36424,62586,6810,20612,9514,61477,51135,14384,22493,44715,24807,16168,57312,45278,52439,59025,1685,42415,47633,55330,46736,63223,60546,4415,10924,42430,27145,7792,59122,64546,13700,4938,36072,16408,27718,742,51013,42218,6917,37474,49579,44957,16013,31706,3947,3788,8301,4497,49344,62646,47831,57530,36471,61453,63538,38487,4911,34993,41628,21002,29445,60407,4215,9266,39250,61708,38325,30984,491,1929,37806,36321,23262,26711,55622,22204,60682,46750,24373,47902,64683,43925,55448,24510,55009,16810,19912,894,52112,49474,35067,24067,41711,19375,4808,60040,29538,14490,46140,2018,46426,55786,18295,60797,34923,50859,10142,28767,2511,59624,30413,31169,56156,49387,47203,5269,43987,24143,18898,36893,35363,46395,17167,19033,34237,42034,31303,4811,22521,58034,34094,64427,20727,25358,9091,5783,54082,28757,7302,10141,45584,21241,38348,60582,44260,37816,9657,43637,9553,32619,37826,53720,46381,48921,30933,60896,40469,3457,61363,34591,51105,35794,59310,65500,63271,30882,52851,10693,55474,3992,28214,22092,65192,60514,62854,57068,13453,58287,20177,64106,63205,54768,64682,31280,24453,4881,58891,49973,6375,11667,32810,48001,44560,8885,46148,15262,34798,523,43312,54382,16499,52977,26723,60980,56298,31083,39381,19175,30198,33661,12947,10860,59411,8677,2494,46058,60542,38723,10548,36852,34349,41545,23666,31120,44321,19160,31798,21899,45452,26396,50650,9319,31326,9169,23687,34054,31691,13241,48011,10445,37407,41802,34655,3982,42439,44801,4014,13530,23762,30828,11165,45262,39143,11543,21070,58757,24826,58266,36873,56656,29341,14744,4932,51886,23014,59990,25790,33045,35084,5283,9405,32620,158,30337,30103,58871,10588,40864,44647,61886,60450,62479,35225,564,45462,33560,6212,5185,64687,21638,8508,41496,27938,44230,24510,16083,20781,58045,37197,50037,28915,8778,53957,28936,62890,55636,8511,25676,28422,62226,35663,32983,30068,35412,14422,46384,7640,49390,53420,58786,60385,42991,15457,50532,47843,14946,17005,36539,29594,1632,38001,2587,39534,5520,5857,2577,58446,17004,30896,54785,46641,48128,39585,43988,56211,23814,2894,39543,64726,39579,33016,35316,31994,64280,58859,12199,32488,32290,61550,59503,37797,42478,16557,30258,58940,30602,42894,63869,23624,53246,19849,9170,11609,9196,37174,33441,61042,3230,50876,56044,43816,21132,53206,44626,26250,46629,32466,58352,11223,56738,56453,32846,10730,48042,21642,14856,59529,18481,37013,21062,21759,30406,56582,31984,8946,23823,46314,54212,15935,54913,40548,51011,17628,57167,7232,45476,48082,55168,4294,48955,31325,18891,36902,30122,33546,5328,48571,36564,17197,58275,29291,16102,30705,62340,3900,52542,428,16459,3292,63716,64949,13837,37930,5122,22696,31153,10759,19524,7720,29669,24686,14089,63950,8037,45199,13015,22784,7858,3784,27361,25459,22165,5444,59853,58006,42976,10508,19038,48908,12308,39739,46182,32415,61025,40234,44548,4386,36785,54156,30664,3402,50412,29452,8213,23550,64489,14364,37870,3156,14348,62770,60055,14362,54889,6892,26290,4544,39496,63395,536,52860,4634,36373,45718,32976,62304,61181,57143,49684,58770,30708,62409,41603,61009,19803,37386,37526,19634,61222,58905,51955,11277,51324,4483,7669,35656,21620,38814,46395,34658,43413,24685,42453,8668,39203,32934,24269,62345,44749,30870,5809,6648,14580,53351,19779,52660,28962,3666,41898,7620,3968,61595,3113,26159,41270,55624,48426,38323,27508,558,26700,3569,47573,56203,58366,37875,29358,23058,47539,58439,60861,54733,38054,28560,12082,27810,17792,27850,14509,34988,33797,43459,48627,24400,32906,13751,52506,33541,62865,65301,28981,9829,64749,19207,44425,22640,24541,40513,42560,19539,64345,49892,7680,61688,65455,59386,27054,7383,35728,10361,61438,26612,10,47177,31959,32442,48812,30910,6466,33353,15981,14045,672,62689,29863,3016,46341,59453,38748,48604,1790,40358,41851,39007,14774,13281,42634,30063,39610,9748,43389,26741,52596,59953,30962,38650,17084,15208,27730,15106,45244,2419,40860,40874,21790,41477,58093,53660,16567,34254,2432,2435,34207,29153,38544,48519,22714,31753,61950,21833,32570,64979,63703,54075,40091,56501,17750,16423,7198,39773,26274,52938,57753,38225,63194,65116,31172,55572,7610,10401,65389,36156,36420,40457,22159,54259,45278,23833,3533,49842,53773,945,56662,21941,38232,28058,21557,16608,46806,22097,34931,54184,3388,40316,62586,9917,46899,49985,47192,37205,28567,31811,14066,4193,11227,4700,8616,45906,11823,30416,24808,14303,56519,63437,64588,38941,56194,11537,50889,40641,43792,16772,37283,48784,19151,30848,16874,25300,26405,59347,52110,51945,15844,28142,49189,25428,17075,65049,10070,18857,5130,58318,6039,929,29956,33908,59083,11051,984,29127,54537,46069,58739,21467,23372,64182,10911,47561,63200,46166,63505,60966,6262,19591,51205,33322,33447,48261,65330,53032,35938,43459,28036,9238,39053,36113,17728,38024,52191,37501,58924,21258,42497,38355,24479,62727,47762,12920,41113,35640,16331,62606,3938,56676,53210,32469,34310,16264,39292,57447,59078,14324,43299,47034,29004,7966,27612,48291,5917,47330,19613,21233,41716,51742,3434,47343,19547,40786,53776,31211,13092,62314,48874,1199,11635,18966,29906,37035,61140,3889,62939,19746,16460,35693,59854,33155,12515,53586,43384,60277,49673,22905,24929,32039,4897,23440,26337,31652,63745,29905,60641,52887,52159,56274,40587,10876,22777,34004,46276,23075,3656,33795,14397,56962,41971,35134,31467,15299,33031,28692,35119,57566,60066,59885,45317,50120,10615,15726,27899,24573,16545,41880,16724,56905,36473,33033,14967,14530,13944,53755,46307,57203,6399,7972,53638,41971,6750,33251,3902,53144,53711,8280,25318,30875,9017,49432,30806,39417,56791,44298,9626,10049,18690,60673,13626,15070,63125,14532,19011,6842,14271,38135,39885,25726,2635,7710,3797,2334,41785,29698,28340,41720,24904,64662,20807,2277,43194,44410,11311,35874,42227,61789,19501,7717,54923,6231,51079,25745,8226,13896,15717,43048,39483,47978,14028,47210,61711,44233,65362,31030,42676,9286,55836,59921,11674,21911,35776,29732,3429,45274,47836,56641,3125,57283,46801,53360,26782,56058,55806,29774,56291,33738,24114,31529,23247,12929,20332,48152,47239,4174,29530,54913,63191,2156,10045,12424,65472,51605,53214,49084,7747,23570,42528,3058,46434,3085,19465,13290,28092,27011,55100,37813,7021,24168,40084,62832,18225,43820,40064,37484,29864,2150,45771,59136,54965,37962,34498,4113,31271,56261,17417,23241,47259,34558,30244,40757,23916,51354,15874,36913,53213,19702,36831,6115,29890,26897,51832,42600,64409,10457,12312,16995,65401,54744,38187,54223,62761,20153,36581,7345,3146,32912,57123,13867,60743,20352,18158,22231,27158,43614,5272,15805,30676,37787,54407,23948,30173,27464,36266,42826,51526,19815,24086,10340,26024,28715,40414,3783,47726,38390,45623,33570,51167,25253,56426,44969,27896,15176,15228,11612,55160,27777,11303,50042,54674,16497,16567,24044,6569,23181,29839,44484,12635,26935,25474,58277,54851,86,4085,36217,37638,25482,54920,28012,55420,4004,49381,20882,32931,20065,16091,37799,52784,6011,85,1465,41037,36674,31910,15931,59686,25361,24276,33857,14954,43158,54087,6134,28971,39007,8562,35943,24901,15371,56994,21984,45400,26710,14274,64333,58471,32898,51924,25242,62704,55969,1557,45708,23372,2851,65296,46565,47567,30165,31575,48955,2299,53524,45073,26561,21689,3198,9646,57160,33059,15106,44978,16192,42570,59201,55226,13289,32505,36988,54986,30023,8470,48352,9875,47986,63855,9118,16100,58415,42600,60441,17967,10899,36915,27149,40209,605,52111,37943,47922,13349,23170,65267,16611,51765,62162,59345,33829,48036,14447,10183,13378,7444,21905,46288,41338,32898,40542,15051,19302,12697,61370,47213,25925,59671,43178,19225,18060,27013,54934,24944,42302,13826,17665,21141,48691,16797,15545,51070,15942,59439,43138,38744,9352,21787,45705,49339,54846,10767,24723,47883,50536,62775,14168,62585,25491,52860,23558,23026,50918,17131,35098,34998,48121,17071,16112,46307,35273,30977,12076,38185,40833,1484,20346,3815,59431,53157,60419,23950,49728,63222,30835,48523,25921,15973,8831,47603,49003,17100,31830,24925,54193,40878,5187,45707,12094,27330,18334,21297,56245,52489,1972,12400,7183,39160,20113,29698,62034,24059,46573,5665,21400,56760,53679,1573,1107,59216,40971,17450,49082,3361,55646,63883,60617,47403,17993,38235,61475,25639,41545,35141,39202,39072,61455,34208,41291,16100,4651,48423,43835,41951,40917,51145,46018,33145,60011,30872,30175,61030,53511,29283,44900,11852,54547,29150,2922,17163,35666,34874,15386,5186,42313,45888,26273,6581,42520,20390,18079,7524,31079,59251,48240,31300,63615,55237,61947,14783,18975,12421,41593,26318,41336,40034,34732,36307,48797,39883,3044,56710,43371,19419,41873,6478,32135,47760,8208,42232,11082,57211,41626,42815,53664,51632,53234,26282,28424,50544,48364,26987,57986,35881,52072,40772,37075,11350,38210,42490,49315,57369,3728,7947,7173,3083,40151,19161,44025,30026,32,26781,48743,34391,18172,21448,24815,41825,13973,51989,10604,44900,61940,54626,44600,44423,58868,9137,7533,53850,33976,20803,26298,25780,54101,57155,37873,10719,29291,34633,53655,54805,35287,30623,22199,56043,8065,62758,34845,1694,63779,54753,43694,24728,612,32191,1305,512,6504,11786,32378,56199,47938,38674,39742,50416,4061,45605,18154,27339,3932,5318,39883,57366,5022,55119,2632,31532,56691,48019,14703,44655,43769,50157,64916,51646,12012,33792,9962,10279,9458,19252,32864,15484,41845,45771,33777,58912,26637,61817,7273,38890,5394,37213,9308,27585,12918,42576,10498,16433,23376,37269,63092,45092,50669,38567,57478,23789,17855,38796,41001,44725,56549,62334,7614,48655,16083,60761,55243,30279,24125,14279,47267,32143,35025,48506,50353,15073,46579,26883,12802,25815,47922,52198,8057,30262,53918,24474,21596,39705,53818,58295,51723,61347,30392,28838,54000,17079,20098,19486,57219,64366,60800,11111,58837,10863,52141,31853,13457,13118,10930,25984,8020,54745,41926,31136,17260,59740,53085,18885,22206,42019,37002,24403,14758,32900,683,37897,28348,24186,57096,55974,56588,65059,36895,65073,56939,58,45465,21293,27688,5125,39441,64741,15586,27668,19608,32558,24068,47461,12182,63860,38416,36090,44718,15214,54256,8581,38729,5376,17763,60499,24352,31993,59052,23027,26450,31421,26636,17569,15957,41486,64558,4841,24331,61716,41141,11567,42345,33882,47834,50540,47919,44397,35440,22399,28319,32280,43328,42603,26940,46032,50277,28022,65172,16009,26802,50866,29544,37373,2114,17004,4367,55549,11984,5445,54757,4929,32356,24374,6710,51390,12000,26004,25668,41572,23095,57620,55976,57149,44833,17255,7393,9826,17926,64225,10494,42470,34030,39816,48287,49550,8929,31477,37733,4417,48589,62695,11908,19909,7323,57575,28595,27221,11133,265,24076,9430,64045,52548,30781,2479,24800,11094,15890,51441,8386,35694,52726,27741,11322,57554,39652,62359,1924,43211,5518,41079,162,54536,12099,24988,53891,10611,31074,46499,25513,25763,47110,11834,34657,42867,19216,35844,61673,60380,15770,28101,38958,10195,7506,63108,43300,23371,15733,7811,58046,47199,31426,60030,46884,51541,62373,65244,11915,36895,47126,47823,49992,3381,18828,33989,40118,26044,228,60514,46598,48421,10505,18218,20206,57126,28125,45502,7663,62715,27358,44073,26653,24052,56065,20068,31634,43489,60391,33326,52404,40868,43110,46437,22960,60933,3950,50389,14445,59169,47819,51275,18814,51518,55635,10701,53937,29624,1907,10010,23695,11264,61786,42374,28294,33659,31535,38652,13214,44536,58826,24085,9116,41682,35362,19783,33151,6448,51418,50576,11999,5495,5041,24001,29456,20912,3926,36301,12041,39715,31620,24073,37982,30099,20480,17839,42605,5702,43819,4024,19623,59097,22099,18910,60491,34583,64233,34122,10254,15475,25227,52666,4502,60923,7671,41585,51170,26926,3969,57336,36116,17932,12168,4740,40186,56641,22093,23389,25845,11803,43240,32041,47528,36689,62701,4458,38493,40268,39761,32986,47114,7218,14190,37955,12484,7809,11779,20045,35919,19103,54446,455,28923,34504,11092,1396,3213,33277,36233,23291,34908,4795,45223,27485,1943,33620,9259,39372,11306,13835,31703,25967,47673,57176,46379,52210,49783,17950,40902,15886,6597,18120,15190,41131,903,16865,56479,24924,12200,10139,38593,12475,46577,15519,24083,48592,16645,52421,45355,5,42088,25314,24783,30975,14673,11054,65398,46136,28248,5206,24508,31911,36043,56938,33734,52917,19967,43337,7856,14678,31803,62321,64587,948,19115,49437,53246,26227,59820,952,25435,52793,28005,27671,14339,56153,53269,20268,41554,55413,19242,40455,20327,28381,10768,2041,56590,1472,13270,45941,45147,61205,64199,29776,13765,21718,55829,13316,49944,26148,64735,2483,12914,18782,52098,20528,46433,32078,27953,63562,36104,1533,38483,9350,11243,29396,50441,39430,38644,36414,7525,22154,5139,59957,61590,55942,37737,22658,16336,38022,14573,19531,34383,35254,46174,911,11001,6674,7498,107,10607,52530,35702,30597,22167,45479,46026,1317,61217,49488,10238,39015,47921,5388,50852,31603,20192,7493,23482,3186,59410,42721,15094,30240,56127,26053,54487,6047,22806,7329,57060,52251,11122,54518,53552,11237,35964,16396,42325,21129,15362,5538,8932,18730,62909,38354,44950,13773,30799,62577,11450,17707,36598,26331,49936,54905,34233,14633,23619,51190,20551,2959,61788,46778,26049,5544,48080,31259,6918,22567,9967,29072,6399,51915,14825,10410,62963,16258,61032,62460,59235,62620,46993,51592,54214,48563,2223,44399,64849,22605,13735,48019,58489,4016,8165,3926,48954,41877,2044,60098,8498,42261,14450,39236,50924,29443,28026,5105,23172,36889,24631,51819,16154,48606,52672,50366,7981,62383,59738,49750,20972,30667,2763,13611,26891,62338,22081,28049,23213,48553,53643,938,18888,59617,15247,13805,15999,21224,26016,65049,12449,17865,52638,1685,26844,46612,44353,20836,1163,13111,65290,30864,20315,28927,46019,42122,10306,7840,56184,31872,26019,33353,27852,29144,47256,46023,18739,14368,46500,3198,62512,46152,5782,18904,10667,49671,47099,21331,6160,42452,4850,41555,29419,12983,56362,10191,63762,38339,44850,8072,41417,40655,4322,64615,23429,13240,55737,7670,42523,64482,44945,34361,8050,20021,58220,60834,47513,10737,62246,25852,40676,13147,13733,2293,29384,17660,63997,18587,44215,38697,14677,17389,59461,28047,29582,54417,11540,24222,30167,8194,56828,61923,11892,22726,24666,33662,2015,9156,64890,32238,33231,60840,56628,61040,12548,21864,23462,62981,19674,23588,22031,43764,29524,33511,6323,64944,28915,19657,43209,2578,59482,39939,36190,47451,12422,50365,12813,57758,7597,34645,2682,50177,64668,9835,14145,8576,7275,9848,26230,41361,32938,60131,44226,50132,1598,42701,30769,51274,49918,56600,30996,37800,49213,31284,42991,49357,62695,27038,49658,56589,60189,11601,52957,674,24724,22556,22921,58402,18794,22326,15242,22311,58105,17662,20320,18928,3463,17551,17553,13286,19565,10777,52958,31413,54289,64967,55087,6023,40294,61725,63098,19004,7229,61273,16910,45445,21555,29114,43409,40159,1414,25721,95,32470,33035,17971,57159,65514,18195,64817,47370,33877,11998,43994,43440,61809,29403,29003,19290,22071,24844,1822,23050,29098,47121,29382,35986,823,57195,61045,21704,44774,20071,7025,63273,25383,34993,37675,28870,11335,12887,8496,51156,35450,13351,28819,31273,36731,36366,39827,62172,45755,48513,7833,33671,46165,44307,20806,19390,39186,2713,51890,30865,10552,35275,54198,8927,57038,31098,324,35876,968,43449,27337,41918,29059,52736,43516,62387,19980,30398,41288,9722,41624,44147,56750,2284,13883,7729,62742,54285,2407,3403,47195,9323,40281,21432,36176,44870,7084,8210,56724,8093,39514,30580,24938,5516,22181,53331,6728,62947,12932,21270,56908,13658,13484,12722,5699,26261,24327,10,65272,31591,38227,47996,47339,7834,43611,41746,4893,47873,48123,58705,31223,44120,15462,13702,11966,29657,2697,7181,26676,33998,62404,322,33996,17360,26957,57602,9313,18847,16510,18351,3298,20764,1535,33798,40473,51147,23300,12830,17112,35934,21621,60985,49581,58538,46533,23176,34765,42740,13326,32426,56943,48578,53886,13291,11146,50907,11268,48292,43558,1355,12671,21796,17813,59160,7231,53040,47192,36441,54887,4812,45829,63797,38715,3212,17107,48568,17460,31450,52523,44142,37070,21848,63664,7744,59938,57403,54184,22148,50172,2918,10397,23947,29197,1951,26125,56938,56151,44864,57770,41906,59961,49542,10911,25557,64928,53124,32029,13282,55123,4232,17244,44125,25872,58635,26104,62019,44429,51434,12599,26843,51915,58838,36121,42146,26209,38429,45913,59857,12024,54557,64383,55636,50404,41677,56208,35711,1425,23913,31753,6390,63976,17339,39677,18902,44009,23322,45680,55832,5387,51713,61800,10676,290,48058,38179,2247,47655,37162,60239,54567,63145,57165,39063,43010,59313,51852,22544,43641,64400,40704,34918,3502,59795,28428,10251,39255,18745,2541,45918,44146,26781,7124,30150,23601,18669,5135,20157,1366,47756,15680,4859,52681,26113,40322,43515,34033,40981,18192,14779,58242,29822,55800,44897,15982,1280,45838,35994,51593,37736,1282,6324,54973,46276,55560,34141,8560,14743,43318,44651,54825,61686,16920,39369,37082,61725,9495,57892,11439,37820,2983,64240,37768,28109,64456,25384,2448,31333,53865,2614,1797,1840,4384,1120,55746,25386,24478,24527,2583,64217,30132,56549,53380,45984,25511,22796,16534,34643,51349,37659,29169,47149,20970,13944,45324,33987,23243,6953,2935,1157,53208,61535,57685,58575,13143,13750,56852,15725,58263,54959,48889,51572,11162,55460,2635,49481,22916,15680,38829,59388,16806,15108,46606,65305,59129,64841,20259,32038,37842,5178,60629,46179,6535,65425,41132,30260,51724,5955,350,35624,39009,17452,257,31456,41129,22084,45626,27262,27242,36625,34460,2622,36762,4816,52683,52326,394,897,22467,56425,64248,948,57418,57638,62514,22299,17371,42926,33854,64643,64582,32966,30466,18284,39353,31451,42448,45676,37505,28126,39163,34561,37802,22959,16871,11930,49059,4743,45008,41449,49467,7862,16075,31685,14925,33766,23791,29979,18903,19042,33864,21135,57153,26696,8067,43051,26784,59699,15433,14866,27690,40478,5760,60513,1913,48714,20523,58447,21956,15549,22166,50921,21085,51295,55771,43575,26799,50907,10695,25346,49468,23475,32877,35800,60804,62813,42810,47484,24033,14899,22478,5401,44064,37180,6261,51452,50387,37565,20760,11574,64315,1766,28892,22567,52428,40661,65288,44832,22539,42935,22368,39899,22064,38191,40521,46500,43405,78,36075,2103,12699,16965,36714,23774,62439,54639,55428,13950,61447,24354,3540,42524,54079,36814,35211,41210,58585,46202,10304,13048,31078,34974,28302,61727,60294,63526,61416,4847,8261,6177,51989,57012,41579,27664,43227,60708,64854,48850,53852,13492,8753,16823,52004,51208,36668,38609,41710,30567,13676,20672,13356,26045,7819,53155,45433,34083,20168,10457,53638,35158,18552,34422,41973,36232,29194,44382,31861,56247,15793,63768,60497,37883,17406,62890,59756,54433,38321,38955,3782,56545,64117,39092,16739,35477,65457,37457,42775,32433,23492,42002,55961,44800,403,31421,14044,12903,6349,39319,22038,18760,36676,51120,33733,13846,3551,53959,83,41598,24145,25092,43781,15569,16913,4665,36739,1120,34820,5202,44929,54727,33732,3765,23674,52534,1134,30153,26023,18384,62906,46823,28883,8578,36055,35455,33997,18786,39956,29905,28422,12749,13633,61551,18772,11117,58941,36104,27093,24776,4364,39824,36893,38733,22734,64217,42285,38941,56857,63766,26779,60187,46500,20874,4813,8035,35962,950,8632,25269,45072,17344,4913,46065,18348,51684,31405,48616,37651,1956,20713,22425,20704,39972,54395,61557,3878,18480,7380,37136,49806,64067,60037,54532,5544,9622,27930,47525,46924,22692,44851,28379,195,51038,27151,63474,10388,43501,53552,25510,61335,55570,27215,30372,55911,22897,5147,18105,63008,9242,30463,50816,49879,38200,25780,24899,4444,37794,56011,35769,41967,54088,63542,14896,14648,29126,19836,36754,7268,1061,38303,41727,26085,53050,36308,3622,15587,35974,15373,1781,39353,45703,18543,8967,30088,51197,22718,16975,60837,665,36915,5226,35076,4165,22513,1160,28396,38284,17279,51136,23934,19266,20445,42134,51006,19210,34288,38394,43931,57472,46894,16986,58671,49686,55448,59466,52828,26843,63818,62246,53358,29323,7517,1181,13253,33311,59805,60167,18897,42223,43939,57650,14697,9290,52266,56664,62953,63750,44257,56648,38468,10095,48524,40131,60456,3165,59689,50852,28863,29233,39955,50087,59880,4386,16567,38437,11493,53494,4179,61538,63005,34103,50073,9163,9119,60161,29140,61971,17392,47063,65455,8147,3407,42596,35564,29687,53839,24661,40396,25725,11665,7268,2929,27548,15739,6323,39835,57965,41582,733,9149,1370,37303,26320,59380,20454,706,38842,61415,33806,10237,44595,38890,64357,21880,60484,8875,9170,49217,60683,12328,18564,57924,64952,21417,4,54794,3959,41028,57607,238,15776,29894,11236,40111,31095,54177,8618,917,12884,16274,44930,4560,35842,31486,44197,4942,43565,15141,55637,60897,30115,6297,46145,33153,35581,28656,63990,13673,31905,48569,23094,38611,18207,8591,13319,59286,11667,62601,63285,3540,22931,33197,27685,9089,6996,57073,8589,189,58967,57084,42979,9039,12867,44065,18306,58978,21307,16381,27213,7292,56557,2756,27796,5896,31738,6127,58283,43137,31469,37531,9931,59761,45107,53256,12350,1992,43687,54051,21326,56421,36234,43216,47771,12493,38169,22638,59869,20556,58908,3252,47882,17030,22883,30690,55500,22420,22100,30139,3861,11485,23417,29310,62549,59496,59930,19279,27691,23394,4732,52618,9612,41037,6130,42668,62948,36183,2071,39378,64128,65441,7258,58055,63256,53548,29398,37639,56292,12846,17836,45227,27377,22218,4758,48976,30325,33083,62979,52012,15909,56680,24768,8730,37860,20154,56829,49379,48464,40799,62011,19544,37667,13107,48130,45941,35787,14634,51255,60572,31212,54014,9495,57473,32590,46387,36897,14289,52848,26081,52342,61724,44474,34238,23450,30027,41942,31258,50682,52322,44123,12525,61269,62268,54169,28791,6017,61685,30195,56987,53632,1947,40831,30704,9366,58708,41906,64367,54027,8164,60462,42278,3099,43288,24921,21557,28872,31404,53951,31084,34477,23531,26171,45019,61984,45647,59658,5201,9262,22052,12697,12316,57298,18057,17694,32715,29852,25048,21874,20099,8452,49863,48807,32863,60752,52249,27210,48777,64204,13790,6229,45639,40783,44548,1555,31896,20335,4010,49301,46663,57191,12762,56286,54051,27103,10529,43676,51508,2458,33950,8631,35694,45662,3142,11765,9990,38110,6589,44990,24471,20839,37652,18078,55749,54247,9688,30511,56985,36410,19320,33924,20969,44927,37585,22148,25240,17024,3876,43157,38057,33807,34181,64258,53219,15898,47287,36726,42664,1469,7315,2644,4841,4024,62864,1136,31323,45061,61070,48230,52512,45938,771,45205,41608,27707,41650,4464,44027,50203,6723,18053,42557,4466,33088,38196,40046,18703,48024,38718,37679,13000,22586,60902,33353,9519,12319,41599,36781,54551,53521,64752,178,2305,62277,19145,42808,62255,28401,62778,44617,7793,17825,35436,18732,11282,26348,54467,47014,63455,61339,49833,11376,42742,5751,3320,44251,33447,62008,25667,14905,12494,52473,57469,52033,64032,65109,29408,29275,1908,53917,63250,17566,35204,708,63948,33919,40581,44473,63756,45884,64347,52995,36551,11329,2928,24853,57900,17447,23899,40998,15778,9533,31715,17527,12958,5184,51726,55099,18728,22093,57613,49648,55708,59921,14732,44671,20093,54033,21106,18756,39033,57561,14582,31182,15815,49679,10368,35192,60619,9409,48665,20874,43257,12844,57268,3862,46336,22196,8138,20079,60323,17573,12944,31920,809,44049,51710,43421,61768,43127,47838,47413,8709,46713,22093,31783,17772,12644,1631,4275,33289,10757,13634,22052,25808,40924,26007,53602,56950,33199,48782,56572,39597,7167,53054,10585,28902,59280,10318,47710,12269,30830,38827,31559,64717,32290,32975,34256,10299,65005,62267,13804,36056,61487,63600,31090,55284,9142,34161,2425,63036,53003,1645,50175,21967,25760,57573,58884,5872,41619,18666,50282,38125,13402,3751,27164,32484,45585,43696,7556,64396,38987,6442,5265,60572,17632,63116,55688,63809,20254,31029,9347,8805,50293,39551,15953,2626,18280,23662,2137,48461,55318,24181,5657,3435,15679,14422,37,34223,2954,1296,11583,3748,31881,36316,42361,45,54928,54307,56372,47163,36861,40372,60317,60885,4302,39110,17164,16476,20806,51228,63157,32483,32988,37214,26696,19766,14395,49440,20443,33273,16661,50669,42824,40197,64724,7780,7902,9817,12786,37335,30272,25938,57320,48944,60337,13573,48587,51982,55135,35043,24440,55148,19805,47831,41757,29787,16248,32352,6688,22472,36124,62219,56143,55253,29436,62799,4113,22639,1128,12103,39056,28174,24716,26227,63267,36707,16356,35483,54592,47745,46731,30389,40294,33970,32068,63106,45571,24278,32823,22354,31507,5631,51460,1941,20927,25752,62132,21958,28374,1480,2964,13900,16914,58708,59039,17384,7555,33393,12524,15650,34179,10911,62656,14286,25656,55126,46606,30755,63118,33876,34356,33763,22697,43793,52582,13742,11432,18154,24339,53465,53165,6233,64943,22136,57391,287,42081,42275,30134,7606,29203,46967,43544,7834,20549,37384,27810,29272,18934,3714,44949,45378,55300,5863,27828,12340,52801,59306,40120,18902,57977,11826,42985,55579,44111,28296,29250,28966,27735,58289,33042,42643,54474,11423,3928,12529,10752,61954,9211,20545,62919,12879,22507,35141,48791,52422,60578,43768,14322,29089,1126,47880,8340,49592,43859,57969,57209,40830,48814,43735,63623,30127,59891,2082,13019,13820,61458,37560,6394,4072,45991,9588,42594,15408,44618,30608,34973,52811,22061,40511,570,58907,4302,50639,20804,42535,5985,48810,16389,63675,23214,36983,23724,51638,24636,1666,36669,54360,33331,13134,27780,5941,51676,40873,31879,50131,13920,3312,57552,16533,18993,18550,25257,39567,52579,43176,63258,48642,29342,38788,35944,52026,39217,18915,8880,39444,50704,23094,47250,2881,28395,14670,64674,22066,20747,6687,51804,3395,22126,212,19848,59568,58163,32742,16734,57550,59475,62504,37821,62380,48853,28284,30344,61167,315,24449,50842,20868,35085,28741,59321,15295,854,17777,1660,29087,44807,63525,30202,13205,5306,55662,11238,26942,42431,61179,21621,31596,60041,17948,45632,47070,23955,5595,11537,54719,38051,47118,26299,63517,48985,32083,64136,33309,12129,60189,44621,14532,22201,42922,1612,45710,38318,42916,29985,20399,41526,842,1783,53516,48900,65012,29075,40558,4619,58956,57591,35333,20034,5567,60529,3076,12451,10762,42204,15208,42235,31305,23741,58256,33090,28708,24555,19622,61587,23831,48800,55509,21144,18427,25862,58846,35587,1042,51912,47225,2549,53448,54667,60278,34447,60258,61238,36490,6582,12645,29073,45208,61933,23225,57070,21655,31262,16101,35017,56678,54838,22333,32863,62179,29810,7636,37605,41484,59657,47066,51107,22463,62855,16355,34293,17822,50156,47474,53936,43035,19171,26211,50368,58242,57614,42979,1543,50676,35,32407,9729,24085,10445,1062,37789,17571,20656,9515,56870,36954,6267,32269,43931,43108,60061,52103,46164,35101,49248,35050,65030,54336,19286,38690,4563,33828,33013,45325,41220,44783,28678,3933,30610,57350,2909,54362,63994,65035,55076,10794,63312,22596,20261,15970,44671,1430,37628,65347,47803,5089,32133,6738,52784,1698,13753,25845,36570,42693,64316,17850,55678,57316,24462,13929,25430,55932,48075,31624,49606,63566,3796,19629,18085,44473,18553,22871,65045,4957,2095,35108,17312,7931,52686,52123,24338,51257,22460,17150,44871,4013,29751,38515,19202,56179,22175,38012,58958,25044,60816,20982,45493,32509,52863,47678,27214,11078,39836,45692,30613,14218,2285,12900,42698,17527,29530,65439,64048,25499,35363,5178,17102,48189,32451,50279,4958,37093,59505,6601,64074,7772,40639,20784,51185,54830,45515,8256,28259,35563,7176,8588,60200,55504,19939,32448,60940,53537,35507,43966,12283,58602,47388,32077,35140,22281,38318,57984,24388,34922,38447,16983,52922,24392,3855,28651,23841,49285,25042,44330,26354,55522,40892,40933,19439,45070,38462,60507,65159,6972,29335,7298,12979,2193,51393,17705,5554,7919,58536,38924,30534,9131,23742,46953,64158,44339,11565,17437,50725,53167,46042,30286,3516,40531,8191,41817,31080,18246,53800,7100,38327,41172,31709,48899,39385,7301,57712,4585,65388,1566,24445,10969,4151,62353,59095,54587,12510,42629,45284,34537,27866,9131,13492,61294,25869,21227,11757,56536,34107,6797,9288,49349,14266,13608,53399,43786,8002,28199,52848,35850,304,18450,61805,28017,6301,31391,65422,57022,18194,29610,53447,33154,47098,49005,5067,47490,30628,35387,37407,24957,29594,4118,47829,32362,28827,45087,55999,27760,61731,18933,61918,29388,47335,14222,24898,29302,54968,9726,25733,27414,24312,6764,43060,53142,44030,37854,42990,41337,65495,2537,29372,59553,21119,14898,9300,35798,61723,39031,23091,47740,21223,55386,19738,52650,28090,30893,45560,53185,6121,44833,42852,3899,10420,54612,7220,2203,63460,28197,48772,5339,33353,63634,48584,63934,2225,52292,35818,20809,5073,46065,29330,56595,8685,49590,41752,21938,9603,48778,162,30803,20487,44219,28247,60049,60147,4142,64722,46160,17629,54342,23801,27355,28445,4436,11649,46587,47888,10118,48112,8748,54227,51518,35384,59672,25376,14825,38053,17528,35073,20374,33682,20092,25514,31888,49207,10476,59435,41506,48213,26469,55450,60492,55227,2323,59875,51824,53521,63828,9607,32854,58554,18156,56825,43847,59192,25405,60651,50843,55434,3827,15455,25061,3278,31118,4492,12181,46869,5897,17825,4224,52912,39582,60174,34758,20905,12688,19904,61899,44143,23770,7609,40003,9683,30593,30114,37631,48548,64600,31557,46763,25707,1829,11699,53907,24146,12635,27353,8351,29334,38529,24865,24449,63398,16182,44694,37241,49382,31694,58874,34262,38366,17453,34623,37956,4399,758,32098,4671,35550,60186,14130,19786,40629,50341,5856,40572,22856,33901,5669,29740,15015,32158,32611,32381,9380,41813,38533,34606,50888,52430,56405,40871,3069,9699,28428,46660,33318,40297,27593,45854,30065,37783,16980,19293,51608,63788,41051,40019,49949,58717,39702,6917,26465,342,39331,53763,65093,29167,23131,45291,56068,45917,1248,16931,57762,44505,14100,32632,25538,15407,13612,6081,43424,34003,32590,32119,33133,31108,2797,38122,55975,49805,40788,48826,38709,26485,31664,8953,25824,34661,58982,51253,46023,13507,17900,15878,41725,13511,56310,24649,56971,11881,13387,29751,40829,39433,38831,52482,557,1940,48163,33995,7779,53543,5468,14820,29763,59894,41559,35496,25620,54122,33446,13062,57922,15076,13194,49324,2799,49983,55294,61946,23906,42385,21383,2405,32092,65157,46182,49589,743,26512,29158,36803,1117,12695,33172,29530,24452,19484,50601,15981,9908,40658,52945,1052,5915,46109,48624,58315,30196,62797,28053,40654,25030,33761,58218,44179,49807,10795,44915,144,30838,8039,1396,22386,55894,47724,44098,43241,8182,45106,17539,26626,54283,6587,18067,27755,12740,12891,53588,25064,58741,9139,60103,33269,42657,23820,52959,46774,28098,26282,50319,45675,25990,17863,6386,49933,26622,24519,61865,53481,36136,60430,57742,17326,14611,32414,45735,12917,50561,39956,17886,81,48033,9086,31806,6057,54747,60966,31721,12946,46052,60224,41612,55262,6830,33987,11915,16198,14347,52700,46723,1490,58694,54254,20619,20549,2028,551,26644,62321,22696,35569,13259,256,58859,104,23410,36733,4251,12048,1518,58644,26909,22488,31728,50534,38471,1581,27599,5664,48518,17512,54052,36335,59189,42417,33248,14445,9734,23190,61897,22792,17664,32402,38147,44861,48433,18663,41651,3615,55086,10968,7312,25136,17461,18986,63717,60722,53034,5649,2951,59214,27083,8432,313,38614,2687,7778,25633,49110,17542,49680,15360,18405,48162,14303,65362,41713,53890,1840,17185,52415,65168,4001,60127,49955,43675,60975,41419,32585,44174,31975,30941,9034,63577,52561,52091,24013,40126,10696,28022,28975,21066,16679,41142,7227,7469,24154,59580,38155,51199,1550,54548,18449,34789,53793,41080,29407,65174,57420,29018,5598,13331,62674,15685,31173,15032,14835,48430,63725,19664,20290,9335,36854,44662,23249,21666,55058,21860,49987,18017,50732,30439,5007,31058,16599,26663,35046,14617,8263,36746,6511,15444,7947,55945,64683,63285,52776,14230,4756,20450,32989,58648,12823,58509,22772,46741,4255,36776,2722,63321,55989,31848,5312,20976,1701,51273,60644,54297,44995,52531,10979,8006,44098,4949,24835,6792,52340,6139,19629,43299,11540,13630,1783,14211,34578,25815,8784,37916,21540,48525,23544,26007,36498,25994,9643,23034,43941,47331,36323,42824,30765,8056,34221,10813,11856,49781,48812,36081,21496,23053,52807,2899,13838,13117,63620,31384,39785,37454,38374,35306,11421,45238,29841,26276,44283,46369,47355,61042,9473,44582,14886,63976,8134,3233,7610,41035,17529,21343,14323,11565,12228,43690,60073,10085,29412,58879,35819,56857,10898,36311,48575,29496,48668,1741,24160,37300,6969,30283,33559,39245,5856,31556,33838,64448,9386,63158,1136,52219,39237,51663,37279,52684,17475,55485,60415,49156,46618,22377,9670,2733,31669,2280,32443,3452,44581,16019,12922,53516,46405,18626,36334,3759,50971,25701,56793,62255,34103,59647,55555,15256,35963,4410,43886,10822,58914,26197,26662,38562,46308,26713,51943,29572,3559,48949,44018,33937,44855,44668,33227,11940,48444,53630,28940,37519,17569,46167,54517,43946,59214,51655,17867,2704,63002,65002,57893,38247,56176,262,6724,36430,873,5706,42903,64850,18894,26892,10379,17918,4428,15195,35290,17332,37392,10856,14762,43286,60383,45119,39964,55834,65134,47114,44613,34314,20242,61719,61126,41202,32076,9708,4408,39709,5670,7364,11161,42467,52020,7298,14345,18106,26631,43218,26530,22180,43258,31563,24341,14703,8014,47958,60079,39101,13647,8228,51507,61922,26314,41981,13209,17022,59500,47983,3011,55841,49672,6578,27739,136,29509,13095,64379,50760,58355,352,64351,37005,42132,3706,17278,60640,22380,60363,47666,60028,44916,45516,49857,26602,15975,35127,50016,29809,35594,39507,58721,43755,28432,63946,38692,13799,58134,7751,39374,52557,51955,53027,48829,30867,60583,23644,56623,5763,16850,23455,53912,46295,36950,63401,1114,30380,26692,19301,51821,60937,7876,44763,39256,15988,49495,62906,47528,16336,63945,42736,30141,33371,7344,6957,52134,10142,20144,33964,56876,55051,13494,36892,36887,26230,50565,38160,28057,30239,5460,28233,33425,20375,33117,16000,1290,7211,16659,23102,26000,60993,28125,13287,57507,62198,66,4554,49990,32073,54964,12989,57677,35391,56323,48419,64464,53639,19470,37900,45361,49912,4701,39027,21003,58787,2873,57954,47569,58927,20572,12089,39486,14080,9488,50341,38360,17799,33513,36294,55196,55173,46841,50520,36831,34906,21573,9141,9774,8131,22305,36227,22491,39645,60415,59886,61099,3653,4466,30971,11985,31614,20132,15360,59591,59445,29427,47044,18707,32524,60842,940,34120,32847,43912,15503,1734,38672,19027,35876,55497,63882,54070,35482,1268,63863,62852,63542,36585,15929,49066,41636,13987,22335,24699,28915,21461,4185,54926,50262,64176,17630,21036,6510,3132,7253,43796,2570,64955,61308,62193,19332,42570,49150,20740,42110,41625,2810,62125,58221,1357,61831,40879,20318,42877,44963,39834,19139,21378,18339,10066,46278,25584,39287,37617,43099,60126,28106,42457,25656,33658,54286,39850,56554,46375,46299,55554,16975,1349,11422,6134,38589,40015,8762,26429,2269,37196,20971,10371,13798,56196,40044,20427,12520,65018,39717,26884,56764,53953,42961,49902,47875,61566,46614,39412,13088,51785,9663,39724,41257,11719,2445,24086,60954,61797,56413,2022,48868,52911,23893,9499,44016,40557,15295,36494,14186,39021,26072,11891,51452,38606,3397,41170,34929,14912,43119,36022,10702,57038,44980,33876,48672,19246,22316,12730,30976,46701,44903,3086,30813,2878,51970,23645,60675,35423,24784,25408,38019,25751,4311,45758,28526,12433,27137,27057,47956,26768,28254,43714,35326,30421,5179,17702,42514,61415,51108,27013,31178,38705,34421,11720,35857,52429,21023,64571,14576,53750,43998,64652,43351,32337,46937,9672,10149,25382,30260,50484,24226,17010,9577,34877,17873,25039,54326,21829,41409,3173,113,43623,6499,53622,40913,13492,44674,14100,34698,11295,31308,46660,33345,47702,2654,3350,1389,6604,1082,48241,25507,56864,9770,41594,43445,38003,13235,45121,16179,27199,47959,20700,37834,61997,24750,23382,37707,34548,42850,53035,54358,30692,47475,63649,24380,50904,16638,13511,46604,25107,49063,24728,42151,59477,17660,59365,54972,35049,17190,20853,13027,38561,54975,57952,37114,47205,7240,11870,20374,16629,5394,35089,47103,51600,12345,7900,22012,33015,39479,18974,24656,47858,43205,9250,26317,62867,38201,53617,24972,1770,25582,15766,8436,6386,6592,9937,47158,63902,63468,998,33902,11895,21556,6096,50327,47584,44509,17236,57020,16648,32161,56840,33742,45628,6394,23765,48279,23368,24317,40996,50562,18148,51003,27632,5018,5694,15271,28570,64787,24593,47220,7174,7233,47010,17191,4991,47942,52421,26726,34270,19794,62397,42317,64449,25071,45010,6090,10088,146,41791,42190,17240,3435,28074,18602,9825,53643,54718,42134,16485,58624,59155,42595,42442,23647,34639,14469,17507,64041,52213,37742,4979,20975,42958,65466,52049,7653,18404,28250,60860,16463,44059,58217,37851,29870,2405,16489,32292,42201,20299,47285,36376,31879,7874,31683,28377,49656,19380,44536,40298,28161,5493,53337,32125,43632,16914,13005,28454,39638,13809,51486,55208,29273,30787,49471,24153,55849,58151,37962,54300,15758,3434,19677,57149,22834,9824,17499,40696,30463,4138,21049,19326,4003,18104,49136,46444,61147,43376,31276,14317,1949,40848,63598,63308,25742,49803,47617,27978,12280,23938,7605,60933,59389,53368,16725,9229,17836,41915,576,24145,35166,55108,7730,58227,13943,10948,53716,62243,36683,19957,50390,35790,30029,8657,16687,9212,50057,33079,56129,23186,21355,57779,8621,3543,43069,33372,46907,3349,14383,40805,24324,26857,1344,44842,42306,32107,35835,20052,25347,34516,8928,61308,58822,28242,53147,62545,61868,47556,45689,5694,45864,51292,10163,44400,30877,20473,52307,34593,29123,11789,575,29645,31717,48948,64131,5564,11071,44949,63913,701,46595,62232,39303,32630,50497,57490,27307,45507,51478,8972,40622,11261,3738,10873,4032,47133,48820,19036,39467,8052,26456,58394,21678,8960,34640,45589,46885,37717,4739,4371,19027,23202,15464,32576,20351,30822,16347,53445,56760,39992,36549,22172,50030,14138,29762,61267,6602,23216,44308,62713,3812,18085,38779,45948,32764,50150,30150,35822,16267,46483,41713,40085,3602,4111,420,27703,62599,26101,65400,63405,32139,18216,58071,37682,34469,61393,17930,6435,63112,2456,38029,54064,43468,1855,19056,1511,29344,15849,36897,19081,28388,40266,31524,32192,34566,48776,21050,28561,30613,57828,28751,59234,26897,53293,41041,48184,53763,59250,41219,7600,6130,21367,22616,33090,64230,60516,22696,6132,6789,60798,4716,22766,3866,36414,36332,48656,30755,57202,59535,22440,42824,55683,22337,9058,29791,27986,19552,31427,55593,22217,10348,28216,25023,59347,47000,49797,47755,18153,53004,18151,5313,63649,34143,13220,41737,19765,56825,33947,44198,36910,62533,60293,5405,42740,4382,37196,50814,19331,62680,33374,13663,42622,36239,62311,2862,23660,18551,31532,62981,60617,44846,32918,13178,61768,30953,52575,31900,37924,29377,4487,33559,41727,22943,41511,40416,36378,33986,5655,32394,45376,5290,31416,2222,25746,1567,12227,36268,15391,2897,22291,41626,6854,9425,408,9965,60650,45409,45049,43047,32681,60536,97,4625,1437,45291,63465,53990,42071,44617,44506,141,31117,17613,26257,49270,16048,29016,14603,18641,16231,53224,31729,29390,34111,6816,5512,28020,52802,6683,16087,56535,20706,18104,34966,23078,54467,41158,56990,23069,37627,39832,11362,25757,31473,56352,33874,13952,3665,31410,39204,35314,19064,34512,8187,17268,19782,42046,29345,47310,3598,19977,57705,37125,7790,61760,44388,14763,5918,29996,48315,53735,23273,11232,64713,52735,36365,38214,92,60762,24393,37191,49362,18448,23292,41738,58162,60263,60858,27779,65028,52569,30016,16209,22503,33416,45083,28478,28090,38365,34183,57327,55166,16808,57728,55485,61599,10478,23126,25692,7345,52522,700,44563,5356,60513,29810,54604,63122,22931,1881,8290,58773,43581,10600,55932,3235,31120,47422,2420,47937,26873,26657,18511,62096,64491,15371,12315,20126,9524,49786,12735,62775,49876,26838,30315,45487,14538,4833,16021,1911,1773,14423,22548,4402,61495,54656,35934,10057,16284,19263,42100,44063,54195,9243,9060,55976,59578,16933,31123,57075,56367,62039,46588,49568,20837,12950,234,36897,12260,30040,52812,44697,58249,27466,49103,3785,34944,29306,50847,6400,1273,65079,10984,63109,27840,20301,61273,60007,29895,52834,50659,32159,47863,7426,1865,34492,38192,17682,40492,48095,12359,26672,33456,22665,29859,42329,46106,34451,44833,5200,55804,40079,37120,231,24675,59918,61661,63025,24790,39726,14605,50214,43750,47649,20913,52843,62085,22258,43056,61704,61059,16357,42438,12109,56041,59046,56409,53710,7297,64749,23256,43526,35116,37627,62679,26338,17372,34988,54455,35233,55872,32691,38628,5519,20265,50686,20218,32765,28120,12583,312,7015,18741,30980,50782,36981,35330,48068,36427,36574,64454,21278,18804,42979,61634,31029,47906,43693,47889,47560,29374,58493,31061,11405,62497,33226,42028,7079,23111,29772,34839,61672,5450,60171,20354,48321,54840,55338,63104,46239,52511,4436,31838,39870,14865,19128,59519,41167,59167,59077,45701,52741,12342,38363,38955,50665,43533,63693,20699,24039,5581,0,47718,53034,14354,63759,2421,43851,62360,20980,21476,61334,50179,33621,10262,49794,9447,35000,3355,65390,18179,38774,60200,11560,2101,1625,52128,9213,36281,154,8668,36607,24501,30163,32874,15391,6023,31977,59710,2757,18486,21264,9472,53517,45228,30265,22894,43315,41501,39728,30526,43950,34207,16692,56541,40033,1912,53769,61159,5679,53884,38726,44008,57664,54626,58740,24982,34286,22066,44401,16752,19984,60563,45869,32052,4576,6327,62661,19231,23203,37852,41662,3262,36502,60186,19614,16746,9251,20981,28812,50101,45361,32745,30021,3974,39428,46880,36631,30496,52073,61302,64109,19483,60306,2707,59464,6358,27403,48267,52904,5557,13415,5734,52277,34006,38086,1574,24892,36080,19466,38052,39353,28427,333,14379,16078,40221,19976,41865,47024,19125,49509,35434,18764,13310,8147,50105,34293,42464,24571,32561,10633,63580,3642,5297,49488,38052,2859,33550,59146,43129,15793,16498,53349,51371,11273,4880,64610,3682,46582,56962,53616,8593,1394,22054,11528,25352,53530,26571,5888,56522,7810,18705,53098,50381,4340,53601,22151,59676,49958,35892,14042,1809,38830,62000,31252,41715,52723,39960,35147,63181,52424,19752,17567,31294,54584,6932,43333,33775,16237,35348,7011,64599,31231,41690,47076,26490,1345,39768,31304,41924,9661,29965,20673,57724,64426,52240,48989,14242,43884,21522,21158,52076,39552,25943,54816,33753,47990,12945,45092,15541,1915,3855,34170,36469,36753,51018,47713,17009,47807,15249,35405,37727,18368,57987,28111,14287,42633,36853,14043,44808,38405,44809,58181,43841,33158,49393,46461,1415,14481,4937,23737,26695,3623,1230,31000,32287,4147,32188,24056,45947,23381,31022,49047,62344,8310,41629,493,15876,37258,61207,35804,44068,41318,58615,17635,2882,19249,4682,60717,7180,37613,31490,21763,45561,53334,49202,42578,45927,40797,39422,60567,40589,38668,45824,16986,22134,7657,826,44684,26379,44764,59732,55462,9346,11806,41554,42440,3757,18600,757,12828,25633,2161,28633,44232,35633,52848,15319,14595,61545,33519,64649,48583,62805,14154,64175,46432,12731,41254,39199,14352,49261,58883,37995,33164,31047,50258,15484,15003,54219,50042,45287,4950,57985,21735,53003,8294,37534,18899,9376,37834,29952,33154,46414,25321,16962,3390,41839,4120,15114,64145,19484,25852,2019,14364,18779,45556,17963,7692,37373,31754,64192,62459,42109,25253,57901,21150,42334,30118,64126,29891,8218,25716,22336,33941,41058,65153,1323,27408,27203,63344,6930,40971,28883,61676,57120,21090,58977,32439,5464,24995,51715,58221,4176,36868,52150,21887,22487,51954,21336,26356,63970,33759,27232,27059,60949,33823,39587,33718,36377,8421,45684,40567,31115,14438,4906,19384,43754,49490,15445,49903,42209,22010,40333,2462,40699,50430,9303,53395,62437,7348,9537,36959,27505,20390,22087,58316,65460,27834,6926,414,41073,41605,36431,13972,25111,1899,29489,10953,47979,856,46827,40146,9934,33789,38993,23096,31442,36950,33285,35345,45689,42514,53124,57286,63921,43693,63382,38354,23180,60087,8419,9880,65388,38800,2915,26745,29604,42995,34087,4845,18139,25736,40475,59769,53530,41444,31721,29078,50786,39799,63414,44613,30040,53060,33044,49633,59447,59999,40671,31696,6776,18124,31238,55843,14117,49908,10527,26564,64230,18479,49946,11687,5589,6907,45230,27075,49333,10661,18192,28887,35572,55557,35378,56867,23638,19785,37073,25907,42381,23241,57830,40502,869,34967,28659,48296,6990,36135,58942,11331,14142,47192,724,20454,44680,16719,34315,13228,23790,12604,13603,41481,6085,8443,18658,63630,37484,13775,59887,36749,33896,6137,8709,25104,45386,42974,15812,42163,862,12144,15832,30655,3978,33350,28579,18063,49381,7211,31866,27394,29708,60316,52137,52521,62777,30687,53136,63616,15751,61236,22508,11228,35138,52535,40578,29280,25976,17382,18565,40836,41055,10516,58568,28405,60265,41149,58988,11317,35495,64208,1947,49837,35274,33414,60049,51865,23312,58747,20711,64164,61237,12601,20870,46611,50650,8737,58111,33609,36213,41739,25159,15862,60630,58975,50789,15949,20724,7188,34594,21663,28575,35476,50441,34443,16170,53962,23797,15736,45159,10635,13511,13741,10804,16425,14901,6021,21989,18342,39401,56105,43535,58147,38205,27556,47611,65214,4476,38122,51256,19288,41900,31798,60922,7491,10688,41332,61060,16357,8323,64878,47929,6348,36422,42490,51610,28240,11148,41807,56280,23011,30729,50875,49749,24138,23622,30589,62710,44129,12830,41493,15828,57021,6524,44123,53427,54208,28244,1219,23629,62658,52351,23252,43760,50589,18738,24163,12850,21397,818,59143,46052,58427,26674,38853,47837,20952,12965,31443,31672,56693,34678,44471,11537,57772,41353,43729,25017,39657,3179,65496,23750,31211,49304,24816,43243,64032,36985,35684,56631,34482,36906,64741,504,8738,99,55569,3031,30661,17132,56099,8587,45102,47828,10311,14969,14459,53815,21247,24856,9356,37160,26715,64518,1989,42523,436,39867,44987,41475,4332,42324,14002,61719,4693,48123,63507,16611,15550,31882,589,18935,64196,61684,17552,14459,47968,42710,15520,64132,39018,60346,9024,55228,43398,15913,10704,45181,36363,25713,43709,5400,3955,8280,27558,20890,3957,50794,8869,65390,8972,37652,60011,29125,13830,22087,1418,3140,65147,11353,16539,1141,56533,1123,32603,57518,16807,47086,54816,26637,37432,51302,29538,44211,38655,37252,64779,65082,46380,52920,40852,19098,15523,50405,16788,60710,2387,60275,26625,38124,11331,39937,7684,16519,41349,15840,61119,49683,42827,56868,8402,61639,30763,29946,57869,52079,34948,62452,56791,49753,53909,10618,11350,39164,31197,9481,27921,48422,7037,14916,22129,35883,11241,14503,60569,39640,22552,58348,22165,2847,56516,60591,51122,16143,60102,61829,41388,17771,6030,47941,2671,18210,23939,5285,21439,5869,37259,54862,54299,29165,5677,5834,39172,4543,8040,30934,14693,13810,34296,22389,47129,23166,18103,44321,35381,1161,4778,42842,22887,40864,11131,44666,4060,55305,41309,12114,38859,9014,24321,24670,40499,37883,53282,59331,14763,22196,51910,35082,53355,56576,5929,20143,63995,45581,1918,62774,11919,63374,48538,16967,37364,65313,37901,17933,22229,19489,43485,27818,43813,46094,13877,4819,31847,2401,8490,9267,39638,5665,29274,22695,3408,63670,21947,34676,48128,43060,58045,34058,62490,22009,42784,21803,33539,36052,28445,9686,64139,13815,3892,64708,7971,57755,41286,12395,38378,22008,43667,13605,12071,48605,21812,1160,4656,40504,10070,20646,16904,15624,41401,38807,41890,55992,39891,22485,40723,53381,60983,21121,37262,25610,47837,37798,44903,61825,50879,21262,40343,12168,27719,172,24943,14357,25890,51767,61517,1619,38773,24509,10973,2247,56958,57962,1462,13478,11497,185,11546,23525,4735,3158,59606,14748,59246,25945,975,12073,62995,47612,481,40269,21840,64458,41651,8404,53715,45169,47248,34904,48044,63836,36683,64037,2553,24273,60341,51411,36110,5405,5084,17243,48120,20003,5647,30738,56936,24927,47671,60466,43501,6601,9235,38584,45266,51596,24606,12540,55892,12364,62430,1791,5906,43062,40892,44942,20819,56340,60821,41593,10210,33130,22302,17366,63531,20661,25530,50504,18834,41678,62346,35361,62059,43159,11747,27230,62524,61121,18334,50754,13075,5268,39417,21089,41269,1582,38143,137,16748,24138,64423,48327,56636,3626,2818,2528,58007,41213,30149,2788,55800,51805,42111,11964,48316,20690,45335,47617,49616,56396,40035,45628,5445,49437,60244,60342,19851,57706,62751,2540,40008,65492,27684,38852,7806,54574,45857,435,43313,28375,7736,57845,499,8411,31514,21,14010,47460,26338,56849,30136,22590,7154,17750,16616,36757,60580,14063,49497,32233,40771,14489,5823,29427,53710,10307,13038,9571,36986,15513,24272,4719,40146,64546,55689,30743,62693,41568,9829,6646,22399,32695,58174,48046,796,1534,29773,14130,16268,65508,58169,19772,13299,63998,3458,43150,47063,2244,22643,21943,60195,8574,65344,27119,36339,27275,11992,53606,56009,4209,17134,26833,57800,59594,31175,16632,16113,36035,58903,33698,39797,61462,63686,41786,23781,56396,13417,47699,53758,11208,59041,13821,19313,35551,55429,9976,18641,21171,17538,17895,5137,46497,62888,3919,6461,64324,46848,7508,456,34817,42387,13435,1109,22798,4934,19120,8965,53602,16816,56521,53598,22911,45690,65021,7459,43179,27258,7788,32514,4447,7493,32871,39971,29242,4996,25955,25505,64987,38624,29844,58015,32891,37438,17821,15229,50904,59357,39573,30693,88,27761,43918,14839,37688,42992,46839,57620,52723,57331,56107,19297,9542,2949,34955,34383,44168,59177,13707,22925,46999,63178,27621,25492,47168,33554,159,21650,9672,45701,33206,33299,17207,14869,61922,36095,43286,5554,42478,7353,51409,38274,55116,20020,42413,4149,13298,58669,62180,16376,54962,43169,59344,48826,615,49035,4257,32021,39074,56254,14549,48822,23100,42816,54271,45761,65408,11860,27316,18862,21377,42741,51291,37363,44343,20379,47304,14959,15357,30139,58242,4557,60906,30498,61641,17578,31637,61526,58043,48605,23157,25803,9369,24004,5577,38978,6056,28132,42896,62472,21917,7540,8787,57395,42717,7430,26809,58406,29836,53098,52458,63221,45741,31239,28664,39239,47604,12435,23030,18151,54536,47488,41994,33240,28242,56870,21553,37809,55751,19487,1886,50568,61770,10359,33105,13651,18150,62962,18331,26649,48340,46639,4605,1206,40050,49382,60235,24475,52101,22822,31305,44327,25182,43938,23121,11318,40971,1666,15867,40608,23719,13176,50995,37961,64098,12938,15897,43351,46646,55391,3949,55546,1075,20173,62197,27463,46761,56101,55917,39109,54348,56047,51684,34268,13059,54470,37675,5550,13630,64454,59140,39324,53028,59543,19359,48250,59739,23771,18937,7684,55090,54929,45713,26174,39987,15846,33850,64102,16405,58078,62541,12053,45040,5743,30782,59590,59851,31881,56036,15718,17484,42880,38560,46884,4917,30961,49175,34864,42803,58520,43742,23542,60606,9754,63793,55452,62205,44510,29557,4828,61740,36834,59228,49102,2901,43513,2295,21273,9990,17162,41367,19083,57429,4165,16300,15860,25838,5500,30529,2663,9867,42593,48299,17209,32632,29968,48080,17772,49467,37287,16577,8964,11776,5867,27591,37768,6990,37607,7350,20313,59677,39061,40576,33503,48553,22657,54143,32478,2125,566,49334,53991,24658,5391,33582,30042,29827,17696,33267,60890,4488,4101,53186,2986,101,31712,31661,37322,3801,58382,31731,31517,19875,50387,17911,21320,14206,2159,13355,12821,4218,21313,19556,42116,50842,57899,48724,33525,2969,23739,54553,33444,23138,48132,63447,59241,65441,10857,39310,30468,53676,9367,10673,25770,3212,45781,45177,13652,4856,42122,4148,40468,37948,23413,57923,49385,12199,53583,47771,61059,2849,52076,44822,12404,22753,59999,12662,37504,15062,11915,17363,31498,49980,18436,44995,14837,8933,4629,63437,26112,17191,61336,24806,21426,5673,9217,41983,52647,23022,56561,35308,3817,10169,6900,27539,13644,57451,59910,60203,62722,31276,18562,58212,40850,12604,50491,1039,58843,21057,9062,53853,44926,34443,40254,1837,41301,26244,1305,46714,58223,474,8881,28194,47650,36060,14817,54669,23556,28853,53914,3766,65228,33342,58603,29693,41773,14345,44471,5445,27692,55989,63358,33161,52681,31897,2,7085,24196,56877,46177,55621,14531,15473,1541,21243,35587,50924,36747,1354,14991,28081,18403,40767,57420,27441,34941,44693,52191,35049,37409,19409,12969,44722,19379,3682,56275,48110,4699,16016,13191,22974,24171,38680,28678,1010,48944,10349,7010,27701,15433,15765,3723,41003,34371,29584,56592,45959,62625,42024,13942,15963,38772,7039,41419,60031,4410,26102,39903,52875,25463,12323,62847,22863,5983,24204,32617,45100,48642,65293,2096,42550,7202,44057,42029,52153,44559,44732,7472,26284,26783,12262,61783,37520,62817,38904,19889,59698,35356,9227,17005,50793,43870,61034,42141,53067,55085,38530,21920,43336,35085,22711,39648,18020,3029,57124,22583,35792,233,33276,4464,43794,37754,13040,58634,4011,21574,28155,47306,49387,27993,56775,43825,6815,3041,57161,887,7639,11186,41514,57358,8462,24239,50651,23498,15337,18042,6276,13017,39442,33753,5500,12126,45261,25440,42645,36470,36350,57015,6280,3993,36307,8732,3971,15183,60265,47575,50795,63628,36168,35824,58390,35551,25345,64379,27827,2639,38737,50249,45739,41326,40800,8985,44760,59984,29797,41686,34842,31148,18436,10770,5955,28272,52201,24973,17113,31108,36270,45096,45449,14246,36152,28414,40334,10901,60129,56140,39114,38034,6002,33962,57245,49644,26849,2654,63540,13465,31107,19284,37891,10951,44384,2806,20722,64700,63397,18463,8327,22478,4978,16104,59747,24232,34231,56259,24121,27266,27500,38443,64453,30293,26346,161,23556,36604,5835,34554,22307,34740,48438,32956,58687,34639,31438,29761,43967,43997,34630,26153,61329,54557,42727,22435,20079,23610,6265,27533,37079,57902,41559,5529,44971,27407,14535,15961,3728,54060,36541,57265,11401,837,40070,34591,5304,52018,21625,63015,13926,40090,25440,21425,20325,33408,13274,31309,44952,50753,53692,57568,45801,64674,4527,53400,31755,39377,13423,27692,2657,45633,39005,16684,12163,36223,6379,33654,10195,18489,23945,11299,54749,42433,14057,18978,17414,51040,16392,41070,42860,59713,4615,43095,21747,48624,30663,17165,24456,18047,57299,37455,13217,54794,41754,1936,43360,39482,38444,9340,58910,25342,2501,26369,6579,31405,45496,52254,58745,42065,1708,14294,7417,28095,7206,29225,40630,13775,37443,7940,20942,61189,32992,49198,45957,18116,536,27789,40052,8719,433,10211,23904,4062,61854,57848,32177,17417,53601,43541,52529,15936,45921,65127,19468,29559,37777,38066,32202,27362,63290,64939,28043,35054,14551,55443,19577,49932,2933,24686,25782,24814,23956,6315,59054,11507,29735,25131,7004,18478,24767,15211,50061,15642,40884,53178,23232,6094,57667,43648,31030,17956,35525,46033,37212,12432,48064,38250,39632,42804,21913,18928,5721,15916,40657,11689,44895,20742,56786,41778,11370,123,21272,56775,10922,10059,49510,24683,35038,28064,41320,28645,39551,31002,54911,48044,49653,15057,23887,20328,38621,16790,39011,15601,35725,50607,4202,39203,2098,20754,51515,30194,51321,46245,53409,29293,32021,25926,6350,327,58252,34370,10755,16058,2729,23986,42118,3260,60297,8523,20993,50928,65121,51012,35497,60142,17185,41583,33443,23921,6827,54347,34360,56442,36363,61383,7559,2227,7663,37897,32173,11905,9889,37223,35205,49304,37595,49645,44448,39774,34849,30144,6089,24262,27396,57264,10681,31992,5574,329,31860,35331,54507,42353,47811,18880,49717,38126,958,15326,24931,25685,63405,7115,20473,3891,7728,8931,23849,20718,28894,21105,34862,25084,51602,6084,22718,8991,9827,43386,32666,58495,16573,19823,48342,52346,38041,54941,28321,46427,25467,28761,60612,45300,58678,6912,48761,13320,21223,28462,15666,1865,45696,23180,7120,24326,30650,20003,41100,45478,34075,62901,1021,51040,53610,49679,22036,58291,48418,50409,43945,26879,4989,52558,39397,46724,11014,25021,56245,26269,1211,46263,41572,18998,42098,43941,23163,35044,53588,40131,25752,46885,2907,21643,30668,42487,34480,664,20188,33449,7028,33557,12476,39291,43837,15403,21150,22537,53178,12256,62085,64825,47853,37105,33094,21456,10352,29170,61795,58700,61047,62903,36958,39178,50876,9711,7922,27284,59043,25225,22845,33034,64029,20869,45330,17464,49637,21274,61809,9361,28093,21142,59370,26282,65178,10876,59974,26256,62898,13340,11451,53544,7865,40926,64838,31859,28927,17255,27740,55846,27582,15998,7837,57606,7687,49676,11317,28847,38087,34713,19168,15287,39920,32764,50525,46078,160,49009,4173,46900,49839,60812,614,63250,22803,5032,44691,36030,31127,31641,28363,37554,21792,58222,53176,17826,7772,49423,1638,23027,48313,12522,44895,65097,24382,51059,36717,61773,45882,49583,34524,23617,9589,57973,8708,429,38656,30395,49388,52618,1854,18672,19564,9359,24921,60632,5831,50113,25739,27498,32117,54642,35214,46163,17413,64036,6111,11625,50525,7351,65494,16216,35489,14282,39149,39912,31274,17239,28846,31690,4006,8186,21764,60336,27750,9143,7824,27640,14560,61249,51521,5811,9078,63112,23430,4945,10779,30076,42664,26615,45636,41400,5024,62386,8416,56292,36502,34293,64731,1347,64868,53126,22432,38737,46586,29866,62379,61590,57295,12867,13088,52679,37805,8305,17535,58307,15698,37685,16638,23239,43419,57472,11004,46971,52133,50272,17467,313,552,7992,17665,63587,21819,347,40389,26825,45887,33166,33135,60508,55553,7415,13499,13456,52239,54736,15413,47074,9120,36731,56870,32324,7843,7255,63483,26015,39295,14155,52793,47344,31401,17188,47510,50059,32534,47342,24562,19140,44871,43377,29014,56039,17714,1935,34460,36218,52418,28596,15774,1172,22048,32999,22865,45259,9496,24282,41498,57308,6827,29291,14891,5436,4090,44331,49259,18235,60556,7288,62061,50383,29088,52802,15155,9196,33721,11126,21353,63784,36715,36352,51111,13796,25407,33687,60764,19441,31010,18525,55241,32175,43341,59001,40053,62704,16681,13848,59179,43571,11000,50146,8354,38624,33424,18792,11378,5872,31913,43157,23738,15346,22568,60347,9566,11396,55642,14508,48088,22478,14634,21965,40847,51942,4244,3369,53395,58518,60761,49378,37,4954,24787,49068,5076,60452,26437,40140,28346,54867,7995,24737,50328,46333,60761,41048,25522,49478,50417,43371,22582,24052,28293,42417,21910,27839,36704,30969,28392,14141,64380,12506,33255,44555,47483,42445,14803,30628,9968,24674,40478,36567,27417,10792,48418,26944,60044,9197,49783,15165,42644,295,57650,27374,25070,15228,14389,37180,48180,40235,15582,37076,54328,64136,39189,21672,55273,35120,48640,8533,19169,46425,31369,25102,64924,56474,23329,21834,14185,54160,64650,61568,17988,14441,62228,63044,11062,64681,62254,62298,18409,31282,17627,43085,34459,52617,22482,41851,40537,28526,17045,5378,35498,55308,27667,12457,16599,54261,29572,26380,16454,8925,10274,56100,57936,54543,62298,22256,22719,10096,1768,48653,39265,56015,16420,6262,12290,12691,10353,9347,51206,31388,28976,29518,63581,15126,31551,49330,15506,50560,4518,56567,38551,63483,1219,46795,37592,46336,40813,1909,17997,53265,28536,52976,6816,35882,47142,45694,3227,294,41942,19403,57245,41787,25020,64633,45122,44099,46943,4109,33128,51544,7003,29223,64238,38694,59368,15069,54659,56170,45377,7876,39521,10562,49090,24567,18493,1878,39936,23841,60174,57920,44721,5369,5259,58747,55825,2565,37597,32031,58219,24752,39268,52371,60709,19191,44209,14472,39887,53675,48064,29469,30968,25462,17520,50539,42509,35049,41080,18990,58814,43655,13717,23595,6254,23543,10219,15488,6738,17267,23443,36158,16409,27622,21443,21519,35415,58664,38372,13684,3924,43289,36654,42266,46081,34115,28480,17880,10033,36399,32616,59809,27921,34404,14528,22800,6066,7700,17080,433,18017,57139,52523,38586,30648,11155,3226,18805,11280,17319,60703,9169,30543,46872,26326,31955,24718,4220,1303,9191,54374,12137,11069,22867,20625,26648,54021,29087,26131,51296,60587,23136,7660,55724,54041,29753,46441,18847,29747,59158,48762,19246,32532,11056,10920,44154,47346,18456,7430,2676,4070,40936,3260,24418,61099,43427,299,59185,63481,56809,30151,8413,35808,24799,37958,43302,21100,15274,30129,51884,64193,31567,3795,6664,54078,53622,35255,44784,47988,33908,45370,4036,10404,21056,19334,38904,43576,50220,40300,62507,46354,26494,6667,7529,47432,32421,33367,7897,50307,63373,8257,39663,25102,42075,7571,29693,4287,16355,14484,35070,59966,58213,22914,43995,4243,28201,9563,9277,24048,28763,1874,55198,37421,39673,46188,60905,1272,13680,15957,37598,13480,60847,16784,3956,18110,2197,7947,22766,14547,45549,22417,27900,52552,61503,48577,26470,48525,36682,42044,12366,6446,17511,61777,6988,4699,53362,49886,8343,50464,21023,35974,8024,63265,63953,12479,32855,32768,59626,17221,20258,36060,64779,42602,42584,8525,2490,65216,44496,15056,55424,18879,8790,5104,54758,16787,22656,11420,552,16503,22404,10061,35496,47332,48919,37660,55459,37248,58150,5000,31623,12717,56457,20639,12198,5465,50571,47092,13100,37778,32756,19580,2586,50341,28497,39259,65127,37997,54381,63175,32297,35387,17529,63087,29271,28241,33167,49187,6731,55019,44184,32784,61645,14546,37101,41024,6659,2461,7345,4998,10863,36652,5541,49856,36191,30145,31971,22034,9428,15810,11911,30904,4324,8104,14855,19651,59916,36082,41351,26568,56311,39812,56434,65185,21314,44908,33170,63714,9200,24072,44433,27040,4224,30219,38681,39746,50245,43485,24496,49807,2251,25511,37542,58033,33669,15658,13215,6707,32092,4724,33863,26516,4648,47965,46877,29278,20717,42552,40127,41621,42650,3519,65204,9795,50393,34118,17559,36385,35524,22860,41834,40522,17062,5181,47834,4147,60903,14440,33964,55812,47438,56741,3894,14647,22861,53265,16618,27356,43468,11815,46364,5111,22221,51649,57187,19693,43689,39510,50556,37780,47384,51960,48471,46694,37451,37145,35471,20848,32933,19864,20945,49865,12336,30723,18105,8114,8741,5007,36919,46921,13078,40523,6545,22210,60616,35937,55732,27999,42958,28800,39622,38105,17631,18463,10645,30706,44839,46236,28087,30854,28633,44962,64079,60608,62070,54132,30511,27880,17563,54489,15723,65431,421,20110,62291,18388,34404,24363,33665,55457,51670,25478,19067,547,12448,36507,14827,26951,22451,63897,24799,26480,25464,16702,31103,21462,34097,10901,23009,31215,7991,47980,10332,32499,35823,16678,65147,55200,65321,10668,27461,15640,13319,9562,15416,30836,50640,15626,19885,47841,35445,62810,20469,22040,17164,15731,62172,59676,37526,29556,26846,13597,4080,8940,25571,22020,23337,47428,26179,2146,21671,57940,14379,32028,28189,32879,40324,47343,53545,57360,28132,26622,65468,37696,18877,35640,49226,63751,47181,35396,55085,5534,3589,15617,6227,48171,42999,55191,63200,25056,30540,11293,57161,51464,47345,505,26833,65370,50010,58154,15148,10090,30022,29317,22813,51546,61744,14191,58375,39736,22270,44675,23065,30629,56114,21200,24265,32273,63046,52592,5816,35526,14038,4559,52042,49323,41675,11595,61321,20217,830,59596,43545,334,46728,56736,56223,7757,19245,56073,15256,42262,41654,31193,13751,4269,38103,10850,53315,2135,25578,38193,5558,2454,30425,29446,27083,45623,23475,52845,44035,11703,65198,49870,37010,14604,56270,7978,59208,58787,59774,12732,32837,37841,9392,28455,52243,23776,42080,36338,24396,42847,36301,59346,16970,26904,41938,33659,6886,54863,64805,37945,36207,17110,46652,33509,45730,62833,8892,26701,15562,20742,21070,14086,14602,7342,49227,55793,52078,16724,23452,37596,51002,30762,42322,14845,140,18890,36703,41234,27148,38524,51445,39382,63259,10697,20594,44565,46880,12051,31236,2987,33779,9437,60557,24198,15653,21548,37288,33928,22777,15316,17385,48349,44966,9215,45334,23374,63317,16420,7685,3193,9622,24500,50365,42295,55936,61109,50654,16965,17243,23201,6210,36715,58007,48125,48994,56952,61887,31228,12932,6358,56246,65214,35480,7562,36039,31129,15650,29276,23419,40287,4462,31273,6385,1622,24505,9020,61961,16291,49138,60163,46473,25578,42499,23757,15735,12783,29315,48228,12354,58792,13103,7668,45899,6369,48637,53933,3229,17152,26044,45094,14168,11344,39862,35713,4275,29185,30879,38537,28193,20766,16667,2971,46647,54448,33212,56798,12303,53192,59334,3874,46278,34409,21737,45808,52487,19648,15671,24155,16770,7035,50500,40349,32838,57240,25677,16890,23743,45674,27759,21834,32695,16049,23424,34630,52345,53469,50226,53795,27888,50214,38337,32698,62121,10817,31200,4835,56111,24239,62819,43172,46667,50756,30437,10244,26699,8042,50593,32133,1424,13503,5246,61030,582,22052,4658,47038,26270,47544,56087,48588,28515,30362,65192,2956,60969,1274,1749,52049,64902,37471,28348,54356,3434,43966,11566,17930,20253,54395,23500,51981,53819,50433,38178,22680,49900,32774,63657,56522,23637,58605,52586,50950,1229,15732,23798,29737,58152,42886,62710,45318,28625,57476,35159,63542,36139,65226,49296,49822,45430,31761,55481,22985,19762,54334,10407,64431,22619,14439,8665,37668,60876,13896,46008,36756,38849,61017,52913,3188,58718,56580,46220,36325,26606,11082,22685,30005,50101,46600,55971,29986,12173,22643,5368,8246,59987,36778,40609,14586,32840,41235,49015,26844,27158,31690,1937,60195,11162,62212,52283,42810,38587,47523,10438,16894,43595,34001,12041,5845,13066,56264,64503,25752,17116,35274,32719,31134,30862,37059,58396,61991,53399,17172,31923,12370,34466,63738,14650,27366,53741,52111,22861,49756,55581,33585,64440,42587,47534,4444,60926,62068,1834,62707,55652,24782,27133,62725,24506,27002,36921,15318,50153,769,21991,49751,21303,22069,10732,65242,25383,7749,4976,1744,14595,12136,19672,53153,25998,45352,22578,65294,39700,26228,60063,12473,17959,42880,36225,5443,38203,43438,1524,7161,16403,24154,59856,43671,35279,28258,15376,60949,45538,18847,31210,20452,8383,52276,19823,47384,2882,56254,39755,1939,10456,59919,43821,38982,19781,34046,64918,43700,18899,38634,48872,14900,44741,2573,35282,30659,40352,20286,12901,50889,4003,32034,15667,1076,19491,31704,4189,4999,7414,5540,14453,63679,17256,38379,65042,12970,39942,6335,57089,26879,61779,8203,30700,51511,49526,59143,64746,11479,12503,49581,62194,12326,53705,3135,31792,16440,20490,45929,18260,55591,51760,63977,37869,47479,16858,31373,31287,10343,5471,46765,58609,14063,43666,15783,6243,50286,62769,48475,6965,10303,9390,40081,42078,31680,23921,7475,59385,20778,52650,16534,29438,44129,62843,28552,53468,26337,52933,23762,21028,17087,7345,22020,22090,47041,26891,56567,51725,34654,29922,16678,29169,61960,39451,36098,36200,12643,47837,29817,13887,541,18249,37320,43541,36120,36102,4586,48575,58602,29398,40282,33178,22199,43559,10712,63413,45489,48548,60923,38122,23003,6761,25381,38568,50882,56118,38188,9593,37030,13528,5498,48874,44742,37847,59954,52657,55400,1585,23411,28795,58612,15476,41432,18659,49238,64609,63107,59170,41659,29481,41682,62512,38496,59867,60078,14557,37492,21457,50425,37884,8201,2923,8570,17960,20619,31051,40390,14162,24613,13645,37740,4739,51123,47758,60163,62673,973,781,22660,21819,33250,46348,59643,32544,27890,50214,38886,64646,43499,38426,37802,1830,58752,36133,20225,44908,15884,20378,47296,38864,56049,8081,50700,43685,4344,53483,13623,19995,47316,50924,65315,28803,34720,22121,22540,62943,43048,45522,56365,64850,17625,7918,24622,60988,54066,65336,31149,18796,4018,40922,33208,15516,48557,95,20733,33407,25163,24137,10957,6768,45836,59408,992,32074,13490,35177,40796,37103,41915,41047,58739,49441,34018,62860,47638,28571,11114,39568,10415,39665,9148,48207,19764,9762,11445,55489,10376,39976,11974,60759,63045,21673,12931,49707,5240,26904,64704,38776,14610,53375,17035,39121,54883,30829,28844,60411,48981,17571,9824,25774,56296,42024,51966,62158,18971,50145,23837,10727,4239,21888,31595,48240,13090,49030,11078,56978,21977,2299,50245,17640,9546,49751,41552,30645,5895,44052,22738,7120,33686,47,51413,9672,18241,20841,9016,8472,3305,46900,50047,60277,29453,45551,29459,36141,59689,60199,50896,54294,62572,44110,5507,10249,51379,22623,63983,28439,4277,24828,29481,16849,61286,30697,37664,1827,22963,63619,62731,64308,27923,65403,7202,9479,4649,60709,16341,61399,11581,63498,26767,13617,37194,15983,39367,18410,41138,6839,50483,60091,27899,8850,10598,63130,21158,41970,7103,55994,17308,40062,3347,32465,8253,35805,18349,50631,23511,44960,55589,59217,16798,45077,36960,63653,10836,31919,53669,64401,58458,25624,42262,55819,30004,49239,14442,61600,35097,64777,44619,3338,8434,7893,27672,62528,47473,14853,33253,3945,53771,8108,32188,10570,45418,20750,42572,48491,16139,22137,5967,46874,23902,53757,34943,45914,26438,35371,51718,15586,58808,53832,29544,31028,2221,47243,47887,31738,52394,32917,16451,20643,56483,26150,41399,60664,16198,35227,8676,13032,55474,1976,19784,22825,40208,10885,27411,26057,31163,10626,28414,36408,37586,46020,21036,51704,55894,57363,34297,49661,60959,10923,35495,18992,62855,21215,55500,44546,54134,54675,62264,60753,53220,13344,36150,58956,14352,5368,34879,29992,26904,3206,8354,3435,39783,28991,28993,56430,40270,33312,56738,42873,58948,49402,20241,4967,39370,14376,26957,34859,56532,9820,14016,28474,63765,29409,16547,44138,59090,55599,11355,17305,64725,42830,30736,17210,135,12504,46425,11182,7550,52063,10237,39380,3517,22420,14043,51760,37012,29968,673,21749,11821,15961,29052,1926,39423,59888,2120,42645,40230,57605,48648,55241,39688,58139,22898,40498,48581,10611,60568,31546,7493,37959,12849,28795,43700,55887,57285,47197,19566,55854,6933,8757,53643,19901,26577,64715,27888,63237,26978,16860,26856,46134,15602,13209,2681,58744,62346,43830,35080,7229,18118,57480,20158,8143,16322,50106,30855,63769,23346,4295,37890,60513,53256,46808,39092,15512,57971,24346,61342,24343,8921,51465,47944,57151,29907,59376,18882,34733,40790,33023,22131,5924,37795,10915,15185,35967,36918,50331,12039,11497,41914,6601,20918,42298,14322,1187,23100,18874,4365,60468,16707,9817,9727,1321,28114,21010,28183,46225,5479,58778,32808,2228,49207,20258,41377,53703,24875,26764,32641,31195,16367,18942,42377,44119,52074,47450,893,3862,19476,58011,64812,51928,17576,2253,56695,21637,65009,33496,45344,26686,9320,12890,46301,12872,26145,29213,12537,39889,23802,38937,28378,40952,24373,1943,45695,42496,44950,52491,14411,7201,6709,58369,11705,55940,37946,31384,47041,52121,29778,3013,2959,27702,34384,28241,23961,36694,28116,11425,49898,60738,3330,20312,55998,53472,63293,55751,44465,57243,37336,45133,59439,31372,27729,13711,13705,8109,41861,64627,48445,26385,47208,50349,39912,60503,3903,30405,7865,43640,8599,41860,27004,2927,5365,20349,51279,42171,17280,17142,34250,59417,11010,13611,38140,48435,11121,3443,33024,37432,7119,32552,40176,15227,3059,7416,22366,57609,12168,47215,48108,9043,60746,13796,50103,22628,44610,33385,28081,22226,44899,55413,10985,47183,23192,32233,53558,50673,21770,58585,17524,17018,45632,21116,42744,7867,47133,40988,34565,43134,47503,8808,56014,6996,34333,64331,59187,18407,6189,11759,32777,30136,44931,21403,44502,28826,58893,3170,38316,18842,29312,38481,12913,11880,63656,22624,30314,1975,30367,376,22621,59748,35751,17820,4737,5210,40590,64471,2299,10065,21028,60428,63535,37261,49768,55055,58941,3319,50575,60237,60290,6899,9034,53170,25420,25534,21418,38544,2882,4816,59477,35105,47598,39837,47420,31903,49421,3332,41169,49594,29061,11195,36584,38133,31624,51333,60276,38967,58343,18019,9421,26213,19948,52116,22386,28659,60405,61580,37391,33678,23669,8550,9389,55044,36912,25219,31401,9186,59462,1615,28224,35542,6620,51527,3507,3101,53172,27090,50555,42812,25885,52642,37958,29550,51634,36081,33873,54372,41779,58124,20962,61619,26934,42488,59009,22621,15432,37608,12743,10942,6106,56696,40318,64554,45286,33237,41431,64327,29641,11105,15571,23805,21604,20696,9024,480,46793,5435,41003,4975,29297,48702,12189,1123,55485,26020,63433,50157,53048,22960,62250,5016,31063,9853,29889,76,48801,49850,10095,59010,360,12285,25514,19750,27491,55147,3255,35855,59359,65429,21019,8596,9924,10083,49854,56484,53485,37448,13288,58213,53908,14418,61619,60664,27561,41512,33614,1267,21531,49079,58794,7329,13015,52230,53988,3079,1298,17292,8228,41881,4248,6655,43452,58464,45463,64964,60465,50535,7351,44785,60232,29970,42961,19762,25374,27157,12311,13863,34527,6554,55105,16045,14127,38609,17279,31427,7950,743,15301,28709,53984,58031,51659,23170,5638,11575,62143,15866,18653,60488,31638,64989,24935,45520,58878,29352,57943,15411,29911,43609,47474,10210,27440,26089,25427,34526,34281,38267,28737,48921,56712,14813,52427,55804,30083,24420,26233,18597,50687,8460,12313,26019,50021,47987,1512,58932,31940,63299,21385,46051,59139,1919,54152,14713,60923,60203,47217,12853,9591,40199,20581,22373,1812,28729,22916,55479,63036,42047,62780,39217,16436,62544,31330,53138,11529,28623,4503,14985,17640,34006,42656,55076,9063,52192,40221,24372,1470,13516,19293,37096,48621,65107,37886,24984,49443,64075,1746,49934,7472,43629,26848,11267,20955,26996,55704,12904,50647,45613,14349,42296,61117,13693,10301,60952,57285,9161,51096,27772,36080,50755,44082,27924,59889,43763,41517,40072,3892,41631,57273,118,21539,65220,15277,3064,49903,54790,34261,29653,30587,21313,46143,52417,59790,54606,13031,33302,32926,52642,54378,1779,7779,64099,13361,40531,65396,2508,7941,56477,15426,7406,40060,16370,39884,21323,14621,28193,57962,33435,61907,17844,35990,22434,45189,59826,54010,1965,49900,59882,39024,58885,26874,54396,49892,46209,28575,11593,43690,22717,42988,60069,27926,56450,9872,44509,10487,51023,45462,48619,54290,5768,52626,9584,3537,9831,25550,6557,27385,745,23287,36244,45437,13945,14295,4722,47004,45379,47226,59768,7409,46429,3006,260,50290,64089,12751,60397,30287,1876,17044,31509,41796,15424,14138,6175,4107,27598,35595,19781,27329,55670,40200,3973,39904,9587,22135,59327,6606,17916,35069,30640,31080,64308,30918,38373,39340,54743,35707,55737,40494,42991,21851,57095,50502,16801,58772,37954,38612,54347,42418,20635,33245,14305,54995,45290,31287,19043,2300,53786,57073,59171,62628,24490,11149,61025,21495,21665,39949,62037,58185,43069,25724,84,16416,51038,61028,55297,58581,48262,40274,47954,64780,604,751,37896,36030,64650,16575,1021,15665,60064,62385,20954,34938,42411,20978,19527,61055,35140,60453,59735,16020,15169,46561,16742,56748,20050,30997,52157,39805,42765,21119,33926,17421,28077,16986,65417,52762,31939,62556,9825,40050,32161,24256,3639,49236,23251,35350,14231,23902,13702,2986,42432,18041,3949,61312,61540,26441,64404,7562,40337,43752,53204,35683,2905,5077,45966,44288,50850,56844,18425,11155,50584,28095,42872,2448,18423,62632,53412,44373,34394,29406,56982,63698,30930,8919,41434,43487,60867,64398,42848,36812,21980,45450,3839,23962,52194,54113,5083,21743,21929,10906,61834,56604,54517,6893,17836,11462,28007,30399,25349,17665,49849,23613,23585,49472,41535,19358,41820,27200,62148,41607,26368,28554,9831,64174,21977,24437,19437,13509,48786,62554,16915,50671,40913,30882,8684,64285,63644,28416,19582,53121,34237,49533,39354,23261,59371,62065,30228,18901,22651,28204,33508,20850,34246,7527,50239,7365,34568,35611,47605,11119,9059,43455,14556,60682,34606,10730,13830,28249,3970,30772,63835,33051,5287,56256,7874,36605,39808,7056,57333,16693,55447,61159,3240,29764,36438,25470,38751,43385,8521,42627,65225,10277,33951,51871,6970,23065,36567,17904,25525,49498,65075,58799,51153,21884,15816,22827,43114,30970,62143,5362,6313,9152,55014,24460,3460,45612,62768,64232,51094,3522,29803,34790,64646,14901,43148,15017,979,44613,28350,45861,26759,18310,31361,38631,29298,31334,26731,51496,55880,10239,40889,89,33586,28145,22536,10096,51436,28774,46648,51301,37520,58734,16143,1790,30070,53378,8767,64685,57732,53368,32249,23814,24372,36334,46409,5633,29114,12961,34849,62758,6179,56972,8671,14033,23016,64361,37721,7658,41549,44426,46524,38074,26897,7216,63799,50633,30903,210,64791,62291,17046,39185,11859,55736,55502,55672,62906,59223,29900,64501,25826,10011,25841,65056,53909,37003,57292,1017,26349,30186,15929,26484,21906,20300,8043,33163,41381,27656,17845,39992,59331,53148,37114,64413,62036,3132,64301,20861,13453,30095,29006,29046,39602,35053,8661,16086,2623,19814,24985,63019,60528,61144,37747,48843,60950,18365,32752,27492,58718,7948,65394,8284,10348,46713,53065,50000,50170,2942,13288,30927,19436,19360,10194,44263,28821,60494,17736,19740,64533,25744,19937,5622,42177,21430,42874,57910,44128,65319,14029,60845,22510,22796,39607,32680,9323,44845,34341,53712,5445,12934,49714,19965,57347,12557,13884,47449,25412,64430,59634,2781,59813,22986,63348,34133,47236,48646,37787,54976,17199,16651,38072,4523,15994,22747,61717,11265,49328,46967,18880,8580,50507,45748,25220,13580,20922,52234,58372,33178,12036,30478,40834,45447,40218,9059,45318,65002,43324,4090,41603,5019,50830,40985,58343,34979,32377,48843,61898,51744,8281,58696,237,28379,57457,37508,2271,53445,5574,20536,48625,34052,46686,4198,62802,36929,17002,3825,52405,406,62448,59254,6966,45731,51441,62400,32747,36996,39432,29420,32545,22610,38195,19073,2234,45218,63164,6124,45727,57290,42562,13213,39464,64110,23377,60575,11527,52021,48128,24264,18690,7812,60442,57409,42082,6978,8276,13497,42714,27145,19287,11253,46557,21842,20350,17084,30153,35897,38189,61996,63528,28802,2998,57590,35010,52082,55958,53158,54744,56712,20727,43339,50784,5565,42103,11209,14767,47759,30918,17867,49726,41472,52345,16389,32085,59574,44503,56071,14334,17434,14507,18243,62340,34633,46628,50676,18955,64383,42355,17345,11272,23498,29002,46469,62064,458,26383,2280,9368,3002,43713,20071,21016,3959,30612,53327,14541,34392,6681,57835,12449,21237,19683,26959,2763,32260,12731,31740,8562,39975,33540,10604,45955,36247,9591,53020,25961,11085,37188,63644,6802,27237,48883,7678,65394,2028,29165,6536,41162,58231,58916,7898,16134,18213,39932,54661,3831,60235,39868,8107,48510,25903,10683,54898,57355,41844,58115,61440,12334,45607,34486,28337,5263,64862,49271,43691,10079,2011,51616,12245,48748,51550,28603,47549,12544,17103,22721,29828,5276,36625,59061,26852,4914,59711,63238,21391,6636,10064,48330,54863,20022,4496,27203,46527,19525,56847,20969,38264,25964,30988,64569,26265,39888,25718,5773,16462,23203,13104,6985,23655,3979,32860,33780,12890,4361,62091,63442,29410,36516,11250,18148,42478,25378,54222,13591,21484,50332,54796,23588,47377,36123,23418,24127,14545,11241,39007,9689,44066,24174,51785,38877,24493,39100,35539,10733,19211,60258,20331,63119,60578,38910,28429,53805,1803,30188,23128,62479,61665,51685,48254,38539,55005,7783,15857,63046,36929,47567,1569,3317,31360,12502,33645,22201,50171,27113,59458,1967,5184,61529,18655,47596,57762,45320,58981,20817,51690,36722,48395,28347,26139,52727,39495,54536,3042,34668,49534,39874,24547,24385,65339,16522,59328,29890,20214,29889,21380,60960,50234,17876,6389,41493,42091,57881,32930,11467,22806,23041,50147,18059,2498,38257,7871,45586,30308,10198,51262,45812,60792,6922,63916,55498,34702,21017,4492,13437,22687,19121,40509,14942,52690,645,10337,5870,1929,48610,60251,40621,20519,41574,18862,51048,36281,42278,53944,64724,21825,48751,61903,64166,39649,40310,15140,55719,62623,15408,11767,60323,8826,25450,23204,44808,58379,36572,29832,5537,48169,33155,54568,22679,699,5184,15744,8657,18536,3281,3499,42937,37049,25743,53506,58889,32908,23743,41576,29136,62129,11342,48337,64352,56296,1802,10467,62793,64067,63229,4302,62463,29904,6979,29515,65456,22999,40491,25432,22900,58135,53377,10245,91,35336,22098,49577,62608,55573,12187,4479,21722,46988,7181,65260,19585,61079,59069,31918,9544,12363,37461,2469,61145,47248,14878,25645,6265,24421,55956,17192,29753,39616,39609,22465,28700,43487,13118,18939,17947,65386,27910,34766,25665,12889,57031,5696,61389,60785,63009,8189,53278,17339,16288,812,57071,24889,11645,18793,48081,17789,43728,11344,20073,26025,4592,60084,17669,25264,5960,50099,62836,40546,3618,39148,58227,52207,28933,54835,23344,38345,41379,24200,39452,907,1909,28794,34095,662,58744,42767,34903,40963,42447,47529,36809,58459,15273,58028,5895,21825,40824,54121,61243,12759,13165,65516,17533,29023,51419,23935,3226,2953,3992,64227,24017,47817,37504,38610,46935,41553,65130,58075,14617,7207,12430,58828,563,3689,16619,54809,58847,48533,30233,18695,24379,897,48984,57839,13020,44551,47406,45168,12133,23885,48692,50584,46122,43058,60191,28456,62594,47147,22985,53490,26664,28059,56115,19726,23722,33000,56300,33436,41417,37726,50707,39198,35729,30496,53867,1603,44624,44426,2560,26044,13183,1420,5315,5187,17227,283,63398,10968,57599,64826,60886,41666,11024,29946,34071,10640,37831,38205,59478,45540,48227,9592,48540,32509,201,39810,4191,63823,12451,11592,57706,979,28519,21213,27820,44648,53276,6934,57153,47411,48373,58737,29771,6796,58878,48023,17141,19349,8605,2412,3502,31661,62089,47684,43821,935,14364,25118,19463,7919,38561,54181,32774,31466,50462,5790,59322,27843,27939,30497,1915,15983,38839,39080,12425,5334,56888,36606,49389,27095,58761,57868,1676,22193,56670,1468,18606,59153,1462,44493,47712,7233,51877,20298,25960,8322,45723,34631,35317,30076,25557,20947,29137,12924,1478,27732,38341,56362,44502,63362,6758,27472,52532,6013,17787,27444,57857,33847,62752,25425,25597,5663,9256,46114,30778,5090,32039,29386,27869,4502,57757,60508,62532,50618,55906,49647,18203,56142,61703,9668,29477,47744,39202,26072,55012,20613,8536,61875,15961,58036,33466,28688,57145,61725,52399,3443,6618,11129,36412,37571,19797,9249,50023,44796,28268,61674,28946,30375,5009,23360,5094,56682,52469,2772,40549,4060,9940,63110,7982,53359,64043,40442,10603,4029,6397,40015,846,49637,56619,1817,36780,25069,34421,38196,4331,15226,63476,37562,36361,36662,2625,46900,18487,47891,49985,326,30467,49669,3566,56946,34484,44765,35277,30348,31944,42164,22852,212,56960,59149,24138,15321,33402,49870,2663,47106,44071,13246,34039,9305,35492,51381,59657,5835,52986,65529,30333,63564,1154,20284,25871,38617,8178,21812,24991,17067,10882,61282,54543,42625,41386,3417,19448,49841,12583,51892,7835,51682,49472,56419,43141,38419,37319,3833,25163,10540,31874,59171,28616,26245,43374,64840,18169,35742,53273,765,14219,9836,53277,60183,51613,54814,46116,61950,32315,2274,64930,39758,32894,60897,12804,10342,52566,55866,20099,60222,39740,40634,40550,26304,17901,31730,32480,9469,36882,25333,20634,39099,61457,30016,36235,57835,47835,63569,58076,37835,52744,8007,62153,10985,46128,5438,57292,620,17668,56964,57209,42110,47691,12434,63349,45424,1992,20181,5821,35546,27461,50191,20434,49146,45777,50960,4656,584,27768,38531,52909,57157,27192,23771,28614,58706,32997,41566,62837,62469,2370,1522,62367,11386,13879,60449,33586,39479,13333,52904,30716,2112,36682,14436,25928,53213,59898,25074,39086,26169,27916,23135,11939,2992,60895,33620,7876,4401,48858,42727,14685,40213,63838,55636,47845,53725,48804,1020,57372,14777,34459,2913,39013,28338,5674,12584,56003,47657,18935,33428,44183,26614,48322,9317,39312,33487,34137,63592,364,20212,51466,63465,59717,63912,45256,58972,27889,61286,65450,52732,19217,14196,54724,20855,5457,50082,57017,9336,51685,47481,20440,63333,49847,42510,44431,3612,18317,11707,14420,6134,63988,26570,48126,19867,10165,31682,11460,58304,42655,62043,22241,10609,51078,43397,35104,26337,59125,14312,9535,65484,60403,54243,10185,25641,2542,10188,49659,2952,3867,62407,57868,5227,30809,16973,37987,46613,5952,31299,13811,20026,18624,11444,27227,10930,40755,29344,25506,32463,11254,36009,22103,56346,19835,62937,48102,60750,20005,33704,7317,39997,38190,52154,61125,44784,28442,59572,25701,44986,20140,36113,17146,55272,14155,1780,53071,21735,9312,45629,60364,62104,44685,47600,32403,39756,60887,18131,50772,57821,32290,49220,55739,17707,1678,15139,62398,14766,62286,26662,34852,34303,21021,13792,992,51557,62863,20307,46308,11289,45879,44350,26727,7544,47069,43294,16501,38661,16836,38746,11915,13473,24764,19543,22689,55647,59069,12562,16333,7186,31567,42137,3796,12887,29684,62028,56955,30624,39974,57108,17122,38130,16205,31256,32687,16570,1770,6765,42018,44727,59918,5478,14706,61116,40042,20655,41571,24457,18638,3984,40110,24610,40565,1800,55265,980,57569,39263,46137,39839,21386,28174,3502,23143,650,1352,57820,14657,10233,61593,23408,45691,9770,61998,14707,22439,63601,34965,20671,42933,20806,63557,15166,38838,5841,38969,17633,44439,26837,54227,48368,59445,6511,56485,15579,22732,43490,5753,59155,38864,34710,21754,24828,14169,18435,59461,30309,18883,3194,33578,8058,449,12553,6776,8466,4855,44328,54541,29611,29509,16962,56434,17495,46807,54655,10138,44368,20265,16640,22932,62289,5490,37634,6504,34819,56646,14941,35875,20584,48305,2404,40949,24111,27755,47124,62607,9030,2478,64556,45023,44599,12578,2296,13508,35208,62981,19062,23330,2858,16050,18226,18270,44516,47702,30690,3728,50619,41926,56302,39512,65308,25648,38284,20890,49137,57079,42280,40308,28415,11929,21975,6529,37494,34141,56227,17093,17441,4734,55094,1245,9304,27780,31558,35186,33665,6610,19586,12743,55770,63173,30305,9577,4528,19412,16480,3610,49702,4115,2849,26431,20450,38631,18471,26316,38400,54892,34051,28741,33838,24388,21720,16125,3975,23402,45117,12372,11406,52624,51647,27282,61990,42841,37306,9842,50770,3950,39,31458,2399,57167,57790,52357,52003,2370,32539,54147,11756,13496,7321,49704,24424,18154,65070,51440,54260,7431,35791,58522,4757,39463,43483,46925,2069,15336,58749,54395,9133,56671,38229,29377,40920,15186,4382,25442,51133,11165,30038,60674,39444,11414,3952,18836,5568,52559,57493,14985,53333,37100,11283,30918,23080,18179,11277,16721,27605,23898,54763,46862,13867,33376,26108,28394,12464,31643,50611,15586,36335,34364,56026,23312,50074,4111,63257,31803,34456,48063,55932,25387,60852,37266,22996,64226,55553,60149,12327,2509,8801,18277,56161,58725,25015,52052,45186,34837,24025,47657,8799,45180,26374,50588,3684,53694,30644,4649,23340,17379,62980,45395,7519,15928,2788,15084,56759,10361,39162,59242,8436,65096,60023,18598,25547,11289,58980,12842,5378,587,32868,54835,54183,27413,64469,27576,23898,31346,18590,2989,62677,57952,32794,63811,31270,54873,14449,2140,36661,28132,25508,28591,3553,58975,23103,51551,38168,17009,33301,35666,41566,65535,48065,617,50890,39098,5523,2906,7144,52007,8001,61828,22144,5623,21927,58449,56291,21176,59483,48241,54207,3814,19293,10781,42408,16616,9466,43373,37647,7268,62683,40715,510,2834,46409,46772,11114,1777,6035,34432,19110,5357,30991,16473,48776,991,13562,55868,20967,35760,25909,24394,60239,21344,28403,39306,44963,63885,56744,20464,14544,20166,50121,11508,40756,36892,51044,1764,35428,61126,19713,44613,30619,39391,51522,12065,12211,58252,13090,56770,34114,7969,11307,12552,62286,24426,63798,3968,4011,31283,9827,20929,12204,9362,60710,20013,58833,42256,27804,1485,5694,32381,61329,18381,7568,58972,17962,58287,44723,20465,42410,2294,27951,51998,19615,62347,47769,38285,1201,64897,18420,28067,6034,13018,10613,2159,53971,15730,61027,23946,55972,12271,29359,27533,42396,18326,40986,42085,32892,42941,6496,28413,62924,57096,8372,14339,31727,29964,18187,15379,15991,61978,51497,33250,1963,55366,35125,12489,19619,16161,37188,35955,1896,5191,54688,31349,736,37843,29874,13727,32242,39468,42426,64617,19789,40779,17332,12982,36896,7636,60166,10021,8079,45363,16823,50874,41676,62463,63997,37516,27194,42980,40694,4330,32190,6654,42192,29758,8864,32591,25820,28681,56896,65151,10883,3182,41119,65461,41338,20140,64867,51898,22845,56562,30016,25103,5796,15404,47807,37437,36301,6118,64706,49730,13850,60417,65460,9458,19316,36783,56885,25925,35783,12920,57146,10441,16695,50283,6246,37742,10331,44713,20476,38979,25701,11193,19029,52065,51272,27532,55908,63649,9033,57264,17343,9424,39641,31082,7052,37971,56322,43180,26473,20073,50929,5019,25034,50798,31243,7247,44773,10732,5269,63083,49848,45675,34783,51905,8810,41263,16339,48088,15706,6542,61919,29083,36103,53449,39191,22354,39630,3938,57910,53518,16063,2569,64136,54682,37859,9534,222,16880,62860,55522,7995,50582,27344,40439,9916,21409,5265,36425,39831,38068,7736,15584,53564,59239,34795,27226,38875,16505,40086,17056,6361,25081,7622,37866,50233,25562,16996,11458,33259,55905,12119,12405,4583,9936,469,13308,8394,50489,29337,51218,46803,29155,62314,38759,28299,6418,62989,49272,29998,35804,2118,30804,35326,13896,48596,38243,34827,60259,53418,9479,25072,22478,31696,38636,65041,58553,4971,17221,55198,17192,15793,28637,43546,48742,29585,8089,64288,31380,22000,11676,59321,15845,23995,30695,40257,63387,64666,44928,15552,5125,56685,26499,17435,21322,26867,44560,19624,57295,53791,25255,22845,64643,25574,2555,26716,21955,59590,5166,3023,25176,8977,51067,6135,33672,7428,35654,32958,22887,45617,59591,23125,45516,34224,64216,52656,61556,52725,48864,28443,38458,19113,58766,18666,48222,31844,21176,32186,13051,52172,56422,45165,22196,5355,50673,34948,19211,7128,46376,63532,52125,57914,37524,6369,45524,64639,19484,5833,29370,2992,10680,61347,4029,4133,65206,31800,18089,53230,25486,5152,28032,43103,49161,51835,3896,30547,29216,29740,27517,33367,56781,17225,35062,2410,9088,42155,47587,38389,42328,38990,30544,34863,36591,12290,58834,30722,15590,8902,50681,55146,49302,18850,34471,10213,1708,49443,39051,12408,56613,3912,34475,61926,34814,2521,13982,55546,64128,31584,43341,62740,63204,7719,57973,1201,20963,39060,19120,22039,7615,12065,42118,40154,48490,7291,10259,34980,46533,22048,44446,4047,48498,30376,42940,57514,23764,58309,30736,162,41880,5772,48418,8195,36349,12990,54505,46499,22549,64074,59540,16801,16098,46372,16540,27533,45166,4478,53528,23748,31640,49264,48633,35573,21323,7884,1960,27854,6761,20294,16566,62270,22466,51742,51636,19794,7348,15850,27910,26100,13747,51852,63122,39859,62294,21591,48030,58188,16754,39955,9623,50663,15756,23268,5001,29062,56150,39591,43780,9058,48645,65336,24763,46519,56454,57709,38449,37189,48772,2043,39272,30539,49136,60323,60197,34928,38091,9850,17335,34575,3527,11056,40827,38357,7565,33557,8290,15944,14798,5374,33883,47973,48882,10172,6081,25106,14449,57250,40380,15858,38650,65166,54932,35149,29932,42485,6010,39625,10878,17976,33900,15012,56637,18955,30493,1045,31561,28780,21021,53565,29871,55131,7359,17213,35648,50484,30911,23745,17126,42332,48717,34642,47945,30226,30768,58719,43746,16382,40050,37279,24378,20838,19701,58446,18729,19504,33803,33317,12823,26171,16431,47383,4114,35331,53935,5644,1285,46344,7929,27774,20590,42546,36486,32148,32939,5557,2478,40288,2475,12072,45818,1645,43412,45176,31925,132,28161,11972,50382,35760,6416,11345,21264,47501,64248,55138,23664,17162,41181,12577,42526,30247,45326,10637,5129,1830,15449,7683,35753,9011,18736,28020,25156,54056,44356,42483,26921,36778,46396,50502,10683,8508,15168,56595,33313,18312,21433,28863,34887,62825,40847,57638,62732,42702,47676,17903,28419,56794,11404,5969,63778,37212,11973,6850,31576,28481,20974,22159,23069,54753,32431,23113,18750,46768,1450,27574,28983,3331,22511,19365,15820,47064,64629,50351,19892,28206,13542,17194,61215,138,64675,57153,29557,41122,58050,8311,19540,57601,4177,50029,1636,23553,55380,2419,58533,44191,44683,58851,32628,63826,28495,54744,4207,20266,35418,39122,59997,30224,32089,60322,21713,44219,64821,29762,45893,2844,11513,49453,61157,51627,31742,7470,28811,4409,50188,62228,23624,55241,6610,9471,50079,25338,34980,57118,54579,19005,51953,44154,6005,5832,29209,49902,52440,30061,54750,52546,13591,2558,47812,52515,4745,43611,37920,773,41617,22177,54570,23582,65261,60908,33304,54118,29075,35070,24735,58482,790,48274,42922,26450,49007,36024,14984,2102,57464,23451,60035,34004,15766,29818,48735,14302,63994,38382,11628,60580,42689,6001,12744,12004,64318,22587,47722,27079,43949,52761,8760,28411,52037,10479,42639,49169,44890,60494,20636,17014,14076,32694,7872,45873,36581,19082,4763,49054,57945,11561,64660,52971,28229,11611,25412,33842,46787,987,41840,47383,7440,25200,64341,35007,34896,43997,50534,14254,47605,57691,57290,16299,58691,44531,10128,58539,27820,55638,32781,17054,18120,56416,60605,9579,20803,26919,61521,56325,13991,62180,32808,43711,6502,8358,12001,19649,57610,62423,50760,16959,22264,46442,16605,6455,36084,1356,40900,25088,65480,41514,26386,555,29398,44314,49934,35860,18181,22465,6419,26350,4,39556,58681,64894,35964,51364,34727,14311,5176,26190,18426,3324,11362,59092,60957,35204,64710,41109,32696,51395,40955,35532,19449,21309,61965,53407,31929,38425,23056,57389,51301,36257,20247,60661,23365,13504,20049,13228,47608,34964,12003,20441,58446,23003,9877,41584,266,45382,8553,14604,61229,20337,55464,3516,46114,34177,35376,23330,41919,27589,57166,61966,33738,55336,40774,43808,8837,43917,45687,58765,41645,60020,288,6555,294,52458,5145,15514,27938,56447,46721,9332,56897,9520,41551,44041,10696,18982,25986,40428,3497,60725,62167,24691,62806,16648,16767,8970,18749,26519,42315,44826,5345,28668,2440,18291,22856,48364,46902,26687,13997,26371,20117,19482,57514,23026,46143,57131,43995,13011,41912,56975,44190,51797,9341,32118,53772,18174,53283,24361,25919,609,16473,475,30013,45821,39449,9500,42767,61611,33567,19761,36125,57787,17500,57394,11213,6128,34743,30671,61983,20632,44708,7799,31016,39760,44658,56390,33341,51217,5484,58320,38055,37496,13215,5647,18366,13893,31425,38566,60596,37826,4431,50394,8988,53357,28773,12557,56763,24776,10588,28351,64959,58905,12104,27374,35299,36575,58095,24266,53431,51828,33840,55544,42760,23328,38943,39303,55803,48591,20416,44451,33818,55771,51577,45934,2411,61559,58421,29451,14851,35282,48229,62133,27521,26451,13490,12142,10841,391,6382,45130,52032,39041,28818,14109,30114,29033,24162,6157,25625,56005,10212,61882,1773,58262,2222,6564,52379,3497,14043,48487,12121,37217,54325,10198,57886,22700,27124,57614,63465,9857,13188,44526,32790,53442,17743,6076,29782,49306,14207,32492,7554,18408,35263,37394,51932,29099,8941,61267,29119,42870,52979,33643,25141,11486,64607,62949,19313,18760,58996,12041,5610,44898,60203,51758,48413,44920,19283,46465,16371,7433,20760,50366,59230,58049,39216,21166,24169,2916,44822,40959,268,11454,30003,47471,41702,1731,168,61675,6072,65517,34610,60601,25158,10240,42555,48542,64603,51185,14665,59043,14749,5790,19427,26741,44144,47919,62750,11157,64788,56786,42333,39174,55125,15810,31126,63151,23599,42614,28953,11376,32221,38043,39905,2315,29919,55885,8858,33654,64836,52824,19508,58555,48192,48175,46301,44905,60064,41284,32113,63296,20918,21096,30682,62487,27969,24942,48028,23369,59191,25791,44283,24262,27425,22653,50082,618,49954,21968,50760,60235,39552,5021,1139,35631,56238,36451,4912,402,12641,31256,36053,9832,48245,52725,15950,43665,23810,8041,26025,20213,3107,35393,56006,63466,10941,8227,1759,17395,61492,29500,10381,18230,61549,50748,62470,27217,28335,44137,40402,47989,31040,348,61075,49766,188,58912,32144,47145,57529,45223,30236,49737,1163,49211,25675,23759,5625,57223,38951,23205,31239,65344,65288,42616,49792,9776,18473,17826,11132,34341,7264,8973,34309,46158,13117,64610,65053,34105,34050,33386,61990,23901,36995,24065,2974,10137,58172,41059,6743,40830,17294,54378,53594,33443,14206,11883,50059,8991,28475,26068,49386,55090,14534,51405,31820,60747,58294,56968,52609,23215,59823,30820,10945,29658,11575,40681,35603,53063,6246,40996,31218,23751,55965,10195,41255,27443,63659,60574,53973,36890,23831,51974,51208,12390,12273,42038,28604,27993,21582,30811,21825,32647,3824,17894,34519,44958,17549,3440,23149,21127,62869,24946,31593,21554,18388,44941,56323,8940,19814,33101,8125,10836,41587,26773,45354,10031,2902,839,61091,53402,57176,31997,11593,47611,31566,7156,18957,41036,2333,4672,40422,49845,34732,25807,40314,49480,42726,59792,44705,29315,51766,56588,5262,9635,22155,19772,60132,63599,41089,53569,35135,11037,36928,1200,35604,35442,50599,23074,13498,15805,16236,711,7394,48674,61345,173,9261,59786,35678,30111,40583,46326,3262,62082,37303,63650,22114,24033,52667,15524,61193,25358,5457,4807,29117,40564,7734,53284,59652,15404,4874,11939,63524,20411,45508,579,25322,38575,15600,65251,1621,35497,29284,1449,27008,17253,9508,10051,61801,27103,54829,46245,25086,30161,47783,45301,48217,18748,28452,22828,60541,16159,2141,129,39610,24434,33678,20655,28703,19754,24258,6632,2035,55081,11299,1625,55356,27357,63970,60486,12602,5500,25804,47187,20458,52623,40052,48752,18688,40445,24795,62798,41178,25403,51528,8550,30909,31316,18296,16488,47714,11559,22357,16122,44606,27426,52986,13001,20124,37350,11079,6951,23013,27802,30900,17647,60798,8491,53531,37259,42474,15198,45666,38038,16554,5325,63462,50581,59356,15296,54690,39201,224,58077,27748,39331,47500,35600,6292,6882,7688,2650,49387,38512,38574,23589,60611,44959,43991,36548,36199,27277,4327,25604,61316,51927,4172,55869,49667,37208,14019,24894,61006,40201,14248,13972,26266,45915,29821,56015,28899,55452,54707,41420,50116,43284,33883,47272,54328,46790,21700,27448,41870,8146,24437,13419,35732,31142,5764,28739,61848,27723,42807,55513,11678,27718,5623,16524,48192,57996,13793,47734,53409,39560,65219,3941,59145,20065,26359,60295,55441,31166,14858,54626,65529,22017,37230,20285,14702,16581,27932,35288,8106,38727,39272,51727,38487,15692,12836,54062,52706,27372,28688,8439,23588,31541,21615,62421,54035,46603,11910,31691,20590,58661,8248,36360,5114,14293,58758,15715,4325,4764,28972,14256,41007,55525,1773,1747,51567,24780,22306,40766,53607,20426,46250,8792,39868,3971,50072,14845,21082,46085,57895,57433,40102,23982,7743,37258,31531,21640,2125,56739,48632,4161,62337,50855,4531,42102,22822,25237,42339,16235,64204,4500,54180,25261,19957,1580,21720,44192,57750,56216,59225,35670,11202,48947,6437,9146,2976,61258,41228,7602,31845,57595,29788,3366,51523,27918,40889,46354,59994,36968,53168,1995,57525,24495,4659,14775,42683,61352,8907,1248,35004,29331,54331,19021,62334,3937,50395,34897,10146,33262,7550,23749,42081,53335,49434,37879,44262,48137,4158,62514,21020,47804,27680,62276,38177,36757,41810,60455,1639,63359,40283,30020,42768,45065,647,4442,11552,62664,16531,630,8864,33717,18958,10220,53737,38576,27554,52253,55795,56373,17137,3630,24339,43635,10267,48222,16210,62598,30296,14395,39108,17236,13999,47181,45390,44879,58407,21356,34063,2380,43108,51509,19632,20649,6555,39747,19541,17327,53642,49585,50764,63752,64054,12587,35981,1909,50324,387,35015,9117,46539,8424,48675,56277,51921,1856,17566,62193,57882,50775,11509,19374,51095,49515,49516,20225,8256,6722,35371,49970,5849,23821,17470,62380,5566,11275,47986,61673,27861,21791,12156,14405,16692,21079,32444,1915,38546,8464,44385,52326,37756,50666,3335,18218,6466,58942,32808,4352,21393,1858,29172,8689,56221,44565,44301,15860,31198,43728,39626,5033,3284,20619,6312,44303,27897,54821,52537,32938,199,63593,54642,53517,31706,49181,41832,1990,42080,17626,49855,6417,48118,44566,3188,31286,6714,23223,41647,36868,61663,8622,35872,9579,57540,33691,55363,13708,21877,23553,61682,650,15161,32049,36908,33472,13095,29637,60991,34632,20475,23057,46999,58684,1694,35931,59438,46330,40272,41090,18285,29923,11299,15650,14766,10292,37691,24515,26733,4928,25962,5694,20277,11193,32627,57283,25962,62488,22256,39716,709,9797,25585,34638,44894,47680,12988,5851,22168,21965,14722,27749,14924,37407,21619,14574,1338,24580,53669,36009,14183,60405,8724,2480,4261,6511,27440,56097,7445,23731,25726,27767,30974,14022,32373,4736,36416,19848,41561,35938,64954,6740,30156,24198,51943,25145,7906,65220,4748,49686,46395,2229,2166,62022,53864,17383,35787,53198,15653,58161,21767,64899,3969,32842,26319,40663,28267,13638,12444,31294,36405,11427,28239,5708,29172,16371,15876,23269,20932,45080,913,26329,18798,39582,16521,58523,53715,51660,18478,23365,12835,54081,36143,26327,45251,50865,22374,35321,57094,9260,41087,36392,58714,19295,33655,58326,35177,44129,60522,8643,47006,23819,16467,49692,5312,1947,47982,50563,30652,39995,7612,35188,23146,48273,21499,38365,53308,34233,3015,7860,19220,40393,23777,48203,22347,31677,59266,15835,46596,1437,17525,4662,1601,40731,42527,17091,5004,32383,60331,48445,17726,6370,11615,33817,23166,13900,37616,41908,4058,38162,48948,42433,10340,53430,53155,36291,47078,57493,9001,14552,57286,10501,39572,37997,36834,47593,60813,44416,62709,834,34586,53924,21783,37198,27283,15818,49427,19386,38676,59832,31713,14625,47810,360,28594,15286,26837,52327,5216,13920,35258,44796,4930,8608,48412,21053,10280,48657,30490,48481,59520,26953,6169,21778,27766,62796,63602,6980,29522,5763,12524,2372,35086,35798,268,12787,27210,11218,8314,26421,5486,48246,31801,58529,57798,56449,46670,57471,65197,48827,41214,4806,5811,47783,6445,54949,18321,45714,43819,56767,8043,11445,47824,43829,9974,17164,19373,56264,52351,56959,2046,32793,12850,12238,13510,16268,51163,48127,35830,59207,1653,48747,11030,40972,65088,38751,40645,7796,38098,41965,9476,28914,40020,11617,20846,5460,65250,31384,20188,5964,46942,58146,48193,52373,28067,54752,11112,796,11905,36315,14422,26054,53931,54464,13859,65161,28547,1676,14510,35591,38966,5173,56816,3068,20753,3821,57628,6270,21176,25625,49460,60804,34896,46185,12676,10096,23418,49958,5400,30438,65294,36890,62193,36208,51404,61997,998,50730,48308,52579,35935,32475,35679,472,4190,37736,18448,64423,20283,1900,55821,25085,64403,27230,44312,55854,4252,64253,50893,10883,53984,26413,47782,47292,37348,24700,41887,41574,19728,28491,57255,8923,4562,45490,34776,25284,21598,12782,2809,16544,5024,61925,64813,36091,9980,3269,30984,56447,33769,11048,41018,42000,22670,22497,36458,19797,55207,59484,9025,5881,10348,65167,36388,102,21847,39766,9722,59429,58162,9674,58934,2732,58199,31994,28521,58652,45201,60245,57196,44185,50325,17503,12488,43814,7973,10973,37734,20875,8665,62973,14569,9355,23614,517,43590,58621,52669,37567,9290,57794,21010,4506,36070,18273,17758,25379,34855,10865,40331,20865,45013,16979,53696,63437,18314,47702,34919,8467,54253,22868,44292,6285,15333,63931,297,30117,50904,33739,56759,31162,50586,64628,60097,56744,13223,22892,24639,59721,59176,9521,42903,31358,40466,24937,43681,26470,46900,18277,43084,33826,63739,6019,51748,17192,39687,34174,17424,25935,12335,41969,16578,43177,1932,62664,55801,7923,11797,20022,36641,4652,50963,50163,4344,60633,45410,15057,38430,32122,42158,34208,6771,28772,25556,22756,36121,49871,39452,47432,17272,62057,35742,54759,35319,9518,24816,53220,36398,34124,9944,9395,65463,33555,54712,11339,806,34983,36962,18769,56935,21662,24,40849,35611,60447,8873,12447,63880,23105,61651,20208,48590,62785,64737,44975,15668,48244,49965,20182,1742,8841,39821,41311,32404,23333,22052,21003,15035,41033,7472,8402,42344,11717,63810,53122,60947,30234,2994,52976,35684,40200,38123,14470,63934,17997,5266,19140,21954,10482,50986,40521,6902,53710,46860,29035,24243,39050,60197,41119,37721,45155,36880,48071,11238,60535,53419,18445,28595,4006,4005,4331,39461,29699,14511,23036,3519,65139,233,49254,9796,29437,7253,16171,57818,16954,21936,18990,63277,24881,25630,36972,16981,55445,37690,17832,51360,57054,49877,47074,60191,50221,15341,51013,6255,31108,17313,32850,4030,17514,49542,54739,21638,52471,39285,10873,24371,15787,30822,10187,16249,15846,33582,20790,62826,52442,36231,56348,59417,32467,57780,4759,18991,6878,48379,56485,61671,54331,25908,2531,24019,40079,54757,45704,52395,28755,49013,9957,27447,61624,35701,65446,62025,57014,16105,60118,59366,27614,21904,33842,55672,23550,28534,36329,16395,43796,26552,18470,13107,22637,57151,20411,28756,54672,37097,38089,64975,56451,60834,4718,30435,50734,7534,4385,15021,27760,47327,65353,8340,43283,3181,11366,47312,48213,6921,25442,7590,52868,52461,28019,24200,55729,15229,55938,39609,59466,5018,6748,39572,27799,31781,63719,62460,42501,11313,9606,32137,19349,48036,7395,56488,51236,57617,22022,29898,51851,54491,13844,64502,36453,54947,47469,43636,63528,45300,37675,50117,32794,50433,41874,24807,51185,18128,62349,12252,40709,37193,6629,3349,3984,33259,11690,20724,33357,27526,4306,36227,49614,9638,21000,7023,6662,57623,23055,9384,38998,43000,19926,52845,24578,13995,43319,16623,31664,585,35479,42584,36009,7690,37044,33481,21536,37488,62439,507,15065,52283,4772,15951,34117,15332,48770,35982,40409,28641,6331,30841,65109,65513,9034,30769,25675,38258,24692,10751,24475,23693,11436,25730,15143,28052,37091,6217,130,34682,14160,27581,7619,8241,37062,18968,43145,61960,14520,31830,49961,3245,63185,29883,1009,3226,39712,13534,57235,43758,60837,15313,41909,3906,35738,24881,59957,49546,61978,23650,23201,57823,10500,15198,35364,10228,33722,44831,27748,24641,60147,27473,34322,4415,35603,55514,12600,15941,32529,53876,379,2317,37402,29313,63637,42217,58171,58848,11443,40261,43216,7823,164,19399,64836,19483,65026,20337,46471,24012,718,39113,23299,32838,941,16048,20586,8536,13469,30951,21503,50939,59829,24101,29035,9216,34765,1605,55620,7217,13271,29469,13065,22801,11443,18586,39522,23844,18161,16141,4203,21485,38311,55930,11170,30707,26790,31238,22279,150,45582,13785,31457,31519,7860,10668,9799,44096,23632,4098,16960,7828,43344,19001,27300,54712,11848,7824,46537,64754,32540,14789,58061,31080,15147,13913,14083,9140,6080,37023,44130,10310,52107,42710,29087,29303,19924,62921,32748,21030,16426,38164,16517,18237,7242,33423,60804,53520,569,23221,41588,8871,28468,44105,24795,50712,31202,56283,11482,28294,17729,39207,48481,27348,37459,1747,38088,25648,30853,50321,58274,19587,57207,32586,52299,24297,6812,51339,10603,20290,11995,44524,24106,61835,58262,55904,31534,4786,36230,26796,47545,27352,59877,17478,34678,27413,23532,44083,60716,20958,50064,23274,4179,1236,27667,49512,59644,52394,38985,22038,53816,19969,4947,10321,38668,42898,35352,39111,4314,28293,26994,20992,30894,57169,58859,5299,22313,20733,25577,30563,22639,52222,25484,34979,50511,61884,50545,29632,4445,18301,4442,53278,35908,19275,24790,63592,39206,25395,65043,57428,39494,18625,52554,52503,40804,2737,10910,47022,61362,17152,7072,62797,31726,15178,22861,27188,31077,55866,40025,36491,12145,51051,64916,277,44541,50734,4249,41480,47903,24031,45806,5239,65285,49960,29179,46959,7648,38942,48397,17176,46075,48599,1656,40784,10172,2451,26153,33995,22397,5648,2271,5240,38639,17739,52581,59630,22319,59264,55496,49939,18691,5172,12288,50741,39332,13191,16364,27849,39698,45546,28516,34423,35499,54905,28020,56900,23140,64902,56052,27550,6837,46726,57231,15782,53585,38912,33863,36431,27162,31223,28346,53915,51704,42545,6949,56087,31203,50257,42471,19813,45325,20703,22244,942,63466,23836,41070,30466,31440,59040,52966,41470,15776,15001,58551,27363,57960,46667,56723,33967,18885,5715,2549,7036,37025,41678,5754,18555,35471,6250,18125,38165,56594,21234,3415,58179,2904,55428,59754,16673,39032,34909,15700,13046,15879,63099,17222,4322,51676,44186,49820,4614,38806,42454,14636,63428,35431,39838,13282,19489,45616,9832,56350,62256,39764,62467,10034,59631,57169,63661,12060,50551,17172,35602,11960,62289,18914,15921,11187,42656,3840,20259,53913,27434,62546,31794,7342,23705,13527,4163,26182,45774,44673,37936,18964,17740,56108,25835,5466,61768,1461,58695,25987,7311,8677,25065,39176,54077,1429,64335,59343,32930,65018,60530,54327,33992,41743,21535,9089,12911,3616,20861,23497,34718,14095,4616,12299,16964,27436,26531,51118,29216,48737,58046,58135,4364,64845,8816,62646,23684,48328,32146,63563,16896,26281,38813,48336,36609,11786,61944,21409,31352,37673,10175,64346,64558,5662,34219,10133,23199,56753,45068,56356,49097,56183,63125,3949,23346,2790,23208,23240,2570,33327,2977,18306,40702,7437,5681,54941,47569,47250,50769,40667,8896,19627,38650,34792,33673,42689,43081,34464,7284,48734,30869,6244,35819,3792,19405,55908,53248,43878,64103,13990,37650,3266,36581,42929,46650,14856,60750,8228,50602,16405,46397,49641,26336,19921,11528,48396,61971,15810,30804,32842,6131,39061,54897,50892,55874,36908,2804,27747,63148,8353,42551,30240,41243,43183,32424,62694,14711,22164,22721,13737,47100,20162,2772,56925,38185,645,33667,13739,18537,57904,46177,56782,28321,9942,17841,46985,63863,31776,41557,58404,5942,44973,28600,46019,47205,59057,16249,60302,47606,63969,57614,31734,21703,31959,4675,18562,62634,42665,31974,36520,29972,41055,41875,1360,56736,5485,10138,51145,65286,44286,36039,1674,55078,2984,3676,48028,31240,51462,36741,20176,54493,42602,49178,25613,26934,17731,64628,25166,36664,8465,20300,19582,30203,52419,44738,32914,1115,42087,63204,5010,22940,56625,42563,10510,28467,6213,59887,8212,24585,51587,11433,53454,55527,64098,53627,47259,32259,13719,8310,59001,47315,22717,23658,20251,56843,3825,31127,28489,12343,3922,884,20984,61899,52083,59440,18071,45150,6919,319,14878,63904,57648,47956,24603,43520,41470,62654,63962,25034,12474,24542,26586,52619,59745,48624,50275,14769,58907,29192,9803,47707,35128,49608,16788,20419,15440,14408,23777,55164,29074,3919,31854,24545,61154,5222,52432,10481,51695,61879,63100,40086,32456,11953,49374,35596,41799,21269,44899,63410,21813,10145,62913,42394,58777,54503,22834,22286,48213,46465,12176,8873,22506,57399,58906,40913,55269,37152,38197,18775,29913,33155,35562,55658,27312,14473,22562,13212,42041,50421,4959,15202,45157,48088,57446,44241,60599,49684,18867,42655,13075,21832,30680,62641,56731,44087,19313,32059,30466,45061,36135,9478,41089,53942,12624,44476,25726,48044,16964,7531,13956,46997,29641,28280,53599,61988,49287,14389,54398,20260,585,13652,30618,52441,64788,50923,50008,21732,62177,49981,42859,47243,34744,59927,23017,39288,32538,38441,18969,14843,34627,22022,42634,14185,34471,6108,14328,23979,61736,18112,30216,42952,22059,63841,23497,28712,55369,48160,22004,22735,52364,41231,9946,52548,46068,18609,10408,3980,54026,27541,31086,8819,4166,27440,60530,23621,5649,32849,14167,3082,24751,31666,43935,3424,30468,14709,48617,45053,42111,31431,38961,44587,35214,30747,44831,61815,45574,3287,13336,65189,17203,52177,25302,31623,58971,26300,10264,11296,5944,51876,55056,51569,27984,33541,47900,21594,13245,14665,6098,51743,696,10434,14334,56585,19787,13976,31951,10485,44512,21425,62734,24987,21586,31723,20958,32680,55066,29625,35509,53594,5065,32929,16625,1402,15649,31812,23304,19038,55082,63344,18971,62180,47260,3655,55303,47260,60820,61004,57192,62329,18987,17465,27136,21973,37796,40958,39812,37293,21480,10161,62983,20047,40593,65500,45163,54373,22066,38871,37123,61276,23120,42696,55716,20047,49792,41138,7951,60226,42372,8538,27285,37787,7123,62730,35083,43220,48510,49071,57232,63433,29726,44327,51996,65508,61876,21963,60525,5534,4146,44912,39600,62142,36759,20714,24171,36803,39975,14376,12690,58083,45181,24795,51414,28563,16567,3206,47483,32845,28933,15691,43481,19969,24316,7732,19186,32036,47823,63724,34360,14747,13531,64406,6412,35277,16293,28630,16290,50261,17831,373,3063,17010,64061,60154,31766,13788,31833,14338,54748,62140,48329,20409,16894,53648,18419,24560,64170,46119,38140,51734,41119,15374,28287,15352,56793,18711,50039,13184,56420,42172,7767,29363,15654,45266,9091,26222,17013,34617,39874,37645,16910,64356,25719,4968,11956,55918,49209,12133,64657,42757,1898,58903,34213,42550,9280,34079,29350,58907,45811,29293,58363,58479,53940,2382,42590,34182,32167,34599,46774,39081,52772,29902,49889,28750,13483,57373,53844,55777,41949,46025,40810,14615,61926,14120,25598,27150,3551,51543,61850,48722,53395,52950,3654,59652,10444,61023,10812,60522,55463,49416,30469,13341,6839,8234,40237,37479,24131,43696,3253,54748,22921,57406,59182,56743,56838,10670,25860,15368,53626,60049,23416,48934,32559,55694,40918,11851,48268,334,50744,45915,25799,44956,13283,50314,18209,23642,42225,50015,39255,19985,3647,37613,50040,32925,15123,45990,53986,12165,5984,8896,47132,53508,32961,18005,39067,35098,18575,33997,22977,20439,41486,27096,24281,15355,41242,65444,11282,47960,51689,53917,23875,63155,60917,43539,18800,1460,49234,59038,52292,28039,48081,40588,19048,47264,22076,38534,63543,7270,31038,11517,21188,7608,49961,42350,42629,65344,4351,29711,21082,15993,24738,41282,54944,15402,54329,64193,36951,62926,18775,32281,15008,19994,20548,3020,5525,25807,20926,55154,23100,62605,41047,59489,42168,44355,52969,25311,57367,35332,61488,58374,47399,17710,13036,21757,43614,38084,13880,52644,38616,58257,29325,31995,58580,4492,61839,27227,9966,34846,38629,20114,239,14777,28302,45282,36474,20347,24277,61258,20456,7940,27651,8257,30596,34264,61742,4954,51229,30516,4002,58888,30522,4181,3077,62386,23599,4477,40921,18570,28312,48098,6894,58090,46201,12459,11963,33376,1833,24562,3151,7975,54974,43199,51386,54410,31992,11174,54634,40625,39616,15500,64581,20109,43974,57114,51553,3996,4491,53187,32937,48997,29245,1734,47559,50665,25010,62703,42955,33685,43194,47387,42244,22487,56190,40812,40786,1015,44457,60491,45236,8669,35130,58242,35113,54683,34294,22245,32344,47037,49665,19155,42240,17688,25282,15066,41770,24860,51223,44535,5272,21305,37911,6530,47021,349,16290,54859,20888,23988,43589,60100,38041,52343,8338,29907,40267,33776,50742,6755,58760,17823,6252,30537,49600,65036,60400,58121,59364,7176,42072,2605,8788,35861,197,54094,51081,59332,3447,62230,58246,34913,42014,59467,7379,12829,55456,28358,26344,13463,45685,15748,41861,19927,15661,37290,45799,65385,25677,48051,24647,6919,47198,23323,5639,36544,13124,25981,34542,59128,55922,27724,26112,34797,49227,64137,15780,65311,33201,59276,61597,41233,52524,8034,62287,8710,47599,32801,21958,34191,41219,54648,45278,22855,52464,47560,42404,63842,36431,11449,49664,20935,43105,10830,16528,49538,1593,16733,63749,27982,58483,24065,29160,55424,12063,64473,7781,26661,56402,20198,50834,31868,44846,44660,26182,36905,5746,38328,9450,18015,44425,60417,33733,20283,46033,56857,55502,57471,25467,8680,41202,32610,4847,22291,9458,30350,57471,58004,28046,18855,59782,43631,26005,15146,28903,44362,2224,32963,37470,22704,25959,46069,64711,21835,45901,45610,34128,42301,58847,55159,31702,25913,46430,37560,59430,44024,29322,52136,36575,58177,14323,43702,24877,27760,31760,61364,12120,19693,27694,47065,61381,8026,44077,24631,62129,49672,44079,31169,28820,55329,56780,31715,8919,41629,60366,49982,3650,19876,43793,55526,31611,37524,10160,54488,54807,53765,14672,36859,61639,17654,53719,36294,22367,42335,18152,31164,36074,16566,57019,50042,2317,11470,22162,13290,26294,3028,1850,60834,3626,55981,47781,14763,16122,62815,54947,55512,8626,27002,13957,56412,7143,12150,57548,19942,9188,22485,20358,8444,28444,20232,53710,51814,27057,53980,48728,27697,18233,59312,20620,37227,40385,343,26120,53425,36904,41620,50167,19933,23912,57923,25015,41183,26781,46195,21178,45287,93,5726,61820,56089,37452,12037,60667,39904,20208,57722,64754,42798,40384,43450,50299,2808,29225,10526,51786,29942,59708,7980,40008,1743,18523,58160,1810,63559,12416,6987,60477,38239,26125,11911,36747,19829,25094,29069,42743,29423,11204,47072,49019,36265,53583,46201,31001,22631,43995,34999,56415,22133,32851,44167,30280,38878,40803,31528,48985,14579,8285,6142,9371,35859,29364,1086,21226,46129,29387,47120,7672,54638,4202,47059,2237,7733,59878,4675,4760,29648,27459,50996,29076,3386,38280,12090,63305,52862,32909,26754,38896,36274,15045,30961,5718,29502,26462,62791,44177,20355,33603,4910,17391,55213,22020,8724,27053,59080,17585,51107,6323,49033,27945,24659,63745,62174,50130,33631,55568,13332,4480,17830,37439,10922,11510,44597,2717,27486,20609,28640,51897,44499,26512,35422,1091,51708,52013,7915,12769,3525,26233,19259,17466,59191,32349,8784,35547,20239,13851,39390,50408,31567,56568,8941,43208,27702,58249,52182,49588,23946,38053,28688,37231,18155,61165,21651,25371,27833,61372,60731,27532,34892,27474,65224,20295,46928,34776,23186,25836,28445,10860,28525,47124,63205,37995,42872,22530,32177,47925,46744,8176,31340,40713,3810,57145,63264,60743,26055,43510,19462,17291,37679,34898,35764,53430,32241,59264,41159,32484,28641,13857,14701,44693,45102,58912,23593,22134,53361,59220,4753,26311,41127,45471,3421,41712,57961,40082,11031,61451,23296,23235,2586,35309,15997,34749,17499,36109,18072,45394,39807,45412,12863,20697,8553,60538,60074,62684,50128,49650,41222,53117,16122,38672,540,29175,16903,61458,57076,27454,39694,33890,52921,46762,29232,35641,22179,41895,21488,32697,27660,33523,61287,12640,61363,51502,30245,2981,56276,9379,60966,24174,58117,59078,64616,42545,62933,61997,62273,48975,50585,52508,64827,36185,5629,16618,48106,15986,46030,20147,13120,26395,44,34712,1932,49077,16384,52412,34278,8219,26997,58375,29151,60381,14111,23313,14819,23321,35825,52611,59539,14150,53646,52410,18680,57317,60973,22101,27135,2396,59600,14525,20227,53797,14365,5182,6546,22913,37624,31767,21044,50445,41989,41512,17666,60517,46996,41526,57284,19491,36337,55777,37719,38019,47983,12099,49647,57148,8911,40414,33802,54613,53801,12158,49089,50541,26542,34167,41929,50747,63444,44376,54120,36486,12831,47818,16459,43946,12532,42913,45300,4526,61484,8689,20125,28308,23358,1339,35475,13447,45835,0,38135,1324,54739,21849,7135,59873,28421,9450,20147,9988,64351,4417,50853,28085,1629,60379,53764,11379,15346,6350,19533,14011,43368,16972,43239,32345,35643,56832,44222,6428,25657,18645,42876,2901,10393,54624,35978,22608,20758,8124,53414,48576,53457,19345,38447,53393,52709,32104,26187,18861,8792,38954,55438,15216,38027,29540,26564,42081,62912,49268,19958,18856,6355,20554,28553,45257,30852,53715,8669,63593,5093,4431,54398,10228,9703,11376,46918,7332,43049,58445,4170,2960,23585,29372,37066,54709,30721,34818,49194,64639,2740,55076,45036,833,11103,59444,14649,33833,31192,56798,44762,41572,47313,21124,23140,61242,53294,56985,39870,32458,6293,24571,373,64409,10909,1228,9015,54745,19607,17917,18979,38202,60432,5078,61985,38372,53912,49599,32279,47716,18802,442,25746,24304,60421,10707,27572,5345,30479,15003,9644,6164,46152,59411,20065,27894,32694,3007,10398,25147,23767,15053,20102,60180,38585,31155,3419,41728,1255,4451,30384,33696,58104,23525,6187,23580,26989,28602,37728,9603,63458,13793,37098,64330,47991,18012,4997,31642,49171,12590,44562,57710,48197,12495,25871,13782,48005,33937,44172,10164,52775,41257,56373,2210,56235,34871,30807,27870,10832,32953,22429,48954,10465,28348,40757,50398,63379,30274,46950,33084,35276,25756,45751,21828,24352,35411,13169,35424,44294,42166,21189,13293,43201,65455,63780,29494,24497,32432,11461,56099,61165,39044,33269,4177,3327,37188,42670,52421,27798,54735,37748,39834,37706,33578,43263,9815,59155,38979,13216,30523,38852,8244,45008,50473,58769,35658,14081,16630,40423,3790,5303,53874,30161,4221,42942,9231,61361,25163,48864,3597,51356,17398,25450,60637,63924,59007,42569,9622,41932,30629,44385,18181,63774,9878,62920,57201,26743,990,48712,41581,6294,59599,57478,13445,55782,4696,52116,52314,62089,56653,28676,50612,35007,7255,41345,27746,12203,14383,10806,51516,58418,35059,8440,55001,26295,55363,55115,30968,60637,45033,56958,46909,32826,54176,27718,1783,35707,32074,45972,57550,28538,43564,58010,8969,24331,39480,15340,6510,6035,26056,8082,27860,64724,60307,27854,52065,10342,52174,35996,50101,12107,2719,56011,59724,47257,33294,22020,36518,19970,52482,52373,28800,5246,29796,53566,50392,30301,4028,48059,33459,11154,17961,63750,61487,55630,24660,31386,46028,36366,38591,27286,2107,64613,25845,13345,35963,62726,65464,23885,4180,60274,34096,34824,21513,54981,18065,20828,48706,16707,46008,20422,9015,12978,59683,64880,33619,39622,43767,20614,43827,42126,63586,37933,55329,64141,36535,2978,32674,27087,2250,46848,21354,35122,18821,11329,43597,12576,52016,1988,35162,47506,2821,56830,55594,24437,60792,456,21556,7862,5577,20783,41453,56506,42271,3203,61940,19795,51805,6681,28444,42683,54109,13881,17562,28116,3440,55792,6555,10235,57819,54705,34986,4045,9491,51820,15763,20862,29475,17137,18257,8588,40960,481,40393,56907,10183,50043,63951,5561,6958,41685,59706,47859,45348,43171,29046,37306,20838,29130,6976,2465,20888,35966,53420,48017,27416,58198,52482,28684,28169,65085,6137,48010,19018,1825,35045,62121,57743,53703,21671,42915,50489,28804,65269,54995,64057,40697,49846,22238,43270,33748,35173,21785,31530,11383,64284,11036,43909,11023,45935,55083,63940,55156,25986,54036,4075,13609,33856,28238,46520,29845,36346,26001,52393,56518,63590,12553,54222,22427,25885,47694,41998,34692,56802,27577,34447,19920,57088,49464,16937,12108,46648,46464,27662,30381,41423,5309,45727,10740,46745,38250,19252,55425,25037,14725,27179,34751,28573,23333,8547,61166,29839,26488,15317,54117,7599,43154,14830,41774,45297,14706,17058,38517,48396,6274,3128,42232,8474,9790,29642,28393,60570,21800,27464,37723,19029,48130,26039,2809,39947,2635,38731,34147,35360,48540,64755,38645,35137,47086,2164,49448,5375,20850,48341,44372,23245,27227,22870,18758,41740,64670,55868,29394,8769,32003,56452,39388,65481,49963,51860,40723,16770,23716,7860,22488,40294,32810,18284,61830,52904,318,782,31034,224,34160,48235,46083,26140,56038,60909,48936,54138,20425,33825,19777,31813,30790,41956,3489,53470,33253,24776,44863,37529,52206,41508,49531,49777,60383,21214,27621,36417,15239,13746,57938,24295,13321,45931,2507,21798,45061,33333,29066,41625,4329,53802,17201,17152,1626,10035,21020,15480,10241,62837,22654,39275,37375,4876,61047,24361,4790,26241,34983,3967,64941,17764,27080,57988,62542,63656,59440,3446,38931,12523,55787,16008,8349,47025,38454,61450,50968,16102,291,10435,30771,62109,57791,3441,36397,4418,19121,64947,54317,61099,48693,41279,52951,15753,8558,19606,47110,24666,31436,7725,18914,61156,59426,64420,50539,53565,57786,41510,55410,19377,22279,10064,12309,13807,13740,32656,30484,25364,4811,64343,25572,39842,54597,36200,32928,15107,63353,6194,61133,4729,30266,7541,65374,8138,58439,17599,13281,17438,8286,54085,32929,34208,22927,10298,40881,23778,41495,45725,35594,37057,62253,23843,57377,33661,39135,6477,46018,40421,61376,5291,55255,24634,24715,41142,56339,15783,40641,60086,25066,56767,25291,40519,56694,53910,31891,30093,13876,35707,55641,51708,63687,9110,47777,12224,34381,8184,58828,2912,15652,1841,34754,31131,37079,41739,9275,52255,42022,15935,13844,21918,46385,28429,37713,46410,5615,44608,32443,5851,35891,38337,5143,28900,47096,15389,39103,15030,24904,17894,52926,37512,6667,19382,31456,33718,19175,40356,31452,29780,16870,12737,57114,38482,53002,43097,61502,17876,34918,13058,56683,16142,37333,39378,53014,42533,3404,36286,51846,35996,41312,34419,12608,41937,19580,6312,62792,3491,1528,15524,15158,32435,16559,48988,22728,53854,24561,27262,15185,45116,49747,5589,36364,57954,50544,30947,28201,12826,21929,3869,15834,14464,32685,16607,42651,58629,25216,44509,26355,17929,11479,60976,52051,36655,26119,49030,53657,58936,35242,45242,64583,2046,10880,30523,34109,37601,59016,21120,31860,32431,30683,36595,14329,40744,59482,29799,14138,15996,61281,3013,7552,40187,27318,26235,56276,62339,55523,37818,56444,23089,11702,5314,53964,23228,51262,55392,9324,19654,28149,48564,19492,28850,20960,16632,18218,32058,21972,3750,25632,27068,7563,7637,46220,33094,50284,62910,50454,7883,35119,18361,65024,12453,24671,1325,4272,15272,35290,32524,64590,47767,54291,14998,1570,47976,63807,32992,43178,49676,10641,19310,18097,14159,4493,10884,51611,55993,48796,49335,54821,62912,60639,47849,3139,16689,29217,22454,38180,56414,49837,51771,15843,8967,39353,14303,40845,16651,4139,12871,28307,35763,47667,16869,33479,7139,52801,47154,43761,47338,31159,59343,20109,2301,28968,47705,3153,64527,36880,36227,34262,47716,57862,37655,18513,10162,63504,57918,5381,30393,53146,8409,59195,32811,59287,6773,31030,47376,64933,64667,55412,41208,40458,13660,18083,26655,61241,6116,40900,64729,54902,9812,60484,47894,24032,2140,13729,2160,1765,45941,4866,12458,44200,65001,46083,3701,12551,7245,30562,50215,26341,19618,28330,12156,18376,37081,35717,852,28865,8735,13737,60112,61965,22276,7628,65171,513,41559,497,61073,23867,59012,61663,18857,3847,5210,13713,50269,31576,43239,15725,48468,22436,43555,54928,30958,21074,28379,11653,13816,53310,6667,959,51574,31157,54686,26428,52097,21668,26532,41465,26416,343,58725,33772,63918,54605,61640,47066,54465,4759,24911,31129,34691,8341,19022,42769,64532,36597,38354,28629,11618,21302,1783,488,23120,49320,60824,40413,42883,60301,47898,61428,65534,9547,499,26406,2170,17636,9824,22886,25370,61200,1931,15902,60669,63500,7319,5055,44433,37236,13662,48029,24765,62910,30056,42548,34022,53745,41435,39327,27757,22044,50128,7317,47771,21176,5916,49133,9384,27422,21235,60118,22946,26443,20560,36468,30423,49290,46356,62936,60251,19411,3425,19239,60254,18889,60382,57243,21205,23981,14159,9334,31930,45410,44897,6218,42509,42850,1174,59303,26928,22973,52012,42911,4578,58127,48061,59027,15931,33247,61265,56249,47670,48423,37749,12851,18326,54465,31498,62049,23700,5725,48326,8533,33011,52043,14950,18978,39986,63939,25688,36805,40287,28531,53063,63496,33398,31738,6198,58907,29986,6032,19203,45375,51357,34326,4068,44876,61134,28240,4602,53550,63968,34850,9672,27097,42789,46408,39643,30018,33239,2029,4746,3128,20262,5833,45081,19835,19785,51979,10017,45166,30452,1068,6443,58692,60269,2539,61593,18396,9392,63848,34065,14567,16291,24490,53808,34003,4764,60851,20214,45151,36678,17570,60124,32931,2109,19148,40893,47635,25441,25095,42399,20618,35293,11838,21909,52432,20906,18197,42839,57688,12278,6725,9851,38075,5312,15643,2270,61164,39254,63331,54509,22778,45684,30790,39257,59203,57650,48289,50724,11788,23237,64473,4037,46810,19607,31352,13991,35603,58374,25402,49565,12391,48225,26804,29985,18945,46310,1235,2262,38381,64629,59917,56283,44580,20119,48543,58814,19445,12842,535,14852,47710,26740,22234,21251,55897,17187,23550,21633,43786,56419,65039,45721,18692,27134,31712,34586,29042,39106,30823,2160,19650,59652,61775,36100,17576,34009,9238,779,35292,59049,42991,15131,35515,49091,51540,54295,10103,10831,54672,31908,57415,5830,51000,35326,37996,8283,27783,8343,48879,17237,52705,64324,20378,60798,38745,8710,55556,19347,7795,14106,35352,37669,38725,64713,65468,10585,52790,45177,65339,1877,34774,64318,15061,57735,1242,57021,56571,49177,37464,35281,38514,62802,65435,17620,8437,39277,44536,64277,49180,13070,55967,17236,34634,62177,33743,54137,4856,56229,35471,32105,45404,16227,1923,9594,40873,16304,4833,42657,64619,29616,36264,24679,63243,50299,23958,49680,12413,25208,63747,2134,18854,18836,58038,31574,64809,7690,45085,61603,13155,5151,28046,21319,21525,40333,42275,39493,27415,35882,3975,57482,25664,49077,13999,11679,48338,20926,22767,64983,63425,54551,61418,39975,35022,28766,64309,53689,871,58069,63849,9991,52598,56445,18784,32301,5020,63513,27833,35053,20767,65009,43450,56781,12358,37231,14555,64488,47622,56583,45935,38178,27952,64743,32673,33865,51014,37269,47546,45662,21034,29886,23417,13468,11023,30854,41619,40215,35102,48202,23344,31797,29487,63355,48222,51152,48776,30419,37518,32799,11954,24990,26580,12485,20905,58033,56301,52812,21465,35277,50871,7734,54144,16077,2177,46862,17938,29360,40301,1094,27022,43115,21791,46749,19428,63688,52200,24003,9387,23777,34930,58659,49250,6714,38814,46188,1644,37008,26561,40324,41324,18653,55665,41066,43193,44946,58322,26735,59932,35378,11319,13740,1169,39406,10531,28124,50481,53053,18500,51011,2820,46220,18141,34704,60438,34043,18950,21863,39263,1258,7644,23323,44446,58757,47485,4002,50746,52662,36627,13068,24210,31537,51821,39212,39870,28048,35095,59489,48310,28038,56669,54103,18527,13466,35162,49100,1321,65224,9923,52542,329,48715,32688,14702,33227,1391,8639,23298,1539,50628,4185,63116,46814,585,58263,34525,8303,48043,55026,50294,56948,38862,59723,28460,19035,1450,9710,14272,20544,183,4219,24019,7149,48703,45564,6533,10070,63410,37810,13233,64571,22927,29880,3500,53438,62775,54180,4206,42153,16488,64241,39712,54064,38720,43187,34438,13500,26789,45078,26580,31163,23500,33760,991,64070,9931,11069,60368,35791,51672,30694,65120,15541,28680,60777,56417,36437,33935,26681,49163,39302,18855,33515,1875,12000,16630,56861,8192,31675,63737,44773,64571,1582,53055,16153,15588,22977,6029,8488,43659,29870,47149,59179,28262,28567,3479,24768,53993,14771,48649,16256,24441,29221,52993,22452,63414,64136,59678,1384,34097,45014,16913,13868,14891,23736,61143,16273,64477,25140,63774,6044,3552,54215,52215,6743,40196,62328,37152,26583,46557,37982,45883,48740,63787,41749,26287,27046,12613,1444,50185,55072,31198,14867,61679,34257,50,31523,6667,64188,43011,45395,22235,49795,15324,22916,20866,35592,19211,46917,60676,45894,54594,10714,48739,2013,50353,29291,24129,44231,23508,36951,20019,11786,34324,44710,54922,53743,19618,26339,7485,45672,8464,36849,12042,52134,47332,37325,21094,21578,42467,124,10435,48458,41599,22654,914,36984,3929,29071,54207,50978,13440,4815,59328,16611,28611,57329,42805,18734,28064,56617,36772,52126,59673,33451,42563,46696,41963,32017,29111,22638,10023,29256,22494,50717,59532,25590,57289,5275,16067,60155,35364,47656,10203,20019,20260,18483,60975,9371,51192,57403,1392,64187,30616,8313,13250,22565,27873,8810,5298,38398,32206,17660,65501,32090,3730,49207,51547,38976,44776,48822,40500,54572,17192,58257,9191,43424,26484,469,52459,56534,58248,15641,43804,40259,49313,63044,1379,49740,56670,47358,16553,54387,50417,14265,30538,26761,20362,33877,6711,20311,18388,17687,55476,22358,921,37501,25926,48669,10791,50998,60473,45447,2812,20060,27258,57347,16215,56209,45733,42699,61368,21296,51026,56707,4872,12209,62963,44564,43716,58486,9038,46717,58775,6058,55328,28327,33683,10627,11706,18582,21258,24732,62540,45071,50675,22061,22878,32983,57432,32633,52373,61237,43168,6950,52477,34086,32180,33701,43843,54967,4867,3765,30429,24784,36083,58376,15277,5597,16829,44783,30386,18407,30423,39428,21897,45558,34137,17042,11260,14728,20487,22552,40943,41309,31478,6953,32310,24865,7053,34959,46892,3988,41233,34655,4013,64561,20889,11704,6121,1797,15555,15150,11322,36417,49232,36956,29848,58451,27880,43276,27471,55634,39370,49745,13923,18577,50644,29462,58435,3184,50683,36304,57744,48089,26633,14252,48403,65036,34118,40974,59543,57748,28726,8582,23950,55953,46951,47614,56234,6319,24554,42429,23741,26517,16284,28206,23183,34988,44186,53956,38940,17944,18527,54727,27681,28934,21809,37371,4957,48496,30216,62995,38952,3263,46508,11268,54649,57454,47822,403,20392,5409,47800,28504,6803,30619,11448,30273,50696,11015,25889,26777,24294,4303,8944,2549,26697,61961,29924,27051,40935,62401,65085,53515,53885,42158,37493,44078,27852,44783,56219,48346,8255,64723,64483,1130,54009,45695,13504,15954,65252,45621,59748,51858,14341,60748,19757,42831,15942,26281,28235,21566,64960,60338,40986,64369,14465,31598,5175,63558,48654,23612,7815,12827,48651,647,22658,46481,47477,45046,60415,53300,58716,38870,59986,41997,33407,56634,5018,22250,60007,55466,45672,42176,51315,51561,26056,38772,58212,28362,8831,55316,20247,3967,42039,9357,50916,61618,24459,3298,62319,59673,4182,23603,60769,25625,2437,15469,7956,38120,64914,35987,52203,30258,61173,36686,2226,1620,53887,56355,9811,84,10158,22244,32029,9373,17070,19635,36940,56600,62871,58819,53002,46332,23652,16165,56618,22637,58952,46755,28147,33318,63594,28003,60153,37510,45906,64056,5317,45609,55262,18076,54437,6291,21861,30624,63635,16205,22116,25762,25815,17750,52449,54890,50822,61599,7996,28657,48927,39119,3347,23499,9988,49829,61159,62096,16624,32135,33964,37571,50507,14889,11139,39908,44422,56004,46271,16001,44203,28420,31138,43330,50603,64765,5485,58698,19141,21670,848,35071,44761,12921,49700,41500,41224,10973,57489,63296,22261,57192,25154,37961,1905,10574,65439,42740,8190,57245,37508,8282,60093,33205,20661,43941,36261,60338,6794,22846,5271,63995,38983,46286,21757,45471,13065,29969,45521,17649,48075,9279,28354,12944,1489,52829,56500,49440,26842,28306,1488,9632,39967,62961,45408,17373,53165,30215,55407,22839,50312,36120,13755,5642,30623,15848,19132,16403,24848,34278,19233,12940,53108,58048,59952,30551,1033,41287,10872,5905,27997,8614,15614,25990,14443,11975,23710,56164,306,27972,20294,26273,47703,20120,23380,25419,15892,45132,65178,54957,56253,27919,62220,22475,17842,28685,33858,35113,7948,22446,35754,30680,41971,9377,45470,23628,49605,28884,2879,62071,38010,25809,19155,12917,25195,52865,32875,49663,29407,59320,2958,11374,33701,56739,6883,37154,64251,19347,55930,61916,3488,12306,46953,47158,54150,20579,64480,9305,20416,47709,44009,36928,61606,41347,60093,30996,23599,49170,61461,62082,46433,56768,45498,50548,43069,53457,28545,33937,27114,34882,11881,58322,26327,23646,36466,43789,35898,27196,5037,10289,27483,64199,586,5438,21394,29327,7561,55807,47743,39051,50222,48991,56498,1551,61946,57704,26528,38098,50190,61113,6039,36865,34274,58146,15703,17455,62947,43152,64301,64612,51405,19267,11640,6639,53382,20225,60946,34808,12925,26558,53816,13243,51258,28827,55691,8673,57333,10655,57865,35213,37312,16354,39690,50057,518,10825,18995,30865,13722,42459,883,26242,33386,57421,45073,53477,15542,51223,5101,39618,40718,27041,43090,20469,49192,43464,6054,18108,35017,30987,64063,11592,17758,14902,13788,14670,2677,48732,8001,24367,56916,60469,61271,49392,31506,48995,31358,5662,8574,45133,59784,37032,15461,8054,29410,49900,48481,7920,62473,54335,32058,37636,47078,36588,4424,33927,61111,61123,46325,15345,45903,40178,4685,64147,55238,50875,24722,52732,63099,39132,17579,49390,57573,28922,42494,38821,42330,394,636,51464,34580,6471,22846,53887,3334,21352,5955,60334,51638,42012,52816,36926,55524,50873,53649,24461,30668,55201,19550,17084,46040,54372,37644,31899,3601,44194,63295,28925,13122,16856,47947,63915,43533,5458,6411,14233,47024,10180,61670,5704,57577,7370,38826,15534,4709,29178,38523,48406,26524,35967,32635,24461,14204,14695,50255,9967,34490,10675,44082,57083,24662,50255,51885,54543,46627,24311,20427,29305,58570,13071,42822,26199,31111,62127,36836,46018,33832,17013,41002,9185,2979,60078,3112,60008,27284,34743,25273,14719,6615,15403,36399,50207,21797,49430,25706,25069,30843,43061,63635,55868,44125,48916,43216,45612,18383,63686,26340,61897,50209,55873,31102,65535,21836,42592,47941,60826,63129,29673,16722,17660,21514,58108,16431,6006,14232,49097,56225,488,64600,39855,32751,8921,56721,50558,7073,741,63516,17056,54515,6260,52459,35363,21034,28248,59588,20707,21993,64169,57378,45747,65492,42302,52837,36817,6473,19817,6600,51611,23661,15958,36810,65521,44359,12213,42703,20254,26548,43865,62913,13724,47363,43094,45171,46473,49349,29270,25620,53689,33443,45131,42952,2882,8883,27723,41897,27872,42329,62281,55505,1128,12389,5028,63008,3810,44489,56616,62011,53445,58034,6857,59571,33786,55819,51277,27912,41036,47159,57392,34401,9814,509,12536,42901,13495,24011,48497,64885,50924,36863,48079,22499,2907,62228,14625,40767,27939,57071,10465,16057,28816,5368,49804,24937,63404,52308,59635,36500,52020,49963,61142,9260,11415,52622,43792,11988,37717,56691,3351,18160,33835,21200,50964,13343,33374,4976,1256,41464,63252,49020,6498,32723,41537,41636,3245,54075,64321,33145,47522,22040,504,25403,3040,22534,38037,24090,10419,2562,65174,38104,60409,21167,1237,8653,38216,64242,58584,3191,39392,13781,44589,19688,20586,12568,56831,7201,3830,17592,6030,18601,58316,22422,35187,12769,33224,34314,7231,9456,64802,9061,1528,63603,56201,31800,37732,45660,56861,21790,54713,37954,50370,37947,60942,40772,55177,20675,3802,22067,46796,14470,18410,9260,35648,59367,52133,19608,3581,59292,22175,59919,13187,27269,22426,8499,40604,2279,39702,24806,41153,10618,19630,28557,31391,34975,64104,35785,5715,13599,45105,33918,22608,19281,64720,17079,64224,14852,58497,45408,11705,44327,37991,28340,21389,4587,12621,23046,48573,53945,20166,52789,42683,46328,36860,4383,47671,13471,20856,30911,312,50351,61696,23376,44533,26727,54722,37240,17111,61272,23691,44017,52227,46714,22640,20267,61830,47123,47501,46869,5608,39535,4546,16028,45394,55445,30301,47286,62227,37137,17365,45706,10450,14460,24658,54799,55133,4324,52189,20684,27444,54149,24008,10066,47359,27273,49292,52645,43302,55891,56502,59032,13513,40519,19592,63411,49923,52067,7744,42566,24936,21272,25652,13462,48254,23910,12299,46772,39539,4986,55119,45724,58262,13766,51692,56798,53748,26293,51612,22363,38416,52488,50250,11272,56011,24697,37570,24234,61007,8341,45970,9924,47835,24996,32440,22384,7852,11596,50043,58602,64748,13956,4476,18185,12205,5129,31102,46619,52424,27984,29105,182,11551,11848,43836,19622,44345,21768,62399,44556,56187,25440,5492,36618,42178,1409,97,64811,33561,23992,52881,24463,49079,7167,1368,42971,33057,7018,34706,28366,14828,47946,3712,38534,49537,23254,52750,12580,1330,35826,56110,31915,31730,37939,12828,7147,55722,13295,50517,44791,48168,23471,38555,13957,57155,15068,36570,34946,60512,39278,25054,51724,44,17806,11720,6908,12017,20750,28554,24510,60064,17820,30638,23182,10283,62090,63735,17901,7559,38554,23125,41724,15806,24831,8215,34669,21732,8949,25382,32368,28845,49121,45251,64925,45453,41474,21174,13894,1693,13601,59792,27625,20865,23976,62209,38748,5946,2551,23637,19729,38679,55915,48808,22789,239,15601,51079,32655,27045,7071,55918,27423,42881,40243,11422,43406,4673,35286,30218,1604,27036,8468,62938,10508,50779,22565,48403,23926,32305,3973,13272,42921,58540,52130,15662,37786,42537,38766,45692,1035,9199,32841,61638,12024,55058,47584,59277,45869,36939,7214,34189,60445,5594,23905,47627,2720,61736,62844,26463,28426,1523,22828,4245,47202,14385,9546,2150,34110,36722,38027,37761,15999,33368,17609,34393,61456,38774,476,23804,11561,4120,1153,49679,9756,9206,2702,54278,56359,20651,22428,54988,43633,51648,22298,11654,5959,58320,12514,25443,24018,41360,9457,41686,56099,54101,7121,10240,32288,34808,62736,65140,53615,61042,44562,43469,58337,43030,9826,2739,65391,21224,56379,32287,12706,39397,44018,62839,3452,49761,40600,39388,2025,65227,40597,56530,60501,23821,61927,20546,1909,32803,48420,13720,39079,203,10836,7482,62747,19026,29,61232,8911,31112,36875,49770,35634,34970,15458,4238,57054,23653,52655,43599,43772,18960,1047,7104,16518,54988,2616,57945,47581,41714,33098,52121,57171,60650,36176,30508,32734,4609,5696,44892,18509,57182,63435,43963,11444,46327,52230,5033,29753,59810,63982,27064,52303,40374,2553,27854,16024,63224,6441,5911,33836,54046,25182,28135,28163,16410,6741,15642,16957,60241,20320,42643,10056,32315,5512,44041,8429,24024,35224,30623,40078,8081,51213,25586,1016,6533,459,15440,56400,58952,19989,10427,6267,13367,17325,2484,1151,25507,44345,62530,23169,20029,20976,17031,64483,62646,51229,41401,31761,48317,6356,48015,61985,35568,25061,36608,62418,53053,49685,49810,55677,22331,27024,15698,38214,15431,18611,56552,14243,25882,31783,39085,18429,51537,27952,3716,351,14904,54719,45696,7483,49865,60500,37749,343,62003,64690,6498,33284,8125,18642,36035,22001,10556,43704,14650,8630,55664,21436,36863,31663,49993,51662,7588,37635,742,9951,65476,59772,10927,59702,54868,39113,37735,2673,61469,8031,43347,8820,42686,17671,8502,2910,35374,51873,25131,57662,48502,59906,55003,11273,5727,39975,44094,10417,20877,10127,20049,24897,21627,12594,7255,25768,46974,17466,30512,37908,27432,14500,26558,45044,46197,26863,21417,6391,39444,44357,30254,30869,12589,38080,18763,51928,18183,31410,15155,41157,15214,25705,48485,20373,17289,24745,46133,21727,15564,61753,5383,40802,33588,34425,5223,57896,43738,10482,10584,53966,63182,24829,30210,17249,8806,45496,27789,45979,17743,52485,18740,8714,51845,6799,48282,59662,8211,29354,32514,229,6252,45757,10282,23606,5995,39387,8069,3843,9418,4693,2528,4237,2619,22272,12344,43573,48419,4645,60772,46231,2650,49624,35952,32419,40233,19035,32717,36984,50407,25241,34783,58548,62882,20422,59123,47559,40291,48427,60838,20831,60849,60446,36993,43285,50352,51473,59777,18374,61994,1125,49570,46584,48820,1750,48982,17121,33799,56865,63696,10305,10422,37151,41531,779,33210,15334,40645,8026,9155,46261,28266,36308,35919,4,6358,47638,27829,37922,60690,32842,3517,55408,63710,1150,60781,58099,18958,41997,8839,62323,18075,10610,21334,10050,7786,7394,57120,54992,33123,29958,27331,22357,51235,2833,28762,58001,15194,6249,51533,56854,18758,30451,64490,46873,44252,36067,16569,4103,59252,20895,62838,64078,42684,36147,31215,29482,31639,19094,31343,7021,8808,44815,58482,47739,17610,61030,46319,7131,51272,54738,25348,41577,17026,22530,8889,56016,5262,23226,16294,50180,49710,21195,4065,53416,57378,64412,53690,30884,59706,21553,12776,14007,7649,19366,57632,35444,62109,61178,18110,28318,48837,38858,44048,37981,28074,65062,31795,56734,24781,23238,59755,45416,42981,36672,50646,58595,23277,56389,42218,50503,49264,59121,15721,35441,17918,30918,18909,40606,40014,60731,30850,53942,22800,10689,14979,51012,43398,53288,56722,59995,48837,739,57081,32773,48252,40023,11585,44106,61929,57952,23826,47639,34686,50932,47097,30464,47306,18347,26055,16806,17801,62824,172,39291,30706,39027,23916,51379,54876,59610,22991,35981,38223,53711,30096,13207,43949,62578,60761,58300,27669,1816,52946,58321,53341,45805,1230,59831,3682,16022,2599,28195,32510,7167,53419,29915,12450,5606,30603,20550,19835,18403,54625,31225,41607,34266,24476,41011,17218,10051,8926,25485,5653,13501,19567,52879,33376,51044,30504,50666,51362,32170,23885,19652,9066,14314,25925,39801,37106,52652,4849,43958,63025,21995,21277,13935,48123,33173,31411,20879,36999,43686,29597,22604,43997,4597,40449,29912,45885,287,6538,22571,24816,61604,12575,33365,20754,62695,28946,65469,9067,49177,26608,43734,27990,22196,28463,26447,58575,12431,7060,42795,39952,671,63408,1507,3523,45163,13671,44699,21605,36102,60133,33833,13137,26059,10507,20269,50316,55033,38976,8038,26531,61703,61497,9693,20174,53711,49844,28717,57550,59870,51717,11878,16032,21065,26675,9847,43169,45360,19748,56702,36732,29103,35177,7746,3413,59517,13293,24424,40921,4696,46435,56947,43797,36086,13104,17221,14701,43418,58319,8677,2663,1825,4522,44380,26363,55578,46368,59906,63242,52415,28770,7163,19590,12345,19462,12947,22591,50275,46808,49778,11028,38904,2868,10591,17996,9754,12480,31986,9169,64815,44890,35116,3629,58037,4818,24789,41846,18246,63765,46674,43126,12441,36791,15514,8150,52725,42494,21748,6303,51276,39540,41467,46179,18559,58620,35907,47317,8242,52225,8827,40660,7511,52471,6021,61691,26434,2284,59555,58412,2159,31388,59626,38521,51779,18484,25646,33224,23599,41344,9991,64345,26047,55768,36370,8740,60323,14682,35122,11562,60983,23548,55300,53017,34196,47182,29156,10782,5176,1739,31935,47929,62562,10043,15774,5963,48227,29732,28732,26314,29013,18253,25456,24606,9360,25657,30823,25612,4590,21405,62432,37446,48536,3767,34198,9899,40960,39704,46203,18618,41727,20463,26535,34628,23100,12925,31450,30783,54312,22146,55924,4226,5736,22785,43982,45498,20339,24583,43,7102,35065,1805,43985,14231,5401,27730,15047,31995,40973,9134,18746,40243,42221,51506,36362,43284,62521,13621,48777,41273,39182,59298,18432,60571,18164,5547,55128,5249,59506,7880,16580,40207,43364,52471,61618,32340,27061,54663,64708,36543,37475,41021,47189,35019,63797,35002,12218,3993,54023,12283,17225,49235,34372,49575,53962,19333,48556,35090,26963,2293,142,43069,59213,7812,1271,20412,53118,3838,64823,13628,48885,32751,6441,6194,6117,50794,59332,58200,24874,26480,41692,43792,24870,23203,34297,64707,4711,62975,42285,39724,17898,41863,42113,38019,17184,8467,30197,9371,49354,53099,16657,60233,31453,31587,45347,17000,19391,53691,25268,35120,25546,38581,53804,20540,43613,42280,44461,22050,61562,51620,8442,13253,54467,311,483,63438,50692,31235,699,37182,64237,23629,48720,53050,42465,51205,4267,4471,6877,10451,41720,1589,6424,27375,47033,14348,40607,49012,40143,39070,7480,47732,47778,61632,52211,33925,15048,36469,54755,60957,19966,64705,611,58425,20275,54073,5670,21955,54680,31974,34086,35976,6287,1086,35272,43019,60006,28354,35303,17000,61281,64763,55622,1146,12946,17354,21305,4390,52888,15430,56330,2712,44151,32567,43278,17667,56837,17641,21207,21352,8213,60480,48528,50049,18201,26591,59304,56129,53996,476,16634,60643,47391,37480,39529,30780,58651,5454,51710,38151,53678,11186,20401,17012,51737,27147,37836,29772,30639,10128,8456,49164,34595,425,39093,38784,37246,55750,53601,40762,21073,29260,42634,29989,26890,29828,48392,49261,53168,15016,34058,23292,10856,62787,39634,55147,47435,19366,19785,6515,6194,33738,55842,24994,509,20267,29535,30929,876,42975,56742,5288,31815,17557,11612,11979,2720,54945,12196,21492,12467,6281,22596,17673,18030,26930,44171,54083,21632,14583,39852,43155,5466,10649,7411,48649,26633,38670,1368,22245,40158,54088,7801,42394,57171,55748,12629,47209,44678,45142,34854,12639,20659,53474,7521,18111,35141,36260,37410,26787,60050,41968,47266,42833,39038,5087,50214,58794,57245,62880,41251,20595,34541,38466,62635,24451,57513,50507,64267,895,3296,49490,32436,48486,42235,10276,697,43541,53144,9792,44189,51610,59757,33793,9575,65301,46673,18045,754,42172,58919,18918,39392,800,62183,30500,15906,45858,51126,28699,45646,9620,48979,3317,3527,8078,19369,50528,24645,15343,42084,56316,6970,49756,26861,18735,36892,2974,31373,18117,7982,45787,15186,3860,8982,54695,4550,43877,52723,24542,36278,60772,12304,46448,63279,44302,17136,20971,35903,88,24990,31698,14079,55437,36266,45867,8510,62022,56702,54928,58616,25101,20475,50609,7986,37676,9179,28065,61357,9701,31427,42868,61252,19376,5370,58307,59974,28451,35217,46083,12260,16483,11826,2268,34878,3476,15157,49661,25513,8653,31902,44941,51362,16507,64934,22650,23470,5101,2296,4183,24660,30307,62824,46988,2881,53608,1532,44317,13063,2330,17367,1973,37129,26648,34812,14288,3031,6674,46111,10335,5991,23910,279,56603,63681,14241,12290,14725,12314,43272,30879,45932,51903,22729,17856,38908,19434,65152,23349,40147,22346,7975,5847,21037,40730,9247,13169,13782,54932,44534,3443,2056,21117,14284,3880,19439,6279,4306,16124,14057,47510,59221,21122,58866,75,14672,62765,4169,3913,18689,23191,41023,18234,21639,10018,2167,20367,26518,32307,56790,38767,23252,23416,31424,29295,33886,1274,15237,21851,24608,31285,20408,14555,24952,4527,30478,41099,21823,27692,15085,53648,2085,39674,51647,11154,45333,10537,5802,26782,56435,18744,57089,43339,3594,36334,24972,10118,26106,63089,23916,12157,27090,33606,3829,2435,20496,21676,57482,8269,22014,41996,30761,57132,37429,60152,44093,54310,21767,40949,15994,28384,5982,50634,7968,44263,64435,60370,20816,8163,39327,27453,19426,46516,31112,9412,56812,40589,62713,813,41221,8115,59986,31751,63465,40746,22805,18186,17535,10314,7697,64196,23065,51970,6897,10986,7678,57334,54110,59409,22988,39796,1271,53148,20421,27014,46167,62634,4554,56979,51559,31592,62414,34917,18720,29950,29432,23223,25244,7264,63674,888,45223,54213,14785,57132,5576,44671,54200,52169,42495,45654,44799,40766,46829,11035,65259,680,17924,50729,24956,13409,65220,42908,50190,29570,19674,6090,553,3820,63832,27293,46254,37267,2307,762,784,24321,45612,48141,51252,14155,40290,10305,43293,64707,28820,34369,64147,51795,36997,30595,51722,2345,20355,1807,481,37635,62313,55507,2306,41594,30863,8217,28880,63916,44440,29554,59080,59736,63243,18231,34962,28942,53034,2473,12340,3695,24509,34079,2488,55219,18608,55908,22048,57996,55286,35613,43037,64150,5186,38320,42227,308,45390,56465,62220,58282,21100,2720,33230,3274,57273,65225,58743,63114,18586,23307,58748,37219,3469,5546,1032,34585,60637,64115,6432,64589,36032,64629,34071,48123,59920,47694,13103,177,52424,26679,57780,65148,20447,15805,17384,21466,61333,50164,10970,25245,11116,37617,59479,2310,61985,55206,32356,26452,9728,47737,38047,56396,20177,61038,4298,18960,55274,11451,12381,46108,32634,23235,44542,58877,6828,13646,10218,19878,19432,61803,35844,34210,628,48701,55554,48894,29474,53995,33216,43414,20390,4911,62451,30655,10579,33229,62670,52791,28235,44173,15420,58408,51786,63960,29447,12811,50138,2832,48643,50585,42843,35133,29871,63373,26214,16238,20268,23159,104,433,40977,20252,16036,12569,21473,53537,42014,30910,44650,38616,59948,60826,47600,22512,16454,32736,59361,10663,10322,19167,29543,2260,8631,9510,9829,24855,48048,9263,229,55171,17375,63842,154,14150,1417,21668,57594,58342,4543,10998,45777,46913,8899,10527,49891,2300,53437,39664,33145,58732,36445,20464,38056,21465,10182,15401,27728,30992,1376,7369,23508,22146,63726,42286,37388,57457,31998,33245,40344,35947,52860,50943,45032,9134,23388,24987,32957,12453,58405,50172,29217,27008,10943,44279,51460,59963,45857,27356,24844,40811,55954,40479,19613,436,32274,10877,30529,43425,52978,57326,7125,47504,55592,14836,53017,33469,27871,32948,30589,60879,1853,37035,60931,20391,15205,42499,4337,49241,24309,46098,16119,15070,9049,42999,60348,53918,17574,54598,1788,11608,41023,35716,41483,61983,31789,6394,49444,17037,29232,34672,15594,18383,785,2845,22721,23863,45554,48616,3299,45645,14210,38603,53684,58214,17511,26123,17133,1915,51841,60571,26045,29255,17456,43417,47947,64186,13842,35588,56042,41916,20106,45932,7283,22065,41914,45110,49841,54400,55813,11952,34253,63847,48856,22956,38669,30150,44561,22983,32916,37768,55383,9396,36934,14123,24482,34666,29959,22963,8081,52458,39356,20332,19715,39511,43094,43499,30484,42062,33534,2395,3240,26482,1299,32899,32121,5003,64831,52500,51696,32394,28659,472,54903,43739,34899,44266,22294,29274,39905,15521,45722,2254,9693,48262,4909,58536,40020,42934,27689,29511,31684,46331,42549,59117,51652,9125,65378,60171,7293,48876,36464,62802,14176,63812,48048,64296,14415,21104,52480,35754,6407,16786,61310,5319,34979,54937,36488,63976,52332,63776,25388,11833,46543,24665,30429,16782,30864,65341,34558,56726,24105,31166,15082,56183,2877,63747,47376,38723,25307,43637,32947,29942,55745,36362,46827,7494,53766,17777,32837,22980,27623,500,14925,2136,46887,36588,21087,981,40357,4630,22163,46566,46848,5860,55000,54516,27904,4971,47605,12989,61079,10324,21619,24452,70,30281,40420,29555,48693,23669,16253,49657,31695,21307,29700,56798,25912,26431,21028,52104,10615,28199,16085,36972,43879,63536,56372,49339,60041,25837,62884,6545,29640,37285,38013,44798,8458,54261,62894,29159,42540,60679,61430,15747,43329,40082,58473,13788,53278,45100,24116,47654,26007,37639,7519,38190,22826,14249,54798,33639,13570,14404,19844,12594,48042,50749,64720,23299,22474,28168,35768,27615,5130,46304,51783,13543,19583,27339,34186,18803,17066,34611,1257,39544,46769,56833,45518,8084,5284,45603,29064,15948,40742,21263,37090,58035,13568,7511,28918,29138,29078,37274,21758,6416,22427,27626,58433,63383,29926,61798,49040,48862,29998,47651,8362,4090,37993,45461,32782,51236,44059,22765,49552,62714,31002,40533,56537,40301,62843,60400,471,45627,39287,48022,53313,18939,49876,31253,20644,36847,14326,11000,38385,45487,42308,62006,45123,50364,55189,65186,27600,55201,60310,29803,30976,60550,27668,44045,1254,54335,10355,36535,63268,63748,56167,6231,50039,58706,2095,50613,37836,36503,22394,4301,52700,25182,9906,53768,51767,5191,28530,11375,26142,30603,37161,7262,60479,31935,52697,7541,51703,1476,809,900,277,3776,33869,14902,1084,13861,38850,26140,43600,35089,60596,25886,41711,18636,9937,19941,31559,8076,24216,61960,24512,43174,17717,48978,39765,3097,15317,11602,30419,33565,49713,46147,56734,16259,65333,46695,6676,18035,17414,45624,46634,40982,4332,5804,9962,27515,18062,25389,25904,29288,16778,18611,17622,54527,23489,26462,5357,960,43952,6096,3442,21330,14404,22849,18197,17409,49344,57965,59925,45917,8399,35259,17547,48584,63104,15361,25074,40079,53968,31923,47945,55278,25192,50564,4741,45672,41506,20973,136,1045,37716,24161,64836,55165,57008,17099,17325,8294,32245,12732,11268,12854,61934,7667,11101,19050,29488,47443,17155,42787,14566,57615,16918,36396,3339,15240,2924,31643,57972,41000,46350,65223,14997,37396,16885,58473,22355,26754,56224,63764,9095,37311,55777,41391,39991,43613,65066,58112,54866,57217,44299,60927,63602,49437,62179,21522,50190,21095,1887,32041,59256,39392,64119,30220,41286,58729,33001,28552,42093,32994,4304,55469,60424,30781,28011,51850,24600,59490,53471,14598,64656,52285,32637,3400,61825,38014,9840,48185,4871,35778,17231,7382,13042,51552,51368,17615,40466,20907,37943,29158,4252,56085,60862,7488,13944,54503,54129,4890,55330,58355,31168,4129,22134,32525,30566,25666,54064,5705,43250,62728,55905,50897,16592,21417,26589,12681,29272,61266,42185,14074,3531,54225,50572,43128,47084,38612,15406,8378,11881,22141,18388,42639,22132,54565,54647,2699,53173,47342,11013,27582,8509,2505,10546,42591,60347,44520,57995,6453,61607,2704,3339,26036,13466,8977,20329,23207,26840,41456,38836,23437,61817,31806,15564,42698,20585,3950,31073,64822,21501,32780,18727,45884,37259,50807,2127,26280,63711,25777,48500,64037,51040,13459,29874,40209,37106,27096,26742,18200,36713,57079,15668,58651,18013,55077,47009,29134,14787,36745,9682,60798,10964,25157,35633,54607,13260,56404,63697,26680,10611,43612,51714,29708,43874,52772,35560,15539,43811,54868,7409,63548,22161,55205,64854,23023,3640,1513,5130,11596,11155,8330,626,65157,20179,34146,3969,61299,40247,64090,11526,5957,35696,6940,12335,35927,30348,49771,58276,6141,45871,14544,17880,39041,3699,35644,43569,27436,519,18464,29739,20866,27990,41922,3153,49319,29655,2571,53391,59983,61566,50815,23692,22931,46664,39739,15767,13625,56025,61598,65376,36051,7190,5828,14425,43021,48243,60968,37329,29241,11387,35625,15196,57194,13931,29371,56136,45124,44370,31091,13099,6291,21758,1145,61912,55601,43607,24616,43317,14809,17869,1785,64179,30110,39062,26255,12568,4266,37275,32431,58985,42600,5369,47805,17269,56879,39930,26741,53817,32273,5376,63624,9656,32772,57154,7323,51352,56064,47537,621,17663,5226,45309,23186,56553,20662,41444,19140,17513,2586,42992,23586,60322,51747,41744,23245,19556,6222,21744,62804,17615,55326,186,28147,59853,31821,61457,18672,32106,2300,12769,54076,12620,5148,45382,25477,59563,47403,24051,22034,5278,17594,37927,28579,46101,32270,49809,37343,59512,45031,26311,18692,5066,2455,47324,3347,9578,32349,11499,31949,3080,59609,5986,52695,58007,35605,9375,31150,64756,39219,50176,28345,62957,27625,87,55023,15929,17029,52367,29119,7623,41919,46392,45818,17014,27934,1975,10079,44162,36072,51878,8960,16007,28137,45559,43279,57144,59380,38082,58482,16036,52183,48804,60445,32535,19090,9109,53864,39395,15825,28836,20709,20361,52311,59120,15327,16401,37325,57968,35503,38317,15509,931,31256,16217,37960,10265,55668,26733,51567,61344,30325,21254,38521,13380,6834,51992,1,7681,25884,28000,60326,10946,38901,55405,40615,37587,10749,1278,158,19758,64655,5474,46518,42659,10576,33843,17525,21831,24288,23952,34673,63185,37426,19371,25348,10070,39917,25701,30772,36833,19730,58760,50943,44504,29514,38468,63501,30904,37754,9626,22976,53249,47764,1547,34121,11142,54972,26488,16984,17196,14479,32684,907,35979,37015,10083,10478,23711,26589,60338,21897,50411,62032,49601,64522,32592,50787,26985,14548,32772,8212,27001,5959,34179,45121,26630,8745,25849,62737,54382,13076,14649,36834,14185,18755,45822,54933,34043,38537,59946,45097,48112,3568,47621,37812,58123,23374,30901,59377,32397,29028,23029,61785,64608,8776,60567,41494,21686,10074,16839,33914,63282,8230,40817,64143,34293,8501,45019,47851,21226,50304,63653,12103,56917,52660,8265,38616,56773,15984,27345,36378,49721,49500,43044,10552,33738,3113,26153,9104,64508,20450,49080,20558,27792,20197,41819,18076,13092,44398,3195,35946,65330,9892,24047,35966,58238,6193,27850,44844,7022,7739,21752,38263,49735,11590,22529,28914,17418,5920,28577,62212,58281,9173,21835,36915,11245,60311,43928,27980,7011,8404,29768,8773,16488,54938,8469,39214,60748,37557,46641,45828,7041,8567,24603,31691,48899,2140,28844,19276,16218,12573,31906,48550,54063,48115,1140,14902,11332,58647,25172,42177,3809,64180,59416,31920,4435,42401,24743,35982,48776,26655,23573,18153,17089,49108,39424,58659,1322,33235,29665,8119,33404,42449,27938,29187,14047,38314,48049,7360,52758,51126,53161,52152,29686,55503,19616,61436,30637,34455,54444,35293,63546,26174,20389,31006,35138,37657,5722,57897,60131,50866,65391,28612,29779,58930,48558,31420,64076,59242,38173,51327,29974,61205,35639,58663,21605,21293,58589,11220,3900,39557,36317,59906,48976,27682,48557,15470,60263,6888,19036,9789,27721,40074,62840,34538,34717,15097,36363,58814,60621,24511,17132,38664,62094,32309,57643,31259,59836,37446,18752,57258,54034,52598,59129,5408,9550,21373,13827,49823,22043,37295,11090,48083,38414,5871,19134,54286,22410,22100,27314,1857,5747,51633,44002,41187,15105,50438,40513,23257,29878,35319,44289,26411,64622,65510,25636,56359,44637,42550,19899,43103,24837,22103,25082,19400,8068,2735,8315,32823,20524,33546,41638,39124,57203,55074,16299,18275,49273,19348,51824,41437,25702,25295,47453,4654,3309,53264,48098,11693,10517,20852,14659,54516,22888,43767,45396,52055,63073,1168,24042,49727,14464,55526,64952,32008,30171,2062,42452,20628,48995,59861,8214,35317,26313,43752,22731,1135,27832,21656,44249,21135,6760,34368,48422,54496,65074,10254,50848,46834,22425,52022,27289,51024,38135,33266,51794,39269,24282,59403,40372,36542,53832,54787,31915,53529,62452,25618,9338,54211,5009,3470,4598,31679,23411,59587,6793,46740,57756,42050,6622,45694,35119,44090,36911,34751,59157,53163,5535,42116,36760,55250,9593,40340,50818,14796,56619,32030,48359,48161,13526,5827,49257,26109,53835,1999,59606,18070,5986,38043,57114,36588,23955,10250,38240,54902,18927,50600,40924,12705,45538,809,60771,32492,61378,25424,49675,57728,29406,50614,45905,35147,8021,45317,7482,40338,50608,36649,30463,27113,32394,24014,55734,10013,19548,58017,24847,8369,23051,63176,31805,60242,40621,49968,42488,28429,64110,11926,14113,44710,16054,15478,21658,33341,44350,2673,2720,56468,57981,47878,28973,3556,887,38740,7434,10550,35530,28961,32282,20601,32455,5620,17393,63753,56755,21581,28322,43252,48387,32646,53979,51373,15986,2746,9048,57048,3267,51729,10636,45072,27062,6315,20298,52024,17160,56712,25306,4755,23882,5822,7711,34222,65121,64652,64826,4701,21943,51249,46803,60591,39856,19191,35062,35251,27967,58690,9591,54759,27940,15639,41909,55818,4393,49845,36527,9512,8103,18136,14913,23350,4187,35886,47331,28626,28583,54925,11077,45503,60817,9492,59070,14013,14616,58825,29540,27915,55547,6546,5205,26233,41086,42987,43244,54210,36399,54964,46039,28626,9915,50927,37247,35787,144,53189,41737,61924,14639,19097,35047,15508,51364,52195,55761,44056,62366,45251,2796,60248,63571,32605,34525,56588,50007,52068,53994,29446,17836,32923,23032,35411,42434,60401,8454,50244,36991,51051,60191,20883,10546,65284,7308,59876,35194,45062,42201,31368,4032,36685,17613,7305,54268,11154,14394,12583,8214,37933,52637,61780,15958,46380,26434,14938,1068,8919,18530,61048,65278,3798,361,23312,21230,22248,40888,47669,44971,189,33872,65446,35154,57188,54995,59117,6471,23091,12309,36191,53932,34272,11034,62716,55895,36835,62749,36581,35628,59988,36838,17711,27022,37030,4747,32867,20913,47757,16076,63178,59744,33103,35347,46608,48250,32046,25328,60969,20700,7248,65486,14090,31509,38183,54234,40600,64029,8732,51658,50889,53812,37903,65111,13212,49598,60048,52044,21368,15336,16833,35833,55350,64347,33556,58576,56808,50820,53945,42155,3497,24162,34581,18331,56251,5576,52171,34837,32087,29094,6457,60486,1894,56357,63062,35412,51375,8429,35835,60368,38489,447,1891,59550,45741,9129,18215,51498,24424,30506,47633,27399,30438,54025,50941,53571,52372,19912,13778,3396,47756,19344,13594,34215,12396,26968,18025,24769,5145,46294,42112,51648,52435,26868,5446,41927,56280,6041,14255,36209,2025,27550,58576,13094,15607,32660,27511,26016,2745,35543,17662,55325,31384,60469,21768,30948,10424,38861,51592,49124,19125,39461,16430,16712,58005,45627,59180,5495,872,1955,37121,53127,4777,50387,1185,43247,35324,44068,22493,60202,23974,9875,1946,39981,30558,28628,10787,38995,60908,29604,11348,30162,1949,62240,4652,51254,49063,37723,33376,22038,7614,48627,60097,47573,52551,32258,27038,45751,21530,29536,23626,14387,15811,51681,30657,26527,25520,30865,6263,53158,13453,63872,3708,4572,47635,22172,26221,19765,48033,63454,22041,6290,52403,5825,41615,40627,60914,9203,4282,16852,13693,36529,43610,35270,59281,54750,7591,13547,10188,61643,24436,51897,39558,37664,34009,17626,52993,61421,10449,20070,13101,51114,1721,5123,31052,36661,24119,10599,51975,44981,44647,42191,10569,47059,4740,22449,2680,57982,54929,28257,35488,59369,53407,65490,37917,32292,25681,12310,25962,58564,17410,38092,40924,25729,49513,22253,34772,18364,32721,4135,61278,15778,24019,38269,36815,64918,9674,50675,40433,48364,22605,39643,6641,61644,34542,16257,51189,5139,62724,46388,52391,57533,62145,53258,4120,23271,48148,27439,30459,45790,53132,10311,40285,56500,45071,19347,7204,62436,10404,911,5400,31219,14700,9690,31162,10403,39051,40434,22553,403,2688,43127,38973,1568,25853,1653,26844,20674,19522,4460,45620,58674,6576,41265,26468,17736,4521,52819,48667,33643,6657,13593,47836,9532,52846,19115,44441,8082,28895,52819,29630,55875,33370,11584,47356,52861,13608,45498,26044,54968,55188,41868,11749,56471,37633,13794,33326,10958,35017,7871,62751,36487,18667,12481,11750,26806,33086,4379,46198,48193,20117,31800,51074,18094,12639,4056,24403,60548,5272,19279,63788,51301,64739,40364,29461,786,46795,31083,20574,40535,9828,27622,4,14394,50770,50396,4424,3435,36769,55741,923,51450,8228,34506,55378,35595,21342,48432,42690,37961,27389,41422,65456,21730,36090,38466,17128,7079,11983,37276,41122,48361,61727,47835,54926,46054,14899,2075,22004,52756,46745,50543,17544,35472,10005,39900,54078,52289,14774,17976,1681,7717,6530,29161,21866,62600,45400,32305,40207,4179,45010,4367,26223,14864,10791,448,43051,38035,19887,4885,25655,36144,19045,56213,6818,11962,48224,28229,56525,8030,56127,49772,31582,6913,13457,33461,15934,53013,50344,11091,47338,20682,15294,12818,25807,51788,5414,14326,7906,60700,19353,18574,27716,44402,49170,21991,21090,63463,62622,65073,5010,38596,62031,42019,15361,1288,16298,34659,16122,32318,59469,26018,7290,42478,37651,56048,54698,38374,60292,26506,38617,26948,40045,1468,47634,20058,22585,20582,1970,61809,42120,44157,7351,46589,12331,56434,2064,2016,21906,48470,1658,1250,9284,49495,31441,5483,566,18921,40982,2512,13232,21345,58035,63313,14597,9801,62515,36194,52544,58492,40534,47009,14503,10611,18409,61056,30695,30761,5005,36646,63282,25470,30154,62130,42959,23706,59371,24395,14528,16347,6195,4413,60336,22255,50848,62545,51734,31882,56553,721,25235,55271,9242,37185,47908,63731,26732,29299,13961,33411,40333,24805,25838,11287,15313,62742,55127,62325,59148,34481,10140,24901,29497,59826,37374,59962,42483,5040,44292,56682,47472,48741,1964,55101,40263,37600,47659,18640,26916,58328,18150,26186,43355,58268,32215,2746,43116,52630,949,18205,63506,43144,36764,63596,1865,15812,2309,45559,5433,59868,22565,9218,51771,61810,46311,13402,61366,35308,2789,10767,29190,51238,20661,12143,39384,54326,6098,26760,44796,5645,63911,29664,4949,44241,62156,63855,55741,44602,15760,44594,50333,34264,26564,3075,59933,45010,10151,55873,22838,30081,64249,36320,60185,49458,44308,37514,61864,52273,36623,17180,27655,48259,39558,408,2618,1205,59992,23461,4477,51096,18554,54116,43768,47290,15083,4223,19360,58541,10616,44391,2682,3381,12455,25841,21900,25084,54436,52473,3298,65369,22044,28574,38895,52301,61139,20952,7325,22593,31548,16352,46870,62179,1150,29296,27740,11113,25092,4403,22833,21871,55749,4078,31018,705,8132,11637,14744,24909,5323,11385,55908,33553,34961,39425,45669,13993,51311,42502,26582,46397,34331,20109,28659,32456,17291,37586,3114,34257,8111,11822,31472,15972,22351,1154,57916,4478,5581,9783,52501,48307,24023,16293,37795,51965,26153,19868,14217,18504,26704,49508,37019,8729,21437,19668,45058,3669,23730,23020,13118,44921,26124,39070,35863,5426,836,63875,29383,47957,21346,32690,60290,7555,5098,23941,27038,23278,14202,53469,41198,2439,9375,7563,40886,16102,20164,29097,41002,43980,35867,42321,44860,30231,27302,59377,17515,54179,32936,56263,12586,34565,12643,10914,40742,33277,4143,36821,47530,33160,39499,13257,56102,65245,40156,4821,49803,56336,27006,50319,49894,64411,23244,13623,38930,64773,61990,51638,51147,36822,38420,34141,39685,56420,8551,61083,44785,61150,37253,4625,47444,61698,37615,39396,17120,51595,47956,11308,24483,26954,63718,16466,6457,31067,16191,4812,54814,8833,18887,45203,41312,12873,40951,49137,10486,54685,46358,48565,7879,64273,5903,24216,20166,47368,18787,52187,17404,56481,42846,50193,11692,26949,42220,1011,46761,19501,28172,36818,41637,45484,42683,2687,48510,58148,30255,3223,20303,39347,40377,42300,64094,5127,55798,3365,19136,39176,49941,8733,11071,45256,43752,59164,64871,27720,56091,23944,31325,47346,53995,45655,62680,179,3793,39085,40820,28435,37522,22582,52883,58278,38399,12589,28731,63648,15571,42462,61128,61790,14200,62156,16084,54404,56101,56312,15294,21672,13377,127,28046,19887,42159,31524,39806,3513,32452,3706,43656,26230,53586,43674,8553,6647,23748,49479,8511,6531,60276,23680,8661,27204,14484,29398,35234,52147,7106,44047,64281,11409,60606,10005,5325,19586,5927,1033,5252,28666,19539,32851,20063,35731,55244,19063,33737,1233,37334,12630,17073,56508,13993,52985,38461,34777,14455,16030,22748,54859,10964,3392,13898,51006,2107,2580,7438,49307,17684,10674,7559,50679,5154,60064,32557,14951,29129,49506,30350,4351,27110,6988,37062,12587,51397,60278,19313,25063,3800,46521,57171,47489,9781,27391,10775,883,31192,543,64533,34110,42070,42117,6161,8239,60919,39629,48086,1569,46976,47952,53849,42004,30,34924,57875,28425,2431,52065,18331,11249,44849,38009,4034,3873,16443,31588,60240,14419,48160,29748,53621,32746,47761,44175,4698,10550,10217,10430,1251,8919,37165,62606,42272,42377,36125,18313,59367,6001,12854,21945,15279,1427,46050,44986,42296,44298,65137,59870,18926,577,22462,50727,47780,48939,17278,62319,53664,23428,43598,42230,20925,64174,36585,16212,25162,14345,43007,41415,25893,61137,24719,43752,25451,57454,40929,41631,31471,43294,54003,55190,65327,62396,36833,29024,15856,57435,32372,35828,41763,12416,50844,28283,22644,40337,9436,13681,58908,19982,6375,25804,62995,27617,51662,15174,30386,55460,48800,11590,23553,36443,52348,63334,49162,16542,25829,22769,56379,30334,45328,13451,12100,10459,59657,12551,4696,49909,28591,25330,59741,58873,26937,4635,47140,11017,17755,64947,62917,55568,30047,62421,7216,33747,14342,16970,50875,39401,40100,36779,54072,22347,30837,62572,26323,54988,7870,42897,35009,49753,1931,42972,43927,919,28561,21486,54911,55374,50004,29803,7975,54055,7952,58660,29682,45773,33638,23545,19668,41029,13981,2263,44476,55706,25612,53826,22261,39735,13048,36057,59574,6890,3558,5491,18210,41879,62784,61148,45604,6316,13525,18071,9668,26026,5804,49444,9082,52121,15848,10330,33180,4662,13072,55956,20545,17386,57671,10823,63582,53550,26193,60651,55015,29779,11398,3475,9988,8645,14064,30078,25923,12685,29191,42521,40029,6757,60063,23544,889,51262,4592,58063,56785,40370,14637,34706,27398,5222,25527,42349,48854,34096,63283,60927,46529,29724,63170,38058,9130,49326,24031,30483,56985,57634,30163,11384,17035,20486,18745,29711,28779,40585,6764,612,8925,43267,791,16768,11633,52112,18442,16302,30046,16576,51560,11089,8648,53223,14966,7013,58271,44642,20809,943,1818,52412,30479,49618,26430,50210,34108,26028,4335,47220,26656,61107,4073,9694,28515,18227,19974,56819,49928,42344,62904,44880,28376,52971,15186,46579,52585,20361,62287,20388,57295,64093,1926,20000,65477,58386,19822,27770,13906,251,16624,3466,13166,33125,15074,63210,17299,64981,60175,40430,44465,1888,64401,34588,17347,52687,47900,30064,4411,11699,62829,13076,55940,2941,6774,10793,29579,42314,54231,41797,58574,16744,9999,58578,57472,5905,34857,24860,4009,45694,36089,21517,61482,61760,21973,8092,47847,42187,46780,48606,25914,17130,12681,43405,33452,60865,5626,64142,3430,34177,63669,35173,17012,8720,56058,35997,23803,55694,11281,25583,3975,27746,9091,18490,225,13858,14690,2304,41796,50222,16449,51953,38160,47310,19739,53473,44290,51514,19277,39387,61331,25998,44255,35461,61591,44730,64600,22328,58339,56415,41347,59868,17705,64474,60365,20551,1928,2182,28894,6959,17016,24358,37597,16687,60320,14294,62373,14281,10454,6875,21850,61665,38163,58193,39997,60614,47464,8152,322,21033,47033,20000,49941,61253,50850,35411,61674,7027,34726,22207,52613,37440,12739,20264,62053,22237,55119,8242,58727,40115,26487,56349,36618,58547,784,51213,19360,23067,62444,21735,21650,60932,19296,55136,56890,44052,29778,62582,40091,63938,34642,26607,28079,51593,4565,8626,23955,19317,30548,30124,18716,29478,34577,44273,49156,36547,36128,21798,3661,64254,12617,1179,36089,52362,20878,62711,10359,27331,13061,15666,51987,37063,40377,10479,15845,12649,17888,46801,14493,44182,52695,48987,9243,61978,22611,56500,61329,27102,1588,53483,41503,14016,44645,55968,11982,19279,45977,49640,46956,51928,33559,14467,5938,8721,3919,30682,4537,23323,28923,42730,62421,9554,26428,26989,19044,5037,62701,26370,21186,30742,15338,10235,33798,10749,25076,42681,31802,18468,6347,61965,17271,33218,4322,57965,52442,10842,62301,54239,61175,30908,59630,16959,59632,17634,12884,22298,452,38073,8420,23984,57443,21054,64582,18732,62441,43919,43635,44363,7211,35100,17088,15069,10221,45658,45738,63950,62014,11081,55626,58443,64312,8980,22779,43143,11343,30894,23333,16348,44493,34061,52343,35594,27464,12287,65380,11601,5271,27803,23347,21198,14868,23140,28519,43543,40726,16900,28141,63604,62984,28050,64115,53242,5512,62373,4316,17359,31771,58335,43388,27259,40311,55783,30457,35200,21903,3190,13904,64064,33229,64212,48956,27670,8919,3095,49515,677,30276,44233,31814,18301,51440,3512,34492,23027,46597,9316,20691,36573,25211,41078,42444,8657,6634,5733,40879,27164,19010,58543,51018,22020,43399,1135,7928,42925,56956,11268,22187,17293,4698,52079,61916,14266,18694,17832,33710,46653,3736,207,63313,49072,21494,54433,15043,40961,134,10814,59524,8940,15795,42379,49977,61622,37130,20703,57706,15049,61792,27041,17276,26413,5461,8596,47519,40686,44829,63986,18386,24732,55488,49489,12275,37402,34932,4586,24644,19463,14885,6648,24760,56394,2844,57789,31997,21898,49390,22033,61003,48209,21523,41684,56069,29015,37813,20844,63986,59027,32418,13333,1166,12353,34446,16660,32935,12114,31225,18718,58784,50317,30660,16762,55440,52986,18905,24751,25977,4385,26896,60225,21606,737,35436,59441,27503,1494,51106,53581,42405,14914,26719,31121,16547,53564,15423,55953,10373,64539,23077,63427,56023,4804,23040,32151,24105,26561,36539,20257,13927,55134,15518,29082,60460,9591,22239,42926,35947,11969,27775,42676,62402,53580,51340,6875,36504,61976,761,52868,36017,53982,51761,34741,60952,25315,53707,32903,7339,31706,39582,41272,15718,13556,2416,1008,1893,51212,42895,25871,56338,16360,3622,8594,44130,56234,39464,33603,19088,14608,51610,23700,16234,14599,27622,40187,36629,31107,45807,15930,5622,40752,42207,4213,52630,37762,57400,20553,56886,60816,37247,8583,52097,54857,23632,43098,17647,9102,36824,58687,42952,22500,44465,29430,8842,43441,46379,50782,17984,7050,59547,57145,10857,49285,3770,48455,56210,13685,23688,24468,30837,31213,28356,13027,27134,24522,43019,29946,13537,23048,10729,53664,2207,38266,46408,4225,10485,53442,10519,4556,53580,48613,44500,33769,17104,35675,19452,12730,18957,23347,51470,41886,33047,10546,29153,57197,59969,4635,33926,31372,16761,28322,57092,32539,14230,52247,60837,18262,23107,16328,48594,51799,54461,6560,61456,63118,32260,26195,14748,4520,45731,48430,17852,14438,42956,43693,38988,24486,52707,3687,43649,6357,59401,6319,43065,33613,58372,40591,17451,53115,6971,27971,2129,26005,31916,29684,43932,11699,49731,62876,3687,13872,34060,29170,32625,42732,44891,23600,48660,54778,36266,38080,50991,30392,8874,28952,20315,14269,3999,36479,10865,36471,54239,55121,9072,25178,36207,28299,13325,21402,10574,57177,49807,57425,46225,58155,22060,16192,10609,21796,36490,36778,14842,40188,18098,61383,44275,20244,30583,27635,3999,30425,42616,31033,720,57120,51037,16985,32598,56240,45595,40530,55307,38287,15176,5728,57370,12110,8810,25449,34090,41956,14822,18365,22038,15152,55151,3650,39036,15250,46554,9489,56576,41686,19980,35620,29930,25530,25417,54665,14208,61514,19918,25350,63406,46197,6871,57002,46361,42292,43611,24906,21063,45532,13658,44638,52815,6774,24651,27185,9978,12768,27375,22750,37191,38068,63268,2109,21542,36541,32325,29545,30792,16060,16509,8997,41682,33209,2903,24925,20489,30345,56123,26826,65518,46028,38781,9447,10815,63021,32787,38580,51927,44572,32030,29769,20542,10752,24572,8230,49975,7152,23024,57676,39547,62791,49508,56670,60326,44412,42736,19106,7605,47289,4669,60549,49631,29556,62396,35334,2646,12913,61687,11982,21442,14310,3869,22194,15675,50819,21171,49723,41976,46874,65515,26594,45791,61514,51981,35700,60628,38543,58998,35646,5634,21102,35738,59818,269,40822,35569,56051,19990,5979,19816,16507,12421,36256,10780,24941,36031,4198,12051,61563,38944,5040,52746,7444,37232,3524,49167,26771,5644,59940,34411,62430,29589,17057,59799,46760,10123,41572,4020,180,38681,25723,23468,883,16159,62573,4825,16706,60924,1964,50777,48427,62941,58055,37353,56129,10976,35705,42607,55512,40631,59955,1088,5481,15850,25991,25424,9704,31110,36321,39584,9731,40139,42558,34030,14452,59901,58912,18881,2383,51367,61836,28526,58147,64989,26621,34146,1208,13726,63637,16285,8568,8559,63798,26991,51164,60060,45228,7848,6373,24590,15177,34408,55240,5635,28885,61614,32222,21376,22171,13501,54223,55862,34851,49578,8201,51467,8958,58772,28729,29794,53347,35822,54517,29300,32199,47857,14315,22204,58332,3612,36305,33042,53212,20206,26171,13902,4788,14777,5142,15349,52218,22104,21226,39481,12759,50047,12289,35103,46372,10868,13142,8842,45694,37002,1644,57283,27264,24249,14544,48417,8314,56240,63235,57959,60725,53239,46728,27971,11011,55943,51919,58252,52169,58481,12614,46441,13745,15543,4666,49564,3099,57796,65487,54359,31184,56134,21453,32729,30921,12930,12865,654,22892,21204,26805,25737,18771,43807,6290,47972,49759,50367,8944,2135,22671,35816,4874,9421,64059,12814,62538,46858,50764,561,12693,46591,36511,45358,23666,33992,30838,55365,57345,20696,1014,16802,42889,53604,15905,26105,51539,49899,50325,34542,58807,61590,47320,57408,61112,37041,57757,62110,43458,13061,36288,32453,61861,49320,38941,85,5443,25436,60339,55136,36797,62847,47311,26643,35296,54355,25795,52654,7997,62021,62243,13173,51014,57598,27097,64357,53681,19917,9008,6564,45460,28692,12180,42376,23664,38833,56140,53970,38674,10491,16429,29725,17683,23613,26109,23111,31393,5718,14969,58782,39882,21690,23524,52320,32254,28277,47169,27339,41379,55804,11368,56035,50519,34905,29835,23042,58023,33039,39880,37619,55896,5475,32074,8902,13404,39236,47859,64578,3643,21574,27631,21964,6639,60640,41713,19476,10585,64295,61951,25769,62072,46152,17577,47306,11354,3583,4884,44103,35491,63913,26289,40528,30979,1086,16877,31396,30114,53150,54961,27478,36768,28318,13087,41371,32681,8657,16340,54779,27129,9574,56604,17815,55924,56930,39334,19114,45324,58986,17884,55032,28683,20690,35803,33517,26869,477,35629,12982,56642,43689,26311,59121,51323,41884,46801,55967,53446,15238,45408,46301,22333,15365,20814,8306,62529,41879,7795,12543,36631,24283,7245,42004,43446,821,25000,34789,39887,13747,42644,39152,19759,43815,53619,58408,48558,35008,39669,25658,3881,61384,40651,55400,19703,18292,10446,64810,56227,26650,40142,10888,6831,34749,18158,57579,28253,42488,23655,63261,45903,58826,24704,64860,32200,37157,52398,348,61067,11741,50845,2032,30831,61892,61139,37094,21724,41194,4533,47799,55714,18705,55717,10155,30174,46015,10907,53894,50300,29110,44933,45955,60974,26546,58412,53021,14962,27526,43720,59743,59660,19283,64364,12547,27142,7510,44804,53252,18386,43121,47919,744,45345,17719,690,53585,3218,23622,2393,36505,60794,49628,36763,5664,9647,31198,11194,12008,57851,49653,52736,21840,28579,20350,4343,42721,55211,5957,53556,46214,23444,24327,13999,55212,42781,42281,49925,65021,61749,45445,8823,14953,17614,1865,28649,5792,19958,35823,37578,30414,46674,36934,63751,11137,47659,56728,8161,1459,38635,19278,63078,9228,11119,8200,9738,27599,20191,59030,31190,46276,28094,6974,36174,25232,44341,62381,50305,27983,19902,27350,30166,46847,58475,36453,12293,57952,4568,10900,32803,34598,6879,41048,35127,63555,13381,30027,60749,48452,54320,24557,26612,55878,40738,18908,22956,31830,19571,54766,8242,41777,22137,63381,42904,14594,35583,17949,793,60916,39632,64293,24387,13185,36184,38610,23049,14434,51883,40398,42620,53973,5620,45939,18978,19719,62059,19025,28799,33335,13182,54985,19259,39381,31014,9963,21294,29670,32852,49878,4752,50649,64607,59585,60800,1523,48812,30874,61692,53680,37254,48734,56703,1618,58768,61808,39189,11790,24463,11830,32580,36774,55084,19740,27715,24406,43013,33452,59222,1130,64442,16330,15853,45769,4260,6531,59582,46880,60477,13621,59242,22962,34082,18318,12947,30099,46006,1299,13431,32337,1557,39859,50809,348,38024,54613,12783,31769,24448,41225,51158,53609,60872,25139,34301,3808,6070,63185,40624,7842,30586,4909,3601,53389,19744,27463,12058,30128,64635,21626,48013,56500,44118,62473,2155,3534,38451,22108,47342,2529,15200,40784,40759,44601,30088,45796,7008,60828,48872,24578,49399,47143,56227,32051,37937,45433,63559,31548,53227,18730,41321,14647,42172,51560,44786,65416,41614,45055,49918,29290,31588,30844,22640,15926,59079,29831,43723,21187,57654,19619,59385,16441,38420,37941,29409,41098,15431,47192,54503,41564,64365,30622,10604,50563,36397,37560,21498,8123,62735,11465,35778,30039,1375,32384,48324,20632,31681,8222,38507,36704,22061,32412,36115,18311,7701,45309,29103,65238,28465,49075,40932,53097,18446,24462,15641,36922,31027,60952,31040,63961,14612,18011,19131,34302,8000,19196,60721,22205,13642,63413,2383,9239,49983,11954,56206,21138,53091,10395,64985,46557,5836,6361,42410,21860,47692,39455,44050,7045,39941,5352,60897,32150,45725,2944,39490,53650,10292,54537,15088,17204,38969,6186,65135,17952,5919,41398,62031,44734,61122,7510,41754,64718,29528,37089,49369,62940,43870,61326,5777,3735,35929,12749,54145,47492,10923,50447,13381,26241,47684,59620,60401,6027,29843,37554,6025,32861,14674,32558,43206,30085,63214,8758,16561,32628,41397,21768,39864,39756,2585,5972,12795,56870,47456,27013,22487,16121,33014,23537,29179,2262,21342,16373,10958,38551,54623,53464,27188,17403,3240,51911,59553,52544,31845,3175,37084,1668,27986,15144,10411,11318,54844,49190,34781,10078,9229,42919,33004,13306,35122,48599,58770,12864,28711,41788,4354,42983,45048,20044,2382,27946,31622,34702,32717,14344,62124,54198,10908,37691,36996,11180,27247,66,58412,19620,45262,44332,19973,61323,10895,62258,11174,54418,42005,9320,60572,48254,43601,8696,51230,52378,31300,46062,6414,10213,6497,21468,18777,56973,46542,44819,35889,26397,24800,53511,40815,2831,45874,49,62675,59845,49608,50397,6573,40846,48531,45609,32862,29203,52253,5186,22782,11799,46300,47810,32913,29137,46948,54510,51693,45437,9425,53943,48598,38287,57439,20016,17350,10180,57353,34914,59857,31799,9020,29778,1234,12176,3528,45987,53456,617,56929,3122,40559,32408,12353,31375,63112,6476,55346,2897,44639,33481,40980,38480,54184,4105,10210,60529,54344,42502,7617,50171,12157,51858,59366,36668,9834,4144,33050,52302,2406,39780,63625,61239,31811,45294,8019,54985,43820,36017,14777,19019,29803,43356,23213,32342,21584,56290,4503,50635,15243,56487,46479,7021,7039,18100,20268,55128,48320,31410,10975,43742,33927,21041,31255,27243,2305,54279,40015,48895,10907,14633,998,13003,3501,52833,12682,61281,4392,46558,62912,62532,23957,8435,8745,35269,62468,2604,48157,16063,29922,53773,65506,40534,61300,42351,10048,48248,9566,26481,21339,2492,1173,36543,8829,40612,32290,43837,31848,53905,19924,52557,31076,46584,42567,27439,7495,23623,56235,38105,53021,52493,52773,57364,53452,20685,60202,44742,59474,52127,11121,16729,11759,12809,33709,28255,15410,46739,32733,5199,11383,16542,43423,1428,16220,46983,23248,64675,22227,51252,4542,21230,46160,37343,20986,53068,39,20608,11355,29795,61468,21616,9533,11,25512,44294,43076,56270,44006,38512,35203,27650,15638,60739,19523,7449,3918,30075,55684,5939,6396,21946,22289,2339,55627,7816,54083,9392,47250,64342,44385,29247,14589,18430,43081,47771,45197,27739,24495,15965,48283,64236,43678,24016,37804,13567,21808,58333,20716,53069,61951,10684,1738,44620,45496,36288,13115,48500,8905,47006,8325,33910,7238,20039,42345,29775,62241,30991,10035,8501,59640,39193,62945,54308,19701,30232,1663,12118,62215,61490,49938,9241,11283,8935,42267,42443,16040,31312,39944,64188,17773,61444,51233,1337,64059,51742,30459,984,12516,18371,57509,27548,12599,49575,57830,55874,60175,48645,64539,6890,13735,38935,62018,33751,42550,31543,26363,8479,7749,46344,46908,41565,6977,2289,32829,12204,20051,32164,18707,32476,57591,52934,58528,54798,31310,48365,59422,32434,42699,64606,24183,35089,9055,43276,20132,37733,61675,33020,14488,58809,16414,10089,18241,46442,50499,36455,33302,17228,30787,61171,51298,51251,10643,54302,43798,10582,58525,3344,41265,59201,11813,3150,11846,60831,35348,57823,42636,13152,49072,62572,49726,2413,7734,56261,39796,29511,4568,21293,41999,11022,4048,9377,27376,11140,59573,46409,49372,18838,1467,15884,9108,8171,13184,43020,17984,5558,3961,8949,47383,59768,241,43519,17282,57725,55458,50844,38170,4557,14498,4827,38746,37852,28454,23818,4889,39371,56735,28705,60070,7873,50932,46424,1709,51605,22209,41383,27652,45028,22076,50808,11178,32763,35785,35674,44518,63230,1360,64481,30168,17848,35862,7765,27299,58509,16995,4872,33757,45891,31367,27474,27111,27155,51446,14231,5545,35468,54918,33237,2996,61480,30779,64740,46783,31102,38601,14475,43842,14780,15859,28861,59653,60533,56610,31342,50160,56921,46424,34032,8073,23997,41777,19137,57853,18611,38799,33438,25575,3201,23799,49217,37393,61740,15172,51834,22169,870,24354,35614,15806,59169,12292,35700,49286,4113,22565,23282,32036,41848,31161,21393,21815,22819,26615,38534,21122,39388,27219,34799,11808,33876,53411,62884,41036,37592,3269,45604,31611,33882,54205,2714,1454,20036,38015,3760,15992,64595,31547,6491,25482,59473,31813,20305,3198,1546,6418,29289,22594,64688,53565,10342,35523,38432,17520,52849,65498,7737,54293,11337,16860,10051,56319,60454,42965,48068,24694,45360,61462,53065,23747,7490,37341,37728,8288,52159,4909,63973,64256,41260,57030,19850,16292,17144,64927,47818,43764,57912,19859,5677,27943,29471,65294,42684,40983,47727,50289,51095,25998,11188,11528,63600,34205,31860,59784,59111,4915,19395,62612,4262,3474,3353,52732,35607,4850,29137,24083,38680,49705,9094,28737,22101,27597,29356,46394,10318,15266,60542,23010,1576,43835,6213,54674,33732,41282,21732,13065,2903,30505,24701,16927,46574,27430,5072,45868,21803,48354,454,15808,8806,61319,4852,16958,17421,56297,19977,49144,32538,57070,1084,37649,27997,48928,33074,16663,61804,36757,20633,30115,36960,20793,24178,48517,44094,37965,8512,52889,34814,57077,33441,19398,5712,20142,19457,56843,44012,4403,25745,39615,54782,46214,44654,37554,40226,3027,50419,16007,21909,64120,8725,51073,62413,11918,23036,13741,3279,13776,9456,12432,41769,20011,21061,26873,54993,27591,37113,63265,29404,27882,35865,701,3009,52087,39887,56513,57077,19809,60385,27610,11776,22408,8552,23447,25386,57956,46714,782,459,31170,59723,7178,42822,65501,16902,65090,22,36878,26621,14724,34173,40306,4217,28035,8093,2467,28030,51309,52878,39616,43,56852,42794,7332,24425,35792,35179,55748,12920,49492,64214,55742,17562,61181,51601,41753,55735,22196,42425,40743,34108,23511,11628,12180,61987,19900,33803,32911,62683,19057,19298,54367,62749,63296,18439,24362,25994,3302,46735,48732,50310,54893,32652,49297,59272,5305,2939,6304,34230,49611,21312,37625,26972,16675,14216,35232,13471,55067,56810,4038,63539,54069,27445,14367,22977,20069,42081,61572,28020,54175,25501,55215,59681,63648,4501,20874,40283,14606,65473,5031,32069,59753,14394,30262,13327,56250,4206,4867,36146,37722,44093,40491,53929,9895,42978,56842,444,12870,50431,59477,58339,16147,33755,59542,4398,11707,33831,20638,14262,39532,24665,40783,49221,11255,21044,5197,52140,23768,42525,10861,6110,28690,28052,23194,26849,35948,60850,22896,49957,40726,61584,59984,49816,10596,61174,45135,63271,25902,28041,10297,19423,45620,12484,4217,7193,27393,53534,33583,48167,29004,47,54498,46061,13989,60171,8726,51966,1797,7165,65173,6497,34950,32923,19448,19042,31018,3852,11812,52557,38519,61610,20413,53171,44248,44770,62291,63660,3983,41484,12947,63531,36513,6376,60589,2268,39074,51593,25405,52335,26957,14475,12347,18441,16031,8042,51130,24408,32784,63361,25745,11559,40789,62938,64496,36894,35491,16111,18825,23873,23002,617,29663,56164,19750,41291,63236,65340,2119,52227,14351,18832,40061,16589,15683,31765,10903,17834,7731,17472,52672,62761,53555,48605,3300,50149,57908,10680,364,58052,6653,47954,27343,41237,5006,33630,61310,62914,33616,23734,3454,3850,53529,20266,48346,65495,15090,61794,54481,1727,8695,46653,53939,21727,34178,51468,55274,10696,18860,40096,900,18328,37419,26638,9434,48180,45012,4936,51744,54933,50085,14656,55242,17068,50606,28995,55699,8702,53928,3648,28583,64167,15976,3096,65008,52686,17098,61974,53596,34910,768,24103,3310,59602,589,7246,60813,20147,42926,35375,16486,49850,6712,9952,23635,50955,55430,61003,31379,47772,8580,15672,52700,55975,57898,3721,44176,21740,37459,19358,65346,41750,41486,57769,64249,65241,4483,3114,26047,15843,24237,65171,27229,17831,34001,54450,3762,16676,42711,26308,6290,17582,9066,43854,11397,8213,1508,56454,13853,16463,59340,51754,4179,42426,18372,54837,8671,43274,46652,43546,41760,54392,55009,21401,7869,25791,50245,50886,64718,22593,48801,41382,29118,62518,11876,1106,54628,63767,30616,23187,30973,53128,44930,1094,6800,5804,2999,22785,29683,10159,13255,26254,39801,13621,26650,45077,21914,50583,7583,16222,55755,19698,62724,62375,65100,29922,21929,31466,60663,26611,443,49600,11222,52380,52591,21203,42059,334,22136,20522,59486,23491,20868,1191,14714,35636,27831,8175,55705,43720,10860,46017,36956,19740,36933,6686,48413,19315,18500,18044,27586,21582,5955,62784,39734,54484,56859,13056,55690,11093,47957,62366,202,12075,51336,16425,18004,33698,39392,60548,330,31337,25340,63310,9589,56328,25704,61743,12512,31735,57161,36258,203,31603,56754,13025,167,55349,58849,13324,62858,65200,36723,3268,12047,47357,46458,38097,53947,8596,24667,47277,3584,21280,21356,50202,20385,35012,43532,33139,65056,20929,13923,58287,31200,18288,6075,62899,8819,5724,27703,62289,62706,5111,26986,31781,62888,35933,40391,27809,15790,6401,38159,41156,16949,19432,15189,37997,38524,18550,28907,19540,5321,14468,44526,52250,404,44730,38378,39637,24827,62223,12764,42011,6539,9050,26261,20219,45507,24197,34730,56496,54952,40466,45883,24329,52974,8982,12531,35001,21874,49002,36477,41214,48444,44139,26974,49065,25596,1722,14196,44525,34333,51094,62064,19783,38136,28790,28049,64823,28414,13550,396,30794,62018,8678,1449,26930,62768,21157,19502,48777,17655,52931,58363,54831,33455,30822,14891,48068,30477,47514,53743,15580,32966,47417,7120,6104,20250,64820,19239,54463,30668,6941,30187,20788,56056,14180,57686,30014,63520,51127,59886,41807,30585,3872,22108,25606,62399,22837,45811,34457,35039,36386,49785,15877,13548,11541,27251,38678,17020,59502,5875,59139,32152,37928,41523,52546,46782,7300,57347,44123,54630,39146,65315,674,11580,34212,18410,55358,53149,24324,50795,26342,28,31450,36650,47034,14024,22242,44369,57333,23583,12908,36454,37015,29539,11475,51134,19007,14535,65226,43692,47517,40040,30671,22981,8542,60379,18164,48906,30428,56613,45660,43490,48789,32612,30005,896,20304,15207,10609,59177,44805,60303,49252,29895,51972,15000,46537,435,50881,22045,7326,63922,31267,61272,9937,54886,56505,43024,6633,18445,10350,31945,8333,50436,57146,62485,17118,52148,41022,36598,7425,33867,9609,5698,19282,2259,32902,64405,6840,53373,57162,60810,30171,7599,25812,3797,42438,25240,62469,899,55271,921,17767,50117,15007,10366,23792,25694,13700,51909,27723,13322,35207,18368,50916,39999,35871,29872,64014,62280,58771,49761,28506,18876,16645,19890,49870,59793,31473,30796,32088,6678,64626,55728,22064,63296,31662,47840,37795,20951,40720,19690,64118,32348,14057,41615,18603,23282,34725,23985,27642,56080,18183,52136,3565,47385,41947,2257,15476,41780,25738,9189,1139,60620,57543,48112,63283,53952,11015,8002,18523,55882,61341,3952,39440,33893,1463,57792,2200,43371,899,10297,10838,55850,57125,52253,63834,22194,8832,17148,8179,9478,60755,41658,803,40079,54670,13967,9434,28430,10059,46067,17426,55591,21222,52879,46287,28135,11588,7959,23140,56201,18007,13544,59649,62485,37676,45409,37677,25956,56813,64163,24991,18071,29932,58812,11598,34369,55782,30661,28195,6064,54224,52153,36278,62554,5869,62647,25998,14239,15718,61050,6352,59173,56608,23877,18491,10905,41770,60872,34167,64445,16078,65249,55384,17603,53076,57430,19553,5455,50693,50190,30297,49177,47888,58646,45114,62185,31977,11776,1184,13319,15547,3515,59321,5688,52576,62609,21183,59177,16992,59507,60388,63621,44705,31221,6156,52866,55748,1706,53617,16101,3676,25526,16204,61743,6845,24889,31388,51928,15337,39004,39380,47613,37470,44641,3071,51708,26871,60479,36698,52746,41007,54167,24291,34837,38077,46727,13420,29622,18346,36069,50973,36812,42620,57155,10412,57555,20253,12847,35181,2295,39919,399,65408,11456,46584,15002,63961,11272,64840,53473,11016,11737,49442,18836,44389,53942,753,27097,27340,34380,46645,11475,26029,63630,61481,59983,11324,41910,64147,3040,18069,7696,17826,37988,12644,1990,49650,48261,5316,7736,53510,54266,21790,53679,16835,59494,22147,34622,52481,41151,44507,64274,29893,59130,5420,52041,35956,54236,38174,65273,32347,6374,14958,64571,51945,19594,62346,41020,48058,48031,18153,45868,24323,54528,52963,60666,17462,2306,18964,6920,64051,50357,61568,46642,36279,52182,53839,55218,65406,32160,27930,22863,2752,53812,44402,30463,10722,35433,16251,55757,62473,4382,41771,64509,11105,61771,21952,52670,4628,38015,3810,5407,21574,13482,59497,38558,51256,58068,10600,17765,35126,20800,49911,27691,1687,23724,39858,17338,32546,7820,17098,17614,52241,8492,39427,55220,47923,15049,35458,40810,35812,10345,53245,19837,38464,34118,58475,44479,24315,12794,54298,56265,19934,18803,36690,52642,62910,22949,25723,774,49036,39318,46742,43732,34229,33538,39394,27884,17868,29473,23824,62231,48063,61453,20508,44179,6112,11247,63129,18212,49628,22251,7575,5536,23984,58960,31977,11639,23070,65251,10339,30252,51487,32646,45358,56957,34923,9137,23908,62071,61025,47608,27722,37262,48218,49831,13243,50777,31110,54539,19629,5577,5085,16619,63193,13087,47177,24553,48806,23142,10451,30631,49175,24195,10495,44487,32589,32055,30776,38244,19130,50550,18328,3454,33761,60110,43957,19466,43494,7257,39911,9667,65060,4911,21163,17404,52265,28312,25606,22789,20929,55699,12180,29395,4646,21556,62167,60372,39231,31851,17519,4413,61763,62533,25125,48284,45555,8251,19854,55177,48624,42730,27103,10419,12653,48100,28831,10178,55327,15650,36411,22855,63965,48424,59324,62186,7951,65019,20226,59180,31548,56181,59,37071,33696,9842,36411,7287,22381,33015,18141,52377,11325,21366,11865,11678,54672,20093,38129,26496,36756,54301,45743,54582,25692,49520,36374,49149,31143,56376,38768,17720,28037,20354,15391,30535,47644,27340,10167,56345,63792,40615,19411,38549,24669,34272,51870,62472,16076,12004,51503,12018,55323,3871,34127,36201,16884,42708,54016,34079,47335,43063,52709,22626,50755,45554,7582,61845,59084,26490,2149,5947,43945,7235,45121,64410,11245,22459,16152,34891,10082,53160,43165,29795,43373,19076,17011,28917,23734,22069,39877,60787,16625,20359,56734,51890,44005,39792,27939,49097,58718,4053,16946,61065,64430,14036,62110,5314,46749,47162,6206,11859,93,42814,9918,7437,44538,47333,4637,11375,4871,5637,1438,27758,27939,42438,16701,22753,58233,16692,62995,19869,50492,44418,62270,40035,30878,54711,22019,53522,40006,52356,8504,3813,7975,29370,9005,58116,11465,50084,46078,13075,14231,9276,23958,63823,27933,40689,25883,3053,59752,32591,16022,3861,51868,39470,26256,49123,35903,36920,11146,28773,40202,53488,60132,15413,9537,52755,9315,30328,10773,20876,64011,52777,37002,42713,25072,58554,32138,39356,30166,53979,53366,31345,40944,56111,5233,14298,65172,51608,25255,7376,42275,16164,47126,60346,64176,51015,16158,24475,43513,784,49452,1610,1222,44791,54183,54328,57430,64671,3197,12635,42148,23480,60455,43068,50190,50211,2489,34362,31776,59034,56742,7570,62712,50362,32001,33023,34552,1479,19162,13793,49835,35745,6452,46469,8157,11020,20128,28389,6666,46957,59700,59937,23235,39185,19438,16271,41861,38654,26314,56104,24261,41917,60652,59495,49749,32571,13886,46812,42529,27562,2853,56292,14016,12489,53088,23679,15398,15160,22242,9933,41380,19357,24858,35273,40158,43350,47419,35893,18254,58919,59540,20068,26045,41360,63876,28838,50568,43008,23762,60052,32042,26024,65319,12667,16973,15729,10027,51381,46288,58253,30133,25755,37778,35772,10598,35652,7264,3020,45728,332,62820,2169,60077,33255,49586,26938,28540,30402,20144,15065,37062,4191,42534,58162,20332,6962,50096,38898,58864,23022,36222,15206,37425,28794,4510,49290,49680,16854,25571,11246,2624,60941,15659,18088,31683,49533,46576,40727,42211,45359,35522,31109,49188,27267,24825,17533,17997,49373,35630,42935,16959,14062,35118,21338,18850,55474,56870,5888,64744,25435,63963,45157,108,6628,31887,12280,50115,47051,15434,2539,5263,31013,29924,3578,48328,41186,3798,56437,61384,3127,28013,22594,31736,57095,38327,44834,25175,50737,31915,8659,18534,47651,60213,13606,30091,62562,61244,46949,33328,19814,5986,5766,46908,48434,33607,7614,58385,19439,11907,31630,465,37061,61324,15992,57456,42854,10963,54126,7491,12238,19577,32929,12175,10973,6325,50863,26037,1084,8759,54554,18334,27608,19113,18961,43181,59097,42247,32584,12620,8770,19344,749,38852,41748,8016,43809,23865,49456,14221,52128,50700,52736,34201,58801,64180,53317,12186,54432,42291,17952,4728,51796,37843,1747,7417,44947,8094,60011,53453,1486,11786,38628,24632,22055,5170,63321,7104,52127,19774,31582,24306,47039,9980,55512,7065,19101,19983,17164,24824,4973,51760,32197,39231,58753,65185,22125,50513,13809,45886,48841,22208,35996,40187,50479,53521,44037,3162,64988,12067,29935,14697,47319,35172,45073,43556,44810,59207,38994,31385,35755,20164,40409,17906,40010,1825,49306,16796,62326,21456,61913,62611,29234,37790,41017,28807,57280,34339,12060,2186,6083,31831,27350,17681,52777,7793,13966,18192,21316,65496,38045,13192,16025,16692,44726,45465,30025,59747,49360,56561,6621,13782,58907,57768,28618,64178,53270,65445,48797,61676,20506,58629,11219,41697,45470,40833,45338,45146,7308,20949,13879,44567,60360,49794,34800,49872,42326,7361,15878,61104,9155,40381,41838,33364,1036,6068,11344,52692,15856,49887,15645,31195,53231,26066,23595,15175,16114,45732,6541,31402,2957,28202,27337,42886,29006,62960,36789,35976,2172,10796,43568,54726,38275,27208,36936,45524,1947,22076,14918,1019,44703,54759,40768,17862,59352,52507,4180,19122,6282,22671,41229,57832,25659,34414,8828,24463,25075,38933,23739,52184,12711,24093,56558,41702,47244,6729,5747,20912,49887,52848,17391,28501,62408,49316,59022,418,54597,1234,30461,7446,15435,7807,16340,5339,12572,28569,12123,55409,12120,9696,14807,46463,58693,20453,25010,42960,22091,53752,37260,16410,14072,56296,20100,9877,17149,33399,33071,9899,4901,35686,54710,37266,19359,23504,17353,58005,14378,65084,3842,19776,29577,48405,16108,13151,57934,64172,26510,54339,51454,55895,55177,48269,11758,7925,14862,10537,12423,58653,31014,37935,5855,12357,17556,56484,20622,2736,65050,36122,48336,35752,37196,17494,12775,50406,8969,18127,13607,19766,25793,37389,18860,20412,24004,30222,27436,10303,63639,45714,2014,64632,47294,12000,17122,40649,56453,58043,57835,2997,23415,24493,30666,163,11507,21711,54537,4161,39413,30866,9288,36999,13925,6031,33533,23424,38472,42998,37300,29815,14386,4710,17122,45022,8449,64099,36110,1741,11209,60581,23784,15840,55914,40863,58496,21198,27605,32535,16519,26063,33992,9887,64257,22458,52892,64573,26779,2990,34434,51688,7646,25686,56703,8246,2019,58702,4011,5607,56305,46367,21986,38498,32532,1494,28505,53458,42546,52889,50770,43940,35500,62502,10976,7537,5843,24137,57224,11807,35339,30665,48385,12783,47373,44394,6404,23774,50235,34711,62066,61352,46281,52010,33738,51428,16723,26552,12611,35399,16388,4730,53090,61359,9735,51395,28202,11657,3218,30901,33966,56337,34501,37368,49919,14282,30141,59932,59168,51808,23172,27114,41671,7562,6306,3862,32377,19000,57110,13196,8385,39856,17616,35446,23021,45252,63692,17256,15148,45294,50385,15721,27209,9738,37509,17849,12701,50938,9586,65315,10070,62930,21439,33317,42293,61967,6705,20950,23891,16067,34720,7853,59598,21871,13357,64824,14370,56903,28531,24069,40853,42904,61462,33755,1471,61016,47340,43454,23116,63094,1472,16992,44840,37147,25058,45926,53462,23121,28142,53921,47592,8651,41353,31356,26510,11549,44976,42652,59577,53916,27303,23201,31268,62736,38657,18173,5215,7809,2168,20191,32088,61866,18696,6589,30659,34424,4631,13870,13688,1094,1831,33256,15488,2715,57624,60625,62913,28946,21310,59101,19812,28424,13180,4759,38721,48436,61440,2852,56852,49993,30918,13675,62570,63751,60695,65019,54575,987,45725,46409,47268,23824,14573,30835,51531,56731,53595,61358,57765,40934,19221,17473,4333,12490,32709,64844,48360,15851,1164,11585,53671,13758,1264,51014,27718,45685,3002,16336,21139,54297,40462,9712,14783,6058,36564,16205,6568,45762,44808,29346,15956,57520,22743,11068,21986,46087,58725,34357,45158,28418,9896,48293,59914,1468,2023,14931,43940,34418,61119,43136,30658,20770,14912,867,34934,19552,23106,28598,37407,5182,19029,55707,28614,20774,45631,55413,52518,34028,2906,2391,6913,49169,20964,46933,36382,3425,20910,995,28201,24039,21829,41028,3086,17402,65189,62068,31934,2776,50650,54870,62581,10672,17244,25974,16437,769,6986,18603,46478,20002,58109,17727,25643,30967,2591,31165,9001,19042,11357,39219,51983,60500,52077,8780,27989,42266,59193,28884,47293,54515,51150,6941,30056,51219,37127,3296,47016,7277,13730,3696,9408,53051,46862,41165,62217,55743,5322,511,5172,34906,35880,24690,3674,21487,24957,24909,424,47590,51514,42639,8825,10534,45401,16785,65014,7202,61030,64876,6938,2579,31826,8879,23114,2500,40980,19053,56764,39947,24485,21727,34745,14114,14695,40994,28947,56059,9031,32370,28934,54145,28100,34983,62933,34769,46128,7792,9996,41261,56111,40701,1884,61223,51416,58415,17303,50622,24369,30281,57858,58862,38730,20160,49909,49296,40753,21622,57607,60257,35890,20332,34213,12140,5621,15374,45742,56589,10607,49117,27733,30124,26913,51153,21074,11204,33282,51395,57160,42085,2876,22809,44346,24546,32119,31722,47454,2129,17765,4393,47629,22811,4326,28335,13148,19816,6494,16572,7114,36646,18720,28509,11868,34866,22634,47124,37003,6303,40139,13888,17127,52102,40392,8230,58426,35037,58566,29094,33414,25069,21916,36467,7850,1998,13778,7029,25343,51497,25452,57626,19396,41017,65412,46353,63135,62355,748,3100,10094,48654,63218,8339,27448,63323,30919,62155,7595,44933,21586,4632,53120,20610,48339,57023,40149,58198,36926,43400,19689,3537,25144,10909,60800,24609,36100,33281,25877,52542,24544,56934,6826,14811,20130,60781,56341,37132,21538,32900,27893,17720,23049,14970,14633,29555,59210,44793,60315,62678,21980,364,8433,58431,8892,27224,56010,39725,38846,26423,65207,10709,27934,59641,28014,34488,43513,59832,31262,18942,54996,9784,59520,9033,64966,62469,14576,47278,57049,5642,25175,40177,27670,17341,25306,47146,49155,39334,27014,44534,41535,59996,39590,26274,6986,46152,40051,31563,12062,6860,2235,48150,46215,7961,15517,6972,26951,40712,41481,28195,1056,38515,46451,22537,43733,27619,24321,8754,36030,46358,58800,58308,49410,47272,47362,42839,3538,25023,38483,24811,17667,41883,18455,9452,42401,16465,4841,41696,43815,48366,21245,52711,41832,28801,57063,25507,22232,48754,29925,62256,28107,56550,31322,19845,19479,39079,40013,38595,32458,53136,44313,1476,53211,52359,40979,6244,35947,970,44835,37999,48676,41112,34444,22281,29625,25068,30683,45534,15967,7429,1038,5765,38611,12116,59507,17069,46598,37899,13690,39699,36821,29040,28635,9884,34415,29635,32662,63686,39942,32427,40877,46325,57211,36722,25347,2556,18545,42310,1276,44538,40554,53858,7952,38096,398,3448,30703,3841,10750,1297,54577,39949,1932,30310,5351,54339,49466,40697,9276,5549,43421,27105,25982,30911,2263,46526,30786,58848,5745,30752,60457,21645,57562,32264,32684,50752,57218,37595,16907,63325,9265,51195,43187,62420,53569,54893,52114,56269,65482,41313,24334,23320,46618,640,44957,35125,41283,20247,44043,138,41751,40515,46110,2882,2898,14593,7118,38010,10769,15580,21627,44402,19765,44906,27812,4420,65480,22130,1743,31,54011,53581,19106,2801,25670,10228,42620,14759,33279,28342,65208,59152,10541,34591,18878,10405,58595,34139,906,20607,27216,63703,53045,33335,54034,467,34172,60566,58592,19863,14615,15190,23050,55104,64461,29310,42370,17110,57441,48087,34523,18811,55041,43354,23808,10249,12618,42398,43121,12107,57996,31225,17605,30771,17812,6090,30807,23055,55328,34760,57414,53100,34551,14411,40364,11329,18513,36997,28887,59339,42099,15992,7360,32258,52794,54607,11594,22110,5671,44393,37001,54967,60546,3592,4945,14189,2496,49496,6928,39325,45203,33422,39853,31823,20923,40024,41224,24570,49307,37362,64352,38023,28940,29768,30585,10415,6882,27850,718,25260,39670,20649,33404,24656,60992,37490,45862,35469,58429,60610,52959,9210,21094,20356,63739,9655,54205,636,12590,4532,40499,44012,51689,8412,65431,51966,1111,54035,25110,6523,3115,50413,28772,2390,1875,35426,34429,16012,34411,25444,31814,14564,6978,29650,51505,48073,41594,32902,9774,50357,31426,29862,8470,30001,28951,64369,45344,45823,28745,38062,34714,60572,1193,39224,30793,28570,26103,27970,1169,61277,7339,11151,22326,42745,20488,13048,43774,58835,53438,64290,15080,37204,18035,35986,56692,63101,27199,24592,4813,30838,63495,52014,52650,58450,60771,53464,22114,53334,38326,129,48890,36915,42179,13605,20684,29195,55359,64997,59619,2759,26732,4456,43253,50256,62705,702,11822,9289,37419,38300,20319,20916,8026,43982,59285,22987,25111,31688,35068,59508,61961,2443,19174,16812,7795,45618,38477,22453,39011,32031,19266,45204,13157,64690,32142,9953,52962,22362,16541,1441,47784,44860,6000,37794,62058,61750,11891,30550,6867,44567,2858,6293,25374,15939,23353,22853,15947,1168,28123,49133,64040,57608,42002,8911,14795,6627,48655,53376,2104,25250,43916,19990,33801,7083,19706,21206,53627,32561,57208,60184,18868,54963,43033,46313,9932,11696,25806,3416,15803,16876,38086,42294,12203,42387,9809,38137,15794,11048,31672,24674,6481,14376,34679,244,9026,58644,57533,51560,25109,27529,31817,65443,58789,37253,2741,24911,17662,20443,30632,19524,27983,22990,45751,27728,15717,56442,26524,43157,7632,40122,41117,6097,1351,10206,40596,49667,41139,2179,64365,19763,21977,55380,52772,57497,36477,56714,29294,940,19399,53368,19864,19804,51680,43145,11211,62329,47414,26004,34417,9784,63384,40870,13521,29457,458,44003,45297,44289,30273,853,24319,14651,21885,8532,4480,59527,26000,1690,1114,10108,19160,26632,19379,30910,33729,29946,9733,17959,7596,55913,28378,29088,10911,39076,31768,25130,12620,9823,43056,49273,49472,21219,34345,40305,62651,63743,14929,24826,1948,12240,60609,48552,13945,34961,20744,19358,6158,32248,44854,17600,7583,33409,52251,25493,49080,28804,36560,47091,11255,18888,30860,13415,58013,28265,51264,40102,7627,36313,56361,26507,15031,54417,18851,13117,14167,49112,25887,58874,41299,60346,33013,37336,48889,49324,19061,39997,19583,11887,38824,64533,5073,31936,13556,50268,36098,32601,46111,45974,2292,24257,38850,52353,40295,700,53877,20766,57483,50461,33059,25181,27573,5663,27189,37169,31741,7221,16813,1645,1018,23834,60971,15998,30243,15125,56431,5255,31956,19660,23619,23346,35891,63736,35054,35942,13252,23726,30718,59889,64368,33437,38292,48220,56039,6588,51495,11447,21235,21037,42686,11116,42088,18323,27275,42458,63982,35766,19106,28047,18661,4554,36985,41701,41271,49727,29901,29489,1963,45956,4731,63334,25670,50766,35889,15865,39767,46783,36433,42965,60356,31631,50658,45460,10756,21037,41179,38607,34810,52144,38253,57174,27700,5192,6652,7300,4635,12008,37665,45724,12748,21276,1611,18243,9033,23906,11934,30602,3826,35388,25566,39897,56406,5119,60057,34600,37587,63397,11649,6372,29568,61887,8030,38686,34060,37873,34118,11858,24346,31103,27350,47257,7252,7757,51803,895,57953,61274,64254,29517,51855,56495,52088,46354,40841,4303,55156,64654,38120,41841,62108,35012,27757,2157,64128,55890,27387,48124,30934,12566,27478,4924,12160,35266,7250,59552,5918,21845,43161,44361,59077,60578,7296,13028,62674,18700,60141,65393,6014,48617,49040,29811,28106,23227,49117,8031,42876,55928,50966,41021,74,16242,60118,48595,30547,26804,28321,23668,40178,44928,32356,59175,59679,34863,7232,33592,36367,42882,5864,5675,3346,41095,18131,432,8811,41886,13582,24959,11288,47967,21751,12513,57812,31700,27332,36944,2970,11684,25705,34522,40411,2265,33222,44637,23460,24564,42297,1067,61024,10071,2221,9185,41799,23869,58320,53879,42648,56503,64120,56047,51470,29797,29290,4972,21667,42664,48431,24821,25575,9677,65138,34084,21245,43502,17715,31100,35904,7663,33021,3883,61746,23348,26741,4524,59012,28100,20443,54572,16602,6691,21339,13471,30192,14907,29272,23098,12267,36746,19381,11173,59359,50595,48506,3833,41705,24654,13938,49809,19903,8745,65209,45595,32449,56205,62486,40283,42175,18921,63915,46050,58267,36640,35289,21133,64850,25865,45585,25460,52255,31622,64469,12045,29658,10055,34270,11790,15714,53769,65487,51255,6050,34018,22896,60788,57255,831,15898,40765,4558,60927,42419,44956,45708,38031,11999,14956,49706,19314,26489,29525,40904,16798,9354,62825,2546,26896,26150,55454,19742,36266,55665,50690,15338,42821,30115,27993,54195,60249,45109,23686,61875,3675,51513,33972,35812,17854,33289,21101,9319,44602,20141,9835,43389,29894,3916,16506,25440,57891,25267,1946,32371,62609,27472,51679,50884,42887,2012,42142,31389,6567,33515,54321,34843,42574,12148,20846,12357,53181,14438,3615,65447,13285,29794,24335,8160,62200,65068,15835,2137,6231,48754,47513,22931,14218,52077,29286,60336,9722,37260,58445,2431,47362,26118,1068,34513,19375,16460,15582,1663,601,13337,25495,49806,39321,59677,24642,27119,33551,52255,27687,17942,44815,32724,60889,58136,50990,39079,55420,2269,41871,18700,2569,38851,49745,25276,59648,29835,5650,37033,52719,15036,47212,26016,62475,15729,3360,12085,22797,14351,35210,8442,10644,8280,13530,26457,17131,32276,63305,23468,21793,9973,11085,18533,25332,12158,65029,26329,64118,30036,2097,1959,1766,9425,33680,49436,33718,9378,5278,52264,41427,21505,23766,54483,56685,62098,43584,60606,51432,35068,45505,58614,20011,5175,8645,53280,45042,61954,8751,35371,53130,45649,50930,23439,50823,11201,38157,13907,50282,16545,65278,46180,5249,13400,55817,21470,61455,60190,54151,4437,44344,20977,52375,61363,38779,62748,64393,15657,7805,26110,36182,61877,51122,49854,6291,55274,56488,14068,37473,57618,59197,60749,2284,31370,47964,18928,14285,57434,15003,37246,10246,50414,51234,56400,52507,11556,10642,21651,39961,41332,27066,55849,35380,44430,63365,14413,51639,8508,9182,65113,19845,11122,30698,20220,7968,25327,61846,25220,40911,48270,17834,48333,30535,29753,22764,7323,16897,50002,11222,26544,48526,24036,2226,23483,48803,54607,61698,53383,2625,28521,3937,59836,27016,36380,24636,62808,55761,44704,11963,62219,4168,51617,9559,40893,41071,35987,34140,28789,37658,38768,65505,35361,12410,36134,39998,2363,44751,25323,64753,28371,62249,58952,15724,59501,2052,51874,58691,65414,27283,20818,22100,7710,59159,13270,32691,56650,3355,26378,10826,51801,8886,19071,58113,40233,129,28340,27403,27181,61443,19103,41431,13845,7515,58717,32431,61447,61327,27066,7763,61450,44714,7930,14579,60529,17108,29027,33674,12082,30691,42664,18591,27012,40645,23732,3978,41524,59049,59102,40705,18777,7096,17154,31172,25434,11343,14120,34648,51806,44712,12398,31827,45898,21019,27328,60380,58821,19699,32030,22520,57193,37184,56630,20881,33593,49067,6572,32034,36848,64586,56216,46965,19955,38807,46607,24131,38757,23283,18954,12047,30562,11021,13755,54080,21502,46125,28216,5562,573,23384,35109,28883,43219,34977,9696,1278,7177,40685,13851,42846,56895,7556,1827,30028,55839,3754,40529,42319,57287,53069,33103,39881,15164,20931,36049,50580,49063,26260,10156,62784,65516,63652,20032,41337,22255,26474,34142,7843,2261,24153,62422,39912,11344,12363,19862,29875,7509,28188,17062,8386,33152,44987,54058,58990,1662,40121,47324,6784,17119,46093,51855,59989,16458,28933,2427,42762,44963,49487,8686,48385,60432,27811,3089,8,56234,46191,1983,32842,63777,3513,30089,58779,57986,62658,1740,6593,49795,31933,27446,36866,38356,13217,13436,42805,59686,44729,56098,45656,18456,1467,47105,10589,60713,52336,38824,60210,27411,11841,33075,15624,34836,62576,37833,18823,16230,44000,23613,37597,57657,51430,42911,42487,38041,65022,41999,53307,30334,41234,55253,61259,20569,64205,41412,17392,31117,29706,38937,27716,24650,9578,6005,7332,48600,34014,22165,63233,9042,39196,65057,46085,42302,65086,33003,44164,9980,34733,33350,59445,27747,36732,64055,23050,23931,55665,22301,36786,7956,44564,21284,32053,1542,35655,51006,62532,14418,48274,31306,49171,20903,57788,2563,719,1302,44197,21618,33152,60336,40203,8242,1566,29907,25046,30820,44231,44069,50973,55681,64846,53753,35870,19406,38237,37707,14354,45576,25444,12286,60118,38112,20713,21647,57136,28255,62132,63384,52027,13926,53795,56076,34692,40322,39755,13205,3658,49037,29632,11083,16653,40874,50788,34018,26649,42834,60325,17124,57303,22366,27100,43138,29492,13747,41563,32359,16137,13997,13749,59659,35327,64546,23955,49940,29514,16149,52478,7651,17358,28050,28395,56480,35884,26451,3945,14887,60722,17456,56247,1320,23252,2705,14200,57411,27715,63277,60530,42322,59781,39484,40441,36169,34805,10228,3684,25184,10573,39509,54042,26427,39241,31926,9764,44116,46444,24869,62079,17886,50462,48944,51928,49096,1994,22880,62527,14951,15528,30110,45382,14205,53654,51464,51541,11213,7850,47268,18265,56185,34295,22448,2632,23543,3168,7025,17386,32989,47851,27851,9037,28827,34888,59060,45345,19732,37995,44348,35961,47997,31500,30232,41499,65000,59358,48128,8086,5097,16777,35351,47604,13540,3434,14039,32364,35189,59904,8120,52231,16878,13495,10223,11943,36303,46017,22711,38254,21704,676,4411,34781,40271,39672,39574,4645,3047,26699,168,15285,26263,54031,35662,55319,64653,14271,43885,31150,39724,55662,51086,63285,2510,28390,6676,24585,41150,56522,65340,35374,18831,53945,31975,32128,64961,23609,54163,6494,32760,46046,27219,53064,17129,42985,47112,45566,9566,7779,3887,39153,12066,22630,27230,59846,64040,18685,20247,40340,30126,62794,3119,11687,21720,23710,1145,10754,46304,57868,64214,21199,44377,25517,20973,38027,26570,50393,5979,32698,63002,48549,47052,13383,43993,55263,27257,31722,10706,52617,20740,38817,14984,34497,51362,53012,31032,9134,50227,33310,31955,41548,35346,24301,2274,22953,65500,21078,61347,1355,5647,17012,46394,35447,54175,36655,7883,65260,1639,56097,34674,28929,3943,55250,12962,42943,58569,65313,13124,23289,4210,30183,30225,168,57696,46847,53727,23370,51273,37674,3900,2540,34909,6438,15818,5220,48657,62457,29375,23485,43584,41137,29565,22515,31548,11821,23677,63272,57748,47208,25247,35932,45842,49808,6328,34832,1747,25619,54093,9697,50671,25358,43994,4691,20840,49239,63376,63890,19717,48623,28065,58221,21879,3945,41851,6918,2414,56216,5429,29323,13050,23361,40498,19025,13327,32726,12047,49949,27885,11477,57256,39604,59144,61481,32616,31186,63118,9173,4362,14053,8177,1064,64487,46234,59943,13050,6843,12601,53839,33508,60739,45224,4326,53353,62077,45028,6930,40310,26554,52311,38349,54736,59633,11089,14743,26032,37241,17428,27697,8477,26363,60612,28466,43461,44552,41900,38403,31552,2494,35470,4548,6144,53846,19632,57225,60220,51987,30532,63509,8119,14670,25927,48940,7785,13053,57693,55014,34440,51505,21637,11109,34374,52265,36109,63453,58629,52559,12579,54855,41213,56066,20604,43735,15202,64843,56925,29323,10984,37769,2342,11352,25319,53350,10772,39966,10318,35780,56166,47309,54620,17478,47843,33263,26096,9674,37178,49130,60942,51463,61036,61318,16225,31322,17787,48024,34129,21049,60799,51909,16364,40195,49716,60225,63069,63002,12236,5174,21292,28986,57477,43638,1957,53006,23274,61591,16595,19603,52231,61326,55778,43787,10804,62781,47750,39035,19869,30210,47897,18181,52602,51694,7267,34785,50508,62225,5363,18910,38026,50917,22805,37157,15372,23978,4494,53883,47502,8623,47238,32234,26929,21642,35232,17019,58892,18217,22363,61242,9059,4721,32860,49954,11445,62648,9086,28060,38278,59535,61134,6585,42619,4404,38011,27619,51122,63491,51335,56265,25378,57004,9790,19939,24667,38005,58840,44957,6339,11001,60655,22086,13223,54736,38557,43046,38271,60904,39166,6188,27082,25274,8177,8673,53186,47706,19911,3926,30179,34266,40396,59942,56962,48104,56608,35406,8218,27857,7501,23339,11958,47413,17507,28955,13202,4767,36157,26165,20438,14306,12773,39865,49396,22319,62671,9212,32850,14988,48779,43852,64861,25796,5961,27513,4826,24404,53224,15625,59865,54227,51078,55039,43231,59577,12300,56246,9796,44819,56571,18934,24923,56659,1678,5586,19322,32616,3841,60358,5557,17902,14021,29446,54521,46199,56893,27828,42971,19321,9677,7337,2689,22239,27775,35022,19460,60266,28733,7061,47354,20390,13283,48157,58301,1739,53469,1022,21251,16714,19248,16114,23179,17058,41937,29272,15177,566,14623,41505,33440,31643,27106,20424,2594,25928,57442,34939,12038,35296,33011,32780,10797,3283,40669,61318,65497,9583,56363,53946,29208,55522,51251,44354,54657,27263,65442,55863,50557,34027,11822,36410,17319,51015,47931,58889,24406,59760,57871,55994,56283,1749,4503,41475,44524,32280,16706,2851,36107,53659,65428,36769,60914,3611,60809,10102,30709,5750,49405,51959,23501,31366,46381,14046,5861,60834,20480,31322,19319,31443,5965,46794,60116,46170,25700,52597,15955,15202,28026,62496,58078,25601,10242,8397,52601,31661,60866,28845,11599,26463,33009,34246,35560,27897,1305,57548,14334,65102,23841,64261,56346,21001,22455,18649,50164,17501,43294,28270,39243,47800,38492,8952,14023,8850,12951,42022,45591,50152,44698,14619,26016,63916,20315,62334,57261,64305,82,58136,53526,21527,38640,4066,7109,53534,56772,44161,54076,11359,9625,6398,10342,40026,57321,8244,28718,26023,48011,58596,56389,24438,20543,5640,51216,12649,699,36728,12619,29377,12782,1334,22470,22163,32700,31874,22724,3572,17637,9189,47378,2683,43964,36334,20420,12175,22685,4603,24366,17057,14171,61631,28344,47389,2190,11054,57230,36813,43517,20024,30245,14196,39773,32028,20082,33570,2892,65126,55726,6951,35235,39151,6394,43731,35869,12769,49313,56047,14427,43515,17156,28854,1051,29313,53021,14307,40197,25338,64998,19203,13925,23528,32432,61577,60820,44828,48642,12924,45849,52337,58238,18258,6519,42861,55125,18209,59848,12553,50974,59500,22045,47628,40283,37598,36872,2547,26291,5759,55125,14326,15113,46859,40050,8623,39166,54499,60436,789,734,62041,1385,43073,46037,55241,26061,617,39143,17831,13141,5676,20249,61150,23800,33064,48464,18978,44126,37484,53814,63329,62793,35772,33751,16130,38203,30561,44124,55702,43133,33336,62947,3625,52384,7704,24658,52837,31117,47180,33440,11832,61006,32605,23628,556,26250,38328,12707,3415,22924,42046,30914,50434,42621,12006,24638,13026,14332,64909,47458,14144,24976,13266,14289,49638,13872,34183,10191,46567,15528,37111,56925,39530,13974,60012,38035,39185,32228,55515,40805,3101,21933,48826,26447,32351,8703,24705,62569,12669,38238,39272,1072,54577,33065,29408,45300,61602,53831,31643,7533,36831,32784,42192,34644,47294,23265,15834,29933,45200,30491,14992,22511,57219,56125,39217,38904,10819,54025,13531,29523,15917,38953,17222,59898,65315,8666,23496,57121,19321,25991,3018,44648,28572,23333,49715,30807,62020,61841,41444,18952,16353,45943,42408,3852,63741,52507,2879,4053,22608,30331,47973,26688,26043,30818,9284,7944,12140,3820,13886,51324,62436,58367,57778,10866,22671,40891,14714,44502,34822,52366,19952,43419,18739,5489,15149,14711,65322,1296,62156,24090,7791,38737,27409,47239,9251,54259,53871,60603,12283,4232,21093,36754,33675,37021,9523,62775,10965,42,38871,39663,23905,18894,30658,14356,46295,34656,27912,64948,3023,16661,53151,1398,16692,9677,32513,2747,20301,48956,49375,14785,22134,63200,33317,25805,3006,29914,34930,9980,46728,7710,12691,43345,60400,46412,138,47136,43145,11098,25289,55371,58970,23194,64402,52399,25357,34226,39312,25705,49462,22847,48218,49085,64960,57859,43782,16584,5103,21175,63381,8926,2383,13210,45986,61782,4964,37504,65402,19756,4964,48883,5799,3257,57549,21857,40030,55560,10367,54243,34467,46030,32989,41815,25435,50862,58944,36725,45267,29819,49886,24907,41597,17286,25458,7499,46204,6865,21644,8949,44917,1803,22229,52034,31776,11687,58538,46438,39246,45442,44354,50738,51195,60723,39148,34270,35599,14790,8734,62992,63949,30805,2899,60351,55902,63614,22083,42862,29197,6691,25696,31333,9536,44681,8934,3103,23283,46064,42714,6408,39137,38952,40894,40118,39047,60870,687,57228,61055,45151,45475,28893,50738,56723,19281,38519,37224,27620,5225,44472,815,62280,55818,29381,42563,14182,38481,26982,61444,60588,37005,9875,51374,40998,65101,10431,48979,25000,15820,28383,30739,27097,4921,37064,29976,59062,50872,59526,37053,28261,53391,24785,40000,48886,25028,11270,34105,59069,52907,35668,32743,58410,19360,39565,44501,50887,34779,4381,6231,33802,64623,3735,51964,42710,32462,30105,26953,9908,14337,12267,9052,30700,52129,53568,63041,37611,24768,56550,45505,6628,41378,27684,32189,41090,37918,51299,10433,46681,52559,28781,47609,46537,3222,47503,43236,54802,2983,56251,56950,44897,18486,33897,31201,29738,38409,12317,26205,4665,13284,64012,41608,32962,14553,28934,50788,15603,43637,22267,21444,61475,14759,51994,21423,35681,34793,60201,27506,17400,41636,61512,14467,29918,25260,62949,56786,27215,13715,28806,19201,56449,23891,60385,50604,55702,32102,9175,59497,65210,16160,56709,49405,54013,65248,19130,38906,46982,982,37406,50713,9558,11528,19772,12071,25011,25226,42523,27517,63575,7633,37315,42916,9133,54196,31791,13111,48301,6032,10592,35447,31084,30803,53760,19183,42703,52895,31146,37839,3888,2838,12475,26140,23539,15230,11231,58607,46587,51306,7968,61474,296,13252,64543,62797,25416,4505,49150,9707,28428,16804,18872,733,42631,12318,25251,57538,20740,2066,31453,63602,48673,7524,61683,43575,22676,59369,60209,18246,27326,16610,59145,22210,19289,45647,27873,61852,13174,53381,3058,40682,4764,23353,63700,61062,64067,30379,7377,18387,37011,2433,21608,46316,38822,40453,43570,24298,64034,32418,55734,55218,39481,38558,35675,60885,2200,7224,65253,25465,2320,8435,537,30631,27540,29046,36279,58283,1983,13392,45319,40743,52045,17368,33145,33902,19284,6093,21129,46958,58813,25237,41055,47983,62291,58991,3303,46055,38125,36537,54327,9947,10061,9576,55490,60369,49840,36282,41542,59881,60504,11307,33415,14075,61134,12701,13317,6730,14924,50343,54512,16806,12218,8290,50140,3136,46037,4035,29445,61089,13266,41755,45399,14703,10999,36238,22731,32546,57007,48286,65191,50929,1452,2789,44689,13170,5741,2318,61040,46127,8962,4654,45560,57700,47807,57887,41892,57092,20456,20953,63249,59653,19134,9769,36503,44685,22662,10136,10645,36310,15895,38730,43059,15946,22140,51916,25036,52105,4014,832,14528,52135,53138,54766,8140,28192,29240,29628,26614,8191,1693,29720,31328,7356,13554,43938,51821,46441,51143,904,10013,35708,47214,48200,3314,39432,65218,36088,35017,25504,61902,37551,42025,35878,34558,25986,16782,12922,17072,40474,54293,38672,9620,35511,64059,2164,64452,56650,36543,44757,27330,26392,14607,23525,4171,6695,550,27505,48096,22540,53075,34728,59431,47124,1337,1213,31605,34685,5401,62395,45060,18276,6305,4812,57247,51375,40386,47009,58030,58902,44641,30868,34481,17814,38865,31372,58360,61857,30064,57988,19847,45173,62560,8469,24346,54609,1303,48606,10706,42485,5256,31156,38079,45001,46,16702,53630,40150,65290,3874,15438,57504,63079,34063,10024,1242,18012,30806,61142,48547,9898,11495,13082,22395,13836,16949,8455,11575,24882,37803,61538,21859,28565,42964,30849,18601,40067,50217,40677,63973,13760,48046,12785,3453,21572,3093,5037,16231,34382,15016,39645,45561,28642,50389,45496,36722,64359,2072,38909,32895,61844,41846,23257,28426,245,64527,22728,25076,14200,3925,14924,64246,4367,41955,21816,30846,42185,14723,58189,11531,18231,14243,26583,47466,50820,60245,35502,50601,56101,39742,64106,59673,36861,24336,32413,40414,22336,11646,61533,33608,29725,8949,24000,265,54180,23110,6116,45411,47291,6183,55310,51558,9180,60096,18982,47193,26575,26168,33755,53211,7227,53506,833,7128,57939,11324,15315,29870,4595,42761,47853,2208,15269,45026,28865,2298,23675,43565,3544,31951,30633,2432,25716,47463,16318,23289,29880,57017,21649,64358,9128,49830,42388,29796,60256,54693,60127,25580,65424,48749,24622,13619,30846,25103,26822,18264,47548,35769,36469,32701,39879,46692,45318,37068,26602,43775,22933,50778,18856,40122,56664,62656,8066,16779,29715,54411,54597,22155,23674,21795,37114,42484,4705,7166,35181,64926,18154,60422,37833,56910,14084,49403,2167,39303,6215,50185,5729,6745,13674,16534,21576,38339,45768,65305,31653,41854,20653,31557,61515,12230,41649,22868,47472,42740,6398,59315,35524,15187,50094,54588,53686,18036,8515,32557,42571,28116,3568,60787,45657,63856,37450,63105,13186,21756,47639,57480,1839,23697,14898,1727,16172,18946,23020,58808,35006,46337,21339,55673,330,48598,55293,45016,903,6221,20015,56554,34713,18369,25321,62119,50741,50042,3577,58310,40882,16412,50595,25968,9844,42915,63320,2219,57812,785,15505,19041,22123,63924,11081,26706,28546,23395,14624,23845,12747,34137,64133,38016,58977,25670,14368,13482,41320,44234,42764,65268,25429,55137,10330,63695,41488,34047,15907,55754,64407,59517,16387,49482,38076,51156,23390,16503,36641,9685,55928,53520,38617,61528,32989,5066,4578,45661,58552,12928,36128,7177,52120,17425,23941,56124,8297,58216,1794,5945,50873,20568,32730,57776,7662,29894,56854,22404,49592,9398,29217,50324,903,32561,64403,65261,3996,39415,14880,25594,35832,3720,9924,32237,35590,60827,24903,27957,31226,47287,19022,39526,14124,44195,55668,27918,45145,42817,23340,21834,61028,45474,46913,39048,13692,32808,56607,32429,6431,40205,57100,60307,17201,24610,16721,62701,40509,7107,3990,18943,18832,56203,3586,62416,3991,64570,47052,47444,53490,8421,56691,31967,29857,25645,50348,7761,14124,1677,21054,52560,14598,50578,29253,47553,51342,33972,21077,33393,25346,35649,31413,204,3354,21555,37671,30018,64607,40314,28923,12695,36842,23318,33333,35810,58316,34015,55863,31070,21641,28904,3231,53674,18917,49118,23010,28043,9309,28880,9696,17311,19641,51418,49686,6229,56976,8138,23652,56501,26014,3562,24544,52134,49706,7566,4203,57365,44082,53907,17158,11463,28351,5217,14295,8585,2724,50166,25774,29508,62974,7616,10845,32029,53199,33367,61199,12830,30346,55289,3831,55337,49545,15556,38841,63510,27976,41675,8815,57461,54205,17282,62410,64648,7746,8128,9882,4235,24146,38954,22123,36288,55385,39825,22199,54030,16680,26076,43362,35329,23295,35458,24410,41621,29754,64541,36749,31518,54214,29369,15880,10448,47900,46542,42639,44090,50987,27753,4420,3991,63675,893,52990,25319,24482,33171,18849,22438,8220,1239,9224,49308,65165,6860,32513,30843,16462,38843,33790,26784,57254,16540,19924,22539,11577,139,15007,333,65092,61588,4536,34901,23996,43747,48752,48917,46979,6019,17716,59756,40522,53546,5779,34980,52723,35733,22641,64169,53390,51474,12680,58471,33048,9721,31116,54383,34550,23223,44701,51424,26492,3677,34062,30437,38763,64282,22702,58613,48465,27793,53462,49506,63289,54972,40514,29340,33,14372,45618,48336,23713,43919,38509,49631,50608,1284,19992,24110,4314,28140,482,9751,20624,25535,34426,60559,50597,51469,50156,1375,45507,46826,48998,63914,2297,53498,28960,24880,61351,59104,14066,24188,6977,19133,39318,17873,64124,4554,4612,53091,34916,12241,30633,33162,4812,10839,54232,30434,56513,25279,20431,39414,21480,23801,23262,511,26501,22243,57524,57416,40598,40291,58217,13911,31685,56537,47983,5903,4440,59036,30248,7179,32412,16369,43830,53860,62026,34804,15855,34227,60914,37334,15227,56692,16216,2214,31891,35085,21360,536,35662,34108,50865,63313,38321,5149,3617,48546,43622,33233,11550,12108,57740,38793,37914,48944,20453,51861,36527,43718,32311,22758,25487,58852,25111,50064,19115,23527,64435,21148,23527,29441,56864,11824,31011,55411,46795,22267,18478,33613,59831,47435,33233,172,59891,49825,55023,59566,24600,26501,21293,7221,7924,41372,3999,59567,54675,11442,61740,50575,31243,44713,45425,13442,37022,62916,825,27396,7524,30403,2446,22598,46580,17006,5476,16183,31501,40706,29447,40306,37418,51825,40469,62343,14122,45824,45796,42859,1606,34620,45466,33607,63104,21644,52269,10014,31476,30349,34224,27294,9728,4946,40739,64481,56673,54320,56688,12264,33530,48947,1447,16720,44177,59537,38621,46372,59120,58730,4181,6769,56977,54972,12372,43847,44218,35675,38037,13799,15325,53153,41010,43800,49262,27292,48208,27129,54346,1004,8729,6193,41825,47333,16383,14878,7662,56886,36956,10958,60181,20284,8905,31298,47152,4186,29777,6997,42788,42056,20642,12283,17749,246,49875,49379,25474,11170,34267,42639,9770,12975,41808,12305,51681,28288,51159,65218,42658,60200,43604,57970,36058,663,20321,41874,40179,18994,41459,24320,2791,64803,50873,56750,29126,42939,29544,5784,38309,5546,65011,36845,251,64940,39974,37754,23064,24151,54009,17105,60875,26827,40564,42865,32817,41757,60393,16196,63977,6592,42668,39485,59033,27752,51520,3272,50329,37491,5064,4218,15981,51447,15079,33798,36468,39777,9185,21669,16755,54764,25856,57188,16082,46034,46395,6902,51722,33600,60828,14045,64429,32536,1244,400,16933,17802,9538,20087,10645,53872,23819,8419,6449,34230,4708,56166,8953,5200,54892,49793,62079,59149,25764,42075,37427,54316,30501,26269,40378,38252,10591,22944,37660,53712,61009,3668,51350,22138,63452,42899,37413,64709,1108,1306,26268,21232,10884,51733,58302,10871,42239,4412,51957,45225,2508,62519,29751,36228,54571,1941,15455,8003,39594,11782,45549,27442,56299,57000,62572,33603,8758,57951,42767,59202,18749,49374,27812,18251,46106,39696,54127,55723,30783,25749,37133,32243,12560,25892,64922,54003,897,4866,32432,28660,55353,10644,29152,7369,33861,15197,10417,39016,50979,51055,20031,40825,18465,37252,34690,48884,47289,6869,62562,17239,5283,815,13188,19898,9194,31337,48087,63183,17003,54153,13135,56972,36734,50240,45291,3771,9499,4822,62769,59231,56888,57013,45405,32892,34923,56495,61935,11425,54966,3675,40866,33965,26345,62889,28522,22093,13408,29397,50395,53742,12185,64727,57742,30244,1596,8765,15323,24900,22095,53987,26735,18299,8896,6654,21784,38673,60245,38122,37249,50901,56449,63898,48206,40834,13278,52845,64607,49137,50459,50392,46751,6000,2889,55892,37037,44893,19311,23981,30548,4329,11050,22666,4919,34676,31628,60942,24579,38548,30902,64882,38297,6164,14560,14388,54382,29684,55674,49707,29870,59221,44272,5008,6035,50273,29361,9392,56413,61303,52027,28370,39673,54187,32207,42271,39253,47652,18430,29904,1148,10558,59475,14790,46262,30940,27476,61335,35647,32318,43128,255,30790,23086,29659,59744,22589,49025,9670,35684,39482,57306,9723,36866,44134,8718,56845,14511,31287,56141,41845,949,38537,8502,21006,15187,36700,25333,36855,34515,49106,34854,19866,28031,2746,56658,59478,24106,30916,37383,8012,41708,34618,50399,1583,53479,31605,57712,7992,57589,24643,27365,52024,62120,40184,64371,30732,24153,51663,51203,5788,22644,59435,14707,62716,54970,38591,61401,28855,10953,63901,55679,97,6392,60748,64443,29303,56265,45724,38796,13282,18346,1221,23438,37388,58841,3130,27255,47531,7592,62904,16124,51053,28815,49086,55152,49764,48454,40003,59065,34737,60905,56783,15718,37944,17529,61649,44323,8471,25005,12946,65185,16255,56872,35023,54575,49232,46519,8577,15854,43287,10641,64812,2972,21867,14285,42639,15381,53021,27688,35137,44349,20233,4076,43922,6571,60386,20305,59047,13683,47921,10524,30331,44480,4581,26020,53859,60819,63371,3185,30550,37642,23542,6721,59771,21599,7398,57031,26345,1957,24535,55911,52831,16070,11334,53674,21029,20069,32616,53487,20069,64841,39546,32273,56355,20229,59586,42769,22585,50704,46176,23606,50273,8955,41515,43034,28631,46401,23451,26203,35146,8523,8938,41550,49063,56274,4574,58412,62214,422,37975,39599,59041,25020,20103,12645,13425,1959,3865,38821,9498,43007,27893,2498,58723,24834,40752,7497,41403,12720,25128,57049,21900,53475,7687,38659,54111,15338,44090,57952,47871,49846,21803,56612,13741,12651,50101,18794,37865,20453,58100,31316,41650,41385,23578,50077,18250,16567,7804,4754,60842,45113,21415,34676,27443,13540,35787,17962,35554,36018,4518,16289,40457,2952,12440,23260,55978,8142,16211,40493,26789,64622,28902,35977,18732,64086,5634,45126,17133,24639,20613,13093,1744,32083,49460,19584,40558,15960,11379,35704,51608,1669,22231,21449,889,13560,39482,25577,27537,7232,12885,39426,26685,55750,10915,56402,37349,32562,21393,48185,2391,1171,13368,50320,11644,15171,12006,21355,17353,15101,27218,20796,13025,38882,57534,10581,13104,16259,51490,58800,23093,55668,39708,28705,6488,21064,64415,55952,31590,50230,36139,7856,28584,60152,59102,6949,56595,41421,48822,47538,9029,49589,59336,11119,59378,56987,37281,11923,63993,62183,22869,42024,25635,64095,14957,7025,35538,64948,47996,2641,8356,15983,48943,27698,64285,25320,25869,19583,5597,64805,22128,18783,8348,22446,10397,9030,42925,64816,37069,12327,60504,13388,65230,7831,27093,54001,36878,18492,5839,13011,1325,25918,14099,50839,54738,48359,30160,16162,55009,38579,4908,56556,11042,42294,28133,3472,13437,63670,6912,13733,10284,23425,50433,57083,56038,9270,25740,3115,17212,15896,21951,41304,2535,63367,21183,35358,27471,38995,27706,3123,32064,28526,2563,16676,52939,2162,5940,24354,64389,27558,13337,28081,39299,63575,64769,31458,15235,31594,24802,30293,38763,48716,7822,10846,6502,32980,22680,13128,41783,56981,60684,11131,9593,24824,60339,5651,52978,57462,23868,46015,51958,10202,23453,42618,46678,29938,14402,10161,60665,6957,32566,8790,38908,48779,21963,55514,46581,56359,18756,37726,8116,46102,37678,14900,5681,45763,44720,36582,53832,32217,2495,61100,52162,42518,21280,30079,22619,62161,30454,11825,26008,43348,17180,1204,9309,55716,37178,5469,38984,6442,2087,44278,9730,6085,56831,37086,48111,64306,58697,43110,16458,35118,9120,15640,31532,28763,48496,8059,52528,38032,13096,20682,59142,7375,46604,42047,45199,34780,40135,26871,16651,22784,21192,39076,64278,31342,63759,32865,56007,23483,8045,27428,29672,59204,57847,11031,43440,43658,54599,35848,37718,47652,11990,41968,64348,17150,63992,27622,5991,24032,37468,7000,16176,60167,13684,18290,52769,57183,49765,16384,18382,62469,10777,46370,37621,37905,11372,16670,49268,15483,7125,21915,46586,29699,32982,49385,967,49099,7782,34100,44501,1810,20509,18296,30214,23513,48344,2736,21728,13567,27053,49094,12994,49379,45290,64937,14697,55954,65235,21954,49260,31343,63314,59841,63654,56326,8802,32387,16826,40228,23041,5283,41053,33544,9196,60354,17136,23783,32295,4880,834,9020,49509,45003,27246,64049,12546,13024,40839,2403,62606,63850,17710,50056,58830,7353,12226,30709,59006,8455,50175,25834,14868,9569,27664,331,9132,9412,49475,50679,63194,26261,37983,32138,1754,21632,15185,37768,14542,26094,24874,28951,92,16001,19522,7865,63003,22025,7670,27584,47833,31184,5912,17095,20865,7888,46812,3917,9989,37737,52433,53996,29717,46577,48502,35353,53347,25669,50736,8498,57627,17424,49183,56969,62978,3685,38528,30648,8998,5969,22257,15764,10609,40965,57486,29684,63695,48826,5344,28764,51232,4855,19490,42212,34324,44555,39994,59628,50604,46490,64653,13557,4797,59453,40557,4695,59783,28586,30078,61788,52791,51355,61069,30536,60672,10522,50006,58902,468,37707,40119,17430,390,6825,60772,17288,4656,6520,22337,39436,36302,47419,19635,48081,15494,6333,61421,32864,16316,44972,49715,27790,37273,14772,1837,60436,62400,19280,5823,34973,56604,35804,60811,58878,33103,50005,4803,10915,6243,15313,23377,19919,40468,5362,32646,12488,45003,31658,2441,14265,11278,63882,25019,60640,58807,12440,24037,5104,42233,49498,17675,15245,41070,51059,13569,51428,19308,36113,23202,9559,30660,29569,23772,48373,13734,6192,13791,27699,51120,14015,2191,51113,47418,50665,49685,37168,63000,36109,18576,40039,29719,55453,41706,8214,49681,6084,14266,39809,28431,60482,59255,28726,13417,50429,23261,24863,24998,37173,40950,19178,30448,19081,32388,52617,43058,28667,12153,39687,38146,5075,48470,43217,7403,16614,49921,47452,35542,3879,48968,35180,57899,13197,51191,16908,27403,25386,65486,3186,57241,30724,59561,55039,19077,60739,31610,3897,21061,38759,81,3337,27171,64325,23050,49205,9962,5198,51107,58888,7398,49812,5931,20763,62030,63693,9709,63999,63707,44331,46877,21760,2912,62911,42888,2169,37942,40363,44638,18411,22835,14875,4256,6214,33424,8491,31303,39528,16619,1852,49888,63559,11784,35733,62280,23431,8806,36913,32750,42241,7797,55768,2394,9730,57239,16156,12268,33913,6685,55197,56769,26713,45652,21001,57770,47891,7044,17777,19864,64537,29629,19026,16362,6223,24582,18063,31792,7575,13346,28297,8108,54607,50058,26861,9625,13645,59414,44355,60102,20557,6702,11751,36435,26397,12536,36316,44432,41868,35277,34343,21549,24731,44121,20902,60523,64151,13727,9209,10706,14622,53413,36768,57274,64277,29056,49569,54182,51688,32020,16335,59163,3183,17214,43239,45580,38231,11528,29788,15608,23119,57804,61964,56304,14513,22934,29383,34085,21814,54422,29641,61331,61845,20863,17199,60006,56613,8359,31544,53637,16893,51461,51883,47437,32094,39353,33082,52284,45405,62888,31484,19568,22852,7513,16289,3750,19850,1539,22469,13664,15234,17576,25334,25878,23342,32510,53982,1901,53867,31265,31868,49120,11642,8815,29552,37582,37860,11925,42143,40076,38553,26140,28538,42352,25881,36016,31038,5637,9504,1270,10955,16575,51604,28478,65175,14378,43128,48602,12698,28675,44988,13210,44779,23445,63871,25743,34605,5221,48122,19163,34753,20406,42703,12953,1165,11746,308,16721,45500,47213,51645,7622,22936,41301,31352,5872,54647,58271,19348,46752,9871,46666,58814,28399,31731,65308,23440,51058,7401,35577,41354,61920,33293,29515,5257,56241,17154,40808,16184,22724,33353,41012,50965,48162,37162,35629,15675,61045,41259,59610,8276,23842,29418,30354,46992,56091,43058,42549,58926,63591,18512,48100,62412,27910,19610,2858,43774,61997,56168,59481,18478,6929,55055,28529,37366,43562,28395,47526,476,44524,62093,6494,30067,29522,38153,29920,33920,30100,55827,37378,41540,40644,64547,65498,12825,52314,43682,18150,37642,8206,14781,61126,64116,56943,63982,1351,9566,56695,60586,48412,32113,14948,27410,24842,42929,11367,41614,47474,46583,38700,39316,17453,27524,11718,1032,11016,2864,31502,40037,40867,21981,42094,48048,7860,34027,26306,46121,60569,55307,6165,44178,14905,38716,19185,12235,58274,2450,39600,56836,1119,49296,29077,26577,50961,18599,5972,62713,36229,45312,44101,47211,55196,492,18830,15302,58162,52236,64099,49162,32283,38110,37861,59272,64531,30835,62055,1886,52106,53564,3713,27209,31448,59478,4818,56621,58003,29506,48518,8079,57739,51951,48267,5995,48136,9286,51337,26960,62883,60556,18665,37053,42603,8975,15679,63715,26612,33033,52541,15578,37631,49648,1304,11788,5508,62262,33600,25934,18565,15921,12389,24951,43644,32324,29422,9378,24464,1959,45207,5574,40627,34876,42911,14825,2052,24563,47492,52793,4809,3323,49782,37939,55251,21252,59567,25614,41263,52351,29200,24823,36187,1335,30960,2934,42012,51030,46557,60386,1794,39707,58093,5921,41336,13397,7645,12154,56576,7972,43022,59590,8544,43987,22337,63030,31336,44191,41057,13735,59230,1104,64606,44992,36701,759,54320,46848,9864,20172,4270,2533,332,46860,65068,3805,20993,18902,2678,20649,58689,2818,40767,30559,60802,8456,53059,16086,26157,5921,11239,38295,13783,64462,9511,36837,4362,64305,33787,60570,52929,64604,57346,58547,12857,31583,52851,59783,20124,18808,4145,59762,19484,58703,65229,3500,65281,36629,44896,24433,58425,55410,15768,54628,2287,12751,8913,23394,27193,37950,32920,42500,46947,1597,2331,48435,54029,39234,40043,50221,30641,34073,44949,50611,11357,8894,14156,42300,55110,52486,65524,54809,55957,63741,35547,61936,34064,57053,1037,38672,65458,58110,59213,26528,10388,21986,60516,14204,35979,30598,42511,5618,12827,36105,11921,11527,15182,65292,21201,17879,20056,557,47443,44149,17600,58970,36087,53836,451,55791,16352,23828,21217,6852,10775,40792,15181,19865,53141,52950,4934,7482,51324,48504,52411,65450,27265,35874,47909,36866,61977,20149,37142,30556,39776,47554,30607,54484,25657,55126,51357,46669,49198,27693,17242,42055,52215,62583,4766,6851,9034,7313,62281,44007,37910,4466,55582,40273,55355,16025,49020,59758,65416,48002,63592,24760,32495,17666,64673,38400,24891,41283,44001,13624,35926,40595,10713,27573,37395,34415,36372,17691,42685,35992,44388,1668,43393,51267,1272,20942,12979,42259,64316,9279,241,55015,53393,45899,35079,3236,1926,10196,54610,48288,58537,39724,11125,15810,62391,39401,17844,50669,49260,47293,35522,59078,551,42350,27479,39167,14536,33495,37700,60797,48012,41001,34313,61953,18558,44768,760,27929,64506,55308,51594,58145,47598,51614,53941,7771,46083,3970,59017,13364,11570,58123,29874,45872,1115,63908,6014,5426,5765,40598,7737,50216,12626,45091,35982,32635,1783,55407,1977,1401,8387,2430,23723,64691,48551,46383,20143,10021,12884,27178,63261,53971,43423,56168,58803,16140,33019,20865,6780,16371,41212,19477,60495,54677,29883,37618,19352,28665,18889,63108,39304,22909,61837,22465,5096,37448,64904,22861,3663,10838,10107,43503,17082,14585,5076,58349,39931,4483,4731,46158,11552,26680,62949,51909,44745,58767,45977,48412,509,38163,58089,19167,15323,31431,13022,43904,35276,59347,39602,64433,38480,61363,39944,7691,23407,3903,16082,20635,60823,38370,16032,61355,33852,49153,27547,45419,40936,2517,47751,18125,60935,25603,25141,18043,31499,30161,11352,30329,27994,9415,2342,16580,17549,35295,28895,64912,1506,12049,56303,26826,18096,38348,1835,55815,41616,56274,33597,2698,48207,42641,61310,36070,57697,16894,60837,31403,28491,51546,19401,1400,33152,58852,18156,58713,32294,63370,28418,48979,1382,41277,26067,24193,22752,22515,20008,13924,40007,62354,9119,9802,31480,38625,52674,23823,59545,54424,38541,30126,12824,63149,19296,7487,9562,41242,12657,54524,21419,31047,14043,17425,41543,46844,9923,40315,62620,33432,37021,46141,25700,16177,16944,30819,63260,22871,46379,9589,23385,17133,62822,41363,19521,18401,24092,52033,11729,31641,9554,31718,26666,56954,28144,2472,60611,63596,37427,39936,23678,49119,40929,262,54750,8485,49496,59971,65293,26099,2626,22043,36671,13778,60258,38404,36365,18969,48846,29248,55364,45080,49089,13920,27123,38966,37742,23004,61399,65153,8054,46657,36134,51098,44630,61806,8475,41999,11355,40137,5420,42300,3931,11068,12597,12699,48416,36077,45285,52209,41090,31475,8090,60106,56714,20290,61925,36782,36255,25157,54464,53666,59743,5920,15313,48099,52465,52401,50261,50076,58558,23508,58624,2388,47589,17029,59622,13440,56601,14633,21992,16803,31662,16121,1178,18333,13999,4989,9923,19624,3754,51941,29796,51978,9639,41869,49134,54347,56831,52983,42482,5110,43167,24013,53430,64667,21391,16511,64476,16211,12589,57665,48423,51044,63998,5985,30677,44996,34785,52898,2653,44169,42953,15010,14736,64516,55821,12214,25110,18216,62796,51901,26081,8965,10105,58431,49278,23235,41530,23037,57035,15282,4444,8765,38125,51834,54930,63146,56876,35079,48182,32299,63493,18706,34714,19166,14940,60729,54755,1708,6673,58287,40162,34712,54183,40989,23667,35740,6127,12940,1043,60664,25600,7611,15049,61295,35438,62156,16789,52277,44571,12316,13113,25442,27069,10034,30614,17368,9830,14139,13126,34241,53742,33783,63068,56342,11644,11153,2343,9564,4696,18675,13379,9158,10790,64350,40443,44390,13688,1561,47780,48379,26958,25443,7422,2630,8134,43730,12777,5143,12156,53377,9504,9553,21702,3031,8870,42080,60719,17769,15865,15139,26240,9603,37850,64246,26784,64000,15212,28297,13589,59154,22724,63361,21356,41990,6385,52092,54097,26534,36792,2585,10807,26932,39867,14431,7621,60364,63936,48340,29855,45806,61951,1737,14478,38524,13062,50356,38196,50099,31644,28068,36027,18393,13486,16262,56707,31174,23815,12570,6035,23451,62407,17291,1266,13499,52346,4634,61793,58871,18430,61621,34558,3477,8794,63054,51232,45662,49781,49235,11840,36779,10125,34725,12185,12736,1429,17061,14013,46700,31548,9737,59695,42132,6330,38445,16933,57025,55721,16708,30204,37767,56553,273,8310,43801,31271,17906,25415,56101,29070,39342,48997,64122,42054,6737,49905,56961,44200,58503,26942,61877,58879,3390,36685,6382,15331,34732,56579,34809,51871,31412,65477,8233,26896,29106,1047,58900,55472,18791,31908,23061,64335,1437,10872,56368,35324,47971,50612,37888,44059,10989,46879,4812,5683,26556,5952,42523,28949,29976,1483,43760,2409,61891,13155,6390,41479,5229,56414,12860,49218,17919,24955,33125,31209,44495,54459,6653,7905,64067,32587,63026,38870,35209,63669,55133,19995,33474,27481,1768,51162,36006,50688,60350,34390,25079,29178,60555,30944,12122,45113,35529,7617,6643,55077,2588,15775,25990,42787,21597,62230,10477,4489,18399,15705,40908,46873,8965,18106,19800,44912,6975,51853,36426,7379,57569,11121,14328,46594,48934,1298,8401,3140,49118,5211,5921,3244,2737,9034,46313,45916,40820,7907,16684,32671,16287,53412,1058,4945,38826,59555,43418,39800,38297,60106,927,29703,56975,43455,32513,28561,11082,9895,24075,9487,12267,42882,2921,50762,33567,24783,64937,37455,27797,60195,49842,18106,65161,53670,57360,60904,47913,6328,56808,2348,47377,53786,41548,3366,1031,56430,25666,44238,10094,20344,7709,27746,7732,2596,42477,12344,55126,8999,46475,63976,32167,16331,7826,7933,11536,2031,40572,63680,39469,21187,64709,56286,25304,53701,23031,30094,32740,23134,62781,28245,50573,30839,59392,6829,2776,52644,49265,59156,52046,57129,24933,50610,44667,57878,56530,8405,50492,52223,24836,63885,4717,16304,34887,32402,19033,62807,35877,59004,25956,23354,52438,31917,19435,18594,50967,23224,58380,57813,22191,47278,47855,23043,54727,23431,34582,59522,29663,42521,37375,6449,6622,17182,38711,10801,42741,49674,64786,16152,42841,63134,17753,55553,37483,55416,49336,32719,39800,21861,34072,30959,64921,41188,15683,14032,6449,6303,1153,41635,28305,37186,21871,45079,50269,12896,43631,55521,11755,6128,54529,57405,38515,41392,58880,58562,53238,9845,33363,26411,46966,34280,1945,20325,45892,697,29594,3945,59727,631,51224,25717,16419,63306,45152,53210,22838,21106,64156,62119,36905,47297,18004,47686,45583,59232,32239,10177,27007,12479,2745,61445,28577,9030,16274,26065,14560,65053,12664,4275,18846,11664,59871,41297,3754,27520,15816,59650,10418,31341,29732,27069,44325,43202,11419,37315,33363,53912,45188,50271,56336,20530,27823,5926,15637,40131,18230,56123,59548,19806,2331,43743,26983,64622,53028,38762,19220,33848,39714,12855,63227,24421,18214,21698,53082,23731,11181,10819,3385,33296,506,6035,10458,26133,1766,59910,4434,17997,17830,4108,49981,20361,16771,65022,26841,60162,16807,64420,6473,34800,55138,30030,5341,49241,35248,25763,32434,12569,27018,33057,53135,62039,55771,51221,6498,49949,43558,45196,57260,6812,49980,14443,19455,42416,61377,15062,34007,52747,10552,32127,1769,13184,18281,29249,38528,17807,17932,48414,24157,50410,1975,59885,29567,58117,4136,65397,47640,61767,5992,42086,4251,35015,44840,14547,7049,6009,55354,5346,16088,27108,53336,64406,63838,52330,58778,22045,15529,4965,54620,19217,11342,15645,1187,48352,64366,35361,48126,29228,33532,12905,22298,4657,40397,63324,29198,55305,54097,5548,57358,37183,56803,9773,43629,59828,53817,58484,3007,38965,57906,25812,9473,2063,38967,16654,23124,17693,52949,37887,53452,42152,58336,57536,22581,24275,37050,11432,814,47634,35942,22854,16199,6932,54629,59280,34551,60096,2600,61935,4891,26469,62235,48419,40067,46947,28127,10274,42471,30446,19083,15643,28337,58665,43399,21404,47871,31022,46110,51980,30428,5863,39801,19434,29686,9455,24765,15348,3220,61262,3692,12856,5603,8172,50387,64905,34577,20939,48042,8621,23326,55627,5018,31019,54350,19001,29039,62448,56351,45035,45668,26752,5184,39120,34291,37592,60442,59778,22110,3136,36343,7209,59029,64431,17981,28049,25671,3480,8599,33652,18972,23060,34704,6086,54098,32972,62343,49660,38763,17957,47068,58895,57778,14806,3927,22958,10617,24454,32316,29381,41386,62778,29062,18272,48970,30597,45831,23578,10983,64242,57482,61419,41381,61611,19791,42934,24050,62775,11442,24514,17836,25967,8040,19907,50784,3359,37883,22536,53996,44440,56181,32709,14662,24246,9024,49823,46167,38947,54078,64146,19525,61298,28521,24799,1015,6780,42589,49397,10924,12982,36871,9421,63056,7154,45837,7062,41872,36997,65183,51289,3206,60779,60021,46241,43243,24908,37817,60155,25446,5833,60513,1688,50293,4618,31891,43540,26195,36703,53402,8028,43711,41716,49524,57056,5206,13509,50423,27336,13726,19173,19737,46970,34749,2234,22692,37839,15436,1426,26707,16409,25988,3688,34105,46058,41548,12036,16633,28507,28543,62839,46631,11793,49261,59286,53861,1589,46387,21219,730,60339,56800,2813,13319,5303,6292,15296,23435,42306,60947,62472,39779,33742,44179,5968,29367,64320,36274,24439,52099,5197,6364,5069,55313,20897,18329,7763,57206,58468,4900,9801,24368,20274,1397,36463,62550,50710,41943,2861,53588,51324,25013,33334,15119,7559,4328,10743,26638,54090,34278,48008,44190,56325,28464,22348,23441,53386,60681,36557,57999,27183,65270,20022,20188,62249,23714,56931,14357,13922,26069,24248,60587,55474,61882,6070,13776,38386,61620,41722,29023,17098,58411,53779,40211,49971,23152,40255,58237,51250,43629,51838,1043,29632,25357,19181,58690,1590,29778,23564,3639,12099,19300,41071,39537,2244,22877,54265,51691,10058,11481,49678,29435,54930,8040,49522,39462,37078,61602,56137,51739,25642,42669,47473,62125,27230,10473,20471,8806,13552,37052,8406,30999,716,8953,61854,17842,48615,14761,28793,25675,37666,51606,6121,10467,62389,6502,50276,14989,50489,28239,52673,6804,38035,32806,10034,46182,27257,35715,16850,32137,37139,31540,35889,60648,56229,54235,29098,45860,53061,3961,20927,34377,15784,28433,44568,8295,55483,9861,17352,29363,27692,6681,38622,42061,10120,44362,62552,56535,51363,49579,21369,22492,6612,31123,55597,16995,64026,23678,64308,49015,40495,28436,1664,24880,27331,51805,5786,28879,34135,8565,65391,58794,45834,63518,47791,13073,52644,35551,7418,36440,42299,35973,60835,31376,3523,563,9053,51070,24380,25142,32348,9235,15161,64514,51759,61776,42445,53432,148,64285,15637,28897,38624,21235,35592,18310,61830,48593,43869,19798,17815,63901,891,21147,64139,40281,39296,54462,5620,21915,19111,24717,36363,54614,32256,7800,14547,44745,39002,45211,59981,15685,63506,57619,49951,25012,17230,22411,45852,8213,26170,1138,17176,26229,57194,13379,21963,49023,57110,2468,2351,27449,31796,12329,31705,42595,53072,20644,63603,7070,13178,5606,51997,43575,55064,35822,36539,5372,53725,54018,46490,30762,57979,37122,18149,4144,61757,51239,46867,58281,54644,18651,18391,40543,56530,39445,62253,35285,23195,14163,11729,28209,34755,7869,19826,49423,29466,16138,25553,17598,4858,23938,43315,41288,49675,35823,50332,9131,56697,19208,13505,8479,47152,40593,53910,17208,38254,47910,32708,39859,35822,28447,48431,49042,65341,3684,18607,21609,33323,40554,49317,47546,45412,55275,49372,50485,34751,49573,37044,43146,43700,25162,26102,742,28012,56890,12611,62712,13202,64947,36952,57659,25343,25991,35560,29163,30541,25244,13890,56753,6446,21726,19641,5936,2405,39566,9609,30138,63745,2568,26790,19771,63798,27805,36458,6808,24729,25614,20991,35870,46757,30475,17684,20909,60055,38377,22979,48215,16574,60804,41972,57705,24916,18687,25480,35682,32141,38473,45343,8624,12707,1853,25198,52108,19041,24897,94,41140,11237,1920,38420,62423,23888,55923,6485,6401,26336,27009,58742,23892,5951,59421,28947,58027,18835,54468,23734,35501,26332,41636,44233,21505,29430,24768,41193,63418,20848,64428,56397,25395,3865,25594,45741,14712,20631,29430,16921,63469,36568,50531,64445,17716,23517,34912,44700,54622,53471,6812,56011,2508,50584,21794,51673,1761,15317,6977,2209,58386,3657,18668,20401,2296,11869,17817,2849,62995,26522,40438,47120,6208,43836,17238,36679,8743,30386,24478,12200,48873,42040,29937,51846,52342,34315,50088,2675,31733,14703,58861,52765,61267,55550,35895,33302,22819,37736,18560,53590,47435,556,30801,15757,17852,54543,64194,23691,26092,17784,27127,13826,8681,17779,52699,15792,41443,53218,5591,49421,8828,59263,57891,58032,37976,50214,56683,58678,43712,48179,27127,6025,4116,20881,15323,58321,15961,51816,50049,56816,46044,15,56490,61651,45381,54682,51235,54732,62938,1321,32456,26084,51537,15918,49839,5205,22500,8748,20304,31597,39586,6951,61763,43414,10261,29664,18217,32542,27223,55214,55010,4406,36379,3027,22534,18956,17711,16615,7212,50397,49344,3622,55613,27725,17158,10301,60244,59054,45732,11195,17326,17782,33188,14884,17157,29032,34545,5559,6443,21805,2437,25636,51108,5122,43707,62642,38007,63310,31858,30768,7968,20207,30740,11329,13983,32063,45977,44705,11943,40065,59799,52995,55340,1772,11759,47519,47893,36656,11700,1058,14527,37877,64687,17961,7567,55112,47365,1117,11168,64347,47075,31063,28054,37819,44755,8759,40703,45109,40180,16557,7512,61808,41695,43836,60965,30101,64848,56659,3686,3400,40092,55145,46019,43125,45079,59692,867,12246,47456,54904,42729,10680,1706,520,57168,24999,12130,39514,26842,26994,51192,61619,6309,38513,10496,6374,23287,28777,41751,48441,26897,43922,25141,33474,39881,47327,62798,58466,51670,60531,4020,44649,6438,25891,742,43281,11190,28144,2430,5684,37720,12101,14022,46263,12833,41909,53769,36826,16841,26664,46198,24190,47900,33160,58086,57322,55528,24112,36744,28772,31146,46113,54144,29792,45093,57113,3246,31202,63731,56071,45961,3725,38656,27355,35076,44786,9161,64409,33996,16642,16696,47525,52758,38419,56340,14557,57717,63207,14296,57083,80,1982,54746,6786,3759,11618,43849,29360,7010,36609,4860,48203,10780,63206,43789,36120,4674,14574,40833,23734,14675,49778,53595,45932,3997,56897,22598,27011,6234,40346,23070,17960,33057,43413,21572,7971,40973,61169,51144,50058,35710,18068,59707,22208,15869,31064,37600,10938,24933,24035,56914,60200,317,45708,54824,16625,42200,58357,14893,6972,25921,56295,2131,57201,49296,50140,39693,45598,47783,61049,41251,22358,59752,23942,63743,48920,1314,23844,27133,62560,426,38389,4905,10573,176,60155,64760,33015,27811,63546,21771,54357,18849,56037,57290,6131,56878,36919,14730,43745,28027,53218,40057,58652,18,1445,53951,4264,40331,62873,46160,60664,56148,20241,27475,18678,45204,35748,8284,30745,40762,29393,21575,63153,55359,37602,8489,62005,56155,56367,43300,63843,33652,10088,24485,36103,46219,1528,33124,20328,54436,28318,50447,56061,5790,60970,64011,63483,44857,14333,62232,37421,43023,48614,23146,48602,23923,21195,60644,1067,57248,52321,5001,27645,47464,8880,50982,60415,22291,13198,7672,28511,60509,7242,20186,17446,17829,43968,40050,65386,37148,18692,65383,32418,49579,63477,1365,4435,35871,13020,47426,48106,8252,40055,18107,49864,32469,34777,59023,57196,47841,25794,511,27522,40820,37100,61622,45607,63258,41464,38002,17711,18516,32189,20812,45761,59139,26333,6125,52911,65099,18888,54869,63192,36284,51978,59454,34563,23414,28480,8639,63018,59354,45761,20503,62732,59283,26845,43469,39201,22943,4071,9397,828,24511,48287,16404,25085,59474,34590,27106,58450,56164,55374,19486,6660,27583,39227,39145,29043,41605,65460,45054,15478,4081,53215,52904,59088,23453,32661,37211,41168,62440,2652,12239,61581,45470,54612,59621,3080,42322,57639,18966,14295,59367,2070,48538,46423,2644,29957,49951,7765,36766,63485,3469,26849,4975,5469,55628,3621,20309,53487,37644,64865,35140,56754,60208,39259,58576,5206,7009,47212,44901,41561,49141,36218,8617,63123,16545,42568,17189,10081,23870,41016,3789,4623,59764,57456,19825,49641,30377,64819,64498,37715,49376,47721,46250,56051,59536,41213,27558,45931,27072,27645,15286,2373,58538,20733,15892,2629,61290,52645,59937,149,57741,7245,62259,15776,58264,4384,20970,29148,29627,7645,23894,51663,12232,13115,34977,13820,15452,62210,8956,24257,26727,34793,43947,59469,12035,46450,55678,15274,22663,37096,41037,64098,58348,19053,22105,40530,25510,58707,61703,62897,41422,15395,36762,60096,41854,35456,5899,60318,42247,1578,53899,28003,49087,55339,27055,8987,52221,26345,35582,7801,7700,384,58265,35607,61847,34220,61457,5258,8503,32729,45419,26393,58695,54897,20515,16177,34650,33328,41227,13640,52620,57411,14750,29702,57290,29390,45386,32987,58460,20452,23607,6416,59345,8573,44218,56185,45621,56132,35002,30135,59794,2659,44560,19454,43246,62778,52119,9239,19547,9487,37195,43834,11922,53672,27502,60672,40701,19005,32585,30146,28589,27632,35042,48656,59924,23270,51399,22723,36190,1247,58394,50014,53961,18249,22868,58085,46869,10707,39041,33085,6277,42355,49106,2392,54374,59114,47854,50377,52052,9213,5900,51007,25921,53886,47002,21195,16756,54293,22214,42387,10892,88,31399,7276,416,50267,47603,30834,25480,32600,10519,9123,44837,104,62158,52797,14095,28935,20900,59430,31589,51708,33991,53127,45102,12821,39435,52540,62241,21964,17082,12732,42276,12805,45645,9194,64560,23065,27884,28592,62344,18548,24503,4130,7461,49057,37146,35770,62149,8105,32903,15598,41331,52711,12059,38989,44932,50100,50365,52386,5832,40911,57126,23056,49511,53613,38667,57293,51640,55621,1684,39130,1536,12759,36712,46718,6486,19555,48104,15870,7207,49777,8466,4562,33190,39047,64544,56554,49161,54137,32744,18359,19549,28675,48577,5450,20998,41042,15998,30464,13711,21694,39779,10745,50323,19899,4962,61641,31299,22907,39326,64054,38288,34045,42872,61354,20209,6116,15099,6022,18008,51749,12825,10480,13734,48246,47781,27921,35810,64248,64965,58193,21918,19525,59463,6743,48547,52147,30997,58105,11810,25038,61770,43153,22234,61789,29367,9662,13769,31306,59666,1610,11406,42057,30449,45539,52754,23677,58772,50567,11043,58576,62889,19639,9975,48417,13318,36238,41104,33631,51213,23377,62988,16570,9624,28828,38161,28274,25989,52263,16601,32755,61791,62656,23866,6554,49145,61481,29857,13289,13832,45558,22974,46637,58931,29812,41310,8889,20311,7656,45544,21554,47360,10646,47745,53101,21049,35324,62317,34277,21801,53505,63084,47117,38792,8094,40219,9012,26554,19612,1799,50483,54409,38086,25686,26940,31421,26705,48768,25662,8295,20113,24276,13239,14556,21036,55896,40430,24202,48283,48154,43761,15766,7491,29700,60784,45194,44998,18411,3579,10934,51960,31212,22923,59802,58904,46220,21435,46261,58143,54911,17708,22524,20752,59512,28890,2411,9915,30324,11925,48417,15908,42808,51458,24081,1801,57164,51450,61203,40310,23562,13366,43730,7517,3356,55339,11977,25008,58232,26128,2908,17020,59264,56660,15335,49864,36469,29631,23573,54879,58181,54856,37794,14653,55561,2893,28677,1199,14924,24850,11812,24694,59657,57636,52448,10382,50431,14256,51261,2415,58868,53303,56509,22332,16245,63455,43043,24886,19964,56408,22168,505,4524,42478,54289,1375,27875,51870,45658,22568,54958,65382,27472,5380,9007,19898,27794,61672,30600,56483,7836,5919,25409,59976,37196,15753,5083,14720,31422,24741,37301,27427,38891,26267,14432,54987,61902,46519,53800,58778,3399,5396,59624,7707,55598,21375,2447,55554,13143,14161,60208,3184,51015,20891,63696,34833,7014,37514,13956,4498,5852,49261,3784,3674,49266,60237,35047,18737,44117,21777,2155,59145,39801,49045,61771,34727,30705,63528,25210,49750,58287,48908,2270,22408,49127,6039,52555,22500,32836,21433,9710,9967,12837,34097,15805,6844,21596,37330,27124,58089,63711,51835,7297,6585,36880,54258,45520,57273,55310,58942,60744,49192,27893,8318,40366,27996,41352,34363,43446,51025,31527,21528,36110,21383,47330,35181,30159,11447,29082,48485,34095,28296,32465,30961,36026,39400,49762,57427,26115,10159,35078,57939,57762,50261,57695,30380,13583,4735,35430,17437,6222,60613,36404,14848,64497,60384,670,8010,32971,5496,1766,24015,1587,13319,54724,25671,36447,12956,60601,11526,53396,12974,29996,55630,26466,63510,46445,25440,29075,53997,38347,3995,45069,52441,62421,53368,41019,41373,43344,64892,34664,1540,47834,7091,16813,49190,25637,4574,51899,23525,10641,3540,46242,19316,64002,9472,27844,17739,5744,36830,2025,28607,41893,31729,31075,9947,65167,21684,32511,3283,15161,38526,50919,61052,40168,36430,42428,50207,63519,48259,3683,752,5874,64453,32298,6744,52498,21660,16629,18072,2547,29423,57552,6823,40302,15593,34296,54037,18074,6811,54155,14662,23962,34775,1631,64204,59463,52180,4794,57040,11701,46256,10512,6480,54869,31023,35715,29101,14245,32668,56850,41014,46470,18082,21065,44954,13747,35945,11754,12746,4767,32292,25425,16809,18053,12426,25321,20558,52572,56371,38783,14304,36102,20055,19259,11038,59830,52234,24708,55095,3135,2107,37766,8859,15228,61054,1595,641,37516,3501,27356,2863,14877,38549,28219,6896,15902,31169,42716,46822,26501,39934,6717,23874,30688,9950,34657,16873,20278,4796,8003,47323,1635,51014,2847,1812,20716,46195,59146,39701,60789,36349,43170,59825,13954,60188,44177,10520,27461,20349,7762,29662,50343,34251,9519,13751,20976,10158,9859,34544,34699,10013,5332,34207,30641,54882,16986,64315,24207,58304,32617,1395,51887,36066,35740,64048,59510,10342,31346,10745,37788,62928,60410,61655,22563,20333,46010,4310,5878,36220,1041,58362,24420,34238,26603,50118,38393,52421,41851,35577,48393,35673,59798,32022,10546,33080,29557,58786,8539,32945,14012,64702,22122,14832,61597,2773,61022,13585,8368,56087,32942,55662,36097,25444,65188,6406,19975,9617,26187,35981,56424,7416,41318,64737,48235,11102,63912,32899,8061,16349,9455,56203,45823,23654,29931,62476,29003,18251,30809,16346,28080,23931,18263,6485,43707,43876,33331,21541,30163,3681,20273,65483,41060,38255,46276,37403,48374,56452,40731,29147,64418,35054,47626,62220,5113,24740,29947,767,7018,10287,62610,20899,34018,5342,18535,53957,56430,313,40675,3142,22818,5766,48841,7775,2393,60942,47840,10327,15777,44448,35282,59463,10541,61980,13603,19356,7798,52394,6178,40218,30610,30012,11553,40068,51327,58892,43362,21269,16158,40079,65328,3357,52118,36700,19920,25733,39264,16383,46241,22931,37913,60328,38144,36680,7943,15530,23576,40194,36002,10569,44192,48018,8567,5868,55290,37497,23111,53003,5695,14761,50539,34073,60486,36031,459,14173,4261,50945,44509,10123,2199,58202,9764,29521,49079,31919,58473,52896,36270,47122,40091,55637,45838,60039,41071,60734,28968,59021,24728,22960,48900,51672,36024,51458,8004,25081,64991,4227,9095,5576,52799,61912,10031,60971,10984,3023,34033,53479,6634,17078,35587,54947,27031,62369,12041,19213,6139,4461,5316,6421,50264,61099,56213,37035,54631,34679,37117,36125,44681,28948,64021,29299,28465,34342,44786,57277,56949,62061,49103,10661,46047,14440,10943,55839,61777,3744,12350,6592,52197,12240,63556,34154,42506,42184,58542,49641,37098,16443,40696,11399,13255,49325,60858,44192,9755,10737,63282,30435,27542,56663,15175,28115,61647,40851,2982,16525,24139,6988,63708,35135,40848,64513,24357,51386,63177,30345,34284,2512,42354,49498,61722,27396,45548,52577,17957,48841,57208,37379,25246,14783,63314,46572,26686,56411,58639,6021,45723,10412,2277,62046,45979,65234,39272,43930,30813,16228,3109,3994,24804,30133,47581,57434,51175,46545,51805,58084,30813,43906,62381,843,42866,51746,19745,8021,28019,33514,11384,11726,59627,47643,34768,35922,54822,55881,4222,2184,35433,32401,42331,12160,40836,56797,52696,39355,11154,22348,3353,37507,39434,59553,55188,34346,9892,20708,22509,28542,55853,5726,24238,26781,50518,61009,31260,26314,13854,44688,59564,18910,49774,41268,26070,39408,43888,31155,18554,51383,12874,14617,50251,9334,48855,57903,37649,54573,703,54570,62403,28440,27253,19979,45608,58812,55024,41128,40212,13500,1360,34561,54315,17035,6086,4746,2465,61500,7220,4291,39752,17163,54681,55377,51873,3932,18643,25846,26532,2437,20222,50654,27202,58900,23320,18162,22206,14147,47382,62208,39024,35858,43942,14912,55468,28295,21541,1773,46240,11659,32639,48565,1827,42941,14792,642,39550,44779,57894,6592,36911,26050,58072,8440,17735,40934,6793,53814,39515,21894,22270,33366,31467,56367,16599,17800,5849,3063,9785,8992,57773,61766,29171,60132,44962,35885,51565,5011,29129,55137,19113,16676,30004,894,35238,41246,14213,54821,60040,3021,50340,27460,1521,15028,26086,34954,39541,5640,6759,21743,17320,41553,28134,39083,54172,59517,34852,2380,39433,5281,7633,20788,21590,10084,62903,55559,46079,57064,9660,27854,46053,156,61666,53480,17979,63541,29518,25435,29690,3687,38828,22327,43505,1445,44217,10235,58604,27789,18287,31124,18732,18867,50859,37379,5469,2959,32636,29066,12037,12643,9365,56876,31431,40192,58718,30211,3220,40696,58372,14504,61581,4542,21773,4724,29740,21163,13811,35236,21299,16263,26238,10403,14838,42937,31682,20590,24783,65290,40389,56595,14442,45167,35619,53086,4563,40352,49209,58766,48704,61071,64659,42219,21553,18650,60056,42511,18548,26602,56945,26961,47555,31565,26210,46116,45450,60890,24797,14160,449,37056,40146,52364,47166,32311,47553,42452,55470,15615,35727,6205,61832,32014,31371,3781,29309,29040,33539,55570,61453,62642,13405,720,3413,15765,34850,57431,13264,55611,41491,33882,16424,38618,22001,16692,13788,5629,56788,44963,62048,1771,47327,58767,45922,37990,20067,58887,30942,57209,41828,31577,39597,18773,23629,29440,47423,9317,58168,22764,56207,61690,44554,17656,42139,15102,6787,6872,5740,39783,19466,62686,6530,12885,41102,49246,11370,50793,36912,22826,33772,15108,62256,18003,25533,7985,48516,58737,25864,54053,41124,19670,1921,42236,62027,62761,15502,53292,23167,65114,35163,43269,37121,39669,40210,9004,58098,26734,34106,35625,8599,57412,28529,18708,56373,24190,64960,27789,60963,22994,30544,22063,28254,64592,61953,9376,9230,39787,44857,38059,51060,9534,60788,64173,48870,41632,50008,38043,14939,27064,22094,4557,60422,35618,41256,44031,61310,19549,38909,49131,58151,30985,43244,51547,42394,37156,15114,22921,49356,40027,17210,11494,30997,50816,49712,53421,16640,33996,10297,26895,44563,1389,28165,38701,40663,55535,46550,42706,58869,37957,62371,49752,63500,46283,16806,42547,59786,54750,12129,27437,5254,80,8439,57496,40114,25346,6850,49004,65326,37517,38282,43236,28426,35432,2956,50271,36940,31302,16567,40792,50457,3470,30686,16822,50467,22530,48410,47443,5136,50154,30302,42387,55278,56084,44350,63878,46861,51136,23198,60008,61908,35603,31722,33020,24571,32494,20987,18887,49399,61992,15800,22054,15750,38854,19378,19024,39346,21288,641,56472,17055,53625,51759,13191,29692,31899,25129,38312,28012,40984,49366,62828,30735,47883,34399,33478,52441,55223,51636,15353,2376,44731,16972,31800,183,56589,61861,50076,60664,57994,40199,60934,24657,50007,62403,49784,61943,42939,27946,15703,10499,21480,58360,29760,53100,57869,61252,8543,60295,62397,18518,5796,5017,16563,18172,44321,63470,29266,31526,34080,29112,57167,55900,5544,54649,42719,11123,30908,46822,15596,58059,33570,62240,46054,50906,62289,45315,45962,44275,3021,17082,46452,45130,26033,12272,26222,34660,4445,5012,21477,9714,38138,38881,28406,27266,138,380,38475,1593,32346,1245,28536,50103,33649,52030,56924,8501,55862,47073,33733,5109,39801,19370,11460,38900,14866,62066,25864,1622,51246,27617,43764,63953,19666,15110,42825,25676,34956,32114,43569,39155,40771,48451,60313,38265,9800,32151,14900,39965,45728,41035,44536,2311,60621,53652,32870,47602,14389,20007,17447,20024,2262,32933,16351,7573,26640,21805,48818,49531,58536,50164,15975,34350,22184,46260,38239,42482,26435,54407,25679,46159,28862,5073,47154,52059,13209,45411,55856,48511,31818,55372,22684,20335,53710,42780,49755,54126,54696,35791,63044,49796,2052,26167,38216,55502,39236,55059,717,59092,10271,53355,3954,37942,12618,50700,13477,8351,48172,3514,17116,35441,40855,21207,42656,18680,25422,41182,11466,10454,49669,53719,39899,53529,55427,52920,31545,19544,56721,58039,51447,6734,40014,52157,18237,45712,15283,9792,46320,42161,15702,19709,36613,20432,11125,63705,1872,20823,62889,47677,27254,46244,1396,37743,9867,22950,60172,17611,45499,57409,20353,57644,29704,40727,4754,35479,61095,31466,43858,63946,17813,51496,28627,56990,39124,19173,10423,6925,17342,64050,4683,1183,49649,9410,7616,26488,14606,38844,33637,55638,2941,48502,60731,44763,14080,13383,17256,55237,12077,4608,49600,21591,33694,24296,16546,35699,5238,62105,15550,49112,55241,16939,49873,19488,64512,52522,26720,42165,63678,55381,10175,62517,42470,37266,22147,59814,1467,13177,5427,1960,59505,6856,43711,30436,23620,31750,47972,58280,48080,44833,235,37104,36778,60528,34501,3814,48890,43872,28798,30872,19921,34574,33458,62898,29853,2892,55731,3366,47014,14577,38312,4701,37137,40501,36976,3821,8691,47314,27317,4052,29693,28965,40120,12506,42444,24690,21990,54808,64701,31548,5630,11090,40460,55923,29046,39073,38069,32919,12538,64426,63429,48671,58488,35382,28193,9039,60829,30428,63539,60341,61970,51883,35806,8195,35182,19841,41646,32617,11768,65451,24788,57599,42937,26645,7087,17930,51583,61820,10774,39858,54392,56156,42872,28733,60335,22191,50583,27568,15153,32340,41151,63082,16704,55965,2128,24321,16996,6341,24562,31432,25050,6683,35607,44652,3568,38599,15059,2241,4388,27330,60615,27960,52480,42508,11153,54230,22579,64529,40805,47381,39696,17238,38976,58402,53915,48465,63764,64566,34900,63141,27317,34046,6423,35303,54011,50321,26909,64967,17537,54813,30304,20970,31924,53217,11598,38444,59106,38803,29164,32945,7868,57530,58745,19097,37797,61724,53827,10598,58559,42722,23686,9652,12246,15672,14286,44639,46564,10782,63763,63798,53951,57484,47507,40776,48278,11889,42568,34760,28728,47213,42157,9367,14393,63746,42385,30642,17116,60405,62353,53206,26993,12960,25755,23378,37950,1132,57232,27905,19228,54352,53366,14854,45472,17934,62858,20694,62978,58567,6489,24243,13879,63205,8509,41932,26282,34779,8335,51795,36906,10863,42325,51634,10059,16779,13034,30383,10847,61251,41987,73,7268,22820,51137,56348,32765,37399,26773,21854,28460,6043,35316,24806,26464,28537,46183,44700,43483,30233,10314,58085,18846,33588,45700,58324,610,33288,34968,52570,57094,32731,10295,22212,9427,43684,42113,6862,19968,37374,34881,62535,40851,56801,45428,25523,46547,31307,203,52929,1306,48823,20434,840,33447,15169,41002,29081,3038,8858,48503,25137,5012,54693,24795,46868,29018,9761,45579,42660,18946,64191,51169,46285,46503,46037,64810,26844,29575,62164,37199,65195,9310,21380,1819,30696,38121,62382,35340,27906,14868,5779,2630,17237,63350,7404,36103,41742,36475,5974,54780,8782,61926,34563,29744,62501,20162,65496,32628,25627,52727,22851,64272,32414,19670,16536,11810,1446,27923,60521,58174,52200,46942,24414,11330,60666,6814,31310,10332,23150,48541,33697,54746,24536,18803,63418,3354,46003,19925,58823,5650,25268,2824,53424,37878,58965,31725,63229,10430,49414,40888,6131,35142,26969,24100,60191,17062,29971,61761,58228,48203,47317,56023,4242,45955,28146,32899,22001,57944,58880,64792,28542,45826,14527,21533,25612,3630,25153,53488,50160,57402,59897,36584,22567,49144,55613,25758,5273,34606,32491,34199,39083,2965,31577,64804,28208,58707,16174,19513,30409,2768,56547,9112,46103,48737,51243,56148,28797,50565,5331,43103,59131,28758,56467,64766,7155,21430,64240,17230,16936,44665,30672,65382,48121,47406,21933,3732,14330,5590,63481,43606,30895,38399,49663,2419,34683,46000,17977,3335,1972,7378,41472,5663,13768,48235,14025,31843,2217,43081,30219,45433,1754,11300,54891,22074,22988,43873,25854,59426,9141,42442,19032,41075,1164,6158,17337,14321,1451,56256,23490,4450,24603,24725,25831,25952,65497,47596,14283,44281,23887,61541,43144,40896,36409,6976,18545,60469,43469,14113,30721,63232,23594,5458,632,17756,42815,57015,64722,32125,44921,9217,21204,61540,2969,18553,47161,29761,3128,52739,4576,42127,25470,51417,35199,62356,20301,59585,63469,34242,53841,54760,11001,29468,46427,29212,36006,9192,15577,59227,28627,59442,8333,63136,5451,14121,26949,27778,63992,22456,16933,8772,9023,15681,19174,52457,61846,1290,46077,25365,55207,62586,10537,56283,44522,14043,31982,26778,51254,7290,31140,2457,24224,61913,46976,40742,61906,41853,42135,63613,13933,26812,53594,20341,5078,16689,62327,60531,15732,43191,13734,27654,55185,56533,28798,23966,21105,40046,24900,20042,56983,1595,23848,43581,17946,52742,20189,47153,11850,5421,14276,57141,13403,27870,64897,19804,48672,44903,20839,64286,15596,60798,18920,322,18957,44606,57059,38010,34478,36828,46615,52394,65484,20819,19840,35320,7743,47052,18482,31771,2852,13127,16457,31216,26245,56280,10240,10150,9725,24699,45048,4636,31061,34928,32652,50729,42966,39865,64784,29558,51370,59759,27920,24656,28551,47532,10572,44396,8222,62658,38068,64038,51804,2558,28964,37345,32924,30207,59966,13855,37023,60360,8583,62928,39988,65453,53882,56765,15240,36680,59472,11887,39501,58508,1110,53401,27707,17242,11345,26128,29186,10966,58082,18090,20321,55670,15440,34532,65076,16507,13315,55656,35888,38836,54630,65350,56291,23670,22964,42436,34529,18105,55268,47299,13289,7869,12998,21158,8066,24873,9199,1205,25853,30683,55649,50524,47516,19355,42694,59247,45586,58773,22983,64701,19671,24740,30036,40661,45072,5700,21248,48925,28941,46771,35562,5928,53554,50437,27627,32132,62024,4049,14977,38000,59778,46698,60600,53459,51846,22969,56390,59886,62086,48247,16533,26410,18087,46254,19710,32543,65117,37916,63744,27861,11853,19943,37749,8163,15576,3922,34548,26980,4002,40772,40154,36061,15996,38835,18019,46913,12310,13034,9241,2979,63996,22876,50226,64935,10227,20322,50848,9932,30119,771,15086,32202,10245,6646,32883,35359,21963,6847,35278,58006,65502,43088,25469,55990,29432,31816,11853,64906,39112,2627,34897,47474,47946,37534,58142,17773,9709,16468,62945,37417,11125,18279,6782,50560,34427,39669,27095,60276,20359,3363,49468,32179,1777,57241,38489,30275,5534,34500,55076,26305,28430,52134,63030,48120,6823,51209,51378,2563,20124,44986,47665,23793,8487,51734,821,56048,11418,36623,41543,56809,57863,13884,13279,37527,64895,50095,42205,60586,9991,56010,48889,43302,18638,11470,64223,9005,10748,37237,50504,3234,42804,38378,57418,5179,17814,56765,53975,16928,20593,23924,17622,32698,43244,22829,10515,50526,6266,39017,62067,45605,15116,31373,8098,29318,46844,7143,32770,20870,47226,38570,58982,7336,42993,26417,52814,51133,51563,7155,57581,17746,61992,12077,58672,59945,10275,18147,60062,16889,1949,59671,20111,45100,28863,24644,3439,52868,24587,28294,49618,28400,17782,64825,40716,31632,55424,53233,25690,19913,58887,61226,30879,12186,58966,23745,15019,45860,9742,37123,9061,32371,128,39428,4881,27620,20172,51794,16686,14538,17342,18740,19012,19829,58477,57908,15536,43215,15399,24234,1680,5063,4014,59256,63485,61835,8496,43993,4520,45343,26879,4744,18439,50386,42637,11983,26732,32889,26762,3971,3646,48810,19097,45903,23659,41069,846,15180,30019,9284,52100,663,33074,65328,63250,31379,65083,46458,11995,58913,19887,24254,50384,23436,24780,39944,27999,12264,13391,38330,63919,7310,48117,37287,44820,41363,27456,8211,57255,12196,24322,20357,35869,17076,18318,47584,60002,11094,61262,57479,48796,34179,58853,9444,31913,53165,32369,14514,39068,43245,24024,44099,28861,24887,39272,49226,3861,14113,56555,20457,11982,53562,51307,2465,17867,42334,34505,64345,8230,54422,31052,9119,43435,28744,33231,32313,1262,23395,16585,7211,32543,7260,6180,56980,24636,58258,50378,47639,64062,33001,35264,8440,46674,35180,60005,36858,16846,6332,41395,46498,14081,18121,44557,18272,5333,58076,20284,19400,57524,19305,33140,36143,24401,4809,64522,63702,46166,3454,43951,41095,4151,39680,26591,61646,36839,37256,34501,8800,49834,9210,247,20090,25593,39111,39141,9280,19546,719,43954,50548,13984,48980,43872,3676,29864,21165,45056,33982,61315,30305,62294,18095,15925,21982,45051,55435,12720,65155,5463,11250,1375,62303,52408,54907,22622,21992,27420,1092,31972,61602,11597,62791,27690,65408,6827,61626,47662,25488,45473,54302,43554,12944,46336,25676,3715,38057,54747,50141,42284,15971,45967,26402,44829,64675,8681,49458,51060,52129,28921,28057,46138,35397,34345,18060,19653,2070,6923,52603,45677,24138,1565,62145,58336,15167,12271,8368,39007,35753,61507,62011,4622,62083,25881,15138,39231,61777,4329,19323,39952,32187,51636,44586,6300,10745,42530,29874,4656,45225,28511,5626,14493,46679,904,63438,37276,50103,59369,58795,49311,63044,22166,19354,42299,29861,40297,22245,1746,30730,4481,59354,25633,61787,36050,37689,62043,24776,55184,65149,38495,644,52884,5914,10057,4342,53746,49221,49007,43902,27183,9245,55340,16327,769,21486,56083,40750,41490,40155,59942,32394,10104,3102,42325,12575,14256,44791,39994,14142,18277,57266,58288,34396,54126,23876,65049,40461,58011,1479,54123,34585,39167,43268,60995,51915,61361,20468,22181,27469,56280,65437,33326,1541,63444,43949,4715,42744,57278,19781,6483,14631,53244,34403,63618,11983,10042,30204,9718,26687,62400,64881,50606,15343,55569,3144,61732,18014,24476,36801,12653,47363,17953,27939,22150,48524,21796,52834,11933,29579,4212,53563,53851,45996,9548,46341,6369,49138,64760,17062,32985,16964,29821,22492,32537,43620,20180,15716,17346,9294,30241,5958,48576,4926,4652,49951,39843,6089,36413,14382,24736,47461,23967,27839,54109,62469,16695,63744,18502,16598,18910,42892,7090,16881,57886,58212,61015,64253,33247,19498,57500,21528,47652,20486,1165,58387,220,47041,8008,5834,40328,18006,47400,56266,35619,5086,42427,27356,9934,1861,38981,45934,41554,2597,24817,35494,63695,41613,52930,24296,58893,64455,59497,41935,14495,61119,16746,15586,3040,60042,4957,10160,48569,40139,37876,9241,37014,32110,31675,28325,49139,22242,33099,64650,45775,64093,15298,36877,52054,51223,5950,20310,40199,18035,40338,38884,61699,13525,41699,7264,12236,49544,47545,16327,16102,48542,23710,42045,11912,59188,13330,28728,9462,40098,11061,63500,58563,41937,51625,10840,55981,30017,10718,54075,20682,39755,31818,5121,211,50429,56007,59980,62923,35206,17357,21995,29109,58298,57561,60128,19437,25224,10634,44371,39545,47384,60235,12959,50344,56214,49214,47455,50786,5756,31191,22346,47908,5837,11142,23701,13869,44211,41225,34448,63391,20472,25427,30276,37921,55333,42444,43120,11400,61715,59169,45375,16641,34574,18633,23607,45847,1633,34825,13044,43595,40392,28159,36276,47665,12253,9513,50121,38054,60787,32778,31027,57289,21697,52836,11649,18306,23030,36220,30886,57516,60227,53436,50432,27128,45328,14364,11586,59828,55472,25781,8097,16242,6665,19004,684,38609,42138,14337,61840,29449,38497,32139,12523,22981,33985,57640,15775,35164,35023,52002,28054,32963,1043,52229,25390,38532,63670,52719,51819,33105,62290,14305,45887,52955,24837,4527,36371,62032,17601,11449,10881,22703,11974,56900,32214,55528,3268,2779,31145,61030,21567,52172,21505,56360,17630,13775,18517,56563,27628,39218,24995,39946,18368,29705,51773,15041,36414,22435,13254,3678,4433,32452,1972,50302,57833,7885,38762,62511,24111,38133,37099,31123,18226,26351,44075,24402,30153,8613,2646,26605,59453,23830,44553,7053,11812,51244,56677,11500,12305,18536,46712,36686,40073,55477,37599,41720,21984,781,50430,52310,8874,32077,44680,58661,33374,23918,46125,45605,32505,29813,30844,36965,25762,23235,28852,41374,45772,135,60272,3770,8644,41728,64288,27601,7056,51543,24906,36100,54680,19765,63923,41570,7942,61485,62740,52823,58872,5192,24562,35604,28344,34729,37918,39323,24916,8279,11812,40199,22215,27481,55019,38961,24615,34947,23184,8671,39211,13191,58435,52531,10105,48343,6083,6722,61475,44765,46954,58156,42839,36488,58737,21810,38749,63996,44413,11401,18202,64082,4528,39950,58425,63702,7063,33425,31708,1923,49538,4180,55413,6156,60402,15259,10324,50997,21032,52930,44829,32413,57449,13252,51557,64120,13495,29769,59857,50131,29849,3515,44823,8396,3616,34138,37034,33783,35830,61327,49103,3730,51016,48533,30341,47340,29804,54923,4575,38864,30787,37930,40669,7412,12590,7406,16454,4032,57715,106,54544,28336,21184,4537,7232,18902,34487,27338,35465,9384,26845,64624,20796,25230,64283,28968,7812,26978,35601,28937,32626,40354,41774,62186,34797,6277,26788,55815,34779,18456,36110,5588,28612,17822,58014,12147,26399,31460,52100,12801,3994,21264,50556,17920,35334,26924,60016,10335,26932,30878,57656,7904,6389,7271,60504,38854,57018,27296,1677,60058,56907,42610,8079,35577,46023,28047,27547,12907,35187,59821,30457,9625,56158,48267,65091,16600,40513,52839,13417,9561,63159,20098,61178,10493,26882,64243,40995,54734,2871,47585,18359,50855,53692,23990,4701,60426,17964,46903,51004,49158,1323,63494,31131,31392,56886,52106,53773,19480,39561,10824,46888,14977,24567,38921,32525,817,14280,37117,14068,19478,24592,26597,36492,14427,17499,38345,15641,52370,46386,64356,21466,4941,18426,64097,29348,32405,2367,38083,20585,23931,32375,35966,52039,49650,60594,38693,15923,1834,17996,9014,24382,34390,24514,46649,37720,48099,48573,25194,50807,42855,3351,26858,9975,13531,59163,12296,35498,10401,19214,62144,26862,10899,18178,8218,4674,7186,39201,7882,49396,49101,2782,44601,6112,18126,56229,40920,7823,35314,21039,48448,45183,24999,43279,52414,26977,49915,25549,10481,65297,61382,1600,64728,3357,57742,28641,43059,35964,21421,7176,57244,39992,27163,2120,11993,63054,25092,20851,15815,63001,29703,5725,46798,30778,23035,9513,36881,38272,48991,49561,29058,39737,1455,33908,57387,44414,8874,64489,24019,16232,18835,30932,57695,54829,52305,62270,62907,8752,1673,55504,59696,15781,9900,24841,39821,57868,38169,58452,57768,31461,5687,62938,56172,45834,30317,28458,57917,32902,43497,24195,31836,20504,10003,19986,25616,13015,27325,3964,53012,3041,51648,43636,21064,46571,57006,9189,3215,57720,37552,48027,19428,49522,1101,33815,6216,62842,6369,22743,57070,15352,4622,28198,8106,38431,16315,29147,55891,3903,3477,12780,9863,32586,55732,50657,53095,31277,17106,54837,819,10192,447,41732,11818,56256,17753,64394,28100,18321,21670,63515,28646,45112,13113,39768,63856,40309,61612,16197,62217,7767,24339,49812,19206,25691,12584,22582,43611,52769,37554,63510,59553,53091,18653,54829,19979,20864,3522,43793,4037,18020,42618,38702,52464,33533,57376,1295,42707,38664,20957,15140,46760,39557,60752,47058,18674,18424,12709,17671,51458,38650,41218,46603,46567,57826,18022,39677,18038,83,44772,8488,58898,37185,5588,35333,61749,30226,46434,39571,32930,23894,58934,62738,42243,15728,1537,46295,65368,24513,58448,64652,47896,22867,36178,1329,54722,35233,5485,7307,40568,25428,25170,1837,7673,11851,37390,41469,30754,19904,12297,4288,4082,50304,36335,49861,3567,8667,61723,50052,49061,52913,40361,19162,27304,19447,1240,42365,19485,33452,43137,32473,55866,15257,1686,56380,40866,12350,53861,58705,64354,54711,39127,54061,62381,14891,38967,42754,1431,31268,42061,52098,45770,45625,33318,17693,42751,39203,56330,33374,19960,18030,17974,37650,64745,61770,27075,363,41914,60072,33227,11218,32122,58829,20228,64110,54920,65244,19523,17532,24316,55555,64451,41289,61808,42346,58797,33014,857,7113,1460,29429,40537,12145,50348,52109,44242,32492,49795,7681,14952,41006,28779,54407,19520,17654,19957,3203,11604,59932,14771,60865,20215,52606,42763,36064,46828,33000,43768,25605,16024,24208,3625,8803,16180,50432,65088,60570,48707,39834,30117,42769,41006,20232,2684,42766,4263,47147,26438,28890,22121,3576,51735,31741,38263,13958,21274,61014,63637,43914,4852,42557,47193,18876,16989,64382,14060,48579,29649,30088,38489,62720,59192,1189,3899,40598,63638,51193,56346,32649,9982,63826,32452,53423,29576,39136,7675,63939,24336,18781,2711,20261,15984,41298,29060,9456,9198,37664,1702,60768,6018,26882,22605,12946,49764,17708,39324,5829,27784,8898,48684,753,1114,20310,23434,4243,44694,64070,29967,24129,26936,48495,8251,65402,59520,38851,16744,55042,63866,50150,61083,60430,1701,35674,59563,33284,1695,21250,30293,37228,4161,5289,27917,47957,39416,7492,13092,15137,53529,44960,52333,23899,44695,13939,62972,34767,53052,7722,65347,36583,44016,8202,15428,39057,23409,37253,15330,24660,15157,29818,5630,3128,6991,15376,28583,15188,60067,57576,25268,63695,15888,4692,10832,17718,6655,6176,3060,58768,52416,1117,57871,51960,36829,13232,23901,62241,19702,47923,59367,14939,28689,25075,16594,29422,26988,12710,13933,18207,49991,42851,7582,43991,28250,48290,42697,64601,62441,18355,61190,48304,60787,23439,44743,37983,64437,26893,30966,28587,21528,43731,8549,18651,23084,42976,21281,59884,22421,5590,11447,55667,23728,48114,3753,65069,25279,41873,2460,8985,37379,52898,22442,48342,62645,58869,37601,46322,2516,36071,35847,7267,32200,46137,5753,62864,21326,49475,2631,14157,17920,335,40098,49317,57109,36961,52673,41578,48137,55046,12913,270,60900,24749,29448,26073,15513,60523,64397,22496,4441,14050,36876,16012,57049,7739,49519,24721,4706,39595,38041,47547,26333,2520,1344,26863,19652,62726,37770,30204,25095,59334,36769,41690,53492,58775,40787,12699,11237,19785,3556,14831,43987,11376,63834,30141,41854,64309,42208,22605,61555,57672,24493,48327,33470,58407,65496,64204,5734,59686,7204,28910,9387,64829,50170,54683,36733,42676,49357,58439,7733,23019,61570,1839,39404,58710,32953,39387,9425,37300,63654,10207,46862,45034,52144,30084,44957,20875,62610,34738,10536,2280,32672,446,35021,47661,50933,34774,9083,26879,28566,21657,29904,62495,49699,61461,7196,50453,63909,37520,57598,21077,8529,6983,49999,46707,8742,42079,41322,52498,23892,24821,9442,56694,62110,9744,6116,49018,21106,23033,59765,21108,8366,22632,24296,34543,34151,44889,30932,53739,12452,49024,52644,47429,45244,47309,43022,24351,35011,10449,9576,38134,29684,51626,20667,2172,57455,8705,41547,26088,4392,19035,14899,3346,40764,13761,11990,48862,44769,43808,47757,5888,34356,56114,41544,56170,1929,43550,38001,9215,61144,60351,35346,64811,34325,8195,5138,37380,23114,14745,55571,21153,43221,51163,21508,16822,41496,41639,18169,6361,1899,24742,57921,10059,52962,19252,30513,63104,60586,4102,11168,50567,39717,17257,45568,23271,13126,46062,50393,49963,42288,54822,10831,35921,9297,42051,6465,33294,55883,14084,64757,56026,3620,16195,12829,20840,27970,48265,59685,1244,43240,20385,2198,36037,44231,48417,35253,13459,13124,40223,59749,31321,29701,28657,45405,4169,20980,42682,29617,47281,28350,62820,29690,14597,12570,16420,15846,5791,32843,4758,65490,40005,21862,65357,49429,55852,30817,62070,61846,28221,53309,13989,2389,16641,9066,38608,51420,58717,36661,43264,60367,35647,19587,49699,12112,40247,11700,62757,23092,23826,27710,5292,13244,902,35509,58355,50569,56991,38768,60417,35885,36587,57711,43976,29674,11225,52582,47502,433,45162,56199,40037,47594,35627,3399,17765,13308,39442,5448,31241,9323,54221,42927,16433,43055,45303,50842,11862,59292,55376,41809,22083,18525,55062,54646,54331,16853,54372,44317,30750,51316,34931,58164,65150,12607,10076,48736,18008,10161,51762,2837,30718,22356,54131,54992,26390,25534,55502,13090,20669,26957,5927,11465,64067,15631,13177,27701,2621,60551,39372,29951,34479,19156,60442,5043,36434,24824,64157,22204,7304,52103,56505,5978,45351,25758,2844,46949,64721,54525,16536,25975,2068,23576,55032,61953,8421,58552,25765,62609,44289,16970,20417,48131,16220,38083,15397,5770,44628,61307,22609,44016,42440,435,8404,13953,43639,15903,20043,1455,33340,8056,42163,62236,24327,56835,34520,52901,11981,31974,61059,13661,7808,4230,23784,719,20572,46720,43888,38394,51432,35782,61699,62988,16938,53159,9024,15343,537,53118,51417,27651,20061,18751,16788,64022,44443,767,46539,15988,31575,48638,44936,9507,38851,10394,8993,29669,44769,46150,35638,52081,11948,28059,59147,5409,35647,60555,13544,21356,45665,27327,60550,61739,46010,37417,56703,43232,58293,42546,6194,65118,51428,44910,20711,44022,43381,57088,9974,57685,23641,35615,51571,49413,2772,1878,26769,48387,55111,54779,48117,4970,42856,34236,48209,53303,60585,1699,33650,3309,22752,53218,53345,32920,56329,19429,46445,4735,1082,7184,697,47831,14135,52502,25913,26410,9130,5200,43365,40642,62694,14647,13836,16107,63467,56131,61689,29347,37601,11334,42778,42436,17969,59507,64603,19333,63878,4428,17752,22647,52680,25544,19943,15638,26879,58351,41171,29204,21599,43424,7662,11572,24136,6136,27289,57079,57974,22258,26138,18601,50579,62372,23379,55749,49798,13392,45174,62538,5569,28643,14242,35789,59830,17471,730,35010,22340,20223,38906,49312,56875,53147,23276,44133,36392,52514,48495,51751,54947,30293,56918,29294,55905,32718,21331,862,37133,40783,14901,31921,56964,12622,44912,34244,8331,35190,5854,48967,47962,35980,46088,41084,32322,29383,43703,22118,33412,35518,9974,33607,10802,42773,14174,48705,61613,26380,18801,33386,19993,5168,6129,27445,23419,1570,30215,40952,65438,21456,58473,24243,31457,2889,50364,41482,16456,9261,3751,40010,55752,48841,21455,982,36073,2947,63764,62513,54518,41043,63526,30523,40709,46155,25586,35395,8088,36059,53667,49493,48515,11797,7566,2226,49754,45400,21805,23953,19370,960,54559,19959,18202,1598,48137,7128,17440,11757,34592,60582,50662,29080,9579,57389,57085,292,34796,5340,55419,18336,42917,58489,51308,52670,55585,40119,60652,26297,10273,46107,25815,26898,3908,13803,14803,10828,12715,17588,15351,35377,19435,54011,39612,18197,56789,2537,43355,13555,5397,15033,25304,875,41418,61553,32085,21827,44821,30802,64376,370,55181,65270,23440,42497,26327,47675,353,2143,22319,52249,63432,29304,50139,23592,35443,24797,12699,32249,28103,50747,4046,62153,36091,63109,61706,56809,21948,43845,32968,14820,63347,63042,34229,29439,53279,2338,53835,18362,9598,5001,30291,6541,58868,2591,63053,48290,50049,11399,998,61090,24731,58255,40670,1219,20042,23842,52343,32213,35359,46115,61043,26751,52523,60860,55406,56285,51019,15957,17907,58416,19350,23009,47255,43575,20125,40700,28834,1957,32197,13693,43832,24199,65325,54675,57755,4254,2712,24807,54773,52505,29581,38951,57030,51068,31554,2170,60016,44126,4051,38918,53066,24688,41532,42765,21615,36281,22824,8654,2277,38072,7507,50192,5563,24832,9794,55482,46770,2890,12876,27418,11977,47720,39213,28395,23657,37748,21362,17571,56113,9963,34710,46103,17277,44506,9283,19170,61949,59417,29721,31315,2904,37409,20318,13775,63963,49836,35746,52003,41379,14040,36876,18615,35580,30975,45120,38145,28450,59365,46167,54100,14197,61079,457,13013,23876,27102,51005,3244,7527,47737,25900,54896,32469,25680,36591,31063,42641,2953,61985,54133,8242,4604,40844,54000,32049,20987,55041,25651,53852,31712,25988,27306,24881,54094,63103,24147,48894,10522,61739,12208,2068,45039,45554,51176,41491,58030,38343,3315,3144,16462,45255,29112,30737,49295,10733,50531,24183,36838,49817,33473,25734,53596,62800,48920,7131,35510,24319,5482,1418,53988,43434,14855,22358,35925,37769,18367,31110,50584,43778,57618,29558,40007,59190,29264,10917,62755,8422,56088,3014,28388,44636,2692,47203,31364,60796,13644,5338,19812,37759,23795,32235,41684,33258,24499,13619,227,27057,62495,853,53859,35339,27969,27968,41499,38736,37222,44140,30205,16749,36487,18344,54813,46775,41811,11370,35933,29686,46262,24905,60142,58456,59903,6683,50244,55300,18951,5890,29458,11030,38562,24689,8877,44797,39649,18549,58514,31597,39576,32506,5623,32401,34821,2111,53561,63297,38425,52624,62739,57402,55833,14582,24188,56113,28843,42927,52798,30819,38595,30650,26353,52251,30433,3316,7077,13486,52413,24171,50250,53560,35785,62184,21808,14068,34781,36985,62138,19982,29476,26019,52977,39763,37477,43173,7593,3426,63401,22677,15173,35073,19570,58663,47105,64333,39061,351,39583,14886,22743,61132,26575,24123,44323,39395,7073,27873,47063,17759,49667,2729,57685,29669,4946,38820,27001,41408,44944,59063,48134,6557,65330,24044,55294,974,43749,24323,4006,41439,6485,47049,10709,45085,3317,65473,47444,9414,49532,59094,22472,21052,27473,43322,58480,22362,60433,41380,9918,42289,53709,56329,55853,25286,60434,976,39133,36036,25410,48199,7559,15669,38265,16275,42020,57913,63880,63387,52413,58033,61777,32392,57852,38237,53122,56942,56600,65036,57388,61840,42969,3159,10497,5581,24699,28843,59188,8988,43386,50168,28880,12636,64069,25941,38184,63013,51523,55444,58398,26600,9193,31473,40593,21324,27520,32134,5146,20651,14752,54965,14219,43514,51078,64201,57573,36899,24434,9348,33841,27730,41109,28482,12005,55001,23410,13300,38829,62063,28758,25523,8966,42922,51895,48932,50332,53310,7486,25990,22290,7774,62150,18668,7071,50646,43661,37321,38876,12891,40502,38913,46622,7467,62631,3838,63138,38093,7447,8259,35461,10664,57666,58654,7837,24880,8971,18407,56708,63184,53792,47970,24158,35464,40033,238,36302,25228,16802,8829,45908,21183,5464,40875,41343,18554,14955,16083,11728,30045,10188,65251,11023,36343,61613,53385,28304,52424,23965,59244,58430,2701,49063,53300,41022,37789,11908,44267,62086,51727,32408,22686,57503,28456,22241,12128,22260,46848,9525,48161,15472,5085,49662,43612,1945,946,63029,28417,61702,1584,7503,25423,37547,61115,4032,14955,31505,15535,30204,58444,19653,44468,12890,49230,26015,32829,8626,50443,12557,22438,33623,45309,7404,51984,31449,38689,612,28040,39800,21616,7822,729,9955,38624,43095,54890,10952,28462,62579,3327,63823,10634,43182,27849,52007,11237,50859,50755,4096,52843,32735,23613,47549,32237,3932,8853,11514,52446,65400,57809,46055,12880,24804,28846,19820,10520,56796,57406,40398,58904,32598,47475,49806,25816,24854,44926,23506,43333,41713,15907,47979,25754,50191,63140,24365,14537,20720,22156,24409,10676,7217,43549,27729,5833,9002,24369,45891,34878,35366,41133,52097,47411,19368,26721,48635,29148,34915,52952,49895,25572,48888,9706,43651,22458,46209,45801,17135,16836,38516,18545,37997,43760,14625,18294,8042,58211,60560,33408,62787,53273,33062,31399,37926,20437,64923,13673,52460,43991,53337,47397,32294,20012,54454,58171,49201,26142,34723,63871,2514,46692,26316,6519,34416,3078,8754,11973,17756,54749,7661,8679,1704,10092,10670,59948,38487,54934,47900,22717,11073,21250,10861,13179,7188,47145,27231,3397,34166,17398,28826,50563,12913,38293,19096,28990,45238,24643,23884,43023,5916,20697,10694,46895,60843,3497,23857,33645,23704,33838,19136,24548,25020,20644,26704,46702,49111,19329,26070,5666,40153,10407,131,32724,18238,51494,11019,63195,49426,52601,27885,32752,52507,7599,7747,23627,54999,4813,16770,29170,29247,18161,11119,44355,12836,57120,14764,33899,41263,47512,9144,53044,9539,50740,2251,52237,18874,60287,39841,46550,9857,48827,30599,64838,6981,22694,57864,31878,31843,39604,61864,54756,39979,11762,39993,59434,53694,20651,52635,23829,18652,27103,13377,27462,17747,35748,63408,65385,61551,32123,5171,42317,16594,7235,41848,13858,17494,3989,38567,39858,39516,57217,22088,64950,23027,28928,47715,36709,44526,24388,59868,34267,5969,3771,58573,54455,44417,27680,60024,47463,21914,29454,6896,731,18228,6424,46364,37245,29500,40281,22322,9888,49575,1084,41683,33446,40593,42320,33618,63439,2444,32171,2968,6860,55368,41324,41999,31479,61049,16635,38015,7154,5797,28303,26220,2538,8817,3535,56967,27185,28966,20929,47348,25124,20685,40397,31487,63316,29705,23735,53770,42559,63863,27682,57644,28294,24494,23918,16780,28227,51264,46171,50511,57697,51781,42453,58582,34698,20915,31348,25022,7494,13252,10761,9778,6105,46204,48199,39293,569,7502,43787,56760,30779,26474,25946,27944,62439,49135,50093,6379,20803,59739,42679,62981,56883,34309,33300,5267,11199,45333,34126,38609,17163,8573,10116,25700,12335,39232,37814,39067,53007,13631,48594,18220,15126,63294,49796,49639,10171,53541,14940,47910,18361,54208,51095,47458,37117,14505,33941,46400,56147,49201,58557,48587,27550,17457,40993,41440,44019,51345,36937,61095,65440,11966,6435,10752,56176,23445,9012,7238,19829,1445,3899,56411,14220,43122,13635,44484,55467,59309,21472,10482,58488,30979,6249,2282,34652,59571,11303,60911,24005,64952,26559,25223,57674,26275,24231,3889,51026,29284,30667,28907,41782,7069,62989,29271,39451,65261,19449,53510,57558,15903,56669,22769,40892,59691,48475,42281,62170,25174,52312,8663,10167,49029,43856,23206,40524,39688,44592,62641,18441,20883,29588,5369,55176,27551,4213,44472,12508,46189,4272,48544,34794,38357,23802,50760,12196,2274,64397,58858,52160,44360,3978,27584,4436,60813,7356,47068,16122,18771,16061,12883,19494,5706,47101,51211,10991,30715,58911,23683,30745,3993,57118,45303,55619,38795,49502,14761,50531,65479,20916,47005,3828,16191,29031,18977,64966,15970,12740,59204,8746,38274,44014,44357,24362,56720,18515,6303,57440,36084,452,52994,62936,62908,618,60148,32563,26493,57494,34069,58926,63824,26539,50893,11134,34120,52481,63136,25553,42365,27884,35255,34924,18438,45194,44710,59510,28292,48453,43457,42476,56060,18631,10878,35976,17244,50692,21675,41315,61244,64492,5178,8051,16521,62804,20441,10473,63191,47997,12509,23415,65350,11773,7416,17206,29759,7623,9722,31887,24393,53200,49076,54526,46096,53757,49912,54461,52301,44854,32110,5124,3571,8636,35839,8786,60320,48947,22977,25636,51989,3605,15400,44381,17115,47036,40395,8686,3590,47329,23361,44081,30046,61004,9448,49550,15020,22818,18686,37825,55357,14079,61444,16738,40453,9086,10802,4006,809,55091,56470,50868,21528,16485,16628,14683,20762,62568,23677,27859,65437,56924,45620,56404,61734,20254,46787,22385,47097,35923,54182,33858,65180,846,42909,46091,53661,54615,8025,42836,48420,46282,25727,23401,50188,48394,35647,9418,33416,20317,31135,15699,29625,2920,1526,28532,43247,15085,116,6841,9950,46905,15084,14735,9872,53360,28352,2102,52813,33463,353,36728,58654,1799,44178,26492,8792,27403,58815,43967,26698,8332,37731,35466,2647,63553,24549,14593,39793,61912,17598,14494,55558,37250,29481,62699,55336,55305,10819,27179,39636,61666,54991,29846,11716,47718,14746,47501,27484,28497,51085,8819,32390,45627,2336,23556,23994,25325,7779,21398,8681,35487,535,45549,22132,41615,16264,14169,64633,507,30714,37606,22673,28900,56116,15234,24425,54106,51214,51842,18276,63517,20578,49766,58375,7323,11537,13497,60783,55241,8540,41156,35275,34207,36708,1979,53158,21412,53133,57398,24082,42909,47681,52263,27482,60006,6313,34366,52094,10880,11653,58160,26704,58536,51057,52264,13495,34719,51171,37260,558,27669,30639,1506,46766,17119,51314,6532,56016,52476,28819,22102,26990,50321,38352,63335,37127,63748,39356,25605,24559,36781,27817,21564,16915,10818,22190,13554,28722,42187,12527,18178,13588,17497,42062,3817,21467,42821,29760,15191,6935,17280,269,20010,12080,47059,14325,53144,46576,92,16739,45448,17953,63580,53438,63047,65003,16555,38476,19670,55619,44522,8380,31815,13519,59759,1980,16509,16322,31668,30949,49813,58874,63016,51875,21286,64493,53573,39053,26105,63174,53982,28009,44642,22645,58886,60120,52498,18220,48396,8800,63249,41861,53521,38531,6478,10268,63436,45513,12690,58368,19428,15800,39870,21868,23756,17665,16924,18387,35168,18472,3752,40160,43410,252,38349,57977,15364,49117,33448,20551,7852,58607,10715,53838,57645,19697,34102,39221,59167,16525,51558,64708,20736,25317,48222,4482,35686,60791,65225,8891,1626,54361,57400,27419,54615,46337,49192,53102,44872,37671,36525,47393,14139,26095,43846,2228,32530,35471,41255,832,47047,64001,11843,28268,60908,40555,54973,27548,33336,5253,58470,27238,11904,25612,62950,52823,8736,42862,15242,51206,27911,9317,27208,55298,31055,10131,60160,25954,38322,39908,29123,58125,6100,47397,54663,47685,64297,31895,58560,46844,58116,33611,58043,46602,16502,33312,33794,2416,48223,48673,48944,39925,20402,12863,38519,58073,17493,51319,24940,49166,61743,61784,21899,6625,40705,40450,13151,14843,53861,41372,29294,26296,61822,53620,65122,638,54391,63796,35135,287,22588,28333,37455,26113,35547,4963,27697,3038,33720,64742,61271,53875,19830,56599,44439,13434,3840,6617,13012,28671,19111,11919,26629,33252,40599,64062,40120,2861,43011,63437,21283,55634,27219,23493,4153,25031,2671,25755,37589,41616,1099,38478,36865,49372,16523,32087,47165,21282,27085,46417,19384,64521,62999,18945,46036,60778,4089,57157,37077,50396,47130,33657,6912,26492,52288,55639,17433,63831,36124,5969,19477,12571,40612,57232,28535,45251,41415,40205,51479,34803,13526,10926,26367,23802,43637,53856,57058,63027,42363,19155,4616,62448,41645,11495,8674,54629,61870,27100,34361,49725,32946,49577,30325,62812,48997,35671,12760,42113,30667,46321,41665,47284,30390,62186,2489,31481,25239,53502,52856,48982,51334,2841,10439,59066,40390,40005,42769,60746,29382,51610,18018,56840,53309,16706,53794,820,43038,2748,46570,46047,44868,38222,11847,22885,22912,161,52203,594,10721,48130,51909,25838,28399,7226,9087,25196,2326,55632,14054,11593,39502,48064,41879,39127,26219,15033,36760,25314,20312,26903,23523,53723,3706,32299,33687,64478,52630,52959,13137,31338,38546,32718,35388,49136,20599,53656,14334,58767,13236,25789,23473,62987,32666,56119,41350,12148,7500,30174,29462,5146,50232,16566,47916,6831,45484,63710,7619,51472,37745,21099,29938,64003,41783,18977,4694,35097,63178,10279,4315,10515,33852,29548,1153,10188,15579,36421,16288,27045,6381,50435,20773,48050,31717,4459,17049,61669,56105,46927,11697,7564,38625,43436,24551,48435,45892,44890,52108,15222,9883,21531,23594,2505,8251,32930,9526,38949,2966,4469,26477,41180,58830,32394,19225,16846,16747,17384,37690,16397,58460,26375,44881,19694,27488,54733,40834,51714,61412,3467,55845,50933,25660,34878,24961,60636,40350,26288,52177,52139,18289,33880,11411,12647,37762,52149,43629,42674,28095,55067,20856,53385,25815,31524,57420,38647,19827,47564,17069,4806,7089,5177,38117,857,48532,34500,17055,49170,33511,7043,31577,64989,22278,60804,25244,2172,16119,30883,44733,33789,61369,5121,24834,26562,40286,14666,13190,48118,10947,15699,28530,36835,23281,62632,41522,17566,54795,16408,1632,61786,19937,50118,10160,42450,16336,53883,26212,49420,64195,45419,19536,63290,9693,57918,18941,63437,20276,37968,29401,23246,15821,49446,18723,44874,9527,58297,57864,29584,6102,48418,35015,40080,3287,36951,36275,35304,21508,9473,38321,50698,57278,10637,41459,21642,35605,21523,29495,26523,11897,35094,18964,34548,20690,57763,42160,53226,56415,23774,48642,37762,12886,20102,41485,8389,23282,13950,6667,17041,42092,13711,24446,44119,52523,41224,55793,9202,51158,39319,14344,57552,44037,8932,34231,13634,12763,30412,30722,62687,10680,45958,42418,46508,13982,52872,35739,25034,52340,62662,38763,16118,38665,23009,56592,26014,41215,45453,61913,4584,30679,9922,13421,58267,25786,18661,12324,4641,53044,51956,4703,57778,27920,30362,20993,36813,12267,46142,54529,13142,52924,27145,45364,43154,874,8563,2771,36310,31534,54125,15796,58829,61349,8414,49293,4026,48579,50794,33230,26342,42080,64308,41173,56907,64191,39877,61849,18092,9213,61564,10394,43013,41083,47527,38279,45289,14083,13938,41545,33552,52189,1814,9738,14679,63007,36012,61190,2329,14652,57709,33280,43766,53001,29413,58360,9916,51178,57603,44610,38916,38947,2913,57561,20248,18457,32306,59579,18574,40440,7485,57555,15043,37820,15992,28956,3189,37634,48564,20158,11227,10169,49221,35935,35257,32119,43549,60636,27157,3277,42554,41166,30794,33187,23940,37572,49055,30045,57687,53366,15372,30588,44268,511,22231,20022,30825,35896,49093,52167,33258,12865,37261,44900,14216,58448,4019,45888,10920,13300,59867,48913,29119,29038,8099,38634,45926,38091,33656,35966,4816,25580,16573,46974,41277,19445,27037,1090,52963,16299,42450,13994,14496,1308,30765,47995,45357,8759,5331,55240,33848,58000,64629,41540,808,44793,4860,32615,30679,23704,50047,2895,47443,57849,47559,57701,25880,60186,1994,3632,2835,45653,33818,57791,14583,14377,58333,37874,8501,34143,15249,19440,28438,12367,19469,44043,28297,11646,56459,45290,27298,36233,28113,33819,59319,56393,53308,3642,47564,24643,61191,52375,41475,35150,24490,40680,368,13164,29406,63190,65135,15272,57529,58189,39983,38084,7333,37561,28725,50123,2288,9669,47541,62854,43117,33054,40169,55146,62846,34733,17088,13998,4775,19674,52568,17093,4585,27368,27872,49970,8914,39310,57019,51372,10435,37264,37782,5241,28087,2825,24309,6556,59802,31196,46850,19221,19040,28910,31407,33785,50713,36953,14560,47040,12194,55884,48268,25953,41032,13738,54089,4474,23401,1103,38017,12889,63085,53993,60946,41687,56774,46026,7680,2220,41615,18750,21414,27038,58917,55201,25597,50339,52799,55733,48523,12491,4178,16387,4867,24996,7462,45960,19841,63210,4134,36201,49218,30300,12878,16798,28495,29137,35745,52189,5070,23038,9218,13115,36322,2047,26702,16876,55895,46413,63043,33199,51898,12692,55811,38343,51463,565,17215,10559,3603,13478,8962,54361,21977,1243,7174,20664,34556,58280,36494,49129,40770,35342,62102,59052,42668,22371,42704,42222,16634,33772,10985,24543,37575,39229,10728,20063,50732,65312,8781,45390,29709,12244,34645,51059,24201,42093,55531,23384,2777,31179,60733,31668,9392,27491,22076,29220,17079,37418,44238,37950,7977,20528,17654,21007,4283,43519,58875,46028,33459,31429,25557,29096,49705,44246,49131,25088,58471,31799,50120,9976,62743,52475,10416,17433,55180,43727,13193,28996,7106,61214,60128,31690,46039,24888,3753,26626,52991,41651,21745,39205,34256,7354,62739,53019,41838,19056,60073,43135,683,52452,45964,14293,28696,10611,46593,22720,48879,50844,10242,8529,34698,33512,65220,4956,42135,54265,55186,55182,42310,16430,35837,16190,46033,2145,17474,10364,64539,32241,25759,34615,26641,24357,19611,38771,16812,51185,65434,27013,15625,19078,9318,11235,4756,31318,63506,28683,37794,12022,1282,31823,14950,2507,61528,11974,35412,40589,13129,49309,22759,14091,60355,9279,49320,7376,21510,15859,21980,56332,18372,1117,24943,43357,2610,49075,1511,30210,32674,19602,37194,48762,34404,63068,45718,11575,42557,5522,17842,12537,64465,172,37666,13467,58001,56524,18298,44283,25604,12731,40832,24895,36788,8480,63184,60102,6498,2808,32111,9724,13582,37061,39782,11251,57879,18389,15719,32986,62467,58468,40975,42722,2287,27868,59491,52743,38136,33358,7490,63030,13262,62864,29037,28978,2793,5642,19667,7008,1484,11008,18687,52993,12145,25074,50238,18331,65334,23674,35441,42298,55217,23397,17889,56793,52452,15870,8584,8567,17519,28097,37232,60029,33391,36704,40692,14570,22816,51815,5473,60273,47649,30435,15499,24018,30777,63480,34445,37337,12566,51638,54444,61964,38943,41747,11232,24610,31380,60663,15428,6936,4035,56057,34933,44068,59339,64880,60763,63658,2925,6677,56445,24960,5563,49212,47634,44060,17988,14753,59139,52194,38294,10482,64495,6675,37151,11585,17605,20284,43471,58662,21712,45460,39162,6158,34105,54225,21904,44554,51059,33832,3411,59911,47360,27773,20102,12916,38667,51179,49008,14614,62471,53343,10511,37819,33888,1354,37178,12536,15989,51376,40142,12944,22916,43364,28609,47585,27050,21426,9769,53705,2320,21793,23437,6970,1579,15886,14149,43088,61512,14635,62787,12733,37667,58065,56050,8184,23253,39080,23398,8917,2218,58405,17198,30524,32458,18810,47250,38274,40971,63696,40994,40607,17723,22068,5059,39729,60207,37156,50431,58601,42052,58852,42220,10583,16003,5972,52326,65116,36744,63455,32137,61552,59656,35118,56500,23905,64873,64228,49857,41461,47901,54199,37401,47453,29944,51908,22696,48052,26510,14510,19981,52107,4033,19528,26884,54587,51135,24252,3627,39137,61653,60483,34692,59465,51249,12091,16570,5569,5564,7806,6528,25654,43815,11956,14706,63256,54674,22902,4191,18410,12915,22588,53638,22624,40188,33725,30157,6830,23042,4786,34903,30632,54096,32243,2129,50079,62622,8251,3443,23005,60326,35296,47188,24730,496,21673,20009,13098,27997,37094,37306,52358,52572,59890,52052,26222,14574,42286,53666,53657,51265,64798,31014,33424,51512,2336,5856,7882,34903,64708,53161,9079,46870,1384,22969,25498,54529,42775,51395,55161,52419,26149,22541,15247,58267,42816,51280,44369,25437,59443,11193,34653,11383,29724,26722,46561,60931,8984,30575,47251,48303,2888,17727,41554,35709,12264,9077,62728,30068,8244,10488,940,18118,30950,58806,29566,2197,12454,43952,59791,36055,48946,52793,33772,1642,11490,56657,41883,53795,46981,30577,61369,7139,10162,52991,3864,6135,20510,12669,26093,8993,62706,15900,21837,8615,603,142,11597,27390,5483,37886,48722,23765,44949,8687,16882,64365,53688,22831,37692,31916,34275,2916,47906,45837,65085,7768,35737,42458,62646,61978,29169,57293,34623,26261,58939,13071,64347,43785,30681,6512,64213,53620,42962,52813,7976,47041,46489,21025,25899,46758,4898,35195,5907,41807,53679,50766,64698,3717,4569,20836,53055,32028,37659,17284,47231,25612,29604,22341,51939,8667,34841,61975,17824,4796,9755,14072,2580,34378,16158,21060,40216,34524,54561,16310,42647,29057,30619,26530,57415,44181,16967,33856,38503,35924,59063,54191,7596,6842,32956,21312,10705,32214,17671,60542,25760,19869,8704,62704,57644,21897,18895,6584,45596,4066,31258,46478,52522,36145,43011,26294,58884,1802,25438,51929,48717,44427,13676,8087,40638,50299,58600,21230,49865,43754,55833,61335,29101,28813,9183,14796,4762,32423,43717,51328,30529,61311,38434,9715,58799,45446,6604,24425,58456,62377,48610,19716,4453,42622,18294,21180,43328,29939,38159,53342,22947,4931,8677,6519,51985,1013,2780,18958,55244,56425,9753,3372,53372,2847,50623,58701,50705,15545,32468,29773,39913,7296,44164,23475,32506,18841,51822,22295,51537,60687,62792,49976,61388,29350,10235,15555,52984,43109,58340,36798,47205,14713,39803,11266,6454,11065,25482,20402,63714,35286,61374,6843,17152,64944,49080,32049,6120,3636,999,19990,57068,47059,17343,56513,53563,13044,30706,36285,32700,46485,12834,25804,56245,64171,11359,27299,15833,27785,53125,31701,4790,53894,37134,21533,20135,27582,50879,49805,25871,60671,51562,51642,19488,42207,46877,60444,27927,50302,16661,40984,45507,55258,29390,48332,59092,61627,21374,38816,62914,915,50177,25183,64382,15599,1222,62417,54868,23881,7003,22658,7391,5498,27147,60105,51140,6933,55912,26061,63537,40516,57696,40988,19895,8668,49841,64303,27020,54255,38787,10380,35522,62875,20067,51075,49078,21061,46943,53604,56761,29055,4965,59911,55576,59160,30459,16293,62002,8935,8191,50148,16394,39272,38836,32449,36218,37500,55575,35512,12022,9870,60073,55418,31817,56580,15089,7536,40864,47599,31184,45310,26801,5604,27826,45436,59895,31974,26977,15966,45610,6253,19699,15029,9914,24924,65405,24376,57873,5565,58997,2843,63162,45613,59374,29865,23158,50746,26903,50893,46318,63739,60471,60707,49271,38609,60161,9392,48506,46125,63057,38970,60604,23601,46528,51442,42302,29295,65115,59606,56523,60455,16497,53258,30,36226,518,10904,946,63829,37363,30286,38678,22963,7897,18575,44871,58763,13738,34338,25795,15692,63769,61864,11746,53628,47571,14073,14534,54549,54161,57857,13229,28925,22990,36367,46544,28608,11856,23912,29022,30003,4995,28719,42707,11831,29068,11542,51568,51647,26977,38770,42748,14859,44681,29594,16154,19574,42486,65438,65016,37434,38107,61211,32078,43317,30887,14001,53957,43836,7877,43265,14366,18575,30432,17036,48773,37092,44463,31563,47973,60037,56215,34189,63053,5028,8411,23040,64107,43336,60900,40019,20697,37597,48237,16640,33453,44459,1299,24472,55552,60607,42017,38895,12048,9188,9459,44937,42915,35374,64954,3226,23458,36803,4028,63986,45437,28929,17020,49864,56305,57505,40829,63078,24148,49647,14474,48384,39144,38808,1701,12170,59761,37176,56679,33193,4361,40115,846,23247,41167,6315,40237,41052,42890,61286,36002,11164,58953,6443,3337,35539,45830,48286,19159,58327,52078,24035,15144,60020,28659,44660,47844,57763,44221,45799,10894,18654,19426,55140,14177,23705,55619,22298,62437,13782,34733,53103,57885,17399,37521,19868,63280,44082,10926,41431,1804,57644,25706,44517,40967,43754,30576,44780,48700,2081,21708,30696,64457,2010,63706,65199,60703,38467,53463,30706,28892,11411,22797,7733,16010,12270,32506,64328,18406,730,41056,38050,7778,37530,4038,7215,27959,13594,33646,15485,29672,204,57219,20418,23983,62274,15454,1866,39944,64493,13235,16331,56952,33165,14396,34326,57597,9339,56823,5867,24160,3988,40955,1742,48348,33650,10671,33930,6247,34562,42490,10408,61294,7162,16724,63935,49969,18508,17435,54414,18565,35819,54342,16090,13468,22424,1506,52440,63897,11995,7861,2642,38366,56251,13460,55691,14527,33879,29552,14645,55741,27546,51996,21728,43097,14220,59345,9598,52902,40828,4392,8072,37902,33790,33557,18668,14251,45296,46282,46171,51112,51902,39333,4621,9791,40747,60454,33434,58100,52119,30831,36543,42849,23152,27681,35626,20799,2472,35458,42953,11110,36562,55707,1017,48541,51347,58140,43141,36641,42955,18864,8219,16574,54084,61081,20226,24346,26019,19783,14754,64446,26185,48383,41874,32746,54158,33062,42040,9639,5682,32331,2019,49882,35275,14175,58455,2390,10515,39534,42165,57441,35543,40,16871,63138,30149,7541,46025,48375,65354,49520,17699,10484,40973,29801,62750,62476,11042,3686,54409,32445,5866,1733,53193,49619,31535,42627,17509,26073,3471,27166,39385,16344,62628,14959,43111,7602,25136,53706,7347,9374,31130,41282,37070,14342,24540,24868,6366,38869,40530,36972,22181,61665,46871,61785,4608,56070,31005,23210,47070,58737,15190,55088,5133,16711,5495,36071,60502,64064,60242,463,42972,31786,62370,28311,51108,34345,1166,57042,5983,58673,29209,58248,7273,18418,17113,23003,50486,25128,21090,41519,46612,64562,11254,21142,62741,53145,47490,51164,43304,7249,3719,50764,40715,16904,35209,62889,19366,64840,40797,19143,44735,3001,57229,11644,3774,56923,529,44633,55989,64726,22846,42658,59796,59440,51010,46793,25559,29078,3439,35348,23563,3767,29699,45190,63905,6177,41754,52656,13073,12441,38661,39181,46615,18975,44420,16754,63756,28127,22485,37886,1148,40835,5584,20132,28671,29905,42057,47832,58387,39869,19102,41128,35805,56785,51170,39764,56000,33238,49283,52864,48497,54661,61009,39188,17852,27236,17805,63517,32180,60837,9559,13798,14263,32287,15513,40229,50470,53544,42201,22761,64104,61853,52484,24756,2362,11522,19008,12749,148,7975,42657,50017,1723,43106,31352,15946,53361,47003,8595,7208,34473,56218,16863,36220,58795,23982,3867,56492,59857,46891,40961,64865,48625,34482,62411,49265,27476,22416,7486,27229,1800,3706,39961,52864,43088,1454,25467,45390,781,60621,31961,8451,40993,35850,65176,15763,18753,22581,5605,23108,29865,61177,45700,60300,53736,34123,18416,48889,8495,10550,16933,978,39572,14006,23600,57787,4723,44047,49442,31374,34694,45221,1261,37351,54564,14509,6018,56136,22541,2705,110,29217,4634,14384,55972,40649,35558,11990,35273,61532,42621,59301,27383,22567,6669,61616,1871,54642,32389,64815,11589,39294,16625,45863,56609,43181,36777,57943,29546,28366,48786,48831,8079,35026,49775,64224,34088,27652,55932,22156,40709,23178,52661,65189,23895,18927,52571,41475,59053,25548,30686,38526,50941,19738,19428,3090,56265,36414,62086,28722,65064,14599,17557,15961,3682,54286,9955,41773,27708,5218,5716,8179,27456,7597,57105,54028,50853,10179,8076,43444,156,8733,45324,24885,36047,35459,5485,36088,50708,30771,8297,40795,3526,60071,20523,64578,13478,62270,40509,27431,24059,46313,451,16989,38130,40178,26227,52359,13762,58646,5312,18745,51247,36482,61072,24868,47822,25943,15895,14095,10553,2604,19241,4873,51354,64129,6943,17089,44499,58390,10597,26930,10962,15162,33407,4293,36414,46682,9618,16966,16279,5229,54128,31128,22208,5875,9668,5335,2870,30558,35414,27192,577,25918,53835,35856,22110,37244,45071,17154,45517,32602,51385,15871,22289,5926,32053,2904,32577,39512,11195,34076,4970,14459,23016,32003,46576,62679,36229,12602,49366,26465,11538,23856,63361,37219,24819,47675,43868,56479,52636,11543,63385,20236,15872,36588,32576,51194,15742,16719,55499,2865,41468,13794,14030,5182,37745,58616,35606,26897,62346,54103,18930,58745,6890,54496,16772,50546,17211,42748,61307,40187,8095,15533,23483,65478,2316,51175,64673,40857,62543,26107,5581,28990,42519,8230,60479,25504,33090,11938,4736,17306,37303,32709,14645,30356,20349,49663,24833,48737,60689,32155,46433,19921,21782,41143,19649,13445,3320,43379,26139,55550,8694,53694,60437,6211,55061,31280,64936,47245,64373,41496,47991,8450,51062,33862,22522,8796,63961,48162,24436,43863,63834,16597,34749,25793,37437,28613,56720,18363,60841,64434,57244,20139,15806,18976,14707,60125,43578,13420,3920,49082,38231,23655,26652,18888,36532,61544,24401,9847,52117,17324,36591,30803,28287,42044,11924,49049,34281,498,6790,14309,47805,53890,63706,32486,40453,17657,43016,29161,34838,49224,55041,40647,19647,20090,62537,54245,42633,13611,541,55649,63868,38222,34406,16636,32858,15573,28907,61837,18149,16970,43764,41164,26918,56128,556,30603,27641,61003,42891,14436,28315,20340,51840,47166,16105,61555,7741,51321,13780,65223,26121,15858,19657,13310,37071,45359,26565,20621,44294,39324,864,40289,17896,43215,57676,3939,1030,13513,37507,15384,62019,12092,6019,10824,26179,13966,5648,64403,43851,29103,63783,3205,18265,60557,15653,50250,20425,37787,62584,40605,65096,8513,19256,52961,62064,53547,63279,33164,19338,12023,25674,63699,45762,39355,35530,60745,23684,45474,20037,4886,29791,20871,61940,10540,51068,32447,21123,25079,40166,40729,62359,26021,13566,36130,34217,11426,9908,9665,26786,13874,15217,33254,28323,48045,28826,43743,3839,57612,47399,49760,47041,5610,51940,28720,6058,13411,45820,61912,1274,37898,28906,11405,64140,11928,20198,65348,2564,37763,41309,61237,5009,15258,36375,51296,50235,40218,34263,32043,59871,8172,28429,26483,27844,46214,39589,63107,17121,30755,7819,1921,56212,48455,942,5655,31649,25053,38532,49411,9257,54422,47248,21710,4882,2496,45292,31807,36657,30840,24588,4612,39669,46049,9672,18001,26559,61384,39832,9049,37597,53604,21106,8437,31581,40513,286,63634,24383,17053,1068,26179,14831,6276,61663,27598,64945,22806,10469,28111,50154,35045,24356,28686,7512,65339,31387,46008,4287,53449,54723,37839,36260,47245,32186,61844,36773,38809,55290,13350,24289,10041,951,55672,6305,25329,26240,15808,31287,45722,28632,40019,29490,34974,34820,63860,23668,44652,7474,36529,17401,43433,57881,15007,43001,34331,42642,3952,8288,45235,48435,40255,42813,7451,43468,56469,55845,46986,48539,47766,44638,18589,33112,15940,46743,47718,26143,33779,55809,209,21537,39177,3835,16698,58058,22976,64218,51913,43432,47586,59095,50770,4627,23505,42137,33392,18978,50859,21610,700,17706,47019,59140,15500,35187,53399,9167,53374,31245,39404,28251,8412,41583,25118,40629,51799,19560,53496,57486,20183,49183,30009,62878,10389,28653,11010,50165,35711,22707,34569,34296,50171,22802,24874,10793,39127,39479,55092,53245,58345,39463,1760,6298,55588,57534,56417,49371,20985,40528,31591,17712,5174,52093,54608,61978,883,1523,42217,14817,32274,43270,49215,9814,26396,51385,8536,7212,55158,27173,47121,8518,59276,913,53050,14228,7628,12882,27241,11986,8115,56038,65285,14223,50387,44605,4323,6690,15890,10600,40553,8892,58430,8680,58588,14325,18078,54716,15000,63481,65270,50977,45292,62634,11000,18596,7595,58837,49477,43725,50910,47680,31746,52331,45020,37325,36580,42474,42144,42687,47318,46430,6666,63256,5327,62499,40191,55629,29732,55410,30571,35982,47820,4805,43080,4759,9806,38833,37746,39208,2411,25281,10871,48769,48112,46666,13657,17620,7520,58643,52768,45019,37346,3176,24636,7937,61770,19463,22993,51507,56480,35674,2711,61587,63353,44242,36204,59652,30929,32510,29495,29748,45272,36112,57169,37739,52762,47615,39690,39295,12386,1475,29813,15022,17897,36709,2193,58623,34958,35747,4415,20307,13133,40312,51094,45336,9532,5505,32369,53910,14576,41340,39190,35110,51177,27791,7510,17449,36143,5148,47734,37673,30323,57307,25707,38012,47479,8903,14223,40032,43617,12878,25213,37844,23050,58529,46633,60922,5878,15100,9945,37054,44448,15742,16603,39653,21107,40529,60921,749,46507,46886,11405,20387,8101,21275,22791,27487,42,15431,31575,152,28097,54662,12434,64373,38563,17162,16860,12025,4734,36371,10346,36995,21478,39416,54334,56715,48958,45197,38921,46230,45316,25237,904,40791,45115,32146,31145,26441,60993,8555,56768,21852,47963,19223,44406,47117,43146,10981,7296,46188,28341,46324,21795,16463,51333,15742,53332,5120,21909,40166,28887,22450,38730,10690,39228,56876,29144,55485,30073,41941,45511,17258,40694,52000,45815,10908,27788,59387,823,26775,53247,47492,56805,50304,8010,15914,61879,63139,32486,15907,12965,37424,55827,62467,838,20365,25859,2129,60938,18110,32315,20787,35290,15835,58172,47413,17462,13319,65075,42481,5144,34256,41511,9836,24955,18867,33898,24646,58854,50825,12044,13342,29473,5584,17128,38904,33916,39455,38313,38516,62208,64896,18396,47737,33082,17232,46849,56547,7137,50193,37051,23993,21319,35451,57438,357,7563,22405,17011,29119,29892,17805,18489,3733,33264,16621,34455,21409,38572,30297,37709,4973,31614,22743,52241,48083,3805,62070,45207,17487,36914,11830,24042,34532,19115,35867,45633,25931,65457,5434,22359,29796,12060,25014,8595,276,42726,40451,34160,32739,32783,44935,58201,15821,20225,30406,33983,23279,43029,15188,48235,28431,9859,54373,43195,10488,16789,42754,1694,61638,36031,22292,9900,17192,19181,34450,64316,56020,513,62861,4957,3361,39429,31568,31242,41371,61494,44628,3319,6041,26548,50650,29562,30951,7031,41263,62429,56747,26744,24457,4281,39733,38000,34857,45884,33778,7546,19085,22011,14199,25036,60838,39633,23484,50403,3110,46455,20076,10121,16418,6623,48920,45721,20001,39926,54887,35233,51700,51432,8073,21224,25143,51261,49172,40692,31063,28487,2833,59918,3249,25560,14912,25697,25015,64975,58104,12034,8553,28302,3646,62859,29490,667,35970,16233,48395,37151,25641,63448,31497,53911,65194,9601,57391,33948,11213,52940,28014,64231,63266,36571,36944,53902,23415,3082,35299,13918,347,46704,48514,52702,4289,60608,51019,4963,41554,20489,37252,52914,21186,13678,60227,37176,32722,1804,58258,23388,20929,8251,20136,34794,37414,44507,54232,61265,12728,36024,26862,28706,15015,38626,6475,55557,56131,44954,53628,49675,19171,47107,42366,11558,27680,61038,6328,51679,758,46936,42382,36133,51823,21200,4159,9269,37406,10894,47789,5604,9310,29017,25888,46554,21528,24881,16092,14725,1698,59037,16945,28749,35256,22675,59537,9933,169,23002,31554,49722,30657,16969,2389,4211,9485,3911,14371,58973,50348,64596,57953,33035,54842,19407,63661,17786,61106,45127,47349,56274,17414,52378,47551,12996,15642,52236,45648,45003,26691,17910,63226,62929,38996,33265,31743,14788,21581,40147,9467,61616,63766,48812,7705,9226,42128,42856,39113,61419,53058,47603,926,40723,27404,1316,23453,24097,10240,60650,48872,4963,28261,41654,52135,63169,65338,23278,62008,22097,16626,17835,32913,11072,6808,20205,27876,32425,25061,3328,20335,36301,16855,20954,36039,33043,29123,4122,7862,29806,44494,56317,50746,17659,4557,54232,56515,11946,26481,56183,60383,29985,55257,41290,26458,8773,48818,9659,54906,2901,5465,61633,4452,13315,44206,57136,15858,42247,483,42683,47726,3908,23882,511,63191,2375,40436,40440,6586,51381,52284,6944,360,55668,31542,29610,60263,53460,60530,34117,42210,23989,22399,49219,17883,24189,43850,29294,4719,59063,3001,8484,27005,30344,22651,54754,55505,60215,17296,18434,62320,29908,3940,18837,58333,35890,39926,4303,2819,15263,41142,47119,9328,51037,19332,45273,25371,39560,38639,25385,34870,31306,13954,21123,21205,33836,34316,25213,7695,55107,49588,720,63802,63924,51140,29978,51653,842,47117,36666,14982,2123,11605,14170,18291,13802,64654,59928,30339,17924,53906,57424,14553,25114,52379,46046,8426,21801,5754,56765,2557,43382,11653,54309,3779,60062,35916,29185,13061,60551,26011,57677,45895,6519,40611,56675,1814,10821,22266,881,61514,23197,19414,42901,42810,34756,40648,55386,36420,32388,3214,8708,35115,57471,2925,27353,28246,33210,42246,33864,9120,38628,63801,56091,59216,39607,36757,38787,17643,15352,55249,977,5889,46364,23052,2477,62639,14614,5184,3669,46285,18619,32961,8758,60477,14936,44381,38256,64660,12329,3025,25241,62462,61883,2483,46332,52083,50266,54990,63135,24724,32629,14319,30798,42854,43730,34866,41425,17825,8930,4057,54007,6397,16490,57186,17977,19648,61593,31803,59599,61312,23130,60640,40235,14516,21511,48706,41314,43796,58180,29285,35272,56426,50067,18303,31672,4242,38275,8992,50203,24884,14574,34504,31051,5241,10824,22517,15132,1058,62430,29204,27222,16148,5377,1106,14506,805,1583,33141,6264,10380,57846,50588,3475,49264,61620,49214,59722,16543,47039,9738,51167,1334,40966,47321,10200,58146,50476,28959,10888,1297,32221,49798,50604,46598,47977,23121,46611,35063,52944,44028,36857,64488,33315,33172,10171,7929,53795,20159,1437,19987,53506,8770,29109,47497,57604,27868,43914,53060,101,19186,11697,8160,29675,54620,11862,38506,31659,51874,58636,65240,39724,9201,24282,13291,3029,63541,23801,28141,14008,34559,12590,17181,36931,23194,30369,41834,9765,965,13989,64593,59723,28388,13108,18989,24408,337,32484,38761,15126,36590,24812,28415,45077,19342,25101,61027,1846,16647,28951,45291,9614,25621,49087,7185,23545,36073,61610,7574,24402,61244,2596,23675,49919,20853,38949,48006,19473,61115,50314,41426,9604,9758,18993,57520,47078,49207,54880,51903,60962,6894,64371,37104,15935,10127,31726,14597,10518,15303,27794,37969,12043,59302,65331,42146,31520,30131,6162,59272,12947,23792,43518,18944,57939,10412,16085,37142,62654,7359,27824,42086,11772,31252,11961,53962,39601,63089,28392,14797,53135,55025,28291,2248,10718,10795,30885,47306,18428,27782,4408,44610,49719,33598,63255,21650,24016,55194,13375,60889,8525,37419,1264,16782,20518,53819,23878,10991,61711,29252,45342,59123,41649,38424,5365,13854,8313,37378,17096,21457,34125,34755,60413,16078,47892,60155,58352,39335,44350,45326,53618,38855,46059,9561,21245,3460,20030,4418,17541,24957,64941,52554,21189,9652,60377,56698,28754,25210,20509,48189,50374,59455,30348,59149,42859,41372,30783,22625,24916,34816,43281,40067,22125,6261,41792,62189,38649,25857,41587,31538,55788,54922,33336,24411,361,23872,42572,47083,26295,16778,10694,60098,24433,4998,42272,1549,53489,28595,32437,17581,13992,847,52876,15527,57098,34550,19689,22059,1771,21614,45115,59911,30133,51347,41558,41870,28957,41116,22251,50814,6992,51810,26393,36397,58326,15469,17769,23601,15290,27256,42971,23114,9337,23887,9042,22947,4619,17747,6606,47877,57329,4937,5011,1249,56371,57295,4123,46021,55140,55845,60711,25940,26911,44111,25726,40627,47312,26717,7875,45507,12614,16203,36048,37551,50774,29299,39089,1232,60413,19030,28923,37082,6273,49986,6494,3474,38737,51877,15614,60706,15045,54043,65300,2731,42248,28339,48584,7437,64497,61294,4014,25209,9530,910,48131,5939,63066,22861,20698,2321,62742,63746,45787,47526,14493,42579,54476,17351,26606,61147,30904,36650,21329,58733,56138,40343,55386,12844,10876,4815,10974,54431,10610,28158,60304,62996,24955,597,52631,14680,32075,24911,41787,24786,30488,59649,13934,34230,54613,43187,53685,49833,17674,45060,17064,48062,30927,19941,34772,5268,20685,48735,6200,22842,57809,42041,63857,28611,58992,7349,41763,50048,54339,41592,56239,22423,21832,16301,24083,20367,23783,61052,521,59859,48168,45839,19930,31020,22072,51408,23555,10446,450,1416,64142,22805,5817,55580,2495,7421,41098,2986,30054,50689,55102,57990,51421,51308,64645,64661,47979,14757,7514,52789,40736,40635,41898,64929,36050,11043,27805,8041,35399,58511,25301,59428,16871,27944,63387,35205,34137,61908,35710,45751,47581,54562,45053,42454,56994,4489,5355,11791,11611,62566,46110,34356,16448,25373,56101,37555,19274,45923,5216,37379,15121,15096,5690,1000,28176,21179,34011,56234,26210,13164,55631,60202,42191,61192,44769,21227,48702,29508,752,30079,47861,21349,9643,7285,58321,24413,60990,38596,20952,65178,56711,63113,28589,22866,23953,39982,4598,14300,39668,63162,62268,59804,29199,12662,11042,44593,9184,44189,33714,31278,295,19763,35241,41181,16145,39885,29313,18981,25636,5684,62754,13207,24202,7771,7116,24884,6090,27299,44409,61872,21791,26669,18645,44382,32456,60897,51650,42629,19116,10153,61836,59142,44010,51029,24805,56820,41724,30174,62600,12163,19383,62582,26789,23423,15136,3636,20943,22498,13875,11892,65446,59570,54429,62165,31546,42257,7140,27129,62842,59426,32356,26287,25665,55189,50723,40956,5012,32481,33806,64294,33040,27492,15833,49001,41037,59446,45849,64134,64304,42926,27000,5740,35430,44647,23594,2671,15688,63377,56291,5981,51282,47016,16960,5550,43966,28095,59127,24684,29124,32312,61477,1621,14814,53603,4798,7844,24324,36143,31005,54762,31640,8177,63527,17056,54792,5527,60541,3475,46629,10140,19836,35386,39451,13249,32852,52026,27355,55705,37436,2432,62325,25477,65506,5309,50267,31900,6479,33042,54968,50347,1225,53780,38599,36951,11071,1030,60446,6787,51996,42660,18604,34814,53766,40830,30694,62169,27306,26508,59458,41425,17106,56820,21183,52171,18157,32956,63712,11606,32214,12289,33602,26695,32673,58564,29406,61128,63743,36521,11837,61655,31435,22124,59999,63648,31877,25095,40150,27119,36505,40223,38726,33207,47462,15571,17309,20201,48297,29633,7542,38633,40802,33893,14044,37399,11994,60022,3680,23820,12793,44074,50422,6144,12084,31115,53824,8524,4113,17465,14462,31457,33796,15120,45614,56017,58905,65036,40682,59948,11891,7805,43395,46762,20733,64963,43632,12877,22710,14120,45926,12999,35221,44753,22747,35514,21930,60307,18468,23693,57146,38277,25704,8240,42432,19220,4518,23716,25037,25239,17666,59149,46579,21560,65157,50565,45288,1869,65355,27903,10432,39573,51301,1248,32436,60096,61131,27960,44858,41805,62583,41930,10768,46504,15922,34346,56850,28947,7511,19400,35975,59100,8839,29251,19488,57899,60812,50828,48608,24615,60678,18659,33134,6734,22203,21088,44987,62874,18463,5392,38287,63453,53792,58745,22049,49714,43016,58975,60480,38152,10179,33464,35503,4726,20530,12899,19305,12215,47068,11262,57239,10254,56976,12194,41971,17917,62456,15800,33862,13845,34252,33408,59128,12840,48947,21393,4839,61862,59051,13491,843,39502,37349,46699,53894,28208,17497,10397,56817,17427,21916,14225,50413,19643,53302,21519,56191,2826,46232,41921,2232,39979,20462,6491,29989,3083,57196,63771,50372,43643,56896,56159,13057,23216,49331,32106,48461,31636,57660,25891,12092,23329,2068,46853,23363,12688,43575,8242,33049,40937,14515,6779,62088,24236,40960,44112,37468,58912,45585,53155,2040,52456,21855,19323,62119,19508,11357,31957,20620,49614,56556,49743,13482,22166,38211,27248,48416,17951,25907,43256,55512,60540,43782,24070,15094,1604,63172,25111,55347,23389,39207,62292,23319,24774,325,44403,7811,58406,21990,23143,3117,31171,13622,22462,37666,40985,61818,155,45338,59088,10981,29780,23456,12101,40569,56977,56369,33504,39840,12814,47956,7451,44878,16631,44944,46735,50398,51491,28332,39529,10957,4110,12807,26903,54178,38942,41589,9861,42936,23663,22998,56397,17096,22361,64333,56111,16598,16525,58171,49320,24153,50522,31584,31792,15073,4637,51182,60968,5249,17004,51784,16799,41304,53827,32029,4270,57725,36334,264,24008,36142,63782,20494,41372,44404,2580,3860,45610,65350,44250,7088,64073,34577,46774,19560,53404,9238,31400,39814,52027,44229,50589,26856,23208,37264,41917,26207,61582,12925,55997,25403,12018,32126,43087,12008,49550,25986,10937,52366,64212,4957,41947,60669,41973,31366,4271,60623,51101,21056,41187,64236,38961,43824,44757,336,973,41523,25625,15358,25281,12279,45781,3058,49934,24546,57277,23016,8529,43923,38548,85,24007,3918,48584,52957,27864,61814,44531,64,7013,12937,53766,40437,29253,23571,16751,51834,36152,22444,43745,32591,16665,14211,32711,6195,988,28493,34754,59870,44142,35810,18092,41298,56647,16192,47904,55995,56584,40095,38422,5242,3457,61621,7673,20002,53592,5409,24073,51292,44992,43103,42914,8128,43456,19462,47367,1423,5354,58397,16340,21735,42698,41043,43946,34869,49340,20271,43721,13938,27380,56641,51337,362,40752,58948,28080,51964,13670,59270,52166,15119,39913,47716,13901,22763,53504,4947,43929,48405,45093,27727,32009,41113,18939,22852,40527,25771,29916,39888,51629,57782,926,51340,24368,45642,64608,39845,58131,54688,13083,37827,61262,6246,53996,1621,38454,43691,52736,32452,10386,32275,29239,18337,59710,62164,43021,55076,49094,1638,39088,48990,18193,26140,62383,37065,29273,58864,29682,54838,18395,42580,34485,4668,61789,23807,14924,63776,22915,20341,39366,20044,57455,983,19866,126,32019,12100,45848,47137,47504,55938,62785,61570,38721,16240,62120,8264,3095,19058,45345,59068,49134,46654,54377,1065,58662,45841,16718,58002,6007,21745,38303,8111,7868,19838,51534,15188,33415,46438,4299,9095,15564,54796,56848,2543,62084,15489,2547,41004,47723,22770,25442,17489,52501,61620,11413,3453,49423,40629,61001,20181,37223,28125,19604,42543,11366,10182,21838,7270,32253,26506,18810,32783,48516,43313,59280,10403,15918,25324,3922,26902,56858,63187,50833,11054,39335,5080,9677,54532,54589,4253,46099,14711,40211,51496,27923,52642,27976,13083,49917,3360,10554,12918,10842,42617,1608,28715,5867,53975,9604,31649,64137,26984,15536,50068,10228,26727,36113,63406,10570,40990,19427,16580,50530,56072,6983,19337,5437,26635,19179,40460,9134,92,35658,4050,9259,9227,6266,56109,40126,60092,23302,5996,26565,7132,36125,16371,14495,3445,37983,3868,50318,24926,62398,25054,36281,31744,45485,16590,39682,39392,2524,11777,31582,5283,18120,59668,11746,27721,29988,1313,17698,50377,57124,35534,38749,57575,46647,36488,19202,44018,62117,5674,2396,58807,2239,17319,5973,12518,17464,27732,17997,50797,11419,41522,57267,12610,42727,50081,35971,65479,137,17337,32674,27423,7401,15464,50131,41557,18428,43215,20955,50911,24421,49180,64672,7868,48675,36890,58641,9977,43084,38011,12762,15235,35780,21666,21731,19355,59630,8294,60533,16956,43322,59627,57133,55059,4612,45938,23162,57411,30968,6358,39044,36618,55577,32402,41737,26276,1855,42514,65514,31967,65285,13190,49962,63577,40212,17837,49713,30591,447,2743,21892,24059,14234,65510,47459,12748,34090,13163,21938,54813,34065,45424,59602,10237,23704,61547,3390,64715,57483,21125,29224,37267,18641,30559,60856,3707,65474,53335,61452,58163,8039,5285,33687,51807,28790,12283,57131,53333,24273,13522,47032,47709,42484,16417,42727,53718,59817,44142,41554,7996,23139,22919,54979,2664,27068,50293,51597,8588,39503,13068,25165,35490,48768,39617,12290,62315,21621,4413,59907,37767,64773,54408,23127,58281,38098,29713,64080,39948,36518,48505,25837,23599,42186,30742,55312,48356,49745,4571,17644,32266,36883,48664,7107,63676,46598,64369,11943,54900,51566,42238,54664,12303,54879,26504,17843,45271,65203,24901,29090,61019,1651,31858,54280,14499,39545,26450,50224,13521,36144,48374,8754,3952,14060,11281,13899,4239,42948,47297,9425,25854,20896,49234,64566,41660,7839,24391,53317,1328,4369,32271,42200,26210,45976,28719,6809,26530,15358,23852,35790,21821,50942,12901,53604,42240,10873,2471,7229,55217,32017,12535,34852,16585,57518,20641,25645,5068,44606,38799,58298,9148,37316,1863,1117,44263,20546,43031,32723,62719,15854,46254,61644,40323,5572,737,4149,1397,13586,58925,7702,37435,17208,4565,43537,38652,26492,51885,23296,1363,38324,35360,23526,19313,22273,33971,10470,39130,61539,35356,62818,40910,61277,36761,38049,1780,6876,24989,31759,60788,15667,64765,35400,61107,15170,46837,9460,27849,44715,37367,21176,53932,21224,57387,8025,59978,7888,53700,30847,27214,43807,56031,8724,45788,35880,55021,15078,60719,56819,61036,11604,45228,7248,21021,40495,36434,46085,4990,35060,11153,64881,29168,42124,46058,1561,58260,38109,60811,23619,50556,42068,29649,41853,36129,2738,4370,36318,42525,33086,51272,41585,26586,34986,26828,33105,58211,52390,13169,13521,39063,40116,41120,20599,29342,21602,62595,12037,9530,34241,27271,37997,45763,47922,40443,54641,62843,56072,1800,16465,947,57739,6717,41531,32829,15584,13003,27693,17884,56599,33397,9336,45235,38807,52172,14043,23367,63120,6393,6547,48683,6018,37467,27636,25919,4877,37029,45363,60274,59543,7326,21797,26204,36298,33652,60928,29411,12024,27023,1505,54479,2011,16671,28399,63582,33033,26795,55919,60137,60752,57569,57770,2581,27627,35086,30650,7061,38331,21067,28815,29875,19904,17788,38468,42804,4050,12179,39210,32997,13783,6738,19611,25395,43181,27373,43098,12823,51118,26702,53476,65469,39944,61260,6632,62693,46254,15819,4688,520,4071,50361,58674,53764,27207,14135,18840,41634,46815,56034,25607,13871,41993,25914,7571,36822,35930,17161,55981,64058,52676,42087,15990,32047,14998,15443,65324,2697,26454,49888,33758,42016,23988,35743,4430,9431,25791,11998,43775,34047,56916,47758,45748,3552,29185,46377,41175,21031,26939,5156,44794,58434,18839,8659,26745,8655,902,56911,2402,42540,46401,26507,45674,54756,18012,30426,37075,21474,3753,55714,42579,52942,46931,55579,47147,44420,2617,64417,56560,20072,24533,22260,63425,18047,7423,4804,4269,58701,55448,30598,24065,64496,35995,11700,20420,39283,9418,39923,63185,17023,47438,3130,61368,39140,26552,34900,23201,35444,44712,29919,4912,45400,44826,28103,65147,23753,13057,47492,3986,22422,32521,5038,26122,45155,29936,64446,19024,17031,61724,28926,63713,21603,18545,13774,4198,16723,4881,13024,18821,49604,45727,63539,2233,45604,28774,38021,44495,37371,11123,15628,41331,38402,47379,12085,62696,25507,48533,59814,43019,39308,12601,41157,57325,23445,47316,24477,46708,35133,35465,24571,53635,3154,64427,55578,14804,16005,62337,33639,8227,57496,14375,13362,9310,37586,39794,5520,26572,5126,51264,55086,31579,41078,38637,652,14243,59394,16608,50176,49075,61535,13589,35214,37821,50035,14676,4733,7321,17395,23063,38565,54553,28779,54317,40257,32269,54026,34383,58213,44187,57837,57394,19490,9029,16565,46067,30912,34178,53818,52522,15100,16238,19387,16208,64963,57499,29156,40422,31147,33075,23394,56684,33509,40704,5163,25769,14665,23708,29096,52386,33762,47980,33089,56700,3250,22597,4917,32849,31243,25021,32683,12102,40493,41283,40222,802,49724,53537,7920,14125,61909,6297,48408,19137,20349,928,52365,56357,54514,29002,12305,45607,36942,58718,40137,14049,65421,17784,36760,33916,38246,16517,49518,25383,39533,3706,36798,17477,22497,43691,27628,22526,37846,63484,26927,28763,54761,26764,24438,30439,54509,38866,16173,55531,26054,44462,30986,24557,40721,19744,58030,27870,65419,20024,25760,59123,6209,5274,60999,26317,54376,16333,54602,18108,23165,19494,36444,44670,14570,43761,60884,7063,1435,19996,49096,27197,45003,63582,27424,3067,17307,4008,33696,43764,5092,44126,37527,40414,34527,28322,14853,708,19716,18636,50923,22330,51365,59259,53914,25786,17969,26550,7815,17722,61997,65400,13629,35816,29520,37643,23109,26168,36348,40143,44201,65273,30848,6663,49554,3299,54744,50753,43079,56544,17711,15525,1230,24930,55363,64177,18163,45202,14787,64331,65040,34699,12109,23882,19096,58902,48274,6547,41310,2553,22422,54539,12546,52667,38078,35873,19849,2552,47355,23713,22283,2452,29135,43911,3155,2644,31266,60969,55206,16296,60380,39483,1957,23549,26298,54039,59256,8327,16210,25806,19320,52205,3464,22307,46586,5168,12720,34102,6254,61453,3547,47994,13344,16799,23637,23593,15363,60059,15893,59762,19454,6825,18090,18978,38181,16069,38782,39667,20279,6542,60682,44799,51733,38732,56225,62605,20479,46602,49267,33766,8236,58484,37269,267,7405,49664,48482,62824,25711,24678,31483,10774,31444,4968,33324,34618,17230,5039,37552,8837,498,21522,19720,43527,4492,43500,24662,4656,52521,1326,18885,9031,28497,11236,59342,52065,56752,4901,43120,62701,4054,48451,56009,46595,27202,25547,48373,35209,60973,45576,35260,49804,38983,51632,28310,14267,14773,21142,40888,22248,62152,25203,20433,32945,17041,41324,39941,16643,47261,27569,58599,54434,34561,58577,40668,49221,15453,42179,27896,56690,58963,26081,25358,34582,29129,64162,65447,11716,9009,13233,6409,52717,12536,1746,62802,8425,28204,33659,51508,18449,32564,53716,13751,24615,61939,5841,64028,13329,29443,33970,52331,5241,42699,59468,11082,25353,56349,1359,24368,61993,31672,27217,13337,1370,28841,64887,45977,22583,30861,45717,39412,5264,55010,33026,2878,30362,41135,10227,13816,52158,61300,41685,4177,27635,56911,22896,16199,9087,45148,34500,17296,48275,43297,33436,50465,64128,64380,11749,20233,40851,37651,28142,6870,34044,52574,41930,61368,63083,60068,54172,26927,20741,3419,10255,20345,5337,24656,34593,41115,47603,50115,9130,28128,63486,8302,19572,62170,54553,30822,21169,19258,53101,36098,64880,15438,35570,40946,31465,2572,62081,19902,15275,8207,62535,54781,32924,46745,63697,52196,38468,3503,16288,60704,43648,34989,60000,24647,39462,6473,38145,38944,14661,47435,60998,59427,51757,1998,12262,61004,61600,9506,23587,39942,48502,61875,11218,24318,6535,52714,45903,53254,29012,38255,27438,2142,43338,40334,29249,13412,44721,10540,4610,19960,16305,33798,49145,53449,60941,59072,49594,57763,58050,10636,14946,31426,312,16297,8192,57822,16439,33996,27908,16812,62349,52718,64143,22690,54585,3618,45488,33296,54170,50971,19034,9140,48548,2434,1947,63678,10399,22720,17969,48970,1460,56208,17976,16474,6381,62464,62589,30178,56544,17205,49605,38714,5027,63423,5699,1579,8924,16230,25132,36345,32311,19632,12362,21280,58116,42468,59919,20800,32136,16508,47368,28689,63366,32612,18652,40215,32137,63374,64181,21650,33789,41415,59301,61288,57165,39877,65014,53066,8909,57491,18807,11223,62633,27753,31735,56836,35040,14453,14462,52703,51708,49821,7297,29211,14589,55353,50664,7160,21071,27836,42017,22989,56501,33939,36993,2858,3207,1098,50292,64706,22041,34320,34736,44144,41112,1770,13160,18350,41728,63991,17486,57978,16425,45370,2297,47984,63026,32548,53743,65307,2713,1198,39348,23425,44682,6845,60624,22553,56550,31576,14150,23511,52547,59060,27698,33162,24301,8178,10396,14280,48660,35541,58425,47591,22656,48469,60585,20694,5775,14002,30612,54918,63262,63150,53208,3628,55629,42899,11573,17849,25471,52181,47209,9776,12474,62740,39231,7988,63924,62070,37630,45310,21701,5977,19921,32741,53750,48099,15933,43560,48489,7690,40627,34872,20912,7617,36743,1444,217,1015,7584,27539,40595,12618,44199,25802,56805,42500,64308,3954,60043,12450,38623,28733,23905,51190,58136,34468,40042,53901,33672,3429,1252,630,22452,14995,45388,46422,56593,42517,57422,18000,39019,49229,31651,43824,15474,52001,28401,25788,50670,25876,35685,59585,8798,32921,61759,57232,33901,22852,44394,19794,14570,53630,41466,1388,29140,6088,3301,59207,6076,48454,35411,7215,10486,49560,31887,40397,36000,4113,41095,62855,58900,46063,60319,50595,23823,1722,51566,26534,8981,51561,37370,46980,15604,22637,37361,5983,61091,35031,60941,47948,30930,30618,61887,35178,5250,49571,64508,43903,48278,34607,38751,33992,8507,54023,26031,28472,46456,8711,2010,10053,32886,63249,19908,47532,777,36351,49702,16711,23539,32074,60852,11199,24030,49558,4289,43301,46050,11661,20494,52674,14569,35922,12120,12909,46084,9654,45681,35158,18986,57850,17257,35159,37414,3972,62199,1909,56488,37591,39160,5131,48847,7169,59006,45220,59835,63712,8277,21944,46737,6901,7030,5386,64757,40167,26444,14570,7190,5931,50170,30291,5549,44474,31992,30121,61236,13290,28828,38261,32265,64277,49958,21504,29116,31454,37547,43348,38328,49272,5657,29762,99,44720,15415,14388,49777,32812,19622,39557,12488,25196,45094,54127,13903,42122,6590,34975,41568,48506,20746,52006,44754,51155,15547,57870,54962,105,6707,30802,22645,4202,25093,32450,19066,53383,42108,33736,41012,18368,35497,54305,54984,6471,63346,31045,15887,20203,9058,36145,46224,22570,33180,50951,59673,40929,21111,56768,1239,6178,4078,59341,46540,58407,38663,34146,34890,18180,5840,60190,65500,22521,23403,43837,24473,18373,41432,2373,671,17178,24650,38119,45815,45688,42284,19286,40918,2268,25157,45268,7123,37608,20944,17097,25081,37040,6417,45265,39942,33132,42880,25764,14146,39422,7361,43060,2976,16307,22499,34127,10802,6932,12021,400,4745,43965,60097,31188,19753,54269,43363,49117,64642,13478,3174,13397,21162,26011,17156,41670,49760,16285,60807,44085,57628,28851,29725,33462,8506,26923,16476,57670,64685,51365,27154,48679,33605,52785,48659,47451,49548,51830,36220,52434,16727,52871,35098,49271,51330,35710,55430,55516,42667,15780,33472,36809,61446,63717,16596,20718,26298,54140,64169,8570,49607,3690,10727,47610,9915,40582,51484,57890,955,34551,34923,15076,2961,15383,49706,32550,43064,11720,3548,52083,34614,1937,38349,14758,5869,19617,52407,33165,14776,62166,8177,35903,10616,2357,29397,45589,59187,51443,56323,8799,807,58822,65442,41670,45667,34755,12181,5747,34117,50989,8041,4080,47595,45616,2036,3145,3965,51612,16178,58497,42091,17968,19893,16428,24,16243,63666,43296,40369,56521,55451,16765,52677,26878,60282,44980,36792,8940,31804,51614,46384,54064,11665,50126,20677,4826,4020,33658,44365,64844,16640,41579,12675,14396,23463,59025,32869,26712,1650,22857,6935,65090,25246,43371,18250,32967,26893,15056,486,461,50650,26335,16701,44139,6756,59631,52721,47335,20452,47796,60682,65195,7063,41768,22571,10719,42303,24940,60265,2568,7690,21422,21276,20221,24363,47103,24473,32749,52230,41488,40374,37534,12258,52739,30667,9263,59596,31474,45697,3777,7835,39143,64756,2658,47283,36162,9452,30083,49360,6708]> : tensor<65536xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<16>, tensor<65536xi64>) -> (!FHE.eint<16>) - return %1: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 58610 - - inputs: - - scalar: 17240 - outputs: - - scalar: 57429 - - inputs: - - scalar: 65535 - outputs: - - scalar: 6708 diff --git a/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table_gen.py b/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table_gen.py index 28305248a..01d65a6fe 100644 --- a/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table_gen.py +++ b/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table_gen.py @@ -7,15 +7,14 @@ MAX_PRECISION = 16 def main(): print("# /!\ DO NOT EDIT MANUALLY THIS FILE MANUALLY") - print("# /!\ THIS FILE HAS BEEN GENERATED THANKS THE end_to_end_levelled_gen.py scripts") + print("# /!\ THIS FILE HAS BEEN GENERATED") np.random.seed(0) for p in range(MIN_PRECISON, MAX_PRECISION+1): if p != 1: print("---") max_value = (2 ** p) - 1 random_lut = np.random.randint(max_value+1, size=2**p) - # identity_apply_lookup_table - print("description: identity_apply_lookup_table_{0}bits".format(p)) + print("description: apply_lookup_table_{0}bits".format(p)) print("program: |") print( " func.func @main(%arg0: !FHE.eint<{0}>) -> !FHE.eint<{0}> {{".format(p)) diff --git a/compiler/tests/end_to_end_fixture/end_to_end_fhe.yaml b/compiler/tests/end_to_end_fixture/end_to_end_fhe.yaml deleted file mode 100644 index 796d8ac6e..000000000 --- a/compiler/tests/end_to_end_fixture/end_to_end_fhe.yaml +++ /dev/null @@ -1,320 +0,0 @@ -# TODO: Rewrite/Remove -# The FHE.neg_eint op doesn't come with a well defined semantics as FHE.eint -# has an undefined behavior for under/overflow. -# For now we keep it, knowning the compiler/optimizer behavior but that could -# break at anytime. -description: neg_eint -program: | - func.func @main(%arg0: !FHE.eint<7>) -> !FHE.eint<7> { - %1 = "FHE.neg_eint"(%arg0): (!FHE.eint<7>) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - outputs: - - scalar: 255 - - inputs: - - scalar: 4 - outputs: - - scalar: 252 - - inputs: - - scalar: 250 - outputs: - - scalar: 6 ---- -# TODO: Rewrite/Remove -# The FHE.neg_eint op doesn't come with a well defined semantics as FHE.eint -# has an undefined behavior for under/overflow. -# For now we keep it, knowning the compiler/optimizer behavior but that could -# break at anytime. -description: neg_eint_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>) -> !FHE.eint<16> { - %1 = "FHE.neg_eint"(%arg0): (!FHE.eint<16>) -> (!FHE.eint<16>) - return %1: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - outputs: - - scalar: 131071 - - inputs: - - scalar: 131071 - outputs: - - scalar: 1 ---- -description: neg_eint_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>) -> !FHE.eint<3> { - %1 = "FHE.neg_eint"(%arg0): (!FHE.eint<3>) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - outputs: - - scalar: 15 - - inputs: - - scalar: 4 - outputs: - - scalar: 12 - - inputs: - - scalar: 13 - outputs: - - scalar: 3 ---- -description: apply_lookup_table_1_bits -program: | - func.func @main(%arg0: !FHE.eint<1>) -> !FHE.eint<1> { - %tlu = arith.constant dense<[0, 1]> : tensor<2xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<1>, tensor<2xi64>) -> (!FHE.eint<1>) - return %1: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - outputs: - - scalar: 1 ---- -description: apply_lookup_table_2_bits -program: | - func.func @main(%arg0: !FHE.eint<2>) -> !FHE.eint<2> { - %tlu = arith.constant dense<[0, 1, 2, 3]> : tensor<4xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<2>, tensor<4xi64>) -> (!FHE.eint<2>) - return %1: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 2 - outputs: - - scalar: 2 - - inputs: - - scalar: 3 - outputs: - - scalar: 3 ---- -description: apply_lookup_table_3_bits -program: | - func.func @main(%arg0: !FHE.eint<3>) -> !FHE.eint<3> { - %tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7]> : tensor<8xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<3>, tensor<8xi64>) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 7 - outputs: - - scalar: 7 - - inputs: - - scalar: 2 - outputs: - - scalar: 2 ---- -description: apply_lookup_table_4_bits -program: | - func.func @main(%arg0: !FHE.eint<4>) -> !FHE.eint<4> { - %tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]> : tensor<16xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<4>, tensor<16xi64>) -> (!FHE.eint<4>) - return %1: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 15 - outputs: - - scalar: 15 - - inputs: - - scalar: 12 - outputs: - - scalar: 12 -test-error-rates: - - global-p-error: 0.05 - nb-repetition: 100 - - global-p-error: 0.01 - nb-repetition: 100 - - global-p-error: 0.001 - nb-repetition: 100 ---- -description: apply_lookup_table_5_bits -program: | - func.func @main(%arg0: !FHE.eint<5>) -> !FHE.eint<5> { - %tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]> : tensor<32xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<5>, tensor<32xi64>) -> (!FHE.eint<5>) - return %1: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 31 - outputs: - - scalar: 31 - - inputs: - - scalar: 23 - outputs: - - scalar: 23 ---- -description: apply_lookup_table_6_bits -program: | - func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { - %tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63]> : tensor<64xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<6>, tensor<64xi64>) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 63 - outputs: - - scalar: 63 - - inputs: - - scalar: 59 - outputs: - - scalar: 59 ---- -description: apply_lookup_table_7_bits -program: | - func.func @main(%arg0: !FHE.eint<7>) -> !FHE.eint<7> { - %tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127]> : tensor<128xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<7>, tensor<128xi64>) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 127 - outputs: - - scalar: 127 - - inputs: - - scalar: 96 - outputs: - - scalar: 96 - ---- -description: apply_lookup_table_8_bits -program: | - func.func @main(%arg0: !FHE.eint<8>) -> !FHE.eint<8> { - %tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255]> : tensor<256xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<8>, tensor<256xi64>) -> (!FHE.eint<8>) - return %1: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 255 - outputs: - - scalar: 255 - - inputs: - - scalar: 96 - outputs: - - scalar: 96 ---- -description: apply_lookup_table_multiple_precision -program: | - func.func @main(%arg0: !FHE.eint<6>, %arg1: !FHE.eint<3>) -> !FHE.eint<6> { - %tlu_7 = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63]> : tensor<64xi64> - %tlu_3 = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7]> : tensor<8xi64> - %a = "FHE.apply_lookup_table"(%arg0, %tlu_7): (!FHE.eint<6>, tensor<64xi64>) -> (!FHE.eint<6>) - %b = "FHE.apply_lookup_table"(%arg1, %tlu_3): (!FHE.eint<3>, tensor<8xi64>) -> (!FHE.eint<6>) - %a_plus_b = "FHE.add_eint"(%a, %b): (!FHE.eint<6>, !FHE.eint<6>) -> (!FHE.eint<6>) - return %a_plus_b: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 23 - - scalar: 7 - outputs: - - scalar: 30 ---- -description: apply_lookup_table_random_func -program: | - func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { - %tlu = arith.constant dense<[16, 91, 16, 83, 80, 74, 21, 96, 1, 63, 49, 122, 76, 89, 74, 55, 109, 110, 103, 54, 105, 14, 66, 47, 52, 89, 7, 10, 73, 44, 119, 92, 25, 104, 123, 100, 108, 86, 29, 121, 118, 52, 107, 48, 34, 37, 13, 122, 107, 48, 74, 59, 96, 36, 50, 55, 120, 72, 27, 45, 12, 5, 96, 12]> : tensor<64xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<6>, tensor<64xi64>) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 5 - outputs: - - scalar: 74 - - inputs: - - scalar: 62 - outputs: - - scalar: 96 - - inputs: - - scalar: 0 - outputs: - - scalar: 16 - - inputs: - - scalar: 63 - outputs: - - scalar: 12 ---- -# https://github.com/zama-ai/concrete-compiler-internal/issues/809 -description: bug_809 -program: | - func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { - %cst = arith.constant dense<[1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1]> : tensor<64xi64> - %0 = "FHE.apply_lookup_table"(%arg0, %cst) : (!FHE.eint<6>, tensor<64xi64>) -> !FHE.eint<6> - %cst_0 = arith.constant dense<[0, 10, 20, 30, 40, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73]> : tensor<64xi64> - %1 = "FHE.apply_lookup_table"(%arg0, %cst_0) : (!FHE.eint<6>, tensor<64xi64>) -> !FHE.eint<6> - %2 = "FHE.add_eint"(%0, %1) : (!FHE.eint<6>, !FHE.eint<6>) -> !FHE.eint<6> - return %2 : !FHE.eint<6> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 1 - - inputs: - - scalar: 5 - outputs: - - scalar: 15 - - inputs: - - scalar: 62 - outputs: - - scalar: 72 - - inputs: - - scalar: 63 - outputs: - - scalar: 74 diff --git a/compiler/tests/end_to_end_fixture/end_to_end_leveled.yaml b/compiler/tests/end_to_end_fixture/end_to_end_leveled.yaml deleted file mode 100644 index 471b9df82..000000000 --- a/compiler/tests/end_to_end_fixture/end_to_end_leveled.yaml +++ /dev/null @@ -1,9575 +0,0 @@ -# /!\ DO NOT EDIT MANUALLY THIS FILE MANUALLY -# /!\ THIS FILE HAS BEEN GENERATED THANKS THE end_to_end_levelled_gen.py scripts -# This reference file aims to test all levelled ops with all bitwidth than we known that the compiler/optimizer support. - - -description: identity_1bits -program: | - func.func @main(%arg0: !FHE.eint<1>) -> !FHE.eint<1> { - return %arg0: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 1 - outputs: - - scalar: 1 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: zero_tensor_1bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<1>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<1>> - return %0: tensor<2x2x4x!FHE.eint<1>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_cst_1bits -program: | - func.func @main(%arg0: !FHE.eint<1>) -> !FHE.eint<1> { - %0 = arith.constant 1 : i2 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<1>, i2) -> (!FHE.eint<1>) - return %1: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 1 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_arg_1bits -program: | - func.func @main(%arg0: !FHE.eint<1>, %arg1: i2) -> !FHE.eint<1> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<1>, i2) -> (!FHE.eint<1>) - return %0: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 0 - - scalar: 1 - outputs: - - scalar: 1 - - inputs: - - scalar: 1 - - scalar: 0 - outputs: - - scalar: 1 - - inputs: - - scalar: 0 - - scalar: 1 - outputs: - - scalar: 1 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_1_bits -program: | - func.func @main(%arg0: !FHE.eint<1>, %arg1: !FHE.eint<1>) -> !FHE.eint<1> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<1>, !FHE.eint<1>) -> !FHE.eint<1> - return %res: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 0 - - scalar: 1 - outputs: - - scalar: 1 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_cst_1bits -program: | - func.func @main(%arg0: !FHE.eint<1>) -> !FHE.eint<1> { - %0 = arith.constant 1 : i2 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<1>, i2) -> (!FHE.eint<1>) - return %1: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 1 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_arg_1bits -program: | - func.func @main(%arg0: !FHE.eint<1>, %arg1: i2) -> !FHE.eint<1> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<1>, i2) -> (!FHE.eint<1>) - return %1: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 1 - - scalar: 1 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 0 - outputs: - - scalar: 1 - - inputs: - - scalar: 0 - - scalar: 0 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_cst_1bits -program: | - func.func @main(%arg0: !FHE.eint<1>) -> !FHE.eint<1> { - %0 = arith.constant 1 : i2 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i2, !FHE.eint<1>) -> (!FHE.eint<1>) - return %1: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 1 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_arg_1bits -program: | - func.func @main(%arg0: i2, %arg1: !FHE.eint<1>) -> !FHE.eint<1> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i2, !FHE.eint<1>) -> (!FHE.eint<1>) - return %1: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 1 - - scalar: 1 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 0 - outputs: - - scalar: 1 - - inputs: - - scalar: 0 - - scalar: 0 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_1bits -program: | - func.func @main(%arg0: !FHE.eint<1>, %arg1: !FHE.eint<1>) -> !FHE.eint<1> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<1>, !FHE.eint<1>) -> (!FHE.eint<1>) - return %1: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 1 - - scalar: 1 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 0 - outputs: - - scalar: 1 - - inputs: - - scalar: 0 - - scalar: 0 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_cst_1bits -program: | - func.func @main(%arg0: !FHE.eint<1>) -> !FHE.eint<1> { - %0 = arith.constant 2 : i2 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<1>, i2) -> (!FHE.eint<1>) - return %1: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 0 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_arg_1bits -program: | - func.func @main(%arg0: !FHE.eint<1>, %arg1: i2) -> !FHE.eint<1> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<1>, i2) -> (!FHE.eint<1>) - return %1: !FHE.eint<1> - } -tests: - - inputs: - - scalar: 0 - - scalar: 1 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 1 - outputs: - - scalar: 1 - - inputs: - - scalar: 1 - - scalar: 1 - outputs: - - scalar: 1 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- ---- -description: identity_2bits -program: | - func.func @main(%arg0: !FHE.eint<2>) -> !FHE.eint<2> { - return %arg0: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 3 - outputs: - - scalar: 3 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: zero_tensor_2bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<2>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<2>> - return %0: tensor<2x2x4x!FHE.eint<2>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_cst_2bits -program: | - func.func @main(%arg0: !FHE.eint<2>) -> !FHE.eint<2> { - %0 = arith.constant 1 : i3 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<2>, i3) -> (!FHE.eint<2>) - return %1: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 2 - outputs: - - scalar: 3 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_arg_2bits -program: | - func.func @main(%arg0: !FHE.eint<2>, %arg1: i3) -> !FHE.eint<2> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<2>, i3) -> (!FHE.eint<2>) - return %0: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 2 - - scalar: 1 - outputs: - - scalar: 3 - - inputs: - - scalar: 3 - - scalar: 0 - outputs: - - scalar: 3 - - inputs: - - scalar: 1 - - scalar: 2 - outputs: - - scalar: 3 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_2_bits -program: | - func.func @main(%arg0: !FHE.eint<2>, %arg1: !FHE.eint<2>) -> !FHE.eint<2> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<2>, !FHE.eint<2>) -> !FHE.eint<2> - return %res: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 1 - - scalar: 2 - outputs: - - scalar: 3 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_cst_2bits -program: | - func.func @main(%arg0: !FHE.eint<2>) -> !FHE.eint<2> { - %0 = arith.constant 3 : i3 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<2>, i3) -> (!FHE.eint<2>) - return %1: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 3 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_arg_2bits -program: | - func.func @main(%arg0: !FHE.eint<2>, %arg1: i3) -> !FHE.eint<2> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<2>, i3) -> (!FHE.eint<2>) - return %1: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 3 - - scalar: 3 - outputs: - - scalar: 0 - - inputs: - - scalar: 3 - - scalar: 0 - outputs: - - scalar: 3 - - inputs: - - scalar: 2 - - scalar: 1 - outputs: - - scalar: 1 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_cst_2bits -program: | - func.func @main(%arg0: !FHE.eint<2>) -> !FHE.eint<2> { - %0 = arith.constant 3 : i3 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i3, !FHE.eint<2>) -> (!FHE.eint<2>) - return %1: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 3 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_arg_2bits -program: | - func.func @main(%arg0: i3, %arg1: !FHE.eint<2>) -> !FHE.eint<2> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i3, !FHE.eint<2>) -> (!FHE.eint<2>) - return %1: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 3 - - scalar: 3 - outputs: - - scalar: 0 - - inputs: - - scalar: 3 - - scalar: 0 - outputs: - - scalar: 3 - - inputs: - - scalar: 2 - - scalar: 1 - outputs: - - scalar: 1 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_2bits -program: | - func.func @main(%arg0: !FHE.eint<2>, %arg1: !FHE.eint<2>) -> !FHE.eint<2> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<2>, !FHE.eint<2>) -> (!FHE.eint<2>) - return %1: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 3 - - scalar: 3 - outputs: - - scalar: 0 - - inputs: - - scalar: 3 - - scalar: 0 - outputs: - - scalar: 3 - - inputs: - - scalar: 2 - - scalar: 1 - outputs: - - scalar: 1 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_cst_2bits -program: | - func.func @main(%arg0: !FHE.eint<2>) -> !FHE.eint<2> { - %0 = arith.constant 2 : i3 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<2>, i3) -> (!FHE.eint<2>) - return %1: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - outputs: - - scalar: 2 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_arg_2bits -program: | - func.func @main(%arg0: !FHE.eint<2>, %arg1: i3) -> !FHE.eint<2> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<2>, i3) -> (!FHE.eint<2>) - return %1: !FHE.eint<2> - } -tests: - - inputs: - - scalar: 0 - - scalar: 3 - outputs: - - scalar: 0 - - inputs: - - scalar: 3 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 3 - outputs: - - scalar: 3 - - inputs: - - scalar: 3 - - scalar: 1 - outputs: - - scalar: 3 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- ---- -description: identity_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>) -> !FHE.eint<3> { - return %arg0: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 7 - outputs: - - scalar: 7 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: zero_tensor_3bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<3>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<3>> - return %0: tensor<2x2x4x!FHE.eint<3>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_cst_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>) -> !FHE.eint<3> { - %0 = arith.constant 1 : i4 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<3>, i4) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 6 - outputs: - - scalar: 7 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_arg_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>, %arg1: i4) -> !FHE.eint<3> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<3>, i4) -> (!FHE.eint<3>) - return %0: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 6 - - scalar: 1 - outputs: - - scalar: 7 - - inputs: - - scalar: 7 - - scalar: 0 - outputs: - - scalar: 7 - - inputs: - - scalar: 3 - - scalar: 4 - outputs: - - scalar: 7 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_3_bits -program: | - func.func @main(%arg0: !FHE.eint<3>, %arg1: !FHE.eint<3>) -> !FHE.eint<3> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<3>, !FHE.eint<3>) -> !FHE.eint<3> - return %res: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 3 - - scalar: 4 - outputs: - - scalar: 7 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_cst_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>) -> !FHE.eint<3> { - %0 = arith.constant 7 : i4 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<3>, i4) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 7 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_arg_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>, %arg1: i4) -> !FHE.eint<3> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<3>, i4) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 7 - - scalar: 7 - outputs: - - scalar: 0 - - inputs: - - scalar: 7 - - scalar: 0 - outputs: - - scalar: 7 - - inputs: - - scalar: 6 - - scalar: 3 - outputs: - - scalar: 3 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_cst_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>) -> !FHE.eint<3> { - %0 = arith.constant 7 : i4 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i4, !FHE.eint<3>) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 7 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_arg_3bits -program: | - func.func @main(%arg0: i4, %arg1: !FHE.eint<3>) -> !FHE.eint<3> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i4, !FHE.eint<3>) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 7 - - scalar: 7 - outputs: - - scalar: 0 - - inputs: - - scalar: 7 - - scalar: 0 - outputs: - - scalar: 7 - - inputs: - - scalar: 6 - - scalar: 3 - outputs: - - scalar: 3 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>, %arg1: !FHE.eint<3>) -> !FHE.eint<3> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<3>, !FHE.eint<3>) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 7 - - scalar: 7 - outputs: - - scalar: 0 - - inputs: - - scalar: 7 - - scalar: 0 - outputs: - - scalar: 7 - - inputs: - - scalar: 6 - - scalar: 3 - outputs: - - scalar: 3 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_cst_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>) -> !FHE.eint<3> { - %0 = arith.constant 2 : i4 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<3>, i4) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 3 - outputs: - - scalar: 6 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_arg_3bits -program: | - func.func @main(%arg0: !FHE.eint<3>, %arg1: i4) -> !FHE.eint<3> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<3>, i4) -> (!FHE.eint<3>) - return %1: !FHE.eint<3> - } -tests: - - inputs: - - scalar: 0 - - scalar: 7 - outputs: - - scalar: 0 - - inputs: - - scalar: 7 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 7 - outputs: - - scalar: 7 - - inputs: - - scalar: 7 - - scalar: 1 - outputs: - - scalar: 7 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- ---- -description: identity_4bits -program: | - func.func @main(%arg0: !FHE.eint<4>) -> !FHE.eint<4> { - return %arg0: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 15 - outputs: - - scalar: 15 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: zero_tensor_4bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<4>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<4>> - return %0: tensor<2x2x4x!FHE.eint<4>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_cst_4bits -program: | - func.func @main(%arg0: !FHE.eint<4>) -> !FHE.eint<4> { - %0 = arith.constant 1 : i5 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<4>, i5) -> (!FHE.eint<4>) - return %1: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 14 - outputs: - - scalar: 15 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_arg_4bits -program: | - func.func @main(%arg0: !FHE.eint<4>, %arg1: i5) -> !FHE.eint<4> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<4>, i5) -> (!FHE.eint<4>) - return %0: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 14 - - scalar: 1 - outputs: - - scalar: 15 - - inputs: - - scalar: 15 - - scalar: 0 - outputs: - - scalar: 15 - - inputs: - - scalar: 7 - - scalar: 8 - outputs: - - scalar: 15 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_4_bits -program: | - func.func @main(%arg0: !FHE.eint<4>, %arg1: !FHE.eint<4>) -> !FHE.eint<4> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<4>, !FHE.eint<4>) -> !FHE.eint<4> - return %res: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 7 - - scalar: 8 - outputs: - - scalar: 15 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_cst_4bits -program: | - func.func @main(%arg0: !FHE.eint<4>) -> !FHE.eint<4> { - %0 = arith.constant 15 : i5 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<4>, i5) -> (!FHE.eint<4>) - return %1: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 15 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_arg_4bits -program: | - func.func @main(%arg0: !FHE.eint<4>, %arg1: i5) -> !FHE.eint<4> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<4>, i5) -> (!FHE.eint<4>) - return %1: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 15 - - scalar: 15 - outputs: - - scalar: 0 - - inputs: - - scalar: 15 - - scalar: 0 - outputs: - - scalar: 15 - - inputs: - - scalar: 14 - - scalar: 7 - outputs: - - scalar: 7 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_cst_4bits -program: | - func.func @main(%arg0: !FHE.eint<4>) -> !FHE.eint<4> { - %0 = arith.constant 15 : i5 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i5, !FHE.eint<4>) -> (!FHE.eint<4>) - return %1: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 15 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_arg_4bits -program: | - func.func @main(%arg0: i5, %arg1: !FHE.eint<4>) -> !FHE.eint<4> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i5, !FHE.eint<4>) -> (!FHE.eint<4>) - return %1: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 15 - - scalar: 15 - outputs: - - scalar: 0 - - inputs: - - scalar: 15 - - scalar: 0 - outputs: - - scalar: 15 - - inputs: - - scalar: 14 - - scalar: 7 - outputs: - - scalar: 7 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_4bits -program: | - func.func @main(%arg0: !FHE.eint<4>, %arg1: !FHE.eint<4>) -> !FHE.eint<4> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<4>, !FHE.eint<4>) -> (!FHE.eint<4>) - return %1: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 15 - - scalar: 15 - outputs: - - scalar: 0 - - inputs: - - scalar: 15 - - scalar: 0 - outputs: - - scalar: 15 - - inputs: - - scalar: 14 - - scalar: 7 - outputs: - - scalar: 7 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_cst_4bits -program: | - func.func @main(%arg0: !FHE.eint<4>) -> !FHE.eint<4> { - %0 = arith.constant 2 : i5 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<4>, i5) -> (!FHE.eint<4>) - return %1: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 7 - outputs: - - scalar: 14 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_arg_4bits -program: | - func.func @main(%arg0: !FHE.eint<4>, %arg1: i5) -> !FHE.eint<4> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<4>, i5) -> (!FHE.eint<4>) - return %1: !FHE.eint<4> - } -tests: - - inputs: - - scalar: 0 - - scalar: 15 - outputs: - - scalar: 0 - - inputs: - - scalar: 15 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 15 - outputs: - - scalar: 15 - - inputs: - - scalar: 15 - - scalar: 1 - outputs: - - scalar: 15 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- ---- -description: identity_5bits -program: | - func.func @main(%arg0: !FHE.eint<5>) -> !FHE.eint<5> { - return %arg0: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 31 - outputs: - - scalar: 31 ---- -description: zero_tensor_5bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<5>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<5>> - return %0: tensor<2x2x4x!FHE.eint<5>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_5bits -program: | - func.func @main(%arg0: !FHE.eint<5>) -> !FHE.eint<5> { - %0 = arith.constant 1 : i6 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<5>, i6) -> (!FHE.eint<5>) - return %1: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 30 - outputs: - - scalar: 31 ---- -description: add_eint_int_arg_5bits -program: | - func.func @main(%arg0: !FHE.eint<5>, %arg1: i6) -> !FHE.eint<5> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<5>, i6) -> (!FHE.eint<5>) - return %0: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 30 - - scalar: 1 - outputs: - - scalar: 31 - - inputs: - - scalar: 31 - - scalar: 0 - outputs: - - scalar: 31 - - inputs: - - scalar: 15 - - scalar: 16 - outputs: - - scalar: 31 ---- -description: add_eint_5_bits -program: | - func.func @main(%arg0: !FHE.eint<5>, %arg1: !FHE.eint<5>) -> !FHE.eint<5> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<5>, !FHE.eint<5>) -> !FHE.eint<5> - return %res: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 15 - - scalar: 16 - outputs: - - scalar: 31 ---- -description: sub_eint_int_cst_5bits -program: | - func.func @main(%arg0: !FHE.eint<5>) -> !FHE.eint<5> { - %0 = arith.constant 31 : i6 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<5>, i6) -> (!FHE.eint<5>) - return %1: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 31 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_5bits -program: | - func.func @main(%arg0: !FHE.eint<5>, %arg1: i6) -> !FHE.eint<5> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<5>, i6) -> (!FHE.eint<5>) - return %1: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 31 - - scalar: 31 - outputs: - - scalar: 0 - - inputs: - - scalar: 31 - - scalar: 0 - outputs: - - scalar: 31 - - inputs: - - scalar: 30 - - scalar: 15 - outputs: - - scalar: 15 ---- -description: sub_int_eint_cst_5bits -program: | - func.func @main(%arg0: !FHE.eint<5>) -> !FHE.eint<5> { - %0 = arith.constant 31 : i6 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i6, !FHE.eint<5>) -> (!FHE.eint<5>) - return %1: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 31 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_5bits -program: | - func.func @main(%arg0: i6, %arg1: !FHE.eint<5>) -> !FHE.eint<5> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i6, !FHE.eint<5>) -> (!FHE.eint<5>) - return %1: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 31 - - scalar: 31 - outputs: - - scalar: 0 - - inputs: - - scalar: 31 - - scalar: 0 - outputs: - - scalar: 31 - - inputs: - - scalar: 30 - - scalar: 15 - outputs: - - scalar: 15 ---- -description: sub_eint_5bits -program: | - func.func @main(%arg0: !FHE.eint<5>, %arg1: !FHE.eint<5>) -> !FHE.eint<5> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<5>, !FHE.eint<5>) -> (!FHE.eint<5>) - return %1: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 31 - - scalar: 31 - outputs: - - scalar: 0 - - inputs: - - scalar: 31 - - scalar: 0 - outputs: - - scalar: 31 - - inputs: - - scalar: 30 - - scalar: 15 - outputs: - - scalar: 15 ---- -description: mul_eint_int_cst_5bits -program: | - func.func @main(%arg0: !FHE.eint<5>) -> !FHE.eint<5> { - %0 = arith.constant 2 : i6 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<5>, i6) -> (!FHE.eint<5>) - return %1: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 15 - outputs: - - scalar: 30 ---- -description: mul_eint_int_arg_5bits -program: | - func.func @main(%arg0: !FHE.eint<5>, %arg1: i6) -> !FHE.eint<5> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<5>, i6) -> (!FHE.eint<5>) - return %1: !FHE.eint<5> - } -tests: - - inputs: - - scalar: 0 - - scalar: 31 - outputs: - - scalar: 0 - - inputs: - - scalar: 31 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 31 - outputs: - - scalar: 31 - - inputs: - - scalar: 31 - - scalar: 1 - outputs: - - scalar: 31 ---- ---- -description: identity_6bits -program: | - func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { - return %arg0: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 63 - outputs: - - scalar: 63 ---- -description: zero_tensor_6bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<6>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<6>> - return %0: tensor<2x2x4x!FHE.eint<6>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_6bits -program: | - func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { - %0 = arith.constant 1 : i7 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<6>, i7) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 62 - outputs: - - scalar: 63 ---- -description: add_eint_int_arg_6bits -program: | - func.func @main(%arg0: !FHE.eint<6>, %arg1: i7) -> !FHE.eint<6> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<6>, i7) -> (!FHE.eint<6>) - return %0: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 62 - - scalar: 1 - outputs: - - scalar: 63 - - inputs: - - scalar: 63 - - scalar: 0 - outputs: - - scalar: 63 - - inputs: - - scalar: 31 - - scalar: 32 - outputs: - - scalar: 63 ---- -description: add_eint_6_bits -program: | - func.func @main(%arg0: !FHE.eint<6>, %arg1: !FHE.eint<6>) -> !FHE.eint<6> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<6>, !FHE.eint<6>) -> !FHE.eint<6> - return %res: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 31 - - scalar: 32 - outputs: - - scalar: 63 ---- -description: sub_eint_int_cst_6bits -program: | - func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { - %0 = arith.constant 63 : i7 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<6>, i7) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 63 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_6bits -program: | - func.func @main(%arg0: !FHE.eint<6>, %arg1: i7) -> !FHE.eint<6> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<6>, i7) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 63 - - scalar: 63 - outputs: - - scalar: 0 - - inputs: - - scalar: 63 - - scalar: 0 - outputs: - - scalar: 63 - - inputs: - - scalar: 62 - - scalar: 31 - outputs: - - scalar: 31 ---- -description: sub_int_eint_cst_6bits -program: | - func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { - %0 = arith.constant 63 : i7 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i7, !FHE.eint<6>) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 63 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_6bits -program: | - func.func @main(%arg0: i7, %arg1: !FHE.eint<6>) -> !FHE.eint<6> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i7, !FHE.eint<6>) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 63 - - scalar: 63 - outputs: - - scalar: 0 - - inputs: - - scalar: 63 - - scalar: 0 - outputs: - - scalar: 63 - - inputs: - - scalar: 62 - - scalar: 31 - outputs: - - scalar: 31 ---- -description: sub_eint_6bits -program: | - func.func @main(%arg0: !FHE.eint<6>, %arg1: !FHE.eint<6>) -> !FHE.eint<6> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<6>, !FHE.eint<6>) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 63 - - scalar: 63 - outputs: - - scalar: 0 - - inputs: - - scalar: 63 - - scalar: 0 - outputs: - - scalar: 63 - - inputs: - - scalar: 62 - - scalar: 31 - outputs: - - scalar: 31 ---- -description: mul_eint_int_cst_6bits -program: | - func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { - %0 = arith.constant 2 : i7 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<6>, i7) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 31 - outputs: - - scalar: 62 ---- -description: mul_eint_int_arg_6bits -program: | - func.func @main(%arg0: !FHE.eint<6>, %arg1: i7) -> !FHE.eint<6> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<6>, i7) -> (!FHE.eint<6>) - return %1: !FHE.eint<6> - } -tests: - - inputs: - - scalar: 0 - - scalar: 63 - outputs: - - scalar: 0 - - inputs: - - scalar: 63 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 63 - outputs: - - scalar: 63 - - inputs: - - scalar: 63 - - scalar: 1 - outputs: - - scalar: 63 ---- ---- -description: identity_7bits -program: | - func.func @main(%arg0: !FHE.eint<7>) -> !FHE.eint<7> { - return %arg0: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 127 - outputs: - - scalar: 127 ---- -description: zero_tensor_7bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<7>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<7>> - return %0: tensor<2x2x4x!FHE.eint<7>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_7bits -program: | - func.func @main(%arg0: !FHE.eint<7>) -> !FHE.eint<7> { - %0 = arith.constant 1 : i8 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<7>, i8) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 126 - outputs: - - scalar: 127 ---- -description: add_eint_int_arg_7bits -program: | - func.func @main(%arg0: !FHE.eint<7>, %arg1: i8) -> !FHE.eint<7> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<7>, i8) -> (!FHE.eint<7>) - return %0: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 126 - - scalar: 1 - outputs: - - scalar: 127 - - inputs: - - scalar: 127 - - scalar: 0 - outputs: - - scalar: 127 - - inputs: - - scalar: 63 - - scalar: 64 - outputs: - - scalar: 127 ---- -description: add_eint_7_bits -program: | - func.func @main(%arg0: !FHE.eint<7>, %arg1: !FHE.eint<7>) -> !FHE.eint<7> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<7>, !FHE.eint<7>) -> !FHE.eint<7> - return %res: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 63 - - scalar: 64 - outputs: - - scalar: 127 ---- -description: sub_eint_int_cst_7bits -program: | - func.func @main(%arg0: !FHE.eint<7>) -> !FHE.eint<7> { - %0 = arith.constant 127 : i8 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<7>, i8) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 127 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_7bits -program: | - func.func @main(%arg0: !FHE.eint<7>, %arg1: i8) -> !FHE.eint<7> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<7>, i8) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 127 - - scalar: 127 - outputs: - - scalar: 0 - - inputs: - - scalar: 127 - - scalar: 0 - outputs: - - scalar: 127 - - inputs: - - scalar: 126 - - scalar: 63 - outputs: - - scalar: 63 ---- -description: sub_int_eint_cst_7bits -program: | - func.func @main(%arg0: !FHE.eint<7>) -> !FHE.eint<7> { - %0 = arith.constant 127 : i8 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i8, !FHE.eint<7>) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 127 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_7bits -program: | - func.func @main(%arg0: i8, %arg1: !FHE.eint<7>) -> !FHE.eint<7> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i8, !FHE.eint<7>) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 127 - - scalar: 127 - outputs: - - scalar: 0 - - inputs: - - scalar: 127 - - scalar: 0 - outputs: - - scalar: 127 - - inputs: - - scalar: 126 - - scalar: 63 - outputs: - - scalar: 63 ---- -description: sub_eint_7bits -program: | - func.func @main(%arg0: !FHE.eint<7>, %arg1: !FHE.eint<7>) -> !FHE.eint<7> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<7>, !FHE.eint<7>) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 127 - - scalar: 127 - outputs: - - scalar: 0 - - inputs: - - scalar: 127 - - scalar: 0 - outputs: - - scalar: 127 - - inputs: - - scalar: 126 - - scalar: 63 - outputs: - - scalar: 63 ---- -description: mul_eint_int_cst_7bits -program: | - func.func @main(%arg0: !FHE.eint<7>) -> !FHE.eint<7> { - %0 = arith.constant 2 : i8 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<7>, i8) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 63 - outputs: - - scalar: 126 ---- -description: mul_eint_int_arg_7bits -program: | - func.func @main(%arg0: !FHE.eint<7>, %arg1: i8) -> !FHE.eint<7> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<7>, i8) -> (!FHE.eint<7>) - return %1: !FHE.eint<7> - } -tests: - - inputs: - - scalar: 0 - - scalar: 127 - outputs: - - scalar: 0 - - inputs: - - scalar: 127 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 127 - outputs: - - scalar: 127 - - inputs: - - scalar: 127 - - scalar: 1 - outputs: - - scalar: 127 ---- ---- -description: identity_8bits -program: | - func.func @main(%arg0: !FHE.eint<8>) -> !FHE.eint<8> { - return %arg0: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 255 - outputs: - - scalar: 255 ---- -description: zero_tensor_8bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<8>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<8>> - return %0: tensor<2x2x4x!FHE.eint<8>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_8bits -program: | - func.func @main(%arg0: !FHE.eint<8>) -> !FHE.eint<8> { - %0 = arith.constant 1 : i9 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<8>, i9) -> (!FHE.eint<8>) - return %1: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 254 - outputs: - - scalar: 255 ---- -description: add_eint_int_arg_8bits -program: | - func.func @main(%arg0: !FHE.eint<8>, %arg1: i9) -> !FHE.eint<8> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<8>, i9) -> (!FHE.eint<8>) - return %0: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 254 - - scalar: 1 - outputs: - - scalar: 255 - - inputs: - - scalar: 255 - - scalar: 0 - outputs: - - scalar: 255 - - inputs: - - scalar: 127 - - scalar: 128 - outputs: - - scalar: 255 ---- -description: add_eint_8_bits -program: | - func.func @main(%arg0: !FHE.eint<8>, %arg1: !FHE.eint<8>) -> !FHE.eint<8> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<8>, !FHE.eint<8>) -> !FHE.eint<8> - return %res: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 127 - - scalar: 128 - outputs: - - scalar: 255 ---- -description: sub_eint_int_cst_8bits -program: | - func.func @main(%arg0: !FHE.eint<8>) -> !FHE.eint<8> { - %0 = arith.constant 255 : i9 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<8>, i9) -> (!FHE.eint<8>) - return %1: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 255 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_8bits -program: | - func.func @main(%arg0: !FHE.eint<8>, %arg1: i9) -> !FHE.eint<8> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<8>, i9) -> (!FHE.eint<8>) - return %1: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 255 - - scalar: 255 - outputs: - - scalar: 0 - - inputs: - - scalar: 255 - - scalar: 0 - outputs: - - scalar: 255 - - inputs: - - scalar: 254 - - scalar: 127 - outputs: - - scalar: 127 ---- -description: sub_int_eint_cst_8bits -program: | - func.func @main(%arg0: !FHE.eint<8>) -> !FHE.eint<8> { - %0 = arith.constant 255 : i9 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i9, !FHE.eint<8>) -> (!FHE.eint<8>) - return %1: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 255 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_8bits -program: | - func.func @main(%arg0: i9, %arg1: !FHE.eint<8>) -> !FHE.eint<8> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i9, !FHE.eint<8>) -> (!FHE.eint<8>) - return %1: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 255 - - scalar: 255 - outputs: - - scalar: 0 - - inputs: - - scalar: 255 - - scalar: 0 - outputs: - - scalar: 255 - - inputs: - - scalar: 254 - - scalar: 127 - outputs: - - scalar: 127 ---- -description: sub_eint_8bits -program: | - func.func @main(%arg0: !FHE.eint<8>, %arg1: !FHE.eint<8>) -> !FHE.eint<8> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<8>, !FHE.eint<8>) -> (!FHE.eint<8>) - return %1: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 255 - - scalar: 255 - outputs: - - scalar: 0 - - inputs: - - scalar: 255 - - scalar: 0 - outputs: - - scalar: 255 - - inputs: - - scalar: 254 - - scalar: 127 - outputs: - - scalar: 127 ---- -description: mul_eint_int_cst_8bits -program: | - func.func @main(%arg0: !FHE.eint<8>) -> !FHE.eint<8> { - %0 = arith.constant 2 : i9 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<8>, i9) -> (!FHE.eint<8>) - return %1: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 127 - outputs: - - scalar: 254 ---- -description: mul_eint_int_arg_8bits -program: | - func.func @main(%arg0: !FHE.eint<8>, %arg1: i9) -> !FHE.eint<8> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<8>, i9) -> (!FHE.eint<8>) - return %1: !FHE.eint<8> - } -tests: - - inputs: - - scalar: 0 - - scalar: 255 - outputs: - - scalar: 0 - - inputs: - - scalar: 255 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 255 - outputs: - - scalar: 255 - - inputs: - - scalar: 255 - - scalar: 1 - outputs: - - scalar: 255 ---- ---- -description: identity_9bits -program: | - func.func @main(%arg0: !FHE.eint<9>) -> !FHE.eint<9> { - return %arg0: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 511 - outputs: - - scalar: 511 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: zero_tensor_9bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<9>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<9>> - return %0: tensor<2x2x4x!FHE.eint<9>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_cst_9bits -program: | - func.func @main(%arg0: !FHE.eint<9>) -> !FHE.eint<9> { - %0 = arith.constant 1 : i10 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<9>, i10) -> (!FHE.eint<9>) - return %1: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 510 - outputs: - - scalar: 511 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_arg_9bits -program: | - func.func @main(%arg0: !FHE.eint<9>, %arg1: i10) -> !FHE.eint<9> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<9>, i10) -> (!FHE.eint<9>) - return %0: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 510 - - scalar: 1 - outputs: - - scalar: 511 - - inputs: - - scalar: 511 - - scalar: 0 - outputs: - - scalar: 511 - - inputs: - - scalar: 255 - - scalar: 256 - outputs: - - scalar: 511 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_9_bits -program: | - func.func @main(%arg0: !FHE.eint<9>, %arg1: !FHE.eint<9>) -> !FHE.eint<9> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<9>, !FHE.eint<9>) -> !FHE.eint<9> - return %res: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 255 - - scalar: 256 - outputs: - - scalar: 511 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_cst_9bits -program: | - func.func @main(%arg0: !FHE.eint<9>) -> !FHE.eint<9> { - %0 = arith.constant 511 : i10 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<9>, i10) -> (!FHE.eint<9>) - return %1: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 511 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_arg_9bits -program: | - func.func @main(%arg0: !FHE.eint<9>, %arg1: i10) -> !FHE.eint<9> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<9>, i10) -> (!FHE.eint<9>) - return %1: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 511 - - scalar: 511 - outputs: - - scalar: 0 - - inputs: - - scalar: 511 - - scalar: 0 - outputs: - - scalar: 511 - - inputs: - - scalar: 510 - - scalar: 255 - outputs: - - scalar: 255 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_cst_9bits -program: | - func.func @main(%arg0: !FHE.eint<9>) -> !FHE.eint<9> { - %0 = arith.constant 511 : i10 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i10, !FHE.eint<9>) -> (!FHE.eint<9>) - return %1: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 511 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_arg_9bits -program: | - func.func @main(%arg0: i10, %arg1: !FHE.eint<9>) -> !FHE.eint<9> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i10, !FHE.eint<9>) -> (!FHE.eint<9>) - return %1: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 511 - - scalar: 511 - outputs: - - scalar: 0 - - inputs: - - scalar: 511 - - scalar: 0 - outputs: - - scalar: 511 - - inputs: - - scalar: 510 - - scalar: 255 - outputs: - - scalar: 255 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_9bits -program: | - func.func @main(%arg0: !FHE.eint<9>, %arg1: !FHE.eint<9>) -> !FHE.eint<9> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<9>, !FHE.eint<9>) -> (!FHE.eint<9>) - return %1: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 511 - - scalar: 511 - outputs: - - scalar: 0 - - inputs: - - scalar: 511 - - scalar: 0 - outputs: - - scalar: 511 - - inputs: - - scalar: 510 - - scalar: 255 - outputs: - - scalar: 255 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_cst_9bits -program: | - func.func @main(%arg0: !FHE.eint<9>) -> !FHE.eint<9> { - %0 = arith.constant 2 : i10 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<9>, i10) -> (!FHE.eint<9>) - return %1: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 255 - outputs: - - scalar: 510 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_arg_9bits -program: | - func.func @main(%arg0: !FHE.eint<9>, %arg1: i10) -> !FHE.eint<9> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<9>, i10) -> (!FHE.eint<9>) - return %1: !FHE.eint<9> - } -tests: - - inputs: - - scalar: 0 - - scalar: 511 - outputs: - - scalar: 0 - - inputs: - - scalar: 511 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 511 - outputs: - - scalar: 511 - - inputs: - - scalar: 511 - - scalar: 1 - outputs: - - scalar: 511 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- ---- -description: identity_10bits -program: | - func.func @main(%arg0: !FHE.eint<10>) -> !FHE.eint<10> { - return %arg0: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 1023 - outputs: - - scalar: 1023 ---- -description: zero_tensor_10bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<10>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<10>> - return %0: tensor<2x2x4x!FHE.eint<10>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_10bits -program: | - func.func @main(%arg0: !FHE.eint<10>) -> !FHE.eint<10> { - %0 = arith.constant 1 : i11 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<10>, i11) -> (!FHE.eint<10>) - return %1: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 1022 - outputs: - - scalar: 1023 ---- -description: add_eint_int_arg_10bits -program: | - func.func @main(%arg0: !FHE.eint<10>, %arg1: i11) -> !FHE.eint<10> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<10>, i11) -> (!FHE.eint<10>) - return %0: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 1022 - - scalar: 1 - outputs: - - scalar: 1023 - - inputs: - - scalar: 1023 - - scalar: 0 - outputs: - - scalar: 1023 - - inputs: - - scalar: 511 - - scalar: 512 - outputs: - - scalar: 1023 ---- -description: add_eint_10_bits -program: | - func.func @main(%arg0: !FHE.eint<10>, %arg1: !FHE.eint<10>) -> !FHE.eint<10> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<10>, !FHE.eint<10>) -> !FHE.eint<10> - return %res: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 511 - - scalar: 512 - outputs: - - scalar: 1023 ---- -description: sub_eint_int_cst_10bits -program: | - func.func @main(%arg0: !FHE.eint<10>) -> !FHE.eint<10> { - %0 = arith.constant 1023 : i11 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<10>, i11) -> (!FHE.eint<10>) - return %1: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 1023 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_10bits -program: | - func.func @main(%arg0: !FHE.eint<10>, %arg1: i11) -> !FHE.eint<10> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<10>, i11) -> (!FHE.eint<10>) - return %1: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 1023 - - scalar: 1023 - outputs: - - scalar: 0 - - inputs: - - scalar: 1023 - - scalar: 0 - outputs: - - scalar: 1023 - - inputs: - - scalar: 1022 - - scalar: 511 - outputs: - - scalar: 511 ---- -description: sub_int_eint_cst_10bits -program: | - func.func @main(%arg0: !FHE.eint<10>) -> !FHE.eint<10> { - %0 = arith.constant 1023 : i11 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i11, !FHE.eint<10>) -> (!FHE.eint<10>) - return %1: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 1023 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_10bits -program: | - func.func @main(%arg0: i11, %arg1: !FHE.eint<10>) -> !FHE.eint<10> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i11, !FHE.eint<10>) -> (!FHE.eint<10>) - return %1: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 1023 - - scalar: 1023 - outputs: - - scalar: 0 - - inputs: - - scalar: 1023 - - scalar: 0 - outputs: - - scalar: 1023 - - inputs: - - scalar: 1022 - - scalar: 511 - outputs: - - scalar: 511 ---- -description: sub_eint_10bits -program: | - func.func @main(%arg0: !FHE.eint<10>, %arg1: !FHE.eint<10>) -> !FHE.eint<10> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<10>, !FHE.eint<10>) -> (!FHE.eint<10>) - return %1: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 1023 - - scalar: 1023 - outputs: - - scalar: 0 - - inputs: - - scalar: 1023 - - scalar: 0 - outputs: - - scalar: 1023 - - inputs: - - scalar: 1022 - - scalar: 511 - outputs: - - scalar: 511 ---- -description: mul_eint_int_cst_10bits -program: | - func.func @main(%arg0: !FHE.eint<10>) -> !FHE.eint<10> { - %0 = arith.constant 2 : i11 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<10>, i11) -> (!FHE.eint<10>) - return %1: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 511 - outputs: - - scalar: 1022 ---- -description: mul_eint_int_arg_10bits -program: | - func.func @main(%arg0: !FHE.eint<10>, %arg1: i11) -> !FHE.eint<10> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<10>, i11) -> (!FHE.eint<10>) - return %1: !FHE.eint<10> - } -tests: - - inputs: - - scalar: 0 - - scalar: 1023 - outputs: - - scalar: 0 - - inputs: - - scalar: 1023 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 1023 - outputs: - - scalar: 1023 - - inputs: - - scalar: 1023 - - scalar: 1 - outputs: - - scalar: 1023 ---- ---- -description: identity_11bits -program: | - func.func @main(%arg0: !FHE.eint<11>) -> !FHE.eint<11> { - return %arg0: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 2047 - outputs: - - scalar: 2047 ---- -description: zero_tensor_11bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<11>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<11>> - return %0: tensor<2x2x4x!FHE.eint<11>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_11bits -program: | - func.func @main(%arg0: !FHE.eint<11>) -> !FHE.eint<11> { - %0 = arith.constant 1 : i12 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<11>, i12) -> (!FHE.eint<11>) - return %1: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 2046 - outputs: - - scalar: 2047 ---- -description: add_eint_int_arg_11bits -program: | - func.func @main(%arg0: !FHE.eint<11>, %arg1: i12) -> !FHE.eint<11> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<11>, i12) -> (!FHE.eint<11>) - return %0: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 2046 - - scalar: 1 - outputs: - - scalar: 2047 - - inputs: - - scalar: 2047 - - scalar: 0 - outputs: - - scalar: 2047 - - inputs: - - scalar: 1023 - - scalar: 1024 - outputs: - - scalar: 2047 ---- -description: add_eint_11_bits -program: | - func.func @main(%arg0: !FHE.eint<11>, %arg1: !FHE.eint<11>) -> !FHE.eint<11> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<11>, !FHE.eint<11>) -> !FHE.eint<11> - return %res: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 1023 - - scalar: 1024 - outputs: - - scalar: 2047 ---- -description: sub_eint_int_cst_11bits -program: | - func.func @main(%arg0: !FHE.eint<11>) -> !FHE.eint<11> { - %0 = arith.constant 2047 : i12 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<11>, i12) -> (!FHE.eint<11>) - return %1: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 2047 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_11bits -program: | - func.func @main(%arg0: !FHE.eint<11>, %arg1: i12) -> !FHE.eint<11> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<11>, i12) -> (!FHE.eint<11>) - return %1: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 2047 - - scalar: 2047 - outputs: - - scalar: 0 - - inputs: - - scalar: 2047 - - scalar: 0 - outputs: - - scalar: 2047 - - inputs: - - scalar: 2046 - - scalar: 1023 - outputs: - - scalar: 1023 ---- -description: sub_int_eint_cst_11bits -program: | - func.func @main(%arg0: !FHE.eint<11>) -> !FHE.eint<11> { - %0 = arith.constant 2047 : i12 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i12, !FHE.eint<11>) -> (!FHE.eint<11>) - return %1: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 2047 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_11bits -program: | - func.func @main(%arg0: i12, %arg1: !FHE.eint<11>) -> !FHE.eint<11> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i12, !FHE.eint<11>) -> (!FHE.eint<11>) - return %1: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 2047 - - scalar: 2047 - outputs: - - scalar: 0 - - inputs: - - scalar: 2047 - - scalar: 0 - outputs: - - scalar: 2047 - - inputs: - - scalar: 2046 - - scalar: 1023 - outputs: - - scalar: 1023 ---- -description: sub_eint_11bits -program: | - func.func @main(%arg0: !FHE.eint<11>, %arg1: !FHE.eint<11>) -> !FHE.eint<11> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<11>, !FHE.eint<11>) -> (!FHE.eint<11>) - return %1: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 2047 - - scalar: 2047 - outputs: - - scalar: 0 - - inputs: - - scalar: 2047 - - scalar: 0 - outputs: - - scalar: 2047 - - inputs: - - scalar: 2046 - - scalar: 1023 - outputs: - - scalar: 1023 ---- -description: mul_eint_int_cst_11bits -program: | - func.func @main(%arg0: !FHE.eint<11>) -> !FHE.eint<11> { - %0 = arith.constant 2 : i12 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<11>, i12) -> (!FHE.eint<11>) - return %1: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1023 - outputs: - - scalar: 2046 ---- -description: mul_eint_int_arg_11bits -program: | - func.func @main(%arg0: !FHE.eint<11>, %arg1: i12) -> !FHE.eint<11> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<11>, i12) -> (!FHE.eint<11>) - return %1: !FHE.eint<11> - } -tests: - - inputs: - - scalar: 0 - - scalar: 2047 - outputs: - - scalar: 0 - - inputs: - - scalar: 2047 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 2047 - outputs: - - scalar: 2047 - - inputs: - - scalar: 2047 - - scalar: 1 - outputs: - - scalar: 2047 ---- ---- -description: identity_12bits -program: | - func.func @main(%arg0: !FHE.eint<12>) -> !FHE.eint<12> { - return %arg0: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 4095 - outputs: - - scalar: 4095 ---- -description: zero_tensor_12bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<12>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<12>> - return %0: tensor<2x2x4x!FHE.eint<12>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_12bits -program: | - func.func @main(%arg0: !FHE.eint<12>) -> !FHE.eint<12> { - %0 = arith.constant 1 : i13 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<12>, i13) -> (!FHE.eint<12>) - return %1: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 4094 - outputs: - - scalar: 4095 ---- -description: add_eint_int_arg_12bits -program: | - func.func @main(%arg0: !FHE.eint<12>, %arg1: i13) -> !FHE.eint<12> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<12>, i13) -> (!FHE.eint<12>) - return %0: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 4094 - - scalar: 1 - outputs: - - scalar: 4095 - - inputs: - - scalar: 4095 - - scalar: 0 - outputs: - - scalar: 4095 - - inputs: - - scalar: 2047 - - scalar: 2048 - outputs: - - scalar: 4095 ---- -description: add_eint_12_bits -program: | - func.func @main(%arg0: !FHE.eint<12>, %arg1: !FHE.eint<12>) -> !FHE.eint<12> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<12>, !FHE.eint<12>) -> !FHE.eint<12> - return %res: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 2047 - - scalar: 2048 - outputs: - - scalar: 4095 ---- -description: sub_eint_int_cst_12bits -program: | - func.func @main(%arg0: !FHE.eint<12>) -> !FHE.eint<12> { - %0 = arith.constant 4095 : i13 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<12>, i13) -> (!FHE.eint<12>) - return %1: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 4095 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_12bits -program: | - func.func @main(%arg0: !FHE.eint<12>, %arg1: i13) -> !FHE.eint<12> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<12>, i13) -> (!FHE.eint<12>) - return %1: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 4095 - - scalar: 4095 - outputs: - - scalar: 0 - - inputs: - - scalar: 4095 - - scalar: 0 - outputs: - - scalar: 4095 - - inputs: - - scalar: 4094 - - scalar: 2047 - outputs: - - scalar: 2047 ---- -description: sub_int_eint_cst_12bits -program: | - func.func @main(%arg0: !FHE.eint<12>) -> !FHE.eint<12> { - %0 = arith.constant 4095 : i13 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i13, !FHE.eint<12>) -> (!FHE.eint<12>) - return %1: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 4095 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_12bits -program: | - func.func @main(%arg0: i13, %arg1: !FHE.eint<12>) -> !FHE.eint<12> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i13, !FHE.eint<12>) -> (!FHE.eint<12>) - return %1: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 4095 - - scalar: 4095 - outputs: - - scalar: 0 - - inputs: - - scalar: 4095 - - scalar: 0 - outputs: - - scalar: 4095 - - inputs: - - scalar: 4094 - - scalar: 2047 - outputs: - - scalar: 2047 ---- -description: sub_eint_12bits -program: | - func.func @main(%arg0: !FHE.eint<12>, %arg1: !FHE.eint<12>) -> !FHE.eint<12> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<12>, !FHE.eint<12>) -> (!FHE.eint<12>) - return %1: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 4095 - - scalar: 4095 - outputs: - - scalar: 0 - - inputs: - - scalar: 4095 - - scalar: 0 - outputs: - - scalar: 4095 - - inputs: - - scalar: 4094 - - scalar: 2047 - outputs: - - scalar: 2047 ---- -description: mul_eint_int_cst_12bits -program: | - func.func @main(%arg0: !FHE.eint<12>) -> !FHE.eint<12> { - %0 = arith.constant 2 : i13 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<12>, i13) -> (!FHE.eint<12>) - return %1: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 2047 - outputs: - - scalar: 4094 ---- -description: mul_eint_int_arg_12bits -program: | - func.func @main(%arg0: !FHE.eint<12>, %arg1: i13) -> !FHE.eint<12> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<12>, i13) -> (!FHE.eint<12>) - return %1: !FHE.eint<12> - } -tests: - - inputs: - - scalar: 0 - - scalar: 4095 - outputs: - - scalar: 0 - - inputs: - - scalar: 4095 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 4095 - outputs: - - scalar: 4095 - - inputs: - - scalar: 4095 - - scalar: 1 - outputs: - - scalar: 4095 ---- ---- -description: identity_13bits -program: | - func.func @main(%arg0: !FHE.eint<13>) -> !FHE.eint<13> { - return %arg0: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 8191 - outputs: - - scalar: 8191 ---- -description: zero_tensor_13bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<13>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<13>> - return %0: tensor<2x2x4x!FHE.eint<13>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_13bits -program: | - func.func @main(%arg0: !FHE.eint<13>) -> !FHE.eint<13> { - %0 = arith.constant 1 : i14 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<13>, i14) -> (!FHE.eint<13>) - return %1: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 8190 - outputs: - - scalar: 8191 ---- -description: add_eint_int_arg_13bits -program: | - func.func @main(%arg0: !FHE.eint<13>, %arg1: i14) -> !FHE.eint<13> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<13>, i14) -> (!FHE.eint<13>) - return %0: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 8190 - - scalar: 1 - outputs: - - scalar: 8191 - - inputs: - - scalar: 8191 - - scalar: 0 - outputs: - - scalar: 8191 - - inputs: - - scalar: 4095 - - scalar: 4096 - outputs: - - scalar: 8191 ---- -description: add_eint_13_bits -program: | - func.func @main(%arg0: !FHE.eint<13>, %arg1: !FHE.eint<13>) -> !FHE.eint<13> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<13>, !FHE.eint<13>) -> !FHE.eint<13> - return %res: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 4095 - - scalar: 4096 - outputs: - - scalar: 8191 ---- -description: sub_eint_int_cst_13bits -program: | - func.func @main(%arg0: !FHE.eint<13>) -> !FHE.eint<13> { - %0 = arith.constant 8191 : i14 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<13>, i14) -> (!FHE.eint<13>) - return %1: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 8191 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_13bits -program: | - func.func @main(%arg0: !FHE.eint<13>, %arg1: i14) -> !FHE.eint<13> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<13>, i14) -> (!FHE.eint<13>) - return %1: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 8191 - - scalar: 8191 - outputs: - - scalar: 0 - - inputs: - - scalar: 8191 - - scalar: 0 - outputs: - - scalar: 8191 - - inputs: - - scalar: 8190 - - scalar: 4095 - outputs: - - scalar: 4095 ---- -description: sub_int_eint_cst_13bits -program: | - func.func @main(%arg0: !FHE.eint<13>) -> !FHE.eint<13> { - %0 = arith.constant 8191 : i14 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i14, !FHE.eint<13>) -> (!FHE.eint<13>) - return %1: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 8191 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_13bits -program: | - func.func @main(%arg0: i14, %arg1: !FHE.eint<13>) -> !FHE.eint<13> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i14, !FHE.eint<13>) -> (!FHE.eint<13>) - return %1: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 8191 - - scalar: 8191 - outputs: - - scalar: 0 - - inputs: - - scalar: 8191 - - scalar: 0 - outputs: - - scalar: 8191 - - inputs: - - scalar: 8190 - - scalar: 4095 - outputs: - - scalar: 4095 ---- -description: sub_eint_13bits -program: | - func.func @main(%arg0: !FHE.eint<13>, %arg1: !FHE.eint<13>) -> !FHE.eint<13> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<13>, !FHE.eint<13>) -> (!FHE.eint<13>) - return %1: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 8191 - - scalar: 8191 - outputs: - - scalar: 0 - - inputs: - - scalar: 8191 - - scalar: 0 - outputs: - - scalar: 8191 - - inputs: - - scalar: 8190 - - scalar: 4095 - outputs: - - scalar: 4095 ---- -description: mul_eint_int_cst_13bits -program: | - func.func @main(%arg0: !FHE.eint<13>) -> !FHE.eint<13> { - %0 = arith.constant 2 : i14 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<13>, i14) -> (!FHE.eint<13>) - return %1: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 4095 - outputs: - - scalar: 8190 ---- -description: mul_eint_int_arg_13bits -program: | - func.func @main(%arg0: !FHE.eint<13>, %arg1: i14) -> !FHE.eint<13> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<13>, i14) -> (!FHE.eint<13>) - return %1: !FHE.eint<13> - } -tests: - - inputs: - - scalar: 0 - - scalar: 8191 - outputs: - - scalar: 0 - - inputs: - - scalar: 8191 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 8191 - outputs: - - scalar: 8191 - - inputs: - - scalar: 8191 - - scalar: 1 - outputs: - - scalar: 8191 ---- ---- -description: identity_14bits -program: | - func.func @main(%arg0: !FHE.eint<14>) -> !FHE.eint<14> { - return %arg0: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 16383 - outputs: - - scalar: 16383 ---- -description: zero_tensor_14bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<14>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<14>> - return %0: tensor<2x2x4x!FHE.eint<14>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_14bits -program: | - func.func @main(%arg0: !FHE.eint<14>) -> !FHE.eint<14> { - %0 = arith.constant 1 : i15 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<14>, i15) -> (!FHE.eint<14>) - return %1: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 16382 - outputs: - - scalar: 16383 ---- -description: add_eint_int_arg_14bits -program: | - func.func @main(%arg0: !FHE.eint<14>, %arg1: i15) -> !FHE.eint<14> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<14>, i15) -> (!FHE.eint<14>) - return %0: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 16382 - - scalar: 1 - outputs: - - scalar: 16383 - - inputs: - - scalar: 16383 - - scalar: 0 - outputs: - - scalar: 16383 - - inputs: - - scalar: 8191 - - scalar: 8192 - outputs: - - scalar: 16383 ---- -description: add_eint_14_bits -program: | - func.func @main(%arg0: !FHE.eint<14>, %arg1: !FHE.eint<14>) -> !FHE.eint<14> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<14>, !FHE.eint<14>) -> !FHE.eint<14> - return %res: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 8191 - - scalar: 8192 - outputs: - - scalar: 16383 ---- -description: sub_eint_int_cst_14bits -program: | - func.func @main(%arg0: !FHE.eint<14>) -> !FHE.eint<14> { - %0 = arith.constant 16383 : i15 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<14>, i15) -> (!FHE.eint<14>) - return %1: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 16383 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_14bits -program: | - func.func @main(%arg0: !FHE.eint<14>, %arg1: i15) -> !FHE.eint<14> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<14>, i15) -> (!FHE.eint<14>) - return %1: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 16383 - - scalar: 16383 - outputs: - - scalar: 0 - - inputs: - - scalar: 16383 - - scalar: 0 - outputs: - - scalar: 16383 - - inputs: - - scalar: 16382 - - scalar: 8191 - outputs: - - scalar: 8191 ---- -description: sub_int_eint_cst_14bits -program: | - func.func @main(%arg0: !FHE.eint<14>) -> !FHE.eint<14> { - %0 = arith.constant 16383 : i15 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i15, !FHE.eint<14>) -> (!FHE.eint<14>) - return %1: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 16383 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_14bits -program: | - func.func @main(%arg0: i15, %arg1: !FHE.eint<14>) -> !FHE.eint<14> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i15, !FHE.eint<14>) -> (!FHE.eint<14>) - return %1: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 16383 - - scalar: 16383 - outputs: - - scalar: 0 - - inputs: - - scalar: 16383 - - scalar: 0 - outputs: - - scalar: 16383 - - inputs: - - scalar: 16382 - - scalar: 8191 - outputs: - - scalar: 8191 ---- -description: sub_eint_14bits -program: | - func.func @main(%arg0: !FHE.eint<14>, %arg1: !FHE.eint<14>) -> !FHE.eint<14> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<14>, !FHE.eint<14>) -> (!FHE.eint<14>) - return %1: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 16383 - - scalar: 16383 - outputs: - - scalar: 0 - - inputs: - - scalar: 16383 - - scalar: 0 - outputs: - - scalar: 16383 - - inputs: - - scalar: 16382 - - scalar: 8191 - outputs: - - scalar: 8191 ---- -description: mul_eint_int_cst_14bits -program: | - func.func @main(%arg0: !FHE.eint<14>) -> !FHE.eint<14> { - %0 = arith.constant 2 : i15 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<14>, i15) -> (!FHE.eint<14>) - return %1: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 8191 - outputs: - - scalar: 16382 ---- -description: mul_eint_int_arg_14bits -program: | - func.func @main(%arg0: !FHE.eint<14>, %arg1: i15) -> !FHE.eint<14> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<14>, i15) -> (!FHE.eint<14>) - return %1: !FHE.eint<14> - } -tests: - - inputs: - - scalar: 0 - - scalar: 16383 - outputs: - - scalar: 0 - - inputs: - - scalar: 16383 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 16383 - outputs: - - scalar: 16383 - - inputs: - - scalar: 16383 - - scalar: 1 - outputs: - - scalar: 16383 ---- ---- -description: identity_15bits -program: | - func.func @main(%arg0: !FHE.eint<15>) -> !FHE.eint<15> { - return %arg0: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 32767 - outputs: - - scalar: 32767 ---- -description: zero_tensor_15bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<15>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<15>> - return %0: tensor<2x2x4x!FHE.eint<15>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_15bits -program: | - func.func @main(%arg0: !FHE.eint<15>) -> !FHE.eint<15> { - %0 = arith.constant 1 : i16 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<15>, i16) -> (!FHE.eint<15>) - return %1: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 32766 - outputs: - - scalar: 32767 ---- -description: add_eint_int_arg_15bits -program: | - func.func @main(%arg0: !FHE.eint<15>, %arg1: i16) -> !FHE.eint<15> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<15>, i16) -> (!FHE.eint<15>) - return %0: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 32766 - - scalar: 1 - outputs: - - scalar: 32767 - - inputs: - - scalar: 32767 - - scalar: 0 - outputs: - - scalar: 32767 - - inputs: - - scalar: 16383 - - scalar: 16384 - outputs: - - scalar: 32767 ---- -description: add_eint_15_bits -program: | - func.func @main(%arg0: !FHE.eint<15>, %arg1: !FHE.eint<15>) -> !FHE.eint<15> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<15>, !FHE.eint<15>) -> !FHE.eint<15> - return %res: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 16383 - - scalar: 16384 - outputs: - - scalar: 32767 ---- -description: sub_eint_int_cst_15bits -program: | - func.func @main(%arg0: !FHE.eint<15>) -> !FHE.eint<15> { - %0 = arith.constant 32767 : i16 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<15>, i16) -> (!FHE.eint<15>) - return %1: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 32767 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_15bits -program: | - func.func @main(%arg0: !FHE.eint<15>, %arg1: i16) -> !FHE.eint<15> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<15>, i16) -> (!FHE.eint<15>) - return %1: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 32767 - - scalar: 32767 - outputs: - - scalar: 0 - - inputs: - - scalar: 32767 - - scalar: 0 - outputs: - - scalar: 32767 - - inputs: - - scalar: 32766 - - scalar: 16383 - outputs: - - scalar: 16383 ---- -description: sub_int_eint_cst_15bits -program: | - func.func @main(%arg0: !FHE.eint<15>) -> !FHE.eint<15> { - %0 = arith.constant 32767 : i16 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i16, !FHE.eint<15>) -> (!FHE.eint<15>) - return %1: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 32767 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_15bits -program: | - func.func @main(%arg0: i16, %arg1: !FHE.eint<15>) -> !FHE.eint<15> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i16, !FHE.eint<15>) -> (!FHE.eint<15>) - return %1: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 32767 - - scalar: 32767 - outputs: - - scalar: 0 - - inputs: - - scalar: 32767 - - scalar: 0 - outputs: - - scalar: 32767 - - inputs: - - scalar: 32766 - - scalar: 16383 - outputs: - - scalar: 16383 ---- -description: sub_eint_15bits -program: | - func.func @main(%arg0: !FHE.eint<15>, %arg1: !FHE.eint<15>) -> !FHE.eint<15> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<15>, !FHE.eint<15>) -> (!FHE.eint<15>) - return %1: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 32767 - - scalar: 32767 - outputs: - - scalar: 0 - - inputs: - - scalar: 32767 - - scalar: 0 - outputs: - - scalar: 32767 - - inputs: - - scalar: 32766 - - scalar: 16383 - outputs: - - scalar: 16383 ---- -description: mul_eint_int_cst_15bits -program: | - func.func @main(%arg0: !FHE.eint<15>) -> !FHE.eint<15> { - %0 = arith.constant 2 : i16 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<15>, i16) -> (!FHE.eint<15>) - return %1: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 16383 - outputs: - - scalar: 32766 ---- -description: mul_eint_int_arg_15bits -program: | - func.func @main(%arg0: !FHE.eint<15>, %arg1: i16) -> !FHE.eint<15> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<15>, i16) -> (!FHE.eint<15>) - return %1: !FHE.eint<15> - } -tests: - - inputs: - - scalar: 0 - - scalar: 32767 - outputs: - - scalar: 0 - - inputs: - - scalar: 32767 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 32767 - outputs: - - scalar: 32767 - - inputs: - - scalar: 32767 - - scalar: 1 - outputs: - - scalar: 32767 ---- ---- -description: identity_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>) -> !FHE.eint<16> { - return %arg0: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 65535 - outputs: - - scalar: 65535 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: zero_tensor_16bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<16>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<16>> - return %0: tensor<2x2x4x!FHE.eint<16>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_cst_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>) -> !FHE.eint<16> { - %0 = arith.constant 1 : i17 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<16>, i17) -> (!FHE.eint<16>) - return %1: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 65534 - outputs: - - scalar: 65535 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_arg_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>, %arg1: i17) -> !FHE.eint<16> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<16>, i17) -> (!FHE.eint<16>) - return %0: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 65534 - - scalar: 1 - outputs: - - scalar: 65535 - - inputs: - - scalar: 65535 - - scalar: 0 - outputs: - - scalar: 65535 - - inputs: - - scalar: 32767 - - scalar: 32768 - outputs: - - scalar: 65535 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_16_bits -program: | - func.func @main(%arg0: !FHE.eint<16>, %arg1: !FHE.eint<16>) -> !FHE.eint<16> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<16>, !FHE.eint<16>) -> !FHE.eint<16> - return %res: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 32767 - - scalar: 32768 - outputs: - - scalar: 65535 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_cst_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>) -> !FHE.eint<16> { - %0 = arith.constant 65535 : i17 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<16>, i17) -> (!FHE.eint<16>) - return %1: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 65535 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_arg_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>, %arg1: i17) -> !FHE.eint<16> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<16>, i17) -> (!FHE.eint<16>) - return %1: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 65535 - - scalar: 65535 - outputs: - - scalar: 0 - - inputs: - - scalar: 65535 - - scalar: 0 - outputs: - - scalar: 65535 - - inputs: - - scalar: 65534 - - scalar: 32767 - outputs: - - scalar: 32767 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_cst_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>) -> !FHE.eint<16> { - %0 = arith.constant 65535 : i17 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i17, !FHE.eint<16>) -> (!FHE.eint<16>) - return %1: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 65535 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_arg_16bits -program: | - func.func @main(%arg0: i17, %arg1: !FHE.eint<16>) -> !FHE.eint<16> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i17, !FHE.eint<16>) -> (!FHE.eint<16>) - return %1: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 65535 - - scalar: 65535 - outputs: - - scalar: 0 - - inputs: - - scalar: 65535 - - scalar: 0 - outputs: - - scalar: 65535 - - inputs: - - scalar: 65534 - - scalar: 32767 - outputs: - - scalar: 32767 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>, %arg1: !FHE.eint<16>) -> !FHE.eint<16> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<16>, !FHE.eint<16>) -> (!FHE.eint<16>) - return %1: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 65535 - - scalar: 65535 - outputs: - - scalar: 0 - - inputs: - - scalar: 65535 - - scalar: 0 - outputs: - - scalar: 65535 - - inputs: - - scalar: 65534 - - scalar: 32767 - outputs: - - scalar: 32767 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_cst_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>) -> !FHE.eint<16> { - %0 = arith.constant 2 : i17 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<16>, i17) -> (!FHE.eint<16>) - return %1: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 32767 - outputs: - - scalar: 65534 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_arg_16bits -program: | - func.func @main(%arg0: !FHE.eint<16>, %arg1: i17) -> !FHE.eint<16> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<16>, i17) -> (!FHE.eint<16>) - return %1: !FHE.eint<16> - } -tests: - - inputs: - - scalar: 0 - - scalar: 65535 - outputs: - - scalar: 0 - - inputs: - - scalar: 65535 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 65535 - outputs: - - scalar: 65535 - - inputs: - - scalar: 65535 - - scalar: 1 - outputs: - - scalar: 65535 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- ---- -description: identity_17bits -program: | - func.func @main(%arg0: !FHE.eint<17>) -> !FHE.eint<17> { - return %arg0: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 131071 - outputs: - - scalar: 131071 ---- -description: zero_tensor_17bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<17>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<17>> - return %0: tensor<2x2x4x!FHE.eint<17>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_17bits -program: | - func.func @main(%arg0: !FHE.eint<17>) -> !FHE.eint<17> { - %0 = arith.constant 1 : i18 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<17>, i18) -> (!FHE.eint<17>) - return %1: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 131070 - outputs: - - scalar: 131071 ---- -description: add_eint_int_arg_17bits -program: | - func.func @main(%arg0: !FHE.eint<17>, %arg1: i18) -> !FHE.eint<17> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<17>, i18) -> (!FHE.eint<17>) - return %0: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 131070 - - scalar: 1 - outputs: - - scalar: 131071 - - inputs: - - scalar: 131071 - - scalar: 0 - outputs: - - scalar: 131071 - - inputs: - - scalar: 65535 - - scalar: 65536 - outputs: - - scalar: 131071 ---- -description: add_eint_17_bits -program: | - func.func @main(%arg0: !FHE.eint<17>, %arg1: !FHE.eint<17>) -> !FHE.eint<17> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<17>, !FHE.eint<17>) -> !FHE.eint<17> - return %res: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 65535 - - scalar: 65536 - outputs: - - scalar: 131071 ---- -description: sub_eint_int_cst_17bits -program: | - func.func @main(%arg0: !FHE.eint<17>) -> !FHE.eint<17> { - %0 = arith.constant 131071 : i18 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<17>, i18) -> (!FHE.eint<17>) - return %1: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 131071 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_17bits -program: | - func.func @main(%arg0: !FHE.eint<17>, %arg1: i18) -> !FHE.eint<17> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<17>, i18) -> (!FHE.eint<17>) - return %1: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 131071 - - scalar: 131071 - outputs: - - scalar: 0 - - inputs: - - scalar: 131071 - - scalar: 0 - outputs: - - scalar: 131071 - - inputs: - - scalar: 131070 - - scalar: 65535 - outputs: - - scalar: 65535 ---- -description: sub_int_eint_cst_17bits -program: | - func.func @main(%arg0: !FHE.eint<17>) -> !FHE.eint<17> { - %0 = arith.constant 131071 : i18 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i18, !FHE.eint<17>) -> (!FHE.eint<17>) - return %1: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 131071 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_17bits -program: | - func.func @main(%arg0: i18, %arg1: !FHE.eint<17>) -> !FHE.eint<17> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i18, !FHE.eint<17>) -> (!FHE.eint<17>) - return %1: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 131071 - - scalar: 131071 - outputs: - - scalar: 0 - - inputs: - - scalar: 131071 - - scalar: 0 - outputs: - - scalar: 131071 - - inputs: - - scalar: 131070 - - scalar: 65535 - outputs: - - scalar: 65535 ---- -description: sub_eint_17bits -program: | - func.func @main(%arg0: !FHE.eint<17>, %arg1: !FHE.eint<17>) -> !FHE.eint<17> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<17>, !FHE.eint<17>) -> (!FHE.eint<17>) - return %1: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 131071 - - scalar: 131071 - outputs: - - scalar: 0 - - inputs: - - scalar: 131071 - - scalar: 0 - outputs: - - scalar: 131071 - - inputs: - - scalar: 131070 - - scalar: 65535 - outputs: - - scalar: 65535 ---- -description: mul_eint_int_cst_17bits -program: | - func.func @main(%arg0: !FHE.eint<17>) -> !FHE.eint<17> { - %0 = arith.constant 2 : i18 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<17>, i18) -> (!FHE.eint<17>) - return %1: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 65535 - outputs: - - scalar: 131070 ---- -description: mul_eint_int_arg_17bits -program: | - func.func @main(%arg0: !FHE.eint<17>, %arg1: i18) -> !FHE.eint<17> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<17>, i18) -> (!FHE.eint<17>) - return %1: !FHE.eint<17> - } -tests: - - inputs: - - scalar: 0 - - scalar: 131071 - outputs: - - scalar: 0 - - inputs: - - scalar: 131071 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 131071 - outputs: - - scalar: 131071 - - inputs: - - scalar: 131071 - - scalar: 1 - outputs: - - scalar: 131071 ---- ---- -description: identity_18bits -program: | - func.func @main(%arg0: !FHE.eint<18>) -> !FHE.eint<18> { - return %arg0: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 262143 - outputs: - - scalar: 262143 ---- -description: zero_tensor_18bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<18>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<18>> - return %0: tensor<2x2x4x!FHE.eint<18>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_18bits -program: | - func.func @main(%arg0: !FHE.eint<18>) -> !FHE.eint<18> { - %0 = arith.constant 1 : i19 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<18>, i19) -> (!FHE.eint<18>) - return %1: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 262142 - outputs: - - scalar: 262143 ---- -description: add_eint_int_arg_18bits -program: | - func.func @main(%arg0: !FHE.eint<18>, %arg1: i19) -> !FHE.eint<18> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<18>, i19) -> (!FHE.eint<18>) - return %0: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 262142 - - scalar: 1 - outputs: - - scalar: 262143 - - inputs: - - scalar: 262143 - - scalar: 0 - outputs: - - scalar: 262143 - - inputs: - - scalar: 131071 - - scalar: 131072 - outputs: - - scalar: 262143 ---- -description: add_eint_18_bits -program: | - func.func @main(%arg0: !FHE.eint<18>, %arg1: !FHE.eint<18>) -> !FHE.eint<18> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<18>, !FHE.eint<18>) -> !FHE.eint<18> - return %res: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 131071 - - scalar: 131072 - outputs: - - scalar: 262143 ---- -description: sub_eint_int_cst_18bits -program: | - func.func @main(%arg0: !FHE.eint<18>) -> !FHE.eint<18> { - %0 = arith.constant 262143 : i19 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<18>, i19) -> (!FHE.eint<18>) - return %1: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 262143 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_18bits -program: | - func.func @main(%arg0: !FHE.eint<18>, %arg1: i19) -> !FHE.eint<18> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<18>, i19) -> (!FHE.eint<18>) - return %1: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 262143 - - scalar: 262143 - outputs: - - scalar: 0 - - inputs: - - scalar: 262143 - - scalar: 0 - outputs: - - scalar: 262143 - - inputs: - - scalar: 262142 - - scalar: 131071 - outputs: - - scalar: 131071 ---- -description: sub_int_eint_cst_18bits -program: | - func.func @main(%arg0: !FHE.eint<18>) -> !FHE.eint<18> { - %0 = arith.constant 262143 : i19 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i19, !FHE.eint<18>) -> (!FHE.eint<18>) - return %1: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 262143 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_18bits -program: | - func.func @main(%arg0: i19, %arg1: !FHE.eint<18>) -> !FHE.eint<18> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i19, !FHE.eint<18>) -> (!FHE.eint<18>) - return %1: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 262143 - - scalar: 262143 - outputs: - - scalar: 0 - - inputs: - - scalar: 262143 - - scalar: 0 - outputs: - - scalar: 262143 - - inputs: - - scalar: 262142 - - scalar: 131071 - outputs: - - scalar: 131071 ---- -description: sub_eint_18bits -program: | - func.func @main(%arg0: !FHE.eint<18>, %arg1: !FHE.eint<18>) -> !FHE.eint<18> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<18>, !FHE.eint<18>) -> (!FHE.eint<18>) - return %1: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 262143 - - scalar: 262143 - outputs: - - scalar: 0 - - inputs: - - scalar: 262143 - - scalar: 0 - outputs: - - scalar: 262143 - - inputs: - - scalar: 262142 - - scalar: 131071 - outputs: - - scalar: 131071 ---- -description: mul_eint_int_cst_18bits -program: | - func.func @main(%arg0: !FHE.eint<18>) -> !FHE.eint<18> { - %0 = arith.constant 2 : i19 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<18>, i19) -> (!FHE.eint<18>) - return %1: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 131071 - outputs: - - scalar: 262142 ---- -description: mul_eint_int_arg_18bits -program: | - func.func @main(%arg0: !FHE.eint<18>, %arg1: i19) -> !FHE.eint<18> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<18>, i19) -> (!FHE.eint<18>) - return %1: !FHE.eint<18> - } -tests: - - inputs: - - scalar: 0 - - scalar: 262143 - outputs: - - scalar: 0 - - inputs: - - scalar: 262143 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 262143 - outputs: - - scalar: 262143 - - inputs: - - scalar: 262143 - - scalar: 1 - outputs: - - scalar: 262143 ---- ---- -description: identity_19bits -program: | - func.func @main(%arg0: !FHE.eint<19>) -> !FHE.eint<19> { - return %arg0: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 524287 - outputs: - - scalar: 524287 ---- -description: zero_tensor_19bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<19>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<19>> - return %0: tensor<2x2x4x!FHE.eint<19>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_19bits -program: | - func.func @main(%arg0: !FHE.eint<19>) -> !FHE.eint<19> { - %0 = arith.constant 1 : i20 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<19>, i20) -> (!FHE.eint<19>) - return %1: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 524286 - outputs: - - scalar: 524287 ---- -description: add_eint_int_arg_19bits -program: | - func.func @main(%arg0: !FHE.eint<19>, %arg1: i20) -> !FHE.eint<19> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<19>, i20) -> (!FHE.eint<19>) - return %0: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 524286 - - scalar: 1 - outputs: - - scalar: 524287 - - inputs: - - scalar: 524287 - - scalar: 0 - outputs: - - scalar: 524287 - - inputs: - - scalar: 262143 - - scalar: 262144 - outputs: - - scalar: 524287 ---- -description: add_eint_19_bits -program: | - func.func @main(%arg0: !FHE.eint<19>, %arg1: !FHE.eint<19>) -> !FHE.eint<19> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<19>, !FHE.eint<19>) -> !FHE.eint<19> - return %res: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 262143 - - scalar: 262144 - outputs: - - scalar: 524287 ---- -description: sub_eint_int_cst_19bits -program: | - func.func @main(%arg0: !FHE.eint<19>) -> !FHE.eint<19> { - %0 = arith.constant 524287 : i20 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<19>, i20) -> (!FHE.eint<19>) - return %1: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 524287 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_19bits -program: | - func.func @main(%arg0: !FHE.eint<19>, %arg1: i20) -> !FHE.eint<19> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<19>, i20) -> (!FHE.eint<19>) - return %1: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 524287 - - scalar: 524287 - outputs: - - scalar: 0 - - inputs: - - scalar: 524287 - - scalar: 0 - outputs: - - scalar: 524287 - - inputs: - - scalar: 524286 - - scalar: 262143 - outputs: - - scalar: 262143 ---- -description: sub_int_eint_cst_19bits -program: | - func.func @main(%arg0: !FHE.eint<19>) -> !FHE.eint<19> { - %0 = arith.constant 524287 : i20 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i20, !FHE.eint<19>) -> (!FHE.eint<19>) - return %1: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 524287 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_19bits -program: | - func.func @main(%arg0: i20, %arg1: !FHE.eint<19>) -> !FHE.eint<19> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i20, !FHE.eint<19>) -> (!FHE.eint<19>) - return %1: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 524287 - - scalar: 524287 - outputs: - - scalar: 0 - - inputs: - - scalar: 524287 - - scalar: 0 - outputs: - - scalar: 524287 - - inputs: - - scalar: 524286 - - scalar: 262143 - outputs: - - scalar: 262143 ---- -description: sub_eint_19bits -program: | - func.func @main(%arg0: !FHE.eint<19>, %arg1: !FHE.eint<19>) -> !FHE.eint<19> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<19>, !FHE.eint<19>) -> (!FHE.eint<19>) - return %1: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 524287 - - scalar: 524287 - outputs: - - scalar: 0 - - inputs: - - scalar: 524287 - - scalar: 0 - outputs: - - scalar: 524287 - - inputs: - - scalar: 524286 - - scalar: 262143 - outputs: - - scalar: 262143 ---- -description: mul_eint_int_cst_19bits -program: | - func.func @main(%arg0: !FHE.eint<19>) -> !FHE.eint<19> { - %0 = arith.constant 2 : i20 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<19>, i20) -> (!FHE.eint<19>) - return %1: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 262143 - outputs: - - scalar: 524286 ---- -description: mul_eint_int_arg_19bits -program: | - func.func @main(%arg0: !FHE.eint<19>, %arg1: i20) -> !FHE.eint<19> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<19>, i20) -> (!FHE.eint<19>) - return %1: !FHE.eint<19> - } -tests: - - inputs: - - scalar: 0 - - scalar: 524287 - outputs: - - scalar: 0 - - inputs: - - scalar: 524287 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 524287 - outputs: - - scalar: 524287 - - inputs: - - scalar: 524287 - - scalar: 1 - outputs: - - scalar: 524287 ---- ---- -description: identity_20bits -program: | - func.func @main(%arg0: !FHE.eint<20>) -> !FHE.eint<20> { - return %arg0: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 1048575 - outputs: - - scalar: 1048575 ---- -description: zero_tensor_20bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<20>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<20>> - return %0: tensor<2x2x4x!FHE.eint<20>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_20bits -program: | - func.func @main(%arg0: !FHE.eint<20>) -> !FHE.eint<20> { - %0 = arith.constant 1 : i21 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<20>, i21) -> (!FHE.eint<20>) - return %1: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 1048574 - outputs: - - scalar: 1048575 ---- -description: add_eint_int_arg_20bits -program: | - func.func @main(%arg0: !FHE.eint<20>, %arg1: i21) -> !FHE.eint<20> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<20>, i21) -> (!FHE.eint<20>) - return %0: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 1048574 - - scalar: 1 - outputs: - - scalar: 1048575 - - inputs: - - scalar: 1048575 - - scalar: 0 - outputs: - - scalar: 1048575 - - inputs: - - scalar: 524287 - - scalar: 524288 - outputs: - - scalar: 1048575 ---- -description: add_eint_20_bits -program: | - func.func @main(%arg0: !FHE.eint<20>, %arg1: !FHE.eint<20>) -> !FHE.eint<20> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<20>, !FHE.eint<20>) -> !FHE.eint<20> - return %res: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 524287 - - scalar: 524288 - outputs: - - scalar: 1048575 ---- -description: sub_eint_int_cst_20bits -program: | - func.func @main(%arg0: !FHE.eint<20>) -> !FHE.eint<20> { - %0 = arith.constant 1048575 : i21 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<20>, i21) -> (!FHE.eint<20>) - return %1: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 1048575 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_20bits -program: | - func.func @main(%arg0: !FHE.eint<20>, %arg1: i21) -> !FHE.eint<20> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<20>, i21) -> (!FHE.eint<20>) - return %1: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 1048575 - - scalar: 1048575 - outputs: - - scalar: 0 - - inputs: - - scalar: 1048575 - - scalar: 0 - outputs: - - scalar: 1048575 - - inputs: - - scalar: 1048574 - - scalar: 524287 - outputs: - - scalar: 524287 ---- -description: sub_int_eint_cst_20bits -program: | - func.func @main(%arg0: !FHE.eint<20>) -> !FHE.eint<20> { - %0 = arith.constant 1048575 : i21 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i21, !FHE.eint<20>) -> (!FHE.eint<20>) - return %1: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 1048575 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_20bits -program: | - func.func @main(%arg0: i21, %arg1: !FHE.eint<20>) -> !FHE.eint<20> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i21, !FHE.eint<20>) -> (!FHE.eint<20>) - return %1: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 1048575 - - scalar: 1048575 - outputs: - - scalar: 0 - - inputs: - - scalar: 1048575 - - scalar: 0 - outputs: - - scalar: 1048575 - - inputs: - - scalar: 1048574 - - scalar: 524287 - outputs: - - scalar: 524287 ---- -description: sub_eint_20bits -program: | - func.func @main(%arg0: !FHE.eint<20>, %arg1: !FHE.eint<20>) -> !FHE.eint<20> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<20>, !FHE.eint<20>) -> (!FHE.eint<20>) - return %1: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 1048575 - - scalar: 1048575 - outputs: - - scalar: 0 - - inputs: - - scalar: 1048575 - - scalar: 0 - outputs: - - scalar: 1048575 - - inputs: - - scalar: 1048574 - - scalar: 524287 - outputs: - - scalar: 524287 ---- -description: mul_eint_int_cst_20bits -program: | - func.func @main(%arg0: !FHE.eint<20>) -> !FHE.eint<20> { - %0 = arith.constant 2 : i21 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<20>, i21) -> (!FHE.eint<20>) - return %1: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 524287 - outputs: - - scalar: 1048574 ---- -description: mul_eint_int_arg_20bits -program: | - func.func @main(%arg0: !FHE.eint<20>, %arg1: i21) -> !FHE.eint<20> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<20>, i21) -> (!FHE.eint<20>) - return %1: !FHE.eint<20> - } -tests: - - inputs: - - scalar: 0 - - scalar: 1048575 - outputs: - - scalar: 0 - - inputs: - - scalar: 1048575 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 1048575 - outputs: - - scalar: 1048575 - - inputs: - - scalar: 1048575 - - scalar: 1 - outputs: - - scalar: 1048575 ---- ---- -description: identity_21bits -program: | - func.func @main(%arg0: !FHE.eint<21>) -> !FHE.eint<21> { - return %arg0: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 2097151 - outputs: - - scalar: 2097151 ---- -description: zero_tensor_21bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<21>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<21>> - return %0: tensor<2x2x4x!FHE.eint<21>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_21bits -program: | - func.func @main(%arg0: !FHE.eint<21>) -> !FHE.eint<21> { - %0 = arith.constant 1 : i22 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<21>, i22) -> (!FHE.eint<21>) - return %1: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 2097150 - outputs: - - scalar: 2097151 ---- -description: add_eint_int_arg_21bits -program: | - func.func @main(%arg0: !FHE.eint<21>, %arg1: i22) -> !FHE.eint<21> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<21>, i22) -> (!FHE.eint<21>) - return %0: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 2097150 - - scalar: 1 - outputs: - - scalar: 2097151 - - inputs: - - scalar: 2097151 - - scalar: 0 - outputs: - - scalar: 2097151 - - inputs: - - scalar: 1048575 - - scalar: 1048576 - outputs: - - scalar: 2097151 ---- -description: add_eint_21_bits -program: | - func.func @main(%arg0: !FHE.eint<21>, %arg1: !FHE.eint<21>) -> !FHE.eint<21> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<21>, !FHE.eint<21>) -> !FHE.eint<21> - return %res: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 1048575 - - scalar: 1048576 - outputs: - - scalar: 2097151 ---- -description: sub_eint_int_cst_21bits -program: | - func.func @main(%arg0: !FHE.eint<21>) -> !FHE.eint<21> { - %0 = arith.constant 2097151 : i22 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<21>, i22) -> (!FHE.eint<21>) - return %1: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 2097151 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_21bits -program: | - func.func @main(%arg0: !FHE.eint<21>, %arg1: i22) -> !FHE.eint<21> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<21>, i22) -> (!FHE.eint<21>) - return %1: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 2097151 - - scalar: 2097151 - outputs: - - scalar: 0 - - inputs: - - scalar: 2097151 - - scalar: 0 - outputs: - - scalar: 2097151 - - inputs: - - scalar: 2097150 - - scalar: 1048575 - outputs: - - scalar: 1048575 ---- -description: sub_int_eint_cst_21bits -program: | - func.func @main(%arg0: !FHE.eint<21>) -> !FHE.eint<21> { - %0 = arith.constant 2097151 : i22 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i22, !FHE.eint<21>) -> (!FHE.eint<21>) - return %1: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 2097151 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_21bits -program: | - func.func @main(%arg0: i22, %arg1: !FHE.eint<21>) -> !FHE.eint<21> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i22, !FHE.eint<21>) -> (!FHE.eint<21>) - return %1: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 2097151 - - scalar: 2097151 - outputs: - - scalar: 0 - - inputs: - - scalar: 2097151 - - scalar: 0 - outputs: - - scalar: 2097151 - - inputs: - - scalar: 2097150 - - scalar: 1048575 - outputs: - - scalar: 1048575 ---- -description: sub_eint_21bits -program: | - func.func @main(%arg0: !FHE.eint<21>, %arg1: !FHE.eint<21>) -> !FHE.eint<21> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<21>, !FHE.eint<21>) -> (!FHE.eint<21>) - return %1: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 2097151 - - scalar: 2097151 - outputs: - - scalar: 0 - - inputs: - - scalar: 2097151 - - scalar: 0 - outputs: - - scalar: 2097151 - - inputs: - - scalar: 2097150 - - scalar: 1048575 - outputs: - - scalar: 1048575 ---- -description: mul_eint_int_cst_21bits -program: | - func.func @main(%arg0: !FHE.eint<21>) -> !FHE.eint<21> { - %0 = arith.constant 2 : i22 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<21>, i22) -> (!FHE.eint<21>) - return %1: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1048575 - outputs: - - scalar: 2097150 ---- -description: mul_eint_int_arg_21bits -program: | - func.func @main(%arg0: !FHE.eint<21>, %arg1: i22) -> !FHE.eint<21> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<21>, i22) -> (!FHE.eint<21>) - return %1: !FHE.eint<21> - } -tests: - - inputs: - - scalar: 0 - - scalar: 2097151 - outputs: - - scalar: 0 - - inputs: - - scalar: 2097151 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 2097151 - outputs: - - scalar: 2097151 - - inputs: - - scalar: 2097151 - - scalar: 1 - outputs: - - scalar: 2097151 ---- ---- -description: identity_22bits -program: | - func.func @main(%arg0: !FHE.eint<22>) -> !FHE.eint<22> { - return %arg0: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 4194303 - outputs: - - scalar: 4194303 ---- -description: zero_tensor_22bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<22>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<22>> - return %0: tensor<2x2x4x!FHE.eint<22>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_22bits -program: | - func.func @main(%arg0: !FHE.eint<22>) -> !FHE.eint<22> { - %0 = arith.constant 1 : i23 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<22>, i23) -> (!FHE.eint<22>) - return %1: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 4194302 - outputs: - - scalar: 4194303 ---- -description: add_eint_int_arg_22bits -program: | - func.func @main(%arg0: !FHE.eint<22>, %arg1: i23) -> !FHE.eint<22> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<22>, i23) -> (!FHE.eint<22>) - return %0: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 4194302 - - scalar: 1 - outputs: - - scalar: 4194303 - - inputs: - - scalar: 4194303 - - scalar: 0 - outputs: - - scalar: 4194303 - - inputs: - - scalar: 2097151 - - scalar: 2097152 - outputs: - - scalar: 4194303 ---- -description: add_eint_22_bits -program: | - func.func @main(%arg0: !FHE.eint<22>, %arg1: !FHE.eint<22>) -> !FHE.eint<22> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<22>, !FHE.eint<22>) -> !FHE.eint<22> - return %res: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 2097151 - - scalar: 2097152 - outputs: - - scalar: 4194303 ---- -description: sub_eint_int_cst_22bits -program: | - func.func @main(%arg0: !FHE.eint<22>) -> !FHE.eint<22> { - %0 = arith.constant 4194303 : i23 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<22>, i23) -> (!FHE.eint<22>) - return %1: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 4194303 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_22bits -program: | - func.func @main(%arg0: !FHE.eint<22>, %arg1: i23) -> !FHE.eint<22> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<22>, i23) -> (!FHE.eint<22>) - return %1: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 4194303 - - scalar: 4194303 - outputs: - - scalar: 0 - - inputs: - - scalar: 4194303 - - scalar: 0 - outputs: - - scalar: 4194303 - - inputs: - - scalar: 4194302 - - scalar: 2097151 - outputs: - - scalar: 2097151 ---- -description: sub_int_eint_cst_22bits -program: | - func.func @main(%arg0: !FHE.eint<22>) -> !FHE.eint<22> { - %0 = arith.constant 4194303 : i23 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i23, !FHE.eint<22>) -> (!FHE.eint<22>) - return %1: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 4194303 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_22bits -program: | - func.func @main(%arg0: i23, %arg1: !FHE.eint<22>) -> !FHE.eint<22> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i23, !FHE.eint<22>) -> (!FHE.eint<22>) - return %1: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 4194303 - - scalar: 4194303 - outputs: - - scalar: 0 - - inputs: - - scalar: 4194303 - - scalar: 0 - outputs: - - scalar: 4194303 - - inputs: - - scalar: 4194302 - - scalar: 2097151 - outputs: - - scalar: 2097151 ---- -description: sub_eint_22bits -program: | - func.func @main(%arg0: !FHE.eint<22>, %arg1: !FHE.eint<22>) -> !FHE.eint<22> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<22>, !FHE.eint<22>) -> (!FHE.eint<22>) - return %1: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 4194303 - - scalar: 4194303 - outputs: - - scalar: 0 - - inputs: - - scalar: 4194303 - - scalar: 0 - outputs: - - scalar: 4194303 - - inputs: - - scalar: 4194302 - - scalar: 2097151 - outputs: - - scalar: 2097151 ---- -description: mul_eint_int_cst_22bits -program: | - func.func @main(%arg0: !FHE.eint<22>) -> !FHE.eint<22> { - %0 = arith.constant 2 : i23 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<22>, i23) -> (!FHE.eint<22>) - return %1: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 2097151 - outputs: - - scalar: 4194302 ---- -description: mul_eint_int_arg_22bits -program: | - func.func @main(%arg0: !FHE.eint<22>, %arg1: i23) -> !FHE.eint<22> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<22>, i23) -> (!FHE.eint<22>) - return %1: !FHE.eint<22> - } -tests: - - inputs: - - scalar: 0 - - scalar: 4194303 - outputs: - - scalar: 0 - - inputs: - - scalar: 4194303 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 4194303 - outputs: - - scalar: 4194303 - - inputs: - - scalar: 4194303 - - scalar: 1 - outputs: - - scalar: 4194303 ---- ---- -description: identity_23bits -program: | - func.func @main(%arg0: !FHE.eint<23>) -> !FHE.eint<23> { - return %arg0: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 8388607 - outputs: - - scalar: 8388607 ---- -description: zero_tensor_23bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<23>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<23>> - return %0: tensor<2x2x4x!FHE.eint<23>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_23bits -program: | - func.func @main(%arg0: !FHE.eint<23>) -> !FHE.eint<23> { - %0 = arith.constant 1 : i24 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<23>, i24) -> (!FHE.eint<23>) - return %1: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 8388606 - outputs: - - scalar: 8388607 ---- -description: add_eint_int_arg_23bits -program: | - func.func @main(%arg0: !FHE.eint<23>, %arg1: i24) -> !FHE.eint<23> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<23>, i24) -> (!FHE.eint<23>) - return %0: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 8388606 - - scalar: 1 - outputs: - - scalar: 8388607 - - inputs: - - scalar: 8388607 - - scalar: 0 - outputs: - - scalar: 8388607 - - inputs: - - scalar: 4194303 - - scalar: 4194304 - outputs: - - scalar: 8388607 ---- -description: add_eint_23_bits -program: | - func.func @main(%arg0: !FHE.eint<23>, %arg1: !FHE.eint<23>) -> !FHE.eint<23> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<23>, !FHE.eint<23>) -> !FHE.eint<23> - return %res: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 4194303 - - scalar: 4194304 - outputs: - - scalar: 8388607 ---- -description: sub_eint_int_cst_23bits -program: | - func.func @main(%arg0: !FHE.eint<23>) -> !FHE.eint<23> { - %0 = arith.constant 8388607 : i24 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<23>, i24) -> (!FHE.eint<23>) - return %1: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 8388607 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_23bits -program: | - func.func @main(%arg0: !FHE.eint<23>, %arg1: i24) -> !FHE.eint<23> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<23>, i24) -> (!FHE.eint<23>) - return %1: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 8388607 - - scalar: 8388607 - outputs: - - scalar: 0 - - inputs: - - scalar: 8388607 - - scalar: 0 - outputs: - - scalar: 8388607 - - inputs: - - scalar: 8388606 - - scalar: 4194303 - outputs: - - scalar: 4194303 ---- -description: sub_int_eint_cst_23bits -program: | - func.func @main(%arg0: !FHE.eint<23>) -> !FHE.eint<23> { - %0 = arith.constant 8388607 : i24 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i24, !FHE.eint<23>) -> (!FHE.eint<23>) - return %1: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 8388607 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_23bits -program: | - func.func @main(%arg0: i24, %arg1: !FHE.eint<23>) -> !FHE.eint<23> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i24, !FHE.eint<23>) -> (!FHE.eint<23>) - return %1: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 8388607 - - scalar: 8388607 - outputs: - - scalar: 0 - - inputs: - - scalar: 8388607 - - scalar: 0 - outputs: - - scalar: 8388607 - - inputs: - - scalar: 8388606 - - scalar: 4194303 - outputs: - - scalar: 4194303 ---- -description: sub_eint_23bits -program: | - func.func @main(%arg0: !FHE.eint<23>, %arg1: !FHE.eint<23>) -> !FHE.eint<23> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<23>, !FHE.eint<23>) -> (!FHE.eint<23>) - return %1: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 8388607 - - scalar: 8388607 - outputs: - - scalar: 0 - - inputs: - - scalar: 8388607 - - scalar: 0 - outputs: - - scalar: 8388607 - - inputs: - - scalar: 8388606 - - scalar: 4194303 - outputs: - - scalar: 4194303 ---- -description: mul_eint_int_cst_23bits -program: | - func.func @main(%arg0: !FHE.eint<23>) -> !FHE.eint<23> { - %0 = arith.constant 2 : i24 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<23>, i24) -> (!FHE.eint<23>) - return %1: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 4194303 - outputs: - - scalar: 8388606 ---- -description: mul_eint_int_arg_23bits -program: | - func.func @main(%arg0: !FHE.eint<23>, %arg1: i24) -> !FHE.eint<23> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<23>, i24) -> (!FHE.eint<23>) - return %1: !FHE.eint<23> - } -tests: - - inputs: - - scalar: 0 - - scalar: 8388607 - outputs: - - scalar: 0 - - inputs: - - scalar: 8388607 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 8388607 - outputs: - - scalar: 8388607 - - inputs: - - scalar: 8388607 - - scalar: 1 - outputs: - - scalar: 8388607 ---- ---- -description: identity_24bits -program: | - func.func @main(%arg0: !FHE.eint<24>) -> !FHE.eint<24> { - return %arg0: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 16777215 - outputs: - - scalar: 16777215 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: zero_tensor_24bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<24>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<24>> - return %0: tensor<2x2x4x!FHE.eint<24>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_cst_24bits -program: | - func.func @main(%arg0: !FHE.eint<24>) -> !FHE.eint<24> { - %0 = arith.constant 1 : i25 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<24>, i25) -> (!FHE.eint<24>) - return %1: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 16777214 - outputs: - - scalar: 16777215 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_arg_24bits -program: | - func.func @main(%arg0: !FHE.eint<24>, %arg1: i25) -> !FHE.eint<24> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<24>, i25) -> (!FHE.eint<24>) - return %0: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 16777214 - - scalar: 1 - outputs: - - scalar: 16777215 - - inputs: - - scalar: 16777215 - - scalar: 0 - outputs: - - scalar: 16777215 - - inputs: - - scalar: 8388607 - - scalar: 8388608 - outputs: - - scalar: 16777215 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_24_bits -program: | - func.func @main(%arg0: !FHE.eint<24>, %arg1: !FHE.eint<24>) -> !FHE.eint<24> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<24>, !FHE.eint<24>) -> !FHE.eint<24> - return %res: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 8388607 - - scalar: 8388608 - outputs: - - scalar: 16777215 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_cst_24bits -program: | - func.func @main(%arg0: !FHE.eint<24>) -> !FHE.eint<24> { - %0 = arith.constant 16777215 : i25 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<24>, i25) -> (!FHE.eint<24>) - return %1: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 16777215 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_arg_24bits -program: | - func.func @main(%arg0: !FHE.eint<24>, %arg1: i25) -> !FHE.eint<24> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<24>, i25) -> (!FHE.eint<24>) - return %1: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 16777215 - - scalar: 16777215 - outputs: - - scalar: 0 - - inputs: - - scalar: 16777215 - - scalar: 0 - outputs: - - scalar: 16777215 - - inputs: - - scalar: 16777214 - - scalar: 8388607 - outputs: - - scalar: 8388607 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_cst_24bits -program: | - func.func @main(%arg0: !FHE.eint<24>) -> !FHE.eint<24> { - %0 = arith.constant 16777215 : i25 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i25, !FHE.eint<24>) -> (!FHE.eint<24>) - return %1: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 16777215 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_arg_24bits -program: | - func.func @main(%arg0: i25, %arg1: !FHE.eint<24>) -> !FHE.eint<24> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i25, !FHE.eint<24>) -> (!FHE.eint<24>) - return %1: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 16777215 - - scalar: 16777215 - outputs: - - scalar: 0 - - inputs: - - scalar: 16777215 - - scalar: 0 - outputs: - - scalar: 16777215 - - inputs: - - scalar: 16777214 - - scalar: 8388607 - outputs: - - scalar: 8388607 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_24bits -program: | - func.func @main(%arg0: !FHE.eint<24>, %arg1: !FHE.eint<24>) -> !FHE.eint<24> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<24>, !FHE.eint<24>) -> (!FHE.eint<24>) - return %1: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 16777215 - - scalar: 16777215 - outputs: - - scalar: 0 - - inputs: - - scalar: 16777215 - - scalar: 0 - outputs: - - scalar: 16777215 - - inputs: - - scalar: 16777214 - - scalar: 8388607 - outputs: - - scalar: 8388607 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_cst_24bits -program: | - func.func @main(%arg0: !FHE.eint<24>) -> !FHE.eint<24> { - %0 = arith.constant 2 : i25 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<24>, i25) -> (!FHE.eint<24>) - return %1: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 8388607 - outputs: - - scalar: 16777214 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_arg_24bits -program: | - func.func @main(%arg0: !FHE.eint<24>, %arg1: i25) -> !FHE.eint<24> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<24>, i25) -> (!FHE.eint<24>) - return %1: !FHE.eint<24> - } -tests: - - inputs: - - scalar: 0 - - scalar: 16777215 - outputs: - - scalar: 0 - - inputs: - - scalar: 16777215 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 16777215 - outputs: - - scalar: 16777215 - - inputs: - - scalar: 16777215 - - scalar: 1 - outputs: - - scalar: 16777215 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- ---- -description: identity_25bits -program: | - func.func @main(%arg0: !FHE.eint<25>) -> !FHE.eint<25> { - return %arg0: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 33554431 - outputs: - - scalar: 33554431 ---- -description: zero_tensor_25bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<25>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<25>> - return %0: tensor<2x2x4x!FHE.eint<25>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_25bits -program: | - func.func @main(%arg0: !FHE.eint<25>) -> !FHE.eint<25> { - %0 = arith.constant 1 : i26 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<25>, i26) -> (!FHE.eint<25>) - return %1: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 33554430 - outputs: - - scalar: 33554431 ---- -description: add_eint_int_arg_25bits -program: | - func.func @main(%arg0: !FHE.eint<25>, %arg1: i26) -> !FHE.eint<25> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<25>, i26) -> (!FHE.eint<25>) - return %0: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 33554430 - - scalar: 1 - outputs: - - scalar: 33554431 - - inputs: - - scalar: 33554431 - - scalar: 0 - outputs: - - scalar: 33554431 - - inputs: - - scalar: 16777215 - - scalar: 16777216 - outputs: - - scalar: 33554431 ---- -description: add_eint_25_bits -program: | - func.func @main(%arg0: !FHE.eint<25>, %arg1: !FHE.eint<25>) -> !FHE.eint<25> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<25>, !FHE.eint<25>) -> !FHE.eint<25> - return %res: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 16777215 - - scalar: 16777216 - outputs: - - scalar: 33554431 ---- -description: sub_eint_int_cst_25bits -program: | - func.func @main(%arg0: !FHE.eint<25>) -> !FHE.eint<25> { - %0 = arith.constant 33554431 : i26 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<25>, i26) -> (!FHE.eint<25>) - return %1: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 33554431 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_25bits -program: | - func.func @main(%arg0: !FHE.eint<25>, %arg1: i26) -> !FHE.eint<25> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<25>, i26) -> (!FHE.eint<25>) - return %1: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 33554431 - - scalar: 33554431 - outputs: - - scalar: 0 - - inputs: - - scalar: 33554431 - - scalar: 0 - outputs: - - scalar: 33554431 - - inputs: - - scalar: 33554430 - - scalar: 16777215 - outputs: - - scalar: 16777215 ---- -description: sub_int_eint_cst_25bits -program: | - func.func @main(%arg0: !FHE.eint<25>) -> !FHE.eint<25> { - %0 = arith.constant 33554431 : i26 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i26, !FHE.eint<25>) -> (!FHE.eint<25>) - return %1: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 33554431 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_25bits -program: | - func.func @main(%arg0: i26, %arg1: !FHE.eint<25>) -> !FHE.eint<25> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i26, !FHE.eint<25>) -> (!FHE.eint<25>) - return %1: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 33554431 - - scalar: 33554431 - outputs: - - scalar: 0 - - inputs: - - scalar: 33554431 - - scalar: 0 - outputs: - - scalar: 33554431 - - inputs: - - scalar: 33554430 - - scalar: 16777215 - outputs: - - scalar: 16777215 ---- -description: sub_eint_25bits -program: | - func.func @main(%arg0: !FHE.eint<25>, %arg1: !FHE.eint<25>) -> !FHE.eint<25> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<25>, !FHE.eint<25>) -> (!FHE.eint<25>) - return %1: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 33554431 - - scalar: 33554431 - outputs: - - scalar: 0 - - inputs: - - scalar: 33554431 - - scalar: 0 - outputs: - - scalar: 33554431 - - inputs: - - scalar: 33554430 - - scalar: 16777215 - outputs: - - scalar: 16777215 ---- -description: mul_eint_int_cst_25bits -program: | - func.func @main(%arg0: !FHE.eint<25>) -> !FHE.eint<25> { - %0 = arith.constant 2 : i26 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<25>, i26) -> (!FHE.eint<25>) - return %1: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 16777215 - outputs: - - scalar: 33554430 ---- -description: mul_eint_int_arg_25bits -program: | - func.func @main(%arg0: !FHE.eint<25>, %arg1: i26) -> !FHE.eint<25> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<25>, i26) -> (!FHE.eint<25>) - return %1: !FHE.eint<25> - } -tests: - - inputs: - - scalar: 0 - - scalar: 33554431 - outputs: - - scalar: 0 - - inputs: - - scalar: 33554431 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 33554431 - outputs: - - scalar: 33554431 - - inputs: - - scalar: 33554431 - - scalar: 1 - outputs: - - scalar: 33554431 ---- ---- -description: identity_26bits -program: | - func.func @main(%arg0: !FHE.eint<26>) -> !FHE.eint<26> { - return %arg0: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 67108863 - outputs: - - scalar: 67108863 ---- -description: zero_tensor_26bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<26>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<26>> - return %0: tensor<2x2x4x!FHE.eint<26>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_26bits -program: | - func.func @main(%arg0: !FHE.eint<26>) -> !FHE.eint<26> { - %0 = arith.constant 1 : i27 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<26>, i27) -> (!FHE.eint<26>) - return %1: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 67108862 - outputs: - - scalar: 67108863 ---- -description: add_eint_int_arg_26bits -program: | - func.func @main(%arg0: !FHE.eint<26>, %arg1: i27) -> !FHE.eint<26> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<26>, i27) -> (!FHE.eint<26>) - return %0: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 67108862 - - scalar: 1 - outputs: - - scalar: 67108863 - - inputs: - - scalar: 67108863 - - scalar: 0 - outputs: - - scalar: 67108863 - - inputs: - - scalar: 33554431 - - scalar: 33554432 - outputs: - - scalar: 67108863 ---- -description: add_eint_26_bits -program: | - func.func @main(%arg0: !FHE.eint<26>, %arg1: !FHE.eint<26>) -> !FHE.eint<26> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<26>, !FHE.eint<26>) -> !FHE.eint<26> - return %res: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 33554431 - - scalar: 33554432 - outputs: - - scalar: 67108863 ---- -description: sub_eint_int_cst_26bits -program: | - func.func @main(%arg0: !FHE.eint<26>) -> !FHE.eint<26> { - %0 = arith.constant 67108863 : i27 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<26>, i27) -> (!FHE.eint<26>) - return %1: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 67108863 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_26bits -program: | - func.func @main(%arg0: !FHE.eint<26>, %arg1: i27) -> !FHE.eint<26> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<26>, i27) -> (!FHE.eint<26>) - return %1: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 67108863 - - scalar: 67108863 - outputs: - - scalar: 0 - - inputs: - - scalar: 67108863 - - scalar: 0 - outputs: - - scalar: 67108863 - - inputs: - - scalar: 67108862 - - scalar: 33554431 - outputs: - - scalar: 33554431 ---- -description: sub_int_eint_cst_26bits -program: | - func.func @main(%arg0: !FHE.eint<26>) -> !FHE.eint<26> { - %0 = arith.constant 67108863 : i27 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i27, !FHE.eint<26>) -> (!FHE.eint<26>) - return %1: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 67108863 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_26bits -program: | - func.func @main(%arg0: i27, %arg1: !FHE.eint<26>) -> !FHE.eint<26> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i27, !FHE.eint<26>) -> (!FHE.eint<26>) - return %1: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 67108863 - - scalar: 67108863 - outputs: - - scalar: 0 - - inputs: - - scalar: 67108863 - - scalar: 0 - outputs: - - scalar: 67108863 - - inputs: - - scalar: 67108862 - - scalar: 33554431 - outputs: - - scalar: 33554431 ---- -description: sub_eint_26bits -program: | - func.func @main(%arg0: !FHE.eint<26>, %arg1: !FHE.eint<26>) -> !FHE.eint<26> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<26>, !FHE.eint<26>) -> (!FHE.eint<26>) - return %1: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 67108863 - - scalar: 67108863 - outputs: - - scalar: 0 - - inputs: - - scalar: 67108863 - - scalar: 0 - outputs: - - scalar: 67108863 - - inputs: - - scalar: 67108862 - - scalar: 33554431 - outputs: - - scalar: 33554431 ---- -description: mul_eint_int_cst_26bits -program: | - func.func @main(%arg0: !FHE.eint<26>) -> !FHE.eint<26> { - %0 = arith.constant 2 : i27 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<26>, i27) -> (!FHE.eint<26>) - return %1: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 33554431 - outputs: - - scalar: 67108862 ---- -description: mul_eint_int_arg_26bits -program: | - func.func @main(%arg0: !FHE.eint<26>, %arg1: i27) -> !FHE.eint<26> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<26>, i27) -> (!FHE.eint<26>) - return %1: !FHE.eint<26> - } -tests: - - inputs: - - scalar: 0 - - scalar: 67108863 - outputs: - - scalar: 0 - - inputs: - - scalar: 67108863 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 67108863 - outputs: - - scalar: 67108863 - - inputs: - - scalar: 67108863 - - scalar: 1 - outputs: - - scalar: 67108863 ---- ---- -description: identity_27bits -program: | - func.func @main(%arg0: !FHE.eint<27>) -> !FHE.eint<27> { - return %arg0: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 134217727 - outputs: - - scalar: 134217727 ---- -description: zero_tensor_27bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<27>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<27>> - return %0: tensor<2x2x4x!FHE.eint<27>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_27bits -program: | - func.func @main(%arg0: !FHE.eint<27>) -> !FHE.eint<27> { - %0 = arith.constant 1 : i28 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<27>, i28) -> (!FHE.eint<27>) - return %1: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 134217726 - outputs: - - scalar: 134217727 ---- -description: add_eint_int_arg_27bits -program: | - func.func @main(%arg0: !FHE.eint<27>, %arg1: i28) -> !FHE.eint<27> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<27>, i28) -> (!FHE.eint<27>) - return %0: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 134217726 - - scalar: 1 - outputs: - - scalar: 134217727 - - inputs: - - scalar: 134217727 - - scalar: 0 - outputs: - - scalar: 134217727 - - inputs: - - scalar: 67108863 - - scalar: 67108864 - outputs: - - scalar: 134217727 ---- -description: add_eint_27_bits -program: | - func.func @main(%arg0: !FHE.eint<27>, %arg1: !FHE.eint<27>) -> !FHE.eint<27> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<27>, !FHE.eint<27>) -> !FHE.eint<27> - return %res: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 67108863 - - scalar: 67108864 - outputs: - - scalar: 134217727 ---- -description: sub_eint_int_cst_27bits -program: | - func.func @main(%arg0: !FHE.eint<27>) -> !FHE.eint<27> { - %0 = arith.constant 134217727 : i28 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<27>, i28) -> (!FHE.eint<27>) - return %1: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 134217727 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_27bits -program: | - func.func @main(%arg0: !FHE.eint<27>, %arg1: i28) -> !FHE.eint<27> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<27>, i28) -> (!FHE.eint<27>) - return %1: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 134217727 - - scalar: 134217727 - outputs: - - scalar: 0 - - inputs: - - scalar: 134217727 - - scalar: 0 - outputs: - - scalar: 134217727 - - inputs: - - scalar: 134217726 - - scalar: 67108863 - outputs: - - scalar: 67108863 ---- -description: sub_int_eint_cst_27bits -program: | - func.func @main(%arg0: !FHE.eint<27>) -> !FHE.eint<27> { - %0 = arith.constant 134217727 : i28 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i28, !FHE.eint<27>) -> (!FHE.eint<27>) - return %1: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 134217727 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_27bits -program: | - func.func @main(%arg0: i28, %arg1: !FHE.eint<27>) -> !FHE.eint<27> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i28, !FHE.eint<27>) -> (!FHE.eint<27>) - return %1: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 134217727 - - scalar: 134217727 - outputs: - - scalar: 0 - - inputs: - - scalar: 134217727 - - scalar: 0 - outputs: - - scalar: 134217727 - - inputs: - - scalar: 134217726 - - scalar: 67108863 - outputs: - - scalar: 67108863 ---- -description: sub_eint_27bits -program: | - func.func @main(%arg0: !FHE.eint<27>, %arg1: !FHE.eint<27>) -> !FHE.eint<27> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<27>, !FHE.eint<27>) -> (!FHE.eint<27>) - return %1: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 134217727 - - scalar: 134217727 - outputs: - - scalar: 0 - - inputs: - - scalar: 134217727 - - scalar: 0 - outputs: - - scalar: 134217727 - - inputs: - - scalar: 134217726 - - scalar: 67108863 - outputs: - - scalar: 67108863 ---- -description: mul_eint_int_cst_27bits -program: | - func.func @main(%arg0: !FHE.eint<27>) -> !FHE.eint<27> { - %0 = arith.constant 2 : i28 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<27>, i28) -> (!FHE.eint<27>) - return %1: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 67108863 - outputs: - - scalar: 134217726 ---- -description: mul_eint_int_arg_27bits -program: | - func.func @main(%arg0: !FHE.eint<27>, %arg1: i28) -> !FHE.eint<27> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<27>, i28) -> (!FHE.eint<27>) - return %1: !FHE.eint<27> - } -tests: - - inputs: - - scalar: 0 - - scalar: 134217727 - outputs: - - scalar: 0 - - inputs: - - scalar: 134217727 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 134217727 - outputs: - - scalar: 134217727 - - inputs: - - scalar: 134217727 - - scalar: 1 - outputs: - - scalar: 134217727 ---- ---- -description: identity_28bits -program: | - func.func @main(%arg0: !FHE.eint<28>) -> !FHE.eint<28> { - return %arg0: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 268435455 - outputs: - - scalar: 268435455 ---- -description: zero_tensor_28bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<28>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<28>> - return %0: tensor<2x2x4x!FHE.eint<28>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_28bits -program: | - func.func @main(%arg0: !FHE.eint<28>) -> !FHE.eint<28> { - %0 = arith.constant 1 : i29 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<28>, i29) -> (!FHE.eint<28>) - return %1: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 268435454 - outputs: - - scalar: 268435455 ---- -description: add_eint_int_arg_28bits -program: | - func.func @main(%arg0: !FHE.eint<28>, %arg1: i29) -> !FHE.eint<28> { - %0 = "FHE.add_eint_int"(%arg0, %arg1): (!FHE.eint<28>, i29) -> (!FHE.eint<28>) - return %0: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 268435454 - - scalar: 1 - outputs: - - scalar: 268435455 - - inputs: - - scalar: 268435455 - - scalar: 0 - outputs: - - scalar: 268435455 - - inputs: - - scalar: 134217727 - - scalar: 134217728 - outputs: - - scalar: 268435455 ---- -description: add_eint_28_bits -program: | - func.func @main(%arg0: !FHE.eint<28>, %arg1: !FHE.eint<28>) -> !FHE.eint<28> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<28>, !FHE.eint<28>) -> !FHE.eint<28> - return %res: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 134217727 - - scalar: 134217728 - outputs: - - scalar: 268435455 ---- -description: sub_eint_int_cst_28bits -program: | - func.func @main(%arg0: !FHE.eint<28>) -> !FHE.eint<28> { - %0 = arith.constant 268435455 : i29 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<28>, i29) -> (!FHE.eint<28>) - return %1: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 268435455 - outputs: - - scalar: 0 ---- -description: sub_eint_int_arg_28bits -program: | - func.func @main(%arg0: !FHE.eint<28>, %arg1: i29) -> !FHE.eint<28> { - %1 = "FHE.sub_eint_int"(%arg0, %arg1): (!FHE.eint<28>, i29) -> (!FHE.eint<28>) - return %1: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 268435455 - - scalar: 268435455 - outputs: - - scalar: 0 - - inputs: - - scalar: 268435455 - - scalar: 0 - outputs: - - scalar: 268435455 - - inputs: - - scalar: 268435454 - - scalar: 134217727 - outputs: - - scalar: 134217727 ---- -description: sub_int_eint_cst_28bits -program: | - func.func @main(%arg0: !FHE.eint<28>) -> !FHE.eint<28> { - %0 = arith.constant 268435455 : i29 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i29, !FHE.eint<28>) -> (!FHE.eint<28>) - return %1: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 268435455 - outputs: - - scalar: 0 ---- -description: sub_int_eint_arg_28bits -program: | - func.func @main(%arg0: i29, %arg1: !FHE.eint<28>) -> !FHE.eint<28> { - %1 = "FHE.sub_int_eint"(%arg0, %arg1): (i29, !FHE.eint<28>) -> (!FHE.eint<28>) - return %1: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 268435455 - - scalar: 268435455 - outputs: - - scalar: 0 - - inputs: - - scalar: 268435455 - - scalar: 0 - outputs: - - scalar: 268435455 - - inputs: - - scalar: 268435454 - - scalar: 134217727 - outputs: - - scalar: 134217727 ---- -description: sub_eint_28bits -program: | - func.func @main(%arg0: !FHE.eint<28>, %arg1: !FHE.eint<28>) -> !FHE.eint<28> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<28>, !FHE.eint<28>) -> (!FHE.eint<28>) - return %1: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 268435455 - - scalar: 268435455 - outputs: - - scalar: 0 - - inputs: - - scalar: 268435455 - - scalar: 0 - outputs: - - scalar: 268435455 - - inputs: - - scalar: 268435454 - - scalar: 134217727 - outputs: - - scalar: 134217727 ---- -description: mul_eint_int_cst_28bits -program: | - func.func @main(%arg0: !FHE.eint<28>) -> !FHE.eint<28> { - %0 = arith.constant 2 : i29 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<28>, i29) -> (!FHE.eint<28>) - return %1: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 134217727 - outputs: - - scalar: 268435454 ---- -description: mul_eint_int_arg_28bits -program: | - func.func @main(%arg0: !FHE.eint<28>, %arg1: i29) -> !FHE.eint<28> { - %1 = "FHE.mul_eint_int"(%arg0, %arg1): (!FHE.eint<28>, i29) -> (!FHE.eint<28>) - return %1: !FHE.eint<28> - } -tests: - - inputs: - - scalar: 0 - - scalar: 268435455 - outputs: - - scalar: 0 - - inputs: - - scalar: 268435455 - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1 - - scalar: 268435455 - outputs: - - scalar: 268435455 - - inputs: - - scalar: 268435455 - - scalar: 1 - outputs: - - scalar: 268435455 ---- ---- -description: identity_29bits -program: | - func.func @main(%arg0: !FHE.eint<29>) -> !FHE.eint<29> { - return %arg0: !FHE.eint<29> - } -tests: - - inputs: - - scalar: 536870911 - outputs: - - scalar: 536870911 ---- -description: zero_tensor_29bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<29>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<29>> - return %0: tensor<2x2x4x!FHE.eint<29>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_29bits -program: | - func.func @main(%arg0: !FHE.eint<29>) -> !FHE.eint<29> { - %0 = arith.constant 1 : i30 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<29>, i30) -> (!FHE.eint<29>) - return %1: !FHE.eint<29> - } -tests: - - inputs: - - scalar: 536870910 - outputs: - - scalar: 536870911 ---- -description: add_eint_29_bits -program: | - func.func @main(%arg0: !FHE.eint<29>, %arg1: !FHE.eint<29>) -> !FHE.eint<29> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<29>, !FHE.eint<29>) -> !FHE.eint<29> - return %res: !FHE.eint<29> - } -tests: - - inputs: - - scalar: 268435455 - - scalar: 268435456 - outputs: - - scalar: 536870911 ---- -description: sub_eint_int_cst_29bits -program: | - func.func @main(%arg0: !FHE.eint<29>) -> !FHE.eint<29> { - %0 = arith.constant 268435455 : i30 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<29>, i30) -> (!FHE.eint<29>) - return %1: !FHE.eint<29> - } -tests: - - inputs: - - scalar: 536870911 - outputs: - - scalar: 268435456 ---- -description: sub_int_eint_cst_29bits -program: | - func.func @main(%arg0: !FHE.eint<29>) -> !FHE.eint<29> { - %0 = arith.constant 268435455 : i30 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i30, !FHE.eint<29>) -> (!FHE.eint<29>) - return %1: !FHE.eint<29> - } -tests: - - inputs: - - scalar: 268435455 - outputs: - - scalar: 0 ---- -description: sub_eint_29bits -program: | - func.func @main(%arg0: !FHE.eint<29>, %arg1: !FHE.eint<29>) -> !FHE.eint<29> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<29>, !FHE.eint<29>) -> (!FHE.eint<29>) - return %1: !FHE.eint<29> - } -tests: - - inputs: - - scalar: 536870911 - - scalar: 536870911 - outputs: - - scalar: 0 - - inputs: - - scalar: 536870911 - - scalar: 0 - outputs: - - scalar: 536870911 - - inputs: - - scalar: 536870910 - - scalar: 268435455 - outputs: - - scalar: 268435455 ---- -description: mul_eint_int_cst_29bits -program: | - func.func @main(%arg0: !FHE.eint<29>) -> !FHE.eint<29> { - %0 = arith.constant 2 : i30 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<29>, i30) -> (!FHE.eint<29>) - return %1: !FHE.eint<29> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 268435455 - outputs: - - scalar: 536870910 ---- ---- -description: identity_30bits -program: | - func.func @main(%arg0: !FHE.eint<30>) -> !FHE.eint<30> { - return %arg0: !FHE.eint<30> - } -tests: - - inputs: - - scalar: 1073741823 - outputs: - - scalar: 1073741823 ---- -description: zero_tensor_30bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<30>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<30>> - return %0: tensor<2x2x4x!FHE.eint<30>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_30bits -program: | - func.func @main(%arg0: !FHE.eint<30>) -> !FHE.eint<30> { - %0 = arith.constant 1 : i31 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<30>, i31) -> (!FHE.eint<30>) - return %1: !FHE.eint<30> - } -tests: - - inputs: - - scalar: 1073741822 - outputs: - - scalar: 1073741823 ---- -description: add_eint_30_bits -program: | - func.func @main(%arg0: !FHE.eint<30>, %arg1: !FHE.eint<30>) -> !FHE.eint<30> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<30>, !FHE.eint<30>) -> !FHE.eint<30> - return %res: !FHE.eint<30> - } -tests: - - inputs: - - scalar: 536870911 - - scalar: 536870912 - outputs: - - scalar: 1073741823 ---- -description: sub_eint_int_cst_30bits -program: | - func.func @main(%arg0: !FHE.eint<30>) -> !FHE.eint<30> { - %0 = arith.constant 134217727 : i31 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<30>, i31) -> (!FHE.eint<30>) - return %1: !FHE.eint<30> - } -tests: - - inputs: - - scalar: 1073741823 - outputs: - - scalar: 939524096 ---- -description: sub_int_eint_cst_30bits -program: | - func.func @main(%arg0: !FHE.eint<30>) -> !FHE.eint<30> { - %0 = arith.constant 134217727 : i31 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i31, !FHE.eint<30>) -> (!FHE.eint<30>) - return %1: !FHE.eint<30> - } -tests: - - inputs: - - scalar: 134217727 - outputs: - - scalar: 0 ---- -description: sub_eint_30bits -program: | - func.func @main(%arg0: !FHE.eint<30>, %arg1: !FHE.eint<30>) -> !FHE.eint<30> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<30>, !FHE.eint<30>) -> (!FHE.eint<30>) - return %1: !FHE.eint<30> - } -tests: - - inputs: - - scalar: 1073741823 - - scalar: 1073741823 - outputs: - - scalar: 0 - - inputs: - - scalar: 1073741823 - - scalar: 0 - outputs: - - scalar: 1073741823 - - inputs: - - scalar: 1073741822 - - scalar: 536870911 - outputs: - - scalar: 536870911 ---- -description: mul_eint_int_cst_30bits -program: | - func.func @main(%arg0: !FHE.eint<30>) -> !FHE.eint<30> { - %0 = arith.constant 2 : i31 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<30>, i31) -> (!FHE.eint<30>) - return %1: !FHE.eint<30> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 536870911 - outputs: - - scalar: 1073741822 ---- ---- -description: identity_31bits -program: | - func.func @main(%arg0: !FHE.eint<31>) -> !FHE.eint<31> { - return %arg0: !FHE.eint<31> - } -tests: - - inputs: - - scalar: 2147483647 - outputs: - - scalar: 2147483647 ---- -description: zero_tensor_31bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<31>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<31>> - return %0: tensor<2x2x4x!FHE.eint<31>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_31bits -program: | - func.func @main(%arg0: !FHE.eint<31>) -> !FHE.eint<31> { - %0 = arith.constant 1 : i32 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<31>, i32) -> (!FHE.eint<31>) - return %1: !FHE.eint<31> - } -tests: - - inputs: - - scalar: 2147483646 - outputs: - - scalar: 2147483647 ---- -description: add_eint_31_bits -program: | - func.func @main(%arg0: !FHE.eint<31>, %arg1: !FHE.eint<31>) -> !FHE.eint<31> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<31>, !FHE.eint<31>) -> !FHE.eint<31> - return %res: !FHE.eint<31> - } -tests: - - inputs: - - scalar: 1073741823 - - scalar: 1073741824 - outputs: - - scalar: 2147483647 ---- -description: sub_eint_int_cst_31bits -program: | - func.func @main(%arg0: !FHE.eint<31>) -> !FHE.eint<31> { - %0 = arith.constant 67108863 : i32 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<31>, i32) -> (!FHE.eint<31>) - return %1: !FHE.eint<31> - } -tests: - - inputs: - - scalar: 2147483647 - outputs: - - scalar: 2080374784 ---- -description: sub_int_eint_cst_31bits -program: | - func.func @main(%arg0: !FHE.eint<31>) -> !FHE.eint<31> { - %0 = arith.constant 67108863 : i32 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i32, !FHE.eint<31>) -> (!FHE.eint<31>) - return %1: !FHE.eint<31> - } -tests: - - inputs: - - scalar: 67108863 - outputs: - - scalar: 0 ---- -description: sub_eint_31bits -program: | - func.func @main(%arg0: !FHE.eint<31>, %arg1: !FHE.eint<31>) -> !FHE.eint<31> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<31>, !FHE.eint<31>) -> (!FHE.eint<31>) - return %1: !FHE.eint<31> - } -tests: - - inputs: - - scalar: 2147483647 - - scalar: 2147483647 - outputs: - - scalar: 0 - - inputs: - - scalar: 2147483647 - - scalar: 0 - outputs: - - scalar: 2147483647 - - inputs: - - scalar: 2147483646 - - scalar: 1073741823 - outputs: - - scalar: 1073741823 ---- -description: mul_eint_int_cst_31bits -program: | - func.func @main(%arg0: !FHE.eint<31>) -> !FHE.eint<31> { - %0 = arith.constant 2 : i32 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<31>, i32) -> (!FHE.eint<31>) - return %1: !FHE.eint<31> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1073741823 - outputs: - - scalar: 2147483646 ---- ---- -description: identity_32bits -program: | - func.func @main(%arg0: !FHE.eint<32>) -> !FHE.eint<32> { - return %arg0: !FHE.eint<32> - } -tests: - - inputs: - - scalar: 4294967295 - outputs: - - scalar: 4294967295 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: zero_tensor_32bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<32>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<32>> - return %0: tensor<2x2x4x!FHE.eint<32>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_cst_32bits -program: | - func.func @main(%arg0: !FHE.eint<32>) -> !FHE.eint<32> { - %0 = arith.constant 1 : i33 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<32>, i33) -> (!FHE.eint<32>) - return %1: !FHE.eint<32> - } -tests: - - inputs: - - scalar: 4294967294 - outputs: - - scalar: 4294967295 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_32_bits -program: | - func.func @main(%arg0: !FHE.eint<32>, %arg1: !FHE.eint<32>) -> !FHE.eint<32> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<32>, !FHE.eint<32>) -> !FHE.eint<32> - return %res: !FHE.eint<32> - } -tests: - - inputs: - - scalar: 2147483647 - - scalar: 2147483648 - outputs: - - scalar: 4294967295 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_cst_32bits -program: | - func.func @main(%arg0: !FHE.eint<32>) -> !FHE.eint<32> { - %0 = arith.constant 33554431 : i33 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<32>, i33) -> (!FHE.eint<32>) - return %1: !FHE.eint<32> - } -tests: - - inputs: - - scalar: 4294967295 - outputs: - - scalar: 4261412864 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_cst_32bits -program: | - func.func @main(%arg0: !FHE.eint<32>) -> !FHE.eint<32> { - %0 = arith.constant 33554431 : i33 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i33, !FHE.eint<32>) -> (!FHE.eint<32>) - return %1: !FHE.eint<32> - } -tests: - - inputs: - - scalar: 33554431 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_32bits -program: | - func.func @main(%arg0: !FHE.eint<32>, %arg1: !FHE.eint<32>) -> !FHE.eint<32> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<32>, !FHE.eint<32>) -> (!FHE.eint<32>) - return %1: !FHE.eint<32> - } -tests: - - inputs: - - scalar: 4294967295 - - scalar: 4294967295 - outputs: - - scalar: 0 - - inputs: - - scalar: 4294967295 - - scalar: 0 - outputs: - - scalar: 4294967295 - - inputs: - - scalar: 4294967294 - - scalar: 2147483647 - outputs: - - scalar: 2147483647 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_cst_32bits -program: | - func.func @main(%arg0: !FHE.eint<32>) -> !FHE.eint<32> { - %0 = arith.constant 2 : i33 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<32>, i33) -> (!FHE.eint<32>) - return %1: !FHE.eint<32> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 2147483647 - outputs: - - scalar: 4294967294 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- ---- -description: identity_33bits -program: | - func.func @main(%arg0: !FHE.eint<33>) -> !FHE.eint<33> { - return %arg0: !FHE.eint<33> - } -tests: - - inputs: - - scalar: 8589934591 - outputs: - - scalar: 8589934591 ---- -description: zero_tensor_33bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<33>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<33>> - return %0: tensor<2x2x4x!FHE.eint<33>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_33bits -program: | - func.func @main(%arg0: !FHE.eint<33>) -> !FHE.eint<33> { - %0 = arith.constant 1 : i34 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<33>, i34) -> (!FHE.eint<33>) - return %1: !FHE.eint<33> - } -tests: - - inputs: - - scalar: 8589934590 - outputs: - - scalar: 8589934591 ---- -description: add_eint_33_bits -program: | - func.func @main(%arg0: !FHE.eint<33>, %arg1: !FHE.eint<33>) -> !FHE.eint<33> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<33>, !FHE.eint<33>) -> !FHE.eint<33> - return %res: !FHE.eint<33> - } -tests: - - inputs: - - scalar: 4294967295 - - scalar: 4294967296 - outputs: - - scalar: 8589934591 ---- -description: sub_eint_int_cst_33bits -program: | - func.func @main(%arg0: !FHE.eint<33>) -> !FHE.eint<33> { - %0 = arith.constant 16777215 : i34 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<33>, i34) -> (!FHE.eint<33>) - return %1: !FHE.eint<33> - } -tests: - - inputs: - - scalar: 8589934591 - outputs: - - scalar: 8573157376 ---- -description: sub_int_eint_cst_33bits -program: | - func.func @main(%arg0: !FHE.eint<33>) -> !FHE.eint<33> { - %0 = arith.constant 16777215 : i34 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i34, !FHE.eint<33>) -> (!FHE.eint<33>) - return %1: !FHE.eint<33> - } -tests: - - inputs: - - scalar: 16777215 - outputs: - - scalar: 0 ---- -description: sub_eint_33bits -program: | - func.func @main(%arg0: !FHE.eint<33>, %arg1: !FHE.eint<33>) -> !FHE.eint<33> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<33>, !FHE.eint<33>) -> (!FHE.eint<33>) - return %1: !FHE.eint<33> - } -tests: - - inputs: - - scalar: 8589934591 - - scalar: 8589934591 - outputs: - - scalar: 0 - - inputs: - - scalar: 8589934591 - - scalar: 0 - outputs: - - scalar: 8589934591 - - inputs: - - scalar: 8589934590 - - scalar: 4294967295 - outputs: - - scalar: 4294967295 ---- -description: mul_eint_int_cst_33bits -program: | - func.func @main(%arg0: !FHE.eint<33>) -> !FHE.eint<33> { - %0 = arith.constant 2 : i34 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<33>, i34) -> (!FHE.eint<33>) - return %1: !FHE.eint<33> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 4294967295 - outputs: - - scalar: 8589934590 ---- ---- -description: identity_34bits -program: | - func.func @main(%arg0: !FHE.eint<34>) -> !FHE.eint<34> { - return %arg0: !FHE.eint<34> - } -tests: - - inputs: - - scalar: 17179869183 - outputs: - - scalar: 17179869183 ---- -description: zero_tensor_34bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<34>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<34>> - return %0: tensor<2x2x4x!FHE.eint<34>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_34bits -program: | - func.func @main(%arg0: !FHE.eint<34>) -> !FHE.eint<34> { - %0 = arith.constant 1 : i35 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<34>, i35) -> (!FHE.eint<34>) - return %1: !FHE.eint<34> - } -tests: - - inputs: - - scalar: 17179869182 - outputs: - - scalar: 17179869183 ---- -description: add_eint_34_bits -program: | - func.func @main(%arg0: !FHE.eint<34>, %arg1: !FHE.eint<34>) -> !FHE.eint<34> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<34>, !FHE.eint<34>) -> !FHE.eint<34> - return %res: !FHE.eint<34> - } -tests: - - inputs: - - scalar: 8589934591 - - scalar: 8589934592 - outputs: - - scalar: 17179869183 ---- -description: sub_eint_int_cst_34bits -program: | - func.func @main(%arg0: !FHE.eint<34>) -> !FHE.eint<34> { - %0 = arith.constant 8388607 : i35 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<34>, i35) -> (!FHE.eint<34>) - return %1: !FHE.eint<34> - } -tests: - - inputs: - - scalar: 17179869183 - outputs: - - scalar: 17171480576 ---- -description: sub_int_eint_cst_34bits -program: | - func.func @main(%arg0: !FHE.eint<34>) -> !FHE.eint<34> { - %0 = arith.constant 8388607 : i35 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i35, !FHE.eint<34>) -> (!FHE.eint<34>) - return %1: !FHE.eint<34> - } -tests: - - inputs: - - scalar: 8388607 - outputs: - - scalar: 0 ---- -description: sub_eint_34bits -program: | - func.func @main(%arg0: !FHE.eint<34>, %arg1: !FHE.eint<34>) -> !FHE.eint<34> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<34>, !FHE.eint<34>) -> (!FHE.eint<34>) - return %1: !FHE.eint<34> - } -tests: - - inputs: - - scalar: 17179869183 - - scalar: 17179869183 - outputs: - - scalar: 0 - - inputs: - - scalar: 17179869183 - - scalar: 0 - outputs: - - scalar: 17179869183 - - inputs: - - scalar: 17179869182 - - scalar: 8589934591 - outputs: - - scalar: 8589934591 ---- -description: mul_eint_int_cst_34bits -program: | - func.func @main(%arg0: !FHE.eint<34>) -> !FHE.eint<34> { - %0 = arith.constant 2 : i35 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<34>, i35) -> (!FHE.eint<34>) - return %1: !FHE.eint<34> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 8589934591 - outputs: - - scalar: 17179869182 ---- ---- -description: identity_35bits -program: | - func.func @main(%arg0: !FHE.eint<35>) -> !FHE.eint<35> { - return %arg0: !FHE.eint<35> - } -tests: - - inputs: - - scalar: 34359738367 - outputs: - - scalar: 34359738367 ---- -description: zero_tensor_35bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<35>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<35>> - return %0: tensor<2x2x4x!FHE.eint<35>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_35bits -program: | - func.func @main(%arg0: !FHE.eint<35>) -> !FHE.eint<35> { - %0 = arith.constant 1 : i36 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<35>, i36) -> (!FHE.eint<35>) - return %1: !FHE.eint<35> - } -tests: - - inputs: - - scalar: 34359738366 - outputs: - - scalar: 34359738367 ---- -description: add_eint_35_bits -program: | - func.func @main(%arg0: !FHE.eint<35>, %arg1: !FHE.eint<35>) -> !FHE.eint<35> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<35>, !FHE.eint<35>) -> !FHE.eint<35> - return %res: !FHE.eint<35> - } -tests: - - inputs: - - scalar: 17179869183 - - scalar: 17179869184 - outputs: - - scalar: 34359738367 ---- -description: sub_eint_int_cst_35bits -program: | - func.func @main(%arg0: !FHE.eint<35>) -> !FHE.eint<35> { - %0 = arith.constant 4194303 : i36 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<35>, i36) -> (!FHE.eint<35>) - return %1: !FHE.eint<35> - } -tests: - - inputs: - - scalar: 34359738367 - outputs: - - scalar: 34355544064 ---- -description: sub_int_eint_cst_35bits -program: | - func.func @main(%arg0: !FHE.eint<35>) -> !FHE.eint<35> { - %0 = arith.constant 4194303 : i36 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i36, !FHE.eint<35>) -> (!FHE.eint<35>) - return %1: !FHE.eint<35> - } -tests: - - inputs: - - scalar: 4194303 - outputs: - - scalar: 0 ---- -description: sub_eint_35bits -program: | - func.func @main(%arg0: !FHE.eint<35>, %arg1: !FHE.eint<35>) -> !FHE.eint<35> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<35>, !FHE.eint<35>) -> (!FHE.eint<35>) - return %1: !FHE.eint<35> - } -tests: - - inputs: - - scalar: 34359738367 - - scalar: 34359738367 - outputs: - - scalar: 0 - - inputs: - - scalar: 34359738367 - - scalar: 0 - outputs: - - scalar: 34359738367 - - inputs: - - scalar: 34359738366 - - scalar: 17179869183 - outputs: - - scalar: 17179869183 ---- -description: mul_eint_int_cst_35bits -program: | - func.func @main(%arg0: !FHE.eint<35>) -> !FHE.eint<35> { - %0 = arith.constant 2 : i36 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<35>, i36) -> (!FHE.eint<35>) - return %1: !FHE.eint<35> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 17179869183 - outputs: - - scalar: 34359738366 ---- ---- -description: identity_36bits -program: | - func.func @main(%arg0: !FHE.eint<36>) -> !FHE.eint<36> { - return %arg0: !FHE.eint<36> - } -tests: - - inputs: - - scalar: 68719476735 - outputs: - - scalar: 68719476735 ---- -description: zero_tensor_36bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<36>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<36>> - return %0: tensor<2x2x4x!FHE.eint<36>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_36bits -program: | - func.func @main(%arg0: !FHE.eint<36>) -> !FHE.eint<36> { - %0 = arith.constant 1 : i37 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<36>, i37) -> (!FHE.eint<36>) - return %1: !FHE.eint<36> - } -tests: - - inputs: - - scalar: 68719476734 - outputs: - - scalar: 68719476735 ---- -description: add_eint_36_bits -program: | - func.func @main(%arg0: !FHE.eint<36>, %arg1: !FHE.eint<36>) -> !FHE.eint<36> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<36>, !FHE.eint<36>) -> !FHE.eint<36> - return %res: !FHE.eint<36> - } -tests: - - inputs: - - scalar: 34359738367 - - scalar: 34359738368 - outputs: - - scalar: 68719476735 ---- -description: sub_eint_int_cst_36bits -program: | - func.func @main(%arg0: !FHE.eint<36>) -> !FHE.eint<36> { - %0 = arith.constant 2097151 : i37 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<36>, i37) -> (!FHE.eint<36>) - return %1: !FHE.eint<36> - } -tests: - - inputs: - - scalar: 68719476735 - outputs: - - scalar: 68717379584 ---- -description: sub_int_eint_cst_36bits -program: | - func.func @main(%arg0: !FHE.eint<36>) -> !FHE.eint<36> { - %0 = arith.constant 2097151 : i37 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i37, !FHE.eint<36>) -> (!FHE.eint<36>) - return %1: !FHE.eint<36> - } -tests: - - inputs: - - scalar: 2097151 - outputs: - - scalar: 0 ---- -description: sub_eint_36bits -program: | - func.func @main(%arg0: !FHE.eint<36>, %arg1: !FHE.eint<36>) -> !FHE.eint<36> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<36>, !FHE.eint<36>) -> (!FHE.eint<36>) - return %1: !FHE.eint<36> - } -tests: - - inputs: - - scalar: 68719476735 - - scalar: 68719476735 - outputs: - - scalar: 0 - - inputs: - - scalar: 68719476735 - - scalar: 0 - outputs: - - scalar: 68719476735 - - inputs: - - scalar: 68719476734 - - scalar: 34359738367 - outputs: - - scalar: 34359738367 ---- -description: mul_eint_int_cst_36bits -program: | - func.func @main(%arg0: !FHE.eint<36>) -> !FHE.eint<36> { - %0 = arith.constant 2 : i37 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<36>, i37) -> (!FHE.eint<36>) - return %1: !FHE.eint<36> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 34359738367 - outputs: - - scalar: 68719476734 ---- ---- -description: identity_37bits -program: | - func.func @main(%arg0: !FHE.eint<37>) -> !FHE.eint<37> { - return %arg0: !FHE.eint<37> - } -tests: - - inputs: - - scalar: 137438953471 - outputs: - - scalar: 137438953471 ---- -description: zero_tensor_37bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<37>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<37>> - return %0: tensor<2x2x4x!FHE.eint<37>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_37bits -program: | - func.func @main(%arg0: !FHE.eint<37>) -> !FHE.eint<37> { - %0 = arith.constant 1 : i38 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<37>, i38) -> (!FHE.eint<37>) - return %1: !FHE.eint<37> - } -tests: - - inputs: - - scalar: 137438953470 - outputs: - - scalar: 137438953471 ---- -description: add_eint_37_bits -program: | - func.func @main(%arg0: !FHE.eint<37>, %arg1: !FHE.eint<37>) -> !FHE.eint<37> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<37>, !FHE.eint<37>) -> !FHE.eint<37> - return %res: !FHE.eint<37> - } -tests: - - inputs: - - scalar: 68719476735 - - scalar: 68719476736 - outputs: - - scalar: 137438953471 ---- -description: sub_eint_int_cst_37bits -program: | - func.func @main(%arg0: !FHE.eint<37>) -> !FHE.eint<37> { - %0 = arith.constant 1048575 : i38 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<37>, i38) -> (!FHE.eint<37>) - return %1: !FHE.eint<37> - } -tests: - - inputs: - - scalar: 137438953471 - outputs: - - scalar: 137437904896 ---- -description: sub_int_eint_cst_37bits -program: | - func.func @main(%arg0: !FHE.eint<37>) -> !FHE.eint<37> { - %0 = arith.constant 1048575 : i38 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i38, !FHE.eint<37>) -> (!FHE.eint<37>) - return %1: !FHE.eint<37> - } -tests: - - inputs: - - scalar: 1048575 - outputs: - - scalar: 0 ---- -description: sub_eint_37bits -program: | - func.func @main(%arg0: !FHE.eint<37>, %arg1: !FHE.eint<37>) -> !FHE.eint<37> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<37>, !FHE.eint<37>) -> (!FHE.eint<37>) - return %1: !FHE.eint<37> - } -tests: - - inputs: - - scalar: 137438953471 - - scalar: 137438953471 - outputs: - - scalar: 0 - - inputs: - - scalar: 137438953471 - - scalar: 0 - outputs: - - scalar: 137438953471 - - inputs: - - scalar: 137438953470 - - scalar: 68719476735 - outputs: - - scalar: 68719476735 ---- -description: mul_eint_int_cst_37bits -program: | - func.func @main(%arg0: !FHE.eint<37>) -> !FHE.eint<37> { - %0 = arith.constant 2 : i38 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<37>, i38) -> (!FHE.eint<37>) - return %1: !FHE.eint<37> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 68719476735 - outputs: - - scalar: 137438953470 ---- ---- -description: identity_38bits -program: | - func.func @main(%arg0: !FHE.eint<38>) -> !FHE.eint<38> { - return %arg0: !FHE.eint<38> - } -tests: - - inputs: - - scalar: 274877906943 - outputs: - - scalar: 274877906943 ---- -description: zero_tensor_38bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<38>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<38>> - return %0: tensor<2x2x4x!FHE.eint<38>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_38bits -program: | - func.func @main(%arg0: !FHE.eint<38>) -> !FHE.eint<38> { - %0 = arith.constant 1 : i39 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<38>, i39) -> (!FHE.eint<38>) - return %1: !FHE.eint<38> - } -tests: - - inputs: - - scalar: 274877906942 - outputs: - - scalar: 274877906943 ---- -description: add_eint_38_bits -program: | - func.func @main(%arg0: !FHE.eint<38>, %arg1: !FHE.eint<38>) -> !FHE.eint<38> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<38>, !FHE.eint<38>) -> !FHE.eint<38> - return %res: !FHE.eint<38> - } -tests: - - inputs: - - scalar: 137438953471 - - scalar: 137438953472 - outputs: - - scalar: 274877906943 ---- -description: sub_eint_int_cst_38bits -program: | - func.func @main(%arg0: !FHE.eint<38>) -> !FHE.eint<38> { - %0 = arith.constant 524287 : i39 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<38>, i39) -> (!FHE.eint<38>) - return %1: !FHE.eint<38> - } -tests: - - inputs: - - scalar: 274877906943 - outputs: - - scalar: 274877382656 ---- -description: sub_int_eint_cst_38bits -program: | - func.func @main(%arg0: !FHE.eint<38>) -> !FHE.eint<38> { - %0 = arith.constant 524287 : i39 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i39, !FHE.eint<38>) -> (!FHE.eint<38>) - return %1: !FHE.eint<38> - } -tests: - - inputs: - - scalar: 524287 - outputs: - - scalar: 0 ---- -description: sub_eint_38bits -program: | - func.func @main(%arg0: !FHE.eint<38>, %arg1: !FHE.eint<38>) -> !FHE.eint<38> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<38>, !FHE.eint<38>) -> (!FHE.eint<38>) - return %1: !FHE.eint<38> - } -tests: - - inputs: - - scalar: 274877906943 - - scalar: 274877906943 - outputs: - - scalar: 0 - - inputs: - - scalar: 274877906943 - - scalar: 0 - outputs: - - scalar: 274877906943 - - inputs: - - scalar: 274877906942 - - scalar: 137438953471 - outputs: - - scalar: 137438953471 ---- -description: mul_eint_int_cst_38bits -program: | - func.func @main(%arg0: !FHE.eint<38>) -> !FHE.eint<38> { - %0 = arith.constant 2 : i39 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<38>, i39) -> (!FHE.eint<38>) - return %1: !FHE.eint<38> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 137438953471 - outputs: - - scalar: 274877906942 ---- ---- -description: identity_39bits -program: | - func.func @main(%arg0: !FHE.eint<39>) -> !FHE.eint<39> { - return %arg0: !FHE.eint<39> - } -tests: - - inputs: - - scalar: 549755813887 - outputs: - - scalar: 549755813887 ---- -description: zero_tensor_39bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<39>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<39>> - return %0: tensor<2x2x4x!FHE.eint<39>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_39bits -program: | - func.func @main(%arg0: !FHE.eint<39>) -> !FHE.eint<39> { - %0 = arith.constant 1 : i40 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<39>, i40) -> (!FHE.eint<39>) - return %1: !FHE.eint<39> - } -tests: - - inputs: - - scalar: 549755813886 - outputs: - - scalar: 549755813887 ---- -description: add_eint_39_bits -program: | - func.func @main(%arg0: !FHE.eint<39>, %arg1: !FHE.eint<39>) -> !FHE.eint<39> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<39>, !FHE.eint<39>) -> !FHE.eint<39> - return %res: !FHE.eint<39> - } -tests: - - inputs: - - scalar: 274877906943 - - scalar: 274877906944 - outputs: - - scalar: 549755813887 ---- -description: sub_eint_int_cst_39bits -program: | - func.func @main(%arg0: !FHE.eint<39>) -> !FHE.eint<39> { - %0 = arith.constant 262143 : i40 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<39>, i40) -> (!FHE.eint<39>) - return %1: !FHE.eint<39> - } -tests: - - inputs: - - scalar: 549755813887 - outputs: - - scalar: 549755551744 ---- -description: sub_int_eint_cst_39bits -program: | - func.func @main(%arg0: !FHE.eint<39>) -> !FHE.eint<39> { - %0 = arith.constant 262143 : i40 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i40, !FHE.eint<39>) -> (!FHE.eint<39>) - return %1: !FHE.eint<39> - } -tests: - - inputs: - - scalar: 262143 - outputs: - - scalar: 0 ---- -description: sub_eint_39bits -program: | - func.func @main(%arg0: !FHE.eint<39>, %arg1: !FHE.eint<39>) -> !FHE.eint<39> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<39>, !FHE.eint<39>) -> (!FHE.eint<39>) - return %1: !FHE.eint<39> - } -tests: - - inputs: - - scalar: 549755813887 - - scalar: 549755813887 - outputs: - - scalar: 0 - - inputs: - - scalar: 549755813887 - - scalar: 0 - outputs: - - scalar: 549755813887 - - inputs: - - scalar: 549755813886 - - scalar: 274877906943 - outputs: - - scalar: 274877906943 ---- -description: mul_eint_int_cst_39bits -program: | - func.func @main(%arg0: !FHE.eint<39>) -> !FHE.eint<39> { - %0 = arith.constant 2 : i40 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<39>, i40) -> (!FHE.eint<39>) - return %1: !FHE.eint<39> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 274877906943 - outputs: - - scalar: 549755813886 ---- ---- -description: identity_40bits -program: | - func.func @main(%arg0: !FHE.eint<40>) -> !FHE.eint<40> { - return %arg0: !FHE.eint<40> - } -tests: - - inputs: - - scalar: 1099511627775 - outputs: - - scalar: 1099511627775 ---- -description: zero_tensor_40bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<40>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<40>> - return %0: tensor<2x2x4x!FHE.eint<40>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_40bits -program: | - func.func @main(%arg0: !FHE.eint<40>) -> !FHE.eint<40> { - %0 = arith.constant 1 : i41 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<40>, i41) -> (!FHE.eint<40>) - return %1: !FHE.eint<40> - } -tests: - - inputs: - - scalar: 1099511627774 - outputs: - - scalar: 1099511627775 ---- -description: add_eint_40_bits -program: | - func.func @main(%arg0: !FHE.eint<40>, %arg1: !FHE.eint<40>) -> !FHE.eint<40> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<40>, !FHE.eint<40>) -> !FHE.eint<40> - return %res: !FHE.eint<40> - } -tests: - - inputs: - - scalar: 549755813887 - - scalar: 549755813888 - outputs: - - scalar: 1099511627775 ---- -description: sub_eint_int_cst_40bits -program: | - func.func @main(%arg0: !FHE.eint<40>) -> !FHE.eint<40> { - %0 = arith.constant 131071 : i41 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<40>, i41) -> (!FHE.eint<40>) - return %1: !FHE.eint<40> - } -tests: - - inputs: - - scalar: 1099511627775 - outputs: - - scalar: 1099511496704 ---- -description: sub_int_eint_cst_40bits -program: | - func.func @main(%arg0: !FHE.eint<40>) -> !FHE.eint<40> { - %0 = arith.constant 131071 : i41 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i41, !FHE.eint<40>) -> (!FHE.eint<40>) - return %1: !FHE.eint<40> - } -tests: - - inputs: - - scalar: 131071 - outputs: - - scalar: 0 ---- -description: sub_eint_40bits -program: | - func.func @main(%arg0: !FHE.eint<40>, %arg1: !FHE.eint<40>) -> !FHE.eint<40> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<40>, !FHE.eint<40>) -> (!FHE.eint<40>) - return %1: !FHE.eint<40> - } -tests: - - inputs: - - scalar: 1099511627775 - - scalar: 1099511627775 - outputs: - - scalar: 0 - - inputs: - - scalar: 1099511627775 - - scalar: 0 - outputs: - - scalar: 1099511627775 - - inputs: - - scalar: 1099511627774 - - scalar: 549755813887 - outputs: - - scalar: 549755813887 ---- -description: mul_eint_int_cst_40bits -program: | - func.func @main(%arg0: !FHE.eint<40>) -> !FHE.eint<40> { - %0 = arith.constant 2 : i41 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<40>, i41) -> (!FHE.eint<40>) - return %1: !FHE.eint<40> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 549755813887 - outputs: - - scalar: 1099511627774 ---- ---- -description: identity_41bits -program: | - func.func @main(%arg0: !FHE.eint<41>) -> !FHE.eint<41> { - return %arg0: !FHE.eint<41> - } -tests: - - inputs: - - scalar: 2199023255551 - outputs: - - scalar: 2199023255551 ---- -description: zero_tensor_41bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<41>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<41>> - return %0: tensor<2x2x4x!FHE.eint<41>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_41bits -program: | - func.func @main(%arg0: !FHE.eint<41>) -> !FHE.eint<41> { - %0 = arith.constant 1 : i42 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<41>, i42) -> (!FHE.eint<41>) - return %1: !FHE.eint<41> - } -tests: - - inputs: - - scalar: 2199023255550 - outputs: - - scalar: 2199023255551 ---- -description: add_eint_41_bits -program: | - func.func @main(%arg0: !FHE.eint<41>, %arg1: !FHE.eint<41>) -> !FHE.eint<41> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<41>, !FHE.eint<41>) -> !FHE.eint<41> - return %res: !FHE.eint<41> - } -tests: - - inputs: - - scalar: 1099511627775 - - scalar: 1099511627776 - outputs: - - scalar: 2199023255551 ---- -description: sub_eint_int_cst_41bits -program: | - func.func @main(%arg0: !FHE.eint<41>) -> !FHE.eint<41> { - %0 = arith.constant 65535 : i42 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<41>, i42) -> (!FHE.eint<41>) - return %1: !FHE.eint<41> - } -tests: - - inputs: - - scalar: 2199023255551 - outputs: - - scalar: 2199023190016 ---- -description: sub_int_eint_cst_41bits -program: | - func.func @main(%arg0: !FHE.eint<41>) -> !FHE.eint<41> { - %0 = arith.constant 65535 : i42 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i42, !FHE.eint<41>) -> (!FHE.eint<41>) - return %1: !FHE.eint<41> - } -tests: - - inputs: - - scalar: 65535 - outputs: - - scalar: 0 ---- -description: sub_eint_41bits -program: | - func.func @main(%arg0: !FHE.eint<41>, %arg1: !FHE.eint<41>) -> !FHE.eint<41> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<41>, !FHE.eint<41>) -> (!FHE.eint<41>) - return %1: !FHE.eint<41> - } -tests: - - inputs: - - scalar: 2199023255551 - - scalar: 2199023255551 - outputs: - - scalar: 0 - - inputs: - - scalar: 2199023255551 - - scalar: 0 - outputs: - - scalar: 2199023255551 - - inputs: - - scalar: 2199023255550 - - scalar: 1099511627775 - outputs: - - scalar: 1099511627775 ---- -description: mul_eint_int_cst_41bits -program: | - func.func @main(%arg0: !FHE.eint<41>) -> !FHE.eint<41> { - %0 = arith.constant 2 : i42 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<41>, i42) -> (!FHE.eint<41>) - return %1: !FHE.eint<41> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1099511627775 - outputs: - - scalar: 2199023255550 ---- ---- -description: identity_42bits -program: | - func.func @main(%arg0: !FHE.eint<42>) -> !FHE.eint<42> { - return %arg0: !FHE.eint<42> - } -tests: - - inputs: - - scalar: 4398046511103 - outputs: - - scalar: 4398046511103 ---- -description: zero_tensor_42bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<42>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<42>> - return %0: tensor<2x2x4x!FHE.eint<42>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_42bits -program: | - func.func @main(%arg0: !FHE.eint<42>) -> !FHE.eint<42> { - %0 = arith.constant 1 : i43 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<42>, i43) -> (!FHE.eint<42>) - return %1: !FHE.eint<42> - } -tests: - - inputs: - - scalar: 4398046511102 - outputs: - - scalar: 4398046511103 ---- -description: add_eint_42_bits -program: | - func.func @main(%arg0: !FHE.eint<42>, %arg1: !FHE.eint<42>) -> !FHE.eint<42> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<42>, !FHE.eint<42>) -> !FHE.eint<42> - return %res: !FHE.eint<42> - } -tests: - - inputs: - - scalar: 2199023255551 - - scalar: 2199023255552 - outputs: - - scalar: 4398046511103 ---- -description: sub_eint_int_cst_42bits -program: | - func.func @main(%arg0: !FHE.eint<42>) -> !FHE.eint<42> { - %0 = arith.constant 32767 : i43 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<42>, i43) -> (!FHE.eint<42>) - return %1: !FHE.eint<42> - } -tests: - - inputs: - - scalar: 4398046511103 - outputs: - - scalar: 4398046478336 ---- -description: sub_int_eint_cst_42bits -program: | - func.func @main(%arg0: !FHE.eint<42>) -> !FHE.eint<42> { - %0 = arith.constant 32767 : i43 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i43, !FHE.eint<42>) -> (!FHE.eint<42>) - return %1: !FHE.eint<42> - } -tests: - - inputs: - - scalar: 32767 - outputs: - - scalar: 0 ---- -description: sub_eint_42bits -program: | - func.func @main(%arg0: !FHE.eint<42>, %arg1: !FHE.eint<42>) -> !FHE.eint<42> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<42>, !FHE.eint<42>) -> (!FHE.eint<42>) - return %1: !FHE.eint<42> - } -tests: - - inputs: - - scalar: 4398046511103 - - scalar: 4398046511103 - outputs: - - scalar: 0 - - inputs: - - scalar: 4398046511103 - - scalar: 0 - outputs: - - scalar: 4398046511103 - - inputs: - - scalar: 4398046511102 - - scalar: 2199023255551 - outputs: - - scalar: 2199023255551 ---- -description: mul_eint_int_cst_42bits -program: | - func.func @main(%arg0: !FHE.eint<42>) -> !FHE.eint<42> { - %0 = arith.constant 2 : i43 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<42>, i43) -> (!FHE.eint<42>) - return %1: !FHE.eint<42> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 2199023255551 - outputs: - - scalar: 4398046511102 ---- ---- -description: identity_43bits -program: | - func.func @main(%arg0: !FHE.eint<43>) -> !FHE.eint<43> { - return %arg0: !FHE.eint<43> - } -tests: - - inputs: - - scalar: 8796093022207 - outputs: - - scalar: 8796093022207 ---- -description: zero_tensor_43bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<43>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<43>> - return %0: tensor<2x2x4x!FHE.eint<43>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_43bits -program: | - func.func @main(%arg0: !FHE.eint<43>) -> !FHE.eint<43> { - %0 = arith.constant 1 : i44 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<43>, i44) -> (!FHE.eint<43>) - return %1: !FHE.eint<43> - } -tests: - - inputs: - - scalar: 8796093022206 - outputs: - - scalar: 8796093022207 ---- -description: add_eint_43_bits -program: | - func.func @main(%arg0: !FHE.eint<43>, %arg1: !FHE.eint<43>) -> !FHE.eint<43> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<43>, !FHE.eint<43>) -> !FHE.eint<43> - return %res: !FHE.eint<43> - } -tests: - - inputs: - - scalar: 4398046511103 - - scalar: 4398046511104 - outputs: - - scalar: 8796093022207 ---- -description: sub_eint_int_cst_43bits -program: | - func.func @main(%arg0: !FHE.eint<43>) -> !FHE.eint<43> { - %0 = arith.constant 16383 : i44 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<43>, i44) -> (!FHE.eint<43>) - return %1: !FHE.eint<43> - } -tests: - - inputs: - - scalar: 8796093022207 - outputs: - - scalar: 8796093005824 ---- -description: sub_int_eint_cst_43bits -program: | - func.func @main(%arg0: !FHE.eint<43>) -> !FHE.eint<43> { - %0 = arith.constant 16383 : i44 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i44, !FHE.eint<43>) -> (!FHE.eint<43>) - return %1: !FHE.eint<43> - } -tests: - - inputs: - - scalar: 16383 - outputs: - - scalar: 0 ---- -description: sub_eint_43bits -program: | - func.func @main(%arg0: !FHE.eint<43>, %arg1: !FHE.eint<43>) -> !FHE.eint<43> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<43>, !FHE.eint<43>) -> (!FHE.eint<43>) - return %1: !FHE.eint<43> - } -tests: - - inputs: - - scalar: 8796093022207 - - scalar: 8796093022207 - outputs: - - scalar: 0 - - inputs: - - scalar: 8796093022207 - - scalar: 0 - outputs: - - scalar: 8796093022207 - - inputs: - - scalar: 8796093022206 - - scalar: 4398046511103 - outputs: - - scalar: 4398046511103 ---- -description: mul_eint_int_cst_43bits -program: | - func.func @main(%arg0: !FHE.eint<43>) -> !FHE.eint<43> { - %0 = arith.constant 2 : i44 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<43>, i44) -> (!FHE.eint<43>) - return %1: !FHE.eint<43> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 4398046511103 - outputs: - - scalar: 8796093022206 ---- ---- -description: identity_44bits -program: | - func.func @main(%arg0: !FHE.eint<44>) -> !FHE.eint<44> { - return %arg0: !FHE.eint<44> - } -tests: - - inputs: - - scalar: 17592186044415 - outputs: - - scalar: 17592186044415 ---- -description: zero_tensor_44bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<44>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<44>> - return %0: tensor<2x2x4x!FHE.eint<44>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_44bits -program: | - func.func @main(%arg0: !FHE.eint<44>) -> !FHE.eint<44> { - %0 = arith.constant 1 : i45 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<44>, i45) -> (!FHE.eint<44>) - return %1: !FHE.eint<44> - } -tests: - - inputs: - - scalar: 17592186044414 - outputs: - - scalar: 17592186044415 ---- -description: add_eint_44_bits -program: | - func.func @main(%arg0: !FHE.eint<44>, %arg1: !FHE.eint<44>) -> !FHE.eint<44> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<44>, !FHE.eint<44>) -> !FHE.eint<44> - return %res: !FHE.eint<44> - } -tests: - - inputs: - - scalar: 8796093022207 - - scalar: 8796093022208 - outputs: - - scalar: 17592186044415 ---- -description: sub_eint_int_cst_44bits -program: | - func.func @main(%arg0: !FHE.eint<44>) -> !FHE.eint<44> { - %0 = arith.constant 8191 : i45 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<44>, i45) -> (!FHE.eint<44>) - return %1: !FHE.eint<44> - } -tests: - - inputs: - - scalar: 17592186044415 - outputs: - - scalar: 17592186036224 ---- -description: sub_int_eint_cst_44bits -program: | - func.func @main(%arg0: !FHE.eint<44>) -> !FHE.eint<44> { - %0 = arith.constant 8191 : i45 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i45, !FHE.eint<44>) -> (!FHE.eint<44>) - return %1: !FHE.eint<44> - } -tests: - - inputs: - - scalar: 8191 - outputs: - - scalar: 0 ---- -description: sub_eint_44bits -program: | - func.func @main(%arg0: !FHE.eint<44>, %arg1: !FHE.eint<44>) -> !FHE.eint<44> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<44>, !FHE.eint<44>) -> (!FHE.eint<44>) - return %1: !FHE.eint<44> - } -tests: - - inputs: - - scalar: 17592186044415 - - scalar: 17592186044415 - outputs: - - scalar: 0 - - inputs: - - scalar: 17592186044415 - - scalar: 0 - outputs: - - scalar: 17592186044415 - - inputs: - - scalar: 17592186044414 - - scalar: 8796093022207 - outputs: - - scalar: 8796093022207 ---- -description: mul_eint_int_cst_44bits -program: | - func.func @main(%arg0: !FHE.eint<44>) -> !FHE.eint<44> { - %0 = arith.constant 2 : i45 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<44>, i45) -> (!FHE.eint<44>) - return %1: !FHE.eint<44> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 8796093022207 - outputs: - - scalar: 17592186044414 ---- ---- -description: identity_45bits -program: | - func.func @main(%arg0: !FHE.eint<45>) -> !FHE.eint<45> { - return %arg0: !FHE.eint<45> - } -tests: - - inputs: - - scalar: 35184372088831 - outputs: - - scalar: 35184372088831 ---- -description: zero_tensor_45bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<45>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<45>> - return %0: tensor<2x2x4x!FHE.eint<45>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_45bits -program: | - func.func @main(%arg0: !FHE.eint<45>) -> !FHE.eint<45> { - %0 = arith.constant 1 : i46 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<45>, i46) -> (!FHE.eint<45>) - return %1: !FHE.eint<45> - } -tests: - - inputs: - - scalar: 35184372088830 - outputs: - - scalar: 35184372088831 ---- -description: add_eint_45_bits -program: | - func.func @main(%arg0: !FHE.eint<45>, %arg1: !FHE.eint<45>) -> !FHE.eint<45> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<45>, !FHE.eint<45>) -> !FHE.eint<45> - return %res: !FHE.eint<45> - } -tests: - - inputs: - - scalar: 17592186044415 - - scalar: 17592186044416 - outputs: - - scalar: 35184372088831 ---- -description: sub_eint_int_cst_45bits -program: | - func.func @main(%arg0: !FHE.eint<45>) -> !FHE.eint<45> { - %0 = arith.constant 4095 : i46 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<45>, i46) -> (!FHE.eint<45>) - return %1: !FHE.eint<45> - } -tests: - - inputs: - - scalar: 35184372088831 - outputs: - - scalar: 35184372084736 ---- -description: sub_int_eint_cst_45bits -program: | - func.func @main(%arg0: !FHE.eint<45>) -> !FHE.eint<45> { - %0 = arith.constant 4095 : i46 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i46, !FHE.eint<45>) -> (!FHE.eint<45>) - return %1: !FHE.eint<45> - } -tests: - - inputs: - - scalar: 4095 - outputs: - - scalar: 0 ---- -description: sub_eint_45bits -program: | - func.func @main(%arg0: !FHE.eint<45>, %arg1: !FHE.eint<45>) -> !FHE.eint<45> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<45>, !FHE.eint<45>) -> (!FHE.eint<45>) - return %1: !FHE.eint<45> - } -tests: - - inputs: - - scalar: 35184372088831 - - scalar: 35184372088831 - outputs: - - scalar: 0 - - inputs: - - scalar: 35184372088831 - - scalar: 0 - outputs: - - scalar: 35184372088831 - - inputs: - - scalar: 35184372088830 - - scalar: 17592186044415 - outputs: - - scalar: 17592186044415 ---- -description: mul_eint_int_cst_45bits -program: | - func.func @main(%arg0: !FHE.eint<45>) -> !FHE.eint<45> { - %0 = arith.constant 2 : i46 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<45>, i46) -> (!FHE.eint<45>) - return %1: !FHE.eint<45> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 17592186044415 - outputs: - - scalar: 35184372088830 ---- ---- -description: identity_46bits -program: | - func.func @main(%arg0: !FHE.eint<46>) -> !FHE.eint<46> { - return %arg0: !FHE.eint<46> - } -tests: - - inputs: - - scalar: 70368744177663 - outputs: - - scalar: 70368744177663 ---- -description: zero_tensor_46bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<46>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<46>> - return %0: tensor<2x2x4x!FHE.eint<46>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_46bits -program: | - func.func @main(%arg0: !FHE.eint<46>) -> !FHE.eint<46> { - %0 = arith.constant 1 : i47 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<46>, i47) -> (!FHE.eint<46>) - return %1: !FHE.eint<46> - } -tests: - - inputs: - - scalar: 70368744177662 - outputs: - - scalar: 70368744177663 ---- -description: add_eint_46_bits -program: | - func.func @main(%arg0: !FHE.eint<46>, %arg1: !FHE.eint<46>) -> !FHE.eint<46> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<46>, !FHE.eint<46>) -> !FHE.eint<46> - return %res: !FHE.eint<46> - } -tests: - - inputs: - - scalar: 35184372088831 - - scalar: 35184372088832 - outputs: - - scalar: 70368744177663 ---- -description: sub_eint_int_cst_46bits -program: | - func.func @main(%arg0: !FHE.eint<46>) -> !FHE.eint<46> { - %0 = arith.constant 2047 : i47 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<46>, i47) -> (!FHE.eint<46>) - return %1: !FHE.eint<46> - } -tests: - - inputs: - - scalar: 70368744177663 - outputs: - - scalar: 70368744175616 ---- -description: sub_int_eint_cst_46bits -program: | - func.func @main(%arg0: !FHE.eint<46>) -> !FHE.eint<46> { - %0 = arith.constant 2047 : i47 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i47, !FHE.eint<46>) -> (!FHE.eint<46>) - return %1: !FHE.eint<46> - } -tests: - - inputs: - - scalar: 2047 - outputs: - - scalar: 0 ---- -description: sub_eint_46bits -program: | - func.func @main(%arg0: !FHE.eint<46>, %arg1: !FHE.eint<46>) -> !FHE.eint<46> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<46>, !FHE.eint<46>) -> (!FHE.eint<46>) - return %1: !FHE.eint<46> - } -tests: - - inputs: - - scalar: 70368744177663 - - scalar: 70368744177663 - outputs: - - scalar: 0 - - inputs: - - scalar: 70368744177663 - - scalar: 0 - outputs: - - scalar: 70368744177663 - - inputs: - - scalar: 70368744177662 - - scalar: 35184372088831 - outputs: - - scalar: 35184372088831 ---- -description: mul_eint_int_cst_46bits -program: | - func.func @main(%arg0: !FHE.eint<46>) -> !FHE.eint<46> { - %0 = arith.constant 2 : i47 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<46>, i47) -> (!FHE.eint<46>) - return %1: !FHE.eint<46> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 35184372088831 - outputs: - - scalar: 70368744177662 ---- ---- -description: identity_47bits -program: | - func.func @main(%arg0: !FHE.eint<47>) -> !FHE.eint<47> { - return %arg0: !FHE.eint<47> - } -tests: - - inputs: - - scalar: 140737488355327 - outputs: - - scalar: 140737488355327 ---- -description: zero_tensor_47bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<47>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<47>> - return %0: tensor<2x2x4x!FHE.eint<47>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_47bits -program: | - func.func @main(%arg0: !FHE.eint<47>) -> !FHE.eint<47> { - %0 = arith.constant 1 : i48 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<47>, i48) -> (!FHE.eint<47>) - return %1: !FHE.eint<47> - } -tests: - - inputs: - - scalar: 140737488355326 - outputs: - - scalar: 140737488355327 ---- -description: add_eint_47_bits -program: | - func.func @main(%arg0: !FHE.eint<47>, %arg1: !FHE.eint<47>) -> !FHE.eint<47> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<47>, !FHE.eint<47>) -> !FHE.eint<47> - return %res: !FHE.eint<47> - } -tests: - - inputs: - - scalar: 70368744177663 - - scalar: 70368744177664 - outputs: - - scalar: 140737488355327 ---- -description: sub_eint_int_cst_47bits -program: | - func.func @main(%arg0: !FHE.eint<47>) -> !FHE.eint<47> { - %0 = arith.constant 1023 : i48 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<47>, i48) -> (!FHE.eint<47>) - return %1: !FHE.eint<47> - } -tests: - - inputs: - - scalar: 140737488355327 - outputs: - - scalar: 140737488354304 ---- -description: sub_int_eint_cst_47bits -program: | - func.func @main(%arg0: !FHE.eint<47>) -> !FHE.eint<47> { - %0 = arith.constant 1023 : i48 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i48, !FHE.eint<47>) -> (!FHE.eint<47>) - return %1: !FHE.eint<47> - } -tests: - - inputs: - - scalar: 1023 - outputs: - - scalar: 0 ---- -description: sub_eint_47bits -program: | - func.func @main(%arg0: !FHE.eint<47>, %arg1: !FHE.eint<47>) -> !FHE.eint<47> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<47>, !FHE.eint<47>) -> (!FHE.eint<47>) - return %1: !FHE.eint<47> - } -tests: - - inputs: - - scalar: 140737488355327 - - scalar: 140737488355327 - outputs: - - scalar: 0 - - inputs: - - scalar: 140737488355327 - - scalar: 0 - outputs: - - scalar: 140737488355327 - - inputs: - - scalar: 140737488355326 - - scalar: 70368744177663 - outputs: - - scalar: 70368744177663 ---- -description: mul_eint_int_cst_47bits -program: | - func.func @main(%arg0: !FHE.eint<47>) -> !FHE.eint<47> { - %0 = arith.constant 2 : i48 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<47>, i48) -> (!FHE.eint<47>) - return %1: !FHE.eint<47> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 70368744177663 - outputs: - - scalar: 140737488355326 ---- ---- -description: identity_48bits -program: | - func.func @main(%arg0: !FHE.eint<48>) -> !FHE.eint<48> { - return %arg0: !FHE.eint<48> - } -tests: - - inputs: - - scalar: 281474976710655 - outputs: - - scalar: 281474976710655 ---- -description: zero_tensor_48bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<48>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<48>> - return %0: tensor<2x2x4x!FHE.eint<48>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_48bits -program: | - func.func @main(%arg0: !FHE.eint<48>) -> !FHE.eint<48> { - %0 = arith.constant 1 : i49 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<48>, i49) -> (!FHE.eint<48>) - return %1: !FHE.eint<48> - } -tests: - - inputs: - - scalar: 281474976710654 - outputs: - - scalar: 281474976710655 ---- -description: add_eint_48_bits -program: | - func.func @main(%arg0: !FHE.eint<48>, %arg1: !FHE.eint<48>) -> !FHE.eint<48> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<48>, !FHE.eint<48>) -> !FHE.eint<48> - return %res: !FHE.eint<48> - } -tests: - - inputs: - - scalar: 140737488355327 - - scalar: 140737488355328 - outputs: - - scalar: 281474976710655 ---- -description: sub_eint_int_cst_48bits -program: | - func.func @main(%arg0: !FHE.eint<48>) -> !FHE.eint<48> { - %0 = arith.constant 511 : i49 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<48>, i49) -> (!FHE.eint<48>) - return %1: !FHE.eint<48> - } -tests: - - inputs: - - scalar: 281474976710655 - outputs: - - scalar: 281474976710144 ---- -description: sub_int_eint_cst_48bits -program: | - func.func @main(%arg0: !FHE.eint<48>) -> !FHE.eint<48> { - %0 = arith.constant 511 : i49 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i49, !FHE.eint<48>) -> (!FHE.eint<48>) - return %1: !FHE.eint<48> - } -tests: - - inputs: - - scalar: 511 - outputs: - - scalar: 0 ---- -description: sub_eint_48bits -program: | - func.func @main(%arg0: !FHE.eint<48>, %arg1: !FHE.eint<48>) -> !FHE.eint<48> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<48>, !FHE.eint<48>) -> (!FHE.eint<48>) - return %1: !FHE.eint<48> - } -tests: - - inputs: - - scalar: 281474976710655 - - scalar: 281474976710655 - outputs: - - scalar: 0 - - inputs: - - scalar: 281474976710655 - - scalar: 0 - outputs: - - scalar: 281474976710655 - - inputs: - - scalar: 281474976710654 - - scalar: 140737488355327 - outputs: - - scalar: 140737488355327 ---- -description: mul_eint_int_cst_48bits -program: | - func.func @main(%arg0: !FHE.eint<48>) -> !FHE.eint<48> { - %0 = arith.constant 2 : i49 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<48>, i49) -> (!FHE.eint<48>) - return %1: !FHE.eint<48> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 140737488355327 - outputs: - - scalar: 281474976710654 ---- ---- -description: identity_49bits -program: | - func.func @main(%arg0: !FHE.eint<49>) -> !FHE.eint<49> { - return %arg0: !FHE.eint<49> - } -tests: - - inputs: - - scalar: 562949953421311 - outputs: - - scalar: 562949953421311 ---- -description: zero_tensor_49bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<49>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<49>> - return %0: tensor<2x2x4x!FHE.eint<49>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_49bits -program: | - func.func @main(%arg0: !FHE.eint<49>) -> !FHE.eint<49> { - %0 = arith.constant 1 : i50 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<49>, i50) -> (!FHE.eint<49>) - return %1: !FHE.eint<49> - } -tests: - - inputs: - - scalar: 562949953421310 - outputs: - - scalar: 562949953421311 ---- -description: add_eint_49_bits -program: | - func.func @main(%arg0: !FHE.eint<49>, %arg1: !FHE.eint<49>) -> !FHE.eint<49> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<49>, !FHE.eint<49>) -> !FHE.eint<49> - return %res: !FHE.eint<49> - } -tests: - - inputs: - - scalar: 281474976710655 - - scalar: 281474976710656 - outputs: - - scalar: 562949953421311 ---- -description: sub_eint_int_cst_49bits -program: | - func.func @main(%arg0: !FHE.eint<49>) -> !FHE.eint<49> { - %0 = arith.constant 255 : i50 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<49>, i50) -> (!FHE.eint<49>) - return %1: !FHE.eint<49> - } -tests: - - inputs: - - scalar: 562949953421311 - outputs: - - scalar: 562949953421056 ---- -description: sub_int_eint_cst_49bits -program: | - func.func @main(%arg0: !FHE.eint<49>) -> !FHE.eint<49> { - %0 = arith.constant 255 : i50 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i50, !FHE.eint<49>) -> (!FHE.eint<49>) - return %1: !FHE.eint<49> - } -tests: - - inputs: - - scalar: 255 - outputs: - - scalar: 0 ---- -description: sub_eint_49bits -program: | - func.func @main(%arg0: !FHE.eint<49>, %arg1: !FHE.eint<49>) -> !FHE.eint<49> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<49>, !FHE.eint<49>) -> (!FHE.eint<49>) - return %1: !FHE.eint<49> - } -tests: - - inputs: - - scalar: 562949953421311 - - scalar: 562949953421311 - outputs: - - scalar: 0 - - inputs: - - scalar: 562949953421311 - - scalar: 0 - outputs: - - scalar: 562949953421311 - - inputs: - - scalar: 562949953421310 - - scalar: 281474976710655 - outputs: - - scalar: 281474976710655 ---- -description: mul_eint_int_cst_49bits -program: | - func.func @main(%arg0: !FHE.eint<49>) -> !FHE.eint<49> { - %0 = arith.constant 2 : i50 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<49>, i50) -> (!FHE.eint<49>) - return %1: !FHE.eint<49> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 281474976710655 - outputs: - - scalar: 562949953421310 ---- ---- -description: identity_50bits -program: | - func.func @main(%arg0: !FHE.eint<50>) -> !FHE.eint<50> { - return %arg0: !FHE.eint<50> - } -tests: - - inputs: - - scalar: 1125899906842623 - outputs: - - scalar: 1125899906842623 ---- -description: zero_tensor_50bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<50>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<50>> - return %0: tensor<2x2x4x!FHE.eint<50>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_50bits -program: | - func.func @main(%arg0: !FHE.eint<50>) -> !FHE.eint<50> { - %0 = arith.constant 1 : i51 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<50>, i51) -> (!FHE.eint<50>) - return %1: !FHE.eint<50> - } -tests: - - inputs: - - scalar: 1125899906842622 - outputs: - - scalar: 1125899906842623 ---- -description: add_eint_50_bits -program: | - func.func @main(%arg0: !FHE.eint<50>, %arg1: !FHE.eint<50>) -> !FHE.eint<50> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<50>, !FHE.eint<50>) -> !FHE.eint<50> - return %res: !FHE.eint<50> - } -tests: - - inputs: - - scalar: 562949953421311 - - scalar: 562949953421312 - outputs: - - scalar: 1125899906842623 ---- -description: sub_eint_int_cst_50bits -program: | - func.func @main(%arg0: !FHE.eint<50>) -> !FHE.eint<50> { - %0 = arith.constant 127 : i51 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<50>, i51) -> (!FHE.eint<50>) - return %1: !FHE.eint<50> - } -tests: - - inputs: - - scalar: 1125899906842623 - outputs: - - scalar: 1125899906842496 ---- -description: sub_int_eint_cst_50bits -program: | - func.func @main(%arg0: !FHE.eint<50>) -> !FHE.eint<50> { - %0 = arith.constant 127 : i51 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i51, !FHE.eint<50>) -> (!FHE.eint<50>) - return %1: !FHE.eint<50> - } -tests: - - inputs: - - scalar: 127 - outputs: - - scalar: 0 ---- -description: sub_eint_50bits -program: | - func.func @main(%arg0: !FHE.eint<50>, %arg1: !FHE.eint<50>) -> !FHE.eint<50> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<50>, !FHE.eint<50>) -> (!FHE.eint<50>) - return %1: !FHE.eint<50> - } -tests: - - inputs: - - scalar: 1125899906842623 - - scalar: 1125899906842623 - outputs: - - scalar: 0 - - inputs: - - scalar: 1125899906842623 - - scalar: 0 - outputs: - - scalar: 1125899906842623 - - inputs: - - scalar: 1125899906842622 - - scalar: 562949953421311 - outputs: - - scalar: 562949953421311 ---- -description: mul_eint_int_cst_50bits -program: | - func.func @main(%arg0: !FHE.eint<50>) -> !FHE.eint<50> { - %0 = arith.constant 2 : i51 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<50>, i51) -> (!FHE.eint<50>) - return %1: !FHE.eint<50> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 562949953421311 - outputs: - - scalar: 1125899906842622 ---- ---- -description: identity_51bits -program: | - func.func @main(%arg0: !FHE.eint<51>) -> !FHE.eint<51> { - return %arg0: !FHE.eint<51> - } -tests: - - inputs: - - scalar: 2251799813685247 - outputs: - - scalar: 2251799813685247 ---- -description: zero_tensor_51bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<51>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<51>> - return %0: tensor<2x2x4x!FHE.eint<51>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_51bits -program: | - func.func @main(%arg0: !FHE.eint<51>) -> !FHE.eint<51> { - %0 = arith.constant 1 : i52 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<51>, i52) -> (!FHE.eint<51>) - return %1: !FHE.eint<51> - } -tests: - - inputs: - - scalar: 2251799813685246 - outputs: - - scalar: 2251799813685247 ---- -description: add_eint_51_bits -program: | - func.func @main(%arg0: !FHE.eint<51>, %arg1: !FHE.eint<51>) -> !FHE.eint<51> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<51>, !FHE.eint<51>) -> !FHE.eint<51> - return %res: !FHE.eint<51> - } -tests: - - inputs: - - scalar: 1125899906842623 - - scalar: 1125899906842624 - outputs: - - scalar: 2251799813685247 ---- -description: sub_eint_int_cst_51bits -program: | - func.func @main(%arg0: !FHE.eint<51>) -> !FHE.eint<51> { - %0 = arith.constant 63 : i52 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<51>, i52) -> (!FHE.eint<51>) - return %1: !FHE.eint<51> - } -tests: - - inputs: - - scalar: 2251799813685247 - outputs: - - scalar: 2251799813685184 ---- -description: sub_int_eint_cst_51bits -program: | - func.func @main(%arg0: !FHE.eint<51>) -> !FHE.eint<51> { - %0 = arith.constant 63 : i52 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i52, !FHE.eint<51>) -> (!FHE.eint<51>) - return %1: !FHE.eint<51> - } -tests: - - inputs: - - scalar: 63 - outputs: - - scalar: 0 ---- -description: sub_eint_51bits -program: | - func.func @main(%arg0: !FHE.eint<51>, %arg1: !FHE.eint<51>) -> !FHE.eint<51> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<51>, !FHE.eint<51>) -> (!FHE.eint<51>) - return %1: !FHE.eint<51> - } -tests: - - inputs: - - scalar: 2251799813685247 - - scalar: 2251799813685247 - outputs: - - scalar: 0 - - inputs: - - scalar: 2251799813685247 - - scalar: 0 - outputs: - - scalar: 2251799813685247 - - inputs: - - scalar: 2251799813685246 - - scalar: 1125899906842623 - outputs: - - scalar: 1125899906842623 ---- -description: mul_eint_int_cst_51bits -program: | - func.func @main(%arg0: !FHE.eint<51>) -> !FHE.eint<51> { - %0 = arith.constant 2 : i52 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<51>, i52) -> (!FHE.eint<51>) - return %1: !FHE.eint<51> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 1125899906842623 - outputs: - - scalar: 2251799813685246 ---- ---- -description: identity_52bits -program: | - func.func @main(%arg0: !FHE.eint<52>) -> !FHE.eint<52> { - return %arg0: !FHE.eint<52> - } -tests: - - inputs: - - scalar: 4503599627370495 - outputs: - - scalar: 4503599627370495 ---- -description: zero_tensor_52bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<52>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<52>> - return %0: tensor<2x2x4x!FHE.eint<52>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_52bits -program: | - func.func @main(%arg0: !FHE.eint<52>) -> !FHE.eint<52> { - %0 = arith.constant 1 : i53 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<52>, i53) -> (!FHE.eint<52>) - return %1: !FHE.eint<52> - } -tests: - - inputs: - - scalar: 4503599627370494 - outputs: - - scalar: 4503599627370495 ---- -description: add_eint_52_bits -program: | - func.func @main(%arg0: !FHE.eint<52>, %arg1: !FHE.eint<52>) -> !FHE.eint<52> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<52>, !FHE.eint<52>) -> !FHE.eint<52> - return %res: !FHE.eint<52> - } -tests: - - inputs: - - scalar: 2251799813685247 - - scalar: 2251799813685248 - outputs: - - scalar: 4503599627370495 ---- -description: sub_eint_int_cst_52bits -program: | - func.func @main(%arg0: !FHE.eint<52>) -> !FHE.eint<52> { - %0 = arith.constant 31 : i53 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<52>, i53) -> (!FHE.eint<52>) - return %1: !FHE.eint<52> - } -tests: - - inputs: - - scalar: 4503599627370495 - outputs: - - scalar: 4503599627370464 ---- -description: sub_int_eint_cst_52bits -program: | - func.func @main(%arg0: !FHE.eint<52>) -> !FHE.eint<52> { - %0 = arith.constant 31 : i53 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i53, !FHE.eint<52>) -> (!FHE.eint<52>) - return %1: !FHE.eint<52> - } -tests: - - inputs: - - scalar: 31 - outputs: - - scalar: 0 ---- -description: sub_eint_52bits -program: | - func.func @main(%arg0: !FHE.eint<52>, %arg1: !FHE.eint<52>) -> !FHE.eint<52> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<52>, !FHE.eint<52>) -> (!FHE.eint<52>) - return %1: !FHE.eint<52> - } -tests: - - inputs: - - scalar: 4503599627370495 - - scalar: 4503599627370495 - outputs: - - scalar: 0 - - inputs: - - scalar: 4503599627370495 - - scalar: 0 - outputs: - - scalar: 4503599627370495 - - inputs: - - scalar: 4503599627370494 - - scalar: 2251799813685247 - outputs: - - scalar: 2251799813685247 ---- -description: mul_eint_int_cst_52bits -program: | - func.func @main(%arg0: !FHE.eint<52>) -> !FHE.eint<52> { - %0 = arith.constant 2 : i53 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<52>, i53) -> (!FHE.eint<52>) - return %1: !FHE.eint<52> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 2251799813685247 - outputs: - - scalar: 4503599627370494 ---- ---- -description: identity_53bits -program: | - func.func @main(%arg0: !FHE.eint<53>) -> !FHE.eint<53> { - return %arg0: !FHE.eint<53> - } -tests: - - inputs: - - scalar: 9007199254740991 - outputs: - - scalar: 9007199254740991 ---- -description: zero_tensor_53bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<53>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<53>> - return %0: tensor<2x2x4x!FHE.eint<53>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_53bits -program: | - func.func @main(%arg0: !FHE.eint<53>) -> !FHE.eint<53> { - %0 = arith.constant 1 : i54 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<53>, i54) -> (!FHE.eint<53>) - return %1: !FHE.eint<53> - } -tests: - - inputs: - - scalar: 9007199254740990 - outputs: - - scalar: 9007199254740991 ---- -description: add_eint_53_bits -program: | - func.func @main(%arg0: !FHE.eint<53>, %arg1: !FHE.eint<53>) -> !FHE.eint<53> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<53>, !FHE.eint<53>) -> !FHE.eint<53> - return %res: !FHE.eint<53> - } -tests: - - inputs: - - scalar: 4503599627370495 - - scalar: 4503599627370496 - outputs: - - scalar: 9007199254740991 ---- -description: sub_eint_int_cst_53bits -program: | - func.func @main(%arg0: !FHE.eint<53>) -> !FHE.eint<53> { - %0 = arith.constant 15 : i54 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<53>, i54) -> (!FHE.eint<53>) - return %1: !FHE.eint<53> - } -tests: - - inputs: - - scalar: 9007199254740991 - outputs: - - scalar: 9007199254740976 ---- -description: sub_int_eint_cst_53bits -program: | - func.func @main(%arg0: !FHE.eint<53>) -> !FHE.eint<53> { - %0 = arith.constant 15 : i54 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i54, !FHE.eint<53>) -> (!FHE.eint<53>) - return %1: !FHE.eint<53> - } -tests: - - inputs: - - scalar: 15 - outputs: - - scalar: 0 ---- -description: sub_eint_53bits -program: | - func.func @main(%arg0: !FHE.eint<53>, %arg1: !FHE.eint<53>) -> !FHE.eint<53> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<53>, !FHE.eint<53>) -> (!FHE.eint<53>) - return %1: !FHE.eint<53> - } -tests: - - inputs: - - scalar: 9007199254740991 - - scalar: 9007199254740991 - outputs: - - scalar: 0 - - inputs: - - scalar: 9007199254740991 - - scalar: 0 - outputs: - - scalar: 9007199254740991 - - inputs: - - scalar: 9007199254740990 - - scalar: 4503599627370495 - outputs: - - scalar: 4503599627370495 ---- -description: mul_eint_int_cst_53bits -program: | - func.func @main(%arg0: !FHE.eint<53>) -> !FHE.eint<53> { - %0 = arith.constant 2 : i54 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<53>, i54) -> (!FHE.eint<53>) - return %1: !FHE.eint<53> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 4503599627370495 - outputs: - - scalar: 9007199254740990 ---- ---- -description: identity_54bits -program: | - func.func @main(%arg0: !FHE.eint<54>) -> !FHE.eint<54> { - return %arg0: !FHE.eint<54> - } -tests: - - inputs: - - scalar: 18014398509481983 - outputs: - - scalar: 18014398509481983 ---- -description: zero_tensor_54bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<54>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<54>> - return %0: tensor<2x2x4x!FHE.eint<54>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_54bits -program: | - func.func @main(%arg0: !FHE.eint<54>) -> !FHE.eint<54> { - %0 = arith.constant 1 : i55 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<54>, i55) -> (!FHE.eint<54>) - return %1: !FHE.eint<54> - } -tests: - - inputs: - - scalar: 18014398509481982 - outputs: - - scalar: 18014398509481983 ---- -description: add_eint_54_bits -program: | - func.func @main(%arg0: !FHE.eint<54>, %arg1: !FHE.eint<54>) -> !FHE.eint<54> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<54>, !FHE.eint<54>) -> !FHE.eint<54> - return %res: !FHE.eint<54> - } -tests: - - inputs: - - scalar: 9007199254740991 - - scalar: 9007199254740992 - outputs: - - scalar: 18014398509481983 ---- -description: sub_eint_int_cst_54bits -program: | - func.func @main(%arg0: !FHE.eint<54>) -> !FHE.eint<54> { - %0 = arith.constant 7 : i55 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<54>, i55) -> (!FHE.eint<54>) - return %1: !FHE.eint<54> - } -tests: - - inputs: - - scalar: 18014398509481983 - outputs: - - scalar: 18014398509481976 ---- -description: sub_int_eint_cst_54bits -program: | - func.func @main(%arg0: !FHE.eint<54>) -> !FHE.eint<54> { - %0 = arith.constant 7 : i55 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i55, !FHE.eint<54>) -> (!FHE.eint<54>) - return %1: !FHE.eint<54> - } -tests: - - inputs: - - scalar: 7 - outputs: - - scalar: 0 ---- -description: sub_eint_54bits -program: | - func.func @main(%arg0: !FHE.eint<54>, %arg1: !FHE.eint<54>) -> !FHE.eint<54> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<54>, !FHE.eint<54>) -> (!FHE.eint<54>) - return %1: !FHE.eint<54> - } -tests: - - inputs: - - scalar: 18014398509481983 - - scalar: 18014398509481983 - outputs: - - scalar: 0 - - inputs: - - scalar: 18014398509481983 - - scalar: 0 - outputs: - - scalar: 18014398509481983 - - inputs: - - scalar: 18014398509481982 - - scalar: 9007199254740991 - outputs: - - scalar: 9007199254740991 ---- -description: mul_eint_int_cst_54bits -program: | - func.func @main(%arg0: !FHE.eint<54>) -> !FHE.eint<54> { - %0 = arith.constant 2 : i55 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<54>, i55) -> (!FHE.eint<54>) - return %1: !FHE.eint<54> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 9007199254740991 - outputs: - - scalar: 18014398509481982 ---- ---- -description: identity_55bits -program: | - func.func @main(%arg0: !FHE.eint<55>) -> !FHE.eint<55> { - return %arg0: !FHE.eint<55> - } -tests: - - inputs: - - scalar: 36028797018963967 - outputs: - - scalar: 36028797018963967 ---- -description: zero_tensor_55bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<55>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<55>> - return %0: tensor<2x2x4x!FHE.eint<55>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_55bits -program: | - func.func @main(%arg0: !FHE.eint<55>) -> !FHE.eint<55> { - %0 = arith.constant 1 : i56 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<55>, i56) -> (!FHE.eint<55>) - return %1: !FHE.eint<55> - } -tests: - - inputs: - - scalar: 36028797018963966 - outputs: - - scalar: 36028797018963967 ---- -description: add_eint_55_bits -program: | - func.func @main(%arg0: !FHE.eint<55>, %arg1: !FHE.eint<55>) -> !FHE.eint<55> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<55>, !FHE.eint<55>) -> !FHE.eint<55> - return %res: !FHE.eint<55> - } -tests: - - inputs: - - scalar: 18014398509481983 - - scalar: 18014398509481984 - outputs: - - scalar: 36028797018963967 ---- -description: sub_eint_int_cst_55bits -program: | - func.func @main(%arg0: !FHE.eint<55>) -> !FHE.eint<55> { - %0 = arith.constant 3 : i56 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<55>, i56) -> (!FHE.eint<55>) - return %1: !FHE.eint<55> - } -tests: - - inputs: - - scalar: 36028797018963967 - outputs: - - scalar: 36028797018963964 ---- -description: sub_int_eint_cst_55bits -program: | - func.func @main(%arg0: !FHE.eint<55>) -> !FHE.eint<55> { - %0 = arith.constant 3 : i56 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i56, !FHE.eint<55>) -> (!FHE.eint<55>) - return %1: !FHE.eint<55> - } -tests: - - inputs: - - scalar: 3 - outputs: - - scalar: 0 ---- -description: sub_eint_55bits -program: | - func.func @main(%arg0: !FHE.eint<55>, %arg1: !FHE.eint<55>) -> !FHE.eint<55> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<55>, !FHE.eint<55>) -> (!FHE.eint<55>) - return %1: !FHE.eint<55> - } -tests: - - inputs: - - scalar: 36028797018963967 - - scalar: 36028797018963967 - outputs: - - scalar: 0 - - inputs: - - scalar: 36028797018963967 - - scalar: 0 - outputs: - - scalar: 36028797018963967 - - inputs: - - scalar: 36028797018963966 - - scalar: 18014398509481983 - outputs: - - scalar: 18014398509481983 ---- -description: mul_eint_int_cst_55bits -program: | - func.func @main(%arg0: !FHE.eint<55>) -> !FHE.eint<55> { - %0 = arith.constant 2 : i56 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<55>, i56) -> (!FHE.eint<55>) - return %1: !FHE.eint<55> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 18014398509481983 - outputs: - - scalar: 36028797018963966 ---- ---- -description: identity_56bits -program: | - func.func @main(%arg0: !FHE.eint<56>) -> !FHE.eint<56> { - return %arg0: !FHE.eint<56> - } -tests: - - inputs: - - scalar: 72057594037927935 - outputs: - - scalar: 72057594037927935 ---- -description: zero_tensor_56bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<56>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<56>> - return %0: tensor<2x2x4x!FHE.eint<56>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] ---- -description: add_eint_int_cst_56bits -program: | - func.func @main(%arg0: !FHE.eint<56>) -> !FHE.eint<56> { - %0 = arith.constant 1 : i57 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<56>, i57) -> (!FHE.eint<56>) - return %1: !FHE.eint<56> - } -tests: - - inputs: - - scalar: 72057594037927934 - outputs: - - scalar: 72057594037927935 ---- -description: add_eint_56_bits -program: | - func.func @main(%arg0: !FHE.eint<56>, %arg1: !FHE.eint<56>) -> !FHE.eint<56> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<56>, !FHE.eint<56>) -> !FHE.eint<56> - return %res: !FHE.eint<56> - } -tests: - - inputs: - - scalar: 36028797018963967 - - scalar: 36028797018963968 - outputs: - - scalar: 72057594037927935 ---- -description: sub_eint_int_cst_56bits -program: | - func.func @main(%arg0: !FHE.eint<56>) -> !FHE.eint<56> { - %0 = arith.constant 1 : i57 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<56>, i57) -> (!FHE.eint<56>) - return %1: !FHE.eint<56> - } -tests: - - inputs: - - scalar: 72057594037927935 - outputs: - - scalar: 72057594037927934 ---- -description: sub_int_eint_cst_56bits -program: | - func.func @main(%arg0: !FHE.eint<56>) -> !FHE.eint<56> { - %0 = arith.constant 1 : i57 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i57, !FHE.eint<56>) -> (!FHE.eint<56>) - return %1: !FHE.eint<56> - } -tests: - - inputs: - - scalar: 1 - outputs: - - scalar: 0 ---- -description: sub_eint_56bits -program: | - func.func @main(%arg0: !FHE.eint<56>, %arg1: !FHE.eint<56>) -> !FHE.eint<56> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<56>, !FHE.eint<56>) -> (!FHE.eint<56>) - return %1: !FHE.eint<56> - } -tests: - - inputs: - - scalar: 72057594037927935 - - scalar: 72057594037927935 - outputs: - - scalar: 0 - - inputs: - - scalar: 72057594037927935 - - scalar: 0 - outputs: - - scalar: 72057594037927935 - - inputs: - - scalar: 72057594037927934 - - scalar: 36028797018963967 - outputs: - - scalar: 36028797018963967 ---- -description: mul_eint_int_cst_56bits -program: | - func.func @main(%arg0: !FHE.eint<56>) -> !FHE.eint<56> { - %0 = arith.constant 2 : i57 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<56>, i57) -> (!FHE.eint<56>) - return %1: !FHE.eint<56> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 36028797018963967 - outputs: - - scalar: 72057594037927934 ---- ---- -description: identity_57bits -program: | - func.func @main(%arg0: !FHE.eint<57>) -> !FHE.eint<57> { - return %arg0: !FHE.eint<57> - } -tests: - - inputs: - - scalar: 144115188075855871 - outputs: - - scalar: 144115188075855871 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: zero_tensor_57bits -program: | - func.func @main() -> tensor<2x2x4x!FHE.eint<57>> { - %0 = "FHE.zero_tensor"() : () -> tensor<2x2x4x!FHE.eint<57>> - return %0: tensor<2x2x4x!FHE.eint<57>> - } -tests: - - outputs: - - tensor: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - shape: [2,2,4] -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_int_cst_57bits -program: | - func.func @main(%arg0: !FHE.eint<57>) -> !FHE.eint<57> { - %0 = arith.constant 1 : i58 - %1 = "FHE.add_eint_int"(%arg0, %0): (!FHE.eint<57>, i58) -> (!FHE.eint<57>) - return %1: !FHE.eint<57> - } -tests: - - inputs: - - scalar: 144115188075855870 - outputs: - - scalar: 144115188075855871 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: add_eint_57_bits -program: | - func.func @main(%arg0: !FHE.eint<57>, %arg1: !FHE.eint<57>) -> !FHE.eint<57> { - %res = "FHE.add_eint"(%arg0, %arg1): (!FHE.eint<57>, !FHE.eint<57>) -> !FHE.eint<57> - return %res: !FHE.eint<57> - } -tests: - - inputs: - - scalar: 72057594037927935 - - scalar: 72057594037927936 - outputs: - - scalar: 144115188075855871 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_int_cst_57bits -program: | - func.func @main(%arg0: !FHE.eint<57>) -> !FHE.eint<57> { - %0 = arith.constant 0 : i58 - %1 = "FHE.sub_eint_int"(%arg0, %0): (!FHE.eint<57>, i58) -> (!FHE.eint<57>) - return %1: !FHE.eint<57> - } -tests: - - inputs: - - scalar: 144115188075855871 - outputs: - - scalar: 144115188075855871 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_int_eint_cst_57bits -program: | - func.func @main(%arg0: !FHE.eint<57>) -> !FHE.eint<57> { - %0 = arith.constant 0 : i58 - %1 = "FHE.sub_int_eint"(%0, %arg0): (i58, !FHE.eint<57>) -> (!FHE.eint<57>) - return %1: !FHE.eint<57> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: sub_eint_57bits -program: | - func.func @main(%arg0: !FHE.eint<57>, %arg1: !FHE.eint<57>) -> !FHE.eint<57> { - %1 = "FHE.sub_eint"(%arg0, %arg1): (!FHE.eint<57>, !FHE.eint<57>) -> (!FHE.eint<57>) - return %1: !FHE.eint<57> - } -tests: - - inputs: - - scalar: 144115188075855871 - - scalar: 144115188075855871 - outputs: - - scalar: 0 - - inputs: - - scalar: 144115188075855871 - - scalar: 0 - outputs: - - scalar: 144115188075855871 - - inputs: - - scalar: 144115188075855870 - - scalar: 72057594037927935 - outputs: - - scalar: 72057594037927935 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- -description: mul_eint_int_cst_57bits -program: | - func.func @main(%arg0: !FHE.eint<57>) -> !FHE.eint<57> { - %0 = arith.constant 2 : i58 - %1 = "FHE.mul_eint_int"(%arg0, %0): (!FHE.eint<57>, i58) -> (!FHE.eint<57>) - return %1: !FHE.eint<57> - } -tests: - - inputs: - - scalar: 0 - outputs: - - scalar: 0 - - inputs: - - scalar: 72057594037927935 - outputs: - - scalar: 144115188075855870 -test-error-rates: - - global-p-error: 0.0001 - nb-repetition: 10000 ---- diff --git a/compiler/tests/end_to_end_fixture/end_to_end_linalg_apply_lookup_table_gen.py b/compiler/tests/end_to_end_fixture/end_to_end_linalg_apply_lookup_table_gen.py index 3526c4172..89a43a8be 100644 --- a/compiler/tests/end_to_end_fixture/end_to_end_linalg_apply_lookup_table_gen.py +++ b/compiler/tests/end_to_end_fixture/end_to_end_linalg_apply_lookup_table_gen.py @@ -8,55 +8,55 @@ def generate(args): print("# /!\ THIS FILE HAS BEEN GENERATED") np.random.seed(0) for n_ct in args.n_ct: - for p in range(args.min_bitwidth, args.max_bitwidth+1): - max_value = (2 ** p) - 1 - random_lut = np.random.randint(max_value+1, size=2**p) - # identity_apply_lookup_table - print(f"description: apply_lookup_table_{p}bits_{n_ct}ct") - print("program: |") - print( - f" func.func @main(%0: tensor<{n_ct}x!FHE.eint<{p}>>) -> tensor<{n_ct}x!FHE.eint<{p}>> {{") - print(f" %tlu = arith.constant dense<[{','.join(map(str, random_lut))}]> : tensor<{2**p}xi64>") - for i in range(0, args.n_lut): - print(f" %{i+1} = \"FHELinalg.apply_lookup_table\"(%{i}, %tlu):") - print(f" (tensor<{n_ct}x!FHE.eint<{p}>>, tensor<{2**p}xi64>) -> (tensor<{n_ct}x!FHE.eint<{p}>>)") - print(f" return %{args.n_lut}: tensor<{n_ct}x!FHE.eint<{p}>>") - print(" }") - random_input = np.random.randint(max_value+1, size=n_ct) - print("tests:") - print(" - inputs:") - print(f" - tensor: [{','.join(map(str, random_input))}]") - print(f" shape: [{n_ct}]") - outputs = random_input - for i in range(0, args.n_lut): - outputs = [random_lut[v] for v in outputs] - - print(" outputs:") - print(f" - tensor: [{','.join(map(str, outputs))}]") - print(f" shape: [{n_ct}]") - print("---") + for p in args.bitwidth: + for n_lut in args.n_lut: + max_value = (2 ** p) - 1 + random_lut = np.random.randint(max_value+1, size=2**p) + # identity_apply_lookup_table + print(f"description: apply_lookup_table_{p}bits_{n_ct}ct_{n_lut}layer") + print("program: |") + print( + f" func.func @main(%0: tensor<{n_ct}x!FHE.eint<{p}>>) -> tensor<{n_ct}x!FHE.eint<{p}>> {{") + print(f" %tlu = arith.constant dense<[{','.join(map(str, random_lut))}]> : tensor<{2**p}xi64>") + for i in range(0, n_lut): + print(f" %{i+1} = \"FHELinalg.apply_lookup_table\"(%{i}, %tlu):") + print(f" (tensor<{n_ct}x!FHE.eint<{p}>>, tensor<{2**p}xi64>) -> (tensor<{n_ct}x!FHE.eint<{p}>>)") + print(f" return %{n_lut}: tensor<{n_ct}x!FHE.eint<{p}>>") + print(" }") + random_input = np.random.randint(max_value+1, size=n_ct) + print("tests:") + print(" - inputs:") + print(f" - tensor: [{','.join(map(str, random_input))}]") + print(f" shape: [{n_ct}]") + outputs = random_input + for i in range(0, n_lut): + outputs = [random_lut[v] for v in outputs] + print(" outputs:") + print(f" - tensor: [{','.join(map(str, outputs))}]") + print(f" shape: [{n_ct}]") + print("---") CLI = argparse.ArgumentParser() CLI.add_argument( - "--min-bitwidth", + "--bitwidth", + help="Specify the list of bitwidth to generate", + nargs="+", type=int, - default=1, -) -CLI.add_argument( - "--max-bitwidth", - type=int, - default=16, + default=list(range(1,16)), ) CLI.add_argument( "--n-ct", + help="Specify the tensor sizes to generate", nargs="+", type=int, - default=[1, 64, 128, 1024], + default=[4], ) CLI.add_argument( "--n-lut", + help="Specify the number of FHELinalg.apply_lookup_table layers to generate", + nargs="+", type=int, - default=1, + default=[1,2], ) generate(CLI.parse_args()) diff --git a/compiler/tests/end_to_end_fixture/bug_report.zip b/compiler/tests/end_to_end_fixture/tests_cpu/bug_report.zip similarity index 100% rename from compiler/tests/end_to_end_fixture/bug_report.zip rename to compiler/tests/end_to_end_fixture/tests_cpu/bug_report.zip diff --git a/compiler/tests/end_to_end_fixture/end_to_end_clear_tensor.yaml b/compiler/tests/end_to_end_fixture/tests_cpu/end_to_end_clear_tensor.yaml similarity index 100% rename from compiler/tests/end_to_end_fixture/end_to_end_clear_tensor.yaml rename to compiler/tests/end_to_end_fixture/tests_cpu/end_to_end_clear_tensor.yaml diff --git a/compiler/tests/end_to_end_fixture/end_to_end_encrypted_tensor.yaml b/compiler/tests/end_to_end_fixture/tests_cpu/end_to_end_encrypted_tensor.yaml similarity index 100% rename from compiler/tests/end_to_end_fixture/end_to_end_encrypted_tensor.yaml rename to compiler/tests/end_to_end_fixture/tests_cpu/end_to_end_encrypted_tensor.yaml diff --git a/compiler/tests/end_to_end_fixture/tests_cpu/end_to_end_fhe.yaml b/compiler/tests/end_to_end_fixture/tests_cpu/end_to_end_fhe.yaml new file mode 100644 index 000000000..890fce6db --- /dev/null +++ b/compiler/tests/end_to_end_fixture/tests_cpu/end_to_end_fhe.yaml @@ -0,0 +1,148 @@ +# TODO: Rewrite/Remove +# The FHE.neg_eint op doesn't come with a well defined semantics as FHE.eint +# has an undefined behavior for under/overflow. +# For now we keep it, knowning the compiler/optimizer behavior but that could +# break at anytime. +description: neg_eint +program: | + func.func @main(%arg0: !FHE.eint<7>) -> !FHE.eint<7> { + %1 = "FHE.neg_eint"(%arg0): (!FHE.eint<7>) -> (!FHE.eint<7>) + return %1: !FHE.eint<7> + } +tests: + - inputs: + - scalar: 0 + outputs: + - scalar: 0 + - inputs: + - scalar: 1 + outputs: + - scalar: 255 + - inputs: + - scalar: 4 + outputs: + - scalar: 252 + - inputs: + - scalar: 250 + outputs: + - scalar: 6 +--- +# TODO: Rewrite/Remove +# The FHE.neg_eint op doesn't come with a well defined semantics as FHE.eint +# has an undefined behavior for under/overflow. +# For now we keep it, knowning the compiler/optimizer behavior but that could +# break at anytime. +description: neg_eint_16bits +program: | + func.func @main(%arg0: !FHE.eint<16>) -> !FHE.eint<16> { + %1 = "FHE.neg_eint"(%arg0): (!FHE.eint<16>) -> (!FHE.eint<16>) + return %1: !FHE.eint<16> + } +tests: + - inputs: + - scalar: 0 + outputs: + - scalar: 0 + - inputs: + - scalar: 1 + outputs: + - scalar: 131071 + - inputs: + - scalar: 131071 + outputs: + - scalar: 1 +--- +description: neg_eint_3bits +program: | + func.func @main(%arg0: !FHE.eint<3>) -> !FHE.eint<3> { + %1 = "FHE.neg_eint"(%arg0): (!FHE.eint<3>) -> (!FHE.eint<3>) + return %1: !FHE.eint<3> + } +tests: + - inputs: + - scalar: 0 + outputs: + - scalar: 0 + - inputs: + - scalar: 1 + outputs: + - scalar: 15 + - inputs: + - scalar: 4 + outputs: + - scalar: 12 + - inputs: + - scalar: 13 + outputs: + - scalar: 3 +--- +description: apply_lookup_table_multiple_precision +program: | + func.func @main(%arg0: !FHE.eint<6>, %arg1: !FHE.eint<3>) -> !FHE.eint<6> { + %tlu_7 = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63]> : tensor<64xi64> + %tlu_3 = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7]> : tensor<8xi64> + %a = "FHE.apply_lookup_table"(%arg0, %tlu_7): (!FHE.eint<6>, tensor<64xi64>) -> (!FHE.eint<6>) + %b = "FHE.apply_lookup_table"(%arg1, %tlu_3): (!FHE.eint<3>, tensor<8xi64>) -> (!FHE.eint<6>) + %a_plus_b = "FHE.add_eint"(%a, %b): (!FHE.eint<6>, !FHE.eint<6>) -> (!FHE.eint<6>) + return %a_plus_b: !FHE.eint<6> + } +tests: + - inputs: + - scalar: 23 + - scalar: 7 + outputs: + - scalar: 30 +--- +description: apply_lookup_table_random_func +program: | + func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { + %tlu = arith.constant dense<[16, 91, 16, 83, 80, 74, 21, 96, 1, 63, 49, 122, 76, 89, 74, 55, 109, 110, 103, 54, 105, 14, 66, 47, 52, 89, 7, 10, 73, 44, 119, 92, 25, 104, 123, 100, 108, 86, 29, 121, 118, 52, 107, 48, 34, 37, 13, 122, 107, 48, 74, 59, 96, 36, 50, 55, 120, 72, 27, 45, 12, 5, 96, 12]> : tensor<64xi64> + %1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<6>, tensor<64xi64>) -> (!FHE.eint<6>) + return %1: !FHE.eint<6> + } +tests: + - inputs: + - scalar: 5 + outputs: + - scalar: 74 + - inputs: + - scalar: 62 + outputs: + - scalar: 96 + - inputs: + - scalar: 0 + outputs: + - scalar: 16 + - inputs: + - scalar: 63 + outputs: + - scalar: 12 +--- +# https://github.com/zama-ai/concrete-compiler-internal/issues/809 +description: bug_809 +program: | + func.func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> { + %cst = arith.constant dense<[1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1]> : tensor<64xi64> + %0 = "FHE.apply_lookup_table"(%arg0, %cst) : (!FHE.eint<6>, tensor<64xi64>) -> !FHE.eint<6> + %cst_0 = arith.constant dense<[0, 10, 20, 30, 40, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73]> : tensor<64xi64> + %1 = "FHE.apply_lookup_table"(%arg0, %cst_0) : (!FHE.eint<6>, tensor<64xi64>) -> !FHE.eint<6> + %2 = "FHE.add_eint"(%0, %1) : (!FHE.eint<6>, !FHE.eint<6>) -> !FHE.eint<6> + return %2 : !FHE.eint<6> + } +tests: + - inputs: + - scalar: 0 + outputs: + - scalar: 1 + - inputs: + - scalar: 5 + outputs: + - scalar: 15 + - inputs: + - scalar: 62 + outputs: + - scalar: 72 + - inputs: + - scalar: 63 + outputs: + - scalar: 74 diff --git a/compiler/tests/end_to_end_fixture/end_to_end_fhelinalg.yaml b/compiler/tests/end_to_end_fixture/tests_cpu/end_to_end_fhelinalg.yaml similarity index 100% rename from compiler/tests/end_to_end_fixture/end_to_end_fhelinalg.yaml rename to compiler/tests/end_to_end_fixture/tests_cpu/end_to_end_fhelinalg.yaml diff --git a/compiler/tests/end_to_end_tests/CMakeLists.txt b/compiler/tests/end_to_end_tests/CMakeLists.txt index 411e336a4..46d0d01e1 100644 --- a/compiler/tests/end_to_end_tests/CMakeLists.txt +++ b/compiler/tests/end_to_end_tests/CMakeLists.txt @@ -24,7 +24,7 @@ add_concretecompiler_unittest(end_to_end_jit_test end_to_end_jit_test.cc globals add_concretecompiler_unittest(end_to_end_jit_encrypted_tensor end_to_end_jit_encrypted_tensor.cc globals.cc) -add_concretecompiler_unittest(end_to_end_jit_fhe end_to_end_jit_fhe.cc globals.cc) +add_concretecompiler_unittest(end_to_end_test end_to_end_test.cc globals.cc) add_concretecompiler_unittest(end_to_end_jit_fhelinalg end_to_end_jit_fhelinalg.cc globals.cc) diff --git a/compiler/tests/end_to_end_tests/end_to_end_jit_fhe.cc b/compiler/tests/end_to_end_tests/end_to_end_jit_fhe.cc deleted file mode 100644 index 2b7dbd017..000000000 --- a/compiler/tests/end_to_end_tests/end_to_end_jit_fhe.cc +++ /dev/null @@ -1,274 +0,0 @@ - -#include -#include -#include - -#include "concretelang/Support/CompilationFeedback.h" -#include "concretelang/Support/JITSupport.h" -#include "concretelang/Support/LibrarySupport.h" -#include "end_to_end_fixture/EndToEndFixture.h" -#include "end_to_end_jit_test.h" -#include "tests_tools/GtestEnvironment.h" -#include "tests_tools/keySetCache.h" - -#define CHECK_OR_ERROR(val) \ - { \ - if (!bool(val)) { \ - return StreamStringError(llvm::toString(std::move(val.takeError())) + \ - "\nInvalid '" #val "'"); \ - } \ - } - -using mlir::concretelang::StreamStringError; - -typedef std::pair - TestParam; - -template -void compile_and_run(EndToEndDesc desc, - mlir::concretelang::CompilationOptions options, - LambdaSupport support) { - if (desc.v0Constraint.hasValue()) { - options.v0FHEConstraints = *desc.v0Constraint; - } - if (desc.v0Parameter.hasValue()) { - options.v0Parameter = *desc.v0Parameter; - } - if (desc.largeIntegerParameter.hasValue()) { - options.largeIntegerParameter = *desc.largeIntegerParameter; - } - if (desc.test_error_rates.empty()) { - compile_and_run_for_config(desc, support, options, llvm::None); - } else { - for (auto test_error_rate : desc.test_error_rates) { - options.optimizerConfig.global_p_error = test_error_rate.global_p_error; - options.optimizerConfig.p_error = test_error_rate.global_p_error; - compile_and_run_for_config(desc, support, options, test_error_rate); - } - } -} - -template -void compile_and_run_for_config(EndToEndDesc desc, LambdaSupport support, - mlir::concretelang::CompilationOptions options, - llvm::Optional test_error_rate) { - /* 1 - Compile the program */ - auto compilationResult = support.compile(desc.program, options); - ASSERT_EXPECTED_SUCCESS(compilationResult); - - /* 2 - Load the client parameters and build the keySet */ - auto clientParameters = support.loadClientParameters(**compilationResult); - ASSERT_EXPECTED_SUCCESS(clientParameters); - - auto keySet = support.keySet(*clientParameters, getTestKeySetCache()); - ASSERT_EXPECTED_SUCCESS(keySet); - - auto evaluationKeys = (*keySet)->evaluationKeys(); - - /* 3 - Load the server lambda */ - auto serverLambda = support.loadServerLambda(**compilationResult); - ASSERT_EXPECTED_SUCCESS(serverLambda); - - // Just test that we can load the compilation feedback - auto feedback = support.loadCompilationFeedback(**compilationResult); - ASSERT_EXPECTED_SUCCESS(feedback); - - assert_all_test_entries(desc, test_error_rate, support, keySet, - evaluationKeys, clientParameters, serverLambda); -} - -template -llvm::Error run_once_1_test_entry_once(TestDescription &test, - LambdaSupport &support, KeySet &keySet, - EvaluationKeys &evaluationKeys, - ClientParameters &clientParameters, - ServerLambda &serverLambda) { - std::vector inputArguments; - inputArguments.reserve(test.inputs.size()); - - for (auto &input : test.inputs) { - inputArguments.push_back(&input.getValue()); - } - - /* 4 - Create the public arguments */ - auto publicArguments = - support.exportArguments(*clientParameters, **keySet, inputArguments); - CHECK_OR_ERROR(publicArguments); - - /* 5 - Call the server lambda */ - auto publicResult = - support.serverCall(*serverLambda, **publicArguments, evaluationKeys); - CHECK_OR_ERROR(publicResult); - - /* 6 - Decrypt the public result */ - auto result = mlir::concretelang::typedResult< - std::unique_ptr>(**keySet, - **publicResult); - - /* 7 - Check result */ - CHECK_OR_ERROR(result); - auto error = checkResult(test.outputs[0], **result); - - return error; -} - -template -void assert_all_test_entries(EndToEndDesc &desc, - llvm::Optional &opt_test_error_rate, - LambdaSupport &support, KeySet &keySet, - EvaluationKeys &evaluationKeys, - ClientParameters &clientParameters, - ServerLambda &serverLambda) { - auto run = [&](TestDescription &test) { - return run_once_1_test_entry_once(test, support, keySet, evaluationKeys, - clientParameters, serverLambda); - }; - if (!opt_test_error_rate.has_value()) { - for (auto test : desc.tests) { - ASSERT_LLVM_ERROR(run(test)); - } - return; - } - auto test_error_rate = opt_test_error_rate.value(); - ASSERT_LE(desc.tests.size(), test_error_rate.nb_repetition); - int nb_error = 0; - for (size_t i = 0; i < test_error_rate.nb_repetition; i++) { - auto test = desc.tests[i % desc.tests.size()]; - auto error = run(test); - if (error) { - nb_error += 1; - DISCARD_LLVM_ERROR(error); - } - } - double maximum_errors = test_error_rate.too_high_error_count_threshold(); - // std::cout << "n_rep " << maximum_errors << " p_error " << - // test_error_rate.p_error << " maximum_errors " << maximum_errors << "\n"; - ASSERT_LE(nb_error, maximum_errors) << "Empirical error rate is too high"; -} - -std::string printEndToEndDesc(const testing::TestParamInfo desc) { - const auto options = desc.param.second; - std::ostringstream opt; - if (options.loopParallelize) - opt << "_loop"; - if (options.dataflowParallelize) - opt << "_dataflow"; - if (options.emitGPUOps) - opt << "_gpu"; - std::ostringstream name; - name << desc.param.first.description; - auto ostr = opt.str(); - if (ostr.size() == 0) { - ostr = "_default"; - } - name << ostr; - - return name.str(); -} - -// Macro to define and end to end TestSuite that run test thanks the -// LambdaSupport according a EndToEndDesc -#define INSTANTIATE_END_TO_END_COMPILE_AND_RUN(TestSuite, lambdaSupport) \ - TEST_P(TestSuite, compile_and_run) { \ - auto param = GetParam(); \ - compile_and_run(std::get<0>(param), std::get<1>(param), lambdaSupport); \ - } - -std::vector -testParam(std::vector descs, - std::vector options) { - std::vector params; - for (auto opt : options) { - std::transform(descs.begin(), descs.end(), std::back_inserter(params), - [&](auto d) { return TestParam(d, opt); }); - } - return params; -} - -#define INSTANTIATE_END_TO_END_TEST_SUITE_FROM_FILE(prefix, suite, options, \ - lambdasupport, path) \ - namespace prefix##suite { \ - auto descs = loadEndToEndDesc(path); \ - std::vector params = testParam(descs, options); \ - auto values = testing::ValuesIn>(params); \ - INSTANTIATE_TEST_SUITE_P(prefix, suite, values, printEndToEndDesc); \ - } - -#define INSTANTIATE_END_TO_END_TEST_SUITE_FROM_ALL_TEST_FILES(suite, options, \ - lambdasupport) \ - \ - class suite : public testing::TestWithParam {}; \ - INSTANTIATE_END_TO_END_COMPILE_AND_RUN(suite, lambdasupport) \ - INSTANTIATE_END_TO_END_TEST_SUITE_FROM_FILE( \ - ClearTensor, suite, options, lambdasupport, \ - "tests/end_to_end_fixture/end_to_end_clear_tensor.yaml") \ - INSTANTIATE_END_TO_END_TEST_SUITE_FROM_FILE( \ - FHE, suite, options, lambdasupport, \ - "tests/end_to_end_fixture/end_to_end_fhe.yaml") \ - INSTANTIATE_END_TO_END_TEST_SUITE_FROM_FILE( \ - EncryptedTensor, suite, options, lambdasupport, \ - "tests/end_to_end_fixture/end_to_end_encrypted_tensor.yaml") \ - INSTANTIATE_END_TO_END_TEST_SUITE_FROM_FILE( \ - FHELinalg, suite, options, lambdasupport, \ - "tests/end_to_end_fixture/end_to_end_fhelinalg.yaml") \ - INSTANTIATE_END_TO_END_TEST_SUITE_FROM_FILE( \ - FHELeveledOps, suite, options, lambdasupport, \ - "tests/end_to_end_fixture/end_to_end_leveled.yaml") \ - INSTANTIATE_END_TO_END_TEST_SUITE_FROM_FILE( \ - FHEApplyLookupTable, suite, options, lambdasupport, \ - "tests/end_to_end_fixture/end_to_end_apply_lookup_table.yaml") \ - INSTANTIATE_END_TO_END_TEST_SUITE_FROM_FILE( \ - FHELinalgLookupTable, suite, options, lambdasupport, \ - "tests/end_to_end_fixture/end_to_end_linalg_2_apply_lookup_table.yaml") \ - INSTANTIATE_END_TO_END_TEST_SUITE_FROM_FILE( \ - BugReport000, suite, options, lambdasupport, \ - "tests/end_to_end_fixture/bug_report.yaml") - -mlir::concretelang::CompilationOptions defaultOptions() { - mlir::concretelang::CompilationOptions o("main"); - return o; -} - -mlir::concretelang::CompilationOptions loopOptions() { - mlir::concretelang::CompilationOptions o("main"); - o.loopParallelize = true; - return o; -} - -mlir::concretelang::CompilationOptions dataflowOptions() { - mlir::concretelang::CompilationOptions o("main"); - o.dataflowParallelize = true; - return o; -} - -mlir::concretelang::CompilationOptions gpuOptions() { - mlir::concretelang::CompilationOptions o("main"); - o.emitGPUOps = true; - o.optimizerConfig.display = true; - return o; -} - -// mlir::concretelang::CompilationOptions optionsLoop("main"); -// optionsLoop.loopParallelize = true; - -/// Instantiate the test suite for Jit -INSTANTIATE_END_TO_END_TEST_SUITE_FROM_ALL_TEST_FILES( - JitTest, {defaultOptions()}, mlir::concretelang::JITSupport()) - -std::vector allOptions{ - defaultOptions(), - loopOptions(), -#ifdef CONCRETELANG_DATAFLOW_EXECUTION_ENABLED - dataflowOptions(), -#endif -#ifdef CONCRETELANG_CUDA_SUPPORT - gpuOptions(), -#endif -}; -/// Instantiate the test suite for Library -INSTANTIATE_END_TO_END_TEST_SUITE_FROM_ALL_TEST_FILES( - LibraryTest, allOptions, - mlir::concretelang::LibrarySupport("/tmp/end_to_end_test_" + - param.first.description)) diff --git a/compiler/tests/end_to_end_tests/end_to_end_test.cc b/compiler/tests/end_to_end_tests/end_to_end_test.cc new file mode 100644 index 000000000..3e7677f84 --- /dev/null +++ b/compiler/tests/end_to_end_tests/end_to_end_test.cc @@ -0,0 +1,297 @@ +#include +#include +#include +#include + +#include "concretelang/Support/CompilationFeedback.h" +#include "concretelang/Support/JITSupport.h" +#include "concretelang/Support/LibrarySupport.h" +#include "end_to_end_fixture/EndToEndFixture.h" +#include "end_to_end_jit_test.h" +#include "tests_tools/GtestEnvironment.h" +#include "tests_tools/keySetCache.h" + +/// @brief EndToEndTest is a template that allows testing for one program for a +/// TestDescription using a LambdaSupport. +template class EndToEndTest : public ::testing::Test { +public: + explicit EndToEndTest(std::string program, TestDescription desc, + llvm::Optional errorRate, + LambdaSupport support, + mlir::concretelang::CompilationOptions options) + : program(program), desc(desc), errorRate(errorRate), support(support), + options(options) { + if (errorRate.hasValue()) { + options.optimizerConfig.global_p_error = errorRate->global_p_error; + options.optimizerConfig.p_error = errorRate->global_p_error; + } + }; + + void SetUp() override { + /* Compile the program */ + auto expectCompilationResult = support.compile(program, options); + ASSERT_EXPECTED_SUCCESS(expectCompilationResult); + + /* Load the client parameters */ + auto expectClientParameters = + support.loadClientParameters(**expectCompilationResult); + ASSERT_EXPECTED_SUCCESS(expectClientParameters); + clientParameters = *expectClientParameters; + + /* Build the keyset */ + auto expectKeySet = support.keySet(clientParameters, getTestKeySetCache()); + ASSERT_EXPECTED_SUCCESS(expectKeySet); + keySet = std::move(*expectKeySet); + + /* Load the server lambda */ + auto expectServerLambda = + support.loadServerLambda(**expectCompilationResult); + ASSERT_EXPECTED_SUCCESS(expectServerLambda); + serverLambda = *expectServerLambda; + + /* Create the public argument */ + std::vector inputArguments; + inputArguments.reserve(desc.inputs.size()); + + for (auto &input : desc.inputs) { + inputArguments.push_back(&input.getValue()); + } + auto expectPublicArguments = + support.exportArguments(clientParameters, *keySet, inputArguments); + ASSERT_EXPECTED_SUCCESS(expectPublicArguments); + publicArguments = std::move(*expectPublicArguments); + } + + void TestBody() override { + if (!errorRate.hasValue()) { + testOnce(); + } else { + testErrorRate(); + } + } + + void testOnce() { + auto evaluationKeys = keySet->evaluationKeys(); + /* Call the server lambda */ + auto publicResult = + support.serverCall(serverLambda, *publicArguments, evaluationKeys); + ASSERT_EXPECTED_SUCCESS(publicResult); + + /* Decrypt the public result */ + auto result = mlir::concretelang::typedResult< + std::unique_ptr>(*keySet, + **publicResult); + ASSERT_EXPECTED_SUCCESS(result); + + /* Check result */ + // For now we support just one result + assert(desc.outputs.size() == 1); + ASSERT_LLVM_ERROR(checkResult(desc.outputs[0], **result)); + } + + void testErrorRate() { + auto evaluationKeys = keySet->evaluationKeys(); + auto nbError = 0; + for (size_t i = 0; i < errorRate->nb_repetition; i++) { + /* Call the server lambda */ + auto publicResult = + support.serverCall(serverLambda, *publicArguments, evaluationKeys); + ASSERT_EXPECTED_SUCCESS(publicResult); + + /* Decrypt the public result */ + auto result = mlir::concretelang::typedResult< + std::unique_ptr>(*keySet, + **publicResult); + ASSERT_EXPECTED_SUCCESS(result); + + /* Check result */ + // For now we support just one result + assert(desc.outputs.size() == 1); + auto err = checkResult(desc.outputs[0], **result); + if (err) { + nbError++; + DISCARD_LLVM_ERROR(err); + } + } + double threshold = errorRate->too_high_error_count_threshold(); + std::cout << "n_rep " << errorRate->nb_repetition << " p_error " + << errorRate->global_p_error << " maximum_errors " << threshold + << "\n"; + ASSERT_LE(nbError, threshold) << "Empirical error rate is too high"; + } + +private: + std::string program; + TestDescription desc; + llvm::Optional errorRate; + LambdaSupport support; + mlir::concretelang::CompilationOptions options; + + // Initialized by the SetUp + typename LambdaSupport::lambda serverLambda; + mlir::concretelang::ClientParameters clientParameters; + std::unique_ptr keySet; + std::unique_ptr publicArguments; +}; + +std::string getTestName(EndToEndDesc desc, + mlir::concretelang::CompilationOptions options, + int testNum) { + std::ostringstream os; + if (options.loopParallelize) + os << "_loop"; + if (options.dataflowParallelize) + os << "_dataflow"; + if (options.emitGPUOps) + os << "_gpu"; + auto ostr = os.str(); + if (ostr.size() == 0) { + os << "_default"; + } + os << "." << desc.description << "." << testNum; + return os.str().substr(1); +} + +void registerEndToEnd(std::string suiteName, std::string testName, + std::string valueName, std::string libpath, + std::string program, TestDescription test, + llvm::Optional errorRate, + mlir::concretelang::CompilationOptions options) { + // TODO: Get file and line from yaml + auto file = __FILE__; + auto line = __LINE__; + if (libpath.empty()) { + ::testing::RegisterTest( + suiteName.c_str(), testName.c_str(), nullptr, valueName.c_str(), file, + line, [=]() -> EndToEndTest * { + return new EndToEndTest( + program, test, errorRate, mlir::concretelang::JITSupport(), + options); + }); + } else { + ::testing::RegisterTest( + suiteName.c_str(), testName.c_str(), nullptr, valueName.c_str(), file, + line, [=]() -> EndToEndTest * { + return new EndToEndTest( + program, test, errorRate, + mlir::concretelang::LibrarySupport(libpath), options); + }); + } +} + +void registerEndToEnd(std::string suiteName, std::string libpath, + EndToEndDesc desc, + mlir::concretelang::CompilationOptions options) { + if (desc.v0Constraint.hasValue()) { + options.v0FHEConstraints = desc.v0Constraint; + } + auto i = 0; + for (auto test : desc.tests) { + auto valueName = std::to_string(i); + auto testName = getTestName(desc, options, i); + if (desc.test_error_rates.empty()) { + registerEndToEnd(suiteName, testName, valueName, + libpath.empty() ? libpath : libpath + desc.description, + desc.program, test, llvm::None, options); + } else { + auto j = 0; + for (auto rate : desc.test_error_rates) { + auto rateName = testName + "_rate" + std::to_string(j); + registerEndToEnd(suiteName, rateName, valueName, + libpath.empty() ? libpath : libpath + desc.description, + desc.program, test, rate, options); + j++; + } + } + i++; + } +} + +/// @brief Register a suite of end to end test +/// @param suiteName The name of the suite. +/// @param descriptions A vector of description of tests to register . +/// @param options The compilation options. +void registerEndToEndSuite(std::string suiteName, std::string libpath, + std::vector descriptions, + mlir::concretelang::CompilationOptions options) { + for (auto desc : descriptions) { + registerEndToEnd(suiteName, libpath, desc, options); + } +} + +namespace path = llvm::sys::path; + +int main(int argc, char **argv) { + + // Parse google test options, update argc and argv by removing gtest options + ::testing::InitGoogleTest(&argc, argv); + + // Main command line options + llvm::cl::ResetCommandLineParser(); + + llvm::cl::list descriptionFiles( + llvm::cl::Positional, llvm::cl::desc(""), + llvm::cl::OneOrMore); + + // Compilation options + llvm::cl::opt loopParallelize( + "loop-parallelize", + llvm::cl::desc( + "Set the loopParallelize compilation options to run the tests"), + llvm::cl::init(false)); + llvm::cl::opt dataflowParallelize( + "dataflow-parallelize", + llvm::cl::desc( + "Set the loopParallelize compilation options to run the tests"), + llvm::cl::init(false)); + llvm::cl::opt emitGPUOps( + "emit-gpu-ops", + llvm::cl::desc("Set the emitGPUOps compilation options to run the tests"), + llvm::cl::init(false)); + + // Optimizer options + llvm::cl::opt optimizerDisplay( + "optimizer-display", + llvm::cl::desc("Set the optimizerConfig.display compilation options to " + "run the tests"), + llvm::cl::init(false)); + + // JIT or Library support + llvm::cl::opt jit( + "jit", + llvm::cl::desc("Use JIT support to run the tests (default, overwritten " + "if --library is set"), + llvm::cl::init(true)); + llvm::cl::opt library( + "library", + llvm::cl::desc("Use library support to run the tests and specify the " + "prefix for compilation artifacts"), + llvm::cl::init("")); + + llvm::cl::ParseCommandLineOptions(argc, argv); + + // Build compilation options + mlir::concretelang::CompilationOptions compilationOptions("main"); + compilationOptions.loopParallelize = loopParallelize.getValue(); + compilationOptions.dataflowParallelize = dataflowParallelize.getValue(); + compilationOptions.emitGPUOps = emitGPUOps.getValue(); + compilationOptions.optimizerConfig.display = optimizerDisplay.getValue(); + + for (auto descFile : descriptionFiles) { + auto desc = loadEndToEndDesc(descFile); + auto suiteName = path::stem(descFile).str(); + auto libpath = library.getValue(); + if (libpath.empty() && !jit.getValue()) { + llvm::errs() + << "You must specify the library path or use jit to run the test"; + return 1; + } + if (libpath.empty()) { + suiteName = suiteName + ".jit"; + } else { + suiteName = suiteName + ".library"; + } + registerEndToEndSuite(suiteName, libpath, desc, compilationOptions); + } + return RUN_ALL_TESTS(); +}