From ce30989adc58476142a6a71516f1525fea6e2371 Mon Sep 17 00:00:00 2001 From: Hare Sudhan Date: Sat, 24 Feb 2024 22:59:51 -0500 Subject: [PATCH 1/7] add formatter --- .github/workflows/pull_requests.yml | 3 + Gruntfile.js | 322 +- babel.config.js | 37 +- biome.json | 20 + package-lock.json | 38 + package.json | 1 + postcss.config.js | 4 +- src/core/Chef.mjs | 38 +- src/core/ChefWorker.js | 116 +- src/core/Dish.mjs | 215 +- src/core/Ingredient.mjs | 25 +- src/core/Operation.mjs | 62 +- src/core/Recipe.mjs | 93 +- src/core/Utils.mjs | 424 +- src/core/config/scripts/generateConfig.mjs | 43 +- src/core/config/scripts/generateOpsIndex.mjs | 21 +- src/core/config/scripts/newMinorVersion.mjs | 107 +- src/core/config/scripts/newOperation.mjs | 110 +- src/core/dishTypes/DishBigNumber.mjs | 5 +- src/core/dishTypes/DishByteArray.mjs | 1 - src/core/dishTypes/DishFile.mjs | 3 +- src/core/dishTypes/DishHTML.mjs | 8 +- src/core/dishTypes/DishJSON.mjs | 6 +- src/core/dishTypes/DishListFile.mjs | 9 +- src/core/dishTypes/DishNumber.mjs | 11 +- src/core/dishTypes/DishString.mjs | 6 +- src/core/dishTypes/DishType.mjs | 2 - src/core/dishTypes/index.mjs | 1 - src/core/errors/index.mjs | 6 +- src/core/lib/Arithmetic.mjs | 12 +- src/core/lib/BCD.mjs | 14 +- src/core/lib/Bacon.mjs | 25 +- src/core/lib/Base64.mjs | 129 +- src/core/lib/Base85.mjs | 5 +- src/core/lib/Base92.mjs | 13 +- src/core/lib/Binary.mjs | 17 +- src/core/lib/BitwiseOp.mjs | 25 +- src/core/lib/Blowfish.mjs | 601 +- src/core/lib/Bombe.mjs | 111 +- src/core/lib/Braille.mjs | 2 +- src/core/lib/CanvasComponents.mjs | 51 +- src/core/lib/Charts.mjs | 104 +- src/core/lib/ChrEnc.mjs | 15 +- src/core/lib/CipherSaber2.mjs | 10 +- src/core/lib/Ciphers.mjs | 25 +- src/core/lib/Code.mjs | 2 +- src/core/lib/Colossus.mjs | 188 +- src/core/lib/ConvertCoordinates.mjs | 141 +- src/core/lib/Crypt.mjs | 3 +- src/core/lib/DateTime.mjs | 22 +- src/core/lib/Decimal.mjs | 7 +- src/core/lib/Delim.mjs | 103 +- src/core/lib/Enigma.mjs | 83 +- src/core/lib/Extract.mjs | 26 +- src/core/lib/FileSignatures.mjs | 1050 +- src/core/lib/FileType.mjs | 68 +- src/core/lib/FlowControl.mjs | 2 +- src/core/lib/FuzzyMatch.mjs | 56 +- src/core/lib/Hash.mjs | 4 +- src/core/lib/Hex.mjs | 36 +- src/core/lib/IP.mjs | 418 +- src/core/lib/ImageManipulation.mjs | 35 +- src/core/lib/JWT.mjs | 3 +- src/core/lib/LS47.mjs | 38 +- src/core/lib/LZNT1.mjs | 34 +- src/core/lib/LZString.mjs | 12 +- src/core/lib/LoremIpsum.mjs | 143 +- src/core/lib/Lorenz.mjs | 373 +- src/core/lib/Magic.mjs | 9494 +++++++++- src/core/lib/PGP.mjs | 43 +- src/core/lib/Protobuf.mjs | 153 +- src/core/lib/Protocol.mjs | 15 +- src/core/lib/PublicKey.mjs | 3 +- src/core/lib/QRCode.mjs | 12 +- src/core/lib/RSA.mjs | 2 +- src/core/lib/Rotate.mjs | 18 +- src/core/lib/SIGABA.mjs | 103 +- src/core/lib/SM4.mjs | 236 +- src/core/lib/Sort.mjs | 12 +- src/core/lib/Stream.mjs | 65 +- src/core/lib/TLVParser.mjs | 3 +- src/core/lib/Typex.mjs | 60 +- src/core/lib/Zlib.mjs | 10 +- src/core/operations/A1Z26CipherDecode.mjs | 53 +- src/core/operations/A1Z26CipherEncode.mjs | 11 +- src/core/operations/ADD.mjs | 23 +- src/core/operations/AESDecrypt.mjs | 92 +- src/core/operations/AESEncrypt.mjs | 86 +- src/core/operations/AESKeyUnwrap.mjs | 57 +- src/core/operations/AESKeyWrap.mjs | 52 +- src/core/operations/AMFDecode.mjs | 9 +- src/core/operations/AMFEncode.mjs | 9 +- src/core/operations/AND.mjs | 20 +- src/core/operations/AddLineNumbers.mjs | 7 +- src/core/operations/AddTextToImage.mjs | 115 +- src/core/operations/Adler32Checksum.mjs | 5 +- src/core/operations/AffineCipherDecode.mjs | 40 +- src/core/operations/AffineCipherEncode.mjs | 19 +- src/core/operations/AnalyseHash.mjs | 56 +- src/core/operations/Argon2.mjs | 64 +- src/core/operations/Argon2Compare.mjs | 15 +- src/core/operations/AtbashCipher.mjs | 5 +- src/core/operations/AvroToJSON.mjs | 17 +- src/core/operations/BLAKE2b.mjs | 49 +- src/core/operations/BLAKE2s.mjs | 46 +- src/core/operations/BSONDeserialise.mjs | 5 +- src/core/operations/BSONSerialise.mjs | 5 +- src/core/operations/BaconCipherDecode.mjs | 86 +- src/core/operations/BaconCipherEncode.mjs | 38 +- src/core/operations/Bcrypt.mjs | 16 +- src/core/operations/BcryptCompare.mjs | 17 +- src/core/operations/BcryptParse.mjs | 5 +- src/core/operations/BifidCipherDecode.mjs | 67 +- src/core/operations/BifidCipherEncode.mjs | 70 +- src/core/operations/BitShiftLeft.mjs | 18 +- src/core/operations/BitShiftRight.mjs | 24 +- src/core/operations/BlowfishDecrypt.mjs | 51 +- src/core/operations/BlowfishEncrypt.mjs | 43 +- src/core/operations/BlurImage.mjs | 11 +- src/core/operations/Bombe.mjs | 63 +- src/core/operations/Bzip2Compress.mjs | 29 +- src/core/operations/Bzip2Decompress.mjs | 26 +- src/core/operations/CBORDecode.mjs | 5 +- src/core/operations/CBOREncode.mjs | 5 +- src/core/operations/CMAC.mjs | 74 +- src/core/operations/CRC16Checksum.mjs | 5 +- src/core/operations/CRC32Checksum.mjs | 5 +- src/core/operations/CRC8Checksum.mjs | 43 +- src/core/operations/CSSBeautify.mjs | 13 +- src/core/operations/CSSMinify.mjs | 10 +- src/core/operations/CSSSelector.mjs | 37 +- src/core/operations/CSVToJSON.mjs | 18 +- src/core/operations/CTPH.mjs | 8 +- src/core/operations/CaesarBoxCipher.mjs | 14 +- src/core/operations/CaretMdecode.mjs | 8 +- src/core/operations/CartesianProduct.mjs | 37 +- src/core/operations/CetaceanCipherDecode.mjs | 20 +- src/core/operations/CetaceanCipherEncode.mjs | 20 +- src/core/operations/ChaCha.mjs | 87 +- src/core/operations/ChangeIPFormat.mjs | 45 +- src/core/operations/ChiSquare.mjs | 6 +- src/core/operations/CipherSaber2Decrypt.mjs | 15 +- src/core/operations/CipherSaber2Encrypt.mjs | 18 +- src/core/operations/CitrixCTX1Decode.mjs | 18 +- src/core/operations/CitrixCTX1Encode.mjs | 5 +- src/core/operations/Colossus.mjs | 335 +- src/core/operations/Comment.mjs | 13 +- src/core/operations/CompareCTPHHashes.mjs | 21 +- src/core/operations/CompareSSDEEPHashes.mjs | 18 +- src/core/operations/ConditionalJump.mjs | 37 +- src/core/operations/ContainImage.mjs | 62 +- src/core/operations/ConvertArea.mjs | 137 +- .../operations/ConvertCoordinateFormat.mjs | 80 +- src/core/operations/ConvertDataUnits.mjs | 127 +- src/core/operations/ConvertDistance.mjs | 110 +- src/core/operations/ConvertImageFormat.mjs | 47 +- src/core/operations/ConvertMass.mjs | 207 +- src/core/operations/ConvertSpeed.mjs | 101 +- src/core/operations/ConvertToNATOAlphabet.mjs | 77 +- src/core/operations/CountOccurrences.mjs | 19 +- src/core/operations/CoverImage.mjs | 58 +- src/core/operations/CropImage.mjs | 41 +- src/core/operations/DESDecrypt.mjs | 63 +- src/core/operations/DESEncrypt.mjs | 49 +- src/core/operations/DNSOverHTTPS.mjs | 61 +- src/core/operations/DechunkHTTPResponse.mjs | 16 +- src/core/operations/DecodeNetBIOSName.mjs | 29 +- src/core/operations/DecodeText.mjs | 16 +- src/core/operations/DefangIPAddresses.mjs | 36 +- src/core/operations/DefangURL.mjs | 31 +- src/core/operations/DeriveEVPKey.mjs | 64 +- src/core/operations/DeriveHKDFKey.mjs | 84 +- src/core/operations/DerivePBKDF2Key.mjs | 57 +- src/core/operations/DetectFileType.mjs | 36 +- src/core/operations/Diff.mjs | 59 +- src/core/operations/DisassembleX86.mjs | 49 +- src/core/operations/DitherImage.mjs | 6 +- src/core/operations/Divide.mjs | 14 +- src/core/operations/DropBytes.mjs | 45 +- src/core/operations/ELFInfo.mjs | 302 +- src/core/operations/EncodeNetBIOSName.mjs | 14 +- src/core/operations/EncodeText.mjs | 17 +- src/core/operations/Enigma.mjs | 69 +- src/core/operations/Entropy.mjs | 184 +- src/core/operations/EscapeString.mjs | 37 +- .../operations/EscapeUnicodeCharacters.mjs | 39 +- src/core/operations/ExpandAlphabetRange.mjs | 13 +- src/core/operations/ExtractDates.mjs | 22 +- src/core/operations/ExtractDomains.mjs | 15 +- src/core/operations/ExtractEXIF.mjs | 6 +- src/core/operations/ExtractEmailAddresses.mjs | 15 +- src/core/operations/ExtractFilePaths.mjs | 34 +- src/core/operations/ExtractFiles.mjs | 71 +- src/core/operations/ExtractID3.mjs | 334 +- src/core/operations/ExtractIPAddresses.mjs | 51 +- src/core/operations/ExtractLSB.mjs | 26 +- src/core/operations/ExtractMACAddresses.mjs | 17 +- src/core/operations/ExtractRGBA.mjs | 20 +- src/core/operations/ExtractURLs.mjs | 15 +- src/core/operations/FernetDecrypt.mjs | 13 +- src/core/operations/FernetEncrypt.mjs | 9 +- src/core/operations/FileTree.mjs | 18 +- src/core/operations/Filter.mjs | 29 +- src/core/operations/FindReplace.mjs | 51 +- src/core/operations/Fletcher16Checksum.mjs | 8 +- src/core/operations/Fletcher32Checksum.mjs | 14 +- src/core/operations/Fletcher64Checksum.mjs | 17 +- src/core/operations/Fletcher8Checksum.mjs | 5 +- src/core/operations/FlipImage.mjs | 6 +- src/core/operations/Fork.mjs | 59 +- src/core/operations/FormatMACAddresses.mjs | 61 +- src/core/operations/FrequencyDistribution.mjs | 43 +- src/core/operations/FromBCD.mjs | 47 +- src/core/operations/FromBase.mjs | 19 +- src/core/operations/FromBase32.mjs | 43 +- src/core/operations/FromBase45.mjs | 30 +- src/core/operations/FromBase58.mjs | 46 +- src/core/operations/FromBase62.mjs | 15 +- src/core/operations/FromBase64.mjs | 118 +- src/core/operations/FromBase85.mjs | 52 +- src/core/operations/FromBase92.mjs | 3 +- src/core/operations/FromBinary.mjs | 47 +- src/core/operations/FromBraille.mjs | 15 +- .../operations/FromCaseInsensitiveRegex.mjs | 8 +- src/core/operations/FromCharcode.mjs | 30 +- src/core/operations/FromDecimal.mjs | 60 +- src/core/operations/FromHTMLEntity.mjs | 2936 +-- src/core/operations/FromHex.mjs | 35 +- src/core/operations/FromHexContent.mjs | 32 +- src/core/operations/FromHexdump.mjs | 75 +- src/core/operations/FromMessagePack.mjs | 9 +- src/core/operations/FromMorseCode.mjs | 117 +- src/core/operations/FromOctal.mjs | 49 +- src/core/operations/FromPunycode.mjs | 13 +- src/core/operations/FromQuotedPrintable.mjs | 19 +- src/core/operations/FromUNIXTimestamp.mjs | 25 +- src/core/operations/FuzzyMatch.mjs | 36 +- src/core/operations/GOSTDecrypt.mjs | 85 +- src/core/operations/GOSTEncrypt.mjs | 85 +- src/core/operations/GOSTHash.mjs | 32 +- src/core/operations/GOSTKeyUnwrap.mjs | 83 +- src/core/operations/GOSTKeyWrap.mjs | 83 +- src/core/operations/GOSTSign.mjs | 79 +- src/core/operations/GOSTVerify.mjs | 72 +- src/core/operations/GenerateAllHashes.mjs | 402 +- .../operations/GenerateDeBruijnSequence.mjs | 22 +- src/core/operations/GenerateHOTP.mjs | 36 +- src/core/operations/GenerateImage.mjs | 63 +- src/core/operations/GenerateLoremIpsum.mjs | 28 +- src/core/operations/GeneratePGPKeyPair.mjs | 83 +- src/core/operations/GenerateQRCode.mjs | 37 +- src/core/operations/GenerateRSAKeyPair.mjs | 68 +- src/core/operations/GenerateTOTP.mjs | 44 +- src/core/operations/GenerateUUID.mjs | 23 +- src/core/operations/GenericCodeBeautify.mjs | 48 +- src/core/operations/GetAllCasings.mjs | 4 +- src/core/operations/GetTime.mjs | 17 +- src/core/operations/GroupIPAddresses.mjs | 48 +- src/core/operations/Gunzip.mjs | 9 +- src/core/operations/Gzip.mjs | 26 +- src/core/operations/HAS160.mjs | 13 +- .../operations/HASSHClientFingerprint.mjs | 27 +- .../operations/HASSHServerFingerprint.mjs | 29 +- src/core/operations/HMAC.mjs | 30 +- src/core/operations/HTMLToText.mjs | 5 +- src/core/operations/HTTPRequest.mjs | 94 +- src/core/operations/HammingDistance.mjs | 35 +- src/core/operations/HaversineDistance.mjs | 28 +- src/core/operations/Head.mjs | 21 +- src/core/operations/HeatmapChart.mjs | 104 +- src/core/operations/HexDensityChart.mjs | 116 +- src/core/operations/HexToObjectIdentifier.mjs | 5 +- src/core/operations/HexToPEM.mjs | 18 +- .../operations/ImageBrightnessContrast.mjs | 12 +- src/core/operations/ImageFilter.mjs | 19 +- .../ImageHueSaturationLightness.mjs | 28 +- src/core/operations/ImageOpacity.mjs | 6 +- src/core/operations/IndexOfCoincidence.mjs | 15 +- src/core/operations/InvertImage.mjs | 2 - src/core/operations/JA3Fingerprint.mjs | 52 +- src/core/operations/JA3SFingerprint.mjs | 25 +- src/core/operations/JPathExpression.mjs | 24 +- src/core/operations/JSONBeautify.mjs | 62 +- src/core/operations/JSONMinify.mjs | 2 - src/core/operations/JSONToCSV.mjs | 54 +- src/core/operations/JWTDecode.mjs | 12 +- src/core/operations/JWTSign.mjs | 16 +- src/core/operations/JWTVerify.mjs | 15 +- src/core/operations/JavaScriptBeautify.mjs | 43 +- src/core/operations/JavaScriptMinify.mjs | 6 +- src/core/operations/JavaScriptParser.mjs | 50 +- src/core/operations/Jump.mjs | 16 +- src/core/operations/Keccak.mjs | 13 +- src/core/operations/LMHash.mjs | 10 +- src/core/operations/LS47Decrypt.mjs | 11 +- src/core/operations/LS47Encrypt.mjs | 13 +- src/core/operations/LZ4Compress.mjs | 5 +- src/core/operations/LZ4Decompress.mjs | 5 +- src/core/operations/LZMACompress.mjs | 48 +- src/core/operations/LZMADecompress.mjs | 51 +- src/core/operations/LZNT1Decompress.mjs | 10 +- src/core/operations/LZStringCompress.mjs | 11 +- src/core/operations/LZStringDecompress.mjs | 15 +- src/core/operations/Label.mjs | 13 +- src/core/operations/LevenshteinDistance.mjs | 20 +- src/core/operations/Lorenz.mjs | 858 +- src/core/operations/LuhnChecksum.mjs | 44 +- src/core/operations/MD2.mjs | 13 +- src/core/operations/MD4.mjs | 7 +- src/core/operations/MD5.mjs | 7 +- src/core/operations/MD6.mjs | 25 +- src/core/operations/Magic.mjs | 108 +- src/core/operations/Mean.mjs | 13 +- src/core/operations/Median.mjs | 13 +- src/core/operations/Merge.mjs | 7 +- .../operations/MicrosoftScriptDecoder.mjs | 25 +- src/core/operations/MultipleBombe.mjs | 115 +- src/core/operations/Multiply.mjs | 14 +- src/core/operations/MurmurHash3.mjs | 77 +- src/core/operations/NOT.mjs | 2 - src/core/operations/NTHash.mjs | 6 +- src/core/operations/NormaliseImage.mjs | 4 +- src/core/operations/NormaliseUnicode.mjs | 14 +- src/core/operations/Numberwang.mjs | 45 +- src/core/operations/OR.mjs | 20 +- src/core/operations/ObjectIdentifierToHex.mjs | 5 +- src/core/operations/OffsetChecker.mjs | 20 +- .../OpticalCharacterRecognition.mjs | 36 +- src/core/operations/PEMToHex.mjs | 14 +- src/core/operations/PGPDecrypt.mjs | 29 +- src/core/operations/PGPDecryptAndVerify.mjs | 52 +- src/core/operations/PGPEncrypt.mjs | 27 +- src/core/operations/PGPEncryptAndSign.mjs | 40 +- src/core/operations/PGPVerify.mjs | 37 +- src/core/operations/PHPDeserialize.mjs | 32 +- src/core/operations/PLISTViewer.mjs | 65 +- src/core/operations/PadLines.mjs | 31 +- src/core/operations/ParseASN1HexString.mjs | 32 +- src/core/operations/ParseColourCode.mjs | 68 +- src/core/operations/ParseDateTime.mjs | 63 +- src/core/operations/ParseIPRange.mjs | 81 +- src/core/operations/ParseIPv4Header.mjs | 66 +- src/core/operations/ParseIPv6Address.mjs | 289 +- .../operations/ParseObjectIDTimestamp.mjs | 8 +- src/core/operations/ParseQRCode.mjs | 24 +- src/core/operations/ParseSSHHostKey.mjs | 27 +- src/core/operations/ParseTCP.mjs | 132 +- src/core/operations/ParseTLV.mjs | 17 +- src/core/operations/ParseUDP.mjs | 15 +- .../operations/ParseUNIXFilePermissions.mjs | 56 +- src/core/operations/ParseURI.mjs | 9 +- src/core/operations/ParseUserAgent.mjs | 13 +- src/core/operations/ParseX509Certificate.mjs | 125 +- src/core/operations/PlayMedia.mjs | 13 +- src/core/operations/PowerSet.mjs | 20 +- src/core/operations/ProtobufDecode.mjs | 13 +- src/core/operations/ProtobufEncode.mjs | 12 +- .../PseudoRandomNumberGenerator.mjs | 30 +- src/core/operations/RAKE.mjs | 53 +- src/core/operations/RC2Decrypt.mjs | 41 +- src/core/operations/RC2Encrypt.mjs | 42 +- src/core/operations/RC4.mjs | 51 +- src/core/operations/RC4Drop.mjs | 64 +- src/core/operations/RIPEMD.mjs | 15 +- src/core/operations/ROT13.mjs | 22 +- src/core/operations/ROT13BruteForce.mjs | 67 +- src/core/operations/ROT47.mjs | 7 +- src/core/operations/ROT47BruteForce.mjs | 22 +- src/core/operations/ROT8000.mjs | 51 +- src/core/operations/RSADecrypt.mjs | 30 +- src/core/operations/RSAEncrypt.mjs | 32 +- src/core/operations/RSASign.mjs | 13 +- src/core/operations/RSAVerify.mjs | 17 +- src/core/operations/Rabbit.mjs | 95 +- src/core/operations/RailFenceCipherDecode.mjs | 21 +- src/core/operations/RailFenceCipherEncode.mjs | 18 +- .../operations/RandomizeColourPalette.mjs | 18 +- src/core/operations/RawDeflate.mjs | 17 +- src/core/operations/RawInflate.mjs | 29 +- src/core/operations/Register.mjs | 67 +- src/core/operations/RegularExpression.mjs | 137 +- src/core/operations/RemoveDiacritics.mjs | 5 +- src/core/operations/RemoveEXIF.mjs | 6 +- src/core/operations/RemoveLineNumbers.mjs | 5 +- src/core/operations/RemoveNullBytes.mjs | 5 +- src/core/operations/RemoveWhitespace.mjs | 45 +- src/core/operations/RenderImage.mjs | 24 +- src/core/operations/RenderMarkdown.mjs | 15 +- src/core/operations/ResizeImage.mjs | 27 +- src/core/operations/Return.mjs | 5 +- src/core/operations/Reverse.mjs | 12 +- src/core/operations/RisonDecode.mjs | 12 +- src/core/operations/RisonEncode.mjs | 14 +- src/core/operations/RotateImage.mjs | 9 +- src/core/operations/RotateLeft.mjs | 16 +- src/core/operations/RotateRight.mjs | 16 +- src/core/operations/SHA0.mjs | 13 +- src/core/operations/SHA1.mjs | 13 +- src/core/operations/SHA2.mjs | 33 +- src/core/operations/SHA3.mjs | 13 +- src/core/operations/SIGABA.mjs | 128 +- src/core/operations/SM3.mjs | 14 +- src/core/operations/SM4Decrypt.mjs | 63 +- src/core/operations/SM4Encrypt.mjs | 55 +- src/core/operations/SQLBeautify.mjs | 13 +- src/core/operations/SQLMinify.mjs | 2 - src/core/operations/SSDEEP.mjs | 5 +- src/core/operations/SUB.mjs | 23 +- src/core/operations/ScanForEmbeddedFiles.mjs | 14 +- src/core/operations/ScatterChart.mjs | 66 +- src/core/operations/Scrypt.mjs | 58 +- src/core/operations/SeriesChart.mjs | 118 +- src/core/operations/SetDifference.mjs | 22 +- src/core/operations/SetIntersection.mjs | 16 +- src/core/operations/SetUnion.mjs | 13 +- src/core/operations/Shake.mjs | 22 +- src/core/operations/SharpenImage.mjs | 137 +- src/core/operations/ShowBase64Offsets.mjs | 210 +- src/core/operations/ShowOnMap.mjs | 32 +- src/core/operations/Shuffle.mjs | 32 +- src/core/operations/Sleep.mjs | 15 +- src/core/operations/Snefru.mjs | 15 +- src/core/operations/Sort.mjs | 42 +- src/core/operations/Split.mjs | 21 +- src/core/operations/SplitColourChannels.mjs | 64 +- src/core/operations/StandardDeviation.mjs | 15 +- src/core/operations/Streebog.mjs | 17 +- src/core/operations/Strings.mjs | 33 +- src/core/operations/StripHTMLTags.mjs | 24 +- src/core/operations/StripHTTPHeaders.mjs | 20 +- src/core/operations/Subsection.mjs | 68 +- src/core/operations/Substitute.mjs | 39 +- src/core/operations/Subtract.mjs | 14 +- src/core/operations/Sum.mjs | 14 +- src/core/operations/SwapCase.mjs | 5 +- src/core/operations/SwapEndianness.mjs | 27 +- src/core/operations/SymmetricDifference.mjs | 16 +- src/core/operations/SyntaxHighlighter.mjs | 13 +- src/core/operations/TCPIPChecksum.mjs | 7 +- src/core/operations/Tail.mjs | 22 +- src/core/operations/TakeBytes.mjs | 43 +- src/core/operations/Tar.mjs | 30 +- .../operations/TextEncodingBruteForce.mjs | 35 +- src/core/operations/ToBCD.mjs | 74 +- src/core/operations/ToBase.mjs | 17 +- src/core/operations/ToBase32.mjs | 40 +- src/core/operations/ToBase45.mjs | 17 +- src/core/operations/ToBase58.mjs | 29 +- src/core/operations/ToBase62.mjs | 11 +- src/core/operations/ToBase64.mjs | 18 +- src/core/operations/ToBase85.mjs | 33 +- src/core/operations/ToBase92.mjs | 12 +- src/core/operations/ToBinary.mjs | 31 +- src/core/operations/ToBraille.mjs | 15 +- src/core/operations/ToCamelCase.mjs | 13 +- .../operations/ToCaseInsensitiveRegex.mjs | 81 +- src/core/operations/ToCharcode.mjs | 29 +- src/core/operations/ToDecimal.mjs | 24 +- src/core/operations/ToHTMLEntity.mjs | 37 +- src/core/operations/ToHex.mjs | 39 +- src/core/operations/ToHexContent.mjs | 36 +- src/core/operations/ToHexdump.mjs | 102 +- src/core/operations/ToKebabCase.mjs | 13 +- src/core/operations/ToLowerCase.mjs | 5 +- src/core/operations/ToMessagePack.mjs | 11 +- src/core/operations/ToMorseCode.mjs | 149 +- src/core/operations/ToOctal.mjs | 18 +- src/core/operations/ToPunycode.mjs | 13 +- src/core/operations/ToQuotedPrintable.mjs | 73 +- src/core/operations/ToSnakeCase.mjs | 12 +- src/core/operations/ToTable.mjs | 114 +- src/core/operations/ToUNIXTimestamp.mjs | 33 +- src/core/operations/ToUpperCase.mjs | 21 +- .../operations/TranslateDateTimeFormat.mjs | 47 +- src/core/operations/TripleDESDecrypt.mjs | 67 +- src/core/operations/TripleDESEncrypt.mjs | 53 +- src/core/operations/Typex.mjs | 83 +- .../UNIXTimestampToWindowsFiletime.mjs | 27 +- src/core/operations/URLDecode.mjs | 7 +- src/core/operations/URLEncode.mjs | 16 +- src/core/operations/UnescapeString.mjs | 5 +- .../operations/UnescapeUnicodeCharacters.mjs | 17 +- src/core/operations/UnicodeTextFormat.mjs | 17 +- src/core/operations/Unique.mjs | 14 +- src/core/operations/Untar.mjs | 22 +- src/core/operations/Unzip.mjs | 22 +- src/core/operations/VarIntDecode.mjs | 8 +- src/core/operations/VarIntEncode.mjs | 8 +- src/core/operations/ViewBitPlane.mjs | 32 +- src/core/operations/VigenèreDecode.mjs | 24 +- src/core/operations/VigenèreEncode.mjs | 16 +- src/core/operations/Whirlpool.mjs | 15 +- .../WindowsFiletimeToUNIXTimestamp.mjs | 33 +- src/core/operations/XKCDRandomNumber.mjs | 7 +- src/core/operations/XMLBeautify.mjs | 13 +- src/core/operations/XMLMinify.mjs | 10 +- src/core/operations/XOR.mjs | 37 +- src/core/operations/XORBruteForce.mjs | 88 +- src/core/operations/XPathExpression.mjs | 33 +- src/core/operations/YARARules.mjs | 73 +- src/core/operations/Zip.mjs | 39 +- src/core/operations/ZlibDeflate.mjs | 16 +- src/core/operations/ZlibInflate.mjs | 27 +- src/core/vendor/DisassembleX86-64.mjs | 14891 +++++++++++----- src/core/vendor/gost/gostCipher.mjs | 1332 +- src/core/vendor/gost/gostCoding.mjs | 927 +- src/core/vendor/gost/gostCrypto.mjs | 1348 +- src/core/vendor/gost/gostDigest.mjs | 647 +- src/core/vendor/gost/gostEngine.mjs | 213 +- src/core/vendor/gost/gostRandom.mjs | 89 +- src/core/vendor/gost/gostSign.mjs | 1143 +- src/core/vendor/remove-exif.mjs | 229 +- src/node/File.mjs | 6 +- src/node/NodeDish.mjs | 15 +- src/node/NodeRecipe.mjs | 29 +- src/node/api.mjs | 88 +- src/node/apiUtils.mjs | 12 +- src/node/config/excludedOperations.mjs | 2 +- src/node/config/scripts/generateNodeIndex.mjs | 26 +- src/node/repl.mjs | 2 - src/web/App.mjs | 305 +- src/web/HTMLCategory.mjs | 8 +- src/web/HTMLIngredient.mjs | 169 +- src/web/HTMLOperation.mjs | 58 +- src/web/Manager.mjs | 742 +- src/web/index.js | 45 +- src/web/static/sitemap.mjs | 11 +- src/web/utils/copyOverride.mjs | 22 +- src/web/utils/editorUtils.mjs | 22 +- src/web/utils/fileDetails.mjs | 50 +- src/web/utils/htmlWidget.mjs | 33 +- src/web/utils/sidePanel.mjs | 209 +- src/web/utils/statusBar.mjs | 175 +- src/web/waiters/BackgroundWorkerWaiter.mjs | 49 +- src/web/waiters/BindingsWaiter.mjs | 55 +- src/web/waiters/ControlsWaiter.mjs | 132 +- src/web/waiters/HighlighterWaiter.mjs | 72 +- src/web/waiters/InputWaiter.mjs | 569 +- src/web/waiters/OperationsWaiter.mjs | 108 +- src/web/waiters/OptionsWaiter.mjs | 40 +- src/web/waiters/OutputWaiter.mjs | 658 +- src/web/waiters/RecipeWaiter.mjs | 173 +- src/web/waiters/SeasonalWaiter.mjs | 8 +- src/web/waiters/TabWaiter.mjs | 36 +- src/web/waiters/TimingWaiter.mjs | 88 +- src/web/waiters/WindowWaiter.mjs | 13 +- src/web/waiters/WorkerWaiter.mjs | 251 +- src/web/workers/DishWorker.mjs | 36 +- src/web/workers/InputWorker.mjs | 246 +- src/web/workers/LoaderWorker.js | 38 +- src/web/workers/ZipWorker.mjs | 27 +- tests/browser/00_nightwatch.js | 240 +- tests/browser/01_io.js | 1046 +- tests/browser/02_ops.js | 711 +- tests/browser/browserUtils.js | 111 +- tests/lib/TestRegister.mjs | 81 +- tests/lib/utils.mjs | 62 +- tests/node/assertionHandler.mjs | 2 - tests/node/consumers/cjs-consumer.js | 10 +- tests/node/consumers/esm-consumer.mjs | 12 +- tests/node/index.mjs | 9 +- tests/node/tests/Categories.mjs | 16 +- tests/node/tests/Dish.mjs | 1 - tests/node/tests/File.mjs | 15 +- tests/node/tests/NodeDish.mjs | 92 +- tests/node/tests/Utils.mjs | 1 - tests/node/tests/nodeApi.mjs | 215 +- tests/node/tests/operations.mjs | 703 +- tests/operations/index.mjs | 9 +- tests/operations/tests/AESKeyWrap.mjs | 462 +- tests/operations/tests/AvroToJSON.mjs | 28 +- tests/operations/tests/BCD.mjs | 74 +- tests/operations/tests/BLAKE2b.mjs | 55 +- tests/operations/tests/BLAKE2s.mjs | 37 +- tests/operations/tests/BSON.mjs | 7 +- tests/operations/tests/BaconCipher.mjs | 205 +- tests/operations/tests/Base58.mjs | 32 +- tests/operations/tests/Base62.mjs | 2 +- tests/operations/tests/Base64.mjs | 3 +- tests/operations/tests/Base85.mjs | 37 +- tests/operations/tests/BitwiseOp.mjs | 42 +- tests/operations/tests/Bombe.mjs | 169 +- tests/operations/tests/ByteRepr.mjs | 120 +- tests/operations/tests/CBORDecode.mjs | 80 +- tests/operations/tests/CBOREncode.mjs | 62 +- tests/operations/tests/CMAC.mjs | 502 +- tests/operations/tests/CSV.mjs | 178 +- tests/operations/tests/CaesarBoxCipher.mjs | 2 +- tests/operations/tests/CaretMdecode.mjs | 4 +- tests/operations/tests/CartesianProduct.mjs | 15 +- .../operations/tests/CetaceanCipherDecode.mjs | 4 +- .../operations/tests/CetaceanCipherEncode.mjs | 7 +- tests/operations/tests/ChaCha.mjs | 201 +- tests/operations/tests/ChangeIPFormat.mjs | 9 +- tests/operations/tests/CharEnc.mjs | 46 +- tests/operations/tests/Charts.mjs | 62 +- tests/operations/tests/Checksum.mjs | 157 +- tests/operations/tests/CipherSaber2.mjs | 6 +- tests/operations/tests/Ciphers.mjs | 291 +- tests/operations/tests/Code.mjs | 322 +- tests/operations/tests/Colossus.mjs | 70 +- tests/operations/tests/Comment.mjs | 34 +- tests/operations/tests/Compress.mjs | 65 +- tests/operations/tests/ConditionalJump.mjs | 29 +- .../tests/ConvertCoordinateFormat.mjs | 171 +- .../tests/ConvertToNATOAlphabet.mjs | 17 +- tests/operations/tests/Crypt.mjs | 2598 ++- tests/operations/tests/DefangIP.mjs | 6 +- tests/operations/tests/ELFInfo.mjs | 19 +- tests/operations/tests/Enigma.mjs | 794 +- .../tests/ExtractEmailAddresses.mjs | 28 +- tests/operations/tests/Fernet.mjs | 34 +- tests/operations/tests/FileTree.mjs | 15 +- tests/operations/tests/Fork.mjs | 30 +- tests/operations/tests/FromDecimal.mjs | 4 +- tests/operations/tests/GOST.mjs | 94 +- tests/operations/tests/GenerateAllHashes.mjs | 26 +- .../tests/GenerateDeBruijnSequence.mjs | 21 +- tests/operations/tests/GetAllCasings.mjs | 29 +- tests/operations/tests/Gunzip.mjs | 26 +- tests/operations/tests/Gzip.mjs | 52 +- tests/operations/tests/HASSH.mjs | 14 +- tests/operations/tests/HKDF.mjs | 236 +- tests/operations/tests/Hash.mjs | 1188 +- tests/operations/tests/HaversineDistance.mjs | 14 +- tests/operations/tests/Hex.mjs | 83 +- tests/operations/tests/Hexdump.mjs | 52 +- tests/operations/tests/Image.mjs | 99 +- tests/operations/tests/IndexOfCoincidence.mjs | 7 +- tests/operations/tests/JA3Fingerprint.mjs | 24 +- tests/operations/tests/JA3SFingerprint.mjs | 18 +- tests/operations/tests/JSONBeautify.mjs | 34 +- tests/operations/tests/JSONMinify.mjs | 13 +- tests/operations/tests/JSONtoCSV.mjs | 57 +- tests/operations/tests/JWTDecode.mjs | 22 +- tests/operations/tests/JWTSign.mjs | 55 +- tests/operations/tests/JWTVerify.mjs | 22 +- tests/operations/tests/Jump.mjs | 20 +- tests/operations/tests/LS47.mjs | 2 +- tests/operations/tests/LZNT1Decompress.mjs | 6 +- tests/operations/tests/LZString.mjs | 14 +- .../operations/tests/LevenshteinDistance.mjs | 170 +- tests/operations/tests/Lorenz.mjs | 329 +- tests/operations/tests/LuhnChecksum.mjs | 21 +- tests/operations/tests/MS.mjs | 7 +- tests/operations/tests/Magic.mjs | 75 +- tests/operations/tests/Media.mjs | 27 +- tests/operations/tests/MultipleBombe.mjs | 17 +- tests/operations/tests/MurmurHash3.mjs | 2 +- tests/operations/tests/NTLM.mjs | 1 - tests/operations/tests/NormaliseUnicode.mjs | 10 +- tests/operations/tests/OTP.mjs | 3 +- tests/operations/tests/PEMtoHex.mjs | 135 +- tests/operations/tests/PGP.mjs | 76 +- tests/operations/tests/PHP.mjs | 12 +- tests/operations/tests/ParseIPRange.mjs | 68 +- .../tests/ParseObjectIDTimestamp.mjs | 5 +- tests/operations/tests/ParseQRCode.mjs | 42 +- tests/operations/tests/ParseSSHHostKey.mjs | 32 +- tests/operations/tests/ParseTCP.mjs | 8 +- tests/operations/tests/ParseTLV.mjs | 74 +- tests/operations/tests/ParseUDP.mjs | 11 +- tests/operations/tests/Protobuf.mjs | 320 +- tests/operations/tests/RAKE.mjs | 16 +- tests/operations/tests/RSA.mjs | 242 +- tests/operations/tests/Rabbit.mjs | 253 +- tests/operations/tests/Regex.mjs | 70 +- tests/operations/tests/Register.mjs | 55 +- tests/operations/tests/RisonEncodeDecode.mjs | 38 +- tests/operations/tests/Rotate.mjs | 64 +- tests/operations/tests/SIGABA.mjs | 209 +- tests/operations/tests/SM4.mjs | 350 +- tests/operations/tests/SeqUtils.mjs | 24 +- tests/operations/tests/SetDifference.mjs | 3 +- tests/operations/tests/SetIntersection.mjs | 5 +- tests/operations/tests/SetUnion.mjs | 3 +- tests/operations/tests/Shuffle.mjs | 62 +- .../operations/tests/SplitColourChannels.mjs | 24 +- tests/operations/tests/StrUtils.mjs | 188 +- tests/operations/tests/Subsection.mjs | 56 +- tests/operations/tests/SwapCase.mjs | 26 +- .../operations/tests/SymmetricDifference.mjs | 3 +- .../tests/TextEncodingBruteForce.mjs | 9 +- .../tests/ToFromInsensitiveRegex.mjs | 8 +- .../tests/TranslateDateTimeFormat.mjs | 35 +- tests/operations/tests/Typex.mjs | 128 +- tests/operations/tests/UnescapeString.mjs | 13 +- tests/operations/tests/Unicode.mjs | 41 +- tests/operations/tests/YARA.mjs | 76 +- tests/samples/Ciphers.mjs | 6 +- tests/samples/Executables.mjs | 68 +- tests/samples/Images.mjs | 24 +- webpack.config.js | 118 +- 693 files changed, 51226 insertions(+), 26671 deletions(-) create mode 100644 biome.json diff --git a/.github/workflows/pull_requests.yml b/.github/workflows/pull_requests.yml index daa59490..c3679b66 100644 --- a/.github/workflows/pull_requests.yml +++ b/.github/workflows/pull_requests.yml @@ -21,6 +21,9 @@ jobs: npm install npm run setheapsize + - name: Format + run: npx @biomejs/biome format . --write + - name: Lint run: npx grunt lint diff --git a/Gruntfile.js b/Gruntfile.js index 32ba9007..c2ba1186 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -2,11 +2,13 @@ const webpack = require("webpack"); const HtmlWebpackPlugin = require("html-webpack-plugin"); -const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; +const BundleAnalyzerPlugin = + require("webpack-bundle-analyzer").BundleAnalyzerPlugin; const glob = require("glob"); const path = require("path"); -const nodeFlags = "--experimental-modules --experimental-json-modules --experimental-specifier-resolution=node --no-warnings --no-deprecation"; +const nodeFlags = + "--experimental-modules --experimental-json-modules --experimental-specifier-resolution=node --no-warnings --no-deprecation"; /** * Grunt configuration for building the app in various formats. @@ -21,56 +23,100 @@ module.exports = function (grunt) { grunt.file.preserveBOM = false; // Tasks - grunt.registerTask("dev", + grunt.registerTask( + "dev", "A persistent task which creates a development build whenever source files are modified.", - ["clean:dev", "clean:config", "exec:generateConfig", "concurrent:dev"]); + ["clean:dev", "clean:config", "exec:generateConfig", "concurrent:dev"], + ); - grunt.registerTask("prod", + grunt.registerTask( + "prod", "Creates a production-ready build. Use the --msg flag to add a compile message.", [ - "eslint", "clean:prod", "clean:config", "exec:generateConfig", "findModules", "webpack:web", - "copy:standalone", "zip:standalone", "clean:standalone", "exec:calcDownloadHash", "chmod" - ]); + "eslint", + "clean:prod", + "clean:config", + "exec:generateConfig", + "findModules", + "webpack:web", + "copy:standalone", + "zip:standalone", + "clean:standalone", + "exec:calcDownloadHash", + "chmod", + ], + ); - grunt.registerTask("node", + grunt.registerTask( + "node", "Compiles CyberChef into a single NodeJS module.", [ - "clean:node", "clean:config", "clean:nodeConfig", "exec:generateConfig", "exec:generateNodeIndex" - ]); + "clean:node", + "clean:config", + "clean:nodeConfig", + "exec:generateConfig", + "exec:generateNodeIndex", + ], + ); - grunt.registerTask("configTests", + grunt.registerTask( + "configTests", "A task which configures config files in preparation for tests to be run. Use `npm test` to run tests.", [ - "clean:config", "clean:nodeConfig", "exec:generateConfig", "exec:generateNodeIndex" - ]); + "clean:config", + "clean:nodeConfig", + "exec:generateConfig", + "exec:generateNodeIndex", + ], + ); - grunt.registerTask("testui", + grunt.registerTask( + "testui", "A task which runs all the UI tests in the tests directory. The prod task must already have been run.", - ["connect:prod", "exec:browserTests"]); + ["connect:prod", "exec:browserTests"], + ); - grunt.registerTask("testnodeconsumer", + grunt.registerTask( + "testnodeconsumer", "A task which checks whether consuming CJS and ESM apps work with the CyberChef build", - ["exec:setupNodeConsumers", "exec:testCJSNodeConsumer", "exec:testESMNodeConsumer", "exec:teardownNodeConsumers"]); + [ + "exec:setupNodeConsumers", + "exec:testCJSNodeConsumer", + "exec:testESMNodeConsumer", + "exec:teardownNodeConsumers", + ], + ); - grunt.registerTask("default", - "Lints the code base", - ["eslint", "exec:repoSize"]); + grunt.registerTask("default", "Lints the code base", [ + "prettier", + "eslint", + "exec:repoSize", + ]); grunt.registerTask("lint", "eslint"); + grunt.registerTask("format", ["prettier"]); - grunt.registerTask("findModules", + grunt.registerTask( + "findModules", "Finds all generated modules and updates the entry point list for Webpack", - function(arg1, arg2) { + function (arg1, arg2) { const moduleEntryPoints = listEntryModules(); - grunt.log.writeln(`Found ${Object.keys(moduleEntryPoints).length} modules.`); - - grunt.config.set("webpack.web.entry", - Object.assign({ - main: "./src/web/index.js" - }, moduleEntryPoints)); - }); + grunt.log.writeln( + `Found ${Object.keys(moduleEntryPoints).length} modules.`, + ); + grunt.config.set( + "webpack.web.entry", + Object.assign( + { + main: "./src/web/index.js", + }, + moduleEntryPoints, + ), + ); + }, + ); // Load tasks provided by each plugin grunt.loadNpmTasks("grunt-eslint"); @@ -83,15 +129,18 @@ module.exports = function (grunt) { grunt.loadNpmTasks("grunt-concurrent"); grunt.loadNpmTasks("grunt-contrib-connect"); grunt.loadNpmTasks("grunt-zip"); - + grunt.loadNpmTasks("grunt-prettier"); // Project configuration - const compileTime = grunt.template.today("UTC:dd/mm/yyyy HH:MM:ss") + " UTC", + const compileTime = + grunt.template.today("UTC:dd/mm/yyyy HH:MM:ss") + " UTC", pkg = grunt.file.readJSON("package.json"), webpackConfig = require("./webpack.config.js"), BUILD_CONSTANTS = { COMPILE_TIME: JSON.stringify(compileTime), - COMPILE_MSG: JSON.stringify(grunt.option("compile-msg") || grunt.option("msg") || ""), + COMPILE_MSG: JSON.stringify( + grunt.option("compile-msg") || grunt.option("msg") || "", + ), PKG_VERSION: JSON.stringify(pkg.version), }, moduleEntryPoints = listEntryModules(), @@ -104,20 +153,26 @@ module.exports = function (grunt) { return { mode: "production", target: "web", - entry: Object.assign({ - main: "./src/web/index.js" - }, moduleEntryPoints), + entry: Object.assign( + { + main: "./src/web/index.js", + }, + moduleEntryPoints, + ), output: { path: __dirname + "/build/prod", - filename: chunkData => { - return chunkData.chunk.name === "main" ? "assets/[name].js": "[name].js"; + filename: (chunkData) => { + return chunkData.chunk.name === "main" + ? "assets/[name].js" + : "[name].js"; }, - globalObject: "this" + globalObject: "this", }, resolve: { alias: { - "./config/modules/OpModules.mjs": "./config/modules/Default.mjs" - } + "./config/modules/OpModules.mjs": + "./config/modules/Default.mjs", + }, }, plugins: [ new webpack.DefinePlugin(BUILD_CONSTANTS), @@ -131,29 +186,29 @@ module.exports = function (grunt) { removeComments: true, collapseWhitespace: true, minifyJS: true, - minifyCSS: true - } + minifyCSS: true, + }, }), new BundleAnalyzerPlugin({ analyzerMode: "static", reportFilename: "BundleAnalyzerReport.html", - openAnalyzer: false + openAnalyzer: false, }), - ] + ], }; }; - /** * Generates an entry list for all the modules. */ function listEntryModules() { const entryModules = {}; - glob.sync("./src/core/config/modules/*.mjs").forEach(file => { + glob.sync("./src/core/config/modules/*.mjs").forEach((file) => { const basename = path.basename(file); if (basename !== "Default.mjs" && basename !== "OpModules.mjs") - entryModules["modules/" + basename.split(".mjs")[0]] = path.resolve(file); + entryModules["modules/" + basename.split(".mjs")[0]] = + path.resolve(file); }); return entryModules; @@ -171,12 +226,14 @@ module.exports = function (grunt) { if (!win) { return cmds.join(";"); } - return cmds - // && means that subsequent commands will not be executed if the - // previous one fails. & would coninue on a fail - .join("&&") - // Windows does not support \n properly - .replace(/\n/g, "\\n"); + return ( + cmds + // && means that subsequent commands will not be executed if the + // previous one fails. & would coninue on a fail + .join("&&") + // Windows does not support \n properly + .replace(/\n/g, "\\n") + ); } grunt.initConfig({ @@ -184,17 +241,36 @@ module.exports = function (grunt) { dev: ["build/dev/*"], prod: ["build/prod/*"], node: ["build/node/*"], - config: ["src/core/config/OperationConfig.json", "src/core/config/modules/*", "src/code/operations/index.mjs"], - nodeConfig: ["src/node/index.mjs", "src/node/config/OperationConfig.json"], - standalone: ["build/prod/CyberChef*.html"] + config: [ + "src/core/config/OperationConfig.json", + "src/core/config/modules/*", + "src/code/operations/index.mjs", + ], + nodeConfig: [ + "src/node/index.mjs", + "src/node/config/OperationConfig.json", + ], + standalone: ["build/prod/CyberChef*.html"], }, eslint: { configs: ["*.{js,mjs}"], - core: ["src/core/**/*.{js,mjs}", "!src/core/vendor/**/*", "!src/core/operations/legacy/**/*"], + core: [ + "src/core/**/*.{js,mjs}", + "!src/core/vendor/**/*", + "!src/core/operations/legacy/**/*", + ], web: ["src/web/**/*.{js,mjs}", "!src/web/static/**/*"], node: ["src/node/**/*.{js,mjs}"], tests: ["tests/**/*.{js,mjs}"], }, + prettier: { + options: { + progress: false, + }, + files: { + src: ["*.{js,mjs}", "src/**/*.{js,mjs}", "tests/**/*.{js,mjs}"], + }, + }, webpack: { options: webpackConfig, myConfig: webpackConfig, @@ -205,21 +281,25 @@ module.exports = function (grunt) { start: { mode: "development", target: "web", - entry: Object.assign({ - main: "./src/web/index.js" - }, moduleEntryPoints), + entry: Object.assign( + { + main: "./src/web/index.js", + }, + moduleEntryPoints, + ), resolve: { alias: { - "./config/modules/OpModules.mjs": "./config/modules/Default.mjs" - } + "./config/modules/OpModules.mjs": + "./config/modules/Default.mjs", + }, }, devServer: { port: grunt.option("port") || 8080, client: { logging: "error", - overlay: true + overlay: true, }, - hot: "only" + hot: "only", }, plugins: [ new webpack.DefinePlugin(BUILD_CONSTANTS), @@ -229,9 +309,9 @@ module.exports = function (grunt) { chunks: ["main"], compileTime: compileTime, version: pkg.version, - }) - ] - } + }), + ], + }, }, zip: { standalone: { @@ -241,16 +321,16 @@ module.exports = function (grunt) { "!build/prod/index.html", "!build/prod/BundleAnalyzerReport.html", ], - dest: `build/prod/CyberChef_v${pkg.version}.zip` - } + dest: `build/prod/CyberChef_v${pkg.version}.zip`, + }, }, connect: { prod: { options: { port: grunt.option("port") || 8000, - base: "build/prod/" - } - } + base: "build/prod/", + }, + }, }, copy: { ghPages: { @@ -258,70 +338,86 @@ module.exports = function (grunt) { process: function (content, srcpath) { if (srcpath.indexOf("index.html") >= 0) { // Add Google Analytics code to index.html - content = content.replace("", - grunt.file.read("src/web/static/ga.html") + ""); + content = content.replace( + "", + grunt.file.read("src/web/static/ga.html") + + "", + ); // Add Structured Data for SEO - content = content.replace("", + content = content.replace( + "", ""); + JSON.stringify( + JSON.parse( + grunt.file.read( + "src/web/static/structuredData.json", + ), + ), + ) + + "", + ); return grunt.template.process(content, srcpath); } else { return content; } }, - noProcess: ["**", "!**/*.html"] + noProcess: ["**", "!**/*.html"], }, files: [ { src: ["build/prod/index.html"], - dest: "build/prod/index.html" - } - ] + dest: "build/prod/index.html", + }, + ], }, standalone: { options: { process: function (content, srcpath) { if (srcpath.indexOf("index.html") >= 0) { // Replace download link with version number - content = content.replace(/]+>Download CyberChef.+?<\/a>/, - `Version ${pkg.version}`); + content = content.replace( + /]+>Download CyberChef.+?<\/a>/, + `Version ${pkg.version}`, + ); return grunt.template.process(content, srcpath); } else { return content; } }, - noProcess: ["**", "!**/*.html"] + noProcess: ["**", "!**/*.html"], }, files: [ { src: ["build/prod/index.html"], - dest: `build/prod/CyberChef_v${pkg.version}.html` - } - ] - } + dest: `build/prod/CyberChef_v${pkg.version}.html`, + }, + ], + }, }, chmod: { build: { options: { mode: "755", }, - src: ["build/**/*", "build/"] - } + src: ["build/**/*", "build/"], + }, }, watch: { config: { - files: ["src/core/operations/**/*", "!src/core/operations/index.mjs"], - tasks: ["exec:generateNodeIndex", "exec:generateConfig"] - } + files: [ + "src/core/operations/**/*", + "!src/core/operations/index.mjs", + ], + tasks: ["exec:generateNodeIndex", "exec:generateConfig"], + }, }, concurrent: { dev: ["watch:config", "webpack-dev-server:start"], options: { - logConcurrentOutput: true - } + logConcurrentOutput: true, + }, }, exec: { calcDownloadHash: { @@ -330,12 +426,12 @@ module.exports = function (grunt) { case "darwin": return chainCommands([ `shasum -a 256 build/prod/CyberChef_v${pkg.version}.zip | awk '{print $1;}' > build/prod/sha256digest.txt`, - `sed -i '' -e "s/DOWNLOAD_HASH_PLACEHOLDER/$(cat build/prod/sha256digest.txt)/" build/prod/index.html` + `sed -i '' -e "s/DOWNLOAD_HASH_PLACEHOLDER/$(cat build/prod/sha256digest.txt)/" build/prod/index.html`, ]); default: return chainCommands([ `sha256sum build/prod/CyberChef_v${pkg.version}.zip | awk '{print $1;}' > build/prod/sha256digest.txt`, - `sed -i -e "s/DOWNLOAD_HASH_PLACEHOLDER/$(cat build/prod/sha256digest.txt)/" build/prod/index.html` + `sed -i -e "s/DOWNLOAD_HASH_PLACEHOLDER/$(cat build/prod/sha256digest.txt)/" build/prod/index.html`, ]); } }, @@ -343,16 +439,16 @@ module.exports = function (grunt) { repoSize: { command: chainCommands([ "git ls-files | wc -l | xargs printf '\n%b\ttracked files\n'", - "du -hs | egrep -o '^[^\t]*' | xargs printf '%b\trepository size\n'" + "du -hs | egrep -o '^[^\t]*' | xargs printf '%b\trepository size\n'", ]), - stderr: false + stderr: false, }, cleanGit: { - command: "git gc --prune=now --aggressive" + command: "git gc --prune=now --aggressive", }, sitemap: { command: `node ${nodeFlags} src/web/static/sitemap.mjs > build/prod/sitemap.xml`, - sync: true + sync: true, }, generateConfig: { command: chainCommands([ @@ -360,20 +456,20 @@ module.exports = function (grunt) { "echo [] > src/core/config/OperationConfig.json", `node ${nodeFlags} src/core/config/scripts/generateOpsIndex.mjs`, `node ${nodeFlags} src/core/config/scripts/generateConfig.mjs`, - "echo '--- Config scripts finished. ---\n'" + "echo '--- Config scripts finished. ---\n'", ]), - sync: true + sync: true, }, generateNodeIndex: { command: chainCommands([ "echo '\n--- Regenerating node index ---'", `node ${nodeFlags} src/node/config/scripts/generateNodeIndex.mjs`, - "echo '--- Node index generated. ---\n'" + "echo '--- Node index generated. ---\n'", ]), - sync: true + sync: true, }, browserTests: { - command: "./node_modules/.bin/nightwatch --env prod" + command: "./node_modules/.bin/nightwatch --env prod", }, setupNodeConsumers: { command: chainCommands([ @@ -382,14 +478,14 @@ module.exports = function (grunt) { `mkdir ${nodeConsumerTestPath}`, `cp tests/node/consumers/* ${nodeConsumerTestPath}`, `cd ${nodeConsumerTestPath}`, - "npm link cyberchef" + "npm link cyberchef", ]), - sync: true + sync: true, }, teardownNodeConsumers: { command: chainCommands([ `rm -rf ${nodeConsumerTestPath}`, - "echo '\n--- Node consumer tests complete ---'" + "echo '\n--- Node consumer tests complete ---'", ]), }, testCJSNodeConsumer: { @@ -415,7 +511,7 @@ module.exports = function (grunt) { return `find ./node_modules/crypto-api/src/ \\( -type d -name .git -prune \\) -o -type f -print0 | xargs -0 sed -i -e '/\\.mjs/!s/\\(from "\\.[^"]*\\)";/\\1.mjs";/g'`; } }, - stdout: false + stdout: false, }, fixSnackbarMarkup: { command: function () { @@ -426,8 +522,8 @@ module.exports = function (grunt) { return `sed -i 's/
/
/g' ./node_modules/snackbarjs/src/snackbar.js`; } }, - stdout: false - } + stdout: false, + }, }, }); }; diff --git a/babel.config.js b/babel.config.js index deab9108..58ec55fd 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,27 +1,32 @@ -module.exports = function(api) { +module.exports = function (api) { api.cache.forever(); return { - "presets": [ - ["@babel/preset-env", { - "modules": false, - "useBuiltIns": "entry", - "corejs": 3 - }] + presets: [ + [ + "@babel/preset-env", + { + modules: false, + useBuiltIns: "entry", + corejs: 3, + }, + ], ], - "plugins": [ + plugins: [ "dynamic-import-node", "@babel/plugin-syntax-import-assertions", [ - "babel-plugin-transform-builtin-extend", { - "globals": ["Error"] - } + "babel-plugin-transform-builtin-extend", + { + globals: ["Error"], + }, ], [ - "@babel/plugin-transform-runtime", { - "regenerator": true - } - ] - ] + "@babel/plugin-transform-runtime", + { + regenerator: true, + }, + ], + ], }; }; diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..3511c9b6 --- /dev/null +++ b/biome.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": false + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 80, + "ignore": [] + }, + "files": { + "include": ["**/*.*js"] + } +} diff --git a/package-lock.json b/package-lock.json index 5e6671a5..82506474 100644 --- a/package-lock.json +++ b/package-lock.json @@ -130,6 +130,7 @@ "grunt-contrib-watch": "^1.1.0", "grunt-eslint": "^24.3.0", "grunt-exec": "~3.0.0", + "grunt-prettier": "^2.2.0", "grunt-webpack": "^6.0.0", "grunt-zip": "^1.0.0", "html-webpack-plugin": "^5.6.0", @@ -8117,6 +8118,28 @@ "node": ">=10" } }, + "node_modules/grunt-prettier": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/grunt-prettier/-/grunt-prettier-2.2.0.tgz", + "integrity": "sha512-kl6+1sYEM7HezxZS0DEFYYpD7JtwsToD8ZK2kDpAd3SvHINbz2iwsghpPsmdGihUJ2FVo8XBIzACmNxBBCytqQ==", + "dev": true, + "dependencies": { + "prettier": "^2.0.5", + "progress": "^2.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/grunt-prettier/node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/grunt-retro": { "version": "0.6.4", "dev": true, @@ -12174,6 +12197,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "dev": true, diff --git a/package.json b/package.json index 334d88b5..75043e55 100644 --- a/package.json +++ b/package.json @@ -189,6 +189,7 @@ "testui": "npx grunt testui", "testuidev": "npx nightwatch --env=dev", "lint": "npx grunt lint", + "format": "npx @biomejs/biome format . --write", "postinstall": "npx grunt exec:fixCryptoApiImports && npx grunt exec:fixSnackbarMarkup", "newop": "node --experimental-modules --experimental-json-modules src/core/config/scripts/newOperation.mjs", "minor": "node --experimental-modules --experimental-json-modules src/core/config/scripts/newMinorVersion.mjs", diff --git a/postcss.config.js b/postcss.config.js index 2d46543d..dee4b321 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -3,7 +3,7 @@ module.exports = { require("postcss-import"), require("autoprefixer"), require("postcss-css-variables")({ - preserve: true + preserve: true, }), - ] + ], }; diff --git a/src/core/Chef.mjs b/src/core/Chef.mjs index ab8f83de..2cf0da37 100755 --- a/src/core/Chef.mjs +++ b/src/core/Chef.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "./Utils.mjs"; * The main controller for CyberChef. */ class Chef { - /** * Chef constructor */ @@ -21,7 +20,6 @@ class Chef { this.dish = new Dish(); } - /** * Runs the recipe over the input. * @@ -36,19 +34,21 @@ class Chef { * @returns {number} response.progress - The position that we have got to in the recipe * @returns {number} response.duration - The number of ms it took to execute the recipe * @returns {number} response.error - The error object thrown by a failed operation (false if no error) - */ - async bake(input, recipeConfig, options={}) { + */ + async bake(input, recipeConfig, options = {}) { log.debug("Chef baking"); const startTime = Date.now(), - recipe = new Recipe(recipeConfig), - containsFc = recipe.containsFlowControl(); + recipe = new Recipe(recipeConfig), + containsFc = recipe.containsFlowControl(); let error = false, progress = 0; - if (containsFc && isWorkerEnvironment()) self.setOption("attemptHighlight", false); + if (containsFc && isWorkerEnvironment()) + self.setOption("attemptHighlight", false); // Load data - const type = input instanceof ArrayBuffer ? Dish.ARRAY_BUFFER : Dish.STRING; + const type = + input instanceof ArrayBuffer ? Dish.ARRAY_BUFFER : Dish.STRING; this.dish.set(input, type); try { @@ -68,8 +68,11 @@ class Chef { await recipe.present(this.dish); const returnType = - this.dish.type === Dish.HTML ? Dish.HTML : - options?.returnType ? options.returnType : Dish.ARRAY_BUFFER; + this.dish.type === Dish.HTML + ? Dish.HTML + : options?.returnType + ? options.returnType + : Dish.ARRAY_BUFFER; return { dish: rawDish, @@ -77,11 +80,10 @@ class Chef { type: Dish.enumLookup(this.dish.type), progress: progress, duration: Date.now() - startTime, - error: error + error: error, }; } - /** * When a browser tab is unfocused and the browser has to run lots of dynamic content in other tabs, * it swaps out the memory for that tab. If the CyberChef tab has been unfocused for more than a @@ -98,7 +100,7 @@ class Chef { * * @param {Object[]} recipeConfig - The recipe configuration object * @returns {number} The time it took to run the silent bake in milliseconds. - */ + */ silentBake(recipeConfig) { log.debug("Running silent bake"); @@ -114,7 +116,6 @@ class Chef { return Date.now() - startTime; } - /** * Calculates highlight offsets if possible. * @@ -135,7 +136,8 @@ class Chef { // Remove multiple highlights before processing again pos = [pos[0]]; - const func = direction === "forward" ? highlights[i].f : highlights[i].b; + const func = + direction === "forward" ? highlights[i].f : highlights[i].b; if (typeof func == "function") { try { @@ -149,11 +151,10 @@ class Chef { return { pos: pos, - direction: direction + direction: direction, }; } - /** * Translates the dish to a specified type and returns it. * @@ -173,11 +174,10 @@ class Chef { * @param {number} [maxLength=100] * @returns {string} */ - async getDishTitle(dish, maxLength=100) { + async getDishTitle(dish, maxLength = 100) { const newDish = new Dish(dish); return await newDish.getTitle(maxLength); } - } export default Chef; diff --git a/src/core/ChefWorker.js b/src/core/ChefWorker.js index a43993f9..c2363f53 100644 --- a/src/core/ChefWorker.js +++ b/src/core/ChefWorker.js @@ -7,11 +7,12 @@ */ import Chef from "./Chef.mjs"; -import OperationConfig from "./config/OperationConfig.json" assert {type: "json"}; +import OperationConfig from "./config/OperationConfig.json" assert { + type: "json", +}; import OpModules from "./config/modules/OpModules.mjs"; import loglevelMessagePrefix from "loglevel-message-prefix"; - // Set up Chef instance self.chef = new Chef(); @@ -19,11 +20,10 @@ self.OpModules = OpModules; self.OperationConfig = OperationConfig; self.inputNum = -1; - // Tell the app that the worker has loaded and is ready to operate self.postMessage({ action: "workerLoaded", - data: {} + data: {}, }); /** @@ -45,7 +45,7 @@ self.postMessage({ * } * } */ -self.addEventListener("message", function(e) { +self.addEventListener("message", function (e) { // Handle message const r = e.data; log.debug(`Receiving command '${r.action}'`); @@ -72,7 +72,7 @@ self.addEventListener("message", function(e) { calculateHighlights( r.data.recipeConfig, r.data.direction, - r.data.pos + r.data.pos, ); break; case "setLogLevel": @@ -81,7 +81,7 @@ self.addEventListener("message", function(e) { case "setLogPrefix": loglevelMessagePrefix(log, { prefixes: [], - staticPrefixes: [r.data] + staticPrefixes: [r.data], }); break; default: @@ -89,7 +89,6 @@ self.addEventListener("message", function(e) { } }); - /** * Baking handler * @@ -101,38 +100,40 @@ async function bake(data) { try { self.inputNum = data.inputNum === undefined ? -1 : data.inputNum; const response = await self.chef.bake( - data.input, // The user's input - data.recipeConfig, // The configuration of the recipe - data.options // Options set by the user + data.input, // The user's input + data.recipeConfig, // The configuration of the recipe + data.options, // Options set by the user ); - const transferable = (response.dish.value instanceof ArrayBuffer) ? - [response.dish.value] : - undefined; - - self.postMessage({ - action: "bakeComplete", - data: Object.assign(response, { - id: data.id, - inputNum: data.inputNum, - bakeId: data.bakeId - }) - }, transferable); + const transferable = + response.dish.value instanceof ArrayBuffer + ? [response.dish.value] + : undefined; + self.postMessage( + { + action: "bakeComplete", + data: Object.assign(response, { + id: data.id, + inputNum: data.inputNum, + bakeId: data.bakeId, + }), + }, + transferable, + ); } catch (err) { self.postMessage({ action: "bakeError", data: { error: err.message || err, id: data.id, - inputNum: data.inputNum - } + inputNum: data.inputNum, + }, }); } self.inputNum = -1; } - /** * Silent baking handler */ @@ -141,27 +142,28 @@ function silentBake(data) { self.postMessage({ action: "silentBakeComplete", - data: duration + data: duration, }); } - /** * Translates the dish to a given type. */ async function getDishAs(data) { const value = await self.chef.getDishAs(data.dish, data.type); - const transferable = (data.type === "ArrayBuffer") ? [value] : undefined; - self.postMessage({ - action: "dishReturned", - data: { - value: value, - id: data.id - } - }, transferable); + const transferable = data.type === "ArrayBuffer" ? [value] : undefined; + self.postMessage( + { + action: "dishReturned", + data: { + value: value, + id: data.id, + }, + }, + transferable, + ); } - /** * Gets the dish title * @@ -176,12 +178,11 @@ async function getDishTitle(data) { action: "dishReturned", data: { value: title, - id: data.id - } + id: data.id, + }, }); } - /** * Calculates highlight offsets if possible. * @@ -196,18 +197,17 @@ async function calculateHighlights(recipeConfig, direction, pos) { self.postMessage({ action: "highlightsCalculated", - data: pos + data: pos, }); } - /** * Checks that all required modules are loaded and loads them if not. * * @param {Object} recipeConfig */ -self.loadRequiredModules = function(recipeConfig) { - recipeConfig.forEach(op => { +self.loadRequiredModules = function (recipeConfig) { + recipeConfig.forEach((op) => { const module = self.OperationConfig[op.op].module; if (!(module in OpModules)) { @@ -219,58 +219,54 @@ self.loadRequiredModules = function(recipeConfig) { }); }; - /** * Send status update to the app. * * @param {string} msg */ -self.sendStatusMessage = function(msg) { +self.sendStatusMessage = function (msg) { self.postMessage({ action: "statusMessage", data: { message: msg, - inputNum: self.inputNum - } + inputNum: self.inputNum, + }, }); }; - /** * Send progress update to the app. * * @param {number} progress * @param {number} total */ -self.sendProgressMessage = function(progress, total) { +self.sendProgressMessage = function (progress, total) { self.postMessage({ action: "progressMessage", data: { progress: progress, total: total, - inputNum: self.inputNum - } + inputNum: self.inputNum, + }, }); }; - /** * Send an option value update to the app. * * @param {string} option * @param {*} value */ -self.setOption = function(option, value) { +self.setOption = function (option, value) { self.postMessage({ action: "optionUpdate", data: { option: option, - value: value - } + value: value, + }, }); }; - /** * Send register values back to the app. * @@ -278,13 +274,13 @@ self.setOption = function(option, value) { * @param {number} numPrevRegisters * @param {string[]} registers */ -self.setRegisters = function(opIndex, numPrevRegisters, registers) { +self.setRegisters = function (opIndex, numPrevRegisters, registers) { self.postMessage({ action: "setRegisters", data: { opIndex: opIndex, numPrevRegisters: numPrevRegisters, - registers: registers - } + registers: registers, + }, }); }; diff --git a/src/core/Dish.mjs b/src/core/Dish.mjs index 11b1ff9f..8be6db37 100755 --- a/src/core/Dish.mjs +++ b/src/core/Dish.mjs @@ -20,12 +20,10 @@ import DishListFile from "./dishTypes/DishListFile.mjs"; import DishNumber from "./dishTypes/DishNumber.mjs"; import DishString from "./dishTypes/DishString.mjs"; - /** * The data being operated on by each operation. */ class Dish { - /** * Dish constructor * @@ -34,26 +32,27 @@ class Dish { * @param {Enum} [type=null] (optional) - A type to accompany object * literal input */ - constructor(dishOrInput=null, type = null) { + constructor(dishOrInput = null, type = null) { this.value = new ArrayBuffer(0); this.type = Dish.ARRAY_BUFFER; // Case: dishOrInput is dish object - if (dishOrInput && + if ( + dishOrInput && Object.prototype.hasOwnProperty.call(dishOrInput, "value") && - Object.prototype.hasOwnProperty.call(dishOrInput, "type")) { + Object.prototype.hasOwnProperty.call(dishOrInput, "type") + ) { this.set(dishOrInput.value, dishOrInput.type); - // input and type defined separately + // input and type defined separately } else if (dishOrInput && type !== null) { this.set(dishOrInput, type); - // No type declared, so infer it. + // No type declared, so infer it. } else if (dishOrInput) { const inferredType = Dish.typeEnum(dishOrInput.constructor.name); this.set(dishOrInput, inferredType); } } - /** * Returns the data type enum for the given type string. * @@ -85,11 +84,12 @@ class Dish { case "list": return Dish.LIST_FILE; default: - throw new DishError("Invalid data type string. No matching enum."); + throw new DishError( + "Invalid data type string. No matching enum.", + ); } } - /** * Returns the data type string for the given type enum. * @@ -117,11 +117,12 @@ class Dish { case Dish.LIST_FILE: return "List"; default: - throw new DishError("Invalid data type enum. No matching type."); + throw new DishError( + "Invalid data type enum. No matching type.", + ); } } - /** * Returns the value of the data in the type format specified. * @@ -136,13 +137,12 @@ class Dish { } if (this.type !== type) { - // Node environment => _translate is sync if (isNodeEnvironment()) { this._translate(type); return this.value; - // Browser environment => _translate is async + // Browser environment => _translate is async } else { return new Promise((resolve, reject) => { this._translate(type) @@ -157,7 +157,6 @@ class Dish { return this.value; } - /** * Sets the data value and type and then validates them. * @@ -177,7 +176,9 @@ class Dish { if (!this.valid()) { const sample = Utils.truncate(JSON.stringify(this.value), 25); - throw new DishError(`Data is not a valid ${Dish.enumLookup(type)}: ${sample}`); + throw new DishError( + `Data is not a valid ${Dish.enumLookup(type)}: ${sample}`, + ); } } @@ -196,7 +197,6 @@ class Dish { return clone.get(type); } - /** * Detects the MIME type of the current dish * @returns {string} @@ -205,14 +205,17 @@ class Dish { const data = new Uint8Array(this.value.slice(0, 2048)), types = detectFileType(data); - if (!types.length || !types[0].mime || !(types[0].mime === "text/plain")) { + if ( + !types.length || + !types[0].mime || + !(types[0].mime === "text/plain") + ) { return null; } else { return types[0].mime; } } - /** * Returns the title of the data up to the specified length * @@ -241,14 +244,18 @@ class Dish { case Dish.BYTE_ARRAY: title = this.detectDishType(); if (title !== null) break; - // fall through if no mime type was detected + // fall through if no mime type was detected default: try { cloned = this.clone(); cloned.value = cloned.value.slice(0, 256); title = await cloned.get(Dish.STRING); } catch (err) { - log.error(`${Dish.enumLookup(this.type)} cannot be sliced. ${err}`); + log.error( + `${Dish.enumLookup( + this.type, + )} cannot be sliced. ${err}`, + ); } } @@ -260,19 +267,24 @@ class Dish { * May have to disable parts of BYTE_ARRAY validation if it effects performance. * * @returns {boolean} Whether the data is valid or not. - */ + */ valid() { switch (this.type) { case Dish.BYTE_ARRAY: - if (!(this.value instanceof Uint8Array) && !(this.value instanceof Array)) { + if ( + !(this.value instanceof Uint8Array) && + !(this.value instanceof Array) + ) { return false; } // Check that every value is a number between 0 - 255 for (let i = 0; i < this.value.length; i++) { - if (typeof this.value[i] !== "number" || + if ( + typeof this.value[i] !== "number" || this.value[i] < 0 || - this.value[i] > 255) { + this.value[i] > 255 + ) { return false; } } @@ -306,21 +318,25 @@ class Dish { case Dish.FILE: return this.value instanceof File; case Dish.LIST_FILE: - return this.value instanceof Array && - this.value.reduce((acc, curr) => acc && curr instanceof File, true); + return ( + this.value instanceof Array && + this.value.reduce( + (acc, curr) => acc && curr instanceof File, + true, + ) + ); default: return false; } } - /** * Determines how much space the Dish takes up. * Numbers in JavaScript are 64-bit floating point, however for the purposes of the Dish, * we measure how many bytes are taken up when the number is written as a string. * * @returns {number} - */ + */ get size() { switch (this.type) { case Dish.BYTE_ARRAY: @@ -343,7 +359,6 @@ class Dish { } } - /** * Returns a deep clone of the current Dish. * @@ -358,45 +373,37 @@ class Dish { case Dish.NUMBER: case Dish.BIG_NUMBER: // These data types are immutable so it is acceptable to copy them by reference - newDish.set( - this.value, - this.type - ); + newDish.set(this.value, this.type); break; case Dish.BYTE_ARRAY: case Dish.JSON: // These data types are mutable so they need to be copied by value - newDish.set( - JSON.parse(JSON.stringify(this.value)), - this.type - ); + newDish.set(JSON.parse(JSON.stringify(this.value)), this.type); break; case Dish.ARRAY_BUFFER: // Slicing an ArrayBuffer returns a new ArrayBuffer with a copy its contents - newDish.set( - this.value.slice(0), - this.type - ); + newDish.set(this.value.slice(0), this.type); break; case Dish.FILE: // A new file can be created by copying over all the values from the original newDish.set( new File([this.value], this.value.name, { - "type": this.value.type, - "lastModified": this.value.lastModified + type: this.value.type, + lastModified: this.value.lastModified, }), - this.type + this.type, ); break; case Dish.LIST_FILE: newDish.set( - this.value.map(f => - new File([f], f.name, { - "type": f.type, - "lastModified": f.lastModified - }) + this.value.map( + (f) => + new File([f], f.name, { + type: f.type, + lastModified: f.lastModified, + }), ), - this.type + this.type, ); break; default: @@ -415,7 +422,11 @@ class Dish { * @returns {Promise || undefined} */ _translate(toType) { - log.debug(`Translating Dish from ${Dish.enumLookup(this.type)} to ${Dish.enumLookup(toType)}`); + log.debug( + `Translating Dish from ${Dish.enumLookup( + this.type, + )} to ${Dish.enumLookup(toType)}`, + ); // Node environment => translate is sync if (isNodeEnvironment()) { @@ -423,11 +434,11 @@ class Dish { this.type = Dish.ARRAY_BUFFER; this._fromArrayBuffer(toType); - // Browser environment => translate is async + // Browser environment => translate is async } else { return new Promise((resolve, reject) => { this._toArrayBuffer() - .then(() => this.type = Dish.ARRAY_BUFFER) + .then(() => (this.type = Dish.ARRAY_BUFFER)) .then(() => { this._fromArrayBuffer(toType); resolve(); @@ -435,7 +446,6 @@ class Dish { .catch(reject); }); } - } /** @@ -449,33 +459,48 @@ class Dish { // Using 'bind' here to allow this.value to be mutated within translation functions const toByteArrayFuncs = { browser: { - [Dish.STRING]: () => Promise.resolve(DishString.toArrayBuffer.bind(this)()), - [Dish.NUMBER]: () => Promise.resolve(DishNumber.toArrayBuffer.bind(this)()), - [Dish.HTML]: () => Promise.resolve(DishHTML.toArrayBuffer.bind(this)()), - [Dish.ARRAY_BUFFER]: () => Promise.resolve(), - [Dish.BIG_NUMBER]: () => Promise.resolve(DishBigNumber.toArrayBuffer.bind(this)()), - [Dish.JSON]: () => Promise.resolve(DishJSON.toArrayBuffer.bind(this)()), - [Dish.FILE]: () => DishFile.toArrayBuffer.bind(this)(), - [Dish.LIST_FILE]: () => Promise.resolve(DishListFile.toArrayBuffer.bind(this)()), - [Dish.BYTE_ARRAY]: () => Promise.resolve(DishByteArray.toArrayBuffer.bind(this)()), + [Dish.STRING]: () => + Promise.resolve(DishString.toArrayBuffer.bind(this)()), + [Dish.NUMBER]: () => + Promise.resolve(DishNumber.toArrayBuffer.bind(this)()), + [Dish.HTML]: () => + Promise.resolve(DishHTML.toArrayBuffer.bind(this)()), + [Dish.ARRAY_BUFFER]: () => Promise.resolve(), + [Dish.BIG_NUMBER]: () => + Promise.resolve(DishBigNumber.toArrayBuffer.bind(this)()), + [Dish.JSON]: () => + Promise.resolve(DishJSON.toArrayBuffer.bind(this)()), + [Dish.FILE]: () => DishFile.toArrayBuffer.bind(this)(), + [Dish.LIST_FILE]: () => + Promise.resolve(DishListFile.toArrayBuffer.bind(this)()), + [Dish.BYTE_ARRAY]: () => + Promise.resolve(DishByteArray.toArrayBuffer.bind(this)()), }, node: { - [Dish.STRING]: () => DishString.toArrayBuffer.bind(this)(), - [Dish.NUMBER]: () => DishNumber.toArrayBuffer.bind(this)(), - [Dish.HTML]: () => DishHTML.toArrayBuffer.bind(this)(), - [Dish.ARRAY_BUFFER]: () => {}, - [Dish.BIG_NUMBER]: () => DishBigNumber.toArrayBuffer.bind(this)(), - [Dish.JSON]: () => DishJSON.toArrayBuffer.bind(this)(), - [Dish.FILE]: () => DishFile.toArrayBuffer.bind(this)(), - [Dish.LIST_FILE]: () => DishListFile.toArrayBuffer.bind(this)(), - [Dish.BYTE_ARRAY]: () => DishByteArray.toArrayBuffer.bind(this)(), - } + [Dish.STRING]: () => DishString.toArrayBuffer.bind(this)(), + [Dish.NUMBER]: () => DishNumber.toArrayBuffer.bind(this)(), + [Dish.HTML]: () => DishHTML.toArrayBuffer.bind(this)(), + [Dish.ARRAY_BUFFER]: () => {}, + [Dish.BIG_NUMBER]: () => + DishBigNumber.toArrayBuffer.bind(this)(), + [Dish.JSON]: () => DishJSON.toArrayBuffer.bind(this)(), + [Dish.FILE]: () => DishFile.toArrayBuffer.bind(this)(), + [Dish.LIST_FILE]: () => DishListFile.toArrayBuffer.bind(this)(), + [Dish.BYTE_ARRAY]: () => + DishByteArray.toArrayBuffer.bind(this)(), + }, }; try { - return toByteArrayFuncs[isNodeEnvironment() && "node" || "browser"][this.type](); + return toByteArrayFuncs[ + (isNodeEnvironment() && "node") || "browser" + ][this.type](); } catch (err) { - throw new DishError(`Error translating from ${Dish.enumLookup(this.type)} to ArrayBuffer: ${err}`); + throw new DishError( + `Error translating from ${Dish.enumLookup( + this.type, + )} to ArrayBuffer: ${err}`, + ); } } @@ -483,33 +508,34 @@ class Dish { * Convert this.value to the given type from ArrayBuffer * * @param {number} toType - the Dish enum to convert to - */ + */ _fromArrayBuffer(toType) { - // Using 'bind' here to allow this.value to be mutated within translation functions const toTypeFunctions = { - [Dish.STRING]: () => DishString.fromArrayBuffer.bind(this)(), - [Dish.NUMBER]: () => DishNumber.fromArrayBuffer.bind(this)(), - [Dish.HTML]: () => DishHTML.fromArrayBuffer.bind(this)(), - [Dish.ARRAY_BUFFER]: () => {}, - [Dish.BIG_NUMBER]: () => DishBigNumber.fromArrayBuffer.bind(this)(), - [Dish.JSON]: () => DishJSON.fromArrayBuffer.bind(this)(), - [Dish.FILE]: () => DishFile.fromArrayBuffer.bind(this)(), - [Dish.LIST_FILE]: () => DishListFile.fromArrayBuffer.bind(this)(), - [Dish.BYTE_ARRAY]: () => DishByteArray.fromArrayBuffer.bind(this)(), + [Dish.STRING]: () => DishString.fromArrayBuffer.bind(this)(), + [Dish.NUMBER]: () => DishNumber.fromArrayBuffer.bind(this)(), + [Dish.HTML]: () => DishHTML.fromArrayBuffer.bind(this)(), + [Dish.ARRAY_BUFFER]: () => {}, + [Dish.BIG_NUMBER]: () => DishBigNumber.fromArrayBuffer.bind(this)(), + [Dish.JSON]: () => DishJSON.fromArrayBuffer.bind(this)(), + [Dish.FILE]: () => DishFile.fromArrayBuffer.bind(this)(), + [Dish.LIST_FILE]: () => DishListFile.fromArrayBuffer.bind(this)(), + [Dish.BYTE_ARRAY]: () => DishByteArray.fromArrayBuffer.bind(this)(), }; try { toTypeFunctions[toType](); this.type = toType; } catch (err) { - throw new DishError(`Error translating from ArrayBuffer to ${Dish.enumLookup(toType)}: ${err}`); + throw new DishError( + `Error translating from ArrayBuffer to ${Dish.enumLookup( + toType, + )}: ${err}`, + ); } } - } - /** * Dish data type enum for byte arrays. * @readonly @@ -559,11 +585,10 @@ Dish.JSON = 6; */ Dish.FILE = 7; /** -* Dish data type enum for lists of files. -* @readonly -* @enum -*/ + * Dish data type enum for lists of files. + * @readonly + * @enum + */ Dish.LIST_FILE = 8; - export default Dish; diff --git a/src/core/Ingredient.mjs b/src/core/Ingredient.mjs index 319dfb15..41732035 100755 --- a/src/core/Ingredient.mjs +++ b/src/core/Ingredient.mjs @@ -5,21 +5,20 @@ */ import Utils from "./Utils.mjs"; -import {fromHex} from "./lib/Hex.mjs"; +import { fromHex } from "./lib/Hex.mjs"; /** * The arguments to operations. */ class Ingredient { - /** * Ingredient constructor * * @param {Object} ingredientConfig */ constructor(ingredientConfig) { - this.name = ""; - this.type = ""; + this.name = ""; + this.type = ""; this._value = null; this.disabled = false; this.hint = ""; @@ -37,7 +36,6 @@ class Ingredient { } } - /** * Reads and parses the given config. * @@ -52,15 +50,20 @@ class Ingredient { this.hint = ingredientConfig.hint || false; this.rows = ingredientConfig.rows || false; this.toggleValues = ingredientConfig.toggleValues; - this.target = typeof ingredientConfig.target !== "undefined" ? ingredientConfig.target : null; - this.defaultIndex = typeof ingredientConfig.defaultIndex !== "undefined" ? ingredientConfig.defaultIndex : 0; + this.target = + typeof ingredientConfig.target !== "undefined" + ? ingredientConfig.target + : null; + this.defaultIndex = + typeof ingredientConfig.defaultIndex !== "undefined" + ? ingredientConfig.defaultIndex + : 0; this.maxLength = ingredientConfig.maxLength || null; this.min = ingredientConfig.min; this.max = ingredientConfig.max; this.step = ingredientConfig.step; } - /** * Returns the value of the Ingredient as it should be displayed in a recipe config. * @@ -70,7 +73,6 @@ class Ingredient { return this._value; } - /** * Sets the value of the Ingredient. * @@ -80,7 +82,6 @@ class Ingredient { this._value = Ingredient.prepare(value, this.type); } - /** * Gets the value of the Ingredient. * @@ -90,14 +91,13 @@ class Ingredient { return this._value; } - /** * Most values will be strings when they are entered. This function converts them to the correct * type. * * @param {*} data * @param {string} type - The name of the data type. - */ + */ static prepare(data, type) { let number; @@ -126,7 +126,6 @@ class Ingredient { return data; } } - } export default Ingredient; diff --git a/src/core/Operation.mjs b/src/core/Operation.mjs index 24739d3f..4edec892 100755 --- a/src/core/Operation.mjs +++ b/src/core/Operation.mjs @@ -11,29 +11,27 @@ import Ingredient from "./Ingredient.mjs"; * The Operation specified by the user to be run. */ class Operation { - /** * Operation constructor */ constructor() { // Private fields - this._inputType = -1; - this._outputType = -1; - this._presentType = -1; - this._breakpoint = false; - this._disabled = false; - this._flowControl = false; - this._manualBake = false; - this._ingList = []; + this._inputType = -1; + this._outputType = -1; + this._presentType = -1; + this._breakpoint = false; + this._disabled = false; + this._flowControl = false; + this._manualBake = false; + this._ingList = []; // Public fields - this.name = ""; - this.module = ""; - this.description = ""; - this.infoURL = null; + this.name = ""; + this.module = ""; + this.description = ""; + this.infoURL = null; } - /** * Interface for operation runner * @@ -45,7 +43,6 @@ class Operation { return input; } - /** * Interface for forward highlighter * @@ -59,7 +56,6 @@ class Operation { return false; } - /** * Interface for reverse highlighter * @@ -73,7 +69,6 @@ class Operation { return false; } - /** * Method to be called when displaying the result of an operation in a human-readable * format. This allows operations to return usable data from their run() method and @@ -90,7 +85,6 @@ class Operation { return data; } - /** * Sets the input type as a Dish enum. * @@ -100,7 +94,6 @@ class Operation { this._inputType = Dish.typeEnum(typeStr); } - /** * Gets the input type as a readable string. * @@ -110,7 +103,6 @@ class Operation { return Dish.enumLookup(this._inputType); } - /** * Sets the output type as a Dish enum. * @@ -121,7 +113,6 @@ class Operation { if (this._presentType < 0) this._presentType = this._outputType; } - /** * Gets the output type as a readable string. * @@ -131,7 +122,6 @@ class Operation { return Dish.enumLookup(this._outputType); } - /** * Sets the presentation type as a Dish enum. * @@ -141,7 +131,6 @@ class Operation { this._presentType = Dish.typeEnum(typeStr); } - /** * Gets the presentation type as a readable string. * @@ -151,31 +140,29 @@ class Operation { return Dish.enumLookup(this._presentType); } - /** * Sets the args for the current operation. * * @param {Object[]} conf */ set args(conf) { - conf.forEach(arg => { + conf.forEach((arg) => { const ingredient = new Ingredient(arg); this.addIngredient(ingredient); }); } - /** * Gets the args for the current operation. * * @param {Object[]} conf */ get args() { - return this._ingList.map(ing => { + return this._ingList.map((ing) => { const conf = { name: ing.name, type: ing.type, - value: ing.defaultValue + value: ing.defaultValue, }; if (ing.toggleValues) conf.toggleValues = ing.toggleValues; @@ -192,7 +179,6 @@ class Operation { }); } - /** * Returns the value of the Operation as it should be displayed in a recipe config. * @@ -200,12 +186,11 @@ class Operation { */ get config() { return { - "op": this.name, - "args": this._ingList.map(ing => ing.config) + op: this.name, + args: this._ingList.map((ing) => ing.config), }; } - /** * Adds a new Ingredient to this Operation. * @@ -215,7 +200,6 @@ class Operation { this._ingList.push(ingredient); } - /** * Set the Ingredient values for this Operation. * @@ -227,17 +211,15 @@ class Operation { }); } - /** * Get the Ingredient values for this Operation. * * @returns {Object[]} */ get ingValues() { - return this._ingList.map(ing => ing.value); + return this._ingList.map((ing) => ing.value); } - /** * Set whether this Operation has a breakpoint. * @@ -247,7 +229,6 @@ class Operation { this._breakpoint = !!value; } - /** * Returns true if this Operation has a breakpoint set. * @@ -257,7 +238,6 @@ class Operation { return this._breakpoint; } - /** * Set whether this Operation is disabled. * @@ -267,7 +247,6 @@ class Operation { this._disabled = !!value; } - /** * Returns true if this Operation is disabled. * @@ -277,7 +256,6 @@ class Operation { return this._disabled; } - /** * Returns true if this Operation is a flow control. * @@ -287,7 +265,6 @@ class Operation { return this._flowControl; } - /** * Set whether this Operation is a flowcontrol op. * @@ -297,7 +274,6 @@ class Operation { this._flowControl = !!value; } - /** * Returns true if this Operation should not trigger AutoBake. * @@ -307,7 +283,6 @@ class Operation { return this._manualBake; } - /** * Set whether this Operation should trigger AutoBake. * @@ -316,7 +291,6 @@ class Operation { set manualBake(value) { this._manualBake = !!value; } - } export default Operation; diff --git a/src/core/Recipe.mjs b/src/core/Recipe.mjs index 3ce40aa4..6202b813 100755 --- a/src/core/Recipe.mjs +++ b/src/core/Recipe.mjs @@ -4,7 +4,9 @@ * @license Apache-2.0 */ -import OperationConfig from "./config/OperationConfig.json" assert {type: "json"}; +import OperationConfig from "./config/OperationConfig.json" assert { + type: "json", +}; import OperationError from "./errors/OperationError.mjs"; import Operation from "./Operation.mjs"; import DishError from "./errors/DishError.mjs"; @@ -17,8 +19,7 @@ let modules = null; /** * The Recipe controls a list of Operations and the Dish they operate on. */ -class Recipe { - +class Recipe { /** * Recipe constructor * @@ -32,7 +33,6 @@ class Recipe { } } - /** * Reads and parses the given config. * @@ -40,7 +40,7 @@ class Recipe { * @param {Object} recipeConfig */ _parseConfig(recipeConfig) { - recipeConfig.forEach(c => { + recipeConfig.forEach((c) => { this.opList.push({ name: c.op, module: OperationConfig[c.op].module, @@ -51,7 +51,6 @@ class Recipe { }); } - /** * Populate elements of opList with operation instances. * Dynamic import here removes top-level cyclic dependency issue. @@ -62,11 +61,13 @@ class Recipe { if (!modules) { // Using Webpack Magic Comments to force the dynamic import to be included in the main chunk // https://webpack.js.org/api/module-methods/ - modules = await import(/* webpackMode: "eager" */ "./config/modules/OpModules.mjs"); + modules = await import( + /* webpackMode: "eager" */ "./config/modules/OpModules.mjs" + ); modules = modules.default; } - this.opList = this.opList.map(o => { + this.opList = this.opList.map((o) => { if (o instanceof Operation) { return o; } else { @@ -79,20 +80,18 @@ class Recipe { }); } - /** * Returns the value of the Recipe as it should be displayed in a recipe config. * * @returns {Object[]} */ get config() { - return this.opList.map(op => ({ + return this.opList.map((op) => ({ op: op.name, args: op.ingValues, })); } - /** * Adds a new Operation to this Recipe. * @@ -102,14 +101,13 @@ class Recipe { this.opList.push(operation); } - /** * Adds a list of Operations to this Recipe. * * @param {Operation[]} operations */ addOperations(operations) { - operations.forEach(o => { + operations.forEach((o) => { if (o instanceof Operation) { this.opList.push(o); } else { @@ -124,7 +122,6 @@ class Recipe { }); } - /** * Set a breakpoint on a specified Operation. * @@ -139,7 +136,6 @@ class Recipe { } } - /** * Remove breakpoints on all Operations in the Recipe up to the specified position. Used by Flow * Control Fork operation. @@ -152,7 +148,6 @@ class Recipe { } } - /** * Returns true if there is a Flow Control Operation in this Recipe. * @@ -164,7 +159,6 @@ class Recipe { }, false); } - /** * Executes each operation in the recipe over the given Dish. * @@ -176,8 +170,10 @@ class Recipe { * @returns {number} * - The final progress through the recipe */ - async execute(dish, startFrom=0, forkState={}) { - let op, input, output, + async execute(dish, startFrom = 0, forkState = {}) { + let op, + input, + output, numJumps = 0, numRegisters = forkState.numRegisters || 0; @@ -185,7 +181,9 @@ class Recipe { await this._hydrateOpList(); - log.debug(`[*] Executing recipe of ${this.opList.length} operations, starting at ${startFrom}`); + log.debug( + `[*] Executing recipe of ${this.opList.length} operations, starting at ${startFrom}`, + ); for (let i = startFrom; i < this.opList.length; i++) { op = this.opList[i]; @@ -204,19 +202,21 @@ class Recipe { log.debug(`Executing operation '${op.name}'`); if (isWorkerEnvironment()) { - self.sendStatusMessage(`Baking... (${i+1}/${this.opList.length})`); + self.sendStatusMessage( + `Baking... (${i + 1}/${this.opList.length})`, + ); self.sendProgressMessage(i + 1, this.opList.length); } if (op.flowControl) { // Package up the current state let state = { - "progress": i, - "dish": dish, - "opList": this.opList, - "numJumps": numJumps, - "numRegisters": numRegisters, - "forkOffset": forkState.forkOffset || 0 + progress: i, + dish: dish, + opList: this.opList, + numJumps: numJumps, + numRegisters: numRegisters, + forkOffset: forkState.forkOffset || 0, }; state = await op.run(state); @@ -230,12 +230,18 @@ class Recipe { this.lastRunOp = op; } catch (err) { // Return expected errors as output - if (err instanceof OperationError || err?.type === "OperationError") { + if ( + err instanceof OperationError || + err?.type === "OperationError" + ) { // Cannot rely on `err instanceof OperationError` here as extending // native types is not fully supported yet. dish.set(err.message, "string"); return i; - } else if (err instanceof DishError || err?.type === "DishError") { + } else if ( + err instanceof DishError || + err?.type === "DishError" + ) { dish.set(err.message, "string"); return i; } else { @@ -243,10 +249,15 @@ class Recipe { e.progress = i; if (e.fileName) { - e.displayStr = `${op.name} - ${e.name} in ${e.fileName} on line ` + - `${e.lineNumber}.

Message: ${e.displayStr || e.message}`; + e.displayStr = + `${op.name} - ${e.name} in ${e.fileName} on line ` + + `${e.lineNumber}.

Message: ${ + e.displayStr || e.message + }`; } else { - e.displayStr = `${op.name} - ${e.displayStr || e.message}`; + e.displayStr = `${op.name} - ${ + e.displayStr || e.message + }`; } throw e; @@ -258,7 +269,6 @@ class Recipe { return this.opList.length; } - /** * Present the results of the final operation. * @@ -269,12 +279,11 @@ class Recipe { const output = await this.lastRunOp.present( await dish.get(this.lastRunOp.outputType), - this.lastRunOp.ingValues + this.lastRunOp.ingValues, ); dish.set(output, this.lastRunOp.presentType); } - /** * Returns the recipe configuration in string format. * @@ -284,7 +293,6 @@ class Recipe { return JSON.stringify(this.config); } - /** * Creates a Recipe from a given configuration string. * @@ -295,7 +303,6 @@ class Recipe { this._parseConfig(recipeConfig); } - /** * Generates a list of all the highlight functions assigned to operations in the recipe, if the * entire recipe supports highlighting. @@ -317,19 +324,19 @@ class Recipe { if (op.breakpoint) return false; // If any of the operations do not support highlighting, fail immediately. - if (op.highlight === false || op.highlight === undefined) return false; + if (op.highlight === false || op.highlight === undefined) + return false; highlights.push({ f: op.highlight, b: op.highlightReverse, - args: op.ingValues + args: op.ingValues, }); } return highlights; } - /** * Determines whether the previous operation has a different presentation type to its normal output. * @@ -338,9 +345,11 @@ class Recipe { */ lastOpPresented(progress) { if (progress < 1) return false; - return this.opList[progress-1].presentType !== this.opList[progress-1].outputType; + return ( + this.opList[progress - 1].presentType !== + this.opList[progress - 1].outputType + ); } - } export default Recipe; diff --git a/src/core/Utils.mjs b/src/core/Utils.mjs index 18b0e688..d87bacb3 100755 --- a/src/core/Utils.mjs +++ b/src/core/Utils.mjs @@ -7,16 +7,15 @@ // loglevel import required for Node API import log from "loglevel"; import utf8 from "utf8"; -import {fromBase64, toBase64} from "./lib/Base64.mjs"; -import {fromHex} from "./lib/Hex.mjs"; -import {fromDecimal} from "./lib/Decimal.mjs"; -import {fromBinary} from "./lib/Binary.mjs"; +import { fromBase64, toBase64 } from "./lib/Base64.mjs"; +import { fromHex } from "./lib/Hex.mjs"; +import { fromDecimal } from "./lib/Decimal.mjs"; +import { fromBinary } from "./lib/Binary.mjs"; /** * Utility functions for use in operations, the core framework and the stage. */ class Utils { - /** * Translates an ordinal into a character. * @@ -33,15 +32,14 @@ class Utils { // https://mathiasbynens.be/notes/javascript-unicode if (o > 0xffff) { o -= 0x10000; - const high = String.fromCharCode(o >>> 10 & 0x3ff | 0xd800); - o = 0xdc00 | o & 0x3ff; + const high = String.fromCharCode(((o >>> 10) & 0x3ff) | 0xd800); + o = 0xdc00 | (o & 0x3ff); return high + String.fromCharCode(o); } return String.fromCharCode(o); } - /** * Translates a character into an ordinal. * @@ -59,8 +57,12 @@ class Utils { if (c.length === 2) { const high = c.charCodeAt(0); const low = c.charCodeAt(1); - if (high >= 0xd800 && high < 0xdc00 && - low >= 0xdc00 && low < 0xe000) { + if ( + high >= 0xd800 && + high < 0xdc00 && + low >= 0xdc00 && + low < 0xe000 + ) { return (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000; } } @@ -68,7 +70,6 @@ class Utils { return c.charCodeAt(0); } - /** * Adds trailing bytes to a byteArray. * @@ -92,7 +93,7 @@ class Utils { * // returns ["t", "e", "s", "t", 1, 1, 1, 1] * Utils.padBytesRight("test", 8, 1); */ - static padBytesRight(arr, numBytes, padByte=0) { + static padBytesRight(arr, numBytes, padByte = 0) { const paddedBytes = new Array(numBytes); paddedBytes.fill(padByte); @@ -103,7 +104,6 @@ class Utils { return paddedBytes; } - /** * Truncates a long string to max length and adds suffix. * @@ -119,14 +119,13 @@ class Utils { * // returns "A long s-" * Utils.truncate("A long string", 9, "-"); */ - static truncate(str, max, suffix="...") { + static truncate(str, max, suffix = "...") { if (str.length > max) { str = str.slice(0, max - suffix.length) + suffix; } return str; } - /** * Converts a character or number to its hex representation. * @@ -141,12 +140,11 @@ class Utils { * // returns "6e" * Utils.hex(110); */ - static hex(c, length=2) { + static hex(c, length = 2) { c = typeof c == "string" ? Utils.ord(c) : c; return c.toString(16).padStart(length, "0"); } - /** * Converts a character or number to its binary representation. * @@ -161,12 +159,11 @@ class Utils { * // returns "01101110" * Utils.bin(110); */ - static bin(c, length=8) { + static bin(c, length = 8) { c = typeof c == "string" ? Utils.ord(c) : c; return c.toString(2).padStart(length, "0"); } - /** * Returns a string with all non-printable chars as dots, optionally preserving whitespace. * @@ -175,13 +172,14 @@ class Utils { * @param {boolean} [onlyAscii=false] - Whether or not to replace non ASCII characters. * @returns {string} */ - static printable(str, preserveWs=false, onlyAscii=false) { + static printable(str, preserveWs = false, onlyAscii = false) { if (onlyAscii) { return str.replace(/[^\x20-\x7f]/g, "."); } // eslint-disable-next-line no-misleading-character-class - const re = /[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g; + const re = + /[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g; const wsRe = /[\x09-\x10\u2028\u2029]/g; str = str.replace(re, "."); @@ -189,7 +187,6 @@ class Utils { return str; } - /** * Returns a string with whitespace represented as special characters from the * Unicode Private Use Area, which CyberChef will display as control characters. @@ -199,12 +196,11 @@ class Utils { * @returns {string} */ static escapeWhitespace(str) { - return str.replace(/[\x09-\x10]/g, function(c) { + return str.replace(/[\x09-\x10]/g, function (c) { return String.fromCharCode(0xe000 + c.charCodeAt(0)); }); } - /** * Parse a string entered by a user and replace escaped chars with the bytes they represent. * @@ -219,49 +215,55 @@ class Utils { * Utils.parseEscapedChars("\\n"); */ static parseEscapedChars(str) { - return str.replace(/\\([abfnrtv'"]|[0-3][0-7]{2}|[0-7]{1,2}|x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]{1,6}\}|\\)/g, function(m, a) { - switch (a[0]) { - case "\\": - return "\\"; - case "0": - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - return String.fromCharCode(parseInt(a, 8)); - case "a": - return String.fromCharCode(7); - case "b": - return "\b"; - case "t": - return "\t"; - case "n": - return "\n"; - case "v": - return "\v"; - case "f": - return "\f"; - case "r": - return "\r"; - case '"': - return '"'; - case "'": - return "'"; - case "x": - return String.fromCharCode(parseInt(a.substr(1), 16)); - case "u": - if (a[1] === "{") - return String.fromCodePoint(parseInt(a.slice(2, -1), 16)); - else + return str.replace( + /\\([abfnrtv'"]|[0-3][0-7]{2}|[0-7]{1,2}|x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]{1,6}\}|\\)/g, + function (m, a) { + switch (a[0]) { + case "\\": + return "\\"; + case "0": + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + return String.fromCharCode(parseInt(a, 8)); + case "a": + return String.fromCharCode(7); + case "b": + return "\b"; + case "t": + return "\t"; + case "n": + return "\n"; + case "v": + return "\v"; + case "f": + return "\f"; + case "r": + return "\r"; + case '"': + return '"'; + case "'": + return "'"; + case "x": return String.fromCharCode(parseInt(a.substr(1), 16)); - } - }); + case "u": + if (a[1] === "{") + return String.fromCodePoint( + parseInt(a.slice(2, -1), 16), + ); + else + return String.fromCharCode( + parseInt(a.substr(1), 16), + ); + } + }, + ); } - /** * Escape a string containing regex control characters so that it can be safely * used in a regex without causing unintended behaviours. @@ -277,7 +279,6 @@ class Utils { return str.replace(/([.*+?^=!:${}()|[\]/\\])/g, "\\$1"); } - /** * Expand an alphabet range string into a list of the characters in that range. * @@ -298,19 +299,23 @@ class Utils { const alphArr = []; for (let i = 0; i < alphStr.length; i++) { - if (i < alphStr.length - 2 && - alphStr[i+1] === "-" && - alphStr[i] !== "\\") { + if ( + i < alphStr.length - 2 && + alphStr[i + 1] === "-" && + alphStr[i] !== "\\" + ) { const start = Utils.ord(alphStr[i]), - end = Utils.ord(alphStr[i+2]); + end = Utils.ord(alphStr[i + 2]); for (let j = start; j <= end; j++) { alphArr.push(Utils.chr(j)); } i += 2; - } else if (i < alphStr.length - 2 && + } else if ( + i < alphStr.length - 2 && alphStr[i] === "\\" && - alphStr[i+1] === "-") { + alphStr[i + 1] === "-" + ) { alphArr.push("-"); i++; } else { @@ -320,7 +325,6 @@ class Utils { return alphArr; } - /** * Coverts data of varying types to a byteArray. * Accepts hex, Base64, UTF8 and Latin1 strings. @@ -357,7 +361,6 @@ class Utils { } } - /** * Coverts data of varying types to a byte string. * Accepts hex, Base64, UTF8 and Latin1 strings. @@ -385,7 +388,9 @@ class Utils { case "decimal": return Utils.byteArrayToChars(fromDecimal(str)); case "base64": - return Utils.byteArrayToChars(fromBase64(str, null, "byteArray")); + return Utils.byteArrayToChars( + fromBase64(str, null, "byteArray"), + ); case "utf8": return utf8.encode(str); case "latin1": @@ -394,7 +399,6 @@ class Utils { } } - /** * Converts a byte array to an integer. * @@ -413,17 +417,16 @@ class Utils { let value = 0; if (byteorder === "big") { for (let i = 0; i < byteArray.length; i++) { - value = (value * 256) + byteArray[i]; + value = value * 256 + byteArray[i]; } } else { for (let i = byteArray.length - 1; i >= 0; i--) { - value = (value * 256) + byteArray[i]; + value = value * 256 + byteArray[i]; } } return value; } - /** * Converts an integer to a byte array of {length} bytes. * @@ -446,19 +449,18 @@ class Utils { const arr = new Array(length); if (byteorder === "little") { for (let i = 0; i < length; i++) { - arr[i] = value & 0xFF; + arr[i] = value & 0xff; value = value >>> 8; } } else { for (let i = length - 1; i >= 0; i--) { - arr[i] = value & 0xFF; + arr[i] = value & 0xff; value = value >>> 8; } } return arr; } - /** * Converts a string to an ArrayBuffer. * Treats the string as UTF-8 if any values are over 255. @@ -475,10 +477,11 @@ class Utils { */ static strToArrayBuffer(str) { log.debug(`Converting string[${str?.length}] to array buffer`); - if (!str) return new ArrayBuffer; + if (!str) return new ArrayBuffer(); const arr = new Uint8Array(str.length); - let i = str.length, b; + let i = str.length, + b; while (i--) { b = str.charCodeAt(i); arr[i] = b; @@ -488,7 +491,6 @@ class Utils { return arr.buffer; } - /** * Converts a string to a UTF-8 ArrayBuffer. * @@ -504,12 +506,16 @@ class Utils { */ static strToUtf8ArrayBuffer(str) { log.debug(`Converting string[${str?.length}] to UTF8 array buffer`); - if (!str) return new ArrayBuffer; + if (!str) return new ArrayBuffer(); const buffer = new TextEncoder("utf-8").encode(str); if (str.length !== buffer.length) { - if (isWorkerEnvironment() && self && typeof self.setOption === "function") { + if ( + isWorkerEnvironment() && + self && + typeof self.setOption === "function" + ) { self.setOption("attemptHighlight", false); } else if (isWebEnvironment()) { window.app.options.attemptHighlight = false; @@ -519,7 +525,6 @@ class Utils { return buffer.buffer; } - /** * Converts a string to a byte array. * Treats the string as UTF-8 if any values are over 255. @@ -538,7 +543,8 @@ class Utils { log.debug(`Converting string[${str?.length}] to byte array`); if (!str) return []; const byteArray = new Array(str.length); - let i = str.length, b; + let i = str.length, + b; while (i--) { b = str.charCodeAt(i); byteArray[i] = b; @@ -548,7 +554,6 @@ class Utils { return byteArray; } - /** * Converts a string to a UTF-8 byte array. * @@ -578,7 +583,6 @@ class Utils { return Utils.strToByteArray(utf8Str); } - /** * Converts a string to a unicode charcode array * @@ -614,7 +618,6 @@ class Utils { return charcode; } - /** * Attempts to convert a byte array to a UTF-8 string. * @@ -635,7 +638,9 @@ class Utils { byteArray = new Uint8Array(byteArray); try { - const str = new TextDecoder("utf-8", {fatal: true}).decode(byteArray); + const str = new TextDecoder("utf-8", { fatal: true }).decode( + byteArray, + ); if (str.length !== byteArray.length) { if (isWorkerEnvironment()) { @@ -652,7 +657,6 @@ class Utils { } } - /** * Converts a charcode array to a string. * @@ -673,12 +677,11 @@ class Utils { // Maxiumum arg length for fromCharCode is 65535, but the stack may already be fairly deep, // so don't get too near it. for (let i = 0; i < byteArray.length; i += 20000) { - str += String.fromCharCode(...(byteArray.slice(i, i+20000))); + str += String.fromCharCode(...byteArray.slice(i, i + 20000)); } return str; } - /** * Converts an ArrayBuffer to a string. * @@ -690,7 +693,7 @@ class Utils { * // returns "hello" * Utils.arrayBufferToStr(Uint8Array.from([104,101,108,108,111]).buffer); */ - static arrayBufferToStr(arrayBuffer, utf8=true) { + static arrayBufferToStr(arrayBuffer, utf8 = true) { log.debug(`Converting array buffer[${arrayBuffer?.byteLength}] to str`); if (!arrayBuffer || !arrayBuffer.byteLength) return ""; const arr = new Uint8Array(arrayBuffer); @@ -729,13 +732,12 @@ class Utils { for (i = 0; i < prob.length; i++) { p = prob[i]; - entropy += p * Math.log(p) / Math.log(2); + entropy += (p * Math.log(p)) / Math.log(2); } return -entropy; } - /** * Parses CSV data and returns it as a two dimensional array or strings. * @@ -748,7 +750,7 @@ class Utils { * // returns [["head1", "head2"], ["data1", "data2"]] * Utils.parseCSV("head1,head2\ndata1,data2"); */ - static parseCSV(data, cellDelims=[","], lineDelims=["\n", "\r"]) { + static parseCSV(data, cellDelims = [","], lineDelims = ["\n", "\r"]) { let b, next, renderNext = false, @@ -762,14 +764,14 @@ class Utils { for (let i = 0; i < data.length; i++) { b = data[i]; - next = data[i+1] || ""; + next = data[i + 1] || ""; if (renderNext) { cell += b; renderNext = false; - } else if (b === "\"" && !inString) { + } else if (b === '"' && !inString) { inString = true; - } else if (b === "\"" && inString) { - if (next === "\"") renderNext = true; + } else if (b === '"' && inString) { + if (next === '"') renderNext = true; else inString = false; } else if (!inString && cellDelims.indexOf(b) >= 0) { line.push(cell); @@ -796,7 +798,6 @@ class Utils { return lines; } - /** * Removes all HTML (or XML) tags from the input string. * @@ -809,7 +810,7 @@ class Utils { * // returns "Test" * Utils.stripHtmlTags("
Test
"); */ - static stripHtmlTags(htmlStr, removeScriptAndStyle=false) { + static stripHtmlTags(htmlStr, removeScriptAndStyle = false) { /** * Recursively remove a pattern from a string until there are no more matches. * Avoids incomplete sanitization e.g. "aabcbc".replace(/abc/g, "") === "abc" @@ -820,17 +821,24 @@ class Utils { */ function recursiveRemove(pattern, str) { const newStr = str.replace(pattern, ""); - return newStr.length === str.length ? newStr : recursiveRemove(pattern, newStr); + return newStr.length === str.length + ? newStr + : recursiveRemove(pattern, newStr); } if (removeScriptAndStyle) { - htmlStr = recursiveRemove(/]*>(\s|\S)*?<\/script[^>]*>/gi, htmlStr); - htmlStr = recursiveRemove(/]*>(\s|\S)*?<\/style[^>]*>/gi, htmlStr); + htmlStr = recursiveRemove( + /]*>(\s|\S)*?<\/script[^>]*>/gi, + htmlStr, + ); + htmlStr = recursiveRemove( + /]*>(\s|\S)*?<\/style[^>]*>/gi, + htmlStr, + ); } return recursiveRemove(/<[^>]+>/g, htmlStr); } - /** * Escapes HTML tags in a string to stop them being rendered. * https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet @@ -855,15 +863,16 @@ class Utils { '"': """, "'": "'", // ' not recommended because it's not in the HTML spec "`": "`", - "\u0000": "\ue000" + "\u0000": "\ue000", }; - return str ? str.replace(/[&<>"'`\u0000]/g, function (match) { - return HTML_CHARS[match]; - }) : str; + return str + ? str.replace(/[&<>"'`\u0000]/g, function (match) { + return HTML_CHARS[match]; + }) + : str; } - /** * Unescapes HTML tags in a string to make them render again. * @@ -876,22 +885,21 @@ class Utils { */ static unescapeHtml(str) { const HTML_CHARS = { - "&": "&", - "<": "<", - ">": ">", + "&": "&", + "<": "<", + ">": ">", """: '"', "'": "'", "/": "/", "`": "`", - "\ue000": "\u0000" + "\ue000": "\u0000", }; - return str.replace(/(&#?x?[a-z0-9]{2,4};|\ue000)/ig, function (match) { + return str.replace(/(&#?x?[a-z0-9]{2,4};|\ue000)/gi, function (match) { return HTML_CHARS[match] || match; }); } - /** * Converts a string to it's title case equivalent. * @@ -903,12 +911,11 @@ class Utils { * Utils.toTitleCase("a tIny String"); */ static toTitleCase(str) { - return str.replace(/\w\S*/g, function(txt) { + return str.replace(/\w\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }); } - /** * Encodes a URI fragment (#) or query (?) using a minimal amount of percent-encoding. * @@ -951,7 +958,7 @@ class Utils { "%3A": ":", "%40": "@", "%2F": "/", - "%3F": "?" + "%3F": "?", }; str = encodeURIComponent(str); @@ -960,7 +967,6 @@ class Utils { }); } - /** * Generates a "pretty" recipe format from a recipeConfig object. * @@ -982,7 +988,7 @@ class Utils { disabled = "", bp = ""; - recipeConfig.forEach(op => { + recipeConfig.forEach((op) => { name = op.op.replace(/ /g, "_"); args = JSON.stringify(op.args) .slice(1, -1) // Remove [ and ] as they are implied @@ -992,7 +998,7 @@ class Utils { .replace(/"((?:[^"\\]|\\.)*)"/g, "'$1'") // Replace opening and closing " with ' .replace(/\\"/g, '"'); // Unescape double quotes - disabled = op.disabled ? "/disabled": ""; + disabled = op.disabled ? "/disabled" : ""; bp = op.breakpoint ? "/breakpoint" : ""; prettyConfig += `${name}(${args}${disabled}${bp})`; if (newline) prettyConfig += "\n"; @@ -1000,7 +1006,6 @@ class Utils { return prettyConfig; } - /** * Converts a recipe string to the JSON representation of the recipe. * Accepts either stringified JSON or the bespoke "pretty" recipe format. @@ -1016,7 +1021,8 @@ class Utils { // Parse bespoke recipe format recipe = recipe.replace(/\n/g, ""); let m, args; - const recipeRegex = /([^(]+)\(((?:'[^'\\]*(?:\\.[^'\\]*)*'|[^)/'])*)(\/[^)]+)?\)/g, + const recipeRegex = + /([^(]+)\(((?:'[^'\\]*(?:\\.[^'\\]*)*'|[^)/'])*)(\/[^)]+)?\)/g, recipeConfig = []; while ((m = recipeRegex.exec(recipe))) { @@ -1030,7 +1036,7 @@ class Utils { const op = { op: m[1].replace(/_/g, " "), - args: JSON.parse(args) + args: JSON.parse(args), }; if (m[3] && m[3].indexOf("disabled") > 0) op.disabled = true; if (m[3] && m[3].indexOf("breakpoint") > 0) op.breakpoint = true; @@ -1039,7 +1045,6 @@ class Utils { return recipeConfig; } - /** * Formats a list of files or directories. * @@ -1050,7 +1055,7 @@ class Utils { * @returns {html} */ static async displayFilesAsHTML(files) { - const formatDirectory = function(file) { + const formatDirectory = function (file) { const html = `
"); } - /** * Parses URI parameters into a JSON object. * @@ -1149,8 +1158,7 @@ class Utils { if (paramStr === "") return {}; // Cut off ? or # and split on & - if (paramStr[0] === "?" || - paramStr[0] === "#") { + if (paramStr[0] === "?" || paramStr[0] === "#") { paramStr = paramStr.substr(1); } @@ -1162,14 +1170,15 @@ class Utils { if (param.length !== 2) { result[params[i]] = true; } else { - result[param[0]] = decodeURIComponent(param[1].replace(/\+/g, " ")); + result[param[0]] = decodeURIComponent( + param[1].replace(/\+/g, " "), + ); } } return result; } - /** * Reads a File and returns the data as a Uint8Array. * @@ -1181,10 +1190,8 @@ class Utils { * await Utils.readFile(new File(["hello"], "test")) */ static readFile(file) { - if (isNodeEnvironment()) { return Buffer.from(file).buffer; - } else { return new Promise((resolve, reject) => { const reader = new FileReader(); @@ -1192,7 +1199,7 @@ class Utils { let offset = 0; const CHUNK_SIZE = 10485760; // 10MiB - const seek = function() { + const seek = function () { if (offset >= file.size) { resolve(data); return; @@ -1201,13 +1208,13 @@ class Utils { reader.readAsArrayBuffer(slice); }; - reader.onload = function(e) { + reader.onload = function (e) { data.set(new Uint8Array(reader.result), offset); offset += CHUNK_SIZE; seek(); }; - reader.onerror = function(e) { + reader.onerror = function (e) { reject(reader.error.message); }; @@ -1227,14 +1234,15 @@ class Utils { */ static readFileSync(file) { if (!isNodeEnvironment()) { - throw new TypeError("Browser environment cannot support readFileSync"); + throw new TypeError( + "Browser environment cannot support readFileSync", + ); } const arrayBuffer = Uint8Array.from(file.data); return arrayBuffer.buffer; } - /** * Actual modulo function, since % is actually the remainder function in JS. * @@ -1247,7 +1255,6 @@ class Utils { return ((x % y) + y) % y; } - /** * Finds the greatest common divisor of two numbers. * @@ -1263,7 +1270,6 @@ class Utils { return Utils.gcd(y, x % y); } - /** * Finds the modular inverse of two values. * @@ -1281,7 +1287,6 @@ class Utils { } } - /** * A mapping of names of delimiter characters to their symbols. * @@ -1290,24 +1295,23 @@ class Utils { */ static charRep(token) { return { - "Space": " ", - "Percent": "%", - "Comma": ",", - "Semi-colon": ";", - "Colon": ":", - "Tab": "\t", - "Line feed": "\n", - "CRLF": "\r\n", + Space: " ", + Percent: "%", + Comma: ",", + "Semi-colon": ";", + Colon: ":", + Tab: "\t", + "Line feed": "\n", + CRLF: "\r\n", "Forward slash": "/", - "Backslash": "\\", - "0x": "0x", - "\\x": "\\x", + Backslash: "\\", + "0x": "0x", + "\\x": "\\x", "Nothing (separate chars)": "", - "None": "", + None: "", }[token]; } - /** * A mapping of names of delimiter characters to regular expressions which can select them. * @@ -1316,19 +1320,19 @@ class Utils { */ static regexRep(token) { return { - "Space": /\s+/g, - "Percent": /%/g, - "Comma": /,/g, - "Semi-colon": /;/g, - "Colon": /:/g, - "Line feed": /\n/g, - "CRLF": /\r\n/g, + Space: /\s+/g, + Percent: /%/g, + Comma: /,/g, + "Semi-colon": /;/g, + Colon: /:/g, + "Line feed": /\n/g, + CRLF: /\r\n/g, "Forward slash": /\//g, - "Backslash": /\\/g, + Backslash: /\\/g, "0x with comma": /,?0x/g, - "0x": /0x/g, - "\\x": /\\x/g, - "None": /\s+/g // Included here to remove whitespace when there shouldn't be any + "0x": /0x/g, + "\\x": /\\x/g, + None: /\s+/g, // Included here to remove whitespace when there shouldn't be any }[token]; } @@ -1338,7 +1342,7 @@ class Utils { * @param {Iterable} iterable * @param {number} chunksize */ - static* chunked(iterable, chunksize) { + static *chunked(iterable, chunksize) { const iterator = iterable[Symbol.iterator](); while (true) { const res = []; @@ -1363,13 +1367,17 @@ class Utils { * @returns {boolean} */ export function isNodeEnvironment() { - return typeof process !== "undefined" && process.versions != null && process.versions.node != null; + return ( + typeof process !== "undefined" && + process.versions != null && + process.versions.node != null + ); } /** * Check whether the code is running in a web environment * @returns {boolean} -*/ + */ export function isWebEnvironment() { return typeof window === "object"; } @@ -1377,14 +1385,13 @@ export function isWebEnvironment() { /** * Check whether the code is running in a worker * @returns {boolean} -*/ + */ export function isWorkerEnvironment() { return typeof importScripts === "function"; } export default Utils; - /** * Removes all duplicates from an array. * @@ -1397,8 +1404,9 @@ export default Utils; * // returns ["One", "Two", "Three"] * ["One", "Two", "Three", "One"].unique(); */ -Array.prototype.unique = function() { - const u = {}, a = []; +Array.prototype.unique = function () { + const u = {}, + a = []; for (let i = 0, l = this.length; i < l; i++) { if (Object.prototype.hasOwnProperty.call(u, this[i])) { continue; @@ -1409,7 +1417,6 @@ Array.prototype.unique = function() { return a; }; - /** * Returns the largest value in the array. * @@ -1419,11 +1426,10 @@ Array.prototype.unique = function() { * // returns 7 * [4,2,5,3,7].max(); */ -Array.prototype.max = function() { +Array.prototype.max = function () { return Math.max.apply(null, this); }; - /** * Returns the smallest value in the array. * @@ -1433,11 +1439,10 @@ Array.prototype.max = function() { * // returns 2 * [4,2,5,3,7].min(); */ -Array.prototype.min = function() { +Array.prototype.min = function () { return Math.min.apply(null, this); }; - /** * Sums all the values in an array. * @@ -1447,13 +1452,12 @@ Array.prototype.min = function() { * // returns 21 * [4,2,5,3,7].sum(); */ -Array.prototype.sum = function() { +Array.prototype.sum = function () { return this.reduce(function (a, b) { return a + b; }, 0); }; - /** * Determine whether two arrays are equal or not. * @@ -1467,7 +1471,7 @@ Array.prototype.sum = function() { * // returns false * [1,2,3].equals([3,2,1]); */ -Array.prototype.equals = function(other) { +Array.prototype.equals = function (other) { if (!other) return false; let i = this.length; if (i !== other.length) return false; @@ -1477,7 +1481,6 @@ Array.prototype.equals = function(other) { return true; }; - /** * Counts the number of times a char appears in a string. * @@ -1488,21 +1491,18 @@ Array.prototype.equals = function(other) { * // returns 2 * "Hello".count("l"); */ -String.prototype.count = function(chr) { +String.prototype.count = function (chr) { return this.split(chr).length - 1; }; - /** * Wrapper for self.sendStatusMessage to handle different environments. * * @param {string} msg */ export function sendStatusMessage(msg) { - if (isWorkerEnvironment()) - self.sendStatusMessage(msg); - else if (isWebEnvironment()) - app.alert(msg, 10000); + if (isWorkerEnvironment()) self.sendStatusMessage(msg); + else if (isWebEnvironment()) app.alert(msg, 10000); else if (isNodeEnvironment() && !global.TESTING) // eslint-disable-next-line no-console console.debug(msg); @@ -1523,8 +1523,8 @@ const debounceTimeouts = {}; * @returns {function} */ export function debounce(func, wait, id, scope, args) { - return function() { - const later = function() { + return function () { + const later = function () { func.apply(scope, args); }; clearTimeout(debounceTimeouts[id]); @@ -1532,7 +1532,6 @@ export function debounce(func, wait, id, scope, args) { }; } - /* * Polyfills */ @@ -1541,33 +1540,32 @@ export function debounce(func, wait, id, scope, args) { // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart if (!String.prototype.padStart) { String.prototype.padStart = function padStart(targetLength, padString) { - targetLength = targetLength>>0; // floor if number or convert non-number to 0; - padString = String((typeof padString !== "undefined" ? padString : " ")); + targetLength = targetLength >> 0; // floor if number or convert non-number to 0; + padString = String(typeof padString !== "undefined" ? padString : " "); if (this.length > targetLength) { return String(this); } else { - targetLength = targetLength-this.length; + targetLength = targetLength - this.length; if (targetLength > padString.length) { - padString += padString.repeat(targetLength/padString.length); // append to original to ensure we are longer than needed + padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed } return padString.slice(0, targetLength) + String(this); } }; } - // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd if (!String.prototype.padEnd) { String.prototype.padEnd = function padEnd(targetLength, padString) { - targetLength = targetLength>>0; // floor if number or convert non-number to 0; - padString = String((typeof padString !== "undefined" ? padString : " ")); + targetLength = targetLength >> 0; // floor if number or convert non-number to 0; + padString = String(typeof padString !== "undefined" ? padString : " "); if (this.length > targetLength) { return String(this); } else { - targetLength = targetLength-this.length; + targetLength = targetLength - this.length; if (targetLength > padString.length) { - padString += padString.repeat(targetLength/padString.length); // append to original to ensure we are longer than needed + padString += padString.repeat(targetLength / padString.length); // append to original to ensure we are longer than needed } return String(this) + padString.slice(0, targetLength); } diff --git a/src/core/config/scripts/generateConfig.mjs b/src/core/config/scripts/generateConfig.mjs index 64c7cb81..017b5bc6 100644 --- a/src/core/config/scripts/generateConfig.mjs +++ b/src/core/config/scripts/generateConfig.mjs @@ -12,19 +12,22 @@ /* eslint no-console: ["off"] */ import path from "path"; -import fs from "fs"; +import fs from "fs"; import process from "process"; import * as Ops from "../../operations/index.mjs"; const dir = path.join(process.cwd() + "/src/core/config/"); if (!fs.existsSync(dir)) { console.log("\nCWD: " + process.cwd()); - console.log("Error: generateConfig.mjs should be run from the project root"); - console.log("Example> node --experimental-modules src/core/config/scripts/generateConfig.mjs"); + console.log( + "Error: generateConfig.mjs should be run from the project root", + ); + console.log( + "Example> node --experimental-modules src/core/config/scripts/generateConfig.mjs", + ); process.exit(1); } - const operationConfig = {}, modules = {}; @@ -35,33 +38,30 @@ for (const opObj in Ops) { const op = new Ops[opObj](); operationConfig[op.name] = { - module: op.module, + module: op.module, description: op.description, - infoURL: op.infoURL, - inputType: op.inputType, - outputType: op.presentType, + infoURL: op.infoURL, + inputType: op.inputType, + outputType: op.presentType, flowControl: op.flowControl, - manualBake: op.manualBake, - args: op.args, - checks: op.checks + manualBake: op.manualBake, + args: op.args, + checks: op.checks, }; - if (!(op.module in modules)) - modules[op.module] = {}; + if (!(op.module in modules)) modules[op.module] = {}; modules[op.module][op.name] = opObj; } - /** * Write OperationConfig. */ fs.writeFileSync( path.join(dir, "OperationConfig.json"), - JSON.stringify(operationConfig, null, 4) + JSON.stringify(operationConfig, null, 4), ); console.log("Written OperationConfig.json"); - /** * Write modules. */ @@ -98,14 +98,10 @@ OpModules.${module} = { export default OpModules; `; - fs.writeFileSync( - path.join(dir, `modules/${module}.mjs`), - code - ); + fs.writeFileSync(path.join(dir, `modules/${module}.mjs`), code); console.log(`Written ${module} module`); } - /** * Write OpModules wrapper. */ @@ -140,8 +136,5 @@ opModulesCode += `); export default OpModules; `; -fs.writeFileSync( - path.join(dir, "modules/OpModules.mjs"), - opModulesCode -); +fs.writeFileSync(path.join(dir, "modules/OpModules.mjs"), opModulesCode); console.log("Written OpModules.mjs"); diff --git a/src/core/config/scripts/generateOpsIndex.mjs b/src/core/config/scripts/generateOpsIndex.mjs index 750ee6f4..56c0a871 100644 --- a/src/core/config/scripts/generateOpsIndex.mjs +++ b/src/core/config/scripts/generateOpsIndex.mjs @@ -10,20 +10,24 @@ /* eslint no-console: ["off"] */ import path from "path"; -import fs from "fs"; +import fs from "fs"; import process from "process"; const dir = path.join(process.cwd() + "/src/core/config/"); if (!fs.existsSync(dir)) { console.log("\nCWD: " + process.cwd()); - console.log("Error: generateOpsIndex.mjs should be run from the project root"); - console.log("Example> node --experimental-modules src/core/config/scripts/generateOpsIndex.mjs"); + console.log( + "Error: generateOpsIndex.mjs should be run from the project root", + ); + console.log( + "Example> node --experimental-modules src/core/config/scripts/generateOpsIndex.mjs", + ); process.exit(1); } // Find all operation files const opObjs = []; -fs.readdirSync(path.join(dir, "../operations")).forEach(file => { +fs.readdirSync(path.join(dir, "../operations")).forEach((file) => { if (!file.endsWith(".mjs") || file === "index.mjs") return; opObjs.push(file.split(".mjs")[0]); }); @@ -38,7 +42,7 @@ let code = `/** */ `; -opObjs.forEach(obj => { +opObjs.forEach((obj) => { code += `import ${obj} from "./${obj}.mjs";\n`; }); @@ -46,15 +50,12 @@ code += ` export { `; -opObjs.forEach(obj => { +opObjs.forEach((obj) => { code += ` ${obj},\n`; }); code += "};\n"; // Write file -fs.writeFileSync( - path.join(dir, "../operations/index.mjs"), - code -); +fs.writeFileSync(path.join(dir, "../operations/index.mjs"), code); console.log("Written operation index."); diff --git a/src/core/config/scripts/newMinorVersion.mjs b/src/core/config/scripts/newMinorVersion.mjs index 67754890..ccf768b2 100644 --- a/src/core/config/scripts/newMinorVersion.mjs +++ b/src/core/config/scripts/newMinorVersion.mjs @@ -11,51 +11,62 @@ import prompt from "prompt"; import colors from "colors"; import path from "path"; -import fs from "fs"; +import fs from "fs"; import process from "process"; const dir = path.join(process.cwd() + "/src/core/config/"); if (!fs.existsSync(dir)) { console.log("\nCWD: " + process.cwd()); - console.log("Error: newMinorVersion.mjs should be run from the project root"); - console.log("Example> node --experimental-modules src/core/config/scripts/newMinorVersion.mjs"); + console.log( + "Error: newMinorVersion.mjs should be run from the project root", + ); + console.log( + "Example> node --experimental-modules src/core/config/scripts/newMinorVersion.mjs", + ); process.exit(1); } -let changelogData = fs.readFileSync(path.join(process.cwd(), "CHANGELOG.md"), "utf8"); -const lastVersion = changelogData.match(/## Details\s+### \[(\d+)\.(\d+)\.(\d+)\]/); +let changelogData = fs.readFileSync( + path.join(process.cwd(), "CHANGELOG.md"), + "utf8", +); +const lastVersion = changelogData.match( + /## Details\s+### \[(\d+)\.(\d+)\.(\d+)\]/, +); const newVersion = [ parseInt(lastVersion[1], 10), parseInt(lastVersion[2], 10) + 1, - 0 + 0, ]; let knownContributors = changelogData.match(/^\[@([^\]]+)\]/gm); -knownContributors = knownContributors.map(c => c.slice(2, -1)); +knownContributors = knownContributors.map((c) => c.slice(2, -1)); -const date = (new Date()).toISOString().split("T")[0]; +const date = new Date().toISOString().split("T")[0]; const schema = { properties: { message: { - description: "A short but descriptive summary of a feature in this version", + description: + "A short but descriptive summary of a feature in this version", example: "Added 'Op name' operation", prompt: "Feature description", type: "string", required: true, }, author: { - description: "The author of the feature (only one supported, edit manually to add more)", + description: + "The author of the feature (only one supported, edit manually to add more)", example: "n1474335", prompt: "Author", type: "string", - default: "n1474335" + default: "n1474335", }, id: { description: "The PR number or full commit hash for this feature.", example: "1200", prompt: "Pull request or commit ID", - type: "string" + type: "string", }, another: { description: "y/n", @@ -63,14 +74,19 @@ const schema = { prompt: "Add another feature?", type: "string", pattern: /^[yn]$/, - } - } + }, + }, }; // Build schema for (const prop in schema.properties) { const p = schema.properties[prop]; - p.description = "\n" + colors.white(p.description) + colors.cyan("\nExample: " + p.example) + "\n" + colors.green(p.prompt); + p.description = + "\n" + + colors.white(p.description) + + colors.cyan("\nExample: " + p.example) + + "\n" + + colors.green(p.prompt); } prompt.message = ""; @@ -83,7 +99,7 @@ const commitIDs = []; prompt.start(); -const getFeature = function() { +const getFeature = function () { prompt.get(schema, (err, result) => { if (err) { console.log("\nExiting script."); @@ -97,46 +113,75 @@ const getFeature = function() { } else { let message = `### [${newVersion[0]}.${newVersion[1]}.${newVersion[2]}] - ${date}\n`; - features.forEach(feature => { - const id = feature.id.length > 10 ? feature.id.slice(0, 7) : "#" + feature.id; + features.forEach((feature) => { + const id = + feature.id.length > 10 + ? feature.id.slice(0, 7) + : "#" + feature.id; message += `- ${feature.message} [@${feature.author}] | [${id}]\n`; if (!knownContributors.includes(feature.author)) { - authors.push(`[@${feature.author}]: https://github.com/${feature.author}`); + authors.push( + `[@${feature.author}]: https://github.com/${feature.author}`, + ); } if (feature.id.length > 10) { - commitIDs.push(`[${id}]: https://github.com/gchq/CyberChef/commit/${feature.id}`); + commitIDs.push( + `[${id}]: https://github.com/gchq/CyberChef/commit/${feature.id}`, + ); } else { - prIDs.push(`[#${feature.id}]: https://github.com/gchq/CyberChef/pull/${feature.id}`); + prIDs.push( + `[#${feature.id}]: https://github.com/gchq/CyberChef/pull/${feature.id}`, + ); } }); // Message - changelogData = changelogData.replace(/## Details\n\n/, "## Details\n\n" + message + "\n"); + changelogData = changelogData.replace( + /## Details\n\n/, + "## Details\n\n" + message + "\n", + ); // Tag const newTag = `[${newVersion[0]}.${newVersion[1]}.${newVersion[2]}]: https://github.com/gchq/CyberChef/releases/tag/v${newVersion[0]}.${newVersion[1]}.${newVersion[2]}\n`; - changelogData = changelogData.replace(/\n\n(\[\d+\.\d+\.\d+\]: https)/, "\n\n" + newTag + "$1"); + changelogData = changelogData.replace( + /\n\n(\[\d+\.\d+\.\d+\]: https)/, + "\n\n" + newTag + "$1", + ); // Author - authors.forEach(author => { - changelogData = changelogData.replace(/(\n\[@[^\]]+\]: https:\/\/github\.com\/[^\n]+\n)\n/, "$1" + author + "\n\n"); + authors.forEach((author) => { + changelogData = changelogData.replace( + /(\n\[@[^\]]+\]: https:\/\/github\.com\/[^\n]+\n)\n/, + "$1" + author + "\n\n", + ); }); // Commit IDs - commitIDs.forEach(commitID => { - changelogData = changelogData.replace(/(\n\[[^\].]+\]: https:\/\/github.com\/gchq\/CyberChef\/commit\/[^\n]+\n)\n/, "$1" + commitID + "\n\n"); + commitIDs.forEach((commitID) => { + changelogData = changelogData.replace( + /(\n\[[^\].]+\]: https:\/\/github.com\/gchq\/CyberChef\/commit\/[^\n]+\n)\n/, + "$1" + commitID + "\n\n", + ); }); // PR IDs - prIDs.forEach(prID => { - changelogData = changelogData.replace(/(\n\[#[^\]]+\]: https:\/\/github.com\/gchq\/CyberChef\/pull\/[^\n]+\n)\n*$/, "$1" + prID + "\n\n"); + prIDs.forEach((prID) => { + changelogData = changelogData.replace( + /(\n\[#[^\]]+\]: https:\/\/github.com\/gchq\/CyberChef\/pull\/[^\n]+\n)\n*$/, + "$1" + prID + "\n\n", + ); }); - fs.writeFileSync(path.join(process.cwd(), "CHANGELOG.md"), changelogData); + fs.writeFileSync( + path.join(process.cwd(), "CHANGELOG.md"), + changelogData, + ); - console.log("Written CHANGELOG.md\nCommit changes and then run `npm version minor`."); + console.log( + "Written CHANGELOG.md\nCommit changes and then run `npm version minor`.", + ); } }); }; diff --git a/src/core/config/scripts/newOperation.mjs b/src/core/config/scripts/newOperation.mjs index fddeff97..7a801a86 100644 --- a/src/core/config/scripts/newOperation.mjs +++ b/src/core/config/scripts/newOperation.mjs @@ -15,16 +15,27 @@ import fs from "fs"; import path from "path"; import EscapeString from "../../operations/EscapeString.mjs"; - const dir = path.join(process.cwd() + "/src/core/operations/"); if (!fs.existsSync(dir)) { console.log("\nCWD: " + process.cwd()); console.log("Error: newOperation.mjs should be run from the project root"); - console.log("Example> node --experimental-modules src/core/config/scripts/newOperation.mjs"); + console.log( + "Example> node --experimental-modules src/core/config/scripts/newOperation.mjs", + ); process.exit(1); } -const ioTypes = ["string", "byteArray", "number", "html", "ArrayBuffer", "BigNumber", "JSON", "File", "List"]; +const ioTypes = [ + "string", + "byteArray", + "number", + "html", + "ArrayBuffer", + "BigNumber", + "JSON", + "File", + "List", +]; const schema = { properties: { @@ -35,7 +46,8 @@ const schema = { type: "string", pattern: /^[\w\s-/().]+$/, required: true, - message: "Operation names should consist of letters, numbers or the following symbols: _-/()." + message: + "Operation names should consist of letters, numbers or the following symbols: _-/().", }, module: { description: `Modules are used to group operations that rely on large libraries. Any operation that is not in the Default module will be loaded in dynamically when it is first called. All operations in the same module will also be loaded at this time. This system prevents the CyberChef web app from getting too bloated and taking a long time to load initially. @@ -44,69 +56,89 @@ If your operation does not rely on a library, just leave this blank and it will prompt: "Module", type: "string", pattern: /^[A-Z][A-Za-z\d]+$/, - message: "Module names should start with a capital letter and not contain any spaces or symbols.", - default: "Default" + message: + "Module names should start with a capital letter and not contain any spaces or symbols.", + default: "Default", }, description: { - description: "The description should explain what the operation is and how it works. It can describe how the arguments should be entered and give examples of expected input and output. HTML markup is supported. Use tags for examples. The description is scanned during searches, so include terms that are likely to be searched for when someone is looking for your operation.", - example: "Converts URI/URL percent-encoded characters back to their raw values.

e.g. %3d becomes =", + description: + "The description should explain what the operation is and how it works. It can describe how the arguments should be entered and give examples of expected input and output. HTML markup is supported. Use tags for examples. The description is scanned during searches, so include terms that are likely to be searched for when someone is looking for your operation.", + example: + "Converts URI/URL percent-encoded characters back to their raw values.

e.g. %3d becomes =", prompt: "Description", - type: "string" + type: "string", }, infoURL: { - description: "An optional URL for an external site can be added to give more information about the operation. Wikipedia links are often suitable. If linking to Wikipedia, use an international link (e.g. https://wikipedia.org/...) rather than a localised link (e.g. https://en.wikipedia.org/...).", + description: + "An optional URL for an external site can be added to give more information about the operation. Wikipedia links are often suitable. If linking to Wikipedia, use an international link (e.g. https://wikipedia.org/...) rather than a localised link (e.g. https://en.wikipedia.org/...).", example: "https://wikipedia.org/wiki/Percent-encoding", prompt: "Information URL", type: "string", }, inputType: { - description: `The input type defines how the input data will be presented to your operation. Check the project wiki for a full description of each type. The options are: ${ioTypes.join(", ")}.`, + description: `The input type defines how the input data will be presented to your operation. Check the project wiki for a full description of each type. The options are: ${ioTypes.join( + ", ", + )}.`, example: "string", prompt: "Input type", type: "string", pattern: new RegExp(`^(${ioTypes.join("|")})$`), required: true, - message: `The input type should be one of: ${ioTypes.join(", ")}.` + message: `The input type should be one of: ${ioTypes.join(", ")}.`, }, outputType: { - description: `The output type tells CyberChef what sort of data you are returning from your operation. Check the project wiki for a full description of each type. The options are: ${ioTypes.join(", ")}.`, + description: `The output type tells CyberChef what sort of data you are returning from your operation. Check the project wiki for a full description of each type. The options are: ${ioTypes.join( + ", ", + )}.`, example: "string", prompt: "Output type", type: "string", pattern: new RegExp(`^(${ioTypes.join("|")})$`), required: true, - message: `The output type should be one of: ${ioTypes.join(", ")}.` + message: `The output type should be one of: ${ioTypes.join(", ")}.`, }, highlight: { - description: "If your operation does not change the length of the input in any way, we can enable highlighting. If it does change the length in a predictable way, we may still be able to enable highlighting and calculate the correct offsets. If this is not possible, we will disable highlighting for this operation.", + description: + "If your operation does not change the length of the input in any way, we can enable highlighting. If it does change the length in a predictable way, we may still be able to enable highlighting and calculate the correct offsets. If this is not possible, we will disable highlighting for this operation.", example: "true/false", prompt: "Enable highlighting", type: "boolean", default: "false", - message: "Enter true or false to specify if highlighting should be enabled." + message: + "Enter true or false to specify if highlighting should be enabled.", }, authorName: { - description: "Your name or username will be added to the @author tag for this operation.", + description: + "Your name or username will be added to the @author tag for this operation.", example: "n1474335", prompt: "Username", - type: "string" + type: "string", }, authorEmail: { - description: "Your email address will also be added to the @author tag for this operation.", + description: + "Your email address will also be added to the @author tag for this operation.", example: "n1474335@gmail.com", prompt: "Email", - type: "string" - } - } + type: "string", + }, + }, }; // Build schema for (const prop in schema.properties) { const p = schema.properties[prop]; - p.description = "\n" + colors.white(p.description) + colors.cyan("\nExample: " + p.example) + "\n" + colors.green(p.prompt); + p.description = + "\n" + + colors.white(p.description) + + colors.cyan("\nExample: " + p.example) + + "\n" + + colors.green(p.prompt); } -console.log("\n\nThis script will generate a new operation template based on the information you provide. These values can be changed manually later.".yellow); +console.log( + "\n\nThis script will generate a new operation template based on the information you provide. These values can be changed manually later." + .yellow, +); prompt.message = ""; prompt.delimiter = ":".green; @@ -119,14 +151,15 @@ prompt.get(schema, (err, result) => { process.exit(0); } - const moduleName = result.opName.replace(/\w\S*/g, txt => { - return txt.charAt(0).toUpperCase() + txt.substr(1); - }).replace(/[\s-()./]/g, ""); - + const moduleName = result.opName + .replace(/\w\S*/g, (txt) => { + return txt.charAt(0).toUpperCase() + txt.substr(1); + }) + .replace(/[\s-()./]/g, ""); const template = `/** * @author ${result.authorName} [${result.authorEmail}] - * @copyright Crown Copyright ${(new Date()).getFullYear()} + * @copyright Crown Copyright ${new Date().getFullYear()} * @license Apache-2.0 */ @@ -146,7 +179,10 @@ class ${moduleName} extends Operation { this.name = "${result.opName}"; this.module = "${result.module}"; - this.description = "${(new EscapeString).run(result.description, ["Special chars", "Double"])}"; + this.description = "${new EscapeString().run(result.description, [ + "Special chars", + "Double", + ])}"; this.infoURL = "${result.infoURL}"; this.inputType = "${result.inputType}"; this.outputType = "${result.outputType}"; @@ -176,7 +212,9 @@ class ${moduleName} extends Operation { throw new OperationError("Test"); } -${result.highlight ? ` +${ + result.highlight + ? ` /** * Highlight ${result.opName} * @@ -202,7 +240,9 @@ ${result.highlight ? ` highlightReverse(pos, args) { return pos; } -` : ""} +` + : "" +} } export default ${moduleName}; @@ -212,7 +252,9 @@ export default ${moduleName}; const filename = path.join(dir, `./${moduleName}.mjs`); if (fs.existsSync(filename)) { - console.log(`${filename} already exists. It has NOT been overwritten.`.red); + console.log( + `${filename} already exists. It has NOT been overwritten.`.red, + ); console.log("Choose a different operation name to avoid conflicts."); process.exit(0); } @@ -225,6 +267,4 @@ export default ${moduleName}; 3. Write tests in ${colors.green("tests/operations/tests/")} 4. Run ${colors.cyan("npm run lint")} and ${colors.cyan("npm run test")} 5. Submit a Pull Request to get your operation added to the official CyberChef repository.`); - }); - diff --git a/src/core/dishTypes/DishBigNumber.mjs b/src/core/dishTypes/DishBigNumber.mjs index 3bb8122c..89c82938 100644 --- a/src/core/dishTypes/DishBigNumber.mjs +++ b/src/core/dishTypes/DishBigNumber.mjs @@ -12,14 +12,15 @@ import BigNumber from "bignumber.js"; * translation methods for BigNumber Dishes */ class DishBigNumber extends DishType { - /** * convert the given value to a ArrayBuffer * @param {BigNumber} value */ static toArrayBuffer() { DishBigNumber.checkForValue(this.value); - this.value = BigNumber.isBigNumber(this.value) ? Utils.strToArrayBuffer(this.value.toFixed()) : new ArrayBuffer; + this.value = BigNumber.isBigNumber(this.value) + ? Utils.strToArrayBuffer(this.value.toFixed()) + : new ArrayBuffer(); } /** diff --git a/src/core/dishTypes/DishByteArray.mjs b/src/core/dishTypes/DishByteArray.mjs index 12a6d334..08b2d36d 100644 --- a/src/core/dishTypes/DishByteArray.mjs +++ b/src/core/dishTypes/DishByteArray.mjs @@ -10,7 +10,6 @@ import DishType from "./DishType.mjs"; * Translation methods for ArrayBuffer Dishes */ class DishByteArray extends DishType { - /** * convert the given value to a ArrayBuffer */ diff --git a/src/core/dishTypes/DishFile.mjs b/src/core/dishTypes/DishFile.mjs index a22df9e5..cef47a98 100644 --- a/src/core/dishTypes/DishFile.mjs +++ b/src/core/dishTypes/DishFile.mjs @@ -11,7 +11,6 @@ import Utils, { isNodeEnvironment } from "../Utils.mjs"; * Translation methods for file Dishes */ class DishFile extends DishType { - /** * convert the given value to an ArrayBuffer * @param {File} value @@ -23,7 +22,7 @@ class DishFile extends DishType { } else { return new Promise((resolve, reject) => { Utils.readFile(this.value) - .then(v => this.value = v.buffer) + .then((v) => (this.value = v.buffer)) .then(resolve) .catch(reject); }); diff --git a/src/core/dishTypes/DishHTML.mjs b/src/core/dishTypes/DishHTML.mjs index 854cacd0..92d32a1a 100644 --- a/src/core/dishTypes/DishHTML.mjs +++ b/src/core/dishTypes/DishHTML.mjs @@ -11,16 +11,18 @@ import Utils from "../Utils.mjs"; * Translation methods for HTML Dishes */ class DishHTML extends DishString { - /** * convert the given value to a ArrayBuffer * @param {String} value */ static toArrayBuffer() { DishHTML.checkForValue(this.value); - this.value = this.value ? Utils.strToArrayBuffer(Utils.unescapeHtml(Utils.stripHtmlTags(this.value, true))) : new ArrayBuffer; + this.value = this.value + ? Utils.strToArrayBuffer( + Utils.unescapeHtml(Utils.stripHtmlTags(this.value, true)), + ) + : new ArrayBuffer(); } - } export default DishHTML; diff --git a/src/core/dishTypes/DishJSON.mjs b/src/core/dishTypes/DishJSON.mjs index e1b32d64..47ca8ac6 100644 --- a/src/core/dishTypes/DishJSON.mjs +++ b/src/core/dishTypes/DishJSON.mjs @@ -11,13 +11,15 @@ import Utils from "../Utils.mjs"; * Translation methods for JSON dishes */ class DishJSON extends DishType { - /** * convert the given value to a ArrayBuffer */ static toArrayBuffer() { DishJSON.checkForValue(this.value); - this.value = this.value !== undefined ? Utils.strToArrayBuffer(JSON.stringify(this.value, null, 4)) : new ArrayBuffer; + this.value = + this.value !== undefined + ? Utils.strToArrayBuffer(JSON.stringify(this.value, null, 4)) + : new ArrayBuffer(); } /** diff --git a/src/core/dishTypes/DishListFile.mjs b/src/core/dishTypes/DishListFile.mjs index 9c34c151..ef89cba2 100644 --- a/src/core/dishTypes/DishListFile.mjs +++ b/src/core/dishTypes/DishListFile.mjs @@ -7,12 +7,10 @@ import DishType from "./DishType.mjs"; import Utils, { isNodeEnvironment } from "../Utils.mjs"; - /** * Translation methods for ListFile Dishes */ class DishListFile extends DishType { - /** * convert the given value to a ArrayBuffer */ @@ -20,9 +18,12 @@ class DishListFile extends DishType { DishListFile.checkForValue(this.value); if (isNodeEnvironment()) { - this.value = this.value.map(file => Uint8Array.from(file.data)); + this.value = this.value.map((file) => Uint8Array.from(file.data)); } else { - this.value = await DishListFile.concatenateTypedArraysWithTypedElements(...this.value); + this.value = + await DishListFile.concatenateTypedArraysWithTypedElements( + ...this.value, + ); } } diff --git a/src/core/dishTypes/DishNumber.mjs b/src/core/dishTypes/DishNumber.mjs index e3ea31b8..69f74cb6 100644 --- a/src/core/dishTypes/DishNumber.mjs +++ b/src/core/dishTypes/DishNumber.mjs @@ -4,7 +4,6 @@ * @license Apache-2.0 */ - import DishType from "./DishType.mjs"; import Utils from "../Utils.mjs"; @@ -12,13 +11,15 @@ import Utils from "../Utils.mjs"; * Translation methods for number dishes */ class DishNumber extends DishType { - /** * convert the given value to a ArrayBuffer */ static toArrayBuffer() { DishNumber.checkForValue(this.value); - this.value = typeof this.value === "number" ? Utils.strToArrayBuffer(this.value.toString()) : new ArrayBuffer; + this.value = + typeof this.value === "number" + ? Utils.strToArrayBuffer(this.value.toString()) + : new ArrayBuffer(); } /** @@ -26,7 +27,9 @@ class DishNumber extends DishType { */ static fromArrayBuffer() { DishNumber.checkForValue(this.value); - this.value = this.value ? parseFloat(Utils.arrayBufferToStr(this.value)) : 0; + this.value = this.value + ? parseFloat(Utils.arrayBufferToStr(this.value)) + : 0; } } diff --git a/src/core/dishTypes/DishString.mjs b/src/core/dishTypes/DishString.mjs index 7de8810d..b1387040 100644 --- a/src/core/dishTypes/DishString.mjs +++ b/src/core/dishTypes/DishString.mjs @@ -4,7 +4,6 @@ * @license Apache-2.0 */ - import DishType from "./DishType.mjs"; import Utils from "../Utils.mjs"; @@ -12,13 +11,14 @@ import Utils from "../Utils.mjs"; * Translation methods for string dishes */ class DishString extends DishType { - /** * convert the given value to a ArrayBuffer */ static toArrayBuffer() { DishString.checkForValue(this.value); - this.value = this.value ? Utils.strToArrayBuffer(this.value) : new ArrayBuffer; + this.value = this.value + ? Utils.strToArrayBuffer(this.value) + : new ArrayBuffer(); } /** diff --git a/src/core/dishTypes/DishType.mjs b/src/core/dishTypes/DishType.mjs index d89e3c0b..ad01e096 100644 --- a/src/core/dishTypes/DishType.mjs +++ b/src/core/dishTypes/DishType.mjs @@ -4,12 +4,10 @@ * @license Apache-2.0 */ - /** * Abstract class for dish translation methods */ class DishType { - /** * Warn translations dont work without value from bind */ diff --git a/src/core/dishTypes/index.mjs b/src/core/dishTypes/index.mjs index a3a500b0..528aafeb 100644 --- a/src/core/dishTypes/index.mjs +++ b/src/core/dishTypes/index.mjs @@ -4,7 +4,6 @@ * @license Apache-2.0 */ - import DishByteArray from "./DishByteArray.mjs"; import DishBigNumber from "./DishBigNumber.mjs"; import DishFile from "./DishFile.mjs"; diff --git a/src/core/errors/index.mjs b/src/core/errors/index.mjs index 6d96acb0..5db53880 100644 --- a/src/core/errors/index.mjs +++ b/src/core/errors/index.mjs @@ -2,8 +2,4 @@ import OperationError from "./OperationError.mjs"; import DishError from "./DishError.mjs"; import ExcludedOperationError from "./ExcludedOperationError.mjs"; -export { - OperationError, - DishError, - ExcludedOperationError, -}; +export { OperationError, DishError, ExcludedOperationError }; diff --git a/src/core/lib/Arithmetic.mjs b/src/core/lib/Arithmetic.mjs index 7c10855f..cef5782c 100644 --- a/src/core/lib/Arithmetic.mjs +++ b/src/core/lib/Arithmetic.mjs @@ -8,7 +8,6 @@ import Utils from "../Utils.mjs"; import BigNumber from "bignumber.js"; - /** * Converts a string array to a number array. * @@ -35,7 +34,6 @@ export function createNumArray(input, delim) { return numbers; } - /** * Adds an array of numbers and returns the value. * @@ -48,7 +46,6 @@ export function sum(data) { } } - /** * Subtracts an array of numbers and returns the value. * @@ -61,7 +58,6 @@ export function sub(data) { } } - /** * Multiplies an array of numbers and returns the value. * @@ -74,7 +70,6 @@ export function multi(data) { } } - /** * Divides an array of numbers and returns the value. * @@ -87,7 +82,6 @@ export function div(data) { } } - /** * Computes mean of a number array and returns the value. * @@ -100,7 +94,6 @@ export function mean(data) { } } - /** * Computes median of a number array and returns the value. * @@ -108,8 +101,8 @@ export function mean(data) { * @returns {BigNumber} */ export function median(data) { - if ((data.length % 2) === 0 && data.length > 0) { - data.sort(function(a, b) { + if (data.length % 2 === 0 && data.length > 0) { + data.sort(function (a, b) { return a.minus(b); }); const first = data[Math.floor(data.length / 2)]; @@ -120,7 +113,6 @@ export function median(data) { } } - /** * Computes standard deviation of a number array and returns the value. * diff --git a/src/core/lib/BCD.mjs b/src/core/lib/BCD.mjs index 2f245236..df78b252 100644 --- a/src/core/lib/BCD.mjs +++ b/src/core/lib/BCD.mjs @@ -33,13 +33,13 @@ export const ENCODING_SCHEME = [ * has not yet been added for this. */ export const ENCODING_LOOKUP = { - "8 4 2 1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], - "7 4 2 1": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], - "4 2 2 1": [0, 1, 4, 5, 8, 9, 12, 13, 14, 15], - "2 4 2 1": [0, 1, 2, 3, 4, 11, 12, 13, 14, 15], - "8 4 -2 -1": [0, 7, 6, 5, 4, 11, 10, 9, 8, 15], - "Excess-3": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12], - "IBM 8 4 2 1": [10, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "8 4 2 1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + "7 4 2 1": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], + "4 2 2 1": [0, 1, 4, 5, 8, 9, 12, 13, 14, 15], + "2 4 2 1": [0, 1, 2, 3, 4, 11, 12, 13, 14, 15], + "8 4 -2 -1": [0, 7, 6, 5, 4, 11, 10, 9, 8, 15], + "Excess-3": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12], + "IBM 8 4 2 1": [10, 1, 2, 3, 4, 5, 6, 7, 8, 9], }; /** diff --git a/src/core/lib/Bacon.mjs b/src/core/lib/Bacon.mjs index 241237cb..2418fd62 100644 --- a/src/core/lib/Bacon.mjs +++ b/src/core/lib/Bacon.mjs @@ -12,11 +12,14 @@ export const BACON_ALPHABETS = { "Standard (I=J and U=V)": { alphabet: "ABCDEFGHIKLMNOPQRSTUWXYZ", - codes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23] + codes: [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 19, 20, 21, 22, 23, + ], + }, + Complete: { + alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", }, - "Complete": { - alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - } }; export const BACON_TRANSLATION_01 = "0/1"; export const BACON_TRANSLATION_AB = "A/B"; @@ -30,7 +33,7 @@ export const BACON_TRANSLATIONS = [ ]; export const BACON_TRANSLATIONS_FOR_ENCODING = [ BACON_TRANSLATION_01, - BACON_TRANSLATION_AB + BACON_TRANSLATION_AB, ]; export const BACON_CLEARER_MAP = { [BACON_TRANSLATION_01]: /[^01]/g, @@ -39,10 +42,10 @@ export const BACON_CLEARER_MAP = { }; export const BACON_NORMALIZE_MAP = { [BACON_TRANSLATION_AB]: { - "A": "0", - "B": "1", - "a": "0", - "b": "1" + A: "0", + B: "1", + a: "0", + b: "1", }, }; @@ -59,8 +62,8 @@ export const BACON_NORMALIZE_MAP = { export function swapZeroAndOne(string) { return string.replace(/[01]/g, function (c) { return { - "0": "1", - "1": "0" + 0: "1", + 1: "0", }[c]; }); } diff --git a/src/core/lib/Base64.mjs b/src/core/lib/Base64.mjs index aeda98cf..3e8a7e22 100644 --- a/src/core/lib/Base64.mjs +++ b/src/core/lib/Base64.mjs @@ -23,7 +23,7 @@ import OperationError from "../errors/OperationError.mjs"; * // returns "SGVsbG8=" * toBase64("Hello"); */ -export function toBase64(data, alphabet="A-Za-z0-9+/=") { +export function toBase64(data, alphabet = "A-Za-z0-9+/=") { if (!data) return ""; if (typeof data == "string") { data = Utils.strToArrayBuffer(data); @@ -33,13 +33,21 @@ export function toBase64(data, alphabet="A-Za-z0-9+/=") { } alphabet = Utils.expandAlphRange(alphabet).join(""); - if (alphabet.length !== 64 && alphabet.length !== 65) { // Allow for padding - throw new OperationError(`Invalid Base64 alphabet length (${alphabet.length}): ${alphabet}`); + if (alphabet.length !== 64 && alphabet.length !== 65) { + // Allow for padding + throw new OperationError( + `Invalid Base64 alphabet length (${alphabet.length}): ${alphabet}`, + ); } let output = "", - chr1, chr2, chr3, - enc1, enc2, enc3, enc4, + chr1, + chr2, + chr3, + enc1, + enc2, + enc3, + enc4, i = 0; while (i < data.length) { @@ -58,14 +66,16 @@ export function toBase64(data, alphabet="A-Za-z0-9+/=") { enc4 = 64; } - output += alphabet.charAt(enc1) + alphabet.charAt(enc2) + - alphabet.charAt(enc3) + alphabet.charAt(enc4); + output += + alphabet.charAt(enc1) + + alphabet.charAt(enc2) + + alphabet.charAt(enc3) + + alphabet.charAt(enc4); } return output; } - /** * UnBase64's the input string using the given alphabet, returning a byte array. * @@ -82,7 +92,13 @@ export function toBase64(data, alphabet="A-Za-z0-9+/=") { * // returns [72, 101, 108, 108, 111] * fromBase64("SGVsbG8=", null, "byteArray"); */ -export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", removeNonAlphChars=true, strictMode=false) { +export function fromBase64( + data, + alphabet = "A-Za-z0-9+/=", + returnType = "string", + removeNonAlphChars = true, + strictMode = false, +) { if (!data) { return returnType === "string" ? "" : []; } @@ -91,42 +107,63 @@ export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", r alphabet = Utils.expandAlphRange(alphabet).join(""); // Confirm alphabet is a valid length - if (alphabet.length !== 64 && alphabet.length !== 65) { // Allow for padding - throw new OperationError(`Error: Base64 alphabet should be 64 characters long, or 65 with a padding character. Found ${alphabet.length}: ${alphabet}`); + if (alphabet.length !== 64 && alphabet.length !== 65) { + // Allow for padding + throw new OperationError( + `Error: Base64 alphabet should be 64 characters long, or 65 with a padding character. Found ${alphabet.length}: ${alphabet}`, + ); } // Remove non-alphabet characters if (removeNonAlphChars) { - const re = new RegExp("[^" + alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", "g"); + const re = new RegExp( + "[^" + alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", + "g", + ); data = data.replace(re, ""); } if (strictMode) { // Check for incorrect lengths (even without padding) if (data.length % 4 === 1) { - throw new OperationError(`Error: Invalid Base64 input length (${data.length}). Cannot be 4n+1, even without padding chars.`); + throw new OperationError( + `Error: Invalid Base64 input length (${data.length}). Cannot be 4n+1, even without padding chars.`, + ); } - if (alphabet.length === 65) { // Padding character included + if (alphabet.length === 65) { + // Padding character included const pad = alphabet.charAt(64); const padPos = data.indexOf(pad); if (padPos >= 0) { // Check that the padding character is only used at the end and maximum of twice - if (padPos < data.length - 2 || data.charAt(data.length - 1) !== pad) { - throw new OperationError(`Error: Base64 padding character (${pad}) not used in the correct place.`); + if ( + padPos < data.length - 2 || + data.charAt(data.length - 1) !== pad + ) { + throw new OperationError( + `Error: Base64 padding character (${pad}) not used in the correct place.`, + ); } // Check that input is padded to the correct length if (data.length % 4 !== 0) { - throw new OperationError("Error: Base64 not padded to a multiple of 4."); + throw new OperationError( + "Error: Base64 not padded to a multiple of 4.", + ); } } } } const output = []; - let chr1, chr2, chr3, - enc1, enc2, enc3, enc4, + let chr1, + chr2, + chr3, + enc1, + enc2, + enc3, + enc4, i = 0; while (i < data.length) { @@ -137,7 +174,9 @@ export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", r enc4 = alphabet.indexOf(data.charAt(i++) || null); if (strictMode && (enc1 < 0 || enc2 < 0 || enc3 < 0 || enc4 < 0)) { - throw new OperationError("Error: Base64 input contains non-alphabet char(s)"); + throw new OperationError( + "Error: Base64 input contains non-alphabet char(s)", + ); } chr1 = (enc1 << 2) | (enc2 >> 4); @@ -158,26 +197,40 @@ export function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", r return returnType === "string" ? Utils.byteArrayToUtf8(output) : output; } - /** * Base64 alphabets. */ export const ALPHABET_OPTIONS = [ - {name: "Standard (RFC 4648): A-Za-z0-9+/=", value: "A-Za-z0-9+/="}, - {name: "URL safe (RFC 4648 \u00A75): A-Za-z0-9-_", value: "A-Za-z0-9-_"}, - {name: "Filename safe: A-Za-z0-9+-=", value: "A-Za-z0-9+\\-="}, - {name: "itoa64: ./0-9A-Za-z=", value: "./0-9A-Za-z="}, - {name: "XML: A-Za-z0-9_.", value: "A-Za-z0-9_."}, - {name: "y64: A-Za-z0-9._-", value: "A-Za-z0-9._-"}, - {name: "z64: 0-9a-zA-Z+/=", value: "0-9a-zA-Z+/="}, - {name: "Radix-64 (RFC 4880): 0-9A-Za-z+/=", value: "0-9A-Za-z+/="}, - {name: "Uuencoding: [space]-_", value: " -_"}, - {name: "Xxencoding: +-0-9A-Za-z", value: "+\\-0-9A-Za-z"}, - {name: "BinHex: !-,-0-689@A-NP-VX-Z[`a-fh-mp-r", value: "!-,-0-689@A-NP-VX-Z[`a-fh-mp-r"}, - {name: "ROT13: N-ZA-Mn-za-m0-9+/=", value: "N-ZA-Mn-za-m0-9+/="}, - {name: "UNIX crypt: ./0-9A-Za-z", value: "./0-9A-Za-z"}, - {name: "Atom128: /128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC", value: "/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC"}, - {name: "Megan35: 3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5", value: "3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5"}, - {name: "Zong22: ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2", value: "ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2"}, - {name: "Hazz15: HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5", value: "HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5"} + { name: "Standard (RFC 4648): A-Za-z0-9+/=", value: "A-Za-z0-9+/=" }, + { name: "URL safe (RFC 4648 \u00A75): A-Za-z0-9-_", value: "A-Za-z0-9-_" }, + { name: "Filename safe: A-Za-z0-9+-=", value: "A-Za-z0-9+\\-=" }, + { name: "itoa64: ./0-9A-Za-z=", value: "./0-9A-Za-z=" }, + { name: "XML: A-Za-z0-9_.", value: "A-Za-z0-9_." }, + { name: "y64: A-Za-z0-9._-", value: "A-Za-z0-9._-" }, + { name: "z64: 0-9a-zA-Z+/=", value: "0-9a-zA-Z+/=" }, + { name: "Radix-64 (RFC 4880): 0-9A-Za-z+/=", value: "0-9A-Za-z+/=" }, + { name: "Uuencoding: [space]-_", value: " -_" }, + { name: "Xxencoding: +-0-9A-Za-z", value: "+\\-0-9A-Za-z" }, + { + name: "BinHex: !-,-0-689@A-NP-VX-Z[`a-fh-mp-r", + value: "!-,-0-689@A-NP-VX-Z[`a-fh-mp-r", + }, + { name: "ROT13: N-ZA-Mn-za-m0-9+/=", value: "N-ZA-Mn-za-m0-9+/=" }, + { name: "UNIX crypt: ./0-9A-Za-z", value: "./0-9A-Za-z" }, + { + name: "Atom128: /128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC", + value: "/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC", + }, + { + name: "Megan35: 3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5", + value: "3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5", + }, + { + name: "Zong22: ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2", + value: "ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2", + }, + { + name: "Hazz15: HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5", + value: "HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5", + }, ]; diff --git a/src/core/lib/Base85.mjs b/src/core/lib/Base85.mjs index e5778132..8b3909e5 100644 --- a/src/core/lib/Base85.mjs +++ b/src/core/lib/Base85.mjs @@ -23,10 +23,9 @@ export const ALPHABET_OPTIONS = [ { name: "IPv6", value: "0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~", - } + }, ]; - /** * Returns the name of the alphabet, when given the alphabet. * @@ -37,7 +36,7 @@ export function alphabetName(alphabet) { alphabet = escape(alphabet); let name; - ALPHABET_OPTIONS.forEach(function(a) { + ALPHABET_OPTIONS.forEach(function (a) { const expanded = Utils.expandAlphRange(a.value).join(""); if (alphabet === escape(expanded)) name = a.name; }); diff --git a/src/core/lib/Base92.mjs b/src/core/lib/Base92.mjs index 902c3e7d..0b64650f 100644 --- a/src/core/lib/Base92.mjs +++ b/src/core/lib/Base92.mjs @@ -18,12 +18,9 @@ export function base92Chr(val) { if (val < 0 || val >= 91) { throw new OperationError("Invalid value"); } - if (val === 0) - return "!".charCodeAt(0); - else if (val <= 61) - return "#".charCodeAt(0) + val - 1; - else - return "a".charCodeAt(0) + val - 62; + if (val === 0) return "!".charCodeAt(0); + else if (val <= 61) return "#".charCodeAt(0) + val - 1; + else return "a".charCodeAt(0) + val - 62; } /** @@ -33,12 +30,10 @@ export function base92Chr(val) { * @returns {number} */ export function base92Ord(val) { - if (val === "!") - return 0; + if (val === "!") return 0; else if ("#" <= val && val <= "_") return val.charCodeAt(0) - "#".charCodeAt(0) + 1; else if ("a" <= val && val <= "}") return val.charCodeAt(0) - "a".charCodeAt(0) + 62; throw new OperationError(`${val} is not a base92 character`); } - diff --git a/src/core/lib/Binary.mjs b/src/core/lib/Binary.mjs index 072000db..1532971a 100644 --- a/src/core/lib/Binary.mjs +++ b/src/core/lib/Binary.mjs @@ -9,7 +9,6 @@ import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; - /** * Convert a byte array into a binary string. * @@ -28,19 +27,23 @@ import OperationError from "../errors/OperationError.mjs"; * // returns "1010:10100:11110" * toBinary([10,20,30], "Colon", 0); */ -export function toBinary(data, delim="Space", padding=8) { +export function toBinary(data, delim = "Space", padding = 8) { if (data === undefined || data === null) - throw new OperationError("Unable to convert to binary: Empty input data enocuntered"); + throw new OperationError( + "Unable to convert to binary: Empty input data enocuntered", + ); delim = Utils.charRep(delim); let output = ""; - if (data.length) { // array + if (data.length) { + // array for (let i = 0; i < data.length; i++) { output += data[i].toString(2).padStart(padding, "0"); if (i !== data.length - 1) output += delim; } - } else if (typeof data === "number") { // Single value + } else if (typeof data === "number") { + // Single value return data.toString(2).padStart(padding, "0"); } else { return ""; @@ -48,7 +51,6 @@ export function toBinary(data, delim="Space", padding=8) { return output; } - /** * Convert a binary string into a byte array. * @@ -64,7 +66,7 @@ export function toBinary(data, delim="Space", padding=8) { * // returns [10,20,30] * fromBinary("00001010:00010100:00011110", "Colon"); */ -export function fromBinary(data, delim="Space", byteLen=8) { +export function fromBinary(data, delim = "Space", byteLen = 8) { if (byteLen < 1 || Math.round(byteLen) !== byteLen) throw new OperationError("Byte length must be a positive integer"); @@ -77,4 +79,3 @@ export function fromBinary(data, delim="Space", byteLen=8) { } return output; } - diff --git a/src/core/lib/BitwiseOp.mjs b/src/core/lib/BitwiseOp.mjs index 516a816b..9d6b11dc 100644 --- a/src/core/lib/BitwiseOp.mjs +++ b/src/core/lib/BitwiseOp.mjs @@ -16,7 +16,7 @@ * @param {string} scheme * @returns {byteArray} */ -export function bitOp (input, key, func, nullPreserving, scheme) { +export function bitOp(input, key, func, nullPreserving, scheme) { if (!key || !key.length) key = [0]; const result = []; let x = null, @@ -29,9 +29,11 @@ export function bitOp (input, key, func, nullPreserving, scheme) { o = input[i]; x = nullPreserving && (o === 0 || o === k) ? o : func(o, k); result.push(x); - if (scheme && + if ( + scheme && scheme !== "Standard" && - !(nullPreserving && (o === 0 || o === k))) { + !(nullPreserving && (o === 0 || o === k)) + ) { switch (scheme) { case "Input differential": key[i % key.length] = o; @@ -57,7 +59,6 @@ export function xor(operand, key) { return operand ^ key; } - /** * NOT bitwise calculation. * @@ -68,7 +69,6 @@ export function not(operand, _) { return ~operand & 0xff; } - /** * AND bitwise calculation. * @@ -80,7 +80,6 @@ export function and(operand, key) { return operand & key; } - /** * OR bitwise calculation. * @@ -92,7 +91,6 @@ export function or(operand, key) { return operand | key; } - /** * ADD bitwise calculation. * @@ -104,7 +102,6 @@ export function add(operand, key) { return (operand + key) % 256; } - /** * SUB bitwise calculation. * @@ -114,11 +111,17 @@ export function add(operand, key) { */ export function sub(operand, key) { const result = operand - key; - return (result < 0) ? 256 + result : result; + return result < 0 ? 256 + result : result; } - /** * Delimiter options for bitwise operations */ -export const BITWISE_OP_DELIMS = ["Hex", "Decimal", "Binary", "Base64", "UTF8", "Latin1"]; +export const BITWISE_OP_DELIMS = [ + "Hex", + "Decimal", + "Binary", + "Base64", + "UTF8", + "Latin1", +]; diff --git a/src/core/lib/Blowfish.mjs b/src/core/lib/Blowfish.mjs index efe2e2dc..602bbbc4 100644 --- a/src/core/lib/Blowfish.mjs +++ b/src/core/lib/Blowfish.mjs @@ -40,48 +40,47 @@ const crypto = {}; import forge from "node-forge"; - /* dojo-release-1.8.1/dojo/_base/lang.js.uncompressed.js */ const lang = {}; -lang.isString = function(it) { - // summary: - // Return true if it is a String - // it: anything - // Item to test. - return (typeof it == "string" || it instanceof String); // Boolean +lang.isString = function (it) { + // summary: + // Return true if it is a String + // it: anything + // Item to test. + return typeof it == "string" || it instanceof String; // Boolean }; - /* dojo-release-1.8.1/dojo/_base/array.js.uncompressed.js */ const arrayUtil = {}; -arrayUtil.map = function(arr, callback, thisObject, Ctr) { - // summary: - // applies callback to each element of arr and returns - // an Array with the results - // arr: Array|String - // the array to iterate on. If a string, operates on - // individual characters. - // callback: Function - // a function is invoked with three arguments, (item, index, - // array), and returns a value - // thisObject: Object? - // may be used to scope the call to callback - // returns: Array - // description: - // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when - // run over sparse arrays, this implementation passes the "holes" in the sparse array to - // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array. - // For more details, see: - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map - // example: - // | // returns [2, 3, 4, 5] - // | array.map([1, 2, 3, 4], function(item){ return item+1 }); +arrayUtil.map = function (arr, callback, thisObject, Ctr) { + // summary: + // applies callback to each element of arr and returns + // an Array with the results + // arr: Array|String + // the array to iterate on. If a string, operates on + // individual characters. + // callback: Function + // a function is invoked with three arguments, (item, index, + // array), and returns a value + // thisObject: Object? + // may be used to scope the call to callback + // returns: Array + // description: + // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when + // run over sparse arrays, this implementation passes the "holes" in the sparse array to + // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array. + // For more details, see: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map + // example: + // | // returns [2, 3, 4, 5] + // | array.map([1, 2, 3, 4], function(item){ return item+1 }); - // TODO: why do we have a non-standard signature here? do we need "Ctr"? + // TODO: why do we have a non-standard signature here? do we need "Ctr"? let i = 0; - const l = arr && arr.length || 0, out = new (Ctr || Array)(l); + const l = (arr && arr.length) || 0, + out = new (Ctr || Array)(l); if (l && typeof arr == "string") arr = arr.split(""); if (thisObject) { for (; i < l; ++i) { @@ -102,332 +101,394 @@ arrayUtil.map = function(arr, callback, thisObject, Ctr) { * Unsigned math based on Paul Johnstone and Peter Wood patches. * 2005-12-08 */ -const boxes={ +const boxes = { p: [ - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, - 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, - 0x9216d5d9, 0x8979fb1b + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, + 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b, ], s0: [ - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, - 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, - 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, - 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, - 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, - 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, - 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, - 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, - 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, - 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, - 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, - 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, - 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, - 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, - 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, - 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, - 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, - 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, - 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, - 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, - 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, - 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, - 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, - 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, - 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, - 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, + 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, + 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, + 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, + 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, + 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, + 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, + 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, + 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, + 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, + 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, + 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, + 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, + 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, + 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, + 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, + 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, + 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, + 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, + 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, + 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, + 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, ], s1: [ - 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, - 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, - 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, - 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, - 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, - 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, - 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, - 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, - 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, - 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, - 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, - 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, - 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, - 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, - 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, - 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, - 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, - 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, - 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, - 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, - 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, - 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, - 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, - 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, - 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, - 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, + 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, + 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, + 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, + 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, + 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, + 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, + 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, + 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, + 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, + 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, + 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, + 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, + 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, + 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, + 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, + 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, + 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, + 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, + 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, + 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, + 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, ], s2: [ - 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, - 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, - 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, - 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, - 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, - 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, - 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, - 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, - 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, - 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, - 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, - 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, - 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, - 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, - 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, - 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, - 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, - 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, - 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, - 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, - 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, - 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, - 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, - 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, - 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, + 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, + 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, + 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, + 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, + 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, + 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, + 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, + 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, + 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, + 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, + 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, + 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, + 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, + 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, + 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, + 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, + 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, + 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, + 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, + 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, + 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, ], s3: [ - 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, - 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, - 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, - 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, - 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, - 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, - 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, - 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, - 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, - 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, - 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, - 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, - 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, - 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, - 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, - 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, - 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, - 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, - 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, - 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, - 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, - 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, - 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, - 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, - 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, - 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 - ] + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, + 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, + 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, + 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, + 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, + 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, + 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, + 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, + 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, + 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, + 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, + 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, + 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, + 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, + 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, + 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, + 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, + 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, + 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, + 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, + 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, + 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, + ], }; - //////////////////////////////////////////////////////////////////////////// // fixes based on patch submitted by Peter Wood (#5791) -const xor = function(x, y) { - return (((x>>0x10)^(y>>0x10))<<0x10)|(((x&0xffff)^(y&0xffff))&0xffff); +const xor = function (x, y) { + return ( + (((x >> 0x10) ^ (y >> 0x10)) << 0x10) | + (((x & 0xffff) ^ (y & 0xffff)) & 0xffff) + ); }; +const f = function (v, box) { + const d = box.s3[v & 0xff]; + v >>= 8; + const c = box.s2[v & 0xff]; + v >>= 8; + const b = box.s1[v & 0xff]; + v >>= 8; + const a = box.s0[v & 0xff]; -const f = function(v, box) { - const d=box.s3[v&0xff]; v>>=8; - const c=box.s2[v&0xff]; v>>=8; - const b=box.s1[v&0xff]; v>>=8; - const a=box.s0[v&0xff]; - - let r = (((a>>0x10)+(b>>0x10)+(((a&0xffff)+(b&0xffff))>>0x10))<<0x10)|(((a&0xffff)+(b&0xffff))&0xffff); - r = (((r>>0x10)^(c>>0x10))<<0x10)|(((r&0xffff)^(c&0xffff))&0xffff); - return (((r>>0x10)+(d>>0x10)+(((r&0xffff)+(d&0xffff))>>0x10))<<0x10)|(((r&0xffff)+(d&0xffff))&0xffff); + let r = + (((a >> 0x10) + + (b >> 0x10) + + (((a & 0xffff) + (b & 0xffff)) >> 0x10)) << + 0x10) | + (((a & 0xffff) + (b & 0xffff)) & 0xffff); + r = + (((r >> 0x10) ^ (c >> 0x10)) << 0x10) | + (((r & 0xffff) ^ (c & 0xffff)) & 0xffff); + return ( + (((r >> 0x10) + + (d >> 0x10) + + (((r & 0xffff) + (d & 0xffff)) >> 0x10)) << + 0x10) | + (((r & 0xffff) + (d & 0xffff)) & 0xffff) + ); }; - -const eb = function(o, box) { - // TODO: see if this can't be made more efficient - let l=o.left; - let r=o.right; - l=xor(l, box.p[0]); - r=xor(r, xor(f(l, box), box.p[1])); - l=xor(l, xor(f(r, box), box.p[2])); - r=xor(r, xor(f(l, box), box.p[3])); - l=xor(l, xor(f(r, box), box.p[4])); - r=xor(r, xor(f(l, box), box.p[5])); - l=xor(l, xor(f(r, box), box.p[6])); - r=xor(r, xor(f(l, box), box.p[7])); - l=xor(l, xor(f(r, box), box.p[8])); - r=xor(r, xor(f(l, box), box.p[9])); - l=xor(l, xor(f(r, box), box.p[10])); - r=xor(r, xor(f(l, box), box.p[11])); - l=xor(l, xor(f(r, box), box.p[12])); - r=xor(r, xor(f(l, box), box.p[13])); - l=xor(l, xor(f(r, box), box.p[14])); - r=xor(r, xor(f(l, box), box.p[15])); - l=xor(l, xor(f(r, box), box.p[16])); - o.right=l; - o.left=xor(r, box.p[17]); +const eb = function (o, box) { + // TODO: see if this can't be made more efficient + let l = o.left; + let r = o.right; + l = xor(l, box.p[0]); + r = xor(r, xor(f(l, box), box.p[1])); + l = xor(l, xor(f(r, box), box.p[2])); + r = xor(r, xor(f(l, box), box.p[3])); + l = xor(l, xor(f(r, box), box.p[4])); + r = xor(r, xor(f(l, box), box.p[5])); + l = xor(l, xor(f(r, box), box.p[6])); + r = xor(r, xor(f(l, box), box.p[7])); + l = xor(l, xor(f(r, box), box.p[8])); + r = xor(r, xor(f(l, box), box.p[9])); + l = xor(l, xor(f(r, box), box.p[10])); + r = xor(r, xor(f(l, box), box.p[11])); + l = xor(l, xor(f(r, box), box.p[12])); + r = xor(r, xor(f(l, box), box.p[13])); + l = xor(l, xor(f(r, box), box.p[14])); + r = xor(r, xor(f(l, box), box.p[15])); + l = xor(l, xor(f(r, box), box.p[16])); + o.right = l; + o.left = xor(r, box.p[17]); }; -const db = function(o, box) { - let l=o.left; - let r=o.right; - l=xor(l, box.p[17]); - r=xor(r, xor(f(l, box), box.p[16])); - l=xor(l, xor(f(r, box), box.p[15])); - r=xor(r, xor(f(l, box), box.p[14])); - l=xor(l, xor(f(r, box), box.p[13])); - r=xor(r, xor(f(l, box), box.p[12])); - l=xor(l, xor(f(r, box), box.p[11])); - r=xor(r, xor(f(l, box), box.p[10])); - l=xor(l, xor(f(r, box), box.p[9])); - r=xor(r, xor(f(l, box), box.p[8])); - l=xor(l, xor(f(r, box), box.p[7])); - r=xor(r, xor(f(l, box), box.p[6])); - l=xor(l, xor(f(r, box), box.p[5])); - r=xor(r, xor(f(l, box), box.p[4])); - l=xor(l, xor(f(r, box), box.p[3])); - r=xor(r, xor(f(l, box), box.p[2])); - l=xor(l, xor(f(r, box), box.p[1])); - o.right=l; - o.left=xor(r, box.p[0]); +const db = function (o, box) { + let l = o.left; + let r = o.right; + l = xor(l, box.p[17]); + r = xor(r, xor(f(l, box), box.p[16])); + l = xor(l, xor(f(r, box), box.p[15])); + r = xor(r, xor(f(l, box), box.p[14])); + l = xor(l, xor(f(r, box), box.p[13])); + r = xor(r, xor(f(l, box), box.p[12])); + l = xor(l, xor(f(r, box), box.p[11])); + r = xor(r, xor(f(l, box), box.p[10])); + l = xor(l, xor(f(r, box), box.p[9])); + r = xor(r, xor(f(l, box), box.p[8])); + l = xor(l, xor(f(r, box), box.p[7])); + r = xor(r, xor(f(l, box), box.p[6])); + l = xor(l, xor(f(r, box), box.p[5])); + r = xor(r, xor(f(l, box), box.p[4])); + l = xor(l, xor(f(r, box), box.p[3])); + r = xor(r, xor(f(l, box), box.p[2])); + l = xor(l, xor(f(r, box), box.p[1])); + o.right = l; + o.left = xor(r, box.p[0]); }; -const encryptBlock=function(inblock, outblock, box) { +const encryptBlock = function (inblock, outblock, box) { const o = {}; - o.left=inblock[0]; - o.right=inblock[1]; + o.left = inblock[0]; + o.right = inblock[1]; eb(o, box); outblock[0] = o.left; outblock[1] = o.right; }; -const decryptBlock=function(inblock, outblock, box) { - const o= {}; - o.left=inblock[0]; - o.right=inblock[1]; +const decryptBlock = function (inblock, outblock, box) { + const o = {}; + o.left = inblock[0]; + o.right = inblock[1]; db(o, box); outblock[0] = o.left; outblock[1] = o.right; }; -crypto.Blowfish = new function() { - this.createCipher=function(key, modeName) { +crypto.Blowfish = new (function () { + this.createCipher = function (key, modeName) { return new forge.cipher.BlockCipher({ algorithm: new Blowfish.Algorithm(key, modeName), key: key, - decrypt: false + decrypt: false, }); }; - this.createDecipher=function(key, modeName) { + this.createDecipher = function (key, modeName) { return new forge.cipher.BlockCipher({ algorithm: new Blowfish.Algorithm(key, modeName), key: key, - decrypt: true + decrypt: true, }); }; -}(); +})(); - -crypto.Blowfish.Algorithm=function(key, modeName) { - this.initialize({key: key}); +crypto.Blowfish.Algorithm = function (key, modeName) { + this.initialize({ key: key }); const _box = this.box; const modeOption = { blockSize: 8, cipher: { - encrypt: function(inblock, outblock) { + encrypt: function (inblock, outblock) { encryptBlock(inblock, outblock, _box); }, - decrypt: function(inblock, outblock) { + decrypt: function (inblock, outblock) { decryptBlock(inblock, outblock, _box); }, - } + }, }; switch (modeName.toLowerCase()) { case "ecb": - this.mode=new forge.cipher.modes.ecb(modeOption); + this.mode = new forge.cipher.modes.ecb(modeOption); break; case "cbc": - this.mode=new forge.cipher.modes.cbc(modeOption); + this.mode = new forge.cipher.modes.cbc(modeOption); break; case "cfb": - this.mode=new forge.cipher.modes.cfb(modeOption); + this.mode = new forge.cipher.modes.cfb(modeOption); break; case "ofb": - this.mode=new forge.cipher.modes.ofb(modeOption); + this.mode = new forge.cipher.modes.ofb(modeOption); break; case "ctr": - this.mode=new forge.cipher.modes.ctr(modeOption); + this.mode = new forge.cipher.modes.ctr(modeOption); break; default: - this.mode=new forge.cipher.modes.ecb(modeOption); + this.mode = new forge.cipher.modes.ecb(modeOption); break; } - }; -crypto.Blowfish.Algorithm.prototype.initialize=function(options) { - const POW8=Math.pow(2, 8); +crypto.Blowfish.Algorithm.prototype.initialize = function (options) { + const POW8 = Math.pow(2, 8); - let k=options.key; + let k = options.key; if (lang.isString(k)) { - k = arrayUtil.map(k.split(""), function(item) { + k = arrayUtil.map(k.split(""), function (item) { return item.charCodeAt(0) & 0xff; }); } - // init the boxes - let pos=0, data=0; - const res={ left: 0, right: 0 }; + // init the boxes + let pos = 0, + data = 0; + const res = { left: 0, right: 0 }; const box = { - p: arrayUtil.map(boxes.p.slice(0), function(item) { - const l=k.length; - for (let j=0; j<4; j++) { - data=(data*POW8)|k[pos++ % l]; + p: arrayUtil.map(boxes.p.slice(0), function (item) { + const l = k.length; + for (let j = 0; j < 4; j++) { + data = (data * POW8) | k[pos++ % l]; } - return (((item>>0x10)^(data>>0x10))<<0x10)|(((item&0xffff)^(data&0xffff))&0xffff); + return ( + (((item >> 0x10) ^ (data >> 0x10)) << 0x10) | + (((item & 0xffff) ^ (data & 0xffff)) & 0xffff) + ); }), s0: boxes.s0.slice(0), s1: boxes.s1.slice(0), s2: boxes.s2.slice(0), - s3: boxes.s3.slice(0) + s3: boxes.s3.slice(0), }; - // encrypt p and the s boxes - for (let i=0, l=box.p.length; i 3) { - this.update(this.nLoops, stops, i/nChecks); + this.update(this.nLoops, stops, i / nChecks); } } return result; diff --git a/src/core/lib/Braille.mjs b/src/core/lib/Braille.mjs index 098c0e73..d7fef714 100644 --- a/src/core/lib/Braille.mjs +++ b/src/core/lib/Braille.mjs @@ -11,5 +11,5 @@ */ export const BRAILLE_LOOKUP = { ascii: " A1B'K2L@CIF/MSP\"E3H9O6R^DJG>NTQ,*5<-U8V.%[$+X!&;:4\\0Z7(_?W]#Y)=", - dot6: "⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿" + dot6: "⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿", }; diff --git a/src/core/lib/CanvasComponents.mjs b/src/core/lib/CanvasComponents.mjs index 183dd040..76ca7c90 100644 --- a/src/core/lib/CanvasComponents.mjs +++ b/src/core/lib/CanvasComponents.mjs @@ -34,7 +34,15 @@ export function drawLine(ctx, startX, startY, endX, endY) { * @param numYLabels * @param fontSize */ -export function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels, numYLabels, fontSize) { +export function drawBarChart( + canvas, + scores, + xAxisLabel, + yAxisLabel, + numXLabels, + numYLabels, + fontSize, +) { fontSize = fontSize || 15; if (!numXLabels || numXLabels > Math.round(canvas.width / 50)) { numXLabels = Math.round(canvas.width / 50); @@ -64,14 +72,14 @@ export function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels, // Bar properties const barPadding = graphWidth * 0.003, - barWidth = (graphWidth - (barPadding * scores.length)) / scores.length, + barWidth = (graphWidth - barPadding * scores.length) / scores.length, max = Math.max.apply(Math, scores); let currX = leftPadding + barPadding; // Draw bars ctx.fillStyle = "green"; for (let i = 0; i < scores.length; i++) { - const h = scores[i] / max * graphHeight; + const h = (scores[i] / max) * graphHeight; ctx.fillRect(currX, base - h, barWidth, h); currX += barWidth + barPadding; } @@ -83,7 +91,7 @@ export function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels, if (numXLabels >= scores.length) { // Mark every score for (let i = 0; i <= scores.length; i++) { - ctx.fillText(i, currX, base + (bottomPadding * 0.3)); + ctx.fillText(i, currX, base + bottomPadding * 0.3); currX += barWidth + barPadding; } } else { @@ -91,7 +99,7 @@ export function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels, for (let i = 0; i <= numXLabels; i++) { const val = Math.ceil((scores.length / numXLabels) * i); currX = (graphWidth / numXLabels) * i + leftPadding; - ctx.fillText(val, currX, base + (bottomPadding * 0.3)); + ctx.fillText(val, currX, base + bottomPadding * 0.3); } } @@ -101,14 +109,14 @@ export function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels, if (numYLabels >= max) { // Mark every increment for (let i = 0; i <= max; i++) { - currY = base - (i / max * graphHeight) + fontSize / 3; + currY = base - (i / max) * graphHeight + fontSize / 3; ctx.fillText(i, leftPadding * 0.8, currY); } } else { // Mark some increments for (let i = 0; i <= numYLabels; i++) { const val = Math.ceil((max / numYLabels) * i); - currY = base - (val / max * graphHeight) + fontSize / 3; + currY = base - (val / max) * graphHeight + fontSize / 3; ctx.fillText(val, leftPadding * 0.8, currY); } } @@ -116,7 +124,11 @@ export function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels, // Label x axis if (xAxisLabel) { ctx.textAlign = "center"; - ctx.fillText(xAxisLabel, graphWidth / 2 + leftPadding, base + bottomPadding * 0.8); + ctx.fillText( + xAxisLabel, + graphWidth / 2 + leftPadding, + base + bottomPadding * 0.8, + ); } // Label y axis @@ -157,7 +169,12 @@ export function drawScaleBar(canvas, score, max, markings) { ctx.strokeRect(leftPadding, topPadding, barWidth, barHeight); // Shade in up to proportion - const grad = ctx.createLinearGradient(leftPadding, 0, barWidth + leftPadding, 0); + const grad = ctx.createLinearGradient( + leftPadding, + 0, + barWidth + leftPadding, + 0, + ); grad.addColorStop(0, "green"); grad.addColorStop(0.5, "gold"); grad.addColorStop(1, "red"); @@ -171,21 +188,21 @@ export function drawScaleBar(canvas, score, max, markings) { ctx.font = "13px Arial"; for (let i = 0; i < markings.length; i++) { // Draw min line down - x0 = barWidth / max * markings[i].min + leftPadding; - y0 = topPadding + barHeight + (bottomPadding * 0.1); + x0 = (barWidth / max) * markings[i].min + leftPadding; + y0 = topPadding + barHeight + bottomPadding * 0.1; x1 = x0; - y1 = topPadding + barHeight + (bottomPadding * 0.3); + y1 = topPadding + barHeight + bottomPadding * 0.3; drawLine(ctx, x0, y0, x1, y1); // Draw max line down - x0 = barWidth / max * markings[i].max + leftPadding; + x0 = (barWidth / max) * markings[i].max + leftPadding; x1 = x0; drawLine(ctx, x0, y0, x1, y1); // Join min and max lines - x0 = barWidth / max * markings[i].min + leftPadding; - y0 = topPadding + barHeight + (bottomPadding * 0.3); - x1 = barWidth / max * markings[i].max + leftPadding; + x0 = (barWidth / max) * markings[i].min + leftPadding; + y0 = topPadding + barHeight + bottomPadding * 0.3; + x1 = (barWidth / max) * markings[i].max + leftPadding; y1 = y0; drawLine(ctx, x0, y0, x1, y1); @@ -198,7 +215,7 @@ export function drawScaleBar(canvas, score, max, markings) { } else { x0 = x0 + (x1 - x0) / 2; } - y0 = topPadding + barHeight + (bottomPadding * 0.8); + y0 = topPadding + barHeight + bottomPadding * 0.8; ctx.fillText(markings[i].label, x0, y0); } } diff --git a/src/core/lib/Charts.mjs b/src/core/lib/Charts.mjs index 6cb63f60..b10cd167 100644 --- a/src/core/lib/Charts.mjs +++ b/src/core/lib/Charts.mjs @@ -14,13 +14,17 @@ import Utils from "../Utils.mjs"; */ export const RECORD_DELIMITER_OPTIONS = ["Line feed", "CRLF"]; - /** * @constant * @default */ -export const FIELD_DELIMITER_OPTIONS = ["Space", "Comma", "Semi-colon", "Colon", "Tab"]; - +export const FIELD_DELIMITER_OPTIONS = [ + "Space", + "Comma", + "Semi-colon", + "Colon", + "Tab", +]; /** * Default from colour @@ -30,10 +34,9 @@ export const FIELD_DELIMITER_OPTIONS = ["Space", "Comma", "Semi-colon", "Colon", */ export const COLOURS = { min: "white", - max: "black" + max: "black", }; - /** * Gets values from input for a plot. * @@ -44,26 +47,30 @@ export const COLOURS = { * @param {number} length * @returns {Object[]} */ -export function getValues(input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded, length) { +export function getValues( + input, + recordDelimiter, + fieldDelimiter, + columnHeadingsAreIncluded, + length, +) { let headings; const values = []; - input - .split(recordDelimiter) - .forEach((row, rowIndex) => { - const split = row.split(fieldDelimiter); - if (split.length !== length) throw new OperationError(`Each row must have length ${length}.`); + input.split(recordDelimiter).forEach((row, rowIndex) => { + const split = row.split(fieldDelimiter); + if (split.length !== length) + throw new OperationError(`Each row must have length ${length}.`); - if (columnHeadingsAreIncluded && rowIndex === 0) { - headings = split; - } else { - values.push(split); - } - }); + if (columnHeadingsAreIncluded && rowIndex === 0) { + headings = split; + } else { + values.push(split); + } + }); return { headings, values }; } - /** * Gets values from input for a scatter plot. * @@ -73,25 +80,32 @@ export function getValues(input, recordDelimiter, fieldDelimiter, columnHeadings * @param {boolean} columnHeadingsAreIncluded - whether we should skip the first record * @returns {Object[]} */ -export function getScatterValues(input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded) { +export function getScatterValues( + input, + recordDelimiter, + fieldDelimiter, + columnHeadingsAreIncluded, +) { let { headings, values } = getValues( input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded, - 2 + 2, ); if (headings) { - headings = {x: headings[0], y: headings[1]}; + headings = { x: headings[0], y: headings[1] }; } - values = values.map(row => { + values = values.map((row) => { const x = parseFloat(row[0]), y = parseFloat(row[1]); - if (Number.isNaN(x)) throw new OperationError("Values must be numbers in base 10."); - if (Number.isNaN(y)) throw new OperationError("Values must be numbers in base 10."); + if (Number.isNaN(x)) + throw new OperationError("Values must be numbers in base 10."); + if (Number.isNaN(y)) + throw new OperationError("Values must be numbers in base 10."); return [x, y]; }); @@ -99,7 +113,6 @@ export function getScatterValues(input, recordDelimiter, fieldDelimiter, columnH return { headings, values }; } - /** * Gets values from input for a scatter plot with colour from the third column. * @@ -109,25 +122,33 @@ export function getScatterValues(input, recordDelimiter, fieldDelimiter, columnH * @param {boolean} columnHeadingsAreIncluded - whether we should skip the first record * @returns {Object[]} */ -export function getScatterValuesWithColour(input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded) { +export function getScatterValuesWithColour( + input, + recordDelimiter, + fieldDelimiter, + columnHeadingsAreIncluded, +) { let { headings, values } = getValues( input, - recordDelimiter, fieldDelimiter, + recordDelimiter, + fieldDelimiter, columnHeadingsAreIncluded, - 3 + 3, ); if (headings) { - headings = {x: headings[0], y: headings[1]}; + headings = { x: headings[0], y: headings[1] }; } - values = values.map(row => { + values = values.map((row) => { const x = parseFloat(row[0]), y = parseFloat(row[1]), colour = row[2]; - if (Number.isNaN(x)) throw new OperationError("Values must be numbers in base 10."); - if (Number.isNaN(y)) throw new OperationError("Values must be numbers in base 10."); + if (Number.isNaN(x)) + throw new OperationError("Values must be numbers in base 10."); + if (Number.isNaN(y)) + throw new OperationError("Values must be numbers in base 10."); return [x, y, Utils.escapeHtml(colour)]; }); @@ -144,23 +165,30 @@ export function getScatterValuesWithColour(input, recordDelimiter, fieldDelimite * @param {boolean} columnHeadingsAreIncluded - whether we should skip the first record * @returns {Object[]} */ -export function getSeriesValues(input, recordDelimiter, fieldDelimiter, columnHeadingsAreIncluded) { +export function getSeriesValues( + input, + recordDelimiter, + fieldDelimiter, + columnHeadingsAreIncluded, +) { const { values } = getValues( input, - recordDelimiter, fieldDelimiter, + recordDelimiter, + fieldDelimiter, false, - 3 + 3, ); let xValues = new Set(); const series = {}; - values.forEach(row => { + values.forEach((row) => { const serie = row[0], xVal = row[1], val = parseFloat(row[2]); - if (Number.isNaN(val)) throw new OperationError("Values must be numbers in base 10."); + if (Number.isNaN(val)) + throw new OperationError("Values must be numbers in base 10."); xValues.add(xVal); if (typeof series[serie] === "undefined") series[serie] = {}; @@ -172,7 +200,7 @@ export function getSeriesValues(input, recordDelimiter, fieldDelimiter, columnHe const seriesList = []; for (const seriesName in series) { const serie = series[seriesName]; - seriesList.push({name: seriesName, data: serie}); + seriesList.push({ name: seriesName, data: serie }); } return { xValues, series: seriesList }; diff --git a/src/core/lib/ChrEnc.mjs b/src/core/lib/ChrEnc.mjs index 6879d736..07211304 100644 --- a/src/core/lib/ChrEnc.mjs +++ b/src/core/lib/ChrEnc.mjs @@ -166,7 +166,6 @@ export const CHR_ENC_CODE_PAGES = { "Simplified Chinese GB18030 (54936)": 54936, }; - export const CHR_ENC_SIMPLE_LOOKUP = {}; export const CHR_ENC_SIMPLE_REVERSE_LOOKUP = {}; @@ -177,7 +176,6 @@ for (const name in CHR_ENC_CODE_PAGES) { CHR_ENC_SIMPLE_REVERSE_LOOKUP[CHR_ENC_CODE_PAGES[name]] = simpleName; } - /** * Returns the width of the character set for the given codepage. * For example, UTF-8 is a Single Byte Character Set, whereas @@ -194,7 +192,12 @@ export function chrEncWidth(page) { const pageStr = page.toString(); // Confirm this page is legitimate - if (!Object.prototype.hasOwnProperty.call(CHR_ENC_SIMPLE_REVERSE_LOOKUP, pageStr)) + if ( + !Object.prototype.hasOwnProperty.call( + CHR_ENC_SIMPLE_REVERSE_LOOKUP, + pageStr, + ) + ) return 0; // Statically defined code pages @@ -202,10 +205,8 @@ export function chrEncWidth(page) { return cptable[pageStr].dec.length > 256 ? 2 : 1; // Cached code pages - if (cptable.utils.cache.sbcs.includes(pageStr)) - return 1; - if (cptable.utils.cache.dbcs.includes(pageStr)) - return 2; + if (cptable.utils.cache.sbcs.includes(pageStr)) return 1; + if (cptable.utils.cache.dbcs.includes(pageStr)) return 2; // Dynamically generated code pages if (Object.prototype.hasOwnProperty.call(cptable.utils.magic, pageStr)) { diff --git a/src/core/lib/CipherSaber2.mjs b/src/core/lib/CipherSaber2.mjs index bf3954e9..a03f9667 100644 --- a/src/core/lib/CipherSaber2.mjs +++ b/src/core/lib/CipherSaber2.mjs @@ -6,14 +6,14 @@ export function encode(tempIVP, key, rounds, input) { const ivp = new Uint8Array(key.concat(tempIVP)); const state = new Array(256).fill(0); - let j = 0, i = 0; + let j = 0, + i = 0; const result = []; // Mixing states based off of IV. - for (let i = 0; i < 256; i++) - state[i] = i; + for (let i = 0; i < 256; i++) state[i] = i; const ivpLength = ivp.length; - for (let r = 0; r < rounds; r ++) { + for (let r = 0; r < rounds; r++) { for (let k = 0; k < 256; k++) { j = (j + state[k] + ivp[k % ivpLength]) % 256; [state[k], state[j]] = [state[j], state[k]]; @@ -24,7 +24,7 @@ export function encode(tempIVP, key, rounds, input) { // XOR cipher with key. for (let x = 0; x < input.length; x++) { - i = (++i) % 256; + i = ++i % 256; j = (j + state[i]) % 256; [state[i], state[j]] = [state[j], state[i]]; const n = (state[i] + state[j]) % 256; diff --git a/src/core/lib/Ciphers.mjs b/src/core/lib/Ciphers.mjs index a4d174b5..38d245d6 100644 --- a/src/core/lib/Ciphers.mjs +++ b/src/core/lib/Ciphers.mjs @@ -33,10 +33,13 @@ export function affineEncode(input, args) { for (let i = 0; i < input.length; i++) { if (alphabet.indexOf(input[i]) >= 0) { // Uses the affine function ax+b % m = y (where m is length of the alphabet) - output += alphabet[((a * alphabet.indexOf(input[i])) + b) % 26]; + output += alphabet[(a * alphabet.indexOf(input[i]) + b) % 26]; } else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) { // Same as above, accounting for uppercase - output += alphabet[((a * alphabet.indexOf(input[i].toLowerCase())) + b) % 26].toUpperCase(); + output += + alphabet[ + (a * alphabet.indexOf(input[i].toLowerCase()) + b) % 26 + ].toUpperCase(); } else { // Non-alphabetic characters output += input[i]; @@ -53,13 +56,13 @@ export function affineEncode(input, args) { * @param {string} keyword - Must be upper case * @returns {string} */ -export function genPolybiusSquare (keyword) { +export function genPolybiusSquare(keyword) { const alpha = "ABCDEFGHIKLMNOPQRSTUVWXYZ", polArray = `${keyword}${alpha}`.split("").unique(), polybius = []; for (let i = 0; i < 5; i++) { - polybius[i] = polArray.slice(i*5, i*5 + 5); + polybius[i] = polArray.slice(i * 5, i * 5 + 5); } return polybius; @@ -72,11 +75,11 @@ export function genPolybiusSquare (keyword) { * @constant */ export const format = { - "Hex": CryptoJS.enc.Hex, - "Base64": CryptoJS.enc.Base64, - "UTF8": CryptoJS.enc.Utf8, - "UTF16": CryptoJS.enc.Utf16, - "UTF16LE": CryptoJS.enc.Utf16LE, - "UTF16BE": CryptoJS.enc.Utf16BE, - "Latin1": CryptoJS.enc.Latin1, + Hex: CryptoJS.enc.Hex, + Base64: CryptoJS.enc.Base64, + UTF8: CryptoJS.enc.Utf8, + UTF16: CryptoJS.enc.Utf16, + UTF16LE: CryptoJS.enc.Utf16LE, + UTF16BE: CryptoJS.enc.Utf16BE, + Latin1: CryptoJS.enc.Latin1, }; diff --git a/src/core/lib/Code.mjs b/src/core/lib/Code.mjs index 2d749d79..af6e9564 100644 --- a/src/core/lib/Code.mjs +++ b/src/core/lib/Code.mjs @@ -14,7 +14,7 @@ * @returns {string} */ export function replaceVariableNames(input, replacer) { - const tokenRegex = /\\"|"(?:\\"|[^"])*"|(\b[a-z0-9\-_]+\b)/ig; + const tokenRegex = /\\"|"(?:\\"|[^"])*"|(\b[a-z0-9\-_]+\b)/gi; return input.replace(tokenRegex, (...args) => { const match = args[0], diff --git a/src/core/lib/Colossus.mjs b/src/core/lib/Colossus.mjs index 5fb8e0cc..faf793c7 100644 --- a/src/core/lib/Colossus.mjs +++ b/src/core/lib/Colossus.mjs @@ -5,7 +5,7 @@ * @copyright Crown Copyright 2019 * @license Apache-2.0 */ -import {INIT_PATTERNS, ITA2_TABLE, ROTOR_SIZES} from "../lib/Lorenz.mjs"; +import { INIT_PATTERNS, ITA2_TABLE, ROTOR_SIZES } from "../lib/Lorenz.mjs"; /** * Colossus simulator class. @@ -21,7 +21,16 @@ export class ColossusComputer { * @param {Object} control - control switches which specify stepping modes * @param {Object} starts - rotor start positions */ - constructor(ciphertext, pattern, qbusin, qbusswitches, control, starts, settotal, limit) { + constructor( + ciphertext, + pattern, + qbusin, + qbusswitches, + control, + starts, + settotal, + limit, + ) { this.ITAlookup = ITA2_TABLE; this.ReverseITAlookup = {}; for (const letter in this.ITAlookup) { @@ -39,7 +48,6 @@ export class ColossusComputer { this.settotal = settotal; this.limitations = limit; - this.allCounters = [0, 0, 0, 0, 0]; this.Zbits = [0, 0, 0, 0, 0]; // Z input is the cipher tape @@ -69,11 +77,24 @@ export class ColossusComputer { */ run() { const result = { - printout: "" + printout: "", }; // loop until our start positions are back to the beginning - this.rotorPtrs = {X1: this.starts.X1, X2: this.starts.X2, X3: this.starts.X3, X4: this.starts.X4, X5: this.starts.X5, M61: this.starts.M61, M37: this.starts.M37, S1: this.starts.S1, S2: this.starts.S2, S3: this.starts.S3, S4: this.starts.S4, S5: this.starts.S5}; + this.rotorPtrs = { + X1: this.starts.X1, + X2: this.starts.X2, + X3: this.starts.X3, + X4: this.starts.X4, + X5: this.starts.X5, + M61: this.starts.M61, + M37: this.starts.M37, + S1: this.starts.S1, + S2: this.starts.S2, + S3: this.starts.S3, + S4: this.starts.S4, + S5: this.starts.S5, + }; // this.rotorPtrs = this.starts; let runcount = 1; @@ -94,12 +115,15 @@ export class ColossusComputer { // Only print result if larger than set total let fastRef = "00"; let slowRef = "00"; - if (fast !== "") fastRef = this.rotorPtrs[fast].toString().padStart(2, "0"); - if (slow !== "") slowRef = this.rotorPtrs[slow].toString().padStart(2, "0"); + if (fast !== "") + fastRef = this.rotorPtrs[fast].toString().padStart(2, "0"); + if (slow !== "") + slowRef = this.rotorPtrs[slow].toString().padStart(2, "0"); let printline = ""; - for (let c=0;c<5;c++) { + for (let c = 0; c < 5; c++) { if (this.allCounters[c] > this.settotal) { - printline += String.fromCharCode(c+97) + this.allCounters[c]+" "; + printline += + String.fromCharCode(c + 97) + this.allCounters[c] + " "; } } if (printline !== "") { @@ -111,17 +135,21 @@ export class ColossusComputer { // Step fast rotor if required if (fast !== "") { this.rotorPtrs[fast]++; - if (this.rotorPtrs[fast] > ROTOR_SIZES[fast]) this.rotorPtrs[fast] = 1; + if (this.rotorPtrs[fast] > ROTOR_SIZES[fast]) + this.rotorPtrs[fast] = 1; } // Step slow rotor if fast rotor has returned to initial start position if (slow !== "" && this.rotorPtrs[fast] === this.starts[fast]) { this.rotorPtrs[slow]++; - if (this.rotorPtrs[slow] > ROTOR_SIZES[slow]) this.rotorPtrs[slow] = 1; + if (this.rotorPtrs[slow] > ROTOR_SIZES[slow]) + this.rotorPtrs[slow] = 1; } runcount++; - } while (JSON.stringify(this.rotorPtrs) !== JSON.stringify(this.starts)); + } while ( + JSON.stringify(this.rotorPtrs) !== JSON.stringify(this.starts) + ); result.counters = this.allCounters; result.runcount = runcount; @@ -135,12 +163,24 @@ export class ColossusComputer { runTape() { let charZin = ""; - this.Xptr = [this.rotorPtrs.X1, this.rotorPtrs.X2, this.rotorPtrs.X3, this.rotorPtrs.X4, this.rotorPtrs.X5]; + this.Xptr = [ + this.rotorPtrs.X1, + this.rotorPtrs.X2, + this.rotorPtrs.X3, + this.rotorPtrs.X4, + this.rotorPtrs.X5, + ]; this.Mptr = [this.rotorPtrs.M37, this.rotorPtrs.M61]; - this.Sptr = [this.rotorPtrs.S1, this.rotorPtrs.S2, this.rotorPtrs.S3, this.rotorPtrs.S4, this.rotorPtrs.S5]; + this.Sptr = [ + this.rotorPtrs.S1, + this.rotorPtrs.S2, + this.rotorPtrs.S3, + this.rotorPtrs.S4, + this.rotorPtrs.S5, + ]; // Run full loop of all character on the input tape (Z) - for (let i=0; i ROTOR_SIZES["X"+(r+1)]) this.Xptr[r] = 1; + if (this.Xptr[r] > ROTOR_SIZES["X" + (r + 1)]) this.Xptr[r] = 1; } if (this.totalmotor) { // Step Psi rotors - for (let r=0; r<5; r++) { + for (let r = 0; r < 5; r++) { this.Sptr[r]++; - if (this.Sptr[r] > ROTOR_SIZES["S"+(r+1)]) this.Sptr[r] = 1; + if (this.Sptr[r] > ROTOR_SIZES["S" + (r + 1)]) this.Sptr[r] = 1; } } // Move M37 rotor if M61 set - if (this.rings.M[1][this.Mptr[1]-1]===1) this.Mptr[0]++; - if (this.Mptr[0] > ROTOR_SIZES.M37) this.Mptr[0]=1; + if (this.rings.M[1][this.Mptr[1] - 1] === 1) this.Mptr[0]++; + if (this.Mptr[0] > ROTOR_SIZES.M37) this.Mptr[0] = 1; // Always move M61 rotor this.Mptr[1]++; - if (this.Mptr[1] > ROTOR_SIZES.M61) this.Mptr[1]=1; + if (this.Mptr[1] > ROTOR_SIZES.M61) this.Mptr[1] = 1; } /** @@ -253,25 +292,25 @@ export class ColossusComputer { this.Qbits = this.Zbits; } else if (this.qbusin.Z === "ΔZ") { // delta Z, the Bitwise XOR of this character Zbits + last character Zbits - for (let b=0;b<5;b++) { + for (let b = 0; b < 5; b++) { this.Qbits[b] = this.Zbits[b] ^ this.ZbitsOneBack[b]; } } this.ZbitsOneBack = this.Zbits.slice(); // copy value of object, not reference // Xbits - the current Chi wheel bits - for (let b=0;b<5;b++) { - this.Xbits[b] = this.rings.X[b+1][this.Xptr[b]-1]; + for (let b = 0; b < 5; b++) { + this.Xbits[b] = this.rings.X[b + 1][this.Xptr[b] - 1]; } if (this.qbusin.Chi !== "") { if (this.qbusin.Chi === "Χ") { // direct X added to Qbits - for (let b=0;b<5;b++) { + for (let b = 0; b < 5; b++) { this.Qbits[b] = this.Qbits[b] ^ this.Xbits[b]; } } else if (this.qbusin.Chi === "ΔΧ") { // delta X - for (let b=0;b<5;b++) { + for (let b = 0; b < 5; b++) { this.Qbits[b] = this.Qbits[b] ^ this.Xbits[b]; this.Qbits[b] = this.Qbits[b] ^ this.XbitsOneBack[b]; } @@ -280,18 +319,18 @@ export class ColossusComputer { this.XbitsOneBack = this.Xbits.slice(); // Sbits - the current Psi wheel bits - for (let b=0;b<5;b++) { - this.Sbits[b] = this.rings.S[b+1][this.Sptr[b]-1]; + for (let b = 0; b < 5; b++) { + this.Sbits[b] = this.rings.S[b + 1][this.Sptr[b] - 1]; } if (this.qbusin.Psi !== "") { if (this.qbusin.Psi === "Ψ") { // direct S added to Qbits - for (let b=0;b<5;b++) { + for (let b = 0; b < 5; b++) { this.Qbits[b] = this.Qbits[b] ^ this.Sbits[b]; } } else if (this.qbusin.Psi === "ΔΨ") { // delta S - for (let b=0;b<5;b++) { + for (let b = 0; b < 5; b++) { this.Qbits[b] = this.Qbits[b] ^ this.Sbits[b]; this.Qbits[b] = this.Qbits[b] ^ this.SbitsOneBack[b]; } @@ -307,15 +346,19 @@ export class ColossusComputer { const cnt = [-1, -1, -1, -1, -1]; const numrows = this.qbusswitches.condition.length; - for (let r=0;r= 0 && Qswitch[s] !== parseInt(this.Qbits[s], 10)) result = false; + for (let s = 0; s < 5; s++) { + if ( + Qswitch[s] >= 0 && + Qswitch[s] !== parseInt(this.Qbits[s], 10) + ) + result = false; } // Check for NOT switch if (row.Negate) result = !result; @@ -330,8 +373,9 @@ export class ColossusComputer { } // Negate the whole column, this allows A OR B by doing NOT(NOT A AND NOT B) - for (let c=0;c<5;c++) { - if (this.qbusswitches.condNegateAll && cnt[c] !== -1) cnt[c] = !cnt[c]; + for (let c = 0; c < 5; c++) { + if (this.qbusswitches.condNegateAll && cnt[c] !== -1) + cnt[c] = !cnt[c]; } return cnt; @@ -348,13 +392,13 @@ export class ColossusComputer { // Colossus could actually add into any of the five counters. if (row.C1) { let addition = 0; - for (let s=0;s<5;s++) { + for (let s = 0; s < 5; s++) { // XOR addition if (Qswitch[s]) { addition = addition ^ this.Qbits[s]; } } - const equals = (row.Equals===""?-1:(row.Equals==="."?0:1)); + const equals = row.Equals === "" ? -1 : row.Equals === "." ? 0 : 1; if (addition === equals) { // AND with conditional rows to get final result if (cnt[0] === -1) cnt[0] = true; @@ -365,13 +409,18 @@ export class ColossusComputer { // Final check, check for addition section negate // then, if any column set, from top to bottom of rack, add to counter. - for (let c=0;c<5;c++) { - if (this.qbusswitches.addNegateAll && cnt[c] !== -1) cnt[c] = !cnt[c]; + for (let c = 0; c < 5; c++) { + if (this.qbusswitches.addNegateAll && cnt[c] !== -1) + cnt[c] = !cnt[c]; - if (this.qbusswitches.totalMotor === "" || (this.qbusswitches.totalMotor === "x" && this.totalmotor === 0) || (this.qbusswitches.totalMotor === "." && this.totalmotor === 1)) { + if ( + this.qbusswitches.totalMotor === "" || + (this.qbusswitches.totalMotor === "x" && + this.totalmotor === 0) || + (this.qbusswitches.totalMotor === "." && this.totalmotor === 1) + ) { if (cnt[c] === true) this.allCounters[c]++; } - } } @@ -386,7 +435,7 @@ export class ColossusComputer { 2: INIT_PATTERNS[pattern].X[2].slice().reverse(), 3: INIT_PATTERNS[pattern].X[3].slice().reverse(), 4: INIT_PATTERNS[pattern].X[4].slice().reverse(), - 5: INIT_PATTERNS[pattern].X[5].slice().reverse() + 5: INIT_PATTERNS[pattern].X[5].slice().reverse(), }, M: { 1: INIT_PATTERNS[pattern].M[1].slice().reverse(), @@ -397,8 +446,8 @@ export class ColossusComputer { 2: INIT_PATTERNS[pattern].S[2].slice().reverse(), 3: INIT_PATTERNS[pattern].S[3].slice().reverse(), 4: INIT_PATTERNS[pattern].S[4].slice().reverse(), - 5: INIT_PATTERNS[pattern].S[5].slice().reverse() - } + 5: INIT_PATTERNS[pattern].S[5].slice().reverse(), + }, }; } @@ -407,11 +456,10 @@ export class ColossusComputer { */ readBusSwitches(row) { const output = [-1, -1, -1, -1, -1]; - for (let c=0;c<5;c++) { - if (row[c]===".") output[c] = 0; - if (row[c]==="x") output[c] = 1; + for (let c = 0; c < 5; c++) { + if (row[c] === ".") output[c] = 0; + if (row[c] === "x") output[c] = 1; } return output; } - } diff --git a/src/core/lib/ConvertCoordinates.mjs b/src/core/lib/ConvertCoordinates.mjs index 4fca357d..b329f152 100644 --- a/src/core/lib/ConvertCoordinates.mjs +++ b/src/core/lib/ConvertCoordinates.mjs @@ -33,7 +33,7 @@ export const FORMATS = [ "Geohash", "Military Grid Reference System", "Ordnance Survey National Grid", - "Universal Transverse Mercator" + "Universal Transverse Mercator", ]; /** @@ -58,7 +58,15 @@ const NO_CHANGE = [ * @param {number} precision - Precision of the result * @returns {string} A formatted string of the converted co-ordinates */ -export function convertCoordinates (input, inFormat, inDelim, outFormat, outDelim, includeDir, precision) { +export function convertCoordinates( + input, + inFormat, + inDelim, + outFormat, + outDelim, + includeDir, + precision, +) { let isPair = false, split, latlon, @@ -83,7 +91,9 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli // Try to detect a delimiter in the input. inDelim = findDelim(input); if (inDelim === null) { - throw new OperationError("Unable to detect the input delimiter automatically."); + throw new OperationError( + "Unable to detect the input delimiter automatically.", + ); } } else if (!inDelim.includes("Direction")) { // Convert the delimiter argument value to the actual character @@ -94,7 +104,9 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli // Try to detect the format of the input data inFormat = findFormat(input, inDelim); if (inFormat === null) { - throw new OperationError("Unable to detect the input format automatically."); + throw new OperationError( + "Unable to detect the input format automatically.", + ); } } @@ -154,11 +166,23 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli splitLong = splitInput(split[1]); if (splitLat.length >= 3 && splitLong.length >= 3) { - lat = convDMSToDD(splitLat[0], splitLat[1], splitLat[2], 10); - lon = convDMSToDD(splitLong[0], splitLong[1], splitLong[2], 10); + lat = convDMSToDD( + splitLat[0], + splitLat[1], + splitLat[2], + 10, + ); + lon = convDMSToDD( + splitLong[0], + splitLong[1], + splitLong[2], + 10, + ); latlon = new LatLonEllipsoidal(lat.degrees, lon.degrees); } else { - throw new OperationError("Invalid co-ordinate format for Degrees Minutes Seconds"); + throw new OperationError( + "Invalid co-ordinate format for Degrees Minutes Seconds", + ); } } else { // Not a pair, so only try to convert one set of co-ordinates @@ -167,7 +191,9 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli lat = convDMSToDD(splitLat[0], splitLat[1], splitLat[2]); latlon = new LatLonEllipsoidal(lat.degrees, lat.degrees); } else { - throw new OperationError("Invalid co-ordinate format for Degrees Minutes Seconds"); + throw new OperationError( + "Invalid co-ordinate format for Degrees Minutes Seconds", + ); } } break; @@ -176,7 +202,9 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli splitLat = splitInput(split[0]); splitLong = splitInput(split[1]); if (splitLat.length !== 2 || splitLong.length !== 2) { - throw new OperationError("Invalid co-ordinate format for Degrees Decimal Minutes."); + throw new OperationError( + "Invalid co-ordinate format for Degrees Decimal Minutes.", + ); } // Convert to decimal degrees, and then convert to a geodesy object lat = convDDMToDD(splitLat[0], splitLat[1], 10); @@ -186,7 +214,9 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli // Not a pair, so only try to convert one set of co-ordinates splitLat = splitInput(input); if (splitLat.length !== 2) { - throw new OperationError("Invalid co-ordinate format for Degrees Decimal Minutes."); + throw new OperationError( + "Invalid co-ordinate format for Degrees Decimal Minutes.", + ); } lat = convDDMToDD(splitLat[0], splitLat[1], 10); latlon = new LatLonEllipsoidal(lat.degrees, lat.degrees); @@ -194,17 +224,21 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli break; case "Decimal Degrees": if (isPair) { - splitLat = splitInput(split[0]); + splitLat = splitInput(split[0]); splitLong = splitInput(split[1]); if (splitLat.length !== 1 || splitLong.length !== 1) { - throw new OperationError("Invalid co-ordinate format for Decimal Degrees."); + throw new OperationError( + "Invalid co-ordinate format for Decimal Degrees.", + ); } latlon = new LatLonEllipsoidal(splitLat[0], splitLong[0]); } else { // Not a pair, so only try to convert one set of co-ordinates splitLat = splitInput(split[0]); if (splitLat.length !== 1) { - throw new OperationError("Invalid co-ordinate format for Decimal Degrees."); + throw new OperationError( + "Invalid co-ordinate format for Decimal Degrees.", + ); } latlon = new LatLonEllipsoidal(splitLat[0], splitLat[0]); } @@ -221,11 +255,11 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli const dirs = input.toUpperCase().match(/[NESW]/g); if (dirs && dirs.length >= 1) { // Make positive lat/lon values with S/W directions into negative values - if (dirs[0] === "S" || dirs[0] === "W" && latlon.lat > 0) { + if (dirs[0] === "S" || (dirs[0] === "W" && latlon.lat > 0)) { latlon.lat = -latlon.lat; } if (dirs.length >= 2) { - if (dirs[1] === "S" || dirs[1] === "W" && latlon.lon > 0) { + if (dirs[1] === "S" || (dirs[1] === "W" && latlon.lon > 0)) { latlon.lon = -latlon.lon; } } @@ -275,7 +309,9 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli case "Ordnance Survey National Grid": osng = OsGridRef.latLonToOsGrid(latlon); if (osng.toString() === "") { - throw new OperationError("Could not convert co-ordinates to OS National Grid. Are the co-ordinates in range?"); + throw new OperationError( + "Could not convert co-ordinates to OS National Grid. Are the co-ordinates in range?", + ); } // OSNG wants a precision that's an even number between 2 and 10 if (precision % 2 !== 0) { @@ -340,10 +376,10 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli * @param {string} input - The input data to be split * @returns {number[]} An array of the different items in the string, stored as floats */ -function splitInput (input) { +function splitInput(input) { const split = []; - input.split(/\s+/).forEach(item => { + input.split(/\s+/).forEach((item) => { // Remove any character that isn't a digit, decimal point or negative sign item = item.replace(/[^0-9.-]/g, ""); if (item.length > 0) { @@ -363,17 +399,17 @@ function splitInput (input) { * @param {number} precision - The precision the result should be rounded to * @returns {{string: string, degrees: number}} An object containing the raw converted value (obj.degrees), and a formatted string version (obj.string) */ -function convDMSToDD (degrees, minutes, seconds, precision) { +function convDMSToDD(degrees, minutes, seconds, precision) { const absDegrees = Math.abs(degrees); - let conv = absDegrees + (minutes / 60) + (seconds / 3600); + let conv = absDegrees + minutes / 60 + seconds / 3600; let outString = round(conv, precision) + "°"; if (isNegativeZero(degrees) || degrees < 0) { conv = -conv; outString = "-" + outString; } return { - "degrees": conv, - "string": outString + degrees: conv, + string: outString, }; } @@ -385,7 +421,7 @@ function convDMSToDD (degrees, minutes, seconds, precision) { * @param {number} precision - The precision which the result should be rounded to * @returns {{string: string, degrees: number}} An object containing the raw converted value (obj.degrees), and a formatted string version (obj.string) */ -function convDDMToDD (degrees, minutes, precision) { +function convDDMToDD(degrees, minutes, precision) { const absDegrees = Math.abs(degrees); let conv = absDegrees + minutes / 60; let outString = round(conv, precision) + "°"; @@ -394,8 +430,8 @@ function convDDMToDD (degrees, minutes, precision) { outString = "-" + outString; } return { - "degrees": conv, - "string": outString + degrees: conv, + string: outString, }; } @@ -407,10 +443,10 @@ function convDDMToDD (degrees, minutes, precision) { * @param {number} precision - The precision which the result should be rounded to * @returns {{string: string, degrees: number}} An object containing the raw converted value (obj.degrees), and a formatted string version (obj.string) */ -function convDDToDD (degrees, precision) { +function convDDToDD(degrees, precision) { return { - "degrees": degrees, - "string": round(degrees, precision) + "°" + degrees: degrees, + string: round(degrees, precision) + "°", }; } @@ -421,21 +457,24 @@ function convDDToDD (degrees, precision) { * @param {number} precision - The precision which the result should be rounded to * @returns {{string: string, degrees: number, minutes: number, seconds: number}} An object containing the raw converted value as separate numbers (.degrees, .minutes, .seconds), and a formatted string version (obj.string) */ -function convDDToDMS (decDegrees, precision) { +function convDDToDMS(decDegrees, precision) { const absDegrees = Math.abs(decDegrees); let degrees = Math.floor(absDegrees); const minutes = Math.floor(60 * (absDegrees - degrees)), - seconds = round(3600 * (absDegrees - degrees) - 60 * minutes, precision); - let outString = degrees + "° " + minutes + "' " + seconds + "\""; + seconds = round( + 3600 * (absDegrees - degrees) - 60 * minutes, + precision, + ); + let outString = degrees + "° " + minutes + "' " + seconds + '"'; if (isNegativeZero(decDegrees) || decDegrees < 0) { degrees = -degrees; outString = "-" + outString; } return { - "degrees": degrees, - "minutes": minutes, - "seconds": seconds, - "string": outString + degrees: degrees, + minutes: minutes, + seconds: seconds, + string: outString, }; } @@ -446,7 +485,7 @@ function convDDToDMS (decDegrees, precision) { * @param {number} precision - The precision the input data should be rounded to * @returns {{string: string, degrees: number, minutes: number}} An object containing the raw converted value as separate numbers (.degrees, .minutes), and a formatted string version (obj.string) */ -function convDDToDDM (decDegrees, precision) { +function convDDToDDM(decDegrees, precision) { const absDegrees = Math.abs(decDegrees); let degrees = Math.floor(absDegrees); const minutes = absDegrees - degrees, @@ -458,9 +497,9 @@ function convDDToDDM (decDegrees, precision) { } return { - "degrees": degrees, - "minutes": decMinutes, - "string": outString, + degrees: degrees, + minutes: decMinutes, + string: outString, }; } @@ -532,9 +571,11 @@ export function findDirs(input, delim) { * @param {string} delim - The delimiter separating the data in input * @returns {string} The input format */ -export function findFormat (input, delim) { +export function findFormat(input, delim) { let testData; - const mgrsPattern = new RegExp(/^[0-9]{2}\s?[C-HJ-NP-X]{1}\s?[A-HJ-NP-Z][A-HJ-NP-V]\s?[0-9\s]+/), + const mgrsPattern = new RegExp( + /^[0-9]{2}\s?[C-HJ-NP-X]{1}\s?[A-HJ-NP-Z][A-HJ-NP-V]\s?[0-9\s]+/, + ), osngPattern = new RegExp(/^[A-HJ-Z]{2}\s+[0-9\s]+$/), geohashPattern = new RegExp(/^[0123456789BCDEFGHJKMNPQRSTUVWXYZ]+$/), utmPattern = new RegExp(/^[0-9]{2}\s?[C-HJ-NP-X]\s[0-9.]+\s?[0-9.]+$/), @@ -597,7 +638,7 @@ export function findFormat (input, delim) { * @param {string} input * @returns {string} Delimiter type */ -export function findDelim (input) { +export function findDelim(input) { input = input.trim(); const delims = [",", ";", ":"]; const testDir = input.match(/[NnEeSsWw]/g); @@ -634,14 +675,14 @@ export function findDelim (input) { * @param {string} delim The delimiter to be matched * @returns {string} */ -export function realDelim (delim) { +export function realDelim(delim) { return { - "Auto": "Auto", - "Space": " ", - "\\n": "\n", - "Comma": ",", - "Semi-colon": ";", - "Colon": ":" + Auto: "Auto", + Space: " ", + "\\n": "\n", + Comma: ",", + "Semi-colon": ";", + Colon: ":", }[delim]; } @@ -652,7 +693,7 @@ export function realDelim (delim) { * @returns {boolean} */ function isNegativeZero(zero) { - return zero === 0 && (1/zero < 0); + return zero === 0 && 1 / zero < 0; } /** diff --git a/src/core/lib/Crypt.mjs b/src/core/lib/Crypt.mjs index c36a0267..733c8e77 100644 --- a/src/core/lib/Crypt.mjs +++ b/src/core/lib/Crypt.mjs @@ -6,4 +6,5 @@ * @license Apache-2.0 */ -export const cryptNotice = "WARNING: Cryptographic operations in CyberChef should not be relied upon to provide security in any situation. No guarantee is offered for their correctness. We advise you not to use keys generated from CyberChef in operational contexts."; +export const cryptNotice = + "WARNING: Cryptographic operations in CyberChef should not be relied upon to provide security in any situation. No guarantee is offered for their correctness. We advise you not to use keys generated from CyberChef in operational contexts."; diff --git a/src/core/lib/DateTime.mjs b/src/core/lib/DateTime.mjs index 00a177c6..37e3b67e 100644 --- a/src/core/lib/DateTime.mjs +++ b/src/core/lib/DateTime.mjs @@ -9,7 +9,12 @@ /** * DateTime units. */ -export const UNITS = ["Seconds (s)", "Milliseconds (ms)", "Microseconds (μs)", "Nanoseconds (ns)"]; +export const UNITS = [ + "Seconds (s)", + "Milliseconds (ms)", + "Microseconds (μs)", + "Nanoseconds (ns)", +]; /** * DateTime formats. @@ -17,31 +22,31 @@ export const UNITS = ["Seconds (s)", "Milliseconds (ms)", "Microseconds (μs)", export const DATETIME_FORMATS = [ { name: "Standard date and time", - value: "DD/MM/YYYY HH:mm:ss" + value: "DD/MM/YYYY HH:mm:ss", }, { name: "American-style date and time", - value: "MM/DD/YYYY HH:mm:ss" + value: "MM/DD/YYYY HH:mm:ss", }, { name: "International date and time", - value: "YYYY-MM-DD HH:mm:ss" + value: "YYYY-MM-DD HH:mm:ss", }, { name: "Verbose date and time", - value: "dddd Do MMMM YYYY HH:mm:ss Z z" + value: "dddd Do MMMM YYYY HH:mm:ss Z z", }, { name: "UNIX timestamp (seconds)", - value: "X" + value: "X", }, { name: "UNIX timestamp offset (milliseconds)", - value: "x" + value: "x", }, { name: "Automatic", - value: "" + value: "", }, ]; @@ -310,4 +315,3 @@ export const FORMAT_EXAMPLES = `Format string tokens: `; - diff --git a/src/core/lib/Decimal.mjs b/src/core/lib/Decimal.mjs index a140fd4e..237d59af 100644 --- a/src/core/lib/Decimal.mjs +++ b/src/core/lib/Decimal.mjs @@ -8,7 +8,6 @@ import Utils from "../Utils.mjs"; - /** * Convert a string of decimal values into a byte array. * @@ -23,12 +22,12 @@ import Utils from "../Utils.mjs"; * // returns [10,20,30] * fromDecimal("10:20:30", "Colon"); */ -export function fromDecimal(data, delim="Auto") { +export function fromDecimal(data, delim = "Auto") { delim = Utils.charRep(delim); const output = []; let byteStr = data.split(delim); - if (byteStr[byteStr.length-1] === "") - byteStr = byteStr.slice(0, byteStr.length-1); + if (byteStr[byteStr.length - 1] === "") + byteStr = byteStr.slice(0, byteStr.length - 1); for (let i = 0; i < byteStr.length; i++) { output[i] = parseInt(byteStr[i], 10); diff --git a/src/core/lib/Delim.mjs b/src/core/lib/Delim.mjs index c8cc637b..b489d1ed 100644 --- a/src/core/lib/Delim.mjs +++ b/src/core/lib/Delim.mjs @@ -9,32 +9,79 @@ /** * Generic sequence delimiters. */ -export const DELIM_OPTIONS = ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF"]; +export const DELIM_OPTIONS = [ + "Space", + "Comma", + "Semi-colon", + "Colon", + "Line feed", + "CRLF", +]; /** * Binary sequence delimiters. */ -export const BIN_DELIM_OPTIONS = ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF", "None"]; +export const BIN_DELIM_OPTIONS = [ + "Space", + "Comma", + "Semi-colon", + "Colon", + "Line feed", + "CRLF", + "None", +]; /** * Letter sequence delimiters. */ -export const LETTER_DELIM_OPTIONS = ["Space", "Line feed", "CRLF", "Forward slash", "Backslash", "Comma", "Semi-colon", "Colon"]; +export const LETTER_DELIM_OPTIONS = [ + "Space", + "Line feed", + "CRLF", + "Forward slash", + "Backslash", + "Comma", + "Semi-colon", + "Colon", +]; /** * Word sequence delimiters. */ -export const WORD_DELIM_OPTIONS = ["Line feed", "CRLF", "Forward slash", "Backslash", "Comma", "Semi-colon", "Colon"]; +export const WORD_DELIM_OPTIONS = [ + "Line feed", + "CRLF", + "Forward slash", + "Backslash", + "Comma", + "Semi-colon", + "Colon", +]; /** * Input sequence delimiters. */ -export const INPUT_DELIM_OPTIONS = ["Line feed", "CRLF", "Space", "Comma", "Semi-colon", "Colon", "Nothing (separate chars)"]; +export const INPUT_DELIM_OPTIONS = [ + "Line feed", + "CRLF", + "Space", + "Comma", + "Semi-colon", + "Colon", + "Nothing (separate chars)", +]; /** * Arithmetic sequence delimiters */ -export const ARITHMETIC_DELIM_OPTIONS = ["Line feed", "Space", "Comma", "Semi-colon", "Colon", "CRLF"]; +export const ARITHMETIC_DELIM_OPTIONS = [ + "Line feed", + "Space", + "Comma", + "Semi-colon", + "Colon", + "CRLF", +]; /** * Hash delimiters @@ -44,40 +91,46 @@ export const HASH_DELIM_OPTIONS = ["Line feed", "CRLF", "Space", "Comma"]; /** * IP delimiters */ -export const IP_DELIM_OPTIONS = ["Line feed", "CRLF", "Space", "Comma", "Semi-colon"]; +export const IP_DELIM_OPTIONS = [ + "Line feed", + "CRLF", + "Space", + "Comma", + "Semi-colon", +]; /** * Split delimiters. */ export const SPLIT_DELIM_OPTIONS = [ - {name: "Comma", value: ","}, - {name: "Space", value: " "}, - {name: "Line feed", value: "\\n"}, - {name: "CRLF", value: "\\r\\n"}, - {name: "Semi-colon", value: ";"}, - {name: "Colon", value: ":"}, - {name: "Nothing (separate chars)", value: ""} + { name: "Comma", value: "," }, + { name: "Space", value: " " }, + { name: "Line feed", value: "\\n" }, + { name: "CRLF", value: "\\r\\n" }, + { name: "Semi-colon", value: ";" }, + { name: "Colon", value: ":" }, + { name: "Nothing (separate chars)", value: "" }, ]; /** * Join delimiters. */ export const JOIN_DELIM_OPTIONS = [ - {name: "Line feed", value: "\\n"}, - {name: "CRLF", value: "\\r\\n"}, - {name: "Space", value: " "}, - {name: "Comma", value: ","}, - {name: "Semi-colon", value: ";"}, - {name: "Colon", value: ":"}, - {name: "Nothing (join chars)", value: ""} + { name: "Line feed", value: "\\n" }, + { name: "CRLF", value: "\\r\\n" }, + { name: "Space", value: " " }, + { name: "Comma", value: "," }, + { name: "Semi-colon", value: ";" }, + { name: "Colon", value: ":" }, + { name: "Nothing (join chars)", value: "" }, ]; /** * RGBA list delimiters. */ export const RGBA_DELIM_OPTIONS = [ - {name: "Comma", value: ","}, - {name: "Space", value: " "}, - {name: "CRLF", value: "\\r\\n"}, - {name: "Line Feed", value: "\n"} + { name: "Comma", value: "," }, + { name: "Space", value: " " }, + { name: "CRLF", value: "\\r\\n" }, + { name: "Line Feed", value: "\n" }, ]; diff --git a/src/core/lib/Enigma.mjs b/src/core/lib/Enigma.mjs index 988e0c45..413212ab 100644 --- a/src/core/lib/Enigma.mjs +++ b/src/core/lib/Enigma.mjs @@ -14,19 +14,19 @@ import Utils from "../Utils.mjs"; * followed by < and a list of letters at which the rotor steps. */ export const ROTORS = [ - {name: "I", value: "EKMFLGDQVZNTOWYHXUSPAIBRCJ= 65 && i <= 90) { return i - 65; @@ -72,7 +72,7 @@ export function a2i(c, permissive=false) { */ export function i2a(i) { if (i >= 0 && i < 26) { - return Utils.chr(i+65); + return Utils.chr(i + 65); } throw new OperationError("i2a called on value outside 0..25"); } @@ -91,21 +91,29 @@ export class Rotor { */ constructor(wiring, steps, ringSetting, initialPosition) { if (!/^[A-Z]{26}$/.test(wiring)) { - throw new OperationError("Rotor wiring must be 26 unique uppercase letters"); + throw new OperationError( + "Rotor wiring must be 26 unique uppercase letters", + ); } if (!/^[A-Z]{0,26}$/.test(steps)) { - throw new OperationError("Rotor steps must be 0-26 unique uppercase letters"); + throw new OperationError( + "Rotor steps must be 0-26 unique uppercase letters", + ); } if (!/^[A-Z]$/.test(ringSetting)) { - throw new OperationError("Rotor ring setting must be exactly one uppercase letter"); + throw new OperationError( + "Rotor ring setting must be exactly one uppercase letter", + ); } if (!/^[A-Z]$/.test(initialPosition)) { - throw new OperationError("Rotor initial position must be exactly one uppercase letter"); + throw new OperationError( + "Rotor initial position must be exactly one uppercase letter", + ); } this.map = new Array(26); this.revMap = new Array(26); const uniq = {}; - for (let i=0; i { + pairs.split(/\s+/).forEach((pair) => { if (!/^[A-Z]{2}$/.test(pair)) { - throw new OperationError(name + " must be a whitespace-separated list of uppercase letter pairs"); + throw new OperationError( + name + + " must be a whitespace-separated list of uppercase letter pairs", + ); } - const a = a2i(pair[0]), b = a2i(pair[1]); + const a = a2i(pair[0]), + b = a2i(pair[1]); if (a === b) { // self-stecker return; } if (Object.prototype.hasOwnProperty.call(this.map, a)) { - throw new OperationError(`${name} connects ${pair[0]} more than once`); + throw new OperationError( + `${name} connects ${pair[0]} more than once`, + ); } if (Object.prototype.hasOwnProperty.call(this.map, b)) { - throw new OperationError(`${name} connects ${pair[1]} more than once`); + throw new OperationError( + `${name} connects ${pair[1]} more than once`, + ); } this.map[a] = b; this.map[b] = a; @@ -234,7 +255,9 @@ export class Reflector extends PairMapBase { super(pairs, "Reflector"); const s = Object.keys(this.map).length; if (s !== 26) { - throw new OperationError("Reflector must have exactly 13 pairs covering every letter"); + throw new OperationError( + "Reflector must have exactly 13 pairs covering every letter", + ); } const optMap = new Array(26); for (const x of Object.keys(this.map)) { diff --git a/src/core/lib/Extract.mjs b/src/core/lib/Extract.mjs index 18fec28c..db2307bc 100644 --- a/src/core/lib/Extract.mjs +++ b/src/core/lib/Extract.mjs @@ -18,7 +18,13 @@ * @param {boolean} [unique=false] - Whether to unique the results * @returns {string} */ -export function search(input, searchRegex, removeRegex=null, sortBy=null, unique=false) { +export function search( + input, + searchRegex, + removeRegex = null, + sortBy = null, + unique = false, +) { let results = []; let match; @@ -28,8 +34,7 @@ export function search(input, searchRegex, removeRegex=null, sortBy=null, unique searchRegex.lastIndex++; } - if (removeRegex && removeRegex.test(match[0])) - continue; + if (removeRegex && removeRegex.test(match[0])) continue; results.push(match[0]); } @@ -45,20 +50,23 @@ export function search(input, searchRegex, removeRegex=null, sortBy=null, unique return results; } - /** * URL regular expression */ const protocol = "[A-Z]+://", hostname = "[-\\w]+(?:\\.\\w[-\\w]*)+", port = ":\\d+", - path = "/[^.!,?\"<>\\[\\]{}\\s\\x7F-\\xFF]*" + - "(?:[.!,?]+[^.!,?\"<>\\[\\]{}\\s\\x7F-\\xFF]+)*"; - -export const URL_REGEX = new RegExp(protocol + hostname + "(?:" + port + ")?(?:" + path + ")?", "ig"); + path = + '/[^.!,?"<>\\[\\]{}\\s\\x7F-\\xFF]*' + + '(?:[.!,?]+[^.!,?"<>\\[\\]{}\\s\\x7F-\\xFF]+)*'; +export const URL_REGEX = new RegExp( + protocol + hostname + "(?:" + port + ")?(?:" + path + ")?", + "ig", +); /** * Domain name regular expression */ -export const DOMAIN_REGEX = /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/ig; +export const DOMAIN_REGEX = + /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/gi; diff --git a/src/core/lib/FileSignatures.mjs b/src/core/lib/FileSignatures.mjs index 4cba4bc7..0d5f5de7 100644 --- a/src/core/lib/FileSignatures.mjs +++ b/src/core/lib/FileSignatures.mjs @@ -13,7 +13,7 @@ import Stream from "./Stream.mjs"; * to extract them where possible. */ export const FILE_SIGNATURES = { - "Images": [ + Images: [ { name: "Joint Photographic Experts Group image", extension: "jpg,jpeg,jpe,thm,mpo", @@ -23,9 +23,12 @@ export const FILE_SIGNATURES = { 0: 0xff, 1: 0xd8, 2: 0xff, - 3: [0xc0, 0xc4, 0xdb, 0xdd, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe7, 0xe8, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xfe] + 3: [ + 0xc0, 0xc4, 0xdb, 0xdd, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, + 0xe7, 0xe8, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xfe, + ], }, - extractor: extractJPEG + extractor: extractJPEG, }, { name: "Graphics Interchange Format image", @@ -38,9 +41,9 @@ export const FILE_SIGNATURES = { 2: 0x46, 3: 0x38, // 8 4: [0x37, 0x39], // 7|9 - 5: 0x61 // a + 5: 0x61, // a }, - extractor: extractGIF + extractor: extractGIF, }, { name: "Portable Network Graphics image", @@ -55,9 +58,9 @@ export const FILE_SIGNATURES = { 4: 0x0d, 5: 0x0a, 6: 0x1a, - 7: 0x0a + 7: 0x0a, }, - extractor: extractPNG + extractor: extractPNG, }, { name: "WEBP Image", @@ -68,9 +71,9 @@ export const FILE_SIGNATURES = { 8: 0x57, 9: 0x45, 10: 0x42, - 11: 0x50 + 11: 0x50, }, - extractor: extractWEBP + extractor: extractWEBP, }, { name: "Camera Image File Format", @@ -85,11 +88,12 @@ export const FILE_SIGNATURES = { 10: 0x43, 11: 0x43, 12: 0x44, - 13: 0x52 + 13: 0x52, }, - extractor: null + extractor: null, }, - { // Place before tiff check + { + // Place before tiff check name: "Canon CR2 raw image", extension: "cr2", mime: "image/x-canon-cr2", @@ -101,7 +105,7 @@ export const FILE_SIGNATURES = { 2: 0x2a, 3: 0x0, 8: 0x43, - 9: 0x52 + 9: 0x52, }, { 0: 0x4d, @@ -109,10 +113,10 @@ export const FILE_SIGNATURES = { 2: 0x0, 3: 0x2a, 8: 0x43, - 9: 0x52 - } + 9: 0x52, + }, ], - extractor: null + extractor: null, }, { name: "Tagged Image File Format image", @@ -124,16 +128,16 @@ export const FILE_SIGNATURES = { 0: 0x49, 1: 0x49, 2: 0x2a, - 3: 0x0 + 3: 0x0, }, { 0: 0x4d, 1: 0x4d, 2: 0x0, - 3: 0x2a - } + 3: 0x2a, + }, ], - extractor: null + extractor: null, }, { name: "Bitmap image", @@ -148,9 +152,9 @@ export const FILE_SIGNATURES = { 14: [0x0c, 0x28, 0x38, 0x40, 0x6c, 0x7c], 15: 0x0, 16: 0x0, - 17: 0x0 + 17: 0x0, }, - extractor: extractBMP + extractor: extractBMP, }, { name: "JPEG Extended Range image", @@ -160,9 +164,9 @@ export const FILE_SIGNATURES = { signature: { 0: 0x49, 1: 0x49, - 2: 0xbc + 2: 0xbc, }, - extractor: null + extractor: null, }, { name: "Photoshop image", @@ -181,9 +185,9 @@ export const FILE_SIGNATURES = { 8: 0x0, 9: 0x0, 10: 0x0, - 11: 0x0 + 11: 0x0, }, - extractor: null + extractor: null, }, { name: "Photoshop Large Document", @@ -203,9 +207,9 @@ export const FILE_SIGNATURES = { 9: 0x0, 10: 0x0, 11: 0x0, - 12: 0x0 + 12: 0x0, }, - extractor: null + extractor: null, }, { name: "Paint Shop Pro image", @@ -230,16 +234,16 @@ export const FILE_SIGNATURES = { 13: 0x6f, 14: 0x20, 15: 0x49, - 16: 0x6d + 16: 0x6d, }, { 0: 0x7e, 1: 0x42, 2: 0x4b, - 3: 0x0 - } + 3: 0x0, + }, ], - extractor: null + extractor: null, }, { name: "The GIMP image", @@ -259,9 +263,9 @@ export const FILE_SIGNATURES = { 9: [0x66, 0x76], 10: [0x69, 0x30], 11: [0x6c, 0x30], - 12: [0x65, 0x31, 0x32, 0x33] + 12: [0x65, 0x31, 0x32, 0x33], }, - extractor: null + extractor: null, }, { name: "Icon image", @@ -273,14 +277,17 @@ export const FILE_SIGNATURES = { 1: 0x0, 2: 0x1, 3: 0x0, - 4: [0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15], + 4: [ + 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, + 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + ], 5: 0x0, 6: [0x10, 0x20, 0x30, 0x40, 0x80], 7: [0x10, 0x20, 0x30, 0x40, 0x80], 9: 0x0, - 10: [0x0, 0x1] + 10: [0x0, 0x1], }, - extractor: extractICO + extractor: extractICO, }, { name: "Radiance High Dynamic Range image", @@ -298,9 +305,9 @@ export const FILE_SIGNATURES = { 7: 0x4e, 8: 0x43, 9: 0x45, - 10: 0x0a + 10: 0x0a, }, - extractor: null + extractor: null, }, { name: "Sony ARW image", @@ -315,9 +322,9 @@ export const FILE_SIGNATURES = { 4: 0x41, 5: 0x57, 6: 0x31, - 7: 0x2e + 7: 0x2e, }, - extractor: null + extractor: null, }, { name: "Fujifilm Raw Image", @@ -339,9 +346,9 @@ export const FILE_SIGNATURES = { 11: 0x2d, 12: 0x52, 13: 0x41, - 14: 0x57 + 14: 0x57, }, - extractor: null + extractor: null, }, { name: "Minolta RAW image", @@ -352,9 +359,9 @@ export const FILE_SIGNATURES = { 0: 0x0, 1: 0x4d, // MRM 2: 0x52, - 3: 0x4d + 3: 0x4d, }, - extractor: null + extractor: null, }, { name: "Adobe Bridge Thumbnail Cache", @@ -369,9 +376,9 @@ export const FILE_SIGNATURES = { 4: 0x02, 5: 0x0, 6: 0x0, - 7: 0x0 + 7: 0x0, }, - extractor: null + extractor: null, }, { name: "Microsoft Document Imaging", @@ -382,9 +389,9 @@ export const FILE_SIGNATURES = { 0: 0x45, 1: 0x50, 2: 0x2a, - 3: 0x00 + 3: 0x00, }, - extractor: null + extractor: null, }, { name: "Joint Photographic Experts Group image (under Base64)", @@ -396,9 +403,9 @@ export const FILE_SIGNATURES = { 1: 0x39, 2: 0x6a, 3: 0x2f, - 4: 0x34 + 4: 0x34, }, - extractor: null + extractor: null, }, { name: "Portable Network Graphics image (under Base64)", @@ -412,9 +419,9 @@ export const FILE_SIGNATURES = { 3: 0x4f, 4: 0x52, 5: 0x77, - 6: 0x30 + 6: 0x30, }, - extractor: null + extractor: null, }, { name: "AutoCAD Drawing", @@ -428,9 +435,9 @@ export const FILE_SIGNATURES = { 3: 0x30, 4: [0x30, 0x31], 5: [0x30, 0x31, 0x32, 0x33, 0x34, 0x35], - 6: 0x00 + 6: 0x00, }, - extractor: null + extractor: null, }, { name: "AutoCAD Drawing", @@ -445,7 +452,7 @@ export const FILE_SIGNATURES = { 3: 0x30, 4: 0x31, 5: 0x38, - 6: 0x00 + 6: 0x00, }, { 0: 0x41, @@ -454,7 +461,7 @@ export const FILE_SIGNATURES = { 3: 0x30, 4: 0x32, 5: 0x34, - 6: 0x00 + 6: 0x00, }, { 0: 0x41, @@ -463,10 +470,10 @@ export const FILE_SIGNATURES = { 3: 0x30, 4: 0x32, 5: 0x37, - 6: 0x00 - } + 6: 0x00, + }, ], - extractor: null + extractor: null, }, { name: "Targa Image", @@ -474,7 +481,8 @@ export const FILE_SIGNATURES = { mime: "image/x-targa", description: "", signature: [ - { // This signature is not at the beginning of the file. The extractor works backwards. + { + // This signature is not at the beginning of the file. The extractor works backwards. 0: 0x54, 1: 0x52, 2: 0x55, @@ -491,14 +499,15 @@ export const FILE_SIGNATURES = { 13: 0x49, 14: 0x4c, 15: 0x45, - 16: 0x2e - } + 16: 0x2e, + }, ], - extractor: extractTARGA - } + extractor: extractTARGA, + }, ], - "Video": [ - { // Place before webm + Video: [ + { + // Place before webm name: "Matroska Multimedia Container", extension: "mkv", mime: "video/x-matroska", @@ -511,9 +520,9 @@ export const FILE_SIGNATURES = { 35: 0x6f, 36: 0x73, 37: 0x6b, - 38: 0x61 + 38: 0x61, }, - extractor: null + extractor: null, }, { name: "WEBM video", @@ -524,11 +533,12 @@ export const FILE_SIGNATURES = { 0: 0x1a, 1: 0x45, 2: 0xdf, - 3: 0xa3 + 3: 0xa3, }, - extractor: null + extractor: null, }, - { // Place before MPEG-4 + { + // Place before MPEG-4 name: "Flash MP4 video", extension: "f4v", mime: "video/mp4", @@ -541,9 +551,9 @@ export const FILE_SIGNATURES = { 8: [0x66, 0x46], 9: 0x34, 10: [0x76, 0x56], - 11: 0x20 + 11: 0x20, }, - extractor: null + extractor: null, }, { name: "MPEG-4 video", @@ -559,13 +569,13 @@ export const FILE_SIGNATURES = { 4: 0x66, 5: 0x74, 6: 0x79, - 7: 0x70 + 7: 0x70, }, { 0: 0x33, // 3gp5 1: 0x67, 2: 0x70, - 3: 0x35 + 3: 0x35, }, { 0: 0x0, @@ -591,10 +601,10 @@ export const FILE_SIGNATURES = { 24: 0x69, 25: 0x73, 26: 0x6f, - 27: 0x6d - } + 27: 0x6d, + }, ], - extractor: null + extractor: null, }, { name: "M4V video", @@ -612,9 +622,9 @@ export const FILE_SIGNATURES = { 7: 0x70, 8: 0x4d, 9: 0x34, - 10: 0x56 + 10: 0x56, }, - extractor: null + extractor: null, }, { name: "Quicktime video", @@ -629,9 +639,9 @@ export const FILE_SIGNATURES = { 4: 0x66, 5: 0x74, 6: 0x79, - 7: 0x70 + 7: 0x70, }, - extractor: null + extractor: null, }, { name: "Audio Video Interleave", @@ -645,9 +655,9 @@ export const FILE_SIGNATURES = { 3: 0x46, 8: 0x41, 9: 0x56, - 10: 0x49 + 10: 0x49, }, - extractor: null + extractor: null, }, { name: "Windows Media Video", @@ -664,9 +674,9 @@ export const FILE_SIGNATURES = { 6: 0xcf, 7: 0x11, 8: 0xa6, - 9: 0xd9 + 9: 0xd9, }, - extractor: null + extractor: null, }, { name: "MPEG video", @@ -677,9 +687,9 @@ export const FILE_SIGNATURES = { 0: 0x0, 1: 0x0, 2: 0x1, - 3: 0xba + 3: 0xba, }, - extractor: null + extractor: null, }, { name: "Flash Video", @@ -690,9 +700,9 @@ export const FILE_SIGNATURES = { 0: 0x46, 1: 0x4c, 2: 0x56, - 3: 0x1 + 3: 0x1, }, - extractor: extractFLV + extractor: extractFLV, }, { name: "OGG Video", @@ -712,7 +722,7 @@ export const FILE_SIGNATURES = { 30: 0x69, 31: 0x64, 32: 0x65, - 33: 0x6f + 33: 0x6f, }, { 0: 0x4f, // OggS @@ -727,7 +737,7 @@ export const FILE_SIGNATURES = { 31: 0x65, 32: 0x6f, 33: 0x72, - 34: 0x61 + 34: 0x61, }, { 0: 0x4f, // OggS @@ -742,13 +752,13 @@ export const FILE_SIGNATURES = { 31: 0x68, 32: 0x65, 33: 0x61, - 34: 0x64 - } + 34: 0x64, + }, ], - extractor: null + extractor: null, }, ], - "Audio": [ + Audio: [ { name: "Waveform Audio", extension: "wav", @@ -762,9 +772,9 @@ export const FILE_SIGNATURES = { 8: 0x57, 9: 0x41, 10: 0x56, - 11: 0x45 + 11: 0x45, }, - extractor: extractWAV + extractor: extractWAV, }, { name: "OGG audio", @@ -775,9 +785,9 @@ export const FILE_SIGNATURES = { 0: 0x4f, 1: 0x67, 2: 0x67, - 3: 0x53 + 3: 0x53, }, - extractor: null + extractor: null, }, { name: "Musical Instrument Digital Interface audio", @@ -788,9 +798,9 @@ export const FILE_SIGNATURES = { 0: 0x4d, 1: 0x54, 2: 0x68, - 3: 0x64 + 3: 0x64, }, - extractor: null + extractor: null, }, { name: "MPEG-3 audio", @@ -801,14 +811,14 @@ export const FILE_SIGNATURES = { { 0: 0x49, 1: 0x44, - 2: 0x33 + 2: 0x33, }, { 0: 0xff, - 1: 0xfb - } + 1: 0xfb, + }, ], - extractor: extractMP3 + extractor: extractMP3, }, { name: "MPEG-4 Part 14 audio", @@ -823,16 +833,16 @@ export const FILE_SIGNATURES = { 7: 0x70, 8: 0x4d, 9: 0x34, - 10: 0x41 + 10: 0x41, }, { 0: 0x4d, 1: 0x34, 2: 0x41, - 3: 0x20 - } + 3: 0x20, + }, ], - extractor: null + extractor: null, }, { name: "Free Lossless Audio Codec", @@ -843,9 +853,9 @@ export const FILE_SIGNATURES = { 0: 0x66, 1: 0x4c, 2: 0x61, - 3: 0x43 + 3: 0x43, }, - extractor: null + extractor: null, }, { name: "Adaptive Multi-Rate audio codec", @@ -858,9 +868,9 @@ export const FILE_SIGNATURES = { 2: 0x41, 3: 0x4d, 4: 0x52, - 5: 0x0a + 5: 0x0a, }, - extractor: null + extractor: null, }, { name: "Audacity", @@ -889,9 +899,9 @@ export const FILE_SIGNATURES = { 37: 0x46, 38: 0x69, 39: 0x6c, - 40: 0x65 + 40: 0x65, }, - extractor: null + extractor: null, }, { name: "Audacity Block", @@ -915,9 +925,9 @@ export const FILE_SIGNATURES = { 13: 0x46, 14: 0x69, 15: 0x6c, - 16: 0x65 + 16: 0x65, }, - extractor: null + extractor: null, }, { name: "Audio Interchange File", @@ -932,9 +942,9 @@ export const FILE_SIGNATURES = { 8: 0x41, // AIFF 9: 0x49, 10: 0x46, - 11: 0x46 + 11: 0x46, }, - extractor: null + extractor: null, }, { name: "Audio Interchange File (compressed)", @@ -949,12 +959,12 @@ export const FILE_SIGNATURES = { 8: 0x41, // AIFC 9: 0x49, 10: 0x46, - 11: 0x43 + 11: 0x43, }, - extractor: null - } + extractor: null, + }, ], - "Documents": [ + Documents: [ { name: "Portable Document Format", extension: "pdf", @@ -964,9 +974,9 @@ export const FILE_SIGNATURES = { 0: 0x25, 1: 0x50, 2: 0x44, - 3: 0x46 + 3: 0x46, }, - extractor: extractPDF + extractor: extractPDF, }, { name: "Portable Document Format (under Base64)", @@ -980,11 +990,12 @@ export const FILE_SIGNATURES = { 3: 0x42, 4: 0x45, 5: 0x52, - 6: 0x69 + 6: 0x69, }, - extractor: null + extractor: null, }, - { // Place before PostScript + { + // Place before PostScript name: "Adobe PostScript", extension: "ps,eps,ai,pfa", mime: "application/postscript", @@ -999,9 +1010,9 @@ export const FILE_SIGNATURES = { 6: 0x64, 7: 0x6f, 8: 0x62, - 9: 0x65 + 9: 0x65, }, - extractor: null + extractor: null, }, { name: "PostScript", @@ -1010,9 +1021,9 @@ export const FILE_SIGNATURES = { description: "", signature: { 0: 0x25, - 1: 0x21 + 1: 0x21, }, - extractor: null + extractor: null, }, { name: "Encapsulated PostScript", @@ -1023,9 +1034,9 @@ export const FILE_SIGNATURES = { 0: 0xc5, 1: 0xd0, 2: 0xd3, - 3: 0xc6 + 3: 0xc6, }, - extractor: null + extractor: null, }, { name: "Rich Text Format", @@ -1036,13 +1047,14 @@ export const FILE_SIGNATURES = { 0: 0x7b, 1: 0x5c, 2: 0x72, - 3: 0x74 + 3: 0x74, }, - extractor: extractRTF + extractor: extractRTF, }, { name: "Microsoft Office document/OLE2", - extension: "ole2,doc,xls,dot,ppt,xla,ppa,pps,pot,msi,sdw,db,vsd,msg", + extension: + "ole2,doc,xls,dot,ppt,xla,ppa,pps,pot,msi,sdw,db,vsd,msg", mime: "application/msword,application/vnd.ms-excel,application/vnd.ms-powerpoint", description: "Microsoft Office documents", signature: { @@ -1053,9 +1065,9 @@ export const FILE_SIGNATURES = { 4: 0xa1, 5: 0xb1, 6: 0x1a, - 7: 0xe1 + 7: 0xe1, }, - extractor: null + extractor: null, }, { name: "Microsoft Office document/OLE2 (under Base64)", @@ -1070,9 +1082,9 @@ export const FILE_SIGNATURES = { 4: 0x34, 5: 0x4b, 6: 0x47, - 7: 0x78 + 7: 0x78, }, - extractor: null + extractor: null, }, { name: "Microsoft Office 2007+ document", @@ -1090,9 +1102,9 @@ export const FILE_SIGNATURES = { 45: 0x2e, 46: 0x78, 47: 0x6d, - 48: 0x6c + 48: 0x6c, }, - extractor: extractZIP + extractor: extractZIP, }, { name: "Microsoft Access database", @@ -1115,9 +1127,9 @@ export const FILE_SIGNATURES = { 12: 0x20, 13: 0x4a, 14: 0x65, - 15: 0x74 + 15: 0x74, }, - extractor: null + extractor: null, }, { name: "Microsoft Access 2007+ database", @@ -1141,9 +1153,9 @@ export const FILE_SIGNATURES = { 13: 0x41, 14: 0x43, 15: 0x45, - 16: 0x20 + 16: 0x20, }, - extractor: null + extractor: null, }, { name: "Microsoft OneNote document", @@ -1166,9 +1178,9 @@ export const FILE_SIGNATURES = { 12: 0xd0, 13: 0x29, 14: 0x96, - 15: 0xd3 + 15: 0xd3, }, - extractor: null + extractor: null, }, { name: "Outlook Express database", @@ -1181,9 +1193,9 @@ export const FILE_SIGNATURES = { 2: 0x12, 3: 0xfe, 4: [0x30, 0xc5, 0xc6, 0xc7], - 11: 0x11 + 11: 0x11, }, - extractor: null + extractor: null, }, { name: "Personal Storage Table (Outlook)", @@ -1194,9 +1206,9 @@ export const FILE_SIGNATURES = { 0: 0x21, // !BDN 1: 0x42, 2: 0x44, - 3: 0x4e + 3: 0x4e, }, - extractor: null + extractor: null, }, { name: "Microsoft Exchange Database", @@ -1215,9 +1227,9 @@ export const FILE_SIGNATURES = { 12: [0x00, 0x01], 13: 0x00, 14: 0x00, - 15: 0x00 + 15: 0x00, }, - extractor: null + extractor: null, }, { name: "WordPerfect document", @@ -1231,9 +1243,9 @@ export const FILE_SIGNATURES = { 3: 0x43, 7: [0x00, 0x01, 0x02], 8: 0x01, - 9: 0x0a + 9: 0x0a, }, - extractor: null + extractor: null, }, { name: "EPUB e-book", @@ -1272,12 +1284,12 @@ export const FILE_SIGNATURES = { 54: 0x2b, 55: 0x7a, 56: 0x69, - 57: 0x70 + 57: 0x70, }, - extractor: extractZIP + extractor: extractZIP, }, ], - "Applications": [ + Applications: [ { name: "Windows Portable Executable", extension: "exe,dll,drv,vxd,sys,ocx,vbx,com,fon,scr", @@ -1287,22 +1299,23 @@ export const FILE_SIGNATURES = { 0: 0x4d, 1: 0x5a, 3: [0x0, 0x1, 0x2], - 5: [0x0, 0x1, 0x2] + 5: [0x0, 0x1, 0x2], }, - extractor: extractMZPE + extractor: extractMZPE, }, { name: "Executable and Linkable Format", extension: "elf,bin,axf,o,prx,so", mime: "application/x-executable", - description: "Executable and Linkable Format file. No standard file extension.", + description: + "Executable and Linkable Format file. No standard file extension.", signature: { 0: 0x7f, 1: 0x45, 2: 0x4c, - 3: 0x46 + 3: 0x46, }, - extractor: extractELF + extractor: extractELF, }, { name: "MacOS Mach-O object", @@ -1318,7 +1331,7 @@ export const FILE_SIGNATURES = { 4: 0x00, 5: 0x00, 6: 0x00, - 7: [0x01, 0x02, 0x03] + 7: [0x01, 0x02, 0x03], }, { 0: 0xce, @@ -1329,10 +1342,10 @@ export const FILE_SIGNATURES = { 5: 0x00, 6: 0x00, 7: 0x00, - 8: [0x01, 0x02, 0x03] - } + 8: [0x01, 0x02, 0x03], + }, ], - extractor: extractMACHO + extractor: extractMACHO, }, { name: "MacOS Mach-O 64-bit object", @@ -1343,9 +1356,9 @@ export const FILE_SIGNATURES = { 0: 0xcf, 1: 0xfa, 2: 0xed, - 3: 0xfe + 3: 0xfe, }, - extractor: extractMACHO + extractor: extractMACHO, }, { name: "Adobe Flash", @@ -1357,7 +1370,7 @@ export const FILE_SIGNATURES = { 1: 0x57, 2: 0x53, }, - extractor: null + extractor: null, }, { name: "Java Class", @@ -1368,9 +1381,9 @@ export const FILE_SIGNATURES = { 0: 0xca, 1: 0xfe, 2: 0xba, - 3: 0xbe + 3: 0xbe, }, - extractor: null + extractor: null, }, { name: "Dalvik Executable", @@ -1385,9 +1398,9 @@ export const FILE_SIGNATURES = { 4: 0x30, 5: 0x33, 6: 0x35, - 7: 0x0 + 7: 0x0, }, - extractor: null + extractor: null, }, { name: "Google Chrome Extension", @@ -1398,12 +1411,12 @@ export const FILE_SIGNATURES = { 0: 0x43, 1: 0x72, 2: 0x32, - 3: 0x34 + 3: 0x34, }, - extractor: null + extractor: null, }, ], - "Archives": [ + Archives: [ { name: "PKZIP archive", extension: "zip", @@ -1413,9 +1426,9 @@ export const FILE_SIGNATURES = { 0: 0x50, 1: 0x4b, 2: [0x3, 0x5, 0x7], - 3: [0x4, 0x6, 0x8] + 3: [0x4, 0x6, 0x8], }, - extractor: extractZIP + extractor: extractZIP, }, { name: "PKZIP archive (under Base64)", @@ -1428,9 +1441,9 @@ export const FILE_SIGNATURES = { 2: 0x73, 3: 0x44, 4: 0x42, - 5: 0x42 + 5: 0x42, }, - extractor: null + extractor: null, }, { name: "TAR archive", @@ -1442,9 +1455,9 @@ export const FILE_SIGNATURES = { 258: 0x73, 259: 0x74, 260: 0x61, - 261: 0x72 + 261: 0x72, }, - extractor: extractTAR + extractor: extractTAR, }, { name: "Roshal Archive", @@ -1458,9 +1471,9 @@ export const FILE_SIGNATURES = { 3: 0x21, 4: 0x1a, 5: 0x7, - 6: [0x0, 0x1] + 6: [0x0, 0x1], }, - extractor: null + extractor: null, }, { name: "Gzip", @@ -1470,9 +1483,9 @@ export const FILE_SIGNATURES = { signature: { 0: 0x1f, 1: 0x8b, - 2: 0x8 + 2: 0x8, }, - extractor: extractGZIP + extractor: extractGZIP, }, { name: "Bzip2", @@ -1482,9 +1495,9 @@ export const FILE_SIGNATURES = { signature: { 0: 0x42, 1: 0x5a, - 2: 0x68 + 2: 0x68, }, - extractor: extractBZIP2 + extractor: extractBZIP2, }, { name: "7zip", @@ -1497,9 +1510,9 @@ export const FILE_SIGNATURES = { 2: 0xbc, 3: 0xaf, 4: 0x27, - 5: 0x1c + 5: 0x1c, }, - extractor: null + extractor: null, }, { name: "Zlib Deflate", @@ -1508,9 +1521,9 @@ export const FILE_SIGNATURES = { description: "", signature: { 0: 0x78, - 1: [0x1, 0x9c, 0xda, 0x5e] + 1: [0x1, 0x9c, 0xda, 0x5e], }, - extractor: extractZlib + extractor: extractZlib, }, { name: "xz compression", @@ -1523,9 +1536,9 @@ export const FILE_SIGNATURES = { 2: 0x7a, 3: 0x58, 4: 0x5a, - 5: 0x0 + 5: 0x0, }, - extractor: extractXZ + extractor: extractXZ, }, { name: "Tarball", @@ -1534,9 +1547,9 @@ export const FILE_SIGNATURES = { description: "", signature: { 0: 0x1f, - 1: [0x9d, 0xa0] + 1: [0x9d, 0xa0], }, - extractor: null + extractor: null, }, { name: "ISO disk image", @@ -1549,24 +1562,24 @@ export const FILE_SIGNATURES = { 0x8002: 0x44, 0x8003: 0x30, 0x8004: 0x30, - 0x8005: 0x31 + 0x8005: 0x31, }, { 0x8801: 0x43, 0x8802: 0x44, 0x8803: 0x30, 0x8804: 0x30, - 0x8805: 0x31 + 0x8805: 0x31, }, { 0x9001: 0x43, 0x9002: 0x44, 0x9003: 0x30, 0x9004: 0x30, - 0x9005: 0x31 - } + 0x9005: 0x31, + }, ], - extractor: null + extractor: null, }, { name: "Virtual Machine Disk", @@ -1580,9 +1593,9 @@ export const FILE_SIGNATURES = { 3: 0x56, 5: 0x00, 6: 0x00, - 7: 0x00 + 7: 0x00, }, - extractor: null + extractor: null, }, { name: "Virtual Hard Drive", @@ -1597,9 +1610,9 @@ export const FILE_SIGNATURES = { 4: 0x63, 5: 0x74, 6: 0x69, - 7: 0x78 + 7: 0x78, }, - extractor: null + extractor: null, }, { name: "Macintosh disk image", @@ -1614,9 +1627,9 @@ export const FILE_SIGNATURES = { 4: 0x62, 5: 0x62, 6: 0x60, - 7: 0x60 + 7: 0x60, }, - extractor: null + extractor: null, }, { name: "ARJ Archive", @@ -1628,9 +1641,9 @@ export const FILE_SIGNATURES = { 1: 0xea, 8: [0x0, 0x10, 0x14], 9: 0x0, - 10: 0x2 + 10: 0x2, }, - extractor: null + extractor: null, }, { name: "WinAce Archive", @@ -1644,9 +1657,9 @@ export const FILE_SIGNATURES = { 10: 0x43, 11: 0x45, 12: 0x2a, - 13: 0x2a + 13: 0x2a, }, - extractor: null + extractor: null, }, { name: "Macintosh BinHex Encoded File", @@ -1654,7 +1667,7 @@ export const FILE_SIGNATURES = { mime: "application/mac-binhex", description: "", signature: { - 11: 0x6d, // must be converted with BinHex + 11: 0x6d, // must be converted with BinHex 12: 0x75, 13: 0x73, 14: 0x74, @@ -1682,9 +1695,9 @@ export const FILE_SIGNATURES = { 36: 0x6e, 37: 0x48, 38: 0x65, - 39: 0x78 + 39: 0x78, }, - extractor: null + extractor: null, }, { name: "ALZip Archive", @@ -1699,9 +1712,9 @@ export const FILE_SIGNATURES = { 4: 0x0a, 5: 0x0, 6: 0x0, - 7: 0x0 + 7: 0x0, }, - extractor: null + extractor: null, }, { name: "KGB Compressed Archive", @@ -1718,9 +1731,9 @@ export const FILE_SIGNATURES = { 6: 0x63, 7: 0x68, 8: 0x20, - 9: 0x2d + 9: 0x2d, }, - extractor: null + extractor: null, }, { name: "Microsoft Cabinet", @@ -1735,9 +1748,9 @@ export const FILE_SIGNATURES = { 4: 0x00, 5: 0x00, 6: 0x00, - 7: 0x00 + 7: 0x00, }, - extractor: null + extractor: null, }, { name: "Jar Archive", @@ -1748,9 +1761,9 @@ export const FILE_SIGNATURES = { 0: 0x5f, 1: 0x27, 2: 0xa8, - 3: 0x89 + 3: 0x89, }, - extractor: null + extractor: null, }, { name: "Jar Archive", @@ -1759,7 +1772,7 @@ export const FILE_SIGNATURES = { description: "", signature: { 0: 0x50, - 1: 0x4B, + 1: 0x4b, 2: 0x03, 3: 0x04, 4: 0x14, @@ -1767,9 +1780,9 @@ export const FILE_SIGNATURES = { 6: 0x08, 7: 0x00, 8: 0x08, - 9: 0x00 + 9: 0x00, }, - extractor: extractZIP + extractor: extractZIP, }, { name: "lzop compressed", @@ -1784,9 +1797,9 @@ export const FILE_SIGNATURES = { 4: 0x00, 5: 0x0d, 6: 0x0a, - 7: 0x1a + 7: 0x1a, }, - extractor: extractLZOP + extractor: extractLZOP, }, { name: "Linux deb package", @@ -1795,14 +1808,14 @@ export const FILE_SIGNATURES = { description: "", signature: { 0: 0x21, - 1: 0x3C, + 1: 0x3c, 2: 0x61, 3: 0x72, 4: 0x63, 5: 0x68, - 6: 0x3e + 6: 0x3e, }, - extractor: extractDEB + extractor: extractDEB, }, { name: "Apple Disk Image", @@ -1816,47 +1829,51 @@ export const FILE_SIGNATURES = { 3: 0x0d, 4: 0x62, 5: 0x62, - 6: 0x60 + 6: 0x60, }, - extractor: null - } + extractor: null, + }, ], - "Miscellaneous": [ + Miscellaneous: [ { name: "UTF-8 text", extension: "txt", mime: "text/plain", - description: "UTF-8 encoded Unicode byte order mark, commonly but not exclusively seen in text files.", + description: + "UTF-8 encoded Unicode byte order mark, commonly but not exclusively seen in text files.", signature: { 0: 0xef, 1: 0xbb, - 2: 0xbf + 2: 0xbf, }, - extractor: null + extractor: null, }, - { // Place before UTF-16 LE text + { + // Place before UTF-16 LE text name: "UTF-32 LE text", extension: "utf32le", mime: "charset/utf32le", - description: "Little-endian UTF-32 encoded Unicode byte order mark.", + description: + "Little-endian UTF-32 encoded Unicode byte order mark.", signature: { 0: 0xff, 1: 0xfe, 2: 0x00, - 3: 0x00 + 3: 0x00, }, - extractor: null + extractor: null, }, { name: "UTF-16 LE text", extension: "utf16le", mime: "charset/utf16le", - description: "Little-endian UTF-16 encoded Unicode byte order mark.", + description: + "Little-endian UTF-16 encoded Unicode byte order mark.", signature: { 0: 0xff, - 1: 0xfe + 1: 0xfe, }, - extractor: null + extractor: null, }, { name: "Web Open Font Format", @@ -1871,9 +1888,9 @@ export const FILE_SIGNATURES = { 4: 0x0, 5: 0x1, 6: 0x0, - 7: 0x0 + 7: 0x0, }, - extractor: null + extractor: null, }, { name: "Web Open Font Format 2", @@ -1888,9 +1905,9 @@ export const FILE_SIGNATURES = { 4: 0x0, 5: 0x1, 6: 0x0, - 7: 0x0 + 7: 0x0, }, - extractor: null + extractor: null, }, { name: "Embedded OpenType font", @@ -1903,24 +1920,24 @@ export const FILE_SIGNATURES = { 9: 0x0, 10: 0x1, 34: 0x4c, - 35: 0x50 + 35: 0x50, }, { 8: 0x1, 9: 0x0, 10: 0x0, 34: 0x4c, - 35: 0x50 + 35: 0x50, }, { 8: 0x2, 9: 0x0, 10: 0x2, 34: 0x4c, - 35: 0x50 + 35: 0x50, }, ], - extractor: null + extractor: null, }, { name: "TrueType Font", @@ -1932,9 +1949,9 @@ export const FILE_SIGNATURES = { 1: 0x1, 2: 0x0, 3: 0x0, - 4: 0x0 + 4: 0x0, }, - extractor: null + extractor: null, }, { name: "OpenType Font", @@ -1946,9 +1963,9 @@ export const FILE_SIGNATURES = { 1: 0x54, 2: 0x54, 3: 0x4f, - 4: 0x0 + 4: 0x0, }, - extractor: null + extractor: null, }, { name: "SQLite", @@ -1959,9 +1976,9 @@ export const FILE_SIGNATURES = { 0: 0x53, 1: 0x51, 2: 0x4c, - 3: 0x69 + 3: 0x69, }, - extractor: extractSQLITE + extractor: extractSQLITE, }, { name: "BitTorrent link", @@ -1983,7 +2000,7 @@ export const FILE_SIGNATURES = { 10: 0x65, 11: 0x23, 12: 0x23, - 13: 0x3a + 13: 0x3a, }, { 0: 0x64, // d4:infod @@ -1995,10 +2012,10 @@ export const FILE_SIGNATURES = { 6: 0x6f, 7: 0x64, 8: [0x34, 0x35, 0x36], - 9: 0x3a - } + 9: 0x3a, + }, ], - extractor: null + extractor: null, }, { name: "Cryptocurrency wallet", @@ -2021,9 +2038,9 @@ export const FILE_SIGNATURES = { 12: 0x62, 13: 0x31, 14: 0x05, - 15: 0x00 + 15: 0x00, }, - extractor: null + extractor: null, }, { name: "Registry fragment", @@ -2035,9 +2052,9 @@ export const FILE_SIGNATURES = { 1: 0x62, 2: 0x69, 3: 0x6e, - 4: 0x00 + 4: 0x00, }, - extractor: null + extractor: null, }, { name: "Registry script", @@ -2052,9 +2069,9 @@ export const FILE_SIGNATURES = { 4: 0x0d, 5: 0x0a, 6: 0x5c, - 7: 0x7b + 7: 0x7b, }, - extractor: null + extractor: null, }, { name: "WinNT Registry Hive", @@ -2065,9 +2082,9 @@ export const FILE_SIGNATURES = { 0: 0x72, 1: 0x65, 2: 0x67, - 3: 0x66 + 3: 0x66, }, - extractor: null + extractor: null, }, { name: "Windows Event Log", @@ -2082,9 +2099,9 @@ export const FILE_SIGNATURES = { 4: 0x4c, 5: 0x66, 6: 0x4c, - 7: 0x65 + 7: 0x65, }, - extractor: extractEVT + extractor: extractEVT, }, { name: "Windows Event Log", @@ -2098,9 +2115,9 @@ export const FILE_SIGNATURES = { 3: 0x46, 4: 0x69, 5: 0x6c, - 6: 0x65 + 6: 0x65, }, - extractor: extractEVTX + extractor: extractEVTX, }, { name: "Windows Pagedump", @@ -2115,9 +2132,9 @@ export const FILE_SIGNATURES = { 4: 0x44, 5: 0x55, 6: [0x4d, 0x36], - 7: [0x50, 0x34] + 7: [0x50, 0x34], }, - extractor: extractDMP + extractor: extractDMP, }, { name: "Windows Prefetch", @@ -2132,9 +2149,9 @@ export const FILE_SIGNATURES = { 4: 0x53, 5: 0x43, 6: 0x43, - 7: 0x41 + 7: 0x41, }, - extractor: extractPF + extractor: extractPF, }, { name: "Windows Prefetch (Win 10)", @@ -2146,9 +2163,9 @@ export const FILE_SIGNATURES = { 1: 0x41, 2: 0x4d, 3: 0x04, - 7: 0x0 + 7: 0x0, }, - extractor: extractPFWin10 + extractor: extractPFWin10, }, { name: "PList (XML)", @@ -2170,13 +2187,14 @@ export const FILE_SIGNATURES = { 50: 0x6c, 51: 0x69, 52: 0x73, - 53: 0x74 + 53: 0x74, }, - extractor: extractPListXML + extractor: extractPListXML, }, { name: "PList (binary)", - extension: "bplist,plist,ipmeta,abcdp,mdbackup,mdinfo,strings,nib,ichat,qtz,webbookmark,webhistory", + extension: + "bplist,plist,ipmeta,abcdp,mdbackup,mdinfo,strings,nib,ichat,qtz,webbookmark,webhistory", mime: "application/x-plist", description: "", signature: { @@ -2187,9 +2205,9 @@ export const FILE_SIGNATURES = { 4: 0x73, 5: 0x74, 6: 0x30, - 7: 0x30 + 7: 0x30, }, - extractor: null + extractor: null, }, { name: "MacOS X Keychain", @@ -2202,9 +2220,9 @@ export const FILE_SIGNATURES = { 2: 0x63, 3: 0x68, 4: 0x00, - 5: 0x01 + 5: 0x01, }, - extractor: extractMacOSXKeychain + extractor: extractMacOSXKeychain, }, { name: "TCP Packet", @@ -2217,10 +2235,10 @@ export const FILE_SIGNATURES = { 14: 0x45, 15: 0x00, 21: 0x00, - 22: b => b >= 0x01 && b <= 0x80, - 23: 0x06 + 22: (b) => b >= 0x01 && b <= 0x80, + 23: 0x06, }, - extractor: null + extractor: null, }, { name: "UDP Packet", @@ -2233,10 +2251,10 @@ export const FILE_SIGNATURES = { 14: 0x45, 15: 0x00, 16: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05], - 22: b => b >= 0x01 && b <= 0x80, - 23: 0x11 + 22: (b) => b >= 0x01 && b <= 0x80, + 23: 0x11, }, - extractor: null + extractor: null, }, { name: "Compiled HTML", @@ -2251,9 +2269,9 @@ export const FILE_SIGNATURES = { 4: 0x03, 5: 0x00, 6: 0x00, - 7: 0x00 + 7: 0x00, }, - extractor: null + extractor: null, }, { name: "Windows Password", @@ -2264,9 +2282,9 @@ export const FILE_SIGNATURES = { 0: 0xe3, 1: 0x82, 2: 0x85, - 3: 0x96 + 3: 0x96, }, - extractor: null + extractor: null, }, { name: "Bitlocker recovery key", @@ -2295,9 +2313,9 @@ export const FILE_SIGNATURES = { 18: 0x72, 19: 0x00, 20: 0x20, - 21: 0x00 + 21: 0x00, }, - extractor: null + extractor: null, }, { name: "Certificate", @@ -2307,9 +2325,9 @@ export const FILE_SIGNATURES = { signature: { 0: 0x30, 1: 0x82, - 4: [0x06, 0x0a, 0x30] + 4: [0x06, 0x0a, 0x30], }, - extractor: null + extractor: null, }, { name: "Certificate", @@ -2319,11 +2337,11 @@ export const FILE_SIGNATURES = { signature: { 0: 0x30, 1: 0x83, - 2: b => b !== 0x00, + 2: (b) => b !== 0x00, 5: 0x06, - 6: 0x09 + 6: 0x09, }, - extractor: null + extractor: null, }, { name: "PGP pubring", @@ -2334,9 +2352,9 @@ export const FILE_SIGNATURES = { 0: 0x99, 1: 0x01, 2: [0x0d, 0xa2], - 3: 0x04 + 3: 0x04, }, - extractor: null + extractor: null, }, { name: "PGP secring", @@ -2348,22 +2366,22 @@ export const FILE_SIGNATURES = { 0: 0x95, 1: 0x01, 2: 0xcf, - 3: 0x04 + 3: 0x04, }, { 0: 0x95, 1: 0x03, 2: 0xc6, - 3: 0x04 + 3: 0x04, }, { 0: 0x95, 1: 0x05, 2: 0x86, - 3: 0x04 - } + 3: 0x04, + }, ], - extractor: null + extractor: null, }, { name: "PGP Safe", @@ -2381,9 +2399,9 @@ export const FILE_SIGNATURES = { 7: 0x4e, 8: 0x60, 9: 0x01, - 10: 0x00 + 10: 0x00, }, - extractor: null + extractor: null, }, { name: "Task Scheduler", @@ -2396,9 +2414,9 @@ export const FILE_SIGNATURES = { 2: 0x01, 3: 0x00, 20: 0x46, - 21: 0x00 + 21: 0x00, }, - extractor: null + extractor: null, }, { name: "Windows Shortcut", @@ -2425,9 +2443,9 @@ export const FILE_SIGNATURES = { 16: 0x00, 17: 0x00, 18: 0x00, - 19: 0x46 + 19: 0x46, }, - extractor: extractLNK + extractor: extractLNK, }, { name: "Bash", @@ -2447,7 +2465,7 @@ export const FILE_SIGNATURES = { 9: 0x73, 10: 0x68, }, - extractor: null + extractor: null, }, { name: "Shell", @@ -2465,7 +2483,7 @@ export const FILE_SIGNATURES = { 7: 0x73, 8: 0x68, }, - extractor: null + extractor: null, }, { name: "Python", @@ -2492,7 +2510,7 @@ export const FILE_SIGNATURES = { 16: 0x6e, 17: [0x32, 0x33, 0xa, 0xd], }, - extractor: null + extractor: null, }, { name: "Ruby", @@ -2516,7 +2534,7 @@ export const FILE_SIGNATURES = { 13: 0x62, 14: 0x79, }, - extractor: null + extractor: null, }, { name: "perl", @@ -2540,7 +2558,7 @@ export const FILE_SIGNATURES = { 13: 0x72, 14: 0x6c, }, - extractor: null + extractor: null, }, { name: "php", @@ -2554,7 +2572,7 @@ export const FILE_SIGNATURES = { 3: 0x68, 4: 0x70, }, - extractor: null + extractor: null, }, { name: "Smile", @@ -2564,9 +2582,9 @@ export const FILE_SIGNATURES = { signature: { 0: 0x3a, 1: 0x29, - 2: 0xa + 2: 0xa, }, - extractor: null + extractor: null, }, { name: "Lua Bytecode", @@ -2577,9 +2595,9 @@ export const FILE_SIGNATURES = { 0: 0x1b, 1: 0x4c, 2: 0x75, - 3: 0x61 + 3: 0x61, }, - extractor: null + extractor: null, }, { name: "WebAssembly binary", @@ -2590,14 +2608,13 @@ export const FILE_SIGNATURES = { 0: 0x00, 1: 0x61, 2: 0x73, - 3: 0x6d + 3: 0x6d, }, - extractor: null - } - ] + extractor: null, + }, + ], }; - /** * JPEG extractor. * @@ -2610,7 +2627,10 @@ export function extractJPEG(bytes, offset) { while (stream.hasMore()) { const marker = stream.getBytes(2); - if (marker[0] !== 0xff) throw new Error(`Invalid marker while parsing JPEG at pos ${stream.position}: ${marker}`); + if (marker[0] !== 0xff) + throw new Error( + `Invalid marker while parsing JPEG at pos ${stream.position}: ${marker}`, + ); let segmentSize = 0; switch (marker[1]) { @@ -2701,7 +2721,6 @@ export function extractJPEG(bytes, offset) { throw new Error("Unable to parse JPEG successfully"); } - /** * GIF extractor. * @@ -2730,21 +2749,18 @@ export function extractGIF(bytes, offset) { while (stream.getBytes(2) !== [0x21, 0xf9]) { stream.moveBackwardsBy(2); stream.moveForwardsBy(stream.readInt(1)); - if (!stream.readInt(1)) - break; + if (!stream.readInt(1)) break; stream.moveBackwardsBy(1); } // When the end of the file is [0x00, 0x3b], end. - if (stream.readInt(1) === 0x3b) - break; + if (stream.readInt(1) === 0x3b) break; stream.moveForwardsBy(1); } return stream.carve(); } - /** * Portable executable extractor. * Assumes that the offset refers to an MZ header. @@ -2812,7 +2828,6 @@ export function extractMZPE(bytes, offset) { return stream.carve(); } - /** * PDF extractor. * @@ -2832,7 +2847,6 @@ export function extractPDF(bytes, offset) { return stream.carve(); } - /** * ZIP extractor. * @@ -2854,7 +2868,6 @@ export function extractZIP(bytes, offset) { return stream.carve(); } - /** * MACHO extractor * @@ -2863,13 +2876,11 @@ export function extractZIP(bytes, offset) { * @returns {Uint8Array} */ export function extractMACHO(bytes, offset) { - // Magic bytes. const MHCIGAM64 = "207250237254"; const MHMAGIC64 = "254237250207"; const MHCIGAM = "206250237254"; - /** * Checks to see if the file is 64-bit. * @@ -2880,7 +2891,6 @@ export function extractMACHO(bytes, offset) { return magic === MHCIGAM64 || magic === MHMAGIC64; } - /** * Checks the endianness of the file. * @@ -2891,7 +2901,6 @@ export function extractMACHO(bytes, offset) { return magic === MHCIGAM || magic === MHCIGAM64; } - /** * Jumps through segment information and calculates the sum of the segement sizes. * @@ -2907,12 +2916,10 @@ export function extractMACHO(bytes, offset) { const LCSEGEMENT = 0x1; for (let i = 0; i < ncmds; i++) { - // Move to start of segment. stream.moveTo(offset); const cmd = stream.readInt(4, isSwap); if (cmd === LCSEGEMENT64) { - // Move to size of segment field. stream.moveTo(offset + 48); @@ -2934,7 +2941,6 @@ export function extractMACHO(bytes, offset) { return total; } - /** * Reads the number of command segments. * @@ -2945,8 +2951,7 @@ export function extractMACHO(bytes, offset) { */ function dumpMachHeader(stream, is64, isSwap) { let loadCommandsOffset = 28; - if (is64) - loadCommandsOffset += 4; + if (is64) loadCommandsOffset += 4; // Move to number of commands field. stream.moveTo(16); @@ -2954,16 +2959,20 @@ export function extractMACHO(bytes, offset) { return dumpSegmentCommands(stream, loadCommandsOffset, isSwap, ncmds); } - const stream = new Stream(bytes.slice(offset)); const magic = stream.getBytes(4).join(""); // Move to the end of the final segment. - stream.moveTo(dumpMachHeader(stream, isMagic64(magic), shouldSwapBytes(magic) ? "le" : "be")); + stream.moveTo( + dumpMachHeader( + stream, + isMagic64(magic), + shouldSwapBytes(magic) ? "le" : "be", + ), + ); return stream.carve(); } - /** * TAR extractor. * @@ -2974,10 +2983,12 @@ export function extractMACHO(bytes, offset) { export function extractTAR(bytes, offset) { const stream = new Stream(bytes.slice(offset)); while (stream.hasMore()) { - // Move to ustar identifier. stream.moveForwardsBy(0x101); - if (stream.getBytes(5).join("") !== [0x75, 0x73, 0x74, 0x61, 0x72].join("")) { + if ( + stream.getBytes(5).join("") !== + [0x75, 0x73, 0x74, 0x61, 0x72].join("") + ) { // Reverse back to the end of the last section. stream.moveBackwardsBy(0x106); break; @@ -2993,7 +3004,7 @@ export function extractTAR(bytes, offset) { }); // Round number up from octet to nearest 512. - fsize = (Math.ceil(parseInt(fsize, 8) / 512) * 512); + fsize = Math.ceil(parseInt(fsize, 8) / 512) * 512; // Move forwards to the end of that file. stream.moveForwardsBy(fsize + 0x179); @@ -3002,7 +3013,6 @@ export function extractTAR(bytes, offset) { return stream.carve(); } - /** * PNG extractor. * @@ -3027,11 +3037,9 @@ export function extractPNG(bytes, offset) { stream.moveForwardsBy(chunkSize + 4); } - return stream.carve(); } - /** * WEBP extractor. * @@ -3055,7 +3063,6 @@ export function extractWEBP(bytes, offset) { return stream.carve(); } - /** * BMP extractor. * @@ -3078,7 +3085,6 @@ export function extractBMP(bytes, offset) { return stream.carve(); } - /** * ICO extractor. * @@ -3095,7 +3101,7 @@ export function extractICO(bytes, offset) { const numberFiles = stream.readInt(2, "le"); // Move forward to the last file header. - stream.moveForwardsBy(8 + ((numberFiles-1) * 16)); + stream.moveForwardsBy(8 + (numberFiles - 1) * 16); const fileSize = stream.readInt(4, "le"); const fileOffset = stream.readInt(4, "le"); @@ -3104,7 +3110,6 @@ export function extractICO(bytes, offset) { return stream.carve(); } - /** * TARGA extractor. * @@ -3137,8 +3142,7 @@ export function extractTARGA(bytes, offset) { stream.moveBackwardsBy(sizeOfSize); // If the size matches. - if (size === i) - break; + if (size === i) break; } } @@ -3150,11 +3154,13 @@ export function extractTARGA(bytes, offset) { // The documentation said that 0x100000 was the largest the file could be. for (let i = 0; i < 0x100000; i++) { - // (Height * Width * pixel depth in bits)/8 - const total = (stream.readInt(2, "le") * stream.readInt(2, "le") * stream.readInt(1))/8; - if (total === i-1) - break; + const total = + (stream.readInt(2, "le") * + stream.readInt(2, "le") * + stream.readInt(1)) / + 8; + if (total === i - 1) break; stream.moveBackwardsBy(6); } @@ -3182,13 +3188,12 @@ export function extractTARGA(bytes, offset) { moveBackwardsUntilImageSize(); // Move backwards over the reaminder of the header + the 5 we borrowed in moveBackwardsUntilImageSize(). - stream.moveBackwardsBy(0xc+5); + stream.moveBackwardsBy(0xc + 5); } - return stream.carve(stream.position, offset+0x12); + return stream.carve(stream.position, offset + 0x12); } - /** * WAV extractor. * @@ -3208,7 +3213,6 @@ export function extractWAV(bytes, offset) { return stream.carve(); } - /** * MP3 extractor. * @@ -3220,14 +3224,35 @@ export function extractMP3(bytes, offset) { const stream = new Stream(bytes.slice(offset)); // Constants for flag byte. - const bitRateIndexes = ["free", 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, "bad"]; + const bitRateIndexes = [ + "free", + 32000, + 40000, + 48000, + 56000, + 64000, + 80000, + 96000, + 112000, + 128000, + 160000, + 192000, + 224000, + 256000, + 320000, + "bad", + ]; const samplingRateFrequencyIndex = [44100, 48000, 32000, "reserved"]; // ID3 tag, move over it. - if ((stream.getBytes(3).toString() === [0x49, 0x44, 0x33].toString())) { + if (stream.getBytes(3).toString() === [0x49, 0x44, 0x33].toString()) { stream.moveTo(6); - const tagSize = (stream.readInt(1) << 21) | (stream.readInt(1) << 14) | (stream.readInt(1) << 7) | stream.readInt(1); + const tagSize = + (stream.readInt(1) << 21) | + (stream.readInt(1) << 14) | + (stream.readInt(1) << 7) | + stream.readInt(1); stream.moveForwardsBy(tagSize); } else { stream.moveTo(0); @@ -3235,7 +3260,6 @@ export function extractMP3(bytes, offset) { // Loop over all the frame headers in the file. while (stream.hasMore()) { - // If it has an old TAG frame at the end of it, fixed size, 128 bytes. if (stream.getBytes(3) === [0x54, 0x41, 0x47].toString()) { stream.moveForwardsBy(125); @@ -3261,17 +3285,21 @@ export function extractMP3(bytes, offset) { const padding = (flags & 0x02) >> 1; // Things that are either not standard or undocumented. - if (bitRate === "free" || bitRate === "bad" || sampleRate === "reserved") { + if ( + bitRate === "free" || + bitRate === "bad" || + sampleRate === "reserved" + ) { stream.moveBackwardsBy(1); break; } // Formula: FrameLength = (144 * BitRate / SampleRate ) + Padding - const frameSize = Math.floor(((144 * bitRate) / sampleRate) + padding); + const frameSize = Math.floor((144 * bitRate) / sampleRate + padding); // If the next move goes past the end of the bytestream then extract the entire bytestream. // We assume complete frames in the above formula because there is no field that suggests otherwise. - if ((stream.position + frameSize) > stream.length) { + if (stream.position + frameSize > stream.length) { stream.moveTo(stream.length); break; } else { @@ -3281,7 +3309,6 @@ export function extractMP3(bytes, offset) { return stream.carve(); } - /** * FLV extractor. * @@ -3312,7 +3339,7 @@ export function extractFLV(bytes, offset) { break; } - if (prevTagSize !== (tagSize + 11)) { + if (prevTagSize !== tagSize + 11) { // Previous tag was not valid, reverse back over this header // and the previous tag body and header stream.moveBackwardsBy(tagSize + 11 + 5); @@ -3328,7 +3355,6 @@ export function extractFLV(bytes, offset) { return stream.carve(); } - /** * RTF extractor. * @@ -3341,7 +3367,8 @@ export function extractRTF(bytes, offset) { let openTags = 0; - if (stream.readInt(1) !== 0x7b) { // { + if (stream.readInt(1) !== 0x7b) { + // { throw new Error("Not a valid RTF file"); } else { openTags++; @@ -3368,7 +3395,6 @@ export function extractRTF(bytes, offset) { return stream.carve(); } - /** * SQLITE extractor. * @@ -3388,12 +3414,11 @@ export function extractSQLITE(bytes, offset) { const numPages = stream.readInt(4); // Move to the end of all the pages. - stream.moveTo(pageSize*numPages); + stream.moveTo(pageSize * numPages); return stream.carve(); } - /** * PList (XML) extractor. * @@ -3414,16 +3439,21 @@ export function extractPListXML(bytes, offset) { // While we have an unequal amount of braces. while (braceCount > 0 && stream.hasMore()) { if (stream.readInt(1) === 0x3c) { - // If we hit an . - if (stream.getBytes(7).join("") === [0x2f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x3e].join("")) { + if ( + stream.getBytes(7).join("") === + [0x2f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x3e].join("") + ) { braceCount--; } else { stream.moveBackwardsBy(7); @@ -3435,7 +3465,6 @@ export function extractPListXML(bytes, offset) { return stream.carve(); } - /** * MacOS X Keychain Extactor. * @@ -3455,7 +3484,6 @@ export function extractMacOSXKeychain(bytes, offset) { return stream.carve(); } - /** * OLE2 extractor. * @@ -3466,25 +3494,101 @@ export function extractMacOSXKeychain(bytes, offset) { export function extractOLE2(bytes, offset) { const stream = new Stream(bytes.slice(offset)); const entries = [ - [[0x52, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x20, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79], 19, "Root Entry"], - [[0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x6b], 15, "Workbook"], - [[0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x55, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72], 23, "Current User"], - [[0x50, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, 0x50, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74], 37, "PowerPoint Document"], - [[0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x44, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74], 23, "WordDocument"], + [ + [ + 0x52, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x20, 0x00, + 0x45, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, + ], + 19, + "Root Entry", + ], + [ + [ + 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x62, 0x00, + 0x6f, 0x00, 0x6f, 0x00, 0x6b, + ], + 15, + "Workbook", + ], + [ + [ + 0x43, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x65, 0x00, + 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x55, 0x00, 0x73, 0x00, + 0x65, 0x00, 0x72, + ], + 23, + "Current User", + ], + [ + [ + 0x50, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x65, 0x00, 0x72, 0x00, + 0x50, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x74, 0x00, + 0x20, 0x00, 0x44, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x75, 0x00, + 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, + ], + 37, + "PowerPoint Document", + ], + [ + [ + 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x44, 0x00, + 0x6f, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x65, 0x00, + 0x6e, 0x00, 0x74, + ], + 23, + "WordDocument", + ], [[0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x61], 7, "Data"], - [[0x50, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x75, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73], 15, "Pictures"], - [[0x31, 0x00, 0x54, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65], 11, "1Table"], - [[0x05, 0x00, 0x53, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e], 37, "SummaryInformation"], - [[0x05, 0x00, 0x44, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x53, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e], 53, "DocumentSummaryInformation"], - [[0x43, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x4f, 0x00, 0x62, 0x00, 0x6a], 13, "Comp Obj"], - [[0x01, 0x00], 2, "Entry"] + [ + [ + 0x50, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x75, 0x00, + 0x72, 0x00, 0x65, 0x00, 0x73, + ], + 15, + "Pictures", + ], + [ + [0x31, 0x00, 0x54, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65], + 11, + "1Table", + ], + [ + [ + 0x05, 0x00, 0x53, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x6d, 0x00, + 0x61, 0x00, 0x72, 0x00, 0x79, 0x00, 0x49, 0x00, 0x6e, 0x00, + 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x61, 0x00, + 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, + ], + 37, + "SummaryInformation", + ], + [ + [ + 0x05, 0x00, 0x44, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x75, 0x00, + 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x53, 0x00, + 0x75, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, + 0x79, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x6f, 0x00, + 0x72, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, + 0x6f, 0x00, 0x6e, + ], + 53, + "DocumentSummaryInformation", + ], + [ + [ + 0x43, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x4f, 0x00, + 0x62, 0x00, 0x6a, + ], + 13, + "Comp Obj", + ], + [[0x01, 0x00], 2, "Entry"], ]; let endianness = "le"; // Move to endianess field. stream.moveForwardsBy(28); - if (stream.readInt(2, endianness) === 0xfffe) - endianness = "be"; + if (stream.readInt(2, endianness) === 0xfffe) endianness = "be"; // Calculate the size of the normal sectors. const sizeOfSector = 2 ** stream.readInt(2, endianness); @@ -3493,10 +3597,10 @@ export function extractOLE2(bytes, offset) { stream.moveTo(48); // Read root directory offset. - const rootStuff = stream.readInt(4, endianness); + const rootStuff = stream.readInt(4, endianness); // Calculate root directory offset. - let total = 512 + (rootStuff * sizeOfSector); + let total = 512 + rootStuff * sizeOfSector; stream.moveTo(total); // While valid directory entries. @@ -3506,7 +3610,6 @@ export function extractOLE2(bytes, offset) { // Attempt to determine what directory entry it is. for (const element of entries) { - // If the byte pattern matches. if (stream.getBytes(element[1]).join("") === element[0].join("")) { stream.moveBackwardsBy(element[1]); @@ -3514,12 +3617,10 @@ export function extractOLE2(bytes, offset) { // Move forwards by the size of the comp obj. if (element[2] === "Comp Obj") { - // The size of the Comp Obj entry - 128. Since we add 128 later. total += 128 * 6; stream.moveTo(total); } else if (element[2] === "Entry") { - // If there is an entry move backwards by 126 to then move forwards by 128. Hence a total displacement of 2. stream.moveBackwardsBy(126); } @@ -3530,7 +3631,6 @@ export function extractOLE2(bytes, offset) { // If we have found a valid entry, move forwards by 128. if (found) { - // Every entry is at least 128 in size, some are bigger which is dealt with by the above if statement. total += 128; stream.moveForwardsBy(128); @@ -3544,7 +3644,6 @@ export function extractOLE2(bytes, offset) { return stream.carve(); } - /** * GZIP extractor. * @@ -3555,7 +3654,6 @@ export function extractOLE2(bytes, offset) { export function extractGZIP(bytes, offset) { const stream = new Stream(bytes.slice(offset)); - /* HEADER */ // Skip over signature and compression method @@ -3573,7 +3671,6 @@ export function extractGZIP(bytes, offset) { // Skip over OS stream.moveForwardsBy(1); - /* OPTIONAL HEADERS */ // Extra fields @@ -3599,12 +3696,10 @@ export function extractGZIP(bytes, offset) { stream.moveForwardsBy(2); } - /* DEFLATE DATA */ parseDEFLATE(stream); - /* FOOTER */ // Skip over checksum and size of original uncompressed input @@ -3613,7 +3708,6 @@ export function extractGZIP(bytes, offset) { return stream.carve(); } - /** * BZIP2 extractor. * @@ -3634,14 +3728,13 @@ export function extractBZIP2(bytes, offset) { [0xbb, 0x92, 0x29, 0xc2, 0x84], [0x5d, 0xc9, 0x14, 0xe1, 0x42], [0x2e, 0xe4, 0x8a, 0x70, 0xa1], - [0x17, 0x72, 0x45, 0x38, 0x50] + [0x17, 0x72, 0x45, 0x38, 0x50], ]; for (let i = 0; i < lookingfor.length; i++) { // Continue until an EOF. stream.continueUntil(lookingfor[i]); - if (stream.getBytes(5).join("") === lookingfor[i].join("")) - break; + if (stream.getBytes(5).join("") === lookingfor[i].join("")) break; // Jump back to the start if invalid EOF. stream.moveTo(0); @@ -3650,7 +3743,6 @@ export function extractBZIP2(bytes, offset) { return stream.carve(); } - /** * Zlib extractor. * @@ -3681,7 +3773,6 @@ export function extractZlib(bytes, offset) { return stream.carve(); } - /** * XZ extractor. * @@ -3701,7 +3792,6 @@ export function extractXZ(bytes, offset) { return stream.carve(); } - /** * DEB extractor. * @@ -3714,10 +3804,9 @@ export function extractDEB(bytes, offset) { // Move past ! stream.moveForwardsBy(8); while (stream.hasMore()) { - // Move to size field. stream.moveForwardsBy(48); - let fsize= ""; + let fsize = ""; // Convert size to a usable number. for (const elem of stream.getBytes(10)) { @@ -3732,7 +3821,6 @@ export function extractDEB(bytes, offset) { return stream.carve(); } - /** * ELF extractor. * @@ -3776,20 +3864,18 @@ export function extractELF(bytes, offset) { return stream.carve(); } - // Construct required Huffman Tables const fixedLiteralTableLengths = new Array(288); for (let i = 0; i < fixedLiteralTableLengths.length; i++) { fixedLiteralTableLengths[i] = - (i <= 143) ? 8 : - (i <= 255) ? 9 : - (i <= 279) ? 7 : - 8; + i <= 143 ? 8 : i <= 255 ? 9 : i <= 279 ? 7 : 8; } const fixedLiteralTable = buildHuffmanTable(fixedLiteralTableLengths); const fixedDistanceTableLengths = new Array(30).fill(5); const fixedDistanceTable = buildHuffmanTable(fixedDistanceTableLengths); -const huffmanOrder = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; +const huffmanOrder = [ + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15, +]; /** * Steps through a DEFLATE stream @@ -3839,7 +3925,7 @@ function parseDEFLATE(stream) { const lengthTable = new Uint8Array(hlit + hdist); let code, repeat, prev; - for (let i = 0; i < hlit + hdist;) { + for (let i = 0; i < hlit + hdist; ) { code = readHuffmanCode(stream, codeLengthsTable); switch (code) { case 16: @@ -3863,27 +3949,37 @@ function parseDEFLATE(stream) { } } - const dynamicLiteralTable = buildHuffmanTable(lengthTable.subarray(0, hlit)); - const dynamicDistanceTable = buildHuffmanTable(lengthTable.subarray(hlit)); + const dynamicLiteralTable = buildHuffmanTable( + lengthTable.subarray(0, hlit), + ); + const dynamicDistanceTable = buildHuffmanTable( + lengthTable.subarray(hlit), + ); - parseHuffmanBlock(stream, dynamicLiteralTable, dynamicDistanceTable); + parseHuffmanBlock( + stream, + dynamicLiteralTable, + dynamicDistanceTable, + ); } else { - throw new Error(`Invalid block type while parsing DEFLATE stream at pos ${stream.position}`); + throw new Error( + `Invalid block type while parsing DEFLATE stream at pos ${stream.position}`, + ); } } // Consume final byte if it has not been fully consumed yet - if (stream.bitPos > 0) - stream.moveForwardsBy(1); + if (stream.bitPos > 0) stream.moveForwardsBy(1); } - // Static length tables const lengthExtraTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, + 5, 5, 5, 0, 0, 0, ]; const distanceExtraTable = [ - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, + 11, 11, 12, 12, 13, 13, ]; /** @@ -3904,7 +4000,9 @@ function parseHuffmanBlock(stream, litTab, distTab) { // Detect probably infinite loops if (++loops > 10000) - throw new Error("Caught in probable infinite loop while parsing Huffman Block"); + throw new Error( + "Caught in probable infinite loop while parsing Huffman Block", + ); // Literal if (code < 256) continue; @@ -3918,7 +4016,6 @@ function parseHuffmanBlock(stream, litTab, distTab) { } } - /** * Builds a Huffman table given the relevant code lengths * @@ -3934,7 +4031,7 @@ function buildHuffmanTable(lengths) { const size = 1 << maxCodeLength; const table = new Uint32Array(size); - for (let bitLength = 1, code = 0, skip = 2; bitLength <= maxCodeLength;) { + for (let bitLength = 1, code = 0, skip = 2; bitLength <= maxCodeLength; ) { for (let i = 0; i < lengths.length; i++) { if (lengths[i] === bitLength) { let reversed, rtemp, j; @@ -3960,7 +4057,6 @@ function buildHuffmanTable(lengths) { return [table, maxCodeLength, minCodeLength]; } - /** * Reads the next Huffman code from the stream, given the relevant code table * @@ -3977,7 +4073,9 @@ function readHuffmanCode(stream, table) { const codeLength = codeWithLength >>> 16; if (codeLength > maxCodeLength) { - throw new Error(`Invalid Huffman Code length while parsing DEFLATE block at pos ${stream.position}: ${codeLength}`); + throw new Error( + `Invalid Huffman Code length while parsing DEFLATE block at pos ${stream.position}: ${codeLength}`, + ); } stream.moveBackwardsByBits(maxCodeLength - codeLength); @@ -3985,7 +4083,6 @@ function readHuffmanCode(stream, table) { return codeWithLength & 0xffff; } - /** * EVTX extractor. * @@ -4003,7 +4100,10 @@ export function extractEVTX(bytes, offset) { while (stream.hasMore()) { // Loop through ELFCHNKs. - if (stream.getBytes(7).join("") !== [0x45, 0x6c, 0x66, 0x43, 0x68, 0x6e, 0x6b].join("")) + if ( + stream.getBytes(7).join("") !== + [0x45, 0x6c, 0x66, 0x43, 0x68, 0x6e, 0x6b].join("") + ) break; stream.moveForwardsBy(0xfff9); } @@ -4011,7 +4111,6 @@ export function extractEVTX(bytes, offset) { return stream.carve(); } - /** * EVT extractor. * @@ -4031,11 +4130,10 @@ export function extractEVT(bytes, offset) { const eofSize = stream.readInt(4, "le"); // Move past EOF. - stream.moveForwardsBy(eofSize-4); + stream.moveForwardsBy(eofSize - 4); return stream.carve(); } - /** * DMP extractor. * @@ -4055,7 +4153,6 @@ export function extractDMP(bytes, offset) { return stream.carve(); } - /** * PF extractor. * @@ -4073,7 +4170,6 @@ export function extractPF(bytes, offset) { return stream.carve(); } - /** * PF (Win 10) extractor. * @@ -4090,7 +4186,6 @@ export function extractPFWin10(bytes, offset) { return stream.carve(); } - /** * LNK extractor. * @@ -4108,7 +4203,6 @@ export function extractLNK(bytes, offset) { return stream.carve(); } - /** * LZOP extractor. * @@ -4127,7 +4221,8 @@ export function extractLZOP(bytes, offset) { const F_H_FILTER = 0x00000800; const F_H_EXTRA_FIELD = 0x00000040; - let numCheckSumC = 0, numCheckSumD = 0; + let numCheckSumC = 0, + numCheckSumD = 0; // Move over magic bytes. stream.moveForwardsBy(9); @@ -4138,26 +4233,20 @@ export function extractLZOP(bytes, offset) { stream.moveForwardsBy(6); const flags = stream.readInt(4, "be"); - if (version & F_H_FILTER) - stream.moveForwardsBy(4); + if (version & F_H_FILTER) stream.moveForwardsBy(4); - if (flags & F_ADLER32_C) - numCheckSumC++; + if (flags & F_ADLER32_C) numCheckSumC++; - if (flags & F_CRC32_C) - numCheckSumC++; + if (flags & F_CRC32_C) numCheckSumC++; - if (flags & F_ADLER32_D) - numCheckSumD++; + if (flags & F_ADLER32_D) numCheckSumD++; - if (flags & F_CRC32_D) - numCheckSumD++; + if (flags & F_CRC32_D) numCheckSumD++; // Move over the mode, mtime_low stream.moveForwardsBy(8); - if (version >= 0x0940) - stream.moveForwardsBy(4); + if (version >= 0x0940) stream.moveForwardsBy(4); const fnameSize = stream.readInt(1, "be"); @@ -4176,16 +4265,17 @@ export function extractLZOP(bytes, offset) { const uncompSize = stream.readInt(4, "be"); // If data has no length, break. - if (uncompSize === 0) - break; + if (uncompSize === 0) break; const compSize = stream.readInt(4, "be"); - const numCheckSumSkip = (uncompSize === compSize) ? numCheckSumD : numCheckSumD + numCheckSumC; + const numCheckSumSkip = + uncompSize === compSize + ? numCheckSumD + : numCheckSumD + numCheckSumC; // skip forwards by compressed data size and the size of the checksum(s). - stream.moveForwardsBy(compSize + (numCheckSumSkip * 4)); + stream.moveForwardsBy(compSize + numCheckSumSkip * 4); } return stream.carve(); - } diff --git a/src/core/lib/FileType.mjs b/src/core/lib/FileType.mjs index 7a6a0a4e..69605b80 100644 --- a/src/core/lib/FileType.mjs +++ b/src/core/lib/FileType.mjs @@ -6,9 +6,8 @@ * @license Apache-2.0 * */ -import {FILE_SIGNATURES} from "./FileSignatures.mjs"; -import {sendStatusMessage} from "../Utils.mjs"; - +import { FILE_SIGNATURES } from "./FileSignatures.mjs"; +import { sendStatusMessage } from "../Utils.mjs"; /** * Checks whether a signature matches a buffer. @@ -20,7 +19,7 @@ import {sendStatusMessage} from "../Utils.mjs"; * @param {number} [offset=0] Where in the buffer to start searching from * @returns {boolean} */ -function signatureMatches(sig, buf, offset=0) { +function signatureMatches(sig, buf, offset = 0) { // Using a length check seems to be more performant than `sig instanceof Array` if (sig.length) { // sig is an Array - return true if any of them match @@ -36,7 +35,6 @@ function signatureMatches(sig, buf, offset=0) { } } - /** * Checks whether a set of bytes match the given buffer. * @@ -47,30 +45,28 @@ function signatureMatches(sig, buf, offset=0) { * @param {number} [offset=0] Where in the buffer to start searching from * @returns {boolean} */ -function bytesMatch(sig, buf, offset=0) { +function bytesMatch(sig, buf, offset = 0) { for (const sigoffset in sig) { const pos = parseInt(sigoffset, 10) + offset; switch (typeof sig[sigoffset]) { case "number": // Static check - if (buf[pos] !== sig[sigoffset]) - return false; + if (buf[pos] !== sig[sigoffset]) return false; break; case "object": // Array of options - if (sig[sigoffset].indexOf(buf[pos]) < 0) - return false; + if (sig[sigoffset].indexOf(buf[pos]) < 0) return false; break; case "function": // More complex calculation - if (!sig[sigoffset](buf[pos])) - return false; + if (!sig[sigoffset](buf[pos])) return false; break; default: - throw new Error(`Unrecognised signature type at offset ${sigoffset}`); + throw new Error( + `Unrecognised signature type at offset ${sigoffset}`, + ); } } return true; } - /** * Given a buffer, detects magic byte sequences at specific positions and returns the * extension and mime type. @@ -83,7 +79,7 @@ function bytesMatch(sig, buf, offset=0) { * @returns {string} type.mime - Mime type * @returns {string} [type.desc] - Description */ -export function detectFileType(buf, categories=Object.keys(FILE_SIGNATURES)) { +export function detectFileType(buf, categories = Object.keys(FILE_SIGNATURES)) { if (buf instanceof ArrayBuffer) { buf = new Uint8Array(buf); } @@ -104,7 +100,7 @@ export function detectFileType(buf, categories=Object.keys(FILE_SIGNATURES)) { for (const cat in signatures) { const category = signatures[cat]; - category.forEach(filetype => { + category.forEach((filetype) => { if (signatureMatches(filetype.signature, buf)) { matchingFiles.push(filetype); } @@ -113,7 +109,6 @@ export function detectFileType(buf, categories=Object.keys(FILE_SIGNATURES)) { return matchingFiles; } - /** * Given a buffer, searches for magic byte sequences at all possible positions and returns * the extensions and mime types. @@ -128,7 +123,10 @@ export function detectFileType(buf, categories=Object.keys(FILE_SIGNATURES)) { * @returns {string} foundFiles.fileDetails.mime - Mime type * @returns {string} [foundFiles.fileDetails.desc] - Description */ -export function scanForFileTypes(buf, categories=Object.keys(FILE_SIGNATURES)) { +export function scanForFileTypes( + buf, + categories = Object.keys(FILE_SIGNATURES), +) { if (!(buf && buf.length > 1)) { return []; } @@ -147,16 +145,20 @@ export function scanForFileTypes(buf, categories=Object.keys(FILE_SIGNATURES)) { for (let i = 0; i < category.length; i++) { const filetype = category[i]; - const sigs = filetype.signature.length ? filetype.signature : [filetype.signature]; + const sigs = filetype.signature.length + ? filetype.signature + : [filetype.signature]; - sigs.forEach(sig => { + sigs.forEach((sig) => { let pos = 0; while ((pos = locatePotentialSig(buf, sig, pos)) >= 0) { if (bytesMatch(sig, buf, pos)) { - sendStatusMessage(`Found potential signature for ${filetype.name} at pos ${pos}`); + sendStatusMessage( + `Found potential signature for ${filetype.name} at pos ${pos}`, + ); foundFiles.push({ offset: pos, - fileDetails: filetype + fileDetails: filetype, }); } pos++; @@ -171,7 +173,6 @@ export function scanForFileTypes(buf, categories=Object.keys(FILE_SIGNATURES)) { }); } - /** * Fastcheck function to quickly scan the buffer for the first byte in a signature. * @@ -202,7 +203,6 @@ function locatePotentialSig(buf, sig, offset) { } } - /** * Detects whether the given buffer is a file of the type specified. * @@ -230,7 +230,6 @@ export function isType(type, buf) { } } - /** * Detects whether the given buffer contains an image file. * @@ -241,7 +240,6 @@ export function isImage(buf) { return isType("image", buf); } - /** * Attempts to extract a file from a data stream given its offset and extractor function. * @@ -255,13 +253,21 @@ export function isImage(buf) { */ export function extractFile(bytes, fileDetail, offset) { if (fileDetail.extractor) { - sendStatusMessage(`Attempting to extract ${fileDetail.name} at pos ${offset}...`); + sendStatusMessage( + `Attempting to extract ${fileDetail.name} at pos ${offset}...`, + ); const fileData = fileDetail.extractor(bytes, offset); const ext = fileDetail.extension.split(",")[0]; - return new File([fileData], `extracted_at_0x${offset.toString(16)}.${ext}`, { - type: fileDetail.mime - }); + return new File( + [fileData], + `extracted_at_0x${offset.toString(16)}.${ext}`, + { + type: fileDetail.mime, + }, + ); } - throw new Error(`No extraction algorithm available for "${fileDetail.mime}" files`); + throw new Error( + `No extraction algorithm available for "${fileDetail.mime}" files`, + ); } diff --git a/src/core/lib/FlowControl.mjs b/src/core/lib/FlowControl.mjs index 56679ece..da758d8c 100644 --- a/src/core/lib/FlowControl.mjs +++ b/src/core/lib/FlowControl.mjs @@ -15,6 +15,6 @@ */ export function getLabelIndex(name, state) { return state.opList.findIndex((operation) => { - return (operation.name === "Label") && (name === operation.ingValues[0]); + return operation.name === "Label" && name === operation.ingValues[0]; }); } diff --git a/src/core/lib/FuzzyMatch.mjs b/src/core/lib/FuzzyMatch.mjs index 693527a5..038e1584 100644 --- a/src/core/lib/FuzzyMatch.mjs +++ b/src/core/lib/FuzzyMatch.mjs @@ -24,7 +24,7 @@ export const DEFAULT_WEIGHTS = { leadingLetterPenalty: -5, // penalty applied for every letter in str before the first match maxLeadingLetterPenalty: -15, // maximum penalty for leading letters - unmatchedLetterPenalty: -1 + unmatchedLetterPenalty: -1, }; /** @@ -35,7 +35,12 @@ export const DEFAULT_WEIGHTS = { * @returns [boolean, number] a boolean which tells if pattern was * found or not and a search score */ -export function fuzzyMatch(pattern, str, global=false, weights=DEFAULT_WEIGHTS) { +export function fuzzyMatch( + pattern, + str, + global = false, + weights = DEFAULT_WEIGHTS, +) { const recursionCount = 0; const recursionLimit = 10; const matches = []; @@ -53,7 +58,7 @@ export function fuzzyMatch(pattern, str, global=false, weights=DEFAULT_WEIGHTS) 0 /* nextMatch */, recursionCount, recursionLimit, - weights + weights, ); } @@ -76,7 +81,7 @@ export function fuzzyMatch(pattern, str, global=false, weights=DEFAULT_WEIGHTS) 0 /* nextMatch */, recursionCount, recursionLimit, - weights + weights, ); if (foundMatch) results.push([foundMatch, score, [...idxs]]); strCurrIndex = idxs[idxs.length - 1] + 1; @@ -98,7 +103,7 @@ function fuzzyMatchRecursive( nextMatch, recursionCount, recursionLimit, - weights + weights, ) { let outScore = 0; @@ -122,7 +127,8 @@ function fuzzyMatchRecursive( while (patternCurIndex < pattern.length && strCurrIndex < str.length) { // Match found. if ( - pattern[patternCurIndex].toLowerCase() === str[strCurrIndex].toLowerCase() + pattern[patternCurIndex].toLowerCase() === + str[strCurrIndex].toLowerCase() ) { if (nextMatch >= maxMatches) { return [false, outScore, []]; @@ -133,19 +139,20 @@ function fuzzyMatchRecursive( firstMatch = false; } - const [matched, recursiveScore, recursiveMatches] = fuzzyMatchRecursive( - pattern, - str, - patternCurIndex, - strCurrIndex + 1, - matches, - recursiveMatches, - maxMatches, - nextMatch, - recursionCount, - recursionLimit, - weights - ); + const [matched, recursiveScore, recursiveMatches] = + fuzzyMatchRecursive( + pattern, + str, + patternCurIndex, + strCurrIndex + 1, + matches, + recursiveMatches, + maxMatches, + nextMatch, + recursionCount, + recursionLimit, + weights, + ); if (matched) { // Pick best recursive score. @@ -170,9 +177,9 @@ function fuzzyMatchRecursive( // Apply leading letter penalty let penalty = weights.leadingLetterPenalty * matches[0]; penalty = - penalty < weights.maxLeadingLetterPenalty ? - weights.maxLeadingLetterPenalty : - penalty; + penalty < weights.maxLeadingLetterPenalty + ? weights.maxLeadingLetterPenalty + : penalty; outScore += penalty; // Apply unmatched penalty @@ -201,7 +208,8 @@ function fuzzyMatchRecursive( ) { outScore += weights.camelBonus; } - const isNeighbourSeparator = neighbor === "_" || neighbor === " "; + const isNeighbourSeparator = + neighbor === "_" || neighbor === " "; if (isNeighbourSeparator) { outScore += weights.separatorBonus; } @@ -239,7 +247,7 @@ export function calcMatchRanges(matches) { let start = matches[0], curr = start; - matches.forEach(m => { + matches.forEach((m) => { if (m === curr || m === curr + 1) curr = m; else { ranges.push([start, curr - start + 1]); diff --git a/src/core/lib/Hash.mjs b/src/core/lib/Hash.mjs index d572b8b0..29bc88cf 100644 --- a/src/core/lib/Hash.mjs +++ b/src/core/lib/Hash.mjs @@ -10,7 +10,6 @@ import Utils from "../Utils.mjs"; import CryptoApi from "crypto-api/src/crypto-api.mjs"; - /** * Generic hash function. * @@ -19,10 +18,9 @@ import CryptoApi from "crypto-api/src/crypto-api.mjs"; * @param {Object} [options={}] * @returns {string} */ -export function runHash(name, input, options={}) { +export function runHash(name, input, options = {}) { const msg = Utils.arrayBufferToStr(input, false), hasher = CryptoApi.getHasher(name, options); hasher.update(msg); return CryptoApi.encoder.toHex(hasher.finalize()); } - diff --git a/src/core/lib/Hex.mjs b/src/core/lib/Hex.mjs index 78e1ad58..137e6945 100644 --- a/src/core/lib/Hex.mjs +++ b/src/core/lib/Hex.mjs @@ -9,7 +9,6 @@ import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; - /** * Convert a byte array into a hex string. * @@ -28,12 +27,18 @@ import OperationError from "../errors/OperationError.mjs"; * // returns "0x0a,0x14,0x1e" * toHex([10,20,30], "0x", 2, ",") */ -export function toHex(data, delim=" ", padding=2, extraDelim="", lineSize=0) { +export function toHex( + data, + delim = " ", + padding = 2, + extraDelim = "", + lineSize = 0, +) { if (!data) return ""; if (data instanceof ArrayBuffer) data = new Uint8Array(data); let output = ""; - const prepend = (delim === "0x" || delim === "\\x"); + const prepend = delim === "0x" || delim === "\\x"; for (let i = 0; i < data.length; i++) { const hex = data[i].toString(16).padStart(padding, "0"); @@ -43,7 +48,7 @@ export function toHex(data, delim=" ", padding=2, extraDelim="", lineSize=0) { output += extraDelim; } // Add LF after each lineSize amount of bytes but not at the end - if ((i !== data.length - 1) && ((i + 1) % lineSize === 0)) { + if (i !== data.length - 1 && (i + 1) % lineSize === 0) { output += "\n"; } } @@ -59,7 +64,6 @@ export function toHex(data, delim=" ", padding=2, extraDelim="", lineSize=0) { } } - /** * Convert a byte array into a hex string as efficiently as possible with no options. * @@ -84,7 +88,6 @@ export function toHexFast(data) { return output.join(""); } - /** * Convert a hex string into a byte array. * @@ -100,12 +103,13 @@ export function toHexFast(data) { * // returns [10,20,30] * fromHex("0a:14:1e", "Colon"); */ -export function fromHex(data, delim="Auto", byteLen=2) { +export function fromHex(data, delim = "Auto", byteLen = 2) { if (byteLen < 1 || Math.round(byteLen) !== byteLen) throw new OperationError("Byte length must be a positive integer"); if (delim !== "None") { - const delimRegex = delim === "Auto" ? /[^a-f\d]|0x/gi : Utils.regexRep(delim); + const delimRegex = + delim === "Auto" ? /[^a-f\d]|0x/gi : Utils.regexRep(delim); data = data.split(delimRegex); } else { data = [data]; @@ -120,12 +124,22 @@ export function fromHex(data, delim="Auto", byteLen=2) { return output; } - /** * To Hexadecimal delimiters. */ -export const TO_HEX_DELIM_OPTIONS = ["Space", "Percent", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF", "0x", "0x with comma", "\\x", "None"]; - +export const TO_HEX_DELIM_OPTIONS = [ + "Space", + "Percent", + "Comma", + "Semi-colon", + "Colon", + "Line feed", + "CRLF", + "0x", + "0x with comma", + "\\x", + "None", +]; /** * From Hexadecimal delimiters. diff --git a/src/core/lib/IP.mjs b/src/core/lib/IP.mjs index c97f87ab..07f297e2 100644 --- a/src/core/lib/IP.mjs +++ b/src/core/lib/IP.mjs @@ -20,7 +20,12 @@ import OperationError from "../errors/OperationError.mjs"; * @param {boolean} allowLargeList * @returns {string} */ -export function ipv4CidrRange(cidr, includeNetworkInfo, enumerateAddresses, allowLargeList) { +export function ipv4CidrRange( + cidr, + includeNetworkInfo, + enumerateAddresses, + allowLargeList, +) { const network = strToIpv4(cidr[1]), cidrRange = parseInt(cidr[2], 10); let output = ""; @@ -29,7 +34,7 @@ export function ipv4CidrRange(cidr, includeNetworkInfo, enumerateAddresses, allo throw new OperationError("IPv4 CIDR must be less than 32"); } - const mask = ~(0xFFFFFFFF >>> cidrRange), + const mask = ~(0xffffffff >>> cidrRange), ip1 = network & mask, ip2 = ip1 | ~mask; @@ -38,7 +43,8 @@ export function ipv4CidrRange(cidr, includeNetworkInfo, enumerateAddresses, allo output += "CIDR: " + cidrRange + "\n"; output += "Mask: " + ipv4ToStr(mask) + "\n"; output += "Range: " + ipv4ToStr(ip1) + " - " + ipv4ToStr(ip2) + "\n"; - output += "Total addresses in range: " + (((ip2 - ip1) >>> 0) + 1) + "\n\n"; + output += + "Total addresses in range: " + (((ip2 - ip1) >>> 0) + 1) + "\n\n"; } if (enumerateAddresses) { @@ -61,7 +67,7 @@ export function ipv4CidrRange(cidr, includeNetworkInfo, enumerateAddresses, allo export function ipv6CidrRange(cidr, includeNetworkInfo) { let output = ""; const network = strToIpv6(cidr[1]), - cidrRange = parseInt(cidr[cidr.length-1], 10); + cidrRange = parseInt(cidr[cidr.length - 1], 10); if (cidrRange < 0 || cidrRange > 127) { throw new OperationError("IPv6 CIDR must be less than 128"); @@ -74,15 +80,14 @@ export function ipv6CidrRange(cidr, includeNetworkInfo) { const mask = genIpv6Mask(cidrRange); let totalDiff = ""; - for (let i = 0; i < 8; i++) { ip1[i] = network[i] & mask[i]; - ip2[i] = ip1[i] | (~mask[i] & 0x0000FFFF); + ip2[i] = ip1[i] | (~mask[i] & 0x0000ffff); totalDiff = (ip2[i] - ip1[i]).toString(2); if (totalDiff !== "0") { for (let n = 0; n < totalDiff.length; n++) { - total[i*16 + 16-(totalDiff.length-n)] = totalDiff[n]; + total[i * 16 + 16 - (totalDiff.length - n)] = totalDiff[n]; } } } @@ -93,7 +98,10 @@ export function ipv6CidrRange(cidr, includeNetworkInfo) { output += "CIDR: " + cidrRange + "\n"; output += "Mask: " + ipv6ToStr(mask) + "\n"; output += "Range: " + ipv6ToStr(ip1) + " - " + ipv6ToStr(ip2) + "\n"; - output += "Total addresses in range: " + (parseInt(total.join(""), 2) + 1) + "\n\n"; + output += + "Total addresses in range: " + + (parseInt(total.join(""), 2) + 1) + + "\n\n"; } return output; @@ -109,7 +117,12 @@ export function ipv6CidrRange(cidr, includeNetworkInfo) { * @param {boolean} allowLargeList * @returns {string} */ -export function ipv4HyphenatedRange(range, includeNetworkInfo, enumerateAddresses, allowLargeList) { +export function ipv4HyphenatedRange( + range, + includeNetworkInfo, + enumerateAddresses, + allowLargeList, +) { const ip1 = strToIpv4(range[0].split("-")[0].trim()), ip2 = strToIpv4(range[0].split("-")[1].trim()); @@ -137,16 +150,16 @@ export function ipv4HyphenatedRange(range, includeNetworkInfo, enumerateAddresse \tCIDR: ${cidr} \tMask: ${ipv4ToStr(mask)} \tSubnet range: ${ipv4ToStr(subIp1)} - ${ipv4ToStr(subIp2)} -\tTotal addresses in subnet: ${(((subIp2 - subIp1) >>> 0) + 1)} +\tTotal addresses in subnet: ${((subIp2 - subIp1) >>> 0) + 1} Range: ${ipv4ToStr(ip1)} - ${ipv4ToStr(ip2)} -Total addresses in range: ${(((ip2 - ip1) >>> 0) + 1)} +Total addresses in range: ${((ip2 - ip1) >>> 0) + 1} `; } if (enumerateAddresses) { - if (((ip2 - ip1) >>> 0) <= 65536 || allowLargeList) { + if ((ip2 - ip1) >>> 0 <= 65536 || allowLargeList) { output += generateIpv4Range(ip1, ip2).join("\n"); } else { output += _LARGE_RANGE_ERROR; @@ -175,15 +188,23 @@ export function ipv6HyphenatedRange(range, includeNetworkInfo) { t = (ip2[i] - ip1[i]).toString(2); if (t !== "0") { for (let n = 0; n < t.length; n++) { - total[i*16 + 16-(t.length-n)] = t[n]; + total[i * 16 + 16 - (t.length - n)] = t[n]; } } } if (includeNetworkInfo) { output += "Range: " + ipv6ToStr(ip1) + " - " + ipv6ToStr(ip2) + "\n"; - output += "Shorthand range: " + ipv6ToStr(ip1, true) + " - " + ipv6ToStr(ip2, true) + "\n"; - output += "Total addresses in range: " + (parseInt(total.join(""), 2) + 1) + "\n\n"; + output += + "Shorthand range: " + + ipv6ToStr(ip1, true) + + " - " + + ipv6ToStr(ip2, true) + + "\n"; + output += + "Total addresses in range: " + + (parseInt(total.join(""), 2) + 1) + + "\n\n"; } return output; @@ -199,12 +220,16 @@ export function ipv6HyphenatedRange(range, includeNetworkInfo) { * @param {boolean} allowLargeList * @returns {string} */ -export function ipv4ListedRange(match, includeNetworkInfo, enumerateAddresses, allowLargeList) { - +export function ipv4ListedRange( + match, + includeNetworkInfo, + enumerateAddresses, + allowLargeList, +) { let ipv4List = match[0].split("\n"); ipv4List = ipv4List.filter(Boolean); - const ipv4CidrList = ipv4List.filter(function(a) { + const ipv4CidrList = ipv4List.filter(function (a) { return a.includes("/"); }); for (let i = 0; i < ipv4CidrList.length; i++) { @@ -213,7 +238,7 @@ export function ipv4ListedRange(match, includeNetworkInfo, enumerateAddresses, a if (cidrRange < 0 || cidrRange > 31) { throw new OperationError("IPv4 CIDR must be less than 32"); } - const mask = ~(0xFFFFFFFF >>> cidrRange), + const mask = ~(0xffffffff >>> cidrRange), cidrIp1 = network & mask, cidrIp2 = cidrIp1 | ~mask; ipv4List.splice(ipv4List.indexOf(ipv4CidrList[i]), 1); @@ -224,7 +249,12 @@ export function ipv4ListedRange(match, includeNetworkInfo, enumerateAddresses, a const ip1 = ipv4List[0]; const ip2 = ipv4List[ipv4List.length - 1]; const range = [ip1 + " - " + ip2]; - return ipv4HyphenatedRange(range, includeNetworkInfo, enumerateAddresses, allowLargeList); + return ipv4HyphenatedRange( + range, + includeNetworkInfo, + enumerateAddresses, + allowLargeList, + ); } /** @@ -236,20 +266,18 @@ export function ipv4ListedRange(match, includeNetworkInfo, enumerateAddresses, a * @returns {string} */ export function ipv6ListedRange(match, includeNetworkInfo) { - let ipv6List = match[0].split("\n"); - ipv6List = ipv6List.filter(function(str) { + ipv6List = ipv6List.filter(function (str) { return str.trim(); }); - for (let i =0; i < ipv6List.length; i++) { + for (let i = 0; i < ipv6List.length; i++) { ipv6List[i] = ipv6List[i].trim(); } - const ipv6CidrList = ipv6List.filter(function(a) { + const ipv6CidrList = ipv6List.filter(function (a) { return a.includes("/"); }); for (let i = 0; i < ipv6CidrList.length; i++) { - const network = strToIpv6(ipv6CidrList[i].split("/")[0]); const cidrRange = parseInt(ipv6CidrList[i].split("/")[1], 10); @@ -264,7 +292,7 @@ export function ipv6ListedRange(match, includeNetworkInfo) { for (let j = 0; j < 8; j++) { cidrIp1[j] = network[j] & mask[j]; - cidrIp2[j] = cidrIp1[j] | (~mask[j] & 0x0000FFFF); + cidrIp2[j] = cidrIp1[j] | (~mask[j] & 0x0000ffff); } ipv6List.splice(ipv6List.indexOf(ipv6CidrList[i]), 1); ipv6List.push(ipv6ToStr(cidrIp1), ipv6ToStr(cidrIp2)); @@ -334,7 +362,6 @@ export function ipv4ToStr(ipInt) { return blockA + "." + blockB + "." + blockC + "." + blockD; } - /** * Converts an IPv6 address from string format to numerical array format. * @@ -354,7 +381,7 @@ export function strToIpv6(ipStr) { for (let i = 0; i < 8; i++) { if (isNaN(numBlocks[j])) { ipv6[i] = 0; - if (i === (8-numBlocks.slice(j).length)) j++; + if (i === 8 - numBlocks.slice(j).length) j++; } else { ipv6[i] = numBlocks[j]; j++; @@ -403,12 +430,13 @@ export function ipv6ToStr(ipv6, compact) { e = -1; for (i = 0; i < 8; i++) { - if (ipv6[i] === 0 && e === (i-1)) { + if (ipv6[i] === 0 && e === i - 1) { e = i; } else if (ipv6[i] === 0) { - s = i; e = i; + s = i; + e = i; } - if (e >= 0 && (e-s) > (end - start)) { + if (e >= 0 && e - s > end - start) { start = s; end = e; } @@ -423,14 +451,13 @@ export function ipv6ToStr(ipv6, compact) { if (end === 7) output += ":"; } } - if (output[0] === ":") - output = ":" + output; + if (output[0] === ":") output = ":" + output; } else { for (i = 0; i < 8; i++) { output += Utils.hex(ipv6[i], 4) + ":"; } } - return output.slice(0, output.length-1); + return output.slice(0, output.length - 1); } /** @@ -467,12 +494,12 @@ export function genIpv6Mask(cidr) { let shift; for (let i = 0; i < 8; i++) { - if (cidr > ((i+1)*16)) { - mask[i] = 0x0000FFFF; + if (cidr > (i + 1) * 16) { + mask[i] = 0x0000ffff; } else { - shift = cidr-(i*16); + shift = cidr - i * 16; if (shift < 0) shift = 0; - mask[i] = ~((0x0000FFFF >>> shift) | 0xFFFF0000); + mask[i] = ~((0x0000ffff >>> shift) | 0xffff0000); } } @@ -498,7 +525,6 @@ export function ipv4Compare(a, b) { * @returns {number} */ export function ipv6Compare(a, b) { - const a_ = strToIpv6(a), b_ = strToIpv6(b); @@ -510,7 +536,8 @@ export function ipv6Compare(a, b) { return 0; } -const _LARGE_RANGE_ERROR = "The specified range contains more than 65,536 addresses. Running this query could crash your browser. If you want to run it, select the \"Allow large queries\" option. You are advised to turn off \"Auto Bake\" whilst editing large ranges."; +const _LARGE_RANGE_ERROR = + 'The specified range contains more than 65,536 addresses. Running this query could crash your browser. If you want to run it, select the "Allow large queries" option. You are advised to turn off "Auto Bake" whilst editing large ranges.'; /** * A regular expression that matches an IPv4 address @@ -520,157 +547,174 @@ export const IPV4_REGEX = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/; /** * A regular expression that matches an IPv6 address */ -export const IPV6_REGEX = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i; +export const IPV6_REGEX = + /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i; /** * Lookup table for Internet Protocols. * Taken from https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml */ export const protocolLookup = { - 0: {keyword: "HOPOPT", protocol: "IPv6 Hop-by-Hop Option"}, - 1: {keyword: "ICMP", protocol: "Internet Control Message"}, - 2: {keyword: "IGMP", protocol: "Internet Group Management"}, - 3: {keyword: "GGP", protocol: "Gateway-to-Gateway"}, - 4: {keyword: "IPv4", protocol: "IPv4 encapsulation"}, - 5: {keyword: "ST", protocol: "Stream"}, - 6: {keyword: "TCP", protocol: "Transmission Control"}, - 7: {keyword: "CBT", protocol: "CBT"}, - 8: {keyword: "EGP", protocol: "Exterior Gateway Protocol"}, - 9: {keyword: "IGP", protocol: "any private interior gateway (used by Cisco for their IGRP)"}, - 10: {keyword: "BBN-RCC-MON", protocol: "BBN RCC Monitoring"}, - 11: {keyword: "NVP-II", protocol: "Network Voice Protocol"}, - 12: {keyword: "PUP", protocol: "PUP"}, - 13: {keyword: "ARGUS (deprecated)", protocol: "ARGUS"}, - 14: {keyword: "EMCON", protocol: "EMCON"}, - 15: {keyword: "XNET", protocol: "Cross Net Debugger"}, - 16: {keyword: "CHAOS", protocol: "Chaos"}, - 17: {keyword: "UDP", protocol: "User Datagram"}, - 18: {keyword: "MUX", protocol: "Multiplexing"}, - 19: {keyword: "DCN-MEAS", protocol: "DCN Measurement Subsystems"}, - 20: {keyword: "HMP", protocol: "Host Monitoring"}, - 21: {keyword: "PRM", protocol: "Packet Radio Measurement"}, - 22: {keyword: "XNS-IDP", protocol: "XEROX NS IDP"}, - 23: {keyword: "TRUNK-1", protocol: "Trunk-1"}, - 24: {keyword: "TRUNK-2", protocol: "Trunk-2"}, - 25: {keyword: "LEAF-1", protocol: "Leaf-1"}, - 26: {keyword: "LEAF-2", protocol: "Leaf-2"}, - 27: {keyword: "RDP", protocol: "Reliable Data Protocol"}, - 28: {keyword: "IRTP", protocol: "Internet Reliable Transaction"}, - 29: {keyword: "ISO-TP4", protocol: "ISO Transport Protocol Class 4"}, - 30: {keyword: "NETBLT", protocol: "Bulk Data Transfer Protocol"}, - 31: {keyword: "MFE-NSP", protocol: "MFE Network Services Protocol"}, - 32: {keyword: "MERIT-INP", protocol: "MERIT Internodal Protocol"}, - 33: {keyword: "DCCP", protocol: "Datagram Congestion Control Protocol"}, - 34: {keyword: "3PC", protocol: "Third Party Connect Protocol"}, - 35: {keyword: "IDPR", protocol: "Inter-Domain Policy Routing Protocol"}, - 36: {keyword: "XTP", protocol: "XTP"}, - 37: {keyword: "DDP", protocol: "Datagram Delivery Protocol"}, - 38: {keyword: "IDPR-CMTP", protocol: "IDPR Control Message Transport Proto"}, - 39: {keyword: "TP++", protocol: "TP++ Transport Protocol"}, - 40: {keyword: "IL", protocol: "IL Transport Protocol"}, - 41: {keyword: "IPv6", protocol: "IPv6 encapsulation"}, - 42: {keyword: "SDRP", protocol: "Source Demand Routing Protocol"}, - 43: {keyword: "IPv6-Route", protocol: "Routing Header for IPv6"}, - 44: {keyword: "IPv6-Frag", protocol: "Fragment Header for IPv6"}, - 45: {keyword: "IDRP", protocol: "Inter-Domain Routing Protocol"}, - 46: {keyword: "RSVP", protocol: "Reservation Protocol"}, - 47: {keyword: "GRE", protocol: "Generic Routing Encapsulation"}, - 48: {keyword: "DSR", protocol: "Dynamic Source Routing Protocol"}, - 49: {keyword: "BNA", protocol: "BNA"}, - 50: {keyword: "ESP", protocol: "Encap Security Payload"}, - 51: {keyword: "AH", protocol: "Authentication Header"}, - 52: {keyword: "I-NLSP", protocol: "Integrated Net Layer Security TUBA"}, - 53: {keyword: "SWIPE (deprecated)", protocol: "IP with Encryption"}, - 54: {keyword: "NARP", protocol: "NBMA Address Resolution Protocol"}, - 55: {keyword: "MOBILE", protocol: "IP Mobility"}, - 56: {keyword: "TLSP", protocol: "Transport Layer Security Protocol using Kryptonet key management"}, - 57: {keyword: "SKIP", protocol: "SKIP"}, - 58: {keyword: "IPv6-ICMP", protocol: "ICMP for IPv6"}, - 59: {keyword: "IPv6-NoNxt", protocol: "No Next Header for IPv6"}, - 60: {keyword: "IPv6-Opts", protocol: "Destination Options for IPv6"}, - 61: {keyword: "", protocol: "any host internal protocol"}, - 62: {keyword: "CFTP", protocol: "CFTP"}, - 63: {keyword: "", protocol: "any local network"}, - 64: {keyword: "SAT-EXPAK", protocol: "SATNET and Backroom EXPAK"}, - 65: {keyword: "KRYPTOLAN", protocol: "Kryptolan"}, - 66: {keyword: "RVD", protocol: "MIT Remote Virtual Disk Protocol"}, - 67: {keyword: "IPPC", protocol: "Internet Pluribus Packet Core"}, - 68: {keyword: "", protocol: "any distributed file system"}, - 69: {keyword: "SAT-MON", protocol: "SATNET Monitoring"}, - 70: {keyword: "VISA", protocol: "VISA Protocol"}, - 71: {keyword: "IPCV", protocol: "Internet Packet Core Utility"}, - 72: {keyword: "CPNX", protocol: "Computer Protocol Network Executive"}, - 73: {keyword: "CPHB", protocol: "Computer Protocol Heart Beat"}, - 74: {keyword: "WSN", protocol: "Wang Span Network"}, - 75: {keyword: "PVP", protocol: "Packet Video Protocol"}, - 76: {keyword: "BR-SAT-MON", protocol: "Backroom SATNET Monitoring"}, - 77: {keyword: "SUN-ND", protocol: "SUN ND PROTOCOL-Temporary"}, - 78: {keyword: "WB-MON", protocol: "WIDEBAND Monitoring"}, - 79: {keyword: "WB-EXPAK", protocol: "WIDEBAND EXPAK"}, - 80: {keyword: "ISO-IP", protocol: "ISO Internet Protocol"}, - 81: {keyword: "VMTP", protocol: "VMTP"}, - 82: {keyword: "SECURE-VMTP", protocol: "SECURE-VMTP"}, - 83: {keyword: "VINES", protocol: "VINES"}, - 84: {keyword: "TTP", protocol: "Transaction Transport Protocol"}, - 85: {keyword: "NSFNET-IGP", protocol: "NSFNET-IGP"}, - 86: {keyword: "DGP", protocol: "Dissimilar Gateway Protocol"}, - 87: {keyword: "TCF", protocol: "TCF"}, - 88: {keyword: "EIGRP", protocol: "EIGRP"}, - 89: {keyword: "OSPFIGP", protocol: "OSPFIGP"}, - 90: {keyword: "Sprite-RPC", protocol: "Sprite RPC Protocol"}, - 91: {keyword: "LARP", protocol: "Locus Address Resolution Protocol"}, - 92: {keyword: "MTP", protocol: "Multicast Transport Protocol"}, - 93: {keyword: "AX.25", protocol: "AX.25 Frames"}, - 94: {keyword: "IPIP", protocol: "IP-within-IP Encapsulation Protocol"}, - 95: {keyword: "MICP (deprecated)", protocol: "Mobile Internetworking Control Pro."}, - 96: {keyword: "SCC-SP", protocol: "Semaphore Communications Sec. Pro."}, - 97: {keyword: "ETHERIP", protocol: "Ethernet-within-IP Encapsulation"}, - 98: {keyword: "ENCAP", protocol: "Encapsulation Header"}, - 99: {keyword: "", protocol: "any private encryption scheme"}, - 100: {keyword: "GMTP", protocol: "GMTP"}, - 101: {keyword: "IFMP", protocol: "Ipsilon Flow Management Protocol"}, - 102: {keyword: "PNNI", protocol: "PNNI over IP"}, - 103: {keyword: "PIM", protocol: "Protocol Independent Multicast"}, - 104: {keyword: "ARIS", protocol: "ARIS"}, - 105: {keyword: "SCPS", protocol: "SCPS"}, - 106: {keyword: "QNX", protocol: "QNX"}, - 107: {keyword: "A/N", protocol: "Active Networks"}, - 108: {keyword: "IPComp", protocol: "IP Payload Compression Protocol"}, - 109: {keyword: "SNP", protocol: "Sitara Networks Protocol"}, - 110: {keyword: "Compaq-Peer", protocol: "Compaq Peer Protocol"}, - 111: {keyword: "IPX-in-IP", protocol: "IPX in IP"}, - 112: {keyword: "VRRP", protocol: "Virtual Router Redundancy Protocol"}, - 113: {keyword: "PGM", protocol: "PGM Reliable Transport Protocol"}, - 114: {keyword: "", protocol: "any 0-hop protocol"}, - 115: {keyword: "L2TP", protocol: "Layer Two Tunneling Protocol"}, - 116: {keyword: "DDX", protocol: "D-II Data Exchange (DDX)"}, - 117: {keyword: "IATP", protocol: "Interactive Agent Transfer Protocol"}, - 118: {keyword: "STP", protocol: "Schedule Transfer Protocol"}, - 119: {keyword: "SRP", protocol: "SpectraLink Radio Protocol"}, - 120: {keyword: "UTI", protocol: "UTI"}, - 121: {keyword: "SMP", protocol: "Simple Message Protocol"}, - 122: {keyword: "SM (deprecated)", protocol: "Simple Multicast Protocol"}, - 123: {keyword: "PTP", protocol: "Performance Transparency Protocol"}, - 124: {keyword: "ISIS over IPv4", protocol: ""}, - 125: {keyword: "FIRE", protocol: ""}, - 126: {keyword: "CRTP", protocol: "Combat Radio Transport Protocol"}, - 127: {keyword: "CRUDP", protocol: "Combat Radio User Datagram"}, - 128: {keyword: "SSCOPMCE", protocol: ""}, - 129: {keyword: "IPLT", protocol: ""}, - 130: {keyword: "SPS", protocol: "Secure Packet Shield"}, - 131: {keyword: "PIPE", protocol: "Private IP Encapsulation within IP"}, - 132: {keyword: "SCTP", protocol: "Stream Control Transmission Protocol"}, - 133: {keyword: "FC", protocol: "Fibre Channel"}, - 134: {keyword: "RSVP-E2E-IGNORE", protocol: ""}, - 135: {keyword: "Mobility Header", protocol: ""}, - 136: {keyword: "UDPLite", protocol: ""}, - 137: {keyword: "MPLS-in-IP", protocol: ""}, - 138: {keyword: "manet", protocol: "MANET Protocols"}, - 139: {keyword: "HIP", protocol: "Host Identity Protocol"}, - 140: {keyword: "Shim6", protocol: "Shim6 Protocol"}, - 141: {keyword: "WESP", protocol: "Wrapped Encapsulating Security Payload"}, - 142: {keyword: "ROHC", protocol: "Robust Header Compression"}, - 253: {keyword: "", protocol: "Use for experimentation and testing"}, - 254: {keyword: "", protocol: "Use for experimentation and testing"}, - 255: {keyword: "Reserved", protocol: ""} + 0: { keyword: "HOPOPT", protocol: "IPv6 Hop-by-Hop Option" }, + 1: { keyword: "ICMP", protocol: "Internet Control Message" }, + 2: { keyword: "IGMP", protocol: "Internet Group Management" }, + 3: { keyword: "GGP", protocol: "Gateway-to-Gateway" }, + 4: { keyword: "IPv4", protocol: "IPv4 encapsulation" }, + 5: { keyword: "ST", protocol: "Stream" }, + 6: { keyword: "TCP", protocol: "Transmission Control" }, + 7: { keyword: "CBT", protocol: "CBT" }, + 8: { keyword: "EGP", protocol: "Exterior Gateway Protocol" }, + 9: { + keyword: "IGP", + protocol: "any private interior gateway (used by Cisco for their IGRP)", + }, + 10: { keyword: "BBN-RCC-MON", protocol: "BBN RCC Monitoring" }, + 11: { keyword: "NVP-II", protocol: "Network Voice Protocol" }, + 12: { keyword: "PUP", protocol: "PUP" }, + 13: { keyword: "ARGUS (deprecated)", protocol: "ARGUS" }, + 14: { keyword: "EMCON", protocol: "EMCON" }, + 15: { keyword: "XNET", protocol: "Cross Net Debugger" }, + 16: { keyword: "CHAOS", protocol: "Chaos" }, + 17: { keyword: "UDP", protocol: "User Datagram" }, + 18: { keyword: "MUX", protocol: "Multiplexing" }, + 19: { keyword: "DCN-MEAS", protocol: "DCN Measurement Subsystems" }, + 20: { keyword: "HMP", protocol: "Host Monitoring" }, + 21: { keyword: "PRM", protocol: "Packet Radio Measurement" }, + 22: { keyword: "XNS-IDP", protocol: "XEROX NS IDP" }, + 23: { keyword: "TRUNK-1", protocol: "Trunk-1" }, + 24: { keyword: "TRUNK-2", protocol: "Trunk-2" }, + 25: { keyword: "LEAF-1", protocol: "Leaf-1" }, + 26: { keyword: "LEAF-2", protocol: "Leaf-2" }, + 27: { keyword: "RDP", protocol: "Reliable Data Protocol" }, + 28: { keyword: "IRTP", protocol: "Internet Reliable Transaction" }, + 29: { keyword: "ISO-TP4", protocol: "ISO Transport Protocol Class 4" }, + 30: { keyword: "NETBLT", protocol: "Bulk Data Transfer Protocol" }, + 31: { keyword: "MFE-NSP", protocol: "MFE Network Services Protocol" }, + 32: { keyword: "MERIT-INP", protocol: "MERIT Internodal Protocol" }, + 33: { keyword: "DCCP", protocol: "Datagram Congestion Control Protocol" }, + 34: { keyword: "3PC", protocol: "Third Party Connect Protocol" }, + 35: { keyword: "IDPR", protocol: "Inter-Domain Policy Routing Protocol" }, + 36: { keyword: "XTP", protocol: "XTP" }, + 37: { keyword: "DDP", protocol: "Datagram Delivery Protocol" }, + 38: { + keyword: "IDPR-CMTP", + protocol: "IDPR Control Message Transport Proto", + }, + 39: { keyword: "TP++", protocol: "TP++ Transport Protocol" }, + 40: { keyword: "IL", protocol: "IL Transport Protocol" }, + 41: { keyword: "IPv6", protocol: "IPv6 encapsulation" }, + 42: { keyword: "SDRP", protocol: "Source Demand Routing Protocol" }, + 43: { keyword: "IPv6-Route", protocol: "Routing Header for IPv6" }, + 44: { keyword: "IPv6-Frag", protocol: "Fragment Header for IPv6" }, + 45: { keyword: "IDRP", protocol: "Inter-Domain Routing Protocol" }, + 46: { keyword: "RSVP", protocol: "Reservation Protocol" }, + 47: { keyword: "GRE", protocol: "Generic Routing Encapsulation" }, + 48: { keyword: "DSR", protocol: "Dynamic Source Routing Protocol" }, + 49: { keyword: "BNA", protocol: "BNA" }, + 50: { keyword: "ESP", protocol: "Encap Security Payload" }, + 51: { keyword: "AH", protocol: "Authentication Header" }, + 52: { keyword: "I-NLSP", protocol: "Integrated Net Layer Security TUBA" }, + 53: { keyword: "SWIPE (deprecated)", protocol: "IP with Encryption" }, + 54: { keyword: "NARP", protocol: "NBMA Address Resolution Protocol" }, + 55: { keyword: "MOBILE", protocol: "IP Mobility" }, + 56: { + keyword: "TLSP", + protocol: + "Transport Layer Security Protocol using Kryptonet key management", + }, + 57: { keyword: "SKIP", protocol: "SKIP" }, + 58: { keyword: "IPv6-ICMP", protocol: "ICMP for IPv6" }, + 59: { keyword: "IPv6-NoNxt", protocol: "No Next Header for IPv6" }, + 60: { keyword: "IPv6-Opts", protocol: "Destination Options for IPv6" }, + 61: { keyword: "", protocol: "any host internal protocol" }, + 62: { keyword: "CFTP", protocol: "CFTP" }, + 63: { keyword: "", protocol: "any local network" }, + 64: { keyword: "SAT-EXPAK", protocol: "SATNET and Backroom EXPAK" }, + 65: { keyword: "KRYPTOLAN", protocol: "Kryptolan" }, + 66: { keyword: "RVD", protocol: "MIT Remote Virtual Disk Protocol" }, + 67: { keyword: "IPPC", protocol: "Internet Pluribus Packet Core" }, + 68: { keyword: "", protocol: "any distributed file system" }, + 69: { keyword: "SAT-MON", protocol: "SATNET Monitoring" }, + 70: { keyword: "VISA", protocol: "VISA Protocol" }, + 71: { keyword: "IPCV", protocol: "Internet Packet Core Utility" }, + 72: { keyword: "CPNX", protocol: "Computer Protocol Network Executive" }, + 73: { keyword: "CPHB", protocol: "Computer Protocol Heart Beat" }, + 74: { keyword: "WSN", protocol: "Wang Span Network" }, + 75: { keyword: "PVP", protocol: "Packet Video Protocol" }, + 76: { keyword: "BR-SAT-MON", protocol: "Backroom SATNET Monitoring" }, + 77: { keyword: "SUN-ND", protocol: "SUN ND PROTOCOL-Temporary" }, + 78: { keyword: "WB-MON", protocol: "WIDEBAND Monitoring" }, + 79: { keyword: "WB-EXPAK", protocol: "WIDEBAND EXPAK" }, + 80: { keyword: "ISO-IP", protocol: "ISO Internet Protocol" }, + 81: { keyword: "VMTP", protocol: "VMTP" }, + 82: { keyword: "SECURE-VMTP", protocol: "SECURE-VMTP" }, + 83: { keyword: "VINES", protocol: "VINES" }, + 84: { keyword: "TTP", protocol: "Transaction Transport Protocol" }, + 85: { keyword: "NSFNET-IGP", protocol: "NSFNET-IGP" }, + 86: { keyword: "DGP", protocol: "Dissimilar Gateway Protocol" }, + 87: { keyword: "TCF", protocol: "TCF" }, + 88: { keyword: "EIGRP", protocol: "EIGRP" }, + 89: { keyword: "OSPFIGP", protocol: "OSPFIGP" }, + 90: { keyword: "Sprite-RPC", protocol: "Sprite RPC Protocol" }, + 91: { keyword: "LARP", protocol: "Locus Address Resolution Protocol" }, + 92: { keyword: "MTP", protocol: "Multicast Transport Protocol" }, + 93: { keyword: "AX.25", protocol: "AX.25 Frames" }, + 94: { keyword: "IPIP", protocol: "IP-within-IP Encapsulation Protocol" }, + 95: { + keyword: "MICP (deprecated)", + protocol: "Mobile Internetworking Control Pro.", + }, + 96: { keyword: "SCC-SP", protocol: "Semaphore Communications Sec. Pro." }, + 97: { keyword: "ETHERIP", protocol: "Ethernet-within-IP Encapsulation" }, + 98: { keyword: "ENCAP", protocol: "Encapsulation Header" }, + 99: { keyword: "", protocol: "any private encryption scheme" }, + 100: { keyword: "GMTP", protocol: "GMTP" }, + 101: { keyword: "IFMP", protocol: "Ipsilon Flow Management Protocol" }, + 102: { keyword: "PNNI", protocol: "PNNI over IP" }, + 103: { keyword: "PIM", protocol: "Protocol Independent Multicast" }, + 104: { keyword: "ARIS", protocol: "ARIS" }, + 105: { keyword: "SCPS", protocol: "SCPS" }, + 106: { keyword: "QNX", protocol: "QNX" }, + 107: { keyword: "A/N", protocol: "Active Networks" }, + 108: { keyword: "IPComp", protocol: "IP Payload Compression Protocol" }, + 109: { keyword: "SNP", protocol: "Sitara Networks Protocol" }, + 110: { keyword: "Compaq-Peer", protocol: "Compaq Peer Protocol" }, + 111: { keyword: "IPX-in-IP", protocol: "IPX in IP" }, + 112: { keyword: "VRRP", protocol: "Virtual Router Redundancy Protocol" }, + 113: { keyword: "PGM", protocol: "PGM Reliable Transport Protocol" }, + 114: { keyword: "", protocol: "any 0-hop protocol" }, + 115: { keyword: "L2TP", protocol: "Layer Two Tunneling Protocol" }, + 116: { keyword: "DDX", protocol: "D-II Data Exchange (DDX)" }, + 117: { keyword: "IATP", protocol: "Interactive Agent Transfer Protocol" }, + 118: { keyword: "STP", protocol: "Schedule Transfer Protocol" }, + 119: { keyword: "SRP", protocol: "SpectraLink Radio Protocol" }, + 120: { keyword: "UTI", protocol: "UTI" }, + 121: { keyword: "SMP", protocol: "Simple Message Protocol" }, + 122: { keyword: "SM (deprecated)", protocol: "Simple Multicast Protocol" }, + 123: { keyword: "PTP", protocol: "Performance Transparency Protocol" }, + 124: { keyword: "ISIS over IPv4", protocol: "" }, + 125: { keyword: "FIRE", protocol: "" }, + 126: { keyword: "CRTP", protocol: "Combat Radio Transport Protocol" }, + 127: { keyword: "CRUDP", protocol: "Combat Radio User Datagram" }, + 128: { keyword: "SSCOPMCE", protocol: "" }, + 129: { keyword: "IPLT", protocol: "" }, + 130: { keyword: "SPS", protocol: "Secure Packet Shield" }, + 131: { keyword: "PIPE", protocol: "Private IP Encapsulation within IP" }, + 132: { keyword: "SCTP", protocol: "Stream Control Transmission Protocol" }, + 133: { keyword: "FC", protocol: "Fibre Channel" }, + 134: { keyword: "RSVP-E2E-IGNORE", protocol: "" }, + 135: { keyword: "Mobility Header", protocol: "" }, + 136: { keyword: "UDPLite", protocol: "" }, + 137: { keyword: "MPLS-in-IP", protocol: "" }, + 138: { keyword: "manet", protocol: "MANET Protocols" }, + 139: { keyword: "HIP", protocol: "Host Identity Protocol" }, + 140: { keyword: "Shim6", protocol: "Shim6 Protocol" }, + 141: { + keyword: "WESP", + protocol: "Wrapped Encapsulating Security Payload", + }, + 142: { keyword: "ROHC", protocol: "Robust Header Compression" }, + 253: { keyword: "", protocol: "Use for experimentation and testing" }, + 254: { keyword: "", protocol: "Use for experimentation and testing" }, + 255: { keyword: "Reserved", protocol: "" }, }; diff --git a/src/core/lib/ImageManipulation.mjs b/src/core/lib/ImageManipulation.mjs index 63a80fe4..47c47de2 100644 --- a/src/core/lib/ImageManipulation.mjs +++ b/src/core/lib/ImageManipulation.mjs @@ -16,7 +16,7 @@ import OperationError from "../errors/OperationError.mjs"; * @param {boolean} fast * @returns {jimp} */ -export function gaussianBlur (input, radius) { +export function gaussianBlur(input, radius) { try { // From http://blog.ivank.net/fastest-gaussian-blur.html const boxes = boxesForGauss(radius, 3); @@ -37,7 +37,7 @@ export function gaussianBlur (input, radius) { * @returns {Array} */ function boxesForGauss(radius, numBoxes) { - const idealWidth = Math.sqrt((12 * radius * radius / numBoxes) + 1); + const idealWidth = Math.sqrt((12 * radius * radius) / numBoxes + 1); let wl = Math.floor(idealWidth); @@ -47,7 +47,12 @@ function boxesForGauss(radius, numBoxes) { const wu = wl + 2; - const mIdeal = (12 * radius * radius - numBoxes * wl * wl - 4 * numBoxes * wl - 3 * numBoxes) / (-4 * wl - 4); + const mIdeal = + (12 * radius * radius - + numBoxes * wl * wl - + 4 * numBoxes * wl - + 3 * numBoxes) / + (-4 * wl - 4); const m = Math.round(mIdeal); const sizes = []; @@ -64,7 +69,7 @@ function boxesForGauss(radius, numBoxes) { * @param {number} radius * @returns {jimp} */ -function boxBlur (source, radius) { +function boxBlur(source, radius) { const width = source.bitmap.width; const height = source.bitmap.height; let output = source.clone(); @@ -84,7 +89,7 @@ function boxBlur (source, radius) { * @param {number} radius * @returns {jimp} */ -function boxBlurH (source, output, width, height, radius) { +function boxBlurH(source, output, width, height, radius) { const iarr = 1 / (radius + radius + 1); for (let i = 0; i < height; i++) { let ti = 0, @@ -133,9 +138,12 @@ function boxBlurH (source, output, width, height, radius) { const riIdx = source.getPixelIndex(ri++, i); const liIdx = source.getPixelIndex(li++, i); red += source.bitmap.data[riIdx] - source.bitmap.data[liIdx]; - green += source.bitmap.data[riIdx + 1] - source.bitmap.data[liIdx + 1]; - blue += source.bitmap.data[riIdx + 2] - source.bitmap.data[liIdx + 2]; - alpha += source.bitmap.data[riIdx + 3] - source.bitmap.data[liIdx + 3]; + green += + source.bitmap.data[riIdx + 1] - source.bitmap.data[liIdx + 1]; + blue += + source.bitmap.data[riIdx + 2] - source.bitmap.data[liIdx + 2]; + alpha += + source.bitmap.data[riIdx + 3] - source.bitmap.data[liIdx + 3]; const tiIdx = source.getPixelIndex(ti++, i); output.bitmap.data[tiIdx] = Math.round(red * iarr); @@ -171,7 +179,7 @@ function boxBlurH (source, output, width, height, radius) { * @param {number} radius * @returns {jimp} */ -function boxBlurV (source, output, width, height, radius) { +function boxBlurV(source, output, width, height, radius) { const iarr = 1 / (radius + radius + 1); for (let i = 0; i < width; i++) { let ti = 0, @@ -222,9 +230,12 @@ function boxBlurV (source, output, width, height, radius) { const riIdx = source.getPixelIndex(i, ri++); const liIdx = source.getPixelIndex(i, li++); red += source.bitmap.data[riIdx] - source.bitmap.data[liIdx]; - green += source.bitmap.data[riIdx + 1] - source.bitmap.data[liIdx + 1]; - blue += source.bitmap.data[riIdx + 2] - source.bitmap.data[liIdx + 2]; - alpha += source.bitmap.data[riIdx + 3] - source.bitmap.data[liIdx + 3]; + green += + source.bitmap.data[riIdx + 1] - source.bitmap.data[liIdx + 1]; + blue += + source.bitmap.data[riIdx + 2] - source.bitmap.data[liIdx + 2]; + alpha += + source.bitmap.data[riIdx + 3] - source.bitmap.data[liIdx + 3]; const tiIdx = source.getPixelIndex(i, ti++); output.bitmap.data[tiIdx] = Math.round(red * iarr); diff --git a/src/core/lib/JWT.mjs b/src/core/lib/JWT.mjs index fee7fec5..55785234 100644 --- a/src/core/lib/JWT.mjs +++ b/src/core/lib/JWT.mjs @@ -6,7 +6,6 @@ * @license Apache-2.0 */ - /** * List of the JWT algorithms that can be used */ @@ -20,5 +19,5 @@ export const JWT_ALGORITHMS = [ "ES256", "ES384", "ES512", - "None" + "None", ]; diff --git a/src/core/lib/LS47.mjs b/src/core/lib/LS47.mjs index ac7ca839..e7af29bc 100644 --- a/src/core/lib/LS47.mjs +++ b/src/core/lib/LS47.mjs @@ -14,7 +14,7 @@ const tiles = []; */ export function initTiles() { for (let i = 0; i < 49; i++) - tiles.push([letters.charAt(i), [Math.floor(i/7), i % 7]]); + tiles.push([letters.charAt(i), [Math.floor(i / 7), i % 7]]); } /** @@ -27,21 +27,19 @@ export function initTiles() { */ function rotateDown(key, col, n) { const lines = []; - for (let i = 0; i < 7; i++) - lines.push(key.slice(i*7, (i + 1) * 7)); + for (let i = 0; i < 7; i++) lines.push(key.slice(i * 7, (i + 1) * 7)); const lefts = []; let mids = []; const rights = []; lines.forEach((element) => { lefts.push(element.slice(0, col)); mids.push(element.charAt(col)); - rights.push(element.slice(col+1)); + rights.push(element.slice(col + 1)); }); - n = (7 - n % 7) % 7; + n = (7 - (n % 7)) % 7; mids = mids.slice(n).concat(mids.slice(0, n)); let result = ""; - for (let i = 0; i < 7; i++) - result += lefts[i] + mids[i] + rights[i]; + for (let i = 0; i < 7; i++) result += lefts[i] + mids[i] + rights[i]; return result; } @@ -55,8 +53,13 @@ function rotateDown(key, col, n) { */ function rotateRight(key, row, n) { const mid = key.slice(row * 7, (row + 1) * 7); - n = (7 - n % 7) % 7; - return key.slice(0, 7 * row) + mid.slice(n) + mid.slice(0, n) + key.slice(7 * (row + 1)); + n = (7 - (n % 7)) % 7; + return ( + key.slice(0, 7 * row) + + mid.slice(n) + + mid.slice(0, n) + + key.slice(7 * (row + 1)) + ); } /** @@ -67,8 +70,7 @@ function rotateRight(key, row, n) { */ function findIx(letter) { for (let i = 0; i < tiles.length; i++) - if (tiles[i][0] === letter) - return tiles[i][1]; + if (tiles[i][0] === letter) return tiles[i][1]; throw new OperationError("Letter " + letter + " is not included in LS47"); } @@ -98,8 +100,7 @@ function checkKey(key) { if (key.length !== letters.length) throw new OperationError("Wrong key size"); const counts = new Array(); - for (let i = 0; i < letters.length; i++) - counts[letters.charAt(i)] = 0; + for (let i = 0; i < letters.length; i++) counts[letters.charAt(i)] = 0; for (const elem of letters) { if (letters.indexOf(elem) === -1) throw new OperationError("Letter " + elem + " not in LS47"); @@ -116,10 +117,9 @@ function checkKey(key) { * @param {string} letter * @returns {object} */ -function findPos (key, letter) { +function findPos(key, letter) { const index = key.indexOf(letter); - if (index >= 0 && index < 49) - return [Math.floor(index/7), index%7]; + if (index >= 0 && index < 49) return [Math.floor(index / 7), index % 7]; throw new OperationError("Letter " + letter + " is not in the key"); } @@ -131,7 +131,7 @@ function findPos (key, letter) { * @returns {string} */ function findAtPos(key, coord) { - return key.charAt(coord[1] + (coord[0] * 7)); + return key.charAt(coord[1] + coord[0] * 7); } /** @@ -157,7 +157,7 @@ function addPos(a, b) { function subPos(a, b) { const asub = a[0] - b[0]; const bsub = a[1] - b[1]; - return [asub - (Math.floor(asub/7) * 7), bsub - (Math.floor(bsub/7) * 7)]; + return [asub - Math.floor(asub / 7) * 7, bsub - Math.floor(bsub / 7) * 7]; } /** @@ -226,7 +226,7 @@ export function encryptPad(key, plaintext, signature, paddingSize) { for (let i = 0; i < paddingSize; i++) { padding += letters.charAt(Math.floor(Math.random() * letters.length)); } - return encrypt(key, padding+plaintext+"---"+signature); + return encrypt(key, padding + plaintext + "---" + signature); } /** diff --git a/src/core/lib/LZNT1.mjs b/src/core/lib/LZNT1.mjs index 9a1c7fab..a17efbe1 100644 --- a/src/core/lib/LZNT1.mjs +++ b/src/core/lib/LZNT1.mjs @@ -39,7 +39,10 @@ export function decompress(compressed) { while (coffset + 2 <= compressed.length) { const doffset = decompressed.length; - const blockHeader = Utils.byteArrayToInt(compressed.slice(coffset, coffset + 2), "little"); + const blockHeader = Utils.byteArrayToInt( + compressed.slice(coffset, coffset + 2), + "little", + ); coffset += 2; const size = blockHeader & SIZE_MASK; @@ -48,7 +51,9 @@ export function decompress(compressed) { if (size === 0) { break; } else if (compressed.length < coffset + size) { - throw new OperationError("Malformed LZNT1 stream: Block too small! Has the stream been truncated?"); + throw new OperationError( + "Malformed LZNT1 stream: Block too small! Has the stream been truncated?", + ); } if ((blockHeader & COMPRESSED_MASK) !== 0) { @@ -59,18 +64,31 @@ export function decompress(compressed) { if ((header & 1) === 0) { decompressed.push(compressed[coffset++]); } else { - const pointer = Utils.byteArrayToInt(compressed.slice(coffset, coffset + 2), "little"); + const pointer = Utils.byteArrayToInt( + compressed.slice(coffset, coffset + 2), + "little", + ); coffset += 2; - const displacement = getDisplacement(decompressed.length - doffset - 1); - const symbolOffset = (pointer >> (12 - displacement)) + 1; - const symbolLength = (pointer & (0xFFF >> displacement)) + 2; + const displacement = getDisplacement( + decompressed.length - doffset - 1, + ); + const symbolOffset = + (pointer >> (12 - displacement)) + 1; + const symbolLength = + (pointer & (0xfff >> displacement)) + 2; const shiftOffset = decompressed.length - symbolOffset; - for (let shiftDelta = 0; shiftDelta < symbolLength + 1; shiftDelta++) { + for ( + let shiftDelta = 0; + shiftDelta < symbolLength + 1; + shiftDelta++ + ) { const shift = shiftOffset + shiftDelta; if (shift < 0 || decompressed.length <= shift) { - throw new OperationError("Malformed LZNT1 stream: Invalid shift!"); + throw new OperationError( + "Malformed LZNT1 stream: Invalid shift!", + ); } decompressed.push(decompressed[shift]); } diff --git a/src/core/lib/LZString.mjs b/src/core/lib/LZString.mjs index c4919a87..23ee17b2 100644 --- a/src/core/lib/LZString.mjs +++ b/src/core/lib/LZString.mjs @@ -10,12 +10,12 @@ import LZString from "lz-string"; export const COMPRESSION_OUTPUT_FORMATS = ["default", "UTF16", "Base64"]; export const COMPRESSION_FUNCTIONS = { - "default": LZString.compress, - "UTF16": LZString.compressToUTF16, - "Base64": LZString.compressToBase64, + default: LZString.compress, + UTF16: LZString.compressToUTF16, + Base64: LZString.compressToBase64, }; export const DECOMPRESSION_FUNCTIONS = { - "default": LZString.decompress, - "UTF16": LZString.decompressFromUTF16, - "Base64": LZString.decompressFromBase64, + default: LZString.decompress, + UTF16: LZString.decompressFromUTF16, + Base64: LZString.decompressFromBase64, }; diff --git a/src/core/lib/LoremIpsum.mjs b/src/core/lib/LoremIpsum.mjs index 3d60fa89..b9fccabd 100644 --- a/src/core/lib/LoremIpsum.mjs +++ b/src/core/lib/LoremIpsum.mjs @@ -12,34 +12,45 @@ * @param {number} length * @returns {string} */ -export function GenerateParagraphs(length=3) { +export function GenerateParagraphs(length = 3) { const paragraphs = []; while (paragraphs.length < length) { - const paragraphLength = getRandomLength(PARAGRAPH_LENGTH_MEAN, PARAGRAPH_LENGTH_STD_DEV); + const paragraphLength = getRandomLength( + PARAGRAPH_LENGTH_MEAN, + PARAGRAPH_LENGTH_STD_DEV, + ); const sentences = []; while (sentences.length < paragraphLength) { - const sentenceLength = getRandomLength(SENTENCE_LENGTH_MEAN, SENTENCE_LENGTH_STD_DEV); + const sentenceLength = getRandomLength( + SENTENCE_LENGTH_MEAN, + SENTENCE_LENGTH_STD_DEV, + ); const sentence = getWords(sentenceLength); sentences.push(formatSentence(sentence)); } paragraphs.push(formatParagraph(sentences)); } - paragraphs[paragraphs.length-1] = paragraphs[paragraphs.length-1].slice(0, -2); + paragraphs[paragraphs.length - 1] = paragraphs[paragraphs.length - 1].slice( + 0, + -2, + ); paragraphs[0] = replaceStart(paragraphs[0]); return paragraphs.join(""); } - /** * Generate lorem ipsum sentences. * * @param {number} length * @returns {string} */ -export function GenerateSentences(length=3) { +export function GenerateSentences(length = 3) { const sentences = []; while (sentences.length < length) { - const sentenceLength = getRandomLength(SENTENCE_LENGTH_MEAN, SENTENCE_LENGTH_STD_DEV); + const sentenceLength = getRandomLength( + SENTENCE_LENGTH_MEAN, + SENTENCE_LENGTH_STD_DEV, + ); const sentence = getWords(sentenceLength); sentences.push(formatSentence(sentence)); } @@ -47,33 +58,30 @@ export function GenerateSentences(length=3) { return paragraphs.join(""); } - /** * Generate lorem ipsum words. * * @param {number} length * @returns {string} */ -export function GenerateWords(length=3) { +export function GenerateWords(length = 3) { const words = getWords(length); const sentences = wordsToSentences(words); const paragraphs = sentencesToParagraphs(sentences); return paragraphs.join(""); } - /** * Generate lorem ipsum bytes. * * @param {number} length * @returns {string} */ -export function GenerateBytes(length=3) { - const str = GenerateWords(length/3); +export function GenerateBytes(length = 3) { + const str = GenerateWords(length / 3); return str.slice(0, length); } - /** * Get array of randomly selected words from the lorem ipsum wordList. * @@ -81,7 +89,7 @@ export function GenerateBytes(length=3) { * @returns {string[]} * @private */ -function getWords(length=3) { +function getWords(length = 3) { const words = []; let word; let previousWord; @@ -95,7 +103,6 @@ function getWords(length=3) { return words; } - /** * Convert an array of words into an array of sentences * @@ -106,7 +113,10 @@ function getWords(length=3) { function wordsToSentences(words) { const sentences = []; while (words.length > 0) { - const sentenceLength = getRandomLength(SENTENCE_LENGTH_MEAN, SENTENCE_LENGTH_STD_DEV); + const sentenceLength = getRandomLength( + SENTENCE_LENGTH_MEAN, + SENTENCE_LENGTH_STD_DEV, + ); if (sentenceLength <= words.length) { sentences.push(formatSentence(words.splice(0, sentenceLength))); } else { @@ -116,7 +126,6 @@ function wordsToSentences(words) { return sentences; } - /** * Convert an array of sentences into an array of paragraphs * @@ -127,15 +136,20 @@ function wordsToSentences(words) { function sentencesToParagraphs(sentences) { const paragraphs = []; while (sentences.length > 0) { - const paragraphLength = getRandomLength(PARAGRAPH_LENGTH_MEAN, PARAGRAPH_LENGTH_STD_DEV); + const paragraphLength = getRandomLength( + PARAGRAPH_LENGTH_MEAN, + PARAGRAPH_LENGTH_STD_DEV, + ); paragraphs.push(formatParagraph(sentences.splice(0, paragraphLength))); } - paragraphs[paragraphs.length-1] = paragraphs[paragraphs.length-1].slice(0, -1); + paragraphs[paragraphs.length - 1] = paragraphs[paragraphs.length - 1].slice( + 0, + -1, + ); paragraphs[0] = replaceStart(paragraphs[0]); return paragraphs; } - /** * Format an array of words into a sentence. * @@ -146,8 +160,8 @@ function sentencesToParagraphs(sentences) { function formatSentence(words) { // 0.35 chance of a comma being added randomly to the sentence. if (Math.random() < PROBABILITY_OF_A_COMMA) { - const pos = Math.round(Math.random()*(words.length-1)); - words[pos] +=","; + const pos = Math.round(Math.random() * (words.length - 1)); + words[pos] += ","; } let sentence = words.join(" "); sentence = sentence.charAt(0).toUpperCase() + sentence.slice(1); @@ -155,7 +169,6 @@ function formatSentence(words) { return sentence; } - /** * Format an array of sentences into a paragraph. * @@ -169,7 +182,6 @@ function formatParagraph(sentences) { return paragraph; } - /** * Get a random number based on a mean and standard deviation. * @@ -181,12 +193,17 @@ function formatParagraph(sentences) { function getRandomLength(mean, stdDev) { let length; do { - length = Math.round((Math.random()*2-1)+(Math.random()*2-1)+(Math.random()*2-1)*stdDev+mean); + length = Math.round( + Math.random() * 2 - + 1 + + (Math.random() * 2 - 1) + + (Math.random() * 2 - 1) * stdDev + + mean, + ); } while (length <= 0); return length; } - /** * Replace first 5 words with "Lorem ipsum dolor sit amet" * @@ -208,7 +225,6 @@ function replaceStart(str) { } } - const SENTENCE_LENGTH_MEAN = 15; const SENTENCE_LENGTH_STD_DEV = 9; const PARAGRAPH_LENGTH_MEAN = 5; @@ -216,15 +232,66 @@ const PARAGRAPH_LENGTH_STD_DEV = 2; const PROBABILITY_OF_A_COMMA = 0.35; const wordList = [ - "ad", "adipisicing", "aliqua", "aliquip", "amet", "anim", - "aute", "cillum", "commodo", "consectetur", "consequat", "culpa", - "cupidatat", "deserunt", "do", "dolor", "dolore", "duis", - "ea", "eiusmod", "elit", "enim", "esse", "est", - "et", "eu", "ex", "excepteur", "exercitation", "fugiat", - "id", "in", "incididunt", "ipsum", "irure", "labore", - "laboris", "laborum", "Lorem", "magna", "minim", "mollit", - "nisi", "non", "nostrud", "nulla", "occaecat", "officia", - "pariatur", "proident", "qui", "quis", "reprehenderit", "sint", - "sit", "sunt", "tempor", "ullamco", "ut", "velit", - "veniam", "voluptate", + "ad", + "adipisicing", + "aliqua", + "aliquip", + "amet", + "anim", + "aute", + "cillum", + "commodo", + "consectetur", + "consequat", + "culpa", + "cupidatat", + "deserunt", + "do", + "dolor", + "dolore", + "duis", + "ea", + "eiusmod", + "elit", + "enim", + "esse", + "est", + "et", + "eu", + "ex", + "excepteur", + "exercitation", + "fugiat", + "id", + "in", + "incididunt", + "ipsum", + "irure", + "labore", + "laboris", + "laborum", + "Lorem", + "magna", + "minim", + "mollit", + "nisi", + "non", + "nostrud", + "nulla", + "occaecat", + "officia", + "pariatur", + "proident", + "qui", + "quis", + "reprehenderit", + "sint", + "sit", + "sunt", + "tempor", + "ullamco", + "ut", + "velit", + "veniam", + "voluptate", ]; diff --git a/src/core/lib/Lorenz.mjs b/src/core/lib/Lorenz.mjs index 1d336cef..6a693206 100644 --- a/src/core/lib/Lorenz.mjs +++ b/src/core/lib/Lorenz.mjs @@ -7,50 +7,50 @@ */ export const SWITCHES = [ - {name: "Up (.)", value: "."}, - {name: "Centre", value: ""}, - {name: "Down (x)", value: "x"} + { name: "Up (.)", value: "." }, + { name: "Centre", value: "" }, + { name: "Down (x)", value: "x" }, ]; export const VALID_ITA2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ34589+-./"; export const ITA2_TABLE = { - "A": "11000", - "B": "10011", - "C": "01110", - "D": "10010", - "E": "10000", - "F": "10110", - "G": "01011", - "H": "00101", - "I": "01100", - "J": "11010", - "K": "11110", - "L": "01001", - "M": "00111", - "N": "00110", - "O": "00011", - "P": "01101", - "Q": "11101", - "R": "01010", - "S": "10100", - "T": "00001", - "U": "11100", - "V": "01111", - "W": "11001", - "X": "10111", - "Y": "10101", - "Z": "10001", - "3": "00010", - "4": "01000", - "9": "00100", + A: "11000", + B: "10011", + C: "01110", + D: "10010", + E: "10000", + F: "10110", + G: "01011", + H: "00101", + I: "01100", + J: "11010", + K: "11110", + L: "01001", + M: "00111", + N: "00110", + O: "00011", + P: "01101", + Q: "11101", + R: "01010", + S: "10100", + T: "00001", + U: "11100", + V: "01111", + W: "11001", + X: "10111", + Y: "10101", + Z: "10001", + 3: "00010", + 4: "01000", + 9: "00100", "/": "00000", " ": "00100", ".": "00100", - "8": "11111", - "5": "11011", + 8: "11111", + 5: "11011", "-": "11111", - "+": "11011" + "+": "11011", }; export const ROTOR_SIZES = { @@ -65,7 +65,7 @@ export const ROTOR_SIZES = { X2: 31, X3: 29, X4: 26, - X5: 23 + X5: 23, }; /** @@ -73,84 +73,251 @@ export const ROTOR_SIZES = { */ export const INIT_PATTERNS = { "No Pattern": { - "X": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 5: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + X: { + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + 2: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + 3: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + ], + 4: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + ], + 5: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + ], }, - "S": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 5: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + S: { + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + ], + 2: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + ], + 3: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + 4: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + 5: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }, + M: { + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + 2: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], }, - "M": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, "KH Pattern": { - "X": { - 1: [0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0], - 2: [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0], - 3: [0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0], - 4: [1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0], - 5: [1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0] + X: { + 1: [ + 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, + 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, + ], + 2: [ + 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, + 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, + ], + 3: [ + 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, + 0, 0, 1, 1, 0, 1, 1, 0, + ], + 4: [ + 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, + 0, 0, 1, 0, 0, + ], + 5: [ + 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, + ], }, - "S": { - 1: [0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1], - 2: [0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1], - 3: [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1], - 4: [0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], - 5: [1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0] + S: { + 1: [ + 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, + 1, + ], + 2: [ + 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, + 0, 1, 0, 0, 1, + ], + 3: [ + 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, + 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, + 1, 1, 0, 0, 1, 0, 1, 0, 1, + ], + 4: [ + 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, + 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + ], + 5: [ + 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, + ], + }, + M: { + 1: [ + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, + ], + 2: [ + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, + 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + ], }, - "M": { - 1: [0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0], - 2: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0] - } }, - "ZMUG Pattern": { - "X": { - 1: [0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0], - 2: [1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0], - 3: [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0], - 4: [1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1], - 5: [0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1] + "ZMUG Pattern": { + X: { + 1: [ + 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, + ], + 2: [ + 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, + ], + 3: [ + 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 1, 1, 0, 1, 1, 1, 1, 0, + ], + 4: [ + 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, + 0, 0, 1, 0, 1, + ], + 5: [ + 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, + 0, 1, + ], }, - "S": { - 1: [1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0], - 2: [0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1], - 3: [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1], - 4: [0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1], - 5: [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0] + S: { + 1: [ + 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, + ], + 2: [ + 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, + 0, 1, 0, 1, 1, + ], + 3: [ + 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, + 0, 0, 1, 1, 0, 0, 1, 1, 1, + ], + 4: [ + 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, + 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, + ], + 5: [ + 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, + ], + }, + M: { + 1: [ + 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, + 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, + ], + 2: [ + 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, + 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, + ], }, - "M": { - 1: [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1], - 2: [0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1] - } }, "BREAM Pattern": { - "X": { - 1: [0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0], - 2: [0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1], - 3: [1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0], - 4: [1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0], - 5: [0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0] + X: { + 1: [ + 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, + 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, + ], + 2: [ + 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, + 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, + ], + 3: [ + 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 1, 1, 0, 1, 1, 1, 0, 0, + ], + 4: [ + 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, + 0, 1, 1, 0, 0, + ], + 5: [ + 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, + 1, 0, + ], }, - "S": { - 1: [0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0], - 2: [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0], - 3: [1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], - 4: [0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1], - 5: [1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0] + S: { + 1: [ + 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, + 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, + ], + 2: [ + 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, + 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 1, 0, 1, 0, 0, + ], + 3: [ + 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, + ], + 4: [ + 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, + 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, + ], + 5: [ + 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + ], }, - "M": { - 1: [1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1], - 2: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1] - } - } + M: { + 1: [ + 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, + ], + 2: [ + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, + ], + }, + }, }; diff --git a/src/core/lib/Magic.mjs b/src/core/lib/Magic.mjs index 921fc3f6..b376bbbf 100644 --- a/src/core/lib/Magic.mjs +++ b/src/core/lib/Magic.mjs @@ -1,8 +1,10 @@ -import OperationConfig from "../config/OperationConfig.json" assert {type: "json"}; +import OperationConfig from "../config/OperationConfig.json" assert { + type: "json", +}; import Utils, { isWorkerEnvironment } from "../Utils.mjs"; import Recipe from "../Recipe.mjs"; import Dish from "../Dish.mjs"; -import {detectFileType, isType} from "./FileType.mjs"; +import { detectFileType, isType } from "./FileType.mjs"; import chiSquared from "chi-squared"; /** @@ -14,7 +16,6 @@ import chiSquared from "chi-squared"; * @license Apache-2.0 */ class Magic { - /** * Magic constructor. * @@ -22,7 +23,7 @@ class Magic { * @param {Object[]} [opCriteria] * @param {Object} [prevOp] */ - constructor(buf, opCriteria=Magic._generateOpCriteria(), prevOp=null) { + constructor(buf, opCriteria = Magic._generateOpCriteria(), prevOp = null) { this.inputBuffer = new Uint8Array(buf); this.inputStr = Utils.arrayBufferToStr(buf); this.opCriteria = opCriteria; @@ -38,16 +39,16 @@ class Magic { const matches = [], inputEntropy = this.calcEntropy(); - this.opCriteria.forEach(check => { + this.opCriteria.forEach((check) => { // If the input doesn't lie in the required entropy range, move on - if (check.entropyRange && + if ( + check.entropyRange && (inputEntropy < check.entropyRange[0] || - inputEntropy > check.entropyRange[1])) + inputEntropy > check.entropyRange[1]) + ) return; // If the input doesn't match the pattern, move on - if (check.pattern && - !check.pattern.test(this.inputStr)) - return; + if (check.pattern && !check.pattern.test(this.inputStr)) return; matches.push(check); }); @@ -64,11 +65,14 @@ class Magic { * @returns {Object[]} */ detectLanguage(extLang = false) { - if (!this.inputBuffer.length) return [{ - lang: "Unknown", - score: Math.MAX_VALUE, - probability: Math.MIN_VALUE - }]; + if (!this.inputBuffer.length) + return [ + { + lang: "Unknown", + score: Math.MAX_VALUE, + probability: Math.MIN_VALUE, + }, + ]; const inputFreq = this._freqDist(); const langFreqs = extLang ? EXTENSIVE_LANG_FREQS : COMMON_LANG_FREQS; @@ -79,7 +83,7 @@ class Magic { chiSqrs.push({ lang: lang, score: score, - probability: prob + probability: prob, }); } @@ -107,7 +111,7 @@ class Magic { name: fileType[0].name, ext: fileType[0].extension, mime: fileType[0].mime, - desc: fileType[0].description + desc: fileType[0].description, }; } @@ -120,63 +124,81 @@ class Magic { const bytes = new Uint8Array(this.inputBuffer); let i = 0; while (i < bytes.length) { - if (( // ASCII + if ( + // ASCII bytes[i] === 0x09 || - bytes[i] === 0x0A || - bytes[i] === 0x0D || - (0x20 <= bytes[i] && bytes[i] <= 0x7E) - )) { + bytes[i] === 0x0a || + bytes[i] === 0x0d || + (0x20 <= bytes[i] && bytes[i] <= 0x7e) + ) { i += 1; continue; } - if (( // non-overlong 2-byte - (0xC2 <= bytes[i] && bytes[i] <= 0xDF) && - (0x80 <= bytes[i+1] && bytes[i+1] <= 0xBF) - )) { + if ( + // non-overlong 2-byte + 0xc2 <= bytes[i] && + bytes[i] <= 0xdf && + 0x80 <= bytes[i + 1] && + bytes[i + 1] <= 0xbf + ) { i += 2; continue; } - if (( // excluding overlongs - bytes[i] === 0xE0 && - (0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && - (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) - ) || - ( // straight 3-byte - ((0xE1 <= bytes[i] && bytes[i] <= 0xEC) || - bytes[i] === 0xEE || - bytes[i] === 0xEF) && - (0x80 <= bytes[i + 1] && bytes[i+1] <= 0xBF) && - (0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF) - ) || - ( // excluding surrogates - bytes[i] === 0xED && - (0x80 <= bytes[i+1] && bytes[i+1] <= 0x9F) && - (0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF) - )) { + if ( + // excluding overlongs + (bytes[i] === 0xe0 && + 0xa0 <= bytes[i + 1] && + bytes[i + 1] <= 0xbf && + 0x80 <= bytes[i + 2] && + bytes[i + 2] <= 0xbf) || + // straight 3-byte + (((0xe1 <= bytes[i] && bytes[i] <= 0xec) || + bytes[i] === 0xee || + bytes[i] === 0xef) && + 0x80 <= bytes[i + 1] && + bytes[i + 1] <= 0xbf && + 0x80 <= bytes[i + 2] && + bytes[i + 2] <= 0xbf) || + // excluding surrogates + (bytes[i] === 0xed && + 0x80 <= bytes[i + 1] && + bytes[i + 1] <= 0x9f && + 0x80 <= bytes[i + 2] && + bytes[i + 2] <= 0xbf) + ) { i += 3; continue; } - if (( // planes 1-3 - bytes[i] === 0xF0 && - (0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && - (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && - (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) - ) || - ( // planes 4-15 - (0xF1 <= bytes[i] && bytes[i] <= 0xF3) && - (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && - (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && - (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) - ) || - ( // plane 16 - bytes[i] === 0xF4 && - (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) && - (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && - (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) - )) { + if ( + // planes 1-3 + (bytes[i] === 0xf0 && + 0x90 <= bytes[i + 1] && + bytes[i + 1] <= 0xbf && + 0x80 <= bytes[i + 2] && + bytes[i + 2] <= 0xbf && + 0x80 <= bytes[i + 3] && + bytes[i + 3] <= 0xbf) || + // planes 4-15 + (0xf1 <= bytes[i] && + bytes[i] <= 0xf3 && + 0x80 <= bytes[i + 1] && + bytes[i + 1] <= 0xbf && + 0x80 <= bytes[i + 2] && + bytes[i + 2] <= 0xbf && + 0x80 <= bytes[i + 3] && + bytes[i + 3] <= 0xbf) || + // plane 16 + (bytes[i] === 0xf4 && + 0x80 <= bytes[i + 1] && + bytes[i + 1] <= 0x8f && + 0x80 <= bytes[i + 2] && + bytes[i + 2] <= 0xbf && + 0x80 <= bytes[i + 3] && + bytes[i + 3] <= 0xbf) + ) { i += 4; continue; } @@ -192,7 +214,7 @@ class Magic { * * @returns {number} */ - calcEntropy(data=this.inputBuffer, standalone=false) { + calcEntropy(data = this.inputBuffer, standalone = false) { if (!standalone && this.inputEntropy) return this.inputEntropy; const prob = this._freqDist(data, standalone); @@ -202,7 +224,7 @@ class Magic { for (let i = 0; i < prob.length; i++) { p = prob[i] / 100; if (p === 0) continue; - entropy += p * Math.log(p) / Math.log(2); + entropy += (p * Math.log(p)) / Math.log(2); } if (!standalone) this.inputEntropy = -entropy; @@ -221,22 +243,28 @@ class Magic { // 1-byte XOR for (let i = 1; i < 256; i++) { results.push({ - data: sample.map(b => b ^ i).buffer, + data: sample.map((b) => b ^ i).buffer, conf: { op: "XOR", - args: [{"option": "Hex", "string": i.toString(16)}, "Standard", false] - } + args: [ + { option: "Hex", string: i.toString(16) }, + "Standard", + false, + ], + }, }); } // Bit rotate for (let i = 1; i < 8; i++) { results.push({ - data: sample.map(b => (b >> i) | ((b & (Math.pow(2, i) - 1)) << (8 - i))).buffer, + data: sample.map( + (b) => (b >> i) | ((b & (Math.pow(2, i) - 1)) << (8 - i)), + ).buffer, conf: { op: "Rotate right", - args: [i, false] - } + args: [i, false], + }, }); } @@ -246,11 +274,11 @@ class Magic { /** * Test character encodings and add them if they change the data. */ - const testEnc = async op => { + const testEnc = async (op) => { for (let i = 0; i < encodings.length; i++) { const conf = { op: op, - args: [encodings[i]] + args: [encodings[i]], }; try { @@ -260,7 +288,7 @@ class Magic { if (!_buffersEqual(data, sample.buffer)) { results.push({ data: data, - conf: conf + conf: conf, }); } } catch (err) { @@ -286,17 +314,17 @@ class Magic { if (criteria.pattern) { const dataStr = Utils.arrayBufferToStr(data), regex = new RegExp(criteria.pattern, criteria.flags); - if (!regex.test(dataStr)) - return false; + if (!regex.test(dataStr)) return false; } if (criteria.entropyRange) { const dataEntropy = this.calcEntropy(data, true); - if (dataEntropy < criteria.entropyRange[0] || dataEntropy > criteria.entropyRange[1]) + if ( + dataEntropy < criteria.entropyRange[0] || + dataEntropy > criteria.entropyRange[1] + ) return false; } - if (criteria.mime && - !isType(criteria.mime, data)) - return false; + if (criteria.mime && !isType(criteria.mime, data)) return false; return true; } @@ -316,13 +344,13 @@ class Magic { * @returns {Object[]} - A sorted list of the recipes most likely to result in correct decoding */ async speculativeExecution( - depth=0, - extLang=false, - intensive=false, - recipeConfig=[], - useful=false, - crib=null) { - + depth = 0, + extLang = false, + intensive = false, + recipeConfig = [], + useful = false, + crib = null, + ) { // If we have reached the recursion depth, return if (depth < 0) return []; @@ -340,63 +368,91 @@ class Magic { entropy: this.calcEntropy(), matchingOps: matchingOps, useful: useful, - matchesCrib: crib && crib.test(this.inputStr) + matchesCrib: crib && crib.test(this.inputStr), }); const prevOp = recipeConfig[recipeConfig.length - 1]; // Execute each of the matching operations, then recursively call the speculativeExecution() // method on the resulting data, recording the properties of each option. - await Promise.all(matchingOps.map(async op => { - const opConfig = { - op: op.op, - args: op.args - }, - output = await this._runRecipe([opConfig]); + await Promise.all( + matchingOps.map(async (op) => { + const opConfig = { + op: op.op, + args: op.args, + }, + output = await this._runRecipe([opConfig]); - // If the recipe returned an empty buffer, do not continue - if (_buffersEqual(output, new ArrayBuffer())) { - return; - } + // If the recipe returned an empty buffer, do not continue + if (_buffersEqual(output, new ArrayBuffer())) { + return; + } - // If the recipe is repeating and returning the same data, do not continue - if (prevOp && op.op === prevOp.op && _buffersEqual(output, this.inputBuffer)) { - return; - } + // If the recipe is repeating and returning the same data, do not continue + if ( + prevOp && + op.op === prevOp.op && + _buffersEqual(output, this.inputBuffer) + ) { + return; + } - // If the output criteria for this op doesn't match the output, do not continue - if (op.output && !this.outputCheckPasses(output, op.output)) - return; + // If the output criteria for this op doesn't match the output, do not continue + if (op.output && !this.outputCheckPasses(output, op.output)) + return; - const magic = new Magic(output, this.opCriteria, OperationConfig[op.op]), - speculativeResults = await magic.speculativeExecution( - depth-1, extLang, intensive, [...recipeConfig, opConfig], op.useful, crib); + const magic = new Magic( + output, + this.opCriteria, + OperationConfig[op.op], + ), + speculativeResults = await magic.speculativeExecution( + depth - 1, + extLang, + intensive, + [...recipeConfig, opConfig], + op.useful, + crib, + ); - results = results.concat(speculativeResults); - })); + results = results.concat(speculativeResults); + }), + ); if (intensive) { // Run brute forcing of various types on the data and create a new branch for each option const bfEncodings = await this.bruteForce(); - await Promise.all(bfEncodings.map(async enc => { - const magic = new Magic(enc.data, this.opCriteria, undefined), - bfResults = await magic.speculativeExecution( - depth-1, extLang, false, [...recipeConfig, enc.conf], false, crib); + await Promise.all( + bfEncodings.map(async (enc) => { + const magic = new Magic( + enc.data, + this.opCriteria, + undefined, + ), + bfResults = await magic.speculativeExecution( + depth - 1, + extLang, + false, + [...recipeConfig, enc.conf], + false, + crib, + ); - results = results.concat(bfResults); - })); + results = results.concat(bfResults); + }), + ); } // Prune branches that result in unhelpful outputs - const prunedResults = results.filter(r => - (r.useful || r.data.length > 0) && // The operation resulted in "" - ( // One of the following must be true - r.languageScores[0].probability > 0 || // Some kind of language was found - r.fileType || // A file was found - r.isUTF8 || // UTF-8 was found - r.matchingOps.length || // A matching op was found - r.matchesCrib // The crib matches - ) + const prunedResults = results.filter( + (r) => + (r.useful || r.data.length > 0) && // The operation resulted in "" + // One of the following must be true + (r.languageScores[0].probability > 0 || // Some kind of language was found + r.fileType || // A file was found + r.isUTF8 || // UTF-8 was found + r.matchingOps.length || // A matching op was found + r.matchesCrib), // The crib matches ); // Return a sorted list of possible recipes along with their properties @@ -426,9 +482,9 @@ class Magic { bScore += b.entropy; // A result with no recipe but matching ops suggests there are better options - if ((!a.recipe.length && a.matchingOps.length) && b.recipe.length) + if (!a.recipe.length && a.matchingOps.length && b.recipe.length) return 1; - if ((!b.recipe.length && b.matchingOps.length) && a.recipe.length) + if (!b.recipe.length && b.matchingOps.length && a.recipe.length) return -1; return aScore - bScore; @@ -442,7 +498,7 @@ class Magic { * @param {ArrayBuffer} [input=this.inputBuffer] * @returns {ArrayBuffer} */ - async _runRecipe(recipeConfig, input=this.inputBuffer) { + async _runRecipe(recipeConfig, input = this.inputBuffer) { input = input instanceof ArrayBuffer ? input : input.buffer; const dish = new Dish(); dish.set(input, Dish.ARRAY_BUFFER); @@ -472,7 +528,7 @@ class Magic { * @param {boolean} [standalone] * @returns {number[]} */ - _freqDist(data=this.inputBuffer, standalone=false) { + _freqDist(data = this.inputBuffer, standalone = false) { if (!standalone && this.freqDist) return this.freqDist; const len = data.length, @@ -488,8 +544,8 @@ class Magic { counts[data[i]]++; } - const result = counts.map(c => { - return c / len * 100; + const result = counts.map((c) => { + return (c / len) * 100; }); if (!standalone) this.freqDist = result; @@ -506,20 +562,21 @@ class Magic { const opCriteria = []; for (const op in OperationConfig) { - if (!("checks" in OperationConfig[op])) - continue; + if (!("checks" in OperationConfig[op])) continue; - OperationConfig[op].checks.forEach(check => { + OperationConfig[op].checks.forEach((check) => { // Add to the opCriteria list. // Compile the regex here and cache the compiled version so we // don't have to keep calculating it. opCriteria.push({ op: op, - pattern: check.pattern ? new RegExp(check.pattern, check.flags) : null, + pattern: check.pattern + ? new RegExp(check.pattern, check.flags) + : null, args: check.args, useful: check.useful, entropyRange: check.entropyRange, - output: check.output + output: check.output, }); }); } @@ -537,19 +594,16 @@ class Magic { * @param {number} ddof - Delta degrees of freedom * @returns {number[]} - The score and the probability */ - static _chiSqr(observed, expected, ddof=0) { + static _chiSqr(observed, expected, ddof = 0) { let tmp, score = 0; for (let i = 0; i < observed.length; i++) { tmp = observed[i] - expected[i]; - score += tmp * tmp / expected[i]; + score += (tmp * tmp) / expected[i]; } - return [ - score, - 1 - chiSquared.cdf(score, observed.length - 1 - ddof) - ]; + return [score, 1 - chiSquared.cdf(score, observed.length - 1 - ddof)]; } /** @@ -562,311 +616,309 @@ class Magic { */ static codeToLanguage(code) { return { - "aa": "Afar", - "ab": "Abkhazian", - "ace": "Acehnese", - "ady": "Adyghe", - "af": "Afrikaans", - "ak": "Akan", - "als": "Alemannic", - "am": "Amharic", - "an": "Aragonese", - "ang": "Anglo-Saxon", - "ar": "Arabic", - "arc": "Aramaic", - "arz": "Egyptian Arabic", - "as": "Assamese", - "ast": "Asturian", - "atj": "Atikamekw", - "av": "Avar", - "ay": "Aymara", - "az": "Azerbaijani", - "azb": "South Azerbaijani", - "ba": "Bashkir", - "bar": "Bavarian", + aa: "Afar", + ab: "Abkhazian", + ace: "Acehnese", + ady: "Adyghe", + af: "Afrikaans", + ak: "Akan", + als: "Alemannic", + am: "Amharic", + an: "Aragonese", + ang: "Anglo-Saxon", + ar: "Arabic", + arc: "Aramaic", + arz: "Egyptian Arabic", + as: "Assamese", + ast: "Asturian", + atj: "Atikamekw", + av: "Avar", + ay: "Aymara", + az: "Azerbaijani", + azb: "South Azerbaijani", + ba: "Bashkir", + bar: "Bavarian", "bat-smg": "Samogitian", - "bcl": "Central_Bicolano", - "be": "Belarusian", + bcl: "Central_Bicolano", + be: "Belarusian", "be-tarask": "Belarusian (Taraškievica)", - "bg": "Bulgarian", - "bh": "Bihari", - "bi": "Bislama", - "bjn": "Banjar", - "bm": "Bambara", - "bn": "Bengali", - "bo": "Tibetan", - "bpy": "Bishnupriya Manipuri", - "br": "Breton", - "bs": "Bosnian", - "bug": "Buginese", - "bxr": "Buryat (Russia)", - "ca": "Catalan", + bg: "Bulgarian", + bh: "Bihari", + bi: "Bislama", + bjn: "Banjar", + bm: "Bambara", + bn: "Bengali", + bo: "Tibetan", + bpy: "Bishnupriya Manipuri", + br: "Breton", + bs: "Bosnian", + bug: "Buginese", + bxr: "Buryat (Russia)", + ca: "Catalan", "cbk-zam": "Zamboanga Chavacano", - "cdo": "Min Dong", - "ce": "Chechen", - "ceb": "Cebuano", - "ch": "Chamorro", - "cho": "Choctaw", - "chr": "Cherokee", - "chy": "Cheyenne", - "ckb": "Sorani", - "co": "Corsican", - "cr": "Cree", - "crh": "Crimean Tatar", - "cs": "Czech", - "csb": "Kashubian", - "cu": "Old Church Slavonic", - "cv": "Chuvash", - "cy": "Welsh", - "da": "Danish", - "de": "German", - "din": "Dinka", - "diq": "Zazaki", - "dsb": "Lower Sorbian", - "dty": "Doteli", - "dv": "Divehi", - "dz": "Dzongkha", - "ee": "Ewe", - "el": "Greek", - "eml": "Emilian-Romagnol", - "en": "English", - "eo": "Esperanto", - "es": "Spanish", - "et": "Estonian", - "eu": "Basque", - "ext": "Extremaduran", - "fa": "Persian", - "ff": "Fula", - "fi": "Finnish", + cdo: "Min Dong", + ce: "Chechen", + ceb: "Cebuano", + ch: "Chamorro", + cho: "Choctaw", + chr: "Cherokee", + chy: "Cheyenne", + ckb: "Sorani", + co: "Corsican", + cr: "Cree", + crh: "Crimean Tatar", + cs: "Czech", + csb: "Kashubian", + cu: "Old Church Slavonic", + cv: "Chuvash", + cy: "Welsh", + da: "Danish", + de: "German", + din: "Dinka", + diq: "Zazaki", + dsb: "Lower Sorbian", + dty: "Doteli", + dv: "Divehi", + dz: "Dzongkha", + ee: "Ewe", + el: "Greek", + eml: "Emilian-Romagnol", + en: "English", + eo: "Esperanto", + es: "Spanish", + et: "Estonian", + eu: "Basque", + ext: "Extremaduran", + fa: "Persian", + ff: "Fula", + fi: "Finnish", "fiu-vro": "Võro", - "fj": "Fijian", - "fo": "Faroese", - "fr": "French", - "frp": "Franco-Provençal/Arpitan", - "frr": "North Frisian", - "fur": "Friulian", - "fy": "West Frisian", - "ga": "Irish", - "gag": "Gagauz", - "gan": "Gan", - "gd": "Scottish Gaelic", - "gl": "Galician", - "glk": "Gilaki", - "gn": "Guarani", - "gom": "Goan Konkani", - "got": "Gothic", - "gu": "Gujarati", - "gv": "Manx", - "ha": "Hausa", - "hak": "Hakka", - "haw": "Hawaiian", - "he": "Hebrew", - "hi": "Hindi", - "hif": "Fiji Hindi", - "ho": "Hiri Motu", - "hr": "Croatian", - "hsb": "Upper Sorbian", - "ht": "Haitian", - "hu": "Hungarian", - "hy": "Armenian", - "hz": "Herero", - "ia": "Interlingua", - "id": "Indonesian", - "ie": "Interlingue", - "ig": "Igbo", - "ii": "Sichuan Yi", - "ik": "Inupiak", - "ilo": "Ilokano", - "io": "Ido", - "is": "Icelandic", - "it": "Italian", - "iu": "Inuktitut", - "ja": "Japanese", - "jam": "Jamaican", - "jbo": "Lojban", - "jv": "Javanese", - "ka": "Georgian", - "kaa": "Karakalpak", - "kab": "Kabyle", - "kbd": "Kabardian Circassian", - "kbp": "Kabiye", - "kg": "Kongo", - "ki": "Kikuyu", - "kj": "Kuanyama", - "kk": "Kazakh", - "kl": "Greenlandic", - "km": "Khmer", - "kn": "Kannada", - "ko": "Korean", - "koi": "Komi-Permyak", - "kr": "Kanuri", - "krc": "Karachay-Balkar", - "ks": "Kashmiri", - "ksh": "Ripuarian", - "ku": "Kurdish", - "kv": "Komi", - "kw": "Cornish", - "ky": "Kirghiz", - "la": "Latin", - "lad": "Ladino", - "lb": "Luxembourgish", - "lbe": "Lak", - "lez": "Lezgian", - "lg": "Luganda", - "li": "Limburgish", - "lij": "Ligurian", - "lmo": "Lombard", - "ln": "Lingala", - "lo": "Lao", - "lrc": "Northern Luri", - "lt": "Lithuanian", - "ltg": "Latgalian", - "lv": "Latvian", - "mai": "Maithili", + fj: "Fijian", + fo: "Faroese", + fr: "French", + frp: "Franco-Provençal/Arpitan", + frr: "North Frisian", + fur: "Friulian", + fy: "West Frisian", + ga: "Irish", + gag: "Gagauz", + gan: "Gan", + gd: "Scottish Gaelic", + gl: "Galician", + glk: "Gilaki", + gn: "Guarani", + gom: "Goan Konkani", + got: "Gothic", + gu: "Gujarati", + gv: "Manx", + ha: "Hausa", + hak: "Hakka", + haw: "Hawaiian", + he: "Hebrew", + hi: "Hindi", + hif: "Fiji Hindi", + ho: "Hiri Motu", + hr: "Croatian", + hsb: "Upper Sorbian", + ht: "Haitian", + hu: "Hungarian", + hy: "Armenian", + hz: "Herero", + ia: "Interlingua", + id: "Indonesian", + ie: "Interlingue", + ig: "Igbo", + ii: "Sichuan Yi", + ik: "Inupiak", + ilo: "Ilokano", + io: "Ido", + is: "Icelandic", + it: "Italian", + iu: "Inuktitut", + ja: "Japanese", + jam: "Jamaican", + jbo: "Lojban", + jv: "Javanese", + ka: "Georgian", + kaa: "Karakalpak", + kab: "Kabyle", + kbd: "Kabardian Circassian", + kbp: "Kabiye", + kg: "Kongo", + ki: "Kikuyu", + kj: "Kuanyama", + kk: "Kazakh", + kl: "Greenlandic", + km: "Khmer", + kn: "Kannada", + ko: "Korean", + koi: "Komi-Permyak", + kr: "Kanuri", + krc: "Karachay-Balkar", + ks: "Kashmiri", + ksh: "Ripuarian", + ku: "Kurdish", + kv: "Komi", + kw: "Cornish", + ky: "Kirghiz", + la: "Latin", + lad: "Ladino", + lb: "Luxembourgish", + lbe: "Lak", + lez: "Lezgian", + lg: "Luganda", + li: "Limburgish", + lij: "Ligurian", + lmo: "Lombard", + ln: "Lingala", + lo: "Lao", + lrc: "Northern Luri", + lt: "Lithuanian", + ltg: "Latgalian", + lv: "Latvian", + mai: "Maithili", "map-bms": "Banyumasan", - "mdf": "Moksha", - "mg": "Malagasy", - "mh": "Marshallese", - "mhr": "Meadow Mari", - "mi": "Maori", - "min": "Minangkabau", - "mk": "Macedonian", - "ml": "Malayalam", - "mn": "Mongolian", - "mo": "Moldovan", - "mr": "Marathi", - "mrj": "Hill Mari", - "ms": "Malay", - "mt": "Maltese", - "mus": "Muscogee", - "mwl": "Mirandese", - "my": "Burmese", - "myv": "Erzya", - "mzn": "Mazandarani", - "na": "Nauruan", - "nah": "Nahuatl", - "nap": "Neapolitan", - "nds": "Low Saxon", + mdf: "Moksha", + mg: "Malagasy", + mh: "Marshallese", + mhr: "Meadow Mari", + mi: "Maori", + min: "Minangkabau", + mk: "Macedonian", + ml: "Malayalam", + mn: "Mongolian", + mo: "Moldovan", + mr: "Marathi", + mrj: "Hill Mari", + ms: "Malay", + mt: "Maltese", + mus: "Muscogee", + mwl: "Mirandese", + my: "Burmese", + myv: "Erzya", + mzn: "Mazandarani", + na: "Nauruan", + nah: "Nahuatl", + nap: "Neapolitan", + nds: "Low Saxon", "nds-nl": "Dutch Low Saxon", - "ne": "Nepali", - "new": "Newar / Nepal Bhasa", - "ng": "Ndonga", - "nl": "Dutch", - "nn": "Norwegian (Nynorsk)", - "no": "Norwegian (Bokmål)", - "nov": "Novial", - "nrm": "Norman", - "nso": "Northern Sotho", - "nv": "Navajo", - "ny": "Chichewa", - "oc": "Occitan", - "olo": "Livvi-Karelian", - "om": "Oromo", - "or": "Oriya", - "os": "Ossetian", - "pa": "Punjabi", - "pag": "Pangasinan", - "pam": "Kapampangan", - "pap": "Papiamentu", - "pcd": "Picard", - "pdc": "Pennsylvania German", - "pfl": "Palatinate German", - "pi": "Pali", - "pih": "Norfolk", - "pl": "Polish", - "pms": "Piedmontese", - "pnb": "Western Panjabi", - "pnt": "Pontic", - "ps": "Pashto", - "pt": "Portuguese", - "qu": "Quechua", - "rm": "Romansh", - "rmy": "Romani", - "rn": "Kirundi", - "ro": "Romanian", + ne: "Nepali", + new: "Newar / Nepal Bhasa", + ng: "Ndonga", + nl: "Dutch", + nn: "Norwegian (Nynorsk)", + no: "Norwegian (Bokmål)", + nov: "Novial", + nrm: "Norman", + nso: "Northern Sotho", + nv: "Navajo", + ny: "Chichewa", + oc: "Occitan", + olo: "Livvi-Karelian", + om: "Oromo", + or: "Oriya", + os: "Ossetian", + pa: "Punjabi", + pag: "Pangasinan", + pam: "Kapampangan", + pap: "Papiamentu", + pcd: "Picard", + pdc: "Pennsylvania German", + pfl: "Palatinate German", + pi: "Pali", + pih: "Norfolk", + pl: "Polish", + pms: "Piedmontese", + pnb: "Western Panjabi", + pnt: "Pontic", + ps: "Pashto", + pt: "Portuguese", + qu: "Quechua", + rm: "Romansh", + rmy: "Romani", + rn: "Kirundi", + ro: "Romanian", "roa-rup": "Aromanian", "roa-tara": "Tarantino", - "ru": "Russian", - "rue": "Rusyn", - "rw": "Kinyarwanda", - "sa": "Sanskrit", - "sah": "Sakha", - "sc": "Sardinian", - "scn": "Sicilian", - "sco": "Scots", - "sd": "Sindhi", - "se": "Northern Sami", - "sg": "Sango", - "sh": "Serbo-Croatian", - "si": "Sinhalese", - "simple": "Simple English", - "sk": "Slovak", - "sl": "Slovenian", - "sm": "Samoan", - "sn": "Shona", - "so": "Somali", - "sq": "Albanian", - "sr": "Serbian", - "srn": "Sranan", - "ss": "Swati", - "st": "Sesotho", - "stq": "Saterland Frisian", - "su": "Sundanese", - "sv": "Swedish", - "sw": "Swahili", - "szl": "Silesian", - "ta": "Tamil", - "tcy": "Tulu", - "te": "Telugu", - "tet": "Tetum", - "tg": "Tajik", - "th": "Thai", - "ti": "Tigrinya", - "tk": "Turkmen", - "tl": "Tagalog", - "tn": "Tswana", - "to": "Tongan", - "tpi": "Tok Pisin", - "tr": "Turkish", - "ts": "Tsonga", - "tt": "Tatar", - "tum": "Tumbuka", - "tw": "Twi", - "ty": "Tahitian", - "tyv": "Tuvan", - "udm": "Udmurt", - "ug": "Uyghur", - "uk": "Ukrainian", - "ur": "Urdu", - "uz": "Uzbek", - "ve": "Venda", - "vec": "Venetian", - "vep": "Vepsian", - "vi": "Vietnamese", - "vls": "West Flemish", - "vo": "Volapük", - "wa": "Walloon", - "war": "Waray-Waray", - "wo": "Wolof", - "wuu": "Wu", - "xal": "Kalmyk", - "xh": "Xhosa", - "xmf": "Mingrelian", - "yi": "Yiddish", - "yo": "Yoruba", - "za": "Zhuang", - "zea": "Zeelandic", - "zh": "Chinese", + ru: "Russian", + rue: "Rusyn", + rw: "Kinyarwanda", + sa: "Sanskrit", + sah: "Sakha", + sc: "Sardinian", + scn: "Sicilian", + sco: "Scots", + sd: "Sindhi", + se: "Northern Sami", + sg: "Sango", + sh: "Serbo-Croatian", + si: "Sinhalese", + simple: "Simple English", + sk: "Slovak", + sl: "Slovenian", + sm: "Samoan", + sn: "Shona", + so: "Somali", + sq: "Albanian", + sr: "Serbian", + srn: "Sranan", + ss: "Swati", + st: "Sesotho", + stq: "Saterland Frisian", + su: "Sundanese", + sv: "Swedish", + sw: "Swahili", + szl: "Silesian", + ta: "Tamil", + tcy: "Tulu", + te: "Telugu", + tet: "Tetum", + tg: "Tajik", + th: "Thai", + ti: "Tigrinya", + tk: "Turkmen", + tl: "Tagalog", + tn: "Tswana", + to: "Tongan", + tpi: "Tok Pisin", + tr: "Turkish", + ts: "Tsonga", + tt: "Tatar", + tum: "Tumbuka", + tw: "Twi", + ty: "Tahitian", + tyv: "Tuvan", + udm: "Udmurt", + ug: "Uyghur", + uk: "Ukrainian", + ur: "Urdu", + uz: "Uzbek", + ve: "Venda", + vec: "Venetian", + vep: "Vepsian", + vi: "Vietnamese", + vls: "West Flemish", + vo: "Volapük", + wa: "Walloon", + war: "Waray-Waray", + wo: "Wolof", + wuu: "Wu", + xal: "Kalmyk", + xh: "Xhosa", + xmf: "Mingrelian", + yi: "Yiddish", + yo: "Yoruba", + za: "Zhuang", + zea: "Zeelandic", + zh: "Chinese", "zh-classical": "Classical Chinese", "zh-min-nan": "Min Nan", "zh-yue": "Cantonese", - "zu": "Zulu", + zu: "Zulu", }[code]; } - } - /** * Byte frequencies of various languages generated from Wikipedia dumps taken in late 2017 and early 2018. * The Chi-Squared test cannot accept expected values of 0, so 0.0001 has been used to account for bytes @@ -876,293 +928,8305 @@ class Magic { * as of early 2018. */ const COMMON_LANG_FREQS = { - "en": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.755, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.843, 0.004, 0.375, 0.002, 0.008, 0.019, 0.008, 0.134, 0.137, 0.137, 0.001, 0.001, 0.972, 0.19, 0.857, 0.017, 0.334, 0.421, 0.246, 0.108, 0.104, 0.112, 0.103, 0.1, 0.127, 0.237, 0.04, 0.027, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.338, 0.218, 0.326, 0.163, 0.121, 0.149, 0.133, 0.192, 0.232, 0.107, 0.082, 0.148, 0.248, 0.134, 0.103, 0.195, 0.012, 0.162, 0.368, 0.366, 0.077, 0.061, 0.127, 0.009, 0.03, 0.015, 0.004, 0.0001, 0.004, 0.0001, 0.003, 0.0001, 6.614, 1.039, 2.327, 2.934, 9.162, 1.606, 1.415, 3.503, 5.718, 0.081, 0.461, 3.153, 1.793, 5.723, 5.565, 1.415, 0.066, 5.036, 4.79, 6.284, 1.992, 0.759, 1.176, 0.139, 1.162, 0.102, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.06, 0.004, 0.003, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.031, 0.006, 0.001, 0.001, 0.001, 0.002, 0.014, 0.001, 0.001, 0.005, 0.005, 0.001, 0.002, 0.017, 0.007, 0.002, 0.003, 0.004, 0.002, 0.001, 0.002, 0.002, 0.012, 0.001, 0.002, 0.001, 0.004, 0.001, 0.001, 0.003, 0.003, 0.002, 0.005, 0.001, 0.001, 0.003, 0.001, 0.003, 0.001, 0.002, 0.001, 0.004, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.02, 0.047, 0.009, 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.061, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ru": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.512, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.274, 0.002, 0.063, 0.0001, 0.001, 0.009, 0.001, 0.001, 0.118, 0.118, 0.0001, 0.001, 0.595, 0.135, 0.534, 0.009, 0.18, 0.281, 0.15, 0.078, 0.076, 0.077, 0.068, 0.066, 0.083, 0.16, 0.036, 0.016, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.013, 0.009, 0.014, 0.009, 0.007, 0.006, 0.007, 0.006, 0.031, 0.002, 0.003, 0.007, 0.012, 0.007, 0.005, 0.01, 0.001, 0.008, 0.017, 0.011, 0.003, 0.009, 0.005, 0.012, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 0.065, 0.009, 0.022, 0.021, 0.074, 0.01, 0.013, 0.019, 0.054, 0.001, 0.008, 0.036, 0.02, 0.047, 0.055, 0.013, 0.001, 0.052, 0.037, 0.041, 0.026, 0.007, 0.006, 0.003, 0.011, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.469, 2.363, 2.342, 0.986, 0.156, 0.422, 0.252, 0.495, 0.217, 0.136, 0.014, 0.778, 0.56, 0.097, 0.251, 0.811, 0.09, 0.184, 0.165, 0.06, 0.179, 0.021, 0.013, 0.029, 0.05, 0.005, 0.116, 0.045, 0.087, 0.073, 0.067, 0.124, 0.211, 0.16, 0.055, 0.033, 0.036, 0.024, 0.013, 0.02, 0.022, 0.002, 0.0001, 0.1, 0.0001, 0.025, 0.009, 0.011, 3.536, 0.619, 1.963, 0.833, 1.275, 3.452, 0.323, 0.635, 3.408, 0.642, 1.486, 1.967, 1.26, 2.857, 4.587, 1.082, 0.0001, 0.0001, 0.339, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.0001, 0.002, 0.001, 31.356, 12.318, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.131, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "de": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.726, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.303, 0.002, 0.278, 0.0001, 0.0001, 0.007, 0.003, 0.005, 0.149, 0.149, 0.015, 0.001, 0.636, 0.237, 0.922, 0.023, 0.305, 0.472, 0.225, 0.115, 0.11, 0.121, 0.108, 0.11, 0.145, 0.271, 0.049, 0.022, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.413, 0.383, 0.144, 0.412, 0.275, 0.258, 0.273, 0.218, 0.18, 0.167, 0.277, 0.201, 0.328, 0.179, 0.111, 0.254, 0.012, 0.219, 0.602, 0.209, 0.1, 0.185, 0.206, 0.005, 0.01, 0.112, 0.002, 0.0001, 0.002, 0.0001, 0.006, 0.0001, 4.417, 1.306, 1.99, 3.615, 12.382, 1.106, 2.0, 2.958, 6.179, 0.082, 0.866, 2.842, 1.869, 7.338, 2.27, 0.606, 0.016, 6.056, 4.424, 4.731, 3.002, 0.609, 0.918, 0.053, 0.169, 0.824, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.147, 0.002, 0.003, 0.001, 0.006, 0.001, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.03, 0.0001, 0.0001, 0.009, 0.001, 0.002, 0.009, 0.002, 0.001, 0.061, 0.0001, 0.048, 0.122, 0.057, 0.009, 0.001, 0.001, 0.4, 0.001, 0.002, 0.003, 0.003, 0.017, 0.001, 0.003, 0.001, 0.005, 0.0001, 0.001, 0.003, 0.002, 0.003, 0.005, 0.001, 0.001, 0.203, 0.0001, 0.002, 0.001, 0.002, 0.002, 0.438, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.056, 1.237, 0.01, 0.013, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.148, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ja": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.834, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.258, 0.007, 0.036, 0.001, 0.0001, 0.005, 0.002, 0.003, 0.033, 0.033, 0.0001, 0.002, 0.019, 0.052, 0.026, 0.009, 0.281, 0.407, 0.259, 0.126, 0.108, 0.109, 0.095, 0.092, 0.104, 0.184, 0.008, 0.001, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.048, 0.026, 0.039, 0.027, 0.028, 0.022, 0.018, 0.016, 0.03, 0.012, 0.014, 0.02, 0.03, 0.025, 0.025, 0.026, 0.002, 0.026, 0.045, 0.031, 0.013, 0.014, 0.014, 0.006, 0.006, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.077, 0.012, 0.03, 0.026, 0.088, 0.012, 0.017, 0.025, 0.067, 0.002, 0.016, 0.041, 0.039, 0.059, 0.066, 0.016, 0.001, 0.06, 0.043, 0.051, 0.028, 0.009, 0.007, 0.004, 0.015, 0.004, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 2.555, 10.322, 5.875, 4.462, 0.784, 0.468, 0.442, 0.409, 1.173, 0.96, 0.657, 1.448, 1.442, 0.636, 0.341, 0.685, 0.495, 0.342, 0.651, 0.536, 0.435, 0.657, 0.51, 0.978, 0.31, 0.563, 0.439, 0.514, 0.668, 0.438, 0.29, 1.039, 0.423, 0.532, 0.407, 0.691, 0.677, 0.555, 0.911, 0.887, 1.086, 0.531, 0.836, 1.345, 0.438, 0.666, 1.528, 0.959, 0.535, 0.379, 0.302, 0.822, 0.614, 0.308, 0.253, 0.467, 0.807, 0.807, 0.777, 0.809, 1.292, 0.546, 0.524, 0.425, 0.0001, 0.0001, 0.002, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.015, 19.387, 1.167, 4.022, 2.518, 1.734, 1.339, 1.229, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.409, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "es": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.757, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.771, 0.003, 0.315, 0.001, 0.004, 0.019, 0.003, 0.014, 0.132, 0.133, 0.001, 0.001, 0.976, 0.078, 0.703, 0.014, 0.268, 0.331, 0.197, 0.095, 0.086, 0.095, 0.085, 0.084, 0.105, 0.183, 0.053, 0.027, 0.001, 0.002, 0.002, 0.002, 0.0001, 0.242, 0.129, 0.28, 0.129, 0.322, 0.105, 0.099, 0.077, 0.116, 0.074, 0.034, 0.209, 0.196, 0.086, 0.059, 0.187, 0.009, 0.118, 0.247, 0.128, 0.061, 0.072, 0.033, 0.023, 0.018, 0.013, 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 8.9, 0.939, 3.234, 4.015, 9.642, 0.603, 0.891, 0.531, 5.007, 0.262, 0.107, 4.355, 1.915, 5.487, 6.224, 1.805, 0.423, 4.992, 5.086, 3.402, 2.878, 0.667, 0.044, 0.125, 0.673, 0.299, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.033, 0.009, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.006, 0.006, 0.001, 0.0001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.008, 0.008, 0.001, 0.001, 0.025, 0.274, 0.002, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.221, 0.003, 0.019, 0.001, 0.373, 0.001, 0.001, 0.005, 0.144, 0.01, 0.631, 0.002, 0.001, 0.002, 0.001, 0.002, 0.001, 0.102, 0.018, 0.006, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.079, 1.766, 0.003, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.032, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.894, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.162, 0.003, 0.276, 0.0001, 0.0001, 0.012, 0.002, 0.638, 0.153, 0.153, 0.001, 0.002, 0.96, 0.247, 0.715, 0.011, 0.225, 0.339, 0.18, 0.084, 0.081, 0.086, 0.081, 0.084, 0.106, 0.194, 0.063, 0.018, 0.003, 0.002, 0.003, 0.002, 0.0001, 0.208, 0.141, 0.255, 0.128, 0.144, 0.1, 0.095, 0.071, 0.154, 0.072, 0.042, 0.331, 0.173, 0.077, 0.056, 0.167, 0.013, 0.108, 0.214, 0.102, 0.049, 0.062, 0.035, 0.009, 0.014, 0.011, 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 5.761, 0.627, 2.287, 3.136, 10.738, 0.723, 0.838, 0.669, 5.295, 0.172, 0.12, 4.204, 1.941, 5.522, 4.015, 2.005, 0.584, 5.043, 5.545, 5.13, 4.06, 0.906, 0.051, 0.295, 0.278, 0.085, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.136, 0.003, 0.004, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.034, 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.019, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.112, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.367, 0.007, 0.034, 0.001, 0.003, 0.001, 0.003, 0.046, 0.303, 1.817, 0.082, 0.045, 0.001, 0.004, 0.029, 0.017, 0.004, 0.002, 0.002, 0.005, 0.038, 0.001, 0.003, 0.0001, 0.002, 0.02, 0.002, 0.054, 0.004, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.113, 2.813, 0.007, 0.026, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.122, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pt": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.934, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.319, 0.004, 0.372, 0.001, 0.002, 0.012, 0.004, 0.016, 0.15, 0.15, 0.001, 0.002, 1.16, 0.21, 0.746, 0.022, 0.296, 0.361, 0.226, 0.106, 0.098, 0.105, 0.096, 0.094, 0.114, 0.207, 0.054, 0.022, 0.006, 0.004, 0.006, 0.002, 0.0001, 0.345, 0.166, 0.295, 0.143, 0.233, 0.136, 0.112, 0.077, 0.129, 0.093, 0.039, 0.119, 0.217, 0.135, 0.164, 0.222, 0.016, 0.14, 0.259, 0.142, 0.064, 0.078, 0.041, 0.021, 0.013, 0.012, 0.007, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 9.026, 0.717, 2.572, 4.173, 8.551, 0.751, 0.906, 0.629, 5.107, 0.172, 0.12, 2.357, 3.189, 4.024, 7.683, 1.87, 0.445, 5.017, 5.188, 3.559, 2.852, 0.875, 0.055, 0.186, 0.122, 0.257, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.034, 0.01, 0.003, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.014, 0.001, 0.001, 0.001, 0.005, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.009, 0.006, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.007, 0.007, 0.0001, 0.001, 0.079, 0.267, 0.045, 0.508, 0.002, 0.001, 0.001, 0.424, 0.003, 0.417, 0.113, 0.003, 0.001, 0.255, 0.001, 0.001, 0.005, 0.003, 0.015, 0.161, 0.032, 0.087, 0.003, 0.001, 0.002, 0.001, 0.095, 0.002, 0.005, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.067, 2.471, 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.033, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "it": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.828, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.918, 0.002, 0.385, 0.0001, 0.001, 0.007, 0.003, 0.383, 0.13, 0.131, 0.0001, 0.001, 0.948, 0.103, 0.657, 0.014, 0.252, 0.332, 0.195, 0.093, 0.089, 0.095, 0.088, 0.084, 0.098, 0.183, 0.061, 0.035, 0.006, 0.002, 0.006, 0.001, 0.0001, 0.215, 0.131, 0.235, 0.125, 0.08, 0.104, 0.125, 0.057, 0.24, 0.04, 0.038, 0.208, 0.179, 0.133, 0.054, 0.164, 0.025, 0.114, 0.256, 0.12, 0.052, 0.079, 0.038, 0.021, 0.012, 0.012, 0.002, 0.0001, 0.002, 0.0001, 0.005, 0.0001, 8.583, 0.65, 3.106, 3.081, 8.81, 0.801, 1.321, 0.694, 8.492, 0.02, 0.115, 5.238, 1.88, 5.659, 6.812, 1.981, 0.236, 4.962, 3.674, 5.112, 2.35, 1.107, 0.055, 0.027, 0.118, 0.709, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.022, 0.004, 0.002, 0.002, 0.001, 0.001, 0.001, 0.002, 0.013, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.006, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.005, 0.0001, 0.001, 0.005, 0.005, 0.0001, 0.001, 0.153, 0.007, 0.001, 0.001, 0.003, 0.001, 0.001, 0.002, 0.174, 0.033, 0.004, 0.009, 0.036, 0.004, 0.001, 0.001, 0.006, 0.003, 0.097, 0.004, 0.001, 0.001, 0.003, 0.001, 0.002, 0.056, 0.009, 0.007, 0.004, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.043, 0.574, 0.01, 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.021, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "zh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.074, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.273, 0.003, 0.045, 0.0001, 0.001, 0.012, 0.001, 0.004, 0.032, 0.032, 0.001, 0.003, 0.032, 0.068, 0.063, 0.017, 0.386, 0.478, 0.308, 0.149, 0.134, 0.146, 0.127, 0.121, 0.136, 0.231, 0.018, 0.009, 0.007, 0.006, 0.007, 0.0001, 0.0001, 0.045, 0.029, 0.041, 0.028, 0.022, 0.017, 0.02, 0.019, 0.025, 0.01, 0.013, 0.02, 0.033, 0.021, 0.018, 0.028, 0.002, 0.022, 0.045, 0.031, 0.01, 0.013, 0.012, 0.007, 0.005, 0.003, 0.004, 0.0001, 0.004, 0.0001, 0.009, 0.0001, 0.159, 0.026, 0.051, 0.047, 0.17, 0.025, 0.032, 0.057, 0.124, 0.003, 0.021, 0.089, 0.049, 0.12, 0.129, 0.028, 0.002, 0.124, 0.083, 0.1, 0.058, 0.016, 0.016, 0.008, 0.03, 0.012, 0.006, 0.004, 0.006, 0.001, 0.0001, 2.707, 1.09, 1.398, 0.705, 1.23, 1.04, 0.715, 0.952, 1.455, 1.297, 0.845, 1.19, 2.403, 1.193, 0.813, 1.077, 0.889, 0.565, 0.387, 0.47, 0.931, 0.663, 1.035, 0.837, 0.77, 0.772, 1.434, 1.023, 1.668, 0.609, 0.437, 0.793, 0.535, 0.706, 0.48, 0.538, 0.785, 0.909, 0.7, 0.697, 1.017, 0.519, 0.441, 0.567, 0.626, 1.082, 0.814, 1.054, 1.074, 0.811, 0.556, 0.684, 0.903, 0.43, 0.642, 0.78, 2.083, 1.147, 2.006, 1.331, 2.547, 1.015, 0.911, 0.807, 0.0001, 0.0001, 0.069, 0.007, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.126, 1.369, 3.539, 8.968, 5.44, 4.358, 3.141, 2.48, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 1.821, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.841, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.03, 0.001, 0.048, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.117, 0.117, 0.001, 0.001, 0.009, 0.038, 0.486, 0.012, 0.007, 0.009, 0.007, 0.005, 0.003, 0.004, 0.003, 0.003, 0.003, 0.004, 0.048, 0.001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.011, 0.006, 0.011, 0.006, 0.005, 0.005, 0.004, 0.005, 0.007, 0.002, 0.002, 0.005, 0.008, 0.005, 0.005, 0.008, 0.001, 0.005, 0.011, 0.008, 0.002, 0.003, 0.004, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.007, 0.0001, 0.058, 0.008, 0.02, 0.02, 0.06, 0.011, 0.012, 0.017, 0.051, 0.001, 0.009, 0.031, 0.018, 0.042, 0.047, 0.015, 0.001, 0.043, 0.03, 0.037, 0.022, 0.005, 0.008, 0.003, 0.009, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.678, 0.557, 0.438, 0.001, 1.227, 2.118, 3.004, 2.445, 2.539, 0.0001, 0.003, 0.021, 5.067, 0.002, 0.007, 0.006, 0.015, 0.005, 0.002, 0.008, 0.07, 0.0001, 0.0001, 0.0001, 0.053, 0.001, 0.0001, 0.018, 0.0001, 0.001, 0.0001, 0.002, 0.002, 0.006, 0.337, 0.015, 0.006, 0.001, 0.059, 6.029, 1.704, 1.216, 2.096, 0.113, 0.433, 0.309, 0.439, 3.398, 0.192, 3.798, 0.977, 1.716, 1.137, 0.259, 0.129, 0.264, 0.12, 0.588, 0.085, 0.033, 0.001, 0.0001, 0.327, 0.0001, 0.0001, 0.0001, 0.068, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 23.012, 12.666, 1.946, 5.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.676, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.97, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.695, 0.002, 0.242, 0.0001, 0.0001, 0.007, 0.002, 0.011, 0.194, 0.194, 0.0001, 0.001, 0.805, 0.129, 1.016, 0.02, 0.347, 0.542, 0.289, 0.14, 0.138, 0.144, 0.123, 0.13, 0.153, 0.343, 0.068, 0.014, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.17, 0.165, 0.143, 0.124, 0.066, 0.081, 0.113, 0.075, 0.141, 0.107, 0.18, 0.108, 0.192, 0.142, 0.119, 0.322, 0.004, 0.139, 0.268, 0.117, 0.058, 0.041, 0.322, 0.032, 0.008, 0.109, 0.001, 0.0001, 0.001, 0.0001, 0.006, 0.0001, 6.697, 0.859, 2.856, 2.291, 5.604, 0.259, 1.117, 0.918, 6.017, 1.562, 2.537, 1.759, 1.903, 4.231, 5.86, 1.841, 0.006, 3.854, 3.145, 2.863, 1.965, 0.061, 3.408, 0.016, 2.669, 3.631, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.208, 0.018, 1.343, 0.004, 0.168, 0.653, 0.002, 0.145, 0.003, 0.001, 0.001, 0.001, 0.002, 0.004, 0.001, 0.002, 0.002, 0.001, 0.003, 0.126, 0.002, 0.001, 0.002, 0.002, 0.001, 0.65, 0.023, 0.378, 0.002, 0.035, 0.035, 0.002, 0.018, 0.011, 0.001, 0.002, 0.005, 0.001, 0.001, 0.002, 0.003, 0.012, 0.001, 0.002, 0.001, 0.005, 0.001, 0.001, 0.01, 0.004, 0.011, 0.641, 0.003, 0.006, 0.005, 0.001, 0.008, 0.004, 0.056, 0.014, 0.433, 0.007, 0.008, 0.002, 0.0001, 0.0001, 0.025, 0.694, 1.442, 2.413, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.003, 0.06, 0.02, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.205, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.91, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.447, 0.013, 0.297, 0.0001, 0.001, 0.013, 0.003, 0.465, 0.123, 0.123, 0.001, 0.002, 0.653, 0.111, 0.957, 0.015, 0.312, 0.387, 0.238, 0.107, 0.101, 0.108, 0.097, 0.095, 0.109, 0.217, 0.04, 0.028, 0.007, 0.019, 0.007, 0.002, 0.0001, 0.336, 0.309, 0.117, 0.167, 0.132, 0.105, 0.13, 0.135, 0.063, 0.042, 0.261, 0.085, 0.236, 0.083, 0.095, 0.131, 0.004, 0.092, 0.247, 0.219, 0.038, 0.052, 0.037, 0.008, 0.095, 0.019, 0.007, 0.0001, 0.007, 0.0001, 0.005, 0.001, 8.533, 1.3, 0.65, 3.067, 6.656, 0.419, 0.804, 0.718, 6.178, 0.059, 2.986, 5.127, 2.286, 5.537, 2.04, 0.623, 0.006, 5.247, 2.411, 2.743, 2.225, 0.903, 0.049, 0.018, 2.076, 0.792, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.096, 0.004, 0.004, 0.004, 0.002, 0.002, 0.002, 0.041, 0.002, 0.001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.002, 0.001, 0.031, 0.001, 0.003, 0.065, 0.001, 0.001, 0.033, 0.009, 0.047, 1.71, 0.04, 0.005, 0.027, 0.002, 0.003, 0.001, 0.001, 0.647, 0.002, 0.008, 0.002, 0.003, 0.001, 0.004, 0.019, 0.002, 0.132, 3.435, 0.005, 0.004, 0.003, 0.003, 0.525, 0.001, 0.004, 0.002, 0.003, 0.007, 1.206, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.046, 2.539, 4.197, 1.125, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.01, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.094, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.158, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.747, 0.002, 0.267, 0.0001, 0.001, 0.008, 0.01, 0.052, 0.196, 0.196, 0.0001, 0.001, 0.504, 0.205, 0.944, 0.013, 0.311, 0.428, 0.229, 0.104, 0.101, 0.109, 0.102, 0.102, 0.137, 0.252, 0.048, 0.012, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.205, 0.192, 0.181, 0.371, 0.131, 0.088, 0.11, 0.236, 0.167, 0.069, 0.091, 0.119, 0.172, 0.137, 0.117, 0.141, 0.005, 0.112, 0.229, 0.137, 0.034, 0.123, 0.084, 0.006, 0.011, 0.064, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 6.042, 1.063, 1.294, 4.124, 13.689, 0.579, 2.105, 1.822, 5.542, 0.948, 1.42, 3.124, 1.72, 7.129, 4.759, 1.349, 0.015, 5.115, 3.623, 4.903, 1.642, 1.84, 1.06, 0.063, 0.226, 0.656, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.023, 0.003, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.008, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.007, 0.001, 0.001, 0.003, 0.003, 0.001, 0.002, 0.008, 0.009, 0.003, 0.002, 0.005, 0.002, 0.001, 0.003, 0.009, 0.038, 0.001, 0.051, 0.001, 0.005, 0.001, 0.011, 0.004, 0.003, 0.013, 0.008, 0.002, 0.002, 0.008, 0.001, 0.004, 0.001, 0.003, 0.002, 0.01, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.02, 0.166, 0.007, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.016, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.022, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ko": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.893, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.919, 0.003, 0.069, 0.0001, 0.0001, 0.007, 0.002, 0.048, 0.269, 0.269, 0.0001, 0.002, 0.501, 0.04, 0.699, 0.01, 0.29, 0.417, 0.259, 0.125, 0.109, 0.112, 0.1, 0.094, 0.109, 0.192, 0.015, 0.002, 0.006, 0.002, 0.006, 0.003, 0.0001, 0.038, 0.026, 0.038, 0.022, 0.02, 0.024, 0.015, 0.013, 0.023, 0.008, 0.015, 0.017, 0.027, 0.016, 0.016, 0.023, 0.002, 0.017, 0.041, 0.027, 0.011, 0.013, 0.01, 0.005, 0.004, 0.002, 0.006, 0.0001, 0.006, 0.0001, 0.012, 0.0001, 0.108, 0.014, 0.037, 0.031, 0.116, 0.024, 0.022, 0.032, 0.084, 0.002, 0.021, 0.064, 0.06, 0.077, 0.092, 0.02, 0.001, 0.086, 0.056, 0.066, 0.046, 0.011, 0.008, 0.004, 0.019, 0.004, 0.0001, 0.002, 0.0001, 0.025, 0.0001, 2.21, 0.565, 0.766, 0.471, 3.043, 0.671, 0.334, 0.049, 1.404, 0.218, 1.17, 1.657, 1.23, 0.278, 0.091, 0.557, 1.645, 0.451, 0.058, 0.386, 1.38, 2.193, 0.506, 1.29, 2.708, 0.68, 0.385, 0.399, 2.758, 3.352, 0.954, 0.141, 1.848, 0.829, 0.071, 0.249, 1.741, 0.637, 0.43, 0.888, 0.537, 0.506, 0.243, 0.027, 1.4, 0.355, 0.026, 0.179, 2.38, 0.404, 0.739, 1.021, 2.205, 0.729, 0.454, 0.308, 1.635, 0.561, 0.035, 0.084, 1.612, 0.309, 0.024, 0.047, 0.0001, 0.0001, 0.034, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.039, 0.089, 0.025, 0.107, 0.071, 0.044, 0.037, 0.043, 3.199, 8.716, 12.558, 3.298, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cs": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.804, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.066, 0.002, 0.232, 0.0001, 0.0001, 0.008, 0.002, 0.009, 0.188, 0.188, 0.007, 0.002, 0.814, 0.094, 1.008, 0.025, 0.299, 0.437, 0.233, 0.115, 0.111, 0.119, 0.106, 0.102, 0.129, 0.233, 0.051, 0.011, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.143, 0.145, 0.103, 0.117, 0.06, 0.072, 0.055, 0.092, 0.08, 0.13, 0.142, 0.093, 0.169, 0.137, 0.088, 0.246, 0.003, 0.104, 0.236, 0.127, 0.039, 0.213, 0.033, 0.007, 0.007, 0.069, 0.002, 0.0001, 0.002, 0.0001, 0.005, 0.0001, 5.018, 1.137, 1.8, 2.299, 5.465, 0.243, 0.288, 1.623, 3.2, 1.177, 2.624, 3.218, 2.048, 4.447, 5.813, 1.952, 0.006, 3.062, 3.218, 3.502, 2.227, 3.008, 0.043, 0.058, 1.313, 1.405, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.104, 0.003, 0.004, 0.003, 0.001, 0.001, 0.001, 0.003, 0.041, 0.001, 0.001, 0.001, 0.049, 0.57, 0.001, 0.012, 0.001, 0.001, 0.002, 0.048, 0.002, 0.001, 0.001, 0.002, 0.011, 0.748, 0.01, 0.981, 0.025, 0.001, 0.025, 0.002, 0.191, 1.9, 0.003, 0.001, 0.005, 0.024, 0.002, 0.002, 0.002, 0.87, 0.001, 0.001, 0.001, 1.984, 0.001, 0.336, 0.006, 0.002, 0.004, 0.031, 0.002, 0.003, 0.006, 0.001, 0.003, 0.001, 0.094, 0.002, 0.007, 0.671, 0.58, 0.001, 0.0001, 0.0001, 0.173, 5.104, 1.615, 2.233, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.009, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.103, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ar": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.65, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.194, 0.002, 0.102, 0.0001, 0.0001, 0.007, 0.001, 0.002, 0.109, 0.108, 0.002, 0.001, 0.03, 0.046, 0.42, 0.018, 0.182, 0.202, 0.135, 0.063, 0.065, 0.061, 0.055, 0.053, 0.062, 0.113, 0.054, 0.001, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.01, 0.006, 0.009, 0.007, 0.005, 0.004, 0.004, 0.004, 0.005, 0.002, 0.002, 0.005, 0.007, 0.005, 0.004, 0.007, 0.001, 0.005, 0.009, 0.006, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.007, 0.001, 0.007, 0.0001, 0.004, 0.0001, 0.052, 0.008, 0.019, 0.018, 0.055, 0.008, 0.011, 0.016, 0.045, 0.001, 0.006, 0.028, 0.016, 0.037, 0.04, 0.012, 0.001, 0.038, 0.03, 0.035, 0.02, 0.006, 0.006, 0.002, 0.009, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.055, 1.131, 0.874, 0.939, 4.804, 2.787, 2.235, 1.018, 2.407, 0.349, 3.542, 0.092, 0.4, 0.007, 0.051, 0.053, 0.022, 0.061, 0.01, 0.008, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.008, 0.001, 0.001, 0.0001, 0.002, 0.013, 0.133, 0.049, 0.782, 0.037, 0.335, 0.157, 6.208, 1.599, 1.486, 1.889, 0.276, 0.607, 0.762, 0.341, 1.38, 0.239, 2.041, 0.293, 1.149, 0.411, 0.383, 0.246, 0.406, 0.094, 1.401, 0.223, 0.006, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.027, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 23.298, 20.414, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.019, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "vi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.205, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.546, 0.002, 0.241, 0.0001, 0.001, 0.015, 0.013, 0.009, 0.13, 0.13, 0.0001, 0.002, 0.714, 0.089, 0.813, 0.02, 0.259, 0.361, 0.203, 0.104, 0.097, 0.104, 0.089, 0.089, 0.116, 0.194, 0.047, 0.017, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.148, 0.175, 0.293, 0.111, 0.056, 0.04, 0.092, 0.206, 0.057, 0.03, 0.119, 0.232, 0.178, 0.247, 0.036, 0.156, 0.056, 0.062, 0.184, 0.397, 0.022, 0.114, 0.033, 0.033, 0.019, 0.009, 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 2.683, 0.66, 3.149, 0.627, 1.148, 0.076, 2.542, 4.362, 3.528, 0.019, 0.59, 1.486, 1.611, 5.924, 2.001, 0.761, 0.201, 1.559, 1.014, 3.555, 1.77, 0.861, 0.05, 0.173, 0.826, 0.047, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.021, 0.214, 0.011, 0.478, 0.002, 0.039, 0.001, 0.324, 0.002, 0.072, 0.001, 0.198, 0.002, 0.32, 0.002, 0.048, 0.141, 1.485, 0.001, 0.116, 0.015, 0.106, 0.001, 0.025, 0.002, 0.579, 0.004, 0.289, 0.004, 0.257, 0.005, 0.174, 1.516, 1.221, 0.326, 0.818, 0.013, 0.337, 0.005, 0.51, 0.014, 0.324, 0.408, 0.115, 0.147, 0.492, 0.002, 0.218, 0.82, 0.26, 0.102, 0.383, 0.379, 0.016, 0.006, 0.094, 0.005, 0.132, 2.233, 4.628, 0.009, 0.062, 0.003, 0.385, 0.0001, 0.0001, 0.047, 4.542, 1.653, 0.065, 0.997, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 6.74, 0.019, 0.004, 0.002, 0.009, 0.006, 0.004, 0.003, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "el": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.389, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.245, 0.003, 0.167, 0.001, 0.0001, 0.005, 0.002, 0.015, 0.1, 0.101, 0.0001, 0.001, 0.487, 0.058, 0.449, 0.01, 0.151, 0.215, 0.114, 0.058, 0.055, 0.058, 0.052, 0.051, 0.065, 0.119, 0.032, 0.001, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.021, 0.016, 0.024, 0.014, 0.012, 0.012, 0.011, 0.013, 0.012, 0.005, 0.006, 0.013, 0.018, 0.01, 0.009, 0.015, 0.001, 0.013, 0.025, 0.017, 0.005, 0.006, 0.008, 0.002, 0.002, 0.001, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.0001, 0.125, 0.018, 0.039, 0.039, 0.142, 0.017, 0.026, 0.036, 0.105, 0.002, 0.017, 0.072, 0.036, 0.093, 0.102, 0.022, 0.002, 0.099, 0.07, 0.077, 0.046, 0.014, 0.01, 0.005, 0.02, 0.005, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 1.502, 1.948, 1.522, 1.805, 3.613, 1.458, 0.354, 0.481, 0.073, 0.584, 0.024, 0.002, 0.912, 0.435, 0.305, 0.001, 0.006, 0.156, 0.057, 0.068, 0.049, 0.097, 0.01, 0.064, 0.017, 0.048, 0.112, 0.037, 0.115, 0.048, 0.003, 0.099, 0.122, 0.029, 0.001, 0.129, 0.119, 0.011, 0.03, 0.034, 0.002, 0.008, 0.0001, 0.022, 0.85, 0.749, 0.601, 1.063, 0.004, 3.95, 0.27, 0.716, 0.649, 2.656, 0.14, 1.63, 0.422, 2.831, 1.733, 1.214, 1.337, 2.636, 0.149, 3.615, 0.0001, 0.0001, 0.06, 0.007, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 28.675, 14.922, 0.013, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.282, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.667, 0.001, 0.345, 0.0001, 0.0001, 0.007, 0.002, 0.013, 0.083, 0.083, 0.0001, 0.0001, 0.902, 0.146, 1.182, 0.007, 0.152, 0.25, 0.108, 0.06, 0.06, 0.065, 0.065, 0.066, 0.089, 0.153, 0.044, 0.004, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.178, 0.164, 0.421, 0.354, 0.095, 0.078, 0.149, 0.127, 0.181, 0.06, 0.161, 0.209, 0.174, 0.099, 0.072, 0.149, 0.019, 0.12, 0.249, 0.206, 0.034, 0.058, 0.04, 0.006, 0.012, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 6.63, 0.945, 0.963, 3.448, 8.696, 0.922, 2.03, 1.373, 4.448, 0.429, 1.949, 3.417, 3.024, 6.448, 3.193, 1.076, 0.019, 6.923, 3.891, 5.562, 1.877, 1.653, 0.074, 0.114, 0.424, 0.075, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.022, 0.039, 0.002, 0.003, 0.007, 0.074, 0.004, 0.007, 0.005, 0.002, 0.002, 0.0001, 0.003, 0.008, 0.002, 0.004, 0.001, 0.002, 0.0001, 0.011, 0.001, 0.001, 0.012, 0.001, 0.005, 0.002, 0.001, 0.001, 0.001, 0.004, 0.001, 0.003, 0.21, 0.017, 0.005, 0.004, 1.574, 0.853, 0.002, 0.007, 0.008, 0.038, 0.004, 0.047, 0.001, 0.014, 0.002, 0.009, 0.187, 0.01, 0.004, 0.012, 0.004, 0.002, 0.808, 0.001, 0.008, 0.002, 0.004, 0.002, 0.006, 0.002, 0.003, 0.001, 0.0001, 0.0001, 0.393, 3.436, 0.069, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.014, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.021, 0.021, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.019, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.827, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.714, 0.004, 0.265, 0.0001, 0.0001, 0.007, 0.001, 0.007, 0.159, 0.159, 0.001, 0.002, 1.016, 0.461, 0.937, 0.013, 0.261, 0.429, 0.206, 0.109, 0.106, 0.113, 0.103, 0.105, 0.137, 0.238, 0.073, 0.019, 0.004, 0.004, 0.004, 0.002, 0.0001, 0.469, 0.135, 0.097, 0.073, 0.142, 0.093, 0.075, 0.087, 0.095, 0.062, 0.133, 0.086, 0.175, 0.085, 0.042, 0.096, 0.003, 0.071, 0.186, 0.107, 0.027, 0.069, 0.028, 0.009, 0.008, 0.025, 0.002, 0.0001, 0.002, 0.0001, 0.004, 0.0001, 6.316, 1.591, 0.619, 1.364, 7.125, 0.648, 2.159, 0.946, 3.15, 0.796, 3.265, 4.526, 2.054, 3.978, 3.047, 0.846, 0.006, 3.327, 4.35, 5.787, 0.902, 1.395, 0.037, 0.035, 1.463, 2.94, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.129, 0.02, 0.003, 0.003, 0.001, 0.001, 0.001, 0.003, 0.002, 0.014, 0.001, 0.001, 0.001, 0.006, 0.0001, 0.001, 0.004, 0.667, 0.001, 0.068, 0.001, 0.0001, 0.005, 0.001, 0.001, 0.009, 0.007, 0.002, 0.003, 0.026, 0.026, 0.002, 0.024, 2.603, 0.002, 0.001, 0.003, 0.001, 0.002, 0.002, 0.003, 2.374, 0.001, 0.002, 0.001, 0.448, 0.001, 0.001, 0.005, 0.169, 0.003, 0.702, 0.002, 0.002, 0.76, 0.001, 0.004, 0.002, 0.223, 0.002, 0.382, 0.004, 0.004, 0.001, 0.0001, 0.0001, 0.028, 7.544, 0.01, 0.845, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.021, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.128, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ro": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.178, 0.003, 0.287, 0.001, 0.001, 0.038, 0.002, 0.011, 0.2, 0.201, 0.001, 0.002, 1.114, 0.333, 0.783, 0.015, 0.314, 0.397, 0.224, 0.108, 0.105, 0.107, 0.098, 0.099, 0.123, 0.221, 0.062, 0.021, 0.007, 0.006, 0.007, 0.002, 0.0001, 0.27, 0.164, 0.289, 0.16, 0.109, 0.099, 0.098, 0.077, 0.163, 0.044, 0.047, 0.132, 0.205, 0.095, 0.07, 0.207, 0.004, 0.158, 0.242, 0.12, 0.072, 0.085, 0.033, 0.021, 0.01, 0.019, 0.006, 0.0001, 0.006, 0.0001, 0.007, 0.0001, 7.568, 0.638, 3.253, 2.492, 8.352, 0.862, 0.693, 0.377, 7.77, 0.16, 0.142, 3.906, 1.919, 5.009, 3.799, 1.948, 0.008, 5.326, 2.857, 4.711, 4.259, 0.743, 0.045, 0.139, 0.103, 0.506, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.128, 0.004, 0.004, 1.675, 0.002, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.003, 0.104, 0.001, 0.001, 0.002, 0.001, 0.018, 0.003, 0.001, 0.001, 0.001, 0.016, 0.733, 0.007, 0.695, 0.006, 0.05, 0.046, 0.002, 0.038, 0.012, 0.339, 0.002, 0.003, 0.001, 0.001, 0.002, 0.004, 0.016, 0.001, 0.003, 0.001, 0.004, 0.716, 0.001, 0.007, 0.003, 0.004, 0.005, 0.003, 0.002, 0.005, 0.001, 0.003, 0.001, 0.002, 0.003, 0.007, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.048, 1.213, 1.681, 0.01, 0.0001, 0.003, 1.446, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.016, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.127, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "id": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.029, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.265, 0.003, 0.293, 0.001, 0.002, 0.008, 0.004, 0.02, 0.156, 0.156, 0.001, 0.002, 0.897, 0.232, 0.837, 0.025, 0.281, 0.301, 0.205, 0.089, 0.081, 0.088, 0.077, 0.074, 0.084, 0.156, 0.047, 0.017, 0.004, 0.004, 0.004, 0.002, 0.0001, 0.336, 0.259, 0.156, 0.221, 0.076, 0.084, 0.101, 0.111, 0.249, 0.128, 0.292, 0.143, 0.276, 0.131, 0.06, 0.365, 0.008, 0.137, 0.448, 0.233, 0.076, 0.043, 0.063, 0.011, 0.049, 0.014, 0.01, 0.0001, 0.01, 0.0001, 0.002, 0.0001, 14.771, 1.913, 0.506, 3.424, 6.588, 0.273, 2.854, 1.797, 6.389, 0.58, 3.078, 2.893, 3.104, 7.626, 2.047, 2.047, 0.011, 4.279, 3.371, 3.841, 3.795, 0.171, 0.34, 0.026, 1.249, 0.063, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.031, 0.005, 0.004, 0.003, 0.003, 0.002, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.004, 0.002, 0.001, 0.001, 0.001, 0.001, 0.012, 0.003, 0.001, 0.001, 0.001, 0.002, 0.005, 0.001, 0.001, 0.006, 0.006, 0.001, 0.002, 0.051, 0.005, 0.002, 0.002, 0.003, 0.001, 0.002, 0.003, 0.002, 0.009, 0.001, 0.002, 0.001, 0.003, 0.001, 0.001, 0.004, 0.003, 0.004, 0.003, 0.002, 0.002, 0.002, 0.001, 0.003, 0.002, 0.002, 0.002, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.055, 0.03, 0.005, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.03, 0.003, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.159, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.105, 0.002, 0.192, 0.0001, 0.0001, 0.007, 0.002, 0.005, 0.209, 0.21, 0.013, 0.002, 0.819, 0.162, 1.046, 0.023, 0.302, 0.407, 0.233, 0.125, 0.121, 0.119, 0.111, 0.11, 0.127, 0.222, 0.055, 0.011, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.172, 0.157, 0.128, 0.107, 0.068, 0.073, 0.08, 0.101, 0.088, 0.103, 0.136, 0.098, 0.191, 0.186, 0.106, 0.263, 0.004, 0.11, 0.26, 0.138, 0.041, 0.2, 0.032, 0.006, 0.008, 0.071, 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.0001, 6.363, 1.243, 1.749, 2.177, 5.774, 0.29, 0.367, 1.611, 4.04, 1.457, 2.743, 2.816, 2.062, 4.279, 6.818, 1.868, 0.006, 3.912, 3.184, 3.285, 2.066, 3.292, 0.044, 0.067, 1.073, 1.331, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.113, 0.006, 0.004, 0.002, 0.002, 0.001, 0.001, 0.002, 0.077, 0.003, 0.0001, 0.001, 0.033, 0.618, 0.006, 0.066, 0.001, 0.001, 0.001, 0.046, 0.001, 0.006, 0.001, 0.001, 0.001, 0.013, 0.009, 0.007, 0.027, 0.001, 0.026, 0.001, 0.106, 1.828, 0.001, 0.001, 0.067, 0.259, 0.001, 0.002, 0.006, 0.586, 0.001, 0.001, 0.001, 0.717, 0.001, 0.002, 0.005, 0.002, 0.004, 0.16, 0.12, 0.002, 0.005, 0.038, 0.002, 0.001, 0.54, 0.002, 0.006, 0.806, 0.828, 0.001, 0.0001, 0.0001, 0.114, 4.297, 1.036, 1.463, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.112, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "da": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.925, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.716, 0.002, 0.323, 0.001, 0.001, 0.007, 0.004, 0.044, 0.149, 0.15, 0.001, 0.001, 0.888, 0.199, 1.047, 0.017, 0.356, 0.494, 0.245, 0.119, 0.115, 0.124, 0.118, 0.127, 0.168, 0.257, 0.046, 0.018, 0.001, 0.002, 0.001, 0.002, 0.0001, 0.185, 0.17, 0.132, 0.265, 0.124, 0.155, 0.096, 0.211, 0.151, 0.076, 0.153, 0.12, 0.178, 0.102, 0.069, 0.125, 0.005, 0.111, 0.307, 0.131, 0.057, 0.087, 0.054, 0.005, 0.012, 0.01, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 4.818, 1.29, 0.375, 4.241, 11.595, 1.856, 2.915, 1.153, 4.647, 0.373, 2.179, 3.858, 2.304, 5.903, 3.8, 1.073, 0.008, 6.456, 4.455, 5.128, 1.418, 1.705, 0.066, 0.033, 0.579, 0.056, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.052, 0.003, 0.002, 0.001, 0.001, 0.008, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.033, 0.003, 0.0001, 0.001, 0.001, 0.013, 0.005, 0.0001, 0.001, 0.002, 0.008, 0.001, 0.002, 0.01, 0.006, 0.001, 0.001, 0.01, 0.595, 0.559, 0.002, 0.002, 0.02, 0.001, 0.004, 0.001, 0.004, 0.001, 0.001, 0.005, 0.002, 0.003, 0.005, 0.001, 0.001, 0.011, 0.001, 0.585, 0.001, 0.002, 0.003, 0.011, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.02, 1.836, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.052, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.851, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.647, 0.002, 0.239, 0.0001, 0.0001, 0.006, 0.003, 0.009, 0.115, 0.115, 0.0001, 0.004, 0.594, 0.296, 1.014, 0.011, 0.404, 0.475, 0.268, 0.112, 0.107, 0.117, 0.106, 0.107, 0.133, 0.295, 0.069, 0.007, 0.003, 0.004, 0.003, 0.001, 0.0001, 0.183, 0.111, 0.1, 0.068, 0.113, 0.064, 0.065, 0.195, 0.087, 0.098, 0.225, 0.146, 0.211, 0.097, 0.06, 0.172, 0.005, 0.116, 0.314, 0.181, 0.037, 0.143, 0.044, 0.006, 0.048, 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.0001, 9.681, 0.162, 0.176, 0.832, 6.272, 0.12, 0.289, 1.322, 8.475, 1.576, 3.754, 4.597, 2.281, 6.958, 4.47, 1.345, 0.007, 2.326, 6.029, 6.589, 4.108, 1.653, 0.05, 0.021, 1.301, 0.041, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.101, 0.002, 0.002, 0.001, 0.004, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.061, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.008, 0.0001, 0.001, 0.001, 0.032, 0.0001, 0.001, 0.032, 0.02, 0.001, 0.001, 2.624, 0.003, 0.001, 0.001, 0.002, 0.014, 0.0001, 0.002, 0.001, 0.01, 0.001, 0.001, 0.003, 0.002, 0.002, 0.005, 0.001, 0.001, 0.349, 0.001, 0.002, 0.001, 0.002, 0.001, 0.005, 0.002, 0.004, 0.001, 0.0001, 0.0001, 0.039, 3.028, 0.006, 0.023, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.101, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "th": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.353, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.736, 0.001, 0.084, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.081, 0.081, 0.0001, 0.001, 0.043, 0.029, 0.16, 0.005, 0.088, 0.106, 0.121, 0.047, 0.051, 0.082, 0.032, 0.03, 0.033, 0.045, 0.008, 0.004, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.013, 0.009, 0.013, 0.008, 0.008, 0.006, 0.006, 0.006, 0.008, 0.003, 0.003, 0.006, 0.01, 0.006, 0.005, 0.009, 0.001, 0.007, 0.015, 0.012, 0.003, 0.003, 0.006, 0.001, 0.002, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.08, 0.011, 0.029, 0.025, 0.092, 0.012, 0.017, 0.027, 0.069, 0.001, 0.009, 0.042, 0.023, 0.063, 0.066, 0.017, 0.001, 0.062, 0.045, 0.056, 0.028, 0.008, 0.007, 0.003, 0.015, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 1.311, 1.859, 0.629, 0.364, 0.845, 0.001, 0.034, 1.547, 1.721, 0.971, 0.381, 0.156, 0.367, 0.089, 0.014, 0.016, 0.045, 0.009, 0.014, 0.115, 0.776, 0.653, 0.138, 0.742, 0.12, 1.918, 0.573, 0.602, 0.112, 0.028, 0.443, 0.069, 0.115, 1.089, 0.883, 1.745, 0.026, 0.859, 0.001, 0.829, 0.228, 0.108, 0.682, 0.53, 0.008, 1.369, 0.031, 0.006, 0.627, 1.083, 2.149, 0.218, 0.714, 0.916, 0.178, 0.322, 26.536, 5.927, 0.003, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.884, 0.001, 0.018, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.55, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.448, 0.001, 0.106, 0.0001, 0.0001, 0.005, 0.001, 0.003, 0.12, 0.12, 0.002, 0.001, 0.557, 0.131, 0.613, 0.011, 0.182, 0.272, 0.137, 0.074, 0.072, 0.075, 0.066, 0.065, 0.083, 0.144, 0.028, 0.009, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.013, 0.009, 0.015, 0.008, 0.007, 0.006, 0.006, 0.006, 0.041, 0.002, 0.003, 0.007, 0.011, 0.006, 0.005, 0.01, 0.001, 0.006, 0.015, 0.011, 0.003, 0.01, 0.005, 0.007, 0.001, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.002, 0.0001, 0.088, 0.012, 0.031, 0.028, 0.092, 0.009, 0.016, 0.024, 0.077, 0.002, 0.014, 0.045, 0.037, 0.056, 0.066, 0.019, 0.001, 0.063, 0.052, 0.05, 0.037, 0.008, 0.006, 0.003, 0.013, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.651, 2.091, 3.127, 0.625, 0.166, 0.165, 0.297, 0.452, 0.133, 0.189, 0.677, 0.001, 0.018, 0.001, 0.079, 0.727, 0.091, 0.092, 0.108, 0.095, 0.081, 0.039, 0.009, 0.034, 0.052, 0.011, 0.114, 0.044, 0.167, 0.089, 0.136, 0.155, 0.116, 0.171, 0.083, 0.024, 0.037, 0.04, 0.014, 0.018, 0.016, 0.009, 0.001, 0.0001, 0.001, 0.002, 0.012, 0.008, 5.212, 0.516, 1.875, 0.701, 1.296, 3.589, 0.274, 0.882, 3.979, 0.288, 1.391, 1.465, 0.909, 3.169, 3.698, 1.109, 0.0001, 0.0001, 0.048, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.0001, 0.015, 0.006, 31.942, 11.185, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.201, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "he": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.485, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.289, 0.001, 0.262, 0.0001, 0.0001, 0.005, 0.001, 0.096, 0.104, 0.103, 0.0001, 0.001, 0.64, 0.203, 0.573, 0.005, 0.181, 0.234, 0.129, 0.06, 0.061, 0.062, 0.055, 0.054, 0.065, 0.138, 0.049, 0.013, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.016, 0.011, 0.014, 0.009, 0.007, 0.007, 0.006, 0.007, 0.009, 0.003, 0.003, 0.008, 0.012, 0.007, 0.005, 0.01, 0.001, 0.008, 0.016, 0.012, 0.003, 0.004, 0.005, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.007, 0.0001, 0.073, 0.008, 0.021, 0.022, 0.081, 0.015, 0.013, 0.021, 0.056, 0.001, 0.007, 0.043, 0.024, 0.051, 0.061, 0.011, 0.001, 0.058, 0.038, 0.043, 0.032, 0.007, 0.005, 0.003, 0.012, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.003, 0.002, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 2.008, 2.447, 0.696, 1.135, 3.773, 4.868, 0.394, 0.995, 0.678, 4.903, 0.173, 0.854, 2.776, 1.153, 2.22, 0.562, 1.585, 0.919, 1.159, 0.101, 0.969, 0.062, 0.568, 1.054, 2.634, 1.902, 2.428, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.009, 0.002, 0.002, 0.002, 0.006, 0.004, 0.005, 0.005, 0.008, 0.005, 0.001, 0.002, 0.01, 0.002, 0.005, 0.001, 0.0001, 0.0001, 0.008, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.015, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.044, 42.985, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.013, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "uk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.595, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.309, 0.001, 0.06, 0.0001, 0.001, 0.01, 0.001, 0.059, 0.134, 0.135, 0.002, 0.002, 0.619, 0.137, 0.568, 0.01, 0.199, 0.281, 0.159, 0.081, 0.077, 0.082, 0.071, 0.067, 0.079, 0.158, 0.041, 0.017, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.014, 0.009, 0.015, 0.009, 0.007, 0.006, 0.007, 0.006, 0.029, 0.002, 0.003, 0.007, 0.011, 0.006, 0.005, 0.01, 0.001, 0.008, 0.016, 0.01, 0.003, 0.01, 0.004, 0.011, 0.001, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 0.067, 0.008, 0.022, 0.02, 0.069, 0.01, 0.012, 0.018, 0.056, 0.001, 0.008, 0.037, 0.02, 0.046, 0.054, 0.014, 0.001, 0.051, 0.037, 0.039, 0.027, 0.007, 0.006, 0.003, 0.012, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.481, 1.842, 2.043, 1.429, 0.162, 0.46, 0.448, 0.496, 0.265, 0.125, 0.001, 0.003, 0.806, 0.001, 0.316, 0.84, 0.08, 0.077, 0.114, 0.065, 0.394, 0.018, 2.734, 0.422, 0.001, 0.01, 0.11, 0.047, 0.088, 0.083, 0.052, 0.13, 0.228, 0.124, 0.058, 0.089, 0.032, 0.023, 0.02, 0.023, 0.023, 0.004, 0.0001, 0.09, 0.0001, 0.001, 0.008, 0.014, 3.574, 0.601, 2.221, 0.664, 1.335, 1.986, 0.299, 0.851, 2.427, 0.557, 1.658, 1.688, 1.249, 3.061, 4.029, 1.082, 0.0001, 0.0001, 0.335, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, 0.0001, 0.002, 0.001, 28.71, 14.784, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.144, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lt": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.086, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.626, 0.002, 0.167, 0.001, 0.0001, 0.009, 0.001, 0.01, 0.234, 0.234, 0.001, 0.002, 1.069, 0.088, 1.436, 0.009, 0.347, 0.549, 0.256, 0.135, 0.132, 0.151, 0.128, 0.13, 0.15, 0.368, 0.06, 0.018, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.213, 0.143, 0.054, 0.128, 0.066, 0.049, 0.096, 0.041, 0.157, 0.121, 0.23, 0.188, 0.16, 0.109, 0.037, 0.238, 0.002, 0.129, 0.21, 0.163, 0.036, 0.209, 0.013, 0.047, 0.01, 0.016, 0.002, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 8.107, 0.954, 0.391, 1.797, 4.13, 0.204, 1.223, 0.172, 9.411, 1.587, 2.883, 2.415, 2.501, 3.736, 4.946, 1.811, 0.003, 4.047, 5.62, 3.782, 3.399, 1.76, 0.016, 0.008, 1.047, 0.248, 0.0001, 0.015, 0.0001, 0.002, 0.0001, 0.475, 0.005, 0.003, 0.002, 0.002, 0.411, 0.001, 0.001, 0.006, 0.001, 0.001, 0.001, 0.019, 0.313, 0.0001, 0.001, 0.001, 0.001, 0.006, 0.247, 0.001, 0.0001, 0.001, 1.225, 0.001, 0.136, 0.001, 0.001, 0.108, 0.003, 0.111, 0.001, 0.364, 0.781, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.003, 0.002, 0.299, 0.001, 0.004, 0.013, 0.355, 0.007, 0.002, 0.007, 0.931, 0.001, 0.004, 0.001, 0.001, 0.004, 0.002, 0.003, 0.003, 0.003, 0.037, 0.575, 0.001, 0.0001, 0.0001, 0.29, 0.016, 2.467, 2.697, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.033, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.477, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.127, 0.002, 0.244, 0.0001, 0.0001, 0.007, 0.004, 0.029, 0.125, 0.125, 0.001, 0.001, 0.736, 0.236, 1.026, 0.016, 0.357, 0.45, 0.2, 0.113, 0.108, 0.13, 0.122, 0.121, 0.148, 0.271, 0.033, 0.009, 0.004, 0.002, 0.004, 0.001, 0.0001, 0.218, 0.193, 0.121, 0.247, 0.133, 0.148, 0.105, 0.221, 0.171, 0.071, 0.137, 0.127, 0.194, 0.145, 0.08, 0.133, 0.007, 0.124, 0.352, 0.152, 0.062, 0.099, 0.053, 0.006, 0.016, 0.016, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.001, 6.479, 0.879, 0.246, 3.008, 9.683, 1.285, 2.701, 0.948, 5.112, 0.784, 2.645, 3.726, 2.383, 5.836, 3.991, 1.273, 0.009, 6.373, 4.403, 5.512, 1.465, 1.904, 0.067, 0.025, 0.761, 0.055, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.031, 0.01, 0.005, 0.003, 0.003, 0.012, 0.002, 0.003, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.02, 0.003, 0.002, 0.002, 0.001, 0.013, 0.005, 0.002, 0.001, 0.002, 0.001, 0.001, 0.003, 0.042, 0.013, 0.002, 0.002, 0.016, 0.934, 0.093, 0.004, 0.01, 0.021, 0.004, 0.076, 0.002, 0.01, 0.001, 0.002, 0.012, 0.007, 0.039, 0.01, 0.004, 0.006, 0.015, 0.002, 0.552, 0.004, 0.006, 0.078, 0.011, 0.006, 0.007, 0.003, 0.0001, 0.0001, 0.197, 1.726, 0.009, 0.008, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.017, 0.007, 0.044, 0.016, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.01, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.002, 0.027, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.893, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.172, 0.002, 0.34, 0.0001, 0.001, 0.011, 0.002, 0.016, 0.182, 0.182, 0.001, 0.002, 0.943, 0.135, 1.23, 0.019, 0.3, 0.38, 0.204, 0.106, 0.1, 0.109, 0.096, 0.094, 0.112, 0.22, 0.065, 0.02, 0.009, 0.004, 0.009, 0.002, 0.0001, 0.156, 0.17, 0.109, 0.14, 0.063, 0.069, 0.111, 0.12, 0.137, 0.079, 0.163, 0.086, 0.175, 0.178, 0.118, 0.22, 0.004, 0.116, 0.267, 0.137, 0.108, 0.095, 0.03, 0.008, 0.009, 0.078, 0.011, 0.0001, 0.011, 0.0001, 0.002, 0.0001, 8.648, 1.028, 0.78, 2.344, 6.653, 0.218, 1.346, 0.572, 7.393, 3.932, 2.783, 2.724, 2.195, 4.91, 6.755, 1.994, 0.007, 4.039, 3.61, 3.329, 3.254, 2.478, 0.043, 0.016, 0.083, 1.288, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.039, 0.005, 0.004, 0.003, 0.002, 0.001, 0.003, 0.353, 0.002, 0.001, 0.001, 0.001, 0.016, 0.678, 0.001, 0.001, 0.004, 0.158, 0.001, 0.011, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.009, 0.005, 0.008, 0.001, 0.033, 0.524, 0.003, 0.002, 0.003, 0.001, 0.001, 0.002, 0.002, 0.01, 0.001, 0.005, 0.001, 0.004, 0.001, 0.001, 0.008, 0.004, 0.005, 0.005, 0.002, 0.004, 0.004, 0.001, 0.004, 0.002, 0.004, 0.006, 0.006, 0.016, 0.36, 0.002, 0.0001, 0.0001, 0.021, 0.044, 1.208, 0.914, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.011, 0.005, 0.028, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.038, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "no": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.853, 0.002, 0.247, 0.0001, 0.001, 0.006, 0.004, 0.016, 0.159, 0.158, 0.001, 0.001, 0.698, 0.213, 1.037, 0.017, 0.377, 0.496, 0.255, 0.116, 0.113, 0.123, 0.117, 0.116, 0.152, 0.295, 0.042, 0.013, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.196, 0.176, 0.125, 0.246, 0.126, 0.148, 0.099, 0.211, 0.167, 0.071, 0.132, 0.135, 0.185, 0.133, 0.091, 0.127, 0.006, 0.11, 0.321, 0.146, 0.058, 0.092, 0.051, 0.007, 0.014, 0.011, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 4.956, 1.168, 0.243, 2.996, 11.38, 1.384, 2.632, 1.02, 4.719, 0.546, 2.591, 3.946, 2.341, 6.218, 3.979, 1.354, 0.009, 6.417, 4.712, 5.821, 1.424, 1.732, 0.061, 0.029, 0.639, 0.049, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.041, 0.006, 0.003, 0.002, 0.002, 0.009, 0.002, 0.002, 0.001, 0.002, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.034, 0.002, 0.001, 0.002, 0.001, 0.014, 0.003, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.028, 0.009, 0.001, 0.002, 0.012, 0.765, 0.126, 0.003, 0.003, 0.021, 0.001, 0.062, 0.001, 0.006, 0.001, 0.001, 0.007, 0.003, 0.006, 0.006, 0.002, 0.003, 0.012, 0.001, 0.598, 0.002, 0.004, 0.062, 0.009, 0.004, 0.004, 0.002, 0.0001, 0.0001, 0.152, 1.588, 0.007, 0.007, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.004, 0.022, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.039, 0.001, 0.001, 0.004, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.872, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.68, 0.001, 0.1, 0.0001, 0.0001, 0.009, 0.0001, 0.005, 0.176, 0.176, 0.0001, 0.003, 0.5, 0.178, 0.762, 0.011, 0.275, 0.318, 0.214, 0.099, 0.096, 0.093, 0.078, 0.075, 0.084, 0.129, 0.031, 0.008, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.017, 0.01, 0.025, 0.013, 0.007, 0.006, 0.019, 0.007, 0.026, 0.003, 0.008, 0.007, 0.014, 0.016, 0.013, 0.016, 0.001, 0.009, 0.02, 0.011, 0.006, 0.008, 0.003, 0.004, 0.001, 0.003, 0.002, 0.0001, 0.002, 0.0001, 0.018, 0.0001, 0.453, 0.047, 0.05, 0.128, 0.37, 0.027, 0.066, 0.039, 0.393, 0.16, 0.152, 0.148, 0.154, 0.268, 0.352, 0.1, 0.001, 0.219, 0.193, 0.185, 0.165, 0.107, 0.003, 0.002, 0.007, 0.07, 0.053, 0.001, 0.053, 0.0001, 0.0001, 2.152, 2.07, 1.61, 1.756, 0.112, 0.204, 0.344, 0.339, 0.366, 0.003, 0.007, 0.001, 0.001, 0.031, 0.0001, 0.007, 0.082, 0.095, 0.143, 0.054, 0.071, 0.047, 0.006, 0.035, 1.459, 0.284, 0.347, 0.2, 0.143, 0.119, 0.086, 0.186, 0.072, 0.175, 0.071, 0.052, 0.034, 0.041, 0.014, 0.02, 0.016, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 4.933, 0.477, 1.401, 0.663, 1.33, 3.708, 0.225, 0.704, 3.913, 0.001, 1.472, 1.2, 1.198, 2.623, 3.682, 1.022, 0.0001, 0.0001, 0.018, 0.003, 0.054, 0.041, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 30.181, 10.982, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.062, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ca": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.816, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.948, 0.002, 0.294, 0.001, 0.011, 0.035, 0.001, 0.634, 0.154, 0.154, 0.001, 0.002, 1.001, 0.144, 0.747, 0.01, 0.301, 0.411, 0.25, 0.137, 0.131, 0.135, 0.12, 0.123, 0.144, 0.212, 0.051, 0.029, 0.002, 0.003, 0.003, 0.001, 0.0001, 0.252, 0.125, 0.23, 0.119, 0.296, 0.09, 0.091, 0.066, 0.12, 0.061, 0.034, 0.213, 0.174, 0.072, 0.049, 0.171, 0.012, 0.097, 0.192, 0.11, 0.053, 0.092, 0.024, 0.034, 0.01, 0.009, 0.002, 0.0001, 0.002, 0.0001, 0.004, 0.0001, 9.132, 1.004, 2.746, 3.236, 9.343, 0.681, 0.95, 0.465, 5.412, 0.169, 0.095, 4.932, 2.114, 4.848, 3.551, 1.884, 0.571, 5.202, 5.696, 4.416, 2.672, 1.094, 0.036, 0.312, 0.252, 0.123, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.044, 0.004, 0.004, 0.002, 0.002, 0.001, 0.001, 0.001, 0.002, 0.015, 0.001, 0.001, 0.001, 0.005, 0.001, 0.001, 0.001, 0.001, 0.002, 0.006, 0.003, 0.001, 0.001, 0.001, 0.001, 0.021, 0.001, 0.001, 0.003, 0.003, 0.001, 0.001, 0.327, 0.012, 0.002, 0.002, 0.002, 0.001, 0.001, 0.088, 0.218, 0.355, 0.001, 0.01, 0.003, 0.236, 0.001, 0.038, 0.005, 0.007, 0.161, 0.374, 0.002, 0.003, 0.003, 0.047, 0.003, 0.002, 0.063, 0.01, 0.034, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.099, 1.903, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.004, 0.012, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.039, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.06, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.437, 0.024, 0.237, 0.001, 0.001, 0.007, 0.002, 0.011, 0.174, 0.174, 0.021, 0.002, 1.072, 0.17, 1.037, 0.022, 0.277, 0.429, 0.215, 0.122, 0.124, 0.121, 0.109, 0.108, 0.134, 0.239, 0.061, 0.025, 0.005, 0.006, 0.005, 0.002, 0.0001, 0.162, 0.141, 0.1, 0.122, 0.063, 0.075, 0.091, 0.086, 0.111, 0.082, 0.154, 0.138, 0.185, 0.145, 0.099, 0.224, 0.004, 0.106, 0.263, 0.133, 0.042, 0.163, 0.031, 0.007, 0.007, 0.087, 0.013, 0.0001, 0.014, 0.0001, 0.006, 0.0001, 7.7, 1.204, 0.709, 2.364, 7.782, 0.229, 1.139, 0.879, 6.985, 3.327, 2.701, 3.64, 2.037, 5.283, 6.653, 2.232, 0.006, 4.152, 3.513, 3.409, 1.654, 3.049, 0.039, 0.016, 0.079, 1.473, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.054, 0.004, 0.003, 0.002, 0.002, 0.001, 0.001, 0.011, 0.002, 0.002, 0.0001, 0.001, 0.021, 0.847, 0.001, 0.0001, 0.001, 0.002, 0.002, 0.027, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.056, 0.644, 0.007, 0.001, 0.003, 0.001, 0.001, 0.002, 0.003, 0.013, 0.001, 0.027, 0.001, 0.005, 0.001, 0.001, 0.007, 0.003, 0.004, 0.005, 0.002, 0.003, 0.006, 0.001, 0.004, 0.002, 0.004, 0.028, 0.008, 0.018, 0.391, 0.002, 0.0001, 0.0001, 0.071, 0.059, 0.881, 1.071, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.005, 0.024, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.054, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.879, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.099, 0.004, 0.432, 0.0001, 0.0001, 0.013, 0.002, 0.007, 0.207, 0.208, 0.0001, 0.003, 0.965, 0.082, 1.276, 0.01, 0.332, 0.476, 0.254, 0.122, 0.117, 0.123, 0.105, 0.106, 0.127, 0.271, 0.045, 0.023, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.208, 0.134, 0.062, 0.128, 0.074, 0.067, 0.074, 0.058, 0.112, 0.068, 0.189, 0.194, 0.144, 0.089, 0.055, 0.234, 0.002, 0.136, 0.249, 0.163, 0.042, 0.182, 0.012, 0.007, 0.003, 0.051, 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 8.58, 1.078, 0.806, 2.221, 4.451, 0.231, 1.228, 0.175, 6.667, 1.704, 2.603, 2.424, 2.389, 3.209, 2.883, 1.908, 0.003, 4.056, 5.825, 4.121, 3.633, 1.801, 0.012, 0.009, 0.029, 1.289, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.124, 2.988, 0.003, 0.002, 0.001, 0.006, 0.331, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.015, 0.083, 0.0001, 0.001, 0.001, 0.001, 0.007, 1.174, 0.07, 0.0001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.005, 0.012, 0.009, 0.001, 0.06, 0.627, 0.004, 0.097, 0.002, 0.001, 0.001, 0.001, 0.001, 0.002, 0.006, 1.565, 0.0001, 0.002, 0.0001, 0.0001, 0.01, 0.002, 0.005, 0.002, 0.002, 0.005, 0.01, 0.106, 0.006, 0.002, 0.003, 0.01, 0.298, 0.012, 0.176, 0.002, 0.0001, 0.0001, 0.03, 0.013, 6.068, 1.452, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.051, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.11, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "et": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.183, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.759, 0.003, 0.281, 0.0001, 0.0001, 0.013, 0.001, 0.037, 0.198, 0.199, 0.001, 0.003, 0.786, 0.203, 1.175, 0.017, 0.35, 0.548, 0.272, 0.142, 0.137, 0.143, 0.127, 0.129, 0.154, 0.323, 0.059, 0.022, 0.017, 0.003, 0.017, 0.003, 0.0001, 0.235, 0.096, 0.074, 0.061, 0.173, 0.056, 0.064, 0.105, 0.122, 0.088, 0.255, 0.166, 0.186, 0.114, 0.065, 0.208, 0.003, 0.138, 0.296, 0.251, 0.046, 0.167, 0.033, 0.011, 0.008, 0.01, 0.008, 0.0001, 0.008, 0.0001, 0.004, 0.0001, 9.665, 0.664, 0.152, 2.822, 7.678, 0.189, 1.393, 1.095, 7.816, 1.25, 3.234, 4.738, 2.585, 4.03, 3.549, 1.167, 0.005, 3.003, 6.68, 5.333, 4.153, 1.613, 0.043, 0.017, 0.074, 0.045, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.13, 0.015, 0.01, 0.006, 0.004, 0.003, 0.003, 0.004, 0.002, 0.002, 0.001, 0.002, 0.003, 0.005, 0.001, 0.003, 0.002, 0.002, 0.003, 0.102, 0.002, 0.008, 0.003, 0.003, 0.002, 0.004, 0.002, 0.001, 0.044, 0.005, 0.006, 0.003, 0.016, 0.035, 0.003, 0.002, 0.833, 0.002, 0.001, 0.002, 0.002, 0.01, 0.001, 0.006, 0.001, 0.005, 0.001, 0.001, 0.017, 0.004, 0.012, 0.007, 0.005, 0.763, 0.179, 0.003, 0.015, 0.005, 0.008, 0.007, 0.518, 0.012, 0.028, 0.003, 0.0001, 0.0001, 0.02, 2.358, 0.019, 0.061, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.004, 0.104, 0.037, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.123, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.374, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.123, 0.002, 0.071, 0.0001, 0.001, 0.004, 0.0001, 0.023, 0.08, 0.08, 0.0001, 0.001, 0.255, 0.072, 0.052, 0.006, 0.068, 0.07, 0.044, 0.02, 0.019, 0.023, 0.019, 0.019, 0.021, 0.04, 0.021, 0.006, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.008, 0.004, 0.007, 0.004, 0.005, 0.003, 0.004, 0.003, 0.006, 0.001, 0.002, 0.003, 0.005, 0.004, 0.003, 0.005, 0.0001, 0.003, 0.008, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.007, 0.0001, 0.008, 0.0001, 0.001, 0.0001, 0.049, 0.007, 0.017, 0.016, 0.052, 0.008, 0.01, 0.017, 0.038, 0.001, 0.004, 0.024, 0.015, 0.034, 0.035, 0.012, 0.001, 0.033, 0.03, 0.034, 0.015, 0.005, 0.005, 0.002, 0.008, 0.001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 1.039, 0.443, 1.278, 0.061, 0.0001, 0.273, 0.146, 1.879, 0.535, 0.214, 0.013, 0.729, 0.054, 1.826, 0.0001, 0.253, 0.014, 0.012, 0.0001, 0.042, 0.14, 2.07, 0.133, 0.43, 0.035, 0.004, 0.215, 0.046, 0.503, 0.014, 0.016, 0.269, 0.037, 0.213, 0.023, 0.155, 24.777, 7.162, 0.554, 0.224, 1.23, 0.009, 0.8, 0.117, 0.393, 0.245, 0.995, 0.828, 2.018, 0.001, 0.771, 0.001, 0.001, 0.707, 0.299, 0.18, 1.226, 0.94, 0.0001, 0.0001, 0.133, 0.001, 2.558, 1.303, 0.0001, 0.0001, 0.008, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.261, 0.0001, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], + en: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.755, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.843, 0.004, 0.375, 0.002, + 0.008, 0.019, 0.008, 0.134, 0.137, 0.137, 0.001, 0.001, 0.972, 0.19, + 0.857, 0.017, 0.334, 0.421, 0.246, 0.108, 0.104, 0.112, 0.103, 0.1, + 0.127, 0.237, 0.04, 0.027, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.338, + 0.218, 0.326, 0.163, 0.121, 0.149, 0.133, 0.192, 0.232, 0.107, 0.082, + 0.148, 0.248, 0.134, 0.103, 0.195, 0.012, 0.162, 0.368, 0.366, 0.077, + 0.061, 0.127, 0.009, 0.03, 0.015, 0.004, 0.0001, 0.004, 0.0001, 0.003, + 0.0001, 6.614, 1.039, 2.327, 2.934, 9.162, 1.606, 1.415, 3.503, 5.718, + 0.081, 0.461, 3.153, 1.793, 5.723, 5.565, 1.415, 0.066, 5.036, 4.79, + 6.284, 1.992, 0.759, 1.176, 0.139, 1.162, 0.102, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.06, 0.004, 0.003, 0.002, 0.001, 0.001, 0.001, 0.002, + 0.001, 0.001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.001, + 0.001, 0.031, 0.006, 0.001, 0.001, 0.001, 0.002, 0.014, 0.001, 0.001, + 0.005, 0.005, 0.001, 0.002, 0.017, 0.007, 0.002, 0.003, 0.004, 0.002, + 0.001, 0.002, 0.002, 0.012, 0.001, 0.002, 0.001, 0.004, 0.001, 0.001, + 0.003, 0.003, 0.002, 0.005, 0.001, 0.001, 0.003, 0.001, 0.003, 0.001, + 0.002, 0.001, 0.004, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.02, 0.047, + 0.009, 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.002, 0.061, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ru: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.512, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.274, 0.002, 0.063, 0.0001, + 0.001, 0.009, 0.001, 0.001, 0.118, 0.118, 0.0001, 0.001, 0.595, 0.135, + 0.534, 0.009, 0.18, 0.281, 0.15, 0.078, 0.076, 0.077, 0.068, 0.066, + 0.083, 0.16, 0.036, 0.016, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.013, + 0.009, 0.014, 0.009, 0.007, 0.006, 0.007, 0.006, 0.031, 0.002, 0.003, + 0.007, 0.012, 0.007, 0.005, 0.01, 0.001, 0.008, 0.017, 0.011, 0.003, + 0.009, 0.005, 0.012, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.003, + 0.0001, 0.065, 0.009, 0.022, 0.021, 0.074, 0.01, 0.013, 0.019, 0.054, + 0.001, 0.008, 0.036, 0.02, 0.047, 0.055, 0.013, 0.001, 0.052, 0.037, + 0.041, 0.026, 0.007, 0.006, 0.003, 0.011, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 2.469, 2.363, 2.342, 0.986, 0.156, 0.422, 0.252, 0.495, + 0.217, 0.136, 0.014, 0.778, 0.56, 0.097, 0.251, 0.811, 0.09, 0.184, + 0.165, 0.06, 0.179, 0.021, 0.013, 0.029, 0.05, 0.005, 0.116, 0.045, + 0.087, 0.073, 0.067, 0.124, 0.211, 0.16, 0.055, 0.033, 0.036, 0.024, + 0.013, 0.02, 0.022, 0.002, 0.0001, 0.1, 0.0001, 0.025, 0.009, 0.011, + 3.536, 0.619, 1.963, 0.833, 1.275, 3.452, 0.323, 0.635, 3.408, 0.642, + 1.486, 1.967, 1.26, 2.857, 4.587, 1.082, 0.0001, 0.0001, 0.339, 0.003, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, + 0.0001, 0.002, 0.001, 31.356, 12.318, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.131, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + de: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.726, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.303, 0.002, 0.278, 0.0001, + 0.0001, 0.007, 0.003, 0.005, 0.149, 0.149, 0.015, 0.001, 0.636, 0.237, + 0.922, 0.023, 0.305, 0.472, 0.225, 0.115, 0.11, 0.121, 0.108, 0.11, + 0.145, 0.271, 0.049, 0.022, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.413, + 0.383, 0.144, 0.412, 0.275, 0.258, 0.273, 0.218, 0.18, 0.167, 0.277, + 0.201, 0.328, 0.179, 0.111, 0.254, 0.012, 0.219, 0.602, 0.209, 0.1, + 0.185, 0.206, 0.005, 0.01, 0.112, 0.002, 0.0001, 0.002, 0.0001, 0.006, + 0.0001, 4.417, 1.306, 1.99, 3.615, 12.382, 1.106, 2.0, 2.958, 6.179, + 0.082, 0.866, 2.842, 1.869, 7.338, 2.27, 0.606, 0.016, 6.056, 4.424, + 4.731, 3.002, 0.609, 0.918, 0.053, 0.169, 0.824, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.147, 0.002, 0.003, 0.001, 0.006, 0.001, 0.001, 0.002, + 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.03, 0.0001, 0.0001, 0.009, 0.001, 0.002, 0.009, 0.002, + 0.001, 0.061, 0.0001, 0.048, 0.122, 0.057, 0.009, 0.001, 0.001, 0.4, + 0.001, 0.002, 0.003, 0.003, 0.017, 0.001, 0.003, 0.001, 0.005, 0.0001, + 0.001, 0.003, 0.002, 0.003, 0.005, 0.001, 0.001, 0.203, 0.0001, 0.002, + 0.001, 0.002, 0.002, 0.438, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.056, + 1.237, 0.01, 0.013, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.148, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ja: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.834, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.258, 0.007, 0.036, 0.001, + 0.0001, 0.005, 0.002, 0.003, 0.033, 0.033, 0.0001, 0.002, 0.019, 0.052, + 0.026, 0.009, 0.281, 0.407, 0.259, 0.126, 0.108, 0.109, 0.095, 0.092, + 0.104, 0.184, 0.008, 0.001, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.048, + 0.026, 0.039, 0.027, 0.028, 0.022, 0.018, 0.016, 0.03, 0.012, 0.014, + 0.02, 0.03, 0.025, 0.025, 0.026, 0.002, 0.026, 0.045, 0.031, 0.013, + 0.014, 0.014, 0.006, 0.006, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.002, + 0.0001, 0.077, 0.012, 0.03, 0.026, 0.088, 0.012, 0.017, 0.025, 0.067, + 0.002, 0.016, 0.041, 0.039, 0.059, 0.066, 0.016, 0.001, 0.06, 0.043, + 0.051, 0.028, 0.009, 0.007, 0.004, 0.015, 0.004, 0.0001, 0.011, 0.0001, + 0.0001, 0.0001, 2.555, 10.322, 5.875, 4.462, 0.784, 0.468, 0.442, 0.409, + 1.173, 0.96, 0.657, 1.448, 1.442, 0.636, 0.341, 0.685, 0.495, 0.342, + 0.651, 0.536, 0.435, 0.657, 0.51, 0.978, 0.31, 0.563, 0.439, 0.514, + 0.668, 0.438, 0.29, 1.039, 0.423, 0.532, 0.407, 0.691, 0.677, 0.555, + 0.911, 0.887, 1.086, 0.531, 0.836, 1.345, 0.438, 0.666, 1.528, 0.959, + 0.535, 0.379, 0.302, 0.822, 0.614, 0.308, 0.253, 0.467, 0.807, 0.807, + 0.777, 0.809, 1.292, 0.546, 0.524, 0.425, 0.0001, 0.0001, 0.002, 0.004, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.0001, 0.015, 19.387, 1.167, 4.022, 2.518, 1.734, 1.339, + 1.229, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.409, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + es: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.757, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.771, 0.003, 0.315, 0.001, + 0.004, 0.019, 0.003, 0.014, 0.132, 0.133, 0.001, 0.001, 0.976, 0.078, + 0.703, 0.014, 0.268, 0.331, 0.197, 0.095, 0.086, 0.095, 0.085, 0.084, + 0.105, 0.183, 0.053, 0.027, 0.001, 0.002, 0.002, 0.002, 0.0001, 0.242, + 0.129, 0.28, 0.129, 0.322, 0.105, 0.099, 0.077, 0.116, 0.074, 0.034, + 0.209, 0.196, 0.086, 0.059, 0.187, 0.009, 0.118, 0.247, 0.128, 0.061, + 0.072, 0.033, 0.023, 0.018, 0.013, 0.005, 0.0001, 0.005, 0.0001, 0.003, + 0.0001, 8.9, 0.939, 3.234, 4.015, 9.642, 0.603, 0.891, 0.531, 5.007, + 0.262, 0.107, 4.355, 1.915, 5.487, 6.224, 1.805, 0.423, 4.992, 5.086, + 3.402, 2.878, 0.667, 0.044, 0.125, 0.673, 0.299, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.033, 0.009, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.003, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.001, + 0.001, 0.006, 0.006, 0.001, 0.0001, 0.001, 0.001, 0.003, 0.001, 0.001, + 0.008, 0.008, 0.001, 0.001, 0.025, 0.274, 0.002, 0.002, 0.002, 0.001, + 0.001, 0.002, 0.002, 0.221, 0.003, 0.019, 0.001, 0.373, 0.001, 0.001, + 0.005, 0.144, 0.01, 0.631, 0.002, 0.001, 0.002, 0.001, 0.002, 0.001, + 0.102, 0.018, 0.006, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.079, 1.766, + 0.003, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.002, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.032, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + fr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.894, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.162, 0.003, 0.276, 0.0001, + 0.0001, 0.012, 0.002, 0.638, 0.153, 0.153, 0.001, 0.002, 0.96, 0.247, + 0.715, 0.011, 0.225, 0.339, 0.18, 0.084, 0.081, 0.086, 0.081, 0.084, + 0.106, 0.194, 0.063, 0.018, 0.003, 0.002, 0.003, 0.002, 0.0001, 0.208, + 0.141, 0.255, 0.128, 0.144, 0.1, 0.095, 0.071, 0.154, 0.072, 0.042, + 0.331, 0.173, 0.077, 0.056, 0.167, 0.013, 0.108, 0.214, 0.102, 0.049, + 0.062, 0.035, 0.009, 0.014, 0.011, 0.003, 0.0001, 0.003, 0.0001, 0.004, + 0.0001, 5.761, 0.627, 2.287, 3.136, 10.738, 0.723, 0.838, 0.669, 5.295, + 0.172, 0.12, 4.204, 1.941, 5.522, 4.015, 2.005, 0.584, 5.043, 5.545, + 5.13, 4.06, 0.906, 0.051, 0.295, 0.278, 0.085, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.136, 0.003, 0.004, 0.002, 0.001, 0.001, 0.001, 0.002, + 0.001, 0.034, 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.019, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.112, 0.001, 0.002, + 0.001, 0.001, 0.0001, 0.001, 0.367, 0.007, 0.034, 0.001, 0.003, 0.001, + 0.003, 0.046, 0.303, 1.817, 0.082, 0.045, 0.001, 0.004, 0.029, 0.017, + 0.004, 0.002, 0.002, 0.005, 0.038, 0.001, 0.003, 0.0001, 0.002, 0.02, + 0.002, 0.054, 0.004, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.113, 2.813, + 0.007, 0.026, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.122, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pt: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.934, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.319, 0.004, 0.372, 0.001, + 0.002, 0.012, 0.004, 0.016, 0.15, 0.15, 0.001, 0.002, 1.16, 0.21, 0.746, + 0.022, 0.296, 0.361, 0.226, 0.106, 0.098, 0.105, 0.096, 0.094, 0.114, + 0.207, 0.054, 0.022, 0.006, 0.004, 0.006, 0.002, 0.0001, 0.345, 0.166, + 0.295, 0.143, 0.233, 0.136, 0.112, 0.077, 0.129, 0.093, 0.039, 0.119, + 0.217, 0.135, 0.164, 0.222, 0.016, 0.14, 0.259, 0.142, 0.064, 0.078, + 0.041, 0.021, 0.013, 0.012, 0.007, 0.0001, 0.007, 0.0001, 0.007, 0.0001, + 9.026, 0.717, 2.572, 4.173, 8.551, 0.751, 0.906, 0.629, 5.107, 0.172, + 0.12, 2.357, 3.189, 4.024, 7.683, 1.87, 0.445, 5.017, 5.188, 3.559, + 2.852, 0.875, 0.055, 0.186, 0.122, 0.257, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.034, 0.01, 0.003, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.014, 0.001, 0.001, 0.001, 0.005, 0.001, 0.0001, 0.001, 0.001, 0.001, + 0.009, 0.006, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.007, + 0.007, 0.0001, 0.001, 0.079, 0.267, 0.045, 0.508, 0.002, 0.001, 0.001, + 0.424, 0.003, 0.417, 0.113, 0.003, 0.001, 0.255, 0.001, 0.001, 0.005, + 0.003, 0.015, 0.161, 0.032, 0.087, 0.003, 0.001, 0.002, 0.001, 0.095, + 0.002, 0.005, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.067, 2.471, 0.004, + 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.033, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + it: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.828, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.918, 0.002, 0.385, 0.0001, + 0.001, 0.007, 0.003, 0.383, 0.13, 0.131, 0.0001, 0.001, 0.948, 0.103, + 0.657, 0.014, 0.252, 0.332, 0.195, 0.093, 0.089, 0.095, 0.088, 0.084, + 0.098, 0.183, 0.061, 0.035, 0.006, 0.002, 0.006, 0.001, 0.0001, 0.215, + 0.131, 0.235, 0.125, 0.08, 0.104, 0.125, 0.057, 0.24, 0.04, 0.038, + 0.208, 0.179, 0.133, 0.054, 0.164, 0.025, 0.114, 0.256, 0.12, 0.052, + 0.079, 0.038, 0.021, 0.012, 0.012, 0.002, 0.0001, 0.002, 0.0001, 0.005, + 0.0001, 8.583, 0.65, 3.106, 3.081, 8.81, 0.801, 1.321, 0.694, 8.492, + 0.02, 0.115, 5.238, 1.88, 5.659, 6.812, 1.981, 0.236, 4.962, 3.674, + 5.112, 2.35, 1.107, 0.055, 0.027, 0.118, 0.709, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.022, 0.004, 0.002, 0.002, 0.001, 0.001, 0.001, 0.002, + 0.013, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.001, + 0.001, 0.0001, 0.006, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.005, 0.0001, + 0.001, 0.005, 0.005, 0.0001, 0.001, 0.153, 0.007, 0.001, 0.001, 0.003, + 0.001, 0.001, 0.002, 0.174, 0.033, 0.004, 0.009, 0.036, 0.004, 0.001, + 0.001, 0.006, 0.003, 0.097, 0.004, 0.001, 0.001, 0.003, 0.001, 0.002, + 0.056, 0.009, 0.007, 0.004, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.043, + 0.574, 0.01, 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.005, 0.002, 0.007, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.002, 0.021, 0.001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + zh: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.074, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.273, 0.003, 0.045, 0.0001, + 0.001, 0.012, 0.001, 0.004, 0.032, 0.032, 0.001, 0.003, 0.032, 0.068, + 0.063, 0.017, 0.386, 0.478, 0.308, 0.149, 0.134, 0.146, 0.127, 0.121, + 0.136, 0.231, 0.018, 0.009, 0.007, 0.006, 0.007, 0.0001, 0.0001, 0.045, + 0.029, 0.041, 0.028, 0.022, 0.017, 0.02, 0.019, 0.025, 0.01, 0.013, + 0.02, 0.033, 0.021, 0.018, 0.028, 0.002, 0.022, 0.045, 0.031, 0.01, + 0.013, 0.012, 0.007, 0.005, 0.003, 0.004, 0.0001, 0.004, 0.0001, 0.009, + 0.0001, 0.159, 0.026, 0.051, 0.047, 0.17, 0.025, 0.032, 0.057, 0.124, + 0.003, 0.021, 0.089, 0.049, 0.12, 0.129, 0.028, 0.002, 0.124, 0.083, + 0.1, 0.058, 0.016, 0.016, 0.008, 0.03, 0.012, 0.006, 0.004, 0.006, + 0.001, 0.0001, 2.707, 1.09, 1.398, 0.705, 1.23, 1.04, 0.715, 0.952, + 1.455, 1.297, 0.845, 1.19, 2.403, 1.193, 0.813, 1.077, 0.889, 0.565, + 0.387, 0.47, 0.931, 0.663, 1.035, 0.837, 0.77, 0.772, 1.434, 1.023, + 1.668, 0.609, 0.437, 0.793, 0.535, 0.706, 0.48, 0.538, 0.785, 0.909, + 0.7, 0.697, 1.017, 0.519, 0.441, 0.567, 0.626, 1.082, 0.814, 1.054, + 1.074, 0.811, 0.556, 0.684, 0.903, 0.43, 0.642, 0.78, 2.083, 1.147, + 2.006, 1.331, 2.547, 1.015, 0.911, 0.807, 0.0001, 0.0001, 0.069, 0.007, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.126, 1.369, 3.539, 8.968, 5.44, 4.358, 3.141, + 2.48, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 1.821, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + fa: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.841, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.03, 0.001, 0.048, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.117, 0.117, 0.001, 0.001, 0.009, 0.038, + 0.486, 0.012, 0.007, 0.009, 0.007, 0.005, 0.003, 0.004, 0.003, 0.003, + 0.003, 0.004, 0.048, 0.001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.011, + 0.006, 0.011, 0.006, 0.005, 0.005, 0.004, 0.005, 0.007, 0.002, 0.002, + 0.005, 0.008, 0.005, 0.005, 0.008, 0.001, 0.005, 0.011, 0.008, 0.002, + 0.003, 0.004, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.007, + 0.0001, 0.058, 0.008, 0.02, 0.02, 0.06, 0.011, 0.012, 0.017, 0.051, + 0.001, 0.009, 0.031, 0.018, 0.042, 0.047, 0.015, 0.001, 0.043, 0.03, + 0.037, 0.022, 0.005, 0.008, 0.003, 0.009, 0.003, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.678, 0.557, 0.438, 0.001, 1.227, 2.118, 3.004, 2.445, + 2.539, 0.0001, 0.003, 0.021, 5.067, 0.002, 0.007, 0.006, 0.015, 0.005, + 0.002, 0.008, 0.07, 0.0001, 0.0001, 0.0001, 0.053, 0.001, 0.0001, 0.018, + 0.0001, 0.001, 0.0001, 0.002, 0.002, 0.006, 0.337, 0.015, 0.006, 0.001, + 0.059, 6.029, 1.704, 1.216, 2.096, 0.113, 0.433, 0.309, 0.439, 3.398, + 0.192, 3.798, 0.977, 1.716, 1.137, 0.259, 0.129, 0.264, 0.12, 0.588, + 0.085, 0.033, 0.001, 0.0001, 0.327, 0.0001, 0.0001, 0.0001, 0.068, + 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.001, 23.012, 12.666, 1.946, 5.01, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.676, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pl: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.97, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.695, 0.002, 0.242, 0.0001, + 0.0001, 0.007, 0.002, 0.011, 0.194, 0.194, 0.0001, 0.001, 0.805, 0.129, + 1.016, 0.02, 0.347, 0.542, 0.289, 0.14, 0.138, 0.144, 0.123, 0.13, + 0.153, 0.343, 0.068, 0.014, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.17, + 0.165, 0.143, 0.124, 0.066, 0.081, 0.113, 0.075, 0.141, 0.107, 0.18, + 0.108, 0.192, 0.142, 0.119, 0.322, 0.004, 0.139, 0.268, 0.117, 0.058, + 0.041, 0.322, 0.032, 0.008, 0.109, 0.001, 0.0001, 0.001, 0.0001, 0.006, + 0.0001, 6.697, 0.859, 2.856, 2.291, 5.604, 0.259, 1.117, 0.918, 6.017, + 1.562, 2.537, 1.759, 1.903, 4.231, 5.86, 1.841, 0.006, 3.854, 3.145, + 2.863, 1.965, 0.061, 3.408, 0.016, 2.669, 3.631, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.208, 0.018, 1.343, 0.004, 0.168, 0.653, 0.002, 0.145, + 0.003, 0.001, 0.001, 0.001, 0.002, 0.004, 0.001, 0.002, 0.002, 0.001, + 0.003, 0.126, 0.002, 0.001, 0.002, 0.002, 0.001, 0.65, 0.023, 0.378, + 0.002, 0.035, 0.035, 0.002, 0.018, 0.011, 0.001, 0.002, 0.005, 0.001, + 0.001, 0.002, 0.003, 0.012, 0.001, 0.002, 0.001, 0.005, 0.001, 0.001, + 0.01, 0.004, 0.011, 0.641, 0.003, 0.006, 0.005, 0.001, 0.008, 0.004, + 0.056, 0.014, 0.433, 0.007, 0.008, 0.002, 0.0001, 0.0001, 0.025, 0.694, + 1.442, 2.413, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.006, 0.003, 0.06, 0.02, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.002, 0.205, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.91, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.447, 0.013, 0.297, 0.0001, + 0.001, 0.013, 0.003, 0.465, 0.123, 0.123, 0.001, 0.002, 0.653, 0.111, + 0.957, 0.015, 0.312, 0.387, 0.238, 0.107, 0.101, 0.108, 0.097, 0.095, + 0.109, 0.217, 0.04, 0.028, 0.007, 0.019, 0.007, 0.002, 0.0001, 0.336, + 0.309, 0.117, 0.167, 0.132, 0.105, 0.13, 0.135, 0.063, 0.042, 0.261, + 0.085, 0.236, 0.083, 0.095, 0.131, 0.004, 0.092, 0.247, 0.219, 0.038, + 0.052, 0.037, 0.008, 0.095, 0.019, 0.007, 0.0001, 0.007, 0.0001, 0.005, + 0.001, 8.533, 1.3, 0.65, 3.067, 6.656, 0.419, 0.804, 0.718, 6.178, + 0.059, 2.986, 5.127, 2.286, 5.537, 2.04, 0.623, 0.006, 5.247, 2.411, + 2.743, 2.225, 0.903, 0.049, 0.018, 2.076, 0.792, 0.0001, 0.018, 0.0001, + 0.0001, 0.0001, 0.096, 0.004, 0.004, 0.004, 0.002, 0.002, 0.002, 0.041, + 0.002, 0.001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.007, 0.002, 0.001, 0.031, 0.001, 0.003, 0.065, 0.001, 0.001, + 0.033, 0.009, 0.047, 1.71, 0.04, 0.005, 0.027, 0.002, 0.003, 0.001, + 0.001, 0.647, 0.002, 0.008, 0.002, 0.003, 0.001, 0.004, 0.019, 0.002, + 0.132, 3.435, 0.005, 0.004, 0.003, 0.003, 0.525, 0.001, 0.004, 0.002, + 0.003, 0.007, 1.206, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.046, 2.539, + 4.197, 1.125, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.007, 0.003, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.002, 0.01, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.003, 0.094, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + nl: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.158, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.747, 0.002, 0.267, 0.0001, + 0.001, 0.008, 0.01, 0.052, 0.196, 0.196, 0.0001, 0.001, 0.504, 0.205, + 0.944, 0.013, 0.311, 0.428, 0.229, 0.104, 0.101, 0.109, 0.102, 0.102, + 0.137, 0.252, 0.048, 0.012, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.205, + 0.192, 0.181, 0.371, 0.131, 0.088, 0.11, 0.236, 0.167, 0.069, 0.091, + 0.119, 0.172, 0.137, 0.117, 0.141, 0.005, 0.112, 0.229, 0.137, 0.034, + 0.123, 0.084, 0.006, 0.011, 0.064, 0.001, 0.0001, 0.001, 0.0001, 0.002, + 0.0001, 6.042, 1.063, 1.294, 4.124, 13.689, 0.579, 2.105, 1.822, 5.542, + 0.948, 1.42, 3.124, 1.72, 7.129, 4.759, 1.349, 0.015, 5.115, 3.623, + 4.903, 1.642, 1.84, 1.06, 0.063, 0.226, 0.656, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.023, 0.003, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, + 0.001, 0.002, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.008, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.007, 0.001, 0.001, + 0.003, 0.003, 0.001, 0.002, 0.008, 0.009, 0.003, 0.002, 0.005, 0.002, + 0.001, 0.003, 0.009, 0.038, 0.001, 0.051, 0.001, 0.005, 0.001, 0.011, + 0.004, 0.003, 0.013, 0.008, 0.002, 0.002, 0.008, 0.001, 0.004, 0.001, + 0.003, 0.002, 0.01, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.02, 0.166, + 0.007, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.002, 0.016, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.022, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ko: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.893, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.919, 0.003, 0.069, 0.0001, + 0.0001, 0.007, 0.002, 0.048, 0.269, 0.269, 0.0001, 0.002, 0.501, 0.04, + 0.699, 0.01, 0.29, 0.417, 0.259, 0.125, 0.109, 0.112, 0.1, 0.094, 0.109, + 0.192, 0.015, 0.002, 0.006, 0.002, 0.006, 0.003, 0.0001, 0.038, 0.026, + 0.038, 0.022, 0.02, 0.024, 0.015, 0.013, 0.023, 0.008, 0.015, 0.017, + 0.027, 0.016, 0.016, 0.023, 0.002, 0.017, 0.041, 0.027, 0.011, 0.013, + 0.01, 0.005, 0.004, 0.002, 0.006, 0.0001, 0.006, 0.0001, 0.012, 0.0001, + 0.108, 0.014, 0.037, 0.031, 0.116, 0.024, 0.022, 0.032, 0.084, 0.002, + 0.021, 0.064, 0.06, 0.077, 0.092, 0.02, 0.001, 0.086, 0.056, 0.066, + 0.046, 0.011, 0.008, 0.004, 0.019, 0.004, 0.0001, 0.002, 0.0001, 0.025, + 0.0001, 2.21, 0.565, 0.766, 0.471, 3.043, 0.671, 0.334, 0.049, 1.404, + 0.218, 1.17, 1.657, 1.23, 0.278, 0.091, 0.557, 1.645, 0.451, 0.058, + 0.386, 1.38, 2.193, 0.506, 1.29, 2.708, 0.68, 0.385, 0.399, 2.758, + 3.352, 0.954, 0.141, 1.848, 0.829, 0.071, 0.249, 1.741, 0.637, 0.43, + 0.888, 0.537, 0.506, 0.243, 0.027, 1.4, 0.355, 0.026, 0.179, 2.38, + 0.404, 0.739, 1.021, 2.205, 0.729, 0.454, 0.308, 1.635, 0.561, 0.035, + 0.084, 1.612, 0.309, 0.024, 0.047, 0.0001, 0.0001, 0.034, 0.005, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.039, 0.089, 0.025, 0.107, 0.071, 0.044, 0.037, 0.043, + 3.199, 8.716, 12.558, 3.298, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + cs: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.804, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.066, 0.002, 0.232, 0.0001, + 0.0001, 0.008, 0.002, 0.009, 0.188, 0.188, 0.007, 0.002, 0.814, 0.094, + 1.008, 0.025, 0.299, 0.437, 0.233, 0.115, 0.111, 0.119, 0.106, 0.102, + 0.129, 0.233, 0.051, 0.011, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.143, + 0.145, 0.103, 0.117, 0.06, 0.072, 0.055, 0.092, 0.08, 0.13, 0.142, + 0.093, 0.169, 0.137, 0.088, 0.246, 0.003, 0.104, 0.236, 0.127, 0.039, + 0.213, 0.033, 0.007, 0.007, 0.069, 0.002, 0.0001, 0.002, 0.0001, 0.005, + 0.0001, 5.018, 1.137, 1.8, 2.299, 5.465, 0.243, 0.288, 1.623, 3.2, + 1.177, 2.624, 3.218, 2.048, 4.447, 5.813, 1.952, 0.006, 3.062, 3.218, + 3.502, 2.227, 3.008, 0.043, 0.058, 1.313, 1.405, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.104, 0.003, 0.004, 0.003, 0.001, 0.001, 0.001, 0.003, + 0.041, 0.001, 0.001, 0.001, 0.049, 0.57, 0.001, 0.012, 0.001, 0.001, + 0.002, 0.048, 0.002, 0.001, 0.001, 0.002, 0.011, 0.748, 0.01, 0.981, + 0.025, 0.001, 0.025, 0.002, 0.191, 1.9, 0.003, 0.001, 0.005, 0.024, + 0.002, 0.002, 0.002, 0.87, 0.001, 0.001, 0.001, 1.984, 0.001, 0.336, + 0.006, 0.002, 0.004, 0.031, 0.002, 0.003, 0.006, 0.001, 0.003, 0.001, + 0.094, 0.002, 0.007, 0.671, 0.58, 0.001, 0.0001, 0.0001, 0.173, 5.104, + 1.615, 2.233, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.002, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.009, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.103, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ar: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.65, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.194, 0.002, 0.102, 0.0001, + 0.0001, 0.007, 0.001, 0.002, 0.109, 0.108, 0.002, 0.001, 0.03, 0.046, + 0.42, 0.018, 0.182, 0.202, 0.135, 0.063, 0.065, 0.061, 0.055, 0.053, + 0.062, 0.113, 0.054, 0.001, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.01, + 0.006, 0.009, 0.007, 0.005, 0.004, 0.004, 0.004, 0.005, 0.002, 0.002, + 0.005, 0.007, 0.005, 0.004, 0.007, 0.001, 0.005, 0.009, 0.006, 0.002, + 0.002, 0.002, 0.001, 0.001, 0.001, 0.007, 0.001, 0.007, 0.0001, 0.004, + 0.0001, 0.052, 0.008, 0.019, 0.018, 0.055, 0.008, 0.011, 0.016, 0.045, + 0.001, 0.006, 0.028, 0.016, 0.037, 0.04, 0.012, 0.001, 0.038, 0.03, + 0.035, 0.02, 0.006, 0.006, 0.002, 0.009, 0.002, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.055, 1.131, 0.874, 0.939, 4.804, 2.787, 2.235, 1.018, + 2.407, 0.349, 3.542, 0.092, 0.4, 0.007, 0.051, 0.053, 0.022, 0.061, + 0.01, 0.008, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.008, + 0.001, 0.001, 0.0001, 0.002, 0.013, 0.133, 0.049, 0.782, 0.037, 0.335, + 0.157, 6.208, 1.599, 1.486, 1.889, 0.276, 0.607, 0.762, 0.341, 1.38, + 0.239, 2.041, 0.293, 1.149, 0.411, 0.383, 0.246, 0.406, 0.094, 1.401, + 0.223, 0.006, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.027, 0.003, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 23.298, 20.414, 0.003, 0.004, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.019, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + vi: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.205, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.546, 0.002, 0.241, 0.0001, + 0.001, 0.015, 0.013, 0.009, 0.13, 0.13, 0.0001, 0.002, 0.714, 0.089, + 0.813, 0.02, 0.259, 0.361, 0.203, 0.104, 0.097, 0.104, 0.089, 0.089, + 0.116, 0.194, 0.047, 0.017, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.148, + 0.175, 0.293, 0.111, 0.056, 0.04, 0.092, 0.206, 0.057, 0.03, 0.119, + 0.232, 0.178, 0.247, 0.036, 0.156, 0.056, 0.062, 0.184, 0.397, 0.022, + 0.114, 0.033, 0.033, 0.019, 0.009, 0.005, 0.0001, 0.005, 0.0001, 0.003, + 0.0001, 2.683, 0.66, 3.149, 0.627, 1.148, 0.076, 2.542, 4.362, 3.528, + 0.019, 0.59, 1.486, 1.611, 5.924, 2.001, 0.761, 0.201, 1.559, 1.014, + 3.555, 1.77, 0.861, 0.05, 0.173, 0.826, 0.047, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.021, 0.214, 0.011, 0.478, 0.002, 0.039, 0.001, 0.324, + 0.002, 0.072, 0.001, 0.198, 0.002, 0.32, 0.002, 0.048, 0.141, 1.485, + 0.001, 0.116, 0.015, 0.106, 0.001, 0.025, 0.002, 0.579, 0.004, 0.289, + 0.004, 0.257, 0.005, 0.174, 1.516, 1.221, 0.326, 0.818, 0.013, 0.337, + 0.005, 0.51, 0.014, 0.324, 0.408, 0.115, 0.147, 0.492, 0.002, 0.218, + 0.82, 0.26, 0.102, 0.383, 0.379, 0.016, 0.006, 0.094, 0.005, 0.132, + 2.233, 4.628, 0.009, 0.062, 0.003, 0.385, 0.0001, 0.0001, 0.047, 4.542, + 1.653, 0.065, 0.997, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 6.74, 0.019, 0.004, 0.002, 0.009, 0.006, 0.004, 0.003, + 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + el: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.389, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.245, 0.003, 0.167, 0.001, + 0.0001, 0.005, 0.002, 0.015, 0.1, 0.101, 0.0001, 0.001, 0.487, 0.058, + 0.449, 0.01, 0.151, 0.215, 0.114, 0.058, 0.055, 0.058, 0.052, 0.051, + 0.065, 0.119, 0.032, 0.001, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.021, + 0.016, 0.024, 0.014, 0.012, 0.012, 0.011, 0.013, 0.012, 0.005, 0.006, + 0.013, 0.018, 0.01, 0.009, 0.015, 0.001, 0.013, 0.025, 0.017, 0.005, + 0.006, 0.008, 0.002, 0.002, 0.001, 0.005, 0.0001, 0.005, 0.0001, 0.002, + 0.0001, 0.125, 0.018, 0.039, 0.039, 0.142, 0.017, 0.026, 0.036, 0.105, + 0.002, 0.017, 0.072, 0.036, 0.093, 0.102, 0.022, 0.002, 0.099, 0.07, + 0.077, 0.046, 0.014, 0.01, 0.005, 0.02, 0.005, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 1.502, 1.948, 1.522, 1.805, 3.613, 1.458, 0.354, 0.481, + 0.073, 0.584, 0.024, 0.002, 0.912, 0.435, 0.305, 0.001, 0.006, 0.156, + 0.057, 0.068, 0.049, 0.097, 0.01, 0.064, 0.017, 0.048, 0.112, 0.037, + 0.115, 0.048, 0.003, 0.099, 0.122, 0.029, 0.001, 0.129, 0.119, 0.011, + 0.03, 0.034, 0.002, 0.008, 0.0001, 0.022, 0.85, 0.749, 0.601, 1.063, + 0.004, 3.95, 0.27, 0.716, 0.649, 2.656, 0.14, 1.63, 0.422, 2.831, 1.733, + 1.214, 1.337, 2.636, 0.149, 3.615, 0.0001, 0.0001, 0.06, 0.007, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 28.675, 14.922, 0.013, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.004, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sv: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.282, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.667, 0.001, 0.345, 0.0001, + 0.0001, 0.007, 0.002, 0.013, 0.083, 0.083, 0.0001, 0.0001, 0.902, 0.146, + 1.182, 0.007, 0.152, 0.25, 0.108, 0.06, 0.06, 0.065, 0.065, 0.066, + 0.089, 0.153, 0.044, 0.004, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.178, + 0.164, 0.421, 0.354, 0.095, 0.078, 0.149, 0.127, 0.181, 0.06, 0.161, + 0.209, 0.174, 0.099, 0.072, 0.149, 0.019, 0.12, 0.249, 0.206, 0.034, + 0.058, 0.04, 0.006, 0.012, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 6.63, 0.945, 0.963, 3.448, 8.696, 0.922, 2.03, 1.373, 4.448, + 0.429, 1.949, 3.417, 3.024, 6.448, 3.193, 1.076, 0.019, 6.923, 3.891, + 5.562, 1.877, 1.653, 0.074, 0.114, 0.424, 0.075, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.022, 0.039, 0.002, 0.003, 0.007, 0.074, 0.004, 0.007, + 0.005, 0.002, 0.002, 0.0001, 0.003, 0.008, 0.002, 0.004, 0.001, 0.002, + 0.0001, 0.011, 0.001, 0.001, 0.012, 0.001, 0.005, 0.002, 0.001, 0.001, + 0.001, 0.004, 0.001, 0.003, 0.21, 0.017, 0.005, 0.004, 1.574, 0.853, + 0.002, 0.007, 0.008, 0.038, 0.004, 0.047, 0.001, 0.014, 0.002, 0.009, + 0.187, 0.01, 0.004, 0.012, 0.004, 0.002, 0.808, 0.001, 0.008, 0.002, + 0.004, 0.002, 0.006, 0.002, 0.003, 0.001, 0.0001, 0.0001, 0.393, 3.436, + 0.069, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.001, 0.014, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.021, 0.021, 0.004, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.006, 0.019, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + hu: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.827, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.714, 0.004, 0.265, 0.0001, + 0.0001, 0.007, 0.001, 0.007, 0.159, 0.159, 0.001, 0.002, 1.016, 0.461, + 0.937, 0.013, 0.261, 0.429, 0.206, 0.109, 0.106, 0.113, 0.103, 0.105, + 0.137, 0.238, 0.073, 0.019, 0.004, 0.004, 0.004, 0.002, 0.0001, 0.469, + 0.135, 0.097, 0.073, 0.142, 0.093, 0.075, 0.087, 0.095, 0.062, 0.133, + 0.086, 0.175, 0.085, 0.042, 0.096, 0.003, 0.071, 0.186, 0.107, 0.027, + 0.069, 0.028, 0.009, 0.008, 0.025, 0.002, 0.0001, 0.002, 0.0001, 0.004, + 0.0001, 6.316, 1.591, 0.619, 1.364, 7.125, 0.648, 2.159, 0.946, 3.15, + 0.796, 3.265, 4.526, 2.054, 3.978, 3.047, 0.846, 0.006, 3.327, 4.35, + 5.787, 0.902, 1.395, 0.037, 0.035, 1.463, 2.94, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.129, 0.02, 0.003, 0.003, 0.001, 0.001, 0.001, 0.003, + 0.002, 0.014, 0.001, 0.001, 0.001, 0.006, 0.0001, 0.001, 0.004, 0.667, + 0.001, 0.068, 0.001, 0.0001, 0.005, 0.001, 0.001, 0.009, 0.007, 0.002, + 0.003, 0.026, 0.026, 0.002, 0.024, 2.603, 0.002, 0.001, 0.003, 0.001, + 0.002, 0.002, 0.003, 2.374, 0.001, 0.002, 0.001, 0.448, 0.001, 0.001, + 0.005, 0.169, 0.003, 0.702, 0.002, 0.002, 0.76, 0.001, 0.004, 0.002, + 0.223, 0.002, 0.382, 0.004, 0.004, 0.001, 0.0001, 0.0001, 0.028, 7.544, + 0.01, 0.845, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.002, 0.021, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.128, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ro: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.178, 0.003, 0.287, 0.001, + 0.001, 0.038, 0.002, 0.011, 0.2, 0.201, 0.001, 0.002, 1.114, 0.333, + 0.783, 0.015, 0.314, 0.397, 0.224, 0.108, 0.105, 0.107, 0.098, 0.099, + 0.123, 0.221, 0.062, 0.021, 0.007, 0.006, 0.007, 0.002, 0.0001, 0.27, + 0.164, 0.289, 0.16, 0.109, 0.099, 0.098, 0.077, 0.163, 0.044, 0.047, + 0.132, 0.205, 0.095, 0.07, 0.207, 0.004, 0.158, 0.242, 0.12, 0.072, + 0.085, 0.033, 0.021, 0.01, 0.019, 0.006, 0.0001, 0.006, 0.0001, 0.007, + 0.0001, 7.568, 0.638, 3.253, 2.492, 8.352, 0.862, 0.693, 0.377, 7.77, + 0.16, 0.142, 3.906, 1.919, 5.009, 3.799, 1.948, 0.008, 5.326, 2.857, + 4.711, 4.259, 0.743, 0.045, 0.139, 0.103, 0.506, 0.0001, 0.007, 0.0001, + 0.0001, 0.0001, 0.128, 0.004, 0.004, 1.675, 0.002, 0.001, 0.001, 0.002, + 0.001, 0.002, 0.001, 0.001, 0.001, 0.003, 0.104, 0.001, 0.001, 0.002, + 0.001, 0.018, 0.003, 0.001, 0.001, 0.001, 0.016, 0.733, 0.007, 0.695, + 0.006, 0.05, 0.046, 0.002, 0.038, 0.012, 0.339, 0.002, 0.003, 0.001, + 0.001, 0.002, 0.004, 0.016, 0.001, 0.003, 0.001, 0.004, 0.716, 0.001, + 0.007, 0.003, 0.004, 0.005, 0.003, 0.002, 0.005, 0.001, 0.003, 0.001, + 0.002, 0.003, 0.007, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.048, 1.213, + 1.681, 0.01, 0.0001, 0.003, 1.446, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.006, 0.003, 0.016, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.127, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + id: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.029, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.265, 0.003, 0.293, 0.001, + 0.002, 0.008, 0.004, 0.02, 0.156, 0.156, 0.001, 0.002, 0.897, 0.232, + 0.837, 0.025, 0.281, 0.301, 0.205, 0.089, 0.081, 0.088, 0.077, 0.074, + 0.084, 0.156, 0.047, 0.017, 0.004, 0.004, 0.004, 0.002, 0.0001, 0.336, + 0.259, 0.156, 0.221, 0.076, 0.084, 0.101, 0.111, 0.249, 0.128, 0.292, + 0.143, 0.276, 0.131, 0.06, 0.365, 0.008, 0.137, 0.448, 0.233, 0.076, + 0.043, 0.063, 0.011, 0.049, 0.014, 0.01, 0.0001, 0.01, 0.0001, 0.002, + 0.0001, 14.771, 1.913, 0.506, 3.424, 6.588, 0.273, 2.854, 1.797, 6.389, + 0.58, 3.078, 2.893, 3.104, 7.626, 2.047, 2.047, 0.011, 4.279, 3.371, + 3.841, 3.795, 0.171, 0.34, 0.026, 1.249, 0.063, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.031, 0.005, 0.004, 0.003, 0.003, 0.002, 0.001, 0.002, + 0.002, 0.001, 0.001, 0.001, 0.001, 0.004, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.012, 0.003, 0.001, 0.001, 0.001, 0.002, 0.005, 0.001, 0.001, + 0.006, 0.006, 0.001, 0.002, 0.051, 0.005, 0.002, 0.002, 0.003, 0.001, + 0.002, 0.003, 0.002, 0.009, 0.001, 0.002, 0.001, 0.003, 0.001, 0.001, + 0.004, 0.003, 0.004, 0.003, 0.002, 0.002, 0.002, 0.001, 0.003, 0.002, + 0.002, 0.002, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.055, 0.03, + 0.005, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.006, 0.003, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.003, 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.002, 0.03, 0.003, 0.001, 0.003, 0.002, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sk: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.159, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.105, 0.002, 0.192, 0.0001, + 0.0001, 0.007, 0.002, 0.005, 0.209, 0.21, 0.013, 0.002, 0.819, 0.162, + 1.046, 0.023, 0.302, 0.407, 0.233, 0.125, 0.121, 0.119, 0.111, 0.11, + 0.127, 0.222, 0.055, 0.011, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.172, + 0.157, 0.128, 0.107, 0.068, 0.073, 0.08, 0.101, 0.088, 0.103, 0.136, + 0.098, 0.191, 0.186, 0.106, 0.263, 0.004, 0.11, 0.26, 0.138, 0.041, 0.2, + 0.032, 0.006, 0.008, 0.071, 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.0001, + 6.363, 1.243, 1.749, 2.177, 5.774, 0.29, 0.367, 1.611, 4.04, 1.457, + 2.743, 2.816, 2.062, 4.279, 6.818, 1.868, 0.006, 3.912, 3.184, 3.285, + 2.066, 3.292, 0.044, 0.067, 1.073, 1.331, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.113, 0.006, 0.004, 0.002, 0.002, 0.001, 0.001, 0.002, + 0.077, 0.003, 0.0001, 0.001, 0.033, 0.618, 0.006, 0.066, 0.001, 0.001, + 0.001, 0.046, 0.001, 0.006, 0.001, 0.001, 0.001, 0.013, 0.009, 0.007, + 0.027, 0.001, 0.026, 0.001, 0.106, 1.828, 0.001, 0.001, 0.067, 0.259, + 0.001, 0.002, 0.006, 0.586, 0.001, 0.001, 0.001, 0.717, 0.001, 0.002, + 0.005, 0.002, 0.004, 0.16, 0.12, 0.002, 0.005, 0.038, 0.002, 0.001, + 0.54, 0.002, 0.006, 0.806, 0.828, 0.001, 0.0001, 0.0001, 0.114, 4.297, + 1.036, 1.463, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.007, 0.003, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.112, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + da: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.925, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.716, 0.002, 0.323, 0.001, + 0.001, 0.007, 0.004, 0.044, 0.149, 0.15, 0.001, 0.001, 0.888, 0.199, + 1.047, 0.017, 0.356, 0.494, 0.245, 0.119, 0.115, 0.124, 0.118, 0.127, + 0.168, 0.257, 0.046, 0.018, 0.001, 0.002, 0.001, 0.002, 0.0001, 0.185, + 0.17, 0.132, 0.265, 0.124, 0.155, 0.096, 0.211, 0.151, 0.076, 0.153, + 0.12, 0.178, 0.102, 0.069, 0.125, 0.005, 0.111, 0.307, 0.131, 0.057, + 0.087, 0.054, 0.005, 0.012, 0.01, 0.002, 0.0001, 0.002, 0.0001, 0.002, + 0.0001, 4.818, 1.29, 0.375, 4.241, 11.595, 1.856, 2.915, 1.153, 4.647, + 0.373, 2.179, 3.858, 2.304, 5.903, 3.8, 1.073, 0.008, 6.456, 4.455, + 5.128, 1.418, 1.705, 0.066, 0.033, 0.579, 0.056, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.052, 0.003, 0.002, 0.001, 0.001, 0.008, 0.003, 0.001, + 0.001, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.033, 0.003, 0.0001, 0.001, 0.001, 0.013, 0.005, 0.0001, + 0.001, 0.002, 0.008, 0.001, 0.002, 0.01, 0.006, 0.001, 0.001, 0.01, + 0.595, 0.559, 0.002, 0.002, 0.02, 0.001, 0.004, 0.001, 0.004, 0.001, + 0.001, 0.005, 0.002, 0.003, 0.005, 0.001, 0.001, 0.011, 0.001, 0.585, + 0.001, 0.002, 0.003, 0.011, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.02, + 1.836, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.003, 0.002, 0.006, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.052, 0.001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + fi: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.851, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.647, 0.002, 0.239, 0.0001, + 0.0001, 0.006, 0.003, 0.009, 0.115, 0.115, 0.0001, 0.004, 0.594, 0.296, + 1.014, 0.011, 0.404, 0.475, 0.268, 0.112, 0.107, 0.117, 0.106, 0.107, + 0.133, 0.295, 0.069, 0.007, 0.003, 0.004, 0.003, 0.001, 0.0001, 0.183, + 0.111, 0.1, 0.068, 0.113, 0.064, 0.065, 0.195, 0.087, 0.098, 0.225, + 0.146, 0.211, 0.097, 0.06, 0.172, 0.005, 0.116, 0.314, 0.181, 0.037, + 0.143, 0.044, 0.006, 0.048, 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.004, + 0.0001, 9.681, 0.162, 0.176, 0.832, 6.272, 0.12, 0.289, 1.322, 8.475, + 1.576, 3.754, 4.597, 2.281, 6.958, 4.47, 1.345, 0.007, 2.326, 6.029, + 6.589, 4.108, 1.653, 0.05, 0.021, 1.301, 0.041, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.101, 0.002, 0.002, 0.001, 0.004, 0.002, 0.001, 0.002, + 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.061, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.008, 0.0001, + 0.001, 0.001, 0.032, 0.0001, 0.001, 0.032, 0.02, 0.001, 0.001, 2.624, + 0.003, 0.001, 0.001, 0.002, 0.014, 0.0001, 0.002, 0.001, 0.01, 0.001, + 0.001, 0.003, 0.002, 0.002, 0.005, 0.001, 0.001, 0.349, 0.001, 0.002, + 0.001, 0.002, 0.001, 0.005, 0.002, 0.004, 0.001, 0.0001, 0.0001, 0.039, + 3.028, 0.006, 0.023, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.005, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.101, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + th: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.353, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.736, 0.001, 0.084, 0.0001, + 0.0001, 0.003, 0.001, 0.003, 0.081, 0.081, 0.0001, 0.001, 0.043, 0.029, + 0.16, 0.005, 0.088, 0.106, 0.121, 0.047, 0.051, 0.082, 0.032, 0.03, + 0.033, 0.045, 0.008, 0.004, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.013, + 0.009, 0.013, 0.008, 0.008, 0.006, 0.006, 0.006, 0.008, 0.003, 0.003, + 0.006, 0.01, 0.006, 0.005, 0.009, 0.001, 0.007, 0.015, 0.012, 0.003, + 0.003, 0.006, 0.001, 0.002, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.001, + 0.0001, 0.08, 0.011, 0.029, 0.025, 0.092, 0.012, 0.017, 0.027, 0.069, + 0.001, 0.009, 0.042, 0.023, 0.063, 0.066, 0.017, 0.001, 0.062, 0.045, + 0.056, 0.028, 0.008, 0.007, 0.003, 0.015, 0.003, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 1.311, 1.859, 0.629, 0.364, 0.845, 0.001, 0.034, 1.547, + 1.721, 0.971, 0.381, 0.156, 0.367, 0.089, 0.014, 0.016, 0.045, 0.009, + 0.014, 0.115, 0.776, 0.653, 0.138, 0.742, 0.12, 1.918, 0.573, 0.602, + 0.112, 0.028, 0.443, 0.069, 0.115, 1.089, 0.883, 1.745, 0.026, 0.859, + 0.001, 0.829, 0.228, 0.108, 0.682, 0.53, 0.008, 1.369, 0.031, 0.006, + 0.627, 1.083, 2.149, 0.218, 0.714, 0.916, 0.178, 0.322, 26.536, 5.927, + 0.003, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 31.884, 0.001, 0.018, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + bg: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.55, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.448, 0.001, 0.106, 0.0001, + 0.0001, 0.005, 0.001, 0.003, 0.12, 0.12, 0.002, 0.001, 0.557, 0.131, + 0.613, 0.011, 0.182, 0.272, 0.137, 0.074, 0.072, 0.075, 0.066, 0.065, + 0.083, 0.144, 0.028, 0.009, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.013, + 0.009, 0.015, 0.008, 0.007, 0.006, 0.006, 0.006, 0.041, 0.002, 0.003, + 0.007, 0.011, 0.006, 0.005, 0.01, 0.001, 0.006, 0.015, 0.011, 0.003, + 0.01, 0.005, 0.007, 0.001, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.002, + 0.0001, 0.088, 0.012, 0.031, 0.028, 0.092, 0.009, 0.016, 0.024, 0.077, + 0.002, 0.014, 0.045, 0.037, 0.056, 0.066, 0.019, 0.001, 0.063, 0.052, + 0.05, 0.037, 0.008, 0.006, 0.003, 0.013, 0.003, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 2.651, 2.091, 3.127, 0.625, 0.166, 0.165, 0.297, 0.452, + 0.133, 0.189, 0.677, 0.001, 0.018, 0.001, 0.079, 0.727, 0.091, 0.092, + 0.108, 0.095, 0.081, 0.039, 0.009, 0.034, 0.052, 0.011, 0.114, 0.044, + 0.167, 0.089, 0.136, 0.155, 0.116, 0.171, 0.083, 0.024, 0.037, 0.04, + 0.014, 0.018, 0.016, 0.009, 0.001, 0.0001, 0.001, 0.002, 0.012, 0.008, + 5.212, 0.516, 1.875, 0.701, 1.296, 3.589, 0.274, 0.882, 3.979, 0.288, + 1.391, 1.465, 0.909, 3.169, 3.698, 1.109, 0.0001, 0.0001, 0.048, 0.005, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, + 0.0001, 0.015, 0.006, 31.942, 11.185, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.201, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + he: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.485, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.289, 0.001, 0.262, 0.0001, + 0.0001, 0.005, 0.001, 0.096, 0.104, 0.103, 0.0001, 0.001, 0.64, 0.203, + 0.573, 0.005, 0.181, 0.234, 0.129, 0.06, 0.061, 0.062, 0.055, 0.054, + 0.065, 0.138, 0.049, 0.013, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.016, + 0.011, 0.014, 0.009, 0.007, 0.007, 0.006, 0.007, 0.009, 0.003, 0.003, + 0.008, 0.012, 0.007, 0.005, 0.01, 0.001, 0.008, 0.016, 0.012, 0.003, + 0.004, 0.005, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.007, + 0.0001, 0.073, 0.008, 0.021, 0.022, 0.081, 0.015, 0.013, 0.021, 0.056, + 0.001, 0.007, 0.043, 0.024, 0.051, 0.061, 0.011, 0.001, 0.058, 0.038, + 0.043, 0.032, 0.007, 0.005, 0.003, 0.012, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.014, 0.003, 0.002, 0.003, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 2.008, 2.447, + 0.696, 1.135, 3.773, 4.868, 0.394, 0.995, 0.678, 4.903, 0.173, 0.854, + 2.776, 1.153, 2.22, 0.562, 1.585, 0.919, 1.159, 0.101, 0.969, 0.062, + 0.568, 1.054, 2.634, 1.902, 2.428, 0.0001, 0.001, 0.001, 0.0001, 0.001, + 0.009, 0.002, 0.002, 0.002, 0.006, 0.004, 0.005, 0.005, 0.008, 0.005, + 0.001, 0.002, 0.01, 0.002, 0.005, 0.001, 0.0001, 0.0001, 0.008, 0.005, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.002, 0.015, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, + 0.044, 42.985, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.013, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + uk: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.595, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.309, 0.001, 0.06, 0.0001, + 0.001, 0.01, 0.001, 0.059, 0.134, 0.135, 0.002, 0.002, 0.619, 0.137, + 0.568, 0.01, 0.199, 0.281, 0.159, 0.081, 0.077, 0.082, 0.071, 0.067, + 0.079, 0.158, 0.041, 0.017, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.014, + 0.009, 0.015, 0.009, 0.007, 0.006, 0.007, 0.006, 0.029, 0.002, 0.003, + 0.007, 0.011, 0.006, 0.005, 0.01, 0.001, 0.008, 0.016, 0.01, 0.003, + 0.01, 0.004, 0.011, 0.001, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.004, + 0.0001, 0.067, 0.008, 0.022, 0.02, 0.069, 0.01, 0.012, 0.018, 0.056, + 0.001, 0.008, 0.037, 0.02, 0.046, 0.054, 0.014, 0.001, 0.051, 0.037, + 0.039, 0.027, 0.007, 0.006, 0.003, 0.012, 0.003, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 2.481, 1.842, 2.043, 1.429, 0.162, 0.46, 0.448, 0.496, + 0.265, 0.125, 0.001, 0.003, 0.806, 0.001, 0.316, 0.84, 0.08, 0.077, + 0.114, 0.065, 0.394, 0.018, 2.734, 0.422, 0.001, 0.01, 0.11, 0.047, + 0.088, 0.083, 0.052, 0.13, 0.228, 0.124, 0.058, 0.089, 0.032, 0.023, + 0.02, 0.023, 0.023, 0.004, 0.0001, 0.09, 0.0001, 0.001, 0.008, 0.014, + 3.574, 0.601, 2.221, 0.664, 1.335, 1.986, 0.299, 0.851, 2.427, 0.557, + 1.658, 1.688, 1.249, 3.061, 4.029, 1.082, 0.0001, 0.0001, 0.335, 0.003, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, + 0.0001, 0.002, 0.001, 28.71, 14.784, 0.01, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.144, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + lt: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.086, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.626, 0.002, 0.167, 0.001, + 0.0001, 0.009, 0.001, 0.01, 0.234, 0.234, 0.001, 0.002, 1.069, 0.088, + 1.436, 0.009, 0.347, 0.549, 0.256, 0.135, 0.132, 0.151, 0.128, 0.13, + 0.15, 0.368, 0.06, 0.018, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.213, + 0.143, 0.054, 0.128, 0.066, 0.049, 0.096, 0.041, 0.157, 0.121, 0.23, + 0.188, 0.16, 0.109, 0.037, 0.238, 0.002, 0.129, 0.21, 0.163, 0.036, + 0.209, 0.013, 0.047, 0.01, 0.016, 0.002, 0.0001, 0.002, 0.0001, 0.003, + 0.0001, 8.107, 0.954, 0.391, 1.797, 4.13, 0.204, 1.223, 0.172, 9.411, + 1.587, 2.883, 2.415, 2.501, 3.736, 4.946, 1.811, 0.003, 4.047, 5.62, + 3.782, 3.399, 1.76, 0.016, 0.008, 1.047, 0.248, 0.0001, 0.015, 0.0001, + 0.002, 0.0001, 0.475, 0.005, 0.003, 0.002, 0.002, 0.411, 0.001, 0.001, + 0.006, 0.001, 0.001, 0.001, 0.019, 0.313, 0.0001, 0.001, 0.001, 0.001, + 0.006, 0.247, 0.001, 0.0001, 0.001, 1.225, 0.001, 0.136, 0.001, 0.001, + 0.108, 0.003, 0.111, 0.001, 0.364, 0.781, 0.001, 0.001, 0.002, 0.001, + 0.002, 0.001, 0.001, 0.003, 0.002, 0.299, 0.001, 0.004, 0.013, 0.355, + 0.007, 0.002, 0.007, 0.931, 0.001, 0.004, 0.001, 0.001, 0.004, 0.002, + 0.003, 0.003, 0.003, 0.037, 0.575, 0.001, 0.0001, 0.0001, 0.29, 0.016, + 2.467, 2.697, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.001, 0.033, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.477, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + nn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.127, 0.002, 0.244, 0.0001, + 0.0001, 0.007, 0.004, 0.029, 0.125, 0.125, 0.001, 0.001, 0.736, 0.236, + 1.026, 0.016, 0.357, 0.45, 0.2, 0.113, 0.108, 0.13, 0.122, 0.121, 0.148, + 0.271, 0.033, 0.009, 0.004, 0.002, 0.004, 0.001, 0.0001, 0.218, 0.193, + 0.121, 0.247, 0.133, 0.148, 0.105, 0.221, 0.171, 0.071, 0.137, 0.127, + 0.194, 0.145, 0.08, 0.133, 0.007, 0.124, 0.352, 0.152, 0.062, 0.099, + 0.053, 0.006, 0.016, 0.016, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.001, + 6.479, 0.879, 0.246, 3.008, 9.683, 1.285, 2.701, 0.948, 5.112, 0.784, + 2.645, 3.726, 2.383, 5.836, 3.991, 1.273, 0.009, 6.373, 4.403, 5.512, + 1.465, 1.904, 0.067, 0.025, 0.761, 0.055, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.031, 0.01, 0.005, 0.003, 0.003, 0.012, 0.002, 0.003, 0.002, + 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, + 0.02, 0.003, 0.002, 0.002, 0.001, 0.013, 0.005, 0.002, 0.001, 0.002, + 0.001, 0.001, 0.003, 0.042, 0.013, 0.002, 0.002, 0.016, 0.934, 0.093, + 0.004, 0.01, 0.021, 0.004, 0.076, 0.002, 0.01, 0.001, 0.002, 0.012, + 0.007, 0.039, 0.01, 0.004, 0.006, 0.015, 0.002, 0.552, 0.004, 0.006, + 0.078, 0.011, 0.006, 0.007, 0.003, 0.0001, 0.0001, 0.197, 1.726, 0.009, + 0.008, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, + 0.017, 0.007, 0.044, 0.016, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.01, + 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, + 0.002, 0.027, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + hr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.893, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.172, 0.002, 0.34, 0.0001, + 0.001, 0.011, 0.002, 0.016, 0.182, 0.182, 0.001, 0.002, 0.943, 0.135, + 1.23, 0.019, 0.3, 0.38, 0.204, 0.106, 0.1, 0.109, 0.096, 0.094, 0.112, + 0.22, 0.065, 0.02, 0.009, 0.004, 0.009, 0.002, 0.0001, 0.156, 0.17, + 0.109, 0.14, 0.063, 0.069, 0.111, 0.12, 0.137, 0.079, 0.163, 0.086, + 0.175, 0.178, 0.118, 0.22, 0.004, 0.116, 0.267, 0.137, 0.108, 0.095, + 0.03, 0.008, 0.009, 0.078, 0.011, 0.0001, 0.011, 0.0001, 0.002, 0.0001, + 8.648, 1.028, 0.78, 2.344, 6.653, 0.218, 1.346, 0.572, 7.393, 3.932, + 2.783, 2.724, 2.195, 4.91, 6.755, 1.994, 0.007, 4.039, 3.61, 3.329, + 3.254, 2.478, 0.043, 0.016, 0.083, 1.288, 0.0001, 0.003, 0.0001, 0.0001, + 0.0001, 0.039, 0.005, 0.004, 0.003, 0.002, 0.001, 0.003, 0.353, 0.002, + 0.001, 0.001, 0.001, 0.016, 0.678, 0.001, 0.001, 0.004, 0.158, 0.001, + 0.011, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.009, + 0.005, 0.008, 0.001, 0.033, 0.524, 0.003, 0.002, 0.003, 0.001, 0.001, + 0.002, 0.002, 0.01, 0.001, 0.005, 0.001, 0.004, 0.001, 0.001, 0.008, + 0.004, 0.005, 0.005, 0.002, 0.004, 0.004, 0.001, 0.004, 0.002, 0.004, + 0.006, 0.006, 0.016, 0.36, 0.002, 0.0001, 0.0001, 0.021, 0.044, 1.208, + 0.914, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.011, 0.005, 0.028, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.002, 0.038, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + no: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.853, 0.002, 0.247, 0.0001, + 0.001, 0.006, 0.004, 0.016, 0.159, 0.158, 0.001, 0.001, 0.698, 0.213, + 1.037, 0.017, 0.377, 0.496, 0.255, 0.116, 0.113, 0.123, 0.117, 0.116, + 0.152, 0.295, 0.042, 0.013, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.196, + 0.176, 0.125, 0.246, 0.126, 0.148, 0.099, 0.211, 0.167, 0.071, 0.132, + 0.135, 0.185, 0.133, 0.091, 0.127, 0.006, 0.11, 0.321, 0.146, 0.058, + 0.092, 0.051, 0.007, 0.014, 0.011, 0.002, 0.0001, 0.002, 0.0001, 0.001, + 0.0001, 4.956, 1.168, 0.243, 2.996, 11.38, 1.384, 2.632, 1.02, 4.719, + 0.546, 2.591, 3.946, 2.341, 6.218, 3.979, 1.354, 0.009, 6.417, 4.712, + 5.821, 1.424, 1.732, 0.061, 0.029, 0.639, 0.049, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.041, 0.006, 0.003, 0.002, 0.002, 0.009, 0.002, 0.002, + 0.001, 0.002, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.034, 0.002, 0.001, 0.002, 0.001, 0.014, 0.003, 0.001, 0.001, + 0.001, 0.002, 0.001, 0.002, 0.028, 0.009, 0.001, 0.002, 0.012, 0.765, + 0.126, 0.003, 0.003, 0.021, 0.001, 0.062, 0.001, 0.006, 0.001, 0.001, + 0.007, 0.003, 0.006, 0.006, 0.002, 0.003, 0.012, 0.001, 0.598, 0.002, + 0.004, 0.062, 0.009, 0.004, 0.004, 0.002, 0.0001, 0.0001, 0.152, 1.588, + 0.007, 0.007, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.008, 0.004, 0.022, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.002, 0.039, 0.001, 0.001, 0.004, 0.002, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.872, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.68, 0.001, 0.1, 0.0001, + 0.0001, 0.009, 0.0001, 0.005, 0.176, 0.176, 0.0001, 0.003, 0.5, 0.178, + 0.762, 0.011, 0.275, 0.318, 0.214, 0.099, 0.096, 0.093, 0.078, 0.075, + 0.084, 0.129, 0.031, 0.008, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.017, + 0.01, 0.025, 0.013, 0.007, 0.006, 0.019, 0.007, 0.026, 0.003, 0.008, + 0.007, 0.014, 0.016, 0.013, 0.016, 0.001, 0.009, 0.02, 0.011, 0.006, + 0.008, 0.003, 0.004, 0.001, 0.003, 0.002, 0.0001, 0.002, 0.0001, 0.018, + 0.0001, 0.453, 0.047, 0.05, 0.128, 0.37, 0.027, 0.066, 0.039, 0.393, + 0.16, 0.152, 0.148, 0.154, 0.268, 0.352, 0.1, 0.001, 0.219, 0.193, + 0.185, 0.165, 0.107, 0.003, 0.002, 0.007, 0.07, 0.053, 0.001, 0.053, + 0.0001, 0.0001, 2.152, 2.07, 1.61, 1.756, 0.112, 0.204, 0.344, 0.339, + 0.366, 0.003, 0.007, 0.001, 0.001, 0.031, 0.0001, 0.007, 0.082, 0.095, + 0.143, 0.054, 0.071, 0.047, 0.006, 0.035, 1.459, 0.284, 0.347, 0.2, + 0.143, 0.119, 0.086, 0.186, 0.072, 0.175, 0.071, 0.052, 0.034, 0.041, + 0.014, 0.02, 0.016, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 4.933, 0.477, 1.401, 0.663, 1.33, 3.708, 0.225, 0.704, 3.913, 0.001, + 1.472, 1.2, 1.198, 2.623, 3.682, 1.022, 0.0001, 0.0001, 0.018, 0.003, + 0.054, 0.041, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.001, 30.181, 10.982, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.062, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ca: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.816, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.948, 0.002, 0.294, 0.001, + 0.011, 0.035, 0.001, 0.634, 0.154, 0.154, 0.001, 0.002, 1.001, 0.144, + 0.747, 0.01, 0.301, 0.411, 0.25, 0.137, 0.131, 0.135, 0.12, 0.123, + 0.144, 0.212, 0.051, 0.029, 0.002, 0.003, 0.003, 0.001, 0.0001, 0.252, + 0.125, 0.23, 0.119, 0.296, 0.09, 0.091, 0.066, 0.12, 0.061, 0.034, + 0.213, 0.174, 0.072, 0.049, 0.171, 0.012, 0.097, 0.192, 0.11, 0.053, + 0.092, 0.024, 0.034, 0.01, 0.009, 0.002, 0.0001, 0.002, 0.0001, 0.004, + 0.0001, 9.132, 1.004, 2.746, 3.236, 9.343, 0.681, 0.95, 0.465, 5.412, + 0.169, 0.095, 4.932, 2.114, 4.848, 3.551, 1.884, 0.571, 5.202, 5.696, + 4.416, 2.672, 1.094, 0.036, 0.312, 0.252, 0.123, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.044, 0.004, 0.004, 0.002, 0.002, 0.001, 0.001, 0.001, + 0.002, 0.015, 0.001, 0.001, 0.001, 0.005, 0.001, 0.001, 0.001, 0.001, + 0.002, 0.006, 0.003, 0.001, 0.001, 0.001, 0.001, 0.021, 0.001, 0.001, + 0.003, 0.003, 0.001, 0.001, 0.327, 0.012, 0.002, 0.002, 0.002, 0.001, + 0.001, 0.088, 0.218, 0.355, 0.001, 0.01, 0.003, 0.236, 0.001, 0.038, + 0.005, 0.007, 0.161, 0.374, 0.002, 0.003, 0.003, 0.047, 0.003, 0.002, + 0.063, 0.01, 0.034, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.099, 1.903, + 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.009, 0.004, 0.012, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.002, 0.039, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sl: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.06, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.437, 0.024, 0.237, 0.001, + 0.001, 0.007, 0.002, 0.011, 0.174, 0.174, 0.021, 0.002, 1.072, 0.17, + 1.037, 0.022, 0.277, 0.429, 0.215, 0.122, 0.124, 0.121, 0.109, 0.108, + 0.134, 0.239, 0.061, 0.025, 0.005, 0.006, 0.005, 0.002, 0.0001, 0.162, + 0.141, 0.1, 0.122, 0.063, 0.075, 0.091, 0.086, 0.111, 0.082, 0.154, + 0.138, 0.185, 0.145, 0.099, 0.224, 0.004, 0.106, 0.263, 0.133, 0.042, + 0.163, 0.031, 0.007, 0.007, 0.087, 0.013, 0.0001, 0.014, 0.0001, 0.006, + 0.0001, 7.7, 1.204, 0.709, 2.364, 7.782, 0.229, 1.139, 0.879, 6.985, + 3.327, 2.701, 3.64, 2.037, 5.283, 6.653, 2.232, 0.006, 4.152, 3.513, + 3.409, 1.654, 3.049, 0.039, 0.016, 0.079, 1.473, 0.0001, 0.01, 0.0001, + 0.0001, 0.0001, 0.054, 0.004, 0.003, 0.002, 0.002, 0.001, 0.001, 0.011, + 0.002, 0.002, 0.0001, 0.001, 0.021, 0.847, 0.001, 0.0001, 0.001, 0.002, + 0.002, 0.027, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, + 0.002, 0.001, 0.001, 0.001, 0.056, 0.644, 0.007, 0.001, 0.003, 0.001, + 0.001, 0.002, 0.003, 0.013, 0.001, 0.027, 0.001, 0.005, 0.001, 0.001, + 0.007, 0.003, 0.004, 0.005, 0.002, 0.003, 0.006, 0.001, 0.004, 0.002, + 0.004, 0.028, 0.008, 0.018, 0.391, 0.002, 0.0001, 0.0001, 0.071, 0.059, + 0.881, 1.071, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.01, 0.005, 0.024, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.054, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + lv: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.879, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.099, 0.004, 0.432, 0.0001, + 0.0001, 0.013, 0.002, 0.007, 0.207, 0.208, 0.0001, 0.003, 0.965, 0.082, + 1.276, 0.01, 0.332, 0.476, 0.254, 0.122, 0.117, 0.123, 0.105, 0.106, + 0.127, 0.271, 0.045, 0.023, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.208, + 0.134, 0.062, 0.128, 0.074, 0.067, 0.074, 0.058, 0.112, 0.068, 0.189, + 0.194, 0.144, 0.089, 0.055, 0.234, 0.002, 0.136, 0.249, 0.163, 0.042, + 0.182, 0.012, 0.007, 0.003, 0.051, 0.001, 0.0001, 0.001, 0.0001, 0.003, + 0.0001, 8.58, 1.078, 0.806, 2.221, 4.451, 0.231, 1.228, 0.175, 6.667, + 1.704, 2.603, 2.424, 2.389, 3.209, 2.883, 1.908, 0.003, 4.056, 5.825, + 4.121, 3.633, 1.801, 0.012, 0.009, 0.029, 1.289, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 0.124, 2.988, 0.003, 0.002, 0.001, 0.006, 0.331, 0.001, + 0.002, 0.001, 0.0001, 0.001, 0.015, 0.083, 0.0001, 0.001, 0.001, 0.001, + 0.007, 1.174, 0.07, 0.0001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, + 0.005, 0.012, 0.009, 0.001, 0.06, 0.627, 0.004, 0.097, 0.002, 0.001, + 0.001, 0.001, 0.001, 0.002, 0.006, 1.565, 0.0001, 0.002, 0.0001, 0.0001, + 0.01, 0.002, 0.005, 0.002, 0.002, 0.005, 0.01, 0.106, 0.006, 0.002, + 0.003, 0.01, 0.298, 0.012, 0.176, 0.002, 0.0001, 0.0001, 0.03, 0.013, + 6.068, 1.452, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.002, 0.051, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.11, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + et: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.183, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.759, 0.003, 0.281, 0.0001, + 0.0001, 0.013, 0.001, 0.037, 0.198, 0.199, 0.001, 0.003, 0.786, 0.203, + 1.175, 0.017, 0.35, 0.548, 0.272, 0.142, 0.137, 0.143, 0.127, 0.129, + 0.154, 0.323, 0.059, 0.022, 0.017, 0.003, 0.017, 0.003, 0.0001, 0.235, + 0.096, 0.074, 0.061, 0.173, 0.056, 0.064, 0.105, 0.122, 0.088, 0.255, + 0.166, 0.186, 0.114, 0.065, 0.208, 0.003, 0.138, 0.296, 0.251, 0.046, + 0.167, 0.033, 0.011, 0.008, 0.01, 0.008, 0.0001, 0.008, 0.0001, 0.004, + 0.0001, 9.665, 0.664, 0.152, 2.822, 7.678, 0.189, 1.393, 1.095, 7.816, + 1.25, 3.234, 4.738, 2.585, 4.03, 3.549, 1.167, 0.005, 3.003, 6.68, + 5.333, 4.153, 1.613, 0.043, 0.017, 0.074, 0.045, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.13, 0.015, 0.01, 0.006, 0.004, 0.003, 0.003, 0.004, + 0.002, 0.002, 0.001, 0.002, 0.003, 0.005, 0.001, 0.003, 0.002, 0.002, + 0.003, 0.102, 0.002, 0.008, 0.003, 0.003, 0.002, 0.004, 0.002, 0.001, + 0.044, 0.005, 0.006, 0.003, 0.016, 0.035, 0.003, 0.002, 0.833, 0.002, + 0.001, 0.002, 0.002, 0.01, 0.001, 0.006, 0.001, 0.005, 0.001, 0.001, + 0.017, 0.004, 0.012, 0.007, 0.005, 0.763, 0.179, 0.003, 0.015, 0.005, + 0.008, 0.007, 0.518, 0.012, 0.028, 0.003, 0.0001, 0.0001, 0.02, 2.358, + 0.019, 0.061, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.009, 0.004, 0.104, 0.037, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.004, 0.123, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + hi: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.374, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.123, 0.002, 0.071, 0.0001, + 0.001, 0.004, 0.0001, 0.023, 0.08, 0.08, 0.0001, 0.001, 0.255, 0.072, + 0.052, 0.006, 0.068, 0.07, 0.044, 0.02, 0.019, 0.023, 0.019, 0.019, + 0.021, 0.04, 0.021, 0.006, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.008, + 0.004, 0.007, 0.004, 0.005, 0.003, 0.004, 0.003, 0.006, 0.001, 0.002, + 0.003, 0.005, 0.004, 0.003, 0.005, 0.0001, 0.003, 0.008, 0.005, 0.002, + 0.002, 0.002, 0.001, 0.001, 0.001, 0.007, 0.0001, 0.008, 0.0001, 0.001, + 0.0001, 0.049, 0.007, 0.017, 0.016, 0.052, 0.008, 0.01, 0.017, 0.038, + 0.001, 0.004, 0.024, 0.015, 0.034, 0.035, 0.012, 0.001, 0.033, 0.03, + 0.034, 0.015, 0.005, 0.005, 0.002, 0.008, 0.001, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 1.039, 0.443, 1.278, 0.061, 0.0001, 0.273, 0.146, 1.879, + 0.535, 0.214, 0.013, 0.729, 0.054, 1.826, 0.0001, 0.253, 0.014, 0.012, + 0.0001, 0.042, 0.14, 2.07, 0.133, 0.43, 0.035, 0.004, 0.215, 0.046, + 0.503, 0.014, 0.016, 0.269, 0.037, 0.213, 0.023, 0.155, 24.777, 7.162, + 0.554, 0.224, 1.23, 0.009, 0.8, 0.117, 0.393, 0.245, 0.995, 0.828, + 2.018, 0.001, 0.771, 0.001, 0.001, 0.707, 0.299, 0.18, 1.226, 0.94, + 0.0001, 0.0001, 0.133, 0.001, 2.558, 1.303, 0.0001, 0.0001, 0.008, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 30.261, 0.0001, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], }; const EXTENSIVE_LANG_FREQS = Object.assign({}, COMMON_LANG_FREQS, { - "aa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.161, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.548, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.452, 0.645, 0.645, 2.581, 9.032, 0.0001, 5.161, 3.871, 5.806, 0.0001, 1.935, 2.581, 1.29, 5.161, 2.581, 1.29, 0.0001, 4.516, 0.645, 3.226, 0.645, 0.0001, 1.29, 0.0001, 0.645, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.581, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.871, 0.645, 2.581, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ab": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.925, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.477, 0.003, 0.06, 0.0001, 0.0001, 0.005, 0.0001, 0.013, 0.269, 0.273, 0.001, 0.001, 0.518, 0.306, 0.76, 0.006, 0.291, 0.709, 0.42, 0.294, 0.242, 0.237, 0.242, 0.222, 0.25, 0.32, 0.04, 0.028, 0.008, 0.0001, 0.008, 0.002, 0.0001, 0.004, 0.004, 0.004, 0.006, 0.001, 0.002, 0.001, 0.001, 0.033, 0.012, 0.001, 0.001, 0.002, 0.001, 0.011, 0.003, 0.0001, 0.002, 0.009, 0.002, 0.002, 0.007, 0.006, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.679, 0.013, 0.02, 0.028, 0.073, 0.002, 0.006, 0.01, 0.057, 0.001, 0.005, 0.035, 0.039, 0.025, 0.031, 0.027, 0.011, 0.045, 0.036, 0.027, 0.037, 0.009, 0.002, 0.01, 0.027, 0.004, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 3.029, 1.109, 1.569, 1.131, 0.085, 0.805, 0.262, 0.083, 0.992, 0.002, 0.003, 2.495, 0.791, 0.003, 0.006, 0.03, 0.654, 0.059, 0.04, 0.137, 0.332, 0.075, 0.041, 0.012, 0.142, 2.586, 0.087, 1.002, 0.086, 0.047, 0.045, 0.323, 0.073, 0.328, 0.016, 0.067, 0.011, 0.052, 0.054, 0.455, 0.024, 0.199, 0.0001, 0.026, 0.015, 0.539, 0.001, 0.001, 7.771, 0.517, 0.209, 1.034, 0.683, 1.368, 0.238, 0.686, 3.093, 0.042, 0.729, 1.305, 0.754, 1.868, 1.136, 0.676, 0.0001, 0.0001, 0.065, 0.019, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.001, 0.155, 0.0001, 0.005, 0.002, 22.83, 11.878, 3.39, 2.86, 0.019, 0.007, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.386, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ace": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.36, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.198, 0.0001, 0.137, 0.0001, 0.001, 0.007, 0.0001, 0.256, 0.125, 0.125, 0.0001, 0.0001, 1.042, 0.179, 1.302, 0.01, 0.401, 0.568, 0.284, 0.118, 0.113, 0.112, 0.099, 0.093, 0.097, 0.13, 0.041, 0.007, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.777, 0.587, 0.153, 0.133, 0.028, 0.036, 0.256, 0.095, 0.205, 0.159, 0.483, 0.331, 0.444, 0.183, 0.028, 0.481, 0.019, 0.179, 0.473, 0.324, 0.101, 0.026, 0.042, 0.006, 0.021, 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 11.224, 1.773, 0.851, 1.583, 5.304, 0.086, 3.693, 3.458, 3.728, 0.528, 2.425, 2.037, 2.4, 8.165, 2.618, 1.607, 0.015, 2.485, 1.74, 2.806, 6.018, 0.112, 0.344, 0.01, 1.486, 0.04, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.039, 0.008, 0.005, 0.009, 0.016, 0.007, 0.006, 0.006, 0.01, 0.004, 0.008, 0.003, 0.002, 0.004, 0.012, 0.004, 0.007, 0.003, 0.004, 0.014, 0.002, 0.001, 0.001, 0.002, 0.004, 0.016, 0.001, 0.001, 0.002, 0.002, 0.001, 0.007, 0.007, 0.006, 0.003, 0.008, 0.005, 0.002, 0.001, 0.019, 1.193, 0.401, 0.007, 0.574, 0.003, 0.006, 0.002, 0.006, 0.025, 0.011, 0.006, 0.008, 0.873, 0.004, 0.151, 0.002, 0.005, 0.005, 0.008, 0.007, 0.004, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.025, 3.205, 0.014, 0.012, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.001, 0.012, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.061, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.011, 0.039, 0.001, 0.001, 0.005, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ady": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.142, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.359, 0.001, 0.089, 0.0001, 0.0001, 0.003, 0.0001, 0.006, 0.111, 0.11, 0.001, 0.001, 0.645, 0.309, 0.862, 0.007, 0.118, 0.279, 0.082, 0.059, 0.052, 0.055, 0.051, 0.045, 0.057, 0.071, 0.053, 0.011, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.008, 0.007, 0.003, 0.003, 0.002, 0.003, 0.0001, 0.002, 1.228, 0.004, 0.001, 0.003, 0.004, 0.002, 0.004, 0.005, 0.0001, 0.001, 0.006, 0.003, 0.002, 0.004, 0.002, 0.008, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.001, 0.0001, 0.05, 0.009, 0.016, 0.02, 0.067, 0.009, 0.011, 0.022, 0.046, 0.001, 0.006, 0.031, 0.02, 0.036, 0.037, 0.013, 0.0001, 0.038, 0.031, 0.043, 0.016, 0.004, 0.008, 0.003, 0.011, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.778, 0.778, 1.192, 2.098, 0.406, 1.886, 0.203, 0.188, 0.585, 0.672, 2.887, 2.927, 0.717, 6.004, 0.019, 0.21, 0.317, 0.122, 0.019, 0.226, 0.145, 0.045, 0.02, 0.041, 0.09, 0.005, 0.262, 0.059, 0.092, 0.079, 0.053, 0.07, 0.076, 0.092, 0.086, 0.055, 0.029, 0.124, 0.039, 0.031, 0.045, 0.011, 0.0001, 0.031, 0.0001, 0.018, 0.005, 0.018, 2.762, 0.645, 0.171, 1.681, 0.855, 1.134, 0.39, 0.89, 1.618, 0.147, 1.755, 1.169, 1.845, 1.192, 0.989, 0.792, 0.0001, 0.0001, 0.094, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.0001, 0.003, 0.004, 0.0001, 0.0001, 20.033, 23.044, 0.001, 0.227, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.229, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "af": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.732, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.494, 0.002, 0.361, 0.0001, 0.001, 0.008, 0.001, 0.297, 0.136, 0.136, 0.002, 0.001, 0.651, 0.269, 0.893, 0.01, 0.25, 0.371, 0.17, 0.095, 0.09, 0.104, 0.09, 0.086, 0.122, 0.213, 0.049, 0.019, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.241, 0.154, 0.103, 0.382, 0.093, 0.072, 0.119, 0.168, 0.14, 0.087, 0.137, 0.088, 0.157, 0.131, 0.103, 0.129, 0.004, 0.104, 0.29, 0.11, 0.03, 0.115, 0.083, 0.006, 0.008, 0.015, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 6.202, 1.128, 0.17, 4.12, 13.284, 0.609, 2.484, 1.201, 6.602, 0.17, 2.299, 2.976, 1.671, 6.221, 4.571, 1.147, 0.006, 5.197, 4.908, 4.263, 1.7, 1.691, 1.336, 0.018, 0.832, 0.043, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.182, 0.005, 0.004, 0.003, 0.002, 0.001, 0.001, 0.001, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.024, 0.002, 0.001, 0.001, 0.001, 0.003, 0.118, 0.001, 0.001, 0.017, 0.016, 0.001, 0.001, 0.076, 0.018, 0.001, 0.005, 0.004, 0.002, 0.002, 0.003, 0.003, 0.032, 0.053, 0.119, 0.001, 0.004, 0.001, 0.014, 0.007, 0.003, 0.004, 0.007, 0.002, 0.003, 0.005, 0.001, 0.005, 0.002, 0.003, 0.003, 0.007, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.084, 0.264, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.003, 0.001, 0.0001, 0.009, 0.004, 0.022, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.181, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ak": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.856, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.14, 0.001, 0.181, 0.0001, 0.002, 0.004, 0.001, 0.124, 0.134, 0.137, 0.001, 0.0001, 0.719, 0.119, 1.218, 0.014, 0.179, 0.257, 0.137, 0.052, 0.061, 0.075, 0.065, 0.054, 0.059, 0.197, 0.031, 0.029, 0.002, 0.015, 0.002, 0.018, 0.0001, 0.566, 0.167, 0.173, 0.118, 0.172, 0.085, 0.258, 0.093, 0.098, 0.056, 0.193, 0.111, 0.204, 0.399, 0.102, 0.121, 0.012, 0.083, 0.271, 0.145, 0.084, 0.04, 0.206, 0.011, 0.078, 0.02, 0.025, 0.0001, 0.025, 0.0001, 0.0001, 0.0001, 10.911, 1.752, 0.404, 1.704, 5.791, 1.18, 0.501, 1.542, 4.479, 0.04, 1.975, 0.667, 3.211, 7.434, 5.302, 0.888, 0.03, 2.693, 2.695, 1.838, 2.674, 0.126, 2.695, 0.023, 2.4, 0.077, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.046, 0.01, 0.002, 0.005, 0.002, 0.006, 0.095, 0.003, 0.01, 0.003, 0.006, 0.011, 0.002, 0.017, 0.002, 0.004, 0.052, 0.011, 0.001, 0.002, 1.774, 0.002, 0.002, 0.001, 0.0001, 0.02, 0.0001, 1.749, 0.01, 0.01, 0.0001, 0.0001, 0.151, 0.004, 0.001, 0.002, 0.006, 0.022, 0.001, 0.003, 0.005, 0.01, 0.002, 0.003, 0.002, 0.005, 0.001, 0.003, 0.01, 0.006, 0.005, 0.012, 0.015, 0.552, 0.007, 0.003, 0.008, 0.006, 0.006, 0.392, 0.013, 0.005, 0.007, 0.004, 0.0001, 0.0001, 0.146, 0.054, 0.004, 0.004, 0.139, 0.0001, 0.0001, 3.532, 0.002, 0.008, 0.003, 0.34, 0.547, 0.0001, 0.045, 0.018, 0.0001, 0.0001, 0.018, 0.055, 0.008, 0.002, 0.016, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.048, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "als": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.981, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.805, 0.003, 0.368, 0.0001, 0.0001, 0.09, 0.001, 0.06, 0.177, 0.177, 0.009, 0.001, 0.909, 0.215, 1.001, 0.022, 0.318, 0.46, 0.232, 0.128, 0.122, 0.132, 0.116, 0.119, 0.142, 0.206, 0.063, 0.024, 0.004, 0.003, 0.004, 0.001, 0.0001, 0.315, 0.452, 0.163, 0.512, 0.205, 0.236, 0.319, 0.219, 0.188, 0.156, 0.222, 0.212, 0.32, 0.172, 0.112, 0.199, 0.01, 0.225, 0.653, 0.132, 0.131, 0.173, 0.23, 0.004, 0.019, 0.129, 0.009, 0.0001, 0.009, 0.0001, 0.003, 0.001, 3.964, 1.276, 2.626, 3.453, 8.363, 1.057, 2.308, 3.744, 6.377, 0.069, 0.66, 2.78, 2.213, 4.452, 3.12, 0.516, 0.012, 5.572, 4.629, 4.341, 2.669, 0.935, 0.979, 0.046, 0.315, 0.925, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.124, 0.003, 0.002, 0.002, 0.034, 0.001, 0.001, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.023, 0.002, 0.001, 0.01, 0.001, 0.003, 0.02, 0.003, 0.002, 0.048, 0.001, 0.034, 0.042, 0.156, 0.005, 0.005, 0.003, 1.018, 0.003, 0.001, 0.003, 0.354, 0.039, 0.002, 0.022, 0.079, 0.004, 0.001, 0.002, 0.004, 0.003, 0.015, 0.003, 0.029, 0.017, 0.333, 0.001, 0.002, 0.045, 0.004, 0.015, 0.5, 0.004, 0.001, 0.002, 0.0001, 0.0001, 0.108, 2.635, 0.006, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.011, 0.005, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.12, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "am": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.067, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.441, 0.005, 0.08, 0.001, 0.0001, 0.003, 0.0001, 0.013, 0.12, 0.121, 0.002, 0.001, 0.021, 0.111, 0.25, 0.041, 0.102, 0.167, 0.089, 0.049, 0.044, 0.048, 0.044, 0.043, 0.057, 0.081, 0.018, 0.001, 0.048, 0.019, 0.048, 0.008, 0.0001, 0.009, 0.005, 0.007, 0.005, 0.005, 0.004, 0.003, 0.003, 0.004, 0.004, 0.002, 0.003, 0.006, 0.003, 0.002, 0.004, 0.001, 0.003, 0.007, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.017, 0.0001, 0.02, 0.0001, 0.007, 0.0001, 0.059, 0.06, 0.021, 0.018, 0.066, 0.009, 0.014, 0.02, 0.05, 0.001, 0.005, 0.029, 0.021, 0.042, 0.045, 0.014, 0.001, 0.09, 0.032, 0.04, 0.026, 0.005, 0.007, 0.003, 0.012, 0.002, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.402, 0.178, 0.052, 0.194, 0.053, 0.478, 0.259, 0.003, 10.51, 5.557, 5.996, 6.414, 2.305, 3.741, 0.258, 0.015, 0.706, 0.091, 0.071, 0.613, 0.064, 1.598, 0.107, 0.008, 0.907, 0.126, 0.312, 0.688, 0.12, 0.989, 0.129, 0.009, 2.006, 0.213, 0.679, 0.599, 0.206, 1.204, 0.134, 0.012, 1.72, 0.213, 0.231, 1.059, 0.087, 1.793, 0.284, 0.013, 1.151, 0.255, 0.312, 0.726, 0.115, 2.127, 0.177, 0.025, 0.19, 0.059, 0.032, 0.208, 0.015, 0.466, 0.016, 0.003, 0.0001, 0.0001, 0.096, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.005, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.017, 0.046, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 29.467, 0.047, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.001, 0.0001, 0.017, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "an": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.253, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.49, 0.005, 0.725, 0.0001, 0.0001, 0.005, 0.001, 0.998, 0.246, 0.246, 0.002, 0.002, 1.083, 0.164, 0.685, 0.057, 0.291, 0.382, 0.213, 0.125, 0.12, 0.124, 0.115, 0.119, 0.131, 0.221, 0.057, 0.029, 0.007, 0.01, 0.006, 0.001, 0.0001, 0.411, 0.169, 0.298, 0.091, 0.216, 0.095, 0.1, 0.059, 0.154, 0.037, 0.024, 0.177, 0.199, 0.072, 0.146, 0.19, 0.011, 0.122, 0.227, 0.128, 0.065, 0.101, 0.021, 0.037, 0.032, 0.028, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 9.483, 1.074, 3.3, 3.436, 7.765, 0.618, 0.822, 0.72, 5.365, 0.027, 0.17, 3.124, 1.916, 5.869, 6.23, 1.654, 0.435, 4.741, 4.813, 3.981, 2.96, 0.573, 0.028, 0.256, 1.248, 0.309, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.014, 0.007, 0.003, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.002, 0.028, 0.174, 0.002, 0.002, 0.003, 0.001, 0.001, 0.008, 0.012, 0.227, 0.002, 0.014, 0.002, 0.209, 0.001, 0.002, 0.004, 0.013, 0.086, 0.54, 0.002, 0.002, 0.003, 0.002, 0.004, 0.002, 0.027, 0.014, 0.019, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.127, 1.249, 0.007, 0.007, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.009, 0.005, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.013, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ang": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.542, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.629, 0.001, 0.406, 0.001, 0.001, 0.005, 0.001, 0.041, 0.166, 0.166, 0.001, 0.001, 0.772, 0.085, 0.973, 0.007, 0.229, 0.292, 0.152, 0.081, 0.082, 0.095, 0.083, 0.089, 0.101, 0.139, 0.058, 0.032, 0.011, 0.001, 0.011, 0.001, 0.0001, 0.204, 0.193, 0.317, 0.089, 0.179, 0.148, 0.229, 0.279, 0.189, 0.034, 0.031, 0.128, 0.195, 0.168, 0.087, 0.103, 0.007, 0.125, 0.419, 0.122, 0.043, 0.034, 0.145, 0.006, 0.012, 0.007, 0.02, 0.0001, 0.02, 0.0001, 0.0001, 0.0001, 5.666, 0.997, 2.318, 3.22, 8.139, 1.491, 2.061, 1.574, 3.89, 0.022, 0.109, 2.731, 2.332, 6.4, 3.389, 0.62, 0.014, 4.435, 4.532, 3.015, 1.701, 0.127, 1.341, 0.09, 0.658, 0.04, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.032, 0.62, 0.006, 0.006, 0.004, 0.003, 0.052, 0.002, 0.001, 0.001, 0.002, 0.033, 0.008, 0.478, 0.002, 0.002, 0.01, 0.003, 0.05, 1.069, 0.004, 0.001, 0.004, 0.002, 0.003, 0.003, 0.011, 0.012, 0.009, 0.068, 0.141, 0.003, 0.009, 0.037, 0.013, 0.751, 0.006, 0.002, 1.085, 0.003, 0.002, 0.01, 0.039, 0.996, 0.002, 0.008, 0.002, 0.002, 0.371, 0.007, 0.005, 0.069, 0.002, 0.003, 0.002, 0.008, 0.006, 0.003, 0.005, 0.004, 0.005, 0.004, 2.003, 0.078, 0.0001, 0.0001, 0.009, 3.7, 2.566, 0.742, 0.075, 0.766, 0.127, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.012, 0.006, 0.017, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.024, 0.022, 0.003, 0.001, 0.003, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "arc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.038, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.39, 0.001, 0.055, 0.0001, 0.0001, 0.007, 0.0001, 0.005, 0.294, 0.294, 0.0001, 0.0001, 0.039, 0.041, 0.295, 0.017, 0.207, 0.161, 0.078, 0.046, 0.044, 0.053, 0.042, 0.044, 0.043, 0.091, 0.189, 0.006, 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.01, 0.01, 0.013, 0.007, 0.004, 0.004, 0.006, 0.005, 0.007, 0.003, 0.005, 0.008, 0.011, 0.008, 0.004, 0.008, 0.001, 0.007, 0.013, 0.004, 0.003, 0.005, 0.004, 0.001, 0.001, 0.002, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.107, 0.013, 0.023, 0.039, 0.088, 0.011, 0.022, 0.025, 0.081, 0.003, 0.021, 0.05, 0.023, 0.07, 0.066, 0.018, 0.002, 0.062, 0.042, 0.051, 0.032, 0.013, 0.011, 0.006, 0.012, 0.006, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.359, 0.027, 0.139, 0.022, 0.095, 0.021, 0.095, 0.051, 0.776, 0.005, 0.029, 0.002, 0.032, 0.003, 0.011, 0.005, 6.959, 0.008, 1.918, 0.561, 0.013, 2.47, 0.003, 1.261, 3.75, 0.282, 0.787, 0.504, 0.018, 4.683, 0.009, 0.786, 1.796, 2.249, 2.761, 0.874, 0.009, 1.007, 0.747, 0.053, 0.199, 0.858, 2.538, 1.15, 2.879, 0.016, 0.009, 0.021, 0.023, 0.056, 0.023, 0.019, 0.01, 0.046, 0.007, 0.011, 0.024, 0.035, 0.015, 0.012, 0.048, 0.023, 0.008, 0.047, 0.0001, 0.0001, 0.004, 0.019, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.832, 0.001, 0.126, 0.053, 0.042, 0.017, 0.001, 0.0001, 0.0001, 0.009, 0.024, 0.108, 0.212, 0.141, 0.001, 0.004, 41.501, 0.031, 0.0001, 0.0001, 0.002, 0.019, 0.018, 0.0001, 0.001, 0.004, 0.004, 0.0001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "arz": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.739, 0.003, 0.126, 0.0001, 0.0001, 0.004, 0.001, 0.003, 0.118, 0.124, 0.002, 0.001, 0.064, 0.045, 0.405, 0.01, 0.141, 0.269, 0.129, 0.067, 0.063, 0.072, 0.064, 0.065, 0.08, 0.165, 0.039, 0.002, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.012, 0.009, 0.011, 0.008, 0.005, 0.005, 0.005, 0.006, 0.006, 0.005, 0.004, 0.009, 0.011, 0.005, 0.003, 0.007, 0.0001, 0.006, 0.013, 0.009, 0.001, 0.004, 0.004, 0.001, 0.001, 0.001, 0.006, 0.001, 0.006, 0.0001, 0.002, 0.0001, 0.091, 0.01, 0.025, 0.026, 0.093, 0.01, 0.015, 0.024, 0.072, 0.002, 0.01, 0.045, 0.023, 0.064, 0.06, 0.013, 0.001, 0.06, 0.046, 0.047, 0.027, 0.009, 0.007, 0.004, 0.017, 0.005, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.111, 1.136, 0.763, 1.043, 4.458, 2.752, 2.413, 1.721, 2.708, 1.077, 3.156, 0.021, 0.238, 0.002, 0.017, 0.028, 0.008, 0.018, 0.006, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.003, 0.003, 0.004, 0.0001, 0.003, 0.019, 0.06, 0.018, 0.274, 0.041, 0.116, 0.08, 6.51, 1.771, 0.79, 1.749, 0.151, 0.593, 0.743, 0.294, 1.313, 0.079, 2.202, 0.292, 1.274, 0.493, 0.453, 0.187, 0.361, 0.078, 1.267, 0.19, 0.005, 0.002, 0.002, 0.011, 0.002, 0.0001, 0.0001, 0.025, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.004, 0.01, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.004, 21.565, 21.383, 0.022, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.029, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "as": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.296, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.811, 0.001, 0.086, 0.0001, 0.0001, 0.005, 0.0001, 0.083, 0.075, 0.077, 0.0001, 0.001, 0.203, 0.086, 0.044, 0.006, 0.008, 0.009, 0.006, 0.004, 0.003, 0.003, 0.002, 0.002, 0.003, 0.004, 0.022, 0.007, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.015, 0.009, 0.013, 0.007, 0.006, 0.005, 0.005, 0.006, 0.011, 0.003, 0.003, 0.005, 0.01, 0.007, 0.004, 0.011, 0.001, 0.008, 0.013, 0.013, 0.003, 0.002, 0.004, 0.0001, 0.001, 0.001, 0.01, 0.0001, 0.01, 0.0001, 0.001, 0.0001, 0.213, 0.031, 0.074, 0.083, 0.255, 0.044, 0.045, 0.095, 0.18, 0.004, 0.017, 0.099, 0.058, 0.166, 0.164, 0.046, 0.002, 0.151, 0.14, 0.179, 0.063, 0.023, 0.027, 0.005, 0.036, 0.003, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.537, 0.769, 0.261, 0.102, 0.001, 0.242, 0.382, 1.586, 0.215, 0.133, 0.002, 0.429, 0.033, 1.928, 0.026, 0.213, 0.004, 0.0001, 0.0001, 0.14, 0.003, 1.299, 0.21, 0.401, 0.056, 0.073, 0.394, 0.328, 0.382, 0.006, 0.051, 0.353, 0.081, 0.128, 0.02, 0.231, 1.75, 0.525, 21.552, 9.182, 1.32, 0.031, 0.846, 0.112, 0.982, 0.29, 0.858, 1.027, 2.855, 0.297, 0.931, 0.0001, 0.0001, 0.0001, 0.293, 0.318, 0.674, 0.559, 0.001, 0.0001, 0.584, 0.0001, 2.717, 1.766, 0.0001, 0.0001, 0.009, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.161, 0.0001, 0.072, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ast": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.724, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.007, 0.002, 0.424, 0.002, 0.001, 0.01, 0.003, 0.548, 0.156, 0.156, 0.002, 0.003, 1.046, 0.096, 0.743, 0.015, 0.245, 0.288, 0.158, 0.086, 0.078, 0.093, 0.076, 0.077, 0.093, 0.166, 0.056, 0.032, 0.002, 0.005, 0.002, 0.002, 0.0001, 0.218, 0.121, 0.236, 0.117, 0.257, 0.089, 0.088, 0.078, 0.115, 0.051, 0.038, 0.23, 0.167, 0.117, 0.051, 0.161, 0.007, 0.094, 0.198, 0.134, 0.043, 0.06, 0.041, 0.061, 0.037, 0.011, 0.014, 0.0001, 0.014, 0.0001, 0.001, 0.0001, 8.074, 0.835, 3.151, 3.345, 9.578, 0.701, 0.803, 0.452, 5.046, 0.025, 0.11, 4.637, 2.087, 5.542, 5.253, 1.877, 0.488, 4.828, 5.384, 3.477, 3.909, 0.672, 0.055, 0.4, 0.967, 0.259, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.04, 0.01, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.01, 0.01, 0.001, 0.0001, 0.001, 0.002, 0.009, 0.001, 0.001, 0.005, 0.006, 0.0001, 0.001, 0.026, 0.531, 0.001, 0.001, 0.002, 0.001, 0.002, 0.002, 0.002, 0.291, 0.001, 0.019, 0.001, 0.46, 0.001, 0.001, 0.005, 0.157, 0.004, 0.608, 0.002, 0.002, 0.003, 0.002, 0.004, 0.002, 0.119, 0.021, 0.027, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.073, 2.207, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.012, 0.005, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.039, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "atj": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.34, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.835, 0.0001, 0.034, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.045, 0.047, 0.0001, 0.0001, 0.548, 0.045, 1.11, 0.006, 0.039, 0.075, 0.033, 0.013, 0.017, 0.015, 0.02, 0.018, 0.017, 0.061, 0.024, 0.003, 0.015, 0.0001, 0.015, 0.002, 0.0001, 0.175, 0.012, 0.062, 0.025, 0.193, 0.022, 0.01, 0.006, 0.035, 0.021, 0.212, 0.019, 0.332, 0.208, 0.141, 0.099, 0.007, 0.017, 0.034, 0.12, 0.001, 0.003, 0.089, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 11.805, 0.044, 6.264, 0.083, 5.028, 0.008, 0.026, 0.952, 15.443, 0.004, 9.886, 0.134, 2.846, 5.167, 5.337, 2.131, 0.022, 2.079, 2.27, 7.277, 0.131, 0.025, 4.581, 0.005, 0.015, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.009, 0.046, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.069, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "av": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.031, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.23, 0.001, 0.083, 0.0001, 0.0001, 0.007, 0.001, 0.001, 0.166, 0.166, 0.001, 0.001, 0.458, 0.25, 0.562, 0.01, 0.133, 0.234, 0.149, 0.084, 0.058, 0.065, 0.053, 0.053, 0.06, 0.094, 0.055, 0.017, 0.001, 0.003, 0.001, 0.003, 0.0001, 0.011, 0.006, 0.01, 0.003, 0.003, 0.003, 0.003, 0.002, 0.777, 0.001, 0.002, 0.002, 0.006, 0.003, 0.003, 0.002, 0.0001, 0.002, 0.007, 0.008, 0.003, 0.006, 0.001, 0.011, 0.001, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.009, 0.0001, 0.075, 0.008, 0.02, 0.025, 0.067, 0.007, 0.015, 0.018, 0.067, 0.001, 0.008, 0.038, 0.014, 0.043, 0.038, 0.019, 0.001, 0.041, 0.043, 0.036, 0.031, 0.01, 0.006, 0.003, 0.01, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.671, 1.227, 0.995, 2.675, 0.059, 0.905, 0.851, 0.335, 0.128, 0.084, 1.771, 0.03, 0.884, 0.039, 0.044, 0.818, 0.134, 0.075, 0.027, 0.273, 0.227, 0.015, 0.029, 0.016, 0.039, 0.006, 0.125, 0.043, 0.127, 0.032, 0.014, 0.032, 0.185, 0.089, 0.062, 0.016, 0.021, 0.082, 0.047, 0.033, 0.042, 0.006, 0.002, 0.039, 0.002, 0.019, 0.005, 0.013, 7.089, 1.927, 0.825, 1.964, 1.317, 1.929, 0.263, 0.636, 2.852, 0.187, 1.471, 3.734, 0.878, 1.983, 1.647, 0.208, 0.0001, 0.0001, 0.195, 0.006, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.022, 0.0001, 0.001, 0.0001, 30.778, 12.343, 0.0001, 0.534, 0.0001, 0.002, 0.0001, 0.001, 0.025, 0.022, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.177, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ay": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.588, 0.005, 0.247, 0.0001, 0.0001, 0.0001, 0.027, 1.72, 0.603, 0.602, 0.046, 0.001, 1.21, 0.158, 1.031, 0.021, 0.387, 0.817, 0.515, 0.316, 0.306, 0.36, 0.273, 0.279, 0.341, 0.428, 0.504, 0.129, 0.064, 0.005, 0.064, 0.147, 0.0001, 0.442, 0.126, 0.339, 0.185, 0.072, 0.071, 0.077, 0.1, 0.109, 0.302, 0.254, 0.268, 0.282, 0.145, 0.064, 0.43, 0.127, 0.121, 0.288, 0.2, 0.25, 0.05, 0.191, 0.012, 0.11, 0.013, 0.007, 0.0001, 0.008, 0.0001, 0.002, 0.004, 14.491, 0.243, 1.49, 0.745, 1.57, 0.085, 0.27, 2.104, 6.268, 1.613, 3.058, 2.342, 2.397, 3.14, 1.316, 1.65, 1.821, 3.874, 4.07, 2.906, 5.224, 0.153, 1.248, 0.859, 2.145, 0.119, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.211, 0.009, 0.003, 0.004, 0.002, 0.001, 0.002, 0.002, 0.003, 0.002, 0.001, 0.002, 0.002, 0.003, 0.002, 0.002, 0.004, 0.008, 0.001, 0.016, 0.006, 0.002, 0.001, 0.001, 0.005, 0.126, 0.002, 0.002, 0.008, 0.019, 0.001, 0.001, 0.061, 0.068, 0.001, 0.003, 0.22, 0.002, 0.002, 0.004, 0.004, 0.062, 0.002, 0.003, 0.001, 0.11, 0.003, 0.049, 0.044, 0.259, 0.029, 0.076, 0.026, 0.004, 0.004, 0.007, 0.009, 0.003, 0.038, 0.01, 0.012, 0.003, 0.005, 0.006, 0.0001, 0.0001, 0.133, 0.88, 0.003, 0.004, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.006, 0.002, 0.031, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.004, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.01, 0.003, 0.207, 0.001, 0.004, 0.008, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "az": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.803, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.785, 0.003, 0.222, 0.0001, 0.001, 0.009, 0.001, 0.007, 0.139, 0.141, 0.001, 0.002, 0.64, 0.404, 0.91, 0.014, 0.244, 0.339, 0.188, 0.096, 0.09, 0.102, 0.087, 0.087, 0.102, 0.202, 0.038, 0.019, 0.004, 0.002, 0.004, 0.004, 0.0001, 0.276, 0.242, 0.068, 0.094, 0.057, 0.061, 0.057, 0.095, 0.062, 0.008, 0.127, 0.055, 0.202, 0.081, 0.086, 0.077, 0.107, 0.098, 0.172, 0.115, 0.037, 0.055, 0.005, 0.062, 0.066, 0.023, 0.006, 0.0001, 0.006, 0.0001, 0.004, 0.001, 7.007, 1.378, 0.673, 3.497, 1.722, 0.535, 0.389, 0.748, 6.853, 0.041, 1.544, 4.525, 2.336, 5.203, 1.602, 0.396, 1.07, 4.974, 2.444, 2.338, 1.812, 1.06, 0.008, 0.478, 1.947, 0.87, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.147, 0.01, 0.009, 0.005, 0.005, 0.009, 0.003, 0.033, 0.002, 0.001, 0.001, 0.003, 0.002, 0.001, 0.002, 0.082, 0.004, 0.001, 0.002, 0.028, 0.04, 0.001, 0.012, 0.001, 0.002, 6.259, 0.001, 0.001, 0.046, 0.034, 0.075, 1.454, 0.026, 0.003, 0.003, 0.001, 0.001, 0.001, 0.001, 0.485, 0.001, 0.001, 0.001, 0.011, 0.002, 0.016, 0.001, 0.001, 0.187, 2.533, 0.009, 0.004, 0.005, 0.028, 0.457, 0.003, 0.014, 0.003, 0.01, 0.017, 1.158, 0.011, 0.03, 0.004, 0.0001, 0.0001, 0.067, 2.145, 2.985, 1.196, 0.079, 0.0001, 0.0001, 6.24, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.207, 0.052, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.001, 0.008, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.14, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "azb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.225, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.112, 0.002, 0.032, 0.0001, 0.0001, 0.003, 0.0001, 0.002, 0.275, 0.275, 0.002, 0.001, 0.028, 0.165, 0.744, 0.053, 0.037, 0.078, 0.041, 0.038, 0.027, 0.033, 0.024, 0.023, 0.03, 0.03, 0.059, 0.003, 0.004, 0.001, 0.003, 0.0001, 0.0001, 0.005, 0.004, 0.007, 0.004, 0.002, 0.002, 0.002, 0.003, 0.008, 0.002, 0.002, 0.004, 0.004, 0.003, 0.001, 0.007, 0.001, 0.004, 0.011, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.022, 0.0001, 0.096, 0.009, 0.017, 0.038, 0.09, 0.012, 0.02, 0.043, 0.1, 0.0001, 0.026, 0.053, 0.017, 0.052, 0.064, 0.04, 0.001, 0.055, 0.055, 0.106, 0.015, 0.003, 0.052, 0.004, 0.018, 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.77, 0.455, 0.528, 0.028, 2.648, 1.417, 3.922, 1.536, 3.205, 0.004, 0.23, 0.004, 7.975, 0.001, 0.011, 0.01, 0.002, 0.06, 0.27, 0.013, 0.004, 0.001, 0.0001, 0.0001, 0.033, 0.002, 0.0001, 0.023, 0.001, 0.001, 0.0001, 0.002, 0.02, 0.007, 0.378, 0.004, 0.281, 0.002, 0.413, 5.027, 1.244, 0.85, 1.199, 0.132, 0.444, 0.158, 0.386, 2.668, 0.253, 3.47, 0.613, 1.73, 0.767, 0.17, 0.092, 0.269, 0.09, 0.326, 0.153, 0.08, 0.001, 0.001, 0.271, 0.002, 0.0001, 0.0001, 0.181, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 18.661, 14.13, 1.511, 8.604, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.763, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ba": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.692, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.933, 0.002, 0.044, 0.0001, 0.0001, 0.005, 0.0001, 0.001, 0.147, 0.147, 0.0001, 0.004, 0.482, 0.143, 0.604, 0.015, 0.158, 0.244, 0.135, 0.077, 0.08, 0.076, 0.061, 0.06, 0.081, 0.125, 0.052, 0.011, 0.008, 0.003, 0.008, 0.001, 0.0001, 0.003, 0.003, 0.006, 0.002, 0.002, 0.001, 0.002, 0.002, 0.025, 0.001, 0.002, 0.002, 0.003, 0.002, 0.001, 0.002, 0.0001, 0.001, 0.004, 0.005, 0.004, 0.007, 0.001, 0.012, 0.0001, 0.001, 0.006, 0.0001, 0.006, 0.0001, 0.002, 0.0001, 0.021, 0.003, 0.012, 0.011, 0.026, 0.004, 0.004, 0.006, 0.021, 0.001, 0.003, 0.02, 0.007, 0.023, 0.02, 0.005, 0.0001, 0.016, 0.01, 0.014, 0.014, 0.002, 0.003, 0.001, 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.739, 1.424, 2.096, 1.348, 0.183, 0.244, 0.115, 0.088, 0.621, 0.006, 0.016, 3.259, 0.202, 0.093, 0.068, 0.404, 0.112, 0.175, 0.076, 1.0, 0.273, 0.018, 0.005, 0.012, 0.081, 3.093, 0.13, 0.026, 0.084, 0.041, 0.082, 0.063, 0.299, 0.879, 0.098, 0.434, 0.038, 0.036, 0.005, 0.017, 0.043, 0.504, 0.0001, 0.196, 0.001, 0.016, 0.036, 0.445, 4.844, 0.952, 0.303, 0.533, 0.952, 2.488, 0.102, 0.15, 1.49, 1.18, 1.231, 3.558, 1.237, 2.847, 1.277, 0.365, 0.0001, 0.0001, 0.244, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.004, 0.0001, 0.002, 0.001, 24.156, 12.667, 4.154, 3.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.235, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bar": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.604, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.871, 0.004, 0.418, 0.0001, 0.0001, 0.008, 0.002, 0.216, 0.21, 0.21, 0.009, 0.001, 0.803, 0.202, 1.146, 0.023, 0.266, 0.394, 0.199, 0.121, 0.109, 0.119, 0.109, 0.117, 0.138, 0.187, 0.117, 0.02, 0.004, 0.005, 0.004, 0.003, 0.0001, 0.352, 0.447, 0.201, 0.532, 0.247, 0.245, 0.332, 0.228, 0.204, 0.156, 0.293, 0.235, 0.338, 0.204, 0.224, 0.214, 0.034, 0.205, 0.697, 0.181, 0.119, 0.18, 0.276, 0.005, 0.01, 0.114, 0.021, 0.0001, 0.021, 0.0001, 0.003, 0.003, 8.177, 1.169, 1.993, 4.065, 6.625, 1.095, 2.102, 3.003, 6.12, 0.162, 0.941, 2.0, 2.327, 6.606, 4.578, 0.55, 0.014, 3.249, 4.677, 4.042, 3.018, 0.854, 1.171, 0.071, 0.239, 0.864, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.102, 0.003, 0.003, 0.002, 0.004, 0.004, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.014, 0.001, 0.001, 0.016, 0.001, 0.002, 0.009, 0.001, 0.001, 0.039, 0.001, 0.036, 0.116, 0.061, 0.007, 0.003, 0.001, 0.274, 0.073, 0.002, 0.002, 0.004, 0.027, 0.002, 0.002, 0.002, 0.004, 0.001, 0.001, 0.004, 0.002, 0.01, 0.016, 0.006, 0.001, 0.154, 0.002, 0.005, 0.001, 0.002, 0.002, 0.176, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.07, 0.891, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.103, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bcl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.379, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.071, 0.002, 0.217, 0.001, 0.003, 0.005, 0.002, 0.116, 0.161, 0.16, 0.0001, 0.001, 0.914, 0.25, 0.911, 0.022, 0.337, 0.439, 0.274, 0.132, 0.116, 0.128, 0.121, 0.133, 0.144, 0.229, 0.055, 0.02, 0.017, 0.001, 0.017, 0.022, 0.0001, 0.585, 0.233, 0.246, 0.128, 0.11, 0.148, 0.111, 0.118, 0.238, 0.077, 0.175, 0.149, 0.27, 0.198, 0.07, 0.296, 0.013, 0.12, 0.508, 0.14, 0.057, 0.048, 0.04, 0.004, 0.02, 0.015, 0.025, 0.0001, 0.025, 0.0001, 0.0001, 0.0001, 15.454, 1.486, 0.494, 1.897, 2.968, 0.126, 4.169, 0.861, 6.432, 0.033, 2.688, 2.392, 2.068, 10.392, 5.039, 1.872, 0.022, 3.21, 4.66, 2.796, 1.875, 0.174, 0.643, 0.021, 1.752, 0.121, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.039, 0.006, 0.003, 0.003, 0.005, 0.004, 0.002, 0.003, 0.009, 0.002, 0.004, 0.002, 0.003, 0.004, 0.003, 0.002, 0.007, 0.003, 0.002, 0.009, 0.004, 0.002, 0.001, 0.002, 0.002, 0.008, 0.004, 0.003, 0.013, 0.011, 0.003, 0.001, 0.027, 0.035, 0.013, 0.004, 0.005, 0.003, 0.003, 0.006, 0.004, 0.006, 0.004, 0.003, 0.007, 0.019, 0.005, 0.003, 0.005, 0.018, 0.01, 0.022, 0.014, 0.003, 0.004, 0.003, 0.01, 0.004, 0.006, 0.004, 0.005, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.019, 0.136, 0.005, 0.006, 0.0001, 0.0001, 0.0001, 0.011, 0.004, 0.01, 0.002, 0.0001, 0.006, 0.003, 0.016, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.017, 0.012, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.007, 0.034, 0.001, 0.008, 0.01, 0.006, 0.004, 0.002, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "be": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.607, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.35, 0.001, 0.055, 0.0001, 0.0001, 0.006, 0.0001, 0.05, 0.155, 0.156, 0.001, 0.002, 0.628, 0.121, 0.612, 0.009, 0.188, 0.295, 0.148, 0.088, 0.085, 0.087, 0.076, 0.074, 0.089, 0.156, 0.032, 0.017, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.009, 0.006, 0.026, 0.004, 0.005, 0.003, 0.019, 0.003, 0.047, 0.001, 0.002, 0.004, 0.009, 0.01, 0.004, 0.01, 0.0001, 0.005, 0.013, 0.005, 0.003, 0.013, 0.004, 0.018, 0.001, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 0.046, 0.006, 0.014, 0.013, 0.042, 0.007, 0.007, 0.01, 0.04, 0.001, 0.006, 0.023, 0.014, 0.029, 0.035, 0.009, 0.001, 0.032, 0.024, 0.024, 0.019, 0.004, 0.003, 0.002, 0.006, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.314, 1.922, 1.481, 1.13, 0.14, 0.481, 1.007, 0.569, 0.351, 0.001, 0.001, 1.93, 0.479, 0.541, 0.221, 1.357, 0.128, 0.261, 0.085, 0.08, 0.203, 0.012, 2.438, 0.059, 0.001, 0.01, 0.103, 0.048, 0.097, 0.076, 0.995, 0.141, 0.181, 0.137, 0.046, 0.12, 0.029, 0.02, 0.016, 0.019, 0.023, 0.001, 0.0001, 0.081, 0.0001, 0.017, 0.007, 0.023, 7.12, 0.583, 1.325, 0.884, 1.382, 1.613, 0.241, 1.022, 0.011, 0.528, 1.726, 1.757, 1.251, 2.924, 1.397, 1.062, 0.0001, 0.0001, 0.283, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.021, 0.0001, 0.002, 0.001, 26.294, 17.28, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.156, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.941, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.272, 0.0001, 0.067, 0.0001, 0.001, 0.014, 0.0001, 0.006, 0.074, 0.074, 0.0001, 0.001, 0.205, 0.047, 0.036, 0.005, 0.139, 0.215, 0.134, 0.072, 0.07, 0.074, 0.065, 0.069, 0.075, 0.087, 0.017, 0.007, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.006, 0.004, 0.005, 0.002, 0.003, 0.002, 0.004, 0.002, 0.007, 0.001, 0.002, 0.003, 0.003, 0.003, 0.002, 0.004, 0.0001, 0.002, 0.006, 0.006, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.009, 0.0001, 0.1, 0.014, 0.029, 0.038, 0.115, 0.019, 0.024, 0.049, 0.081, 0.001, 0.007, 0.043, 0.023, 0.079, 0.071, 0.019, 0.001, 0.072, 0.065, 0.081, 0.029, 0.011, 0.014, 0.002, 0.014, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.902, 0.534, 1.035, 0.031, 0.0001, 0.22, 0.29, 2.243, 0.258, 0.137, 0.021, 0.553, 0.066, 1.318, 0.0001, 0.336, 0.009, 0.009, 0.0001, 0.03, 0.023, 1.891, 0.248, 0.639, 0.037, 0.011, 0.202, 0.05, 0.683, 0.024, 0.014, 0.375, 0.074, 0.252, 0.031, 0.13, 24.792, 6.19, 0.487, 0.175, 1.097, 0.001, 0.677, 0.098, 0.808, 0.311, 0.975, 0.521, 2.028, 0.0001, 1.424, 0.0001, 0.0001, 0.605, 0.237, 0.107, 1.177, 0.742, 0.0001, 0.0001, 0.117, 0.003, 3.031, 1.138, 0.0001, 0.0001, 0.016, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 29.692, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.859, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.276, 0.003, 0.256, 0.0001, 0.0001, 0.003, 0.003, 0.016, 0.486, 0.484, 0.001, 0.0001, 0.638, 0.156, 1.372, 0.022, 0.455, 0.969, 0.456, 0.237, 0.231, 0.247, 0.248, 0.25, 0.297, 0.612, 0.044, 0.019, 0.005, 0.0001, 0.004, 0.004, 0.0001, 0.449, 0.264, 0.227, 0.165, 0.234, 0.192, 0.164, 0.234, 0.179, 0.456, 0.316, 0.231, 0.458, 0.197, 0.135, 0.315, 0.005, 0.168, 0.606, 0.235, 0.049, 0.123, 0.109, 0.008, 0.231, 0.017, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 8.019, 2.445, 0.575, 1.178, 6.318, 0.449, 2.782, 1.275, 5.992, 0.203, 1.688, 4.658, 3.419, 6.494, 6.015, 1.447, 0.023, 2.565, 2.973, 3.583, 1.992, 0.459, 0.92, 0.044, 0.557, 0.136, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.108, 0.019, 0.014, 0.005, 0.005, 0.004, 0.006, 0.01, 0.005, 0.008, 0.002, 0.002, 0.012, 0.031, 0.002, 0.001, 0.002, 0.004, 0.003, 0.089, 0.007, 0.003, 0.003, 0.004, 0.004, 0.002, 0.001, 0.001, 0.007, 0.004, 0.002, 0.004, 0.052, 0.019, 0.003, 0.005, 0.023, 0.009, 0.014, 0.014, 0.008, 0.023, 0.003, 0.01, 0.005, 0.015, 0.003, 0.004, 0.019, 0.013, 0.011, 0.022, 0.006, 0.01, 0.007, 0.004, 0.018, 0.01, 0.009, 0.009, 0.011, 0.009, 0.011, 0.009, 0.0001, 0.0001, 0.048, 0.113, 0.02, 0.046, 0.0001, 0.002, 0.0001, 0.005, 0.001, 0.002, 0.0001, 0.001, 0.032, 0.011, 0.078, 0.027, 0.001, 0.0001, 0.001, 0.018, 0.002, 0.0001, 0.017, 0.009, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.037, 0.005, 0.097, 0.0001, 0.0001, 0.007, 0.003, 0.001, 0.003, 0.001, 0.002, 0.001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bjn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.274, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.352, 0.002, 0.406, 0.0001, 0.001, 0.013, 0.001, 0.109, 0.199, 0.198, 0.002, 0.001, 0.988, 0.406, 0.819, 0.036, 0.185, 0.196, 0.136, 0.076, 0.062, 0.071, 0.054, 0.058, 0.057, 0.091, 0.102, 0.025, 0.002, 0.003, 0.002, 0.005, 0.0001, 0.244, 0.391, 0.098, 0.173, 0.034, 0.031, 0.106, 0.136, 0.207, 0.121, 0.411, 0.116, 0.312, 0.12, 0.035, 0.341, 0.003, 0.133, 0.409, 0.258, 0.061, 0.026, 0.09, 0.002, 0.038, 0.007, 0.012, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 19.717, 2.113, 0.418, 2.814, 2.089, 0.126, 3.097, 2.135, 6.446, 0.654, 2.733, 2.879, 2.871, 8.542, 1.048, 1.844, 0.007, 3.384, 2.985, 3.613, 4.514, 0.083, 0.972, 0.009, 1.107, 0.035, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.03, 0.008, 0.005, 0.007, 0.006, 0.006, 0.006, 0.004, 0.006, 0.004, 0.008, 0.003, 0.003, 0.007, 0.001, 0.001, 0.002, 0.002, 0.002, 0.008, 0.003, 0.002, 0.002, 0.004, 0.002, 0.014, 0.001, 0.002, 0.005, 0.005, 0.002, 0.002, 0.012, 0.002, 0.002, 0.004, 0.012, 0.005, 0.004, 0.011, 0.007, 0.182, 0.006, 0.005, 0.004, 0.004, 0.003, 0.005, 0.009, 0.008, 0.005, 0.005, 0.003, 0.002, 0.001, 0.003, 0.006, 0.004, 0.004, 0.003, 0.003, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.019, 0.193, 0.007, 0.009, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.002, 0.005, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.035, 0.03, 0.004, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.019, 0.008, 0.026, 0.006, 0.003, 0.008, 0.005, 0.003, 0.002, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bm": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.167, 0.007, 0.144, 0.0001, 0.001, 0.013, 0.002, 0.256, 0.237, 0.237, 0.007, 0.003, 0.973, 0.158, 0.97, 0.007, 0.243, 0.224, 0.128, 0.052, 0.064, 0.06, 0.072, 0.055, 0.07, 0.12, 0.287, 0.015, 0.0001, 0.01, 0.0001, 0.005, 0.0001, 0.444, 0.348, 0.111, 0.212, 0.105, 0.277, 0.105, 0.044, 0.094, 0.171, 0.429, 0.132, 0.368, 0.21, 0.091, 0.065, 0.003, 0.072, 0.446, 0.184, 0.079, 0.027, 0.078, 0.004, 0.046, 0.018, 0.018, 0.0001, 0.014, 0.0001, 0.017, 0.0001, 12.037, 2.27, 0.406, 1.816, 3.589, 1.305, 1.615, 0.299, 5.301, 0.672, 3.384, 3.18, 2.268, 7.22, 3.282, 0.194, 0.029, 2.428, 2.045, 1.645, 2.796, 0.059, 0.96, 0.016, 1.69, 0.107, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.237, 0.003, 0.001, 0.017, 0.017, 0.007, 0.015, 0.003, 0.008, 0.011, 0.026, 0.017, 0.001, 0.0001, 0.018, 0.005, 0.013, 0.002, 0.004, 0.018, 1.999, 0.0001, 0.0001, 0.0001, 0.002, 0.172, 0.0001, 1.879, 0.012, 0.017, 0.004, 0.0001, 0.054, 0.002, 0.001, 0.001, 0.002, 0.003, 0.005, 0.027, 0.322, 0.21, 0.005, 0.017, 0.007, 0.002, 0.001, 0.011, 0.002, 0.012, 0.238, 0.014, 0.415, 0.435, 0.001, 0.007, 0.005, 0.009, 0.01, 0.017, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.064, 1.039, 0.002, 0.033, 0.027, 0.0001, 0.0001, 4.089, 0.016, 0.002, 0.003, 0.0001, 0.433, 0.0001, 0.024, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.065, 0.05, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.0001, 0.003, 0.233, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.319, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.406, 0.001, 0.076, 0.0001, 0.0001, 0.012, 0.0001, 0.015, 0.057, 0.058, 0.0001, 0.001, 0.196, 0.086, 0.029, 0.005, 0.005, 0.006, 0.004, 0.002, 0.002, 0.002, 0.002, 0.001, 0.002, 0.002, 0.016, 0.009, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.005, 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.003, 0.002, 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.043, 0.007, 0.016, 0.016, 0.05, 0.009, 0.009, 0.017, 0.038, 0.001, 0.004, 0.022, 0.013, 0.034, 0.034, 0.01, 0.001, 0.031, 0.027, 0.033, 0.016, 0.005, 0.005, 0.002, 0.008, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.359, 0.551, 0.299, 0.082, 0.002, 0.229, 0.186, 2.436, 0.034, 0.152, 0.002, 0.333, 0.036, 2.245, 0.026, 0.384, 0.008, 0.001, 0.001, 0.181, 0.002, 1.31, 0.16, 0.34, 0.043, 0.053, 0.26, 0.209, 0.4, 0.015, 0.042, 0.46, 0.067, 0.212, 0.008, 0.16, 1.542, 0.621, 24.834, 6.808, 1.602, 0.04, 0.792, 0.149, 1.148, 0.261, 0.867, 1.261, 2.631, 0.001, 0.874, 0.001, 0.001, 0.001, 0.381, 0.232, 0.963, 0.451, 0.001, 0.001, 0.701, 0.0001, 2.837, 1.811, 0.0001, 0.0001, 0.013, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.991, 0.0001, 0.03, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.169, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.69, 0.0001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.01, 0.0001, 0.0001, 0.002, 0.003, 0.005, 0.001, 0.003, 0.004, 0.003, 0.002, 0.001, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.012, 0.002, 0.004, 0.004, 0.015, 0.003, 0.003, 0.006, 0.011, 0.0001, 0.001, 0.005, 0.003, 0.01, 0.01, 0.003, 0.0001, 0.008, 0.008, 0.01, 0.004, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.3, 0.21, 1.61, 0.004, 1.096, 0.171, 0.232, 0.056, 0.006, 0.125, 0.009, 7.85, 0.044, 0.821, 0.01, 0.147, 0.305, 1.571, 0.233, 1.086, 0.826, 0.17, 1.379, 0.052, 0.974, 0.101, 0.175, 0.065, 0.005, 0.008, 0.253, 0.318, 0.893, 0.39, 1.207, 0.915, 0.217, 0.014, 2.41, 0.028, 0.071, 0.06, 0.002, 0.023, 0.001, 0.018, 0.001, 0.001, 0.003, 0.913, 2.028, 0.112, 1.086, 0.005, 0.001, 0.055, 0.005, 0.003, 0.951, 0.005, 10.217, 21.49, 2.602, 0.016, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 32.905, 0.0001, 0.024, 0.009, 0.002, 0.006, 0.004, 0.005, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bpy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.902, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.282, 0.0001, 0.009, 0.0001, 0.0001, 0.224, 0.0001, 0.002, 0.281, 0.281, 0.0001, 0.0001, 0.306, 0.253, 0.183, 0.08, 0.005, 0.009, 0.002, 0.004, 0.002, 0.003, 0.003, 0.003, 0.003, 0.003, 0.197, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.016, 0.008, 0.017, 0.005, 0.005, 0.002, 0.004, 0.002, 0.003, 0.003, 0.005, 0.003, 0.007, 0.007, 0.001, 0.007, 0.0001, 0.004, 0.019, 0.004, 0.016, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.014, 0.0001, 0.118, 0.01, 0.016, 0.026, 0.05, 0.006, 0.015, 0.031, 0.057, 0.004, 0.009, 0.031, 0.017, 0.064, 0.06, 0.015, 0.001, 0.059, 0.03, 0.047, 0.04, 0.005, 0.005, 0.001, 0.018, 0.002, 0.0001, 0.016, 0.0001, 0.0001, 0.0001, 0.094, 0.582, 0.295, 0.004, 0.001, 0.199, 0.278, 1.651, 0.006, 0.325, 0.001, 0.49, 0.119, 1.057, 0.003, 0.285, 0.0001, 0.0001, 0.0001, 0.034, 0.032, 0.592, 0.143, 0.798, 0.084, 0.129, 0.075, 0.036, 0.484, 0.004, 0.03, 0.329, 0.051, 0.128, 0.007, 0.019, 1.405, 0.659, 24.309, 6.387, 2.166, 0.231, 0.814, 0.355, 0.961, 0.379, 1.131, 0.99, 2.941, 0.034, 0.919, 0.004, 0.001, 0.001, 0.243, 0.193, 0.791, 1.05, 0.0001, 0.0001, 0.626, 0.0001, 4.392, 1.335, 0.0001, 0.0001, 0.04, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.31, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "br": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.678, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.255, 0.004, 0.515, 0.0001, 0.0001, 0.007, 0.002, 0.663, 0.246, 0.246, 0.001, 0.002, 0.881, 0.746, 0.901, 0.014, 0.258, 0.444, 0.187, 0.109, 0.115, 0.122, 0.109, 0.12, 0.152, 0.228, 0.115, 0.024, 0.015, 0.004, 0.016, 0.003, 0.0001, 0.347, 0.279, 0.201, 0.205, 0.261, 0.098, 0.212, 0.134, 0.164, 0.075, 0.201, 0.168, 0.253, 0.109, 0.059, 0.199, 0.006, 0.146, 0.289, 0.136, 0.097, 0.091, 0.051, 0.019, 0.032, 0.015, 0.024, 0.0001, 0.024, 0.0001, 0.001, 0.0001, 9.146, 1.127, 0.833, 2.777, 10.42, 0.294, 1.799, 2.456, 3.655, 0.167, 1.352, 2.97, 1.505, 5.492, 4.696, 0.867, 0.019, 5.665, 2.33, 3.448, 2.744, 1.784, 0.434, 0.03, 0.247, 2.302, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.1, 0.012, 0.008, 0.007, 0.005, 0.004, 0.003, 0.003, 0.004, 0.005, 0.002, 0.002, 0.004, 0.005, 0.003, 0.002, 0.003, 0.002, 0.002, 0.011, 0.005, 0.002, 0.002, 0.002, 0.002, 0.074, 0.002, 0.003, 0.005, 0.005, 0.001, 0.004, 0.021, 0.015, 0.009, 0.005, 0.007, 0.003, 0.004, 0.009, 0.013, 0.045, 0.076, 0.018, 0.003, 0.013, 0.003, 0.005, 0.011, 0.591, 0.009, 0.012, 0.018, 0.007, 0.006, 0.004, 0.009, 0.467, 0.008, 0.021, 0.017, 0.008, 0.005, 0.006, 0.0001, 0.0001, 0.048, 1.28, 0.01, 0.011, 0.0001, 0.001, 0.0001, 0.004, 0.002, 0.002, 0.002, 0.0001, 0.032, 0.015, 0.039, 0.015, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.006, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.009, 0.096, 0.003, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bs": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.108, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.139, 0.002, 0.313, 0.001, 0.001, 0.017, 0.002, 0.011, 0.204, 0.204, 0.001, 0.006, 0.915, 0.157, 1.176, 0.034, 0.332, 0.467, 0.264, 0.159, 0.151, 0.151, 0.132, 0.126, 0.142, 0.226, 0.068, 0.015, 0.006, 0.007, 0.006, 0.001, 0.0001, 0.156, 0.174, 0.174, 0.143, 0.072, 0.074, 0.155, 0.136, 0.152, 0.073, 0.147, 0.082, 0.163, 0.218, 0.118, 0.225, 0.003, 0.11, 0.283, 0.122, 0.105, 0.088, 0.031, 0.007, 0.007, 0.073, 0.025, 0.0001, 0.025, 0.0001, 0.008, 0.0001, 8.723, 0.95, 0.762, 2.331, 6.777, 0.26, 1.369, 0.582, 7.412, 3.867, 2.673, 2.682, 2.205, 4.994, 6.632, 1.941, 0.005, 3.955, 3.612, 3.234, 3.103, 2.415, 0.036, 0.017, 0.061, 1.207, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.038, 0.004, 0.003, 0.002, 0.002, 0.001, 0.003, 0.388, 0.002, 0.001, 0.001, 0.001, 0.016, 0.618, 0.001, 0.0001, 0.003, 0.172, 0.002, 0.018, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.006, 0.003, 0.004, 0.002, 0.035, 0.482, 0.001, 0.001, 0.003, 0.001, 0.001, 0.002, 0.001, 0.008, 0.001, 0.002, 0.001, 0.003, 0.001, 0.001, 0.007, 0.004, 0.003, 0.004, 0.002, 0.003, 0.004, 0.002, 0.004, 0.002, 0.002, 0.003, 0.006, 0.012, 0.366, 0.002, 0.0001, 0.0001, 0.02, 0.032, 1.199, 0.874, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.014, 0.006, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bug": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.068, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.164, 0.0001, 0.016, 0.0001, 0.0001, 0.003, 0.001, 0.137, 0.016, 0.016, 0.0001, 0.001, 0.196, 1.935, 1.044, 0.004, 0.035, 0.02, 0.023, 0.01, 0.009, 0.007, 0.007, 0.006, 0.007, 0.013, 0.007, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.516, 0.311, 0.434, 0.185, 0.139, 0.134, 0.304, 0.324, 0.039, 0.055, 0.029, 0.369, 0.412, 0.063, 0.111, 1.316, 0.017, 0.157, 0.558, 0.13, 0.016, 0.233, 0.012, 0.002, 0.073, 0.002, 0.007, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 9.887, 0.241, 1.633, 1.832, 7.179, 0.088, 0.757, 0.513, 7.161, 0.111, 1.126, 1.683, 2.724, 6.291, 2.861, 1.308, 0.04, 7.537, 3.873, 3.7, 4.723, 0.375, 1.036, 0.149, 1.531, 0.172, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.047, 0.009, 0.005, 0.004, 0.009, 0.007, 0.006, 0.004, 0.009, 0.039, 0.01, 0.038, 0.003, 0.005, 0.002, 0.001, 0.004, 0.012, 0.007, 0.011, 0.011, 0.02, 0.001, 0.02, 0.012, 0.019, 0.011, 0.012, 0.002, 0.001, 0.006, 0.003, 0.004, 0.003, 0.047, 0.002, 0.016, 0.005, 0.004, 0.01, 0.405, 2.36, 0.01, 0.013, 0.003, 0.001, 0.008, 0.004, 0.008, 0.004, 0.008, 0.005, 0.176, 0.005, 0.002, 0.003, 0.012, 0.005, 0.008, 0.007, 0.003, 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.007, 2.887, 0.002, 0.04, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.023, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.008, 0.007, 0.001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.048, 0.15, 0.04, 0.0001, 0.0001, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "bxr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.49, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.129, 0.001, 0.08, 0.0001, 0.0001, 0.012, 0.0001, 0.001, 0.147, 0.147, 0.0001, 0.002, 0.553, 0.131, 0.523, 0.004, 0.151, 0.243, 0.109, 0.074, 0.068, 0.074, 0.065, 0.062, 0.079, 0.12, 0.022, 0.018, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.004, 0.002, 0.007, 0.001, 0.002, 0.002, 0.002, 0.004, 0.037, 0.001, 0.001, 0.002, 0.003, 0.003, 0.003, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.011, 0.001, 0.019, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.037, 0.005, 0.011, 0.009, 0.029, 0.005, 0.007, 0.031, 0.027, 0.001, 0.005, 0.019, 0.012, 0.022, 0.025, 0.008, 0.001, 0.023, 0.018, 0.017, 0.016, 0.003, 0.002, 0.001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.392, 0.859, 1.489, 1.628, 0.046, 1.574, 0.057, 0.037, 0.549, 0.002, 0.003, 0.546, 0.265, 4.264, 0.148, 0.174, 0.118, 0.207, 0.029, 0.069, 0.123, 0.028, 0.013, 0.033, 0.034, 0.005, 0.055, 0.03, 0.09, 0.073, 0.049, 0.037, 0.094, 0.079, 0.088, 0.076, 0.026, 0.12, 0.011, 0.016, 0.032, 0.306, 0.001, 0.058, 0.001, 0.071, 0.033, 1.461, 5.842, 1.346, 0.152, 2.003, 2.072, 0.704, 0.52, 0.475, 1.576, 1.562, 0.254, 3.078, 0.893, 3.534, 3.045, 0.105, 0.0001, 0.0001, 0.188, 0.005, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.006, 0.002, 27.741, 14.028, 2.178, 0.307, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.075, 0.002, 0.001, 0.004, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cdo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.899, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.597, 0.001, 0.273, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.549, 0.551, 0.0001, 0.001, 0.624, 3.929, 0.732, 0.03, 0.251, 0.611, 0.29, 0.189, 0.163, 0.163, 0.16, 0.156, 0.166, 0.215, 0.133, 0.012, 0.001, 0.0001, 0.001, 0.002, 0.0001, 0.053, 0.117, 0.299, 0.251, 0.017, 0.027, 0.504, 0.23, 0.082, 0.03, 0.071, 0.135, 0.356, 0.159, 0.039, 0.068, 0.004, 0.027, 0.229, 0.101, 0.044, 0.025, 0.062, 0.001, 0.013, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.822, 0.392, 1.504, 1.05, 0.748, 0.033, 6.691, 1.959, 3.832, 0.006, 1.877, 0.724, 0.396, 5.597, 0.623, 0.123, 0.005, 0.411, 2.143, 0.557, 2.118, 0.037, 0.065, 0.039, 0.184, 0.014, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.562, 0.653, 0.229, 0.604, 0.418, 0.298, 0.318, 0.129, 0.175, 0.171, 0.118, 0.212, 0.31, 0.409, 0.113, 0.98, 0.125, 0.066, 0.036, 0.255, 0.106, 0.397, 0.142, 0.124, 0.138, 0.172, 0.096, 0.139, 0.338, 0.116, 0.144, 0.186, 0.41, 1.078, 0.77, 0.114, 1.515, 0.081, 0.097, 0.077, 0.628, 0.714, 1.044, 0.603, 1.183, 1.024, 0.119, 0.129, 0.135, 0.183, 0.537, 1.615, 1.19, 0.067, 0.211, 0.1, 0.216, 1.217, 0.179, 0.199, 0.306, 0.119, 0.135, 0.091, 0.0001, 0.0001, 0.041, 7.531, 2.472, 1.618, 0.001, 0.001, 0.0001, 0.002, 0.002, 0.001, 2.018, 0.0001, 0.014, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.757, 0.108, 0.212, 0.359, 1.361, 0.793, 0.503, 0.549, 0.397, 0.002, 0.003, 0.004, 0.001, 0.0001, 0.218, 0.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ce": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.477, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.593, 0.0001, 0.003, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.462, 0.462, 0.0001, 0.166, 0.461, 0.186, 0.813, 0.002, 0.175, 0.094, 0.109, 0.14, 0.045, 0.029, 0.022, 0.02, 0.031, 0.028, 0.033, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.145, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.145, 0.144, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.704, 1.438, 1.762, 1.875, 0.015, 2.329, 0.449, 0.169, 0.835, 0.009, 0.342, 0.05, 1.751, 0.164, 0.611, 0.21, 0.068, 0.113, 0.056, 0.04, 0.434, 0.02, 0.006, 0.019, 0.028, 0.002, 0.404, 0.034, 0.196, 0.056, 0.049, 0.075, 0.184, 0.229, 0.057, 0.026, 0.146, 0.02, 0.017, 0.02, 0.129, 0.002, 0.0001, 0.004, 0.0001, 0.008, 0.009, 0.018, 7.603, 0.877, 1.017, 0.93, 0.629, 1.84, 0.05, 0.386, 1.788, 1.009, 1.778, 2.253, 0.873, 3.199, 2.291, 0.075, 0.0001, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 28.632, 13.675, 0.0001, 0.638, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.405, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ceb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.228, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.341, 0.0001, 0.15, 0.0001, 0.0001, 0.002, 0.0001, 0.016, 0.068, 0.068, 0.0001, 0.0001, 1.15, 0.441, 1.259, 0.001, 0.028, 0.059, 0.035, 0.022, 0.021, 0.022, 0.021, 0.021, 0.026, 0.036, 0.037, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.098, 0.168, 0.578, 0.161, 0.203, 0.063, 0.093, 0.198, 0.052, 0.044, 0.126, 0.151, 0.236, 0.118, 0.082, 0.261, 0.02, 0.131, 0.295, 0.118, 0.081, 0.041, 0.087, 0.005, 0.015, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 15.378, 2.318, 0.367, 1.953, 2.974, 0.093, 5.126, 1.479, 4.851, 0.069, 2.449, 3.4, 2.839, 8.407, 4.701, 1.442, 0.019, 2.43, 4.783, 3.214, 2.941, 0.169, 0.623, 0.03, 1.539, 0.068, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.059, 0.004, 0.005, 0.004, 0.004, 0.003, 0.008, 0.005, 0.003, 0.002, 0.001, 0.004, 0.009, 0.002, 0.004, 0.002, 0.003, 0.0001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.01, 0.005, 0.001, 0.002, 0.001, 0.001, 0.002, 0.006, 0.184, 0.019, 0.007, 0.005, 0.008, 0.019, 0.003, 0.009, 0.007, 0.025, 0.004, 0.049, 0.001, 0.018, 0.002, 0.008, 0.279, 0.015, 0.004, 0.013, 0.004, 0.003, 0.007, 0.001, 0.046, 0.006, 0.007, 0.005, 0.006, 0.004, 0.006, 0.001, 0.0001, 0.0001, 0.452, 0.166, 0.097, 0.047, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.031, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.019, 0.018, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.012, 0.008, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ch": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.587, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.467, 0.008, 0.286, 0.0001, 0.0001, 0.018, 0.0001, 1.077, 0.189, 0.189, 0.0001, 0.0001, 1.14, 0.532, 1.257, 0.007, 0.648, 0.639, 0.504, 0.182, 0.3, 0.173, 0.195, 0.169, 0.204, 0.218, 0.042, 0.013, 0.0001, 0.001, 0.0001, 0.005, 0.0001, 0.26, 0.146, 0.257, 0.104, 0.401, 0.111, 0.564, 0.173, 0.223, 0.038, 0.106, 0.097, 0.317, 0.12, 0.025, 0.199, 0.01, 0.074, 0.256, 0.153, 0.279, 0.066, 0.06, 0.002, 0.047, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 10.968, 0.472, 0.524, 1.575, 4.239, 0.44, 3.776, 1.808, 6.943, 0.028, 1.21, 2.019, 1.749, 8.291, 5.798, 1.592, 0.018, 1.795, 5.81, 3.872, 3.565, 0.141, 0.106, 0.012, 0.845, 0.055, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.016, 0.008, 0.003, 0.001, 0.002, 0.01, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.0001, 0.0001, 0.006, 0.001, 0.0001, 0.005, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.011, 0.0001, 0.003, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.02, 0.002, 0.003, 0.001, 0.974, 0.0001, 0.004, 0.003, 0.012, 0.0001, 0.0001, 0.001, 0.009, 0.0001, 0.0001, 0.002, 0.432, 0.0001, 0.044, 0.0001, 0.001, 0.003, 0.001, 0.002, 0.002, 0.006, 0.007, 0.002, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.001, 1.51, 0.004, 0.013, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 0.0001, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.012, 0.0001, 0.0001, 0.003, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cho": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.477, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.446, 0.089, 1.242, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.621, 0.621, 0.0001, 0.0001, 0.799, 0.0001, 0.532, 0.0001, 0.0001, 0.177, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.355, 0.266, 0.0001, 0.0001, 0.0001, 0.089, 0.0001, 0.444, 0.0001, 1.154, 0.0001, 0.0001, 0.0001, 0.089, 0.799, 0.177, 0.0001, 0.177, 0.0001, 0.355, 0.177, 0.177, 0.444, 0.0001, 0.0001, 0.355, 0.0001, 0.0001, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.955, 1.154, 0.799, 0.0001, 2.839, 0.177, 0.621, 7.365, 8.252, 0.0001, 5.146, 2.662, 3.549, 3.727, 5.413, 1.597, 0.0001, 0.799, 3.638, 5.146, 1.597, 1.065, 0.089, 0.0001, 1.331, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.154, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.266, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.177, 0.0001, 0.0001, 0.0001, 1.154, 0.0001, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "chr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.394, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.115, 0.002, 0.174, 0.0001, 0.001, 0.005, 0.001, 0.018, 0.095, 0.095, 0.0001, 0.001, 0.499, 0.081, 0.439, 0.009, 0.086, 0.076, 0.045, 0.025, 0.02, 0.027, 0.02, 0.018, 0.025, 0.029, 0.03, 0.019, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.037, 0.02, 0.038, 0.014, 0.023, 0.017, 0.012, 0.014, 0.019, 0.011, 0.01, 0.013, 0.028, 0.014, 0.01, 0.02, 0.002, 0.016, 0.034, 0.027, 0.013, 0.008, 0.015, 0.002, 0.005, 0.003, 0.065, 0.0001, 0.065, 0.0001, 0.004, 0.0001, 0.692, 0.092, 0.264, 0.31, 0.823, 0.092, 0.184, 0.209, 0.663, 0.01, 0.064, 0.374, 0.188, 0.502, 0.498, 0.163, 0.016, 0.479, 0.482, 0.523, 0.235, 0.107, 0.076, 0.023, 0.123, 0.021, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.027, 0.355, 0.722, 0.213, 0.313, 0.628, 0.115, 0.06, 0.021, 0.056, 0.084, 0.04, 0.154, 1.876, 13.554, 13.952, 0.082, 0.032, 0.441, 0.837, 0.268, 0.161, 0.041, 1.986, 0.138, 0.561, 0.191, 0.664, 0.014, 0.045, 0.005, 0.13, 2.057, 0.126, 1.445, 0.138, 1.031, 0.39, 0.904, 0.381, 0.457, 1.048, 0.569, 0.458, 0.748, 0.433, 0.062, 1.427, 0.213, 0.207, 0.29, 0.574, 0.831, 0.687, 0.218, 0.077, 0.387, 0.051, 0.016, 0.01, 0.004, 0.004, 1.405, 0.134, 0.0001, 0.0001, 0.009, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 27.238, 0.017, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "chy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.992, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.662, 0.002, 0.655, 0.0001, 0.0001, 0.0001, 0.0001, 4.281, 0.488, 0.49, 0.012, 0.039, 1.209, 0.935, 1.193, 0.009, 0.099, 0.186, 0.07, 0.039, 0.048, 0.046, 0.051, 0.032, 0.087, 0.113, 0.294, 0.06, 0.044, 0.012, 0.043, 0.009, 0.0001, 0.28, 0.143, 0.271, 0.068, 0.058, 0.046, 0.056, 0.705, 0.041, 0.084, 0.094, 0.075, 0.71, 0.203, 0.133, 0.21, 0.01, 0.123, 0.333, 0.369, 0.109, 0.326, 0.043, 0.02, 0.015, 0.015, 0.017, 0.0001, 0.017, 0.0001, 0.0001, 0.005, 5.694, 0.454, 0.435, 0.594, 8.431, 0.195, 0.654, 4.544, 1.753, 0.053, 1.313, 1.118, 1.931, 4.523, 6.14, 0.553, 0.043, 1.203, 5.097, 4.735, 0.637, 1.842, 0.224, 0.461, 0.27, 0.08, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.024, 0.014, 0.009, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.113, 0.0001, 0.002, 0.007, 0.005, 0.0001, 0.0001, 0.005, 0.002, 0.0001, 0.058, 0.012, 0.0001, 0.003, 0.029, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.002, 0.044, 1.384, 0.696, 0.009, 0.027, 0.002, 0.002, 0.039, 0.005, 3.484, 0.98, 0.162, 0.003, 0.009, 0.002, 0.017, 0.009, 0.003, 0.005, 1.282, 0.993, 0.003, 0.142, 0.0001, 0.017, 0.0001, 0.002, 0.009, 0.007, 0.0001, 0.007, 0.005, 0.0001, 0.0001, 0.014, 8.846, 0.043, 0.545, 0.0001, 0.005, 0.046, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.031, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.019, 0.003, 0.017, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ckb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.676, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.035, 0.002, 0.062, 0.0001, 0.0001, 0.003, 0.0001, 0.002, 0.131, 0.13, 0.001, 0.001, 0.011, 0.034, 0.374, 0.013, 0.01, 0.014, 0.008, 0.005, 0.004, 0.004, 0.004, 0.004, 0.005, 0.007, 0.05, 0.0001, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.009, 0.006, 0.007, 0.006, 0.004, 0.004, 0.004, 0.004, 0.005, 0.002, 0.003, 0.004, 0.007, 0.005, 0.003, 0.007, 0.001, 0.005, 0.01, 0.007, 0.002, 0.002, 0.003, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.003, 0.0001, 0.058, 0.008, 0.018, 0.017, 0.063, 0.009, 0.012, 0.017, 0.048, 0.001, 0.008, 0.031, 0.019, 0.043, 0.045, 0.012, 0.001, 0.045, 0.029, 0.036, 0.019, 0.006, 0.008, 0.003, 0.011, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.386, 0.193, 0.124, 0.067, 1.187, 1.207, 3.947, 0.41, 3.556, 0.028, 0.015, 0.002, 5.576, 0.003, 1.191, 0.005, 0.006, 0.005, 0.002, 0.004, 0.001, 6.665, 0.001, 0.002, 0.236, 0.001, 0.002, 0.008, 0.002, 0.002, 0.001, 0.006, 0.161, 0.192, 0.114, 0.062, 0.112, 0.064, 0.707, 4.366, 1.564, 2.13, 1.551, 0.015, 0.253, 0.092, 0.303, 2.261, 0.008, 2.411, 0.524, 1.151, 0.651, 0.531, 0.001, 0.004, 0.003, 0.092, 0.048, 0.036, 0.003, 0.003, 0.823, 0.003, 0.0001, 0.0001, 0.028, 0.007, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 15.514, 10.978, 4.45, 13.188, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.375, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.063, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "co": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.449, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.862, 0.008, 0.387, 0.0001, 0.0001, 0.006, 0.001, 0.763, 0.212, 0.212, 0.003, 0.001, 0.925, 0.075, 0.859, 0.019, 0.189, 0.28, 0.146, 0.097, 0.087, 0.101, 0.081, 0.085, 0.107, 0.132, 0.097, 0.026, 0.009, 0.003, 0.01, 0.004, 0.0001, 0.325, 0.102, 0.335, 0.094, 0.091, 0.089, 0.126, 0.077, 0.208, 0.025, 0.02, 0.156, 0.189, 0.082, 0.052, 0.201, 0.016, 0.093, 0.268, 0.121, 0.17, 0.078, 0.019, 0.022, 0.005, 0.013, 0.032, 0.0001, 0.032, 0.0001, 0.016, 0.0001, 8.602, 0.557, 3.322, 3.101, 4.329, 0.784, 1.174, 1.381, 10.092, 0.419, 0.069, 2.83, 1.864, 5.457, 2.618, 1.888, 0.179, 4.342, 3.458, 4.676, 6.626, 0.877, 0.033, 0.017, 0.063, 0.595, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.058, 0.006, 0.004, 0.002, 0.003, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.002, 0.002, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.039, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.789, 0.005, 0.002, 0.002, 0.004, 0.001, 0.002, 0.004, 0.94, 0.016, 0.001, 0.007, 0.251, 0.004, 0.001, 0.002, 0.005, 0.006, 0.189, 0.011, 0.005, 0.003, 0.002, 0.024, 0.003, 0.252, 0.004, 0.007, 0.006, 0.005, 0.002, 0.004, 0.0001, 0.0001, 0.05, 2.469, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.032, 0.015, 0.008, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.04, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.443, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.088, 0.004, 0.073, 0.0001, 0.0001, 0.02, 0.0001, 0.023, 0.121, 0.12, 0.0001, 0.002, 0.629, 0.081, 0.971, 0.012, 0.119, 0.193, 0.101, 0.064, 0.076, 0.066, 0.061, 0.066, 0.062, 0.105, 0.063, 0.027, 0.0001, 0.0001, 0.0001, 0.015, 0.0001, 0.161, 0.04, 0.143, 0.045, 0.195, 0.034, 0.029, 0.053, 0.081, 0.084, 0.151, 0.056, 0.235, 0.167, 0.103, 0.138, 0.009, 0.033, 0.115, 0.119, 0.03, 0.034, 0.067, 0.012, 0.01, 0.004, 0.05, 0.0001, 0.047, 0.0001, 0.014, 0.0001, 9.914, 0.233, 4.69, 1.145, 5.906, 0.235, 0.326, 1.052, 10.924, 0.134, 6.149, 1.256, 2.551, 4.689, 5.033, 1.928, 0.073, 2.706, 3.099, 5.744, 0.924, 0.192, 2.967, 0.038, 0.312, 0.067, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.088, 0.031, 0.077, 0.099, 0.046, 0.115, 0.007, 0.048, 0.054, 0.011, 0.091, 0.103, 0.074, 0.037, 0.073, 0.005, 0.766, 0.405, 0.312, 0.295, 0.175, 0.052, 0.036, 0.009, 0.01, 0.038, 0.001, 0.005, 0.002, 0.0001, 0.001, 0.021, 0.037, 0.111, 0.205, 0.026, 0.084, 0.087, 0.065, 0.093, 0.076, 0.063, 0.057, 0.032, 0.002, 0.144, 0.111, 0.096, 0.017, 0.078, 0.065, 0.232, 0.037, 0.005, 0.0001, 0.0001, 0.021, 0.005, 0.022, 0.02, 0.014, 0.002, 0.005, 0.005, 0.0001, 0.0001, 0.046, 0.821, 0.023, 0.077, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 1.861, 0.08, 0.005, 0.002, 0.009, 0.005, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "crh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.666, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.545, 0.003, 0.2, 0.0001, 0.003, 0.006, 0.0001, 0.011, 0.498, 0.498, 0.001, 0.003, 0.581, 0.375, 1.265, 0.029, 0.54, 0.844, 0.447, 0.25, 0.254, 0.244, 0.225, 0.224, 0.237, 0.353, 0.036, 0.017, 0.017, 0.002, 0.017, 0.003, 0.0001, 0.292, 0.227, 0.115, 0.122, 0.258, 0.045, 0.081, 0.079, 0.299, 0.014, 0.172, 0.079, 0.19, 0.068, 0.102, 0.074, 0.317, 0.092, 0.196, 0.162, 0.157, 0.161, 0.003, 0.13, 0.089, 0.035, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 7.42, 1.383, 0.39, 2.173, 6.493, 0.253, 0.439, 0.324, 6.527, 0.039, 1.974, 3.301, 1.629, 5.164, 1.476, 0.486, 0.955, 4.625, 3.637, 2.416, 1.149, 1.071, 0.013, 0.004, 1.959, 0.598, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.415, 0.022, 0.015, 0.022, 0.008, 0.007, 0.005, 0.065, 0.008, 0.005, 0.004, 0.008, 0.007, 0.007, 0.003, 0.008, 0.005, 0.004, 0.004, 0.069, 0.234, 0.004, 0.026, 0.004, 0.006, 0.008, 0.008, 0.005, 0.067, 0.049, 0.094, 1.497, 0.026, 0.01, 0.278, 0.006, 0.008, 0.006, 0.005, 0.416, 0.004, 0.006, 0.005, 0.014, 0.004, 0.007, 0.006, 0.006, 0.149, 5.025, 0.014, 0.011, 0.012, 0.067, 0.295, 0.006, 0.022, 0.01, 0.019, 0.017, 0.605, 0.022, 0.039, 0.006, 0.0001, 0.0001, 0.035, 2.796, 4.495, 1.1, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.002, 0.256, 0.079, 0.004, 0.002, 0.0001, 0.004, 0.008, 0.013, 0.021, 0.017, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.015, 0.009, 0.398, 0.007, 0.004, 0.019, 0.009, 0.005, 0.004, 0.004, 0.003, 0.002, 0.004, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "csb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.825, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.296, 0.002, 0.584, 0.0001, 0.0001, 0.003, 0.001, 0.009, 0.331, 0.334, 0.002, 0.0001, 0.877, 0.236, 1.256, 0.065, 0.271, 0.637, 0.291, 0.193, 0.181, 0.174, 0.153, 0.187, 0.256, 0.339, 0.093, 0.04, 0.024, 0.004, 0.024, 0.003, 0.0001, 0.093, 0.136, 0.203, 0.135, 0.053, 0.045, 0.141, 0.038, 0.163, 0.132, 0.28, 0.122, 0.184, 0.116, 0.024, 0.275, 0.002, 0.1, 0.23, 0.118, 0.014, 0.056, 0.218, 0.119, 0.003, 0.085, 0.006, 0.0001, 0.007, 0.0001, 0.002, 0.0001, 4.612, 0.986, 3.096, 2.007, 3.546, 0.161, 1.136, 0.946, 4.255, 1.343, 2.142, 1.634, 1.571, 3.378, 2.668, 1.384, 0.004, 3.469, 3.152, 2.405, 0.834, 0.037, 2.89, 0.011, 0.614, 4.079, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.169, 0.025, 0.879, 0.003, 0.332, 0.515, 0.031, 0.005, 0.001, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.005, 0.001, 0.013, 0.102, 0.134, 0.005, 0.002, 0.001, 0.001, 0.003, 0.049, 0.005, 0.012, 0.006, 0.026, 0.025, 0.003, 0.016, 0.006, 0.006, 0.677, 0.002, 0.001, 0.001, 0.001, 0.003, 1.17, 0.001, 2.19, 0.001, 0.003, 0.0001, 0.002, 0.009, 0.003, 2.322, 0.76, 1.31, 0.003, 0.004, 0.001, 0.007, 0.615, 0.005, 0.077, 0.465, 0.007, 0.003, 0.002, 0.0001, 0.0001, 0.14, 9.122, 0.543, 1.724, 0.0001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.006, 0.002, 0.024, 0.023, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.197, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.095, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.137, 0.0001, 0.05, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.026, 0.026, 0.001, 0.0001, 0.049, 0.014, 0.024, 0.015, 0.131, 0.259, 0.12, 0.082, 0.083, 0.082, 0.076, 0.078, 0.096, 0.129, 0.009, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.001, 0.006, 0.001, 0.001, 0.001, 0.0001, 0.006, 0.004, 0.0001, 0.001, 0.001, 0.002, 0.002, 0.004, 0.001, 0.0001, 0.002, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 0.023, 0.002, 0.008, 0.007, 0.018, 0.001, 0.005, 0.004, 0.017, 0.005, 0.009, 0.01, 0.003, 0.016, 0.015, 0.003, 0.001, 0.01, 0.011, 0.009, 0.011, 0.004, 0.0001, 0.002, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.938, 4.019, 2.29, 0.582, 0.265, 0.184, 0.28, 0.33, 0.175, 0.126, 2.698, 0.002, 1.962, 0.002, 0.135, 0.0001, 0.124, 0.906, 0.12, 0.072, 1.561, 0.0001, 0.139, 0.857, 0.034, 2.179, 0.103, 0.119, 0.097, 0.099, 0.095, 0.124, 0.126, 0.438, 0.049, 1.297, 0.06, 0.96, 0.01, 0.295, 0.011, 0.359, 0.005, 0.236, 0.002, 0.101, 0.019, 0.025, 3.114, 0.623, 1.373, 0.62, 1.221, 0.086, 0.518, 0.573, 2.627, 0.002, 1.325, 1.567, 0.924, 2.121, 2.823, 0.585, 0.0001, 0.0001, 0.514, 0.003, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.408, 0.0001, 0.016, 0.012, 21.25, 18.718, 0.249, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.51, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 1.747, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.247, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.093, 0.001, 0.059, 0.0001, 0.0001, 0.007, 0.0001, 0.003, 0.152, 0.151, 0.0001, 0.002, 0.478, 0.273, 0.79, 0.011, 0.204, 0.309, 0.183, 0.104, 0.101, 0.1, 0.081, 0.081, 0.096, 0.17, 0.076, 0.008, 0.002, 0.002, 0.002, 0.003, 0.0001, 0.004, 0.003, 0.005, 0.002, 0.002, 0.002, 0.002, 0.002, 0.019, 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.003, 0.005, 0.003, 0.002, 0.006, 0.001, 0.01, 0.001, 0.0001, 0.013, 0.0001, 0.013, 0.0001, 0.001, 0.0001, 0.027, 0.004, 0.007, 0.008, 0.027, 0.004, 0.006, 0.007, 0.02, 0.001, 0.004, 0.016, 0.009, 0.019, 0.018, 0.006, 0.0001, 0.019, 0.014, 0.015, 0.011, 0.003, 0.002, 0.002, 0.004, 0.001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 3.257, 1.78, 2.381, 2.851, 0.156, 1.36, 0.178, 0.773, 1.001, 0.006, 0.006, 0.869, 0.319, 0.035, 0.373, 0.165, 0.161, 0.088, 0.098, 0.049, 0.312, 2.25, 0.007, 0.017, 0.069, 0.007, 0.174, 0.039, 0.101, 0.06, 0.095, 0.155, 0.212, 0.157, 0.129, 0.054, 0.061, 0.066, 0.005, 1.16, 0.101, 0.002, 0.0001, 0.045, 0.001, 0.021, 0.156, 0.041, 4.16, 0.372, 1.295, 0.368, 0.304, 3.139, 0.041, 0.13, 2.185, 0.64, 1.311, 1.785, 0.994, 3.619, 1.18, 1.135, 0.0001, 0.0001, 0.101, 1.175, 3.79, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.002, 0.001, 24.733, 13.586, 0.004, 0.088, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.282, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "cy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.628, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.48, 0.003, 0.545, 0.0001, 0.001, 0.007, 0.002, 0.872, 0.259, 0.258, 0.001, 0.001, 0.777, 0.194, 0.96, 0.016, 0.363, 0.487, 0.244, 0.138, 0.133, 0.135, 0.125, 0.126, 0.164, 0.239, 0.149, 0.081, 0.022, 0.001, 0.022, 0.003, 0.0001, 0.36, 0.242, 0.56, 0.267, 0.155, 0.163, 0.331, 0.126, 0.112, 0.06, 0.033, 0.279, 0.433, 0.133, 0.073, 0.238, 0.004, 0.18, 0.303, 0.196, 0.061, 0.026, 0.092, 0.003, 0.167, 0.006, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 7.082, 0.905, 1.506, 6.475, 6.263, 2.165, 2.494, 2.4, 4.773, 0.015, 0.114, 3.901, 1.419, 6.217, 4.277, 0.556, 0.008, 5.57, 2.092, 2.13, 1.941, 0.086, 2.82, 0.025, 5.712, 0.034, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.074, 0.005, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.021, 0.002, 0.001, 0.0001, 0.001, 0.002, 0.033, 0.001, 0.001, 0.007, 0.009, 0.001, 0.001, 0.033, 0.007, 0.059, 0.003, 0.003, 0.001, 0.001, 0.003, 0.004, 0.015, 0.016, 0.004, 0.001, 0.004, 0.01, 0.012, 0.004, 0.003, 0.003, 0.004, 0.074, 0.043, 0.005, 0.016, 0.003, 0.006, 0.003, 0.002, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.036, 0.221, 0.003, 0.06, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.007, 0.004, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.072, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "din": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.698, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.927, 0.0001, 0.06, 0.0001, 0.003, 0.013, 0.0001, 0.015, 0.171, 0.17, 0.0001, 0.0001, 0.878, 0.077, 0.901, 0.027, 0.297, 0.229, 0.151, 0.055, 0.064, 0.078, 0.053, 0.048, 0.049, 0.126, 0.018, 0.013, 0.002, 0.0001, 0.002, 0.005, 0.0001, 0.424, 0.153, 0.093, 0.101, 0.075, 0.019, 0.074, 0.021, 0.051, 0.069, 0.324, 0.085, 0.16, 0.163, 0.021, 0.306, 0.002, 0.087, 0.062, 0.288, 0.034, 0.007, 0.069, 0.0001, 0.136, 0.003, 0.027, 0.0001, 0.027, 0.0001, 0.0001, 0.0001, 5.438, 0.999, 2.9, 1.603, 4.394, 0.024, 0.521, 1.912, 3.749, 0.362, 4.818, 2.02, 1.512, 4.26, 1.668, 1.035, 0.003, 2.29, 0.155, 3.595, 3.428, 0.022, 0.527, 0.011, 2.005, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.036, 0.001, 0.001, 0.0001, 0.027, 0.0001, 0.026, 0.0001, 1.487, 0.0001, 0.005, 1.04, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 2.319, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 1.678, 0.006, 0.006, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.222, 1.181, 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.0001, 3.25, 0.0001, 0.001, 0.006, 1.508, 0.003, 0.002, 0.006, 0.002, 0.0001, 0.011, 1.021, 0.001, 0.004, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.016, 6.971, 0.0001, 1.041, 0.02, 0.0001, 0.0001, 4.193, 0.0001, 0.0001, 1.487, 0.0001, 0.027, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.062, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "diq": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.719, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.354, 0.008, 0.4, 0.0001, 0.0001, 0.009, 0.0001, 0.031, 0.299, 0.3, 0.001, 0.003, 0.98, 0.165, 1.27, 0.045, 0.227, 0.302, 0.162, 0.087, 0.08, 0.089, 0.076, 0.082, 0.096, 0.17, 0.156, 0.035, 0.026, 0.008, 0.027, 0.01, 0.0001, 0.309, 0.187, 0.135, 0.206, 0.243, 0.108, 0.12, 0.188, 0.05, 0.033, 0.209, 0.106, 0.271, 0.167, 0.06, 0.167, 0.062, 0.13, 0.271, 0.259, 0.059, 0.085, 0.06, 0.052, 0.088, 0.128, 0.014, 0.0001, 0.014, 0.0001, 0.002, 0.001, 7.586, 1.293, 0.911, 2.514, 8.148, 0.439, 0.62, 0.759, 4.61, 0.11, 2.125, 1.599, 2.095, 4.93, 3.468, 0.588, 0.377, 4.808, 2.018, 2.359, 1.695, 0.626, 1.106, 0.479, 3.36, 1.081, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.078, 0.018, 0.011, 0.012, 0.02, 0.015, 0.019, 0.078, 0.016, 0.004, 0.018, 0.002, 0.014, 0.004, 0.014, 0.003, 0.006, 0.005, 0.003, 0.011, 0.005, 0.006, 0.005, 0.002, 0.009, 0.023, 0.002, 0.004, 0.022, 0.016, 0.065, 0.865, 0.032, 0.01, 0.013, 0.005, 0.007, 0.004, 0.006, 0.242, 0.014, 0.032, 2.716, 0.012, 0.007, 0.008, 0.29, 0.015, 0.191, 2.379, 0.013, 0.015, 0.01, 0.006, 0.021, 0.004, 0.009, 0.01, 0.007, 0.128, 0.093, 0.009, 0.008, 0.006, 0.0001, 0.0001, 0.039, 3.563, 2.668, 0.816, 0.0001, 0.001, 0.0001, 0.005, 0.003, 0.002, 0.002, 0.0001, 0.03, 0.013, 0.034, 0.014, 0.001, 0.0001, 0.001, 0.012, 0.005, 0.037, 0.126, 0.091, 0.007, 0.013, 0.003, 0.0001, 0.0001, 0.0001, 0.019, 0.012, 0.072, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "dsb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.783, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.853, 0.003, 0.608, 0.0001, 0.0001, 0.007, 0.002, 0.016, 0.311, 0.311, 0.022, 0.002, 0.839, 0.138, 1.194, 0.023, 0.287, 0.411, 0.214, 0.128, 0.124, 0.131, 0.109, 0.104, 0.125, 0.201, 0.084, 0.035, 0.006, 0.007, 0.007, 0.003, 0.0001, 0.155, 0.168, 0.123, 0.122, 0.077, 0.058, 0.102, 0.068, 0.054, 0.115, 0.164, 0.108, 0.197, 0.144, 0.038, 0.256, 0.004, 0.113, 0.246, 0.119, 0.042, 0.025, 0.244, 0.005, 0.007, 0.075, 0.008, 0.0001, 0.008, 0.0001, 0.002, 0.0001, 6.833, 1.047, 1.719, 1.818, 5.619, 0.234, 0.977, 0.835, 3.647, 3.795, 2.962, 1.965, 2.079, 4.006, 5.923, 1.615, 0.008, 3.224, 3.399, 2.803, 2.458, 0.071, 3.327, 0.021, 1.623, 1.195, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.148, 0.049, 0.931, 0.01, 0.22, 0.006, 0.005, 0.266, 0.005, 0.002, 0.002, 0.002, 0.017, 0.029, 0.002, 0.002, 0.007, 0.003, 0.004, 0.026, 0.004, 0.064, 0.004, 0.004, 0.009, 0.024, 0.008, 1.886, 0.043, 0.009, 0.04, 0.009, 0.064, 0.625, 0.008, 0.004, 0.017, 0.003, 0.003, 0.004, 0.006, 0.017, 0.003, 0.004, 0.001, 0.008, 0.001, 0.002, 0.019, 0.008, 0.014, 1.225, 0.005, 0.009, 0.011, 0.005, 0.012, 0.012, 0.395, 0.009, 0.027, 0.02, 0.616, 0.016, 0.0001, 0.0001, 0.039, 1.311, 1.431, 3.692, 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.0001, 0.017, 0.009, 0.074, 0.029, 0.001, 0.0001, 0.0001, 0.002, 0.007, 0.043, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.012, 0.141, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "dty": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.724, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.716, 0.001, 0.019, 0.0001, 0.0001, 0.003, 0.0001, 0.008, 0.063, 0.066, 0.001, 0.0001, 0.189, 0.033, 0.052, 0.008, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.027, 0.004, 0.012, 0.001, 0.012, 0.001, 0.0001, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.017, 0.012, 0.004, 0.005, 0.014, 0.002, 0.003, 0.006, 0.016, 0.001, 0.004, 0.007, 0.008, 0.013, 0.011, 0.003, 0.0001, 0.019, 0.008, 0.009, 0.004, 0.001, 0.003, 0.0001, 0.003, 0.001, 0.0001, 0.015, 0.0001, 0.0001, 0.0001, 0.87, 0.744, 0.354, 0.069, 0.0001, 0.295, 0.114, 1.106, 0.404, 0.216, 0.006, 1.008, 0.08, 2.434, 0.0001, 0.171, 0.009, 0.001, 0.001, 0.025, 0.014, 1.53, 0.174, 0.539, 0.045, 0.068, 0.25, 0.269, 0.443, 0.023, 0.04, 0.304, 0.083, 0.214, 0.028, 0.182, 24.937, 7.5, 0.641, 0.298, 1.687, 0.033, 0.816, 0.129, 0.459, 0.371, 1.179, 1.062, 2.109, 0.002, 1.084, 0.0001, 0.0001, 0.578, 0.275, 0.191, 1.004, 0.659, 0.001, 0.0001, 0.01, 0.01, 3.197, 1.534, 0.0001, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.897, 0.0001, 0.034, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "dv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.449, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.782, 0.003, 0.057, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.068, 0.068, 0.0001, 0.001, 0.01, 0.02, 0.58, 0.003, 0.08, 0.111, 0.068, 0.041, 0.031, 0.037, 0.03, 0.031, 0.035, 0.052, 0.01, 0.001, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.002, 0.002, 0.001, 0.003, 0.003, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.002, 0.003, 0.005, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.004, 0.0001, 0.069, 0.013, 0.026, 0.027, 0.096, 0.015, 0.017, 0.033, 0.065, 0.001, 0.006, 0.037, 0.021, 0.063, 0.061, 0.016, 0.001, 0.05, 0.05, 0.064, 0.025, 0.009, 0.011, 0.002, 0.014, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.961, 0.592, 2.65, 1.657, 0.723, 0.269, 1.597, 3.461, 1.72, 1.651, 0.757, 0.977, 1.223, 0.768, 1.538, 0.011, 0.778, 0.359, 0.094, 0.266, 0.255, 0.126, 0.187, 0.051, 0.006, 0.076, 0.047, 0.004, 0.004, 0.086, 0.041, 0.008, 0.02, 0.003, 0.091, 0.008, 0.069, 0.003, 5.331, 1.558, 2.986, 0.988, 3.164, 0.17, 3.662, 0.439, 0.51, 0.17, 3.636, 0.006, 0.014, 0.003, 0.002, 0.002, 0.001, 0.014, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.201, 0.101, 0.0001, 0.002, 0.0001, 0.0001, 45.417, 0.0001, 0.002, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "dz": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.39, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.815, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.023, 0.023, 0.0001, 0.002, 0.003, 0.013, 0.008, 0.001, 0.017, 0.015, 0.012, 0.006, 0.005, 0.004, 0.005, 0.004, 0.004, 0.004, 0.001, 0.0001, 0.007, 0.0001, 0.007, 0.001, 0.0001, 0.002, 0.004, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.003, 0.001, 0.0001, 0.004, 0.0001, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.03, 0.011, 0.006, 0.008, 0.024, 0.002, 0.006, 0.009, 0.021, 0.002, 0.004, 0.014, 0.011, 0.019, 0.021, 0.004, 0.0001, 0.02, 0.011, 0.013, 0.01, 0.002, 0.002, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.269, 0.247, 1.794, 0.002, 1.18, 0.189, 0.19, 0.052, 0.002, 0.102, 0.016, 7.859, 0.051, 0.549, 0.008, 0.12, 0.301, 1.592, 0.28, 1.053, 0.694, 0.157, 1.278, 0.061, 0.824, 0.093, 0.2, 0.068, 0.006, 0.019, 0.267, 0.283, 0.898, 0.517, 1.238, 0.954, 0.214, 0.015, 2.251, 0.029, 0.117, 0.081, 0.001, 0.058, 0.0001, 0.012, 0.002, 0.0001, 0.002, 0.89, 2.149, 0.094, 1.08, 0.001, 0.0001, 0.053, 0.001, 0.0001, 0.926, 0.001, 10.076, 21.494, 2.583, 0.002, 0.0001, 0.0001, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 32.733, 0.0001, 0.016, 0.005, 0.001, 0.002, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ee": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.047, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.659, 0.001, 0.347, 0.0001, 0.001, 0.004, 0.004, 0.044, 0.199, 0.199, 0.001, 0.0001, 0.713, 0.054, 1.348, 0.005, 0.312, 0.38, 0.219, 0.115, 0.09, 0.132, 0.118, 0.118, 0.109, 0.211, 0.064, 0.006, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.552, 0.172, 0.134, 0.182, 0.397, 0.085, 0.215, 0.112, 0.083, 0.04, 0.209, 0.217, 0.202, 0.168, 0.043, 0.117, 0.006, 0.112, 0.229, 0.176, 0.053, 0.059, 0.177, 0.021, 0.139, 0.02, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 7.214, 1.62, 0.258, 2.122, 10.212, 0.557, 1.427, 0.62, 4.11, 0.028, 2.137, 3.419, 2.267, 3.348, 4.663, 0.886, 0.007, 1.264, 2.303, 2.327, 2.541, 0.557, 2.031, 0.389, 1.697, 0.84, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.058, 0.011, 0.016, 0.109, 0.004, 0.002, 0.009, 0.001, 0.003, 0.01, 0.044, 0.61, 0.005, 0.002, 0.0001, 0.003, 0.018, 0.018, 1.229, 0.009, 2.883, 0.003, 1.23, 0.001, 0.002, 0.008, 0.003, 0.085, 0.02, 0.018, 0.001, 0.001, 0.052, 0.01, 0.004, 0.485, 0.002, 0.0001, 0.002, 0.004, 0.005, 0.042, 0.003, 0.002, 0.003, 0.025, 0.002, 0.002, 0.007, 0.009, 0.047, 0.01, 0.005, 0.003, 0.005, 0.003, 0.006, 0.005, 0.14, 0.007, 0.005, 0.138, 0.008, 0.004, 0.0001, 0.0001, 0.039, 0.487, 0.018, 0.548, 1.276, 0.0001, 0.004, 4.335, 0.128, 0.004, 0.106, 0.013, 0.028, 0.013, 0.041, 0.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.138, 0.051, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "eml": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.684, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.039, 0.004, 0.415, 0.0001, 0.0001, 0.004, 0.001, 1.632, 0.216, 0.216, 0.001, 0.001, 0.746, 0.069, 0.997, 0.011, 0.415, 0.659, 0.408, 0.216, 0.231, 0.235, 0.226, 0.213, 0.215, 0.256, 0.061, 0.026, 0.05, 0.006, 0.05, 0.003, 0.0001, 0.44, 0.139, 0.4, 0.112, 0.078, 0.095, 0.114, 0.018, 0.424, 0.019, 0.012, 0.251, 0.226, 0.059, 0.026, 0.233, 0.016, 0.153, 0.231, 0.099, 0.036, 0.164, 0.011, 0.127, 0.003, 0.015, 0.004, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 7.63, 0.549, 2.301, 3.601, 3.529, 0.617, 1.263, 0.808, 5.22, 0.113, 0.052, 4.92, 1.657, 5.406, 1.72, 1.353, 0.118, 3.957, 2.689, 3.146, 2.026, 0.904, 0.024, 0.02, 0.047, 0.34, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.239, 0.003, 0.006, 0.003, 0.004, 0.052, 0.002, 0.003, 0.008, 0.003, 0.006, 0.001, 0.002, 0.193, 0.002, 0.001, 0.002, 0.002, 0.003, 0.098, 0.002, 0.001, 0.001, 0.001, 0.033, 0.188, 0.003, 0.047, 0.006, 0.006, 0.001, 0.078, 0.562, 0.025, 0.617, 0.129, 0.182, 0.072, 0.003, 0.005, 1.444, 0.829, 0.895, 0.057, 0.235, 0.011, 0.346, 0.001, 0.004, 0.003, 0.664, 0.345, 0.314, 0.007, 0.019, 0.001, 0.003, 0.275, 0.004, 0.186, 0.062, 0.002, 0.002, 0.006, 0.0001, 0.0001, 0.011, 6.936, 0.1, 0.325, 0.0001, 0.004, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.003, 0.002, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.192, 0.237, 0.003, 0.002, 0.005, 0.003, 0.003, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "eo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.154, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.737, 0.006, 0.429, 0.0001, 0.0001, 0.01, 0.001, 0.015, 0.235, 0.235, 0.001, 0.003, 0.936, 0.306, 0.916, 0.015, 0.284, 0.481, 0.226, 0.14, 0.134, 0.143, 0.121, 0.123, 0.155, 0.273, 0.072, 0.027, 0.012, 0.007, 0.013, 0.002, 0.0001, 0.209, 0.154, 0.114, 0.106, 0.232, 0.094, 0.127, 0.102, 0.106, 0.077, 0.183, 0.354, 0.184, 0.118, 0.083, 0.187, 0.004, 0.116, 0.241, 0.149, 0.061, 0.074, 0.035, 0.004, 0.009, 0.024, 0.021, 0.0001, 0.021, 0.0001, 0.004, 0.0001, 9.544, 0.784, 0.841, 2.534, 6.934, 0.706, 0.989, 0.423, 6.212, 2.407, 2.868, 4.302, 1.963, 5.456, 7.143, 1.699, 0.009, 4.617, 4.113, 4.222, 2.31, 1.083, 0.045, 0.017, 0.108, 0.46, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.058, 0.01, 0.009, 0.008, 0.004, 0.004, 0.002, 0.003, 0.037, 0.239, 0.001, 0.001, 0.004, 0.007, 0.001, 0.002, 0.002, 0.007, 0.002, 0.018, 0.008, 0.001, 0.002, 0.002, 0.002, 0.012, 0.003, 0.005, 0.093, 0.609, 0.008, 0.005, 0.021, 0.066, 0.005, 0.003, 0.01, 0.029, 0.002, 0.005, 0.005, 0.035, 0.002, 0.007, 0.002, 0.34, 0.001, 0.002, 0.012, 0.007, 0.011, 0.025, 0.006, 0.093, 0.016, 0.003, 0.007, 0.003, 0.008, 0.009, 0.016, 0.009, 0.009, 0.003, 0.0001, 0.0001, 0.038, 0.2, 0.946, 0.502, 0.0001, 0.001, 0.005, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.012, 0.006, 0.045, 0.015, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.003, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.056, 0.002, 0.001, 0.003, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "eu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.418, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.177, 0.001, 0.297, 0.0001, 0.0001, 0.006, 0.001, 0.01, 0.167, 0.167, 0.0001, 0.001, 1.097, 0.307, 1.039, 0.006, 0.582, 0.665, 0.539, 0.263, 0.232, 0.207, 0.196, 0.233, 0.193, 0.297, 0.077, 0.037, 0.019, 0.004, 0.019, 0.001, 0.0001, 0.228, 0.197, 0.105, 0.074, 0.177, 0.09, 0.111, 0.131, 0.123, 0.048, 0.077, 0.106, 0.134, 0.065, 0.059, 0.121, 0.005, 0.05, 0.134, 0.08, 0.034, 0.046, 0.019, 0.022, 0.008, 0.029, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.0001, 11.924, 1.97, 0.229, 2.409, 9.817, 0.3, 1.545, 0.915, 6.874, 0.162, 4.015, 2.508, 1.08, 6.457, 4.385, 0.883, 0.011, 6.261, 2.025, 5.706, 3.55, 0.077, 0.032, 0.337, 0.117, 3.463, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.014, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.008, 0.009, 0.002, 0.002, 0.004, 0.001, 0.001, 0.003, 0.009, 0.023, 0.001, 0.012, 0.001, 0.01, 0.001, 0.001, 0.003, 0.012, 0.007, 0.008, 0.006, 0.001, 0.003, 0.001, 0.002, 0.001, 0.004, 0.012, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.039, 0.094, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.013, 0.001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ext": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.183, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.144, 0.002, 0.474, 0.0001, 0.0001, 0.008, 0.001, 0.271, 0.191, 0.19, 0.004, 0.002, 1.06, 0.101, 0.854, 0.021, 0.249, 0.293, 0.188, 0.105, 0.088, 0.096, 0.085, 0.084, 0.099, 0.161, 0.072, 0.026, 0.008, 0.003, 0.006, 0.002, 0.0001, 0.241, 0.103, 0.248, 0.095, 0.369, 0.065, 0.091, 0.071, 0.128, 0.047, 0.018, 0.238, 0.161, 0.09, 0.062, 0.171, 0.026, 0.094, 0.188, 0.116, 0.077, 0.083, 0.02, 0.035, 0.009, 0.011, 0.028, 0.0001, 0.029, 0.0001, 0.001, 0.002, 8.822, 0.896, 2.974, 2.338, 7.586, 0.409, 0.951, 0.639, 6.63, 0.18, 0.079, 4.794, 1.966, 5.508, 3.713, 1.742, 0.451, 4.358, 5.625, 3.427, 5.456, 0.664, 0.026, 0.047, 0.265, 0.205, 0.0001, 0.012, 0.0001, 0.001, 0.0001, 0.09, 0.042, 0.016, 0.012, 0.021, 0.01, 0.009, 0.007, 0.019, 0.01, 0.009, 0.002, 0.007, 0.012, 0.003, 0.002, 0.01, 0.006, 0.003, 0.011, 0.012, 0.003, 0.002, 0.002, 0.004, 0.049, 0.003, 0.005, 0.01, 0.009, 0.003, 0.003, 0.02, 0.663, 0.003, 0.009, 0.008, 0.004, 0.004, 0.092, 0.006, 0.332, 0.01, 0.012, 0.009, 0.354, 0.005, 0.01, 0.016, 0.295, 0.019, 0.537, 0.024, 0.015, 0.008, 0.008, 0.011, 0.017, 0.174, 0.02, 0.041, 0.023, 0.01, 0.023, 0.0001, 0.0001, 0.078, 2.453, 0.012, 0.009, 0.0001, 0.0001, 0.0001, 0.019, 0.008, 0.025, 0.005, 0.0001, 0.151, 0.073, 0.021, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.034, 0.026, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.021, 0.082, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ff": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.229, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.756, 0.003, 0.154, 0.0001, 0.0001, 0.002, 0.0001, 0.07, 0.321, 0.324, 0.004, 0.001, 1.19, 0.201, 1.011, 0.039, 0.221, 0.281, 0.197, 0.076, 0.082, 0.099, 0.098, 0.084, 0.101, 0.154, 0.153, 0.028, 0.04, 0.008, 0.04, 0.01, 0.0001, 0.371, 0.159, 0.12, 0.097, 0.095, 0.198, 0.111, 0.12, 0.065, 0.102, 0.267, 0.138, 0.299, 0.201, 0.095, 0.085, 0.014, 0.046, 0.262, 0.159, 0.061, 0.013, 0.059, 0.003, 0.066, 0.008, 0.007, 0.0001, 0.007, 0.0001, 0.006, 0.0001, 10.449, 0.928, 0.343, 3.119, 8.063, 0.727, 1.432, 1.127, 6.432, 0.966, 2.387, 3.274, 2.586, 6.222, 6.89, 0.484, 0.058, 2.623, 1.086, 2.251, 3.239, 0.048, 1.581, 0.013, 1.385, 0.042, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.25, 0.043, 0.0001, 0.008, 0.007, 0.001, 0.007, 0.002, 0.023, 0.003, 0.031, 0.086, 0.001, 0.0001, 0.009, 0.005, 0.007, 0.017, 0.003, 1.378, 0.001, 0.001, 0.0001, 1.485, 0.01, 0.123, 0.001, 0.002, 0.036, 0.035, 0.003, 0.0001, 0.06, 0.009, 0.0001, 0.003, 0.0001, 0.002, 0.02, 0.011, 0.007, 0.04, 0.001, 0.024, 0.001, 0.003, 0.0001, 0.0001, 0.006, 0.154, 0.006, 0.01, 0.135, 0.002, 0.002, 0.009, 0.004, 0.002, 0.004, 0.025, 0.02, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.111, 0.229, 0.005, 0.088, 0.202, 0.0001, 0.0001, 2.86, 0.02, 0.001, 0.001, 0.0001, 0.003, 0.0001, 0.017, 0.011, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.023, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.248, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fj": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.647, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.11, 0.005, 0.222, 0.0001, 0.0001, 0.0001, 0.002, 0.182, 0.39, 0.39, 0.002, 0.003, 0.665, 0.202, 1.418, 0.055, 0.382, 0.504, 0.342, 0.179, 0.168, 0.196, 0.159, 0.133, 0.129, 0.164, 0.07, 0.04, 0.02, 0.002, 0.02, 0.013, 0.002, 0.352, 0.212, 0.246, 0.146, 0.319, 0.066, 0.096, 0.061, 0.166, 0.217, 0.277, 0.179, 0.262, 0.29, 0.095, 0.254, 0.022, 0.118, 0.377, 0.355, 0.066, 0.534, 0.043, 0.003, 0.05, 0.01, 0.0001, 0.0001, 0.005, 0.0001, 0.008, 0.0001, 13.891, 0.708, 1.055, 1.505, 4.909, 0.352, 0.936, 0.685, 8.96, 0.075, 2.998, 2.827, 2.182, 5.506, 3.831, 0.546, 0.257, 2.747, 2.722, 3.592, 4.532, 2.046, 0.526, 0.045, 0.71, 0.111, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.267, 0.01, 0.007, 0.005, 0.007, 0.002, 0.0001, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.008, 0.0001, 0.0001, 0.013, 0.192, 0.0001, 0.003, 0.002, 0.0001, 0.008, 0.002, 0.0001, 0.023, 0.022, 0.002, 0.0001, 0.007, 0.005, 0.0001, 0.01, 0.003, 0.0001, 0.002, 0.005, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.008, 0.0001, 0.003, 0.022, 0.003, 0.002, 0.005, 0.0001, 0.008, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.013, 0.065, 0.0001, 0.023, 0.002, 0.0001, 0.0001, 0.013, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.002, 0.01, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.26, 0.0001, 0.003, 0.002, 0.0001, 0.003, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.171, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.257, 0.003, 0.223, 0.0001, 0.0001, 0.01, 0.002, 0.015, 0.14, 0.141, 0.001, 0.001, 0.983, 0.292, 1.473, 0.021, 0.562, 0.624, 0.361, 0.197, 0.187, 0.183, 0.177, 0.172, 0.176, 0.285, 0.092, 0.018, 0.015, 0.005, 0.015, 0.002, 0.0001, 0.162, 0.14, 0.076, 0.088, 0.116, 0.204, 0.083, 0.244, 0.058, 0.087, 0.291, 0.108, 0.161, 0.114, 0.065, 0.092, 0.004, 0.082, 0.312, 0.204, 0.061, 0.078, 0.034, 0.003, 0.012, 0.006, 0.004, 0.0001, 0.004, 0.0001, 0.002, 0.0001, 6.488, 0.752, 0.145, 1.557, 3.939, 1.383, 2.415, 1.123, 6.407, 0.628, 2.151, 3.099, 2.563, 5.616, 2.172, 0.663, 0.005, 6.541, 3.536, 4.094, 3.571, 2.164, 0.044, 0.017, 0.862, 0.025, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.054, 0.049, 0.002, 0.002, 0.002, 0.004, 0.003, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.091, 0.001, 0.001, 0.001, 0.001, 0.001, 0.033, 0.002, 0.001, 0.002, 0.001, 0.017, 0.004, 0.006, 0.001, 0.006, 0.009, 0.001, 0.001, 0.01, 0.939, 0.001, 0.001, 0.016, 0.008, 0.277, 0.003, 0.006, 0.007, 0.001, 0.002, 0.001, 1.13, 0.001, 0.004, 1.899, 0.003, 0.003, 0.718, 0.002, 0.002, 0.014, 0.001, 0.801, 0.002, 0.333, 0.003, 0.004, 0.203, 0.003, 0.002, 0.0001, 0.0001, 0.022, 6.504, 0.004, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.012, 0.005, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.004, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.053, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "frp": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.788, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.014, 0.012, 0.659, 0.001, 0.0001, 0.001, 0.001, 0.361, 0.368, 0.368, 0.001, 0.0001, 0.743, 0.467, 0.873, 0.02, 0.214, 0.426, 0.274, 0.128, 0.113, 0.117, 0.113, 0.107, 0.116, 0.228, 0.11, 0.019, 0.081, 0.005, 0.081, 0.002, 0.0001, 0.35, 0.279, 0.333, 0.142, 0.141, 0.152, 0.135, 0.066, 0.159, 0.087, 0.033, 0.593, 0.22, 0.099, 0.082, 0.206, 0.019, 0.236, 0.314, 0.121, 0.062, 0.179, 0.013, 0.025, 0.027, 0.009, 0.022, 0.0001, 0.022, 0.0001, 0.006, 0.0001, 6.3, 0.639, 2.237, 2.924, 6.953, 0.549, 0.996, 0.581, 3.639, 0.252, 0.124, 3.838, 1.505, 5.552, 4.982, 1.442, 0.366, 4.363, 4.487, 4.4, 2.763, 0.919, 0.029, 0.168, 0.501, 0.132, 0.0001, 0.008, 0.0001, 0.001, 0.0001, 0.591, 0.012, 0.04, 0.026, 0.003, 0.003, 0.002, 0.002, 0.077, 0.083, 0.002, 0.003, 0.004, 0.003, 0.002, 0.005, 0.007, 0.003, 0.002, 0.023, 0.039, 0.002, 0.001, 0.002, 0.013, 0.56, 0.002, 0.002, 0.004, 0.004, 0.002, 0.004, 0.079, 0.014, 0.761, 0.004, 0.005, 0.003, 0.004, 0.044, 1.724, 0.994, 0.451, 0.049, 0.014, 0.007, 0.008, 0.004, 0.024, 0.005, 0.02, 0.03, 0.411, 0.012, 0.002, 0.176, 0.006, 0.01, 0.014, 0.089, 0.007, 0.007, 0.007, 0.005, 0.0001, 0.0001, 0.277, 4.789, 0.008, 0.018, 0.001, 0.0001, 0.0001, 0.008, 0.004, 0.004, 0.003, 0.001, 0.014, 0.004, 0.075, 0.032, 0.0001, 0.0001, 0.001, 0.005, 0.001, 0.004, 0.007, 0.005, 0.0001, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.004, 0.024, 0.586, 0.003, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "frr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.212, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.548, 0.003, 0.682, 0.0001, 0.001, 0.008, 0.0001, 0.237, 0.407, 0.407, 0.015, 0.002, 0.738, 0.264, 1.349, 0.032, 0.426, 0.487, 0.285, 0.155, 0.131, 0.142, 0.153, 0.132, 0.154, 0.213, 0.163, 0.033, 0.094, 0.019, 0.094, 0.014, 0.0001, 0.424, 0.235, 0.114, 0.463, 0.142, 0.219, 0.132, 0.243, 0.123, 0.143, 0.217, 0.156, 0.239, 0.202, 0.1, 0.178, 0.008, 0.163, 0.493, 0.169, 0.107, 0.04, 0.158, 0.005, 0.006, 0.018, 0.02, 0.0001, 0.02, 0.0001, 0.015, 0.0001, 7.38, 1.026, 0.694, 2.643, 7.751, 1.48, 1.329, 1.414, 5.143, 0.835, 1.946, 2.506, 1.658, 6.635, 2.847, 0.757, 0.017, 4.866, 3.953, 4.835, 3.559, 0.125, 1.078, 0.025, 0.13, 0.078, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.121, 0.04, 0.005, 0.007, 0.011, 0.01, 0.004, 0.003, 0.014, 0.003, 0.007, 0.003, 0.003, 0.004, 0.004, 0.002, 0.006, 0.041, 0.003, 0.029, 0.004, 0.002, 0.039, 0.002, 0.005, 0.057, 0.003, 0.003, 0.033, 0.001, 0.015, 0.005, 0.043, 0.01, 0.008, 0.004, 0.702, 0.24, 0.006, 0.008, 0.007, 0.041, 0.006, 0.01, 0.003, 0.013, 0.002, 0.004, 0.015, 0.008, 0.014, 0.009, 0.006, 0.008, 0.971, 0.003, 0.022, 0.007, 0.006, 0.005, 0.964, 0.005, 0.004, 0.003, 0.0001, 0.0001, 0.041, 3.039, 0.101, 0.012, 0.0001, 0.001, 0.0001, 0.016, 0.008, 0.014, 0.003, 0.0001, 0.014, 0.006, 0.019, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.018, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.024, 0.122, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fur": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.465, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.803, 0.002, 0.385, 0.0001, 0.0001, 0.006, 0.001, 0.135, 0.204, 0.203, 0.001, 0.001, 0.945, 0.084, 1.045, 0.015, 0.262, 0.474, 0.24, 0.16, 0.15, 0.158, 0.149, 0.15, 0.168, 0.219, 0.076, 0.046, 0.024, 0.003, 0.006, 0.002, 0.0001, 0.268, 0.102, 0.337, 0.116, 0.078, 0.115, 0.121, 0.022, 0.278, 0.048, 0.02, 0.218, 0.154, 0.07, 0.05, 0.172, 0.005, 0.086, 0.217, 0.131, 0.073, 0.108, 0.016, 0.024, 0.002, 0.027, 0.004, 0.001, 0.004, 0.0001, 0.016, 0.0001, 6.873, 0.54, 3.119, 3.521, 7.672, 0.855, 0.912, 0.901, 8.131, 0.838, 0.065, 4.486, 1.745, 5.361, 3.491, 1.873, 0.016, 4.269, 4.833, 4.488, 2.566, 1.056, 0.024, 0.012, 0.029, 0.497, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.039, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.013, 0.0001, 0.001, 0.008, 0.008, 0.0001, 0.002, 0.187, 0.005, 0.973, 0.001, 0.004, 0.001, 0.001, 0.127, 0.268, 0.009, 0.161, 0.005, 0.069, 0.003, 0.185, 0.001, 0.033, 0.003, 0.05, 0.006, 0.254, 0.001, 0.005, 0.001, 0.001, 0.015, 0.003, 0.208, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.042, 2.523, 0.01, 0.009, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.01, 0.005, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.038, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "fy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.82, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.701, 0.001, 0.398, 0.0001, 0.001, 0.014, 0.003, 0.455, 0.166, 0.166, 0.001, 0.0001, 0.747, 0.192, 0.908, 0.008, 0.277, 0.415, 0.181, 0.098, 0.101, 0.113, 0.107, 0.108, 0.145, 0.219, 0.052, 0.025, 0.005, 0.001, 0.005, 0.002, 0.0001, 0.213, 0.183, 0.091, 0.343, 0.093, 0.196, 0.109, 0.18, 0.193, 0.088, 0.132, 0.122, 0.161, 0.156, 0.11, 0.106, 0.003, 0.108, 0.302, 0.13, 0.038, 0.048, 0.113, 0.006, 0.12, 0.009, 0.007, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 6.027, 1.091, 0.691, 3.439, 11.73, 1.889, 1.306, 1.373, 5.412, 1.009, 2.464, 2.808, 1.837, 7.368, 3.471, 1.074, 0.006, 5.381, 4.264, 5.226, 1.268, 0.226, 1.241, 0.017, 1.595, 0.254, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.043, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.007, 0.001, 0.0001, 0.001, 0.001, 0.004, 0.021, 0.0001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.013, 0.004, 0.263, 0.001, 0.008, 0.001, 0.001, 0.002, 0.002, 0.01, 0.258, 0.016, 0.001, 0.003, 0.001, 0.013, 0.005, 0.004, 0.006, 0.003, 0.084, 0.002, 0.006, 0.001, 0.003, 0.002, 0.21, 0.348, 0.006, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.02, 1.229, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.015, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.042, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ga": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.234, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.249, 0.002, 0.288, 0.0001, 0.001, 0.013, 0.002, 0.109, 0.15, 0.15, 0.0001, 0.002, 0.872, 0.193, 0.872, 0.017, 0.241, 0.359, 0.187, 0.093, 0.09, 0.096, 0.095, 0.093, 0.117, 0.202, 0.044, 0.013, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.26, 0.338, 0.441, 0.188, 0.097, 0.15, 0.18, 0.066, 0.279, 0.041, 0.036, 0.154, 0.249, 0.121, 0.062, 0.138, 0.005, 0.145, 0.311, 0.272, 0.036, 0.033, 0.04, 0.007, 0.009, 0.007, 0.033, 0.0001, 0.031, 0.0001, 0.002, 0.0001, 11.315, 1.29, 2.859, 2.236, 4.184, 0.692, 2.117, 5.503, 7.212, 0.011, 0.093, 2.991, 1.605, 6.018, 2.868, 0.471, 0.007, 4.409, 3.653, 3.32, 1.715, 0.088, 0.061, 0.021, 0.135, 0.028, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.063, 0.032, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.059, 0.001, 0.002, 0.002, 0.009, 0.001, 0.001, 0.001, 0.001, 0.001, 0.044, 0.003, 0.001, 0.001, 0.001, 0.005, 0.023, 0.008, 0.001, 0.006, 0.006, 0.0001, 0.001, 0.02, 1.278, 0.008, 0.002, 0.005, 0.001, 0.001, 0.002, 0.002, 1.021, 0.001, 0.002, 0.002, 1.343, 0.001, 0.001, 0.006, 0.004, 0.004, 0.674, 0.002, 0.003, 0.005, 0.001, 0.004, 0.002, 0.624, 0.002, 0.005, 0.004, 0.003, 0.002, 0.0001, 0.0001, 0.022, 5.087, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.011, 0.005, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.061, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gag": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.391, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.28, 0.016, 0.1, 0.0001, 0.001, 0.011, 0.0001, 0.023, 0.153, 0.154, 0.0001, 0.0001, 0.918, 0.454, 1.065, 0.029, 0.183, 0.22, 0.131, 0.062, 0.067, 0.072, 0.06, 0.06, 0.062, 0.143, 0.13, 0.023, 0.015, 0.004, 0.015, 0.028, 0.0001, 0.378, 0.403, 0.048, 0.156, 0.135, 0.049, 0.237, 0.117, 0.049, 0.029, 0.415, 0.105, 0.242, 0.108, 0.187, 0.134, 0.003, 0.159, 0.189, 0.383, 0.092, 0.136, 0.005, 0.011, 0.079, 0.04, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 9.932, 1.463, 0.503, 2.949, 4.34, 0.314, 1.11, 0.547, 5.816, 0.052, 2.859, 4.285, 1.983, 5.174, 2.034, 0.659, 0.007, 5.297, 2.304, 2.138, 2.154, 0.741, 0.006, 0.007, 1.825, 1.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.33, 0.02, 0.014, 0.017, 0.012, 0.006, 0.003, 0.09, 0.004, 0.002, 0.005, 0.006, 0.005, 0.012, 0.002, 0.007, 0.002, 0.004, 0.002, 0.034, 0.066, 0.003, 0.036, 0.002, 0.004, 0.038, 0.004, 0.03, 0.138, 0.106, 0.046, 1.073, 0.005, 0.011, 0.07, 0.054, 1.028, 0.001, 0.006, 0.629, 0.003, 0.006, 0.12, 0.006, 0.002, 0.001, 0.004, 0.003, 0.193, 2.957, 0.016, 0.012, 0.008, 0.03, 0.347, 0.009, 0.023, 0.005, 0.018, 0.016, 1.278, 0.014, 0.03, 0.005, 0.0001, 0.0001, 0.012, 3.601, 3.155, 1.149, 0.001, 0.0001, 0.029, 0.03, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.224, 0.106, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.003, 0.019, 0.015, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.005, 0.317, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gan": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.76, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.481, 0.002, 0.018, 0.0001, 0.0001, 0.024, 0.003, 0.008, 0.023, 0.024, 0.002, 0.006, 0.023, 0.038, 0.047, 0.01, 0.315, 0.585, 0.297, 0.204, 0.191, 0.202, 0.185, 0.171, 0.182, 0.259, 0.005, 0.001, 0.007, 0.003, 0.007, 0.002, 0.0001, 0.033, 0.019, 0.032, 0.016, 0.012, 0.012, 0.016, 0.021, 0.015, 0.011, 0.012, 0.015, 0.023, 0.016, 0.01, 0.022, 0.002, 0.018, 0.031, 0.022, 0.006, 0.009, 0.014, 0.002, 0.005, 0.001, 0.008, 0.001, 0.008, 0.0001, 0.002, 0.0001, 0.219, 0.03, 0.061, 0.069, 0.246, 0.023, 0.046, 0.084, 0.187, 0.005, 0.034, 0.116, 0.064, 0.184, 0.17, 0.035, 0.003, 0.158, 0.115, 0.138, 0.085, 0.023, 0.019, 0.007, 0.04, 0.007, 0.001, 0.001, 0.001, 0.0001, 0.0001, 3.244, 1.279, 2.127, 0.643, 0.387, 0.883, 0.435, 0.848, 1.431, 1.201, 0.629, 1.296, 2.258, 1.163, 0.623, 0.808, 0.937, 0.395, 0.26, 0.593, 0.667, 0.608, 1.031, 1.999, 0.578, 0.845, 0.936, 0.665, 1.536, 0.644, 0.439, 0.928, 0.498, 0.603, 0.631, 0.704, 0.585, 0.768, 0.515, 0.538, 0.76, 0.649, 0.365, 0.712, 0.597, 1.095, 0.882, 0.565, 2.328, 1.119, 0.438, 0.543, 1.012, 0.372, 0.441, 0.708, 1.829, 1.205, 1.47, 1.203, 2.219, 1.044, 0.843, 1.251, 0.0001, 0.0001, 0.055, 0.02, 0.005, 0.006, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.018, 0.009, 0.031, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.007, 0.036, 0.032, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.029, 0.011, 0.055, 2.062, 3.549, 9.312, 4.838, 3.056, 2.889, 2.67, 0.003, 0.005, 0.013, 0.003, 0.002, 1.772, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gd": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.483, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.829, 0.001, 0.374, 0.0001, 0.0001, 0.027, 0.001, 0.653, 0.225, 0.224, 0.001, 0.001, 0.74, 0.732, 0.959, 0.016, 0.275, 0.512, 0.251, 0.163, 0.143, 0.16, 0.146, 0.151, 0.187, 0.234, 0.126, 0.023, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.399, 0.354, 0.494, 0.195, 0.121, 0.114, 0.226, 0.061, 0.158, 0.033, 0.034, 0.204, 0.239, 0.107, 0.062, 0.151, 0.004, 0.164, 0.477, 0.402, 0.038, 0.033, 0.037, 0.023, 0.009, 0.008, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.001, 13.191, 1.481, 2.674, 2.933, 4.722, 0.55, 2.044, 6.832, 6.396, 0.019, 0.13, 2.757, 1.684, 7.147, 2.433, 0.32, 0.014, 3.962, 3.004, 2.554, 2.054, 0.073, 0.068, 0.016, 0.125, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.262, 0.013, 0.005, 0.005, 0.004, 0.003, 0.002, 0.002, 0.031, 0.005, 0.004, 0.001, 0.011, 0.003, 0.002, 0.001, 0.006, 0.003, 0.012, 0.014, 0.004, 0.002, 0.002, 0.002, 0.027, 0.178, 0.003, 0.005, 0.012, 0.011, 0.001, 0.003, 0.677, 0.029, 0.002, 0.003, 0.009, 0.003, 0.004, 0.005, 0.218, 0.029, 0.004, 0.003, 0.303, 0.022, 0.002, 0.003, 0.018, 0.008, 0.323, 0.026, 0.004, 0.004, 0.01, 0.002, 0.006, 0.223, 0.01, 0.003, 0.014, 0.004, 0.005, 0.002, 0.0001, 0.0001, 0.041, 1.912, 0.009, 0.011, 0.0001, 0.0001, 0.0001, 0.018, 0.01, 0.015, 0.003, 0.0001, 0.015, 0.007, 0.02, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.008, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.244, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.812, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.39, 0.002, 0.342, 0.0001, 0.0001, 0.01, 0.001, 0.013, 0.144, 0.144, 0.001, 0.002, 1.02, 0.075, 0.726, 0.01, 0.251, 0.326, 0.181, 0.093, 0.083, 0.092, 0.082, 0.082, 0.102, 0.185, 0.047, 0.021, 0.003, 0.002, 0.002, 0.001, 0.0001, 0.331, 0.122, 0.257, 0.114, 0.192, 0.107, 0.104, 0.065, 0.139, 0.039, 0.03, 0.104, 0.167, 0.127, 0.177, 0.186, 0.007, 0.111, 0.187, 0.12, 0.054, 0.074, 0.026, 0.055, 0.009, 0.01, 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 9.121, 0.85, 3.271, 4.11, 8.668, 0.721, 0.784, 0.524, 5.185, 0.017, 0.092, 2.548, 2.069, 5.528, 7.673, 1.889, 0.464, 5.046, 5.357, 3.627, 2.8, 0.704, 0.036, 0.564, 0.085, 0.291, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.015, 0.013, 0.003, 0.002, 0.002, 0.001, 0.002, 0.002, 0.001, 0.012, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.006, 0.003, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.028, 0.396, 0.001, 0.002, 0.002, 0.001, 0.001, 0.003, 0.003, 0.383, 0.003, 0.007, 0.001, 0.442, 0.001, 0.001, 0.005, 0.193, 0.006, 0.599, 0.002, 0.002, 0.003, 0.001, 0.003, 0.002, 0.219, 0.007, 0.008, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.05, 2.267, 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.011, 0.005, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.014, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "glk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.405, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.911, 0.005, 0.048, 0.0001, 0.0001, 0.001, 0.0001, 0.017, 0.104, 0.105, 0.0001, 0.001, 0.019, 0.086, 0.553, 0.019, 0.043, 0.074, 0.037, 0.051, 0.028, 0.037, 0.027, 0.021, 0.025, 0.021, 0.078, 0.0001, 0.005, 0.006, 0.007, 0.001, 0.0001, 0.004, 0.003, 0.008, 0.003, 0.003, 0.002, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.004, 0.002, 0.001, 0.003, 0.0001, 0.003, 0.005, 0.008, 0.006, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.177, 0.041, 0.015, 0.061, 0.102, 0.013, 0.028, 0.036, 0.115, 0.015, 0.035, 0.047, 0.057, 0.128, 0.083, 0.024, 0.008, 0.098, 0.063, 0.07, 0.058, 0.027, 0.009, 0.013, 0.021, 0.022, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.159, 0.386, 0.313, 0.148, 1.28, 2.09, 3.65, 3.311, 2.644, 0.084, 1.185, 0.003, 3.768, 0.001, 0.042, 0.015, 0.057, 0.007, 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.027, 0.07, 0.004, 0.009, 0.002, 0.001, 0.0001, 0.024, 0.001, 0.005, 0.174, 0.185, 0.526, 0.0001, 0.349, 5.779, 1.561, 0.992, 2.058, 0.045, 0.725, 0.235, 0.5, 2.399, 0.083, 3.048, 0.622, 2.068, 1.214, 0.15, 0.072, 0.14, 0.046, 0.343, 0.079, 0.014, 0.001, 0.0001, 0.271, 0.0001, 0.0001, 0.0001, 0.044, 0.065, 0.002, 0.021, 0.0001, 0.003, 0.0001, 0.068, 0.0001, 0.285, 0.001, 0.0001, 0.001, 0.0001, 0.005, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 21.901, 14.77, 1.833, 3.683, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.141, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.37, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.685, 0.002, 0.175, 0.0001, 0.0001, 0.007, 0.0001, 0.625, 0.171, 0.173, 0.001, 0.002, 1.108, 0.288, 0.925, 0.011, 0.221, 0.306, 0.165, 0.094, 0.084, 0.088, 0.078, 0.08, 0.105, 0.172, 0.107, 0.053, 0.096, 0.001, 0.096, 0.001, 0.0001, 0.314, 0.094, 0.194, 0.053, 0.124, 0.074, 0.125, 0.128, 0.14, 0.097, 0.171, 0.086, 0.202, 0.077, 0.188, 0.312, 0.005, 0.119, 0.136, 0.188, 0.098, 0.072, 0.01, 0.015, 0.073, 0.005, 0.013, 0.0001, 0.013, 0.0001, 0.0001, 0.003, 10.368, 1.134, 1.037, 1.076, 7.653, 0.097, 1.575, 2.931, 4.208, 1.013, 1.951, 0.867, 2.302, 2.015, 5.216, 3.17, 0.036, 4.342, 1.438, 2.887, 4.01, 2.242, 0.013, 0.023, 2.052, 0.103, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 1.036, 0.019, 0.002, 0.069, 0.003, 0.001, 0.001, 0.001, 0.002, 0.002, 0.001, 0.003, 0.001, 0.004, 0.0001, 0.001, 0.002, 0.06, 0.001, 0.011, 0.003, 0.002, 0.001, 0.001, 0.002, 0.862, 0.001, 0.001, 0.08, 0.08, 0.0001, 0.001, 0.04, 0.787, 0.003, 0.72, 0.019, 0.002, 0.003, 0.003, 0.016, 1.383, 0.003, 0.016, 0.003, 0.256, 0.002, 0.013, 0.007, 0.786, 0.011, 0.399, 0.027, 0.172, 0.004, 0.001, 0.003, 0.065, 0.529, 0.066, 0.013, 0.527, 0.003, 0.003, 0.0001, 0.0001, 0.078, 4.545, 0.392, 0.1, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.002, 0.065, 0.0001, 0.004, 0.002, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.405, 1.034, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gom": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.459, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.409, 0.004, 0.032, 0.0001, 0.0001, 0.004, 0.001, 0.065, 0.082, 0.086, 0.0001, 0.001, 0.31, 0.092, 0.614, 0.025, 0.037, 0.076, 0.035, 0.025, 0.021, 0.026, 0.02, 0.018, 0.022, 0.033, 0.044, 0.02, 0.0001, 0.003, 0.0001, 0.007, 0.0001, 0.043, 0.023, 0.024, 0.027, 0.017, 0.011, 0.022, 0.028, 0.023, 0.016, 0.018, 0.014, 0.036, 0.017, 0.018, 0.033, 0.001, 0.019, 0.035, 0.046, 0.011, 0.011, 0.005, 0.004, 0.003, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.007, 0.001, 1.398, 0.134, 0.264, 0.41, 0.83, 0.062, 0.182, 0.613, 0.742, 0.041, 0.372, 0.505, 0.457, 0.862, 0.987, 0.203, 0.002, 0.568, 0.367, 0.732, 0.344, 0.233, 0.034, 0.102, 0.093, 0.096, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 1.014, 0.337, 1.717, 0.03, 0.0001, 0.2, 0.49, 1.091, 0.031, 0.184, 0.021, 0.587, 0.017, 1.766, 0.002, 0.057, 0.002, 0.019, 0.005, 0.016, 0.001, 1.048, 0.146, 0.534, 0.083, 0.03, 0.659, 0.006, 0.381, 0.026, 0.006, 0.26, 0.031, 0.261, 0.004, 0.294, 21.971, 5.237, 0.529, 0.24, 0.912, 0.021, 0.699, 0.107, 0.285, 0.131, 0.613, 1.017, 1.508, 0.008, 1.629, 0.499, 0.008, 0.864, 0.313, 0.067, 0.93, 0.419, 0.0001, 0.006, 0.002, 0.0001, 3.471, 0.661, 0.0001, 0.0001, 0.008, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 26.65, 0.0001, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "got": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.339, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.094, 0.003, 1.291, 0.0001, 0.0001, 0.0001, 0.0001, 0.038, 0.115, 0.115, 0.004, 0.002, 1.558, 0.264, 1.449, 0.007, 0.147, 0.29, 0.265, 0.261, 0.158, 0.118, 0.082, 0.102, 0.128, 0.101, 0.042, 0.039, 0.006, 0.003, 0.008, 0.017, 0.0001, 0.013, 0.006, 0.028, 0.006, 0.126, 0.004, 0.142, 0.123, 0.192, 0.004, 0.003, 0.01, 0.007, 0.004, 0.248, 0.007, 0.0001, 0.011, 0.012, 0.024, 0.014, 0.037, 0.008, 0.0001, 0.001, 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 1.416, 0.252, 0.277, 0.447, 1.622, 0.345, 0.341, 0.482, 1.005, 0.151, 0.167, 0.523, 0.441, 1.296, 0.895, 0.224, 0.019, 0.998, 0.984, 0.975, 0.495, 0.221, 0.388, 0.018, 0.135, 0.029, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.227, 0.027, 0.943, 1.525, 0.623, 0.417, 0.281, 0.024, 0.043, 0.442, 0.017, 0.001, 12.517, 4.391, 0.0001, 0.004, 16.904, 0.001, 0.002, 0.005, 0.001, 0.003, 0.004, 0.004, 0.0001, 0.003, 0.047, 0.043, 0.003, 0.003, 0.004, 0.002, 1.424, 0.066, 0.105, 0.001, 0.004, 0.001, 0.009, 0.002, 0.017, 0.005, 0.002, 0.005, 0.002, 0.035, 0.001, 0.003, 3.235, 0.309, 0.439, 0.698, 0.617, 0.042, 0.143, 0.379, 0.509, 2.203, 0.495, 0.498, 0.573, 1.215, 0.432, 0.907, 0.0001, 0.0001, 1.432, 0.164, 0.007, 0.004, 0.001, 0.002, 0.0001, 0.004, 0.018, 0.002, 0.024, 0.0001, 0.034, 0.019, 0.033, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.002, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.003, 0.09, 0.108, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.902, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "gv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.271, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.449, 0.001, 0.421, 0.002, 0.001, 0.012, 0.004, 0.833, 0.218, 0.217, 0.001, 0.004, 1.036, 0.572, 0.962, 0.016, 0.26, 0.327, 0.165, 0.089, 0.084, 0.093, 0.087, 0.088, 0.107, 0.189, 0.087, 0.045, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.277, 0.194, 0.324, 0.123, 0.14, 0.124, 0.191, 0.146, 0.079, 0.067, 0.068, 0.129, 0.207, 0.152, 0.084, 0.138, 0.02, 0.179, 0.402, 0.526, 0.063, 0.198, 0.043, 0.005, 0.079, 0.006, 0.009, 0.0001, 0.009, 0.0001, 0.001, 0.0001, 8.563, 0.792, 1.691, 1.903, 8.594, 0.377, 2.885, 5.368, 3.902, 0.512, 0.598, 3.599, 1.506, 6.663, 4.174, 0.394, 0.032, 4.839, 4.581, 2.625, 1.233, 0.647, 0.279, 0.018, 6.112, 0.053, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.052, 0.016, 0.011, 0.007, 0.006, 0.002, 0.002, 0.033, 0.003, 0.008, 0.001, 0.001, 0.002, 0.004, 0.001, 0.003, 0.004, 0.002, 0.001, 0.008, 0.005, 0.001, 0.002, 0.002, 0.007, 0.032, 0.003, 0.002, 0.002, 0.002, 0.001, 0.001, 0.013, 0.034, 0.001, 0.003, 0.006, 0.002, 0.002, 0.259, 0.003, 0.024, 0.003, 0.005, 0.003, 0.021, 0.001, 0.003, 0.016, 0.006, 0.011, 0.021, 0.003, 0.006, 0.005, 0.006, 0.011, 0.008, 0.015, 0.005, 0.007, 0.005, 0.006, 0.004, 0.0001, 0.0001, 0.024, 0.446, 0.012, 0.021, 0.0001, 0.001, 0.0001, 0.006, 0.003, 0.004, 0.002, 0.0001, 0.012, 0.007, 0.044, 0.019, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.006, 0.05, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ha": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.755, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.253, 0.006, 0.093, 0.001, 0.0001, 0.003, 0.001, 0.233, 0.264, 0.267, 0.0001, 0.001, 0.745, 0.202, 0.904, 0.054, 0.25, 0.351, 0.185, 0.101, 0.092, 0.11, 0.102, 0.101, 0.107, 0.226, 0.077, 0.015, 0.009, 0.002, 0.009, 0.006, 0.001, 0.703, 0.295, 0.111, 0.155, 0.055, 0.098, 0.113, 0.13, 0.318, 0.133, 0.225, 0.088, 0.271, 0.163, 0.048, 0.074, 0.005, 0.115, 0.268, 0.173, 0.05, 0.018, 0.079, 0.003, 0.091, 0.042, 0.023, 0.0001, 0.025, 0.0001, 0.021, 0.001, 18.747, 1.651, 0.919, 2.906, 2.679, 0.906, 1.302, 1.831, 6.455, 0.467, 3.514, 2.109, 2.474, 6.749, 1.839, 0.213, 0.023, 4.031, 3.401, 2.21, 3.388, 0.067, 1.617, 0.015, 2.266, 0.447, 0.001, 0.001, 0.003, 0.002, 0.0001, 0.116, 0.007, 0.003, 0.001, 0.009, 0.005, 0.003, 0.003, 0.007, 0.002, 0.01, 0.001, 0.001, 0.0001, 0.003, 0.001, 0.002, 0.002, 0.001, 0.029, 0.002, 0.001, 0.0001, 0.094, 0.018, 0.242, 0.0001, 0.001, 0.01, 0.009, 0.001, 0.004, 0.02, 0.005, 0.002, 0.006, 0.0001, 0.001, 0.003, 0.015, 0.004, 0.013, 0.004, 0.002, 0.002, 0.004, 0.002, 0.003, 0.004, 0.011, 0.001, 0.005, 0.011, 0.003, 0.002, 0.003, 0.002, 0.004, 0.002, 0.001, 0.003, 0.003, 0.0001, 0.002, 0.0001, 0.0001, 0.03, 0.04, 0.008, 0.004, 0.18, 0.0001, 0.0001, 0.118, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.011, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.044, 0.043, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hak": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.757, 0.001, 0.06, 0.0001, 0.0001, 0.014, 0.0001, 0.007, 0.281, 0.281, 0.0001, 0.001, 0.836, 6.558, 0.681, 0.018, 0.337, 0.407, 0.278, 0.148, 0.134, 0.137, 0.13, 0.123, 0.136, 0.173, 0.065, 0.014, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.079, 0.057, 0.378, 0.035, 0.025, 0.133, 0.042, 0.182, 0.024, 0.017, 0.335, 0.169, 0.185, 0.174, 0.026, 0.169, 0.016, 0.027, 0.334, 0.366, 0.012, 0.069, 0.025, 0.002, 0.166, 0.009, 0.007, 0.0001, 0.007, 0.0001, 0.003, 0.0001, 1.796, 0.086, 1.609, 0.16, 2.657, 0.577, 2.978, 5.312, 4.077, 0.022, 2.986, 0.978, 0.836, 6.046, 1.214, 0.924, 0.006, 0.355, 1.925, 2.85, 1.719, 0.417, 0.063, 0.011, 1.033, 0.05, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.624, 0.347, 0.489, 0.127, 0.115, 0.217, 0.079, 0.128, 0.198, 0.185, 0.153, 0.188, 0.325, 0.981, 0.111, 0.161, 0.125, 0.071, 0.062, 0.072, 0.143, 0.099, 0.164, 0.124, 0.154, 0.164, 0.132, 0.118, 0.284, 0.116, 0.086, 0.138, 0.587, 0.284, 0.798, 0.114, 0.117, 0.11, 0.089, 0.096, 0.66, 0.449, 0.294, 0.11, 0.804, 0.308, 1.169, 0.118, 0.192, 0.187, 0.596, 1.486, 0.608, 0.076, 0.115, 0.115, 0.317, 1.436, 0.679, 1.022, 0.36, 0.128, 0.129, 0.134, 0.0001, 0.0001, 0.018, 7.409, 0.013, 0.036, 0.003, 0.005, 0.0001, 0.003, 0.001, 0.002, 1.194, 0.0001, 0.01, 0.005, 0.045, 0.02, 0.001, 0.001, 0.0001, 0.0001, 0.003, 0.013, 0.006, 0.004, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 1.011, 0.064, 0.254, 0.448, 1.333, 0.785, 0.602, 0.451, 0.439, 0.002, 0.004, 0.008, 0.003, 0.0001, 0.269, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "haw": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.221, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.294, 0.012, 0.203, 0.0001, 0.0001, 0.0001, 0.001, 0.132, 0.34, 0.352, 0.0001, 0.001, 1.505, 0.111, 0.979, 0.007, 0.17, 0.218, 0.129, 0.06, 0.059, 0.065, 0.059, 0.085, 0.093, 0.096, 0.074, 0.017, 0.01, 0.0001, 0.01, 0.007, 0.0001, 0.393, 0.447, 0.582, 0.062, 0.097, 0.065, 0.079, 0.798, 0.153, 0.05, 0.341, 0.594, 0.369, 0.112, 0.254, 0.296, 0.019, 0.112, 0.703, 0.122, 0.065, 0.176, 0.058, 0.005, 0.01, 0.09, 0.005, 0.0001, 0.006, 0.0001, 0.003, 0.006, 12.798, 0.268, 0.355, 0.813, 5.652, 0.089, 0.569, 1.324, 6.125, 0.081, 4.131, 4.145, 2.483, 4.121, 5.223, 1.895, 0.028, 1.627, 1.407, 0.928, 3.376, 0.134, 0.71, 0.014, 0.137, 0.178, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 1.411, 1.393, 0.012, 0.01, 0.008, 0.004, 0.003, 0.003, 0.01, 0.001, 0.006, 0.004, 0.027, 0.239, 0.001, 0.004, 0.011, 0.006, 0.002, 0.111, 0.01, 0.006, 0.002, 0.004, 1.323, 0.019, 0.006, 0.004, 0.007, 0.006, 0.005, 0.004, 0.006, 0.059, 0.005, 0.006, 0.006, 0.004, 0.001, 0.013, 0.01, 0.035, 0.014, 0.268, 0.004, 0.047, 0.003, 0.004, 0.012, 0.061, 0.008, 0.113, 0.006, 0.007, 0.004, 0.005, 0.011, 0.005, 0.014, 1.288, 0.011, 0.01, 0.006, 0.004, 0.0001, 0.0001, 0.011, 0.331, 1.585, 0.461, 0.0001, 0.008, 0.0001, 0.011, 1.285, 0.01, 0.001, 0.0001, 0.031, 0.013, 0.031, 0.011, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.043, 0.02, 0.017, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.013, 1.362, 0.0001, 0.001, 0.006, 0.003, 0.002, 0.001, 0.001, 0.002, 0.007, 0.008, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hif": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.441, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.1, 0.004, 0.114, 0.0001, 0.001, 0.009, 0.004, 0.035, 0.174, 0.173, 0.001, 0.001, 0.931, 0.131, 1.205, 0.021, 0.405, 0.564, 0.33, 0.156, 0.134, 0.134, 0.137, 0.132, 0.161, 0.312, 0.075, 0.009, 0.003, 0.005, 0.003, 0.001, 0.0001, 0.456, 0.322, 0.355, 0.197, 0.18, 0.293, 0.19, 0.17, 0.372, 0.16, 0.181, 0.207, 0.307, 0.247, 0.078, 0.33, 0.012, 0.201, 0.529, 0.239, 0.168, 0.085, 0.095, 0.004, 0.174, 0.017, 0.016, 0.0001, 0.016, 0.0001, 0.019, 0.0001, 12.241, 1.338, 1.486, 1.704, 7.791, 0.593, 1.202, 3.829, 6.515, 0.754, 3.146, 2.684, 2.468, 4.596, 2.829, 0.958, 0.04, 4.362, 3.289, 3.315, 2.328, 0.443, 0.421, 0.04, 0.804, 0.089, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.026, 0.089, 0.009, 0.002, 0.003, 0.005, 0.002, 0.014, 0.008, 0.001, 0.001, 0.004, 0.002, 0.02, 0.003, 0.003, 0.003, 0.002, 0.001, 0.042, 0.003, 0.007, 0.001, 0.003, 0.002, 0.005, 0.002, 0.011, 0.004, 0.001, 0.001, 0.013, 0.018, 0.009, 0.001, 0.005, 0.072, 0.024, 0.007, 0.009, 0.007, 0.012, 0.004, 0.029, 0.003, 0.013, 0.009, 0.007, 0.017, 0.022, 0.012, 0.006, 0.004, 0.005, 0.014, 0.002, 0.01, 0.032, 0.005, 0.004, 0.012, 0.003, 0.011, 0.006, 0.0001, 0.0001, 0.028, 0.074, 0.148, 0.035, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.005, 0.003, 0.0001, 0.004, 0.001, 0.016, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.105, 0.033, 0.022, 0.002, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ho": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.445, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.244, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.681, 0.84, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.042, 0.0001, 0.0001, 0.0001, 0.84, 1.681, 0.0001, 0.84, 0.0001, 0.0001, 1.681, 1.681, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.966, 0.84, 0.0001, 0.0001, 7.563, 0.0001, 0.84, 0.0001, 5.042, 0.0001, 0.0001, 2.521, 1.681, 5.882, 12.605, 1.681, 0.0001, 3.361, 1.681, 1.681, 0.0001, 1.681, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hsb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.885, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.708, 0.001, 0.633, 0.0001, 0.0001, 0.02, 0.001, 0.006, 0.349, 0.351, 0.019, 0.001, 0.617, 0.09, 1.156, 0.027, 0.335, 0.549, 0.233, 0.161, 0.153, 0.173, 0.141, 0.134, 0.184, 0.278, 0.061, 0.039, 0.002, 0.004, 0.002, 0.001, 0.0001, 0.124, 0.184, 0.091, 0.139, 0.058, 0.04, 0.059, 0.112, 0.043, 0.103, 0.189, 0.142, 0.204, 0.143, 0.038, 0.227, 0.002, 0.151, 0.281, 0.088, 0.037, 0.024, 0.263, 0.004, 0.003, 0.079, 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.0001, 6.697, 1.107, 1.636, 2.081, 6.467, 0.188, 0.301, 1.756, 3.527, 3.654, 2.787, 1.99, 1.872, 3.895, 5.864, 1.456, 0.004, 3.313, 3.645, 2.804, 2.176, 0.063, 3.44, 0.018, 1.507, 1.152, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.124, 0.059, 0.706, 0.009, 0.065, 0.003, 0.009, 0.741, 0.003, 0.001, 0.002, 0.003, 0.046, 0.476, 0.001, 0.004, 0.004, 0.003, 0.003, 0.038, 0.003, 0.003, 0.002, 0.005, 0.005, 0.336, 0.005, 1.33, 0.03, 0.004, 0.03, 0.009, 0.055, 0.752, 0.003, 0.003, 0.008, 0.003, 0.002, 0.003, 0.003, 0.008, 0.001, 0.003, 0.001, 0.011, 0.001, 0.003, 0.025, 0.008, 0.015, 0.5, 0.006, 0.013, 0.014, 0.003, 0.014, 0.005, 0.495, 0.011, 0.018, 0.033, 0.697, 0.004, 0.0001, 0.0001, 0.023, 0.573, 2.597, 3.085, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.01, 0.005, 0.144, 0.055, 0.001, 0.001, 0.001, 0.011, 0.004, 0.015, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.112, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ht": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.728, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.82, 0.005, 0.108, 0.0001, 0.0001, 0.002, 0.001, 0.044, 0.203, 0.204, 0.004, 0.0001, 1.177, 0.16, 1.277, 0.006, 1.128, 0.316, 0.385, 0.25, 0.229, 0.141, 0.146, 0.14, 0.135, 0.218, 0.285, 0.009, 0.002, 0.002, 0.002, 0.073, 0.0001, 0.308, 0.114, 0.31, 0.14, 0.272, 0.082, 0.233, 0.111, 0.459, 0.083, 0.546, 0.457, 0.33, 0.177, 0.124, 0.284, 0.004, 0.107, 0.215, 0.201, 0.017, 0.07, 0.083, 0.002, 0.054, 0.009, 0.003, 0.0001, 0.009, 0.003, 0.007, 0.0001, 8.338, 0.713, 0.405, 1.058, 6.922, 0.493, 1.121, 0.484, 5.37, 0.359, 1.684, 3.389, 1.726, 9.14, 4.981, 1.524, 0.032, 2.005, 4.201, 3.104, 1.485, 1.12, 1.14, 0.06, 3.565, 0.552, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.036, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.007, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.023, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.04, 0.015, 0.008, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.815, 0.088, 0.005, 0.004, 0.0001, 0.019, 0.002, 0.004, 0.0001, 0.005, 0.398, 0.011, 0.003, 0.0001, 0.001, 0.0001, 0.001, 0.002, 0.004, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.04, 1.397, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.036, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.597, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.8, 0.0001, 0.032, 0.0001, 0.0001, 0.007, 0.0001, 0.004, 0.144, 0.144, 0.0001, 0.001, 0.586, 0.166, 0.08, 0.013, 0.201, 0.284, 0.165, 0.087, 0.08, 0.086, 0.077, 0.075, 0.09, 0.155, 0.113, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.01, 0.007, 0.01, 0.005, 0.005, 0.004, 0.004, 0.004, 0.018, 0.002, 0.002, 0.005, 0.008, 0.005, 0.004, 0.006, 0.001, 0.005, 0.011, 0.008, 0.002, 0.006, 0.004, 0.006, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.003, 0.016, 0.046, 0.006, 0.015, 0.015, 0.053, 0.008, 0.009, 0.013, 0.038, 0.001, 0.005, 0.027, 0.014, 0.034, 0.04, 0.008, 0.001, 0.036, 0.026, 0.029, 0.018, 0.005, 0.004, 0.002, 0.008, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.414, 0.639, 1.93, 0.109, 0.557, 0.081, 0.132, 0.316, 0.027, 0.402, 0.05, 0.015, 0.042, 0.09, 0.048, 0.034, 0.002, 0.004, 0.002, 0.02, 0.024, 0.021, 0.028, 0.001, 0.0001, 0.001, 0.001, 0.003, 0.001, 0.123, 0.001, 0.0001, 0.042, 6.697, 0.434, 0.595, 0.616, 2.608, 0.304, 0.502, 0.621, 0.7, 0.114, 2.81, 0.856, 0.261, 0.333, 1.634, 0.66, 0.29, 0.576, 0.139, 1.799, 1.257, 4.145, 0.346, 3.356, 0.233, 0.437, 0.354, 0.321, 1.025, 1.123, 1.395, 0.0001, 0.0001, 0.223, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.029, 0.01, 0.0001, 0.0001, 0.652, 36.534, 7.186, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.026, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "hz": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 25.0, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.667, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ia": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.646, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.141, 0.002, 0.329, 0.0001, 0.0001, 0.008, 0.001, 0.021, 0.18, 0.18, 0.001, 0.003, 1.016, 0.166, 0.808, 0.013, 0.184, 0.275, 0.136, 0.08, 0.078, 0.085, 0.074, 0.075, 0.088, 0.135, 0.073, 0.032, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.226, 0.141, 0.296, 0.096, 0.165, 0.073, 0.096, 0.067, 0.304, 0.056, 0.03, 0.329, 0.174, 0.087, 0.056, 0.186, 0.016, 0.106, 0.253, 0.115, 0.079, 0.078, 0.031, 0.017, 0.009, 0.016, 0.018, 0.0001, 0.018, 0.0001, 0.006, 0.0001, 7.783, 0.726, 2.95, 2.701, 11.264, 0.558, 0.916, 0.687, 6.773, 0.133, 0.102, 4.659, 2.226, 5.924, 5.837, 2.221, 0.5, 4.607, 4.777, 5.188, 3.143, 1.186, 0.054, 0.19, 0.205, 0.091, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.033, 0.014, 0.005, 0.003, 0.003, 0.002, 0.001, 0.002, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.01, 0.005, 0.001, 0.001, 0.002, 0.003, 0.007, 0.001, 0.002, 0.005, 0.005, 0.001, 0.001, 0.01, 0.02, 0.003, 0.006, 0.005, 0.003, 0.002, 0.005, 0.004, 0.021, 0.003, 0.011, 0.003, 0.018, 0.002, 0.002, 0.005, 0.011, 0.005, 0.019, 0.002, 0.002, 0.005, 0.002, 0.004, 0.005, 0.009, 0.012, 0.006, 0.004, 0.003, 0.005, 0.0001, 0.0001, 0.026, 0.115, 0.014, 0.006, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.019, 0.01, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.009, 0.031, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ie": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.521, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.809, 0.001, 0.247, 0.0001, 0.0001, 0.004, 0.006, 0.019, 0.181, 0.18, 0.001, 0.0001, 0.349, 1.199, 1.232, 0.019, 0.563, 0.838, 0.612, 0.225, 0.226, 0.24, 0.207, 0.206, 0.219, 0.382, 0.048, 0.005, 0.006, 0.001, 0.006, 0.0001, 0.0001, 0.309, 0.238, 0.27, 0.166, 0.167, 0.136, 0.184, 0.184, 0.432, 0.068, 0.108, 0.44, 0.245, 0.141, 0.106, 0.224, 0.013, 0.149, 0.37, 0.155, 0.122, 0.083, 0.052, 0.007, 0.021, 0.046, 0.016, 0.0001, 0.017, 0.0001, 0.0001, 0.0001, 6.871, 0.75, 2.348, 2.768, 8.937, 0.584, 0.855, 0.832, 7.829, 0.174, 0.338, 4.504, 1.934, 5.948, 3.473, 1.445, 0.281, 4.186, 4.435, 5.077, 2.881, 0.926, 0.103, 0.2, 0.235, 0.149, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.011, 0.008, 0.006, 0.012, 0.004, 0.002, 0.001, 0.038, 0.001, 0.002, 0.0001, 0.001, 0.004, 0.016, 0.001, 0.001, 0.004, 0.003, 0.001, 0.004, 0.002, 0.001, 0.002, 0.003, 0.002, 0.005, 0.002, 0.003, 0.002, 0.002, 0.002, 0.01, 0.018, 0.107, 0.002, 0.003, 0.013, 0.003, 0.002, 0.004, 0.007, 0.34, 0.002, 0.007, 0.001, 0.079, 0.001, 0.001, 0.011, 0.009, 0.004, 0.067, 0.003, 0.005, 0.02, 0.001, 0.012, 0.001, 0.025, 0.006, 0.034, 0.009, 0.011, 0.002, 0.0001, 0.0001, 0.012, 0.714, 0.064, 0.047, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.007, 0.004, 0.047, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.01, 0.006, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ig": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.656, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.908, 0.0001, 0.773, 0.0001, 0.001, 0.002, 0.004, 0.323, 0.322, 0.321, 0.001, 0.0001, 0.801, 0.348, 0.989, 0.009, 0.349, 0.514, 0.434, 0.211, 0.141, 0.149, 0.14, 0.138, 0.136, 0.236, 0.05, 0.04, 0.002, 0.002, 0.002, 0.002, 0.001, 0.437, 0.139, 0.167, 0.124, 0.161, 0.093, 0.162, 0.08, 0.189, 0.162, 0.069, 0.102, 0.246, 0.453, 0.257, 0.111, 0.006, 0.081, 0.231, 0.102, 0.09, 0.023, 0.104, 0.006, 0.033, 0.007, 0.018, 0.0001, 0.018, 0.0001, 0.003, 0.003, 8.644, 2.249, 1.219, 1.734, 6.313, 0.761, 1.664, 1.979, 4.558, 0.257, 2.436, 1.453, 1.97, 6.1, 4.008, 0.966, 0.02, 3.332, 1.739, 2.408, 2.889, 0.225, 1.517, 0.034, 1.16, 0.258, 0.0001, 0.007, 0.001, 0.0001, 0.0001, 0.13, 0.024, 0.004, 0.004, 0.007, 0.006, 0.001, 0.002, 0.001, 0.004, 0.004, 0.623, 0.118, 0.962, 0.001, 0.0001, 0.002, 0.001, 0.004, 0.022, 0.005, 0.001, 0.031, 0.002, 0.001, 0.082, 0.001, 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.34, 0.233, 0.001, 0.001, 0.012, 1.142, 0.001, 0.003, 0.105, 0.2, 0.002, 0.014, 0.036, 0.183, 0.028, 0.019, 0.004, 0.004, 0.029, 0.095, 0.002, 0.001, 0.009, 0.001, 0.003, 0.143, 0.201, 2.836, 0.03, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.146, 1.356, 0.009, 0.021, 0.0001, 0.014, 0.039, 0.003, 0.0001, 0.001, 0.029, 0.0001, 0.005, 0.001, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 2.927, 0.109, 0.003, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ii": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.208, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.146, 0.0001, 1.029, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.343, 0.343, 0.0001, 0.0001, 0.0001, 0.0001, 0.686, 0.0001, 4.803, 0.172, 2.401, 0.0001, 0.0001, 0.172, 0.343, 0.686, 0.686, 0.343, 0.0001, 0.0001, 0.0001, 0.0001, 0.515, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.172, 0.0001, 0.0001, 0.0001, 0.172, 0.858, 0.0001, 0.343, 0.343, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.0001, 0.0001, 0.343, 0.343, 0.343, 0.172, 0.0001, 0.172, 0.343, 0.0001, 0.515, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.172, 0.0001, 0.0001, 2.573, 1.887, 1.544, 0.858, 2.058, 0.343, 1.715, 0.343, 0.343, 0.0001, 0.172, 1.201, 1.887, 1.029, 1.372, 0.172, 0.343, 1.029, 0.686, 0.172, 0.172, 0.172, 0.686, 0.858, 0.686, 0.172, 0.343, 0.0001, 0.515, 0.172, 0.343, 0.686, 0.343, 0.172, 0.0001, 0.0001, 0.343, 0.0001, 0.172, 1.544, 0.172, 0.343, 0.686, 0.858, 0.686, 0.858, 0.343, 0.686, 0.172, 0.343, 0.343, 0.515, 2.744, 0.172, 0.0001, 0.343, 0.858, 2.916, 0.343, 0.686, 0.343, 0.0001, 0.343, 0.172, 0.0001, 0.0001, 1.372, 0.0001, 0.172, 0.172, 0.0001, 0.0001, 0.0001, 0.172, 0.172, 0.0001, 0.515, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.515, 1.029, 4.631, 1.029, 0.686, 0.0001, 0.858, 10.635, 0.0001, 0.0001, 0.0001, 0.0001, 0.343, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ik": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.203, 0.0001, 1.053, 0.0001, 0.0001, 0.002, 0.004, 0.019, 1.043, 1.038, 0.0001, 0.004, 0.489, 0.212, 1.246, 0.04, 0.17, 0.264, 0.162, 0.084, 0.065, 0.055, 0.132, 0.065, 0.076, 0.124, 0.136, 0.025, 0.013, 0.002, 0.002, 0.0001, 0.0001, 0.824, 0.109, 0.155, 0.065, 0.052, 0.025, 0.048, 0.076, 0.634, 0.073, 0.409, 0.111, 0.352, 0.545, 0.069, 0.285, 0.321, 0.155, 0.436, 0.755, 0.409, 0.076, 0.046, 0.008, 0.044, 0.002, 0.01, 0.0001, 0.015, 0.0001, 0.008, 0.0001, 9.867, 0.308, 1.051, 0.799, 2.404, 0.327, 1.605, 1.011, 7.743, 0.063, 2.113, 2.725, 1.552, 3.495, 1.668, 1.101, 3.682, 2.526, 3.015, 4.496, 6.747, 0.801, 0.229, 0.065, 0.707, 0.103, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.097, 0.073, 0.183, 0.023, 0.006, 0.031, 0.013, 0.103, 0.05, 0.008, 0.004, 0.952, 0.019, 0.055, 0.002, 0.023, 0.013, 0.008, 0.0001, 0.002, 0.008, 0.067, 0.013, 0.015, 0.004, 0.002, 0.04, 0.01, 0.017, 0.01, 0.002, 0.019, 0.013, 0.843, 0.013, 0.029, 1.206, 0.281, 0.025, 0.006, 0.067, 0.006, 0.055, 0.004, 0.038, 0.017, 0.078, 0.034, 0.172, 0.862, 0.059, 0.01, 0.01, 0.067, 0.008, 0.187, 0.269, 0.134, 0.055, 0.021, 0.038, 0.019, 0.189, 0.046, 0.0001, 0.0001, 0.008, 0.944, 0.835, 1.051, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.006, 0.008, 0.0001, 0.025, 0.023, 0.42, 0.185, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.408, 0.191, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ilo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.301, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.793, 0.111, 0.271, 0.0001, 0.001, 0.008, 0.001, 0.018, 0.172, 0.172, 0.003, 0.003, 0.83, 0.304, 0.649, 0.008, 0.21, 0.325, 0.155, 0.097, 0.09, 0.094, 0.083, 0.085, 0.1, 0.166, 0.048, 0.03, 0.005, 0.001, 0.005, 0.001, 0.0001, 0.349, 0.225, 0.111, 0.217, 0.099, 0.09, 0.118, 0.1, 0.241, 0.035, 0.175, 0.118, 0.232, 0.163, 0.054, 0.279, 0.009, 0.088, 0.233, 0.461, 0.072, 0.035, 0.029, 0.006, 0.014, 0.012, 0.036, 0.0001, 0.036, 0.0001, 0.001, 0.0001, 16.461, 1.586, 0.189, 2.856, 3.734, 0.046, 3.664, 0.306, 10.008, 0.024, 3.303, 2.245, 1.909, 7.066, 3.393, 2.095, 0.012, 2.409, 3.066, 6.078, 2.307, 0.067, 0.549, 0.014, 1.361, 0.048, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.043, 0.006, 0.003, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.033, 0.004, 0.001, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.015, 0.007, 0.001, 0.001, 0.003, 0.002, 0.001, 0.003, 0.002, 0.009, 0.002, 0.004, 0.001, 0.006, 0.002, 0.001, 0.013, 0.007, 0.003, 0.007, 0.004, 0.001, 0.003, 0.001, 0.004, 0.002, 0.004, 0.002, 0.003, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.027, 0.049, 0.008, 0.009, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.007, 0.004, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.043, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "io": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.24, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.878, 0.001, 0.226, 0.0001, 0.145, 0.683, 0.001, 0.155, 0.19, 0.19, 0.002, 0.001, 1.502, 0.399, 2.049, 0.127, 1.123, 1.116, 0.845, 0.565, 0.593, 0.586, 0.516, 0.395, 0.578, 0.496, 0.056, 0.039, 0.008, 0.001, 0.008, 0.001, 0.0001, 0.262, 0.119, 0.082, 0.063, 0.203, 0.065, 0.07, 0.089, 0.077, 0.042, 0.131, 0.387, 0.144, 0.086, 0.052, 0.185, 0.006, 0.067, 0.238, 0.064, 0.127, 0.06, 0.027, 0.002, 0.018, 0.007, 0.008, 0.0001, 0.008, 0.0001, 0.001, 0.0001, 8.848, 0.82, 0.665, 2.487, 7.044, 0.592, 0.8, 0.82, 7.741, 0.211, 1.575, 3.65, 2.435, 4.587, 5.58, 1.431, 0.273, 4.484, 4.553, 2.971, 2.4, 1.482, 0.052, 0.098, 0.514, 0.499, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.011, 0.008, 0.004, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.003, 0.002, 0.001, 0.0001, 0.002, 0.001, 0.004, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.096, 0.01, 0.001, 0.003, 0.003, 0.001, 0.001, 0.003, 0.002, 0.015, 0.001, 0.004, 0.001, 0.008, 0.001, 0.001, 0.005, 0.003, 0.253, 0.006, 0.002, 0.002, 0.003, 0.001, 0.003, 0.002, 0.004, 0.005, 0.003, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.356, 0.056, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.01, 0.006, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "is": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.97, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.586, 0.001, 0.206, 0.0001, 0.0001, 0.008, 0.002, 0.007, 0.124, 0.124, 0.0001, 0.001, 0.499, 0.123, 1.026, 0.011, 0.247, 0.371, 0.182, 0.092, 0.087, 0.097, 0.09, 0.091, 0.11, 0.206, 0.046, 0.01, 0.008, 0.003, 0.008, 0.001, 0.0001, 0.15, 0.156, 0.07, 0.071, 0.123, 0.128, 0.099, 0.219, 0.049, 0.069, 0.114, 0.102, 0.145, 0.086, 0.033, 0.076, 0.003, 0.091, 0.275, 0.089, 0.03, 0.081, 0.029, 0.009, 0.012, 0.006, 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 6.834, 0.671, 0.132, 1.35, 4.383, 2.01, 2.575, 1.208, 5.351, 0.788, 2.14, 3.293, 2.549, 5.87, 1.807, 0.609, 0.005, 6.508, 4.164, 3.597, 3.384, 1.444, 0.036, 0.05, 0.678, 0.023, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.079, 0.071, 0.003, 0.002, 0.002, 0.001, 0.004, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.093, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.031, 0.002, 0.001, 0.01, 0.001, 0.001, 0.001, 0.008, 0.001, 0.029, 0.003, 0.162, 0.001, 0.007, 1.147, 0.001, 0.001, 0.003, 0.001, 0.559, 0.002, 0.002, 0.221, 0.001, 0.001, 0.001, 1.194, 0.001, 0.001, 2.653, 0.002, 0.003, 0.801, 0.002, 0.002, 0.588, 0.001, 0.004, 0.002, 0.419, 0.002, 0.005, 0.183, 0.658, 0.001, 0.0001, 0.0001, 0.014, 8.751, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.079, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "iu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.678, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.59, 0.002, 0.2, 0.001, 0.003, 0.002, 0.003, 0.015, 0.174, 0.173, 0.0001, 0.002, 0.361, 0.227, 0.729, 0.057, 0.148, 0.113, 0.088, 0.041, 0.055, 0.057, 0.038, 0.037, 0.041, 0.075, 0.086, 0.012, 0.034, 0.007, 0.037, 0.002, 0.001, 0.071, 0.015, 0.028, 0.016, 0.027, 0.021, 0.01, 0.09, 0.106, 0.011, 0.032, 0.025, 0.039, 0.045, 0.015, 0.038, 0.016, 0.009, 0.047, 0.052, 0.031, 0.008, 0.018, 0.002, 0.004, 0.0001, 0.042, 0.001, 0.038, 0.0001, 0.005, 0.0001, 3.23, 0.132, 0.269, 0.325, 0.963, 0.137, 0.72, 0.796, 3.179, 0.121, 0.846, 1.083, 0.73, 1.94, 0.65, 0.417, 0.773, 0.909, 0.645, 2.138, 2.24, 0.378, 0.125, 0.018, 0.352, 0.009, 0.063, 0.016, 0.064, 0.0001, 0.0001, 0.195, 0.104, 0.722, 2.277, 0.527, 2.845, 0.283, 0.577, 0.292, 0.16, 1.105, 0.322, 0.08, 0.107, 0.751, 0.183, 5.797, 4.461, 2.284, 5.133, 1.078, 2.99, 2.939, 0.631, 0.063, 0.2, 0.245, 0.066, 0.007, 0.045, 0.004, 0.005, 0.011, 0.073, 0.039, 0.009, 0.018, 0.411, 1.389, 0.092, 0.103, 0.04, 1.113, 0.086, 0.008, 0.439, 0.043, 0.681, 0.098, 0.475, 0.284, 0.202, 0.231, 0.064, 0.012, 0.003, 0.129, 0.126, 0.009, 0.223, 0.007, 0.015, 0.041, 0.125, 0.0001, 0.0001, 0.1, 0.024, 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.131, 0.044, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.009, 0.014, 0.007, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 21.14, 0.181, 0.003, 0.004, 0.004, 0.004, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "jam": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.114, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.204, 0.0001, 0.437, 0.0001, 0.002, 0.015, 0.001, 0.02, 0.246, 0.245, 0.0001, 0.001, 1.286, 0.238, 0.848, 0.011, 0.225, 0.262, 0.144, 0.074, 0.072, 0.083, 0.075, 0.089, 0.083, 0.132, 0.047, 0.038, 0.014, 0.002, 0.014, 0.002, 0.0001, 0.33, 0.18, 0.107, 0.273, 0.095, 0.097, 0.106, 0.027, 0.375, 0.206, 0.243, 0.122, 0.218, 0.135, 0.052, 0.177, 0.004, 0.132, 0.376, 0.091, 0.038, 0.042, 0.116, 0.003, 0.09, 0.009, 0.033, 0.0001, 0.032, 0.0001, 0.0001, 0.0001, 11.751, 1.124, 0.777, 3.113, 4.403, 1.279, 0.882, 3.07, 11.71, 0.554, 2.318, 3.164, 2.271, 5.696, 3.101, 1.655, 0.006, 3.113, 3.636, 3.486, 2.985, 0.575, 1.126, 0.207, 0.616, 0.737, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.054, 0.013, 0.006, 0.006, 0.011, 0.005, 0.006, 0.002, 0.011, 0.004, 0.003, 0.002, 0.005, 0.004, 0.004, 0.001, 0.005, 0.003, 0.003, 0.026, 0.009, 0.002, 0.001, 0.003, 0.001, 0.005, 0.001, 0.003, 0.008, 0.008, 0.001, 0.0001, 0.066, 0.009, 0.001, 0.004, 0.01, 0.005, 0.003, 0.008, 0.009, 0.009, 0.007, 0.005, 0.005, 0.009, 0.003, 0.008, 0.005, 0.014, 0.004, 0.031, 0.002, 0.005, 0.002, 0.003, 0.006, 0.009, 0.008, 0.006, 0.007, 0.007, 0.004, 0.009, 0.0001, 0.0001, 0.069, 0.057, 0.012, 0.006, 0.0001, 0.001, 0.0001, 0.011, 0.004, 0.01, 0.001, 0.0001, 0.049, 0.024, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.007, 0.002, 0.004, 0.025, 0.021, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.017, 0.008, 0.051, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "jbo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.83, 0.0001, 0.137, 0.0001, 0.0001, 0.001, 0.0001, 3.634, 0.016, 0.016, 0.0001, 0.0001, 0.047, 0.014, 2.419, 0.008, 0.161, 0.318, 0.2, 0.098, 0.09, 0.087, 0.087, 0.089, 0.108, 0.172, 0.004, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.035, 0.022, 0.028, 0.013, 0.017, 0.01, 0.012, 0.013, 0.015, 0.011, 0.012, 0.019, 0.022, 0.019, 0.015, 0.017, 0.001, 0.021, 0.029, 0.019, 0.006, 0.006, 0.008, 0.002, 0.002, 0.004, 0.002, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 7.616, 1.669, 2.73, 1.665, 6.288, 0.906, 1.481, 0.055, 8.607, 1.326, 2.153, 5.868, 2.296, 4.062, 6.049, 1.389, 0.004, 2.945, 3.13, 2.492, 4.934, 0.679, 0.018, 0.589, 0.829, 0.701, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.01, 0.006, 0.006, 0.011, 0.005, 0.003, 0.004, 0.008, 0.003, 0.008, 0.003, 0.003, 0.002, 0.002, 0.002, 0.003, 0.002, 0.001, 0.003, 0.004, 0.004, 0.001, 0.002, 0.001, 0.006, 0.001, 0.002, 0.002, 0.002, 0.001, 0.002, 0.003, 0.006, 0.002, 0.003, 0.005, 0.003, 0.006, 0.013, 0.006, 0.012, 0.005, 0.003, 0.005, 0.008, 0.003, 0.005, 0.01, 0.01, 0.007, 0.008, 0.003, 0.008, 0.002, 0.003, 0.01, 0.005, 0.017, 0.007, 0.005, 0.005, 0.004, 0.003, 0.0001, 0.0001, 0.004, 0.032, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.006, 0.004, 0.004, 0.002, 0.0001, 0.016, 0.008, 0.046, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.007, 0.035, 0.026, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.006, 0.007, 0.005, 0.001, 0.004, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "jv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.393, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.972, 0.002, 0.376, 0.0001, 0.001, 0.006, 0.002, 0.021, 0.174, 0.174, 0.0001, 0.002, 1.038, 0.248, 0.884, 0.027, 0.242, 0.269, 0.17, 0.077, 0.072, 0.083, 0.071, 0.073, 0.084, 0.157, 0.063, 0.014, 0.005, 0.004, 0.005, 0.001, 0.0001, 0.298, 0.282, 0.139, 0.175, 0.052, 0.071, 0.122, 0.1, 0.279, 0.193, 0.491, 0.137, 0.261, 0.155, 0.054, 0.404, 0.008, 0.134, 0.426, 0.252, 0.063, 0.039, 0.13, 0.007, 0.04, 0.014, 0.024, 0.0001, 0.024, 0.0001, 0.001, 0.0001, 13.56, 1.271, 0.49, 2.178, 3.499, 0.191, 4.675, 1.646, 6.887, 0.617, 3.65, 2.625, 2.089, 9.349, 2.312, 1.888, 0.011, 3.362, 3.296, 3.086, 3.992, 0.185, 1.217, 0.022, 0.792, 0.054, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.032, 0.007, 0.005, 0.003, 0.005, 0.004, 0.003, 0.003, 0.005, 0.012, 0.002, 0.001, 0.001, 0.004, 0.005, 0.002, 0.003, 0.002, 0.003, 0.01, 0.003, 0.002, 0.001, 0.001, 0.003, 0.007, 0.001, 0.003, 0.006, 0.006, 0.001, 0.001, 0.039, 0.004, 0.002, 0.003, 0.006, 0.005, 0.004, 0.006, 0.531, 1.186, 0.005, 0.003, 0.002, 0.005, 0.002, 0.002, 0.007, 0.006, 0.005, 0.006, 0.002, 0.002, 0.002, 0.001, 0.008, 0.005, 0.003, 0.002, 0.004, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.048, 1.757, 0.01, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.007, 0.003, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.015, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.005, 0.031, 0.001, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ka": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.399, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.467, 0.006, 0.05, 0.004, 0.0001, 0.005, 0.0001, 0.002, 0.08, 0.08, 0.0001, 0.001, 0.389, 0.146, 0.411, 0.004, 0.126, 0.165, 0.095, 0.049, 0.046, 0.05, 0.043, 0.044, 0.053, 0.091, 0.022, 0.014, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.009, 0.008, 0.011, 0.006, 0.004, 0.005, 0.005, 0.004, 0.036, 0.001, 0.002, 0.005, 0.008, 0.005, 0.004, 0.007, 0.001, 0.005, 0.01, 0.01, 0.002, 0.01, 0.003, 0.012, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.058, 0.009, 0.021, 0.031, 0.066, 0.012, 0.013, 0.018, 0.047, 0.001, 0.009, 0.032, 0.017, 0.042, 0.05, 0.013, 0.001, 0.044, 0.039, 0.037, 0.025, 0.006, 0.004, 0.003, 0.014, 0.002, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.133, 0.001, 0.001, 30.616, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.203, 1.072, 0.617, 1.27, 2.811, 0.901, 0.251, 0.727, 3.846, 0.492, 1.468, 1.522, 1.35, 1.641, 0.3, 0.022, 1.853, 2.198, 0.578, 0.828, 0.251, 0.28, 0.142, 0.172, 0.523, 0.1, 0.36, 0.118, 0.305, 0.039, 0.412, 0.073, 0.048, 0.001, 0.009, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.023, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.013, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 30.616, 0.133, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kaa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.138, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.976, 0.002, 0.25, 0.0001, 0.0001, 0.021, 0.001, 3.483, 0.188, 0.189, 0.0001, 0.005, 0.857, 0.333, 1.07, 0.015, 0.261, 0.313, 0.191, 0.105, 0.096, 0.102, 0.088, 0.083, 0.102, 0.171, 0.072, 0.024, 0.027, 0.002, 0.027, 0.004, 0.0001, 0.278, 0.237, 0.043, 0.064, 0.083, 0.059, 0.068, 0.047, 0.074, 0.082, 0.125, 0.051, 0.155, 0.064, 0.155, 0.081, 0.145, 0.091, 0.217, 0.129, 0.07, 0.048, 0.02, 0.093, 0.029, 0.015, 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.174, 10.672, 1.536, 0.082, 2.608, 4.846, 0.175, 1.712, 1.492, 6.03, 0.848, 1.882, 4.983, 2.176, 5.612, 2.458, 1.187, 1.824, 4.354, 3.602, 3.336, 1.517, 0.264, 0.926, 0.28, 1.912, 0.845, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.223, 0.008, 0.008, 0.008, 0.005, 0.003, 0.002, 0.003, 0.003, 0.001, 0.002, 0.004, 0.002, 0.002, 0.002, 0.003, 0.008, 0.001, 0.002, 0.024, 0.089, 0.003, 0.024, 0.001, 0.007, 0.086, 0.002, 0.002, 0.011, 0.008, 0.005, 0.018, 0.016, 0.006, 0.003, 0.007, 0.007, 0.002, 0.001, 0.006, 0.003, 0.004, 0.002, 0.012, 0.002, 0.006, 0.001, 0.009, 0.142, 4.113, 0.008, 0.007, 0.005, 0.049, 0.005, 0.002, 0.01, 0.003, 0.009, 0.024, 0.009, 0.012, 0.029, 0.003, 0.0001, 0.0001, 0.053, 0.053, 4.15, 0.014, 0.0001, 0.002, 0.0001, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.009, 0.003, 0.235, 0.052, 0.004, 0.001, 0.001, 0.003, 0.0001, 0.002, 0.013, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.006, 0.216, 0.0001, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kab": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.63, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.911, 0.026, 0.321, 0.0001, 0.0001, 0.004, 0.001, 0.063, 0.372, 0.372, 0.003, 0.002, 1.155, 1.35, 0.936, 0.038, 0.266, 0.305, 0.202, 0.119, 0.101, 0.107, 0.102, 0.091, 0.121, 0.181, 0.18, 0.035, 0.01, 0.019, 0.017, 0.012, 0.0001, 0.467, 0.145, 0.091, 0.191, 0.038, 0.078, 0.046, 0.038, 0.257, 0.025, 0.056, 0.211, 0.226, 0.079, 0.026, 0.046, 0.014, 0.063, 0.175, 0.468, 0.109, 0.016, 0.087, 0.018, 0.161, 0.062, 0.014, 0.0001, 0.014, 0.0001, 0.076, 0.0001, 9.2, 0.865, 0.672, 3.845, 7.769, 0.911, 1.711, 0.292, 5.622, 0.162, 1.372, 2.877, 2.842, 6.403, 0.445, 0.148, 0.603, 3.37, 3.532, 4.882, 2.937, 0.09, 1.486, 0.181, 2.148, 0.956, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.079, 0.004, 0.004, 0.003, 0.012, 0.007, 0.008, 0.003, 0.006, 0.01, 0.01, 0.0001, 0.003, 0.341, 0.007, 0.006, 0.04, 0.002, 0.003, 0.156, 0.017, 0.001, 0.002, 0.001, 0.004, 0.031, 0.007, 0.42, 0.023, 0.016, 0.002, 0.009, 0.025, 0.004, 0.015, 1.13, 0.027, 0.269, 0.019, 0.099, 0.024, 0.093, 0.007, 0.018, 0.013, 0.276, 0.002, 0.011, 0.014, 0.01, 0.006, 0.129, 0.025, 0.113, 0.001, 0.005, 0.586, 0.529, 0.15, 0.021, 0.004, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.056, 0.149, 0.056, 0.01, 0.05, 0.088, 0.0001, 1.3, 0.001, 0.001, 0.003, 0.0001, 0.203, 0.001, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.008, 0.063, 0.048, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 1.257, 0.143, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kbd": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.877, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.792, 0.0001, 0.075, 0.0001, 0.001, 0.011, 0.0001, 0.003, 0.141, 0.14, 0.0001, 0.003, 0.771, 0.205, 0.683, 0.004, 0.136, 0.165, 0.088, 0.057, 0.049, 0.062, 0.042, 0.043, 0.05, 0.078, 0.043, 0.017, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.304, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.008, 0.001, 0.014, 0.0001, 0.0001, 0.008, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 0.03, 0.003, 0.008, 0.007, 0.025, 0.002, 0.005, 0.007, 0.023, 0.001, 0.003, 0.195, 0.01, 0.018, 0.016, 0.007, 0.001, 0.016, 0.015, 0.015, 0.012, 0.002, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.555, 0.735, 0.993, 2.937, 0.251, 2.403, 0.222, 0.078, 0.401, 1.056, 2.895, 2.991, 0.659, 6.305, 0.005, 0.318, 0.209, 0.078, 0.019, 0.048, 0.196, 0.035, 0.012, 0.035, 0.104, 0.003, 0.214, 0.042, 0.072, 0.044, 0.009, 0.068, 0.044, 0.057, 0.06, 0.06, 0.029, 0.076, 0.012, 0.013, 0.04, 0.033, 0.001, 0.031, 0.001, 0.015, 0.002, 0.026, 2.293, 0.626, 0.124, 1.164, 0.956, 0.819, 0.63, 0.861, 1.412, 0.263, 1.894, 1.024, 2.202, 1.111, 0.541, 0.996, 0.0001, 0.0001, 0.089, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.007, 0.001, 0.005, 0.002, 18.347, 24.31, 0.001, 1.322, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.144, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kbp": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.616, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.57, 0.002, 0.071, 0.0001, 0.0001, 0.002, 0.0001, 0.006, 0.116, 0.115, 0.0001, 0.002, 0.667, 0.749, 0.841, 0.003, 0.17, 0.215, 0.112, 0.059, 0.061, 0.065, 0.059, 0.058, 0.083, 0.103, 0.043, 0.02, 0.0001, 0.014, 0.0001, 0.002, 0.0001, 0.165, 0.045, 0.077, 0.029, 0.079, 0.067, 0.032, 0.069, 0.044, 0.029, 0.18, 0.072, 0.11, 0.068, 0.032, 0.297, 0.002, 0.044, 0.127, 0.122, 0.017, 0.016, 0.035, 0.003, 0.036, 0.006, 0.025, 0.0001, 0.025, 0.0001, 0.0001, 0.0001, 8.914, 0.693, 0.409, 0.775, 2.26, 0.236, 0.534, 0.509, 1.986, 0.346, 2.598, 2.297, 1.559, 3.608, 1.061, 1.995, 0.02, 0.616, 1.735, 2.888, 0.861, 0.082, 0.914, 0.015, 2.587, 0.783, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.019, 0.022, 0.002, 0.003, 0.114, 0.001, 0.002, 0.001, 0.002, 0.067, 2.039, 2.33, 0.002, 0.002, 0.001, 0.0001, 0.179, 0.013, 0.001, 0.001, 2.735, 0.001, 1.381, 0.0001, 0.001, 0.007, 0.0001, 5.08, 0.004, 0.003, 0.0001, 0.0001, 0.004, 0.008, 0.005, 1.151, 0.003, 0.001, 0.001, 0.004, 0.013, 4.529, 0.002, 0.019, 0.001, 0.004, 0.003, 0.007, 0.003, 0.207, 0.003, 0.002, 0.003, 0.002, 0.003, 0.001, 0.006, 0.003, 0.002, 0.02, 0.003, 0.002, 0.002, 0.006, 0.0001, 0.0001, 0.035, 0.33, 0.004, 1.069, 0.247, 0.001, 0.0001, 14.815, 3.312, 0.001, 0.128, 0.0001, 0.011, 0.006, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.007, 0.013, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.239, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.886, 0.007, 0.336, 0.0001, 0.0001, 0.012, 0.002, 0.078, 0.324, 0.324, 0.001, 0.002, 0.656, 0.558, 1.416, 0.029, 0.129, 0.236, 0.138, 0.114, 0.084, 0.072, 0.081, 0.089, 0.086, 0.136, 0.151, 0.002, 0.018, 0.006, 0.018, 0.004, 0.0001, 0.545, 0.514, 0.255, 0.205, 0.262, 0.18, 0.131, 0.1, 0.152, 0.059, 0.708, 0.293, 0.752, 0.533, 0.094, 0.176, 0.01, 0.241, 0.354, 0.199, 0.108, 0.106, 0.05, 0.006, 0.156, 0.054, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.001, 12.562, 2.277, 0.331, 1.547, 5.722, 0.691, 1.741, 0.399, 6.386, 0.118, 3.863, 3.599, 2.582, 6.478, 2.883, 0.88, 0.049, 1.355, 2.305, 2.139, 4.827, 0.445, 0.58, 0.051, 3.145, 1.337, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.071, 0.012, 0.003, 0.002, 0.01, 0.004, 0.003, 0.001, 0.004, 0.005, 0.003, 0.002, 0.002, 0.003, 0.001, 0.001, 0.006, 0.001, 0.001, 0.062, 0.006, 0.002, 0.0001, 0.001, 0.001, 0.009, 0.002, 0.004, 0.002, 0.001, 0.001, 0.001, 0.037, 0.129, 0.127, 0.006, 0.006, 0.002, 0.017, 0.018, 0.037, 0.077, 0.018, 0.027, 0.002, 0.034, 0.066, 0.007, 0.011, 0.023, 0.005, 0.025, 0.156, 0.002, 0.001, 0.003, 0.003, 0.002, 0.014, 0.066, 0.013, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.038, 0.798, 0.007, 0.01, 0.0001, 0.0001, 0.0001, 0.013, 0.006, 0.004, 0.0001, 0.001, 0.012, 0.004, 0.009, 0.006, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.021, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.016, 0.007, 0.069, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ki": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.157, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.033, 0.001, 0.1, 0.001, 0.0001, 0.002, 0.005, 0.051, 0.116, 0.115, 0.0001, 0.0001, 0.384, 0.122, 1.505, 0.04, 0.182, 0.215, 0.151, 0.09, 0.071, 0.091, 0.067, 0.064, 0.059, 0.089, 0.065, 0.003, 0.006, 0.002, 0.008, 0.01, 0.0001, 0.273, 0.233, 0.763, 0.125, 0.089, 0.072, 0.168, 0.139, 0.145, 0.105, 0.364, 0.123, 0.376, 0.291, 0.066, 0.138, 0.046, 0.111, 0.252, 0.278, 0.132, 0.045, 0.093, 0.048, 0.079, 0.058, 0.02, 0.0001, 0.02, 0.0001, 0.015, 0.0001, 10.33, 0.786, 1.541, 0.901, 3.961, 0.163, 2.604, 2.426, 8.641, 0.326, 1.916, 0.633, 2.867, 6.576, 3.627, 0.309, 0.068, 4.492, 0.79, 3.938, 2.525, 0.104, 1.397, 0.085, 2.472, 0.26, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.05, 0.003, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.037, 0.01, 0.0001, 0.001, 0.003, 0.0001, 0.001, 0.001, 0.013, 0.005, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.06, 4.809, 0.0001, 0.069, 0.002, 0.006, 0.001, 0.004, 0.016, 0.25, 0.0001, 0.009, 0.003, 0.002, 0.0001, 0.009, 0.003, 0.001, 0.003, 0.026, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.021, 0.032, 2.884, 2.321, 0.0001, 0.002, 0.0001, 0.002, 0.021, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.048, 0.0001, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kj": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.677, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.71, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.323, 0.323, 0.0001, 0.0001, 0.645, 0.0001, 0.323, 0.0001, 1.613, 0.0001, 0.323, 0.323, 0.0001, 0.0001, 0.645, 0.323, 0.0001, 0.0001, 0.968, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.323, 0.0001, 2.903, 0.323, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.097, 3.226, 0.0001, 6.774, 6.774, 1.935, 1.29, 2.903, 10.645, 0.0001, 3.226, 3.226, 6.129, 2.581, 8.065, 0.323, 0.0001, 0.0001, 0.968, 0.323, 1.935, 0.645, 2.581, 0.0001, 0.323, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.706, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.721, 0.001, 0.107, 0.001, 0.0001, 0.006, 0.0001, 0.002, 0.151, 0.153, 0.001, 0.003, 0.51, 0.246, 0.686, 0.019, 0.221, 0.251, 0.17, 0.104, 0.092, 0.099, 0.09, 0.082, 0.09, 0.149, 0.04, 0.015, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.007, 0.006, 0.025, 0.003, 0.016, 0.005, 0.021, 0.002, 0.024, 0.001, 0.002, 0.003, 0.008, 0.018, 0.004, 0.01, 0.0001, 0.004, 0.021, 0.003, 0.003, 0.004, 0.004, 0.005, 0.001, 0.003, 0.003, 0.0001, 0.003, 0.0001, 0.002, 0.0001, 0.029, 0.005, 0.01, 0.008, 0.028, 0.004, 0.005, 0.007, 0.042, 0.0001, 0.004, 0.014, 0.009, 0.02, 0.023, 0.007, 0.0001, 0.021, 0.015, 0.017, 0.01, 0.003, 0.003, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.667, 1.698, 2.42, 0.825, 0.088, 0.097, 0.101, 0.026, 0.573, 0.004, 0.008, 3.51, 0.092, 0.043, 0.029, 0.226, 0.151, 0.105, 0.034, 0.789, 0.175, 0.042, 2.128, 0.009, 0.046, 0.288, 0.211, 1.223, 0.099, 0.041, 0.082, 0.052, 0.093, 0.104, 0.084, 0.646, 0.032, 0.032, 0.003, 0.007, 0.066, 0.363, 0.0001, 0.047, 0.001, 0.014, 0.013, 0.268, 5.447, 1.26, 0.188, 0.541, 1.919, 3.092, 0.668, 0.583, 0.903, 0.603, 1.169, 2.242, 1.309, 3.102, 1.26, 0.548, 0.0001, 0.0001, 0.145, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 25.612, 14.266, 3.356, 0.697, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.197, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.635, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.811, 0.001, 0.341, 0.0001, 0.0001, 0.006, 0.002, 0.029, 0.34, 0.34, 0.002, 0.001, 0.7, 0.575, 1.063, 0.02, 0.29, 0.457, 0.333, 0.207, 0.125, 0.141, 0.14, 0.129, 0.134, 0.187, 0.161, 0.026, 0.008, 0.005, 0.008, 0.0001, 0.0001, 0.28, 0.09, 0.107, 0.095, 0.075, 0.086, 0.052, 0.078, 0.183, 0.108, 0.243, 0.074, 0.184, 0.254, 0.06, 0.118, 0.079, 0.062, 0.257, 0.166, 0.177, 0.059, 0.032, 0.002, 0.012, 0.015, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 12.711, 0.276, 0.184, 0.432, 3.419, 0.731, 1.669, 0.268, 10.409, 0.217, 2.335, 4.586, 2.81, 6.778, 2.817, 1.735, 2.883, 5.126, 5.68, 6.217, 6.675, 0.652, 0.054, 0.023, 0.144, 0.055, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.031, 0.035, 0.014, 0.011, 0.03, 0.017, 0.013, 0.007, 0.019, 0.003, 0.015, 0.002, 0.011, 0.008, 0.02, 0.004, 0.014, 0.011, 0.007, 0.013, 0.007, 0.01, 0.01, 0.01, 0.008, 0.016, 0.005, 0.005, 0.009, 0.004, 0.004, 0.006, 0.015, 0.021, 0.01, 0.011, 0.03, 0.03, 0.045, 0.038, 0.021, 0.031, 0.02, 0.014, 0.007, 0.018, 0.005, 0.016, 0.035, 0.027, 0.022, 0.024, 0.011, 0.015, 0.016, 0.009, 0.078, 0.018, 0.016, 0.011, 0.01, 0.011, 0.018, 0.012, 0.0001, 0.0001, 0.012, 0.201, 0.031, 0.017, 0.001, 0.001, 0.0001, 0.004, 0.004, 0.004, 0.004, 0.0001, 0.016, 0.008, 0.085, 0.031, 0.0001, 0.001, 0.0001, 0.0001, 0.024, 0.053, 0.13, 0.094, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.065, 0.039, 0.022, 0.0001, 0.001, 0.011, 0.007, 0.001, 0.001, 0.003, 0.001, 0.002, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "km": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.234, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.565, 0.004, 0.038, 0.0001, 0.0001, 0.004, 0.0001, 0.009, 0.049, 0.049, 0.0001, 0.001, 0.07, 0.028, 0.072, 0.003, 0.02, 0.022, 0.013, 0.008, 0.007, 0.007, 0.006, 0.006, 0.007, 0.012, 0.008, 0.003, 0.007, 0.012, 0.008, 0.004, 0.0001, 0.018, 0.012, 0.02, 0.008, 0.012, 0.009, 0.007, 0.009, 0.013, 0.004, 0.006, 0.012, 0.012, 0.009, 0.006, 0.011, 0.001, 0.009, 0.018, 0.02, 0.004, 0.004, 0.006, 0.002, 0.002, 0.001, 0.022, 0.0001, 0.022, 0.0001, 0.004, 0.0001, 0.403, 0.068, 0.154, 0.173, 0.554, 0.096, 0.093, 0.2, 0.358, 0.005, 0.025, 0.201, 0.122, 0.348, 0.339, 0.093, 0.005, 0.306, 0.292, 0.378, 0.132, 0.051, 0.059, 0.012, 0.073, 0.006, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.652, 0.801, 0.696, 0.139, 1.351, 0.735, 0.591, 0.836, 0.083, 0.299, 0.563, 1.859, 0.05, 0.041, 0.223, 1.134, 0.273, 0.671, 2.897, 1.707, 1.359, 0.097, 0.57, 0.24, 1.039, 0.72, 1.493, 0.708, 0.482, 0.006, 22.614, 7.802, 0.292, 0.16, 0.416, 0.027, 0.02, 0.041, 0.016, 0.053, 0.015, 0.021, 0.003, 0.006, 0.019, 0.002, 0.004, 0.041, 0.002, 0.021, 0.047, 0.001, 0.001, 0.001, 2.388, 0.829, 0.388, 0.131, 0.053, 0.602, 0.318, 0.199, 0.385, 0.021, 0.0001, 0.0001, 0.017, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 29.306, 1.288, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.22, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.193, 0.001, 0.077, 0.0001, 0.001, 0.006, 0.001, 0.024, 0.05, 0.05, 0.001, 0.001, 0.263, 0.039, 0.387, 0.008, 0.055, 0.048, 0.031, 0.015, 0.013, 0.017, 0.014, 0.014, 0.016, 0.027, 0.012, 0.01, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.007, 0.004, 0.007, 0.004, 0.004, 0.003, 0.002, 0.002, 0.007, 0.001, 0.001, 0.002, 0.005, 0.003, 0.003, 0.004, 0.0001, 0.003, 0.008, 0.004, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.001, 0.001, 0.019, 0.003, 0.007, 0.007, 0.022, 0.004, 0.004, 0.008, 0.016, 0.001, 0.002, 0.009, 0.007, 0.014, 0.015, 0.005, 0.0001, 0.014, 0.012, 0.015, 0.006, 0.002, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.377, 1.744, 1.056, 0.052, 0.0001, 0.294, 1.302, 0.476, 0.14, 0.07, 0.25, 0.184, 0.18, 3.237, 0.115, 0.016, 0.01, 0.0001, 0.076, 0.009, 0.004, 1.075, 0.058, 1.134, 0.019, 0.006, 0.205, 0.005, 0.214, 0.004, 0.012, 0.397, 0.02, 0.439, 0.004, 0.214, 1.341, 0.105, 1.57, 0.184, 1.477, 0.01, 0.553, 0.067, 0.408, 0.14, 0.772, 0.936, 1.909, 0.0001, 24.738, 8.223, 0.0001, 1.147, 0.212, 0.182, 0.975, 0.409, 0.0001, 0.0001, 0.001, 0.0001, 1.605, 2.364, 0.0001, 0.0001, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.178, 0.0001, 0.177, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "koi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.5, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.538, 0.003, 0.105, 0.0001, 0.0001, 0.012, 0.0001, 0.066, 0.298, 0.299, 0.001, 0.003, 0.665, 0.135, 0.828, 0.022, 0.193, 0.238, 0.151, 0.096, 0.069, 0.095, 0.069, 0.062, 0.067, 0.14, 0.09, 0.011, 0.011, 0.003, 0.011, 0.012, 0.0001, 0.012, 0.004, 0.007, 0.003, 0.004, 0.002, 0.002, 0.009, 0.016, 0.003, 0.015, 0.007, 0.012, 0.004, 0.018, 0.015, 0.0001, 0.004, 0.016, 0.008, 0.003, 0.011, 0.001, 0.01, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.204, 0.031, 0.062, 0.036, 0.122, 0.007, 0.019, 0.037, 0.201, 0.009, 0.035, 0.077, 0.03, 0.109, 0.075, 0.025, 0.001, 0.099, 0.08, 0.059, 0.07, 0.013, 0.004, 0.003, 0.013, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.529, 2.707, 1.977, 1.216, 0.076, 0.086, 0.043, 0.37, 0.314, 0.008, 0.015, 2.496, 1.151, 0.356, 0.143, 0.67, 0.146, 0.176, 0.113, 0.201, 0.173, 0.031, 0.44, 0.017, 0.071, 0.03, 0.345, 0.07, 0.14, 0.058, 0.096, 0.178, 0.09, 0.17, 0.07, 0.048, 0.048, 0.034, 0.04, 1.604, 0.03, 0.001, 0.001, 0.041, 0.0001, 0.038, 0.042, 0.02, 3.314, 0.375, 1.556, 0.398, 1.638, 1.43, 1.24, 0.859, 1.906, 0.527, 1.802, 1.787, 1.504, 2.903, 2.273, 0.718, 0.0001, 0.0001, 0.079, 0.905, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.021, 0.0001, 0.001, 0.001, 25.357, 14.367, 0.001, 1.602, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.0001, 0.293, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 25.0, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.667, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "krc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.633, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.611, 0.001, 0.078, 0.0001, 0.002, 0.011, 0.0001, 0.002, 0.139, 0.14, 0.0001, 0.001, 0.591, 0.21, 0.542, 0.004, 0.138, 0.24, 0.114, 0.076, 0.067, 0.073, 0.058, 0.056, 0.073, 0.12, 0.04, 0.013, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.004, 0.004, 0.006, 0.003, 0.003, 0.002, 0.003, 0.002, 0.03, 0.001, 0.002, 0.003, 0.004, 0.002, 0.002, 0.002, 0.001, 0.002, 0.005, 0.004, 0.001, 0.01, 0.002, 0.017, 0.0001, 0.001, 0.014, 0.0001, 0.014, 0.0001, 0.001, 0.0001, 0.038, 0.009, 0.012, 0.014, 0.044, 0.006, 0.01, 0.013, 0.029, 0.002, 0.006, 0.019, 0.015, 0.026, 0.027, 0.008, 0.001, 0.031, 0.024, 0.024, 0.014, 0.007, 0.003, 0.002, 0.005, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.564, 1.141, 1.579, 1.633, 0.148, 0.303, 0.164, 0.503, 0.456, 0.003, 1.306, 2.454, 0.134, 0.294, 0.686, 0.418, 0.168, 0.334, 0.032, 0.057, 0.2, 0.019, 0.006, 0.011, 0.056, 0.006, 0.17, 0.03, 0.076, 0.03, 0.044, 0.051, 0.143, 0.104, 0.049, 0.03, 0.04, 0.03, 0.005, 0.024, 0.052, 0.001, 0.001, 0.061, 0.001, 0.035, 0.01, 0.009, 6.121, 1.252, 0.294, 1.328, 2.359, 2.412, 0.507, 0.442, 2.779, 0.471, 1.691, 3.418, 1.039, 3.402, 1.301, 0.302, 0.0001, 0.0001, 0.209, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.0001, 0.006, 0.002, 30.423, 13.816, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.14, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ks": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.09, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.116, 0.0001, 0.395, 0.007, 0.0001, 0.0001, 0.004, 0.023, 0.126, 0.124, 0.0001, 0.001, 0.08, 0.153, 0.257, 0.005, 0.042, 0.08, 0.041, 0.04, 0.021, 0.031, 0.018, 0.019, 0.02, 0.048, 0.059, 0.003, 0.053, 0.167, 0.053, 0.0001, 0.0001, 0.005, 0.003, 0.008, 0.007, 0.01, 0.007, 0.001, 0.002, 0.016, 0.003, 0.003, 0.003, 0.004, 0.019, 0.008, 0.002, 0.0001, 0.005, 0.01, 0.013, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.198, 0.016, 0.127, 0.13, 0.17, 0.01, 0.074, 0.033, 0.171, 0.002, 0.016, 0.235, 0.092, 0.256, 0.101, 0.014, 0.0001, 0.218, 0.145, 0.254, 0.031, 0.065, 0.054, 0.0001, 0.012, 0.0001, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.451, 1.562, 0.534, 0.248, 1.154, 1.571, 2.211, 0.263, 1.281, 0.132, 0.341, 0.16, 1.683, 0.702, 0.993, 0.637, 0.623, 0.052, 0.37, 0.043, 0.331, 0.813, 0.313, 0.319, 0.042, 0.007, 0.092, 0.282, 0.326, 0.013, 0.006, 0.065, 0.245, 0.114, 0.179, 0.083, 8.684, 2.577, 0.461, 2.698, 1.217, 0.995, 1.306, 0.114, 0.545, 0.242, 0.666, 1.253, 0.811, 1.543, 0.848, 0.915, 0.434, 0.417, 0.188, 0.11, 0.481, 0.73, 0.156, 0.08, 0.312, 0.004, 2.104, 0.512, 0.0001, 0.0001, 0.188, 0.0001, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.031, 0.0001, 0.008, 0.002, 0.028, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.045, 10.482, 2.72, 3.264, 0.0001, 0.0001, 0.0001, 0.0001, 10.717, 0.001, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ksh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.3, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.544, 0.007, 0.195, 0.001, 0.0001, 0.006, 0.002, 0.064, 0.077, 0.076, 0.018, 0.0001, 0.951, 0.126, 1.237, 0.01, 0.258, 0.351, 0.176, 0.091, 0.09, 0.099, 0.083, 0.083, 0.116, 0.206, 0.046, 0.013, 0.003, 0.002, 0.003, 0.004, 0.0001, 0.29, 0.361, 0.086, 0.549, 0.218, 0.205, 0.059, 0.258, 0.102, 0.404, 0.343, 0.228, 0.359, 0.191, 0.138, 0.226, 0.009, 0.194, 0.601, 0.11, 0.081, 0.179, 0.232, 0.004, 0.009, 0.121, 0.015, 0.0001, 0.017, 0.0001, 0.132, 0.0001, 4.203, 0.771, 2.07, 4.046, 9.612, 0.707, 0.863, 3.367, 3.374, 1.363, 1.028, 2.762, 2.009, 5.309, 3.906, 0.798, 0.006, 4.302, 3.629, 3.86, 2.108, 1.453, 1.005, 0.049, 0.079, 0.749, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.123, 0.002, 0.002, 0.001, 0.082, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.005, 0.0001, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.005, 0.011, 0.0001, 0.082, 0.036, 0.001, 0.009, 0.0001, 0.001, 0.047, 0.002, 0.044, 0.413, 0.03, 0.004, 0.001, 0.001, 1.721, 0.001, 0.004, 0.002, 0.003, 0.013, 0.001, 0.084, 0.001, 0.002, 0.0001, 0.008, 0.003, 0.001, 0.005, 0.025, 0.002, 0.001, 1.538, 0.002, 0.001, 0.001, 0.002, 0.003, 0.531, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.029, 4.494, 0.051, 0.013, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.124, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ku": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.393, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.949, 0.005, 0.256, 0.0001, 0.0001, 0.006, 0.001, 0.113, 0.21, 0.21, 0.006, 0.003, 0.803, 0.095, 1.083, 0.023, 0.197, 0.26, 0.139, 0.073, 0.067, 0.078, 0.071, 0.068, 0.08, 0.162, 0.084, 0.022, 0.008, 0.003, 0.008, 0.006, 0.0001, 0.192, 0.235, 0.084, 0.253, 0.208, 0.064, 0.107, 0.175, 0.032, 0.081, 0.247, 0.144, 0.22, 0.115, 0.035, 0.144, 0.05, 0.104, 0.203, 0.123, 0.017, 0.026, 0.063, 0.071, 0.053, 0.061, 0.009, 0.0001, 0.009, 0.0001, 0.003, 0.002, 7.122, 1.894, 0.369, 2.998, 7.334, 0.296, 0.895, 1.263, 5.92, 0.932, 2.612, 1.973, 1.601, 5.257, 1.434, 0.604, 0.177, 4.384, 1.643, 2.193, 1.071, 1.195, 1.296, 0.608, 2.23, 0.722, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.075, 0.006, 0.004, 0.007, 0.009, 0.007, 0.012, 0.062, 0.012, 0.002, 0.018, 0.001, 0.015, 0.003, 0.068, 0.002, 0.001, 0.001, 0.002, 0.006, 0.001, 0.004, 0.003, 0.001, 0.007, 0.019, 0.001, 0.009, 0.013, 0.012, 0.074, 0.658, 0.013, 0.005, 0.004, 0.002, 0.003, 0.002, 0.004, 0.335, 0.008, 0.015, 3.587, 0.004, 0.003, 0.008, 2.776, 0.007, 0.009, 0.038, 0.007, 0.007, 0.016, 0.003, 0.007, 0.002, 0.005, 0.004, 0.005, 1.203, 0.019, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.03, 8.061, 0.042, 0.73, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.01, 0.005, 0.017, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.063, 0.061, 0.005, 0.012, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.006, 0.073, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.403, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.572, 0.002, 0.112, 0.0001, 0.0001, 0.004, 0.0001, 0.006, 0.253, 0.254, 0.001, 0.001, 0.652, 0.237, 0.796, 0.019, 0.199, 0.362, 0.176, 0.114, 0.094, 0.095, 0.085, 0.09, 0.105, 0.228, 0.059, 0.022, 0.003, 0.001, 0.004, 0.001, 0.0001, 0.008, 0.005, 0.011, 0.005, 0.005, 0.004, 0.005, 0.005, 0.02, 0.004, 0.011, 0.006, 0.006, 0.007, 0.004, 0.005, 0.002, 0.005, 0.011, 0.006, 0.004, 0.008, 0.003, 0.013, 0.003, 0.002, 0.039, 0.0001, 0.039, 0.0001, 0.0001, 0.0001, 0.115, 0.019, 0.016, 0.027, 0.069, 0.009, 0.022, 0.03, 0.155, 0.012, 0.027, 0.043, 0.035, 0.068, 0.048, 0.017, 0.005, 0.048, 0.041, 0.048, 0.044, 0.012, 0.013, 0.005, 0.014, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.292, 3.131, 1.711, 1.163, 0.094, 0.093, 0.068, 0.394, 0.316, 0.013, 0.283, 2.417, 0.996, 0.157, 0.138, 0.933, 0.185, 0.144, 0.161, 0.163, 0.266, 0.043, 0.288, 0.024, 0.072, 0.036, 0.257, 0.079, 0.116, 0.07, 0.051, 0.125, 0.115, 0.273, 0.082, 0.056, 0.037, 0.021, 0.028, 2.085, 0.052, 0.007, 0.009, 0.112, 0.005, 0.032, 0.025, 0.019, 3.353, 0.487, 1.618, 0.507, 1.803, 1.293, 0.994, 0.555, 1.916, 0.692, 1.739, 1.936, 1.41, 2.819, 2.119, 0.641, 0.0001, 0.0001, 0.211, 0.665, 0.015, 0.015, 0.006, 0.004, 0.002, 0.021, 0.019, 0.013, 0.017, 0.003, 0.013, 0.006, 25.09, 14.142, 0.006, 2.075, 0.003, 0.001, 0.001, 0.003, 0.01, 0.008, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.016, 0.023, 0.303, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "kw": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.271, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.698, 0.003, 0.428, 0.0001, 0.0001, 0.066, 0.001, 0.379, 0.501, 0.501, 0.001, 0.001, 1.043, 0.466, 1.444, 0.019, 0.602, 0.995, 0.55, 0.31, 0.288, 0.284, 0.283, 0.29, 0.333, 0.472, 0.076, 0.113, 0.013, 0.003, 0.013, 0.002, 0.0001, 0.413, 0.261, 0.217, 0.211, 0.211, 0.117, 0.24, 0.182, 0.089, 0.078, 0.627, 0.279, 0.264, 0.166, 0.089, 0.271, 0.018, 0.16, 0.497, 0.182, 0.13, 0.12, 0.167, 0.003, 0.325, 0.009, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 7.247, 1.102, 0.333, 2.599, 6.963, 0.397, 1.527, 3.863, 2.585, 0.151, 1.745, 2.596, 1.638, 6.936, 4.292, 0.693, 0.011, 4.812, 4.449, 2.907, 1.185, 1.044, 2.706, 0.022, 4.495, 0.043, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.063, 0.013, 0.005, 0.007, 0.005, 0.004, 0.003, 0.003, 0.006, 0.002, 0.002, 0.001, 0.003, 0.005, 0.002, 0.002, 0.003, 0.003, 0.001, 0.033, 0.004, 0.002, 0.002, 0.004, 0.004, 0.02, 0.001, 0.001, 0.003, 0.002, 0.001, 0.002, 0.025, 0.014, 0.004, 0.005, 0.015, 0.004, 0.003, 0.007, 0.004, 0.018, 0.007, 0.005, 0.002, 0.009, 0.005, 0.004, 0.012, 0.007, 0.012, 0.009, 0.008, 0.009, 0.007, 0.003, 0.012, 0.008, 0.009, 0.008, 0.006, 0.007, 0.012, 0.004, 0.0001, 0.0001, 0.028, 0.1, 0.011, 0.012, 0.0001, 0.001, 0.0001, 0.007, 0.003, 0.004, 0.004, 0.0001, 0.012, 0.004, 0.062, 0.02, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.004, 0.013, 0.011, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.013, 0.007, 0.058, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ky": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.608, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.786, 0.001, 0.076, 0.0001, 0.0001, 0.007, 0.001, 0.001, 0.181, 0.185, 0.0001, 0.003, 0.592, 0.375, 0.793, 0.011, 0.212, 0.26, 0.154, 0.095, 0.087, 0.095, 0.083, 0.081, 0.088, 0.165, 0.05, 0.023, 0.024, 0.003, 0.024, 0.002, 0.0001, 0.006, 0.009, 0.006, 0.003, 0.002, 0.01, 0.002, 0.004, 0.023, 0.001, 0.001, 0.003, 0.004, 0.009, 0.004, 0.011, 0.0001, 0.003, 0.019, 0.005, 0.001, 0.003, 0.002, 0.004, 0.001, 0.0001, 0.007, 0.0001, 0.008, 0.0001, 0.002, 0.0001, 0.034, 0.028, 0.011, 0.01, 0.036, 0.004, 0.007, 0.01, 0.029, 0.001, 0.005, 0.017, 0.009, 0.023, 0.028, 0.008, 0.001, 0.047, 0.02, 0.022, 0.013, 0.003, 0.003, 0.002, 0.006, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 2.775, 1.184, 2.443, 1.907, 0.113, 0.08, 0.128, 0.561, 0.622, 0.004, 0.005, 2.414, 0.086, 0.264, 0.107, 0.368, 0.184, 0.149, 0.029, 0.1, 0.146, 0.009, 0.06, 0.008, 0.039, 0.003, 0.233, 0.023, 0.133, 0.051, 0.082, 0.045, 0.072, 0.109, 0.101, 0.162, 0.039, 0.017, 0.003, 0.031, 0.045, 0.843, 0.0001, 0.06, 0.001, 0.049, 0.011, 1.059, 5.238, 0.934, 0.249, 1.237, 1.665, 2.222, 0.662, 0.522, 2.314, 0.665, 2.431, 2.219, 1.157, 3.498, 1.756, 0.567, 0.0001, 0.0001, 0.135, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 28.842, 12.881, 1.192, 0.856, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.186, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "la": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.703, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.582, 0.002, 0.557, 0.0001, 0.0001, 0.004, 0.001, 0.038, 0.296, 0.296, 0.016, 0.002, 1.029, 0.127, 0.917, 0.01, 0.288, 0.518, 0.368, 0.158, 0.135, 0.172, 0.155, 0.139, 0.169, 0.292, 0.103, 0.058, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.441, 0.179, 0.385, 0.16, 0.131, 0.176, 0.158, 0.144, 0.363, 0.023, 0.04, 0.184, 0.266, 0.121, 0.103, 0.293, 0.049, 0.202, 0.319, 0.152, 0.063, 0.122, 0.033, 0.022, 0.01, 0.013, 0.004, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 7.718, 1.137, 2.983, 1.877, 7.832, 0.566, 0.934, 0.721, 8.862, 0.018, 0.079, 2.703, 3.638, 5.533, 4.661, 1.753, 0.47, 5.095, 5.379, 5.968, 5.347, 0.814, 0.036, 0.291, 0.205, 0.069, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.045, 0.018, 0.011, 0.014, 0.009, 0.005, 0.004, 0.005, 0.004, 0.018, 0.002, 0.002, 0.005, 0.007, 0.002, 0.002, 0.004, 0.003, 0.002, 0.014, 0.007, 0.002, 0.002, 0.002, 0.003, 0.004, 0.003, 0.002, 0.004, 0.003, 0.003, 0.004, 0.013, 0.011, 0.004, 0.003, 0.009, 0.004, 0.004, 0.006, 0.01, 0.02, 0.004, 0.013, 0.003, 0.007, 0.003, 0.005, 0.044, 0.013, 0.009, 0.008, 0.006, 0.012, 0.008, 0.005, 0.014, 0.01, 0.011, 0.011, 0.013, 0.014, 0.01, 0.01, 0.0001, 0.0001, 0.047, 0.083, 0.019, 0.012, 0.0001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.062, 0.03, 0.07, 0.024, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.005, 0.012, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.015, 0.037, 0.003, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lad": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.233, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.114, 0.001, 0.334, 0.0001, 0.0001, 0.009, 0.001, 0.032, 0.169, 0.169, 0.0001, 0.0001, 1.028, 0.087, 0.763, 0.008, 0.237, 0.25, 0.147, 0.074, 0.074, 0.086, 0.072, 0.065, 0.078, 0.138, 0.053, 0.043, 0.005, 0.001, 0.005, 0.001, 0.0001, 0.303, 0.15, 0.122, 0.124, 0.422, 0.07, 0.094, 0.073, 0.145, 0.052, 0.173, 0.269, 0.273, 0.076, 0.097, 0.169, 0.01, 0.114, 0.279, 0.178, 0.068, 0.08, 0.015, 0.026, 0.054, 0.024, 0.01, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 10.092, 0.654, 0.428, 4.329, 9.389, 0.52, 0.701, 0.524, 5.468, 0.466, 2.315, 4.475, 1.912, 5.533, 6.266, 1.56, 0.038, 4.367, 5.784, 3.223, 2.47, 1.069, 0.027, 0.043, 1.039, 0.561, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.02, 0.012, 0.005, 0.005, 0.009, 0.006, 0.004, 0.004, 0.005, 0.003, 0.006, 0.002, 0.002, 0.003, 0.003, 0.001, 0.015, 0.012, 0.004, 0.011, 0.018, 0.019, 0.004, 0.004, 0.007, 0.031, 0.002, 0.006, 0.016, 0.006, 0.01, 0.011, 0.017, 0.14, 0.008, 0.005, 0.006, 0.003, 0.003, 0.02, 0.02, 0.11, 0.013, 0.01, 0.003, 0.09, 0.002, 0.005, 0.012, 0.024, 0.019, 0.137, 0.008, 0.006, 0.005, 0.006, 0.008, 0.006, 0.03, 0.011, 0.011, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.044, 0.511, 0.018, 0.013, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.017, 0.007, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.005, 0.02, 0.199, 0.037, 0.028, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.006, 0.018, 0.0001, 0.001, 0.003, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.412, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.95, 0.002, 0.355, 0.0001, 0.0001, 0.008, 0.002, 0.417, 0.145, 0.146, 0.001, 0.003, 0.802, 0.307, 1.03, 0.016, 0.348, 0.52, 0.266, 0.139, 0.134, 0.143, 0.128, 0.134, 0.162, 0.294, 0.059, 0.012, 0.015, 0.003, 0.015, 0.001, 0.0001, 0.428, 0.324, 0.254, 0.594, 0.233, 0.259, 0.289, 0.233, 0.12, 0.196, 0.27, 0.284, 0.379, 0.192, 0.132, 0.314, 0.012, 0.243, 0.585, 0.165, 0.101, 0.142, 0.167, 0.006, 0.01, 0.098, 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 4.931, 0.886, 1.95, 2.841, 11.151, 0.974, 2.202, 2.438, 4.449, 0.072, 0.85, 2.736, 2.142, 6.511, 2.976, 0.873, 0.044, 5.369, 4.192, 4.448, 3.418, 0.952, 0.815, 0.087, 0.179, 0.783, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.039, 0.004, 0.003, 0.002, 0.022, 0.001, 0.001, 0.002, 0.001, 0.016, 0.001, 0.02, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.012, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.01, 0.002, 0.008, 0.002, 0.053, 0.005, 0.005, 0.001, 0.485, 0.001, 0.003, 0.007, 0.029, 0.959, 0.004, 0.541, 0.001, 0.003, 0.002, 0.002, 0.009, 0.004, 0.006, 0.005, 0.01, 0.003, 0.01, 0.001, 0.004, 0.002, 0.003, 0.005, 0.046, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.061, 2.169, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.004, 0.024, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.037, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lbe": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.255, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.9, 0.001, 0.252, 0.0001, 0.0001, 0.001, 0.0001, 0.011, 0.416, 0.416, 0.0001, 0.003, 0.481, 0.136, 0.815, 0.07, 0.265, 0.236, 0.199, 0.107, 0.105, 0.116, 0.098, 0.098, 0.121, 0.12, 0.136, 0.067, 0.071, 0.002, 0.067, 0.006, 0.0001, 0.016, 0.004, 0.021, 0.002, 0.004, 0.005, 0.004, 0.003, 0.485, 0.0001, 0.002, 0.006, 0.012, 0.003, 0.003, 0.014, 0.001, 0.005, 0.011, 0.004, 0.002, 0.006, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.216, 0.084, 0.071, 0.045, 0.128, 0.01, 0.022, 0.031, 0.155, 0.002, 0.014, 0.09, 0.049, 0.088, 0.086, 0.051, 0.003, 0.174, 0.114, 0.069, 0.102, 0.012, 0.003, 0.009, 0.024, 0.006, 0.001, 0.001, 0.001, 0.001, 0.0001, 3.391, 1.985, 1.311, 3.41, 0.076, 1.237, 0.309, 0.579, 0.377, 0.095, 0.645, 0.087, 1.158, 0.044, 0.125, 0.671, 0.313, 0.089, 0.058, 0.221, 0.212, 0.014, 0.015, 0.044, 0.077, 0.005, 0.185, 0.069, 0.144, 0.054, 0.029, 0.04, 0.037, 0.075, 0.123, 0.038, 0.018, 0.116, 0.052, 0.091, 0.05, 0.027, 0.003, 0.033, 0.004, 0.04, 0.009, 0.029, 7.018, 0.742, 1.169, 0.714, 1.012, 0.485, 0.137, 0.404, 2.976, 0.818, 1.445, 2.805, 1.012, 2.921, 0.476, 0.297, 0.0001, 0.0001, 0.062, 0.008, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 26.245, 14.532, 0.0001, 0.534, 0.0001, 0.001, 0.0001, 0.009, 0.088, 0.067, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.019, 0.318, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lez": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.788, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.917, 0.001, 0.11, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.118, 0.119, 0.0001, 0.001, 0.531, 0.18, 0.599, 0.004, 0.16, 0.227, 0.133, 0.076, 0.063, 0.071, 0.067, 0.062, 0.08, 0.115, 0.048, 0.01, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.003, 0.002, 0.005, 0.001, 0.002, 0.001, 0.001, 0.001, 0.351, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.01, 0.001, 0.037, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.023, 0.003, 0.006, 0.005, 0.017, 0.002, 0.004, 0.004, 0.014, 0.001, 0.003, 0.017, 0.004, 0.011, 0.011, 0.005, 0.0001, 0.013, 0.01, 0.009, 0.009, 0.002, 0.001, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.387, 1.088, 1.449, 2.206, 0.197, 0.805, 0.228, 0.469, 0.264, 0.003, 0.696, 0.03, 1.797, 0.123, 0.075, 0.643, 0.214, 0.062, 0.057, 0.099, 0.243, 0.013, 0.01, 0.016, 0.072, 0.013, 0.197, 0.034, 0.095, 0.027, 0.015, 0.041, 0.182, 0.109, 0.046, 0.053, 0.025, 0.087, 0.024, 0.038, 0.035, 0.001, 0.001, 0.075, 0.001, 0.022, 0.007, 0.017, 6.908, 0.463, 1.591, 1.254, 1.853, 1.815, 0.195, 0.884, 4.344, 1.376, 1.744, 1.947, 0.879, 2.868, 0.597, 0.413, 0.0001, 0.0001, 0.264, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.007, 0.0001, 0.004, 0.002, 30.62, 13.045, 0.0001, 0.248, 0.0001, 0.001, 0.0001, 0.001, 0.004, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.149, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.42, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.857, 0.039, 0.098, 0.0001, 0.0001, 0.008, 0.0001, 0.193, 0.619, 0.652, 0.006, 0.013, 0.576, 0.063, 0.759, 0.031, 0.142, 0.149, 0.106, 0.065, 0.048, 0.064, 0.043, 0.046, 0.035, 0.039, 0.112, 0.029, 0.002, 0.038, 0.003, 0.025, 0.0001, 0.202, 0.147, 0.077, 0.032, 0.406, 0.021, 0.082, 0.019, 0.071, 0.01, 0.184, 0.083, 0.172, 0.138, 0.35, 0.039, 0.002, 0.027, 0.089, 0.063, 0.041, 0.016, 0.06, 0.001, 0.036, 0.019, 0.012, 0.0001, 0.012, 0.0001, 0.01, 0.001, 11.513, 4.158, 0.451, 1.382, 6.569, 0.546, 2.789, 0.349, 6.274, 0.363, 4.548, 2.809, 3.269, 5.614, 5.854, 0.404, 0.013, 2.198, 2.205, 2.706, 6.16, 0.367, 2.254, 0.045, 2.427, 1.395, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 1.181, 0.001, 0.015, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 0.006, 0.008, 0.842, 0.001, 0.0001, 0.092, 0.085, 0.0001, 0.0001, 0.001, 0.001, 0.113, 0.0001, 0.0001, 0.0001, 0.017, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.006, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.181, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "li": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.944, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.135, 0.002, 0.418, 0.0001, 0.0001, 0.017, 0.001, 1.033, 0.22, 0.22, 0.002, 0.001, 0.717, 0.245, 0.974, 0.02, 0.269, 0.322, 0.176, 0.093, 0.094, 0.096, 0.096, 0.091, 0.103, 0.161, 0.092, 0.054, 0.018, 0.002, 0.018, 0.001, 0.0001, 0.18, 0.177, 0.097, 0.347, 0.099, 0.066, 0.119, 0.148, 0.188, 0.05, 0.105, 0.134, 0.157, 0.158, 0.108, 0.098, 0.003, 0.104, 0.185, 0.093, 0.028, 0.141, 0.105, 0.003, 0.004, 0.083, 0.008, 0.001, 0.008, 0.0001, 0.0001, 0.001, 5.507, 1.139, 0.937, 3.64, 13.741, 0.575, 2.233, 1.264, 5.103, 1.163, 1.751, 2.989, 1.798, 6.008, 4.376, 1.144, 0.011, 4.793, 3.527, 4.666, 1.997, 1.767, 1.153, 0.045, 0.112, 0.704, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.031, 0.005, 0.002, 0.002, 0.002, 0.002, 0.001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.01, 0.001, 0.0001, 0.002, 0.0001, 0.007, 0.018, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.002, 0.004, 0.007, 0.003, 0.002, 0.113, 0.003, 0.001, 0.003, 0.424, 0.024, 0.004, 0.246, 0.001, 0.004, 0.001, 0.014, 0.003, 0.003, 0.027, 0.238, 0.005, 0.002, 0.354, 0.001, 0.005, 0.003, 0.003, 0.002, 0.014, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.028, 1.471, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.01, 0.004, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.031, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lij": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.653, 0.006, 0.425, 0.0001, 0.0001, 0.003, 0.001, 1.006, 0.211, 0.212, 0.0001, 0.0001, 1.079, 0.522, 0.689, 0.013, 0.183, 0.34, 0.145, 0.099, 0.1, 0.107, 0.089, 0.101, 0.099, 0.127, 0.107, 0.071, 0.08, 0.003, 0.08, 0.006, 0.0001, 0.288, 0.108, 0.216, 0.12, 0.091, 0.089, 0.116, 0.025, 0.235, 0.016, 0.018, 0.145, 0.148, 0.083, 0.128, 0.166, 0.021, 0.11, 0.224, 0.097, 0.053, 0.082, 0.012, 0.025, 0.004, 0.066, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 7.807, 0.66, 2.955, 3.041, 7.727, 0.79, 1.509, 0.643, 7.15, 0.033, 0.062, 2.465, 2.057, 5.516, 6.662, 1.83, 0.232, 3.742, 3.269, 4.498, 2.078, 1.097, 0.032, 0.327, 0.052, 0.447, 0.0001, 0.015, 0.0001, 0.0001, 0.0001, 0.126, 0.011, 0.006, 0.006, 0.007, 0.003, 0.005, 0.015, 0.003, 0.004, 0.003, 0.001, 0.004, 0.006, 0.001, 0.002, 0.001, 0.002, 0.007, 0.108, 0.002, 0.001, 0.003, 0.001, 0.007, 0.097, 0.001, 0.002, 0.005, 0.004, 0.001, 0.001, 0.105, 0.013, 0.443, 0.002, 0.076, 0.002, 0.52, 0.668, 0.246, 0.118, 0.122, 0.032, 0.129, 0.012, 0.108, 0.033, 0.028, 0.081, 0.222, 0.058, 0.152, 0.005, 0.088, 0.002, 0.006, 0.059, 0.022, 0.1, 0.117, 0.007, 0.005, 0.013, 0.0001, 0.0001, 0.059, 3.444, 0.014, 0.118, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.026, 0.013, 0.031, 0.013, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.016, 0.012, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.009, 0.005, 0.121, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lmo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.694, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.003, 0.007, 0.496, 0.0001, 0.002, 0.011, 0.001, 1.536, 0.286, 0.286, 0.0001, 0.001, 1.048, 0.242, 0.905, 0.061, 0.214, 0.291, 0.19, 0.13, 0.124, 0.121, 0.109, 0.107, 0.118, 0.137, 0.12, 0.041, 0.23, 0.036, 0.23, 0.004, 0.0001, 0.256, 0.222, 0.29, 0.092, 0.333, 0.125, 0.138, 0.035, 0.151, 0.022, 0.022, 0.325, 0.213, 0.07, 0.062, 0.237, 0.013, 0.158, 0.284, 0.115, 0.042, 0.131, 0.03, 0.012, 0.005, 0.017, 0.008, 0.0001, 0.008, 0.0001, 0.008, 0.0001, 8.462, 0.843, 2.691, 3.762, 7.44, 0.686, 1.303, 1.109, 4.912, 0.086, 0.225, 4.93, 2.005, 5.17, 2.753, 1.529, 0.12, 4.31, 3.255, 3.626, 1.912, 0.803, 0.038, 0.028, 0.061, 0.501, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.065, 0.004, 0.005, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.003, 0.001, 0.002, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, 0.002, 0.011, 0.002, 0.0001, 0.002, 0.001, 0.012, 0.042, 0.001, 0.001, 0.018, 0.002, 0.001, 0.003, 0.883, 0.012, 0.006, 0.001, 0.021, 0.001, 0.002, 0.005, 0.978, 0.311, 0.003, 0.015, 0.376, 0.025, 0.002, 0.002, 0.004, 0.005, 0.393, 0.184, 0.028, 0.003, 0.199, 0.002, 0.003, 0.227, 0.023, 0.007, 0.722, 0.004, 0.002, 0.004, 0.0001, 0.0001, 0.146, 4.287, 0.005, 0.015, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.019, 0.008, 0.013, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.061, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ln": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.397, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.893, 0.03, 0.25, 0.011, 0.001, 0.018, 0.001, 0.058, 0.196, 0.195, 0.019, 0.0001, 0.627, 0.278, 0.997, 0.017, 0.237, 0.316, 0.167, 0.077, 0.074, 0.095, 0.09, 0.07, 0.092, 0.208, 0.084, 0.022, 0.031, 0.028, 0.031, 0.008, 0.0001, 0.272, 0.381, 0.139, 0.08, 0.273, 0.07, 0.073, 0.036, 0.085, 0.047, 0.397, 0.244, 0.485, 0.279, 0.076, 0.136, 0.004, 0.069, 0.216, 0.116, 0.035, 0.048, 0.05, 0.005, 0.052, 0.034, 0.014, 0.018, 0.014, 0.0001, 0.004, 0.0001, 10.636, 2.915, 0.49, 0.988, 4.562, 0.3, 1.532, 0.289, 5.022, 0.059, 3.253, 3.932, 3.872, 5.27, 5.607, 1.218, 0.071, 1.319, 2.651, 2.571, 1.582, 0.27, 0.506, 0.061, 2.255, 1.262, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.045, 0.425, 0.034, 0.001, 0.004, 0.002, 0.016, 0.0001, 0.002, 0.009, 0.003, 0.0001, 0.047, 0.002, 0.03, 0.0001, 0.012, 0.0001, 0.122, 0.011, 0.585, 0.0001, 0.0001, 0.0001, 0.001, 0.025, 0.001, 0.584, 0.003, 0.002, 0.001, 0.0001, 0.21, 1.199, 0.019, 0.009, 0.001, 0.001, 0.002, 0.013, 0.036, 1.009, 0.021, 0.019, 0.002, 0.983, 0.006, 0.015, 0.003, 0.003, 0.005, 0.692, 0.016, 0.003, 0.001, 0.001, 0.001, 0.002, 0.332, 0.02, 0.002, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.228, 4.372, 0.034, 0.004, 0.008, 0.141, 0.0001, 1.137, 0.001, 0.001, 0.5, 0.0001, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.014, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.057, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.442, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.079, 0.001, 0.049, 0.0001, 0.0001, 0.006, 0.0001, 0.004, 0.071, 0.071, 0.001, 0.001, 0.152, 0.034, 0.234, 0.012, 0.09, 0.111, 0.08, 0.044, 0.039, 0.045, 0.029, 0.03, 0.029, 0.051, 0.034, 0.006, 0.003, 0.002, 0.003, 0.001, 0.0001, 0.013, 0.008, 0.01, 0.008, 0.006, 0.005, 0.004, 0.005, 0.01, 0.003, 0.004, 0.008, 0.008, 0.007, 0.003, 0.012, 0.0001, 0.005, 0.013, 0.013, 0.003, 0.004, 0.004, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.157, 0.027, 0.063, 0.059, 0.202, 0.033, 0.037, 0.067, 0.14, 0.003, 0.015, 0.078, 0.05, 0.13, 0.139, 0.039, 0.002, 0.117, 0.112, 0.142, 0.055, 0.018, 0.023, 0.006, 0.028, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.694, 1.8, 0.562, 0.336, 0.72, 0.0001, 0.034, 1.352, 1.675, 1.044, 0.455, 0.525, 0.031, 0.727, 0.002, 0.001, 0.005, 0.004, 0.004, 0.01, 1.254, 0.484, 0.162, 0.734, 0.009, 2.294, 0.653, 0.586, 0.209, 0.092, 0.491, 0.038, 0.022, 1.013, 0.148, 0.224, 0.003, 0.796, 0.001, 0.85, 0.016, 0.008, 0.816, 0.509, 0.001, 1.145, 0.216, 0.004, 1.227, 1.202, 2.293, 0.24, 0.573, 0.78, 0.113, 0.39, 1.673, 0.52, 24.114, 5.723, 0.116, 0.133, 0.001, 0.0001, 0.0001, 0.0001, 0.085, 0.006, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.829, 0.002, 0.538, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "lrc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.503, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.494, 0.003, 0.04, 0.0001, 0.0001, 0.008, 0.0001, 0.002, 0.084, 0.084, 0.002, 0.001, 0.009, 0.028, 0.484, 0.015, 0.026, 0.035, 0.019, 0.017, 0.01, 0.011, 0.009, 0.009, 0.015, 0.017, 0.04, 0.001, 0.009, 0.002, 0.009, 0.0001, 0.0001, 0.006, 0.003, 0.003, 0.006, 0.003, 0.002, 0.001, 0.002, 0.005, 0.001, 0.002, 0.002, 0.003, 0.002, 0.001, 0.003, 0.0001, 0.002, 0.003, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.003, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.043, 0.006, 0.016, 0.023, 0.041, 0.004, 0.008, 0.011, 0.044, 0.001, 0.008, 0.022, 0.01, 0.037, 0.028, 0.011, 0.001, 0.026, 0.016, 0.024, 0.015, 0.007, 0.006, 0.002, 0.007, 0.003, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.141, 0.397, 0.205, 0.02, 1.605, 1.614, 3.115, 2.266, 3.47, 0.018, 0.099, 0.005, 5.078, 0.005, 0.021, 0.008, 0.02, 0.003, 0.001, 0.004, 0.007, 0.374, 0.0001, 0.001, 0.02, 0.38, 0.001, 0.042, 0.001, 0.001, 0.001, 0.003, 0.001, 0.003, 0.35, 0.86, 0.5, 0.014, 1.898, 5.042, 0.917, 1.365, 1.804, 0.048, 0.445, 0.131, 0.29, 3.021, 0.146, 3.091, 0.704, 1.565, 1.062, 0.145, 0.062, 0.1, 0.06, 0.212, 0.059, 0.025, 0.002, 0.001, 0.485, 0.001, 0.0001, 0.0001, 0.044, 0.006, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.017, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.007, 20.669, 13.379, 3.076, 5.814, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.002, 0.138, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ltg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.505, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.915, 0.002, 0.48, 0.0001, 0.0001, 0.03, 0.001, 0.011, 0.307, 0.306, 0.001, 0.001, 1.036, 0.186, 1.128, 0.03, 0.246, 0.429, 0.198, 0.13, 0.123, 0.148, 0.107, 0.108, 0.116, 0.317, 0.161, 0.072, 0.029, 0.005, 0.029, 0.004, 0.0001, 0.199, 0.123, 0.06, 0.183, 0.07, 0.028, 0.064, 0.021, 0.12, 0.092, 0.204, 0.323, 0.133, 0.101, 0.065, 0.288, 0.001, 0.16, 0.239, 0.103, 0.036, 0.21, 0.007, 0.022, 0.001, 0.052, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 7.469, 0.962, 0.824, 2.269, 4.253, 0.17, 1.648, 0.088, 6.306, 1.422, 2.423, 2.524, 1.996, 2.559, 4.514, 1.853, 0.001, 3.554, 6.061, 4.103, 4.999, 1.941, 0.013, 0.006, 1.629, 1.118, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.287, 1.24, 0.018, 0.009, 0.002, 0.008, 0.371, 0.004, 0.003, 0.001, 0.001, 0.004, 0.014, 0.08, 0.001, 0.011, 0.003, 0.002, 0.002, 0.271, 0.142, 0.001, 0.001, 0.003, 0.003, 0.007, 0.001, 0.001, 0.003, 0.032, 0.034, 0.002, 0.043, 0.709, 0.001, 0.005, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.001, 0.015, 2.24, 0.001, 0.001, 0.0001, 0.001, 0.04, 0.01, 0.024, 0.01, 0.013, 0.028, 0.003, 0.011, 0.033, 0.006, 0.014, 0.026, 0.687, 0.026, 0.226, 0.009, 0.0001, 0.0001, 0.023, 0.015, 3.578, 2.215, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.003, 0.001, 0.252, 0.098, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.265, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mai": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.888, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.023, 0.001, 0.03, 0.0001, 0.0001, 0.003, 0.001, 0.013, 0.071, 0.074, 0.0001, 0.001, 0.267, 0.061, 0.074, 0.006, 0.01, 0.016, 0.009, 0.005, 0.004, 0.005, 0.004, 0.004, 0.005, 0.012, 0.021, 0.006, 0.004, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.018, 0.005, 0.005, 0.005, 0.017, 0.003, 0.004, 0.008, 0.015, 0.001, 0.002, 0.009, 0.005, 0.013, 0.013, 0.004, 0.001, 0.014, 0.017, 0.012, 0.006, 0.002, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.792, 0.705, 0.351, 0.05, 0.0001, 0.548, 0.202, 1.331, 0.277, 0.165, 0.004, 0.356, 0.051, 2.185, 0.0001, 0.286, 0.005, 0.001, 0.0001, 0.066, 0.006, 1.874, 0.183, 0.514, 0.043, 0.102, 0.293, 0.463, 0.567, 0.024, 0.087, 0.255, 0.05, 0.178, 0.022, 0.166, 25.43, 6.866, 0.581, 0.373, 1.476, 0.06, 0.857, 0.137, 0.417, 0.41, 1.258, 0.71, 1.883, 0.001, 1.344, 0.001, 0.001, 0.686, 0.286, 0.227, 1.223, 0.469, 0.0001, 0.0001, 0.026, 0.025, 2.747, 1.736, 0.0001, 0.0001, 0.009, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.668, 0.0001, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mdf": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.974, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.901, 0.002, 0.147, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.239, 0.241, 0.0001, 0.001, 0.661, 0.233, 0.828, 0.004, 0.16, 0.227, 0.113, 0.065, 0.054, 0.071, 0.072, 0.058, 0.067, 0.13, 0.047, 0.019, 0.002, 0.0001, 0.002, 0.001, 0.0001, 0.006, 0.002, 0.008, 0.002, 0.002, 0.003, 0.002, 0.002, 0.025, 0.001, 0.002, 0.002, 0.005, 0.002, 0.002, 0.006, 0.001, 0.003, 0.005, 0.003, 0.001, 0.008, 0.001, 0.014, 0.0001, 0.0001, 0.004, 0.0001, 0.005, 0.0001, 0.002, 0.0001, 0.07, 0.006, 0.018, 0.016, 0.05, 0.004, 0.011, 0.014, 0.042, 0.003, 0.009, 0.03, 0.013, 0.041, 0.036, 0.013, 0.001, 0.037, 0.035, 0.028, 0.024, 0.005, 0.003, 0.003, 0.006, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.013, 2.98, 2.587, 0.748, 0.583, 0.414, 0.428, 0.203, 0.631, 0.045, 0.095, 0.17, 2.818, 0.257, 0.113, 1.375, 0.157, 0.181, 0.113, 0.066, 0.125, 0.013, 0.006, 0.022, 0.063, 0.005, 0.16, 0.068, 0.186, 0.053, 0.097, 0.114, 0.073, 0.188, 0.099, 0.03, 0.023, 0.016, 0.014, 0.014, 0.049, 0.003, 0.001, 0.054, 0.002, 0.05, 0.007, 0.022, 4.7, 0.292, 1.108, 0.449, 1.264, 2.755, 0.106, 0.711, 2.236, 0.41, 2.142, 1.743, 1.474, 3.418, 3.1, 0.637, 0.0001, 0.0001, 0.118, 0.006, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.003, 0.002, 0.0001, 0.004, 0.002, 28.205, 15.445, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.006, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.0001, 0.122, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.132, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.344, 0.0001, 0.051, 0.0001, 0.0001, 0.003, 0.0001, 1.722, 0.134, 0.134, 0.0001, 0.062, 0.6, 1.054, 1.426, 0.011, 0.88, 0.969, 0.776, 0.547, 0.574, 0.473, 0.464, 0.436, 0.531, 0.535, 0.029, 0.033, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.281, 0.132, 0.16, 0.072, 0.212, 0.148, 0.178, 0.056, 0.346, 0.102, 0.053, 0.101, 0.354, 0.788, 0.05, 0.139, 0.008, 0.098, 0.209, 0.172, 0.049, 0.057, 0.038, 0.005, 0.021, 0.009, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 15.071, 0.568, 0.216, 2.816, 2.902, 0.81, 0.249, 1.395, 7.562, 0.225, 1.469, 1.52, 3.108, 9.36, 4.666, 0.931, 0.023, 4.686, 1.843, 3.288, 0.414, 0.748, 0.044, 0.043, 4.297, 0.559, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.076, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.008, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.052, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.017, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.15, 0.01, 0.007, 0.008, 0.001, 0.0001, 0.001, 0.006, 0.026, 0.088, 0.003, 0.004, 0.001, 0.005, 0.002, 0.002, 0.137, 0.002, 0.001, 0.004, 0.086, 0.001, 0.002, 0.001, 0.003, 0.001, 0.002, 0.01, 0.003, 0.001, 0.001, 0.008, 0.0001, 0.0001, 0.143, 0.408, 0.006, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.069, 0.004, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.376, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.504, 0.0001, 0.156, 0.0001, 0.0001, 0.0001, 0.039, 0.039, 0.039, 0.039, 0.0001, 0.0001, 1.325, 0.078, 1.247, 0.039, 0.156, 0.039, 0.078, 0.0001, 0.0001, 0.039, 0.0001, 0.0001, 0.039, 0.0001, 0.039, 0.078, 0.078, 0.039, 0.078, 0.0001, 0.0001, 0.701, 0.273, 0.156, 0.078, 0.312, 0.039, 0.156, 0.078, 0.351, 0.779, 0.779, 0.234, 0.779, 0.0001, 0.039, 0.156, 0.0001, 0.312, 0.195, 0.156, 0.195, 0.039, 0.078, 0.0001, 0.195, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.103, 1.558, 0.312, 0.818, 6.584, 0.078, 0.351, 1.013, 7.402, 4.675, 3.584, 3.039, 2.766, 5.804, 6.389, 0.779, 0.078, 4.753, 1.48, 2.337, 1.441, 0.117, 1.597, 0.0001, 1.558, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.351, 0.0001, 0.0001, 0.156, 0.0001, 0.039, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.039, 0.545, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.467, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.078, 0.0001, 0.117, 0.0001, 0.0001, 0.0001, 1.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.208, 0.429, 0.584, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.662, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mhr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.247, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.433, 0.01, 0.105, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.242, 0.243, 0.0001, 0.004, 0.563, 0.341, 0.763, 0.006, 0.23, 0.307, 0.193, 0.103, 0.088, 0.092, 0.076, 0.077, 0.081, 0.164, 0.099, 0.012, 0.003, 0.005, 0.003, 0.006, 0.0001, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.001, 0.001, 0.045, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.016, 0.001, 0.019, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.02, 0.004, 0.007, 0.008, 0.02, 0.002, 0.003, 0.004, 0.014, 0.0001, 0.002, 0.01, 0.005, 0.01, 0.012, 0.004, 0.0001, 0.013, 0.009, 0.01, 0.005, 0.002, 0.002, 0.0001, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.161, 0.998, 2.463, 1.262, 0.079, 0.06, 0.073, 0.732, 2.145, 0.012, 0.024, 3.429, 0.167, 0.157, 0.039, 0.3, 0.114, 0.051, 0.084, 0.076, 0.173, 0.021, 0.005, 0.012, 0.07, 0.035, 0.245, 0.039, 0.204, 0.055, 0.073, 0.108, 0.142, 0.124, 0.167, 0.046, 0.023, 0.257, 0.01, 0.146, 0.069, 0.001, 0.001, 0.099, 0.002, 0.093, 0.02, 0.031, 3.766, 0.43, 0.916, 0.689, 1.067, 3.621, 0.573, 0.276, 1.798, 1.177, 2.133, 2.766, 1.884, 2.711, 2.445, 0.765, 0.0001, 0.0001, 0.222, 0.109, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.008, 0.004, 28.363, 13.911, 0.249, 0.424, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.203, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.242, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.048, 0.002, 0.114, 0.0001, 0.0001, 0.007, 0.0001, 0.316, 0.24, 0.24, 0.0001, 0.0001, 0.815, 0.729, 1.027, 0.003, 0.15, 0.245, 0.11, 0.069, 0.067, 0.071, 0.069, 0.066, 0.083, 0.097, 0.029, 0.194, 0.002, 0.0001, 0.002, 0.002, 0.0001, 0.243, 0.042, 0.09, 0.013, 0.207, 0.019, 0.023, 0.227, 0.154, 0.011, 0.858, 0.022, 0.414, 0.264, 0.035, 0.344, 0.001, 0.143, 0.039, 1.088, 0.016, 0.015, 0.518, 0.001, 0.002, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 10.57, 0.047, 0.232, 0.102, 7.727, 0.029, 1.763, 3.618, 6.701, 0.008, 3.514, 0.582, 0.854, 4.652, 6.133, 0.788, 0.003, 3.052, 0.255, 6.464, 3.231, 0.037, 1.326, 0.008, 0.217, 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.025, 2.749, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.072, 0.357, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.284, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.004, 0.001, 0.003, 0.004, 0.003, 0.003, 0.013, 0.525, 0.001, 0.002, 0.001, 0.002, 0.003, 0.004, 0.018, 0.005, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.019, 0.015, 3.257, 0.759, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.008, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.002, 0.004, 0.001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "min": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.172, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.612, 0.0001, 0.04, 0.005, 0.0001, 0.002, 0.004, 0.018, 0.155, 0.155, 0.0001, 0.0001, 1.063, 0.022, 1.041, 0.001, 0.404, 0.298, 0.265, 0.112, 0.103, 0.128, 0.132, 0.113, 0.114, 0.233, 0.009, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.635, 0.069, 0.223, 0.216, 0.107, 0.023, 0.035, 0.059, 0.25, 0.026, 0.062, 0.356, 0.142, 0.089, 0.046, 0.143, 0.014, 0.06, 0.402, 0.123, 0.018, 0.017, 0.016, 0.015, 0.037, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.754, 1.953, 0.961, 4.093, 4.246, 0.532, 1.865, 1.575, 6.705, 0.46, 3.68, 3.421, 3.054, 5.905, 5.613, 2.448, 0.009, 4.152, 3.536, 3.358, 3.758, 0.175, 0.156, 0.045, 0.909, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, 0.016, 0.004, 0.004, 0.011, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.0001, 0.0001, 0.014, 0.007, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.029, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.442, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.507, 0.001, 0.094, 0.0001, 0.0001, 0.006, 0.001, 0.012, 0.086, 0.086, 0.001, 0.004, 0.588, 0.074, 0.535, 0.01, 0.197, 0.23, 0.143, 0.089, 0.082, 0.088, 0.076, 0.074, 0.08, 0.116, 0.032, 0.012, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.015, 0.008, 0.047, 0.006, 0.006, 0.005, 0.034, 0.005, 0.026, 0.002, 0.003, 0.006, 0.012, 0.023, 0.006, 0.014, 0.001, 0.007, 0.019, 0.01, 0.006, 0.006, 0.004, 0.004, 0.001, 0.001, 0.008, 0.0001, 0.008, 0.0001, 0.002, 0.0001, 0.08, 0.013, 0.03, 0.022, 0.08, 0.011, 0.022, 0.023, 0.061, 0.003, 0.011, 0.035, 0.039, 0.054, 0.06, 0.012, 0.001, 0.056, 0.049, 0.047, 0.027, 0.008, 0.006, 0.003, 0.012, 0.004, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.279, 1.922, 3.072, 0.896, 0.157, 0.085, 0.296, 0.344, 0.32, 0.001, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.012, 0.067, 0.066, 0.1, 0.11, 0.062, 0.046, 0.008, 0.029, 0.825, 0.009, 0.229, 0.032, 0.208, 0.077, 0.103, 0.118, 0.054, 0.125, 0.063, 0.016, 0.028, 0.03, 0.013, 0.01, 0.018, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 5.692, 0.585, 1.752, 0.746, 1.619, 3.647, 0.195, 0.665, 3.964, 0.001, 1.64, 1.494, 0.888, 3.068, 4.767, 1.117, 0.0001, 0.0001, 0.015, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 33.101, 10.345, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.096, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ml": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.283, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.554, 0.001, 0.034, 0.0001, 0.0001, 0.002, 0.0001, 0.013, 0.046, 0.046, 0.0001, 0.001, 0.155, 0.051, 0.434, 0.004, 0.069, 0.096, 0.051, 0.026, 0.025, 0.029, 0.025, 0.024, 0.03, 0.054, 0.011, 0.004, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.005, 0.003, 0.005, 0.002, 0.002, 0.002, 0.002, 0.002, 0.004, 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.004, 0.0001, 0.002, 0.005, 0.004, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.044, 0.007, 0.016, 0.014, 0.045, 0.007, 0.009, 0.015, 0.036, 0.001, 0.004, 0.022, 0.013, 0.031, 0.031, 0.01, 0.001, 0.031, 0.025, 0.029, 0.015, 0.004, 0.005, 0.002, 0.008, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.284, 1.637, 0.889, 0.045, 0.0001, 0.237, 0.843, 0.478, 0.108, 0.077, 0.086, 0.336, 0.062, 4.599, 0.152, 0.029, 0.008, 0.0001, 0.075, 0.022, 0.003, 1.759, 0.042, 0.219, 0.023, 0.382, 0.512, 0.004, 0.161, 0.001, 0.086, 0.887, 0.025, 0.094, 0.002, 0.484, 1.618, 0.083, 0.303, 0.146, 1.873, 0.0001, 0.931, 0.058, 0.143, 0.126, 0.78, 1.209, 1.122, 0.589, 0.667, 0.458, 22.229, 10.029, 0.199, 0.193, 0.652, 0.135, 0.025, 0.171, 0.328, 0.323, 1.631, 2.28, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.391, 0.001, 0.071, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.502, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.684, 0.002, 0.094, 0.001, 0.001, 0.006, 0.001, 0.003, 0.078, 0.078, 0.001, 0.002, 0.423, 0.192, 0.522, 0.019, 0.207, 0.249, 0.16, 0.075, 0.065, 0.07, 0.06, 0.055, 0.066, 0.128, 0.025, 0.008, 0.003, 0.005, 0.004, 0.002, 0.0001, 0.018, 0.012, 0.019, 0.013, 0.012, 0.008, 0.007, 0.009, 0.026, 0.003, 0.004, 0.011, 0.017, 0.01, 0.009, 0.02, 0.002, 0.012, 0.024, 0.016, 0.006, 0.007, 0.006, 0.007, 0.003, 0.001, 0.006, 0.001, 0.006, 0.0001, 0.005, 0.0001, 0.097, 0.016, 0.039, 0.037, 0.119, 0.017, 0.023, 0.03, 0.088, 0.002, 0.012, 0.052, 0.031, 0.08, 0.086, 0.026, 0.002, 0.079, 0.064, 0.078, 0.038, 0.025, 0.012, 0.008, 0.018, 0.003, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 2.438, 1.425, 1.576, 1.589, 0.047, 1.639, 0.295, 0.416, 0.311, 0.001, 0.008, 0.672, 0.369, 2.886, 0.106, 0.163, 0.114, 0.151, 0.023, 0.067, 0.081, 0.017, 0.027, 0.033, 0.044, 0.004, 0.046, 0.028, 0.128, 0.083, 0.044, 0.031, 0.048, 0.074, 0.102, 0.063, 0.021, 0.125, 0.02, 0.022, 0.053, 1.026, 0.001, 0.019, 0.001, 0.067, 0.028, 1.192, 4.733, 1.04, 0.537, 2.615, 2.04, 0.399, 0.621, 0.396, 2.01, 1.723, 0.207, 2.589, 0.943, 3.889, 2.383, 0.107, 0.0001, 0.0001, 0.065, 0.012, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 27.532, 13.908, 1.199, 1.049, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.072, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.77, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.47, 0.002, 0.214, 0.0001, 0.0001, 0.017, 0.001, 0.035, 0.128, 0.128, 0.002, 0.001, 0.656, 0.155, 0.49, 0.006, 0.172, 0.19, 0.096, 0.052, 0.062, 0.054, 0.034, 0.043, 0.06, 0.129, 0.06, 0.015, 0.017, 0.012, 0.017, 0.0001, 0.0001, 0.018, 0.009, 0.023, 0.009, 0.011, 0.002, 0.006, 0.004, 0.035, 0.002, 0.005, 0.007, 0.014, 0.008, 0.008, 0.009, 0.001, 0.009, 0.019, 0.008, 0.005, 0.004, 0.007, 0.007, 0.001, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.381, 0.035, 0.167, 0.122, 0.44, 0.045, 0.036, 0.034, 0.432, 0.005, 0.016, 0.206, 0.12, 0.248, 0.177, 0.096, 0.003, 0.253, 0.183, 0.236, 0.214, 0.038, 0.01, 0.011, 0.011, 0.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.01, 1.642, 2.712, 2.46, 0.4, 0.066, 0.487, 0.515, 0.507, 0.001, 0.001, 0.622, 0.372, 0.933, 0.029, 0.581, 0.134, 0.087, 0.042, 0.032, 0.081, 0.073, 0.022, 0.008, 0.061, 0.004, 0.139, 0.063, 0.145, 0.05, 0.043, 0.149, 0.144, 0.143, 0.069, 0.113, 0.038, 0.031, 0.007, 0.03, 0.013, 0.002, 0.001, 0.064, 0.002, 0.001, 0.029, 0.007, 3.78, 0.37, 0.558, 0.274, 1.316, 4.346, 0.072, 0.319, 3.558, 0.657, 1.356, 2.204, 1.073, 2.802, 2.13, 1.099, 0.0001, 0.0001, 0.025, 0.051, 0.091, 0.068, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.005, 0.0001, 0.008, 0.004, 27.537, 14.047, 0.001, 0.161, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.005, 0.022, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mr": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.525, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.348, 0.002, 0.043, 0.0001, 0.0001, 0.004, 0.0001, 0.024, 0.061, 0.064, 0.0001, 0.001, 0.221, 0.063, 0.539, 0.009, 0.009, 0.009, 0.006, 0.003, 0.003, 0.003, 0.003, 0.003, 0.003, 0.005, 0.03, 0.01, 0.003, 0.004, 0.003, 0.003, 0.0001, 0.008, 0.004, 0.006, 0.004, 0.003, 0.003, 0.003, 0.003, 0.007, 0.002, 0.002, 0.003, 0.006, 0.003, 0.002, 0.005, 0.0001, 0.004, 0.008, 0.009, 0.001, 0.002, 0.002, 0.0001, 0.001, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.001, 0.0001, 0.138, 0.021, 0.046, 0.053, 0.162, 0.029, 0.028, 0.063, 0.114, 0.003, 0.011, 0.062, 0.038, 0.106, 0.103, 0.03, 0.002, 0.096, 0.09, 0.116, 0.04, 0.015, 0.019, 0.003, 0.023, 0.002, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 1.224, 0.397, 1.061, 0.056, 0.001, 0.297, 0.351, 1.664, 0.084, 0.127, 0.02, 0.461, 0.026, 2.286, 0.0001, 0.096, 0.005, 0.018, 0.001, 0.019, 0.005, 1.098, 0.145, 0.403, 0.083, 0.015, 0.659, 0.012, 0.404, 0.067, 0.014, 0.287, 0.125, 0.236, 0.039, 0.415, 24.995, 7.065, 0.585, 0.404, 1.081, 0.036, 0.727, 0.118, 0.317, 0.211, 0.844, 1.342, 1.809, 0.018, 1.056, 0.198, 0.001, 0.975, 0.327, 0.194, 1.035, 0.79, 0.001, 0.001, 0.003, 0.001, 3.71, 0.926, 0.0001, 0.0001, 0.015, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.418, 0.001, 0.048, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mrj": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.556, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.792, 0.004, 0.111, 0.0001, 0.0001, 0.008, 0.001, 0.036, 0.371, 0.372, 0.0001, 0.001, 0.508, 0.256, 0.9, 0.015, 0.334, 0.401, 0.27, 0.169, 0.152, 0.17, 0.137, 0.141, 0.168, 0.185, 0.1, 0.046, 0.009, 0.005, 0.008, 0.012, 0.0001, 0.017, 0.012, 0.012, 0.011, 0.006, 0.006, 0.008, 0.006, 0.083, 0.004, 0.011, 0.006, 0.014, 0.007, 0.024, 0.016, 0.001, 0.008, 0.014, 0.009, 0.003, 0.03, 0.002, 0.042, 0.002, 0.001, 0.008, 0.0001, 0.009, 0.0001, 0.003, 0.0001, 0.281, 0.025, 0.082, 0.065, 0.202, 0.013, 0.027, 0.052, 0.157, 0.003, 0.032, 0.08, 0.041, 0.09, 0.092, 0.03, 0.005, 0.117, 0.072, 0.076, 0.073, 0.015, 0.012, 0.004, 0.024, 0.01, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.356, 0.846, 2.179, 0.887, 0.116, 0.285, 0.312, 0.236, 2.316, 0.007, 0.004, 2.565, 0.266, 0.252, 0.05, 0.215, 0.187, 0.062, 0.078, 1.679, 0.285, 0.024, 0.005, 0.016, 0.067, 0.046, 0.237, 0.053, 0.116, 0.054, 0.059, 0.117, 0.058, 0.115, 0.145, 0.033, 0.102, 0.049, 0.064, 0.062, 0.066, 0.006, 0.001, 0.056, 0.003, 0.041, 0.007, 0.023, 2.651, 0.259, 1.194, 0.797, 1.113, 1.956, 0.572, 0.253, 2.277, 2.969, 1.78, 2.755, 1.532, 2.591, 1.704, 0.818, 0.0001, 0.0001, 0.138, 0.095, 0.012, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.011, 0.0001, 0.008, 0.006, 24.363, 12.5, 0.002, 4.142, 0.0001, 0.0001, 0.0001, 0.001, 0.015, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.004, 0.341, 0.005, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ms": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.423, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.116, 0.004, 0.276, 0.001, 0.003, 0.028, 0.005, 0.04, 0.153, 0.154, 0.011, 0.002, 0.825, 0.313, 0.841, 0.02, 0.335, 0.324, 0.225, 0.11, 0.099, 0.112, 0.094, 0.087, 0.096, 0.171, 0.041, 0.019, 0.01, 0.005, 0.01, 0.002, 0.001, 0.327, 0.313, 0.169, 0.197, 0.08, 0.09, 0.097, 0.122, 0.22, 0.145, 0.326, 0.158, 0.369, 0.143, 0.065, 0.427, 0.013, 0.147, 0.487, 0.268, 0.071, 0.05, 0.063, 0.007, 0.038, 0.022, 0.015, 0.0001, 0.015, 0.0001, 0.002, 0.0001, 15.253, 2.008, 0.502, 3.234, 6.807, 0.209, 2.704, 2.141, 5.701, 0.605, 3.195, 3.049, 3.025, 7.562, 1.688, 2.054, 0.019, 4.172, 2.861, 3.513, 3.855, 0.159, 0.407, 0.024, 1.19, 0.123, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.025, 0.005, 0.003, 0.004, 0.003, 0.002, 0.002, 0.004, 0.003, 0.002, 0.002, 0.001, 0.002, 0.007, 0.004, 0.002, 0.001, 0.002, 0.001, 0.009, 0.003, 0.001, 0.001, 0.001, 0.002, 0.01, 0.001, 0.003, 0.004, 0.004, 0.001, 0.007, 0.031, 0.013, 0.003, 0.003, 0.003, 0.002, 0.001, 0.006, 0.007, 0.017, 0.002, 0.003, 0.001, 0.007, 0.002, 0.002, 0.004, 0.011, 0.003, 0.006, 0.005, 0.001, 0.006, 0.001, 0.004, 0.002, 0.003, 0.002, 0.008, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.034, 0.074, 0.022, 0.02, 0.0001, 0.0001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.012, 0.015, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.024, 0.004, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mt": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.717, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.569, 0.003, 0.319, 0.001, 0.001, 0.009, 0.001, 0.699, 0.116, 0.117, 0.001, 0.002, 0.868, 2.789, 0.736, 0.014, 0.299, 0.341, 0.218, 0.093, 0.081, 0.087, 0.085, 0.082, 0.1, 0.201, 0.053, 0.022, 0.013, 0.012, 0.013, 0.002, 0.0001, 0.223, 0.171, 0.118, 0.162, 0.107, 0.236, 0.127, 0.076, 0.3, 0.048, 0.158, 0.199, 0.315, 0.08, 0.056, 0.187, 0.018, 0.103, 0.221, 0.127, 0.065, 0.054, 0.053, 0.02, 0.007, 0.009, 0.022, 0.0001, 0.023, 0.0001, 0.008, 0.002, 9.087, 1.533, 0.244, 1.812, 5.201, 1.498, 1.212, 0.809, 8.439, 2.13, 1.92, 5.784, 2.557, 4.221, 2.69, 1.16, 0.488, 3.837, 2.631, 5.521, 3.106, 0.451, 1.062, 0.484, 0.085, 0.753, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.211, 0.004, 0.004, 0.002, 0.003, 0.001, 0.001, 0.004, 0.002, 0.001, 0.016, 0.407, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.042, 0.003, 0.001, 0.001, 0.001, 0.005, 0.141, 0.001, 0.001, 0.01, 0.01, 0.001, 0.002, 0.13, 0.527, 0.002, 0.004, 0.002, 0.001, 0.025, 1.521, 0.007, 0.014, 0.001, 0.004, 0.005, 0.008, 0.001, 0.001, 0.004, 0.005, 0.009, 0.004, 0.002, 0.002, 0.003, 0.001, 0.003, 0.01, 0.003, 0.015, 0.566, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.015, 0.129, 2.554, 0.578, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.011, 0.005, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.004, 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.212, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mus": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.612, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 19.388, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 1.02, 0.0001, 1.02, 1.02, 0.0001, 2.041, 1.02, 0.0001, 1.02, 1.02, 4.082, 1.02, 1.02, 2.041, 0.0001, 1.02, 1.02, 1.02, 1.02, 1.02, 1.02, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.061, 0.0001, 0.0001, 0.0001, 5.102, 0.0001, 1.02, 0.0001, 1.02, 0.0001, 5.102, 0.0001, 1.02, 1.02, 2.041, 0.0001, 0.0001, 0.0001, 2.041, 0.0001, 0.0001, 2.041, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "my": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.476, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.676, 0.0001, 0.018, 0.0001, 0.0001, 0.001, 0.0001, 0.009, 0.072, 0.072, 0.0001, 0.001, 0.013, 0.027, 0.014, 0.004, 0.007, 0.006, 0.005, 0.003, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.001, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.009, 0.007, 0.011, 0.006, 0.004, 0.004, 0.005, 0.004, 0.006, 0.002, 0.003, 0.004, 0.008, 0.005, 0.004, 0.007, 0.0001, 0.005, 0.011, 0.008, 0.003, 0.002, 0.003, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.087, 0.015, 0.033, 0.032, 0.11, 0.015, 0.02, 0.035, 0.072, 0.001, 0.01, 0.046, 0.027, 0.071, 0.073, 0.021, 0.001, 0.069, 0.054, 0.072, 0.03, 0.01, 0.011, 0.003, 0.016, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 32.171, 1.737, 0.141, 0.03, 1.382, 0.783, 0.273, 0.069, 0.03, 0.083, 0.874, 0.307, 0.061, 0.061, 0.009, 0.119, 1.037, 0.261, 0.115, 0.031, 0.966, 0.888, 0.304, 0.058, 0.131, 1.12, 0.266, 0.843, 0.619, 0.172, 1.057, 0.095, 0.006, 0.703, 0.001, 0.001, 0.009, 0.019, 0.041, 0.006, 0.0001, 0.005, 0.0001, 0.239, 1.811, 1.255, 0.357, 1.497, 0.246, 1.317, 0.249, 0.0001, 0.0001, 0.0001, 0.294, 0.751, 1.889, 0.152, 3.975, 0.6, 0.881, 0.616, 0.651, 0.004, 0.0001, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.801, 0.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "myv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.363, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.917, 0.015, 0.248, 0.0001, 0.0001, 0.022, 0.0001, 0.001, 0.283, 0.286, 0.002, 0.004, 0.691, 0.215, 0.812, 0.009, 0.174, 0.262, 0.16, 0.093, 0.073, 0.077, 0.073, 0.069, 0.078, 0.133, 0.142, 0.014, 0.011, 0.005, 0.01, 0.008, 0.0001, 0.003, 0.002, 0.005, 0.001, 0.001, 0.002, 0.001, 0.001, 0.012, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.004, 0.0001, 0.002, 0.003, 0.002, 0.001, 0.004, 0.001, 0.007, 0.0001, 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.003, 0.048, 0.012, 0.02, 0.007, 0.038, 0.002, 0.005, 0.006, 0.024, 0.002, 0.008, 0.023, 0.008, 0.017, 0.019, 0.008, 0.0001, 0.032, 0.018, 0.013, 0.014, 0.004, 0.001, 0.001, 0.004, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 2.092, 2.863, 2.802, 0.895, 0.06, 0.084, 0.303, 0.361, 0.574, 0.012, 0.006, 0.456, 2.653, 0.734, 0.106, 1.014, 0.129, 0.284, 0.186, 0.058, 0.27, 0.019, 0.007, 0.024, 0.083, 0.006, 0.182, 0.079, 0.175, 0.059, 0.072, 0.148, 0.231, 0.176, 0.101, 0.047, 0.012, 0.013, 0.018, 0.046, 0.024, 0.001, 0.0001, 0.091, 0.002, 0.065, 0.014, 0.024, 3.393, 0.354, 1.588, 0.391, 1.0, 3.63, 0.2, 0.667, 2.033, 0.447, 2.062, 1.616, 1.324, 3.27, 3.572, 0.635, 0.0001, 0.0001, 0.332, 0.006, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.0001, 0.001, 0.001, 27.959, 14.855, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.281, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.032, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "mzn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.201, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.629, 0.002, 0.049, 0.0001, 0.0001, 0.001, 0.004, 0.002, 0.134, 0.134, 0.0001, 0.0001, 0.026, 0.054, 0.593, 0.02, 0.019, 0.017, 0.017, 0.008, 0.004, 0.006, 0.012, 0.005, 0.01, 0.015, 0.042, 0.0001, 0.001, 0.014, 0.001, 0.004, 0.0001, 0.004, 0.003, 0.005, 0.003, 0.006, 0.016, 0.002, 0.002, 0.003, 0.001, 0.001, 0.009, 0.006, 0.002, 0.001, 0.004, 0.0001, 0.003, 0.005, 0.007, 0.001, 0.001, 0.01, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.009, 0.0001, 0.072, 0.016, 0.031, 0.045, 0.106, 0.011, 0.011, 0.023, 0.094, 0.004, 0.019, 0.044, 0.012, 0.044, 0.054, 0.042, 0.001, 0.056, 0.056, 0.055, 0.021, 0.007, 0.011, 0.005, 0.015, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.44, 0.427, 0.449, 0.013, 1.516, 2.042, 3.291, 3.912, 3.162, 0.001, 0.032, 0.014, 4.412, 0.002, 0.195, 0.007, 0.446, 0.17, 0.001, 0.002, 0.012, 0.004, 0.0001, 0.001, 0.045, 0.005, 0.0001, 0.006, 0.001, 0.0001, 0.0001, 0.003, 0.003, 0.013, 0.18, 0.011, 0.008, 0.001, 0.211, 5.124, 1.425, 1.013, 2.263, 0.078, 0.559, 0.214, 0.344, 2.205, 0.318, 3.605, 0.725, 1.866, 1.033, 0.295, 0.164, 0.271, 0.156, 0.676, 0.058, 0.031, 0.001, 0.001, 0.258, 0.0001, 0.0001, 0.0001, 0.056, 0.008, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.009, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.001, 0.002, 19.953, 15.923, 1.548, 5.327, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.427, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "na": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.998, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.709, 0.015, 0.646, 0.0001, 0.002, 0.0001, 0.004, 0.021, 0.659, 0.659, 0.017, 0.002, 0.883, 0.333, 1.719, 0.03, 1.451, 2.231, 1.063, 0.565, 0.61, 0.611, 0.586, 0.586, 0.597, 1.829, 0.199, 0.094, 0.009, 0.006, 0.009, 0.002, 0.0001, 0.49, 0.423, 0.263, 0.348, 0.486, 0.143, 0.225, 0.131, 0.617, 0.095, 0.263, 0.178, 0.552, 0.272, 0.136, 0.483, 0.013, 0.313, 0.36, 0.336, 0.074, 0.114, 0.249, 0.018, 0.046, 0.052, 0.006, 0.0001, 0.007, 0.0001, 0.006, 0.0001, 7.914, 1.267, 0.542, 1.393, 6.136, 0.161, 1.565, 0.525, 5.317, 0.298, 1.632, 1.173, 1.479, 6.133, 5.204, 0.602, 0.04, 3.812, 1.491, 2.75, 1.848, 0.267, 2.105, 0.037, 0.79, 0.308, 0.0001, 0.0001, 0.0001, 0.013, 0.0001, 0.299, 0.053, 0.064, 0.017, 0.038, 0.029, 0.014, 0.008, 0.026, 0.003, 0.007, 0.007, 0.016, 0.016, 0.006, 0.008, 0.013, 0.032, 0.004, 0.043, 0.108, 0.002, 0.004, 0.01, 0.017, 0.017, 0.017, 0.015, 0.011, 0.008, 0.009, 0.017, 0.085, 0.124, 0.117, 0.04, 0.025, 0.023, 0.025, 0.032, 0.017, 0.097, 0.007, 0.031, 0.013, 0.031, 0.009, 0.016, 0.079, 0.095, 0.056, 0.083, 0.021, 0.063, 0.052, 0.013, 0.046, 0.015, 0.047, 0.045, 0.034, 0.035, 0.045, 0.013, 0.0001, 0.0001, 0.04, 0.466, 0.079, 0.167, 0.001, 0.002, 0.0001, 0.023, 0.01, 0.013, 0.002, 0.001, 0.027, 0.006, 0.292, 0.12, 0.0001, 0.0001, 0.009, 0.199, 0.04, 0.007, 0.055, 0.037, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.021, 0.074, 0.244, 0.0001, 0.005, 0.01, 0.006, 0.001, 0.002, 0.006, 0.003, 0.003, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nah": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.08, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.795, 0.004, 0.316, 0.0001, 0.0001, 0.001, 0.0001, 0.011, 0.502, 0.505, 0.006, 0.329, 1.148, 0.317, 0.599, 1.663, 0.178, 0.339, 0.18, 0.099, 0.094, 0.088, 0.135, 0.085, 0.092, 0.204, 0.686, 0.012, 0.001, 0.002, 0.002, 0.012, 0.0001, 0.583, 0.136, 0.486, 0.282, 0.369, 0.108, 0.135, 0.149, 0.382, 0.043, 0.01, 0.153, 0.41, 0.267, 0.154, 0.356, 0.041, 0.209, 0.348, 0.531, 0.077, 0.099, 0.006, 0.046, 0.078, 0.021, 0.306, 0.0001, 0.304, 0.0001, 0.018, 0.0001, 8.12, 0.52, 3.826, 1.716, 6.024, 0.239, 0.598, 2.703, 7.016, 0.169, 0.062, 5.071, 1.759, 4.856, 5.013, 1.61, 0.66, 3.183, 2.38, 4.798, 3.279, 0.368, 0.013, 0.578, 0.571, 0.892, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.023, 0.52, 0.003, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.007, 0.001, 0.001, 0.005, 0.446, 0.001, 0.001, 0.001, 0.002, 0.001, 0.26, 0.002, 0.003, 0.001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.002, 0.001, 0.001, 0.001, 0.003, 0.117, 0.005, 0.001, 0.004, 0.001, 0.001, 0.002, 0.003, 0.168, 0.013, 0.475, 0.001, 0.136, 0.018, 0.008, 0.004, 0.071, 0.003, 0.269, 0.002, 0.003, 0.001, 0.001, 0.003, 0.002, 0.068, 0.005, 0.005, 0.002, 0.003, 0.016, 0.0001, 0.0001, 0.033, 0.838, 1.259, 0.446, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.009, 0.004, 0.012, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.027, 0.002, 0.008, 0.004, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nap": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.664, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.609, 0.012, 0.443, 0.0001, 0.0001, 0.005, 0.002, 3.603, 0.188, 0.187, 0.001, 0.001, 0.851, 0.111, 0.916, 0.025, 0.289, 0.464, 0.288, 0.212, 0.187, 0.195, 0.184, 0.177, 0.191, 0.229, 0.063, 0.027, 0.064, 0.004, 0.064, 0.004, 0.0001, 0.359, 0.17, 0.431, 0.088, 0.101, 0.128, 0.139, 0.019, 0.153, 0.024, 0.014, 0.18, 0.269, 0.172, 0.129, 0.252, 0.015, 0.136, 0.331, 0.141, 0.042, 0.154, 0.012, 0.021, 0.004, 0.014, 0.007, 0.0001, 0.007, 0.0001, 0.001, 0.0001, 8.472, 0.677, 3.575, 1.818, 8.836, 0.628, 1.161, 0.605, 5.326, 0.294, 0.072, 2.854, 1.959, 5.855, 5.118, 1.978, 0.107, 4.154, 2.774, 4.302, 3.256, 1.068, 0.047, 0.011, 0.049, 0.778, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.167, 0.005, 0.004, 0.005, 0.003, 0.002, 0.001, 0.001, 0.017, 0.002, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.003, 0.001, 0.001, 0.008, 0.005, 0.001, 0.001, 0.001, 0.033, 0.118, 0.001, 0.001, 0.005, 0.005, 0.001, 0.002, 0.266, 0.085, 0.051, 0.002, 0.003, 0.001, 0.003, 0.003, 0.62, 0.161, 0.023, 0.139, 0.069, 0.03, 0.001, 0.002, 0.025, 0.004, 0.164, 0.026, 0.08, 0.002, 0.003, 0.002, 0.002, 0.107, 0.016, 0.007, 0.005, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.057, 1.779, 0.007, 0.055, 0.0001, 0.001, 0.0001, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.013, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.165, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nds": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.919, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.282, 0.001, 0.235, 0.0001, 0.0001, 0.09, 0.002, 0.046, 0.155, 0.155, 0.017, 0.001, 0.777, 0.214, 1.137, 0.014, 0.414, 0.571, 0.279, 0.157, 0.152, 0.165, 0.151, 0.162, 0.212, 0.299, 0.042, 0.019, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.383, 0.397, 0.141, 0.527, 0.184, 0.228, 0.238, 0.278, 0.228, 0.153, 0.317, 0.238, 0.331, 0.224, 0.164, 0.212, 0.007, 0.201, 0.654, 0.206, 0.119, 0.194, 0.231, 0.003, 0.008, 0.039, 0.011, 0.0001, 0.011, 0.0001, 0.001, 0.0001, 4.393, 1.051, 1.267, 3.394, 10.917, 0.767, 1.396, 2.581, 3.914, 0.085, 1.325, 2.618, 1.593, 8.321, 3.314, 0.889, 0.009, 5.125, 3.768, 5.421, 2.363, 1.177, 0.929, 0.056, 0.171, 0.239, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.454, 0.002, 0.002, 0.001, 0.006, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.023, 0.001, 0.0001, 0.022, 0.001, 0.009, 0.334, 0.001, 0.001, 0.057, 0.001, 0.038, 0.018, 0.048, 0.004, 0.001, 0.001, 0.208, 0.002, 0.001, 0.001, 0.002, 0.009, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.005, 0.002, 0.014, 0.003, 0.002, 0.002, 0.82, 0.001, 0.004, 0.001, 0.001, 0.001, 0.763, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.055, 1.884, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.007, 0.003, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.454, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ne": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.49, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.629, 0.002, 0.033, 0.0001, 0.0001, 0.006, 0.0001, 0.018, 0.053, 0.057, 0.0001, 0.001, 0.2, 0.042, 0.073, 0.008, 0.003, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.015, 0.002, 0.005, 0.002, 0.006, 0.002, 0.0001, 0.004, 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.002, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.056, 0.012, 0.021, 0.02, 0.066, 0.011, 0.012, 0.023, 0.048, 0.001, 0.005, 0.027, 0.017, 0.042, 0.043, 0.015, 0.001, 0.044, 0.036, 0.045, 0.017, 0.005, 0.008, 0.001, 0.01, 0.001, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.608, 0.76, 0.405, 0.065, 0.0001, 0.231, 0.124, 1.05, 0.333, 0.225, 0.003, 1.089, 0.054, 2.553, 0.0001, 0.268, 0.005, 0.0001, 0.0001, 0.016, 0.009, 1.681, 0.188, 0.574, 0.05, 0.059, 0.235, 0.302, 0.411, 0.024, 0.038, 0.296, 0.063, 0.16, 0.029, 0.16, 24.986, 7.481, 0.637, 0.298, 1.766, 0.034, 0.895, 0.142, 0.406, 0.37, 1.169, 0.857, 2.172, 0.0001, 1.023, 0.0001, 0.0001, 0.652, 0.263, 0.209, 1.099, 0.646, 0.0001, 0.0001, 0.001, 0.001, 3.096, 1.51, 0.0001, 0.0001, 0.006, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.857, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "new": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.658, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.736, 0.0001, 0.005, 0.0001, 0.0001, 0.016, 0.0001, 0.016, 0.053, 0.053, 0.0001, 0.0001, 0.168, 0.064, 0.05, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.014, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.045, 0.006, 0.015, 0.015, 0.048, 0.008, 0.009, 0.021, 0.034, 0.001, 0.003, 0.019, 0.011, 0.032, 0.03, 0.01, 0.0001, 0.03, 0.026, 0.034, 0.014, 0.004, 0.005, 0.001, 0.007, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.748, 1.473, 1.078, 0.313, 0.0001, 0.165, 0.087, 0.934, 0.049, 0.145, 0.004, 0.213, 0.295, 3.035, 0.001, 0.021, 0.01, 0.0001, 0.001, 0.003, 0.002, 0.891, 0.378, 1.026, 0.007, 0.007, 0.145, 0.227, 0.557, 0.002, 0.008, 0.138, 0.03, 0.275, 0.076, 0.203, 24.519, 8.651, 0.655, 0.317, 1.238, 0.066, 0.765, 0.114, 0.288, 0.474, 0.695, 2.038, 1.25, 0.006, 0.967, 0.005, 0.016, 1.209, 0.15, 0.223, 0.893, 0.295, 0.0001, 0.001, 0.016, 0.0001, 3.268, 1.125, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.648, 0.0001, 0.246, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ng": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.332, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.852, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.028, 0.0001, 0.0001, 0.569, 0.014, 0.833, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.042, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.291, 0.028, 0.014, 0.069, 0.125, 0.0001, 0.194, 0.153, 0.5, 0.042, 0.069, 0.0001, 0.056, 0.153, 0.402, 0.083, 0.0001, 0.0001, 0.014, 0.18, 0.222, 0.0001, 0.222, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.728, 1.221, 0.236, 1.443, 7.106, 0.347, 2.859, 3.65, 4.136, 0.125, 4.316, 3.539, 3.983, 7.412, 7.883, 1.596, 0.0001, 1.138, 1.901, 3.511, 6.62, 0.402, 2.776, 0.0001, 2.11, 0.194, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.056, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.056, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nov": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.223, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.739, 0.005, 0.371, 0.0001, 0.0001, 0.004, 0.0001, 0.014, 0.258, 0.258, 0.003, 0.008, 0.827, 0.256, 1.132, 0.016, 0.643, 0.521, 0.435, 0.122, 0.19, 0.117, 0.125, 0.112, 0.14, 0.247, 0.122, 0.023, 0.02, 0.012, 0.021, 0.004, 0.0001, 0.495, 0.126, 0.101, 0.11, 0.205, 0.084, 0.113, 0.079, 0.113, 0.072, 0.274, 0.517, 0.205, 0.19, 0.072, 0.148, 0.01, 0.107, 0.475, 0.124, 0.103, 0.078, 0.049, 0.006, 0.028, 0.032, 0.002, 0.0001, 0.003, 0.0001, 0.002, 0.0001, 6.407, 1.088, 0.275, 3.233, 10.596, 0.875, 0.958, 0.605, 7.974, 0.212, 2.738, 4.237, 2.737, 5.182, 4.585, 1.557, 0.08, 4.568, 4.834, 4.299, 2.875, 0.823, 0.156, 0.296, 0.238, 0.085, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.026, 0.009, 0.01, 0.005, 0.006, 0.003, 0.001, 0.003, 0.003, 0.003, 0.001, 0.001, 0.003, 0.004, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.016, 0.003, 0.003, 0.001, 0.001, 0.001, 0.007, 0.002, 0.003, 0.003, 0.007, 0.001, 0.0001, 0.012, 0.008, 0.002, 0.005, 0.005, 0.002, 0.003, 0.003, 0.008, 0.015, 0.002, 0.001, 0.004, 0.007, 0.004, 0.004, 0.003, 0.005, 0.01, 0.013, 0.003, 0.002, 0.006, 0.004, 0.012, 0.004, 0.008, 0.008, 0.012, 0.008, 0.004, 0.006, 0.0001, 0.0001, 0.013, 0.071, 0.012, 0.013, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.04, 0.019, 0.02, 0.007, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.008, 0.025, 0.004, 0.0001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nrm": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.521, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.376, 0.004, 0.467, 0.0001, 0.0001, 0.003, 0.0001, 1.947, 0.163, 0.162, 0.0001, 0.0001, 0.761, 0.157, 0.914, 0.012, 1.102, 1.934, 0.564, 0.483, 0.476, 0.487, 0.557, 0.61, 0.644, 0.66, 0.069, 0.027, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.78, 0.094, 0.435, 0.253, 0.108, 0.06, 0.094, 0.042, 0.231, 0.101, 0.009, 0.332, 0.216, 0.104, 0.043, 0.114, 0.015, 0.096, 0.165, 0.06, 0.048, 0.107, 0.012, 0.147, 0.029, 0.002, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 4.848, 0.485, 1.639, 2.302, 7.56, 0.544, 0.696, 1.469, 3.879, 0.15, 0.04, 3.065, 1.372, 5.618, 3.164, 1.345, 0.499, 2.846, 4.958, 4.48, 3.809, 0.712, 0.015, 0.135, 0.467, 0.062, 0.0001, 1.427, 0.0001, 0.0001, 0.0001, 0.085, 0.003, 0.016, 0.002, 0.004, 0.002, 0.001, 0.0001, 0.002, 0.014, 0.026, 0.0001, 0.001, 0.001, 0.016, 0.0001, 0.001, 0.001, 0.001, 0.016, 0.002, 0.001, 0.0001, 0.0001, 0.002, 0.06, 0.0001, 0.023, 0.002, 0.001, 0.0001, 0.001, 0.219, 0.004, 0.233, 0.004, 0.005, 0.011, 0.0001, 0.016, 0.454, 2.065, 0.259, 0.013, 0.002, 0.004, 0.368, 0.008, 0.001, 0.008, 0.002, 0.004, 0.081, 0.004, 0.002, 0.012, 0.002, 0.151, 0.004, 0.112, 0.003, 0.005, 0.001, 0.003, 0.0001, 0.0001, 0.015, 4.079, 0.017, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.029, 0.013, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.077, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nso": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.78, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.755, 0.002, 0.038, 0.001, 0.0001, 0.004, 0.0001, 0.009, 0.457, 0.457, 0.0001, 0.0001, 0.676, 0.052, 0.694, 0.005, 0.466, 0.863, 0.377, 0.269, 0.237, 0.244, 0.243, 0.245, 0.241, 0.264, 0.019, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.278, 0.349, 0.291, 0.135, 0.079, 0.05, 0.105, 0.055, 0.212, 0.029, 0.164, 0.314, 0.912, 0.402, 0.025, 0.107, 0.005, 0.046, 0.407, 0.145, 0.02, 0.095, 0.034, 0.21, 0.005, 0.034, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 11.556, 1.304, 0.158, 0.76, 9.745, 0.742, 5.815, 1.511, 2.097, 0.062, 3.221, 3.795, 3.273, 4.341, 8.239, 1.391, 0.015, 2.291, 2.998, 2.898, 0.946, 0.091, 3.286, 0.014, 0.713, 0.058, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.019, 0.718, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.045, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.083, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.134, 0.0001, 0.733, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "nv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.509, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.471, 0.0001, 0.553, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.132, 0.131, 0.0001, 0.0001, 0.333, 0.05, 0.853, 0.008, 0.262, 0.198, 0.155, 0.093, 0.082, 0.107, 0.089, 0.066, 0.073, 0.069, 0.012, 0.267, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.105, 0.358, 0.12, 0.313, 0.022, 0.005, 0.023, 0.24, 0.014, 0.023, 0.045, 0.016, 0.036, 0.298, 0.014, 0.019, 0.001, 0.01, 0.1, 0.28, 0.004, 0.005, 0.04, 0.001, 0.048, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 5.817, 1.241, 0.605, 3.905, 1.9, 0.016, 1.415, 4.266, 6.018, 0.364, 1.038, 1.394, 0.149, 2.559, 2.764, 0.063, 0.003, 0.149, 2.248, 2.042, 0.092, 0.019, 0.145, 0.037, 1.033, 1.245, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.08, 1.403, 1.567, 0.013, 0.082, 1.105, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.067, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.294, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 2.758, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 2.445, 0.0001, 0.311, 0.0001, 4.591, 0.0001, 0.504, 0.001, 0.001, 0.001, 2.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.013, 4.172, 0.001, 0.0001, 0.013, 0.0001, 0.0001, 0.002, 11.893, 1.899, 1.744, 0.0001, 0.311, 0.0001, 0.0001, 4.171, 0.0001, 1.234, 0.0001, 0.002, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.08, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ny": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.625, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.431, 0.001, 0.161, 0.0001, 0.001, 0.013, 0.004, 0.199, 0.151, 0.149, 0.001, 0.0001, 0.726, 0.052, 1.005, 0.011, 0.425, 0.321, 0.242, 0.114, 0.121, 0.146, 0.109, 0.097, 0.1, 0.188, 0.119, 0.008, 0.003, 0.006, 0.003, 0.001, 0.0001, 0.324, 0.194, 0.362, 0.113, 0.083, 0.06, 0.055, 0.057, 0.099, 0.059, 0.134, 0.101, 0.607, 0.172, 0.041, 0.204, 0.005, 0.064, 0.151, 0.1, 0.088, 0.025, 0.048, 0.003, 0.047, 0.083, 0.018, 0.0001, 0.019, 0.0001, 0.0001, 0.003, 13.746, 1.132, 1.623, 2.856, 4.347, 0.427, 1.15, 2.997, 7.993, 0.223, 3.837, 3.15, 3.985, 6.204, 4.4, 1.606, 0.018, 2.007, 1.898, 3.156, 4.108, 0.173, 2.53, 0.014, 1.184, 1.868, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.066, 0.003, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.004, 0.05, 0.0001, 0.0001, 0.006, 0.005, 0.001, 0.001, 0.013, 0.003, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.013, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.004, 0.001, 0.006, 0.001, 0.06, 0.0001, 0.011, 0.002, 0.003, 0.003, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.023, 0.029, 0.004, 0.064, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.009, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.066, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "oc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.196, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.065, 0.002, 0.316, 0.046, 0.0001, 0.007, 0.001, 0.708, 0.193, 0.193, 0.002, 0.001, 0.913, 0.337, 0.785, 0.01, 0.177, 0.339, 0.143, 0.091, 0.092, 0.097, 0.087, 0.093, 0.11, 0.155, 0.065, 0.02, 0.037, 0.032, 0.038, 0.002, 0.0001, 0.316, 0.163, 0.28, 0.118, 0.18, 0.101, 0.108, 0.046, 0.126, 0.059, 0.019, 0.366, 0.206, 0.087, 0.061, 0.2, 0.02, 0.116, 0.247, 0.092, 0.045, 0.108, 0.016, 0.03, 0.009, 0.007, 0.013, 0.0001, 0.013, 0.0001, 0.002, 0.0001, 9.22, 0.793, 2.634, 3.53, 8.653, 0.714, 1.084, 0.594, 5.176, 0.154, 0.069, 4.196, 2.017, 5.599, 4.023, 1.809, 0.517, 4.973, 5.482, 4.438, 3.287, 0.768, 0.022, 0.148, 0.146, 0.139, 0.0001, 0.011, 0.002, 0.002, 0.0001, 0.071, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, 0.007, 0.009, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.001, 0.006, 0.007, 0.005, 0.001, 0.0001, 0.0001, 0.001, 0.051, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.145, 0.074, 0.024, 0.002, 0.002, 0.001, 0.002, 0.134, 0.929, 0.452, 0.016, 0.026, 0.001, 0.096, 0.005, 0.03, 0.005, 0.004, 0.448, 0.027, 0.01, 0.002, 0.002, 0.002, 0.002, 0.004, 0.011, 0.027, 0.011, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.068, 2.417, 0.003, 0.007, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.008, 0.004, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.067, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "olo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.555, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.165, 0.001, 0.091, 0.0001, 0.0001, 0.009, 0.001, 0.061, 0.221, 0.221, 0.0001, 0.001, 0.891, 0.306, 1.442, 0.031, 0.305, 0.513, 0.256, 0.174, 0.154, 0.153, 0.124, 0.134, 0.157, 0.296, 0.102, 0.011, 0.01, 0.003, 0.01, 0.002, 0.001, 0.151, 0.077, 0.024, 0.041, 0.069, 0.036, 0.06, 0.101, 0.085, 0.112, 0.389, 0.128, 0.177, 0.115, 0.068, 0.258, 0.001, 0.092, 0.352, 0.141, 0.032, 0.27, 0.012, 0.021, 0.024, 0.01, 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.005, 7.441, 0.351, 0.076, 1.841, 5.414, 0.122, 0.914, 2.187, 8.145, 1.143, 3.3, 4.3, 1.89, 6.075, 4.589, 1.29, 0.001, 2.71, 3.519, 3.872, 5.598, 2.436, 0.016, 0.008, 1.054, 0.985, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.389, 0.086, 0.073, 0.032, 0.01, 0.011, 0.006, 0.01, 0.008, 0.001, 0.002, 0.006, 0.036, 0.349, 0.005, 0.017, 0.009, 0.004, 0.01, 0.105, 0.013, 0.002, 0.002, 0.002, 0.005, 0.148, 0.017, 0.006, 0.011, 0.056, 0.001, 0.018, 0.051, 0.118, 0.003, 0.002, 1.86, 0.003, 0.001, 0.007, 0.003, 0.003, 0.001, 0.01, 0.001, 0.003, 0.001, 0.002, 0.143, 0.012, 0.077, 0.019, 0.054, 0.096, 0.298, 0.031, 0.077, 0.038, 0.064, 0.07, 0.021, 0.096, 0.259, 0.018, 0.0001, 0.0001, 0.075, 2.173, 0.359, 0.275, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.01, 0.006, 0.977, 0.34, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.008, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.004, 0.001, 0.32, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "om": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.856, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.47, 0.007, 0.135, 0.001, 0.001, 0.02, 0.001, 0.415, 0.149, 0.148, 0.003, 0.001, 0.598, 0.088, 0.774, 0.024, 0.177, 0.196, 0.107, 0.055, 0.058, 0.069, 0.055, 0.055, 0.062, 0.111, 0.03, 0.031, 0.014, 0.003, 0.015, 0.004, 0.0001, 0.377, 0.227, 0.059, 0.14, 0.066, 0.078, 0.179, 0.124, 0.131, 0.063, 0.149, 0.064, 0.172, 0.076, 0.188, 0.061, 0.049, 0.057, 0.159, 0.099, 0.042, 0.016, 0.108, 0.015, 0.076, 0.01, 0.011, 0.0001, 0.011, 0.0001, 0.003, 0.13, 18.959, 2.318, 0.672, 2.536, 5.221, 1.607, 1.449, 2.234, 8.071, 0.935, 2.586, 2.201, 2.811, 5.266, 4.391, 0.29, 0.68, 3.658, 3.072, 4.065, 4.017, 0.087, 0.574, 0.143, 1.425, 0.099, 0.01, 0.001, 0.01, 0.0001, 0.0001, 0.186, 0.003, 0.002, 0.003, 0.006, 0.002, 0.002, 0.001, 0.004, 0.002, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.007, 0.12, 0.0001, 0.0001, 0.011, 0.011, 0.005, 0.0001, 0.099, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.03, 0.008, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.001, 0.002, 0.003, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.105, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.002, 0.0001, 0.0001, 0.007, 0.004, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.191, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "or": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.414, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.789, 0.001, 0.049, 0.0001, 0.0001, 0.027, 0.0001, 0.016, 0.066, 0.066, 0.001, 0.0001, 0.194, 0.029, 0.065, 0.008, 0.012, 0.014, 0.009, 0.005, 0.004, 0.005, 0.004, 0.004, 0.004, 0.006, 0.014, 0.004, 0.003, 0.001, 0.003, 0.0001, 0.0001, 0.006, 0.004, 0.006, 0.004, 0.003, 0.002, 0.002, 0.003, 0.007, 0.001, 0.002, 0.003, 0.005, 0.003, 0.003, 0.005, 0.0001, 0.003, 0.007, 0.006, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.081, 0.011, 0.027, 0.026, 0.08, 0.013, 0.015, 0.029, 0.067, 0.002, 0.006, 0.037, 0.021, 0.058, 0.062, 0.019, 0.001, 0.059, 0.056, 0.058, 0.033, 0.007, 0.008, 0.003, 0.014, 0.002, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.461, 0.87, 0.209, 0.086, 0.0001, 0.314, 0.231, 1.688, 0.023, 0.138, 0.001, 0.379, 0.073, 2.56, 0.0001, 0.427, 0.002, 0.0001, 0.0001, 0.16, 0.011, 1.385, 0.13, 0.389, 0.041, 0.233, 0.239, 0.105, 0.371, 0.014, 0.058, 0.871, 0.144, 0.225, 0.017, 0.346, 1.495, 0.883, 0.609, 0.353, 1.21, 0.043, 0.827, 0.113, 24.372, 7.183, 0.945, 0.296, 2.678, 0.059, 0.571, 0.283, 0.0001, 0.05, 0.328, 0.264, 0.929, 0.701, 0.0001, 0.0001, 0.094, 0.0001, 2.794, 2.229, 0.0001, 0.0001, 0.045, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.66, 0.0001, 0.069, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "os": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.314, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.198, 0.001, 0.075, 0.0001, 0.0001, 0.009, 0.0001, 0.003, 0.221, 0.221, 0.0001, 0.001, 0.656, 0.268, 0.647, 0.003, 0.149, 0.239, 0.119, 0.07, 0.068, 0.074, 0.065, 0.065, 0.08, 0.138, 0.043, 0.023, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.003, 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.001, 0.024, 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.005, 0.002, 0.001, 0.007, 0.001, 0.014, 0.001, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.032, 0.005, 0.009, 0.008, 0.024, 0.004, 0.005, 0.006, 0.02, 0.001, 0.005, 0.014, 0.008, 0.019, 0.019, 0.004, 0.0001, 0.021, 0.013, 0.014, 0.012, 0.003, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.723, 1.959, 2.433, 1.742, 0.485, 1.045, 0.733, 0.104, 0.039, 0.003, 0.515, 3.703, 0.088, 0.047, 0.033, 0.054, 0.152, 0.11, 0.038, 0.09, 0.183, 0.021, 0.005, 0.03, 0.137, 0.06, 0.132, 0.043, 0.092, 0.063, 0.026, 0.055, 0.062, 0.15, 0.074, 0.109, 0.063, 0.115, 4.882, 0.027, 0.022, 0.001, 0.001, 0.076, 0.0001, 0.018, 0.005, 0.007, 3.663, 0.542, 0.469, 1.346, 2.223, 0.835, 0.243, 0.949, 1.778, 1.262, 0.952, 1.134, 1.447, 2.532, 1.739, 0.347, 0.0001, 0.0001, 0.16, 4.829, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.0001, 0.002, 0.001, 23.204, 15.519, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.01, 0.127, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.424, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.354, 0.003, 0.052, 0.0001, 0.0001, 0.005, 0.0001, 0.026, 0.07, 0.07, 0.0001, 0.001, 0.252, 0.083, 0.057, 0.008, 0.09, 0.134, 0.073, 0.034, 0.034, 0.037, 0.032, 0.033, 0.039, 0.073, 0.023, 0.007, 0.005, 0.003, 0.005, 0.001, 0.0001, 0.004, 0.002, 0.004, 0.002, 0.003, 0.002, 0.002, 0.002, 0.006, 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.005, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.002, 0.003, 0.035, 0.006, 0.011, 0.011, 0.037, 0.006, 0.008, 0.011, 0.028, 0.001, 0.004, 0.018, 0.013, 0.026, 0.027, 0.009, 0.001, 0.025, 0.019, 0.024, 0.012, 0.004, 0.004, 0.001, 0.005, 0.001, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 1.534, 0.423, 1.17, 0.001, 0.001, 0.437, 0.548, 1.695, 0.606, 0.237, 0.024, 0.573, 0.09, 0.23, 0.001, 0.065, 0.035, 0.0001, 0.001, 0.028, 0.011, 1.172, 0.229, 0.428, 0.077, 0.013, 0.442, 0.041, 0.755, 0.032, 0.001, 0.286, 0.066, 0.192, 0.017, 0.267, 1.499, 0.487, 1.308, 0.154, 24.532, 6.371, 0.647, 0.143, 0.447, 0.172, 0.696, 0.068, 2.373, 0.727, 0.943, 0.005, 0.001, 0.891, 0.001, 0.001, 1.461, 1.12, 0.001, 0.001, 0.465, 0.001, 2.611, 1.487, 0.0001, 0.0001, 0.039, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.006, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 30.092, 0.001, 0.038, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pag": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.592, 0.019, 0.241, 0.0001, 0.0001, 0.002, 0.0001, 0.022, 0.579, 0.579, 0.001, 0.002, 1.012, 0.179, 1.28, 0.004, 0.607, 0.517, 0.439, 0.246, 0.233, 0.22, 0.206, 0.189, 0.188, 0.203, 0.287, 0.029, 0.2, 0.003, 0.2, 0.007, 0.0001, 0.514, 0.233, 0.299, 0.377, 0.293, 0.091, 0.061, 0.039, 0.141, 0.067, 0.298, 0.143, 0.228, 0.153, 0.107, 0.323, 0.017, 0.066, 0.835, 0.144, 0.158, 0.036, 0.141, 0.001, 0.016, 0.024, 0.044, 0.0001, 0.045, 0.0001, 0.001, 0.0001, 14.553, 2.155, 0.612, 2.213, 4.092, 0.158, 2.144, 0.652, 5.448, 0.026, 2.943, 4.371, 1.62, 6.468, 4.169, 1.489, 0.134, 1.92, 4.171, 4.111, 1.822, 0.133, 0.774, 0.019, 2.966, 0.181, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.082, 0.003, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.005, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.048, 0.0001, 0.001, 0.01, 0.009, 0.0001, 0.0001, 0.004, 0.017, 0.0001, 0.001, 0.002, 0.001, 0.004, 0.002, 0.001, 0.008, 0.001, 0.001, 0.001, 0.005, 0.0001, 0.001, 0.003, 0.012, 0.002, 0.005, 0.002, 0.001, 0.001, 0.001, 0.004, 0.001, 0.005, 0.001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.004, 0.049, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.075, 0.004, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pam": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.69, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.089, 0.008, 0.379, 0.001, 0.002, 0.006, 0.002, 0.032, 0.278, 0.278, 0.002, 0.002, 1.032, 0.272, 0.824, 0.024, 0.328, 0.294, 0.247, 0.119, 0.115, 0.114, 0.097, 0.092, 0.106, 0.173, 0.084, 0.034, 0.037, 0.005, 0.037, 0.004, 0.0001, 0.446, 0.258, 0.283, 0.225, 0.147, 0.167, 0.119, 0.095, 0.427, 0.078, 0.159, 0.17, 0.339, 0.137, 0.085, 0.26, 0.014, 0.119, 0.316, 0.173, 0.073, 0.129, 0.078, 0.01, 0.038, 0.027, 0.056, 0.0001, 0.058, 0.0001, 0.003, 0.0001, 11.717, 1.42, 1.079, 1.934, 5.65, 0.412, 5.535, 0.984, 6.498, 0.051, 2.215, 3.499, 2.546, 9.826, 2.443, 1.882, 0.041, 3.326, 2.846, 3.809, 3.421, 0.311, 0.524, 0.064, 1.429, 0.196, 0.0001, 0.012, 0.001, 0.0001, 0.0001, 0.064, 0.007, 0.004, 0.005, 0.004, 0.002, 0.003, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.006, 0.001, 0.001, 0.002, 0.001, 0.002, 0.019, 0.004, 0.002, 0.002, 0.002, 0.003, 0.009, 0.002, 0.002, 0.017, 0.008, 0.009, 0.013, 0.012, 0.022, 0.007, 0.002, 0.067, 0.005, 0.005, 0.005, 0.009, 0.033, 0.004, 0.003, 0.003, 0.006, 0.006, 0.004, 0.01, 0.012, 0.01, 0.01, 0.006, 0.003, 0.032, 0.002, 0.004, 0.003, 0.008, 0.007, 0.067, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.014, 0.263, 0.005, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.008, 0.006, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.04, 0.011, 0.063, 0.0001, 0.001, 0.004, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pap": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.577, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.041, 0.006, 0.256, 0.002, 0.001, 0.008, 0.005, 0.088, 0.145, 0.144, 0.001, 0.001, 0.829, 0.082, 0.948, 0.014, 0.296, 0.379, 0.247, 0.133, 0.132, 0.125, 0.108, 0.098, 0.111, 0.184, 0.198, 0.046, 0.009, 0.003, 0.009, 0.012, 0.0001, 0.325, 0.157, 0.17, 0.173, 0.346, 0.09, 0.081, 0.124, 0.155, 0.09, 0.129, 0.105, 0.233, 0.162, 0.14, 0.176, 0.005, 0.132, 0.285, 0.134, 0.07, 0.056, 0.051, 0.003, 0.069, 0.012, 0.014, 0.0001, 0.014, 0.0001, 0.003, 0.0001, 10.584, 1.755, 0.96, 3.481, 6.611, 0.57, 0.793, 1.086, 6.922, 0.094, 2.168, 2.197, 2.209, 6.462, 5.124, 1.889, 0.017, 4.387, 3.838, 4.459, 3.468, 0.348, 0.249, 0.043, 0.415, 0.112, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.051, 0.006, 0.003, 0.006, 0.004, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.012, 0.002, 0.005, 0.003, 0.001, 0.001, 0.001, 0.006, 0.016, 0.001, 0.001, 0.01, 0.01, 0.001, 0.001, 0.023, 0.288, 0.003, 0.003, 0.003, 0.001, 0.002, 0.007, 0.143, 0.171, 0.002, 0.003, 0.001, 0.133, 0.0001, 0.002, 0.003, 0.162, 0.171, 0.076, 0.001, 0.002, 0.002, 0.001, 0.004, 0.053, 0.027, 0.003, 0.086, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.023, 1.326, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.007, 0.004, 0.023, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.007, 0.048, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pcd": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.27, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.657, 0.008, 0.673, 0.0001, 0.0001, 0.003, 0.004, 1.579, 0.485, 0.482, 0.004, 0.002, 0.764, 0.743, 0.844, 0.029, 0.205, 0.439, 0.185, 0.104, 0.105, 0.099, 0.112, 0.109, 0.159, 0.228, 0.141, 0.017, 0.014, 0.103, 0.015, 0.005, 0.0001, 0.322, 0.315, 0.578, 0.163, 0.158, 0.188, 0.128, 0.139, 0.259, 0.095, 0.035, 0.293, 0.23, 0.148, 0.082, 0.416, 0.024, 0.141, 0.362, 0.132, 0.056, 0.121, 0.049, 0.026, 0.011, 0.008, 0.008, 0.0001, 0.009, 0.0001, 0.004, 0.004, 4.164, 0.548, 3.109, 2.876, 7.669, 0.633, 0.742, 2.062, 6.133, 0.168, 0.261, 3.265, 1.584, 5.6, 3.825, 1.718, 0.299, 3.984, 4.345, 3.994, 3.516, 0.729, 0.062, 0.099, 0.331, 0.121, 0.0001, 0.008, 0.001, 0.001, 0.0001, 0.34, 0.006, 0.009, 0.004, 0.003, 0.002, 0.003, 0.003, 0.01, 0.086, 0.002, 0.001, 0.004, 0.005, 0.003, 0.002, 0.003, 0.002, 0.002, 0.018, 0.009, 0.001, 0.001, 0.002, 0.003, 0.283, 0.001, 0.003, 0.003, 0.002, 0.001, 0.001, 0.283, 0.006, 0.038, 0.003, 0.005, 0.006, 0.003, 0.025, 0.548, 2.644, 0.014, 0.04, 0.002, 0.005, 0.009, 0.049, 0.019, 0.006, 0.015, 0.007, 0.051, 0.004, 0.002, 0.022, 0.007, 0.018, 0.005, 0.043, 0.008, 0.005, 0.004, 0.007, 0.0001, 0.0001, 0.109, 3.762, 0.007, 0.017, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.003, 0.0001, 0.0001, 0.018, 0.008, 0.022, 0.007, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.009, 0.005, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.006, 0.329, 0.001, 0.002, 0.009, 0.006, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pdc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.347, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.345, 0.014, 0.296, 0.0001, 0.002, 0.001, 0.004, 0.083, 0.252, 0.251, 0.004, 0.0001, 0.899, 0.34, 1.232, 0.016, 0.318, 0.569, 0.233, 0.139, 0.122, 0.133, 0.151, 0.187, 0.197, 0.319, 0.11, 0.028, 0.009, 0.001, 0.009, 0.014, 0.001, 0.435, 0.396, 0.269, 0.612, 0.446, 0.261, 0.34, 0.266, 0.158, 0.126, 0.345, 0.316, 0.408, 0.189, 0.112, 0.446, 0.018, 0.164, 0.922, 0.173, 0.1, 0.127, 0.257, 0.003, 0.091, 0.087, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.001, 5.822, 0.784, 2.856, 3.127, 10.434, 0.913, 1.544, 3.717, 6.407, 0.033, 0.633, 2.751, 1.821, 6.435, 2.483, 0.545, 0.012, 4.834, 4.912, 3.94, 2.397, 0.665, 1.309, 0.053, 0.442, 0.521, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.13, 0.003, 0.001, 0.002, 0.004, 0.002, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.012, 0.001, 0.0001, 0.001, 0.0001, 0.012, 0.052, 0.0001, 0.0001, 0.021, 0.02, 0.013, 0.012, 0.005, 0.005, 0.001, 0.002, 0.087, 0.001, 0.002, 0.004, 0.002, 0.014, 0.002, 0.001, 0.002, 0.005, 0.0001, 0.002, 0.002, 0.007, 0.005, 0.01, 0.013, 0.001, 0.014, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.03, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.019, 0.191, 0.004, 0.004, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.011, 0.007, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pfl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.263, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.706, 0.009, 0.364, 0.0001, 0.0001, 0.013, 0.001, 0.091, 0.195, 0.195, 0.003, 0.001, 0.686, 0.342, 1.046, 0.015, 0.201, 0.285, 0.126, 0.084, 0.075, 0.083, 0.073, 0.08, 0.09, 0.133, 0.057, 0.007, 0.004, 0.002, 0.005, 0.003, 0.0001, 0.282, 0.468, 0.129, 0.696, 0.183, 0.211, 0.353, 0.23, 0.145, 0.127, 0.364, 0.254, 0.349, 0.172, 0.165, 0.214, 0.007, 0.306, 0.587, 0.085, 0.112, 0.133, 0.253, 0.004, 0.004, 0.083, 0.004, 0.0001, 0.004, 0.0001, 0.001, 0.001, 5.458, 1.123, 3.147, 5.166, 9.364, 1.012, 2.021, 4.491, 5.715, 0.138, 0.564, 2.856, 2.578, 5.721, 2.982, 0.339, 0.016, 4.316, 5.155, 2.124, 2.997, 0.789, 1.349, 0.04, 0.119, 0.948, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.073, 0.001, 0.001, 0.001, 0.025, 0.007, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.014, 0.001, 0.005, 0.002, 0.0001, 0.001, 0.004, 0.001, 0.001, 0.027, 0.001, 0.026, 0.15, 0.041, 0.008, 0.01, 0.001, 1.309, 0.09, 0.0001, 0.002, 0.017, 0.105, 0.002, 0.002, 0.07, 0.023, 0.0001, 0.002, 0.004, 0.001, 0.016, 0.015, 0.003, 0.033, 0.029, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.044, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.024, 1.987, 0.001, 0.015, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.07, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.055, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.983, 0.003, 0.019, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.015, 0.015, 0.0001, 0.0001, 0.196, 0.05, 0.162, 0.001, 0.012, 0.032, 0.016, 0.014, 0.013, 0.015, 0.012, 0.01, 0.008, 0.011, 0.012, 0.002, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.014, 0.008, 0.005, 0.012, 0.009, 0.003, 0.003, 0.008, 0.003, 0.003, 0.005, 0.005, 0.006, 0.016, 0.004, 0.013, 0.0001, 0.005, 0.023, 0.015, 0.011, 0.002, 0.003, 0.0001, 0.036, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.761, 0.196, 0.276, 0.305, 0.454, 0.017, 0.165, 0.648, 0.799, 0.068, 0.545, 0.11, 0.265, 0.512, 0.167, 0.383, 0.0001, 0.263, 0.542, 0.555, 0.3, 0.254, 0.017, 0.002, 0.396, 0.01, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.585, 1.349, 0.631, 0.309, 0.001, 0.704, 0.099, 0.738, 0.496, 0.135, 0.002, 0.598, 0.015, 3.249, 0.0001, 0.471, 0.004, 0.001, 0.0001, 0.007, 0.008, 1.087, 0.017, 0.945, 0.067, 0.032, 0.055, 0.004, 0.076, 0.002, 0.011, 0.133, 0.012, 0.507, 0.001, 0.315, 18.309, 9.394, 0.355, 1.002, 0.59, 0.225, 0.335, 0.42, 0.344, 0.341, 0.537, 1.408, 2.487, 0.078, 0.724, 0.001, 0.0001, 0.527, 0.043, 0.432, 2.004, 0.558, 0.0001, 0.0001, 0.014, 0.0001, 1.176, 0.438, 0.0001, 0.0001, 0.0001, 0.095, 0.876, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 26.149, 0.497, 0.061, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pih": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.022, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.521, 0.009, 0.204, 0.0001, 0.0001, 0.004, 0.001, 2.454, 0.291, 0.293, 0.002, 0.001, 0.888, 0.295, 1.488, 0.018, 0.431, 0.479, 0.302, 0.13, 0.163, 0.176, 0.152, 0.154, 0.17, 0.228, 0.107, 0.024, 0.002, 0.004, 0.002, 0.0001, 0.0001, 0.58, 0.327, 0.222, 0.2, 0.438, 0.166, 0.153, 0.179, 0.225, 0.154, 0.281, 0.167, 0.407, 0.329, 0.234, 0.386, 0.004, 0.196, 0.528, 0.379, 0.134, 0.065, 0.116, 0.0001, 0.083, 0.034, 0.002, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 8.21, 0.769, 1.021, 1.638, 6.843, 0.747, 0.93, 1.82, 7.969, 0.261, 1.7, 3.13, 1.378, 5.431, 3.567, 1.341, 0.022, 3.668, 4.749, 4.715, 2.394, 0.289, 0.906, 0.045, 1.135, 0.094, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.092, 0.039, 0.046, 0.01, 0.019, 0.008, 0.006, 0.003, 0.009, 0.001, 0.001, 0.017, 0.011, 0.007, 0.006, 0.02, 0.015, 0.009, 0.001, 0.019, 0.012, 0.0001, 0.001, 0.006, 0.003, 0.028, 0.004, 0.009, 0.002, 0.007, 0.002, 0.006, 0.077, 0.019, 0.006, 0.004, 0.002, 0.001, 0.001, 0.004, 0.006, 0.035, 0.017, 0.004, 0.004, 0.012, 0.004, 0.0001, 0.082, 0.011, 0.044, 0.037, 0.018, 0.034, 0.007, 0.017, 0.057, 0.008, 0.047, 0.04, 0.021, 0.031, 0.077, 0.012, 0.0001, 0.0001, 0.098, 0.125, 0.02, 0.026, 0.002, 0.0001, 0.0001, 0.016, 0.007, 0.004, 0.0001, 0.001, 0.0001, 0.0001, 0.45, 0.193, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.026, 0.048, 0.0001, 0.0001, 0.003, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pms": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.299, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.832, 0.001, 0.162, 0.0001, 0.0001, 0.004, 0.001, 1.011, 0.156, 0.156, 0.0001, 0.0001, 1.253, 0.787, 0.992, 0.342, 0.318, 0.594, 0.327, 0.281, 0.214, 0.205, 0.231, 0.17, 0.187, 0.641, 0.121, 0.014, 0.149, 0.035, 0.149, 0.034, 0.0001, 0.513, 0.293, 0.3, 0.101, 0.054, 0.096, 0.128, 0.035, 0.079, 0.03, 0.029, 0.305, 0.216, 0.126, 0.053, 0.205, 0.008, 0.226, 0.291, 0.098, 0.028, 0.104, 0.023, 0.014, 0.012, 0.01, 0.002, 0.0001, 0.002, 0.0001, 0.011, 0.0001, 9.348, 0.753, 2.346, 3.335, 4.488, 0.731, 0.919, 0.76, 4.936, 0.31, 0.385, 3.85, 2.042, 6.393, 3.543, 1.375, 0.084, 3.728, 4.566, 4.041, 1.559, 0.688, 0.145, 0.036, 0.118, 0.134, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.165, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.007, 0.001, 0.059, 0.002, 0.001, 0.004, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.02, 0.115, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.661, 0.007, 0.005, 0.001, 0.004, 0.0001, 0.001, 0.004, 0.295, 0.64, 0.002, 2.121, 0.312, 0.006, 0.001, 0.001, 0.002, 0.006, 0.658, 0.012, 0.019, 0.001, 0.003, 0.0001, 0.001, 0.07, 0.002, 0.002, 0.005, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.286, 4.639, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.137, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pnb": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.056, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.3, 0.001, 0.061, 0.0001, 0.0001, 0.004, 0.0001, 0.019, 0.084, 0.084, 0.0001, 0.001, 0.02, 0.088, 0.041, 0.008, 0.132, 0.201, 0.102, 0.067, 0.062, 0.067, 0.058, 0.058, 0.067, 0.099, 0.044, 0.011, 0.014, 0.019, 0.014, 0.0001, 0.0001, 0.005, 0.015, 0.004, 0.007, 0.004, 0.002, 0.006, 0.002, 0.006, 0.004, 0.001, 0.002, 0.002, 0.003, 0.002, 0.003, 0.0001, 0.004, 0.004, 0.005, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.016, 0.0001, 0.016, 0.0001, 0.001, 0.001, 0.078, 0.007, 0.025, 0.032, 0.067, 0.025, 0.012, 0.031, 0.075, 0.001, 0.005, 0.047, 0.03, 0.057, 0.061, 0.011, 0.001, 0.056, 0.035, 0.078, 0.015, 0.016, 0.005, 0.001, 0.026, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.037, 1.78, 0.208, 0.002, 1.668, 1.155, 3.673, 0.01, 3.168, 0.001, 0.005, 0.003, 4.417, 0.001, 0.019, 0.031, 0.026, 0.339, 2.06, 0.022, 0.634, 0.001, 0.0001, 0.0001, 0.015, 0.009, 0.0001, 0.004, 0.002, 0.002, 0.0001, 0.002, 0.01, 0.033, 0.198, 0.001, 0.068, 0.002, 0.419, 5.965, 1.027, 1.695, 1.567, 0.022, 0.752, 0.178, 0.132, 2.73, 0.025, 2.399, 0.214, 1.507, 0.366, 0.211, 0.103, 0.103, 0.037, 0.788, 1.21, 0.001, 0.001, 0.002, 1.61, 0.001, 0.0001, 0.0001, 0.01, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.991, 10.598, 5.545, 8.408, 0.0001, 0.004, 0.0001, 0.0001, 0.008, 0.001, 0.037, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "pnt": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.111, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.571, 0.001, 0.271, 0.0001, 0.0001, 0.001, 0.001, 0.535, 0.166, 0.167, 0.003, 0.001, 0.374, 0.066, 0.728, 0.006, 0.22, 0.256, 0.213, 0.123, 0.09, 0.093, 0.091, 0.105, 0.105, 0.136, 0.082, 0.003, 0.006, 0.005, 0.006, 0.0001, 0.0001, 0.027, 0.009, 0.018, 0.007, 0.008, 0.002, 0.007, 0.007, 0.011, 0.005, 0.01, 0.006, 0.014, 0.004, 0.003, 0.01, 0.001, 0.009, 0.009, 0.01, 0.001, 0.002, 0.009, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.102, 0.019, 0.03, 0.031, 0.116, 0.01, 0.025, 0.028, 0.096, 0.002, 0.026, 0.047, 0.026, 0.078, 0.081, 0.022, 0.002, 0.09, 0.05, 0.057, 0.045, 0.011, 0.005, 0.004, 0.012, 0.009, 0.0001, 0.182, 0.0001, 0.0001, 0.0001, 1.086, 2.28, 1.131, 1.649, 3.333, 0.911, 0.24, 0.496, 0.069, 0.319, 0.04, 0.001, 0.823, 0.357, 0.222, 0.002, 0.015, 0.24, 0.073, 0.124, 0.043, 0.159, 0.008, 0.102, 0.032, 0.07, 0.198, 0.037, 0.134, 0.044, 0.005, 0.136, 0.134, 0.042, 0.001, 0.198, 0.245, 0.005, 0.018, 0.079, 0.003, 0.008, 0.001, 0.042, 1.012, 0.786, 0.269, 1.272, 0.017, 4.369, 0.221, 0.746, 0.384, 2.578, 0.144, 1.385, 0.301, 1.937, 1.463, 1.533, 1.22, 4.421, 0.103, 3.268, 0.0001, 0.0001, 0.091, 0.022, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 29.379, 12.776, 0.049, 0.015, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.011, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.059, 0.041, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ps": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.579, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.932, 0.004, 0.044, 0.0001, 0.0001, 0.003, 0.0001, 0.002, 0.118, 0.118, 0.001, 0.001, 0.026, 0.037, 0.443, 0.009, 0.022, 0.03, 0.021, 0.014, 0.011, 0.012, 0.01, 0.009, 0.01, 0.013, 0.062, 0.001, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.015, 0.007, 0.011, 0.007, 0.006, 0.005, 0.004, 0.007, 0.009, 0.002, 0.003, 0.005, 0.01, 0.006, 0.004, 0.009, 0.001, 0.006, 0.013, 0.009, 0.003, 0.002, 0.003, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.003, 0.0001, 0.147, 0.023, 0.055, 0.054, 0.165, 0.027, 0.031, 0.061, 0.131, 0.002, 0.012, 0.073, 0.048, 0.109, 0.113, 0.034, 0.002, 0.103, 0.097, 0.116, 0.047, 0.015, 0.017, 0.005, 0.027, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.103, 0.528, 0.202, 0.231, 2.393, 1.822, 2.655, 3.163, 4.608, 0.307, 2.451, 0.006, 1.513, 0.136, 0.015, 0.009, 1.675, 0.004, 0.009, 0.507, 0.005, 0.0001, 0.154, 0.001, 0.093, 0.002, 0.229, 0.007, 0.005, 0.003, 0.0001, 0.006, 0.024, 0.025, 0.048, 0.014, 0.025, 0.008, 0.038, 4.145, 0.839, 1.375, 1.43, 0.077, 0.25, 0.229, 0.647, 2.983, 0.085, 2.528, 0.449, 1.14, 0.525, 0.146, 0.073, 0.106, 0.064, 0.333, 0.407, 0.02, 0.265, 0.005, 1.278, 0.002, 0.0001, 0.0001, 0.016, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.028, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 16.081, 19.012, 3.763, 3.368, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.026, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.038, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "qu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.204, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.108, 0.002, 0.638, 0.0001, 0.0001, 0.004, 0.002, 0.39, 0.494, 0.494, 0.05, 0.002, 1.04, 0.188, 0.977, 0.036, 0.261, 0.409, 0.214, 0.137, 0.12, 0.137, 0.117, 0.112, 0.136, 0.208, 0.401, 0.061, 0.041, 0.006, 0.041, 0.004, 0.0001, 0.371, 0.173, 0.36, 0.119, 0.076, 0.064, 0.097, 0.189, 0.192, 0.096, 0.255, 0.187, 0.305, 0.078, 0.042, 0.428, 0.148, 0.146, 0.31, 0.198, 0.198, 0.061, 0.174, 0.014, 0.102, 0.014, 0.014, 0.0001, 0.015, 0.0001, 0.002, 0.0001, 14.813, 0.229, 1.579, 0.795, 1.296, 0.084, 0.286, 2.331, 7.773, 0.067, 3.004, 4.09, 3.086, 5.006, 1.165, 2.96, 3.746, 3.293, 3.447, 3.494, 5.678, 0.135, 1.682, 0.024, 2.244, 0.111, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.055, 0.016, 0.009, 0.013, 0.008, 0.006, 0.004, 0.006, 0.004, 0.004, 0.003, 0.002, 0.006, 0.007, 0.003, 0.002, 0.012, 0.023, 0.002, 0.011, 0.004, 0.004, 0.003, 0.002, 0.004, 0.015, 0.003, 0.003, 0.005, 0.003, 0.002, 0.003, 0.038, 0.068, 0.004, 0.005, 0.014, 0.005, 0.006, 0.009, 0.007, 0.056, 0.005, 0.005, 0.005, 0.075, 0.004, 0.006, 0.014, 0.34, 0.013, 0.069, 0.007, 0.008, 0.006, 0.005, 0.016, 0.009, 0.022, 0.008, 0.011, 0.009, 0.01, 0.01, 0.0001, 0.0001, 0.026, 0.649, 0.01, 0.009, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.008, 0.002, 0.0001, 0.042, 0.02, 0.051, 0.016, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.006, 0.016, 0.012, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.031, 0.016, 0.047, 0.001, 0.001, 0.006, 0.005, 0.002, 0.002, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "rm": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.612, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.511, 0.003, 0.167, 0.0001, 0.0001, 0.015, 0.0001, 0.104, 0.151, 0.151, 0.003, 0.0001, 0.439, 0.065, 0.823, 0.012, 0.199, 0.275, 0.114, 0.07, 0.072, 0.078, 0.067, 0.073, 0.099, 0.138, 0.045, 0.054, 0.005, 0.002, 0.005, 0.002, 0.0001, 0.139, 0.111, 0.151, 0.1, 0.17, 0.069, 0.113, 0.045, 0.217, 0.028, 0.029, 0.208, 0.121, 0.055, 0.036, 0.132, 0.042, 0.086, 0.226, 0.106, 0.051, 0.07, 0.023, 0.003, 0.003, 0.008, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.001, 11.404, 0.601, 3.031, 3.677, 6.353, 0.757, 1.578, 1.412, 6.549, 0.076, 0.068, 4.778, 1.866, 6.046, 2.159, 1.856, 0.265, 4.97, 5.963, 4.375, 3.712, 1.407, 0.03, 0.131, 0.049, 0.802, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.828, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.043, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.675, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.294, 0.003, 0.002, 0.0001, 0.006, 0.001, 0.001, 0.002, 0.333, 0.017, 0.002, 0.02, 0.128, 0.003, 0.0001, 0.001, 0.004, 0.002, 0.027, 0.004, 0.001, 0.001, 0.012, 0.0001, 0.001, 0.054, 0.054, 0.02, 0.042, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.079, 0.841, 0.004, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.828, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "rmy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.439, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.022, 0.009, 0.624, 0.001, 0.0001, 0.014, 0.003, 0.015, 0.443, 0.441, 0.003, 0.003, 1.038, 0.232, 0.983, 0.037, 0.243, 0.24, 0.172, 0.071, 0.075, 0.081, 0.064, 0.056, 0.058, 0.153, 0.179, 0.028, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.429, 0.231, 0.183, 0.167, 0.219, 0.086, 0.091, 0.078, 0.193, 0.094, 0.424, 0.255, 0.23, 0.124, 0.22, 0.316, 0.009, 0.404, 0.577, 0.193, 0.066, 0.142, 0.014, 0.008, 0.107, 0.022, 0.003, 0.0001, 0.004, 0.0001, 0.001, 0.001, 10.986, 1.012, 0.769, 2.129, 6.975, 0.334, 0.958, 2.547, 6.287, 0.364, 2.952, 3.16, 1.944, 5.241, 5.031, 1.512, 0.108, 4.343, 3.649, 3.301, 2.127, 1.805, 0.051, 0.119, 2.702, 0.234, 0.0001, 0.003, 0.001, 0.001, 0.0001, 0.065, 0.024, 0.024, 0.136, 0.011, 0.006, 0.01, 0.023, 0.009, 0.001, 0.005, 0.016, 0.01, 0.054, 0.02, 0.004, 0.003, 0.007, 0.001, 0.025, 0.008, 0.009, 0.004, 0.007, 0.004, 0.054, 0.005, 0.044, 0.006, 0.002, 0.003, 0.008, 0.038, 0.056, 0.061, 0.004, 0.069, 0.023, 0.011, 0.016, 0.012, 0.016, 0.02, 0.006, 0.003, 0.014, 0.084, 0.01, 0.051, 0.028, 0.039, 0.03, 0.013, 0.014, 0.009, 0.007, 0.027, 0.007, 0.021, 0.023, 0.024, 0.034, 0.062, 0.014, 0.0001, 0.0001, 0.036, 0.28, 0.165, 0.061, 0.0001, 0.011, 0.089, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.007, 0.003, 0.242, 0.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.026, 0.02, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.128, 0.005, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.004, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "rn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.466, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.984, 0.029, 0.062, 0.0001, 0.0001, 0.003, 0.0001, 0.574, 0.079, 0.089, 0.011, 0.0001, 1.075, 0.049, 1.054, 0.052, 0.102, 0.296, 0.219, 0.136, 0.097, 0.085, 0.071, 0.069, 0.063, 0.086, 0.222, 0.076, 0.048, 0.0001, 0.048, 0.055, 0.0001, 0.35, 0.153, 0.043, 0.033, 0.087, 0.042, 0.05, 0.106, 0.336, 0.016, 0.136, 0.035, 0.208, 0.24, 0.02, 0.055, 0.001, 0.138, 0.132, 0.082, 0.29, 0.029, 0.019, 0.0001, 0.195, 0.032, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 10.973, 3.104, 0.817, 1.265, 5.117, 0.295, 2.193, 1.806, 7.318, 0.542, 2.677, 0.668, 3.393, 5.179, 4.081, 0.677, 0.004, 4.518, 2.135, 2.161, 5.935, 1.185, 2.07, 0.007, 2.3, 1.432, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.174, 0.023, 0.002, 0.005, 0.007, 0.004, 0.003, 0.003, 0.006, 0.0001, 0.004, 0.0001, 0.015, 0.271, 0.012, 0.002, 0.008, 0.004, 0.004, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.284, 0.0001, 0.196, 0.005, 0.002, 0.004, 0.014, 0.082, 0.437, 0.009, 0.0001, 0.0001, 0.006, 0.001, 0.018, 0.002, 0.13, 0.002, 0.17, 0.0001, 0.586, 0.007, 0.108, 0.004, 0.019, 0.001, 0.014, 0.007, 0.001, 0.01, 0.001, 0.001, 0.002, 0.049, 0.153, 0.015, 0.123, 0.121, 0.0001, 0.0001, 0.0001, 0.386, 1.335, 0.539, 0.45, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.167, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "rue": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.059, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.931, 0.003, 0.134, 0.004, 0.0001, 0.006, 0.0001, 0.004, 0.175, 0.175, 0.004, 0.001, 0.601, 0.077, 0.708, 0.007, 0.16, 0.303, 0.147, 0.097, 0.093, 0.095, 0.084, 0.09, 0.099, 0.137, 0.031, 0.011, 0.003, 0.006, 0.002, 0.001, 0.0001, 0.009, 0.006, 0.011, 0.005, 0.005, 0.004, 0.005, 0.007, 0.017, 0.002, 0.003, 0.006, 0.008, 0.01, 0.004, 0.008, 0.0001, 0.006, 0.012, 0.008, 0.004, 0.005, 0.003, 0.005, 0.001, 0.001, 0.002, 0.011, 0.003, 0.0001, 0.004, 0.0001, 0.091, 0.013, 0.033, 0.032, 0.099, 0.015, 0.014, 0.02, 0.081, 0.006, 0.012, 0.045, 0.028, 0.055, 0.071, 0.018, 0.002, 0.069, 0.058, 0.052, 0.039, 0.016, 0.006, 0.004, 0.014, 0.011, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 2.51, 1.935, 2.11, 1.119, 0.168, 0.507, 0.468, 0.486, 0.356, 0.046, 0.009, 1.422, 0.678, 0.003, 0.239, 0.784, 0.089, 0.301, 0.121, 0.074, 0.371, 0.035, 1.647, 0.529, 0.012, 0.009, 0.09, 0.04, 0.101, 0.07, 0.061, 0.137, 0.108, 0.152, 0.055, 0.234, 0.024, 0.016, 0.017, 0.032, 0.025, 0.005, 0.001, 0.015, 0.002, 0.004, 0.009, 0.015, 3.672, 0.621, 2.19, 0.526, 1.267, 2.143, 0.348, 0.764, 1.53, 0.62, 1.849, 1.595, 1.255, 2.617, 4.166, 1.0, 0.0001, 0.0001, 0.065, 0.026, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.006, 0.0001, 0.02, 0.009, 27.547, 15.28, 0.159, 0.0001, 0.0001, 0.001, 0.001, 0.004, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.115, 0.004, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "rw": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.278, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.768, 0.007, 0.605, 0.0001, 0.0001, 0.01, 0.005, 0.156, 0.48, 0.479, 0.0001, 0.001, 0.554, 0.104, 0.846, 0.03, 0.199, 0.216, 0.155, 0.113, 0.085, 0.082, 0.092, 0.069, 0.073, 0.138, 0.279, 0.158, 0.014, 0.006, 0.014, 0.022, 0.0001, 0.463, 0.203, 0.115, 0.093, 0.067, 0.068, 0.134, 0.078, 0.521, 0.056, 0.247, 0.076, 0.283, 0.278, 0.063, 0.134, 0.006, 0.219, 0.18, 0.135, 0.469, 0.053, 0.038, 0.003, 0.047, 0.033, 0.002, 0.005, 0.003, 0.0001, 0.005, 0.003, 10.187, 2.795, 0.85, 1.072, 4.678, 0.399, 2.704, 1.553, 8.747, 0.332, 2.605, 0.938, 3.443, 4.833, 3.164, 0.42, 0.036, 4.477, 2.07, 2.396, 6.084, 0.329, 1.941, 0.023, 2.813, 1.358, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.976, 0.03, 0.025, 0.03, 0.043, 0.049, 0.025, 0.021, 0.028, 0.009, 0.036, 0.011, 0.018, 0.014, 0.026, 0.013, 0.02, 0.015, 0.01, 0.15, 0.008, 0.015, 0.009, 0.008, 0.011, 0.787, 0.007, 0.008, 0.021, 0.011, 0.011, 0.034, 0.016, 0.016, 0.009, 0.011, 0.025, 0.012, 0.025, 0.083, 0.028, 0.057, 0.013, 0.014, 0.038, 0.019, 0.024, 0.039, 0.055, 0.067, 0.03, 0.036, 0.018, 0.034, 0.017, 0.013, 0.045, 0.024, 0.03, 0.026, 0.034, 0.02, 0.028, 0.012, 0.0001, 0.0001, 0.03, 0.13, 0.052, 0.028, 0.001, 0.001, 0.001, 0.009, 0.002, 0.001, 0.003, 0.0001, 0.02, 0.007, 0.21, 0.107, 0.008, 0.005, 0.001, 0.006, 0.005, 0.025, 0.234, 0.162, 0.005, 0.009, 0.0001, 0.0001, 0.009, 0.0001, 0.108, 0.055, 0.961, 0.001, 0.002, 0.013, 0.008, 0.004, 0.003, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.358, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.441, 0.003, 0.019, 0.0001, 0.0001, 0.003, 0.0001, 0.034, 0.04, 0.042, 0.0001, 0.001, 0.189, 0.124, 0.061, 0.009, 0.003, 0.004, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.002, 0.022, 0.001, 0.005, 0.003, 0.005, 0.005, 0.0001, 0.002, 0.001, 0.007, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.036, 0.006, 0.009, 0.018, 0.033, 0.003, 0.005, 0.01, 0.026, 0.001, 0.003, 0.015, 0.009, 0.022, 0.022, 0.013, 0.0001, 0.02, 0.014, 0.02, 0.007, 0.002, 0.005, 0.001, 0.004, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.485, 0.531, 0.737, 0.892, 0.001, 0.437, 0.14, 1.014, 0.103, 0.083, 0.003, 0.31, 0.053, 4.186, 0.001, 0.123, 0.004, 0.001, 0.0001, 0.016, 0.005, 0.929, 0.077, 0.397, 0.036, 0.098, 0.308, 0.026, 0.311, 0.017, 0.076, 0.146, 0.037, 0.11, 0.008, 0.362, 26.378, 7.803, 0.723, 0.32, 1.5, 0.025, 0.84, 0.05, 0.176, 0.36, 1.148, 1.481, 1.847, 0.0001, 0.431, 0.017, 0.001, 1.168, 0.412, 0.409, 1.347, 0.264, 0.0001, 0.0001, 0.002, 0.029, 2.443, 1.602, 0.0001, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.344, 0.0001, 0.071, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sah": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.686, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.508, 0.002, 0.063, 0.0001, 0.0001, 0.006, 0.0001, 0.001, 0.091, 0.092, 0.0001, 0.001, 0.559, 0.22, 0.713, 0.008, 0.141, 0.211, 0.115, 0.061, 0.06, 0.065, 0.051, 0.05, 0.056, 0.124, 0.035, 0.013, 0.006, 0.002, 0.006, 0.002, 0.0001, 0.005, 0.004, 0.005, 0.003, 0.002, 0.002, 0.002, 0.002, 0.017, 0.001, 0.002, 0.002, 0.004, 0.003, 0.002, 0.003, 0.0001, 0.002, 0.006, 0.004, 0.001, 0.004, 0.001, 0.007, 0.002, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 0.029, 0.008, 0.012, 0.008, 0.028, 0.005, 0.006, 0.038, 0.023, 0.001, 0.004, 0.015, 0.01, 0.02, 0.025, 0.007, 0.0001, 0.024, 0.015, 0.017, 0.012, 0.003, 0.003, 0.001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.31, 1.601, 3.034, 2.129, 0.054, 0.947, 0.056, 0.303, 0.028, 0.008, 0.002, 2.384, 0.325, 2.811, 0.018, 0.129, 0.129, 0.118, 0.035, 0.051, 0.111, 0.426, 0.011, 0.007, 0.063, 0.002, 0.123, 0.02, 0.075, 0.059, 0.083, 0.041, 0.09, 0.172, 0.066, 0.042, 0.018, 0.342, 0.005, 0.017, 0.028, 0.688, 0.0001, 0.065, 0.003, 0.027, 0.027, 0.911, 6.03, 1.253, 0.256, 0.681, 0.862, 0.464, 0.024, 0.065, 2.76, 0.764, 1.431, 3.082, 0.589, 3.175, 2.114, 0.327, 0.0001, 0.0001, 0.173, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.001, 24.486, 17.038, 2.234, 0.706, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.102, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sc": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.057, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.585, 0.005, 0.337, 0.0001, 0.0001, 0.01, 0.001, 0.519, 0.179, 0.179, 0.0001, 0.001, 0.997, 0.097, 0.746, 0.025, 0.237, 0.292, 0.15, 0.087, 0.082, 0.09, 0.079, 0.083, 0.093, 0.166, 0.067, 0.032, 0.007, 0.002, 0.008, 0.003, 0.0001, 0.224, 0.132, 0.261, 0.092, 0.103, 0.086, 0.108, 0.028, 0.255, 0.028, 0.024, 0.103, 0.181, 0.091, 0.054, 0.171, 0.006, 0.093, 0.455, 0.116, 0.064, 0.058, 0.024, 0.025, 0.008, 0.012, 0.012, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 9.363, 0.921, 2.394, 4.179, 7.513, 0.745, 1.075, 0.764, 6.94, 0.075, 0.096, 1.956, 1.851, 5.606, 4.069, 1.688, 0.018, 4.534, 7.393, 5.178, 5.316, 0.445, 0.037, 0.029, 0.067, 0.854, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.107, 0.01, 0.006, 0.008, 0.004, 0.002, 0.002, 0.003, 0.006, 0.002, 0.002, 0.002, 0.006, 0.004, 0.002, 0.001, 0.003, 0.002, 0.003, 0.008, 0.004, 0.001, 0.002, 0.001, 0.003, 0.058, 0.001, 0.002, 0.016, 0.017, 0.001, 0.001, 0.306, 0.009, 0.002, 0.003, 0.003, 0.002, 0.001, 0.004, 0.232, 0.016, 0.003, 0.007, 0.252, 0.007, 0.001, 0.002, 0.008, 0.007, 0.176, 0.008, 0.002, 0.004, 0.003, 0.006, 0.005, 0.096, 0.007, 0.007, 0.006, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.032, 1.097, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.011, 0.003, 0.007, 0.001, 0.0001, 0.018, 0.009, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.003, 0.006, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.096, 0.007, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "scn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.769, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.859, 0.005, 0.376, 0.001, 0.0001, 0.006, 0.001, 0.62, 0.187, 0.189, 0.001, 0.001, 0.862, 0.093, 0.813, 0.026, 0.237, 0.31, 0.158, 0.093, 0.09, 0.099, 0.092, 0.087, 0.104, 0.161, 0.085, 0.032, 0.027, 0.008, 0.034, 0.003, 0.0001, 0.211, 0.12, 0.299, 0.095, 0.077, 0.106, 0.122, 0.053, 0.143, 0.031, 0.023, 0.333, 0.207, 0.158, 0.044, 0.198, 0.02, 0.123, 0.32, 0.125, 0.061, 0.101, 0.022, 0.022, 0.008, 0.012, 0.019, 0.0001, 0.019, 0.0001, 0.007, 0.001, 8.698, 0.715, 3.649, 2.751, 2.764, 0.729, 1.223, 0.71, 11.435, 0.098, 0.087, 3.105, 2.009, 5.881, 1.955, 1.977, 0.125, 4.751, 3.262, 4.998, 7.156, 1.012, 0.04, 0.022, 0.077, 0.978, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.123, 0.005, 0.005, 0.005, 0.003, 0.001, 0.002, 0.001, 0.009, 0.002, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.001, 0.002, 0.002, 0.01, 0.003, 0.001, 0.002, 0.001, 0.012, 0.059, 0.001, 0.002, 0.014, 0.013, 0.001, 0.001, 0.271, 0.006, 0.312, 0.002, 0.001, 0.001, 0.001, 0.004, 0.478, 0.013, 0.046, 0.017, 0.359, 0.007, 0.096, 0.002, 0.008, 0.004, 0.23, 0.006, 0.189, 0.003, 0.002, 0.003, 0.004, 0.145, 0.006, 0.184, 0.003, 0.004, 0.002, 0.003, 0.0001, 0.0001, 0.038, 2.342, 0.007, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.018, 0.008, 0.018, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.107, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sco": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.424, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.792, 0.003, 0.394, 0.001, 0.002, 0.018, 0.003, 0.122, 0.265, 0.265, 0.001, 0.001, 1.079, 0.194, 0.878, 0.014, 0.365, 0.437, 0.262, 0.125, 0.119, 0.131, 0.116, 0.116, 0.135, 0.238, 0.065, 0.052, 0.004, 0.002, 0.004, 0.001, 0.0001, 0.38, 0.213, 0.323, 0.162, 0.132, 0.149, 0.164, 0.147, 0.281, 0.103, 0.117, 0.162, 0.281, 0.134, 0.098, 0.228, 0.015, 0.18, 0.416, 0.389, 0.071, 0.084, 0.096, 0.009, 0.031, 0.022, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.001, 7.525, 0.973, 2.32, 1.915, 9.145, 0.867, 0.966, 3.175, 6.858, 0.086, 0.556, 2.986, 1.72, 5.779, 4.854, 1.317, 0.066, 4.925, 4.607, 6.432, 2.109, 0.676, 1.003, 0.125, 1.018, 0.144, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.052, 0.009, 0.005, 0.004, 0.004, 0.003, 0.002, 0.004, 0.002, 0.003, 0.002, 0.001, 0.002, 0.005, 0.001, 0.002, 0.001, 0.002, 0.001, 0.033, 0.006, 0.001, 0.002, 0.002, 0.002, 0.009, 0.001, 0.002, 0.003, 0.003, 0.001, 0.005, 0.039, 0.026, 0.003, 0.006, 0.015, 0.004, 0.002, 0.007, 0.005, 0.025, 0.002, 0.006, 0.002, 0.019, 0.001, 0.002, 0.01, 0.012, 0.013, 0.016, 0.004, 0.005, 0.011, 0.002, 0.007, 0.003, 0.007, 0.003, 0.009, 0.004, 0.004, 0.002, 0.0001, 0.0001, 0.051, 0.152, 0.018, 0.014, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.011, 0.005, 0.019, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.005, 0.05, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sd": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.527, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.452, 0.004, 0.026, 0.001, 0.0001, 0.002, 0.0001, 0.004, 0.108, 0.108, 0.004, 0.001, 0.009, 0.252, 0.565, 0.015, 0.09, 0.18, 0.083, 0.051, 0.047, 0.052, 0.047, 0.048, 0.055, 0.112, 0.038, 0.003, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.01, 0.007, 0.009, 0.005, 0.004, 0.003, 0.004, 0.004, 0.005, 0.002, 0.003, 0.004, 0.007, 0.004, 0.003, 0.007, 0.001, 0.004, 0.011, 0.007, 0.002, 0.002, 0.003, 0.0001, 0.001, 0.0001, 0.005, 0.0001, 0.005, 0.001, 0.003, 0.0001, 0.093, 0.018, 0.025, 0.03, 0.086, 0.014, 0.018, 0.031, 0.075, 0.002, 0.009, 0.041, 0.026, 0.061, 0.064, 0.018, 0.001, 0.061, 0.048, 0.062, 0.025, 0.01, 0.009, 0.005, 0.016, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.358, 0.355, 0.367, 0.044, 1.492, 1.56, 3.771, 2.24, 3.043, 0.003, 5.411, 0.006, 0.747, 0.045, 0.229, 0.346, 0.139, 0.006, 0.013, 0.002, 0.041, 0.001, 0.001, 0.003, 0.036, 0.237, 0.0001, 0.007, 0.063, 0.063, 0.001, 0.009, 0.066, 0.346, 0.511, 0.005, 0.013, 0.004, 0.6, 4.552, 0.858, 0.458, 2.417, 0.053, 1.486, 0.357, 0.248, 1.426, 0.07, 2.412, 0.238, 1.475, 0.403, 0.209, 0.078, 0.141, 0.068, 0.553, 0.222, 0.578, 0.001, 0.647, 1.291, 0.291, 0.0001, 0.0001, 0.065, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 17.302, 19.772, 4.118, 0.84, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.198, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.104, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "se": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.476, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.534, 0.002, 0.233, 0.001, 0.001, 0.008, 0.001, 0.011, 0.255, 0.258, 0.0001, 0.001, 1.05, 0.297, 1.247, 0.015, 0.373, 0.513, 0.317, 0.174, 0.148, 0.157, 0.145, 0.145, 0.159, 0.258, 0.106, 0.008, 0.018, 0.002, 0.018, 0.002, 0.0001, 0.188, 0.166, 0.071, 0.251, 0.09, 0.093, 0.235, 0.162, 0.082, 0.134, 0.245, 0.18, 0.186, 0.183, 0.112, 0.147, 0.004, 0.206, 0.487, 0.123, 0.053, 0.171, 0.019, 0.003, 0.015, 0.006, 0.005, 0.0001, 0.005, 0.0001, 0.001, 0.0001, 10.038, 0.915, 0.217, 3.327, 5.602, 0.262, 2.678, 1.589, 6.671, 1.512, 2.136, 5.043, 2.364, 3.492, 4.102, 0.745, 0.01, 2.956, 3.613, 3.601, 3.337, 2.349, 0.035, 0.018, 0.282, 0.057, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.058, 0.044, 0.003, 0.004, 0.008, 0.009, 0.002, 0.003, 0.002, 0.002, 0.001, 0.119, 0.035, 0.369, 0.001, 0.002, 0.002, 0.302, 0.004, 0.024, 0.002, 0.002, 0.006, 0.001, 0.007, 0.006, 0.003, 0.005, 0.009, 0.024, 0.001, 0.003, 0.073, 3.336, 0.013, 0.002, 0.299, 0.044, 0.019, 0.052, 0.004, 0.017, 0.001, 0.011, 0.001, 0.006, 0.001, 0.004, 0.019, 0.004, 0.042, 0.006, 0.01, 0.008, 0.063, 0.001, 0.053, 0.001, 0.006, 0.009, 0.008, 0.006, 0.098, 0.001, 0.0001, 0.0001, 0.118, 3.226, 0.711, 1.0, 0.0001, 0.004, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.008, 0.003, 0.027, 0.008, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.008, 0.055, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.098, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.879, 0.044, 0.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.198, 0.211, 0.0001, 0.0001, 0.85, 0.464, 1.499, 0.007, 0.524, 0.5, 0.381, 0.203, 0.246, 0.244, 0.244, 0.191, 0.262, 0.229, 0.082, 0.038, 0.0001, 0.0001, 0.0001, 0.029, 0.0001, 0.282, 0.315, 0.126, 0.106, 0.101, 0.06, 0.092, 0.086, 0.092, 0.093, 0.251, 0.348, 0.227, 0.266, 0.057, 0.128, 0.0001, 0.081, 0.346, 0.343, 0.013, 0.053, 0.416, 0.005, 0.029, 0.062, 0.002, 0.0001, 0.002, 0.0001, 0.015, 0.0001, 5.706, 1.515, 0.218, 1.433, 4.537, 0.262, 2.208, 0.762, 2.069, 0.092, 2.86, 1.7, 1.242, 5.365, 3.328, 0.599, 0.022, 1.81, 1.981, 3.619, 0.984, 0.189, 0.434, 0.086, 1.565, 0.929, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.004, 0.029, 0.0001, 0.015, 0.0001, 0.0001, 0.007, 0.004, 0.002, 0.007, 0.016, 0.004, 0.004, 0.022, 0.015, 0.018, 0.0001, 0.004, 0.007, 0.022, 0.0001, 0.009, 0.004, 0.0001, 0.005, 0.0001, 0.016, 0.002, 0.0001, 0.002, 0.059, 0.007, 0.009, 1.785, 0.013, 1.12, 0.007, 0.002, 0.044, 0.027, 0.112, 1.609, 0.647, 0.002, 0.026, 3.804, 0.577, 0.007, 0.004, 0.0001, 0.022, 0.564, 0.0001, 1.689, 0.002, 0.005, 0.046, 0.002, 0.403, 0.176, 0.0001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 12.759, 0.005, 0.07, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.011, 0.007, 0.0001, 0.0001, 0.015, 0.004, 0.002, 0.0001, 0.002, 0.002, 0.004, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.387, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.061, 0.002, 0.275, 0.0001, 0.001, 0.015, 0.001, 0.014, 0.187, 0.187, 0.0001, 0.002, 0.95, 0.147, 1.223, 0.02, 0.376, 0.495, 0.321, 0.161, 0.177, 0.142, 0.127, 0.123, 0.133, 0.217, 0.047, 0.016, 0.003, 0.003, 0.003, 0.002, 0.0001, 0.169, 0.152, 0.152, 0.124, 0.074, 0.068, 0.115, 0.09, 0.132, 0.082, 0.135, 0.104, 0.207, 0.208, 0.116, 0.297, 0.005, 0.117, 0.252, 0.137, 0.082, 0.102, 0.023, 0.008, 0.009, 0.058, 0.012, 0.0001, 0.012, 0.0001, 0.003, 0.0001, 8.404, 0.811, 0.782, 2.282, 6.596, 0.226, 1.221, 0.511, 7.186, 3.593, 2.512, 2.698, 2.143, 5.119, 6.434, 1.798, 0.011, 3.759, 3.618, 2.964, 3.066, 2.297, 0.032, 0.02, 0.068, 1.245, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.106, 0.072, 0.05, 0.059, 0.003, 0.006, 0.013, 0.266, 0.014, 0.001, 0.001, 0.001, 0.012, 0.537, 0.001, 0.001, 0.005, 0.13, 0.005, 0.01, 0.006, 0.001, 0.001, 0.002, 0.039, 0.019, 0.011, 0.012, 0.016, 0.006, 0.015, 0.006, 0.037, 0.532, 0.005, 0.005, 0.003, 0.001, 0.001, 0.002, 0.003, 0.013, 0.001, 0.004, 0.001, 0.013, 0.001, 0.001, 0.155, 0.023, 0.063, 0.029, 0.039, 0.108, 0.009, 0.019, 0.119, 0.002, 0.045, 0.036, 0.04, 0.092, 0.525, 0.041, 0.0001, 0.0001, 0.038, 0.074, 0.943, 0.945, 0.0001, 0.0001, 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.013, 0.006, 0.916, 0.332, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.045, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "si": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.314, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.928, 0.001, 0.061, 0.001, 0.001, 0.005, 0.0001, 0.009, 0.059, 0.059, 0.0001, 0.001, 0.185, 0.034, 0.404, 0.009, 0.086, 0.094, 0.056, 0.028, 0.026, 0.03, 0.026, 0.025, 0.029, 0.049, 0.012, 0.004, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.015, 0.008, 0.015, 0.008, 0.007, 0.006, 0.005, 0.007, 0.015, 0.002, 0.003, 0.006, 0.01, 0.006, 0.006, 0.01, 0.001, 0.006, 0.015, 0.013, 0.004, 0.004, 0.005, 0.001, 0.001, 0.001, 0.005, 0.0001, 0.005, 0.0001, 0.003, 0.0001, 0.173, 0.028, 0.067, 0.071, 0.23, 0.039, 0.038, 0.081, 0.157, 0.003, 0.016, 0.086, 0.051, 0.142, 0.142, 0.042, 0.002, 0.132, 0.124, 0.159, 0.054, 0.019, 0.027, 0.007, 0.032, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 2.252, 0.201, 0.275, 1.149, 0.707, 0.497, 0.106, 0.13, 0.003, 0.08, 2.719, 0.062, 0.013, 0.472, 0.0001, 1.466, 0.446, 0.166, 2.231, 0.489, 1.129, 0.007, 0.144, 0.0001, 0.039, 0.612, 2.039, 0.034, 0.759, 0.19, 0.015, 0.026, 0.094, 0.008, 0.192, 0.001, 0.005, 0.01, 0.001, 0.537, 0.012, 0.162, 0.001, 0.275, 0.003, 1.26, 0.067, 0.843, 0.165, 1.921, 0.001, 0.089, 0.809, 0.008, 15.577, 14.437, 1.305, 0.017, 1.681, 1.481, 0.0001, 0.796, 0.0001, 0.001, 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 29.588, 0.0001, 0.504, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sm": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.213, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 19.463, 0.008, 0.168, 0.0001, 0.003, 0.014, 0.002, 0.885, 0.148, 0.148, 0.0001, 0.001, 1.0, 0.173, 0.914, 0.009, 0.254, 0.312, 0.179, 0.14, 0.095, 0.115, 0.095, 0.086, 0.112, 0.168, 0.033, 0.027, 0.006, 0.002, 0.006, 0.005, 0.0001, 0.462, 0.087, 0.119, 0.039, 0.23, 0.233, 0.074, 0.06, 0.345, 0.031, 0.147, 0.149, 0.348, 0.135, 0.431, 0.236, 0.003, 0.115, 0.459, 0.28, 0.072, 0.088, 0.128, 0.02, 0.007, 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 15.436, 0.147, 0.251, 0.268, 7.552, 1.798, 1.939, 0.261, 7.65, 0.014, 0.507, 6.117, 2.84, 3.141, 6.14, 1.094, 0.011, 1.189, 2.656, 4.384, 4.707, 0.608, 0.084, 0.018, 0.145, 0.038, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.05, 0.151, 0.0001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.003, 0.002, 0.017, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.02, 0.001, 0.001, 0.0001, 0.001, 0.039, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.011, 0.001, 0.001, 0.001, 0.001, 0.001, 0.006, 0.001, 0.028, 0.001, 0.004, 0.001, 0.001, 0.003, 0.003, 0.001, 0.003, 0.002, 0.002, 0.0001, 0.001, 0.002, 0.001, 0.002, 0.086, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.033, 0.176, 0.042, 0.0001, 0.0001, 0.0001, 0.001, 0.085, 0.001, 0.0001, 0.0001, 0.007, 0.0001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.046, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.427, 0.001, 0.194, 0.0001, 0.001, 0.007, 0.003, 0.024, 0.281, 0.281, 0.0001, 0.005, 0.597, 0.124, 0.956, 0.038, 0.114, 0.113, 0.073, 0.04, 0.036, 0.036, 0.026, 0.025, 0.034, 0.053, 0.08, 0.124, 0.002, 0.009, 0.002, 0.006, 0.0001, 0.169, 0.097, 0.234, 0.083, 0.107, 0.043, 0.1, 0.097, 0.095, 0.037, 0.196, 0.037, 0.454, 0.178, 0.024, 0.119, 0.003, 0.094, 0.231, 0.097, 0.036, 0.089, 0.031, 0.003, 0.009, 0.113, 0.039, 0.0001, 0.038, 0.0001, 0.002, 0.0001, 12.237, 1.335, 1.505, 2.374, 5.54, 0.412, 1.524, 3.199, 8.126, 0.115, 3.86, 0.667, 3.205, 6.578, 4.667, 1.202, 0.019, 4.537, 2.41, 2.721, 5.562, 2.325, 2.211, 0.043, 1.41, 2.325, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.012, 0.003, 0.001, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.017, 0.001, 0.004, 0.001, 0.004, 0.0001, 0.001, 0.001, 0.01, 0.005, 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.016, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.009, 0.004, 0.001, 0.001, 0.001, 0.001, 0.003, 0.003, 0.003, 0.004, 0.008, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.004, 0.002, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.011, 0.016, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.037, 0.008, 0.027, 0.001, 0.001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "so": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.235, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.454, 0.003, 0.106, 0.0001, 0.001, 0.01, 0.006, 0.044, 0.175, 0.179, 0.001, 0.006, 0.698, 0.181, 0.663, 0.023, 0.173, 0.237, 0.118, 0.074, 0.068, 0.076, 0.069, 0.062, 0.061, 0.116, 0.103, 0.039, 0.006, 0.095, 0.008, 0.006, 0.001, 0.277, 0.176, 0.197, 0.21, 0.058, 0.067, 0.135, 0.123, 0.156, 0.069, 0.122, 0.08, 0.279, 0.092, 0.046, 0.025, 0.078, 0.077, 0.341, 0.096, 0.053, 0.009, 0.145, 0.085, 0.037, 0.009, 0.058, 0.001, 0.058, 0.0001, 0.009, 0.001, 20.28, 1.752, 0.781, 4.408, 3.807, 0.467, 1.801, 2.804, 6.156, 0.344, 2.692, 2.981, 1.937, 3.517, 5.007, 0.065, 0.666, 2.59, 2.645, 1.488, 3.47, 0.033, 1.517, 1.277, 3.257, 0.024, 0.006, 0.007, 0.006, 0.0001, 0.0001, 0.044, 0.021, 0.016, 0.015, 0.092, 0.046, 0.041, 0.026, 0.037, 0.007, 0.048, 0.005, 0.002, 0.004, 0.027, 0.011, 0.01, 0.009, 0.012, 0.004, 0.002, 0.001, 0.001, 0.002, 0.003, 0.016, 0.0001, 0.0001, 0.009, 0.011, 0.002, 0.005, 0.026, 0.005, 0.004, 0.02, 0.008, 0.009, 0.004, 0.102, 0.029, 0.015, 0.023, 0.008, 0.009, 0.018, 0.009, 0.021, 0.011, 0.034, 0.006, 0.02, 0.009, 0.011, 0.006, 0.006, 0.005, 0.024, 0.019, 0.018, 0.004, 0.003, 0.001, 0.004, 0.0001, 0.0001, 0.03, 0.015, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.36, 0.404, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.045, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.034, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sq": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.871, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.83, 0.005, 0.212, 0.0001, 0.001, 0.008, 0.002, 0.025, 0.142, 0.143, 0.001, 0.002, 0.876, 0.197, 0.817, 0.021, 0.247, 0.322, 0.187, 0.096, 0.094, 0.095, 0.084, 0.083, 0.096, 0.185, 0.067, 0.019, 0.003, 0.004, 0.003, 0.004, 0.0001, 0.232, 0.164, 0.084, 0.121, 0.088, 0.104, 0.113, 0.084, 0.118, 0.051, 0.274, 0.113, 0.216, 0.178, 0.042, 0.229, 0.027, 0.103, 0.291, 0.126, 0.044, 0.092, 0.017, 0.024, 0.009, 0.037, 0.024, 0.0001, 0.024, 0.0001, 0.005, 0.001, 5.42, 0.732, 0.432, 2.174, 7.144, 0.635, 1.01, 2.972, 6.09, 2.066, 2.05, 2.101, 2.386, 4.875, 2.895, 1.724, 0.557, 5.177, 3.826, 5.956, 2.462, 1.012, 0.037, 0.057, 0.423, 0.487, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.107, 0.006, 0.004, 0.005, 0.003, 0.002, 0.002, 0.017, 0.002, 0.002, 0.001, 0.01, 0.001, 0.002, 0.002, 0.001, 0.001, 0.008, 0.001, 0.019, 0.002, 0.001, 0.001, 0.001, 0.003, 0.015, 0.001, 0.001, 0.032, 0.031, 0.002, 0.003, 0.048, 0.005, 0.005, 0.002, 0.005, 0.002, 0.002, 0.098, 0.005, 0.011, 0.001, 5.762, 0.002, 0.004, 0.002, 0.002, 0.006, 0.006, 0.012, 0.004, 0.005, 0.003, 0.003, 0.002, 0.003, 0.003, 0.003, 0.004, 0.006, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.063, 5.926, 0.008, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.023, 0.009, 0.015, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.007, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.106, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "srn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.777, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.537, 0.004, 0.236, 0.0001, 0.0001, 0.009, 0.0001, 0.081, 0.222, 0.175, 0.0001, 0.0001, 0.673, 0.268, 1.397, 0.005, 0.412, 0.368, 0.15, 0.085, 0.102, 0.103, 0.102, 0.071, 0.07, 0.14, 0.041, 0.016, 0.015, 0.002, 0.015, 0.0001, 0.0001, 0.384, 0.184, 0.068, 0.478, 0.061, 0.057, 0.098, 0.039, 0.172, 0.08, 0.05, 0.052, 0.288, 0.1, 0.075, 0.116, 0.004, 0.117, 0.271, 0.146, 0.008, 0.023, 0.047, 0.004, 0.014, 0.007, 0.005, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 8.95, 2.176, 0.221, 2.431, 7.818, 1.651, 1.874, 0.226, 8.782, 0.064, 2.479, 1.698, 2.095, 8.318, 4.117, 1.376, 0.003, 4.52, 3.577, 2.919, 3.347, 0.156, 1.329, 0.018, 1.038, 0.054, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.042, 0.007, 0.007, 0.002, 0.003, 0.002, 0.003, 0.006, 0.003, 0.001, 0.002, 0.001, 0.006, 0.003, 0.002, 0.005, 0.004, 0.002, 0.001, 0.035, 0.002, 0.002, 0.002, 0.006, 0.002, 0.002, 0.002, 0.002, 0.002, 0.007, 0.002, 0.002, 0.024, 0.012, 0.002, 0.005, 0.004, 0.007, 0.002, 0.002, 0.012, 0.012, 0.006, 0.009, 0.002, 0.021, 0.005, 0.003, 0.003, 0.003, 0.034, 0.007, 0.002, 0.002, 0.002, 0.0001, 0.005, 0.007, 0.019, 0.009, 0.005, 0.003, 0.004, 0.012, 0.0001, 0.0001, 0.029, 0.098, 0.021, 0.025, 0.002, 0.002, 0.002, 0.005, 0.001, 0.003, 0.0001, 0.0001, 0.01, 0.004, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.053, 0.0001, 0.0001, 0.016, 0.016, 0.0001, 0.01, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ss": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.873, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.454, 0.015, 0.301, 0.001, 0.003, 0.01, 0.003, 0.035, 0.203, 0.202, 0.001, 0.0001, 0.685, 0.328, 0.962, 0.019, 0.22, 0.221, 0.137, 0.048, 0.066, 0.07, 0.054, 0.061, 0.082, 0.144, 0.105, 0.052, 0.007, 0.003, 0.008, 0.003, 0.0001, 0.231, 0.18, 0.097, 0.094, 0.111, 0.055, 0.072, 0.058, 0.259, 0.082, 0.196, 0.342, 0.348, 0.356, 0.028, 0.088, 0.003, 0.097, 0.319, 0.164, 0.113, 0.024, 0.061, 0.025, 0.043, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 10.793, 2.656, 0.706, 1.31, 8.505, 1.004, 2.081, 2.919, 7.091, 0.258, 4.271, 5.701, 2.568, 6.606, 3.595, 0.825, 0.028, 0.782, 3.437, 3.569, 4.546, 0.696, 2.323, 0.017, 1.567, 0.734, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.037, 0.016, 0.007, 0.01, 0.014, 0.008, 0.007, 0.004, 0.009, 0.007, 0.013, 0.004, 0.003, 0.014, 0.015, 0.004, 0.003, 0.006, 0.003, 0.008, 0.006, 0.002, 0.007, 0.004, 0.002, 0.004, 0.007, 0.002, 0.01, 0.003, 0.007, 0.003, 0.09, 0.039, 0.013, 0.006, 0.01, 0.005, 0.005, 0.023, 0.007, 0.024, 0.007, 0.009, 0.005, 0.109, 0.006, 0.007, 0.018, 0.014, 0.009, 0.035, 0.024, 0.01, 0.007, 0.005, 0.015, 0.006, 0.031, 0.01, 0.005, 0.01, 0.008, 0.005, 0.0001, 0.0001, 0.085, 0.273, 0.013, 0.008, 0.0001, 0.0001, 0.0001, 0.005, 0.001, 0.002, 0.002, 0.0001, 0.003, 0.002, 0.061, 0.022, 0.001, 0.0001, 0.0001, 0.003, 0.002, 0.003, 0.059, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.042, 0.021, 0.034, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "st": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.411, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.42, 0.002, 0.079, 0.0001, 0.001, 0.016, 0.003, 0.083, 0.165, 0.167, 0.001, 0.001, 0.789, 0.143, 0.973, 0.021, 0.355, 0.325, 0.221, 0.104, 0.116, 0.113, 0.108, 0.098, 0.108, 0.15, 0.061, 0.016, 0.007, 0.005, 0.006, 0.001, 0.0001, 0.408, 0.587, 0.149, 0.148, 0.115, 0.088, 0.067, 0.172, 0.071, 0.055, 0.339, 0.212, 0.509, 0.175, 0.046, 0.141, 0.01, 0.115, 0.317, 0.165, 0.126, 0.071, 0.047, 0.0001, 0.019, 0.026, 0.011, 0.0001, 0.01, 0.0001, 0.005, 0.0001, 12.26, 2.144, 0.403, 1.165, 9.234, 0.827, 1.837, 3.801, 3.704, 0.349, 2.878, 4.66, 2.188, 4.177, 7.024, 1.54, 0.085, 2.344, 4.067, 4.22, 1.114, 0.282, 1.372, 0.049, 0.996, 0.173, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.013, 0.01, 0.009, 0.0001, 0.005, 0.007, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.013, 0.003, 0.001, 0.009, 0.001, 0.001, 0.004, 0.005, 0.0001, 0.0001, 0.002, 0.001, 0.01, 0.006, 0.004, 0.004, 0.003, 0.0001, 0.0001, 0.049, 0.052, 0.003, 0.003, 0.006, 0.002, 0.001, 0.006, 0.002, 0.022, 0.037, 0.001, 0.003, 0.01, 0.0001, 0.001, 0.004, 0.002, 0.001, 0.03, 0.056, 0.001, 0.001, 0.001, 0.004, 0.001, 0.002, 0.007, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.046, 0.167, 0.019, 0.086, 0.0001, 0.003, 0.001, 0.01, 0.001, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.008, 0.013, 0.0001, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "stq": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.516, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.229, 0.003, 0.416, 0.007, 0.001, 0.015, 0.001, 0.047, 0.208, 0.207, 0.008, 0.003, 0.814, 0.425, 1.065, 0.021, 0.376, 0.623, 0.234, 0.148, 0.183, 0.183, 0.241, 0.167, 0.231, 0.214, 0.089, 0.019, 0.072, 0.007, 0.069, 0.006, 0.0001, 0.293, 0.408, 0.089, 0.454, 0.155, 0.334, 0.214, 0.273, 0.205, 0.248, 0.241, 0.264, 0.372, 0.199, 0.14, 0.214, 0.005, 0.245, 0.798, 0.226, 0.158, 0.049, 0.246, 0.003, 0.006, 0.016, 0.02, 0.0001, 0.02, 0.0001, 0.001, 0.0001, 3.929, 0.935, 0.799, 3.858, 10.176, 1.298, 1.131, 1.308, 4.615, 0.883, 2.156, 2.674, 1.358, 6.685, 4.841, 0.816, 0.012, 4.246, 3.53, 4.621, 4.666, 0.159, 1.055, 0.042, 0.141, 0.124, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.049, 0.004, 0.003, 0.001, 0.07, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.004, 0.002, 0.001, 0.003, 0.001, 0.009, 0.014, 0.001, 0.002, 0.008, 0.004, 0.005, 0.004, 0.021, 0.009, 0.015, 0.001, 2.394, 0.001, 0.001, 0.002, 0.004, 0.014, 0.003, 0.002, 0.001, 0.007, 0.002, 0.002, 0.004, 0.002, 0.026, 0.006, 0.003, 0.001, 0.134, 0.001, 0.003, 0.002, 0.004, 0.004, 0.245, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.038, 2.918, 0.006, 0.011, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.002, 0.001, 0.0001, 0.013, 0.006, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.048, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "su": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.293, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.195, 0.001, 0.272, 0.0001, 0.001, 0.006, 0.001, 0.02, 0.129, 0.129, 0.0001, 0.002, 1.05, 0.168, 1.046, 0.037, 0.48, 0.412, 0.411, 0.202, 0.173, 0.175, 0.161, 0.145, 0.144, 0.197, 0.036, 0.015, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.394, 0.22, 0.151, 0.149, 0.042, 0.047, 0.094, 0.073, 0.227, 0.16, 0.402, 0.071, 0.278, 0.12, 0.097, 0.305, 0.014, 0.09, 0.368, 0.175, 0.05, 0.031, 0.057, 0.016, 0.027, 0.009, 0.008, 0.0001, 0.008, 0.0001, 0.005, 0.0001, 13.373, 1.612, 0.819, 2.725, 4.093, 0.314, 2.685, 1.583, 5.788, 0.997, 2.729, 2.341, 2.09, 7.706, 2.801, 1.889, 0.016, 3.889, 3.272, 4.14, 4.781, 0.134, 0.635, 0.029, 0.708, 0.032, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.025, 0.005, 0.003, 0.004, 0.006, 0.004, 0.004, 0.002, 0.004, 0.073, 0.003, 0.001, 0.001, 0.004, 0.007, 0.003, 0.003, 0.002, 0.003, 0.007, 0.008, 0.001, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.004, 0.004, 0.001, 0.001, 0.047, 0.002, 0.001, 0.002, 0.004, 0.002, 0.002, 0.006, 0.003, 2.276, 0.003, 0.002, 0.001, 0.002, 0.007, 0.002, 0.004, 0.005, 0.002, 0.002, 0.001, 0.001, 0.002, 0.001, 0.002, 0.003, 0.002, 0.001, 0.002, 0.033, 0.001, 0.033, 0.0001, 0.0001, 0.051, 2.355, 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.007, 0.025, 0.004, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.032, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "sw": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.454, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.93, 0.002, 0.217, 0.002, 0.001, 0.01, 0.003, 0.027, 0.171, 0.171, 0.001, 0.001, 0.703, 0.109, 0.942, 0.015, 0.41, 0.383, 0.266, 0.126, 0.108, 0.126, 0.108, 0.107, 0.119, 0.201, 0.062, 0.024, 0.003, 0.004, 0.003, 0.003, 0.0001, 0.226, 0.167, 0.122, 0.086, 0.058, 0.057, 0.065, 0.116, 0.13, 0.09, 0.638, 0.08, 0.504, 0.137, 0.044, 0.113, 0.006, 0.074, 0.173, 0.147, 0.165, 0.059, 0.218, 0.013, 0.04, 0.023, 0.04, 0.0001, 0.04, 0.001, 0.001, 0.001, 16.478, 1.326, 0.611, 1.343, 3.374, 0.678, 1.131, 2.383, 9.629, 0.827, 4.598, 2.609, 3.253, 5.284, 3.187, 0.805, 0.008, 1.616, 2.094, 2.468, 4.443, 0.427, 3.161, 0.026, 2.095, 1.273, 0.001, 0.006, 0.001, 0.0001, 0.0001, 0.04, 0.005, 0.004, 0.002, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.013, 0.002, 0.001, 0.001, 0.001, 0.002, 0.006, 0.001, 0.001, 0.009, 0.008, 0.001, 0.004, 0.009, 0.003, 0.002, 0.002, 0.003, 0.001, 0.001, 0.005, 0.003, 0.009, 0.001, 0.002, 0.001, 0.002, 0.001, 0.002, 0.005, 0.009, 0.009, 0.004, 0.002, 0.003, 0.004, 0.001, 0.004, 0.003, 0.003, 0.003, 0.006, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.018, 0.029, 0.009, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.014, 0.007, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.005, 0.012, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.038, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "szl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.884, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.63, 0.002, 0.452, 0.0001, 0.0001, 0.012, 0.001, 0.026, 0.296, 0.296, 0.001, 0.001, 1.094, 0.318, 1.181, 0.015, 0.332, 0.469, 0.289, 0.138, 0.131, 0.151, 0.118, 0.131, 0.157, 0.273, 0.087, 0.014, 0.006, 0.003, 0.006, 0.0001, 0.0001, 0.207, 0.209, 0.155, 0.118, 0.048, 0.111, 0.139, 0.08, 0.122, 0.125, 0.213, 0.123, 0.287, 0.122, 0.062, 0.309, 0.005, 0.156, 0.329, 0.126, 0.154, 0.05, 0.233, 0.034, 0.017, 0.083, 0.004, 0.0001, 0.004, 0.0001, 0.006, 0.001, 5.741, 0.894, 2.016, 2.128, 5.35, 0.327, 1.279, 0.968, 3.438, 2.841, 2.633, 2.099, 2.293, 3.364, 5.857, 1.423, 0.012, 3.389, 2.85, 2.58, 2.277, 0.102, 3.144, 0.017, 3.623, 2.205, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.191, 0.035, 0.624, 0.044, 0.945, 0.014, 0.009, 0.333, 0.008, 0.003, 0.006, 0.005, 0.012, 0.221, 0.005, 0.196, 0.006, 0.005, 0.003, 0.168, 0.01, 0.003, 0.005, 0.005, 0.005, 0.109, 0.059, 0.562, 0.005, 0.005, 0.004, 0.006, 0.062, 0.111, 0.006, 0.016, 0.01, 0.004, 0.004, 0.012, 0.011, 0.03, 0.005, 0.012, 0.003, 0.012, 0.008, 1.67, 0.032, 0.015, 0.058, 0.035, 0.048, 0.018, 0.012, 0.004, 0.02, 0.013, 0.335, 0.026, 0.282, 0.022, 0.098, 0.006, 0.0001, 0.0001, 0.109, 0.208, 0.455, 5.073, 0.0001, 0.001, 0.0001, 0.008, 0.003, 0.003, 0.004, 0.0001, 0.015, 0.008, 0.161, 0.06, 0.003, 0.002, 0.0001, 0.003, 0.001, 0.009, 0.025, 0.019, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.011, 0.01, 0.176, 0.006, 0.001, 0.005, 0.003, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ta": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.357, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.862, 0.001, 0.077, 0.0001, 0.001, 0.006, 0.001, 0.007, 0.055, 0.056, 0.0001, 0.001, 0.234, 0.03, 0.384, 0.005, 0.084, 0.106, 0.063, 0.029, 0.028, 0.034, 0.027, 0.032, 0.031, 0.052, 0.017, 0.006, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.008, 0.004, 0.008, 0.004, 0.004, 0.003, 0.005, 0.004, 0.006, 0.002, 0.003, 0.003, 0.005, 0.004, 0.003, 0.008, 0.0001, 0.004, 0.008, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.006, 0.0001, 0.006, 0.0001, 0.002, 0.0001, 0.062, 0.006, 0.017, 0.014, 0.042, 0.007, 0.009, 0.018, 0.038, 0.001, 0.006, 0.024, 0.018, 0.035, 0.032, 0.011, 0.001, 0.036, 0.022, 0.032, 0.017, 0.005, 0.004, 0.002, 0.01, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.122, 2.149, 0.144, 0.01, 0.0001, 0.297, 0.436, 0.597, 0.764, 0.136, 0.24, 0.226, 0.005, 5.298, 0.158, 0.027, 0.013, 0.0001, 0.078, 0.014, 0.0001, 2.36, 0.0001, 0.0001, 0.001, 0.171, 0.627, 0.0001, 0.037, 0.002, 0.021, 1.319, 0.014, 0.0001, 0.001, 0.32, 2.012, 0.001, 0.001, 0.0001, 0.539, 0.989, 1.521, 0.0001, 0.0001, 0.001, 23.215, 10.185, 1.322, 0.801, 1.028, 0.757, 0.189, 0.942, 0.0001, 0.015, 0.06, 0.015, 0.0001, 0.0001, 0.0001, 0.0001, 1.18, 2.177, 0.0001, 0.0001, 0.016, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 31.245, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tcy": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.391, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.751, 0.001, 0.026, 0.0001, 0.0001, 0.002, 0.0001, 0.028, 0.048, 0.047, 0.0001, 0.001, 0.244, 0.028, 0.533, 0.012, 0.014, 0.02, 0.01, 0.005, 0.005, 0.007, 0.006, 0.004, 0.008, 0.009, 0.009, 0.003, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 0.001, 0.001, 0.02, 0.002, 0.008, 0.006, 0.018, 0.002, 0.005, 0.006, 0.017, 0.0001, 0.003, 0.009, 0.008, 0.014, 0.015, 0.008, 0.0001, 0.013, 0.012, 0.015, 0.006, 0.002, 0.005, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.354, 1.789, 1.221, 0.031, 0.0001, 0.268, 1.686, 0.484, 0.152, 0.21, 0.745, 0.196, 0.087, 4.125, 0.064, 0.014, 0.014, 0.0001, 0.109, 0.011, 0.001, 1.28, 0.033, 0.613, 0.012, 0.007, 0.23, 0.003, 0.404, 0.002, 0.011, 0.433, 0.058, 1.007, 0.002, 0.198, 1.312, 0.064, 1.397, 0.124, 1.439, 0.012, 1.248, 0.035, 0.624, 0.105, 0.769, 0.62, 1.755, 0.0001, 22.872, 9.408, 0.0001, 0.629, 0.164, 0.121, 0.665, 0.124, 0.0001, 0.0001, 0.003, 0.0001, 1.377, 1.63, 0.0001, 0.0001, 0.05, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.955, 0.0001, 0.194, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "te": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.34, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.746, 0.003, 0.051, 0.0001, 0.001, 0.003, 0.002, 0.007, 0.042, 0.043, 0.0001, 0.001, 0.336, 0.028, 0.611, 0.018, 0.129, 0.152, 0.069, 0.038, 0.034, 0.073, 0.03, 0.032, 0.034, 0.047, 0.02, 0.007, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.008, 0.004, 0.006, 0.005, 0.003, 0.003, 0.002, 0.002, 0.006, 0.001, 0.002, 0.003, 0.005, 0.003, 0.002, 0.005, 0.0001, 0.003, 0.008, 0.005, 0.003, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.006, 0.0001, 0.007, 0.0001, 0.005, 0.0001, 0.053, 0.008, 0.019, 0.022, 0.056, 0.009, 0.01, 0.021, 0.046, 0.001, 0.004, 0.022, 0.015, 0.038, 0.038, 0.014, 0.0001, 0.036, 0.036, 0.045, 0.017, 0.006, 0.006, 0.002, 0.007, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.485, 1.801, 1.898, 0.051, 0.0001, 0.236, 0.427, 0.575, 0.238, 0.222, 0.152, 0.685, 0.105, 2.799, 0.055, 0.027, 0.006, 0.0001, 0.047, 0.007, 0.005, 1.329, 0.049, 0.668, 0.014, 0.002, 0.428, 0.004, 0.25, 0.001, 0.004, 0.537, 0.039, 0.598, 0.002, 0.137, 0.864, 0.099, 0.843, 0.149, 1.628, 0.0001, 0.909, 0.085, 0.267, 0.128, 0.942, 0.804, 25.531, 7.165, 1.487, 0.074, 0.0001, 0.877, 0.211, 0.153, 0.855, 0.145, 0.0001, 0.001, 0.0001, 0.0001, 2.169, 2.359, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.736, 0.0001, 0.069, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tet": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.506, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.056, 0.014, 0.345, 0.0001, 0.004, 0.018, 0.001, 0.455, 0.383, 0.382, 0.001, 0.004, 1.067, 0.53, 0.968, 0.029, 0.443, 0.39, 0.316, 0.132, 0.112, 0.137, 0.105, 0.106, 0.119, 0.181, 0.186, 0.018, 0.015, 0.005, 0.015, 0.003, 0.0001, 0.338, 0.226, 0.145, 0.169, 0.132, 0.156, 0.098, 0.111, 0.215, 0.061, 0.136, 0.43, 0.301, 0.181, 0.101, 0.266, 0.01, 0.137, 0.345, 0.37, 0.107, 0.065, 0.041, 0.021, 0.008, 0.014, 0.01, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 11.569, 1.502, 0.408, 2.068, 6.067, 0.587, 0.66, 2.225, 7.509, 0.16, 2.246, 2.814, 2.311, 6.307, 4.401, 1.282, 0.035, 4.022, 4.063, 3.545, 4.826, 0.518, 0.1, 0.064, 0.126, 0.341, 0.0001, 0.009, 0.0001, 0.0001, 0.0001, 0.318, 0.081, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.015, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.275, 0.001, 0.0001, 0.014, 0.013, 0.001, 0.002, 0.021, 0.254, 0.002, 0.025, 0.0001, 0.0001, 0.003, 0.02, 0.002, 0.389, 0.006, 0.001, 0.001, 0.167, 0.001, 0.001, 0.002, 0.048, 0.071, 0.284, 0.01, 0.003, 0.001, 0.0001, 0.001, 0.001, 0.076, 0.003, 0.014, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.1, 1.362, 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.009, 0.011, 0.0001, 0.0001, 0.0001, 0.007, 0.003, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.316, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tg": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.272, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.893, 0.001, 0.026, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.324, 0.326, 0.0001, 0.001, 0.765, 0.105, 0.581, 0.006, 0.139, 0.257, 0.13, 0.073, 0.063, 0.072, 0.065, 0.068, 0.082, 0.185, 0.026, 0.048, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.026, 0.01, 0.018, 0.007, 0.005, 0.01, 0.006, 0.007, 0.018, 0.002, 0.005, 0.008, 0.009, 0.006, 0.004, 0.009, 0.001, 0.007, 0.015, 0.007, 0.003, 0.006, 0.004, 0.006, 0.002, 0.002, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.081, 0.01, 0.03, 0.023, 0.086, 0.012, 0.015, 0.021, 0.065, 0.002, 0.009, 0.037, 0.017, 0.055, 0.061, 0.017, 0.001, 0.07, 0.039, 0.054, 0.023, 0.01, 0.007, 0.003, 0.013, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.968, 1.483, 1.764, 1.455, 0.398, 0.384, 0.008, 0.116, 0.704, 0.002, 0.17, 0.01, 0.024, 0.035, 0.045, 0.663, 0.178, 0.263, 0.119, 0.126, 0.303, 0.007, 0.009, 0.022, 0.136, 0.003, 0.143, 0.343, 0.148, 0.063, 0.071, 0.071, 0.134, 0.159, 0.101, 0.347, 0.121, 0.05, 0.002, 0.026, 0.059, 0.003, 0.003, 0.057, 0.003, 0.035, 0.012, 0.164, 5.899, 1.075, 1.071, 1.816, 2.336, 1.339, 0.082, 0.882, 4.885, 0.258, 1.014, 1.438, 1.445, 2.22, 3.885, 0.208, 0.0001, 0.0001, 0.132, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.001, 30.166, 10.131, 1.965, 0.481, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.016, 0.001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.209, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ti": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.164, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.862, 0.026, 0.05, 0.0001, 0.0001, 0.012, 0.0001, 0.044, 0.1, 0.1, 0.0001, 0.0001, 0.075, 0.114, 0.14, 0.02, 0.098, 0.121, 0.073, 0.033, 0.026, 0.04, 0.027, 0.03, 0.029, 0.042, 0.024, 0.004, 0.001, 0.013, 0.001, 0.007, 0.0001, 0.018, 0.013, 0.015, 0.007, 0.006, 0.007, 0.011, 0.013, 0.022, 0.004, 0.004, 0.024, 0.018, 0.012, 0.005, 0.015, 0.004, 0.01, 0.013, 0.022, 0.007, 0.009, 0.006, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.329, 0.063, 0.099, 0.16, 0.451, 0.14, 0.111, 0.211, 0.297, 0.027, 0.053, 0.155, 0.097, 0.283, 0.275, 0.071, 0.007, 0.228, 0.261, 0.255, 0.122, 0.059, 0.08, 0.007, 0.069, 0.014, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.358, 0.069, 0.074, 0.236, 0.007, 0.331, 0.023, 0.001, 9.303, 5.576, 6.47, 5.805, 1.549, 3.066, 0.251, 0.003, 0.505, 0.172, 0.135, 1.034, 0.015, 2.293, 0.054, 0.001, 0.75, 0.233, 0.32, 0.51, 0.12, 1.725, 0.08, 0.002, 0.83, 0.546, 0.753, 1.425, 0.111, 2.053, 0.138, 0.011, 0.764, 0.373, 0.244, 0.731, 0.034, 1.854, 0.258, 0.004, 1.053, 0.166, 0.551, 0.69, 0.031, 2.007, 0.179, 0.005, 0.189, 0.048, 0.045, 0.156, 0.011, 0.447, 0.067, 0.002, 0.0001, 0.0001, 0.386, 0.04, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.027, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.008, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 27.967, 0.209, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tk": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.842, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.847, 0.005, 0.052, 0.0001, 0.001, 0.008, 0.001, 0.006, 0.121, 0.125, 0.004, 0.002, 0.691, 0.455, 1.024, 0.011, 0.191, 0.306, 0.153, 0.096, 0.091, 0.095, 0.077, 0.079, 0.095, 0.155, 0.055, 0.012, 0.028, 0.003, 0.028, 0.005, 0.0001, 0.227, 0.204, 0.012, 0.086, 0.083, 0.04, 0.177, 0.112, 0.174, 0.027, 0.109, 0.037, 0.173, 0.054, 0.141, 0.071, 0.001, 0.074, 0.173, 0.153, 0.029, 0.028, 0.04, 0.045, 0.029, 0.016, 0.01, 0.0001, 0.01, 0.001, 0.003, 0.0001, 8.711, 1.574, 0.069, 3.499, 5.666, 0.119, 2.22, 0.895, 5.266, 0.476, 2.165, 5.087, 2.1, 4.83, 1.754, 1.161, 0.002, 5.326, 1.953, 2.216, 1.612, 0.014, 0.863, 0.003, 4.905, 0.889, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.208, 0.022, 0.019, 0.011, 0.017, 0.007, 0.003, 0.027, 1.247, 0.001, 0.0001, 0.008, 0.005, 0.003, 0.002, 0.006, 0.003, 0.005, 0.002, 0.04, 0.02, 0.001, 0.017, 0.002, 0.001, 0.002, 0.001, 0.001, 0.068, 0.139, 0.083, 1.114, 0.015, 0.004, 0.009, 0.002, 0.694, 0.003, 0.003, 0.67, 0.001, 0.002, 0.0001, 0.027, 0.0001, 0.192, 0.001, 0.002, 0.056, 0.114, 0.02, 0.061, 0.013, 0.043, 0.813, 0.006, 0.038, 0.007, 0.016, 0.096, 0.984, 2.385, 0.053, 0.019, 0.0001, 0.0001, 0.268, 5.753, 0.012, 2.464, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.324, 0.111, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.054, 0.182, 0.0001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tl": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.527, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.015, 0.006, 0.416, 0.001, 0.001, 0.006, 0.002, 0.043, 0.2, 0.202, 0.001, 0.002, 0.702, 0.264, 0.789, 0.017, 0.219, 0.272, 0.17, 0.08, 0.075, 0.082, 0.072, 0.075, 0.087, 0.155, 0.061, 0.022, 0.066, 0.004, 0.066, 0.002, 0.0001, 0.555, 0.199, 0.186, 0.134, 0.118, 0.059, 0.112, 0.181, 0.214, 0.066, 0.204, 0.127, 0.268, 0.176, 0.063, 0.292, 0.011, 0.11, 0.398, 0.188, 0.06, 0.045, 0.055, 0.008, 0.035, 0.014, 0.016, 0.0001, 0.015, 0.001, 0.003, 0.0001, 16.44, 1.457, 0.382, 1.246, 2.379, 0.123, 6.741, 1.192, 6.121, 0.033, 2.118, 3.173, 2.569, 9.845, 3.868, 2.142, 0.019, 2.313, 4.125, 3.402, 2.226, 0.121, 0.559, 0.032, 2.131, 0.078, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.038, 0.008, 0.005, 0.004, 0.004, 0.003, 0.002, 0.002, 0.004, 0.002, 0.002, 0.002, 0.003, 0.007, 0.003, 0.002, 0.004, 0.004, 0.002, 0.014, 0.006, 0.001, 0.002, 0.001, 0.002, 0.008, 0.001, 0.002, 0.013, 0.007, 0.002, 0.002, 0.028, 0.01, 0.003, 0.002, 0.004, 0.002, 0.002, 0.004, 0.003, 0.01, 0.002, 0.004, 0.002, 0.008, 0.002, 0.002, 0.005, 0.01, 0.003, 0.007, 0.003, 0.003, 0.002, 0.002, 0.006, 0.003, 0.004, 0.003, 0.005, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.029, 0.045, 0.007, 0.011, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.012, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.008, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.012, 0.037, 0.005, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tn": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.716, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.981, 0.003, 0.08, 0.013, 0.001, 0.009, 0.002, 0.01, 0.075, 0.075, 0.0001, 0.0001, 0.66, 0.106, 0.757, 0.034, 0.2, 0.226, 0.113, 0.036, 0.039, 0.039, 0.04, 0.035, 0.043, 0.09, 0.021, 0.015, 0.01, 0.005, 0.011, 0.004, 0.0001, 0.148, 0.357, 0.071, 0.097, 0.07, 0.054, 0.125, 0.028, 0.051, 0.019, 0.166, 0.104, 0.374, 0.087, 0.085, 0.102, 0.001, 0.088, 0.173, 0.113, 0.019, 0.017, 0.023, 0.006, 0.007, 0.021, 0.023, 0.0001, 0.022, 0.0001, 0.004, 0.0001, 12.488, 2.445, 0.191, 1.643, 9.389, 0.795, 4.171, 1.899, 3.702, 0.312, 2.67, 5.097, 2.631, 4.499, 8.158, 1.075, 0.008, 1.917, 4.118, 4.684, 0.837, 0.048, 2.161, 0.014, 0.955, 0.029, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.034, 0.011, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.036, 0.008, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "to": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.293, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.821, 0.001, 0.44, 0.0001, 0.0001, 0.001, 0.005, 0.111, 0.238, 0.237, 0.002, 0.0001, 0.847, 0.076, 1.066, 0.045, 0.084, 0.141, 0.063, 0.039, 0.037, 0.032, 0.036, 0.05, 0.065, 0.067, 0.09, 0.023, 0.003, 0.011, 0.005, 0.027, 0.0001, 0.126, 0.034, 0.039, 0.011, 0.049, 0.193, 0.01, 0.178, 0.123, 0.01, 0.599, 0.145, 0.204, 0.188, 0.245, 0.136, 0.001, 0.012, 0.185, 0.547, 0.059, 0.124, 0.026, 0.001, 0.005, 0.001, 0.004, 0.0001, 0.005, 0.0001, 0.002, 0.001, 10.579, 0.223, 0.423, 0.627, 6.707, 1.724, 1.525, 3.199, 6.545, 0.014, 3.573, 2.547, 1.814, 3.859, 6.712, 1.277, 0.01, 0.909, 1.504, 3.555, 4.441, 0.529, 0.312, 0.02, 0.255, 0.009, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.028, 0.432, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.082, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.183, 0.003, 0.0001, 0.0001, 0.001, 0.011, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.057, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.002, 0.001, 0.078, 0.0001, 0.015, 0.0001, 0.0001, 0.013, 0.0001, 0.001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 4.517, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.022, 0.094, 0.659, 0.119, 0.0001, 0.0001, 0.0001, 0.0001, 4.513, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tpi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.506, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.422, 0.004, 0.225, 0.0001, 0.0001, 0.006, 0.0001, 0.033, 0.226, 0.227, 0.001, 0.0001, 0.976, 0.07, 1.357, 0.011, 0.339, 0.409, 0.202, 0.102, 0.113, 0.106, 0.09, 0.101, 0.134, 0.258, 0.112, 0.01, 0.016, 0.001, 0.016, 0.001, 0.0001, 0.28, 0.281, 0.358, 0.108, 0.184, 0.096, 0.132, 0.102, 0.251, 0.103, 0.247, 0.515, 0.27, 0.273, 0.17, 0.405, 0.016, 0.129, 0.696, 0.311, 0.02, 0.133, 0.076, 0.006, 0.097, 0.011, 0.006, 0.0001, 0.006, 0.0001, 0.003, 0.0001, 9.267, 1.534, 0.295, 1.028, 5.418, 0.186, 3.091, 0.44, 8.286, 0.1, 1.968, 5.697, 3.075, 7.815, 5.428, 2.623, 0.013, 2.618, 3.22, 3.51, 1.911, 0.537, 0.798, 0.013, 0.388, 0.104, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.026, 0.016, 0.007, 0.003, 0.007, 0.001, 0.002, 0.003, 0.001, 0.001, 0.001, 0.002, 0.006, 0.002, 0.001, 0.001, 0.004, 0.002, 0.001, 0.01, 0.002, 0.002, 0.002, 0.003, 0.001, 0.004, 0.001, 0.005, 0.009, 0.009, 0.003, 0.002, 0.021, 0.037, 0.001, 0.006, 0.0001, 0.001, 0.001, 0.002, 0.002, 0.013, 0.005, 0.003, 0.004, 0.024, 0.002, 0.002, 0.006, 0.026, 0.007, 0.298, 0.002, 0.005, 0.003, 0.003, 0.01, 0.004, 0.011, 0.015, 0.005, 0.005, 0.003, 0.004, 0.0001, 0.0001, 0.019, 0.408, 0.007, 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.02, 0.011, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.012, 0.021, 0.009, 0.003, 0.009, 0.003, 0.001, 0.001, 0.002, 0.004, 0.003, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ts": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.117, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.445, 0.004, 0.183, 0.0001, 0.0001, 0.006, 0.001, 0.136, 0.107, 0.107, 0.0001, 0.0001, 0.868, 0.158, 0.838, 0.021, 0.152, 0.161, 0.081, 0.037, 0.038, 0.052, 0.045, 0.043, 0.056, 0.092, 0.041, 0.025, 0.03, 0.001, 0.03, 0.006, 0.0001, 0.18, 0.088, 0.068, 0.084, 0.075, 0.029, 0.061, 0.137, 0.055, 0.032, 0.132, 0.116, 0.387, 0.232, 0.02, 0.062, 0.002, 0.075, 0.171, 0.121, 0.04, 0.219, 0.021, 0.119, 0.045, 0.021, 0.003, 0.0001, 0.003, 0.0001, 0.002, 0.005, 13.463, 1.384, 0.275, 1.092, 4.958, 0.572, 1.347, 3.614, 7.958, 0.047, 4.285, 4.291, 2.768, 5.921, 3.615, 0.489, 0.025, 2.056, 2.585, 2.874, 4.929, 1.994, 3.082, 0.68, 2.172, 0.64, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.055, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.005, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.031, 0.0001, 0.001, 0.008, 0.008, 0.0001, 0.0001, 0.05, 0.004, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.001, 0.003, 0.0001, 0.002, 0.001, 0.005, 0.002, 0.011, 0.002, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.002, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.051, 0.023, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.018, 0.006, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.054, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tt": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.086, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.219, 0.001, 0.085, 0.0001, 0.0001, 0.04, 0.0001, 0.002, 0.22, 0.221, 0.0001, 0.008, 0.529, 0.164, 0.713, 0.007, 0.223, 0.276, 0.185, 0.093, 0.09, 0.084, 0.067, 0.069, 0.089, 0.159, 0.097, 0.008, 0.002, 0.001, 0.002, 0.003, 0.0001, 0.01, 0.009, 0.017, 0.009, 0.006, 0.003, 0.002, 0.003, 0.017, 0.001, 0.009, 0.003, 0.013, 0.003, 0.003, 0.004, 0.005, 0.005, 0.013, 0.017, 0.009, 0.006, 0.002, 0.01, 0.003, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.245, 0.051, 0.015, 0.059, 0.152, 0.017, 0.027, 0.019, 0.108, 0.002, 0.051, 0.14, 0.059, 0.158, 0.057, 0.025, 0.035, 0.149, 0.073, 0.108, 0.056, 0.01, 0.015, 0.014, 0.048, 0.025, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.852, 1.726, 1.824, 1.398, 0.151, 0.194, 0.076, 0.605, 0.638, 0.004, 0.1, 2.623, 0.236, 0.061, 0.057, 0.479, 0.123, 0.129, 0.053, 0.062, 0.279, 0.075, 0.02, 0.174, 0.096, 1.916, 0.222, 0.025, 0.1, 0.049, 0.069, 0.128, 0.159, 0.146, 0.119, 0.43, 0.164, 0.055, 0.003, 0.065, 0.036, 0.325, 0.0001, 0.038, 0.001, 0.013, 0.042, 0.429, 4.958, 1.044, 0.394, 1.429, 0.959, 3.011, 0.048, 0.384, 1.557, 0.433, 1.901, 3.01, 1.056, 3.108, 1.043, 0.407, 0.0001, 0.0001, 0.106, 0.225, 0.139, 0.034, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.004, 0.0001, 0.003, 0.001, 26.093, 12.748, 1.127, 2.265, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.275, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tum": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.34, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.852, 0.004, 0.573, 0.003, 0.004, 0.004, 0.017, 0.083, 0.308, 0.306, 0.001, 0.0001, 1.303, 0.412, 1.2, 0.024, 0.557, 0.476, 0.366, 0.176, 0.172, 0.213, 0.206, 0.176, 0.165, 0.191, 0.118, 0.025, 0.012, 0.007, 0.012, 0.0001, 0.001, 0.268, 0.377, 0.217, 0.158, 0.11, 0.095, 0.125, 0.123, 0.134, 0.277, 0.29, 0.111, 0.727, 0.21, 0.076, 0.143, 0.01, 0.116, 0.269, 0.294, 0.069, 0.067, 0.069, 0.003, 0.068, 0.042, 0.008, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 10.116, 1.728, 1.817, 1.937, 5.125, 1.225, 1.488, 3.251, 6.548, 0.159, 2.454, 2.854, 2.514, 5.282, 4.292, 2.074, 0.028, 2.715, 2.7, 3.62, 4.127, 0.602, 1.862, 0.051, 1.299, 0.758, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.102, 0.017, 0.014, 0.014, 0.01, 0.006, 0.008, 0.005, 0.003, 0.001, 0.007, 0.006, 0.02, 0.058, 0.017, 0.003, 0.008, 0.005, 0.001, 0.016, 0.005, 0.005, 0.003, 0.004, 0.009, 0.043, 0.004, 0.001, 0.008, 0.005, 0.006, 0.002, 0.103, 0.006, 0.008, 0.007, 0.001, 0.005, 0.009, 0.025, 0.006, 0.01, 0.003, 0.011, 0.006, 0.004, 0.0001, 0.003, 0.016, 0.015, 0.003, 0.014, 0.008, 0.112, 0.003, 0.014, 0.012, 0.008, 0.012, 0.012, 0.008, 0.009, 0.01, 0.003, 0.0001, 0.0001, 0.101, 0.045, 0.006, 0.195, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.003, 0.063, 0.038, 0.001, 0.001, 0.001, 0.006, 0.003, 0.007, 0.053, 0.034, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.016, 0.022, 0.093, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.012, 0.008, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tw": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.984, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.303, 0.001, 0.389, 0.0001, 0.001, 0.0001, 0.004, 0.077, 0.488, 0.486, 0.0001, 0.0001, 0.756, 0.118, 1.791, 0.025, 0.73, 0.614, 0.579, 0.248, 0.221, 0.18, 0.206, 0.176, 0.192, 0.286, 0.065, 0.035, 0.004, 0.0001, 0.004, 0.01, 0.0001, 0.602, 0.283, 0.296, 0.116, 0.311, 0.173, 0.2, 0.1, 0.303, 0.048, 0.367, 0.187, 0.399, 0.306, 0.149, 0.189, 0.019, 0.18, 0.508, 0.305, 0.203, 0.099, 0.096, 0.049, 0.077, 0.01, 0.003, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 8.315, 0.995, 0.605, 1.602, 5.365, 0.628, 0.659, 0.955, 4.58, 0.091, 2.249, 1.426, 1.892, 5.378, 5.608, 0.884, 0.03, 3.156, 2.583, 1.888, 2.004, 0.328, 1.708, 0.075, 2.441, 0.168, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.083, 0.035, 0.035, 0.017, 0.032, 0.015, 0.093, 0.059, 0.023, 0.016, 0.025, 0.022, 0.019, 0.022, 0.029, 0.012, 0.046, 0.013, 0.009, 0.017, 0.855, 0.004, 0.017, 0.017, 0.006, 0.004, 0.012, 1.236, 0.017, 0.012, 0.01, 0.004, 0.081, 0.046, 0.012, 0.012, 0.086, 0.028, 0.017, 0.054, 0.03, 0.075, 0.019, 0.012, 0.016, 0.036, 0.009, 0.019, 0.074, 0.048, 0.057, 0.049, 0.013, 2.039, 0.016, 0.03, 0.109, 0.023, 0.064, 0.039, 0.051, 0.048, 0.068, 0.015, 0.0001, 0.0001, 0.075, 0.196, 0.058, 0.036, 0.106, 0.0001, 0.001, 1.812, 0.004, 0.0001, 0.001, 0.0001, 2.053, 0.006, 0.306, 0.086, 0.0001, 0.0001, 0.0001, 0.012, 0.003, 0.267, 0.158, 0.09, 0.007, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.209, 0.016, 0.044, 0.0001, 0.016, 0.052, 0.016, 0.023, 0.012, 0.003, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ty": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.596, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.482, 0.002, 0.148, 0.0001, 0.0001, 0.0001, 0.001, 0.103, 0.185, 0.187, 0.0001, 0.0001, 0.459, 0.229, 1.457, 0.013, 0.217, 0.354, 0.181, 0.099, 0.109, 0.09, 0.093, 0.094, 0.097, 0.295, 0.032, 0.014, 0.002, 0.001, 0.023, 0.0001, 0.0001, 0.336, 0.259, 0.191, 0.056, 0.549, 0.206, 0.061, 0.142, 0.109, 0.062, 0.031, 0.131, 0.411, 0.099, 0.644, 0.477, 0.008, 0.194, 0.401, 0.951, 0.146, 0.18, 0.019, 0.004, 0.015, 0.007, 0.008, 0.0001, 0.01, 0.0001, 0.003, 0.0001, 9.536, 0.253, 0.42, 0.705, 6.452, 0.803, 0.335, 1.722, 7.016, 0.092, 0.277, 1.311, 1.613, 3.693, 4.012, 0.994, 0.04, 4.455, 1.038, 5.804, 2.543, 0.371, 0.019, 0.027, 0.146, 0.201, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.052, 0.908, 0.007, 0.002, 0.007, 0.001, 0.0001, 0.003, 0.006, 0.001, 0.003, 0.002, 0.002, 1.282, 0.0001, 0.001, 0.007, 0.0001, 0.043, 0.549, 0.01, 0.0001, 0.0001, 0.003, 0.114, 1.916, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.19, 0.144, 0.074, 0.002, 0.002, 0.003, 0.003, 0.022, 0.06, 0.039, 0.051, 0.598, 0.116, 0.035, 0.003, 0.018, 0.003, 0.029, 0.506, 0.059, 0.005, 0.003, 0.0001, 0.001, 0.002, 0.008, 0.013, 0.037, 0.005, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.033, 1.417, 1.711, 1.627, 0.0001, 0.0001, 0.0001, 0.008, 0.01, 0.005, 0.002, 0.001, 0.0001, 0.0001, 0.009, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 2.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "tyv": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.67, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.942, 0.005, 0.141, 0.0001, 0.0001, 0.004, 0.001, 0.003, 0.097, 0.1, 0.0001, 0.001, 0.649, 0.583, 0.64, 0.009, 0.087, 0.151, 0.08, 0.042, 0.04, 0.04, 0.033, 0.032, 0.035, 0.099, 0.046, 0.011, 0.008, 0.002, 0.008, 0.008, 0.0001, 0.007, 0.002, 0.003, 0.002, 0.002, 0.002, 0.001, 0.002, 0.022, 0.0001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.003, 0.003, 0.001, 0.006, 0.002, 0.011, 0.001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.081, 0.005, 0.006, 0.008, 0.025, 0.002, 0.005, 0.006, 0.02, 0.002, 0.007, 0.012, 0.016, 0.015, 0.021, 0.013, 0.003, 0.017, 0.01, 0.014, 0.01, 0.002, 0.004, 0.007, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.263, 0.883, 1.755, 1.893, 0.056, 0.377, 0.045, 1.004, 0.604, 0.005, 0.051, 2.643, 0.086, 0.75, 0.036, 0.173, 0.125, 0.135, 0.03, 0.065, 0.108, 0.011, 0.018, 0.005, 0.038, 0.005, 0.129, 0.036, 0.079, 0.041, 0.11, 0.022, 0.066, 0.107, 0.147, 0.782, 0.015, 0.082, 0.008, 0.088, 0.054, 0.476, 0.001, 0.089, 0.001, 0.039, 0.018, 0.892, 5.51, 0.98, 0.415, 1.888, 1.904, 2.436, 0.478, 0.679, 2.249, 0.486, 1.593, 2.459, 0.684, 3.034, 1.582, 0.744, 0.0001, 0.0001, 0.143, 0.011, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.003, 0.01, 0.001, 0.011, 0.002, 28.453, 13.514, 1.663, 0.515, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.001, 0.094, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "udm": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.306, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.09, 0.004, 0.114, 0.0001, 0.0001, 0.008, 0.0001, 0.002, 0.237, 0.238, 0.002, 0.001, 0.557, 0.317, 0.775, 0.018, 0.183, 0.302, 0.16, 0.086, 0.075, 0.092, 0.071, 0.074, 0.085, 0.189, 0.048, 0.012, 0.017, 0.014, 0.016, 0.001, 0.0001, 0.018, 0.008, 0.012, 0.004, 0.003, 0.003, 0.003, 0.003, 0.016, 0.004, 0.004, 0.006, 0.014, 0.003, 0.019, 0.021, 0.0001, 0.006, 0.011, 0.006, 0.003, 0.006, 0.001, 0.009, 0.001, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.242, 0.027, 0.103, 0.053, 0.195, 0.007, 0.026, 0.039, 0.148, 0.005, 0.015, 0.074, 0.03, 0.111, 0.083, 0.028, 0.002, 0.108, 0.083, 0.059, 0.078, 0.015, 0.004, 0.004, 0.02, 0.008, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 2.622, 2.823, 2.068, 1.727, 0.105, 0.092, 0.121, 0.28, 0.404, 0.054, 0.451, 2.424, 1.272, 0.932, 0.131, 0.626, 0.166, 0.634, 0.123, 0.164, 0.252, 0.027, 0.006, 0.023, 0.083, 0.009, 0.22, 0.069, 0.124, 0.088, 0.082, 0.223, 0.15, 0.209, 0.107, 0.132, 0.033, 0.405, 0.01, 0.179, 0.05, 0.004, 0.001, 0.088, 0.001, 0.03, 0.018, 0.022, 2.886, 0.44, 0.8, 0.564, 1.075, 2.236, 0.315, 1.165, 1.904, 0.34, 1.795, 2.214, 1.337, 2.854, 2.759, 0.664, 0.0001, 0.0001, 0.24, 0.028, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.023, 0.0001, 0.001, 0.0001, 25.262, 16.34, 0.005, 0.714, 0.0001, 0.005, 0.001, 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.006, 0.277, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ug": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.4, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.843, 0.005, 0.045, 0.0001, 0.0001, 0.006, 0.0001, 0.05, 0.059, 0.061, 0.001, 0.001, 0.064, 0.182, 0.431, 0.006, 0.116, 0.137, 0.086, 0.058, 0.051, 0.055, 0.044, 0.042, 0.045, 0.072, 0.055, 0.007, 0.018, 0.009, 0.017, 0.0001, 0.0001, 0.014, 0.005, 0.004, 0.003, 0.002, 0.001, 0.002, 0.002, 0.011, 0.008, 0.009, 0.003, 0.013, 0.002, 0.002, 0.005, 0.001, 0.002, 0.015, 0.014, 0.019, 0.001, 0.002, 0.002, 0.003, 0.0001, 0.003, 0.001, 0.003, 0.0001, 0.008, 0.0001, 0.198, 0.04, 0.041, 0.081, 0.144, 0.022, 0.07, 0.096, 0.317, 0.009, 0.06, 0.138, 0.069, 0.164, 0.09, 0.038, 0.044, 0.138, 0.091, 0.118, 0.088, 0.011, 0.018, 0.015, 0.072, 0.022, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.146, 0.075, 1.421, 1.142, 2.553, 1.322, 3.07, 1.622, 1.224, 6.252, 1.181, 0.454, 0.501, 0.027, 0.124, 0.02, 0.545, 0.041, 0.008, 0.046, 0.025, 2.705, 0.02, 0.099, 0.121, 0.09, 0.015, 0.082, 0.041, 0.012, 0.015, 0.06, 0.068, 0.006, 0.005, 0.06, 0.019, 0.028, 1.456, 3.601, 1.011, 0.28, 1.856, 0.056, 0.228, 0.623, 0.346, 2.099, 0.163, 2.119, 0.524, 1.075, 0.873, 0.045, 0.014, 0.035, 0.226, 0.052, 1.208, 0.825, 0.077, 0.089, 1.1, 0.024, 0.0001, 0.0001, 0.118, 0.051, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.765, 0.262, 0.112, 0.09, 0.0001, 0.0001, 0.0001, 0.001, 14.938, 17.649, 1.694, 5.905, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.067, 0.002, 0.002, 0.006, 0.003, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 1.731, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ur": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.979, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.161, 0.002, 0.04, 0.0001, 0.0001, 0.001, 0.0001, 0.006, 0.157, 0.157, 0.0001, 0.001, 0.081, 0.085, 0.055, 0.007, 0.121, 0.179, 0.119, 0.082, 0.072, 0.073, 0.068, 0.065, 0.07, 0.096, 0.098, 0.002, 0.004, 0.003, 0.004, 0.0001, 0.0001, 0.02, 0.016, 0.035, 0.016, 0.006, 0.007, 0.013, 0.009, 0.011, 0.009, 0.012, 0.015, 0.025, 0.011, 0.007, 0.016, 0.003, 0.012, 0.029, 0.016, 0.005, 0.006, 0.007, 0.001, 0.005, 0.003, 0.004, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.265, 0.03, 0.059, 0.059, 0.181, 0.032, 0.039, 0.075, 0.194, 0.006, 0.027, 0.102, 0.048, 0.197, 0.175, 0.037, 0.004, 0.142, 0.109, 0.147, 0.083, 0.021, 0.026, 0.005, 0.049, 0.011, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.055, 2.387, 0.534, 0.013, 1.581, 2.193, 2.297, 0.009, 2.712, 0.004, 0.024, 0.012, 4.725, 0.004, 0.025, 0.025, 0.036, 0.091, 1.735, 0.008, 0.507, 0.001, 0.001, 0.002, 0.02, 0.012, 0.0001, 0.005, 0.005, 0.004, 0.001, 0.005, 0.009, 0.069, 0.224, 0.005, 0.08, 0.002, 0.401, 5.353, 1.186, 2.395, 1.412, 0.054, 0.699, 0.376, 0.232, 1.576, 0.068, 2.734, 0.325, 1.531, 0.466, 0.218, 0.1, 0.222, 0.073, 1.112, 0.88, 0.012, 0.002, 0.002, 1.074, 0.003, 0.0001, 0.0001, 0.008, 0.011, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 18.028, 10.547, 4.494, 8.618, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.001, 0.049, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.043, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "uz": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.321, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.468, 0.001, 0.189, 0.0001, 0.0001, 0.012, 0.0001, 0.019, 0.383, 0.392, 0.002, 0.002, 1.018, 0.346, 1.56, 0.012, 0.451, 0.539, 0.363, 0.217, 0.199, 0.207, 0.182, 0.168, 0.187, 0.31, 0.029, 0.042, 0.003, 0.005, 0.003, 0.002, 0.0001, 0.288, 0.177, 0.127, 0.096, 0.051, 0.092, 0.103, 0.072, 0.123, 0.042, 0.115, 0.075, 0.277, 0.092, 0.158, 0.088, 0.099, 0.095, 0.293, 0.135, 0.08, 0.063, 0.021, 0.043, 0.077, 0.019, 0.006, 0.0001, 0.006, 0.001, 0.001, 0.005, 11.395, 1.621, 0.663, 2.97, 1.946, 0.469, 2.488, 2.791, 9.732, 0.446, 2.32, 4.562, 2.354, 4.897, 4.652, 0.487, 1.34, 4.598, 3.575, 3.341, 2.208, 1.083, 0.027, 0.322, 2.128, 0.799, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.456, 0.006, 0.008, 0.004, 0.002, 0.001, 0.001, 0.001, 0.003, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.165, 0.164, 0.0001, 0.001, 0.001, 0.064, 0.017, 0.001, 0.002, 0.019, 0.002, 0.019, 0.002, 0.169, 0.003, 0.003, 0.0001, 0.002, 0.0001, 0.0001, 0.002, 0.007, 0.014, 0.0001, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.04, 0.006, 0.006, 0.01, 0.015, 0.009, 0.006, 0.002, 0.016, 0.002, 0.006, 0.916, 0.127, 0.009, 0.012, 0.002, 0.0001, 0.0001, 0.192, 0.06, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 1.018, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.124, 0.036, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.449, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "ve": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.731, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.522, 0.012, 0.078, 0.0001, 0.0001, 0.001, 0.0001, 0.009, 0.159, 0.16, 0.0001, 0.001, 0.539, 0.225, 1.016, 0.019, 0.145, 0.2, 0.126, 0.043, 0.046, 0.05, 0.05, 0.043, 0.035, 0.051, 0.043, 0.011, 0.01, 0.003, 0.01, 0.007, 0.001, 0.246, 0.066, 0.041, 0.13, 0.054, 0.04, 0.046, 0.163, 0.081, 0.023, 0.129, 0.141, 0.422, 0.243, 0.021, 0.074, 0.002, 0.073, 0.154, 0.414, 0.061, 0.436, 0.032, 0.007, 0.055, 0.059, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 13.088, 1.237, 0.128, 2.934, 4.075, 0.966, 1.256, 7.989, 6.478, 0.01, 1.611, 2.964, 2.428, 5.855, 4.328, 0.793, 0.003, 1.372, 2.898, 2.532, 4.835, 2.93, 2.215, 0.021, 0.876, 1.698, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.04, 0.003, 0.001, 0.0001, 0.002, 0.021, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.005, 0.137, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.006, 0.001, 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.002, 0.001, 0.008, 0.001, 0.0001, 0.0001, 0.007, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.0001, 0.0001, 0.001, 0.008, 0.049, 0.003, 0.004, 0.0001, 0.0001, 0.001, 0.0001, 0.157, 0.074, 0.001, 0.002, 0.0001, 0.026, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.017, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.002, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.231, 0.039, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "vec": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.253, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.683, 0.003, 0.435, 0.0001, 0.0001, 0.011, 0.001, 0.612, 0.188, 0.187, 0.0001, 0.002, 0.962, 0.099, 0.799, 0.015, 0.255, 0.324, 0.176, 0.103, 0.099, 0.11, 0.096, 0.095, 0.113, 0.179, 0.07, 0.031, 0.016, 0.004, 0.016, 0.001, 0.0001, 0.22, 0.135, 0.257, 0.11, 0.212, 0.092, 0.123, 0.029, 0.211, 0.028, 0.03, 0.164, 0.197, 0.115, 0.055, 0.192, 0.012, 0.112, 0.28, 0.113, 0.043, 0.127, 0.024, 0.034, 0.008, 0.022, 0.006, 0.0001, 0.006, 0.0001, 0.006, 0.0001, 9.014, 0.584, 2.527, 3.084, 9.08, 0.695, 1.267, 0.67, 6.478, 0.14, 0.121, 3.361, 1.486, 5.29, 5.96, 1.776, 0.156, 4.436, 3.403, 4.054, 1.601, 1.042, 0.044, 0.834, 0.071, 0.222, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.081, 0.084, 1.282, 0.004, 0.002, 0.002, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.003, 0.004, 0.001, 0.001, 0.002, 0.013, 0.001, 0.01, 0.002, 0.001, 0.001, 0.008, 0.004, 0.058, 0.055, 0.001, 0.003, 0.003, 0.0001, 0.001, 0.74, 0.012, 0.002, 0.002, 0.005, 0.001, 0.002, 0.041, 0.204, 0.163, 0.002, 0.004, 0.188, 0.007, 0.001, 0.002, 0.019, 0.005, 0.113, 0.084, 0.004, 0.003, 0.003, 0.001, 0.003, 0.085, 0.013, 0.006, 0.006, 0.01, 0.027, 0.003, 0.0001, 0.0001, 0.074, 1.6, 0.013, 1.389, 0.061, 0.0001, 0.005, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.014, 0.007, 0.012, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.013, 0.075, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "vep": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.78, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.379, 0.003, 0.471, 0.0001, 0.001, 0.103, 0.0001, 0.568, 0.495, 0.495, 0.0001, 0.017, 1.052, 0.379, 1.489, 0.012, 0.568, 0.707, 0.478, 0.223, 0.214, 0.232, 0.198, 0.192, 0.203, 0.325, 0.211, 0.045, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.203, 0.112, 0.053, 0.077, 0.109, 0.05, 0.072, 0.067, 0.085, 0.066, 0.318, 0.157, 0.187, 0.127, 0.087, 0.197, 0.001, 0.106, 0.305, 0.17, 0.046, 0.359, 0.008, 0.005, 0.004, 0.023, 0.011, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 7.907, 0.771, 0.299, 4.189, 5.699, 0.182, 1.123, 1.305, 7.031, 1.198, 2.907, 3.562, 2.965, 5.97, 3.852, 1.33, 0.003, 2.724, 3.29, 3.069, 2.779, 1.746, 0.01, 0.004, 0.024, 0.95, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.243, 0.042, 0.031, 0.026, 0.016, 0.009, 0.007, 0.007, 0.018, 0.003, 0.008, 0.014, 0.04, 0.228, 0.004, 0.014, 0.011, 0.008, 0.007, 0.006, 0.198, 0.004, 0.004, 0.004, 0.004, 0.01, 0.011, 0.006, 0.059, 0.006, 0.007, 0.007, 0.049, 0.512, 0.005, 0.004, 1.459, 0.005, 0.005, 0.012, 0.007, 0.009, 0.006, 0.076, 0.003, 0.005, 0.006, 0.008, 0.087, 0.02, 0.049, 0.021, 0.019, 0.048, 0.155, 0.011, 0.041, 0.019, 0.037, 0.102, 0.539, 0.049, 0.808, 0.016, 0.0001, 0.0001, 0.208, 2.197, 0.255, 1.283, 0.0001, 0.0001, 0.0001, 0.018, 0.007, 0.013, 0.002, 0.001, 0.025, 0.012, 0.469, 0.173, 0.003, 0.003, 0.001, 0.006, 0.006, 0.011, 0.026, 0.019, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.026, 0.012, 0.203, 0.002, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "vls": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.228, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.739, 0.003, 0.38, 0.0001, 0.0001, 0.005, 0.003, 0.744, 0.196, 0.195, 0.001, 0.001, 0.727, 0.325, 0.943, 0.009, 0.279, 0.491, 0.2, 0.128, 0.127, 0.144, 0.128, 0.137, 0.161, 0.217, 0.083, 0.01, 0.008, 0.003, 0.008, 0.002, 0.0001, 0.184, 0.236, 0.118, 0.332, 0.112, 0.115, 0.126, 0.103, 0.261, 0.107, 0.122, 0.141, 0.163, 0.108, 0.113, 0.118, 0.004, 0.127, 0.191, 0.088, 0.03, 0.223, 0.122, 0.006, 0.022, 0.104, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 4.751, 0.962, 1.1, 3.988, 12.635, 0.533, 2.162, 1.118, 4.159, 0.386, 1.909, 2.864, 1.62, 7.645, 4.865, 1.022, 0.013, 4.762, 3.511, 4.63, 2.292, 1.812, 1.033, 0.041, 0.74, 0.83, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.13, 0.003, 0.003, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.008, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, 0.015, 0.0001, 0.0001, 0.0001, 0.025, 0.093, 0.0001, 0.0001, 0.002, 0.002, 0.001, 0.001, 0.016, 0.003, 0.001, 0.001, 0.002, 0.001, 0.001, 0.004, 0.09, 0.034, 0.493, 0.075, 0.001, 0.002, 0.001, 0.006, 0.006, 0.003, 0.004, 0.004, 0.299, 0.002, 0.003, 0.001, 0.002, 0.001, 0.002, 0.002, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.02, 1.045, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.007, 0.004, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.13, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "vo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.865, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.101, 0.0001, 0.089, 0.0001, 0.177, 0.768, 0.0001, 0.013, 0.471, 0.471, 0.0001, 0.0001, 1.958, 0.301, 1.263, 0.002, 1.009, 1.484, 1.145, 0.885, 0.977, 0.988, 0.827, 0.571, 0.867, 0.731, 0.368, 0.112, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.099, 0.202, 0.186, 0.179, 0.034, 0.122, 0.068, 0.069, 0.028, 0.029, 0.035, 0.486, 0.223, 0.193, 0.038, 0.198, 0.004, 0.074, 0.506, 0.089, 0.221, 0.126, 0.048, 0.001, 0.008, 0.039, 0.004, 0.001, 0.005, 0.0001, 0.0001, 0.0001, 5.558, 2.077, 0.284, 2.834, 4.622, 1.332, 0.379, 0.28, 4.679, 0.128, 1.147, 4.377, 2.51, 5.854, 4.077, 1.175, 0.015, 1.237, 3.788, 2.427, 1.276, 0.657, 0.06, 0.029, 0.621, 0.304, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.73, 0.001, 0.0001, 0.005, 0.073, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.033, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.623, 0.0001, 0.0001, 0.045, 0.0001, 0.038, 0.009, 0.001, 0.006, 0.006, 0.01, 2.184, 0.0001, 0.0001, 0.003, 0.022, 0.052, 0.002, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.27, 0.001, 0.247, 0.003, 0.014, 0.006, 1.503, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 1.216, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.516, 5.121, 0.006, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.73, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "wa": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.065, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.234, 0.018, 0.387, 0.0001, 0.0001, 0.001, 0.005, 1.403, 0.391, 0.397, 0.0001, 0.006, 1.323, 0.328, 1.748, 0.02, 0.212, 0.344, 0.172, 0.086, 0.07, 0.086, 0.076, 0.078, 0.098, 0.148, 0.393, 0.059, 0.003, 0.003, 0.006, 0.012, 0.0001, 0.126, 0.117, 0.176, 0.177, 0.152, 0.211, 0.071, 0.055, 0.154, 0.041, 0.016, 0.325, 0.219, 0.065, 0.097, 0.121, 0.003, 0.069, 0.125, 0.076, 0.016, 0.053, 0.079, 0.005, 0.007, 0.005, 0.103, 0.0001, 0.103, 0.0001, 0.0001, 0.0001, 4.343, 0.71, 2.121, 3.465, 9.326, 0.692, 0.491, 0.929, 5.047, 0.968, 0.844, 3.108, 1.647, 4.913, 4.614, 1.529, 0.028, 3.303, 5.504, 4.286, 1.947, 1.135, 0.682, 0.179, 1.059, 0.366, 0.0001, 0.075, 0.0001, 0.0001, 0.0001, 0.076, 0.002, 0.002, 0.001, 0.001, 0.022, 0.001, 0.008, 0.005, 0.003, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.065, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.001, 0.371, 0.002, 0.017, 0.001, 0.001, 0.706, 0.003, 0.089, 0.451, 0.662, 0.205, 0.03, 0.001, 0.001, 0.639, 0.002, 0.006, 0.002, 0.002, 0.001, 0.243, 0.004, 0.001, 0.001, 0.001, 0.001, 0.002, 0.257, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.478, 3.239, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.08, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "war": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.118, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.933, 0.0001, 1.377, 0.0001, 0.0001, 0.0001, 0.003, 0.004, 0.008, 0.008, 0.0001, 0.0001, 0.432, 0.073, 1.214, 0.001, 0.079, 0.266, 0.062, 0.046, 0.041, 0.046, 0.05, 0.055, 0.111, 0.217, 0.037, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 1.082, 0.154, 0.38, 0.175, 0.141, 0.098, 0.127, 0.173, 0.102, 0.057, 0.046, 0.208, 0.316, 0.091, 0.096, 0.293, 0.004, 0.105, 0.232, 0.146, 0.033, 0.038, 0.367, 0.012, 0.008, 0.019, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.129, 0.835, 2.123, 1.488, 5.092, 0.584, 3.71, 3.47, 8.491, 0.033, 1.376, 3.841, 1.504, 9.228, 3.14, 2.313, 0.025, 2.807, 5.239, 2.428, 2.957, 0.216, 0.413, 0.116, 1.506, 0.106, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.002, 0.004, 0.019, 0.0001, 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.004, 0.003, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.006, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.06, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "wo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.906, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.371, 0.007, 0.083, 0.0001, 0.0001, 0.002, 0.0001, 0.048, 0.243, 0.244, 0.0001, 0.001, 1.526, 0.299, 0.6, 0.011, 0.077, 0.162, 0.075, 0.048, 0.048, 0.043, 0.038, 0.041, 0.05, 0.065, 0.149, 0.021, 0.001, 0.005, 0.001, 0.009, 0.0001, 0.248, 0.196, 0.082, 0.079, 0.037, 0.083, 0.06, 0.026, 0.08, 0.079, 0.082, 0.102, 0.179, 0.109, 0.049, 0.052, 0.005, 0.054, 0.208, 0.113, 0.015, 0.012, 0.059, 0.037, 0.106, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 10.502, 2.142, 1.408, 2.296, 5.004, 0.815, 2.647, 0.171, 6.017, 1.265, 2.73, 3.516, 3.296, 5.064, 5.377, 0.616, 0.08, 2.151, 1.518, 2.39, 4.356, 0.021, 1.494, 1.066, 2.37, 0.019, 0.002, 0.0001, 0.004, 0.0001, 0.0001, 0.102, 0.006, 0.003, 0.003, 0.01, 0.005, 0.004, 0.003, 0.005, 0.001, 0.005, 0.02, 0.001, 0.001, 0.008, 0.002, 0.005, 0.039, 0.003, 0.026, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.041, 0.001, 0.0001, 0.016, 0.015, 0.0001, 0.0001, 0.641, 0.001, 0.002, 0.004, 0.002, 0.001, 0.001, 0.012, 0.011, 0.402, 0.004, 0.775, 0.001, 0.002, 0.001, 0.002, 0.004, 0.912, 0.013, 0.056, 0.002, 0.002, 0.001, 0.002, 0.003, 0.003, 0.002, 0.013, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.028, 2.826, 0.002, 0.019, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.004, 0.002, 0.016, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.007, 0.033, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.096, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "wuu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.208, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.344, 0.001, 0.064, 0.0001, 0.0001, 0.012, 0.001, 0.005, 0.037, 0.032, 0.001, 0.002, 0.029, 0.05, 0.042, 0.019, 0.267, 0.364, 0.21, 0.108, 0.106, 0.12, 0.107, 0.1, 0.123, 0.181, 0.013, 0.001, 0.013, 0.002, 0.013, 0.001, 0.0001, 0.027, 0.021, 0.029, 0.015, 0.013, 0.01, 0.014, 0.013, 0.018, 0.007, 0.011, 0.017, 0.022, 0.016, 0.01, 0.023, 0.002, 0.017, 0.03, 0.019, 0.009, 0.006, 0.008, 0.002, 0.003, 0.002, 0.03, 0.0001, 0.03, 0.0001, 0.003, 0.0001, 0.184, 0.024, 0.041, 0.051, 0.161, 0.019, 0.037, 0.056, 0.143, 0.005, 0.024, 0.082, 0.047, 0.138, 0.118, 0.028, 0.006, 0.111, 0.081, 0.088, 0.07, 0.016, 0.015, 0.01, 0.024, 0.008, 0.001, 0.002, 0.001, 0.001, 0.0001, 2.843, 1.238, 1.324, 0.655, 0.418, 1.022, 0.586, 0.937, 1.267, 1.305, 0.731, 1.421, 2.335, 0.988, 0.859, 1.016, 1.143, 0.568, 0.436, 0.439, 0.836, 0.673, 0.873, 1.003, 0.932, 0.655, 0.691, 1.033, 1.591, 0.82, 0.469, 0.875, 0.536, 0.577, 0.431, 0.453, 0.911, 0.859, 0.578, 0.722, 0.777, 0.496, 1.371, 0.496, 0.553, 1.219, 0.891, 1.125, 1.185, 0.888, 0.563, 0.66, 0.876, 0.472, 0.61, 0.726, 3.021, 1.231, 1.855, 1.189, 2.708, 1.052, 0.869, 1.001, 0.0001, 0.0001, 0.059, 0.019, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.005, 0.002, 0.002, 0.002, 0.0001, 0.011, 0.004, 0.02, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.011, 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.068, 0.005, 0.208, 1.565, 4.388, 9.361, 5.679, 3.099, 2.882, 2.131, 0.002, 0.004, 0.008, 0.002, 0.0001, 1.953, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "xal": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.801, 0.002, 0.076, 0.0001, 0.0001, 0.005, 0.0001, 0.002, 0.134, 0.134, 0.001, 0.003, 0.529, 0.574, 0.918, 0.006, 0.214, 0.423, 0.268, 0.17, 0.177, 0.128, 0.129, 0.128, 0.121, 0.185, 0.028, 0.007, 0.006, 0.001, 0.006, 0.006, 0.0001, 0.005, 0.004, 0.004, 0.001, 0.002, 0.002, 0.002, 0.002, 0.006, 0.001, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.005, 0.003, 0.001, 0.002, 0.003, 0.004, 0.001, 0.001, 0.005, 0.0001, 0.006, 0.0001, 0.005, 0.0001, 0.064, 0.016, 0.035, 0.026, 0.079, 0.017, 0.024, 0.144, 0.059, 0.003, 0.012, 0.04, 0.028, 0.059, 0.05, 0.015, 0.002, 0.048, 0.045, 0.048, 0.035, 0.008, 0.009, 0.006, 0.012, 0.006, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 2.512, 1.678, 1.585, 1.178, 0.036, 0.859, 0.336, 0.487, 0.211, 0.008, 0.012, 0.272, 0.319, 0.492, 0.054, 0.135, 0.09, 0.152, 0.041, 0.073, 0.19, 0.017, 0.022, 0.69, 0.054, 1.446, 0.115, 0.043, 0.168, 0.153, 0.159, 0.053, 0.055, 0.105, 0.151, 0.242, 0.028, 0.118, 0.031, 0.02, 0.093, 0.554, 0.004, 0.02, 0.002, 0.072, 0.031, 0.849, 3.75, 1.252, 0.825, 1.816, 2.139, 1.256, 0.115, 0.387, 2.666, 0.446, 0.987, 3.364, 1.079, 4.101, 2.147, 0.166, 0.0001, 0.0001, 0.041, 0.006, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.038, 0.0001, 0.0001, 0.004, 0.0001, 0.007, 0.004, 27.749, 10.017, 2.264, 1.98, 0.0001, 0.003, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.024, 0.035, 0.127, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "xh": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.827, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.133, 0.013, 0.259, 0.004, 0.001, 0.009, 0.002, 0.046, 0.125, 0.123, 0.001, 0.005, 0.846, 0.831, 0.912, 0.026, 0.163, 0.218, 0.112, 0.059, 0.052, 0.058, 0.048, 0.051, 0.067, 0.118, 0.048, 0.023, 0.018, 0.006, 0.018, 0.006, 0.0001, 0.218, 0.122, 0.114, 0.05, 0.111, 0.054, 0.063, 0.043, 0.32, 0.057, 0.15, 0.086, 0.186, 0.216, 0.074, 0.101, 0.011, 0.057, 0.136, 0.094, 0.198, 0.022, 0.071, 0.041, 0.042, 0.046, 0.076, 0.001, 0.076, 0.0001, 0.013, 0.0001, 10.703, 2.404, 0.805, 1.231, 8.068, 0.529, 2.029, 3.142, 7.484, 0.244, 4.325, 4.529, 2.518, 6.863, 5.226, 0.943, 0.434, 1.064, 2.867, 2.574, 4.687, 0.307, 2.513, 0.353, 2.341, 2.213, 0.002, 0.028, 0.002, 0.0001, 0.0001, 0.043, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.004, 0.012, 0.003, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.004, 0.01, 0.003, 0.0001, 0.0001, 0.001, 0.003, 0.018, 0.0001, 0.0001, 0.005, 0.005, 0.0001, 0.001, 0.1, 0.005, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.003, 0.001, 0.007, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.101, 0.03, 0.014, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.049, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "xmf": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.601, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.701, 0.001, 0.058, 0.0001, 0.0001, 0.01, 0.0001, 0.002, 0.121, 0.121, 0.0001, 0.001, 0.458, 0.166, 0.464, 0.005, 0.164, 0.192, 0.121, 0.06, 0.056, 0.064, 0.055, 0.055, 0.065, 0.102, 0.028, 0.018, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.008, 0.006, 0.008, 0.007, 0.003, 0.004, 0.003, 0.003, 0.027, 0.001, 0.002, 0.006, 0.007, 0.003, 0.003, 0.005, 0.0001, 0.004, 0.007, 0.009, 0.002, 0.008, 0.003, 0.01, 0.001, 0.0001, 0.006, 0.0001, 0.006, 0.0001, 0.001, 0.0001, 0.041, 0.006, 0.016, 0.012, 0.042, 0.004, 0.007, 0.012, 0.032, 0.001, 0.006, 0.021, 0.011, 0.029, 0.03, 0.007, 0.001, 0.029, 0.023, 0.023, 0.015, 0.005, 0.003, 0.002, 0.006, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.172, 0.003, 0.002, 30.333, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 4.083, 0.506, 0.555, 0.957, 2.283, 0.421, 0.156, 0.803, 3.59, 0.653, 1.19, 1.236, 1.788, 2.02, 0.312, 0.098, 2.097, 1.217, 0.638, 1.469, 0.698, 0.389, 0.172, 0.093, 1.339, 0.152, 0.183, 0.083, 0.259, 0.102, 0.41, 0.184, 0.054, 0.009, 0.013, 0.002, 0.001, 0.003, 0.001, 0.323, 0.062, 0.002, 0.002, 0.002, 0.002, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.043, 0.004, 0.001, 0.001, 0.007, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.011, 0.002, 0.023, 0.008, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 30.332, 0.17, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "yi": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.709, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.298, 0.002, 0.186, 0.0001, 0.001, 0.004, 0.006, 0.121, 0.075, 0.076, 0.0001, 0.0001, 0.466, 0.059, 0.46, 0.006, 0.099, 0.114, 0.062, 0.037, 0.035, 0.037, 0.03, 0.03, 0.038, 0.064, 0.034, 0.015, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.003, 0.003, 0.004, 0.003, 0.002, 0.002, 0.002, 0.002, 0.002, 0.001, 0.001, 0.002, 0.003, 0.002, 0.002, 0.002, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.0001, 0.02, 0.003, 0.006, 0.007, 0.022, 0.003, 0.004, 0.006, 0.017, 0.0001, 0.003, 0.01, 0.006, 0.015, 0.021, 0.004, 0.006, 0.015, 0.011, 0.018, 0.013, 0.002, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 0.004, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 5.002, 1.068, 1.228, 1.611, 0.814, 3.904, 1.071, 0.178, 2.364, 5.673, 0.275, 0.347, 1.459, 0.389, 1.018, 2.472, 1.73, 1.057, 4.356, 0.098, 1.356, 0.06, 0.547, 0.832, 3.227, 0.975, 0.239, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.02, 0.006, 0.026, 0.005, 0.016, 0.005, 0.002, 0.163, 0.104, 0.003, 0.002, 0.002, 0.041, 0.002, 0.022, 0.034, 0.0001, 0.0001, 0.015, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.029, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.372, 43.367, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "yo": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.162, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.013, 0.002, 0.102, 0.0001, 0.001, 0.004, 0.001, 0.025, 0.251, 0.249, 0.0001, 0.001, 0.499, 0.259, 1.047, 0.013, 0.386, 0.744, 0.471, 0.336, 0.305, 0.301, 0.323, 0.299, 0.314, 0.417, 0.09, 0.08, 0.008, 0.009, 0.008, 0.006, 0.0001, 0.462, 0.171, 0.128, 0.102, 0.134, 0.101, 0.156, 0.11, 0.251, 0.116, 0.194, 0.108, 0.188, 0.187, 0.263, 0.133, 0.007, 0.102, 0.27, 0.148, 0.037, 0.042, 0.07, 0.006, 0.044, 0.016, 0.007, 0.0001, 0.008, 0.0001, 0.001, 0.001, 4.068, 1.959, 0.507, 1.515, 3.958, 0.547, 1.326, 0.747, 4.508, 1.331, 1.562, 2.445, 1.011, 4.469, 3.265, 1.008, 0.02, 3.063, 1.958, 2.732, 1.408, 0.219, 0.852, 0.039, 0.732, 0.092, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.678, 1.441, 0.002, 0.002, 0.064, 0.002, 0.001, 0.002, 0.025, 0.003, 0.001, 0.001, 0.172, 1.046, 0.0001, 0.0001, 0.001, 0.001, 0.032, 0.052, 0.002, 0.0001, 0.0001, 0.0001, 0.018, 0.066, 0.002, 0.001, 0.007, 0.006, 0.0001, 0.001, 1.085, 1.316, 0.01, 0.17, 0.004, 0.001, 0.001, 0.003, 0.307, 0.812, 0.001, 0.003, 1.559, 1.199, 0.001, 0.002, 0.003, 0.004, 0.287, 0.374, 0.003, 0.002, 0.006, 0.001, 0.038, 1.787, 1.887, 1.09, 0.005, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.021, 7.862, 0.009, 0.075, 0.0001, 0.008, 0.0001, 0.001, 0.001, 0.001, 1.898, 0.0001, 0.005, 0.002, 0.012, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 2.718, 0.12, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "za": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.779, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.452, 0.003, 0.07, 0.0001, 0.001, 0.016, 0.002, 0.054, 0.186, 0.179, 0.001, 0.0001, 0.82, 0.089, 0.74, 0.012, 0.236, 0.344, 0.171, 0.097, 0.104, 0.109, 0.078, 0.094, 0.113, 0.172, 0.091, 0.029, 0.001, 0.001, 0.002, 0.003, 0.0001, 0.117, 0.253, 0.245, 0.236, 0.047, 0.096, 0.232, 0.128, 0.101, 0.031, 0.049, 0.109, 0.142, 0.114, 0.031, 0.114, 0.005, 0.051, 0.316, 0.07, 0.028, 0.136, 0.041, 0.012, 0.157, 0.02, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 4.452, 1.127, 1.557, 2.16, 5.66, 0.54, 3.525, 2.807, 4.357, 1.245, 0.519, 1.215, 1.057, 5.149, 2.46, 0.332, 0.75, 1.554, 1.842, 1.639, 2.859, 0.55, 1.169, 0.375, 1.034, 2.115, 0.002, 0.0001, 0.002, 0.001, 0.0001, 1.059, 0.53, 0.446, 0.215, 0.472, 0.297, 0.257, 0.268, 0.372, 0.375, 0.213, 0.338, 0.751, 0.361, 0.284, 0.332, 0.27, 0.144, 0.117, 0.272, 0.266, 0.278, 0.305, 0.293, 0.26, 0.335, 0.49, 0.247, 0.537, 0.19, 0.142, 0.27, 0.209, 0.19, 0.122, 0.13, 0.301, 0.259, 0.231, 0.235, 0.283, 0.134, 0.154, 0.156, 0.162, 0.375, 0.302, 0.377, 0.293, 0.227, 0.124, 0.201, 0.231, 0.092, 0.229, 0.184, 0.748, 0.296, 0.646, 0.455, 0.756, 0.262, 0.268, 0.277, 0.0001, 0.0001, 0.072, 0.167, 0.018, 0.011, 0.0001, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.006, 0.002, 0.014, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 0.01, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.022, 0.008, 0.114, 0.555, 1.309, 2.559, 1.698, 1.364, 0.916, 0.712, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.518, 0.001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "zea": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.532, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.056, 0.008, 0.162, 0.0001, 0.0001, 0.007, 0.001, 1.415, 0.162, 0.162, 0.0001, 0.0001, 1.0, 0.532, 1.127, 0.004, 0.395, 0.563, 0.389, 0.394, 0.405, 0.319, 0.329, 0.24, 0.265, 0.382, 0.062, 0.076, 0.002, 0.003, 0.001, 0.008, 0.0001, 0.28, 0.228, 0.122, 0.346, 0.208, 0.185, 0.11, 0.117, 0.317, 0.071, 0.084, 0.154, 0.152, 0.245, 0.188, 0.145, 0.004, 0.099, 0.307, 0.104, 0.026, 0.15, 0.089, 0.002, 0.005, 0.114, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 4.665, 0.916, 0.779, 3.731, 13.123, 0.39, 1.695, 1.202, 4.867, 0.455, 1.861, 2.604, 1.621, 7.033, 3.935, 1.063, 0.011, 4.601, 3.105, 3.908, 1.82, 1.832, 0.958, 0.04, 0.135, 0.573, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.482, 0.005, 0.003, 0.002, 0.003, 0.002, 0.001, 0.001, 0.002, 0.005, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.005, 0.003, 0.001, 0.0001, 0.001, 0.021, 0.432, 0.001, 0.001, 0.01, 0.009, 0.003, 0.005, 0.009, 0.008, 0.021, 0.001, 0.002, 0.001, 0.003, 0.005, 0.09, 0.052, 0.453, 0.056, 0.009, 0.006, 0.003, 0.006, 0.115, 0.002, 0.14, 0.027, 0.252, 0.001, 0.064, 0.0001, 0.002, 0.002, 0.002, 0.006, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.239, 1.084, 0.009, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.007, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.481, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], - "zu": [0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.261, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.94, 0.004, 0.267, 0.001, 0.002, 0.016, 0.003, 0.041, 0.181, 0.181, 0.001, 0.001, 0.907, 0.49, 0.797, 0.099, 0.343, 0.379, 0.279, 0.134, 0.118, 0.116, 0.102, 0.097, 0.11, 0.223, 0.065, 0.035, 0.134, 0.003, 0.135, 0.005, 0.0001, 0.296, 0.147, 0.142, 0.093, 0.11, 0.08, 0.077, 0.065, 0.3, 0.114, 0.141, 0.151, 0.361, 0.387, 0.067, 0.128, 0.012, 0.082, 0.239, 0.152, 0.188, 0.039, 0.182, 0.012, 0.045, 0.07, 0.138, 0.0001, 0.139, 0.0001, 0.001, 0.0001, 10.325, 2.215, 0.829, 1.627, 7.521, 0.687, 2.042, 3.525, 7.719, 0.199, 3.874, 4.421, 2.406, 6.494, 4.881, 0.951, 0.342, 1.361, 3.011, 2.552, 4.691, 0.394, 2.227, 0.134, 1.688, 1.779, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.08, 0.007, 0.001, 0.001, 0.002, 0.0001, 0.014, 0.002, 0.002, 0.001, 0.0001, 0.001, 0.003, 0.005, 0.001, 0.002, 0.002, 0.014, 0.001, 0.01, 0.003, 0.0001, 0.001, 0.001, 0.002, 0.06, 0.0001, 0.001, 0.003, 0.003, 0.001, 0.0001, 0.084, 0.004, 0.0001, 0.001, 0.001, 0.0001, 0.002, 0.004, 0.002, 0.005, 0.003, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.004, 0.003, 0.003, 0.005, 0.002, 0.002, 0.001, 0.006, 0.005, 0.002, 0.003, 0.005, 0.002, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.089, 0.024, 0.004, 0.007, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.029, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.091, 0.001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001], + aa: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 5.161, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.548, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.645, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.452, 0.645, + 0.645, 2.581, 9.032, 0.0001, 5.161, 3.871, 5.806, 0.0001, 1.935, 2.581, + 1.29, 5.161, 2.581, 1.29, 0.0001, 4.516, 0.645, 3.226, 0.645, 0.0001, + 1.29, 0.0001, 0.645, 1.29, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.581, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, + 0.0001, 0.0001, 0.0001, 1.29, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, + 0.645, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 3.871, 0.645, 2.581, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + ab: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.925, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.477, 0.003, 0.06, 0.0001, + 0.0001, 0.005, 0.0001, 0.013, 0.269, 0.273, 0.001, 0.001, 0.518, 0.306, + 0.76, 0.006, 0.291, 0.709, 0.42, 0.294, 0.242, 0.237, 0.242, 0.222, + 0.25, 0.32, 0.04, 0.028, 0.008, 0.0001, 0.008, 0.002, 0.0001, 0.004, + 0.004, 0.004, 0.006, 0.001, 0.002, 0.001, 0.001, 0.033, 0.012, 0.001, + 0.001, 0.002, 0.001, 0.011, 0.003, 0.0001, 0.002, 0.009, 0.002, 0.002, + 0.007, 0.006, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.679, 0.013, 0.02, 0.028, 0.073, 0.002, 0.006, 0.01, + 0.057, 0.001, 0.005, 0.035, 0.039, 0.025, 0.031, 0.027, 0.011, 0.045, + 0.036, 0.027, 0.037, 0.009, 0.002, 0.01, 0.027, 0.004, 0.0001, 0.006, + 0.0001, 0.0001, 0.0001, 3.029, 1.109, 1.569, 1.131, 0.085, 0.805, 0.262, + 0.083, 0.992, 0.002, 0.003, 2.495, 0.791, 0.003, 0.006, 0.03, 0.654, + 0.059, 0.04, 0.137, 0.332, 0.075, 0.041, 0.012, 0.142, 2.586, 0.087, + 1.002, 0.086, 0.047, 0.045, 0.323, 0.073, 0.328, 0.016, 0.067, 0.011, + 0.052, 0.054, 0.455, 0.024, 0.199, 0.0001, 0.026, 0.015, 0.539, 0.001, + 0.001, 7.771, 0.517, 0.209, 1.034, 0.683, 1.368, 0.238, 0.686, 3.093, + 0.042, 0.729, 1.305, 0.754, 1.868, 1.136, 0.676, 0.0001, 0.0001, 0.065, + 0.019, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.001, 0.155, + 0.0001, 0.005, 0.002, 22.83, 11.878, 3.39, 2.86, 0.019, 0.007, 0.002, + 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.001, 0.386, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + ace: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.36, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.198, 0.0001, 0.137, 0.0001, + 0.001, 0.007, 0.0001, 0.256, 0.125, 0.125, 0.0001, 0.0001, 1.042, 0.179, + 1.302, 0.01, 0.401, 0.568, 0.284, 0.118, 0.113, 0.112, 0.099, 0.093, + 0.097, 0.13, 0.041, 0.007, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.777, + 0.587, 0.153, 0.133, 0.028, 0.036, 0.256, 0.095, 0.205, 0.159, 0.483, + 0.331, 0.444, 0.183, 0.028, 0.481, 0.019, 0.179, 0.473, 0.324, 0.101, + 0.026, 0.042, 0.006, 0.021, 0.009, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 11.224, 1.773, 0.851, 1.583, 5.304, 0.086, 3.693, 3.458, + 3.728, 0.528, 2.425, 2.037, 2.4, 8.165, 2.618, 1.607, 0.015, 2.485, + 1.74, 2.806, 6.018, 0.112, 0.344, 0.01, 1.486, 0.04, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.039, 0.008, 0.005, 0.009, 0.016, 0.007, 0.006, + 0.006, 0.01, 0.004, 0.008, 0.003, 0.002, 0.004, 0.012, 0.004, 0.007, + 0.003, 0.004, 0.014, 0.002, 0.001, 0.001, 0.002, 0.004, 0.016, 0.001, + 0.001, 0.002, 0.002, 0.001, 0.007, 0.007, 0.006, 0.003, 0.008, 0.005, + 0.002, 0.001, 0.019, 1.193, 0.401, 0.007, 0.574, 0.003, 0.006, 0.002, + 0.006, 0.025, 0.011, 0.006, 0.008, 0.873, 0.004, 0.151, 0.002, 0.005, + 0.005, 0.008, 0.007, 0.004, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.025, + 3.205, 0.014, 0.012, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.001, 0.0001, 0.004, 0.001, 0.012, 0.005, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.061, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.009, 0.011, 0.039, 0.001, 0.001, 0.005, 0.003, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ady: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.142, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.359, 0.001, 0.089, 0.0001, + 0.0001, 0.003, 0.0001, 0.006, 0.111, 0.11, 0.001, 0.001, 0.645, 0.309, + 0.862, 0.007, 0.118, 0.279, 0.082, 0.059, 0.052, 0.055, 0.051, 0.045, + 0.057, 0.071, 0.053, 0.011, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.008, + 0.007, 0.003, 0.003, 0.002, 0.003, 0.0001, 0.002, 1.228, 0.004, 0.001, + 0.003, 0.004, 0.002, 0.004, 0.005, 0.0001, 0.001, 0.006, 0.003, 0.002, + 0.004, 0.002, 0.008, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, + 0.001, 0.0001, 0.05, 0.009, 0.016, 0.02, 0.067, 0.009, 0.011, 0.022, + 0.046, 0.001, 0.006, 0.031, 0.02, 0.036, 0.037, 0.013, 0.0001, 0.038, + 0.031, 0.043, 0.016, 0.004, 0.008, 0.003, 0.011, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 2.778, 0.778, 1.192, 2.098, 0.406, 1.886, 0.203, + 0.188, 0.585, 0.672, 2.887, 2.927, 0.717, 6.004, 0.019, 0.21, 0.317, + 0.122, 0.019, 0.226, 0.145, 0.045, 0.02, 0.041, 0.09, 0.005, 0.262, + 0.059, 0.092, 0.079, 0.053, 0.07, 0.076, 0.092, 0.086, 0.055, 0.029, + 0.124, 0.039, 0.031, 0.045, 0.011, 0.0001, 0.031, 0.0001, 0.018, 0.005, + 0.018, 2.762, 0.645, 0.171, 1.681, 0.855, 1.134, 0.39, 0.89, 1.618, + 0.147, 1.755, 1.169, 1.845, 1.192, 0.989, 0.792, 0.0001, 0.0001, 0.094, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.006, 0.0001, + 0.003, 0.004, 0.0001, 0.0001, 20.033, 23.044, 0.001, 0.227, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.008, 0.229, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + af: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.732, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.494, 0.002, 0.361, 0.0001, + 0.001, 0.008, 0.001, 0.297, 0.136, 0.136, 0.002, 0.001, 0.651, 0.269, + 0.893, 0.01, 0.25, 0.371, 0.17, 0.095, 0.09, 0.104, 0.09, 0.086, 0.122, + 0.213, 0.049, 0.019, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.241, 0.154, + 0.103, 0.382, 0.093, 0.072, 0.119, 0.168, 0.14, 0.087, 0.137, 0.088, + 0.157, 0.131, 0.103, 0.129, 0.004, 0.104, 0.29, 0.11, 0.03, 0.115, + 0.083, 0.006, 0.008, 0.015, 0.002, 0.0001, 0.002, 0.0001, 0.002, 0.0001, + 6.202, 1.128, 0.17, 4.12, 13.284, 0.609, 2.484, 1.201, 6.602, 0.17, + 2.299, 2.976, 1.671, 6.221, 4.571, 1.147, 0.006, 5.197, 4.908, 4.263, + 1.7, 1.691, 1.336, 0.018, 0.832, 0.043, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.182, 0.005, 0.004, 0.003, 0.002, 0.001, 0.001, 0.001, 0.003, + 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.001, 0.001, + 0.024, 0.002, 0.001, 0.001, 0.001, 0.003, 0.118, 0.001, 0.001, 0.017, + 0.016, 0.001, 0.001, 0.076, 0.018, 0.001, 0.005, 0.004, 0.002, 0.002, + 0.003, 0.003, 0.032, 0.053, 0.119, 0.001, 0.004, 0.001, 0.014, 0.007, + 0.003, 0.004, 0.007, 0.002, 0.003, 0.005, 0.001, 0.005, 0.002, 0.003, + 0.003, 0.007, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.084, 0.264, 0.004, + 0.005, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.003, 0.001, 0.0001, + 0.009, 0.004, 0.022, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.003, 0.181, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ak: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.856, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.14, 0.001, 0.181, 0.0001, + 0.002, 0.004, 0.001, 0.124, 0.134, 0.137, 0.001, 0.0001, 0.719, 0.119, + 1.218, 0.014, 0.179, 0.257, 0.137, 0.052, 0.061, 0.075, 0.065, 0.054, + 0.059, 0.197, 0.031, 0.029, 0.002, 0.015, 0.002, 0.018, 0.0001, 0.566, + 0.167, 0.173, 0.118, 0.172, 0.085, 0.258, 0.093, 0.098, 0.056, 0.193, + 0.111, 0.204, 0.399, 0.102, 0.121, 0.012, 0.083, 0.271, 0.145, 0.084, + 0.04, 0.206, 0.011, 0.078, 0.02, 0.025, 0.0001, 0.025, 0.0001, 0.0001, + 0.0001, 10.911, 1.752, 0.404, 1.704, 5.791, 1.18, 0.501, 1.542, 4.479, + 0.04, 1.975, 0.667, 3.211, 7.434, 5.302, 0.888, 0.03, 2.693, 2.695, + 1.838, 2.674, 0.126, 2.695, 0.023, 2.4, 0.077, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.046, 0.01, 0.002, 0.005, 0.002, 0.006, 0.095, 0.003, + 0.01, 0.003, 0.006, 0.011, 0.002, 0.017, 0.002, 0.004, 0.052, 0.011, + 0.001, 0.002, 1.774, 0.002, 0.002, 0.001, 0.0001, 0.02, 0.0001, 1.749, + 0.01, 0.01, 0.0001, 0.0001, 0.151, 0.004, 0.001, 0.002, 0.006, 0.022, + 0.001, 0.003, 0.005, 0.01, 0.002, 0.003, 0.002, 0.005, 0.001, 0.003, + 0.01, 0.006, 0.005, 0.012, 0.015, 0.552, 0.007, 0.003, 0.008, 0.006, + 0.006, 0.392, 0.013, 0.005, 0.007, 0.004, 0.0001, 0.0001, 0.146, 0.054, + 0.004, 0.004, 0.139, 0.0001, 0.0001, 3.532, 0.002, 0.008, 0.003, 0.34, + 0.547, 0.0001, 0.045, 0.018, 0.0001, 0.0001, 0.018, 0.055, 0.008, 0.002, + 0.016, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.048, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + als: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.981, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.805, 0.003, 0.368, 0.0001, + 0.0001, 0.09, 0.001, 0.06, 0.177, 0.177, 0.009, 0.001, 0.909, 0.215, + 1.001, 0.022, 0.318, 0.46, 0.232, 0.128, 0.122, 0.132, 0.116, 0.119, + 0.142, 0.206, 0.063, 0.024, 0.004, 0.003, 0.004, 0.001, 0.0001, 0.315, + 0.452, 0.163, 0.512, 0.205, 0.236, 0.319, 0.219, 0.188, 0.156, 0.222, + 0.212, 0.32, 0.172, 0.112, 0.199, 0.01, 0.225, 0.653, 0.132, 0.131, + 0.173, 0.23, 0.004, 0.019, 0.129, 0.009, 0.0001, 0.009, 0.0001, 0.003, + 0.001, 3.964, 1.276, 2.626, 3.453, 8.363, 1.057, 2.308, 3.744, 6.377, + 0.069, 0.66, 2.78, 2.213, 4.452, 3.12, 0.516, 0.012, 5.572, 4.629, + 4.341, 2.669, 0.935, 0.979, 0.046, 0.315, 0.925, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.124, 0.003, 0.002, 0.002, 0.034, 0.001, 0.001, 0.001, + 0.005, 0.003, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.023, 0.002, 0.001, 0.01, 0.001, 0.003, 0.02, 0.003, 0.002, + 0.048, 0.001, 0.034, 0.042, 0.156, 0.005, 0.005, 0.003, 1.018, 0.003, + 0.001, 0.003, 0.354, 0.039, 0.002, 0.022, 0.079, 0.004, 0.001, 0.002, + 0.004, 0.003, 0.015, 0.003, 0.029, 0.017, 0.333, 0.001, 0.002, 0.045, + 0.004, 0.015, 0.5, 0.004, 0.001, 0.002, 0.0001, 0.0001, 0.108, 2.635, + 0.006, 0.005, 0.0001, 0.005, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, + 0.011, 0.005, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.005, 0.12, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + am: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.067, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.441, 0.005, 0.08, 0.001, + 0.0001, 0.003, 0.0001, 0.013, 0.12, 0.121, 0.002, 0.001, 0.021, 0.111, + 0.25, 0.041, 0.102, 0.167, 0.089, 0.049, 0.044, 0.048, 0.044, 0.043, + 0.057, 0.081, 0.018, 0.001, 0.048, 0.019, 0.048, 0.008, 0.0001, 0.009, + 0.005, 0.007, 0.005, 0.005, 0.004, 0.003, 0.003, 0.004, 0.004, 0.002, + 0.003, 0.006, 0.003, 0.002, 0.004, 0.001, 0.003, 0.007, 0.005, 0.002, + 0.002, 0.002, 0.001, 0.001, 0.001, 0.017, 0.0001, 0.02, 0.0001, 0.007, + 0.0001, 0.059, 0.06, 0.021, 0.018, 0.066, 0.009, 0.014, 0.02, 0.05, + 0.001, 0.005, 0.029, 0.021, 0.042, 0.045, 0.014, 0.001, 0.09, 0.032, + 0.04, 0.026, 0.005, 0.007, 0.003, 0.012, 0.002, 0.0001, 0.003, 0.0001, + 0.0001, 0.0001, 0.402, 0.178, 0.052, 0.194, 0.053, 0.478, 0.259, 0.003, + 10.51, 5.557, 5.996, 6.414, 2.305, 3.741, 0.258, 0.015, 0.706, 0.091, + 0.071, 0.613, 0.064, 1.598, 0.107, 0.008, 0.907, 0.126, 0.312, 0.688, + 0.12, 0.989, 0.129, 0.009, 2.006, 0.213, 0.679, 0.599, 0.206, 1.204, + 0.134, 0.012, 1.72, 0.213, 0.231, 1.059, 0.087, 1.793, 0.284, 0.013, + 1.151, 0.255, 0.312, 0.726, 0.115, 2.127, 0.177, 0.025, 0.19, 0.059, + 0.032, 0.208, 0.015, 0.466, 0.016, 0.003, 0.0001, 0.0001, 0.096, 0.004, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.01, 0.005, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.004, 0.017, 0.046, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 29.467, 0.047, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.001, 0.0001, 0.017, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + an: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.253, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.49, 0.005, 0.725, 0.0001, + 0.0001, 0.005, 0.001, 0.998, 0.246, 0.246, 0.002, 0.002, 1.083, 0.164, + 0.685, 0.057, 0.291, 0.382, 0.213, 0.125, 0.12, 0.124, 0.115, 0.119, + 0.131, 0.221, 0.057, 0.029, 0.007, 0.01, 0.006, 0.001, 0.0001, 0.411, + 0.169, 0.298, 0.091, 0.216, 0.095, 0.1, 0.059, 0.154, 0.037, 0.024, + 0.177, 0.199, 0.072, 0.146, 0.19, 0.011, 0.122, 0.227, 0.128, 0.065, + 0.101, 0.021, 0.037, 0.032, 0.028, 0.004, 0.0001, 0.004, 0.0001, 0.001, + 0.0001, 9.483, 1.074, 3.3, 3.436, 7.765, 0.618, 0.822, 0.72, 5.365, + 0.027, 0.17, 3.124, 1.916, 5.869, 6.23, 1.654, 0.435, 4.741, 4.813, + 3.981, 2.96, 0.573, 0.028, 0.256, 1.248, 0.309, 0.0001, 0.003, 0.0001, + 0.0001, 0.0001, 0.014, 0.007, 0.003, 0.003, 0.002, 0.001, 0.001, 0.002, + 0.002, 0.002, 0.001, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.007, 0.002, 0.001, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, + 0.002, 0.001, 0.0001, 0.002, 0.028, 0.174, 0.002, 0.002, 0.003, 0.001, + 0.001, 0.008, 0.012, 0.227, 0.002, 0.014, 0.002, 0.209, 0.001, 0.002, + 0.004, 0.013, 0.086, 0.54, 0.002, 0.002, 0.003, 0.002, 0.004, 0.002, + 0.027, 0.014, 0.019, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.127, 1.249, + 0.007, 0.007, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.0001, + 0.0001, 0.009, 0.005, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.001, + 0.001, 0.002, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.003, 0.013, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ang: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.542, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.629, 0.001, 0.406, 0.001, + 0.001, 0.005, 0.001, 0.041, 0.166, 0.166, 0.001, 0.001, 0.772, 0.085, + 0.973, 0.007, 0.229, 0.292, 0.152, 0.081, 0.082, 0.095, 0.083, 0.089, + 0.101, 0.139, 0.058, 0.032, 0.011, 0.001, 0.011, 0.001, 0.0001, 0.204, + 0.193, 0.317, 0.089, 0.179, 0.148, 0.229, 0.279, 0.189, 0.034, 0.031, + 0.128, 0.195, 0.168, 0.087, 0.103, 0.007, 0.125, 0.419, 0.122, 0.043, + 0.034, 0.145, 0.006, 0.012, 0.007, 0.02, 0.0001, 0.02, 0.0001, 0.0001, + 0.0001, 5.666, 0.997, 2.318, 3.22, 8.139, 1.491, 2.061, 1.574, 3.89, + 0.022, 0.109, 2.731, 2.332, 6.4, 3.389, 0.62, 0.014, 4.435, 4.532, + 3.015, 1.701, 0.127, 1.341, 0.09, 0.658, 0.04, 0.0001, 0.004, 0.0001, + 0.001, 0.0001, 0.032, 0.62, 0.006, 0.006, 0.004, 0.003, 0.052, 0.002, + 0.001, 0.001, 0.002, 0.033, 0.008, 0.478, 0.002, 0.002, 0.01, 0.003, + 0.05, 1.069, 0.004, 0.001, 0.004, 0.002, 0.003, 0.003, 0.011, 0.012, + 0.009, 0.068, 0.141, 0.003, 0.009, 0.037, 0.013, 0.751, 0.006, 0.002, + 1.085, 0.003, 0.002, 0.01, 0.039, 0.996, 0.002, 0.008, 0.002, 0.002, + 0.371, 0.007, 0.005, 0.069, 0.002, 0.003, 0.002, 0.008, 0.006, 0.003, + 0.005, 0.004, 0.005, 0.004, 2.003, 0.078, 0.0001, 0.0001, 0.009, 3.7, + 2.566, 0.742, 0.075, 0.766, 0.127, 0.001, 0.001, 0.0001, 0.001, 0.0001, + 0.012, 0.006, 0.017, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.004, 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.007, 0.024, 0.022, 0.003, 0.001, 0.003, 0.002, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + arc: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.038, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.39, 0.001, 0.055, 0.0001, + 0.0001, 0.007, 0.0001, 0.005, 0.294, 0.294, 0.0001, 0.0001, 0.039, + 0.041, 0.295, 0.017, 0.207, 0.161, 0.078, 0.046, 0.044, 0.053, 0.042, + 0.044, 0.043, 0.091, 0.189, 0.006, 0.003, 0.004, 0.003, 0.0001, 0.0001, + 0.01, 0.01, 0.013, 0.007, 0.004, 0.004, 0.006, 0.005, 0.007, 0.003, + 0.005, 0.008, 0.011, 0.008, 0.004, 0.008, 0.001, 0.007, 0.013, 0.004, + 0.003, 0.005, 0.004, 0.001, 0.001, 0.002, 0.005, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 0.107, 0.013, 0.023, 0.039, 0.088, 0.011, 0.022, 0.025, + 0.081, 0.003, 0.021, 0.05, 0.023, 0.07, 0.066, 0.018, 0.002, 0.062, + 0.042, 0.051, 0.032, 0.013, 0.011, 0.006, 0.012, 0.006, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.359, 0.027, 0.139, 0.022, 0.095, 0.021, 0.095, + 0.051, 0.776, 0.005, 0.029, 0.002, 0.032, 0.003, 0.011, 0.005, 6.959, + 0.008, 1.918, 0.561, 0.013, 2.47, 0.003, 1.261, 3.75, 0.282, 0.787, + 0.504, 0.018, 4.683, 0.009, 0.786, 1.796, 2.249, 2.761, 0.874, 0.009, + 1.007, 0.747, 0.053, 0.199, 0.858, 2.538, 1.15, 2.879, 0.016, 0.009, + 0.021, 0.023, 0.056, 0.023, 0.019, 0.01, 0.046, 0.007, 0.011, 0.024, + 0.035, 0.015, 0.012, 0.048, 0.023, 0.008, 0.047, 0.0001, 0.0001, 0.004, + 0.019, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.832, 0.001, 0.126, 0.053, 0.042, 0.017, 0.001, 0.0001, 0.0001, 0.009, + 0.024, 0.108, 0.212, 0.141, 0.001, 0.004, 41.501, 0.031, 0.0001, 0.0001, + 0.002, 0.019, 0.018, 0.0001, 0.001, 0.004, 0.004, 0.0001, 0.004, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.004, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + arz: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.739, 0.003, 0.126, 0.0001, + 0.0001, 0.004, 0.001, 0.003, 0.118, 0.124, 0.002, 0.001, 0.064, 0.045, + 0.405, 0.01, 0.141, 0.269, 0.129, 0.067, 0.063, 0.072, 0.064, 0.065, + 0.08, 0.165, 0.039, 0.002, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.012, + 0.009, 0.011, 0.008, 0.005, 0.005, 0.005, 0.006, 0.006, 0.005, 0.004, + 0.009, 0.011, 0.005, 0.003, 0.007, 0.0001, 0.006, 0.013, 0.009, 0.001, + 0.004, 0.004, 0.001, 0.001, 0.001, 0.006, 0.001, 0.006, 0.0001, 0.002, + 0.0001, 0.091, 0.01, 0.025, 0.026, 0.093, 0.01, 0.015, 0.024, 0.072, + 0.002, 0.01, 0.045, 0.023, 0.064, 0.06, 0.013, 0.001, 0.06, 0.046, + 0.047, 0.027, 0.009, 0.007, 0.004, 0.017, 0.005, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.111, 1.136, 0.763, 1.043, 4.458, 2.752, 2.413, 1.721, + 2.708, 1.077, 3.156, 0.021, 0.238, 0.002, 0.017, 0.028, 0.008, 0.018, + 0.006, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.003, + 0.003, 0.004, 0.0001, 0.003, 0.019, 0.06, 0.018, 0.274, 0.041, 0.116, + 0.08, 6.51, 1.771, 0.79, 1.749, 0.151, 0.593, 0.743, 0.294, 1.313, + 0.079, 2.202, 0.292, 1.274, 0.493, 0.453, 0.187, 0.361, 0.078, 1.267, + 0.19, 0.005, 0.002, 0.002, 0.011, 0.002, 0.0001, 0.0001, 0.025, 0.005, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.009, 0.004, 0.01, 0.003, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.004, 21.565, 21.383, 0.022, 0.006, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.029, 0.003, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + as: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.296, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.811, 0.001, 0.086, 0.0001, + 0.0001, 0.005, 0.0001, 0.083, 0.075, 0.077, 0.0001, 0.001, 0.203, 0.086, + 0.044, 0.006, 0.008, 0.009, 0.006, 0.004, 0.003, 0.003, 0.002, 0.002, + 0.003, 0.004, 0.022, 0.007, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.015, + 0.009, 0.013, 0.007, 0.006, 0.005, 0.005, 0.006, 0.011, 0.003, 0.003, + 0.005, 0.01, 0.007, 0.004, 0.011, 0.001, 0.008, 0.013, 0.013, 0.003, + 0.002, 0.004, 0.0001, 0.001, 0.001, 0.01, 0.0001, 0.01, 0.0001, 0.001, + 0.0001, 0.213, 0.031, 0.074, 0.083, 0.255, 0.044, 0.045, 0.095, 0.18, + 0.004, 0.017, 0.099, 0.058, 0.166, 0.164, 0.046, 0.002, 0.151, 0.14, + 0.179, 0.063, 0.023, 0.027, 0.005, 0.036, 0.003, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.537, 0.769, 0.261, 0.102, 0.001, 0.242, 0.382, 1.586, + 0.215, 0.133, 0.002, 0.429, 0.033, 1.928, 0.026, 0.213, 0.004, 0.0001, + 0.0001, 0.14, 0.003, 1.299, 0.21, 0.401, 0.056, 0.073, 0.394, 0.328, + 0.382, 0.006, 0.051, 0.353, 0.081, 0.128, 0.02, 0.231, 1.75, 0.525, + 21.552, 9.182, 1.32, 0.031, 0.846, 0.112, 0.982, 0.29, 0.858, 1.027, + 2.855, 0.297, 0.931, 0.0001, 0.0001, 0.0001, 0.293, 0.318, 0.674, 0.559, + 0.001, 0.0001, 0.584, 0.0001, 2.717, 1.766, 0.0001, 0.0001, 0.009, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.003, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 30.161, 0.0001, 0.072, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ast: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.724, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.007, 0.002, 0.424, 0.002, + 0.001, 0.01, 0.003, 0.548, 0.156, 0.156, 0.002, 0.003, 1.046, 0.096, + 0.743, 0.015, 0.245, 0.288, 0.158, 0.086, 0.078, 0.093, 0.076, 0.077, + 0.093, 0.166, 0.056, 0.032, 0.002, 0.005, 0.002, 0.002, 0.0001, 0.218, + 0.121, 0.236, 0.117, 0.257, 0.089, 0.088, 0.078, 0.115, 0.051, 0.038, + 0.23, 0.167, 0.117, 0.051, 0.161, 0.007, 0.094, 0.198, 0.134, 0.043, + 0.06, 0.041, 0.061, 0.037, 0.011, 0.014, 0.0001, 0.014, 0.0001, 0.001, + 0.0001, 8.074, 0.835, 3.151, 3.345, 9.578, 0.701, 0.803, 0.452, 5.046, + 0.025, 0.11, 4.637, 2.087, 5.542, 5.253, 1.877, 0.488, 4.828, 5.384, + 3.477, 3.909, 0.672, 0.055, 0.4, 0.967, 0.259, 0.0001, 0.002, 0.001, + 0.0001, 0.0001, 0.04, 0.01, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.003, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.001, 0.001, + 0.001, 0.01, 0.01, 0.001, 0.0001, 0.001, 0.002, 0.009, 0.001, 0.001, + 0.005, 0.006, 0.0001, 0.001, 0.026, 0.531, 0.001, 0.001, 0.002, 0.001, + 0.002, 0.002, 0.002, 0.291, 0.001, 0.019, 0.001, 0.46, 0.001, 0.001, + 0.005, 0.157, 0.004, 0.608, 0.002, 0.002, 0.003, 0.002, 0.004, 0.002, + 0.119, 0.021, 0.027, 0.002, 0.001, 0.003, 0.0001, 0.0001, 0.073, 2.207, + 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.012, 0.005, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.003, 0.039, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + atj: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.34, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.835, 0.0001, 0.034, 0.0001, + 0.0001, 0.001, 0.0001, 0.005, 0.045, 0.047, 0.0001, 0.0001, 0.548, + 0.045, 1.11, 0.006, 0.039, 0.075, 0.033, 0.013, 0.017, 0.015, 0.02, + 0.018, 0.017, 0.061, 0.024, 0.003, 0.015, 0.0001, 0.015, 0.002, 0.0001, + 0.175, 0.012, 0.062, 0.025, 0.193, 0.022, 0.01, 0.006, 0.035, 0.021, + 0.212, 0.019, 0.332, 0.208, 0.141, 0.099, 0.007, 0.017, 0.034, 0.12, + 0.001, 0.003, 0.089, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.0001, 11.805, 0.044, 6.264, 0.083, 5.028, 0.008, 0.026, + 0.952, 15.443, 0.004, 9.886, 0.134, 2.846, 5.167, 5.337, 2.131, 0.022, + 2.079, 2.27, 7.277, 0.131, 0.025, 4.581, 0.005, 0.015, 0.007, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.009, + 0.046, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.069, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + av: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.031, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.23, 0.001, 0.083, 0.0001, + 0.0001, 0.007, 0.001, 0.001, 0.166, 0.166, 0.001, 0.001, 0.458, 0.25, + 0.562, 0.01, 0.133, 0.234, 0.149, 0.084, 0.058, 0.065, 0.053, 0.053, + 0.06, 0.094, 0.055, 0.017, 0.001, 0.003, 0.001, 0.003, 0.0001, 0.011, + 0.006, 0.01, 0.003, 0.003, 0.003, 0.003, 0.002, 0.777, 0.001, 0.002, + 0.002, 0.006, 0.003, 0.003, 0.002, 0.0001, 0.002, 0.007, 0.008, 0.003, + 0.006, 0.001, 0.011, 0.001, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.009, + 0.0001, 0.075, 0.008, 0.02, 0.025, 0.067, 0.007, 0.015, 0.018, 0.067, + 0.001, 0.008, 0.038, 0.014, 0.043, 0.038, 0.019, 0.001, 0.041, 0.043, + 0.036, 0.031, 0.01, 0.006, 0.003, 0.01, 0.002, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 2.671, 1.227, 0.995, 2.675, 0.059, 0.905, 0.851, 0.335, + 0.128, 0.084, 1.771, 0.03, 0.884, 0.039, 0.044, 0.818, 0.134, 0.075, + 0.027, 0.273, 0.227, 0.015, 0.029, 0.016, 0.039, 0.006, 0.125, 0.043, + 0.127, 0.032, 0.014, 0.032, 0.185, 0.089, 0.062, 0.016, 0.021, 0.082, + 0.047, 0.033, 0.042, 0.006, 0.002, 0.039, 0.002, 0.019, 0.005, 0.013, + 7.089, 1.927, 0.825, 1.964, 1.317, 1.929, 0.263, 0.636, 2.852, 0.187, + 1.471, 3.734, 0.878, 1.983, 1.647, 0.208, 0.0001, 0.0001, 0.195, 0.006, + 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.022, + 0.0001, 0.001, 0.0001, 30.778, 12.343, 0.0001, 0.534, 0.0001, 0.002, + 0.0001, 0.001, 0.025, 0.022, 0.001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.003, 0.177, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ay: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 4.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.588, 0.005, 0.247, 0.0001, + 0.0001, 0.0001, 0.027, 1.72, 0.603, 0.602, 0.046, 0.001, 1.21, 0.158, + 1.031, 0.021, 0.387, 0.817, 0.515, 0.316, 0.306, 0.36, 0.273, 0.279, + 0.341, 0.428, 0.504, 0.129, 0.064, 0.005, 0.064, 0.147, 0.0001, 0.442, + 0.126, 0.339, 0.185, 0.072, 0.071, 0.077, 0.1, 0.109, 0.302, 0.254, + 0.268, 0.282, 0.145, 0.064, 0.43, 0.127, 0.121, 0.288, 0.2, 0.25, 0.05, + 0.191, 0.012, 0.11, 0.013, 0.007, 0.0001, 0.008, 0.0001, 0.002, 0.004, + 14.491, 0.243, 1.49, 0.745, 1.57, 0.085, 0.27, 2.104, 6.268, 1.613, + 3.058, 2.342, 2.397, 3.14, 1.316, 1.65, 1.821, 3.874, 4.07, 2.906, + 5.224, 0.153, 1.248, 0.859, 2.145, 0.119, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.211, 0.009, 0.003, 0.004, 0.002, 0.001, 0.002, 0.002, 0.003, + 0.002, 0.001, 0.002, 0.002, 0.003, 0.002, 0.002, 0.004, 0.008, 0.001, + 0.016, 0.006, 0.002, 0.001, 0.001, 0.005, 0.126, 0.002, 0.002, 0.008, + 0.019, 0.001, 0.001, 0.061, 0.068, 0.001, 0.003, 0.22, 0.002, 0.002, + 0.004, 0.004, 0.062, 0.002, 0.003, 0.001, 0.11, 0.003, 0.049, 0.044, + 0.259, 0.029, 0.076, 0.026, 0.004, 0.004, 0.007, 0.009, 0.003, 0.038, + 0.01, 0.012, 0.003, 0.005, 0.006, 0.0001, 0.0001, 0.133, 0.88, 0.003, + 0.004, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.006, + 0.002, 0.031, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.004, 0.004, + 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.01, 0.003, + 0.207, 0.001, 0.004, 0.008, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + az: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.803, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.785, 0.003, 0.222, 0.0001, + 0.001, 0.009, 0.001, 0.007, 0.139, 0.141, 0.001, 0.002, 0.64, 0.404, + 0.91, 0.014, 0.244, 0.339, 0.188, 0.096, 0.09, 0.102, 0.087, 0.087, + 0.102, 0.202, 0.038, 0.019, 0.004, 0.002, 0.004, 0.004, 0.0001, 0.276, + 0.242, 0.068, 0.094, 0.057, 0.061, 0.057, 0.095, 0.062, 0.008, 0.127, + 0.055, 0.202, 0.081, 0.086, 0.077, 0.107, 0.098, 0.172, 0.115, 0.037, + 0.055, 0.005, 0.062, 0.066, 0.023, 0.006, 0.0001, 0.006, 0.0001, 0.004, + 0.001, 7.007, 1.378, 0.673, 3.497, 1.722, 0.535, 0.389, 0.748, 6.853, + 0.041, 1.544, 4.525, 2.336, 5.203, 1.602, 0.396, 1.07, 4.974, 2.444, + 2.338, 1.812, 1.06, 0.008, 0.478, 1.947, 0.87, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.147, 0.01, 0.009, 0.005, 0.005, 0.009, 0.003, 0.033, + 0.002, 0.001, 0.001, 0.003, 0.002, 0.001, 0.002, 0.082, 0.004, 0.001, + 0.002, 0.028, 0.04, 0.001, 0.012, 0.001, 0.002, 6.259, 0.001, 0.001, + 0.046, 0.034, 0.075, 1.454, 0.026, 0.003, 0.003, 0.001, 0.001, 0.001, + 0.001, 0.485, 0.001, 0.001, 0.001, 0.011, 0.002, 0.016, 0.001, 0.001, + 0.187, 2.533, 0.009, 0.004, 0.005, 0.028, 0.457, 0.003, 0.014, 0.003, + 0.01, 0.017, 1.158, 0.011, 0.03, 0.004, 0.0001, 0.0001, 0.067, 2.145, + 2.985, 1.196, 0.079, 0.0001, 0.0001, 6.24, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.001, 0.207, 0.052, 0.0001, 0.018, 0.0001, 0.0001, + 0.0001, 0.001, 0.008, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.14, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + azb: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.225, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.112, 0.002, 0.032, 0.0001, + 0.0001, 0.003, 0.0001, 0.002, 0.275, 0.275, 0.002, 0.001, 0.028, 0.165, + 0.744, 0.053, 0.037, 0.078, 0.041, 0.038, 0.027, 0.033, 0.024, 0.023, + 0.03, 0.03, 0.059, 0.003, 0.004, 0.001, 0.003, 0.0001, 0.0001, 0.005, + 0.004, 0.007, 0.004, 0.002, 0.002, 0.002, 0.003, 0.008, 0.002, 0.002, + 0.004, 0.004, 0.003, 0.001, 0.007, 0.001, 0.004, 0.011, 0.002, 0.001, + 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, + 0.022, 0.0001, 0.096, 0.009, 0.017, 0.038, 0.09, 0.012, 0.02, 0.043, + 0.1, 0.0001, 0.026, 0.053, 0.017, 0.052, 0.064, 0.04, 0.001, 0.055, + 0.055, 0.106, 0.015, 0.003, 0.052, 0.004, 0.018, 0.009, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.77, 0.455, 0.528, 0.028, 2.648, 1.417, 3.922, + 1.536, 3.205, 0.004, 0.23, 0.004, 7.975, 0.001, 0.011, 0.01, 0.002, + 0.06, 0.27, 0.013, 0.004, 0.001, 0.0001, 0.0001, 0.033, 0.002, 0.0001, + 0.023, 0.001, 0.001, 0.0001, 0.002, 0.02, 0.007, 0.378, 0.004, 0.281, + 0.002, 0.413, 5.027, 1.244, 0.85, 1.199, 0.132, 0.444, 0.158, 0.386, + 2.668, 0.253, 3.47, 0.613, 1.73, 0.767, 0.17, 0.092, 0.269, 0.09, 0.326, + 0.153, 0.08, 0.001, 0.001, 0.271, 0.002, 0.0001, 0.0001, 0.181, 0.003, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.0001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.002, + 0.001, 0.001, 18.661, 14.13, 1.511, 8.604, 0.0001, 0.0001, 0.0001, + 0.0001, 0.007, 0.0001, 0.763, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ba: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.692, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.933, 0.002, 0.044, 0.0001, + 0.0001, 0.005, 0.0001, 0.001, 0.147, 0.147, 0.0001, 0.004, 0.482, 0.143, + 0.604, 0.015, 0.158, 0.244, 0.135, 0.077, 0.08, 0.076, 0.061, 0.06, + 0.081, 0.125, 0.052, 0.011, 0.008, 0.003, 0.008, 0.001, 0.0001, 0.003, + 0.003, 0.006, 0.002, 0.002, 0.001, 0.002, 0.002, 0.025, 0.001, 0.002, + 0.002, 0.003, 0.002, 0.001, 0.002, 0.0001, 0.001, 0.004, 0.005, 0.004, + 0.007, 0.001, 0.012, 0.0001, 0.001, 0.006, 0.0001, 0.006, 0.0001, 0.002, + 0.0001, 0.021, 0.003, 0.012, 0.011, 0.026, 0.004, 0.004, 0.006, 0.021, + 0.001, 0.003, 0.02, 0.007, 0.023, 0.02, 0.005, 0.0001, 0.016, 0.01, + 0.014, 0.014, 0.002, 0.003, 0.001, 0.009, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 2.739, 1.424, 2.096, 1.348, 0.183, 0.244, 0.115, 0.088, + 0.621, 0.006, 0.016, 3.259, 0.202, 0.093, 0.068, 0.404, 0.112, 0.175, + 0.076, 1.0, 0.273, 0.018, 0.005, 0.012, 0.081, 3.093, 0.13, 0.026, + 0.084, 0.041, 0.082, 0.063, 0.299, 0.879, 0.098, 0.434, 0.038, 0.036, + 0.005, 0.017, 0.043, 0.504, 0.0001, 0.196, 0.001, 0.016, 0.036, 0.445, + 4.844, 0.952, 0.303, 0.533, 0.952, 2.488, 0.102, 0.15, 1.49, 1.18, + 1.231, 3.558, 1.237, 2.847, 1.277, 0.365, 0.0001, 0.0001, 0.244, 0.002, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.004, + 0.0001, 0.002, 0.001, 24.156, 12.667, 4.154, 3.011, 0.0001, 0.0001, + 0.0001, 0.0001, 0.005, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.235, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + bar: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.604, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.871, 0.004, 0.418, 0.0001, + 0.0001, 0.008, 0.002, 0.216, 0.21, 0.21, 0.009, 0.001, 0.803, 0.202, + 1.146, 0.023, 0.266, 0.394, 0.199, 0.121, 0.109, 0.119, 0.109, 0.117, + 0.138, 0.187, 0.117, 0.02, 0.004, 0.005, 0.004, 0.003, 0.0001, 0.352, + 0.447, 0.201, 0.532, 0.247, 0.245, 0.332, 0.228, 0.204, 0.156, 0.293, + 0.235, 0.338, 0.204, 0.224, 0.214, 0.034, 0.205, 0.697, 0.181, 0.119, + 0.18, 0.276, 0.005, 0.01, 0.114, 0.021, 0.0001, 0.021, 0.0001, 0.003, + 0.003, 8.177, 1.169, 1.993, 4.065, 6.625, 1.095, 2.102, 3.003, 6.12, + 0.162, 0.941, 2.0, 2.327, 6.606, 4.578, 0.55, 0.014, 3.249, 4.677, + 4.042, 3.018, 0.854, 1.171, 0.071, 0.239, 0.864, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.102, 0.003, 0.003, 0.002, 0.004, 0.004, 0.001, 0.001, + 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.001, + 0.001, 0.001, 0.014, 0.001, 0.001, 0.016, 0.001, 0.002, 0.009, 0.001, + 0.001, 0.039, 0.001, 0.036, 0.116, 0.061, 0.007, 0.003, 0.001, 0.274, + 0.073, 0.002, 0.002, 0.004, 0.027, 0.002, 0.002, 0.002, 0.004, 0.001, + 0.001, 0.004, 0.002, 0.01, 0.016, 0.006, 0.001, 0.154, 0.002, 0.005, + 0.001, 0.002, 0.002, 0.176, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.07, + 0.891, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.007, 0.004, 0.006, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.002, 0.103, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + bcl: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.379, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.071, 0.002, 0.217, 0.001, + 0.003, 0.005, 0.002, 0.116, 0.161, 0.16, 0.0001, 0.001, 0.914, 0.25, + 0.911, 0.022, 0.337, 0.439, 0.274, 0.132, 0.116, 0.128, 0.121, 0.133, + 0.144, 0.229, 0.055, 0.02, 0.017, 0.001, 0.017, 0.022, 0.0001, 0.585, + 0.233, 0.246, 0.128, 0.11, 0.148, 0.111, 0.118, 0.238, 0.077, 0.175, + 0.149, 0.27, 0.198, 0.07, 0.296, 0.013, 0.12, 0.508, 0.14, 0.057, 0.048, + 0.04, 0.004, 0.02, 0.015, 0.025, 0.0001, 0.025, 0.0001, 0.0001, 0.0001, + 15.454, 1.486, 0.494, 1.897, 2.968, 0.126, 4.169, 0.861, 6.432, 0.033, + 2.688, 2.392, 2.068, 10.392, 5.039, 1.872, 0.022, 3.21, 4.66, 2.796, + 1.875, 0.174, 0.643, 0.021, 1.752, 0.121, 0.0001, 0.007, 0.0001, 0.0001, + 0.0001, 0.039, 0.006, 0.003, 0.003, 0.005, 0.004, 0.002, 0.003, 0.009, + 0.002, 0.004, 0.002, 0.003, 0.004, 0.003, 0.002, 0.007, 0.003, 0.002, + 0.009, 0.004, 0.002, 0.001, 0.002, 0.002, 0.008, 0.004, 0.003, 0.013, + 0.011, 0.003, 0.001, 0.027, 0.035, 0.013, 0.004, 0.005, 0.003, 0.003, + 0.006, 0.004, 0.006, 0.004, 0.003, 0.007, 0.019, 0.005, 0.003, 0.005, + 0.018, 0.01, 0.022, 0.014, 0.003, 0.004, 0.003, 0.01, 0.004, 0.006, + 0.004, 0.005, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.019, 0.136, 0.005, + 0.006, 0.0001, 0.0001, 0.0001, 0.011, 0.004, 0.01, 0.002, 0.0001, 0.006, + 0.003, 0.016, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.003, + 0.017, 0.012, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, + 0.007, 0.034, 0.001, 0.008, 0.01, 0.006, 0.004, 0.002, 0.003, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + be: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.607, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.35, 0.001, 0.055, 0.0001, + 0.0001, 0.006, 0.0001, 0.05, 0.155, 0.156, 0.001, 0.002, 0.628, 0.121, + 0.612, 0.009, 0.188, 0.295, 0.148, 0.088, 0.085, 0.087, 0.076, 0.074, + 0.089, 0.156, 0.032, 0.017, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.009, + 0.006, 0.026, 0.004, 0.005, 0.003, 0.019, 0.003, 0.047, 0.001, 0.002, + 0.004, 0.009, 0.01, 0.004, 0.01, 0.0001, 0.005, 0.013, 0.005, 0.003, + 0.013, 0.004, 0.018, 0.001, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.003, + 0.0001, 0.046, 0.006, 0.014, 0.013, 0.042, 0.007, 0.007, 0.01, 0.04, + 0.001, 0.006, 0.023, 0.014, 0.029, 0.035, 0.009, 0.001, 0.032, 0.024, + 0.024, 0.019, 0.004, 0.003, 0.002, 0.006, 0.003, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 2.314, 1.922, 1.481, 1.13, 0.14, 0.481, 1.007, 0.569, + 0.351, 0.001, 0.001, 1.93, 0.479, 0.541, 0.221, 1.357, 0.128, 0.261, + 0.085, 0.08, 0.203, 0.012, 2.438, 0.059, 0.001, 0.01, 0.103, 0.048, + 0.097, 0.076, 0.995, 0.141, 0.181, 0.137, 0.046, 0.12, 0.029, 0.02, + 0.016, 0.019, 0.023, 0.001, 0.0001, 0.081, 0.0001, 0.017, 0.007, 0.023, + 7.12, 0.583, 1.325, 0.884, 1.382, 1.613, 0.241, 1.022, 0.011, 0.528, + 1.726, 1.757, 1.251, 2.924, 1.397, 1.062, 0.0001, 0.0001, 0.283, 0.003, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.021, + 0.0001, 0.002, 0.001, 26.294, 17.28, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.156, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + bh: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.941, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.272, 0.0001, 0.067, 0.0001, + 0.001, 0.014, 0.0001, 0.006, 0.074, 0.074, 0.0001, 0.001, 0.205, 0.047, + 0.036, 0.005, 0.139, 0.215, 0.134, 0.072, 0.07, 0.074, 0.065, 0.069, + 0.075, 0.087, 0.017, 0.007, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.006, + 0.004, 0.005, 0.002, 0.003, 0.002, 0.004, 0.002, 0.007, 0.001, 0.002, + 0.003, 0.003, 0.003, 0.002, 0.004, 0.0001, 0.002, 0.006, 0.006, 0.002, + 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.009, 0.0001, 0.1, 0.014, 0.029, 0.038, 0.115, 0.019, 0.024, 0.049, + 0.081, 0.001, 0.007, 0.043, 0.023, 0.079, 0.071, 0.019, 0.001, 0.072, + 0.065, 0.081, 0.029, 0.011, 0.014, 0.002, 0.014, 0.001, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.902, 0.534, 1.035, 0.031, 0.0001, 0.22, 0.29, + 2.243, 0.258, 0.137, 0.021, 0.553, 0.066, 1.318, 0.0001, 0.336, 0.009, + 0.009, 0.0001, 0.03, 0.023, 1.891, 0.248, 0.639, 0.037, 0.011, 0.202, + 0.05, 0.683, 0.024, 0.014, 0.375, 0.074, 0.252, 0.031, 0.13, 24.792, + 6.19, 0.487, 0.175, 1.097, 0.001, 0.677, 0.098, 0.808, 0.311, 0.975, + 0.521, 2.028, 0.0001, 1.424, 0.0001, 0.0001, 0.605, 0.237, 0.107, 1.177, + 0.742, 0.0001, 0.0001, 0.117, 0.003, 3.031, 1.138, 0.0001, 0.0001, + 0.016, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 29.692, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + bi: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 3.859, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.276, 0.003, 0.256, 0.0001, + 0.0001, 0.003, 0.003, 0.016, 0.486, 0.484, 0.001, 0.0001, 0.638, 0.156, + 1.372, 0.022, 0.455, 0.969, 0.456, 0.237, 0.231, 0.247, 0.248, 0.25, + 0.297, 0.612, 0.044, 0.019, 0.005, 0.0001, 0.004, 0.004, 0.0001, 0.449, + 0.264, 0.227, 0.165, 0.234, 0.192, 0.164, 0.234, 0.179, 0.456, 0.316, + 0.231, 0.458, 0.197, 0.135, 0.315, 0.005, 0.168, 0.606, 0.235, 0.049, + 0.123, 0.109, 0.008, 0.231, 0.017, 0.005, 0.0001, 0.005, 0.0001, 0.0001, + 0.0001, 8.019, 2.445, 0.575, 1.178, 6.318, 0.449, 2.782, 1.275, 5.992, + 0.203, 1.688, 4.658, 3.419, 6.494, 6.015, 1.447, 0.023, 2.565, 2.973, + 3.583, 1.992, 0.459, 0.92, 0.044, 0.557, 0.136, 0.001, 0.001, 0.001, + 0.0001, 0.0001, 0.108, 0.019, 0.014, 0.005, 0.005, 0.004, 0.006, 0.01, + 0.005, 0.008, 0.002, 0.002, 0.012, 0.031, 0.002, 0.001, 0.002, 0.004, + 0.003, 0.089, 0.007, 0.003, 0.003, 0.004, 0.004, 0.002, 0.001, 0.001, + 0.007, 0.004, 0.002, 0.004, 0.052, 0.019, 0.003, 0.005, 0.023, 0.009, + 0.014, 0.014, 0.008, 0.023, 0.003, 0.01, 0.005, 0.015, 0.003, 0.004, + 0.019, 0.013, 0.011, 0.022, 0.006, 0.01, 0.007, 0.004, 0.018, 0.01, + 0.009, 0.009, 0.011, 0.009, 0.011, 0.009, 0.0001, 0.0001, 0.048, 0.113, + 0.02, 0.046, 0.0001, 0.002, 0.0001, 0.005, 0.001, 0.002, 0.0001, 0.001, + 0.032, 0.011, 0.078, 0.027, 0.001, 0.0001, 0.001, 0.018, 0.002, 0.0001, + 0.017, 0.009, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.037, + 0.005, 0.097, 0.0001, 0.0001, 0.007, 0.003, 0.001, 0.003, 0.001, 0.002, + 0.001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + bjn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.274, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.352, 0.002, 0.406, 0.0001, + 0.001, 0.013, 0.001, 0.109, 0.199, 0.198, 0.002, 0.001, 0.988, 0.406, + 0.819, 0.036, 0.185, 0.196, 0.136, 0.076, 0.062, 0.071, 0.054, 0.058, + 0.057, 0.091, 0.102, 0.025, 0.002, 0.003, 0.002, 0.005, 0.0001, 0.244, + 0.391, 0.098, 0.173, 0.034, 0.031, 0.106, 0.136, 0.207, 0.121, 0.411, + 0.116, 0.312, 0.12, 0.035, 0.341, 0.003, 0.133, 0.409, 0.258, 0.061, + 0.026, 0.09, 0.002, 0.038, 0.007, 0.012, 0.0001, 0.012, 0.0001, 0.0001, + 0.0001, 19.717, 2.113, 0.418, 2.814, 2.089, 0.126, 3.097, 2.135, 6.446, + 0.654, 2.733, 2.879, 2.871, 8.542, 1.048, 1.844, 0.007, 3.384, 2.985, + 3.613, 4.514, 0.083, 0.972, 0.009, 1.107, 0.035, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.03, 0.008, 0.005, 0.007, 0.006, 0.006, 0.006, 0.004, + 0.006, 0.004, 0.008, 0.003, 0.003, 0.007, 0.001, 0.001, 0.002, 0.002, + 0.002, 0.008, 0.003, 0.002, 0.002, 0.004, 0.002, 0.014, 0.001, 0.002, + 0.005, 0.005, 0.002, 0.002, 0.012, 0.002, 0.002, 0.004, 0.012, 0.005, + 0.004, 0.011, 0.007, 0.182, 0.006, 0.005, 0.004, 0.004, 0.003, 0.005, + 0.009, 0.008, 0.005, 0.005, 0.003, 0.002, 0.001, 0.003, 0.006, 0.004, + 0.004, 0.003, 0.003, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.019, 0.193, + 0.007, 0.009, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, + 0.0001, 0.005, 0.002, 0.005, 0.002, 0.001, 0.0001, 0.0001, 0.0001, + 0.001, 0.004, 0.035, 0.03, 0.004, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.019, 0.008, 0.026, 0.006, 0.003, 0.008, 0.005, 0.003, 0.002, 0.001, + 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + bm: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.167, 0.007, 0.144, 0.0001, + 0.001, 0.013, 0.002, 0.256, 0.237, 0.237, 0.007, 0.003, 0.973, 0.158, + 0.97, 0.007, 0.243, 0.224, 0.128, 0.052, 0.064, 0.06, 0.072, 0.055, + 0.07, 0.12, 0.287, 0.015, 0.0001, 0.01, 0.0001, 0.005, 0.0001, 0.444, + 0.348, 0.111, 0.212, 0.105, 0.277, 0.105, 0.044, 0.094, 0.171, 0.429, + 0.132, 0.368, 0.21, 0.091, 0.065, 0.003, 0.072, 0.446, 0.184, 0.079, + 0.027, 0.078, 0.004, 0.046, 0.018, 0.018, 0.0001, 0.014, 0.0001, 0.017, + 0.0001, 12.037, 2.27, 0.406, 1.816, 3.589, 1.305, 1.615, 0.299, 5.301, + 0.672, 3.384, 3.18, 2.268, 7.22, 3.282, 0.194, 0.029, 2.428, 2.045, + 1.645, 2.796, 0.059, 0.96, 0.016, 1.69, 0.107, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 0.237, 0.003, 0.001, 0.017, 0.017, 0.007, 0.015, 0.003, + 0.008, 0.011, 0.026, 0.017, 0.001, 0.0001, 0.018, 0.005, 0.013, 0.002, + 0.004, 0.018, 1.999, 0.0001, 0.0001, 0.0001, 0.002, 0.172, 0.0001, + 1.879, 0.012, 0.017, 0.004, 0.0001, 0.054, 0.002, 0.001, 0.001, 0.002, + 0.003, 0.005, 0.027, 0.322, 0.21, 0.005, 0.017, 0.007, 0.002, 0.001, + 0.011, 0.002, 0.012, 0.238, 0.014, 0.415, 0.435, 0.001, 0.007, 0.005, + 0.009, 0.01, 0.017, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.064, + 1.039, 0.002, 0.033, 0.027, 0.0001, 0.0001, 4.089, 0.016, 0.002, 0.003, + 0.0001, 0.433, 0.0001, 0.024, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.065, 0.05, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.015, 0.0001, 0.003, 0.233, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + bn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.319, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.406, 0.001, 0.076, 0.0001, + 0.0001, 0.012, 0.0001, 0.015, 0.057, 0.058, 0.0001, 0.001, 0.196, 0.086, + 0.029, 0.005, 0.005, 0.006, 0.004, 0.002, 0.002, 0.002, 0.002, 0.001, + 0.002, 0.002, 0.016, 0.009, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.005, + 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.003, 0.002, 0.001, + 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.001, + 0.001, 0.0001, 0.043, 0.007, 0.016, 0.016, 0.05, 0.009, 0.009, 0.017, + 0.038, 0.001, 0.004, 0.022, 0.013, 0.034, 0.034, 0.01, 0.001, 0.031, + 0.027, 0.033, 0.016, 0.005, 0.005, 0.002, 0.008, 0.001, 0.0001, 0.003, + 0.0001, 0.0001, 0.0001, 0.359, 0.551, 0.299, 0.082, 0.002, 0.229, 0.186, + 2.436, 0.034, 0.152, 0.002, 0.333, 0.036, 2.245, 0.026, 0.384, 0.008, + 0.001, 0.001, 0.181, 0.002, 1.31, 0.16, 0.34, 0.043, 0.053, 0.26, 0.209, + 0.4, 0.015, 0.042, 0.46, 0.067, 0.212, 0.008, 0.16, 1.542, 0.621, + 24.834, 6.808, 1.602, 0.04, 0.792, 0.149, 1.148, 0.261, 0.867, 1.261, + 2.631, 0.001, 0.874, 0.001, 0.001, 0.001, 0.381, 0.232, 0.963, 0.451, + 0.001, 0.001, 0.701, 0.0001, 2.837, 1.811, 0.0001, 0.0001, 0.013, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.008, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 30.991, 0.0001, 0.03, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + bo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.169, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.69, 0.0001, 0.002, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.01, 0.01, 0.0001, 0.0001, 0.002, 0.003, + 0.005, 0.001, 0.003, 0.004, 0.003, 0.002, 0.001, 0.002, 0.001, 0.001, + 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.012, 0.002, 0.004, 0.004, 0.015, + 0.003, 0.003, 0.006, 0.011, 0.0001, 0.001, 0.005, 0.003, 0.01, 0.01, + 0.003, 0.0001, 0.008, 0.008, 0.01, 0.004, 0.001, 0.002, 0.0001, 0.002, + 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.3, 0.21, 1.61, 0.004, + 1.096, 0.171, 0.232, 0.056, 0.006, 0.125, 0.009, 7.85, 0.044, 0.821, + 0.01, 0.147, 0.305, 1.571, 0.233, 1.086, 0.826, 0.17, 1.379, 0.052, + 0.974, 0.101, 0.175, 0.065, 0.005, 0.008, 0.253, 0.318, 0.893, 0.39, + 1.207, 0.915, 0.217, 0.014, 2.41, 0.028, 0.071, 0.06, 0.002, 0.023, + 0.001, 0.018, 0.001, 0.001, 0.003, 0.913, 2.028, 0.112, 1.086, 0.005, + 0.001, 0.055, 0.005, 0.003, 0.951, 0.005, 10.217, 21.49, 2.602, 0.016, + 0.0001, 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 32.905, 0.0001, 0.024, 0.009, + 0.002, 0.006, 0.004, 0.005, 0.004, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, + ], + bpy: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.902, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.282, 0.0001, 0.009, 0.0001, + 0.0001, 0.224, 0.0001, 0.002, 0.281, 0.281, 0.0001, 0.0001, 0.306, + 0.253, 0.183, 0.08, 0.005, 0.009, 0.002, 0.004, 0.002, 0.003, 0.003, + 0.003, 0.003, 0.003, 0.197, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.016, 0.008, 0.017, 0.005, 0.005, 0.002, 0.004, 0.002, 0.003, 0.003, + 0.005, 0.003, 0.007, 0.007, 0.001, 0.007, 0.0001, 0.004, 0.019, 0.004, + 0.016, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.014, 0.0001, 0.118, 0.01, 0.016, 0.026, 0.05, 0.006, 0.015, + 0.031, 0.057, 0.004, 0.009, 0.031, 0.017, 0.064, 0.06, 0.015, 0.001, + 0.059, 0.03, 0.047, 0.04, 0.005, 0.005, 0.001, 0.018, 0.002, 0.0001, + 0.016, 0.0001, 0.0001, 0.0001, 0.094, 0.582, 0.295, 0.004, 0.001, 0.199, + 0.278, 1.651, 0.006, 0.325, 0.001, 0.49, 0.119, 1.057, 0.003, 0.285, + 0.0001, 0.0001, 0.0001, 0.034, 0.032, 0.592, 0.143, 0.798, 0.084, 0.129, + 0.075, 0.036, 0.484, 0.004, 0.03, 0.329, 0.051, 0.128, 0.007, 0.019, + 1.405, 0.659, 24.309, 6.387, 2.166, 0.231, 0.814, 0.355, 0.961, 0.379, + 1.131, 0.99, 2.941, 0.034, 0.919, 0.004, 0.001, 0.001, 0.243, 0.193, + 0.791, 1.05, 0.0001, 0.0001, 0.626, 0.0001, 4.392, 1.335, 0.0001, + 0.0001, 0.04, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 30.31, 0.0001, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + br: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.678, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.255, 0.004, 0.515, 0.0001, + 0.0001, 0.007, 0.002, 0.663, 0.246, 0.246, 0.001, 0.002, 0.881, 0.746, + 0.901, 0.014, 0.258, 0.444, 0.187, 0.109, 0.115, 0.122, 0.109, 0.12, + 0.152, 0.228, 0.115, 0.024, 0.015, 0.004, 0.016, 0.003, 0.0001, 0.347, + 0.279, 0.201, 0.205, 0.261, 0.098, 0.212, 0.134, 0.164, 0.075, 0.201, + 0.168, 0.253, 0.109, 0.059, 0.199, 0.006, 0.146, 0.289, 0.136, 0.097, + 0.091, 0.051, 0.019, 0.032, 0.015, 0.024, 0.0001, 0.024, 0.0001, 0.001, + 0.0001, 9.146, 1.127, 0.833, 2.777, 10.42, 0.294, 1.799, 2.456, 3.655, + 0.167, 1.352, 2.97, 1.505, 5.492, 4.696, 0.867, 0.019, 5.665, 2.33, + 3.448, 2.744, 1.784, 0.434, 0.03, 0.247, 2.302, 0.0001, 0.004, 0.0001, + 0.001, 0.0001, 0.1, 0.012, 0.008, 0.007, 0.005, 0.004, 0.003, 0.003, + 0.004, 0.005, 0.002, 0.002, 0.004, 0.005, 0.003, 0.002, 0.003, 0.002, + 0.002, 0.011, 0.005, 0.002, 0.002, 0.002, 0.002, 0.074, 0.002, 0.003, + 0.005, 0.005, 0.001, 0.004, 0.021, 0.015, 0.009, 0.005, 0.007, 0.003, + 0.004, 0.009, 0.013, 0.045, 0.076, 0.018, 0.003, 0.013, 0.003, 0.005, + 0.011, 0.591, 0.009, 0.012, 0.018, 0.007, 0.006, 0.004, 0.009, 0.467, + 0.008, 0.021, 0.017, 0.008, 0.005, 0.006, 0.0001, 0.0001, 0.048, 1.28, + 0.01, 0.011, 0.0001, 0.001, 0.0001, 0.004, 0.002, 0.002, 0.002, 0.0001, + 0.032, 0.015, 0.039, 0.015, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.006, + 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, + 0.009, 0.096, 0.003, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + bs: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.108, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.139, 0.002, 0.313, 0.001, + 0.001, 0.017, 0.002, 0.011, 0.204, 0.204, 0.001, 0.006, 0.915, 0.157, + 1.176, 0.034, 0.332, 0.467, 0.264, 0.159, 0.151, 0.151, 0.132, 0.126, + 0.142, 0.226, 0.068, 0.015, 0.006, 0.007, 0.006, 0.001, 0.0001, 0.156, + 0.174, 0.174, 0.143, 0.072, 0.074, 0.155, 0.136, 0.152, 0.073, 0.147, + 0.082, 0.163, 0.218, 0.118, 0.225, 0.003, 0.11, 0.283, 0.122, 0.105, + 0.088, 0.031, 0.007, 0.007, 0.073, 0.025, 0.0001, 0.025, 0.0001, 0.008, + 0.0001, 8.723, 0.95, 0.762, 2.331, 6.777, 0.26, 1.369, 0.582, 7.412, + 3.867, 2.673, 2.682, 2.205, 4.994, 6.632, 1.941, 0.005, 3.955, 3.612, + 3.234, 3.103, 2.415, 0.036, 0.017, 0.061, 1.207, 0.0001, 0.006, 0.0001, + 0.0001, 0.0001, 0.038, 0.004, 0.003, 0.002, 0.002, 0.001, 0.003, 0.388, + 0.002, 0.001, 0.001, 0.001, 0.016, 0.618, 0.001, 0.0001, 0.003, 0.172, + 0.002, 0.018, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.003, 0.001, 0.001, + 0.006, 0.003, 0.004, 0.002, 0.035, 0.482, 0.001, 0.001, 0.003, 0.001, + 0.001, 0.002, 0.001, 0.008, 0.001, 0.002, 0.001, 0.003, 0.001, 0.001, + 0.007, 0.004, 0.003, 0.004, 0.002, 0.003, 0.004, 0.002, 0.004, 0.002, + 0.002, 0.003, 0.006, 0.012, 0.366, 0.002, 0.0001, 0.0001, 0.02, 0.032, + 1.199, 0.874, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.014, 0.006, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.002, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + bug: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 6.068, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.164, 0.0001, 0.016, 0.0001, + 0.0001, 0.003, 0.001, 0.137, 0.016, 0.016, 0.0001, 0.001, 0.196, 1.935, + 1.044, 0.004, 0.035, 0.02, 0.023, 0.01, 0.009, 0.007, 0.007, 0.006, + 0.007, 0.013, 0.007, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.516, 0.311, 0.434, 0.185, 0.139, 0.134, 0.304, 0.324, 0.039, 0.055, + 0.029, 0.369, 0.412, 0.063, 0.111, 1.316, 0.017, 0.157, 0.558, 0.13, + 0.016, 0.233, 0.012, 0.002, 0.073, 0.002, 0.007, 0.0001, 0.007, 0.0001, + 0.0001, 0.0001, 9.887, 0.241, 1.633, 1.832, 7.179, 0.088, 0.757, 0.513, + 7.161, 0.111, 1.126, 1.683, 2.724, 6.291, 2.861, 1.308, 0.04, 7.537, + 3.873, 3.7, 4.723, 0.375, 1.036, 0.149, 1.531, 0.172, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.047, 0.009, 0.005, 0.004, 0.009, 0.007, 0.006, + 0.004, 0.009, 0.039, 0.01, 0.038, 0.003, 0.005, 0.002, 0.001, 0.004, + 0.012, 0.007, 0.011, 0.011, 0.02, 0.001, 0.02, 0.012, 0.019, 0.011, + 0.012, 0.002, 0.001, 0.006, 0.003, 0.004, 0.003, 0.047, 0.002, 0.016, + 0.005, 0.004, 0.01, 0.405, 2.36, 0.01, 0.013, 0.003, 0.001, 0.008, + 0.004, 0.008, 0.004, 0.008, 0.005, 0.176, 0.005, 0.002, 0.003, 0.012, + 0.005, 0.008, 0.007, 0.003, 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.007, + 2.887, 0.002, 0.04, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.004, 0.003, 0.023, 0.014, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.007, 0.008, 0.007, 0.001, 0.006, 0.0001, 0.0001, + 0.0001, 0.0001, 0.048, 0.15, 0.04, 0.0001, 0.0001, 0.002, 0.002, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + bxr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.49, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.129, 0.001, 0.08, 0.0001, + 0.0001, 0.012, 0.0001, 0.001, 0.147, 0.147, 0.0001, 0.002, 0.553, 0.131, + 0.523, 0.004, 0.151, 0.243, 0.109, 0.074, 0.068, 0.074, 0.065, 0.062, + 0.079, 0.12, 0.022, 0.018, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.004, + 0.002, 0.007, 0.001, 0.002, 0.002, 0.002, 0.004, 0.037, 0.001, 0.001, + 0.002, 0.003, 0.003, 0.003, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, + 0.011, 0.001, 0.019, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.002, + 0.0001, 0.037, 0.005, 0.011, 0.009, 0.029, 0.005, 0.007, 0.031, 0.027, + 0.001, 0.005, 0.019, 0.012, 0.022, 0.025, 0.008, 0.001, 0.023, 0.018, + 0.017, 0.016, 0.003, 0.002, 0.001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 2.392, 0.859, 1.489, 1.628, 0.046, 1.574, 0.057, 0.037, + 0.549, 0.002, 0.003, 0.546, 0.265, 4.264, 0.148, 0.174, 0.118, 0.207, + 0.029, 0.069, 0.123, 0.028, 0.013, 0.033, 0.034, 0.005, 0.055, 0.03, + 0.09, 0.073, 0.049, 0.037, 0.094, 0.079, 0.088, 0.076, 0.026, 0.12, + 0.011, 0.016, 0.032, 0.306, 0.001, 0.058, 0.001, 0.071, 0.033, 1.461, + 5.842, 1.346, 0.152, 2.003, 2.072, 0.704, 0.52, 0.475, 1.576, 1.562, + 0.254, 3.078, 0.893, 3.534, 3.045, 0.105, 0.0001, 0.0001, 0.188, 0.005, + 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, + 0.0001, 0.006, 0.002, 27.741, 14.028, 2.178, 0.307, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.003, 0.075, 0.002, 0.001, 0.004, 0.002, 0.001, 0.001, + 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + cdo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.899, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.597, 0.001, 0.273, 0.0001, + 0.0001, 0.004, 0.0001, 0.004, 0.549, 0.551, 0.0001, 0.001, 0.624, 3.929, + 0.732, 0.03, 0.251, 0.611, 0.29, 0.189, 0.163, 0.163, 0.16, 0.156, + 0.166, 0.215, 0.133, 0.012, 0.001, 0.0001, 0.001, 0.002, 0.0001, 0.053, + 0.117, 0.299, 0.251, 0.017, 0.027, 0.504, 0.23, 0.082, 0.03, 0.071, + 0.135, 0.356, 0.159, 0.039, 0.068, 0.004, 0.027, 0.229, 0.101, 0.044, + 0.025, 0.062, 0.001, 0.013, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.822, 0.392, 1.504, 1.05, 0.748, 0.033, 6.691, 1.959, 3.832, + 0.006, 1.877, 0.724, 0.396, 5.597, 0.623, 0.123, 0.005, 0.411, 2.143, + 0.557, 2.118, 0.037, 0.065, 0.039, 0.184, 0.014, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.562, 0.653, 0.229, 0.604, 0.418, 0.298, 0.318, 0.129, + 0.175, 0.171, 0.118, 0.212, 0.31, 0.409, 0.113, 0.98, 0.125, 0.066, + 0.036, 0.255, 0.106, 0.397, 0.142, 0.124, 0.138, 0.172, 0.096, 0.139, + 0.338, 0.116, 0.144, 0.186, 0.41, 1.078, 0.77, 0.114, 1.515, 0.081, + 0.097, 0.077, 0.628, 0.714, 1.044, 0.603, 1.183, 1.024, 0.119, 0.129, + 0.135, 0.183, 0.537, 1.615, 1.19, 0.067, 0.211, 0.1, 0.216, 1.217, + 0.179, 0.199, 0.306, 0.119, 0.135, 0.091, 0.0001, 0.0001, 0.041, 7.531, + 2.472, 1.618, 0.001, 0.001, 0.0001, 0.002, 0.002, 0.001, 2.018, 0.0001, + 0.014, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, + 0.757, 0.108, 0.212, 0.359, 1.361, 0.793, 0.503, 0.549, 0.397, 0.002, + 0.003, 0.004, 0.001, 0.0001, 0.218, 0.03, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + ce: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.477, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.593, 0.0001, 0.003, 0.0001, + 0.0001, 0.014, 0.0001, 0.0001, 0.462, 0.462, 0.0001, 0.166, 0.461, + 0.186, 0.813, 0.002, 0.175, 0.094, 0.109, 0.14, 0.045, 0.029, 0.022, + 0.02, 0.031, 0.028, 0.033, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.145, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, + 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.145, 0.144, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.001, + 0.002, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 2.704, 1.438, 1.762, 1.875, 0.015, 2.329, 0.449, 0.169, 0.835, 0.009, + 0.342, 0.05, 1.751, 0.164, 0.611, 0.21, 0.068, 0.113, 0.056, 0.04, + 0.434, 0.02, 0.006, 0.019, 0.028, 0.002, 0.404, 0.034, 0.196, 0.056, + 0.049, 0.075, 0.184, 0.229, 0.057, 0.026, 0.146, 0.02, 0.017, 0.02, + 0.129, 0.002, 0.0001, 0.004, 0.0001, 0.008, 0.009, 0.018, 7.603, 0.877, + 1.017, 0.93, 0.629, 1.84, 0.05, 0.386, 1.788, 1.009, 1.778, 2.253, + 0.873, 3.199, 2.291, 0.075, 0.0001, 0.0001, 0.018, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 28.632, 13.675, 0.0001, 0.638, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.405, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ceb: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.228, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.341, 0.0001, 0.15, 0.0001, + 0.0001, 0.002, 0.0001, 0.016, 0.068, 0.068, 0.0001, 0.0001, 1.15, 0.441, + 1.259, 0.001, 0.028, 0.059, 0.035, 0.022, 0.021, 0.022, 0.021, 0.021, + 0.026, 0.036, 0.037, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 1.098, 0.168, 0.578, 0.161, 0.203, 0.063, 0.093, 0.198, 0.052, 0.044, + 0.126, 0.151, 0.236, 0.118, 0.082, 0.261, 0.02, 0.131, 0.295, 0.118, + 0.081, 0.041, 0.087, 0.005, 0.015, 0.017, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 15.378, 2.318, 0.367, 1.953, 2.974, 0.093, 5.126, + 1.479, 4.851, 0.069, 2.449, 3.4, 2.839, 8.407, 4.701, 1.442, 0.019, + 2.43, 4.783, 3.214, 2.941, 0.169, 0.623, 0.03, 1.539, 0.068, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.059, 0.004, 0.005, 0.004, + 0.004, 0.003, 0.008, 0.005, 0.003, 0.002, 0.001, 0.004, 0.009, 0.002, + 0.004, 0.002, 0.003, 0.0001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.01, + 0.005, 0.001, 0.002, 0.001, 0.001, 0.002, 0.006, 0.184, 0.019, 0.007, + 0.005, 0.008, 0.019, 0.003, 0.009, 0.007, 0.025, 0.004, 0.049, 0.001, + 0.018, 0.002, 0.008, 0.279, 0.015, 0.004, 0.013, 0.004, 0.003, 0.007, + 0.001, 0.046, 0.006, 0.007, 0.005, 0.006, 0.004, 0.006, 0.001, 0.0001, + 0.0001, 0.452, 0.166, 0.097, 0.047, 0.001, 0.0001, 0.003, 0.0001, + 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.031, 0.01, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.019, 0.018, 0.003, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.012, 0.008, 0.002, 0.001, + 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ch: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.587, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.467, 0.008, 0.286, 0.0001, + 0.0001, 0.018, 0.0001, 1.077, 0.189, 0.189, 0.0001, 0.0001, 1.14, 0.532, + 1.257, 0.007, 0.648, 0.639, 0.504, 0.182, 0.3, 0.173, 0.195, 0.169, + 0.204, 0.218, 0.042, 0.013, 0.0001, 0.001, 0.0001, 0.005, 0.0001, 0.26, + 0.146, 0.257, 0.104, 0.401, 0.111, 0.564, 0.173, 0.223, 0.038, 0.106, + 0.097, 0.317, 0.12, 0.025, 0.199, 0.01, 0.074, 0.256, 0.153, 0.279, + 0.066, 0.06, 0.002, 0.047, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.0001, 10.968, 0.472, 0.524, 1.575, 4.239, 0.44, 3.776, 1.808, 6.943, + 0.028, 1.21, 2.019, 1.749, 8.291, 5.798, 1.592, 0.018, 1.795, 5.81, + 3.872, 3.565, 0.141, 0.106, 0.012, 0.845, 0.055, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.016, 0.008, 0.003, 0.001, 0.002, 0.01, 0.001, 0.0001, + 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.0001, 0.0001, 0.006, + 0.001, 0.0001, 0.005, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.011, + 0.0001, 0.003, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.02, 0.002, 0.003, + 0.001, 0.974, 0.0001, 0.004, 0.003, 0.012, 0.0001, 0.0001, 0.001, 0.009, + 0.0001, 0.0001, 0.002, 0.432, 0.0001, 0.044, 0.0001, 0.001, 0.003, + 0.001, 0.002, 0.002, 0.006, 0.007, 0.002, 0.002, 0.001, 0.003, 0.0001, + 0.0001, 0.001, 1.51, 0.004, 0.013, 0.0001, 0.0001, 0.0001, 0.004, + 0.0001, 0.002, 0.0001, 0.0001, 0.005, 0.005, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.008, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.012, 0.0001, 0.0001, + 0.003, 0.002, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.004, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + cho: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 6.477, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.446, 0.089, 1.242, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.621, 0.621, 0.0001, 0.0001, 0.799, + 0.0001, 0.532, 0.0001, 0.0001, 0.177, 0.089, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.355, 0.266, 0.0001, 0.0001, 0.0001, + 0.089, 0.0001, 0.444, 0.0001, 1.154, 0.0001, 0.0001, 0.0001, 0.089, + 0.799, 0.177, 0.0001, 0.177, 0.0001, 0.355, 0.177, 0.177, 0.444, 0.0001, + 0.0001, 0.355, 0.0001, 0.0001, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.955, 1.154, 0.799, + 0.0001, 2.839, 0.177, 0.621, 7.365, 8.252, 0.0001, 5.146, 2.662, 3.549, + 3.727, 5.413, 1.597, 0.0001, 0.799, 3.638, 5.146, 1.597, 1.065, 0.089, + 0.0001, 1.331, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 1.154, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.266, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.177, 0.0001, 0.0001, + 0.0001, 1.154, 0.0001, 0.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, + ], + chr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.394, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.115, 0.002, 0.174, 0.0001, + 0.001, 0.005, 0.001, 0.018, 0.095, 0.095, 0.0001, 0.001, 0.499, 0.081, + 0.439, 0.009, 0.086, 0.076, 0.045, 0.025, 0.02, 0.027, 0.02, 0.018, + 0.025, 0.029, 0.03, 0.019, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.037, + 0.02, 0.038, 0.014, 0.023, 0.017, 0.012, 0.014, 0.019, 0.011, 0.01, + 0.013, 0.028, 0.014, 0.01, 0.02, 0.002, 0.016, 0.034, 0.027, 0.013, + 0.008, 0.015, 0.002, 0.005, 0.003, 0.065, 0.0001, 0.065, 0.0001, 0.004, + 0.0001, 0.692, 0.092, 0.264, 0.31, 0.823, 0.092, 0.184, 0.209, 0.663, + 0.01, 0.064, 0.374, 0.188, 0.502, 0.498, 0.163, 0.016, 0.479, 0.482, + 0.523, 0.235, 0.107, 0.076, 0.023, 0.123, 0.021, 0.0001, 0.028, 0.0001, + 0.0001, 0.0001, 0.027, 0.355, 0.722, 0.213, 0.313, 0.628, 0.115, 0.06, + 0.021, 0.056, 0.084, 0.04, 0.154, 1.876, 13.554, 13.952, 0.082, 0.032, + 0.441, 0.837, 0.268, 0.161, 0.041, 1.986, 0.138, 0.561, 0.191, 0.664, + 0.014, 0.045, 0.005, 0.13, 2.057, 0.126, 1.445, 0.138, 1.031, 0.39, + 0.904, 0.381, 0.457, 1.048, 0.569, 0.458, 0.748, 0.433, 0.062, 1.427, + 0.213, 0.207, 0.29, 0.574, 0.831, 0.687, 0.218, 0.077, 0.387, 0.051, + 0.016, 0.01, 0.004, 0.004, 1.405, 0.134, 0.0001, 0.0001, 0.009, 0.006, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 27.238, 0.017, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + chy: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 6.992, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.662, 0.002, 0.655, 0.0001, + 0.0001, 0.0001, 0.0001, 4.281, 0.488, 0.49, 0.012, 0.039, 1.209, 0.935, + 1.193, 0.009, 0.099, 0.186, 0.07, 0.039, 0.048, 0.046, 0.051, 0.032, + 0.087, 0.113, 0.294, 0.06, 0.044, 0.012, 0.043, 0.009, 0.0001, 0.28, + 0.143, 0.271, 0.068, 0.058, 0.046, 0.056, 0.705, 0.041, 0.084, 0.094, + 0.075, 0.71, 0.203, 0.133, 0.21, 0.01, 0.123, 0.333, 0.369, 0.109, + 0.326, 0.043, 0.02, 0.015, 0.015, 0.017, 0.0001, 0.017, 0.0001, 0.0001, + 0.005, 5.694, 0.454, 0.435, 0.594, 8.431, 0.195, 0.654, 4.544, 1.753, + 0.053, 1.313, 1.118, 1.931, 4.523, 6.14, 0.553, 0.043, 1.203, 5.097, + 4.735, 0.637, 1.842, 0.224, 0.461, 0.27, 0.08, 0.002, 0.003, 0.002, + 0.0001, 0.0001, 0.024, 0.014, 0.009, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.002, 0.113, 0.0001, 0.002, 0.007, 0.005, 0.0001, 0.0001, + 0.005, 0.002, 0.0001, 0.058, 0.012, 0.0001, 0.003, 0.029, 0.003, 0.0001, + 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.002, 0.044, 1.384, 0.696, 0.009, + 0.027, 0.002, 0.002, 0.039, 0.005, 3.484, 0.98, 0.162, 0.003, 0.009, + 0.002, 0.017, 0.009, 0.003, 0.005, 1.282, 0.993, 0.003, 0.142, 0.0001, + 0.017, 0.0001, 0.002, 0.009, 0.007, 0.0001, 0.007, 0.005, 0.0001, + 0.0001, 0.014, 8.846, 0.043, 0.545, 0.0001, 0.005, 0.046, 0.0001, 0.007, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.031, 0.009, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.019, 0.003, 0.017, 0.0001, 0.0001, 0.003, + 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ckb: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.676, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.035, 0.002, 0.062, 0.0001, + 0.0001, 0.003, 0.0001, 0.002, 0.131, 0.13, 0.001, 0.001, 0.011, 0.034, + 0.374, 0.013, 0.01, 0.014, 0.008, 0.005, 0.004, 0.004, 0.004, 0.004, + 0.005, 0.007, 0.05, 0.0001, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.009, + 0.006, 0.007, 0.006, 0.004, 0.004, 0.004, 0.004, 0.005, 0.002, 0.003, + 0.004, 0.007, 0.005, 0.003, 0.007, 0.001, 0.005, 0.01, 0.007, 0.002, + 0.002, 0.003, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.003, + 0.0001, 0.058, 0.008, 0.018, 0.017, 0.063, 0.009, 0.012, 0.017, 0.048, + 0.001, 0.008, 0.031, 0.019, 0.043, 0.045, 0.012, 0.001, 0.045, 0.029, + 0.036, 0.019, 0.006, 0.008, 0.003, 0.011, 0.002, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.386, 0.193, 0.124, 0.067, 1.187, 1.207, 3.947, 0.41, + 3.556, 0.028, 0.015, 0.002, 5.576, 0.003, 1.191, 0.005, 0.006, 0.005, + 0.002, 0.004, 0.001, 6.665, 0.001, 0.002, 0.236, 0.001, 0.002, 0.008, + 0.002, 0.002, 0.001, 0.006, 0.161, 0.192, 0.114, 0.062, 0.112, 0.064, + 0.707, 4.366, 1.564, 2.13, 1.551, 0.015, 0.253, 0.092, 0.303, 2.261, + 0.008, 2.411, 0.524, 1.151, 0.651, 0.531, 0.001, 0.004, 0.003, 0.092, + 0.048, 0.036, 0.003, 0.003, 0.823, 0.003, 0.0001, 0.0001, 0.028, 0.007, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 15.514, 10.978, 4.45, 13.188, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.375, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.063, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + co: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.449, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.862, 0.008, 0.387, 0.0001, + 0.0001, 0.006, 0.001, 0.763, 0.212, 0.212, 0.003, 0.001, 0.925, 0.075, + 0.859, 0.019, 0.189, 0.28, 0.146, 0.097, 0.087, 0.101, 0.081, 0.085, + 0.107, 0.132, 0.097, 0.026, 0.009, 0.003, 0.01, 0.004, 0.0001, 0.325, + 0.102, 0.335, 0.094, 0.091, 0.089, 0.126, 0.077, 0.208, 0.025, 0.02, + 0.156, 0.189, 0.082, 0.052, 0.201, 0.016, 0.093, 0.268, 0.121, 0.17, + 0.078, 0.019, 0.022, 0.005, 0.013, 0.032, 0.0001, 0.032, 0.0001, 0.016, + 0.0001, 8.602, 0.557, 3.322, 3.101, 4.329, 0.784, 1.174, 1.381, 10.092, + 0.419, 0.069, 2.83, 1.864, 5.457, 2.618, 1.888, 0.179, 4.342, 3.458, + 4.676, 6.626, 0.877, 0.033, 0.017, 0.063, 0.595, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 0.058, 0.006, 0.004, 0.002, 0.003, 0.001, 0.001, 0.001, + 0.004, 0.001, 0.001, 0.0001, 0.002, 0.002, 0.001, 0.0001, 0.002, 0.001, + 0.001, 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.039, 0.0001, 0.001, + 0.001, 0.001, 0.0001, 0.001, 0.789, 0.005, 0.002, 0.002, 0.004, 0.001, + 0.002, 0.004, 0.94, 0.016, 0.001, 0.007, 0.251, 0.004, 0.001, 0.002, + 0.005, 0.006, 0.189, 0.011, 0.005, 0.003, 0.002, 0.024, 0.003, 0.252, + 0.004, 0.007, 0.006, 0.005, 0.002, 0.004, 0.0001, 0.0001, 0.05, 2.469, + 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.0001, + 0.0001, 0.032, 0.015, 0.008, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.004, 0.04, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + cr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.443, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.088, 0.004, 0.073, 0.0001, + 0.0001, 0.02, 0.0001, 0.023, 0.121, 0.12, 0.0001, 0.002, 0.629, 0.081, + 0.971, 0.012, 0.119, 0.193, 0.101, 0.064, 0.076, 0.066, 0.061, 0.066, + 0.062, 0.105, 0.063, 0.027, 0.0001, 0.0001, 0.0001, 0.015, 0.0001, + 0.161, 0.04, 0.143, 0.045, 0.195, 0.034, 0.029, 0.053, 0.081, 0.084, + 0.151, 0.056, 0.235, 0.167, 0.103, 0.138, 0.009, 0.033, 0.115, 0.119, + 0.03, 0.034, 0.067, 0.012, 0.01, 0.004, 0.05, 0.0001, 0.047, 0.0001, + 0.014, 0.0001, 9.914, 0.233, 4.69, 1.145, 5.906, 0.235, 0.326, 1.052, + 10.924, 0.134, 6.149, 1.256, 2.551, 4.689, 5.033, 1.928, 0.073, 2.706, + 3.099, 5.744, 0.924, 0.192, 2.967, 0.038, 0.312, 0.067, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.088, 0.031, 0.077, 0.099, 0.046, 0.115, 0.007, + 0.048, 0.054, 0.011, 0.091, 0.103, 0.074, 0.037, 0.073, 0.005, 0.766, + 0.405, 0.312, 0.295, 0.175, 0.052, 0.036, 0.009, 0.01, 0.038, 0.001, + 0.005, 0.002, 0.0001, 0.001, 0.021, 0.037, 0.111, 0.205, 0.026, 0.084, + 0.087, 0.065, 0.093, 0.076, 0.063, 0.057, 0.032, 0.002, 0.144, 0.111, + 0.096, 0.017, 0.078, 0.065, 0.232, 0.037, 0.005, 0.0001, 0.0001, 0.021, + 0.005, 0.022, 0.02, 0.014, 0.002, 0.005, 0.005, 0.0001, 0.0001, 0.046, + 0.821, 0.023, 0.077, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 1.861, 0.08, 0.005, 0.002, 0.009, 0.005, 0.0001, + 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + crh: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.666, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.545, 0.003, 0.2, 0.0001, + 0.003, 0.006, 0.0001, 0.011, 0.498, 0.498, 0.001, 0.003, 0.581, 0.375, + 1.265, 0.029, 0.54, 0.844, 0.447, 0.25, 0.254, 0.244, 0.225, 0.224, + 0.237, 0.353, 0.036, 0.017, 0.017, 0.002, 0.017, 0.003, 0.0001, 0.292, + 0.227, 0.115, 0.122, 0.258, 0.045, 0.081, 0.079, 0.299, 0.014, 0.172, + 0.079, 0.19, 0.068, 0.102, 0.074, 0.317, 0.092, 0.196, 0.162, 0.157, + 0.161, 0.003, 0.13, 0.089, 0.035, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 7.42, 1.383, 0.39, 2.173, 6.493, 0.253, 0.439, 0.324, 6.527, + 0.039, 1.974, 3.301, 1.629, 5.164, 1.476, 0.486, 0.955, 4.625, 3.637, + 2.416, 1.149, 1.071, 0.013, 0.004, 1.959, 0.598, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.415, 0.022, 0.015, 0.022, 0.008, 0.007, 0.005, 0.065, + 0.008, 0.005, 0.004, 0.008, 0.007, 0.007, 0.003, 0.008, 0.005, 0.004, + 0.004, 0.069, 0.234, 0.004, 0.026, 0.004, 0.006, 0.008, 0.008, 0.005, + 0.067, 0.049, 0.094, 1.497, 0.026, 0.01, 0.278, 0.006, 0.008, 0.006, + 0.005, 0.416, 0.004, 0.006, 0.005, 0.014, 0.004, 0.007, 0.006, 0.006, + 0.149, 5.025, 0.014, 0.011, 0.012, 0.067, 0.295, 0.006, 0.022, 0.01, + 0.019, 0.017, 0.605, 0.022, 0.039, 0.006, 0.0001, 0.0001, 0.035, 2.796, + 4.495, 1.1, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, + 0.003, 0.002, 0.256, 0.079, 0.004, 0.002, 0.0001, 0.004, 0.008, 0.013, + 0.021, 0.017, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.015, + 0.009, 0.398, 0.007, 0.004, 0.019, 0.009, 0.005, 0.004, 0.004, 0.003, + 0.002, 0.004, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + csb: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.825, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.296, 0.002, 0.584, 0.0001, + 0.0001, 0.003, 0.001, 0.009, 0.331, 0.334, 0.002, 0.0001, 0.877, 0.236, + 1.256, 0.065, 0.271, 0.637, 0.291, 0.193, 0.181, 0.174, 0.153, 0.187, + 0.256, 0.339, 0.093, 0.04, 0.024, 0.004, 0.024, 0.003, 0.0001, 0.093, + 0.136, 0.203, 0.135, 0.053, 0.045, 0.141, 0.038, 0.163, 0.132, 0.28, + 0.122, 0.184, 0.116, 0.024, 0.275, 0.002, 0.1, 0.23, 0.118, 0.014, + 0.056, 0.218, 0.119, 0.003, 0.085, 0.006, 0.0001, 0.007, 0.0001, 0.002, + 0.0001, 4.612, 0.986, 3.096, 2.007, 3.546, 0.161, 1.136, 0.946, 4.255, + 1.343, 2.142, 1.634, 1.571, 3.378, 2.668, 1.384, 0.004, 3.469, 3.152, + 2.405, 0.834, 0.037, 2.89, 0.011, 0.614, 4.079, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.169, 0.025, 0.879, 0.003, 0.332, 0.515, 0.031, 0.005, + 0.001, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.005, 0.001, 0.013, + 0.102, 0.134, 0.005, 0.002, 0.001, 0.001, 0.003, 0.049, 0.005, 0.012, + 0.006, 0.026, 0.025, 0.003, 0.016, 0.006, 0.006, 0.677, 0.002, 0.001, + 0.001, 0.001, 0.003, 1.17, 0.001, 2.19, 0.001, 0.003, 0.0001, 0.002, + 0.009, 0.003, 2.322, 0.76, 1.31, 0.003, 0.004, 0.001, 0.007, 0.615, + 0.005, 0.077, 0.465, 0.007, 0.003, 0.002, 0.0001, 0.0001, 0.14, 9.122, + 0.543, 1.724, 0.0001, 0.001, 0.002, 0.003, 0.001, 0.001, 0.0001, 0.0001, + 0.006, 0.002, 0.024, 0.023, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.005, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.005, 0.197, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + cu: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.095, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.137, 0.0001, 0.05, 0.0001, + 0.001, 0.001, 0.0001, 0.002, 0.026, 0.026, 0.001, 0.0001, 0.049, 0.014, + 0.024, 0.015, 0.131, 0.259, 0.12, 0.082, 0.083, 0.082, 0.076, 0.078, + 0.096, 0.129, 0.009, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.003, 0.001, 0.006, 0.001, 0.001, 0.001, 0.0001, 0.006, 0.004, 0.0001, + 0.001, 0.001, 0.002, 0.002, 0.004, 0.001, 0.0001, 0.002, 0.004, 0.002, + 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.003, 0.0001, 0.023, 0.002, 0.008, 0.007, 0.018, 0.001, 0.005, + 0.004, 0.017, 0.005, 0.009, 0.01, 0.003, 0.016, 0.015, 0.003, 0.001, + 0.01, 0.011, 0.009, 0.011, 0.004, 0.0001, 0.002, 0.002, 0.003, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 1.938, 4.019, 2.29, 0.582, 0.265, 0.184, + 0.28, 0.33, 0.175, 0.126, 2.698, 0.002, 1.962, 0.002, 0.135, 0.0001, + 0.124, 0.906, 0.12, 0.072, 1.561, 0.0001, 0.139, 0.857, 0.034, 2.179, + 0.103, 0.119, 0.097, 0.099, 0.095, 0.124, 0.126, 0.438, 0.049, 1.297, + 0.06, 0.96, 0.01, 0.295, 0.011, 0.359, 0.005, 0.236, 0.002, 0.101, + 0.019, 0.025, 3.114, 0.623, 1.373, 0.62, 1.221, 0.086, 0.518, 0.573, + 2.627, 0.002, 1.325, 1.567, 0.924, 2.121, 2.823, 0.585, 0.0001, 0.0001, + 0.514, 0.003, 0.006, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.001, 0.408, 0.0001, 0.016, 0.012, 21.25, 18.718, 0.249, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.51, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 1.747, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + cv: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.247, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.093, 0.001, 0.059, 0.0001, + 0.0001, 0.007, 0.0001, 0.003, 0.152, 0.151, 0.0001, 0.002, 0.478, 0.273, + 0.79, 0.011, 0.204, 0.309, 0.183, 0.104, 0.101, 0.1, 0.081, 0.081, + 0.096, 0.17, 0.076, 0.008, 0.002, 0.002, 0.002, 0.003, 0.0001, 0.004, + 0.003, 0.005, 0.002, 0.002, 0.002, 0.002, 0.002, 0.019, 0.001, 0.001, + 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.003, 0.005, 0.003, 0.002, + 0.006, 0.001, 0.01, 0.001, 0.0001, 0.013, 0.0001, 0.013, 0.0001, 0.001, + 0.0001, 0.027, 0.004, 0.007, 0.008, 0.027, 0.004, 0.006, 0.007, 0.02, + 0.001, 0.004, 0.016, 0.009, 0.019, 0.018, 0.006, 0.0001, 0.019, 0.014, + 0.015, 0.011, 0.003, 0.002, 0.002, 0.004, 0.001, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 3.257, 1.78, 2.381, 2.851, 0.156, 1.36, 0.178, 0.773, + 1.001, 0.006, 0.006, 0.869, 0.319, 0.035, 0.373, 0.165, 0.161, 0.088, + 0.098, 0.049, 0.312, 2.25, 0.007, 0.017, 0.069, 0.007, 0.174, 0.039, + 0.101, 0.06, 0.095, 0.155, 0.212, 0.157, 0.129, 0.054, 0.061, 0.066, + 0.005, 1.16, 0.101, 0.002, 0.0001, 0.045, 0.001, 0.021, 0.156, 0.041, + 4.16, 0.372, 1.295, 0.368, 0.304, 3.139, 0.041, 0.13, 2.185, 0.64, + 1.311, 1.785, 0.994, 3.619, 1.18, 1.135, 0.0001, 0.0001, 0.101, 1.175, + 3.79, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, + 0.0001, 0.002, 0.001, 24.733, 13.586, 0.004, 0.088, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.282, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + cy: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.628, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.48, 0.003, 0.545, 0.0001, + 0.001, 0.007, 0.002, 0.872, 0.259, 0.258, 0.001, 0.001, 0.777, 0.194, + 0.96, 0.016, 0.363, 0.487, 0.244, 0.138, 0.133, 0.135, 0.125, 0.126, + 0.164, 0.239, 0.149, 0.081, 0.022, 0.001, 0.022, 0.003, 0.0001, 0.36, + 0.242, 0.56, 0.267, 0.155, 0.163, 0.331, 0.126, 0.112, 0.06, 0.033, + 0.279, 0.433, 0.133, 0.073, 0.238, 0.004, 0.18, 0.303, 0.196, 0.061, + 0.026, 0.092, 0.003, 0.167, 0.006, 0.004, 0.0001, 0.004, 0.0001, 0.001, + 0.0001, 7.082, 0.905, 1.506, 6.475, 6.263, 2.165, 2.494, 2.4, 4.773, + 0.015, 0.114, 3.901, 1.419, 6.217, 4.277, 0.556, 0.008, 5.57, 2.092, + 2.13, 1.941, 0.086, 2.82, 0.025, 5.712, 0.034, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.074, 0.005, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.021, 0.002, 0.001, 0.0001, 0.001, 0.002, 0.033, 0.001, 0.001, + 0.007, 0.009, 0.001, 0.001, 0.033, 0.007, 0.059, 0.003, 0.003, 0.001, + 0.001, 0.003, 0.004, 0.015, 0.016, 0.004, 0.001, 0.004, 0.01, 0.012, + 0.004, 0.003, 0.003, 0.004, 0.074, 0.043, 0.005, 0.016, 0.003, 0.006, + 0.003, 0.002, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.036, 0.221, + 0.003, 0.06, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, + 0.0001, 0.007, 0.004, 0.014, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.002, 0.072, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + din: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.698, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.927, 0.0001, 0.06, 0.0001, + 0.003, 0.013, 0.0001, 0.015, 0.171, 0.17, 0.0001, 0.0001, 0.878, 0.077, + 0.901, 0.027, 0.297, 0.229, 0.151, 0.055, 0.064, 0.078, 0.053, 0.048, + 0.049, 0.126, 0.018, 0.013, 0.002, 0.0001, 0.002, 0.005, 0.0001, 0.424, + 0.153, 0.093, 0.101, 0.075, 0.019, 0.074, 0.021, 0.051, 0.069, 0.324, + 0.085, 0.16, 0.163, 0.021, 0.306, 0.002, 0.087, 0.062, 0.288, 0.034, + 0.007, 0.069, 0.0001, 0.136, 0.003, 0.027, 0.0001, 0.027, 0.0001, + 0.0001, 0.0001, 5.438, 0.999, 2.9, 1.603, 4.394, 0.024, 0.521, 1.912, + 3.749, 0.362, 4.818, 2.02, 1.512, 4.26, 1.668, 1.035, 0.003, 2.29, + 0.155, 3.595, 3.428, 0.022, 0.527, 0.011, 2.005, 0.013, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.036, 0.001, 0.001, 0.0001, 0.027, 0.0001, + 0.026, 0.0001, 1.487, 0.0001, 0.005, 1.04, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 2.319, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 0.0001, 1.678, 0.006, 0.006, 0.0001, 0.0001, 0.01, 0.0001, + 0.0001, 0.222, 1.181, 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.0001, 3.25, + 0.0001, 0.001, 0.006, 1.508, 0.003, 0.002, 0.006, 0.002, 0.0001, 0.011, + 1.021, 0.001, 0.004, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.002, + 0.0001, 0.0001, 0.016, 6.971, 0.0001, 1.041, 0.02, 0.0001, 0.0001, + 4.193, 0.0001, 0.0001, 1.487, 0.0001, 0.027, 0.005, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.062, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, + ], + diq: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.719, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.354, 0.008, 0.4, 0.0001, + 0.0001, 0.009, 0.0001, 0.031, 0.299, 0.3, 0.001, 0.003, 0.98, 0.165, + 1.27, 0.045, 0.227, 0.302, 0.162, 0.087, 0.08, 0.089, 0.076, 0.082, + 0.096, 0.17, 0.156, 0.035, 0.026, 0.008, 0.027, 0.01, 0.0001, 0.309, + 0.187, 0.135, 0.206, 0.243, 0.108, 0.12, 0.188, 0.05, 0.033, 0.209, + 0.106, 0.271, 0.167, 0.06, 0.167, 0.062, 0.13, 0.271, 0.259, 0.059, + 0.085, 0.06, 0.052, 0.088, 0.128, 0.014, 0.0001, 0.014, 0.0001, 0.002, + 0.001, 7.586, 1.293, 0.911, 2.514, 8.148, 0.439, 0.62, 0.759, 4.61, + 0.11, 2.125, 1.599, 2.095, 4.93, 3.468, 0.588, 0.377, 4.808, 2.018, + 2.359, 1.695, 0.626, 1.106, 0.479, 3.36, 1.081, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.078, 0.018, 0.011, 0.012, 0.02, 0.015, 0.019, 0.078, + 0.016, 0.004, 0.018, 0.002, 0.014, 0.004, 0.014, 0.003, 0.006, 0.005, + 0.003, 0.011, 0.005, 0.006, 0.005, 0.002, 0.009, 0.023, 0.002, 0.004, + 0.022, 0.016, 0.065, 0.865, 0.032, 0.01, 0.013, 0.005, 0.007, 0.004, + 0.006, 0.242, 0.014, 0.032, 2.716, 0.012, 0.007, 0.008, 0.29, 0.015, + 0.191, 2.379, 0.013, 0.015, 0.01, 0.006, 0.021, 0.004, 0.009, 0.01, + 0.007, 0.128, 0.093, 0.009, 0.008, 0.006, 0.0001, 0.0001, 0.039, 3.563, + 2.668, 0.816, 0.0001, 0.001, 0.0001, 0.005, 0.003, 0.002, 0.002, 0.0001, + 0.03, 0.013, 0.034, 0.014, 0.001, 0.0001, 0.001, 0.012, 0.005, 0.037, + 0.126, 0.091, 0.007, 0.013, 0.003, 0.0001, 0.0001, 0.0001, 0.019, 0.012, + 0.072, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + dsb: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.783, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.853, 0.003, 0.608, 0.0001, + 0.0001, 0.007, 0.002, 0.016, 0.311, 0.311, 0.022, 0.002, 0.839, 0.138, + 1.194, 0.023, 0.287, 0.411, 0.214, 0.128, 0.124, 0.131, 0.109, 0.104, + 0.125, 0.201, 0.084, 0.035, 0.006, 0.007, 0.007, 0.003, 0.0001, 0.155, + 0.168, 0.123, 0.122, 0.077, 0.058, 0.102, 0.068, 0.054, 0.115, 0.164, + 0.108, 0.197, 0.144, 0.038, 0.256, 0.004, 0.113, 0.246, 0.119, 0.042, + 0.025, 0.244, 0.005, 0.007, 0.075, 0.008, 0.0001, 0.008, 0.0001, 0.002, + 0.0001, 6.833, 1.047, 1.719, 1.818, 5.619, 0.234, 0.977, 0.835, 3.647, + 3.795, 2.962, 1.965, 2.079, 4.006, 5.923, 1.615, 0.008, 3.224, 3.399, + 2.803, 2.458, 0.071, 3.327, 0.021, 1.623, 1.195, 0.0001, 0.003, 0.0001, + 0.001, 0.0001, 0.148, 0.049, 0.931, 0.01, 0.22, 0.006, 0.005, 0.266, + 0.005, 0.002, 0.002, 0.002, 0.017, 0.029, 0.002, 0.002, 0.007, 0.003, + 0.004, 0.026, 0.004, 0.064, 0.004, 0.004, 0.009, 0.024, 0.008, 1.886, + 0.043, 0.009, 0.04, 0.009, 0.064, 0.625, 0.008, 0.004, 0.017, 0.003, + 0.003, 0.004, 0.006, 0.017, 0.003, 0.004, 0.001, 0.008, 0.001, 0.002, + 0.019, 0.008, 0.014, 1.225, 0.005, 0.009, 0.011, 0.005, 0.012, 0.012, + 0.395, 0.009, 0.027, 0.02, 0.616, 0.016, 0.0001, 0.0001, 0.039, 1.311, + 1.431, 3.692, 0.0001, 0.0001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.0001, + 0.017, 0.009, 0.074, 0.029, 0.001, 0.0001, 0.0001, 0.002, 0.007, 0.043, + 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, + 0.012, 0.141, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + dty: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.724, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.716, 0.001, 0.019, 0.0001, + 0.0001, 0.003, 0.0001, 0.008, 0.063, 0.066, 0.001, 0.0001, 0.189, 0.033, + 0.052, 0.008, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.027, 0.004, 0.012, 0.001, 0.012, 0.001, 0.0001, 0.002, + 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.017, 0.012, 0.004, 0.005, 0.014, 0.002, 0.003, 0.006, + 0.016, 0.001, 0.004, 0.007, 0.008, 0.013, 0.011, 0.003, 0.0001, 0.019, + 0.008, 0.009, 0.004, 0.001, 0.003, 0.0001, 0.003, 0.001, 0.0001, 0.015, + 0.0001, 0.0001, 0.0001, 0.87, 0.744, 0.354, 0.069, 0.0001, 0.295, 0.114, + 1.106, 0.404, 0.216, 0.006, 1.008, 0.08, 2.434, 0.0001, 0.171, 0.009, + 0.001, 0.001, 0.025, 0.014, 1.53, 0.174, 0.539, 0.045, 0.068, 0.25, + 0.269, 0.443, 0.023, 0.04, 0.304, 0.083, 0.214, 0.028, 0.182, 24.937, + 7.5, 0.641, 0.298, 1.687, 0.033, 0.816, 0.129, 0.459, 0.371, 1.179, + 1.062, 2.109, 0.002, 1.084, 0.0001, 0.0001, 0.578, 0.275, 0.191, 1.004, + 0.659, 0.001, 0.0001, 0.01, 0.01, 3.197, 1.534, 0.0001, 0.0001, 0.004, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 30.897, 0.0001, 0.034, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + dv: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.449, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.782, 0.003, 0.057, 0.0001, + 0.0001, 0.005, 0.0001, 0.005, 0.068, 0.068, 0.0001, 0.001, 0.01, 0.02, + 0.58, 0.003, 0.08, 0.111, 0.068, 0.041, 0.031, 0.037, 0.03, 0.031, + 0.035, 0.052, 0.01, 0.001, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.003, + 0.001, 0.005, 0.002, 0.002, 0.002, 0.001, 0.003, 0.003, 0.001, 0.001, + 0.001, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.002, 0.003, 0.005, 0.001, + 0.001, 0.003, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, + 0.004, 0.0001, 0.069, 0.013, 0.026, 0.027, 0.096, 0.015, 0.017, 0.033, + 0.065, 0.001, 0.006, 0.037, 0.021, 0.063, 0.061, 0.016, 0.001, 0.05, + 0.05, 0.064, 0.025, 0.009, 0.011, 0.002, 0.014, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.961, 0.592, 2.65, 1.657, 0.723, 0.269, 1.597, + 3.461, 1.72, 1.651, 0.757, 0.977, 1.223, 0.768, 1.538, 0.011, 0.778, + 0.359, 0.094, 0.266, 0.255, 0.126, 0.187, 0.051, 0.006, 0.076, 0.047, + 0.004, 0.004, 0.086, 0.041, 0.008, 0.02, 0.003, 0.091, 0.008, 0.069, + 0.003, 5.331, 1.558, 2.986, 0.988, 3.164, 0.17, 3.662, 0.439, 0.51, + 0.17, 3.636, 0.006, 0.014, 0.003, 0.002, 0.002, 0.001, 0.014, 0.001, + 0.004, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.201, 0.101, 0.0001, 0.002, 0.0001, + 0.0001, 45.417, 0.0001, 0.002, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + dz: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.39, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.815, 0.0001, 0.004, 0.0001, + 0.0001, 0.001, 0.0001, 0.001, 0.023, 0.023, 0.0001, 0.002, 0.003, 0.013, + 0.008, 0.001, 0.017, 0.015, 0.012, 0.006, 0.005, 0.004, 0.005, 0.004, + 0.004, 0.004, 0.001, 0.0001, 0.007, 0.0001, 0.007, 0.001, 0.0001, 0.002, + 0.004, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.001, 0.003, 0.001, 0.0001, 0.004, 0.0001, 0.002, 0.003, 0.002, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.001, 0.0001, 0.03, 0.011, 0.006, 0.008, 0.024, 0.002, 0.006, 0.009, + 0.021, 0.002, 0.004, 0.014, 0.011, 0.019, 0.021, 0.004, 0.0001, 0.02, + 0.011, 0.013, 0.01, 0.002, 0.002, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.269, 0.247, 1.794, 0.002, 1.18, 0.189, 0.19, + 0.052, 0.002, 0.102, 0.016, 7.859, 0.051, 0.549, 0.008, 0.12, 0.301, + 1.592, 0.28, 1.053, 0.694, 0.157, 1.278, 0.061, 0.824, 0.093, 0.2, + 0.068, 0.006, 0.019, 0.267, 0.283, 0.898, 0.517, 1.238, 0.954, 0.214, + 0.015, 2.251, 0.029, 0.117, 0.081, 0.001, 0.058, 0.0001, 0.012, 0.002, + 0.0001, 0.002, 0.89, 2.149, 0.094, 1.08, 0.001, 0.0001, 0.053, 0.001, + 0.0001, 0.926, 0.001, 10.076, 21.494, 2.583, 0.002, 0.0001, 0.0001, + 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 32.733, 0.0001, 0.016, 0.005, 0.001, 0.002, + 0.002, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ee: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.047, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.659, 0.001, 0.347, 0.0001, + 0.001, 0.004, 0.004, 0.044, 0.199, 0.199, 0.001, 0.0001, 0.713, 0.054, + 1.348, 0.005, 0.312, 0.38, 0.219, 0.115, 0.09, 0.132, 0.118, 0.118, + 0.109, 0.211, 0.064, 0.006, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.552, + 0.172, 0.134, 0.182, 0.397, 0.085, 0.215, 0.112, 0.083, 0.04, 0.209, + 0.217, 0.202, 0.168, 0.043, 0.117, 0.006, 0.112, 0.229, 0.176, 0.053, + 0.059, 0.177, 0.021, 0.139, 0.02, 0.003, 0.0001, 0.003, 0.0001, 0.0001, + 0.0001, 7.214, 1.62, 0.258, 2.122, 10.212, 0.557, 1.427, 0.62, 4.11, + 0.028, 2.137, 3.419, 2.267, 3.348, 4.663, 0.886, 0.007, 1.264, 2.303, + 2.327, 2.541, 0.557, 2.031, 0.389, 1.697, 0.84, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.058, 0.011, 0.016, 0.109, 0.004, 0.002, 0.009, 0.001, + 0.003, 0.01, 0.044, 0.61, 0.005, 0.002, 0.0001, 0.003, 0.018, 0.018, + 1.229, 0.009, 2.883, 0.003, 1.23, 0.001, 0.002, 0.008, 0.003, 0.085, + 0.02, 0.018, 0.001, 0.001, 0.052, 0.01, 0.004, 0.485, 0.002, 0.0001, + 0.002, 0.004, 0.005, 0.042, 0.003, 0.002, 0.003, 0.025, 0.002, 0.002, + 0.007, 0.009, 0.047, 0.01, 0.005, 0.003, 0.005, 0.003, 0.006, 0.005, + 0.14, 0.007, 0.005, 0.138, 0.008, 0.004, 0.0001, 0.0001, 0.039, 0.487, + 0.018, 0.548, 1.276, 0.0001, 0.004, 4.335, 0.128, 0.004, 0.106, 0.013, + 0.028, 0.013, 0.041, 0.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, + 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.138, 0.051, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + eml: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.684, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.039, 0.004, 0.415, 0.0001, + 0.0001, 0.004, 0.001, 1.632, 0.216, 0.216, 0.001, 0.001, 0.746, 0.069, + 0.997, 0.011, 0.415, 0.659, 0.408, 0.216, 0.231, 0.235, 0.226, 0.213, + 0.215, 0.256, 0.061, 0.026, 0.05, 0.006, 0.05, 0.003, 0.0001, 0.44, + 0.139, 0.4, 0.112, 0.078, 0.095, 0.114, 0.018, 0.424, 0.019, 0.012, + 0.251, 0.226, 0.059, 0.026, 0.233, 0.016, 0.153, 0.231, 0.099, 0.036, + 0.164, 0.011, 0.127, 0.003, 0.015, 0.004, 0.0001, 0.004, 0.0001, 0.002, + 0.0001, 7.63, 0.549, 2.301, 3.601, 3.529, 0.617, 1.263, 0.808, 5.22, + 0.113, 0.052, 4.92, 1.657, 5.406, 1.72, 1.353, 0.118, 3.957, 2.689, + 3.146, 2.026, 0.904, 0.024, 0.02, 0.047, 0.34, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.239, 0.003, 0.006, 0.003, 0.004, 0.052, 0.002, 0.003, + 0.008, 0.003, 0.006, 0.001, 0.002, 0.193, 0.002, 0.001, 0.002, 0.002, + 0.003, 0.098, 0.002, 0.001, 0.001, 0.001, 0.033, 0.188, 0.003, 0.047, + 0.006, 0.006, 0.001, 0.078, 0.562, 0.025, 0.617, 0.129, 0.182, 0.072, + 0.003, 0.005, 1.444, 0.829, 0.895, 0.057, 0.235, 0.011, 0.346, 0.001, + 0.004, 0.003, 0.664, 0.345, 0.314, 0.007, 0.019, 0.001, 0.003, 0.275, + 0.004, 0.186, 0.062, 0.002, 0.002, 0.006, 0.0001, 0.0001, 0.011, 6.936, + 0.1, 0.325, 0.0001, 0.004, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.003, 0.002, 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.192, 0.237, 0.003, 0.002, 0.005, 0.003, 0.003, 0.001, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + eo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.154, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.737, 0.006, 0.429, 0.0001, + 0.0001, 0.01, 0.001, 0.015, 0.235, 0.235, 0.001, 0.003, 0.936, 0.306, + 0.916, 0.015, 0.284, 0.481, 0.226, 0.14, 0.134, 0.143, 0.121, 0.123, + 0.155, 0.273, 0.072, 0.027, 0.012, 0.007, 0.013, 0.002, 0.0001, 0.209, + 0.154, 0.114, 0.106, 0.232, 0.094, 0.127, 0.102, 0.106, 0.077, 0.183, + 0.354, 0.184, 0.118, 0.083, 0.187, 0.004, 0.116, 0.241, 0.149, 0.061, + 0.074, 0.035, 0.004, 0.009, 0.024, 0.021, 0.0001, 0.021, 0.0001, 0.004, + 0.0001, 9.544, 0.784, 0.841, 2.534, 6.934, 0.706, 0.989, 0.423, 6.212, + 2.407, 2.868, 4.302, 1.963, 5.456, 7.143, 1.699, 0.009, 4.617, 4.113, + 4.222, 2.31, 1.083, 0.045, 0.017, 0.108, 0.46, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 0.058, 0.01, 0.009, 0.008, 0.004, 0.004, 0.002, 0.003, + 0.037, 0.239, 0.001, 0.001, 0.004, 0.007, 0.001, 0.002, 0.002, 0.007, + 0.002, 0.018, 0.008, 0.001, 0.002, 0.002, 0.002, 0.012, 0.003, 0.005, + 0.093, 0.609, 0.008, 0.005, 0.021, 0.066, 0.005, 0.003, 0.01, 0.029, + 0.002, 0.005, 0.005, 0.035, 0.002, 0.007, 0.002, 0.34, 0.001, 0.002, + 0.012, 0.007, 0.011, 0.025, 0.006, 0.093, 0.016, 0.003, 0.007, 0.003, + 0.008, 0.009, 0.016, 0.009, 0.009, 0.003, 0.0001, 0.0001, 0.038, 0.2, + 0.946, 0.502, 0.0001, 0.001, 0.005, 0.001, 0.001, 0.001, 0.001, 0.0001, + 0.012, 0.006, 0.045, 0.015, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.003, + 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, + 0.003, 0.056, 0.002, 0.001, 0.003, 0.002, 0.001, 0.001, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + eu: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.418, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.177, 0.001, 0.297, 0.0001, + 0.0001, 0.006, 0.001, 0.01, 0.167, 0.167, 0.0001, 0.001, 1.097, 0.307, + 1.039, 0.006, 0.582, 0.665, 0.539, 0.263, 0.232, 0.207, 0.196, 0.233, + 0.193, 0.297, 0.077, 0.037, 0.019, 0.004, 0.019, 0.001, 0.0001, 0.228, + 0.197, 0.105, 0.074, 0.177, 0.09, 0.111, 0.131, 0.123, 0.048, 0.077, + 0.106, 0.134, 0.065, 0.059, 0.121, 0.005, 0.05, 0.134, 0.08, 0.034, + 0.046, 0.019, 0.022, 0.008, 0.029, 0.005, 0.0001, 0.005, 0.0001, 0.002, + 0.0001, 11.924, 1.97, 0.229, 2.409, 9.817, 0.3, 1.545, 0.915, 6.874, + 0.162, 4.015, 2.508, 1.08, 6.457, 4.385, 0.883, 0.011, 6.261, 2.025, + 5.706, 3.55, 0.077, 0.032, 0.337, 0.117, 3.463, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 0.014, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.003, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.001, + 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.001, 0.003, 0.003, 0.0001, 0.001, 0.008, 0.009, 0.002, 0.002, 0.004, + 0.001, 0.001, 0.003, 0.009, 0.023, 0.001, 0.012, 0.001, 0.01, 0.001, + 0.001, 0.003, 0.012, 0.007, 0.008, 0.006, 0.001, 0.003, 0.001, 0.002, + 0.001, 0.004, 0.012, 0.004, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.039, + 0.094, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.005, 0.003, 0.007, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.001, 0.013, 0.001, 0.0001, 0.002, 0.001, 0.001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ext: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.183, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.144, 0.002, 0.474, 0.0001, + 0.0001, 0.008, 0.001, 0.271, 0.191, 0.19, 0.004, 0.002, 1.06, 0.101, + 0.854, 0.021, 0.249, 0.293, 0.188, 0.105, 0.088, 0.096, 0.085, 0.084, + 0.099, 0.161, 0.072, 0.026, 0.008, 0.003, 0.006, 0.002, 0.0001, 0.241, + 0.103, 0.248, 0.095, 0.369, 0.065, 0.091, 0.071, 0.128, 0.047, 0.018, + 0.238, 0.161, 0.09, 0.062, 0.171, 0.026, 0.094, 0.188, 0.116, 0.077, + 0.083, 0.02, 0.035, 0.009, 0.011, 0.028, 0.0001, 0.029, 0.0001, 0.001, + 0.002, 8.822, 0.896, 2.974, 2.338, 7.586, 0.409, 0.951, 0.639, 6.63, + 0.18, 0.079, 4.794, 1.966, 5.508, 3.713, 1.742, 0.451, 4.358, 5.625, + 3.427, 5.456, 0.664, 0.026, 0.047, 0.265, 0.205, 0.0001, 0.012, 0.0001, + 0.001, 0.0001, 0.09, 0.042, 0.016, 0.012, 0.021, 0.01, 0.009, 0.007, + 0.019, 0.01, 0.009, 0.002, 0.007, 0.012, 0.003, 0.002, 0.01, 0.006, + 0.003, 0.011, 0.012, 0.003, 0.002, 0.002, 0.004, 0.049, 0.003, 0.005, + 0.01, 0.009, 0.003, 0.003, 0.02, 0.663, 0.003, 0.009, 0.008, 0.004, + 0.004, 0.092, 0.006, 0.332, 0.01, 0.012, 0.009, 0.354, 0.005, 0.01, + 0.016, 0.295, 0.019, 0.537, 0.024, 0.015, 0.008, 0.008, 0.011, 0.017, + 0.174, 0.02, 0.041, 0.023, 0.01, 0.023, 0.0001, 0.0001, 0.078, 2.453, + 0.012, 0.009, 0.0001, 0.0001, 0.0001, 0.019, 0.008, 0.025, 0.005, + 0.0001, 0.151, 0.073, 0.021, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.005, 0.034, 0.026, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.013, 0.021, 0.082, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ff: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.229, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.756, 0.003, 0.154, 0.0001, + 0.0001, 0.002, 0.0001, 0.07, 0.321, 0.324, 0.004, 0.001, 1.19, 0.201, + 1.011, 0.039, 0.221, 0.281, 0.197, 0.076, 0.082, 0.099, 0.098, 0.084, + 0.101, 0.154, 0.153, 0.028, 0.04, 0.008, 0.04, 0.01, 0.0001, 0.371, + 0.159, 0.12, 0.097, 0.095, 0.198, 0.111, 0.12, 0.065, 0.102, 0.267, + 0.138, 0.299, 0.201, 0.095, 0.085, 0.014, 0.046, 0.262, 0.159, 0.061, + 0.013, 0.059, 0.003, 0.066, 0.008, 0.007, 0.0001, 0.007, 0.0001, 0.006, + 0.0001, 10.449, 0.928, 0.343, 3.119, 8.063, 0.727, 1.432, 1.127, 6.432, + 0.966, 2.387, 3.274, 2.586, 6.222, 6.89, 0.484, 0.058, 2.623, 1.086, + 2.251, 3.239, 0.048, 1.581, 0.013, 1.385, 0.042, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.25, 0.043, 0.0001, 0.008, 0.007, 0.001, 0.007, 0.002, + 0.023, 0.003, 0.031, 0.086, 0.001, 0.0001, 0.009, 0.005, 0.007, 0.017, + 0.003, 1.378, 0.001, 0.001, 0.0001, 1.485, 0.01, 0.123, 0.001, 0.002, + 0.036, 0.035, 0.003, 0.0001, 0.06, 0.009, 0.0001, 0.003, 0.0001, 0.002, + 0.02, 0.011, 0.007, 0.04, 0.001, 0.024, 0.001, 0.003, 0.0001, 0.0001, + 0.006, 0.154, 0.006, 0.01, 0.135, 0.002, 0.002, 0.009, 0.004, 0.002, + 0.004, 0.025, 0.02, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.111, 0.229, + 0.005, 0.088, 0.202, 0.0001, 0.0001, 2.86, 0.02, 0.001, 0.001, 0.0001, + 0.003, 0.0001, 0.017, 0.011, 0.0001, 0.0001, 0.001, 0.002, 0.002, + 0.0001, 0.023, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.01, 0.248, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + fj: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 4.647, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.11, 0.005, 0.222, 0.0001, + 0.0001, 0.0001, 0.002, 0.182, 0.39, 0.39, 0.002, 0.003, 0.665, 0.202, + 1.418, 0.055, 0.382, 0.504, 0.342, 0.179, 0.168, 0.196, 0.159, 0.133, + 0.129, 0.164, 0.07, 0.04, 0.02, 0.002, 0.02, 0.013, 0.002, 0.352, 0.212, + 0.246, 0.146, 0.319, 0.066, 0.096, 0.061, 0.166, 0.217, 0.277, 0.179, + 0.262, 0.29, 0.095, 0.254, 0.022, 0.118, 0.377, 0.355, 0.066, 0.534, + 0.043, 0.003, 0.05, 0.01, 0.0001, 0.0001, 0.005, 0.0001, 0.008, 0.0001, + 13.891, 0.708, 1.055, 1.505, 4.909, 0.352, 0.936, 0.685, 8.96, 0.075, + 2.998, 2.827, 2.182, 5.506, 3.831, 0.546, 0.257, 2.747, 2.722, 3.592, + 4.532, 2.046, 0.526, 0.045, 0.71, 0.111, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.267, 0.01, 0.007, 0.005, 0.007, 0.002, 0.0001, 0.002, 0.003, + 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.008, 0.0001, + 0.0001, 0.013, 0.192, 0.0001, 0.003, 0.002, 0.0001, 0.008, 0.002, + 0.0001, 0.023, 0.022, 0.002, 0.0001, 0.007, 0.005, 0.0001, 0.01, 0.003, + 0.0001, 0.002, 0.005, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.01, + 0.0001, 0.0001, 0.008, 0.0001, 0.003, 0.022, 0.003, 0.002, 0.005, + 0.0001, 0.008, 0.0001, 0.01, 0.0001, 0.0001, 0.0001, 0.002, 0.002, + 0.0001, 0.0001, 0.013, 0.065, 0.0001, 0.023, 0.002, 0.0001, 0.0001, + 0.013, 0.0001, 0.007, 0.0001, 0.0001, 0.0001, 0.002, 0.01, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 0.26, 0.0001, + 0.003, 0.002, 0.0001, 0.003, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, + ], + fo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.171, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.257, 0.003, 0.223, 0.0001, + 0.0001, 0.01, 0.002, 0.015, 0.14, 0.141, 0.001, 0.001, 0.983, 0.292, + 1.473, 0.021, 0.562, 0.624, 0.361, 0.197, 0.187, 0.183, 0.177, 0.172, + 0.176, 0.285, 0.092, 0.018, 0.015, 0.005, 0.015, 0.002, 0.0001, 0.162, + 0.14, 0.076, 0.088, 0.116, 0.204, 0.083, 0.244, 0.058, 0.087, 0.291, + 0.108, 0.161, 0.114, 0.065, 0.092, 0.004, 0.082, 0.312, 0.204, 0.061, + 0.078, 0.034, 0.003, 0.012, 0.006, 0.004, 0.0001, 0.004, 0.0001, 0.002, + 0.0001, 6.488, 0.752, 0.145, 1.557, 3.939, 1.383, 2.415, 1.123, 6.407, + 0.628, 2.151, 3.099, 2.563, 5.616, 2.172, 0.663, 0.005, 6.541, 3.536, + 4.094, 3.571, 2.164, 0.044, 0.017, 0.862, 0.025, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.054, 0.049, 0.002, 0.002, 0.002, 0.004, 0.003, 0.001, + 0.001, 0.001, 0.001, 0.0001, 0.001, 0.091, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.033, 0.002, 0.001, 0.002, 0.001, 0.017, 0.004, 0.006, 0.001, + 0.006, 0.009, 0.001, 0.001, 0.01, 0.939, 0.001, 0.001, 0.016, 0.008, + 0.277, 0.003, 0.006, 0.007, 0.001, 0.002, 0.001, 1.13, 0.001, 0.004, + 1.899, 0.003, 0.003, 0.718, 0.002, 0.002, 0.014, 0.001, 0.801, 0.002, + 0.333, 0.003, 0.004, 0.203, 0.003, 0.002, 0.0001, 0.0001, 0.022, 6.504, + 0.004, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.012, 0.005, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 0.004, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.002, 0.053, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + frp: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.788, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.014, 0.012, 0.659, 0.001, + 0.0001, 0.001, 0.001, 0.361, 0.368, 0.368, 0.001, 0.0001, 0.743, 0.467, + 0.873, 0.02, 0.214, 0.426, 0.274, 0.128, 0.113, 0.117, 0.113, 0.107, + 0.116, 0.228, 0.11, 0.019, 0.081, 0.005, 0.081, 0.002, 0.0001, 0.35, + 0.279, 0.333, 0.142, 0.141, 0.152, 0.135, 0.066, 0.159, 0.087, 0.033, + 0.593, 0.22, 0.099, 0.082, 0.206, 0.019, 0.236, 0.314, 0.121, 0.062, + 0.179, 0.013, 0.025, 0.027, 0.009, 0.022, 0.0001, 0.022, 0.0001, 0.006, + 0.0001, 6.3, 0.639, 2.237, 2.924, 6.953, 0.549, 0.996, 0.581, 3.639, + 0.252, 0.124, 3.838, 1.505, 5.552, 4.982, 1.442, 0.366, 4.363, 4.487, + 4.4, 2.763, 0.919, 0.029, 0.168, 0.501, 0.132, 0.0001, 0.008, 0.0001, + 0.001, 0.0001, 0.591, 0.012, 0.04, 0.026, 0.003, 0.003, 0.002, 0.002, + 0.077, 0.083, 0.002, 0.003, 0.004, 0.003, 0.002, 0.005, 0.007, 0.003, + 0.002, 0.023, 0.039, 0.002, 0.001, 0.002, 0.013, 0.56, 0.002, 0.002, + 0.004, 0.004, 0.002, 0.004, 0.079, 0.014, 0.761, 0.004, 0.005, 0.003, + 0.004, 0.044, 1.724, 0.994, 0.451, 0.049, 0.014, 0.007, 0.008, 0.004, + 0.024, 0.005, 0.02, 0.03, 0.411, 0.012, 0.002, 0.176, 0.006, 0.01, + 0.014, 0.089, 0.007, 0.007, 0.007, 0.005, 0.0001, 0.0001, 0.277, 4.789, + 0.008, 0.018, 0.001, 0.0001, 0.0001, 0.008, 0.004, 0.004, 0.003, 0.001, + 0.014, 0.004, 0.075, 0.032, 0.0001, 0.0001, 0.001, 0.005, 0.001, 0.004, + 0.007, 0.005, 0.0001, 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.004, + 0.024, 0.586, 0.003, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + frr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.212, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.548, 0.003, 0.682, 0.0001, + 0.001, 0.008, 0.0001, 0.237, 0.407, 0.407, 0.015, 0.002, 0.738, 0.264, + 1.349, 0.032, 0.426, 0.487, 0.285, 0.155, 0.131, 0.142, 0.153, 0.132, + 0.154, 0.213, 0.163, 0.033, 0.094, 0.019, 0.094, 0.014, 0.0001, 0.424, + 0.235, 0.114, 0.463, 0.142, 0.219, 0.132, 0.243, 0.123, 0.143, 0.217, + 0.156, 0.239, 0.202, 0.1, 0.178, 0.008, 0.163, 0.493, 0.169, 0.107, + 0.04, 0.158, 0.005, 0.006, 0.018, 0.02, 0.0001, 0.02, 0.0001, 0.015, + 0.0001, 7.38, 1.026, 0.694, 2.643, 7.751, 1.48, 1.329, 1.414, 5.143, + 0.835, 1.946, 2.506, 1.658, 6.635, 2.847, 0.757, 0.017, 4.866, 3.953, + 4.835, 3.559, 0.125, 1.078, 0.025, 0.13, 0.078, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.121, 0.04, 0.005, 0.007, 0.011, 0.01, 0.004, 0.003, + 0.014, 0.003, 0.007, 0.003, 0.003, 0.004, 0.004, 0.002, 0.006, 0.041, + 0.003, 0.029, 0.004, 0.002, 0.039, 0.002, 0.005, 0.057, 0.003, 0.003, + 0.033, 0.001, 0.015, 0.005, 0.043, 0.01, 0.008, 0.004, 0.702, 0.24, + 0.006, 0.008, 0.007, 0.041, 0.006, 0.01, 0.003, 0.013, 0.002, 0.004, + 0.015, 0.008, 0.014, 0.009, 0.006, 0.008, 0.971, 0.003, 0.022, 0.007, + 0.006, 0.005, 0.964, 0.005, 0.004, 0.003, 0.0001, 0.0001, 0.041, 3.039, + 0.101, 0.012, 0.0001, 0.001, 0.0001, 0.016, 0.008, 0.014, 0.003, 0.0001, + 0.014, 0.006, 0.019, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.001, 0.018, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.012, 0.024, 0.122, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + fur: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.465, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.803, 0.002, 0.385, 0.0001, + 0.0001, 0.006, 0.001, 0.135, 0.204, 0.203, 0.001, 0.001, 0.945, 0.084, + 1.045, 0.015, 0.262, 0.474, 0.24, 0.16, 0.15, 0.158, 0.149, 0.15, 0.168, + 0.219, 0.076, 0.046, 0.024, 0.003, 0.006, 0.002, 0.0001, 0.268, 0.102, + 0.337, 0.116, 0.078, 0.115, 0.121, 0.022, 0.278, 0.048, 0.02, 0.218, + 0.154, 0.07, 0.05, 0.172, 0.005, 0.086, 0.217, 0.131, 0.073, 0.108, + 0.016, 0.024, 0.002, 0.027, 0.004, 0.001, 0.004, 0.0001, 0.016, 0.0001, + 6.873, 0.54, 3.119, 3.521, 7.672, 0.855, 0.912, 0.901, 8.131, 0.838, + 0.065, 4.486, 1.745, 5.361, 3.491, 1.873, 0.016, 4.269, 4.833, 4.488, + 2.566, 1.056, 0.024, 0.012, 0.029, 0.497, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.039, 0.005, 0.002, 0.002, 0.002, 0.001, 0.001, 0.005, 0.001, + 0.001, 0.0001, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.007, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.013, 0.0001, 0.001, 0.008, + 0.008, 0.0001, 0.002, 0.187, 0.005, 0.973, 0.001, 0.004, 0.001, 0.001, + 0.127, 0.268, 0.009, 0.161, 0.005, 0.069, 0.003, 0.185, 0.001, 0.033, + 0.003, 0.05, 0.006, 0.254, 0.001, 0.005, 0.001, 0.001, 0.015, 0.003, + 0.208, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.042, 2.523, 0.01, + 0.009, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.01, 0.005, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.038, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + fy: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.82, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.701, 0.001, 0.398, 0.0001, + 0.001, 0.014, 0.003, 0.455, 0.166, 0.166, 0.001, 0.0001, 0.747, 0.192, + 0.908, 0.008, 0.277, 0.415, 0.181, 0.098, 0.101, 0.113, 0.107, 0.108, + 0.145, 0.219, 0.052, 0.025, 0.005, 0.001, 0.005, 0.002, 0.0001, 0.213, + 0.183, 0.091, 0.343, 0.093, 0.196, 0.109, 0.18, 0.193, 0.088, 0.132, + 0.122, 0.161, 0.156, 0.11, 0.106, 0.003, 0.108, 0.302, 0.13, 0.038, + 0.048, 0.113, 0.006, 0.12, 0.009, 0.007, 0.0001, 0.007, 0.0001, 0.0001, + 0.0001, 6.027, 1.091, 0.691, 3.439, 11.73, 1.889, 1.306, 1.373, 5.412, + 1.009, 2.464, 2.808, 1.837, 7.368, 3.471, 1.074, 0.006, 5.381, 4.264, + 5.226, 1.268, 0.226, 1.241, 0.017, 1.595, 0.254, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.043, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, + 0.0001, 0.007, 0.001, 0.0001, 0.001, 0.001, 0.004, 0.021, 0.0001, 0.001, + 0.004, 0.003, 0.001, 0.001, 0.013, 0.004, 0.263, 0.001, 0.008, 0.001, + 0.001, 0.002, 0.002, 0.01, 0.258, 0.016, 0.001, 0.003, 0.001, 0.013, + 0.005, 0.004, 0.006, 0.003, 0.084, 0.002, 0.006, 0.001, 0.003, 0.002, + 0.21, 0.348, 0.006, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.02, 1.229, + 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, + 0.0001, 0.006, 0.003, 0.015, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.042, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ga: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.234, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.249, 0.002, 0.288, 0.0001, + 0.001, 0.013, 0.002, 0.109, 0.15, 0.15, 0.0001, 0.002, 0.872, 0.193, + 0.872, 0.017, 0.241, 0.359, 0.187, 0.093, 0.09, 0.096, 0.095, 0.093, + 0.117, 0.202, 0.044, 0.013, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.26, + 0.338, 0.441, 0.188, 0.097, 0.15, 0.18, 0.066, 0.279, 0.041, 0.036, + 0.154, 0.249, 0.121, 0.062, 0.138, 0.005, 0.145, 0.311, 0.272, 0.036, + 0.033, 0.04, 0.007, 0.009, 0.007, 0.033, 0.0001, 0.031, 0.0001, 0.002, + 0.0001, 11.315, 1.29, 2.859, 2.236, 4.184, 0.692, 2.117, 5.503, 7.212, + 0.011, 0.093, 2.991, 1.605, 6.018, 2.868, 0.471, 0.007, 4.409, 3.653, + 3.32, 1.715, 0.088, 0.061, 0.021, 0.135, 0.028, 0.0001, 0.006, 0.0001, + 0.0001, 0.0001, 0.063, 0.032, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, + 0.002, 0.059, 0.001, 0.002, 0.002, 0.009, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.044, 0.003, 0.001, 0.001, 0.001, 0.005, 0.023, 0.008, 0.001, + 0.006, 0.006, 0.0001, 0.001, 0.02, 1.278, 0.008, 0.002, 0.005, 0.001, + 0.001, 0.002, 0.002, 1.021, 0.001, 0.002, 0.002, 1.343, 0.001, 0.001, + 0.006, 0.004, 0.004, 0.674, 0.002, 0.003, 0.005, 0.001, 0.004, 0.002, + 0.624, 0.002, 0.005, 0.004, 0.003, 0.002, 0.0001, 0.0001, 0.022, 5.087, + 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, + 0.0001, 0.011, 0.005, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.003, 0.061, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + gag: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 3.391, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.28, 0.016, 0.1, 0.0001, + 0.001, 0.011, 0.0001, 0.023, 0.153, 0.154, 0.0001, 0.0001, 0.918, 0.454, + 1.065, 0.029, 0.183, 0.22, 0.131, 0.062, 0.067, 0.072, 0.06, 0.06, + 0.062, 0.143, 0.13, 0.023, 0.015, 0.004, 0.015, 0.028, 0.0001, 0.378, + 0.403, 0.048, 0.156, 0.135, 0.049, 0.237, 0.117, 0.049, 0.029, 0.415, + 0.105, 0.242, 0.108, 0.187, 0.134, 0.003, 0.159, 0.189, 0.383, 0.092, + 0.136, 0.005, 0.011, 0.079, 0.04, 0.002, 0.0001, 0.002, 0.0001, 0.001, + 0.0001, 9.932, 1.463, 0.503, 2.949, 4.34, 0.314, 1.11, 0.547, 5.816, + 0.052, 2.859, 4.285, 1.983, 5.174, 2.034, 0.659, 0.007, 5.297, 2.304, + 2.138, 2.154, 0.741, 0.006, 0.007, 1.825, 1.011, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.33, 0.02, 0.014, 0.017, 0.012, 0.006, 0.003, 0.09, + 0.004, 0.002, 0.005, 0.006, 0.005, 0.012, 0.002, 0.007, 0.002, 0.004, + 0.002, 0.034, 0.066, 0.003, 0.036, 0.002, 0.004, 0.038, 0.004, 0.03, + 0.138, 0.106, 0.046, 1.073, 0.005, 0.011, 0.07, 0.054, 1.028, 0.001, + 0.006, 0.629, 0.003, 0.006, 0.12, 0.006, 0.002, 0.001, 0.004, 0.003, + 0.193, 2.957, 0.016, 0.012, 0.008, 0.03, 0.347, 0.009, 0.023, 0.005, + 0.018, 0.016, 1.278, 0.014, 0.03, 0.005, 0.0001, 0.0001, 0.012, 3.601, + 3.155, 1.149, 0.001, 0.0001, 0.029, 0.03, 0.001, 0.0001, 0.001, 0.0001, + 0.001, 0.0001, 0.224, 0.106, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.003, + 0.019, 0.015, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, + 0.005, 0.317, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + gan: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.76, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.481, 0.002, 0.018, 0.0001, + 0.0001, 0.024, 0.003, 0.008, 0.023, 0.024, 0.002, 0.006, 0.023, 0.038, + 0.047, 0.01, 0.315, 0.585, 0.297, 0.204, 0.191, 0.202, 0.185, 0.171, + 0.182, 0.259, 0.005, 0.001, 0.007, 0.003, 0.007, 0.002, 0.0001, 0.033, + 0.019, 0.032, 0.016, 0.012, 0.012, 0.016, 0.021, 0.015, 0.011, 0.012, + 0.015, 0.023, 0.016, 0.01, 0.022, 0.002, 0.018, 0.031, 0.022, 0.006, + 0.009, 0.014, 0.002, 0.005, 0.001, 0.008, 0.001, 0.008, 0.0001, 0.002, + 0.0001, 0.219, 0.03, 0.061, 0.069, 0.246, 0.023, 0.046, 0.084, 0.187, + 0.005, 0.034, 0.116, 0.064, 0.184, 0.17, 0.035, 0.003, 0.158, 0.115, + 0.138, 0.085, 0.023, 0.019, 0.007, 0.04, 0.007, 0.001, 0.001, 0.001, + 0.0001, 0.0001, 3.244, 1.279, 2.127, 0.643, 0.387, 0.883, 0.435, 0.848, + 1.431, 1.201, 0.629, 1.296, 2.258, 1.163, 0.623, 0.808, 0.937, 0.395, + 0.26, 0.593, 0.667, 0.608, 1.031, 1.999, 0.578, 0.845, 0.936, 0.665, + 1.536, 0.644, 0.439, 0.928, 0.498, 0.603, 0.631, 0.704, 0.585, 0.768, + 0.515, 0.538, 0.76, 0.649, 0.365, 0.712, 0.597, 1.095, 0.882, 0.565, + 2.328, 1.119, 0.438, 0.543, 1.012, 0.372, 0.441, 0.708, 1.829, 1.205, + 1.47, 1.203, 2.219, 1.044, 0.843, 1.251, 0.0001, 0.0001, 0.055, 0.02, + 0.005, 0.006, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.002, + 0.0001, 0.018, 0.009, 0.031, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.007, 0.036, 0.032, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.029, 0.011, 0.055, 2.062, 3.549, 9.312, 4.838, 3.056, 2.889, + 2.67, 0.003, 0.005, 0.013, 0.003, 0.002, 1.772, 0.01, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + gd: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.483, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.829, 0.001, 0.374, 0.0001, + 0.0001, 0.027, 0.001, 0.653, 0.225, 0.224, 0.001, 0.001, 0.74, 0.732, + 0.959, 0.016, 0.275, 0.512, 0.251, 0.163, 0.143, 0.16, 0.146, 0.151, + 0.187, 0.234, 0.126, 0.023, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.399, + 0.354, 0.494, 0.195, 0.121, 0.114, 0.226, 0.061, 0.158, 0.033, 0.034, + 0.204, 0.239, 0.107, 0.062, 0.151, 0.004, 0.164, 0.477, 0.402, 0.038, + 0.033, 0.037, 0.023, 0.009, 0.008, 0.004, 0.0001, 0.004, 0.0001, 0.001, + 0.001, 13.191, 1.481, 2.674, 2.933, 4.722, 0.55, 2.044, 6.832, 6.396, + 0.019, 0.13, 2.757, 1.684, 7.147, 2.433, 0.32, 0.014, 3.962, 3.004, + 2.554, 2.054, 0.073, 0.068, 0.016, 0.125, 0.044, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.262, 0.013, 0.005, 0.005, 0.004, 0.003, 0.002, 0.002, + 0.031, 0.005, 0.004, 0.001, 0.011, 0.003, 0.002, 0.001, 0.006, 0.003, + 0.012, 0.014, 0.004, 0.002, 0.002, 0.002, 0.027, 0.178, 0.003, 0.005, + 0.012, 0.011, 0.001, 0.003, 0.677, 0.029, 0.002, 0.003, 0.009, 0.003, + 0.004, 0.005, 0.218, 0.029, 0.004, 0.003, 0.303, 0.022, 0.002, 0.003, + 0.018, 0.008, 0.323, 0.026, 0.004, 0.004, 0.01, 0.002, 0.006, 0.223, + 0.01, 0.003, 0.014, 0.004, 0.005, 0.002, 0.0001, 0.0001, 0.041, 1.912, + 0.009, 0.011, 0.0001, 0.0001, 0.0001, 0.018, 0.01, 0.015, 0.003, 0.0001, + 0.015, 0.007, 0.02, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.008, + 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, + 0.004, 0.244, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + gl: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.812, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.39, 0.002, 0.342, 0.0001, + 0.0001, 0.01, 0.001, 0.013, 0.144, 0.144, 0.001, 0.002, 1.02, 0.075, + 0.726, 0.01, 0.251, 0.326, 0.181, 0.093, 0.083, 0.092, 0.082, 0.082, + 0.102, 0.185, 0.047, 0.021, 0.003, 0.002, 0.002, 0.001, 0.0001, 0.331, + 0.122, 0.257, 0.114, 0.192, 0.107, 0.104, 0.065, 0.139, 0.039, 0.03, + 0.104, 0.167, 0.127, 0.177, 0.186, 0.007, 0.111, 0.187, 0.12, 0.054, + 0.074, 0.026, 0.055, 0.009, 0.01, 0.005, 0.0001, 0.005, 0.0001, 0.003, + 0.0001, 9.121, 0.85, 3.271, 4.11, 8.668, 0.721, 0.784, 0.524, 5.185, + 0.017, 0.092, 2.548, 2.069, 5.528, 7.673, 1.889, 0.464, 5.046, 5.357, + 3.627, 2.8, 0.704, 0.036, 0.564, 0.085, 0.291, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.015, 0.013, 0.003, 0.002, 0.002, 0.001, 0.002, 0.002, + 0.001, 0.012, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.006, 0.003, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, + 0.003, 0.003, 0.0001, 0.001, 0.028, 0.396, 0.001, 0.002, 0.002, 0.001, + 0.001, 0.003, 0.003, 0.383, 0.003, 0.007, 0.001, 0.442, 0.001, 0.001, + 0.005, 0.193, 0.006, 0.599, 0.002, 0.002, 0.003, 0.001, 0.003, 0.002, + 0.219, 0.007, 0.008, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.05, 2.267, + 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.011, 0.005, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.014, 0.003, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + glk: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.405, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.911, 0.005, 0.048, 0.0001, + 0.0001, 0.001, 0.0001, 0.017, 0.104, 0.105, 0.0001, 0.001, 0.019, 0.086, + 0.553, 0.019, 0.043, 0.074, 0.037, 0.051, 0.028, 0.037, 0.027, 0.021, + 0.025, 0.021, 0.078, 0.0001, 0.005, 0.006, 0.007, 0.001, 0.0001, 0.004, + 0.003, 0.008, 0.003, 0.003, 0.002, 0.002, 0.002, 0.003, 0.001, 0.001, + 0.002, 0.004, 0.002, 0.001, 0.003, 0.0001, 0.003, 0.005, 0.008, 0.006, + 0.001, 0.002, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.002, 0.001, 0.001, + 0.0001, 0.177, 0.041, 0.015, 0.061, 0.102, 0.013, 0.028, 0.036, 0.115, + 0.015, 0.035, 0.047, 0.057, 0.128, 0.083, 0.024, 0.008, 0.098, 0.063, + 0.07, 0.058, 0.027, 0.009, 0.013, 0.021, 0.022, 0.0001, 0.004, 0.0001, + 0.001, 0.0001, 0.159, 0.386, 0.313, 0.148, 1.28, 2.09, 3.65, 3.311, + 2.644, 0.084, 1.185, 0.003, 3.768, 0.001, 0.042, 0.015, 0.057, 0.007, + 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.027, 0.07, 0.004, 0.009, + 0.002, 0.001, 0.0001, 0.024, 0.001, 0.005, 0.174, 0.185, 0.526, 0.0001, + 0.349, 5.779, 1.561, 0.992, 2.058, 0.045, 0.725, 0.235, 0.5, 2.399, + 0.083, 3.048, 0.622, 2.068, 1.214, 0.15, 0.072, 0.14, 0.046, 0.343, + 0.079, 0.014, 0.001, 0.0001, 0.271, 0.0001, 0.0001, 0.0001, 0.044, + 0.065, 0.002, 0.021, 0.0001, 0.003, 0.0001, 0.068, 0.0001, 0.285, 0.001, + 0.0001, 0.001, 0.0001, 0.005, 0.002, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 21.901, 14.77, 1.833, 3.683, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.141, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + gn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.37, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.685, 0.002, 0.175, 0.0001, + 0.0001, 0.007, 0.0001, 0.625, 0.171, 0.173, 0.001, 0.002, 1.108, 0.288, + 0.925, 0.011, 0.221, 0.306, 0.165, 0.094, 0.084, 0.088, 0.078, 0.08, + 0.105, 0.172, 0.107, 0.053, 0.096, 0.001, 0.096, 0.001, 0.0001, 0.314, + 0.094, 0.194, 0.053, 0.124, 0.074, 0.125, 0.128, 0.14, 0.097, 0.171, + 0.086, 0.202, 0.077, 0.188, 0.312, 0.005, 0.119, 0.136, 0.188, 0.098, + 0.072, 0.01, 0.015, 0.073, 0.005, 0.013, 0.0001, 0.013, 0.0001, 0.0001, + 0.003, 10.368, 1.134, 1.037, 1.076, 7.653, 0.097, 1.575, 2.931, 4.208, + 1.013, 1.951, 0.867, 2.302, 2.015, 5.216, 3.17, 0.036, 4.342, 1.438, + 2.887, 4.01, 2.242, 0.013, 0.023, 2.052, 0.103, 0.002, 0.004, 0.0001, + 0.0001, 0.0001, 1.036, 0.019, 0.002, 0.069, 0.003, 0.001, 0.001, 0.001, + 0.002, 0.002, 0.001, 0.003, 0.001, 0.004, 0.0001, 0.001, 0.002, 0.06, + 0.001, 0.011, 0.003, 0.002, 0.001, 0.001, 0.002, 0.862, 0.001, 0.001, + 0.08, 0.08, 0.0001, 0.001, 0.04, 0.787, 0.003, 0.72, 0.019, 0.002, + 0.003, 0.003, 0.016, 1.383, 0.003, 0.016, 0.003, 0.256, 0.002, 0.013, + 0.007, 0.786, 0.011, 0.399, 0.027, 0.172, 0.004, 0.001, 0.003, 0.065, + 0.529, 0.066, 0.013, 0.527, 0.003, 0.003, 0.0001, 0.0001, 0.078, 4.545, + 0.392, 0.1, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.002, 0.065, 0.0001, + 0.004, 0.002, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.015, 0.405, 1.034, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + gom: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.459, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.409, 0.004, 0.032, 0.0001, + 0.0001, 0.004, 0.001, 0.065, 0.082, 0.086, 0.0001, 0.001, 0.31, 0.092, + 0.614, 0.025, 0.037, 0.076, 0.035, 0.025, 0.021, 0.026, 0.02, 0.018, + 0.022, 0.033, 0.044, 0.02, 0.0001, 0.003, 0.0001, 0.007, 0.0001, 0.043, + 0.023, 0.024, 0.027, 0.017, 0.011, 0.022, 0.028, 0.023, 0.016, 0.018, + 0.014, 0.036, 0.017, 0.018, 0.033, 0.001, 0.019, 0.035, 0.046, 0.011, + 0.011, 0.005, 0.004, 0.003, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.007, + 0.001, 1.398, 0.134, 0.264, 0.41, 0.83, 0.062, 0.182, 0.613, 0.742, + 0.041, 0.372, 0.505, 0.457, 0.862, 0.987, 0.203, 0.002, 0.568, 0.367, + 0.732, 0.344, 0.233, 0.034, 0.102, 0.093, 0.096, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 1.014, 0.337, 1.717, 0.03, 0.0001, 0.2, 0.49, 1.091, + 0.031, 0.184, 0.021, 0.587, 0.017, 1.766, 0.002, 0.057, 0.002, 0.019, + 0.005, 0.016, 0.001, 1.048, 0.146, 0.534, 0.083, 0.03, 0.659, 0.006, + 0.381, 0.026, 0.006, 0.26, 0.031, 0.261, 0.004, 0.294, 21.971, 5.237, + 0.529, 0.24, 0.912, 0.021, 0.699, 0.107, 0.285, 0.131, 0.613, 1.017, + 1.508, 0.008, 1.629, 0.499, 0.008, 0.864, 0.313, 0.067, 0.93, 0.419, + 0.0001, 0.006, 0.002, 0.0001, 3.471, 0.661, 0.0001, 0.0001, 0.008, + 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 26.65, 0.0001, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + got: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.339, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.094, 0.003, 1.291, 0.0001, + 0.0001, 0.0001, 0.0001, 0.038, 0.115, 0.115, 0.004, 0.002, 1.558, 0.264, + 1.449, 0.007, 0.147, 0.29, 0.265, 0.261, 0.158, 0.118, 0.082, 0.102, + 0.128, 0.101, 0.042, 0.039, 0.006, 0.003, 0.008, 0.017, 0.0001, 0.013, + 0.006, 0.028, 0.006, 0.126, 0.004, 0.142, 0.123, 0.192, 0.004, 0.003, + 0.01, 0.007, 0.004, 0.248, 0.007, 0.0001, 0.011, 0.012, 0.024, 0.014, + 0.037, 0.008, 0.0001, 0.001, 0.001, 0.004, 0.0001, 0.004, 0.0001, + 0.0001, 0.001, 1.416, 0.252, 0.277, 0.447, 1.622, 0.345, 0.341, 0.482, + 1.005, 0.151, 0.167, 0.523, 0.441, 1.296, 0.895, 0.224, 0.019, 0.998, + 0.984, 0.975, 0.495, 0.221, 0.388, 0.018, 0.135, 0.029, 0.0001, 0.004, + 0.0001, 0.0001, 0.0001, 0.227, 0.027, 0.943, 1.525, 0.623, 0.417, 0.281, + 0.024, 0.043, 0.442, 0.017, 0.001, 12.517, 4.391, 0.0001, 0.004, 16.904, + 0.001, 0.002, 0.005, 0.001, 0.003, 0.004, 0.004, 0.0001, 0.003, 0.047, + 0.043, 0.003, 0.003, 0.004, 0.002, 1.424, 0.066, 0.105, 0.001, 0.004, + 0.001, 0.009, 0.002, 0.017, 0.005, 0.002, 0.005, 0.002, 0.035, 0.001, + 0.003, 3.235, 0.309, 0.439, 0.698, 0.617, 0.042, 0.143, 0.379, 0.509, + 2.203, 0.495, 0.498, 0.573, 1.215, 0.432, 0.907, 0.0001, 0.0001, 1.432, + 0.164, 0.007, 0.004, 0.001, 0.002, 0.0001, 0.004, 0.018, 0.002, 0.024, + 0.0001, 0.034, 0.019, 0.033, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.003, 0.002, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, + 0.0001, 0.003, 0.09, 0.108, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.902, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + gv: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.271, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.449, 0.001, 0.421, 0.002, + 0.001, 0.012, 0.004, 0.833, 0.218, 0.217, 0.001, 0.004, 1.036, 0.572, + 0.962, 0.016, 0.26, 0.327, 0.165, 0.089, 0.084, 0.093, 0.087, 0.088, + 0.107, 0.189, 0.087, 0.045, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.277, + 0.194, 0.324, 0.123, 0.14, 0.124, 0.191, 0.146, 0.079, 0.067, 0.068, + 0.129, 0.207, 0.152, 0.084, 0.138, 0.02, 0.179, 0.402, 0.526, 0.063, + 0.198, 0.043, 0.005, 0.079, 0.006, 0.009, 0.0001, 0.009, 0.0001, 0.001, + 0.0001, 8.563, 0.792, 1.691, 1.903, 8.594, 0.377, 2.885, 5.368, 3.902, + 0.512, 0.598, 3.599, 1.506, 6.663, 4.174, 0.394, 0.032, 4.839, 4.581, + 2.625, 1.233, 0.647, 0.279, 0.018, 6.112, 0.053, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.052, 0.016, 0.011, 0.007, 0.006, 0.002, 0.002, 0.033, + 0.003, 0.008, 0.001, 0.001, 0.002, 0.004, 0.001, 0.003, 0.004, 0.002, + 0.001, 0.008, 0.005, 0.001, 0.002, 0.002, 0.007, 0.032, 0.003, 0.002, + 0.002, 0.002, 0.001, 0.001, 0.013, 0.034, 0.001, 0.003, 0.006, 0.002, + 0.002, 0.259, 0.003, 0.024, 0.003, 0.005, 0.003, 0.021, 0.001, 0.003, + 0.016, 0.006, 0.011, 0.021, 0.003, 0.006, 0.005, 0.006, 0.011, 0.008, + 0.015, 0.005, 0.007, 0.005, 0.006, 0.004, 0.0001, 0.0001, 0.024, 0.446, + 0.012, 0.021, 0.0001, 0.001, 0.0001, 0.006, 0.003, 0.004, 0.002, 0.0001, + 0.012, 0.007, 0.044, 0.019, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.006, 0.05, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + ha: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.755, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.253, 0.006, 0.093, 0.001, + 0.0001, 0.003, 0.001, 0.233, 0.264, 0.267, 0.0001, 0.001, 0.745, 0.202, + 0.904, 0.054, 0.25, 0.351, 0.185, 0.101, 0.092, 0.11, 0.102, 0.101, + 0.107, 0.226, 0.077, 0.015, 0.009, 0.002, 0.009, 0.006, 0.001, 0.703, + 0.295, 0.111, 0.155, 0.055, 0.098, 0.113, 0.13, 0.318, 0.133, 0.225, + 0.088, 0.271, 0.163, 0.048, 0.074, 0.005, 0.115, 0.268, 0.173, 0.05, + 0.018, 0.079, 0.003, 0.091, 0.042, 0.023, 0.0001, 0.025, 0.0001, 0.021, + 0.001, 18.747, 1.651, 0.919, 2.906, 2.679, 0.906, 1.302, 1.831, 6.455, + 0.467, 3.514, 2.109, 2.474, 6.749, 1.839, 0.213, 0.023, 4.031, 3.401, + 2.21, 3.388, 0.067, 1.617, 0.015, 2.266, 0.447, 0.001, 0.001, 0.003, + 0.002, 0.0001, 0.116, 0.007, 0.003, 0.001, 0.009, 0.005, 0.003, 0.003, + 0.007, 0.002, 0.01, 0.001, 0.001, 0.0001, 0.003, 0.001, 0.002, 0.002, + 0.001, 0.029, 0.002, 0.001, 0.0001, 0.094, 0.018, 0.242, 0.0001, 0.001, + 0.01, 0.009, 0.001, 0.004, 0.02, 0.005, 0.002, 0.006, 0.0001, 0.001, + 0.003, 0.015, 0.004, 0.013, 0.004, 0.002, 0.002, 0.004, 0.002, 0.003, + 0.004, 0.011, 0.001, 0.005, 0.011, 0.003, 0.002, 0.003, 0.002, 0.004, + 0.002, 0.001, 0.003, 0.003, 0.0001, 0.002, 0.0001, 0.0001, 0.03, 0.04, + 0.008, 0.004, 0.18, 0.0001, 0.0001, 0.118, 0.001, 0.004, 0.0001, 0.0001, + 0.001, 0.001, 0.011, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.044, 0.043, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + hak: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.757, 0.001, 0.06, 0.0001, + 0.0001, 0.014, 0.0001, 0.007, 0.281, 0.281, 0.0001, 0.001, 0.836, 6.558, + 0.681, 0.018, 0.337, 0.407, 0.278, 0.148, 0.134, 0.137, 0.13, 0.123, + 0.136, 0.173, 0.065, 0.014, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.079, + 0.057, 0.378, 0.035, 0.025, 0.133, 0.042, 0.182, 0.024, 0.017, 0.335, + 0.169, 0.185, 0.174, 0.026, 0.169, 0.016, 0.027, 0.334, 0.366, 0.012, + 0.069, 0.025, 0.002, 0.166, 0.009, 0.007, 0.0001, 0.007, 0.0001, 0.003, + 0.0001, 1.796, 0.086, 1.609, 0.16, 2.657, 0.577, 2.978, 5.312, 4.077, + 0.022, 2.986, 0.978, 0.836, 6.046, 1.214, 0.924, 0.006, 0.355, 1.925, + 2.85, 1.719, 0.417, 0.063, 0.011, 1.033, 0.05, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.624, 0.347, 0.489, 0.127, 0.115, 0.217, 0.079, 0.128, + 0.198, 0.185, 0.153, 0.188, 0.325, 0.981, 0.111, 0.161, 0.125, 0.071, + 0.062, 0.072, 0.143, 0.099, 0.164, 0.124, 0.154, 0.164, 0.132, 0.118, + 0.284, 0.116, 0.086, 0.138, 0.587, 0.284, 0.798, 0.114, 0.117, 0.11, + 0.089, 0.096, 0.66, 0.449, 0.294, 0.11, 0.804, 0.308, 1.169, 0.118, + 0.192, 0.187, 0.596, 1.486, 0.608, 0.076, 0.115, 0.115, 0.317, 1.436, + 0.679, 1.022, 0.36, 0.128, 0.129, 0.134, 0.0001, 0.0001, 0.018, 7.409, + 0.013, 0.036, 0.003, 0.005, 0.0001, 0.003, 0.001, 0.002, 1.194, 0.0001, + 0.01, 0.005, 0.045, 0.02, 0.001, 0.001, 0.0001, 0.0001, 0.003, 0.013, + 0.006, 0.004, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, + 1.011, 0.064, 0.254, 0.448, 1.333, 0.785, 0.602, 0.451, 0.439, 0.002, + 0.004, 0.008, 0.003, 0.0001, 0.269, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + haw: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 3.221, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.294, 0.012, 0.203, 0.0001, + 0.0001, 0.0001, 0.001, 0.132, 0.34, 0.352, 0.0001, 0.001, 1.505, 0.111, + 0.979, 0.007, 0.17, 0.218, 0.129, 0.06, 0.059, 0.065, 0.059, 0.085, + 0.093, 0.096, 0.074, 0.017, 0.01, 0.0001, 0.01, 0.007, 0.0001, 0.393, + 0.447, 0.582, 0.062, 0.097, 0.065, 0.079, 0.798, 0.153, 0.05, 0.341, + 0.594, 0.369, 0.112, 0.254, 0.296, 0.019, 0.112, 0.703, 0.122, 0.065, + 0.176, 0.058, 0.005, 0.01, 0.09, 0.005, 0.0001, 0.006, 0.0001, 0.003, + 0.006, 12.798, 0.268, 0.355, 0.813, 5.652, 0.089, 0.569, 1.324, 6.125, + 0.081, 4.131, 4.145, 2.483, 4.121, 5.223, 1.895, 0.028, 1.627, 1.407, + 0.928, 3.376, 0.134, 0.71, 0.014, 0.137, 0.178, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 1.411, 1.393, 0.012, 0.01, 0.008, 0.004, 0.003, 0.003, + 0.01, 0.001, 0.006, 0.004, 0.027, 0.239, 0.001, 0.004, 0.011, 0.006, + 0.002, 0.111, 0.01, 0.006, 0.002, 0.004, 1.323, 0.019, 0.006, 0.004, + 0.007, 0.006, 0.005, 0.004, 0.006, 0.059, 0.005, 0.006, 0.006, 0.004, + 0.001, 0.013, 0.01, 0.035, 0.014, 0.268, 0.004, 0.047, 0.003, 0.004, + 0.012, 0.061, 0.008, 0.113, 0.006, 0.007, 0.004, 0.005, 0.011, 0.005, + 0.014, 1.288, 0.011, 0.01, 0.006, 0.004, 0.0001, 0.0001, 0.011, 0.331, + 1.585, 0.461, 0.0001, 0.008, 0.0001, 0.011, 1.285, 0.01, 0.001, 0.0001, + 0.031, 0.013, 0.031, 0.011, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.043, + 0.02, 0.017, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 0.013, + 1.362, 0.0001, 0.001, 0.006, 0.003, 0.002, 0.001, 0.001, 0.002, 0.007, + 0.008, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + hif: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.441, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.1, 0.004, 0.114, 0.0001, + 0.001, 0.009, 0.004, 0.035, 0.174, 0.173, 0.001, 0.001, 0.931, 0.131, + 1.205, 0.021, 0.405, 0.564, 0.33, 0.156, 0.134, 0.134, 0.137, 0.132, + 0.161, 0.312, 0.075, 0.009, 0.003, 0.005, 0.003, 0.001, 0.0001, 0.456, + 0.322, 0.355, 0.197, 0.18, 0.293, 0.19, 0.17, 0.372, 0.16, 0.181, 0.207, + 0.307, 0.247, 0.078, 0.33, 0.012, 0.201, 0.529, 0.239, 0.168, 0.085, + 0.095, 0.004, 0.174, 0.017, 0.016, 0.0001, 0.016, 0.0001, 0.019, 0.0001, + 12.241, 1.338, 1.486, 1.704, 7.791, 0.593, 1.202, 3.829, 6.515, 0.754, + 3.146, 2.684, 2.468, 4.596, 2.829, 0.958, 0.04, 4.362, 3.289, 3.315, + 2.328, 0.443, 0.421, 0.04, 0.804, 0.089, 0.0001, 0.003, 0.001, 0.0001, + 0.0001, 0.026, 0.089, 0.009, 0.002, 0.003, 0.005, 0.002, 0.014, 0.008, + 0.001, 0.001, 0.004, 0.002, 0.02, 0.003, 0.003, 0.003, 0.002, 0.001, + 0.042, 0.003, 0.007, 0.001, 0.003, 0.002, 0.005, 0.002, 0.011, 0.004, + 0.001, 0.001, 0.013, 0.018, 0.009, 0.001, 0.005, 0.072, 0.024, 0.007, + 0.009, 0.007, 0.012, 0.004, 0.029, 0.003, 0.013, 0.009, 0.007, 0.017, + 0.022, 0.012, 0.006, 0.004, 0.005, 0.014, 0.002, 0.01, 0.032, 0.005, + 0.004, 0.012, 0.003, 0.011, 0.006, 0.0001, 0.0001, 0.028, 0.074, 0.148, + 0.035, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.005, 0.003, 0.0001, + 0.004, 0.001, 0.016, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.012, 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.105, 0.033, 0.022, 0.002, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + ho: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 13.445, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.244, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 1.681, 0.84, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 5.042, 0.0001, 0.0001, 0.0001, 0.84, 1.681, 0.0001, 0.84, + 0.0001, 0.0001, 1.681, 1.681, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.966, 0.84, + 0.0001, 0.0001, 7.563, 0.0001, 0.84, 0.0001, 5.042, 0.0001, 0.0001, + 2.521, 1.681, 5.882, 12.605, 1.681, 0.0001, 3.361, 1.681, 1.681, 0.0001, + 1.681, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + hsb: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.885, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.708, 0.001, 0.633, 0.0001, + 0.0001, 0.02, 0.001, 0.006, 0.349, 0.351, 0.019, 0.001, 0.617, 0.09, + 1.156, 0.027, 0.335, 0.549, 0.233, 0.161, 0.153, 0.173, 0.141, 0.134, + 0.184, 0.278, 0.061, 0.039, 0.002, 0.004, 0.002, 0.001, 0.0001, 0.124, + 0.184, 0.091, 0.139, 0.058, 0.04, 0.059, 0.112, 0.043, 0.103, 0.189, + 0.142, 0.204, 0.143, 0.038, 0.227, 0.002, 0.151, 0.281, 0.088, 0.037, + 0.024, 0.263, 0.004, 0.003, 0.079, 0.006, 0.0001, 0.006, 0.0001, 0.001, + 0.0001, 6.697, 1.107, 1.636, 2.081, 6.467, 0.188, 0.301, 1.756, 3.527, + 3.654, 2.787, 1.99, 1.872, 3.895, 5.864, 1.456, 0.004, 3.313, 3.645, + 2.804, 2.176, 0.063, 3.44, 0.018, 1.507, 1.152, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.124, 0.059, 0.706, 0.009, 0.065, 0.003, 0.009, 0.741, + 0.003, 0.001, 0.002, 0.003, 0.046, 0.476, 0.001, 0.004, 0.004, 0.003, + 0.003, 0.038, 0.003, 0.003, 0.002, 0.005, 0.005, 0.336, 0.005, 1.33, + 0.03, 0.004, 0.03, 0.009, 0.055, 0.752, 0.003, 0.003, 0.008, 0.003, + 0.002, 0.003, 0.003, 0.008, 0.001, 0.003, 0.001, 0.011, 0.001, 0.003, + 0.025, 0.008, 0.015, 0.5, 0.006, 0.013, 0.014, 0.003, 0.014, 0.005, + 0.495, 0.011, 0.018, 0.033, 0.697, 0.004, 0.0001, 0.0001, 0.023, 0.573, + 2.597, 3.085, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.0001, 0.001, + 0.0001, 0.01, 0.005, 0.144, 0.055, 0.001, 0.001, 0.001, 0.011, 0.004, + 0.015, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.004, 0.112, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ht: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 4.728, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.82, 0.005, 0.108, 0.0001, + 0.0001, 0.002, 0.001, 0.044, 0.203, 0.204, 0.004, 0.0001, 1.177, 0.16, + 1.277, 0.006, 1.128, 0.316, 0.385, 0.25, 0.229, 0.141, 0.146, 0.14, + 0.135, 0.218, 0.285, 0.009, 0.002, 0.002, 0.002, 0.073, 0.0001, 0.308, + 0.114, 0.31, 0.14, 0.272, 0.082, 0.233, 0.111, 0.459, 0.083, 0.546, + 0.457, 0.33, 0.177, 0.124, 0.284, 0.004, 0.107, 0.215, 0.201, 0.017, + 0.07, 0.083, 0.002, 0.054, 0.009, 0.003, 0.0001, 0.009, 0.003, 0.007, + 0.0001, 8.338, 0.713, 0.405, 1.058, 6.922, 0.493, 1.121, 0.484, 5.37, + 0.359, 1.684, 3.389, 1.726, 9.14, 4.981, 1.524, 0.032, 2.005, 4.201, + 3.104, 1.485, 1.12, 1.14, 0.06, 3.565, 0.552, 0.0001, 0.001, 0.0001, + 0.001, 0.0001, 0.036, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.001, 0.007, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.023, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.04, 0.015, 0.008, + 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.815, 0.088, 0.005, 0.004, + 0.0001, 0.019, 0.002, 0.004, 0.0001, 0.005, 0.398, 0.011, 0.003, 0.0001, + 0.001, 0.0001, 0.001, 0.002, 0.004, 0.004, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.04, 1.397, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.002, + 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.036, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + hy: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.597, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.8, 0.0001, 0.032, 0.0001, + 0.0001, 0.007, 0.0001, 0.004, 0.144, 0.144, 0.0001, 0.001, 0.586, 0.166, + 0.08, 0.013, 0.201, 0.284, 0.165, 0.087, 0.08, 0.086, 0.077, 0.075, + 0.09, 0.155, 0.113, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.01, + 0.007, 0.01, 0.005, 0.005, 0.004, 0.004, 0.004, 0.018, 0.002, 0.002, + 0.005, 0.008, 0.005, 0.004, 0.006, 0.001, 0.005, 0.011, 0.008, 0.002, + 0.006, 0.004, 0.006, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.003, + 0.016, 0.046, 0.006, 0.015, 0.015, 0.053, 0.008, 0.009, 0.013, 0.038, + 0.001, 0.005, 0.027, 0.014, 0.034, 0.04, 0.008, 0.001, 0.036, 0.026, + 0.029, 0.018, 0.005, 0.004, 0.002, 0.008, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 3.414, 0.639, 1.93, 0.109, 0.557, 0.081, 0.132, 0.316, + 0.027, 0.402, 0.05, 0.015, 0.042, 0.09, 0.048, 0.034, 0.002, 0.004, + 0.002, 0.02, 0.024, 0.021, 0.028, 0.001, 0.0001, 0.001, 0.001, 0.003, + 0.001, 0.123, 0.001, 0.0001, 0.042, 6.697, 0.434, 0.595, 0.616, 2.608, + 0.304, 0.502, 0.621, 0.7, 0.114, 2.81, 0.856, 0.261, 0.333, 1.634, 0.66, + 0.29, 0.576, 0.139, 1.799, 1.257, 4.145, 0.346, 3.356, 0.233, 0.437, + 0.354, 0.321, 1.025, 1.123, 1.395, 0.0001, 0.0001, 0.223, 0.003, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.001, 0.029, 0.01, 0.0001, 0.0001, 0.652, 36.534, 7.186, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.001, 0.026, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + hz: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 25.0, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 8.333, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.667, 0.0001, + 0.0001, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 0.0001, + 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + ia: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.646, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.141, 0.002, 0.329, 0.0001, + 0.0001, 0.008, 0.001, 0.021, 0.18, 0.18, 0.001, 0.003, 1.016, 0.166, + 0.808, 0.013, 0.184, 0.275, 0.136, 0.08, 0.078, 0.085, 0.074, 0.075, + 0.088, 0.135, 0.073, 0.032, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.226, + 0.141, 0.296, 0.096, 0.165, 0.073, 0.096, 0.067, 0.304, 0.056, 0.03, + 0.329, 0.174, 0.087, 0.056, 0.186, 0.016, 0.106, 0.253, 0.115, 0.079, + 0.078, 0.031, 0.017, 0.009, 0.016, 0.018, 0.0001, 0.018, 0.0001, 0.006, + 0.0001, 7.783, 0.726, 2.95, 2.701, 11.264, 0.558, 0.916, 0.687, 6.773, + 0.133, 0.102, 4.659, 2.226, 5.924, 5.837, 2.221, 0.5, 4.607, 4.777, + 5.188, 3.143, 1.186, 0.054, 0.19, 0.205, 0.091, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.033, 0.014, 0.005, 0.003, 0.003, 0.002, 0.001, 0.002, + 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, + 0.001, 0.01, 0.005, 0.001, 0.001, 0.002, 0.003, 0.007, 0.001, 0.002, + 0.005, 0.005, 0.001, 0.001, 0.01, 0.02, 0.003, 0.006, 0.005, 0.003, + 0.002, 0.005, 0.004, 0.021, 0.003, 0.011, 0.003, 0.018, 0.002, 0.002, + 0.005, 0.011, 0.005, 0.019, 0.002, 0.002, 0.005, 0.002, 0.004, 0.005, + 0.009, 0.012, 0.006, 0.004, 0.003, 0.005, 0.0001, 0.0001, 0.026, 0.115, + 0.014, 0.006, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, + 0.019, 0.01, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.009, 0.031, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.001, + 0.0001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + ie: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.521, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.809, 0.001, 0.247, 0.0001, + 0.0001, 0.004, 0.006, 0.019, 0.181, 0.18, 0.001, 0.0001, 0.349, 1.199, + 1.232, 0.019, 0.563, 0.838, 0.612, 0.225, 0.226, 0.24, 0.207, 0.206, + 0.219, 0.382, 0.048, 0.005, 0.006, 0.001, 0.006, 0.0001, 0.0001, 0.309, + 0.238, 0.27, 0.166, 0.167, 0.136, 0.184, 0.184, 0.432, 0.068, 0.108, + 0.44, 0.245, 0.141, 0.106, 0.224, 0.013, 0.149, 0.37, 0.155, 0.122, + 0.083, 0.052, 0.007, 0.021, 0.046, 0.016, 0.0001, 0.017, 0.0001, 0.0001, + 0.0001, 6.871, 0.75, 2.348, 2.768, 8.937, 0.584, 0.855, 0.832, 7.829, + 0.174, 0.338, 4.504, 1.934, 5.948, 3.473, 1.445, 0.281, 4.186, 4.435, + 5.077, 2.881, 0.926, 0.103, 0.2, 0.235, 0.149, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.011, 0.008, 0.006, 0.012, 0.004, 0.002, 0.001, 0.038, + 0.001, 0.002, 0.0001, 0.001, 0.004, 0.016, 0.001, 0.001, 0.004, 0.003, + 0.001, 0.004, 0.002, 0.001, 0.002, 0.003, 0.002, 0.005, 0.002, 0.003, + 0.002, 0.002, 0.002, 0.01, 0.018, 0.107, 0.002, 0.003, 0.013, 0.003, + 0.002, 0.004, 0.007, 0.34, 0.002, 0.007, 0.001, 0.079, 0.001, 0.001, + 0.011, 0.009, 0.004, 0.067, 0.003, 0.005, 0.02, 0.001, 0.012, 0.001, + 0.025, 0.006, 0.034, 0.009, 0.011, 0.002, 0.0001, 0.0001, 0.012, 0.714, + 0.064, 0.047, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.001, + 0.0001, 0.007, 0.004, 0.047, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.01, 0.006, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ig: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.656, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.908, 0.0001, 0.773, 0.0001, + 0.001, 0.002, 0.004, 0.323, 0.322, 0.321, 0.001, 0.0001, 0.801, 0.348, + 0.989, 0.009, 0.349, 0.514, 0.434, 0.211, 0.141, 0.149, 0.14, 0.138, + 0.136, 0.236, 0.05, 0.04, 0.002, 0.002, 0.002, 0.002, 0.001, 0.437, + 0.139, 0.167, 0.124, 0.161, 0.093, 0.162, 0.08, 0.189, 0.162, 0.069, + 0.102, 0.246, 0.453, 0.257, 0.111, 0.006, 0.081, 0.231, 0.102, 0.09, + 0.023, 0.104, 0.006, 0.033, 0.007, 0.018, 0.0001, 0.018, 0.0001, 0.003, + 0.003, 8.644, 2.249, 1.219, 1.734, 6.313, 0.761, 1.664, 1.979, 4.558, + 0.257, 2.436, 1.453, 1.97, 6.1, 4.008, 0.966, 0.02, 3.332, 1.739, 2.408, + 2.889, 0.225, 1.517, 0.034, 1.16, 0.258, 0.0001, 0.007, 0.001, 0.0001, + 0.0001, 0.13, 0.024, 0.004, 0.004, 0.007, 0.006, 0.001, 0.002, 0.001, + 0.004, 0.004, 0.623, 0.118, 0.962, 0.001, 0.0001, 0.002, 0.001, 0.004, + 0.022, 0.005, 0.001, 0.031, 0.002, 0.001, 0.082, 0.001, 0.002, 0.004, + 0.003, 0.0001, 0.0001, 0.34, 0.233, 0.001, 0.001, 0.012, 1.142, 0.001, + 0.003, 0.105, 0.2, 0.002, 0.014, 0.036, 0.183, 0.028, 0.019, 0.004, + 0.004, 0.029, 0.095, 0.002, 0.001, 0.009, 0.001, 0.003, 0.143, 0.201, + 2.836, 0.03, 0.001, 0.002, 0.002, 0.0001, 0.0001, 0.146, 1.356, 0.009, + 0.021, 0.0001, 0.014, 0.039, 0.003, 0.0001, 0.001, 0.029, 0.0001, 0.005, + 0.001, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 2.927, 0.109, 0.003, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + ii: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 13.208, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.146, 0.0001, 1.029, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.343, 0.343, 0.0001, 0.0001, 0.0001, + 0.0001, 0.686, 0.0001, 4.803, 0.172, 2.401, 0.0001, 0.0001, 0.172, + 0.343, 0.686, 0.686, 0.343, 0.0001, 0.0001, 0.0001, 0.0001, 0.515, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.172, 0.0001, 0.172, 0.0001, 0.0001, 0.0001, 0.172, 0.858, + 0.0001, 0.343, 0.343, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.0001, + 0.0001, 0.343, 0.343, 0.343, 0.172, 0.0001, 0.172, 0.343, 0.0001, 0.515, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.172, 0.0001, 0.172, 0.0001, + 0.0001, 2.573, 1.887, 1.544, 0.858, 2.058, 0.343, 1.715, 0.343, 0.343, + 0.0001, 0.172, 1.201, 1.887, 1.029, 1.372, 0.172, 0.343, 1.029, 0.686, + 0.172, 0.172, 0.172, 0.686, 0.858, 0.686, 0.172, 0.343, 0.0001, 0.515, + 0.172, 0.343, 0.686, 0.343, 0.172, 0.0001, 0.0001, 0.343, 0.0001, 0.172, + 1.544, 0.172, 0.343, 0.686, 0.858, 0.686, 0.858, 0.343, 0.686, 0.172, + 0.343, 0.343, 0.515, 2.744, 0.172, 0.0001, 0.343, 0.858, 2.916, 0.343, + 0.686, 0.343, 0.0001, 0.343, 0.172, 0.0001, 0.0001, 1.372, 0.0001, + 0.172, 0.172, 0.0001, 0.0001, 0.0001, 0.172, 0.172, 0.0001, 0.515, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.515, 1.029, 4.631, 1.029, 0.686, + 0.0001, 0.858, 10.635, 0.0001, 0.0001, 0.0001, 0.0001, 0.343, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ik: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 7.089, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.203, 0.0001, 1.053, 0.0001, + 0.0001, 0.002, 0.004, 0.019, 1.043, 1.038, 0.0001, 0.004, 0.489, 0.212, + 1.246, 0.04, 0.17, 0.264, 0.162, 0.084, 0.065, 0.055, 0.132, 0.065, + 0.076, 0.124, 0.136, 0.025, 0.013, 0.002, 0.002, 0.0001, 0.0001, 0.824, + 0.109, 0.155, 0.065, 0.052, 0.025, 0.048, 0.076, 0.634, 0.073, 0.409, + 0.111, 0.352, 0.545, 0.069, 0.285, 0.321, 0.155, 0.436, 0.755, 0.409, + 0.076, 0.046, 0.008, 0.044, 0.002, 0.01, 0.0001, 0.015, 0.0001, 0.008, + 0.0001, 9.867, 0.308, 1.051, 0.799, 2.404, 0.327, 1.605, 1.011, 7.743, + 0.063, 2.113, 2.725, 1.552, 3.495, 1.668, 1.101, 3.682, 2.526, 3.015, + 4.496, 6.747, 0.801, 0.229, 0.065, 0.707, 0.103, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.097, 0.073, 0.183, 0.023, 0.006, 0.031, 0.013, 0.103, + 0.05, 0.008, 0.004, 0.952, 0.019, 0.055, 0.002, 0.023, 0.013, 0.008, + 0.0001, 0.002, 0.008, 0.067, 0.013, 0.015, 0.004, 0.002, 0.04, 0.01, + 0.017, 0.01, 0.002, 0.019, 0.013, 0.843, 0.013, 0.029, 1.206, 0.281, + 0.025, 0.006, 0.067, 0.006, 0.055, 0.004, 0.038, 0.017, 0.078, 0.034, + 0.172, 0.862, 0.059, 0.01, 0.01, 0.067, 0.008, 0.187, 0.269, 0.134, + 0.055, 0.021, 0.038, 0.019, 0.189, 0.046, 0.0001, 0.0001, 0.008, 0.944, + 0.835, 1.051, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.006, 0.008, + 0.0001, 0.025, 0.023, 0.42, 0.185, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.408, 0.191, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ilo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.301, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.793, 0.111, 0.271, 0.0001, + 0.001, 0.008, 0.001, 0.018, 0.172, 0.172, 0.003, 0.003, 0.83, 0.304, + 0.649, 0.008, 0.21, 0.325, 0.155, 0.097, 0.09, 0.094, 0.083, 0.085, 0.1, + 0.166, 0.048, 0.03, 0.005, 0.001, 0.005, 0.001, 0.0001, 0.349, 0.225, + 0.111, 0.217, 0.099, 0.09, 0.118, 0.1, 0.241, 0.035, 0.175, 0.118, + 0.232, 0.163, 0.054, 0.279, 0.009, 0.088, 0.233, 0.461, 0.072, 0.035, + 0.029, 0.006, 0.014, 0.012, 0.036, 0.0001, 0.036, 0.0001, 0.001, 0.0001, + 16.461, 1.586, 0.189, 2.856, 3.734, 0.046, 3.664, 0.306, 10.008, 0.024, + 3.303, 2.245, 1.909, 7.066, 3.393, 2.095, 0.012, 2.409, 3.066, 6.078, + 2.307, 0.067, 0.549, 0.014, 1.361, 0.048, 0.0001, 0.007, 0.0001, 0.0001, + 0.0001, 0.043, 0.006, 0.003, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, + 0.001, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.0001, 0.001, 0.001, 0.001, + 0.033, 0.004, 0.001, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.001, 0.002, + 0.002, 0.001, 0.001, 0.015, 0.007, 0.001, 0.001, 0.003, 0.002, 0.001, + 0.003, 0.002, 0.009, 0.002, 0.004, 0.001, 0.006, 0.002, 0.001, 0.013, + 0.007, 0.003, 0.007, 0.004, 0.001, 0.003, 0.001, 0.004, 0.002, 0.004, + 0.002, 0.003, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.027, 0.049, 0.008, + 0.009, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.007, 0.004, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.007, 0.004, 0.043, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + io: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.24, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.878, 0.001, 0.226, 0.0001, + 0.145, 0.683, 0.001, 0.155, 0.19, 0.19, 0.002, 0.001, 1.502, 0.399, + 2.049, 0.127, 1.123, 1.116, 0.845, 0.565, 0.593, 0.586, 0.516, 0.395, + 0.578, 0.496, 0.056, 0.039, 0.008, 0.001, 0.008, 0.001, 0.0001, 0.262, + 0.119, 0.082, 0.063, 0.203, 0.065, 0.07, 0.089, 0.077, 0.042, 0.131, + 0.387, 0.144, 0.086, 0.052, 0.185, 0.006, 0.067, 0.238, 0.064, 0.127, + 0.06, 0.027, 0.002, 0.018, 0.007, 0.008, 0.0001, 0.008, 0.0001, 0.001, + 0.0001, 8.848, 0.82, 0.665, 2.487, 7.044, 0.592, 0.8, 0.82, 7.741, + 0.211, 1.575, 3.65, 2.435, 4.587, 5.58, 1.431, 0.273, 4.484, 4.553, + 2.971, 2.4, 1.482, 0.052, 0.098, 0.514, 0.499, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.011, 0.008, 0.004, 0.002, 0.001, 0.001, 0.001, 0.002, + 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.001, + 0.0001, 0.003, 0.002, 0.001, 0.0001, 0.002, 0.001, 0.004, 0.0001, 0.001, + 0.002, 0.002, 0.001, 0.001, 0.096, 0.01, 0.001, 0.003, 0.003, 0.001, + 0.001, 0.003, 0.002, 0.015, 0.001, 0.004, 0.001, 0.008, 0.001, 0.001, + 0.005, 0.003, 0.253, 0.006, 0.002, 0.002, 0.003, 0.001, 0.003, 0.002, + 0.004, 0.005, 0.003, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.356, 0.056, + 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.005, 0.003, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.01, 0.006, 0.0001, 0.002, 0.001, 0.001, 0.0001, + 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + is: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.97, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.586, 0.001, 0.206, 0.0001, + 0.0001, 0.008, 0.002, 0.007, 0.124, 0.124, 0.0001, 0.001, 0.499, 0.123, + 1.026, 0.011, 0.247, 0.371, 0.182, 0.092, 0.087, 0.097, 0.09, 0.091, + 0.11, 0.206, 0.046, 0.01, 0.008, 0.003, 0.008, 0.001, 0.0001, 0.15, + 0.156, 0.07, 0.071, 0.123, 0.128, 0.099, 0.219, 0.049, 0.069, 0.114, + 0.102, 0.145, 0.086, 0.033, 0.076, 0.003, 0.091, 0.275, 0.089, 0.03, + 0.081, 0.029, 0.009, 0.012, 0.006, 0.003, 0.0001, 0.003, 0.0001, 0.004, + 0.0001, 6.834, 0.671, 0.132, 1.35, 4.383, 2.01, 2.575, 1.208, 5.351, + 0.788, 2.14, 3.293, 2.549, 5.87, 1.807, 0.609, 0.005, 6.508, 4.164, + 3.597, 3.384, 1.444, 0.036, 0.05, 0.678, 0.023, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.079, 0.071, 0.003, 0.002, 0.002, 0.001, 0.004, 0.001, + 0.001, 0.002, 0.001, 0.001, 0.001, 0.093, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.031, 0.002, 0.001, 0.01, 0.001, 0.001, 0.001, 0.008, 0.001, + 0.029, 0.003, 0.162, 0.001, 0.007, 1.147, 0.001, 0.001, 0.003, 0.001, + 0.559, 0.002, 0.002, 0.221, 0.001, 0.001, 0.001, 1.194, 0.001, 0.001, + 2.653, 0.002, 0.003, 0.801, 0.002, 0.002, 0.588, 0.001, 0.004, 0.002, + 0.419, 0.002, 0.005, 0.183, 0.658, 0.001, 0.0001, 0.0001, 0.014, 8.751, + 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.007, 0.004, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.002, 0.079, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + iu: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.678, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.59, 0.002, 0.2, 0.001, 0.003, + 0.002, 0.003, 0.015, 0.174, 0.173, 0.0001, 0.002, 0.361, 0.227, 0.729, + 0.057, 0.148, 0.113, 0.088, 0.041, 0.055, 0.057, 0.038, 0.037, 0.041, + 0.075, 0.086, 0.012, 0.034, 0.007, 0.037, 0.002, 0.001, 0.071, 0.015, + 0.028, 0.016, 0.027, 0.021, 0.01, 0.09, 0.106, 0.011, 0.032, 0.025, + 0.039, 0.045, 0.015, 0.038, 0.016, 0.009, 0.047, 0.052, 0.031, 0.008, + 0.018, 0.002, 0.004, 0.0001, 0.042, 0.001, 0.038, 0.0001, 0.005, 0.0001, + 3.23, 0.132, 0.269, 0.325, 0.963, 0.137, 0.72, 0.796, 3.179, 0.121, + 0.846, 1.083, 0.73, 1.94, 0.65, 0.417, 0.773, 0.909, 0.645, 2.138, 2.24, + 0.378, 0.125, 0.018, 0.352, 0.009, 0.063, 0.016, 0.064, 0.0001, 0.0001, + 0.195, 0.104, 0.722, 2.277, 0.527, 2.845, 0.283, 0.577, 0.292, 0.16, + 1.105, 0.322, 0.08, 0.107, 0.751, 0.183, 5.797, 4.461, 2.284, 5.133, + 1.078, 2.99, 2.939, 0.631, 0.063, 0.2, 0.245, 0.066, 0.007, 0.045, + 0.004, 0.005, 0.011, 0.073, 0.039, 0.009, 0.018, 0.411, 1.389, 0.092, + 0.103, 0.04, 1.113, 0.086, 0.008, 0.439, 0.043, 0.681, 0.098, 0.475, + 0.284, 0.202, 0.231, 0.064, 0.012, 0.003, 0.129, 0.126, 0.009, 0.223, + 0.007, 0.015, 0.041, 0.125, 0.0001, 0.0001, 0.1, 0.024, 0.004, 0.006, + 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.002, 0.0001, 0.0001, + 0.001, 0.131, 0.044, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.009, 0.014, + 0.007, 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.013, 21.14, + 0.181, 0.003, 0.004, 0.004, 0.004, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + jam: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.114, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.204, 0.0001, 0.437, 0.0001, + 0.002, 0.015, 0.001, 0.02, 0.246, 0.245, 0.0001, 0.001, 1.286, 0.238, + 0.848, 0.011, 0.225, 0.262, 0.144, 0.074, 0.072, 0.083, 0.075, 0.089, + 0.083, 0.132, 0.047, 0.038, 0.014, 0.002, 0.014, 0.002, 0.0001, 0.33, + 0.18, 0.107, 0.273, 0.095, 0.097, 0.106, 0.027, 0.375, 0.206, 0.243, + 0.122, 0.218, 0.135, 0.052, 0.177, 0.004, 0.132, 0.376, 0.091, 0.038, + 0.042, 0.116, 0.003, 0.09, 0.009, 0.033, 0.0001, 0.032, 0.0001, 0.0001, + 0.0001, 11.751, 1.124, 0.777, 3.113, 4.403, 1.279, 0.882, 3.07, 11.71, + 0.554, 2.318, 3.164, 2.271, 5.696, 3.101, 1.655, 0.006, 3.113, 3.636, + 3.486, 2.985, 0.575, 1.126, 0.207, 0.616, 0.737, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.054, 0.013, 0.006, 0.006, 0.011, 0.005, 0.006, 0.002, + 0.011, 0.004, 0.003, 0.002, 0.005, 0.004, 0.004, 0.001, 0.005, 0.003, + 0.003, 0.026, 0.009, 0.002, 0.001, 0.003, 0.001, 0.005, 0.001, 0.003, + 0.008, 0.008, 0.001, 0.0001, 0.066, 0.009, 0.001, 0.004, 0.01, 0.005, + 0.003, 0.008, 0.009, 0.009, 0.007, 0.005, 0.005, 0.009, 0.003, 0.008, + 0.005, 0.014, 0.004, 0.031, 0.002, 0.005, 0.002, 0.003, 0.006, 0.009, + 0.008, 0.006, 0.007, 0.007, 0.004, 0.009, 0.0001, 0.0001, 0.069, 0.057, + 0.012, 0.006, 0.0001, 0.001, 0.0001, 0.011, 0.004, 0.01, 0.001, 0.0001, + 0.049, 0.024, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.007, 0.002, 0.004, + 0.025, 0.021, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.017, + 0.008, 0.051, 0.0001, 0.002, 0.004, 0.003, 0.001, 0.002, 0.001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + jbo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.83, 0.0001, 0.137, 0.0001, + 0.0001, 0.001, 0.0001, 3.634, 0.016, 0.016, 0.0001, 0.0001, 0.047, + 0.014, 2.419, 0.008, 0.161, 0.318, 0.2, 0.098, 0.09, 0.087, 0.087, + 0.089, 0.108, 0.172, 0.004, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, + 0.035, 0.022, 0.028, 0.013, 0.017, 0.01, 0.012, 0.013, 0.015, 0.011, + 0.012, 0.019, 0.022, 0.019, 0.015, 0.017, 0.001, 0.021, 0.029, 0.019, + 0.006, 0.006, 0.008, 0.002, 0.002, 0.004, 0.002, 0.0001, 0.003, 0.0001, + 0.003, 0.0001, 7.616, 1.669, 2.73, 1.665, 6.288, 0.906, 1.481, 0.055, + 8.607, 1.326, 2.153, 5.868, 2.296, 4.062, 6.049, 1.389, 0.004, 2.945, + 3.13, 2.492, 4.934, 0.679, 0.018, 0.589, 0.829, 0.701, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.012, 0.01, 0.006, 0.006, 0.011, 0.005, 0.003, + 0.004, 0.008, 0.003, 0.008, 0.003, 0.003, 0.002, 0.002, 0.002, 0.003, + 0.002, 0.001, 0.003, 0.004, 0.004, 0.001, 0.002, 0.001, 0.006, 0.001, + 0.002, 0.002, 0.002, 0.001, 0.002, 0.003, 0.006, 0.002, 0.003, 0.005, + 0.003, 0.006, 0.013, 0.006, 0.012, 0.005, 0.003, 0.005, 0.008, 0.003, + 0.005, 0.01, 0.01, 0.007, 0.008, 0.003, 0.008, 0.002, 0.003, 0.01, + 0.005, 0.017, 0.007, 0.005, 0.005, 0.004, 0.003, 0.0001, 0.0001, 0.004, + 0.032, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.006, 0.004, 0.004, 0.002, + 0.0001, 0.016, 0.008, 0.046, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.007, 0.035, 0.026, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.02, 0.006, 0.007, 0.005, 0.001, 0.004, 0.003, 0.001, 0.001, + 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + jv: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.393, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.972, 0.002, 0.376, 0.0001, + 0.001, 0.006, 0.002, 0.021, 0.174, 0.174, 0.0001, 0.002, 1.038, 0.248, + 0.884, 0.027, 0.242, 0.269, 0.17, 0.077, 0.072, 0.083, 0.071, 0.073, + 0.084, 0.157, 0.063, 0.014, 0.005, 0.004, 0.005, 0.001, 0.0001, 0.298, + 0.282, 0.139, 0.175, 0.052, 0.071, 0.122, 0.1, 0.279, 0.193, 0.491, + 0.137, 0.261, 0.155, 0.054, 0.404, 0.008, 0.134, 0.426, 0.252, 0.063, + 0.039, 0.13, 0.007, 0.04, 0.014, 0.024, 0.0001, 0.024, 0.0001, 0.001, + 0.0001, 13.56, 1.271, 0.49, 2.178, 3.499, 0.191, 4.675, 1.646, 6.887, + 0.617, 3.65, 2.625, 2.089, 9.349, 2.312, 1.888, 0.011, 3.362, 3.296, + 3.086, 3.992, 0.185, 1.217, 0.022, 0.792, 0.054, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.032, 0.007, 0.005, 0.003, 0.005, 0.004, 0.003, 0.003, + 0.005, 0.012, 0.002, 0.001, 0.001, 0.004, 0.005, 0.002, 0.003, 0.002, + 0.003, 0.01, 0.003, 0.002, 0.001, 0.001, 0.003, 0.007, 0.001, 0.003, + 0.006, 0.006, 0.001, 0.001, 0.039, 0.004, 0.002, 0.003, 0.006, 0.005, + 0.004, 0.006, 0.531, 1.186, 0.005, 0.003, 0.002, 0.005, 0.002, 0.002, + 0.007, 0.006, 0.005, 0.006, 0.002, 0.002, 0.002, 0.001, 0.008, 0.005, + 0.003, 0.002, 0.004, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.048, 1.757, + 0.01, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.007, 0.003, 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.015, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.01, 0.005, 0.031, 0.001, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, + 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + ka: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.399, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.467, 0.006, 0.05, 0.004, + 0.0001, 0.005, 0.0001, 0.002, 0.08, 0.08, 0.0001, 0.001, 0.389, 0.146, + 0.411, 0.004, 0.126, 0.165, 0.095, 0.049, 0.046, 0.05, 0.043, 0.044, + 0.053, 0.091, 0.022, 0.014, 0.001, 0.004, 0.001, 0.001, 0.0001, 0.009, + 0.008, 0.011, 0.006, 0.004, 0.005, 0.005, 0.004, 0.036, 0.001, 0.002, + 0.005, 0.008, 0.005, 0.004, 0.007, 0.001, 0.005, 0.01, 0.01, 0.002, + 0.01, 0.003, 0.012, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.001, + 0.0001, 0.058, 0.009, 0.021, 0.031, 0.066, 0.012, 0.013, 0.018, 0.047, + 0.001, 0.009, 0.032, 0.017, 0.042, 0.05, 0.013, 0.001, 0.044, 0.039, + 0.037, 0.025, 0.006, 0.004, 0.003, 0.014, 0.002, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.133, 0.001, 0.001, 30.616, 0.001, 0.0001, 0.001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 4.203, 1.072, 0.617, 1.27, 2.811, 0.901, 0.251, 0.727, 3.846, 0.492, + 1.468, 1.522, 1.35, 1.641, 0.3, 0.022, 1.853, 2.198, 0.578, 0.828, + 0.251, 0.28, 0.142, 0.172, 0.523, 0.1, 0.36, 0.118, 0.305, 0.039, 0.412, + 0.073, 0.048, 0.001, 0.009, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.002, + 0.001, 0.001, 0.002, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.023, + 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.001, 0.013, 0.004, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 30.616, 0.133, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + kaa: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.138, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.976, 0.002, 0.25, 0.0001, + 0.0001, 0.021, 0.001, 3.483, 0.188, 0.189, 0.0001, 0.005, 0.857, 0.333, + 1.07, 0.015, 0.261, 0.313, 0.191, 0.105, 0.096, 0.102, 0.088, 0.083, + 0.102, 0.171, 0.072, 0.024, 0.027, 0.002, 0.027, 0.004, 0.0001, 0.278, + 0.237, 0.043, 0.064, 0.083, 0.059, 0.068, 0.047, 0.074, 0.082, 0.125, + 0.051, 0.155, 0.064, 0.155, 0.081, 0.145, 0.091, 0.217, 0.129, 0.07, + 0.048, 0.02, 0.093, 0.029, 0.015, 0.006, 0.0001, 0.006, 0.0001, 0.001, + 0.174, 10.672, 1.536, 0.082, 2.608, 4.846, 0.175, 1.712, 1.492, 6.03, + 0.848, 1.882, 4.983, 2.176, 5.612, 2.458, 1.187, 1.824, 4.354, 3.602, + 3.336, 1.517, 0.264, 0.926, 0.28, 1.912, 0.845, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.223, 0.008, 0.008, 0.008, 0.005, 0.003, 0.002, 0.003, + 0.003, 0.001, 0.002, 0.004, 0.002, 0.002, 0.002, 0.003, 0.008, 0.001, + 0.002, 0.024, 0.089, 0.003, 0.024, 0.001, 0.007, 0.086, 0.002, 0.002, + 0.011, 0.008, 0.005, 0.018, 0.016, 0.006, 0.003, 0.007, 0.007, 0.002, + 0.001, 0.006, 0.003, 0.004, 0.002, 0.012, 0.002, 0.006, 0.001, 0.009, + 0.142, 4.113, 0.008, 0.007, 0.005, 0.049, 0.005, 0.002, 0.01, 0.003, + 0.009, 0.024, 0.009, 0.012, 0.029, 0.003, 0.0001, 0.0001, 0.053, 0.053, + 4.15, 0.014, 0.0001, 0.002, 0.0001, 0.001, 0.004, 0.0001, 0.0001, + 0.0001, 0.009, 0.003, 0.235, 0.052, 0.004, 0.001, 0.001, 0.003, 0.0001, + 0.002, 0.013, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.006, 0.216, 0.0001, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + kab: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.63, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.911, 0.026, 0.321, 0.0001, + 0.0001, 0.004, 0.001, 0.063, 0.372, 0.372, 0.003, 0.002, 1.155, 1.35, + 0.936, 0.038, 0.266, 0.305, 0.202, 0.119, 0.101, 0.107, 0.102, 0.091, + 0.121, 0.181, 0.18, 0.035, 0.01, 0.019, 0.017, 0.012, 0.0001, 0.467, + 0.145, 0.091, 0.191, 0.038, 0.078, 0.046, 0.038, 0.257, 0.025, 0.056, + 0.211, 0.226, 0.079, 0.026, 0.046, 0.014, 0.063, 0.175, 0.468, 0.109, + 0.016, 0.087, 0.018, 0.161, 0.062, 0.014, 0.0001, 0.014, 0.0001, 0.076, + 0.0001, 9.2, 0.865, 0.672, 3.845, 7.769, 0.911, 1.711, 0.292, 5.622, + 0.162, 1.372, 2.877, 2.842, 6.403, 0.445, 0.148, 0.603, 3.37, 3.532, + 4.882, 2.937, 0.09, 1.486, 0.181, 2.148, 0.956, 0.0001, 0.011, 0.0001, + 0.0001, 0.0001, 0.079, 0.004, 0.004, 0.003, 0.012, 0.007, 0.008, 0.003, + 0.006, 0.01, 0.01, 0.0001, 0.003, 0.341, 0.007, 0.006, 0.04, 0.002, + 0.003, 0.156, 0.017, 0.001, 0.002, 0.001, 0.004, 0.031, 0.007, 0.42, + 0.023, 0.016, 0.002, 0.009, 0.025, 0.004, 0.015, 1.13, 0.027, 0.269, + 0.019, 0.099, 0.024, 0.093, 0.007, 0.018, 0.013, 0.276, 0.002, 0.011, + 0.014, 0.01, 0.006, 0.129, 0.025, 0.113, 0.001, 0.005, 0.586, 0.529, + 0.15, 0.021, 0.004, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.056, 0.149, + 0.056, 0.01, 0.05, 0.088, 0.0001, 1.3, 0.001, 0.001, 0.003, 0.0001, + 0.203, 0.001, 0.007, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.008, 0.063, 0.048, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.257, 0.143, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + kbd: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.877, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.792, 0.0001, 0.075, 0.0001, + 0.001, 0.011, 0.0001, 0.003, 0.141, 0.14, 0.0001, 0.003, 0.771, 0.205, + 0.683, 0.004, 0.136, 0.165, 0.088, 0.057, 0.049, 0.062, 0.042, 0.043, + 0.05, 0.078, 0.043, 0.017, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.002, + 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.001, 0.304, 0.0001, 0.002, + 0.001, 0.002, 0.001, 0.001, 0.003, 0.0001, 0.001, 0.002, 0.001, 0.001, + 0.008, 0.001, 0.014, 0.0001, 0.0001, 0.008, 0.0001, 0.008, 0.0001, + 0.0001, 0.0001, 0.03, 0.003, 0.008, 0.007, 0.025, 0.002, 0.005, 0.007, + 0.023, 0.001, 0.003, 0.195, 0.01, 0.018, 0.016, 0.007, 0.001, 0.016, + 0.015, 0.015, 0.012, 0.002, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 3.555, 0.735, 0.993, 2.937, 0.251, 2.403, 0.222, + 0.078, 0.401, 1.056, 2.895, 2.991, 0.659, 6.305, 0.005, 0.318, 0.209, + 0.078, 0.019, 0.048, 0.196, 0.035, 0.012, 0.035, 0.104, 0.003, 0.214, + 0.042, 0.072, 0.044, 0.009, 0.068, 0.044, 0.057, 0.06, 0.06, 0.029, + 0.076, 0.012, 0.013, 0.04, 0.033, 0.001, 0.031, 0.001, 0.015, 0.002, + 0.026, 2.293, 0.626, 0.124, 1.164, 0.956, 0.819, 0.63, 0.861, 1.412, + 0.263, 1.894, 1.024, 2.202, 1.111, 0.541, 0.996, 0.0001, 0.0001, 0.089, + 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.007, 0.001, 0.005, 0.002, 18.347, 24.31, 0.001, 1.322, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.003, 0.144, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + kbp: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.616, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.57, 0.002, 0.071, 0.0001, + 0.0001, 0.002, 0.0001, 0.006, 0.116, 0.115, 0.0001, 0.002, 0.667, 0.749, + 0.841, 0.003, 0.17, 0.215, 0.112, 0.059, 0.061, 0.065, 0.059, 0.058, + 0.083, 0.103, 0.043, 0.02, 0.0001, 0.014, 0.0001, 0.002, 0.0001, 0.165, + 0.045, 0.077, 0.029, 0.079, 0.067, 0.032, 0.069, 0.044, 0.029, 0.18, + 0.072, 0.11, 0.068, 0.032, 0.297, 0.002, 0.044, 0.127, 0.122, 0.017, + 0.016, 0.035, 0.003, 0.036, 0.006, 0.025, 0.0001, 0.025, 0.0001, 0.0001, + 0.0001, 8.914, 0.693, 0.409, 0.775, 2.26, 0.236, 0.534, 0.509, 1.986, + 0.346, 2.598, 2.297, 1.559, 3.608, 1.061, 1.995, 0.02, 0.616, 1.735, + 2.888, 0.861, 0.082, 0.914, 0.015, 2.587, 0.783, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.019, 0.022, 0.002, 0.003, 0.114, 0.001, 0.002, 0.001, + 0.002, 0.067, 2.039, 2.33, 0.002, 0.002, 0.001, 0.0001, 0.179, 0.013, + 0.001, 0.001, 2.735, 0.001, 1.381, 0.0001, 0.001, 0.007, 0.0001, 5.08, + 0.004, 0.003, 0.0001, 0.0001, 0.004, 0.008, 0.005, 1.151, 0.003, 0.001, + 0.001, 0.004, 0.013, 4.529, 0.002, 0.019, 0.001, 0.004, 0.003, 0.007, + 0.003, 0.207, 0.003, 0.002, 0.003, 0.002, 0.003, 0.001, 0.006, 0.003, + 0.002, 0.02, 0.003, 0.002, 0.002, 0.006, 0.0001, 0.0001, 0.035, 0.33, + 0.004, 1.069, 0.247, 0.001, 0.0001, 14.815, 3.312, 0.001, 0.128, 0.0001, + 0.011, 0.006, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.003, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.005, 0.007, 0.013, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + kg: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 4.239, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.886, 0.007, 0.336, 0.0001, + 0.0001, 0.012, 0.002, 0.078, 0.324, 0.324, 0.001, 0.002, 0.656, 0.558, + 1.416, 0.029, 0.129, 0.236, 0.138, 0.114, 0.084, 0.072, 0.081, 0.089, + 0.086, 0.136, 0.151, 0.002, 0.018, 0.006, 0.018, 0.004, 0.0001, 0.545, + 0.514, 0.255, 0.205, 0.262, 0.18, 0.131, 0.1, 0.152, 0.059, 0.708, + 0.293, 0.752, 0.533, 0.094, 0.176, 0.01, 0.241, 0.354, 0.199, 0.108, + 0.106, 0.05, 0.006, 0.156, 0.054, 0.004, 0.0001, 0.004, 0.0001, 0.001, + 0.001, 12.562, 2.277, 0.331, 1.547, 5.722, 0.691, 1.741, 0.399, 6.386, + 0.118, 3.863, 3.599, 2.582, 6.478, 2.883, 0.88, 0.049, 1.355, 2.305, + 2.139, 4.827, 0.445, 0.58, 0.051, 3.145, 1.337, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.071, 0.012, 0.003, 0.002, 0.01, 0.004, 0.003, 0.001, + 0.004, 0.005, 0.003, 0.002, 0.002, 0.003, 0.001, 0.001, 0.006, 0.001, + 0.001, 0.062, 0.006, 0.002, 0.0001, 0.001, 0.001, 0.009, 0.002, 0.004, + 0.002, 0.001, 0.001, 0.001, 0.037, 0.129, 0.127, 0.006, 0.006, 0.002, + 0.017, 0.018, 0.037, 0.077, 0.018, 0.027, 0.002, 0.034, 0.066, 0.007, + 0.011, 0.023, 0.005, 0.025, 0.156, 0.002, 0.001, 0.003, 0.003, 0.002, + 0.014, 0.066, 0.013, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.038, 0.798, + 0.007, 0.01, 0.0001, 0.0001, 0.0001, 0.013, 0.006, 0.004, 0.0001, 0.001, + 0.012, 0.004, 0.009, 0.006, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.006, 0.021, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.016, 0.007, 0.069, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, + 0.0001, 0.002, 0.002, 0.005, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ki: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 4.157, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.033, 0.001, 0.1, 0.001, + 0.0001, 0.002, 0.005, 0.051, 0.116, 0.115, 0.0001, 0.0001, 0.384, 0.122, + 1.505, 0.04, 0.182, 0.215, 0.151, 0.09, 0.071, 0.091, 0.067, 0.064, + 0.059, 0.089, 0.065, 0.003, 0.006, 0.002, 0.008, 0.01, 0.0001, 0.273, + 0.233, 0.763, 0.125, 0.089, 0.072, 0.168, 0.139, 0.145, 0.105, 0.364, + 0.123, 0.376, 0.291, 0.066, 0.138, 0.046, 0.111, 0.252, 0.278, 0.132, + 0.045, 0.093, 0.048, 0.079, 0.058, 0.02, 0.0001, 0.02, 0.0001, 0.015, + 0.0001, 10.33, 0.786, 1.541, 0.901, 3.961, 0.163, 2.604, 2.426, 8.641, + 0.326, 1.916, 0.633, 2.867, 6.576, 3.627, 0.309, 0.068, 4.492, 0.79, + 3.938, 2.525, 0.104, 1.397, 0.085, 2.472, 0.26, 0.003, 0.0001, 0.003, + 0.0001, 0.0001, 0.05, 0.003, 0.002, 0.001, 0.003, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.037, + 0.01, 0.0001, 0.001, 0.003, 0.0001, 0.001, 0.001, 0.013, 0.005, 0.0001, + 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.06, 4.809, 0.0001, 0.069, 0.002, + 0.006, 0.001, 0.004, 0.016, 0.25, 0.0001, 0.009, 0.003, 0.002, 0.0001, + 0.009, 0.003, 0.001, 0.003, 0.026, 0.003, 0.002, 0.001, 0.0001, 0.0001, + 0.0001, 0.021, 0.032, 2.884, 2.321, 0.0001, 0.002, 0.0001, 0.002, 0.021, + 0.001, 0.0001, 0.0001, 0.002, 0.001, 0.009, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.048, 0.0001, 0.0001, 0.003, + 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + kj: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 9.677, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.71, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.323, 0.323, 0.0001, 0.0001, 0.645, + 0.0001, 0.323, 0.0001, 1.613, 0.0001, 0.323, 0.323, 0.0001, 0.0001, + 0.645, 0.323, 0.0001, 0.0001, 0.968, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.645, 0.0001, 0.0001, + 0.0001, 0.0001, 0.645, 0.0001, 0.0001, 0.323, 0.0001, 2.903, 0.323, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.097, 3.226, + 0.0001, 6.774, 6.774, 1.935, 1.29, 2.903, 10.645, 0.0001, 3.226, 3.226, + 6.129, 2.581, 8.065, 0.323, 0.0001, 0.0001, 0.968, 0.323, 1.935, 0.645, + 2.581, 0.0001, 0.323, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + kk: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.706, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.721, 0.001, 0.107, 0.001, + 0.0001, 0.006, 0.0001, 0.002, 0.151, 0.153, 0.001, 0.003, 0.51, 0.246, + 0.686, 0.019, 0.221, 0.251, 0.17, 0.104, 0.092, 0.099, 0.09, 0.082, + 0.09, 0.149, 0.04, 0.015, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.007, + 0.006, 0.025, 0.003, 0.016, 0.005, 0.021, 0.002, 0.024, 0.001, 0.002, + 0.003, 0.008, 0.018, 0.004, 0.01, 0.0001, 0.004, 0.021, 0.003, 0.003, + 0.004, 0.004, 0.005, 0.001, 0.003, 0.003, 0.0001, 0.003, 0.0001, 0.002, + 0.0001, 0.029, 0.005, 0.01, 0.008, 0.028, 0.004, 0.005, 0.007, 0.042, + 0.0001, 0.004, 0.014, 0.009, 0.02, 0.023, 0.007, 0.0001, 0.021, 0.015, + 0.017, 0.01, 0.003, 0.003, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 2.667, 1.698, 2.42, 0.825, 0.088, 0.097, 0.101, 0.026, + 0.573, 0.004, 0.008, 3.51, 0.092, 0.043, 0.029, 0.226, 0.151, 0.105, + 0.034, 0.789, 0.175, 0.042, 2.128, 0.009, 0.046, 0.288, 0.211, 1.223, + 0.099, 0.041, 0.082, 0.052, 0.093, 0.104, 0.084, 0.646, 0.032, 0.032, + 0.003, 0.007, 0.066, 0.363, 0.0001, 0.047, 0.001, 0.014, 0.013, 0.268, + 5.447, 1.26, 0.188, 0.541, 1.919, 3.092, 0.668, 0.583, 0.903, 0.603, + 1.169, 2.242, 1.309, 3.102, 1.26, 0.548, 0.0001, 0.0001, 0.145, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.0001, 25.612, 14.266, 3.356, 0.697, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.197, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + kl: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.635, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.811, 0.001, 0.341, 0.0001, + 0.0001, 0.006, 0.002, 0.029, 0.34, 0.34, 0.002, 0.001, 0.7, 0.575, + 1.063, 0.02, 0.29, 0.457, 0.333, 0.207, 0.125, 0.141, 0.14, 0.129, + 0.134, 0.187, 0.161, 0.026, 0.008, 0.005, 0.008, 0.0001, 0.0001, 0.28, + 0.09, 0.107, 0.095, 0.075, 0.086, 0.052, 0.078, 0.183, 0.108, 0.243, + 0.074, 0.184, 0.254, 0.06, 0.118, 0.079, 0.062, 0.257, 0.166, 0.177, + 0.059, 0.032, 0.002, 0.012, 0.015, 0.004, 0.0001, 0.004, 0.0001, 0.001, + 0.0001, 12.711, 0.276, 0.184, 0.432, 3.419, 0.731, 1.669, 0.268, 10.409, + 0.217, 2.335, 4.586, 2.81, 6.778, 2.817, 1.735, 2.883, 5.126, 5.68, + 6.217, 6.675, 0.652, 0.054, 0.023, 0.144, 0.055, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.031, 0.035, 0.014, 0.011, 0.03, 0.017, 0.013, 0.007, + 0.019, 0.003, 0.015, 0.002, 0.011, 0.008, 0.02, 0.004, 0.014, 0.011, + 0.007, 0.013, 0.007, 0.01, 0.01, 0.01, 0.008, 0.016, 0.005, 0.005, + 0.009, 0.004, 0.004, 0.006, 0.015, 0.021, 0.01, 0.011, 0.03, 0.03, + 0.045, 0.038, 0.021, 0.031, 0.02, 0.014, 0.007, 0.018, 0.005, 0.016, + 0.035, 0.027, 0.022, 0.024, 0.011, 0.015, 0.016, 0.009, 0.078, 0.018, + 0.016, 0.011, 0.01, 0.011, 0.018, 0.012, 0.0001, 0.0001, 0.012, 0.201, + 0.031, 0.017, 0.001, 0.001, 0.0001, 0.004, 0.004, 0.004, 0.004, 0.0001, + 0.016, 0.008, 0.085, 0.031, 0.0001, 0.001, 0.0001, 0.0001, 0.024, 0.053, + 0.13, 0.094, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.065, 0.039, + 0.022, 0.0001, 0.001, 0.011, 0.007, 0.001, 0.001, 0.003, 0.001, 0.002, + 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + km: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.234, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.565, 0.004, 0.038, 0.0001, + 0.0001, 0.004, 0.0001, 0.009, 0.049, 0.049, 0.0001, 0.001, 0.07, 0.028, + 0.072, 0.003, 0.02, 0.022, 0.013, 0.008, 0.007, 0.007, 0.006, 0.006, + 0.007, 0.012, 0.008, 0.003, 0.007, 0.012, 0.008, 0.004, 0.0001, 0.018, + 0.012, 0.02, 0.008, 0.012, 0.009, 0.007, 0.009, 0.013, 0.004, 0.006, + 0.012, 0.012, 0.009, 0.006, 0.011, 0.001, 0.009, 0.018, 0.02, 0.004, + 0.004, 0.006, 0.002, 0.002, 0.001, 0.022, 0.0001, 0.022, 0.0001, 0.004, + 0.0001, 0.403, 0.068, 0.154, 0.173, 0.554, 0.096, 0.093, 0.2, 0.358, + 0.005, 0.025, 0.201, 0.122, 0.348, 0.339, 0.093, 0.005, 0.306, 0.292, + 0.378, 0.132, 0.051, 0.059, 0.012, 0.073, 0.006, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 2.652, 0.801, 0.696, 0.139, 1.351, 0.735, 0.591, 0.836, + 0.083, 0.299, 0.563, 1.859, 0.05, 0.041, 0.223, 1.134, 0.273, 0.671, + 2.897, 1.707, 1.359, 0.097, 0.57, 0.24, 1.039, 0.72, 1.493, 0.708, + 0.482, 0.006, 22.614, 7.802, 0.292, 0.16, 0.416, 0.027, 0.02, 0.041, + 0.016, 0.053, 0.015, 0.021, 0.003, 0.006, 0.019, 0.002, 0.004, 0.041, + 0.002, 0.021, 0.047, 0.001, 0.001, 0.001, 2.388, 0.829, 0.388, 0.131, + 0.053, 0.602, 0.318, 0.199, 0.385, 0.021, 0.0001, 0.0001, 0.017, 0.006, + 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.014, 29.306, 1.288, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + kn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.22, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.193, 0.001, 0.077, 0.0001, + 0.001, 0.006, 0.001, 0.024, 0.05, 0.05, 0.001, 0.001, 0.263, 0.039, + 0.387, 0.008, 0.055, 0.048, 0.031, 0.015, 0.013, 0.017, 0.014, 0.014, + 0.016, 0.027, 0.012, 0.01, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.007, + 0.004, 0.007, 0.004, 0.004, 0.003, 0.002, 0.002, 0.007, 0.001, 0.001, + 0.002, 0.005, 0.003, 0.003, 0.004, 0.0001, 0.003, 0.008, 0.004, 0.004, + 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, + 0.001, 0.001, 0.019, 0.003, 0.007, 0.007, 0.022, 0.004, 0.004, 0.008, + 0.016, 0.001, 0.002, 0.009, 0.007, 0.014, 0.015, 0.005, 0.0001, 0.014, + 0.012, 0.015, 0.006, 0.002, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.003, + 0.0001, 0.0001, 0.0001, 0.377, 1.744, 1.056, 0.052, 0.0001, 0.294, + 1.302, 0.476, 0.14, 0.07, 0.25, 0.184, 0.18, 3.237, 0.115, 0.016, 0.01, + 0.0001, 0.076, 0.009, 0.004, 1.075, 0.058, 1.134, 0.019, 0.006, 0.205, + 0.005, 0.214, 0.004, 0.012, 0.397, 0.02, 0.439, 0.004, 0.214, 1.341, + 0.105, 1.57, 0.184, 1.477, 0.01, 0.553, 0.067, 0.408, 0.14, 0.772, + 0.936, 1.909, 0.0001, 24.738, 8.223, 0.0001, 1.147, 0.212, 0.182, 0.975, + 0.409, 0.0001, 0.0001, 0.001, 0.0001, 1.605, 2.364, 0.0001, 0.0001, + 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 31.178, 0.0001, 0.177, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + koi: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.5, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.538, 0.003, 0.105, 0.0001, + 0.0001, 0.012, 0.0001, 0.066, 0.298, 0.299, 0.001, 0.003, 0.665, 0.135, + 0.828, 0.022, 0.193, 0.238, 0.151, 0.096, 0.069, 0.095, 0.069, 0.062, + 0.067, 0.14, 0.09, 0.011, 0.011, 0.003, 0.011, 0.012, 0.0001, 0.012, + 0.004, 0.007, 0.003, 0.004, 0.002, 0.002, 0.009, 0.016, 0.003, 0.015, + 0.007, 0.012, 0.004, 0.018, 0.015, 0.0001, 0.004, 0.016, 0.008, 0.003, + 0.011, 0.001, 0.01, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.204, 0.031, 0.062, 0.036, 0.122, 0.007, 0.019, 0.037, 0.201, + 0.009, 0.035, 0.077, 0.03, 0.109, 0.075, 0.025, 0.001, 0.099, 0.08, + 0.059, 0.07, 0.013, 0.004, 0.003, 0.013, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 2.529, 2.707, 1.977, 1.216, 0.076, 0.086, 0.043, 0.37, + 0.314, 0.008, 0.015, 2.496, 1.151, 0.356, 0.143, 0.67, 0.146, 0.176, + 0.113, 0.201, 0.173, 0.031, 0.44, 0.017, 0.071, 0.03, 0.345, 0.07, 0.14, + 0.058, 0.096, 0.178, 0.09, 0.17, 0.07, 0.048, 0.048, 0.034, 0.04, 1.604, + 0.03, 0.001, 0.001, 0.041, 0.0001, 0.038, 0.042, 0.02, 3.314, 0.375, + 1.556, 0.398, 1.638, 1.43, 1.24, 0.859, 1.906, 0.527, 1.802, 1.787, + 1.504, 2.903, 2.273, 0.718, 0.0001, 0.0001, 0.079, 0.905, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.021, 0.0001, 0.001, + 0.001, 25.357, 14.367, 0.001, 1.602, 0.0001, 0.0001, 0.001, 0.002, + 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, + 0.0001, 0.293, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + kr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 25.0, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 8.333, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.667, 0.0001, + 0.0001, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 8.333, 0.0001, 0.0001, + 0.0001, 0.0001, 8.333, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + krc: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.633, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.611, 0.001, 0.078, 0.0001, + 0.002, 0.011, 0.0001, 0.002, 0.139, 0.14, 0.0001, 0.001, 0.591, 0.21, + 0.542, 0.004, 0.138, 0.24, 0.114, 0.076, 0.067, 0.073, 0.058, 0.056, + 0.073, 0.12, 0.04, 0.013, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.004, + 0.004, 0.006, 0.003, 0.003, 0.002, 0.003, 0.002, 0.03, 0.001, 0.002, + 0.003, 0.004, 0.002, 0.002, 0.002, 0.001, 0.002, 0.005, 0.004, 0.001, + 0.01, 0.002, 0.017, 0.0001, 0.001, 0.014, 0.0001, 0.014, 0.0001, 0.001, + 0.0001, 0.038, 0.009, 0.012, 0.014, 0.044, 0.006, 0.01, 0.013, 0.029, + 0.002, 0.006, 0.019, 0.015, 0.026, 0.027, 0.008, 0.001, 0.031, 0.024, + 0.024, 0.014, 0.007, 0.003, 0.002, 0.005, 0.003, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 2.564, 1.141, 1.579, 1.633, 0.148, 0.303, 0.164, 0.503, + 0.456, 0.003, 1.306, 2.454, 0.134, 0.294, 0.686, 0.418, 0.168, 0.334, + 0.032, 0.057, 0.2, 0.019, 0.006, 0.011, 0.056, 0.006, 0.17, 0.03, 0.076, + 0.03, 0.044, 0.051, 0.143, 0.104, 0.049, 0.03, 0.04, 0.03, 0.005, 0.024, + 0.052, 0.001, 0.001, 0.061, 0.001, 0.035, 0.01, 0.009, 6.121, 1.252, + 0.294, 1.328, 2.359, 2.412, 0.507, 0.442, 2.779, 0.471, 1.691, 3.418, + 1.039, 3.402, 1.301, 0.302, 0.0001, 0.0001, 0.209, 0.005, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, 0.0001, 0.006, + 0.002, 30.423, 13.816, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, + 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.004, 0.14, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + ks: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.09, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.116, 0.0001, 0.395, 0.007, + 0.0001, 0.0001, 0.004, 0.023, 0.126, 0.124, 0.0001, 0.001, 0.08, 0.153, + 0.257, 0.005, 0.042, 0.08, 0.041, 0.04, 0.021, 0.031, 0.018, 0.019, + 0.02, 0.048, 0.059, 0.003, 0.053, 0.167, 0.053, 0.0001, 0.0001, 0.005, + 0.003, 0.008, 0.007, 0.01, 0.007, 0.001, 0.002, 0.016, 0.003, 0.003, + 0.003, 0.004, 0.019, 0.008, 0.002, 0.0001, 0.005, 0.01, 0.013, 0.001, + 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.198, 0.016, 0.127, 0.13, 0.17, 0.01, 0.074, 0.033, + 0.171, 0.002, 0.016, 0.235, 0.092, 0.256, 0.101, 0.014, 0.0001, 0.218, + 0.145, 0.254, 0.031, 0.065, 0.054, 0.0001, 0.012, 0.0001, 0.0001, 0.009, + 0.0001, 0.0001, 0.0001, 0.451, 1.562, 0.534, 0.248, 1.154, 1.571, 2.211, + 0.263, 1.281, 0.132, 0.341, 0.16, 1.683, 0.702, 0.993, 0.637, 0.623, + 0.052, 0.37, 0.043, 0.331, 0.813, 0.313, 0.319, 0.042, 0.007, 0.092, + 0.282, 0.326, 0.013, 0.006, 0.065, 0.245, 0.114, 0.179, 0.083, 8.684, + 2.577, 0.461, 2.698, 1.217, 0.995, 1.306, 0.114, 0.545, 0.242, 0.666, + 1.253, 0.811, 1.543, 0.848, 0.915, 0.434, 0.417, 0.188, 0.11, 0.481, + 0.73, 0.156, 0.08, 0.312, 0.004, 2.104, 0.512, 0.0001, 0.0001, 0.188, + 0.0001, 0.017, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.031, 0.0001, 0.008, 0.002, 0.028, 0.008, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 10.045, 10.482, 2.72, 3.264, 0.0001, 0.0001, + 0.0001, 0.0001, 10.717, 0.001, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.129, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ksh: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.3, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.544, 0.007, 0.195, 0.001, + 0.0001, 0.006, 0.002, 0.064, 0.077, 0.076, 0.018, 0.0001, 0.951, 0.126, + 1.237, 0.01, 0.258, 0.351, 0.176, 0.091, 0.09, 0.099, 0.083, 0.083, + 0.116, 0.206, 0.046, 0.013, 0.003, 0.002, 0.003, 0.004, 0.0001, 0.29, + 0.361, 0.086, 0.549, 0.218, 0.205, 0.059, 0.258, 0.102, 0.404, 0.343, + 0.228, 0.359, 0.191, 0.138, 0.226, 0.009, 0.194, 0.601, 0.11, 0.081, + 0.179, 0.232, 0.004, 0.009, 0.121, 0.015, 0.0001, 0.017, 0.0001, 0.132, + 0.0001, 4.203, 0.771, 2.07, 4.046, 9.612, 0.707, 0.863, 3.367, 3.374, + 1.363, 1.028, 2.762, 2.009, 5.309, 3.906, 0.798, 0.006, 4.302, 3.629, + 3.86, 2.108, 1.453, 1.005, 0.049, 0.079, 0.749, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.123, 0.002, 0.002, 0.001, 0.082, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.0001, 0.005, 0.0001, 0.002, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.005, 0.011, 0.0001, 0.082, 0.036, 0.001, 0.009, 0.0001, 0.001, + 0.047, 0.002, 0.044, 0.413, 0.03, 0.004, 0.001, 0.001, 1.721, 0.001, + 0.004, 0.002, 0.003, 0.013, 0.001, 0.084, 0.001, 0.002, 0.0001, 0.008, + 0.003, 0.001, 0.005, 0.025, 0.002, 0.001, 1.538, 0.002, 0.001, 0.001, + 0.002, 0.003, 0.531, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.029, 4.494, + 0.051, 0.013, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.001, 0.0001, + 0.0001, 0.002, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.124, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ku: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.393, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.949, 0.005, 0.256, 0.0001, + 0.0001, 0.006, 0.001, 0.113, 0.21, 0.21, 0.006, 0.003, 0.803, 0.095, + 1.083, 0.023, 0.197, 0.26, 0.139, 0.073, 0.067, 0.078, 0.071, 0.068, + 0.08, 0.162, 0.084, 0.022, 0.008, 0.003, 0.008, 0.006, 0.0001, 0.192, + 0.235, 0.084, 0.253, 0.208, 0.064, 0.107, 0.175, 0.032, 0.081, 0.247, + 0.144, 0.22, 0.115, 0.035, 0.144, 0.05, 0.104, 0.203, 0.123, 0.017, + 0.026, 0.063, 0.071, 0.053, 0.061, 0.009, 0.0001, 0.009, 0.0001, 0.003, + 0.002, 7.122, 1.894, 0.369, 2.998, 7.334, 0.296, 0.895, 1.263, 5.92, + 0.932, 2.612, 1.973, 1.601, 5.257, 1.434, 0.604, 0.177, 4.384, 1.643, + 2.193, 1.071, 1.195, 1.296, 0.608, 2.23, 0.722, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.075, 0.006, 0.004, 0.007, 0.009, 0.007, 0.012, 0.062, + 0.012, 0.002, 0.018, 0.001, 0.015, 0.003, 0.068, 0.002, 0.001, 0.001, + 0.002, 0.006, 0.001, 0.004, 0.003, 0.001, 0.007, 0.019, 0.001, 0.009, + 0.013, 0.012, 0.074, 0.658, 0.013, 0.005, 0.004, 0.002, 0.003, 0.002, + 0.004, 0.335, 0.008, 0.015, 3.587, 0.004, 0.003, 0.008, 2.776, 0.007, + 0.009, 0.038, 0.007, 0.007, 0.016, 0.003, 0.007, 0.002, 0.005, 0.004, + 0.005, 1.203, 0.019, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.03, 8.061, + 0.042, 0.73, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, + 0.01, 0.005, 0.017, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.003, + 0.063, 0.061, 0.005, 0.012, 0.001, 0.0001, 0.0001, 0.0001, 0.002, 0.006, + 0.073, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + kv: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.403, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.572, 0.002, 0.112, 0.0001, + 0.0001, 0.004, 0.0001, 0.006, 0.253, 0.254, 0.001, 0.001, 0.652, 0.237, + 0.796, 0.019, 0.199, 0.362, 0.176, 0.114, 0.094, 0.095, 0.085, 0.09, + 0.105, 0.228, 0.059, 0.022, 0.003, 0.001, 0.004, 0.001, 0.0001, 0.008, + 0.005, 0.011, 0.005, 0.005, 0.004, 0.005, 0.005, 0.02, 0.004, 0.011, + 0.006, 0.006, 0.007, 0.004, 0.005, 0.002, 0.005, 0.011, 0.006, 0.004, + 0.008, 0.003, 0.013, 0.003, 0.002, 0.039, 0.0001, 0.039, 0.0001, 0.0001, + 0.0001, 0.115, 0.019, 0.016, 0.027, 0.069, 0.009, 0.022, 0.03, 0.155, + 0.012, 0.027, 0.043, 0.035, 0.068, 0.048, 0.017, 0.005, 0.048, 0.041, + 0.048, 0.044, 0.012, 0.013, 0.005, 0.014, 0.009, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 2.292, 3.131, 1.711, 1.163, 0.094, 0.093, 0.068, 0.394, + 0.316, 0.013, 0.283, 2.417, 0.996, 0.157, 0.138, 0.933, 0.185, 0.144, + 0.161, 0.163, 0.266, 0.043, 0.288, 0.024, 0.072, 0.036, 0.257, 0.079, + 0.116, 0.07, 0.051, 0.125, 0.115, 0.273, 0.082, 0.056, 0.037, 0.021, + 0.028, 2.085, 0.052, 0.007, 0.009, 0.112, 0.005, 0.032, 0.025, 0.019, + 3.353, 0.487, 1.618, 0.507, 1.803, 1.293, 0.994, 0.555, 1.916, 0.692, + 1.739, 1.936, 1.41, 2.819, 2.119, 0.641, 0.0001, 0.0001, 0.211, 0.665, + 0.015, 0.015, 0.006, 0.004, 0.002, 0.021, 0.019, 0.013, 0.017, 0.003, + 0.013, 0.006, 25.09, 14.142, 0.006, 2.075, 0.003, 0.001, 0.001, 0.003, + 0.01, 0.008, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.016, 0.023, + 0.303, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + kw: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.271, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.698, 0.003, 0.428, 0.0001, + 0.0001, 0.066, 0.001, 0.379, 0.501, 0.501, 0.001, 0.001, 1.043, 0.466, + 1.444, 0.019, 0.602, 0.995, 0.55, 0.31, 0.288, 0.284, 0.283, 0.29, + 0.333, 0.472, 0.076, 0.113, 0.013, 0.003, 0.013, 0.002, 0.0001, 0.413, + 0.261, 0.217, 0.211, 0.211, 0.117, 0.24, 0.182, 0.089, 0.078, 0.627, + 0.279, 0.264, 0.166, 0.089, 0.271, 0.018, 0.16, 0.497, 0.182, 0.13, + 0.12, 0.167, 0.003, 0.325, 0.009, 0.005, 0.0001, 0.005, 0.0001, 0.0001, + 0.0001, 7.247, 1.102, 0.333, 2.599, 6.963, 0.397, 1.527, 3.863, 2.585, + 0.151, 1.745, 2.596, 1.638, 6.936, 4.292, 0.693, 0.011, 4.812, 4.449, + 2.907, 1.185, 1.044, 2.706, 0.022, 4.495, 0.043, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.063, 0.013, 0.005, 0.007, 0.005, 0.004, 0.003, 0.003, + 0.006, 0.002, 0.002, 0.001, 0.003, 0.005, 0.002, 0.002, 0.003, 0.003, + 0.001, 0.033, 0.004, 0.002, 0.002, 0.004, 0.004, 0.02, 0.001, 0.001, + 0.003, 0.002, 0.001, 0.002, 0.025, 0.014, 0.004, 0.005, 0.015, 0.004, + 0.003, 0.007, 0.004, 0.018, 0.007, 0.005, 0.002, 0.009, 0.005, 0.004, + 0.012, 0.007, 0.012, 0.009, 0.008, 0.009, 0.007, 0.003, 0.012, 0.008, + 0.009, 0.008, 0.006, 0.007, 0.012, 0.004, 0.0001, 0.0001, 0.028, 0.1, + 0.011, 0.012, 0.0001, 0.001, 0.0001, 0.007, 0.003, 0.004, 0.004, 0.0001, + 0.012, 0.004, 0.062, 0.02, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.004, + 0.013, 0.011, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.013, 0.007, + 0.058, 0.0001, 0.001, 0.002, 0.002, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + ky: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.608, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.786, 0.001, 0.076, 0.0001, + 0.0001, 0.007, 0.001, 0.001, 0.181, 0.185, 0.0001, 0.003, 0.592, 0.375, + 0.793, 0.011, 0.212, 0.26, 0.154, 0.095, 0.087, 0.095, 0.083, 0.081, + 0.088, 0.165, 0.05, 0.023, 0.024, 0.003, 0.024, 0.002, 0.0001, 0.006, + 0.009, 0.006, 0.003, 0.002, 0.01, 0.002, 0.004, 0.023, 0.001, 0.001, + 0.003, 0.004, 0.009, 0.004, 0.011, 0.0001, 0.003, 0.019, 0.005, 0.001, + 0.003, 0.002, 0.004, 0.001, 0.0001, 0.007, 0.0001, 0.008, 0.0001, 0.002, + 0.0001, 0.034, 0.028, 0.011, 0.01, 0.036, 0.004, 0.007, 0.01, 0.029, + 0.001, 0.005, 0.017, 0.009, 0.023, 0.028, 0.008, 0.001, 0.047, 0.02, + 0.022, 0.013, 0.003, 0.003, 0.002, 0.006, 0.001, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 2.775, 1.184, 2.443, 1.907, 0.113, 0.08, 0.128, 0.561, + 0.622, 0.004, 0.005, 2.414, 0.086, 0.264, 0.107, 0.368, 0.184, 0.149, + 0.029, 0.1, 0.146, 0.009, 0.06, 0.008, 0.039, 0.003, 0.233, 0.023, + 0.133, 0.051, 0.082, 0.045, 0.072, 0.109, 0.101, 0.162, 0.039, 0.017, + 0.003, 0.031, 0.045, 0.843, 0.0001, 0.06, 0.001, 0.049, 0.011, 1.059, + 5.238, 0.934, 0.249, 1.237, 1.665, 2.222, 0.662, 0.522, 2.314, 0.665, + 2.431, 2.219, 1.157, 3.498, 1.756, 0.567, 0.0001, 0.0001, 0.135, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 28.842, 12.881, 1.192, 0.856, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.186, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + la: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.703, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.582, 0.002, 0.557, 0.0001, + 0.0001, 0.004, 0.001, 0.038, 0.296, 0.296, 0.016, 0.002, 1.029, 0.127, + 0.917, 0.01, 0.288, 0.518, 0.368, 0.158, 0.135, 0.172, 0.155, 0.139, + 0.169, 0.292, 0.103, 0.058, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.441, + 0.179, 0.385, 0.16, 0.131, 0.176, 0.158, 0.144, 0.363, 0.023, 0.04, + 0.184, 0.266, 0.121, 0.103, 0.293, 0.049, 0.202, 0.319, 0.152, 0.063, + 0.122, 0.033, 0.022, 0.01, 0.013, 0.004, 0.0001, 0.004, 0.0001, 0.004, + 0.0001, 7.718, 1.137, 2.983, 1.877, 7.832, 0.566, 0.934, 0.721, 8.862, + 0.018, 0.079, 2.703, 3.638, 5.533, 4.661, 1.753, 0.47, 5.095, 5.379, + 5.968, 5.347, 0.814, 0.036, 0.291, 0.205, 0.069, 0.0001, 0.007, 0.0001, + 0.0001, 0.0001, 0.045, 0.018, 0.011, 0.014, 0.009, 0.005, 0.004, 0.005, + 0.004, 0.018, 0.002, 0.002, 0.005, 0.007, 0.002, 0.002, 0.004, 0.003, + 0.002, 0.014, 0.007, 0.002, 0.002, 0.002, 0.003, 0.004, 0.003, 0.002, + 0.004, 0.003, 0.003, 0.004, 0.013, 0.011, 0.004, 0.003, 0.009, 0.004, + 0.004, 0.006, 0.01, 0.02, 0.004, 0.013, 0.003, 0.007, 0.003, 0.005, + 0.044, 0.013, 0.009, 0.008, 0.006, 0.012, 0.008, 0.005, 0.014, 0.01, + 0.011, 0.011, 0.013, 0.014, 0.01, 0.01, 0.0001, 0.0001, 0.047, 0.083, + 0.019, 0.012, 0.0001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, + 0.062, 0.03, 0.07, 0.024, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.005, + 0.012, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.009, + 0.015, 0.037, 0.003, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + lad: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.233, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.114, 0.001, 0.334, 0.0001, + 0.0001, 0.009, 0.001, 0.032, 0.169, 0.169, 0.0001, 0.0001, 1.028, 0.087, + 0.763, 0.008, 0.237, 0.25, 0.147, 0.074, 0.074, 0.086, 0.072, 0.065, + 0.078, 0.138, 0.053, 0.043, 0.005, 0.001, 0.005, 0.001, 0.0001, 0.303, + 0.15, 0.122, 0.124, 0.422, 0.07, 0.094, 0.073, 0.145, 0.052, 0.173, + 0.269, 0.273, 0.076, 0.097, 0.169, 0.01, 0.114, 0.279, 0.178, 0.068, + 0.08, 0.015, 0.026, 0.054, 0.024, 0.01, 0.0001, 0.01, 0.0001, 0.0001, + 0.0001, 10.092, 0.654, 0.428, 4.329, 9.389, 0.52, 0.701, 0.524, 5.468, + 0.466, 2.315, 4.475, 1.912, 5.533, 6.266, 1.56, 0.038, 4.367, 5.784, + 3.223, 2.47, 1.069, 0.027, 0.043, 1.039, 0.561, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.02, 0.012, 0.005, 0.005, 0.009, 0.006, 0.004, 0.004, + 0.005, 0.003, 0.006, 0.002, 0.002, 0.003, 0.003, 0.001, 0.015, 0.012, + 0.004, 0.011, 0.018, 0.019, 0.004, 0.004, 0.007, 0.031, 0.002, 0.006, + 0.016, 0.006, 0.01, 0.011, 0.017, 0.14, 0.008, 0.005, 0.006, 0.003, + 0.003, 0.02, 0.02, 0.11, 0.013, 0.01, 0.003, 0.09, 0.002, 0.005, 0.012, + 0.024, 0.019, 0.137, 0.008, 0.006, 0.005, 0.006, 0.008, 0.006, 0.03, + 0.011, 0.011, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.044, 0.511, 0.018, + 0.013, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.017, + 0.007, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.005, 0.02, 0.199, 0.037, + 0.028, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.006, + 0.018, 0.0001, 0.001, 0.003, 0.002, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + lb: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.412, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.95, 0.002, 0.355, 0.0001, + 0.0001, 0.008, 0.002, 0.417, 0.145, 0.146, 0.001, 0.003, 0.802, 0.307, + 1.03, 0.016, 0.348, 0.52, 0.266, 0.139, 0.134, 0.143, 0.128, 0.134, + 0.162, 0.294, 0.059, 0.012, 0.015, 0.003, 0.015, 0.001, 0.0001, 0.428, + 0.324, 0.254, 0.594, 0.233, 0.259, 0.289, 0.233, 0.12, 0.196, 0.27, + 0.284, 0.379, 0.192, 0.132, 0.314, 0.012, 0.243, 0.585, 0.165, 0.101, + 0.142, 0.167, 0.006, 0.01, 0.098, 0.005, 0.0001, 0.005, 0.0001, 0.003, + 0.0001, 4.931, 0.886, 1.95, 2.841, 11.151, 0.974, 2.202, 2.438, 4.449, + 0.072, 0.85, 2.736, 2.142, 6.511, 2.976, 0.873, 0.044, 5.369, 4.192, + 4.448, 3.418, 0.952, 0.815, 0.087, 0.179, 0.783, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.039, 0.004, 0.003, 0.002, 0.022, 0.001, 0.001, 0.002, + 0.001, 0.016, 0.001, 0.02, 0.001, 0.001, 0.003, 0.001, 0.001, 0.001, + 0.001, 0.012, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, + 0.01, 0.002, 0.008, 0.002, 0.053, 0.005, 0.005, 0.001, 0.485, 0.001, + 0.003, 0.007, 0.029, 0.959, 0.004, 0.541, 0.001, 0.003, 0.002, 0.002, + 0.009, 0.004, 0.006, 0.005, 0.01, 0.003, 0.01, 0.001, 0.004, 0.002, + 0.003, 0.005, 0.046, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.061, 2.169, + 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.01, 0.004, 0.024, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.002, 0.037, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + lbe: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.255, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.9, 0.001, 0.252, 0.0001, + 0.0001, 0.001, 0.0001, 0.011, 0.416, 0.416, 0.0001, 0.003, 0.481, 0.136, + 0.815, 0.07, 0.265, 0.236, 0.199, 0.107, 0.105, 0.116, 0.098, 0.098, + 0.121, 0.12, 0.136, 0.067, 0.071, 0.002, 0.067, 0.006, 0.0001, 0.016, + 0.004, 0.021, 0.002, 0.004, 0.005, 0.004, 0.003, 0.485, 0.0001, 0.002, + 0.006, 0.012, 0.003, 0.003, 0.014, 0.001, 0.005, 0.011, 0.004, 0.002, + 0.006, 0.002, 0.003, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.216, 0.084, 0.071, 0.045, 0.128, 0.01, 0.022, 0.031, + 0.155, 0.002, 0.014, 0.09, 0.049, 0.088, 0.086, 0.051, 0.003, 0.174, + 0.114, 0.069, 0.102, 0.012, 0.003, 0.009, 0.024, 0.006, 0.001, 0.001, + 0.001, 0.001, 0.0001, 3.391, 1.985, 1.311, 3.41, 0.076, 1.237, 0.309, + 0.579, 0.377, 0.095, 0.645, 0.087, 1.158, 0.044, 0.125, 0.671, 0.313, + 0.089, 0.058, 0.221, 0.212, 0.014, 0.015, 0.044, 0.077, 0.005, 0.185, + 0.069, 0.144, 0.054, 0.029, 0.04, 0.037, 0.075, 0.123, 0.038, 0.018, + 0.116, 0.052, 0.091, 0.05, 0.027, 0.003, 0.033, 0.004, 0.04, 0.009, + 0.029, 7.018, 0.742, 1.169, 0.714, 1.012, 0.485, 0.137, 0.404, 2.976, + 0.818, 1.445, 2.805, 1.012, 2.921, 0.476, 0.297, 0.0001, 0.0001, 0.062, + 0.008, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 26.245, 14.532, 0.0001, 0.534, 0.0001, + 0.001, 0.0001, 0.009, 0.088, 0.067, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.003, 0.019, 0.318, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + lez: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.788, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.917, 0.001, 0.11, 0.0001, + 0.0001, 0.014, 0.0001, 0.0001, 0.118, 0.119, 0.0001, 0.001, 0.531, 0.18, + 0.599, 0.004, 0.16, 0.227, 0.133, 0.076, 0.063, 0.071, 0.067, 0.062, + 0.08, 0.115, 0.048, 0.01, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.003, + 0.002, 0.005, 0.001, 0.002, 0.001, 0.001, 0.001, 0.351, 0.0001, 0.001, + 0.001, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.001, + 0.01, 0.001, 0.037, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.023, 0.003, 0.006, 0.005, 0.017, 0.002, 0.004, 0.004, + 0.014, 0.001, 0.003, 0.017, 0.004, 0.011, 0.011, 0.005, 0.0001, 0.013, + 0.01, 0.009, 0.009, 0.002, 0.001, 0.001, 0.003, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 3.387, 1.088, 1.449, 2.206, 0.197, 0.805, 0.228, + 0.469, 0.264, 0.003, 0.696, 0.03, 1.797, 0.123, 0.075, 0.643, 0.214, + 0.062, 0.057, 0.099, 0.243, 0.013, 0.01, 0.016, 0.072, 0.013, 0.197, + 0.034, 0.095, 0.027, 0.015, 0.041, 0.182, 0.109, 0.046, 0.053, 0.025, + 0.087, 0.024, 0.038, 0.035, 0.001, 0.001, 0.075, 0.001, 0.022, 0.007, + 0.017, 6.908, 0.463, 1.591, 1.254, 1.853, 1.815, 0.195, 0.884, 4.344, + 1.376, 1.744, 1.947, 0.879, 2.868, 0.597, 0.413, 0.0001, 0.0001, 0.264, + 0.003, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.007, 0.0001, 0.004, 0.002, 30.62, 13.045, 0.0001, 0.248, 0.0001, + 0.001, 0.0001, 0.001, 0.004, 0.007, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.003, 0.002, 0.149, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + lg: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.42, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.857, 0.039, 0.098, 0.0001, + 0.0001, 0.008, 0.0001, 0.193, 0.619, 0.652, 0.006, 0.013, 0.576, 0.063, + 0.759, 0.031, 0.142, 0.149, 0.106, 0.065, 0.048, 0.064, 0.043, 0.046, + 0.035, 0.039, 0.112, 0.029, 0.002, 0.038, 0.003, 0.025, 0.0001, 0.202, + 0.147, 0.077, 0.032, 0.406, 0.021, 0.082, 0.019, 0.071, 0.01, 0.184, + 0.083, 0.172, 0.138, 0.35, 0.039, 0.002, 0.027, 0.089, 0.063, 0.041, + 0.016, 0.06, 0.001, 0.036, 0.019, 0.012, 0.0001, 0.012, 0.0001, 0.01, + 0.001, 11.513, 4.158, 0.451, 1.382, 6.569, 0.546, 2.789, 0.349, 6.274, + 0.363, 4.548, 2.809, 3.269, 5.614, 5.854, 0.404, 0.013, 2.198, 2.205, + 2.706, 6.16, 0.367, 2.254, 0.045, 2.427, 1.395, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 1.181, 0.001, 0.015, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.011, 0.0001, + 0.0001, 0.0001, 0.0001, 0.012, 0.0001, 0.0001, 0.0001, 0.006, 0.008, + 0.842, 0.001, 0.0001, 0.092, 0.085, 0.0001, 0.0001, 0.001, 0.001, 0.113, + 0.0001, 0.0001, 0.0001, 0.017, 0.01, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.006, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 1.181, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + li: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.944, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.135, 0.002, 0.418, 0.0001, + 0.0001, 0.017, 0.001, 1.033, 0.22, 0.22, 0.002, 0.001, 0.717, 0.245, + 0.974, 0.02, 0.269, 0.322, 0.176, 0.093, 0.094, 0.096, 0.096, 0.091, + 0.103, 0.161, 0.092, 0.054, 0.018, 0.002, 0.018, 0.001, 0.0001, 0.18, + 0.177, 0.097, 0.347, 0.099, 0.066, 0.119, 0.148, 0.188, 0.05, 0.105, + 0.134, 0.157, 0.158, 0.108, 0.098, 0.003, 0.104, 0.185, 0.093, 0.028, + 0.141, 0.105, 0.003, 0.004, 0.083, 0.008, 0.001, 0.008, 0.0001, 0.0001, + 0.001, 5.507, 1.139, 0.937, 3.64, 13.741, 0.575, 2.233, 1.264, 5.103, + 1.163, 1.751, 2.989, 1.798, 6.008, 4.376, 1.144, 0.011, 4.793, 3.527, + 4.666, 1.997, 1.767, 1.153, 0.045, 0.112, 0.704, 0.0001, 0.001, 0.0001, + 0.001, 0.0001, 0.031, 0.005, 0.002, 0.002, 0.002, 0.002, 0.001, 0.001, + 0.004, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, + 0.001, 0.01, 0.001, 0.0001, 0.002, 0.0001, 0.007, 0.018, 0.0001, 0.001, + 0.002, 0.002, 0.001, 0.002, 0.004, 0.007, 0.003, 0.002, 0.113, 0.003, + 0.001, 0.003, 0.424, 0.024, 0.004, 0.246, 0.001, 0.004, 0.001, 0.014, + 0.003, 0.003, 0.027, 0.238, 0.005, 0.002, 0.354, 0.001, 0.005, 0.003, + 0.003, 0.002, 0.014, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.028, 1.471, + 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.001, + 0.0001, 0.01, 0.004, 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.031, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + lij: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.115, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.653, 0.006, 0.425, 0.0001, + 0.0001, 0.003, 0.001, 1.006, 0.211, 0.212, 0.0001, 0.0001, 1.079, 0.522, + 0.689, 0.013, 0.183, 0.34, 0.145, 0.099, 0.1, 0.107, 0.089, 0.101, + 0.099, 0.127, 0.107, 0.071, 0.08, 0.003, 0.08, 0.006, 0.0001, 0.288, + 0.108, 0.216, 0.12, 0.091, 0.089, 0.116, 0.025, 0.235, 0.016, 0.018, + 0.145, 0.148, 0.083, 0.128, 0.166, 0.021, 0.11, 0.224, 0.097, 0.053, + 0.082, 0.012, 0.025, 0.004, 0.066, 0.003, 0.0001, 0.003, 0.0001, 0.0001, + 0.001, 7.807, 0.66, 2.955, 3.041, 7.727, 0.79, 1.509, 0.643, 7.15, + 0.033, 0.062, 2.465, 2.057, 5.516, 6.662, 1.83, 0.232, 3.742, 3.269, + 4.498, 2.078, 1.097, 0.032, 0.327, 0.052, 0.447, 0.0001, 0.015, 0.0001, + 0.0001, 0.0001, 0.126, 0.011, 0.006, 0.006, 0.007, 0.003, 0.005, 0.015, + 0.003, 0.004, 0.003, 0.001, 0.004, 0.006, 0.001, 0.002, 0.001, 0.002, + 0.007, 0.108, 0.002, 0.001, 0.003, 0.001, 0.007, 0.097, 0.001, 0.002, + 0.005, 0.004, 0.001, 0.001, 0.105, 0.013, 0.443, 0.002, 0.076, 0.002, + 0.52, 0.668, 0.246, 0.118, 0.122, 0.032, 0.129, 0.012, 0.108, 0.033, + 0.028, 0.081, 0.222, 0.058, 0.152, 0.005, 0.088, 0.002, 0.006, 0.059, + 0.022, 0.1, 0.117, 0.007, 0.005, 0.013, 0.0001, 0.0001, 0.059, 3.444, + 0.014, 0.118, 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.001, 0.003, 0.0001, + 0.026, 0.013, 0.031, 0.013, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, + 0.016, 0.012, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.009, + 0.005, 0.121, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + lmo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.694, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.003, 0.007, 0.496, 0.0001, + 0.002, 0.011, 0.001, 1.536, 0.286, 0.286, 0.0001, 0.001, 1.048, 0.242, + 0.905, 0.061, 0.214, 0.291, 0.19, 0.13, 0.124, 0.121, 0.109, 0.107, + 0.118, 0.137, 0.12, 0.041, 0.23, 0.036, 0.23, 0.004, 0.0001, 0.256, + 0.222, 0.29, 0.092, 0.333, 0.125, 0.138, 0.035, 0.151, 0.022, 0.022, + 0.325, 0.213, 0.07, 0.062, 0.237, 0.013, 0.158, 0.284, 0.115, 0.042, + 0.131, 0.03, 0.012, 0.005, 0.017, 0.008, 0.0001, 0.008, 0.0001, 0.008, + 0.0001, 8.462, 0.843, 2.691, 3.762, 7.44, 0.686, 1.303, 1.109, 4.912, + 0.086, 0.225, 4.93, 2.005, 5.17, 2.753, 1.529, 0.12, 4.31, 3.255, 3.626, + 1.912, 0.803, 0.038, 0.028, 0.061, 0.501, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.065, 0.004, 0.005, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, + 0.003, 0.001, 0.002, 0.002, 0.003, 0.001, 0.001, 0.001, 0.001, 0.002, + 0.011, 0.002, 0.0001, 0.002, 0.001, 0.012, 0.042, 0.001, 0.001, 0.018, + 0.002, 0.001, 0.003, 0.883, 0.012, 0.006, 0.001, 0.021, 0.001, 0.002, + 0.005, 0.978, 0.311, 0.003, 0.015, 0.376, 0.025, 0.002, 0.002, 0.004, + 0.005, 0.393, 0.184, 0.028, 0.003, 0.199, 0.002, 0.003, 0.227, 0.023, + 0.007, 0.722, 0.004, 0.002, 0.004, 0.0001, 0.0001, 0.146, 4.287, 0.005, + 0.015, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.001, 0.0001, 0.0001, + 0.019, 0.008, 0.013, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.004, 0.061, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ln: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.397, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.893, 0.03, 0.25, 0.011, + 0.001, 0.018, 0.001, 0.058, 0.196, 0.195, 0.019, 0.0001, 0.627, 0.278, + 0.997, 0.017, 0.237, 0.316, 0.167, 0.077, 0.074, 0.095, 0.09, 0.07, + 0.092, 0.208, 0.084, 0.022, 0.031, 0.028, 0.031, 0.008, 0.0001, 0.272, + 0.381, 0.139, 0.08, 0.273, 0.07, 0.073, 0.036, 0.085, 0.047, 0.397, + 0.244, 0.485, 0.279, 0.076, 0.136, 0.004, 0.069, 0.216, 0.116, 0.035, + 0.048, 0.05, 0.005, 0.052, 0.034, 0.014, 0.018, 0.014, 0.0001, 0.004, + 0.0001, 10.636, 2.915, 0.49, 0.988, 4.562, 0.3, 1.532, 0.289, 5.022, + 0.059, 3.253, 3.932, 3.872, 5.27, 5.607, 1.218, 0.071, 1.319, 2.651, + 2.571, 1.582, 0.27, 0.506, 0.061, 2.255, 1.262, 0.0001, 0.013, 0.0001, + 0.0001, 0.0001, 0.045, 0.425, 0.034, 0.001, 0.004, 0.002, 0.016, 0.0001, + 0.002, 0.009, 0.003, 0.0001, 0.047, 0.002, 0.03, 0.0001, 0.012, 0.0001, + 0.122, 0.011, 0.585, 0.0001, 0.0001, 0.0001, 0.001, 0.025, 0.001, 0.584, + 0.003, 0.002, 0.001, 0.0001, 0.21, 1.199, 0.019, 0.009, 0.001, 0.001, + 0.002, 0.013, 0.036, 1.009, 0.021, 0.019, 0.002, 0.983, 0.006, 0.015, + 0.003, 0.003, 0.005, 0.692, 0.016, 0.003, 0.001, 0.001, 0.001, 0.002, + 0.332, 0.02, 0.002, 0.001, 0.0001, 0.002, 0.0001, 0.0001, 0.228, 4.372, + 0.034, 0.004, 0.008, 0.141, 0.0001, 1.137, 0.001, 0.001, 0.5, 0.0001, + 0.009, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.005, 0.014, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 0.057, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + lo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.442, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.079, 0.001, 0.049, 0.0001, + 0.0001, 0.006, 0.0001, 0.004, 0.071, 0.071, 0.001, 0.001, 0.152, 0.034, + 0.234, 0.012, 0.09, 0.111, 0.08, 0.044, 0.039, 0.045, 0.029, 0.03, + 0.029, 0.051, 0.034, 0.006, 0.003, 0.002, 0.003, 0.001, 0.0001, 0.013, + 0.008, 0.01, 0.008, 0.006, 0.005, 0.004, 0.005, 0.01, 0.003, 0.004, + 0.008, 0.008, 0.007, 0.003, 0.012, 0.0001, 0.005, 0.013, 0.013, 0.003, + 0.004, 0.004, 0.001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.002, + 0.0001, 0.157, 0.027, 0.063, 0.059, 0.202, 0.033, 0.037, 0.067, 0.14, + 0.003, 0.015, 0.078, 0.05, 0.13, 0.139, 0.039, 0.002, 0.117, 0.112, + 0.142, 0.055, 0.018, 0.023, 0.006, 0.028, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 1.694, 1.8, 0.562, 0.336, 0.72, 0.0001, 0.034, 1.352, + 1.675, 1.044, 0.455, 0.525, 0.031, 0.727, 0.002, 0.001, 0.005, 0.004, + 0.004, 0.01, 1.254, 0.484, 0.162, 0.734, 0.009, 2.294, 0.653, 0.586, + 0.209, 0.092, 0.491, 0.038, 0.022, 1.013, 0.148, 0.224, 0.003, 0.796, + 0.001, 0.85, 0.016, 0.008, 0.816, 0.509, 0.001, 1.145, 0.216, 0.004, + 1.227, 1.202, 2.293, 0.24, 0.573, 0.78, 0.113, 0.39, 1.673, 0.52, + 24.114, 5.723, 0.116, 0.133, 0.001, 0.0001, 0.0001, 0.0001, 0.085, + 0.006, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 30.829, 0.002, 0.538, 0.001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + lrc: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.503, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.494, 0.003, 0.04, 0.0001, + 0.0001, 0.008, 0.0001, 0.002, 0.084, 0.084, 0.002, 0.001, 0.009, 0.028, + 0.484, 0.015, 0.026, 0.035, 0.019, 0.017, 0.01, 0.011, 0.009, 0.009, + 0.015, 0.017, 0.04, 0.001, 0.009, 0.002, 0.009, 0.0001, 0.0001, 0.006, + 0.003, 0.003, 0.006, 0.003, 0.002, 0.001, 0.002, 0.005, 0.001, 0.002, + 0.002, 0.003, 0.002, 0.001, 0.003, 0.0001, 0.002, 0.003, 0.003, 0.001, + 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.003, 0.0001, 0.002, 0.0001, + 0.002, 0.0001, 0.043, 0.006, 0.016, 0.023, 0.041, 0.004, 0.008, 0.011, + 0.044, 0.001, 0.008, 0.022, 0.01, 0.037, 0.028, 0.011, 0.001, 0.026, + 0.016, 0.024, 0.015, 0.007, 0.006, 0.002, 0.007, 0.003, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.141, 0.397, 0.205, 0.02, 1.605, 1.614, 3.115, + 2.266, 3.47, 0.018, 0.099, 0.005, 5.078, 0.005, 0.021, 0.008, 0.02, + 0.003, 0.001, 0.004, 0.007, 0.374, 0.0001, 0.001, 0.02, 0.38, 0.001, + 0.042, 0.001, 0.001, 0.001, 0.003, 0.001, 0.003, 0.35, 0.86, 0.5, 0.014, + 1.898, 5.042, 0.917, 1.365, 1.804, 0.048, 0.445, 0.131, 0.29, 3.021, + 0.146, 3.091, 0.704, 1.565, 1.062, 0.145, 0.062, 0.1, 0.06, 0.212, + 0.059, 0.025, 0.002, 0.001, 0.485, 0.001, 0.0001, 0.0001, 0.044, 0.006, + 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.002, 0.001, 0.017, 0.007, 0.0001, 0.0001, 0.0001, 0.001, + 0.001, 0.007, 20.669, 13.379, 3.076, 5.814, 0.0001, 0.0001, 0.0001, + 0.0001, 0.008, 0.002, 0.138, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ltg: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.505, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.915, 0.002, 0.48, 0.0001, + 0.0001, 0.03, 0.001, 0.011, 0.307, 0.306, 0.001, 0.001, 1.036, 0.186, + 1.128, 0.03, 0.246, 0.429, 0.198, 0.13, 0.123, 0.148, 0.107, 0.108, + 0.116, 0.317, 0.161, 0.072, 0.029, 0.005, 0.029, 0.004, 0.0001, 0.199, + 0.123, 0.06, 0.183, 0.07, 0.028, 0.064, 0.021, 0.12, 0.092, 0.204, + 0.323, 0.133, 0.101, 0.065, 0.288, 0.001, 0.16, 0.239, 0.103, 0.036, + 0.21, 0.007, 0.022, 0.001, 0.052, 0.002, 0.0001, 0.002, 0.0001, 0.002, + 0.0001, 7.469, 0.962, 0.824, 2.269, 4.253, 0.17, 1.648, 0.088, 6.306, + 1.422, 2.423, 2.524, 1.996, 2.559, 4.514, 1.853, 0.001, 3.554, 6.061, + 4.103, 4.999, 1.941, 0.013, 0.006, 1.629, 1.118, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.287, 1.24, 0.018, 0.009, 0.002, 0.008, 0.371, 0.004, + 0.003, 0.001, 0.001, 0.004, 0.014, 0.08, 0.001, 0.011, 0.003, 0.002, + 0.002, 0.271, 0.142, 0.001, 0.001, 0.003, 0.003, 0.007, 0.001, 0.001, + 0.003, 0.032, 0.034, 0.002, 0.043, 0.709, 0.001, 0.005, 0.004, 0.002, + 0.0001, 0.0001, 0.001, 0.001, 0.015, 2.24, 0.001, 0.001, 0.0001, 0.001, + 0.04, 0.01, 0.024, 0.01, 0.013, 0.028, 0.003, 0.011, 0.033, 0.006, + 0.014, 0.026, 0.687, 0.026, 0.226, 0.009, 0.0001, 0.0001, 0.023, 0.015, + 3.578, 2.215, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.002, + 0.0001, 0.003, 0.001, 0.252, 0.098, 0.0001, 0.0001, 0.0001, 0.004, + 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.002, 0.265, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mai: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.888, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.023, 0.001, 0.03, 0.0001, + 0.0001, 0.003, 0.001, 0.013, 0.071, 0.074, 0.0001, 0.001, 0.267, 0.061, + 0.074, 0.006, 0.01, 0.016, 0.009, 0.005, 0.004, 0.005, 0.004, 0.004, + 0.005, 0.012, 0.021, 0.006, 0.004, 0.001, 0.004, 0.0001, 0.0001, 0.001, + 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.001, + 0.001, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.002, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.018, 0.005, 0.005, 0.005, 0.017, 0.003, 0.004, 0.008, + 0.015, 0.001, 0.002, 0.009, 0.005, 0.013, 0.013, 0.004, 0.001, 0.014, + 0.017, 0.012, 0.006, 0.002, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.004, + 0.0001, 0.0001, 0.0001, 0.792, 0.705, 0.351, 0.05, 0.0001, 0.548, 0.202, + 1.331, 0.277, 0.165, 0.004, 0.356, 0.051, 2.185, 0.0001, 0.286, 0.005, + 0.001, 0.0001, 0.066, 0.006, 1.874, 0.183, 0.514, 0.043, 0.102, 0.293, + 0.463, 0.567, 0.024, 0.087, 0.255, 0.05, 0.178, 0.022, 0.166, 25.43, + 6.866, 0.581, 0.373, 1.476, 0.06, 0.857, 0.137, 0.417, 0.41, 1.258, + 0.71, 1.883, 0.001, 1.344, 0.001, 0.001, 0.686, 0.286, 0.227, 1.223, + 0.469, 0.0001, 0.0001, 0.026, 0.025, 2.747, 1.736, 0.0001, 0.0001, + 0.009, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 30.668, 0.0001, 0.037, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mdf: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.974, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.901, 0.002, 0.147, 0.0001, + 0.0001, 0.003, 0.0001, 0.003, 0.239, 0.241, 0.0001, 0.001, 0.661, 0.233, + 0.828, 0.004, 0.16, 0.227, 0.113, 0.065, 0.054, 0.071, 0.072, 0.058, + 0.067, 0.13, 0.047, 0.019, 0.002, 0.0001, 0.002, 0.001, 0.0001, 0.006, + 0.002, 0.008, 0.002, 0.002, 0.003, 0.002, 0.002, 0.025, 0.001, 0.002, + 0.002, 0.005, 0.002, 0.002, 0.006, 0.001, 0.003, 0.005, 0.003, 0.001, + 0.008, 0.001, 0.014, 0.0001, 0.0001, 0.004, 0.0001, 0.005, 0.0001, + 0.002, 0.0001, 0.07, 0.006, 0.018, 0.016, 0.05, 0.004, 0.011, 0.014, + 0.042, 0.003, 0.009, 0.03, 0.013, 0.041, 0.036, 0.013, 0.001, 0.037, + 0.035, 0.028, 0.024, 0.005, 0.003, 0.003, 0.006, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 2.013, 2.98, 2.587, 0.748, 0.583, 0.414, 0.428, + 0.203, 0.631, 0.045, 0.095, 0.17, 2.818, 0.257, 0.113, 1.375, 0.157, + 0.181, 0.113, 0.066, 0.125, 0.013, 0.006, 0.022, 0.063, 0.005, 0.16, + 0.068, 0.186, 0.053, 0.097, 0.114, 0.073, 0.188, 0.099, 0.03, 0.023, + 0.016, 0.014, 0.014, 0.049, 0.003, 0.001, 0.054, 0.002, 0.05, 0.007, + 0.022, 4.7, 0.292, 1.108, 0.449, 1.264, 2.755, 0.106, 0.711, 2.236, + 0.41, 2.142, 1.743, 1.474, 3.418, 3.1, 0.637, 0.0001, 0.0001, 0.118, + 0.006, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.003, 0.002, + 0.0001, 0.004, 0.002, 28.205, 15.445, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.006, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.006, 0.0001, 0.122, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mg: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.132, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.344, 0.0001, 0.051, 0.0001, + 0.0001, 0.003, 0.0001, 1.722, 0.134, 0.134, 0.0001, 0.062, 0.6, 1.054, + 1.426, 0.011, 0.88, 0.969, 0.776, 0.547, 0.574, 0.473, 0.464, 0.436, + 0.531, 0.535, 0.029, 0.033, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.281, + 0.132, 0.16, 0.072, 0.212, 0.148, 0.178, 0.056, 0.346, 0.102, 0.053, + 0.101, 0.354, 0.788, 0.05, 0.139, 0.008, 0.098, 0.209, 0.172, 0.049, + 0.057, 0.038, 0.005, 0.021, 0.009, 0.002, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 15.071, 0.568, 0.216, 2.816, 2.902, 0.81, 0.249, 1.395, 7.562, + 0.225, 1.469, 1.52, 3.108, 9.36, 4.666, 0.931, 0.023, 4.686, 1.843, + 3.288, 0.414, 0.748, 0.044, 0.043, 4.297, 0.559, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.076, 0.002, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.002, + 0.001, 0.008, 0.0001, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.001, + 0.0001, 0.001, 0.052, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.017, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.15, 0.01, 0.007, 0.008, + 0.001, 0.0001, 0.001, 0.006, 0.026, 0.088, 0.003, 0.004, 0.001, 0.005, + 0.002, 0.002, 0.137, 0.002, 0.001, 0.004, 0.086, 0.001, 0.002, 0.001, + 0.003, 0.001, 0.002, 0.01, 0.003, 0.001, 0.001, 0.008, 0.0001, 0.0001, + 0.143, 0.408, 0.006, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.069, 0.004, 0.0001, 0.001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mh: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.376, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.504, 0.0001, 0.156, 0.0001, + 0.0001, 0.0001, 0.039, 0.039, 0.039, 0.039, 0.0001, 0.0001, 1.325, + 0.078, 1.247, 0.039, 0.156, 0.039, 0.078, 0.0001, 0.0001, 0.039, 0.0001, + 0.0001, 0.039, 0.0001, 0.039, 0.078, 0.078, 0.039, 0.078, 0.0001, + 0.0001, 0.701, 0.273, 0.156, 0.078, 0.312, 0.039, 0.156, 0.078, 0.351, + 0.779, 0.779, 0.234, 0.779, 0.0001, 0.039, 0.156, 0.0001, 0.312, 0.195, + 0.156, 0.195, 0.039, 0.078, 0.0001, 0.195, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 8.103, 1.558, 0.312, 0.818, 6.584, + 0.078, 0.351, 1.013, 7.402, 4.675, 3.584, 3.039, 2.766, 5.804, 6.389, + 0.779, 0.078, 4.753, 1.48, 2.337, 1.441, 0.117, 1.597, 0.0001, 1.558, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.351, 0.0001, + 0.0001, 0.156, 0.0001, 0.039, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.039, 0.545, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.467, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.078, + 0.0001, 0.117, 0.0001, 0.0001, 0.0001, 1.013, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.078, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.208, 0.429, 0.584, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.662, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mhr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.247, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.433, 0.01, 0.105, 0.0001, + 0.0001, 0.003, 0.0001, 0.003, 0.242, 0.243, 0.0001, 0.004, 0.563, 0.341, + 0.763, 0.006, 0.23, 0.307, 0.193, 0.103, 0.088, 0.092, 0.076, 0.077, + 0.081, 0.164, 0.099, 0.012, 0.003, 0.005, 0.003, 0.006, 0.0001, 0.002, + 0.002, 0.003, 0.001, 0.001, 0.002, 0.001, 0.001, 0.045, 0.0001, 0.001, + 0.002, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.002, 0.002, 0.001, + 0.016, 0.001, 0.019, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, + 0.001, 0.0001, 0.02, 0.004, 0.007, 0.008, 0.02, 0.002, 0.003, 0.004, + 0.014, 0.0001, 0.002, 0.01, 0.005, 0.01, 0.012, 0.004, 0.0001, 0.013, + 0.009, 0.01, 0.005, 0.002, 0.002, 0.0001, 0.002, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 2.161, 0.998, 2.463, 1.262, 0.079, 0.06, 0.073, + 0.732, 2.145, 0.012, 0.024, 3.429, 0.167, 0.157, 0.039, 0.3, 0.114, + 0.051, 0.084, 0.076, 0.173, 0.021, 0.005, 0.012, 0.07, 0.035, 0.245, + 0.039, 0.204, 0.055, 0.073, 0.108, 0.142, 0.124, 0.167, 0.046, 0.023, + 0.257, 0.01, 0.146, 0.069, 0.001, 0.001, 0.099, 0.002, 0.093, 0.02, + 0.031, 3.766, 0.43, 0.916, 0.689, 1.067, 3.621, 0.573, 0.276, 1.798, + 1.177, 2.133, 2.766, 1.884, 2.711, 2.445, 0.765, 0.0001, 0.0001, 0.222, + 0.109, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.005, 0.0001, 0.008, 0.004, 28.363, 13.911, 0.249, 0.424, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.002, 0.203, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mi: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.242, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.048, 0.002, 0.114, 0.0001, + 0.0001, 0.007, 0.0001, 0.316, 0.24, 0.24, 0.0001, 0.0001, 0.815, 0.729, + 1.027, 0.003, 0.15, 0.245, 0.11, 0.069, 0.067, 0.071, 0.069, 0.066, + 0.083, 0.097, 0.029, 0.194, 0.002, 0.0001, 0.002, 0.002, 0.0001, 0.243, + 0.042, 0.09, 0.013, 0.207, 0.019, 0.023, 0.227, 0.154, 0.011, 0.858, + 0.022, 0.414, 0.264, 0.035, 0.344, 0.001, 0.143, 0.039, 1.088, 0.016, + 0.015, 0.518, 0.001, 0.002, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 10.57, 0.047, 0.232, 0.102, 7.727, 0.029, 1.763, 3.618, 6.701, + 0.008, 3.514, 0.582, 0.854, 4.652, 6.133, 0.788, 0.003, 3.052, 0.255, + 6.464, 3.231, 0.037, 1.326, 0.008, 0.217, 0.009, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.025, 2.749, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, + 0.003, 0.001, 0.001, 0.001, 0.072, 0.357, 0.0001, 0.001, 0.001, 0.001, + 0.001, 0.284, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, + 0.002, 0.001, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.004, 0.001, + 0.003, 0.004, 0.003, 0.003, 0.013, 0.525, 0.001, 0.002, 0.001, 0.002, + 0.003, 0.004, 0.018, 0.005, 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, + 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.019, 0.015, + 3.257, 0.759, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, + 0.0001, 0.001, 0.0001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.006, 0.008, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.008, 0.002, 0.004, 0.001, 0.0001, 0.002, 0.002, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + min: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.172, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.612, 0.0001, 0.04, 0.005, + 0.0001, 0.002, 0.004, 0.018, 0.155, 0.155, 0.0001, 0.0001, 1.063, 0.022, + 1.041, 0.001, 0.404, 0.298, 0.265, 0.112, 0.103, 0.128, 0.132, 0.113, + 0.114, 0.233, 0.009, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.635, 0.069, 0.223, 0.216, 0.107, 0.023, 0.035, 0.059, 0.25, 0.026, + 0.062, 0.356, 0.142, 0.089, 0.046, 0.143, 0.014, 0.06, 0.402, 0.123, + 0.018, 0.017, 0.016, 0.015, 0.037, 0.009, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 14.754, 1.953, 0.961, 4.093, 4.246, 0.532, + 1.865, 1.575, 6.705, 0.46, 3.68, 3.421, 3.054, 5.905, 5.613, 2.448, + 0.009, 4.152, 3.536, 3.358, 3.758, 0.175, 0.156, 0.045, 0.909, 0.044, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.018, 0.016, 0.004, 0.004, + 0.011, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.004, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.005, 0.0001, 0.0001, 0.014, + 0.007, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.008, 0.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.029, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mk: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.442, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.507, 0.001, 0.094, 0.0001, + 0.0001, 0.006, 0.001, 0.012, 0.086, 0.086, 0.001, 0.004, 0.588, 0.074, + 0.535, 0.01, 0.197, 0.23, 0.143, 0.089, 0.082, 0.088, 0.076, 0.074, + 0.08, 0.116, 0.032, 0.012, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.015, + 0.008, 0.047, 0.006, 0.006, 0.005, 0.034, 0.005, 0.026, 0.002, 0.003, + 0.006, 0.012, 0.023, 0.006, 0.014, 0.001, 0.007, 0.019, 0.01, 0.006, + 0.006, 0.004, 0.004, 0.001, 0.001, 0.008, 0.0001, 0.008, 0.0001, 0.002, + 0.0001, 0.08, 0.013, 0.03, 0.022, 0.08, 0.011, 0.022, 0.023, 0.061, + 0.003, 0.011, 0.035, 0.039, 0.054, 0.06, 0.012, 0.001, 0.056, 0.049, + 0.047, 0.027, 0.008, 0.006, 0.003, 0.012, 0.004, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 2.279, 1.922, 3.072, 0.896, 0.157, 0.085, 0.296, 0.344, + 0.32, 0.001, 0.003, 0.0001, 0.001, 0.0001, 0.0001, 0.012, 0.067, 0.066, + 0.1, 0.11, 0.062, 0.046, 0.008, 0.029, 0.825, 0.009, 0.229, 0.032, + 0.208, 0.077, 0.103, 0.118, 0.054, 0.125, 0.063, 0.016, 0.028, 0.03, + 0.013, 0.01, 0.018, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 5.692, 0.585, 1.752, 0.746, 1.619, 3.647, 0.195, 0.665, 3.964, + 0.001, 1.64, 1.494, 0.888, 3.068, 4.767, 1.117, 0.0001, 0.0001, 0.015, + 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.007, 0.003, 33.101, 10.345, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.096, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ml: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.283, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.554, 0.001, 0.034, 0.0001, + 0.0001, 0.002, 0.0001, 0.013, 0.046, 0.046, 0.0001, 0.001, 0.155, 0.051, + 0.434, 0.004, 0.069, 0.096, 0.051, 0.026, 0.025, 0.029, 0.025, 0.024, + 0.03, 0.054, 0.011, 0.004, 0.002, 0.001, 0.002, 0.0001, 0.0001, 0.005, + 0.003, 0.005, 0.002, 0.002, 0.002, 0.002, 0.002, 0.004, 0.001, 0.001, + 0.002, 0.003, 0.002, 0.002, 0.004, 0.0001, 0.002, 0.005, 0.004, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.0001, + 0.001, 0.0001, 0.044, 0.007, 0.016, 0.014, 0.045, 0.007, 0.009, 0.015, + 0.036, 0.001, 0.004, 0.022, 0.013, 0.031, 0.031, 0.01, 0.001, 0.031, + 0.025, 0.029, 0.015, 0.004, 0.005, 0.002, 0.008, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.284, 1.637, 0.889, 0.045, 0.0001, 0.237, + 0.843, 0.478, 0.108, 0.077, 0.086, 0.336, 0.062, 4.599, 0.152, 0.029, + 0.008, 0.0001, 0.075, 0.022, 0.003, 1.759, 0.042, 0.219, 0.023, 0.382, + 0.512, 0.004, 0.161, 0.001, 0.086, 0.887, 0.025, 0.094, 0.002, 0.484, + 1.618, 0.083, 0.303, 0.146, 1.873, 0.0001, 0.931, 0.058, 0.143, 0.126, + 0.78, 1.209, 1.122, 0.589, 0.667, 0.458, 22.229, 10.029, 0.199, 0.193, + 0.652, 0.135, 0.025, 0.171, 0.328, 0.323, 1.631, 2.28, 0.0001, 0.0001, + 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 31.391, 0.001, 0.071, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.502, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.684, 0.002, 0.094, 0.001, + 0.001, 0.006, 0.001, 0.003, 0.078, 0.078, 0.001, 0.002, 0.423, 0.192, + 0.522, 0.019, 0.207, 0.249, 0.16, 0.075, 0.065, 0.07, 0.06, 0.055, + 0.066, 0.128, 0.025, 0.008, 0.003, 0.005, 0.004, 0.002, 0.0001, 0.018, + 0.012, 0.019, 0.013, 0.012, 0.008, 0.007, 0.009, 0.026, 0.003, 0.004, + 0.011, 0.017, 0.01, 0.009, 0.02, 0.002, 0.012, 0.024, 0.016, 0.006, + 0.007, 0.006, 0.007, 0.003, 0.001, 0.006, 0.001, 0.006, 0.0001, 0.005, + 0.0001, 0.097, 0.016, 0.039, 0.037, 0.119, 0.017, 0.023, 0.03, 0.088, + 0.002, 0.012, 0.052, 0.031, 0.08, 0.086, 0.026, 0.002, 0.079, 0.064, + 0.078, 0.038, 0.025, 0.012, 0.008, 0.018, 0.003, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 2.438, 1.425, 1.576, 1.589, 0.047, 1.639, 0.295, 0.416, + 0.311, 0.001, 0.008, 0.672, 0.369, 2.886, 0.106, 0.163, 0.114, 0.151, + 0.023, 0.067, 0.081, 0.017, 0.027, 0.033, 0.044, 0.004, 0.046, 0.028, + 0.128, 0.083, 0.044, 0.031, 0.048, 0.074, 0.102, 0.063, 0.021, 0.125, + 0.02, 0.022, 0.053, 1.026, 0.001, 0.019, 0.001, 0.067, 0.028, 1.192, + 4.733, 1.04, 0.537, 2.615, 2.04, 0.399, 0.621, 0.396, 2.01, 1.723, + 0.207, 2.589, 0.943, 3.889, 2.383, 0.107, 0.0001, 0.0001, 0.065, 0.012, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.002, 0.001, 27.532, 13.908, 1.199, 1.049, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.072, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.001, 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.77, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.47, 0.002, 0.214, 0.0001, + 0.0001, 0.017, 0.001, 0.035, 0.128, 0.128, 0.002, 0.001, 0.656, 0.155, + 0.49, 0.006, 0.172, 0.19, 0.096, 0.052, 0.062, 0.054, 0.034, 0.043, + 0.06, 0.129, 0.06, 0.015, 0.017, 0.012, 0.017, 0.0001, 0.0001, 0.018, + 0.009, 0.023, 0.009, 0.011, 0.002, 0.006, 0.004, 0.035, 0.002, 0.005, + 0.007, 0.014, 0.008, 0.008, 0.009, 0.001, 0.009, 0.019, 0.008, 0.005, + 0.004, 0.007, 0.007, 0.001, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.381, 0.035, 0.167, 0.122, 0.44, 0.045, 0.036, 0.034, 0.432, + 0.005, 0.016, 0.206, 0.12, 0.248, 0.177, 0.096, 0.003, 0.253, 0.183, + 0.236, 0.214, 0.038, 0.01, 0.011, 0.011, 0.03, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 3.01, 1.642, 2.712, 2.46, 0.4, 0.066, 0.487, 0.515, + 0.507, 0.001, 0.001, 0.622, 0.372, 0.933, 0.029, 0.581, 0.134, 0.087, + 0.042, 0.032, 0.081, 0.073, 0.022, 0.008, 0.061, 0.004, 0.139, 0.063, + 0.145, 0.05, 0.043, 0.149, 0.144, 0.143, 0.069, 0.113, 0.038, 0.031, + 0.007, 0.03, 0.013, 0.002, 0.001, 0.064, 0.002, 0.001, 0.029, 0.007, + 3.78, 0.37, 0.558, 0.274, 1.316, 4.346, 0.072, 0.319, 3.558, 0.657, + 1.356, 2.204, 1.073, 2.802, 2.13, 1.099, 0.0001, 0.0001, 0.025, 0.051, + 0.091, 0.068, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.005, + 0.0001, 0.008, 0.004, 27.537, 14.047, 0.001, 0.161, 0.0001, 0.0001, + 0.0001, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.005, 0.022, 0.0001, 0.0001, 0.001, 0.002, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mr: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.525, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.348, 0.002, 0.043, 0.0001, + 0.0001, 0.004, 0.0001, 0.024, 0.061, 0.064, 0.0001, 0.001, 0.221, 0.063, + 0.539, 0.009, 0.009, 0.009, 0.006, 0.003, 0.003, 0.003, 0.003, 0.003, + 0.003, 0.005, 0.03, 0.01, 0.003, 0.004, 0.003, 0.003, 0.0001, 0.008, + 0.004, 0.006, 0.004, 0.003, 0.003, 0.003, 0.003, 0.007, 0.002, 0.002, + 0.003, 0.006, 0.003, 0.002, 0.005, 0.0001, 0.004, 0.008, 0.009, 0.001, + 0.002, 0.002, 0.0001, 0.001, 0.0001, 0.007, 0.0001, 0.007, 0.0001, + 0.001, 0.0001, 0.138, 0.021, 0.046, 0.053, 0.162, 0.029, 0.028, 0.063, + 0.114, 0.003, 0.011, 0.062, 0.038, 0.106, 0.103, 0.03, 0.002, 0.096, + 0.09, 0.116, 0.04, 0.015, 0.019, 0.003, 0.023, 0.002, 0.0001, 0.005, + 0.0001, 0.0001, 0.0001, 1.224, 0.397, 1.061, 0.056, 0.001, 0.297, 0.351, + 1.664, 0.084, 0.127, 0.02, 0.461, 0.026, 2.286, 0.0001, 0.096, 0.005, + 0.018, 0.001, 0.019, 0.005, 1.098, 0.145, 0.403, 0.083, 0.015, 0.659, + 0.012, 0.404, 0.067, 0.014, 0.287, 0.125, 0.236, 0.039, 0.415, 24.995, + 7.065, 0.585, 0.404, 1.081, 0.036, 0.727, 0.118, 0.317, 0.211, 0.844, + 1.342, 1.809, 0.018, 1.056, 0.198, 0.001, 0.975, 0.327, 0.194, 1.035, + 0.79, 0.001, 0.001, 0.003, 0.001, 3.71, 0.926, 0.0001, 0.0001, 0.015, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 30.418, 0.001, 0.048, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mrj: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.556, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.792, 0.004, 0.111, 0.0001, + 0.0001, 0.008, 0.001, 0.036, 0.371, 0.372, 0.0001, 0.001, 0.508, 0.256, + 0.9, 0.015, 0.334, 0.401, 0.27, 0.169, 0.152, 0.17, 0.137, 0.141, 0.168, + 0.185, 0.1, 0.046, 0.009, 0.005, 0.008, 0.012, 0.0001, 0.017, 0.012, + 0.012, 0.011, 0.006, 0.006, 0.008, 0.006, 0.083, 0.004, 0.011, 0.006, + 0.014, 0.007, 0.024, 0.016, 0.001, 0.008, 0.014, 0.009, 0.003, 0.03, + 0.002, 0.042, 0.002, 0.001, 0.008, 0.0001, 0.009, 0.0001, 0.003, 0.0001, + 0.281, 0.025, 0.082, 0.065, 0.202, 0.013, 0.027, 0.052, 0.157, 0.003, + 0.032, 0.08, 0.041, 0.09, 0.092, 0.03, 0.005, 0.117, 0.072, 0.076, + 0.073, 0.015, 0.012, 0.004, 0.024, 0.01, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 2.356, 0.846, 2.179, 0.887, 0.116, 0.285, 0.312, 0.236, 2.316, + 0.007, 0.004, 2.565, 0.266, 0.252, 0.05, 0.215, 0.187, 0.062, 0.078, + 1.679, 0.285, 0.024, 0.005, 0.016, 0.067, 0.046, 0.237, 0.053, 0.116, + 0.054, 0.059, 0.117, 0.058, 0.115, 0.145, 0.033, 0.102, 0.049, 0.064, + 0.062, 0.066, 0.006, 0.001, 0.056, 0.003, 0.041, 0.007, 0.023, 2.651, + 0.259, 1.194, 0.797, 1.113, 1.956, 0.572, 0.253, 2.277, 2.969, 1.78, + 2.755, 1.532, 2.591, 1.704, 0.818, 0.0001, 0.0001, 0.138, 0.095, 0.012, + 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.011, 0.0001, + 0.008, 0.006, 24.363, 12.5, 0.002, 4.142, 0.0001, 0.0001, 0.0001, 0.001, + 0.015, 0.01, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, + 0.004, 0.341, 0.005, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + ms: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.423, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.116, 0.004, 0.276, 0.001, + 0.003, 0.028, 0.005, 0.04, 0.153, 0.154, 0.011, 0.002, 0.825, 0.313, + 0.841, 0.02, 0.335, 0.324, 0.225, 0.11, 0.099, 0.112, 0.094, 0.087, + 0.096, 0.171, 0.041, 0.019, 0.01, 0.005, 0.01, 0.002, 0.001, 0.327, + 0.313, 0.169, 0.197, 0.08, 0.09, 0.097, 0.122, 0.22, 0.145, 0.326, + 0.158, 0.369, 0.143, 0.065, 0.427, 0.013, 0.147, 0.487, 0.268, 0.071, + 0.05, 0.063, 0.007, 0.038, 0.022, 0.015, 0.0001, 0.015, 0.0001, 0.002, + 0.0001, 15.253, 2.008, 0.502, 3.234, 6.807, 0.209, 2.704, 2.141, 5.701, + 0.605, 3.195, 3.049, 3.025, 7.562, 1.688, 2.054, 0.019, 4.172, 2.861, + 3.513, 3.855, 0.159, 0.407, 0.024, 1.19, 0.123, 0.0001, 0.007, 0.0001, + 0.0001, 0.0001, 0.025, 0.005, 0.003, 0.004, 0.003, 0.002, 0.002, 0.004, + 0.003, 0.002, 0.002, 0.001, 0.002, 0.007, 0.004, 0.002, 0.001, 0.002, + 0.001, 0.009, 0.003, 0.001, 0.001, 0.001, 0.002, 0.01, 0.001, 0.003, + 0.004, 0.004, 0.001, 0.007, 0.031, 0.013, 0.003, 0.003, 0.003, 0.002, + 0.001, 0.006, 0.007, 0.017, 0.002, 0.003, 0.001, 0.007, 0.002, 0.002, + 0.004, 0.011, 0.003, 0.006, 0.005, 0.001, 0.006, 0.001, 0.004, 0.002, + 0.003, 0.002, 0.008, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.034, 0.074, + 0.022, 0.02, 0.0001, 0.0001, 0.001, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.012, 0.015, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.002, 0.024, 0.004, 0.001, 0.002, 0.002, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mt: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.717, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.569, 0.003, 0.319, 0.001, + 0.001, 0.009, 0.001, 0.699, 0.116, 0.117, 0.001, 0.002, 0.868, 2.789, + 0.736, 0.014, 0.299, 0.341, 0.218, 0.093, 0.081, 0.087, 0.085, 0.082, + 0.1, 0.201, 0.053, 0.022, 0.013, 0.012, 0.013, 0.002, 0.0001, 0.223, + 0.171, 0.118, 0.162, 0.107, 0.236, 0.127, 0.076, 0.3, 0.048, 0.158, + 0.199, 0.315, 0.08, 0.056, 0.187, 0.018, 0.103, 0.221, 0.127, 0.065, + 0.054, 0.053, 0.02, 0.007, 0.009, 0.022, 0.0001, 0.023, 0.0001, 0.008, + 0.002, 9.087, 1.533, 0.244, 1.812, 5.201, 1.498, 1.212, 0.809, 8.439, + 2.13, 1.92, 5.784, 2.557, 4.221, 2.69, 1.16, 0.488, 3.837, 2.631, 5.521, + 3.106, 0.451, 1.062, 0.484, 0.085, 0.753, 0.0001, 0.004, 0.0001, 0.0001, + 0.0001, 0.211, 0.004, 0.004, 0.002, 0.003, 0.001, 0.001, 0.004, 0.002, + 0.001, 0.016, 0.407, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, + 0.042, 0.003, 0.001, 0.001, 0.001, 0.005, 0.141, 0.001, 0.001, 0.01, + 0.01, 0.001, 0.002, 0.13, 0.527, 0.002, 0.004, 0.002, 0.001, 0.025, + 1.521, 0.007, 0.014, 0.001, 0.004, 0.005, 0.008, 0.001, 0.001, 0.004, + 0.005, 0.009, 0.004, 0.002, 0.002, 0.003, 0.001, 0.003, 0.01, 0.003, + 0.015, 0.566, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.015, 0.129, 2.554, + 0.578, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.011, 0.005, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.004, + 0.006, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.004, 0.212, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + mus: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 30.612, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 19.388, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 1.02, 0.0001, 1.02, 0.0001, 1.02, 1.02, 0.0001, 2.041, + 1.02, 0.0001, 1.02, 1.02, 4.082, 1.02, 1.02, 2.041, 0.0001, 1.02, 1.02, + 1.02, 1.02, 1.02, 1.02, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 3.061, 0.0001, 0.0001, 0.0001, 5.102, 0.0001, + 1.02, 0.0001, 1.02, 0.0001, 5.102, 0.0001, 1.02, 1.02, 2.041, 0.0001, + 0.0001, 0.0001, 2.041, 0.0001, 0.0001, 2.041, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 1.02, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 1.02, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + my: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.476, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 2.676, 0.0001, 0.018, 0.0001, + 0.0001, 0.001, 0.0001, 0.009, 0.072, 0.072, 0.0001, 0.001, 0.013, 0.027, + 0.014, 0.004, 0.007, 0.006, 0.005, 0.003, 0.002, 0.002, 0.002, 0.002, + 0.002, 0.002, 0.002, 0.001, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.009, + 0.007, 0.011, 0.006, 0.004, 0.004, 0.005, 0.004, 0.006, 0.002, 0.003, + 0.004, 0.008, 0.005, 0.004, 0.007, 0.0001, 0.005, 0.011, 0.008, 0.003, + 0.002, 0.003, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.087, 0.015, 0.033, 0.032, 0.11, 0.015, 0.02, 0.035, + 0.072, 0.001, 0.01, 0.046, 0.027, 0.071, 0.073, 0.021, 0.001, 0.069, + 0.054, 0.072, 0.03, 0.01, 0.011, 0.003, 0.016, 0.002, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 32.171, 1.737, 0.141, 0.03, 1.382, 0.783, 0.273, + 0.069, 0.03, 0.083, 0.874, 0.307, 0.061, 0.061, 0.009, 0.119, 1.037, + 0.261, 0.115, 0.031, 0.966, 0.888, 0.304, 0.058, 0.131, 1.12, 0.266, + 0.843, 0.619, 0.172, 1.057, 0.095, 0.006, 0.703, 0.001, 0.001, 0.009, + 0.019, 0.041, 0.006, 0.0001, 0.005, 0.0001, 0.239, 1.811, 1.255, 0.357, + 1.497, 0.246, 1.317, 0.249, 0.0001, 0.0001, 0.0001, 0.294, 0.751, 1.889, + 0.152, 3.975, 0.6, 0.881, 0.616, 0.651, 0.004, 0.0001, 0.0001, 0.003, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 31.801, 0.03, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + myv: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.363, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.917, 0.015, 0.248, 0.0001, + 0.0001, 0.022, 0.0001, 0.001, 0.283, 0.286, 0.002, 0.004, 0.691, 0.215, + 0.812, 0.009, 0.174, 0.262, 0.16, 0.093, 0.073, 0.077, 0.073, 0.069, + 0.078, 0.133, 0.142, 0.014, 0.011, 0.005, 0.01, 0.008, 0.0001, 0.003, + 0.002, 0.005, 0.001, 0.001, 0.002, 0.001, 0.001, 0.012, 0.001, 0.001, + 0.002, 0.003, 0.001, 0.001, 0.004, 0.0001, 0.002, 0.003, 0.002, 0.001, + 0.004, 0.001, 0.007, 0.0001, 0.001, 0.004, 0.0001, 0.004, 0.0001, + 0.0001, 0.003, 0.048, 0.012, 0.02, 0.007, 0.038, 0.002, 0.005, 0.006, + 0.024, 0.002, 0.008, 0.023, 0.008, 0.017, 0.019, 0.008, 0.0001, 0.032, + 0.018, 0.013, 0.014, 0.004, 0.001, 0.001, 0.004, 0.002, 0.0001, 0.001, + 0.0001, 0.001, 0.0001, 2.092, 2.863, 2.802, 0.895, 0.06, 0.084, 0.303, + 0.361, 0.574, 0.012, 0.006, 0.456, 2.653, 0.734, 0.106, 1.014, 0.129, + 0.284, 0.186, 0.058, 0.27, 0.019, 0.007, 0.024, 0.083, 0.006, 0.182, + 0.079, 0.175, 0.059, 0.072, 0.148, 0.231, 0.176, 0.101, 0.047, 0.012, + 0.013, 0.018, 0.046, 0.024, 0.001, 0.0001, 0.091, 0.002, 0.065, 0.014, + 0.024, 3.393, 0.354, 1.588, 0.391, 1.0, 3.63, 0.2, 0.667, 2.033, 0.447, + 2.062, 1.616, 1.324, 3.27, 3.572, 0.635, 0.0001, 0.0001, 0.332, 0.006, + 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.017, + 0.0001, 0.001, 0.001, 27.959, 14.855, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.281, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.032, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + mzn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.201, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.629, 0.002, 0.049, 0.0001, + 0.0001, 0.001, 0.004, 0.002, 0.134, 0.134, 0.0001, 0.0001, 0.026, 0.054, + 0.593, 0.02, 0.019, 0.017, 0.017, 0.008, 0.004, 0.006, 0.012, 0.005, + 0.01, 0.015, 0.042, 0.0001, 0.001, 0.014, 0.001, 0.004, 0.0001, 0.004, + 0.003, 0.005, 0.003, 0.006, 0.016, 0.002, 0.002, 0.003, 0.001, 0.001, + 0.009, 0.006, 0.002, 0.001, 0.004, 0.0001, 0.003, 0.005, 0.007, 0.001, + 0.001, 0.01, 0.0001, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.009, + 0.0001, 0.072, 0.016, 0.031, 0.045, 0.106, 0.011, 0.011, 0.023, 0.094, + 0.004, 0.019, 0.044, 0.012, 0.044, 0.054, 0.042, 0.001, 0.056, 0.056, + 0.055, 0.021, 0.007, 0.011, 0.005, 0.015, 0.003, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.44, 0.427, 0.449, 0.013, 1.516, 2.042, 3.291, 3.912, + 3.162, 0.001, 0.032, 0.014, 4.412, 0.002, 0.195, 0.007, 0.446, 0.17, + 0.001, 0.002, 0.012, 0.004, 0.0001, 0.001, 0.045, 0.005, 0.0001, 0.006, + 0.001, 0.0001, 0.0001, 0.003, 0.003, 0.013, 0.18, 0.011, 0.008, 0.001, + 0.211, 5.124, 1.425, 1.013, 2.263, 0.078, 0.559, 0.214, 0.344, 2.205, + 0.318, 3.605, 0.725, 1.866, 1.033, 0.295, 0.164, 0.271, 0.156, 0.676, + 0.058, 0.031, 0.001, 0.001, 0.258, 0.0001, 0.0001, 0.0001, 0.056, 0.008, + 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.009, 0.003, 0.0001, 0.003, 0.0001, 0.001, 0.001, + 0.002, 19.953, 15.923, 1.548, 5.327, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.001, 0.427, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + na: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 5.998, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.709, 0.015, 0.646, 0.0001, + 0.002, 0.0001, 0.004, 0.021, 0.659, 0.659, 0.017, 0.002, 0.883, 0.333, + 1.719, 0.03, 1.451, 2.231, 1.063, 0.565, 0.61, 0.611, 0.586, 0.586, + 0.597, 1.829, 0.199, 0.094, 0.009, 0.006, 0.009, 0.002, 0.0001, 0.49, + 0.423, 0.263, 0.348, 0.486, 0.143, 0.225, 0.131, 0.617, 0.095, 0.263, + 0.178, 0.552, 0.272, 0.136, 0.483, 0.013, 0.313, 0.36, 0.336, 0.074, + 0.114, 0.249, 0.018, 0.046, 0.052, 0.006, 0.0001, 0.007, 0.0001, 0.006, + 0.0001, 7.914, 1.267, 0.542, 1.393, 6.136, 0.161, 1.565, 0.525, 5.317, + 0.298, 1.632, 1.173, 1.479, 6.133, 5.204, 0.602, 0.04, 3.812, 1.491, + 2.75, 1.848, 0.267, 2.105, 0.037, 0.79, 0.308, 0.0001, 0.0001, 0.0001, + 0.013, 0.0001, 0.299, 0.053, 0.064, 0.017, 0.038, 0.029, 0.014, 0.008, + 0.026, 0.003, 0.007, 0.007, 0.016, 0.016, 0.006, 0.008, 0.013, 0.032, + 0.004, 0.043, 0.108, 0.002, 0.004, 0.01, 0.017, 0.017, 0.017, 0.015, + 0.011, 0.008, 0.009, 0.017, 0.085, 0.124, 0.117, 0.04, 0.025, 0.023, + 0.025, 0.032, 0.017, 0.097, 0.007, 0.031, 0.013, 0.031, 0.009, 0.016, + 0.079, 0.095, 0.056, 0.083, 0.021, 0.063, 0.052, 0.013, 0.046, 0.015, + 0.047, 0.045, 0.034, 0.035, 0.045, 0.013, 0.0001, 0.0001, 0.04, 0.466, + 0.079, 0.167, 0.001, 0.002, 0.0001, 0.023, 0.01, 0.013, 0.002, 0.001, + 0.027, 0.006, 0.292, 0.12, 0.0001, 0.0001, 0.009, 0.199, 0.04, 0.007, + 0.055, 0.037, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.021, + 0.074, 0.244, 0.0001, 0.005, 0.01, 0.006, 0.001, 0.002, 0.006, 0.003, + 0.003, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + nah: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.08, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.795, 0.004, 0.316, 0.0001, + 0.0001, 0.001, 0.0001, 0.011, 0.502, 0.505, 0.006, 0.329, 1.148, 0.317, + 0.599, 1.663, 0.178, 0.339, 0.18, 0.099, 0.094, 0.088, 0.135, 0.085, + 0.092, 0.204, 0.686, 0.012, 0.001, 0.002, 0.002, 0.012, 0.0001, 0.583, + 0.136, 0.486, 0.282, 0.369, 0.108, 0.135, 0.149, 0.382, 0.043, 0.01, + 0.153, 0.41, 0.267, 0.154, 0.356, 0.041, 0.209, 0.348, 0.531, 0.077, + 0.099, 0.006, 0.046, 0.078, 0.021, 0.306, 0.0001, 0.304, 0.0001, 0.018, + 0.0001, 8.12, 0.52, 3.826, 1.716, 6.024, 0.239, 0.598, 2.703, 7.016, + 0.169, 0.062, 5.071, 1.759, 4.856, 5.013, 1.61, 0.66, 3.183, 2.38, + 4.798, 3.279, 0.368, 0.013, 0.578, 0.571, 0.892, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.023, 0.52, 0.003, 0.003, 0.002, 0.001, 0.001, 0.002, + 0.002, 0.007, 0.001, 0.001, 0.005, 0.446, 0.001, 0.001, 0.001, 0.002, + 0.001, 0.26, 0.002, 0.003, 0.001, 0.001, 0.001, 0.002, 0.003, 0.001, + 0.002, 0.001, 0.001, 0.001, 0.003, 0.117, 0.005, 0.001, 0.004, 0.001, + 0.001, 0.002, 0.003, 0.168, 0.013, 0.475, 0.001, 0.136, 0.018, 0.008, + 0.004, 0.071, 0.003, 0.269, 0.002, 0.003, 0.001, 0.001, 0.003, 0.002, + 0.068, 0.005, 0.005, 0.002, 0.003, 0.016, 0.0001, 0.0001, 0.033, 0.838, + 1.259, 0.446, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.009, 0.004, 0.012, 0.003, 0.0001, 0.0001, 0.0001, 0.001, + 0.001, 0.003, 0.005, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.027, 0.002, 0.008, 0.004, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + nap: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.664, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.609, 0.012, 0.443, 0.0001, + 0.0001, 0.005, 0.002, 3.603, 0.188, 0.187, 0.001, 0.001, 0.851, 0.111, + 0.916, 0.025, 0.289, 0.464, 0.288, 0.212, 0.187, 0.195, 0.184, 0.177, + 0.191, 0.229, 0.063, 0.027, 0.064, 0.004, 0.064, 0.004, 0.0001, 0.359, + 0.17, 0.431, 0.088, 0.101, 0.128, 0.139, 0.019, 0.153, 0.024, 0.014, + 0.18, 0.269, 0.172, 0.129, 0.252, 0.015, 0.136, 0.331, 0.141, 0.042, + 0.154, 0.012, 0.021, 0.004, 0.014, 0.007, 0.0001, 0.007, 0.0001, 0.001, + 0.0001, 8.472, 0.677, 3.575, 1.818, 8.836, 0.628, 1.161, 0.605, 5.326, + 0.294, 0.072, 2.854, 1.959, 5.855, 5.118, 1.978, 0.107, 4.154, 2.774, + 4.302, 3.256, 1.068, 0.047, 0.011, 0.049, 0.778, 0.0001, 0.014, 0.0001, + 0.0001, 0.0001, 0.167, 0.005, 0.004, 0.005, 0.003, 0.002, 0.001, 0.001, + 0.017, 0.002, 0.001, 0.001, 0.001, 0.003, 0.001, 0.001, 0.003, 0.001, + 0.001, 0.008, 0.005, 0.001, 0.001, 0.001, 0.033, 0.118, 0.001, 0.001, + 0.005, 0.005, 0.001, 0.002, 0.266, 0.085, 0.051, 0.002, 0.003, 0.001, + 0.003, 0.003, 0.62, 0.161, 0.023, 0.139, 0.069, 0.03, 0.001, 0.002, + 0.025, 0.004, 0.164, 0.026, 0.08, 0.002, 0.003, 0.002, 0.002, 0.107, + 0.016, 0.007, 0.005, 0.003, 0.002, 0.002, 0.0001, 0.0001, 0.057, 1.779, + 0.007, 0.055, 0.0001, 0.001, 0.0001, 0.003, 0.002, 0.003, 0.0001, + 0.0001, 0.013, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, + 0.002, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.003, 0.165, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + nds: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.919, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.282, 0.001, 0.235, 0.0001, + 0.0001, 0.09, 0.002, 0.046, 0.155, 0.155, 0.017, 0.001, 0.777, 0.214, + 1.137, 0.014, 0.414, 0.571, 0.279, 0.157, 0.152, 0.165, 0.151, 0.162, + 0.212, 0.299, 0.042, 0.019, 0.001, 0.002, 0.001, 0.001, 0.0001, 0.383, + 0.397, 0.141, 0.527, 0.184, 0.228, 0.238, 0.278, 0.228, 0.153, 0.317, + 0.238, 0.331, 0.224, 0.164, 0.212, 0.007, 0.201, 0.654, 0.206, 0.119, + 0.194, 0.231, 0.003, 0.008, 0.039, 0.011, 0.0001, 0.011, 0.0001, 0.001, + 0.0001, 4.393, 1.051, 1.267, 3.394, 10.917, 0.767, 1.396, 2.581, 3.914, + 0.085, 1.325, 2.618, 1.593, 8.321, 3.314, 0.889, 0.009, 5.125, 3.768, + 5.421, 2.363, 1.177, 0.929, 0.056, 0.171, 0.239, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.454, 0.002, 0.002, 0.001, 0.006, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.023, 0.001, 0.0001, 0.022, 0.001, 0.009, 0.334, 0.001, + 0.001, 0.057, 0.001, 0.038, 0.018, 0.048, 0.004, 0.001, 0.001, 0.208, + 0.002, 0.001, 0.001, 0.002, 0.009, 0.001, 0.001, 0.0001, 0.002, 0.0001, + 0.001, 0.005, 0.002, 0.014, 0.003, 0.002, 0.002, 0.82, 0.001, 0.004, + 0.001, 0.001, 0.001, 0.763, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.055, + 1.884, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.007, 0.003, 0.008, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.454, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ne: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.49, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.629, 0.002, 0.033, 0.0001, + 0.0001, 0.006, 0.0001, 0.018, 0.053, 0.057, 0.0001, 0.001, 0.2, 0.042, + 0.073, 0.008, 0.003, 0.003, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.015, 0.002, 0.005, 0.002, 0.006, 0.002, 0.0001, 0.004, + 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.002, 0.003, 0.001, 0.001, + 0.002, 0.002, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.004, 0.003, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.0001, 0.004, 0.0001, + 0.001, 0.0001, 0.056, 0.012, 0.021, 0.02, 0.066, 0.011, 0.012, 0.023, + 0.048, 0.001, 0.005, 0.027, 0.017, 0.042, 0.043, 0.015, 0.001, 0.044, + 0.036, 0.045, 0.017, 0.005, 0.008, 0.001, 0.01, 0.001, 0.0001, 0.009, + 0.0001, 0.0001, 0.0001, 0.608, 0.76, 0.405, 0.065, 0.0001, 0.231, 0.124, + 1.05, 0.333, 0.225, 0.003, 1.089, 0.054, 2.553, 0.0001, 0.268, 0.005, + 0.0001, 0.0001, 0.016, 0.009, 1.681, 0.188, 0.574, 0.05, 0.059, 0.235, + 0.302, 0.411, 0.024, 0.038, 0.296, 0.063, 0.16, 0.029, 0.16, 24.986, + 7.481, 0.637, 0.298, 1.766, 0.034, 0.895, 0.142, 0.406, 0.37, 1.169, + 0.857, 2.172, 0.0001, 1.023, 0.0001, 0.0001, 0.652, 0.263, 0.209, 1.099, + 0.646, 0.0001, 0.0001, 0.001, 0.001, 3.096, 1.51, 0.0001, 0.0001, 0.006, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 30.857, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + new: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.658, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.736, 0.0001, 0.005, 0.0001, + 0.0001, 0.016, 0.0001, 0.016, 0.053, 0.053, 0.0001, 0.0001, 0.168, + 0.064, 0.05, 0.001, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.001, 0.014, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.001, 0.002, 0.002, 0.0001, 0.001, 0.0001, 0.001, 0.001, + 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.001, 0.0001, 0.001, 0.0001, 0.045, 0.006, 0.015, 0.015, 0.048, 0.008, + 0.009, 0.021, 0.034, 0.001, 0.003, 0.019, 0.011, 0.032, 0.03, 0.01, + 0.0001, 0.03, 0.026, 0.034, 0.014, 0.004, 0.005, 0.001, 0.007, 0.001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.748, 1.473, 1.078, 0.313, + 0.0001, 0.165, 0.087, 0.934, 0.049, 0.145, 0.004, 0.213, 0.295, 3.035, + 0.001, 0.021, 0.01, 0.0001, 0.001, 0.003, 0.002, 0.891, 0.378, 1.026, + 0.007, 0.007, 0.145, 0.227, 0.557, 0.002, 0.008, 0.138, 0.03, 0.275, + 0.076, 0.203, 24.519, 8.651, 0.655, 0.317, 1.238, 0.066, 0.765, 0.114, + 0.288, 0.474, 0.695, 2.038, 1.25, 0.006, 0.967, 0.005, 0.016, 1.209, + 0.15, 0.223, 0.893, 0.295, 0.0001, 0.001, 0.016, 0.0001, 3.268, 1.125, + 0.0001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 30.648, 0.0001, 0.246, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, + ], + ng: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.332, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.852, 0.014, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.028, 0.0001, 0.0001, 0.569, + 0.014, 0.833, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.042, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.291, 0.028, 0.014, 0.069, 0.125, 0.0001, 0.194, 0.153, + 0.5, 0.042, 0.069, 0.0001, 0.056, 0.153, 0.402, 0.083, 0.0001, 0.0001, + 0.014, 0.18, 0.222, 0.0001, 0.222, 0.0001, 0.014, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.728, 1.221, 0.236, 1.443, + 7.106, 0.347, 2.859, 3.65, 4.136, 0.125, 4.316, 3.539, 3.983, 7.412, + 7.883, 1.596, 0.0001, 1.138, 1.901, 3.511, 6.62, 0.402, 2.776, 0.0001, + 2.11, 0.194, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, + 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.056, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.056, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.028, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + nov: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 3.223, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.739, 0.005, 0.371, 0.0001, + 0.0001, 0.004, 0.0001, 0.014, 0.258, 0.258, 0.003, 0.008, 0.827, 0.256, + 1.132, 0.016, 0.643, 0.521, 0.435, 0.122, 0.19, 0.117, 0.125, 0.112, + 0.14, 0.247, 0.122, 0.023, 0.02, 0.012, 0.021, 0.004, 0.0001, 0.495, + 0.126, 0.101, 0.11, 0.205, 0.084, 0.113, 0.079, 0.113, 0.072, 0.274, + 0.517, 0.205, 0.19, 0.072, 0.148, 0.01, 0.107, 0.475, 0.124, 0.103, + 0.078, 0.049, 0.006, 0.028, 0.032, 0.002, 0.0001, 0.003, 0.0001, 0.002, + 0.0001, 6.407, 1.088, 0.275, 3.233, 10.596, 0.875, 0.958, 0.605, 7.974, + 0.212, 2.738, 4.237, 2.737, 5.182, 4.585, 1.557, 0.08, 4.568, 4.834, + 4.299, 2.875, 0.823, 0.156, 0.296, 0.238, 0.085, 0.002, 0.001, 0.002, + 0.0001, 0.0001, 0.026, 0.009, 0.01, 0.005, 0.006, 0.003, 0.001, 0.003, + 0.003, 0.003, 0.001, 0.001, 0.003, 0.004, 0.0001, 0.0001, 0.003, 0.001, + 0.003, 0.016, 0.003, 0.003, 0.001, 0.001, 0.001, 0.007, 0.002, 0.003, + 0.003, 0.007, 0.001, 0.0001, 0.012, 0.008, 0.002, 0.005, 0.005, 0.002, + 0.003, 0.003, 0.008, 0.015, 0.002, 0.001, 0.004, 0.007, 0.004, 0.004, + 0.003, 0.005, 0.01, 0.013, 0.003, 0.002, 0.006, 0.004, 0.012, 0.004, + 0.008, 0.008, 0.012, 0.008, 0.004, 0.006, 0.0001, 0.0001, 0.013, 0.071, + 0.012, 0.013, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.001, 0.0001, + 0.0001, 0.04, 0.019, 0.02, 0.007, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.013, 0.008, 0.025, 0.004, 0.0001, 0.002, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + nrm: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.521, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.376, 0.004, 0.467, 0.0001, + 0.0001, 0.003, 0.0001, 1.947, 0.163, 0.162, 0.0001, 0.0001, 0.761, + 0.157, 0.914, 0.012, 1.102, 1.934, 0.564, 0.483, 0.476, 0.487, 0.557, + 0.61, 0.644, 0.66, 0.069, 0.027, 0.003, 0.001, 0.003, 0.001, 0.0001, + 0.78, 0.094, 0.435, 0.253, 0.108, 0.06, 0.094, 0.042, 0.231, 0.101, + 0.009, 0.332, 0.216, 0.104, 0.043, 0.114, 0.015, 0.096, 0.165, 0.06, + 0.048, 0.107, 0.012, 0.147, 0.029, 0.002, 0.0001, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 4.848, 0.485, 1.639, 2.302, 7.56, 0.544, 0.696, 1.469, + 3.879, 0.15, 0.04, 3.065, 1.372, 5.618, 3.164, 1.345, 0.499, 2.846, + 4.958, 4.48, 3.809, 0.712, 0.015, 0.135, 0.467, 0.062, 0.0001, 1.427, + 0.0001, 0.0001, 0.0001, 0.085, 0.003, 0.016, 0.002, 0.004, 0.002, 0.001, + 0.0001, 0.002, 0.014, 0.026, 0.0001, 0.001, 0.001, 0.016, 0.0001, 0.001, + 0.001, 0.001, 0.016, 0.002, 0.001, 0.0001, 0.0001, 0.002, 0.06, 0.0001, + 0.023, 0.002, 0.001, 0.0001, 0.001, 0.219, 0.004, 0.233, 0.004, 0.005, + 0.011, 0.0001, 0.016, 0.454, 2.065, 0.259, 0.013, 0.002, 0.004, 0.368, + 0.008, 0.001, 0.008, 0.002, 0.004, 0.081, 0.004, 0.002, 0.012, 0.002, + 0.151, 0.004, 0.112, 0.003, 0.005, 0.001, 0.003, 0.0001, 0.0001, 0.015, + 4.079, 0.017, 0.014, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.029, 0.013, 0.005, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.003, 0.077, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + nso: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.78, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.755, 0.002, 0.038, 0.001, + 0.0001, 0.004, 0.0001, 0.009, 0.457, 0.457, 0.0001, 0.0001, 0.676, + 0.052, 0.694, 0.005, 0.466, 0.863, 0.377, 0.269, 0.237, 0.244, 0.243, + 0.245, 0.241, 0.264, 0.019, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.278, 0.349, 0.291, 0.135, 0.079, 0.05, 0.105, 0.055, 0.212, 0.029, + 0.164, 0.314, 0.912, 0.402, 0.025, 0.107, 0.005, 0.046, 0.407, 0.145, + 0.02, 0.095, 0.034, 0.21, 0.005, 0.034, 0.003, 0.0001, 0.003, 0.0001, + 0.001, 0.0001, 11.556, 1.304, 0.158, 0.76, 9.745, 0.742, 5.815, 1.511, + 2.097, 0.062, 3.221, 3.795, 3.273, 4.341, 8.239, 1.391, 0.015, 2.291, + 2.998, 2.898, 0.946, 0.091, 3.286, 0.014, 0.713, 0.058, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.019, + 0.718, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.045, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.083, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.134, 0.0001, + 0.733, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + nv: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.509, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.471, 0.0001, 0.553, 0.0001, + 0.0001, 0.002, 0.0001, 0.001, 0.132, 0.131, 0.0001, 0.0001, 0.333, 0.05, + 0.853, 0.008, 0.262, 0.198, 0.155, 0.093, 0.082, 0.107, 0.089, 0.066, + 0.073, 0.069, 0.012, 0.267, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.105, 0.358, 0.12, 0.313, 0.022, 0.005, 0.023, 0.24, 0.014, 0.023, + 0.045, 0.016, 0.036, 0.298, 0.014, 0.019, 0.001, 0.01, 0.1, 0.28, 0.004, + 0.005, 0.04, 0.001, 0.048, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 5.817, 1.241, 0.605, 3.905, 1.9, 0.016, 1.415, 4.266, 6.018, + 0.364, 1.038, 1.394, 0.149, 2.559, 2.764, 0.063, 0.003, 0.149, 2.248, + 2.042, 0.092, 0.019, 0.145, 0.037, 1.033, 1.245, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.08, 1.403, 1.567, 0.013, 0.082, 1.105, 0.0001, 0.0001, + 0.0001, 0.004, 0.0001, 0.0001, 0.001, 0.007, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.067, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.294, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 2.758, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 2.445, 0.0001, 0.311, + 0.0001, 4.591, 0.0001, 0.504, 0.001, 0.001, 0.001, 2.002, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.013, 4.172, 0.001, 0.0001, + 0.013, 0.0001, 0.0001, 0.002, 11.893, 1.899, 1.744, 0.0001, 0.311, + 0.0001, 0.0001, 4.171, 0.0001, 1.234, 0.0001, 0.002, 0.003, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.08, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + ny: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.625, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.431, 0.001, 0.161, 0.0001, + 0.001, 0.013, 0.004, 0.199, 0.151, 0.149, 0.001, 0.0001, 0.726, 0.052, + 1.005, 0.011, 0.425, 0.321, 0.242, 0.114, 0.121, 0.146, 0.109, 0.097, + 0.1, 0.188, 0.119, 0.008, 0.003, 0.006, 0.003, 0.001, 0.0001, 0.324, + 0.194, 0.362, 0.113, 0.083, 0.06, 0.055, 0.057, 0.099, 0.059, 0.134, + 0.101, 0.607, 0.172, 0.041, 0.204, 0.005, 0.064, 0.151, 0.1, 0.088, + 0.025, 0.048, 0.003, 0.047, 0.083, 0.018, 0.0001, 0.019, 0.0001, 0.0001, + 0.003, 13.746, 1.132, 1.623, 2.856, 4.347, 0.427, 1.15, 2.997, 7.993, + 0.223, 3.837, 3.15, 3.985, 6.204, 4.4, 1.606, 0.018, 2.007, 1.898, + 3.156, 4.108, 0.173, 2.53, 0.014, 1.184, 1.868, 0.0001, 0.0001, 0.001, + 0.002, 0.0001, 0.066, 0.003, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.001, + 0.001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.002, 0.0001, + 0.0001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.004, 0.05, 0.0001, + 0.0001, 0.006, 0.005, 0.001, 0.001, 0.013, 0.003, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.001, 0.002, 0.013, 0.001, 0.001, 0.001, 0.002, 0.001, + 0.001, 0.002, 0.004, 0.001, 0.006, 0.001, 0.06, 0.0001, 0.011, 0.002, + 0.003, 0.003, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.023, + 0.029, 0.004, 0.064, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.001, + 0.0001, 0.0001, 0.009, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.066, 0.0001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + oc: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.196, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.065, 0.002, 0.316, 0.046, + 0.0001, 0.007, 0.001, 0.708, 0.193, 0.193, 0.002, 0.001, 0.913, 0.337, + 0.785, 0.01, 0.177, 0.339, 0.143, 0.091, 0.092, 0.097, 0.087, 0.093, + 0.11, 0.155, 0.065, 0.02, 0.037, 0.032, 0.038, 0.002, 0.0001, 0.316, + 0.163, 0.28, 0.118, 0.18, 0.101, 0.108, 0.046, 0.126, 0.059, 0.019, + 0.366, 0.206, 0.087, 0.061, 0.2, 0.02, 0.116, 0.247, 0.092, 0.045, + 0.108, 0.016, 0.03, 0.009, 0.007, 0.013, 0.0001, 0.013, 0.0001, 0.002, + 0.0001, 9.22, 0.793, 2.634, 3.53, 8.653, 0.714, 1.084, 0.594, 5.176, + 0.154, 0.069, 4.196, 2.017, 5.599, 4.023, 1.809, 0.517, 4.973, 5.482, + 4.438, 3.287, 0.768, 0.022, 0.148, 0.146, 0.139, 0.0001, 0.011, 0.002, + 0.002, 0.0001, 0.071, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.002, + 0.007, 0.009, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.001, + 0.006, 0.007, 0.005, 0.001, 0.0001, 0.0001, 0.001, 0.051, 0.0001, 0.001, + 0.001, 0.001, 0.0001, 0.001, 0.145, 0.074, 0.024, 0.002, 0.002, 0.001, + 0.002, 0.134, 0.929, 0.452, 0.016, 0.026, 0.001, 0.096, 0.005, 0.03, + 0.005, 0.004, 0.448, 0.027, 0.01, 0.002, 0.002, 0.002, 0.002, 0.004, + 0.011, 0.027, 0.011, 0.002, 0.002, 0.002, 0.0001, 0.0001, 0.068, 2.417, + 0.003, 0.007, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, + 0.0001, 0.008, 0.004, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.002, 0.067, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + olo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.555, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.165, 0.001, 0.091, 0.0001, + 0.0001, 0.009, 0.001, 0.061, 0.221, 0.221, 0.0001, 0.001, 0.891, 0.306, + 1.442, 0.031, 0.305, 0.513, 0.256, 0.174, 0.154, 0.153, 0.124, 0.134, + 0.157, 0.296, 0.102, 0.011, 0.01, 0.003, 0.01, 0.002, 0.001, 0.151, + 0.077, 0.024, 0.041, 0.069, 0.036, 0.06, 0.101, 0.085, 0.112, 0.389, + 0.128, 0.177, 0.115, 0.068, 0.258, 0.001, 0.092, 0.352, 0.141, 0.032, + 0.27, 0.012, 0.021, 0.024, 0.01, 0.006, 0.0001, 0.006, 0.0001, 0.001, + 0.005, 7.441, 0.351, 0.076, 1.841, 5.414, 0.122, 0.914, 2.187, 8.145, + 1.143, 3.3, 4.3, 1.89, 6.075, 4.589, 1.29, 0.001, 2.71, 3.519, 3.872, + 5.598, 2.436, 0.016, 0.008, 1.054, 0.985, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.389, 0.086, 0.073, 0.032, 0.01, 0.011, 0.006, 0.01, 0.008, + 0.001, 0.002, 0.006, 0.036, 0.349, 0.005, 0.017, 0.009, 0.004, 0.01, + 0.105, 0.013, 0.002, 0.002, 0.002, 0.005, 0.148, 0.017, 0.006, 0.011, + 0.056, 0.001, 0.018, 0.051, 0.118, 0.003, 0.002, 1.86, 0.003, 0.001, + 0.007, 0.003, 0.003, 0.001, 0.01, 0.001, 0.003, 0.001, 0.002, 0.143, + 0.012, 0.077, 0.019, 0.054, 0.096, 0.298, 0.031, 0.077, 0.038, 0.064, + 0.07, 0.021, 0.096, 0.259, 0.018, 0.0001, 0.0001, 0.075, 2.173, 0.359, + 0.275, 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.002, 0.001, 0.0001, 0.01, + 0.006, 0.977, 0.34, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.008, + 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.004, 0.001, 0.32, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + om: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.856, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.47, 0.007, 0.135, 0.001, + 0.001, 0.02, 0.001, 0.415, 0.149, 0.148, 0.003, 0.001, 0.598, 0.088, + 0.774, 0.024, 0.177, 0.196, 0.107, 0.055, 0.058, 0.069, 0.055, 0.055, + 0.062, 0.111, 0.03, 0.031, 0.014, 0.003, 0.015, 0.004, 0.0001, 0.377, + 0.227, 0.059, 0.14, 0.066, 0.078, 0.179, 0.124, 0.131, 0.063, 0.149, + 0.064, 0.172, 0.076, 0.188, 0.061, 0.049, 0.057, 0.159, 0.099, 0.042, + 0.016, 0.108, 0.015, 0.076, 0.01, 0.011, 0.0001, 0.011, 0.0001, 0.003, + 0.13, 18.959, 2.318, 0.672, 2.536, 5.221, 1.607, 1.449, 2.234, 8.071, + 0.935, 2.586, 2.201, 2.811, 5.266, 4.391, 0.29, 0.68, 3.658, 3.072, + 4.065, 4.017, 0.087, 0.574, 0.143, 1.425, 0.099, 0.01, 0.001, 0.01, + 0.0001, 0.0001, 0.186, 0.003, 0.002, 0.003, 0.006, 0.002, 0.002, 0.001, + 0.004, 0.002, 0.003, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.007, 0.12, + 0.0001, 0.0001, 0.011, 0.011, 0.005, 0.0001, 0.099, 0.002, 0.002, 0.001, + 0.0001, 0.0001, 0.03, 0.008, 0.002, 0.002, 0.003, 0.001, 0.001, 0.002, + 0.001, 0.002, 0.003, 0.004, 0.003, 0.002, 0.001, 0.001, 0.002, 0.001, + 0.001, 0.003, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.105, 0.005, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.002, + 0.0001, 0.0001, 0.007, 0.004, 0.003, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.024, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.003, 0.191, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + or: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.414, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.789, 0.001, 0.049, 0.0001, + 0.0001, 0.027, 0.0001, 0.016, 0.066, 0.066, 0.001, 0.0001, 0.194, 0.029, + 0.065, 0.008, 0.012, 0.014, 0.009, 0.005, 0.004, 0.005, 0.004, 0.004, + 0.004, 0.006, 0.014, 0.004, 0.003, 0.001, 0.003, 0.0001, 0.0001, 0.006, + 0.004, 0.006, 0.004, 0.003, 0.002, 0.002, 0.003, 0.007, 0.001, 0.002, + 0.003, 0.005, 0.003, 0.003, 0.005, 0.0001, 0.003, 0.007, 0.006, 0.001, + 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, + 0.001, 0.0001, 0.081, 0.011, 0.027, 0.026, 0.08, 0.013, 0.015, 0.029, + 0.067, 0.002, 0.006, 0.037, 0.021, 0.058, 0.062, 0.019, 0.001, 0.059, + 0.056, 0.058, 0.033, 0.007, 0.008, 0.003, 0.014, 0.002, 0.0001, 0.009, + 0.0001, 0.0001, 0.0001, 0.461, 0.87, 0.209, 0.086, 0.0001, 0.314, 0.231, + 1.688, 0.023, 0.138, 0.001, 0.379, 0.073, 2.56, 0.0001, 0.427, 0.002, + 0.0001, 0.0001, 0.16, 0.011, 1.385, 0.13, 0.389, 0.041, 0.233, 0.239, + 0.105, 0.371, 0.014, 0.058, 0.871, 0.144, 0.225, 0.017, 0.346, 1.495, + 0.883, 0.609, 0.353, 1.21, 0.043, 0.827, 0.113, 24.372, 7.183, 0.945, + 0.296, 2.678, 0.059, 0.571, 0.283, 0.0001, 0.05, 0.328, 0.264, 0.929, + 0.701, 0.0001, 0.0001, 0.094, 0.0001, 2.794, 2.229, 0.0001, 0.0001, + 0.045, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 30.66, 0.0001, 0.069, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + os: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.314, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.198, 0.001, 0.075, 0.0001, + 0.0001, 0.009, 0.0001, 0.003, 0.221, 0.221, 0.0001, 0.001, 0.656, 0.268, + 0.647, 0.003, 0.149, 0.239, 0.119, 0.07, 0.068, 0.074, 0.065, 0.065, + 0.08, 0.138, 0.043, 0.023, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.003, + 0.003, 0.004, 0.002, 0.002, 0.002, 0.002, 0.001, 0.024, 0.001, 0.001, + 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.005, 0.002, 0.001, + 0.007, 0.001, 0.014, 0.001, 0.0001, 0.004, 0.0001, 0.004, 0.0001, 0.001, + 0.0001, 0.032, 0.005, 0.009, 0.008, 0.024, 0.004, 0.005, 0.006, 0.02, + 0.001, 0.005, 0.014, 0.008, 0.019, 0.019, 0.004, 0.0001, 0.021, 0.013, + 0.014, 0.012, 0.003, 0.002, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 2.723, 1.959, 2.433, 1.742, 0.485, 1.045, 0.733, 0.104, + 0.039, 0.003, 0.515, 3.703, 0.088, 0.047, 0.033, 0.054, 0.152, 0.11, + 0.038, 0.09, 0.183, 0.021, 0.005, 0.03, 0.137, 0.06, 0.132, 0.043, + 0.092, 0.063, 0.026, 0.055, 0.062, 0.15, 0.074, 0.109, 0.063, 0.115, + 4.882, 0.027, 0.022, 0.001, 0.001, 0.076, 0.0001, 0.018, 0.005, 0.007, + 3.663, 0.542, 0.469, 1.346, 2.223, 0.835, 0.243, 0.949, 1.778, 1.262, + 0.952, 1.134, 1.447, 2.532, 1.739, 0.347, 0.0001, 0.0001, 0.16, 4.829, + 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.01, + 0.0001, 0.002, 0.001, 23.204, 15.519, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.01, 0.127, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pa: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.424, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.354, 0.003, 0.052, 0.0001, + 0.0001, 0.005, 0.0001, 0.026, 0.07, 0.07, 0.0001, 0.001, 0.252, 0.083, + 0.057, 0.008, 0.09, 0.134, 0.073, 0.034, 0.034, 0.037, 0.032, 0.033, + 0.039, 0.073, 0.023, 0.007, 0.005, 0.003, 0.005, 0.001, 0.0001, 0.004, + 0.002, 0.004, 0.002, 0.003, 0.002, 0.002, 0.002, 0.006, 0.001, 0.001, + 0.002, 0.003, 0.002, 0.002, 0.003, 0.0001, 0.002, 0.005, 0.003, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.007, 0.0001, 0.007, 0.0001, + 0.002, 0.003, 0.035, 0.006, 0.011, 0.011, 0.037, 0.006, 0.008, 0.011, + 0.028, 0.001, 0.004, 0.018, 0.013, 0.026, 0.027, 0.009, 0.001, 0.025, + 0.019, 0.024, 0.012, 0.004, 0.004, 0.001, 0.005, 0.001, 0.0001, 0.008, + 0.0001, 0.0001, 0.0001, 1.534, 0.423, 1.17, 0.001, 0.001, 0.437, 0.548, + 1.695, 0.606, 0.237, 0.024, 0.573, 0.09, 0.23, 0.001, 0.065, 0.035, + 0.0001, 0.001, 0.028, 0.011, 1.172, 0.229, 0.428, 0.077, 0.013, 0.442, + 0.041, 0.755, 0.032, 0.001, 0.286, 0.066, 0.192, 0.017, 0.267, 1.499, + 0.487, 1.308, 0.154, 24.532, 6.371, 0.647, 0.143, 0.447, 0.172, 0.696, + 0.068, 2.373, 0.727, 0.943, 0.005, 0.001, 0.891, 0.001, 0.001, 1.461, + 1.12, 0.001, 0.001, 0.465, 0.001, 2.611, 1.487, 0.0001, 0.0001, 0.039, + 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.008, 0.006, 0.001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 30.092, 0.001, 0.038, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pag: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 4.03, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.592, 0.019, 0.241, 0.0001, + 0.0001, 0.002, 0.0001, 0.022, 0.579, 0.579, 0.001, 0.002, 1.012, 0.179, + 1.28, 0.004, 0.607, 0.517, 0.439, 0.246, 0.233, 0.22, 0.206, 0.189, + 0.188, 0.203, 0.287, 0.029, 0.2, 0.003, 0.2, 0.007, 0.0001, 0.514, + 0.233, 0.299, 0.377, 0.293, 0.091, 0.061, 0.039, 0.141, 0.067, 0.298, + 0.143, 0.228, 0.153, 0.107, 0.323, 0.017, 0.066, 0.835, 0.144, 0.158, + 0.036, 0.141, 0.001, 0.016, 0.024, 0.044, 0.0001, 0.045, 0.0001, 0.001, + 0.0001, 14.553, 2.155, 0.612, 2.213, 4.092, 0.158, 2.144, 0.652, 5.448, + 0.026, 2.943, 4.371, 1.62, 6.468, 4.169, 1.489, 0.134, 1.92, 4.171, + 4.111, 1.822, 0.133, 0.774, 0.019, 2.966, 0.181, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.082, 0.003, 0.002, 0.002, 0.002, 0.001, 0.0001, + 0.0001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, + 0.001, 0.001, 0.0001, 0.005, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.048, + 0.0001, 0.001, 0.01, 0.009, 0.0001, 0.0001, 0.004, 0.017, 0.0001, 0.001, + 0.002, 0.001, 0.004, 0.002, 0.001, 0.008, 0.001, 0.001, 0.001, 0.005, + 0.0001, 0.001, 0.003, 0.012, 0.002, 0.005, 0.002, 0.001, 0.001, 0.001, + 0.004, 0.001, 0.005, 0.001, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, + 0.004, 0.049, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.009, 0.003, 0.0001, 0.0001, + 0.0001, 0.002, 0.0001, 0.0001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.006, 0.003, 0.075, 0.004, 0.0001, 0.002, + 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pam: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.69, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.089, 0.008, 0.379, 0.001, + 0.002, 0.006, 0.002, 0.032, 0.278, 0.278, 0.002, 0.002, 1.032, 0.272, + 0.824, 0.024, 0.328, 0.294, 0.247, 0.119, 0.115, 0.114, 0.097, 0.092, + 0.106, 0.173, 0.084, 0.034, 0.037, 0.005, 0.037, 0.004, 0.0001, 0.446, + 0.258, 0.283, 0.225, 0.147, 0.167, 0.119, 0.095, 0.427, 0.078, 0.159, + 0.17, 0.339, 0.137, 0.085, 0.26, 0.014, 0.119, 0.316, 0.173, 0.073, + 0.129, 0.078, 0.01, 0.038, 0.027, 0.056, 0.0001, 0.058, 0.0001, 0.003, + 0.0001, 11.717, 1.42, 1.079, 1.934, 5.65, 0.412, 5.535, 0.984, 6.498, + 0.051, 2.215, 3.499, 2.546, 9.826, 2.443, 1.882, 0.041, 3.326, 2.846, + 3.809, 3.421, 0.311, 0.524, 0.064, 1.429, 0.196, 0.0001, 0.012, 0.001, + 0.0001, 0.0001, 0.064, 0.007, 0.004, 0.005, 0.004, 0.002, 0.003, 0.002, + 0.002, 0.001, 0.001, 0.002, 0.002, 0.006, 0.001, 0.001, 0.002, 0.001, + 0.002, 0.019, 0.004, 0.002, 0.002, 0.002, 0.003, 0.009, 0.002, 0.002, + 0.017, 0.008, 0.009, 0.013, 0.012, 0.022, 0.007, 0.002, 0.067, 0.005, + 0.005, 0.005, 0.009, 0.033, 0.004, 0.003, 0.003, 0.006, 0.006, 0.004, + 0.01, 0.012, 0.01, 0.01, 0.006, 0.003, 0.032, 0.002, 0.004, 0.003, + 0.008, 0.007, 0.067, 0.001, 0.005, 0.003, 0.0001, 0.0001, 0.014, 0.263, + 0.005, 0.006, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.008, 0.006, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.04, 0.011, 0.063, 0.0001, 0.001, 0.004, 0.002, 0.001, 0.001, + 0.002, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pap: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.577, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.041, 0.006, 0.256, 0.002, + 0.001, 0.008, 0.005, 0.088, 0.145, 0.144, 0.001, 0.001, 0.829, 0.082, + 0.948, 0.014, 0.296, 0.379, 0.247, 0.133, 0.132, 0.125, 0.108, 0.098, + 0.111, 0.184, 0.198, 0.046, 0.009, 0.003, 0.009, 0.012, 0.0001, 0.325, + 0.157, 0.17, 0.173, 0.346, 0.09, 0.081, 0.124, 0.155, 0.09, 0.129, + 0.105, 0.233, 0.162, 0.14, 0.176, 0.005, 0.132, 0.285, 0.134, 0.07, + 0.056, 0.051, 0.003, 0.069, 0.012, 0.014, 0.0001, 0.014, 0.0001, 0.003, + 0.0001, 10.584, 1.755, 0.96, 3.481, 6.611, 0.57, 0.793, 1.086, 6.922, + 0.094, 2.168, 2.197, 2.209, 6.462, 5.124, 1.889, 0.017, 4.387, 3.838, + 4.459, 3.468, 0.348, 0.249, 0.043, 0.415, 0.112, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.051, 0.006, 0.003, 0.006, 0.004, 0.001, 0.001, 0.002, + 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.012, + 0.002, 0.005, 0.003, 0.001, 0.001, 0.001, 0.006, 0.016, 0.001, 0.001, + 0.01, 0.01, 0.001, 0.001, 0.023, 0.288, 0.003, 0.003, 0.003, 0.001, + 0.002, 0.007, 0.143, 0.171, 0.002, 0.003, 0.001, 0.133, 0.0001, 0.002, + 0.003, 0.162, 0.171, 0.076, 0.001, 0.002, 0.002, 0.001, 0.004, 0.053, + 0.027, 0.003, 0.086, 0.002, 0.003, 0.002, 0.0001, 0.0001, 0.023, 1.326, + 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, + 0.0001, 0.007, 0.004, 0.023, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.007, 0.048, 0.001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pcd: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 3.27, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.657, 0.008, 0.673, 0.0001, + 0.0001, 0.003, 0.004, 1.579, 0.485, 0.482, 0.004, 0.002, 0.764, 0.743, + 0.844, 0.029, 0.205, 0.439, 0.185, 0.104, 0.105, 0.099, 0.112, 0.109, + 0.159, 0.228, 0.141, 0.017, 0.014, 0.103, 0.015, 0.005, 0.0001, 0.322, + 0.315, 0.578, 0.163, 0.158, 0.188, 0.128, 0.139, 0.259, 0.095, 0.035, + 0.293, 0.23, 0.148, 0.082, 0.416, 0.024, 0.141, 0.362, 0.132, 0.056, + 0.121, 0.049, 0.026, 0.011, 0.008, 0.008, 0.0001, 0.009, 0.0001, 0.004, + 0.004, 4.164, 0.548, 3.109, 2.876, 7.669, 0.633, 0.742, 2.062, 6.133, + 0.168, 0.261, 3.265, 1.584, 5.6, 3.825, 1.718, 0.299, 3.984, 4.345, + 3.994, 3.516, 0.729, 0.062, 0.099, 0.331, 0.121, 0.0001, 0.008, 0.001, + 0.001, 0.0001, 0.34, 0.006, 0.009, 0.004, 0.003, 0.002, 0.003, 0.003, + 0.01, 0.086, 0.002, 0.001, 0.004, 0.005, 0.003, 0.002, 0.003, 0.002, + 0.002, 0.018, 0.009, 0.001, 0.001, 0.002, 0.003, 0.283, 0.001, 0.003, + 0.003, 0.002, 0.001, 0.001, 0.283, 0.006, 0.038, 0.003, 0.005, 0.006, + 0.003, 0.025, 0.548, 2.644, 0.014, 0.04, 0.002, 0.005, 0.009, 0.049, + 0.019, 0.006, 0.015, 0.007, 0.051, 0.004, 0.002, 0.022, 0.007, 0.018, + 0.005, 0.043, 0.008, 0.005, 0.004, 0.007, 0.0001, 0.0001, 0.109, 3.762, + 0.007, 0.017, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.003, 0.0001, + 0.0001, 0.018, 0.008, 0.022, 0.007, 0.0001, 0.0001, 0.0001, 0.003, + 0.0001, 0.0001, 0.009, 0.005, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.006, 0.329, 0.001, 0.002, 0.009, 0.006, 0.002, 0.003, + 0.002, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.004, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pdc: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.347, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.345, 0.014, 0.296, 0.0001, + 0.002, 0.001, 0.004, 0.083, 0.252, 0.251, 0.004, 0.0001, 0.899, 0.34, + 1.232, 0.016, 0.318, 0.569, 0.233, 0.139, 0.122, 0.133, 0.151, 0.187, + 0.197, 0.319, 0.11, 0.028, 0.009, 0.001, 0.009, 0.014, 0.001, 0.435, + 0.396, 0.269, 0.612, 0.446, 0.261, 0.34, 0.266, 0.158, 0.126, 0.345, + 0.316, 0.408, 0.189, 0.112, 0.446, 0.018, 0.164, 0.922, 0.173, 0.1, + 0.127, 0.257, 0.003, 0.091, 0.087, 0.001, 0.0001, 0.002, 0.0001, 0.002, + 0.001, 5.822, 0.784, 2.856, 3.127, 10.434, 0.913, 1.544, 3.717, 6.407, + 0.033, 0.633, 2.751, 1.821, 6.435, 2.483, 0.545, 0.012, 4.834, 4.912, + 3.94, 2.397, 0.665, 1.309, 0.053, 0.442, 0.521, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 0.13, 0.003, 0.001, 0.002, 0.004, 0.002, 0.002, 0.001, + 0.002, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.012, 0.001, 0.0001, 0.001, 0.0001, 0.012, 0.052, + 0.0001, 0.0001, 0.021, 0.02, 0.013, 0.012, 0.005, 0.005, 0.001, 0.002, + 0.087, 0.001, 0.002, 0.004, 0.002, 0.014, 0.002, 0.001, 0.002, 0.005, + 0.0001, 0.002, 0.002, 0.007, 0.005, 0.01, 0.013, 0.001, 0.014, 0.0001, + 0.001, 0.001, 0.001, 0.001, 0.03, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.019, 0.191, 0.004, 0.004, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.002, + 0.0001, 0.0001, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.003, 0.011, 0.007, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.129, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pfl: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.263, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.706, 0.009, 0.364, 0.0001, + 0.0001, 0.013, 0.001, 0.091, 0.195, 0.195, 0.003, 0.001, 0.686, 0.342, + 1.046, 0.015, 0.201, 0.285, 0.126, 0.084, 0.075, 0.083, 0.073, 0.08, + 0.09, 0.133, 0.057, 0.007, 0.004, 0.002, 0.005, 0.003, 0.0001, 0.282, + 0.468, 0.129, 0.696, 0.183, 0.211, 0.353, 0.23, 0.145, 0.127, 0.364, + 0.254, 0.349, 0.172, 0.165, 0.214, 0.007, 0.306, 0.587, 0.085, 0.112, + 0.133, 0.253, 0.004, 0.004, 0.083, 0.004, 0.0001, 0.004, 0.0001, 0.001, + 0.001, 5.458, 1.123, 3.147, 5.166, 9.364, 1.012, 2.021, 4.491, 5.715, + 0.138, 0.564, 2.856, 2.578, 5.721, 2.982, 0.339, 0.016, 4.316, 5.155, + 2.124, 2.997, 0.789, 1.349, 0.04, 0.119, 0.948, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.073, 0.001, 0.001, 0.001, 0.025, 0.007, 0.0001, + 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.001, 0.002, 0.001, 0.0001, + 0.001, 0.001, 0.001, 0.014, 0.001, 0.005, 0.002, 0.0001, 0.001, 0.004, + 0.001, 0.001, 0.027, 0.001, 0.026, 0.15, 0.041, 0.008, 0.01, 0.001, + 1.309, 0.09, 0.0001, 0.002, 0.017, 0.105, 0.002, 0.002, 0.07, 0.023, + 0.0001, 0.002, 0.004, 0.001, 0.016, 0.015, 0.003, 0.033, 0.029, 0.001, + 0.0001, 0.001, 0.001, 0.001, 0.044, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.024, 1.987, 0.001, 0.015, 0.0001, 0.0001, 0.0001, 0.002, 0.003, 0.001, + 0.001, 0.0001, 0.002, 0.001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.07, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pi: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 3.055, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.983, 0.003, 0.019, 0.0001, + 0.0001, 0.001, 0.0001, 0.005, 0.015, 0.015, 0.0001, 0.0001, 0.196, 0.05, + 0.162, 0.001, 0.012, 0.032, 0.016, 0.014, 0.013, 0.015, 0.012, 0.01, + 0.008, 0.011, 0.012, 0.002, 0.001, 0.001, 0.001, 0.003, 0.0001, 0.014, + 0.008, 0.005, 0.012, 0.009, 0.003, 0.003, 0.008, 0.003, 0.003, 0.005, + 0.005, 0.006, 0.016, 0.004, 0.013, 0.0001, 0.005, 0.023, 0.015, 0.011, + 0.002, 0.003, 0.0001, 0.036, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 1.761, 0.196, 0.276, 0.305, 0.454, 0.017, 0.165, 0.648, + 0.799, 0.068, 0.545, 0.11, 0.265, 0.512, 0.167, 0.383, 0.0001, 0.263, + 0.542, 0.555, 0.3, 0.254, 0.017, 0.002, 0.396, 0.01, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.585, 1.349, 0.631, 0.309, 0.001, 0.704, 0.099, + 0.738, 0.496, 0.135, 0.002, 0.598, 0.015, 3.249, 0.0001, 0.471, 0.004, + 0.001, 0.0001, 0.007, 0.008, 1.087, 0.017, 0.945, 0.067, 0.032, 0.055, + 0.004, 0.076, 0.002, 0.011, 0.133, 0.012, 0.507, 0.001, 0.315, 18.309, + 9.394, 0.355, 1.002, 0.59, 0.225, 0.335, 0.42, 0.344, 0.341, 0.537, + 1.408, 2.487, 0.078, 0.724, 0.001, 0.0001, 0.527, 0.043, 0.432, 2.004, + 0.558, 0.0001, 0.0001, 0.014, 0.0001, 1.176, 0.438, 0.0001, 0.0001, + 0.0001, 0.095, 0.876, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 26.149, 0.497, 0.061, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pih: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 4.022, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.521, 0.009, 0.204, 0.0001, + 0.0001, 0.004, 0.001, 2.454, 0.291, 0.293, 0.002, 0.001, 0.888, 0.295, + 1.488, 0.018, 0.431, 0.479, 0.302, 0.13, 0.163, 0.176, 0.152, 0.154, + 0.17, 0.228, 0.107, 0.024, 0.002, 0.004, 0.002, 0.0001, 0.0001, 0.58, + 0.327, 0.222, 0.2, 0.438, 0.166, 0.153, 0.179, 0.225, 0.154, 0.281, + 0.167, 0.407, 0.329, 0.234, 0.386, 0.004, 0.196, 0.528, 0.379, 0.134, + 0.065, 0.116, 0.0001, 0.083, 0.034, 0.002, 0.0001, 0.004, 0.0001, + 0.0001, 0.0001, 8.21, 0.769, 1.021, 1.638, 6.843, 0.747, 0.93, 1.82, + 7.969, 0.261, 1.7, 3.13, 1.378, 5.431, 3.567, 1.341, 0.022, 3.668, + 4.749, 4.715, 2.394, 0.289, 0.906, 0.045, 1.135, 0.094, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.092, 0.039, 0.046, 0.01, 0.019, 0.008, 0.006, + 0.003, 0.009, 0.001, 0.001, 0.017, 0.011, 0.007, 0.006, 0.02, 0.015, + 0.009, 0.001, 0.019, 0.012, 0.0001, 0.001, 0.006, 0.003, 0.028, 0.004, + 0.009, 0.002, 0.007, 0.002, 0.006, 0.077, 0.019, 0.006, 0.004, 0.002, + 0.001, 0.001, 0.004, 0.006, 0.035, 0.017, 0.004, 0.004, 0.012, 0.004, + 0.0001, 0.082, 0.011, 0.044, 0.037, 0.018, 0.034, 0.007, 0.017, 0.057, + 0.008, 0.047, 0.04, 0.021, 0.031, 0.077, 0.012, 0.0001, 0.0001, 0.098, + 0.125, 0.02, 0.026, 0.002, 0.0001, 0.0001, 0.016, 0.007, 0.004, 0.0001, + 0.001, 0.0001, 0.0001, 0.45, 0.193, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.006, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.012, 0.026, 0.048, 0.0001, 0.0001, 0.003, 0.002, 0.001, + 0.0001, 0.001, 0.001, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pms: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.299, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.832, 0.001, 0.162, 0.0001, + 0.0001, 0.004, 0.001, 1.011, 0.156, 0.156, 0.0001, 0.0001, 1.253, 0.787, + 0.992, 0.342, 0.318, 0.594, 0.327, 0.281, 0.214, 0.205, 0.231, 0.17, + 0.187, 0.641, 0.121, 0.014, 0.149, 0.035, 0.149, 0.034, 0.0001, 0.513, + 0.293, 0.3, 0.101, 0.054, 0.096, 0.128, 0.035, 0.079, 0.03, 0.029, + 0.305, 0.216, 0.126, 0.053, 0.205, 0.008, 0.226, 0.291, 0.098, 0.028, + 0.104, 0.023, 0.014, 0.012, 0.01, 0.002, 0.0001, 0.002, 0.0001, 0.011, + 0.0001, 9.348, 0.753, 2.346, 3.335, 4.488, 0.731, 0.919, 0.76, 4.936, + 0.31, 0.385, 3.85, 2.042, 6.393, 3.543, 1.375, 0.084, 3.728, 4.566, + 4.041, 1.559, 0.688, 0.145, 0.036, 0.118, 0.134, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.165, 0.002, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.007, 0.001, 0.059, 0.002, 0.001, 0.004, 0.0001, 0.0001, 0.0001, + 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.02, 0.115, 0.0001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.661, 0.007, 0.005, 0.001, 0.004, + 0.0001, 0.001, 0.004, 0.295, 0.64, 0.002, 2.121, 0.312, 0.006, 0.001, + 0.001, 0.002, 0.006, 0.658, 0.012, 0.019, 0.001, 0.003, 0.0001, 0.001, + 0.07, 0.002, 0.002, 0.005, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.286, + 4.639, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.003, 0.002, 0.007, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.001, 0.137, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pnb: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.056, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.3, 0.001, 0.061, 0.0001, + 0.0001, 0.004, 0.0001, 0.019, 0.084, 0.084, 0.0001, 0.001, 0.02, 0.088, + 0.041, 0.008, 0.132, 0.201, 0.102, 0.067, 0.062, 0.067, 0.058, 0.058, + 0.067, 0.099, 0.044, 0.011, 0.014, 0.019, 0.014, 0.0001, 0.0001, 0.005, + 0.015, 0.004, 0.007, 0.004, 0.002, 0.006, 0.002, 0.006, 0.004, 0.001, + 0.002, 0.002, 0.003, 0.002, 0.003, 0.0001, 0.004, 0.004, 0.005, 0.001, + 0.001, 0.003, 0.0001, 0.0001, 0.0001, 0.016, 0.0001, 0.016, 0.0001, + 0.001, 0.001, 0.078, 0.007, 0.025, 0.032, 0.067, 0.025, 0.012, 0.031, + 0.075, 0.001, 0.005, 0.047, 0.03, 0.057, 0.061, 0.011, 0.001, 0.056, + 0.035, 0.078, 0.015, 0.016, 0.005, 0.001, 0.026, 0.001, 0.0001, 0.004, + 0.0001, 0.0001, 0.0001, 0.037, 1.78, 0.208, 0.002, 1.668, 1.155, 3.673, + 0.01, 3.168, 0.001, 0.005, 0.003, 4.417, 0.001, 0.019, 0.031, 0.026, + 0.339, 2.06, 0.022, 0.634, 0.001, 0.0001, 0.0001, 0.015, 0.009, 0.0001, + 0.004, 0.002, 0.002, 0.0001, 0.002, 0.01, 0.033, 0.198, 0.001, 0.068, + 0.002, 0.419, 5.965, 1.027, 1.695, 1.567, 0.022, 0.752, 0.178, 0.132, + 2.73, 0.025, 2.399, 0.214, 1.507, 0.366, 0.211, 0.103, 0.103, 0.037, + 0.788, 1.21, 0.001, 0.001, 0.002, 1.61, 0.001, 0.0001, 0.0001, 0.01, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.007, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 17.991, 10.598, 5.545, 8.408, 0.0001, 0.004, + 0.0001, 0.0001, 0.008, 0.001, 0.037, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + pnt: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.111, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 8.571, 0.001, 0.271, 0.0001, + 0.0001, 0.001, 0.001, 0.535, 0.166, 0.167, 0.003, 0.001, 0.374, 0.066, + 0.728, 0.006, 0.22, 0.256, 0.213, 0.123, 0.09, 0.093, 0.091, 0.105, + 0.105, 0.136, 0.082, 0.003, 0.006, 0.005, 0.006, 0.0001, 0.0001, 0.027, + 0.009, 0.018, 0.007, 0.008, 0.002, 0.007, 0.007, 0.011, 0.005, 0.01, + 0.006, 0.014, 0.004, 0.003, 0.01, 0.001, 0.009, 0.009, 0.01, 0.001, + 0.002, 0.009, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.102, 0.019, 0.03, 0.031, 0.116, 0.01, 0.025, 0.028, 0.096, + 0.002, 0.026, 0.047, 0.026, 0.078, 0.081, 0.022, 0.002, 0.09, 0.05, + 0.057, 0.045, 0.011, 0.005, 0.004, 0.012, 0.009, 0.0001, 0.182, 0.0001, + 0.0001, 0.0001, 1.086, 2.28, 1.131, 1.649, 3.333, 0.911, 0.24, 0.496, + 0.069, 0.319, 0.04, 0.001, 0.823, 0.357, 0.222, 0.002, 0.015, 0.24, + 0.073, 0.124, 0.043, 0.159, 0.008, 0.102, 0.032, 0.07, 0.198, 0.037, + 0.134, 0.044, 0.005, 0.136, 0.134, 0.042, 0.001, 0.198, 0.245, 0.005, + 0.018, 0.079, 0.003, 0.008, 0.001, 0.042, 1.012, 0.786, 0.269, 1.272, + 0.017, 4.369, 0.221, 0.746, 0.384, 2.578, 0.144, 1.385, 0.301, 1.937, + 1.463, 1.533, 1.22, 4.421, 0.103, 3.268, 0.0001, 0.0001, 0.091, 0.022, + 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.0001, 29.379, 12.776, 0.049, 0.015, 0.0001, 0.0001, 0.0001, 0.001, + 0.001, 0.003, 0.011, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.059, 0.041, 0.0001, 0.001, 0.003, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ps: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.579, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.932, 0.004, 0.044, 0.0001, + 0.0001, 0.003, 0.0001, 0.002, 0.118, 0.118, 0.001, 0.001, 0.026, 0.037, + 0.443, 0.009, 0.022, 0.03, 0.021, 0.014, 0.011, 0.012, 0.01, 0.009, + 0.01, 0.013, 0.062, 0.001, 0.002, 0.005, 0.002, 0.0001, 0.0001, 0.015, + 0.007, 0.011, 0.007, 0.006, 0.005, 0.004, 0.007, 0.009, 0.002, 0.003, + 0.005, 0.01, 0.006, 0.004, 0.009, 0.001, 0.006, 0.013, 0.009, 0.003, + 0.002, 0.003, 0.001, 0.001, 0.001, 0.004, 0.0001, 0.004, 0.0001, 0.003, + 0.0001, 0.147, 0.023, 0.055, 0.054, 0.165, 0.027, 0.031, 0.061, 0.131, + 0.002, 0.012, 0.073, 0.048, 0.109, 0.113, 0.034, 0.002, 0.103, 0.097, + 0.116, 0.047, 0.015, 0.017, 0.005, 0.027, 0.004, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.103, 0.528, 0.202, 0.231, 2.393, 1.822, 2.655, 3.163, + 4.608, 0.307, 2.451, 0.006, 1.513, 0.136, 0.015, 0.009, 1.675, 0.004, + 0.009, 0.507, 0.005, 0.0001, 0.154, 0.001, 0.093, 0.002, 0.229, 0.007, + 0.005, 0.003, 0.0001, 0.006, 0.024, 0.025, 0.048, 0.014, 0.025, 0.008, + 0.038, 4.145, 0.839, 1.375, 1.43, 0.077, 0.25, 0.229, 0.647, 2.983, + 0.085, 2.528, 0.449, 1.14, 0.525, 0.146, 0.073, 0.106, 0.064, 0.333, + 0.407, 0.02, 0.265, 0.005, 1.278, 0.002, 0.0001, 0.0001, 0.016, 0.003, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.028, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 16.081, 19.012, 3.763, 3.368, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.0001, 0.026, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.038, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + qu: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 3.204, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.108, 0.002, 0.638, 0.0001, + 0.0001, 0.004, 0.002, 0.39, 0.494, 0.494, 0.05, 0.002, 1.04, 0.188, + 0.977, 0.036, 0.261, 0.409, 0.214, 0.137, 0.12, 0.137, 0.117, 0.112, + 0.136, 0.208, 0.401, 0.061, 0.041, 0.006, 0.041, 0.004, 0.0001, 0.371, + 0.173, 0.36, 0.119, 0.076, 0.064, 0.097, 0.189, 0.192, 0.096, 0.255, + 0.187, 0.305, 0.078, 0.042, 0.428, 0.148, 0.146, 0.31, 0.198, 0.198, + 0.061, 0.174, 0.014, 0.102, 0.014, 0.014, 0.0001, 0.015, 0.0001, 0.002, + 0.0001, 14.813, 0.229, 1.579, 0.795, 1.296, 0.084, 0.286, 2.331, 7.773, + 0.067, 3.004, 4.09, 3.086, 5.006, 1.165, 2.96, 3.746, 3.293, 3.447, + 3.494, 5.678, 0.135, 1.682, 0.024, 2.244, 0.111, 0.0001, 0.003, 0.001, + 0.0001, 0.0001, 0.055, 0.016, 0.009, 0.013, 0.008, 0.006, 0.004, 0.006, + 0.004, 0.004, 0.003, 0.002, 0.006, 0.007, 0.003, 0.002, 0.012, 0.023, + 0.002, 0.011, 0.004, 0.004, 0.003, 0.002, 0.004, 0.015, 0.003, 0.003, + 0.005, 0.003, 0.002, 0.003, 0.038, 0.068, 0.004, 0.005, 0.014, 0.005, + 0.006, 0.009, 0.007, 0.056, 0.005, 0.005, 0.005, 0.075, 0.004, 0.006, + 0.014, 0.34, 0.013, 0.069, 0.007, 0.008, 0.006, 0.005, 0.016, 0.009, + 0.022, 0.008, 0.011, 0.009, 0.01, 0.01, 0.0001, 0.0001, 0.026, 0.649, + 0.01, 0.009, 0.001, 0.001, 0.0001, 0.002, 0.001, 0.008, 0.002, 0.0001, + 0.042, 0.02, 0.051, 0.016, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.006, + 0.016, 0.012, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.031, 0.016, + 0.047, 0.001, 0.001, 0.006, 0.005, 0.002, 0.002, 0.002, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + rm: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.612, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.511, 0.003, 0.167, 0.0001, + 0.0001, 0.015, 0.0001, 0.104, 0.151, 0.151, 0.003, 0.0001, 0.439, 0.065, + 0.823, 0.012, 0.199, 0.275, 0.114, 0.07, 0.072, 0.078, 0.067, 0.073, + 0.099, 0.138, 0.045, 0.054, 0.005, 0.002, 0.005, 0.002, 0.0001, 0.139, + 0.111, 0.151, 0.1, 0.17, 0.069, 0.113, 0.045, 0.217, 0.028, 0.029, + 0.208, 0.121, 0.055, 0.036, 0.132, 0.042, 0.086, 0.226, 0.106, 0.051, + 0.07, 0.023, 0.003, 0.003, 0.008, 0.002, 0.0001, 0.002, 0.0001, 0.0001, + 0.001, 11.404, 0.601, 3.031, 3.677, 6.353, 0.757, 1.578, 1.412, 6.549, + 0.076, 0.068, 4.778, 1.866, 6.046, 2.159, 1.856, 0.265, 4.97, 5.963, + 4.375, 3.712, 1.407, 0.03, 0.131, 0.049, 0.802, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.828, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.043, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.675, 0.0001, 0.001, 0.003, 0.001, 0.001, 0.0001, 0.294, 0.003, 0.002, + 0.0001, 0.006, 0.001, 0.001, 0.002, 0.333, 0.017, 0.002, 0.02, 0.128, + 0.003, 0.0001, 0.001, 0.004, 0.002, 0.027, 0.004, 0.001, 0.001, 0.012, + 0.0001, 0.001, 0.054, 0.054, 0.02, 0.042, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.079, 0.841, 0.004, 0.004, 0.0001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.002, 0.005, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.828, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + rmy: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.439, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.022, 0.009, 0.624, 0.001, + 0.0001, 0.014, 0.003, 0.015, 0.443, 0.441, 0.003, 0.003, 1.038, 0.232, + 0.983, 0.037, 0.243, 0.24, 0.172, 0.071, 0.075, 0.081, 0.064, 0.056, + 0.058, 0.153, 0.179, 0.028, 0.0001, 0.007, 0.0001, 0.007, 0.0001, 0.429, + 0.231, 0.183, 0.167, 0.219, 0.086, 0.091, 0.078, 0.193, 0.094, 0.424, + 0.255, 0.23, 0.124, 0.22, 0.316, 0.009, 0.404, 0.577, 0.193, 0.066, + 0.142, 0.014, 0.008, 0.107, 0.022, 0.003, 0.0001, 0.004, 0.0001, 0.001, + 0.001, 10.986, 1.012, 0.769, 2.129, 6.975, 0.334, 0.958, 2.547, 6.287, + 0.364, 2.952, 3.16, 1.944, 5.241, 5.031, 1.512, 0.108, 4.343, 3.649, + 3.301, 2.127, 1.805, 0.051, 0.119, 2.702, 0.234, 0.0001, 0.003, 0.001, + 0.001, 0.0001, 0.065, 0.024, 0.024, 0.136, 0.011, 0.006, 0.01, 0.023, + 0.009, 0.001, 0.005, 0.016, 0.01, 0.054, 0.02, 0.004, 0.003, 0.007, + 0.001, 0.025, 0.008, 0.009, 0.004, 0.007, 0.004, 0.054, 0.005, 0.044, + 0.006, 0.002, 0.003, 0.008, 0.038, 0.056, 0.061, 0.004, 0.069, 0.023, + 0.011, 0.016, 0.012, 0.016, 0.02, 0.006, 0.003, 0.014, 0.084, 0.01, + 0.051, 0.028, 0.039, 0.03, 0.013, 0.014, 0.009, 0.007, 0.027, 0.007, + 0.021, 0.023, 0.024, 0.034, 0.062, 0.014, 0.0001, 0.0001, 0.036, 0.28, + 0.165, 0.061, 0.0001, 0.011, 0.089, 0.002, 0.001, 0.002, 0.0001, 0.0001, + 0.007, 0.003, 0.242, 0.129, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.008, 0.026, 0.02, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.128, 0.005, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.003, 0.004, 0.002, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + rn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.466, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.984, 0.029, 0.062, 0.0001, + 0.0001, 0.003, 0.0001, 0.574, 0.079, 0.089, 0.011, 0.0001, 1.075, 0.049, + 1.054, 0.052, 0.102, 0.296, 0.219, 0.136, 0.097, 0.085, 0.071, 0.069, + 0.063, 0.086, 0.222, 0.076, 0.048, 0.0001, 0.048, 0.055, 0.0001, 0.35, + 0.153, 0.043, 0.033, 0.087, 0.042, 0.05, 0.106, 0.336, 0.016, 0.136, + 0.035, 0.208, 0.24, 0.02, 0.055, 0.001, 0.138, 0.132, 0.082, 0.29, + 0.029, 0.019, 0.0001, 0.195, 0.032, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 10.973, 3.104, 0.817, 1.265, 5.117, 0.295, 2.193, 1.806, + 7.318, 0.542, 2.677, 0.668, 3.393, 5.179, 4.081, 0.677, 0.004, 4.518, + 2.135, 2.161, 5.935, 1.185, 2.07, 0.007, 2.3, 1.432, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.174, 0.023, 0.002, 0.005, 0.007, 0.004, 0.003, + 0.003, 0.006, 0.0001, 0.004, 0.0001, 0.015, 0.271, 0.012, 0.002, 0.008, + 0.004, 0.004, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.284, + 0.0001, 0.196, 0.005, 0.002, 0.004, 0.014, 0.082, 0.437, 0.009, 0.0001, + 0.0001, 0.006, 0.001, 0.018, 0.002, 0.13, 0.002, 0.17, 0.0001, 0.586, + 0.007, 0.108, 0.004, 0.019, 0.001, 0.014, 0.007, 0.001, 0.01, 0.001, + 0.001, 0.002, 0.049, 0.153, 0.015, 0.123, 0.121, 0.0001, 0.0001, 0.0001, + 0.386, 1.335, 0.539, 0.45, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.015, 0.006, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.02, 0.053, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.167, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + rue: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.059, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.931, 0.003, 0.134, 0.004, + 0.0001, 0.006, 0.0001, 0.004, 0.175, 0.175, 0.004, 0.001, 0.601, 0.077, + 0.708, 0.007, 0.16, 0.303, 0.147, 0.097, 0.093, 0.095, 0.084, 0.09, + 0.099, 0.137, 0.031, 0.011, 0.003, 0.006, 0.002, 0.001, 0.0001, 0.009, + 0.006, 0.011, 0.005, 0.005, 0.004, 0.005, 0.007, 0.017, 0.002, 0.003, + 0.006, 0.008, 0.01, 0.004, 0.008, 0.0001, 0.006, 0.012, 0.008, 0.004, + 0.005, 0.003, 0.005, 0.001, 0.001, 0.002, 0.011, 0.003, 0.0001, 0.004, + 0.0001, 0.091, 0.013, 0.033, 0.032, 0.099, 0.015, 0.014, 0.02, 0.081, + 0.006, 0.012, 0.045, 0.028, 0.055, 0.071, 0.018, 0.002, 0.069, 0.058, + 0.052, 0.039, 0.016, 0.006, 0.004, 0.014, 0.011, 0.002, 0.0001, 0.002, + 0.0001, 0.0001, 2.51, 1.935, 2.11, 1.119, 0.168, 0.507, 0.468, 0.486, + 0.356, 0.046, 0.009, 1.422, 0.678, 0.003, 0.239, 0.784, 0.089, 0.301, + 0.121, 0.074, 0.371, 0.035, 1.647, 0.529, 0.012, 0.009, 0.09, 0.04, + 0.101, 0.07, 0.061, 0.137, 0.108, 0.152, 0.055, 0.234, 0.024, 0.016, + 0.017, 0.032, 0.025, 0.005, 0.001, 0.015, 0.002, 0.004, 0.009, 0.015, + 3.672, 0.621, 2.19, 0.526, 1.267, 2.143, 0.348, 0.764, 1.53, 0.62, + 1.849, 1.595, 1.255, 2.617, 4.166, 1.0, 0.0001, 0.0001, 0.065, 0.026, + 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.006, + 0.0001, 0.02, 0.009, 27.547, 15.28, 0.159, 0.0001, 0.0001, 0.001, 0.001, + 0.004, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.005, 0.004, 0.115, 0.004, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + rw: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.278, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.768, 0.007, 0.605, 0.0001, + 0.0001, 0.01, 0.005, 0.156, 0.48, 0.479, 0.0001, 0.001, 0.554, 0.104, + 0.846, 0.03, 0.199, 0.216, 0.155, 0.113, 0.085, 0.082, 0.092, 0.069, + 0.073, 0.138, 0.279, 0.158, 0.014, 0.006, 0.014, 0.022, 0.0001, 0.463, + 0.203, 0.115, 0.093, 0.067, 0.068, 0.134, 0.078, 0.521, 0.056, 0.247, + 0.076, 0.283, 0.278, 0.063, 0.134, 0.006, 0.219, 0.18, 0.135, 0.469, + 0.053, 0.038, 0.003, 0.047, 0.033, 0.002, 0.005, 0.003, 0.0001, 0.005, + 0.003, 10.187, 2.795, 0.85, 1.072, 4.678, 0.399, 2.704, 1.553, 8.747, + 0.332, 2.605, 0.938, 3.443, 4.833, 3.164, 0.42, 0.036, 4.477, 2.07, + 2.396, 6.084, 0.329, 1.941, 0.023, 2.813, 1.358, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.976, 0.03, 0.025, 0.03, 0.043, 0.049, 0.025, 0.021, + 0.028, 0.009, 0.036, 0.011, 0.018, 0.014, 0.026, 0.013, 0.02, 0.015, + 0.01, 0.15, 0.008, 0.015, 0.009, 0.008, 0.011, 0.787, 0.007, 0.008, + 0.021, 0.011, 0.011, 0.034, 0.016, 0.016, 0.009, 0.011, 0.025, 0.012, + 0.025, 0.083, 0.028, 0.057, 0.013, 0.014, 0.038, 0.019, 0.024, 0.039, + 0.055, 0.067, 0.03, 0.036, 0.018, 0.034, 0.017, 0.013, 0.045, 0.024, + 0.03, 0.026, 0.034, 0.02, 0.028, 0.012, 0.0001, 0.0001, 0.03, 0.13, + 0.052, 0.028, 0.001, 0.001, 0.001, 0.009, 0.002, 0.001, 0.003, 0.0001, + 0.02, 0.007, 0.21, 0.107, 0.008, 0.005, 0.001, 0.006, 0.005, 0.025, + 0.234, 0.162, 0.005, 0.009, 0.0001, 0.0001, 0.009, 0.0001, 0.108, 0.055, + 0.961, 0.001, 0.002, 0.013, 0.008, 0.004, 0.003, 0.002, 0.001, 0.001, + 0.003, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + sa: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.358, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.441, 0.003, 0.019, 0.0001, + 0.0001, 0.003, 0.0001, 0.034, 0.04, 0.042, 0.0001, 0.001, 0.189, 0.124, + 0.061, 0.009, 0.003, 0.004, 0.003, 0.002, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.002, 0.022, 0.001, 0.005, 0.003, 0.005, 0.005, 0.0001, 0.002, + 0.001, 0.007, 0.001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, + 0.001, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.003, 0.002, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 0.036, 0.006, 0.009, 0.018, 0.033, 0.003, 0.005, 0.01, + 0.026, 0.001, 0.003, 0.015, 0.009, 0.022, 0.022, 0.013, 0.0001, 0.02, + 0.014, 0.02, 0.007, 0.002, 0.005, 0.001, 0.004, 0.0001, 0.0001, 0.003, + 0.0001, 0.0001, 0.0001, 0.485, 0.531, 0.737, 0.892, 0.001, 0.437, 0.14, + 1.014, 0.103, 0.083, 0.003, 0.31, 0.053, 4.186, 0.001, 0.123, 0.004, + 0.001, 0.0001, 0.016, 0.005, 0.929, 0.077, 0.397, 0.036, 0.098, 0.308, + 0.026, 0.311, 0.017, 0.076, 0.146, 0.037, 0.11, 0.008, 0.362, 26.378, + 7.803, 0.723, 0.32, 1.5, 0.025, 0.84, 0.05, 0.176, 0.36, 1.148, 1.481, + 1.847, 0.0001, 0.431, 0.017, 0.001, 1.168, 0.412, 0.409, 1.347, 0.264, + 0.0001, 0.0001, 0.002, 0.029, 2.443, 1.602, 0.0001, 0.0001, 0.006, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 31.344, 0.0001, 0.071, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sah: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.686, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.508, 0.002, 0.063, 0.0001, + 0.0001, 0.006, 0.0001, 0.001, 0.091, 0.092, 0.0001, 0.001, 0.559, 0.22, + 0.713, 0.008, 0.141, 0.211, 0.115, 0.061, 0.06, 0.065, 0.051, 0.05, + 0.056, 0.124, 0.035, 0.013, 0.006, 0.002, 0.006, 0.002, 0.0001, 0.005, + 0.004, 0.005, 0.003, 0.002, 0.002, 0.002, 0.002, 0.017, 0.001, 0.002, + 0.002, 0.004, 0.003, 0.002, 0.003, 0.0001, 0.002, 0.006, 0.004, 0.001, + 0.004, 0.001, 0.007, 0.002, 0.0001, 0.003, 0.0001, 0.003, 0.0001, 0.004, + 0.0001, 0.029, 0.008, 0.012, 0.008, 0.028, 0.005, 0.006, 0.038, 0.023, + 0.001, 0.004, 0.015, 0.01, 0.02, 0.025, 0.007, 0.0001, 0.024, 0.015, + 0.017, 0.012, 0.003, 0.003, 0.001, 0.005, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 3.31, 1.601, 3.034, 2.129, 0.054, 0.947, 0.056, 0.303, + 0.028, 0.008, 0.002, 2.384, 0.325, 2.811, 0.018, 0.129, 0.129, 0.118, + 0.035, 0.051, 0.111, 0.426, 0.011, 0.007, 0.063, 0.002, 0.123, 0.02, + 0.075, 0.059, 0.083, 0.041, 0.09, 0.172, 0.066, 0.042, 0.018, 0.342, + 0.005, 0.017, 0.028, 0.688, 0.0001, 0.065, 0.003, 0.027, 0.027, 0.911, + 6.03, 1.253, 0.256, 0.681, 0.862, 0.464, 0.024, 0.065, 2.76, 0.764, + 1.431, 3.082, 0.589, 3.175, 2.114, 0.327, 0.0001, 0.0001, 0.173, 0.003, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.002, + 0.0001, 0.002, 0.001, 24.486, 17.038, 2.234, 0.706, 0.0001, 0.001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.102, 0.001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sc: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.057, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.585, 0.005, 0.337, 0.0001, + 0.0001, 0.01, 0.001, 0.519, 0.179, 0.179, 0.0001, 0.001, 0.997, 0.097, + 0.746, 0.025, 0.237, 0.292, 0.15, 0.087, 0.082, 0.09, 0.079, 0.083, + 0.093, 0.166, 0.067, 0.032, 0.007, 0.002, 0.008, 0.003, 0.0001, 0.224, + 0.132, 0.261, 0.092, 0.103, 0.086, 0.108, 0.028, 0.255, 0.028, 0.024, + 0.103, 0.181, 0.091, 0.054, 0.171, 0.006, 0.093, 0.455, 0.116, 0.064, + 0.058, 0.024, 0.025, 0.008, 0.012, 0.012, 0.0001, 0.012, 0.0001, 0.0001, + 0.0001, 9.363, 0.921, 2.394, 4.179, 7.513, 0.745, 1.075, 0.764, 6.94, + 0.075, 0.096, 1.956, 1.851, 5.606, 4.069, 1.688, 0.018, 4.534, 7.393, + 5.178, 5.316, 0.445, 0.037, 0.029, 0.067, 0.854, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.107, 0.01, 0.006, 0.008, 0.004, 0.002, 0.002, 0.003, + 0.006, 0.002, 0.002, 0.002, 0.006, 0.004, 0.002, 0.001, 0.003, 0.002, + 0.003, 0.008, 0.004, 0.001, 0.002, 0.001, 0.003, 0.058, 0.001, 0.002, + 0.016, 0.017, 0.001, 0.001, 0.306, 0.009, 0.002, 0.003, 0.003, 0.002, + 0.001, 0.004, 0.232, 0.016, 0.003, 0.007, 0.252, 0.007, 0.001, 0.002, + 0.008, 0.007, 0.176, 0.008, 0.002, 0.004, 0.003, 0.006, 0.005, 0.096, + 0.007, 0.007, 0.006, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.032, 1.097, + 0.007, 0.006, 0.0001, 0.0001, 0.0001, 0.011, 0.003, 0.007, 0.001, + 0.0001, 0.018, 0.009, 0.023, 0.009, 0.0001, 0.0001, 0.0001, 0.003, + 0.001, 0.003, 0.006, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.006, 0.096, 0.007, 0.001, 0.002, 0.002, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + scn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.769, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.859, 0.005, 0.376, 0.001, + 0.0001, 0.006, 0.001, 0.62, 0.187, 0.189, 0.001, 0.001, 0.862, 0.093, + 0.813, 0.026, 0.237, 0.31, 0.158, 0.093, 0.09, 0.099, 0.092, 0.087, + 0.104, 0.161, 0.085, 0.032, 0.027, 0.008, 0.034, 0.003, 0.0001, 0.211, + 0.12, 0.299, 0.095, 0.077, 0.106, 0.122, 0.053, 0.143, 0.031, 0.023, + 0.333, 0.207, 0.158, 0.044, 0.198, 0.02, 0.123, 0.32, 0.125, 0.061, + 0.101, 0.022, 0.022, 0.008, 0.012, 0.019, 0.0001, 0.019, 0.0001, 0.007, + 0.001, 8.698, 0.715, 3.649, 2.751, 2.764, 0.729, 1.223, 0.71, 11.435, + 0.098, 0.087, 3.105, 2.009, 5.881, 1.955, 1.977, 0.125, 4.751, 3.262, + 4.998, 7.156, 1.012, 0.04, 0.022, 0.077, 0.978, 0.0001, 0.006, 0.0001, + 0.0001, 0.0001, 0.123, 0.005, 0.005, 0.005, 0.003, 0.001, 0.002, 0.001, + 0.009, 0.002, 0.001, 0.001, 0.004, 0.003, 0.001, 0.001, 0.001, 0.002, + 0.002, 0.01, 0.003, 0.001, 0.002, 0.001, 0.012, 0.059, 0.001, 0.002, + 0.014, 0.013, 0.001, 0.001, 0.271, 0.006, 0.312, 0.002, 0.001, 0.001, + 0.001, 0.004, 0.478, 0.013, 0.046, 0.017, 0.359, 0.007, 0.096, 0.002, + 0.008, 0.004, 0.23, 0.006, 0.189, 0.003, 0.002, 0.003, 0.004, 0.145, + 0.006, 0.184, 0.003, 0.004, 0.002, 0.003, 0.0001, 0.0001, 0.038, 2.342, + 0.007, 0.007, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.018, 0.008, 0.018, 0.009, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.006, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.006, 0.107, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sco: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.424, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.792, 0.003, 0.394, 0.001, + 0.002, 0.018, 0.003, 0.122, 0.265, 0.265, 0.001, 0.001, 1.079, 0.194, + 0.878, 0.014, 0.365, 0.437, 0.262, 0.125, 0.119, 0.131, 0.116, 0.116, + 0.135, 0.238, 0.065, 0.052, 0.004, 0.002, 0.004, 0.001, 0.0001, 0.38, + 0.213, 0.323, 0.162, 0.132, 0.149, 0.164, 0.147, 0.281, 0.103, 0.117, + 0.162, 0.281, 0.134, 0.098, 0.228, 0.015, 0.18, 0.416, 0.389, 0.071, + 0.084, 0.096, 0.009, 0.031, 0.022, 0.004, 0.0001, 0.004, 0.0001, 0.0001, + 0.001, 7.525, 0.973, 2.32, 1.915, 9.145, 0.867, 0.966, 3.175, 6.858, + 0.086, 0.556, 2.986, 1.72, 5.779, 4.854, 1.317, 0.066, 4.925, 4.607, + 6.432, 2.109, 0.676, 1.003, 0.125, 1.018, 0.144, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.052, 0.009, 0.005, 0.004, 0.004, 0.003, 0.002, 0.004, + 0.002, 0.003, 0.002, 0.001, 0.002, 0.005, 0.001, 0.002, 0.001, 0.002, + 0.001, 0.033, 0.006, 0.001, 0.002, 0.002, 0.002, 0.009, 0.001, 0.002, + 0.003, 0.003, 0.001, 0.005, 0.039, 0.026, 0.003, 0.006, 0.015, 0.004, + 0.002, 0.007, 0.005, 0.025, 0.002, 0.006, 0.002, 0.019, 0.001, 0.002, + 0.01, 0.012, 0.013, 0.016, 0.004, 0.005, 0.011, 0.002, 0.007, 0.003, + 0.007, 0.003, 0.009, 0.004, 0.004, 0.002, 0.0001, 0.0001, 0.051, 0.152, + 0.018, 0.014, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.011, 0.005, 0.019, 0.007, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.002, 0.009, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.008, 0.005, 0.05, 0.001, 0.001, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sd: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.527, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.452, 0.004, 0.026, 0.001, + 0.0001, 0.002, 0.0001, 0.004, 0.108, 0.108, 0.004, 0.001, 0.009, 0.252, + 0.565, 0.015, 0.09, 0.18, 0.083, 0.051, 0.047, 0.052, 0.047, 0.048, + 0.055, 0.112, 0.038, 0.003, 0.004, 0.004, 0.004, 0.0001, 0.0001, 0.01, + 0.007, 0.009, 0.005, 0.004, 0.003, 0.004, 0.004, 0.005, 0.002, 0.003, + 0.004, 0.007, 0.004, 0.003, 0.007, 0.001, 0.004, 0.011, 0.007, 0.002, + 0.002, 0.003, 0.0001, 0.001, 0.0001, 0.005, 0.0001, 0.005, 0.001, 0.003, + 0.0001, 0.093, 0.018, 0.025, 0.03, 0.086, 0.014, 0.018, 0.031, 0.075, + 0.002, 0.009, 0.041, 0.026, 0.061, 0.064, 0.018, 0.001, 0.061, 0.048, + 0.062, 0.025, 0.01, 0.009, 0.005, 0.016, 0.003, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.358, 0.355, 0.367, 0.044, 1.492, 1.56, 3.771, 2.24, + 3.043, 0.003, 5.411, 0.006, 0.747, 0.045, 0.229, 0.346, 0.139, 0.006, + 0.013, 0.002, 0.041, 0.001, 0.001, 0.003, 0.036, 0.237, 0.0001, 0.007, + 0.063, 0.063, 0.001, 0.009, 0.066, 0.346, 0.511, 0.005, 0.013, 0.004, + 0.6, 4.552, 0.858, 0.458, 2.417, 0.053, 1.486, 0.357, 0.248, 1.426, + 0.07, 2.412, 0.238, 1.475, 0.403, 0.209, 0.078, 0.141, 0.068, 0.553, + 0.222, 0.578, 0.001, 0.647, 1.291, 0.291, 0.0001, 0.0001, 0.065, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 17.302, 19.772, 4.118, 0.84, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.198, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.104, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + se: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.476, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.534, 0.002, 0.233, 0.001, + 0.001, 0.008, 0.001, 0.011, 0.255, 0.258, 0.0001, 0.001, 1.05, 0.297, + 1.247, 0.015, 0.373, 0.513, 0.317, 0.174, 0.148, 0.157, 0.145, 0.145, + 0.159, 0.258, 0.106, 0.008, 0.018, 0.002, 0.018, 0.002, 0.0001, 0.188, + 0.166, 0.071, 0.251, 0.09, 0.093, 0.235, 0.162, 0.082, 0.134, 0.245, + 0.18, 0.186, 0.183, 0.112, 0.147, 0.004, 0.206, 0.487, 0.123, 0.053, + 0.171, 0.019, 0.003, 0.015, 0.006, 0.005, 0.0001, 0.005, 0.0001, 0.001, + 0.0001, 10.038, 0.915, 0.217, 3.327, 5.602, 0.262, 2.678, 1.589, 6.671, + 1.512, 2.136, 5.043, 2.364, 3.492, 4.102, 0.745, 0.01, 2.956, 3.613, + 3.601, 3.337, 2.349, 0.035, 0.018, 0.282, 0.057, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.058, 0.044, 0.003, 0.004, 0.008, 0.009, 0.002, 0.003, + 0.002, 0.002, 0.001, 0.119, 0.035, 0.369, 0.001, 0.002, 0.002, 0.302, + 0.004, 0.024, 0.002, 0.002, 0.006, 0.001, 0.007, 0.006, 0.003, 0.005, + 0.009, 0.024, 0.001, 0.003, 0.073, 3.336, 0.013, 0.002, 0.299, 0.044, + 0.019, 0.052, 0.004, 0.017, 0.001, 0.011, 0.001, 0.006, 0.001, 0.004, + 0.019, 0.004, 0.042, 0.006, 0.01, 0.008, 0.063, 0.001, 0.053, 0.001, + 0.006, 0.009, 0.008, 0.006, 0.098, 0.001, 0.0001, 0.0001, 0.118, 3.226, + 0.711, 1.0, 0.0001, 0.004, 0.002, 0.001, 0.002, 0.001, 0.001, 0.0001, + 0.008, 0.003, 0.027, 0.008, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.003, 0.004, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.008, 0.055, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sg: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 3.098, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.879, 0.044, 0.115, 0.0001, + 0.0001, 0.0001, 0.0001, 0.013, 0.198, 0.211, 0.0001, 0.0001, 0.85, + 0.464, 1.499, 0.007, 0.524, 0.5, 0.381, 0.203, 0.246, 0.244, 0.244, + 0.191, 0.262, 0.229, 0.082, 0.038, 0.0001, 0.0001, 0.0001, 0.029, + 0.0001, 0.282, 0.315, 0.126, 0.106, 0.101, 0.06, 0.092, 0.086, 0.092, + 0.093, 0.251, 0.348, 0.227, 0.266, 0.057, 0.128, 0.0001, 0.081, 0.346, + 0.343, 0.013, 0.053, 0.416, 0.005, 0.029, 0.062, 0.002, 0.0001, 0.002, + 0.0001, 0.015, 0.0001, 5.706, 1.515, 0.218, 1.433, 4.537, 0.262, 2.208, + 0.762, 2.069, 0.092, 2.86, 1.7, 1.242, 5.365, 3.328, 0.599, 0.022, 1.81, + 1.981, 3.619, 0.984, 0.189, 0.434, 0.086, 1.565, 0.929, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.013, 0.004, 0.029, 0.0001, 0.015, 0.0001, + 0.0001, 0.007, 0.004, 0.002, 0.007, 0.016, 0.004, 0.004, 0.022, 0.015, + 0.018, 0.0001, 0.004, 0.007, 0.022, 0.0001, 0.009, 0.004, 0.0001, 0.005, + 0.0001, 0.016, 0.002, 0.0001, 0.002, 0.059, 0.007, 0.009, 1.785, 0.013, + 1.12, 0.007, 0.002, 0.044, 0.027, 0.112, 1.609, 0.647, 0.002, 0.026, + 3.804, 0.577, 0.007, 0.004, 0.0001, 0.022, 0.564, 0.0001, 1.689, 0.002, + 0.005, 0.046, 0.002, 0.403, 0.176, 0.0001, 0.004, 0.002, 0.0001, 0.0001, + 0.0001, 12.759, 0.005, 0.07, 0.0001, 0.007, 0.0001, 0.007, 0.0001, + 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.024, 0.011, 0.007, 0.0001, 0.0001, 0.015, + 0.004, 0.002, 0.0001, 0.002, 0.002, 0.004, 0.007, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sh: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.387, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.061, 0.002, 0.275, 0.0001, + 0.001, 0.015, 0.001, 0.014, 0.187, 0.187, 0.0001, 0.002, 0.95, 0.147, + 1.223, 0.02, 0.376, 0.495, 0.321, 0.161, 0.177, 0.142, 0.127, 0.123, + 0.133, 0.217, 0.047, 0.016, 0.003, 0.003, 0.003, 0.002, 0.0001, 0.169, + 0.152, 0.152, 0.124, 0.074, 0.068, 0.115, 0.09, 0.132, 0.082, 0.135, + 0.104, 0.207, 0.208, 0.116, 0.297, 0.005, 0.117, 0.252, 0.137, 0.082, + 0.102, 0.023, 0.008, 0.009, 0.058, 0.012, 0.0001, 0.012, 0.0001, 0.003, + 0.0001, 8.404, 0.811, 0.782, 2.282, 6.596, 0.226, 1.221, 0.511, 7.186, + 3.593, 2.512, 2.698, 2.143, 5.119, 6.434, 1.798, 0.011, 3.759, 3.618, + 2.964, 3.066, 2.297, 0.032, 0.02, 0.068, 1.245, 0.001, 0.003, 0.001, + 0.0001, 0.0001, 0.106, 0.072, 0.05, 0.059, 0.003, 0.006, 0.013, 0.266, + 0.014, 0.001, 0.001, 0.001, 0.012, 0.537, 0.001, 0.001, 0.005, 0.13, + 0.005, 0.01, 0.006, 0.001, 0.001, 0.002, 0.039, 0.019, 0.011, 0.012, + 0.016, 0.006, 0.015, 0.006, 0.037, 0.532, 0.005, 0.005, 0.003, 0.001, + 0.001, 0.002, 0.003, 0.013, 0.001, 0.004, 0.001, 0.013, 0.001, 0.001, + 0.155, 0.023, 0.063, 0.029, 0.039, 0.108, 0.009, 0.019, 0.119, 0.002, + 0.045, 0.036, 0.04, 0.092, 0.525, 0.041, 0.0001, 0.0001, 0.038, 0.074, + 0.943, 0.945, 0.0001, 0.0001, 0.009, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.013, 0.006, 0.916, 0.332, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.003, 0.045, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + si: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.314, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 5.928, 0.001, 0.061, 0.001, + 0.001, 0.005, 0.0001, 0.009, 0.059, 0.059, 0.0001, 0.001, 0.185, 0.034, + 0.404, 0.009, 0.086, 0.094, 0.056, 0.028, 0.026, 0.03, 0.026, 0.025, + 0.029, 0.049, 0.012, 0.004, 0.002, 0.002, 0.002, 0.002, 0.0001, 0.015, + 0.008, 0.015, 0.008, 0.007, 0.006, 0.005, 0.007, 0.015, 0.002, 0.003, + 0.006, 0.01, 0.006, 0.006, 0.01, 0.001, 0.006, 0.015, 0.013, 0.004, + 0.004, 0.005, 0.001, 0.001, 0.001, 0.005, 0.0001, 0.005, 0.0001, 0.003, + 0.0001, 0.173, 0.028, 0.067, 0.071, 0.23, 0.039, 0.038, 0.081, 0.157, + 0.003, 0.016, 0.086, 0.051, 0.142, 0.142, 0.042, 0.002, 0.132, 0.124, + 0.159, 0.054, 0.019, 0.027, 0.007, 0.032, 0.003, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 2.252, 0.201, 0.275, 1.149, 0.707, 0.497, 0.106, 0.13, + 0.003, 0.08, 2.719, 0.062, 0.013, 0.472, 0.0001, 1.466, 0.446, 0.166, + 2.231, 0.489, 1.129, 0.007, 0.144, 0.0001, 0.039, 0.612, 2.039, 0.034, + 0.759, 0.19, 0.015, 0.026, 0.094, 0.008, 0.192, 0.001, 0.005, 0.01, + 0.001, 0.537, 0.012, 0.162, 0.001, 0.275, 0.003, 1.26, 0.067, 0.843, + 0.165, 1.921, 0.001, 0.089, 0.809, 0.008, 15.577, 14.437, 1.305, 0.017, + 1.681, 1.481, 0.0001, 0.796, 0.0001, 0.001, 0.0001, 0.0001, 0.014, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 29.588, 0.0001, 0.504, 0.001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sm: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.213, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 19.463, 0.008, 0.168, 0.0001, + 0.003, 0.014, 0.002, 0.885, 0.148, 0.148, 0.0001, 0.001, 1.0, 0.173, + 0.914, 0.009, 0.254, 0.312, 0.179, 0.14, 0.095, 0.115, 0.095, 0.086, + 0.112, 0.168, 0.033, 0.027, 0.006, 0.002, 0.006, 0.005, 0.0001, 0.462, + 0.087, 0.119, 0.039, 0.23, 0.233, 0.074, 0.06, 0.345, 0.031, 0.147, + 0.149, 0.348, 0.135, 0.431, 0.236, 0.003, 0.115, 0.459, 0.28, 0.072, + 0.088, 0.128, 0.02, 0.007, 0.009, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.001, 15.436, 0.147, 0.251, 0.268, 7.552, 1.798, 1.939, 0.261, 7.65, + 0.014, 0.507, 6.117, 2.84, 3.141, 6.14, 1.094, 0.011, 1.189, 2.656, + 4.384, 4.707, 0.608, 0.084, 0.018, 0.145, 0.038, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.05, 0.151, 0.0001, 0.004, 0.001, 0.0001, 0.0001, + 0.0001, 0.002, 0.001, 0.001, 0.003, 0.002, 0.017, 0.002, 0.001, 0.003, + 0.0001, 0.0001, 0.02, 0.001, 0.001, 0.0001, 0.001, 0.039, 0.002, 0.001, + 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.011, + 0.001, 0.001, 0.001, 0.001, 0.001, 0.006, 0.001, 0.028, 0.001, 0.004, + 0.001, 0.001, 0.003, 0.003, 0.001, 0.003, 0.002, 0.002, 0.0001, 0.001, + 0.002, 0.001, 0.002, 0.086, 0.003, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.005, 0.033, 0.176, 0.042, 0.0001, 0.0001, 0.0001, 0.001, 0.085, 0.001, + 0.0001, 0.0001, 0.007, 0.0001, 0.006, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.012, 0.046, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.427, 0.001, 0.194, 0.0001, + 0.001, 0.007, 0.003, 0.024, 0.281, 0.281, 0.0001, 0.005, 0.597, 0.124, + 0.956, 0.038, 0.114, 0.113, 0.073, 0.04, 0.036, 0.036, 0.026, 0.025, + 0.034, 0.053, 0.08, 0.124, 0.002, 0.009, 0.002, 0.006, 0.0001, 0.169, + 0.097, 0.234, 0.083, 0.107, 0.043, 0.1, 0.097, 0.095, 0.037, 0.196, + 0.037, 0.454, 0.178, 0.024, 0.119, 0.003, 0.094, 0.231, 0.097, 0.036, + 0.089, 0.031, 0.003, 0.009, 0.113, 0.039, 0.0001, 0.038, 0.0001, 0.002, + 0.0001, 12.237, 1.335, 1.505, 2.374, 5.54, 0.412, 1.524, 3.199, 8.126, + 0.115, 3.86, 0.667, 3.205, 6.578, 4.667, 1.202, 0.019, 4.537, 2.41, + 2.721, 5.562, 2.325, 2.211, 0.043, 1.41, 2.325, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 0.012, 0.003, 0.001, 0.003, 0.001, 0.001, 0.001, 0.0001, + 0.017, 0.001, 0.004, 0.001, 0.004, 0.0001, 0.001, 0.001, 0.01, 0.005, + 0.003, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.016, 0.001, 0.004, + 0.001, 0.001, 0.0001, 0.0001, 0.009, 0.004, 0.001, 0.001, 0.001, 0.001, + 0.003, 0.003, 0.003, 0.004, 0.008, 0.001, 0.0001, 0.002, 0.0001, 0.001, + 0.004, 0.002, 0.002, 0.002, 0.001, 0.001, 0.002, 0.002, 0.002, 0.001, + 0.001, 0.001, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.011, 0.016, + 0.003, 0.002, 0.0001, 0.0001, 0.0001, 0.037, 0.008, 0.027, 0.001, 0.001, + 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 0.001, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + so: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.235, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.454, 0.003, 0.106, 0.0001, + 0.001, 0.01, 0.006, 0.044, 0.175, 0.179, 0.001, 0.006, 0.698, 0.181, + 0.663, 0.023, 0.173, 0.237, 0.118, 0.074, 0.068, 0.076, 0.069, 0.062, + 0.061, 0.116, 0.103, 0.039, 0.006, 0.095, 0.008, 0.006, 0.001, 0.277, + 0.176, 0.197, 0.21, 0.058, 0.067, 0.135, 0.123, 0.156, 0.069, 0.122, + 0.08, 0.279, 0.092, 0.046, 0.025, 0.078, 0.077, 0.341, 0.096, 0.053, + 0.009, 0.145, 0.085, 0.037, 0.009, 0.058, 0.001, 0.058, 0.0001, 0.009, + 0.001, 20.28, 1.752, 0.781, 4.408, 3.807, 0.467, 1.801, 2.804, 6.156, + 0.344, 2.692, 2.981, 1.937, 3.517, 5.007, 0.065, 0.666, 2.59, 2.645, + 1.488, 3.47, 0.033, 1.517, 1.277, 3.257, 0.024, 0.006, 0.007, 0.006, + 0.0001, 0.0001, 0.044, 0.021, 0.016, 0.015, 0.092, 0.046, 0.041, 0.026, + 0.037, 0.007, 0.048, 0.005, 0.002, 0.004, 0.027, 0.011, 0.01, 0.009, + 0.012, 0.004, 0.002, 0.001, 0.001, 0.002, 0.003, 0.016, 0.0001, 0.0001, + 0.009, 0.011, 0.002, 0.005, 0.026, 0.005, 0.004, 0.02, 0.008, 0.009, + 0.004, 0.102, 0.029, 0.015, 0.023, 0.008, 0.009, 0.018, 0.009, 0.021, + 0.011, 0.034, 0.006, 0.02, 0.009, 0.011, 0.006, 0.006, 0.005, 0.024, + 0.019, 0.018, 0.004, 0.003, 0.001, 0.004, 0.0001, 0.0001, 0.03, 0.015, + 0.007, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.003, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.003, 0.36, 0.404, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.003, 0.003, 0.045, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.034, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sq: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.871, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.83, 0.005, 0.212, 0.0001, + 0.001, 0.008, 0.002, 0.025, 0.142, 0.143, 0.001, 0.002, 0.876, 0.197, + 0.817, 0.021, 0.247, 0.322, 0.187, 0.096, 0.094, 0.095, 0.084, 0.083, + 0.096, 0.185, 0.067, 0.019, 0.003, 0.004, 0.003, 0.004, 0.0001, 0.232, + 0.164, 0.084, 0.121, 0.088, 0.104, 0.113, 0.084, 0.118, 0.051, 0.274, + 0.113, 0.216, 0.178, 0.042, 0.229, 0.027, 0.103, 0.291, 0.126, 0.044, + 0.092, 0.017, 0.024, 0.009, 0.037, 0.024, 0.0001, 0.024, 0.0001, 0.005, + 0.001, 5.42, 0.732, 0.432, 2.174, 7.144, 0.635, 1.01, 2.972, 6.09, + 2.066, 2.05, 2.101, 2.386, 4.875, 2.895, 1.724, 0.557, 5.177, 3.826, + 5.956, 2.462, 1.012, 0.037, 0.057, 0.423, 0.487, 0.0001, 0.007, 0.0001, + 0.0001, 0.0001, 0.107, 0.006, 0.004, 0.005, 0.003, 0.002, 0.002, 0.017, + 0.002, 0.002, 0.001, 0.01, 0.001, 0.002, 0.002, 0.001, 0.001, 0.008, + 0.001, 0.019, 0.002, 0.001, 0.001, 0.001, 0.003, 0.015, 0.001, 0.001, + 0.032, 0.031, 0.002, 0.003, 0.048, 0.005, 0.005, 0.002, 0.005, 0.002, + 0.002, 0.098, 0.005, 0.011, 0.001, 5.762, 0.002, 0.004, 0.002, 0.002, + 0.006, 0.006, 0.012, 0.004, 0.005, 0.003, 0.003, 0.002, 0.003, 0.003, + 0.003, 0.004, 0.006, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.063, 5.926, + 0.008, 0.006, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.023, 0.009, 0.015, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.007, 0.008, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.004, 0.001, 0.106, 0.002, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + srn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.777, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.537, 0.004, 0.236, 0.0001, + 0.0001, 0.009, 0.0001, 0.081, 0.222, 0.175, 0.0001, 0.0001, 0.673, + 0.268, 1.397, 0.005, 0.412, 0.368, 0.15, 0.085, 0.102, 0.103, 0.102, + 0.071, 0.07, 0.14, 0.041, 0.016, 0.015, 0.002, 0.015, 0.0001, 0.0001, + 0.384, 0.184, 0.068, 0.478, 0.061, 0.057, 0.098, 0.039, 0.172, 0.08, + 0.05, 0.052, 0.288, 0.1, 0.075, 0.116, 0.004, 0.117, 0.271, 0.146, + 0.008, 0.023, 0.047, 0.004, 0.014, 0.007, 0.005, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 8.95, 2.176, 0.221, 2.431, 7.818, 1.651, 1.874, 0.226, + 8.782, 0.064, 2.479, 1.698, 2.095, 8.318, 4.117, 1.376, 0.003, 4.52, + 3.577, 2.919, 3.347, 0.156, 1.329, 0.018, 1.038, 0.054, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.042, 0.007, 0.007, 0.002, 0.003, 0.002, 0.003, + 0.006, 0.003, 0.001, 0.002, 0.001, 0.006, 0.003, 0.002, 0.005, 0.004, + 0.002, 0.001, 0.035, 0.002, 0.002, 0.002, 0.006, 0.002, 0.002, 0.002, + 0.002, 0.002, 0.007, 0.002, 0.002, 0.024, 0.012, 0.002, 0.005, 0.004, + 0.007, 0.002, 0.002, 0.012, 0.012, 0.006, 0.009, 0.002, 0.021, 0.005, + 0.003, 0.003, 0.003, 0.034, 0.007, 0.002, 0.002, 0.002, 0.0001, 0.005, + 0.007, 0.019, 0.009, 0.005, 0.003, 0.004, 0.012, 0.0001, 0.0001, 0.029, + 0.098, 0.021, 0.025, 0.002, 0.002, 0.002, 0.005, 0.001, 0.003, 0.0001, + 0.0001, 0.01, 0.004, 0.009, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.053, 0.0001, 0.0001, 0.016, 0.016, 0.0001, + 0.01, 0.0001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ss: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.873, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.454, 0.015, 0.301, 0.001, + 0.003, 0.01, 0.003, 0.035, 0.203, 0.202, 0.001, 0.0001, 0.685, 0.328, + 0.962, 0.019, 0.22, 0.221, 0.137, 0.048, 0.066, 0.07, 0.054, 0.061, + 0.082, 0.144, 0.105, 0.052, 0.007, 0.003, 0.008, 0.003, 0.0001, 0.231, + 0.18, 0.097, 0.094, 0.111, 0.055, 0.072, 0.058, 0.259, 0.082, 0.196, + 0.342, 0.348, 0.356, 0.028, 0.088, 0.003, 0.097, 0.319, 0.164, 0.113, + 0.024, 0.061, 0.025, 0.043, 0.044, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 10.793, 2.656, 0.706, 1.31, 8.505, 1.004, 2.081, 2.919, + 7.091, 0.258, 4.271, 5.701, 2.568, 6.606, 3.595, 0.825, 0.028, 0.782, + 3.437, 3.569, 4.546, 0.696, 2.323, 0.017, 1.567, 0.734, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.037, 0.016, 0.007, 0.01, 0.014, 0.008, 0.007, + 0.004, 0.009, 0.007, 0.013, 0.004, 0.003, 0.014, 0.015, 0.004, 0.003, + 0.006, 0.003, 0.008, 0.006, 0.002, 0.007, 0.004, 0.002, 0.004, 0.007, + 0.002, 0.01, 0.003, 0.007, 0.003, 0.09, 0.039, 0.013, 0.006, 0.01, + 0.005, 0.005, 0.023, 0.007, 0.024, 0.007, 0.009, 0.005, 0.109, 0.006, + 0.007, 0.018, 0.014, 0.009, 0.035, 0.024, 0.01, 0.007, 0.005, 0.015, + 0.006, 0.031, 0.01, 0.005, 0.01, 0.008, 0.005, 0.0001, 0.0001, 0.085, + 0.273, 0.013, 0.008, 0.0001, 0.0001, 0.0001, 0.005, 0.001, 0.002, 0.002, + 0.0001, 0.003, 0.002, 0.061, 0.022, 0.001, 0.0001, 0.0001, 0.003, 0.002, + 0.003, 0.059, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, + 0.042, 0.021, 0.034, 0.0001, 0.001, 0.002, 0.002, 0.0001, 0.0001, + 0.0001, 0.001, 0.002, 0.003, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + st: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.411, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.42, 0.002, 0.079, 0.0001, + 0.001, 0.016, 0.003, 0.083, 0.165, 0.167, 0.001, 0.001, 0.789, 0.143, + 0.973, 0.021, 0.355, 0.325, 0.221, 0.104, 0.116, 0.113, 0.108, 0.098, + 0.108, 0.15, 0.061, 0.016, 0.007, 0.005, 0.006, 0.001, 0.0001, 0.408, + 0.587, 0.149, 0.148, 0.115, 0.088, 0.067, 0.172, 0.071, 0.055, 0.339, + 0.212, 0.509, 0.175, 0.046, 0.141, 0.01, 0.115, 0.317, 0.165, 0.126, + 0.071, 0.047, 0.0001, 0.019, 0.026, 0.011, 0.0001, 0.01, 0.0001, 0.005, + 0.0001, 12.26, 2.144, 0.403, 1.165, 9.234, 0.827, 1.837, 3.801, 3.704, + 0.349, 2.878, 4.66, 2.188, 4.177, 7.024, 1.54, 0.085, 2.344, 4.067, + 4.22, 1.114, 0.282, 1.372, 0.049, 0.996, 0.173, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.013, 0.01, 0.009, 0.0001, 0.005, 0.007, 0.001, 0.001, + 0.001, 0.002, 0.001, 0.001, 0.0001, 0.013, 0.003, 0.001, 0.009, 0.001, + 0.001, 0.004, 0.005, 0.0001, 0.0001, 0.002, 0.001, 0.01, 0.006, 0.004, + 0.004, 0.003, 0.0001, 0.0001, 0.049, 0.052, 0.003, 0.003, 0.006, 0.002, + 0.001, 0.006, 0.002, 0.022, 0.037, 0.001, 0.003, 0.01, 0.0001, 0.001, + 0.004, 0.002, 0.001, 0.03, 0.056, 0.001, 0.001, 0.001, 0.004, 0.001, + 0.002, 0.007, 0.001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.046, 0.167, + 0.019, 0.086, 0.0001, 0.003, 0.001, 0.01, 0.001, 0.003, 0.0001, 0.001, + 0.0001, 0.0001, 0.01, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.007, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.008, 0.013, 0.0001, 0.001, 0.004, 0.002, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + stq: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.516, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.229, 0.003, 0.416, 0.007, + 0.001, 0.015, 0.001, 0.047, 0.208, 0.207, 0.008, 0.003, 0.814, 0.425, + 1.065, 0.021, 0.376, 0.623, 0.234, 0.148, 0.183, 0.183, 0.241, 0.167, + 0.231, 0.214, 0.089, 0.019, 0.072, 0.007, 0.069, 0.006, 0.0001, 0.293, + 0.408, 0.089, 0.454, 0.155, 0.334, 0.214, 0.273, 0.205, 0.248, 0.241, + 0.264, 0.372, 0.199, 0.14, 0.214, 0.005, 0.245, 0.798, 0.226, 0.158, + 0.049, 0.246, 0.003, 0.006, 0.016, 0.02, 0.0001, 0.02, 0.0001, 0.001, + 0.0001, 3.929, 0.935, 0.799, 3.858, 10.176, 1.298, 1.131, 1.308, 4.615, + 0.883, 2.156, 2.674, 1.358, 6.685, 4.841, 0.816, 0.012, 4.246, 3.53, + 4.621, 4.666, 0.159, 1.055, 0.042, 0.141, 0.124, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.049, 0.004, 0.003, 0.001, 0.07, 0.001, 0.001, 0.001, + 0.001, 0.002, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.004, 0.002, 0.001, 0.003, 0.001, 0.009, 0.014, 0.001, 0.002, + 0.008, 0.004, 0.005, 0.004, 0.021, 0.009, 0.015, 0.001, 2.394, 0.001, + 0.001, 0.002, 0.004, 0.014, 0.003, 0.002, 0.001, 0.007, 0.002, 0.002, + 0.004, 0.002, 0.026, 0.006, 0.003, 0.001, 0.134, 0.001, 0.003, 0.002, + 0.004, 0.004, 0.245, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.038, 2.918, + 0.006, 0.011, 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.002, 0.001, + 0.0001, 0.013, 0.006, 0.008, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.048, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + su: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.293, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.195, 0.001, 0.272, 0.0001, + 0.001, 0.006, 0.001, 0.02, 0.129, 0.129, 0.0001, 0.002, 1.05, 0.168, + 1.046, 0.037, 0.48, 0.412, 0.411, 0.202, 0.173, 0.175, 0.161, 0.145, + 0.144, 0.197, 0.036, 0.015, 0.003, 0.003, 0.003, 0.001, 0.0001, 0.394, + 0.22, 0.151, 0.149, 0.042, 0.047, 0.094, 0.073, 0.227, 0.16, 0.402, + 0.071, 0.278, 0.12, 0.097, 0.305, 0.014, 0.09, 0.368, 0.175, 0.05, + 0.031, 0.057, 0.016, 0.027, 0.009, 0.008, 0.0001, 0.008, 0.0001, 0.005, + 0.0001, 13.373, 1.612, 0.819, 2.725, 4.093, 0.314, 2.685, 1.583, 5.788, + 0.997, 2.729, 2.341, 2.09, 7.706, 2.801, 1.889, 0.016, 3.889, 3.272, + 4.14, 4.781, 0.134, 0.635, 0.029, 0.708, 0.032, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.025, 0.005, 0.003, 0.004, 0.006, 0.004, 0.004, 0.002, + 0.004, 0.073, 0.003, 0.001, 0.001, 0.004, 0.007, 0.003, 0.003, 0.002, + 0.003, 0.007, 0.008, 0.001, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, + 0.004, 0.004, 0.001, 0.001, 0.047, 0.002, 0.001, 0.002, 0.004, 0.002, + 0.002, 0.006, 0.003, 2.276, 0.003, 0.002, 0.001, 0.002, 0.007, 0.002, + 0.004, 0.005, 0.002, 0.002, 0.001, 0.001, 0.002, 0.001, 0.002, 0.003, + 0.002, 0.001, 0.002, 0.033, 0.001, 0.033, 0.0001, 0.0001, 0.051, 2.355, + 0.003, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.004, 0.002, 0.003, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.02, 0.037, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.007, 0.025, 0.004, 0.001, 0.003, 0.002, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.032, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + sw: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.454, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.93, 0.002, 0.217, 0.002, + 0.001, 0.01, 0.003, 0.027, 0.171, 0.171, 0.001, 0.001, 0.703, 0.109, + 0.942, 0.015, 0.41, 0.383, 0.266, 0.126, 0.108, 0.126, 0.108, 0.107, + 0.119, 0.201, 0.062, 0.024, 0.003, 0.004, 0.003, 0.003, 0.0001, 0.226, + 0.167, 0.122, 0.086, 0.058, 0.057, 0.065, 0.116, 0.13, 0.09, 0.638, + 0.08, 0.504, 0.137, 0.044, 0.113, 0.006, 0.074, 0.173, 0.147, 0.165, + 0.059, 0.218, 0.013, 0.04, 0.023, 0.04, 0.0001, 0.04, 0.001, 0.001, + 0.001, 16.478, 1.326, 0.611, 1.343, 3.374, 0.678, 1.131, 2.383, 9.629, + 0.827, 4.598, 2.609, 3.253, 5.284, 3.187, 0.805, 0.008, 1.616, 2.094, + 2.468, 4.443, 0.427, 3.161, 0.026, 2.095, 1.273, 0.001, 0.006, 0.001, + 0.0001, 0.0001, 0.04, 0.005, 0.004, 0.002, 0.004, 0.002, 0.002, 0.002, + 0.002, 0.002, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.002, 0.001, + 0.001, 0.013, 0.002, 0.001, 0.001, 0.001, 0.002, 0.006, 0.001, 0.001, + 0.009, 0.008, 0.001, 0.004, 0.009, 0.003, 0.002, 0.002, 0.003, 0.001, + 0.001, 0.005, 0.003, 0.009, 0.001, 0.002, 0.001, 0.002, 0.001, 0.002, + 0.005, 0.009, 0.009, 0.004, 0.002, 0.003, 0.004, 0.001, 0.004, 0.003, + 0.003, 0.003, 0.006, 0.003, 0.002, 0.003, 0.0001, 0.0001, 0.018, 0.029, + 0.009, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.014, 0.007, 0.011, 0.004, 0.0001, 0.0001, 0.0001, 0.002, + 0.002, 0.005, 0.012, 0.01, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.002, 0.004, 0.038, 0.0001, 0.0001, 0.002, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + szl: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.884, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.63, 0.002, 0.452, 0.0001, + 0.0001, 0.012, 0.001, 0.026, 0.296, 0.296, 0.001, 0.001, 1.094, 0.318, + 1.181, 0.015, 0.332, 0.469, 0.289, 0.138, 0.131, 0.151, 0.118, 0.131, + 0.157, 0.273, 0.087, 0.014, 0.006, 0.003, 0.006, 0.0001, 0.0001, 0.207, + 0.209, 0.155, 0.118, 0.048, 0.111, 0.139, 0.08, 0.122, 0.125, 0.213, + 0.123, 0.287, 0.122, 0.062, 0.309, 0.005, 0.156, 0.329, 0.126, 0.154, + 0.05, 0.233, 0.034, 0.017, 0.083, 0.004, 0.0001, 0.004, 0.0001, 0.006, + 0.001, 5.741, 0.894, 2.016, 2.128, 5.35, 0.327, 1.279, 0.968, 3.438, + 2.841, 2.633, 2.099, 2.293, 3.364, 5.857, 1.423, 0.012, 3.389, 2.85, + 2.58, 2.277, 0.102, 3.144, 0.017, 3.623, 2.205, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.191, 0.035, 0.624, 0.044, 0.945, 0.014, 0.009, 0.333, + 0.008, 0.003, 0.006, 0.005, 0.012, 0.221, 0.005, 0.196, 0.006, 0.005, + 0.003, 0.168, 0.01, 0.003, 0.005, 0.005, 0.005, 0.109, 0.059, 0.562, + 0.005, 0.005, 0.004, 0.006, 0.062, 0.111, 0.006, 0.016, 0.01, 0.004, + 0.004, 0.012, 0.011, 0.03, 0.005, 0.012, 0.003, 0.012, 0.008, 1.67, + 0.032, 0.015, 0.058, 0.035, 0.048, 0.018, 0.012, 0.004, 0.02, 0.013, + 0.335, 0.026, 0.282, 0.022, 0.098, 0.006, 0.0001, 0.0001, 0.109, 0.208, + 0.455, 5.073, 0.0001, 0.001, 0.0001, 0.008, 0.003, 0.003, 0.004, 0.0001, + 0.015, 0.008, 0.161, 0.06, 0.003, 0.002, 0.0001, 0.003, 0.001, 0.009, + 0.025, 0.019, 0.0001, 0.001, 0.0001, 0.0001, 0.002, 0.0001, 0.011, 0.01, + 0.176, 0.006, 0.001, 0.005, 0.003, 0.002, 0.001, 0.001, 0.0001, 0.001, + 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + ta: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.357, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 3.862, 0.001, 0.077, 0.0001, + 0.001, 0.006, 0.001, 0.007, 0.055, 0.056, 0.0001, 0.001, 0.234, 0.03, + 0.384, 0.005, 0.084, 0.106, 0.063, 0.029, 0.028, 0.034, 0.027, 0.032, + 0.031, 0.052, 0.017, 0.006, 0.002, 0.002, 0.002, 0.001, 0.0001, 0.008, + 0.004, 0.008, 0.004, 0.004, 0.003, 0.005, 0.004, 0.006, 0.002, 0.003, + 0.003, 0.005, 0.004, 0.003, 0.008, 0.0001, 0.004, 0.008, 0.005, 0.002, + 0.002, 0.002, 0.001, 0.001, 0.0001, 0.006, 0.0001, 0.006, 0.0001, 0.002, + 0.0001, 0.062, 0.006, 0.017, 0.014, 0.042, 0.007, 0.009, 0.018, 0.038, + 0.001, 0.006, 0.024, 0.018, 0.035, 0.032, 0.011, 0.001, 0.036, 0.022, + 0.032, 0.017, 0.005, 0.004, 0.002, 0.01, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.122, 2.149, 0.144, 0.01, 0.0001, 0.297, 0.436, 0.597, + 0.764, 0.136, 0.24, 0.226, 0.005, 5.298, 0.158, 0.027, 0.013, 0.0001, + 0.078, 0.014, 0.0001, 2.36, 0.0001, 0.0001, 0.001, 0.171, 0.627, 0.0001, + 0.037, 0.002, 0.021, 1.319, 0.014, 0.0001, 0.001, 0.32, 2.012, 0.001, + 0.001, 0.0001, 0.539, 0.989, 1.521, 0.0001, 0.0001, 0.001, 23.215, + 10.185, 1.322, 0.801, 1.028, 0.757, 0.189, 0.942, 0.0001, 0.015, 0.06, + 0.015, 0.0001, 0.0001, 0.0001, 0.0001, 1.18, 2.177, 0.0001, 0.0001, + 0.016, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 31.245, 0.0001, 0.013, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tcy: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.391, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.751, 0.001, 0.026, 0.0001, + 0.0001, 0.002, 0.0001, 0.028, 0.048, 0.047, 0.0001, 0.001, 0.244, 0.028, + 0.533, 0.012, 0.014, 0.02, 0.01, 0.005, 0.005, 0.007, 0.006, 0.004, + 0.008, 0.009, 0.009, 0.003, 0.002, 0.003, 0.002, 0.002, 0.0001, 0.002, + 0.001, 0.002, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.002, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.003, + 0.0001, 0.001, 0.001, 0.02, 0.002, 0.008, 0.006, 0.018, 0.002, 0.005, + 0.006, 0.017, 0.0001, 0.003, 0.009, 0.008, 0.014, 0.015, 0.008, 0.0001, + 0.013, 0.012, 0.015, 0.006, 0.002, 0.005, 0.0001, 0.003, 0.0001, 0.0001, + 0.001, 0.0001, 0.001, 0.0001, 0.354, 1.789, 1.221, 0.031, 0.0001, 0.268, + 1.686, 0.484, 0.152, 0.21, 0.745, 0.196, 0.087, 4.125, 0.064, 0.014, + 0.014, 0.0001, 0.109, 0.011, 0.001, 1.28, 0.033, 0.613, 0.012, 0.007, + 0.23, 0.003, 0.404, 0.002, 0.011, 0.433, 0.058, 1.007, 0.002, 0.198, + 1.312, 0.064, 1.397, 0.124, 1.439, 0.012, 1.248, 0.035, 0.624, 0.105, + 0.769, 0.62, 1.755, 0.0001, 22.872, 9.408, 0.0001, 0.629, 0.164, 0.121, + 0.665, 0.124, 0.0001, 0.0001, 0.003, 0.0001, 1.377, 1.63, 0.0001, + 0.0001, 0.05, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 30.955, 0.0001, 0.194, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + te: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.34, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.746, 0.003, 0.051, 0.0001, + 0.001, 0.003, 0.002, 0.007, 0.042, 0.043, 0.0001, 0.001, 0.336, 0.028, + 0.611, 0.018, 0.129, 0.152, 0.069, 0.038, 0.034, 0.073, 0.03, 0.032, + 0.034, 0.047, 0.02, 0.007, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.008, + 0.004, 0.006, 0.005, 0.003, 0.003, 0.002, 0.002, 0.006, 0.001, 0.002, + 0.003, 0.005, 0.003, 0.002, 0.005, 0.0001, 0.003, 0.008, 0.005, 0.003, + 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.006, 0.0001, 0.007, 0.0001, + 0.005, 0.0001, 0.053, 0.008, 0.019, 0.022, 0.056, 0.009, 0.01, 0.021, + 0.046, 0.001, 0.004, 0.022, 0.015, 0.038, 0.038, 0.014, 0.0001, 0.036, + 0.036, 0.045, 0.017, 0.006, 0.006, 0.002, 0.007, 0.001, 0.0001, 0.002, + 0.0001, 0.0001, 0.0001, 0.485, 1.801, 1.898, 0.051, 0.0001, 0.236, + 0.427, 0.575, 0.238, 0.222, 0.152, 0.685, 0.105, 2.799, 0.055, 0.027, + 0.006, 0.0001, 0.047, 0.007, 0.005, 1.329, 0.049, 0.668, 0.014, 0.002, + 0.428, 0.004, 0.25, 0.001, 0.004, 0.537, 0.039, 0.598, 0.002, 0.137, + 0.864, 0.099, 0.843, 0.149, 1.628, 0.0001, 0.909, 0.085, 0.267, 0.128, + 0.942, 0.804, 25.531, 7.165, 1.487, 0.074, 0.0001, 0.877, 0.211, 0.153, + 0.855, 0.145, 0.0001, 0.001, 0.0001, 0.0001, 2.169, 2.359, 0.0001, + 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 30.736, 0.0001, 0.069, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tet: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.506, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.056, 0.014, 0.345, 0.0001, + 0.004, 0.018, 0.001, 0.455, 0.383, 0.382, 0.001, 0.004, 1.067, 0.53, + 0.968, 0.029, 0.443, 0.39, 0.316, 0.132, 0.112, 0.137, 0.105, 0.106, + 0.119, 0.181, 0.186, 0.018, 0.015, 0.005, 0.015, 0.003, 0.0001, 0.338, + 0.226, 0.145, 0.169, 0.132, 0.156, 0.098, 0.111, 0.215, 0.061, 0.136, + 0.43, 0.301, 0.181, 0.101, 0.266, 0.01, 0.137, 0.345, 0.37, 0.107, + 0.065, 0.041, 0.021, 0.008, 0.014, 0.01, 0.0001, 0.01, 0.0001, 0.0001, + 0.0001, 11.569, 1.502, 0.408, 2.068, 6.067, 0.587, 0.66, 2.225, 7.509, + 0.16, 2.246, 2.814, 2.311, 6.307, 4.401, 1.282, 0.035, 4.022, 4.063, + 3.545, 4.826, 0.518, 0.1, 0.064, 0.126, 0.341, 0.0001, 0.009, 0.0001, + 0.0001, 0.0001, 0.318, 0.081, 0.003, 0.001, 0.002, 0.001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.002, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.015, 0.001, 0.0001, 0.0001, 0.001, 0.004, 0.275, + 0.001, 0.0001, 0.014, 0.013, 0.001, 0.002, 0.021, 0.254, 0.002, 0.025, + 0.0001, 0.0001, 0.003, 0.02, 0.002, 0.389, 0.006, 0.001, 0.001, 0.167, + 0.001, 0.001, 0.002, 0.048, 0.071, 0.284, 0.01, 0.003, 0.001, 0.0001, + 0.001, 0.001, 0.076, 0.003, 0.014, 0.001, 0.001, 0.002, 0.0001, 0.0001, + 0.1, 1.362, 0.004, 0.006, 0.0001, 0.0001, 0.0001, 0.009, 0.011, 0.0001, + 0.0001, 0.0001, 0.007, 0.003, 0.006, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.316, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tg: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.272, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.893, 0.001, 0.026, 0.0001, + 0.0001, 0.002, 0.001, 0.001, 0.324, 0.326, 0.0001, 0.001, 0.765, 0.105, + 0.581, 0.006, 0.139, 0.257, 0.13, 0.073, 0.063, 0.072, 0.065, 0.068, + 0.082, 0.185, 0.026, 0.048, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.026, + 0.01, 0.018, 0.007, 0.005, 0.01, 0.006, 0.007, 0.018, 0.002, 0.005, + 0.008, 0.009, 0.006, 0.004, 0.009, 0.001, 0.007, 0.015, 0.007, 0.003, + 0.006, 0.004, 0.006, 0.002, 0.002, 0.004, 0.0001, 0.004, 0.0001, 0.0001, + 0.0001, 0.081, 0.01, 0.03, 0.023, 0.086, 0.012, 0.015, 0.021, 0.065, + 0.002, 0.009, 0.037, 0.017, 0.055, 0.061, 0.017, 0.001, 0.07, 0.039, + 0.054, 0.023, 0.01, 0.007, 0.003, 0.013, 0.003, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 2.968, 1.483, 1.764, 1.455, 0.398, 0.384, 0.008, 0.116, + 0.704, 0.002, 0.17, 0.01, 0.024, 0.035, 0.045, 0.663, 0.178, 0.263, + 0.119, 0.126, 0.303, 0.007, 0.009, 0.022, 0.136, 0.003, 0.143, 0.343, + 0.148, 0.063, 0.071, 0.071, 0.134, 0.159, 0.101, 0.347, 0.121, 0.05, + 0.002, 0.026, 0.059, 0.003, 0.003, 0.057, 0.003, 0.035, 0.012, 0.164, + 5.899, 1.075, 1.071, 1.816, 2.336, 1.339, 0.082, 0.882, 4.885, 0.258, + 1.014, 1.438, 1.445, 2.22, 3.885, 0.208, 0.0001, 0.0001, 0.132, 0.006, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.0001, 0.002, 0.001, 30.166, 10.131, 1.965, 0.481, 0.0001, 0.0001, + 0.0001, 0.0001, 0.024, 0.016, 0.001, 0.006, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.001, 0.209, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ti: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.164, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.862, 0.026, 0.05, 0.0001, + 0.0001, 0.012, 0.0001, 0.044, 0.1, 0.1, 0.0001, 0.0001, 0.075, 0.114, + 0.14, 0.02, 0.098, 0.121, 0.073, 0.033, 0.026, 0.04, 0.027, 0.03, 0.029, + 0.042, 0.024, 0.004, 0.001, 0.013, 0.001, 0.007, 0.0001, 0.018, 0.013, + 0.015, 0.007, 0.006, 0.007, 0.011, 0.013, 0.022, 0.004, 0.004, 0.024, + 0.018, 0.012, 0.005, 0.015, 0.004, 0.01, 0.013, 0.022, 0.007, 0.009, + 0.006, 0.002, 0.004, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.329, 0.063, 0.099, 0.16, 0.451, 0.14, 0.111, 0.211, 0.297, + 0.027, 0.053, 0.155, 0.097, 0.283, 0.275, 0.071, 0.007, 0.228, 0.261, + 0.255, 0.122, 0.059, 0.08, 0.007, 0.069, 0.014, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.358, 0.069, 0.074, 0.236, 0.007, 0.331, 0.023, 0.001, + 9.303, 5.576, 6.47, 5.805, 1.549, 3.066, 0.251, 0.003, 0.505, 0.172, + 0.135, 1.034, 0.015, 2.293, 0.054, 0.001, 0.75, 0.233, 0.32, 0.51, 0.12, + 1.725, 0.08, 0.002, 0.83, 0.546, 0.753, 1.425, 0.111, 2.053, 0.138, + 0.011, 0.764, 0.373, 0.244, 0.731, 0.034, 1.854, 0.258, 0.004, 1.053, + 0.166, 0.551, 0.69, 0.031, 2.007, 0.179, 0.005, 0.189, 0.048, 0.045, + 0.156, 0.011, 0.447, 0.067, 0.002, 0.0001, 0.0001, 0.386, 0.04, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.027, 0.012, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, + 0.008, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 27.967, 0.209, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tk: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.842, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.847, 0.005, 0.052, 0.0001, + 0.001, 0.008, 0.001, 0.006, 0.121, 0.125, 0.004, 0.002, 0.691, 0.455, + 1.024, 0.011, 0.191, 0.306, 0.153, 0.096, 0.091, 0.095, 0.077, 0.079, + 0.095, 0.155, 0.055, 0.012, 0.028, 0.003, 0.028, 0.005, 0.0001, 0.227, + 0.204, 0.012, 0.086, 0.083, 0.04, 0.177, 0.112, 0.174, 0.027, 0.109, + 0.037, 0.173, 0.054, 0.141, 0.071, 0.001, 0.074, 0.173, 0.153, 0.029, + 0.028, 0.04, 0.045, 0.029, 0.016, 0.01, 0.0001, 0.01, 0.001, 0.003, + 0.0001, 8.711, 1.574, 0.069, 3.499, 5.666, 0.119, 2.22, 0.895, 5.266, + 0.476, 2.165, 5.087, 2.1, 4.83, 1.754, 1.161, 0.002, 5.326, 1.953, + 2.216, 1.612, 0.014, 0.863, 0.003, 4.905, 0.889, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.208, 0.022, 0.019, 0.011, 0.017, 0.007, 0.003, 0.027, + 1.247, 0.001, 0.0001, 0.008, 0.005, 0.003, 0.002, 0.006, 0.003, 0.005, + 0.002, 0.04, 0.02, 0.001, 0.017, 0.002, 0.001, 0.002, 0.001, 0.001, + 0.068, 0.139, 0.083, 1.114, 0.015, 0.004, 0.009, 0.002, 0.694, 0.003, + 0.003, 0.67, 0.001, 0.002, 0.0001, 0.027, 0.0001, 0.192, 0.001, 0.002, + 0.056, 0.114, 0.02, 0.061, 0.013, 0.043, 0.813, 0.006, 0.038, 0.007, + 0.016, 0.096, 0.984, 2.385, 0.053, 0.019, 0.0001, 0.0001, 0.268, 5.753, + 0.012, 2.464, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.324, 0.111, 0.002, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.054, 0.182, 0.0001, 0.005, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tl: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.527, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.015, 0.006, 0.416, 0.001, + 0.001, 0.006, 0.002, 0.043, 0.2, 0.202, 0.001, 0.002, 0.702, 0.264, + 0.789, 0.017, 0.219, 0.272, 0.17, 0.08, 0.075, 0.082, 0.072, 0.075, + 0.087, 0.155, 0.061, 0.022, 0.066, 0.004, 0.066, 0.002, 0.0001, 0.555, + 0.199, 0.186, 0.134, 0.118, 0.059, 0.112, 0.181, 0.214, 0.066, 0.204, + 0.127, 0.268, 0.176, 0.063, 0.292, 0.011, 0.11, 0.398, 0.188, 0.06, + 0.045, 0.055, 0.008, 0.035, 0.014, 0.016, 0.0001, 0.015, 0.001, 0.003, + 0.0001, 16.44, 1.457, 0.382, 1.246, 2.379, 0.123, 6.741, 1.192, 6.121, + 0.033, 2.118, 3.173, 2.569, 9.845, 3.868, 2.142, 0.019, 2.313, 4.125, + 3.402, 2.226, 0.121, 0.559, 0.032, 2.131, 0.078, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.038, 0.008, 0.005, 0.004, 0.004, 0.003, 0.002, 0.002, + 0.004, 0.002, 0.002, 0.002, 0.003, 0.007, 0.003, 0.002, 0.004, 0.004, + 0.002, 0.014, 0.006, 0.001, 0.002, 0.001, 0.002, 0.008, 0.001, 0.002, + 0.013, 0.007, 0.002, 0.002, 0.028, 0.01, 0.003, 0.002, 0.004, 0.002, + 0.002, 0.004, 0.003, 0.01, 0.002, 0.004, 0.002, 0.008, 0.002, 0.002, + 0.005, 0.01, 0.003, 0.007, 0.003, 0.003, 0.002, 0.002, 0.006, 0.003, + 0.004, 0.003, 0.005, 0.003, 0.003, 0.003, 0.0001, 0.0001, 0.029, 0.045, + 0.007, 0.011, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.012, 0.006, 0.01, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.005, 0.008, 0.007, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.007, 0.012, 0.037, 0.005, 0.001, 0.003, 0.002, 0.001, 0.001, + 0.001, 0.004, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.005, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tn: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.716, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 17.981, 0.003, 0.08, 0.013, + 0.001, 0.009, 0.002, 0.01, 0.075, 0.075, 0.0001, 0.0001, 0.66, 0.106, + 0.757, 0.034, 0.2, 0.226, 0.113, 0.036, 0.039, 0.039, 0.04, 0.035, + 0.043, 0.09, 0.021, 0.015, 0.01, 0.005, 0.011, 0.004, 0.0001, 0.148, + 0.357, 0.071, 0.097, 0.07, 0.054, 0.125, 0.028, 0.051, 0.019, 0.166, + 0.104, 0.374, 0.087, 0.085, 0.102, 0.001, 0.088, 0.173, 0.113, 0.019, + 0.017, 0.023, 0.006, 0.007, 0.021, 0.023, 0.0001, 0.022, 0.0001, 0.004, + 0.0001, 12.488, 2.445, 0.191, 1.643, 9.389, 0.795, 4.171, 1.899, 3.702, + 0.312, 2.67, 5.097, 2.631, 4.499, 8.158, 1.075, 0.008, 1.917, 4.118, + 4.684, 0.837, 0.048, 2.161, 0.014, 0.955, 0.029, 0.001, 0.002, 0.001, + 0.0001, 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.004, 0.001, 0.0001, 0.0001, 0.0001, 0.002, + 0.002, 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.034, 0.011, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.002, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.036, 0.008, 0.0001, 0.011, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.014, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + to: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.293, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.821, 0.001, 0.44, 0.0001, + 0.0001, 0.001, 0.005, 0.111, 0.238, 0.237, 0.002, 0.0001, 0.847, 0.076, + 1.066, 0.045, 0.084, 0.141, 0.063, 0.039, 0.037, 0.032, 0.036, 0.05, + 0.065, 0.067, 0.09, 0.023, 0.003, 0.011, 0.005, 0.027, 0.0001, 0.126, + 0.034, 0.039, 0.011, 0.049, 0.193, 0.01, 0.178, 0.123, 0.01, 0.599, + 0.145, 0.204, 0.188, 0.245, 0.136, 0.001, 0.012, 0.185, 0.547, 0.059, + 0.124, 0.026, 0.001, 0.005, 0.001, 0.004, 0.0001, 0.005, 0.0001, 0.002, + 0.001, 10.579, 0.223, 0.423, 0.627, 6.707, 1.724, 1.525, 3.199, 6.545, + 0.014, 3.573, 2.547, 1.814, 3.859, 6.712, 1.277, 0.01, 0.909, 1.504, + 3.555, 4.441, 0.529, 0.312, 0.02, 0.255, 0.009, 0.0001, 0.0001, 0.0001, + 0.004, 0.0001, 0.028, 0.432, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.082, 0.0001, 0.0001, + 0.0001, 0.0001, 0.002, 0.183, 0.003, 0.0001, 0.0001, 0.001, 0.011, + 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.057, + 0.0001, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.0001, 0.002, 0.001, + 0.078, 0.0001, 0.015, 0.0001, 0.0001, 0.013, 0.0001, 0.001, 0.005, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.012, 4.517, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.022, 0.094, 0.659, 0.119, + 0.0001, 0.0001, 0.0001, 0.0001, 4.513, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.024, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + tpi: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 3.506, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.422, 0.004, 0.225, 0.0001, + 0.0001, 0.006, 0.0001, 0.033, 0.226, 0.227, 0.001, 0.0001, 0.976, 0.07, + 1.357, 0.011, 0.339, 0.409, 0.202, 0.102, 0.113, 0.106, 0.09, 0.101, + 0.134, 0.258, 0.112, 0.01, 0.016, 0.001, 0.016, 0.001, 0.0001, 0.28, + 0.281, 0.358, 0.108, 0.184, 0.096, 0.132, 0.102, 0.251, 0.103, 0.247, + 0.515, 0.27, 0.273, 0.17, 0.405, 0.016, 0.129, 0.696, 0.311, 0.02, + 0.133, 0.076, 0.006, 0.097, 0.011, 0.006, 0.0001, 0.006, 0.0001, 0.003, + 0.0001, 9.267, 1.534, 0.295, 1.028, 5.418, 0.186, 3.091, 0.44, 8.286, + 0.1, 1.968, 5.697, 3.075, 7.815, 5.428, 2.623, 0.013, 2.618, 3.22, 3.51, + 1.911, 0.537, 0.798, 0.013, 0.388, 0.104, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.026, 0.016, 0.007, 0.003, 0.007, 0.001, 0.002, 0.003, 0.001, + 0.001, 0.001, 0.002, 0.006, 0.002, 0.001, 0.001, 0.004, 0.002, 0.001, + 0.01, 0.002, 0.002, 0.002, 0.003, 0.001, 0.004, 0.001, 0.005, 0.009, + 0.009, 0.003, 0.002, 0.021, 0.037, 0.001, 0.006, 0.0001, 0.001, 0.001, + 0.002, 0.002, 0.013, 0.005, 0.003, 0.004, 0.024, 0.002, 0.002, 0.006, + 0.026, 0.007, 0.298, 0.002, 0.005, 0.003, 0.003, 0.01, 0.004, 0.011, + 0.015, 0.005, 0.005, 0.003, 0.004, 0.0001, 0.0001, 0.019, 0.408, 0.007, + 0.009, 0.0001, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.02, 0.011, 0.021, 0.008, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.004, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.008, + 0.012, 0.021, 0.009, 0.003, 0.009, 0.003, 0.001, 0.001, 0.002, 0.004, + 0.003, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, + ], + ts: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.117, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.445, 0.004, 0.183, 0.0001, + 0.0001, 0.006, 0.001, 0.136, 0.107, 0.107, 0.0001, 0.0001, 0.868, 0.158, + 0.838, 0.021, 0.152, 0.161, 0.081, 0.037, 0.038, 0.052, 0.045, 0.043, + 0.056, 0.092, 0.041, 0.025, 0.03, 0.001, 0.03, 0.006, 0.0001, 0.18, + 0.088, 0.068, 0.084, 0.075, 0.029, 0.061, 0.137, 0.055, 0.032, 0.132, + 0.116, 0.387, 0.232, 0.02, 0.062, 0.002, 0.075, 0.171, 0.121, 0.04, + 0.219, 0.021, 0.119, 0.045, 0.021, 0.003, 0.0001, 0.003, 0.0001, 0.002, + 0.005, 13.463, 1.384, 0.275, 1.092, 4.958, 0.572, 1.347, 3.614, 7.958, + 0.047, 4.285, 4.291, 2.768, 5.921, 3.615, 0.489, 0.025, 2.056, 2.585, + 2.874, 4.929, 1.994, 3.082, 0.68, 2.172, 0.64, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.055, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, + 0.001, 0.0001, 0.005, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.031, + 0.0001, 0.001, 0.008, 0.008, 0.0001, 0.0001, 0.05, 0.004, 0.002, 0.001, + 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.002, 0.0001, 0.0001, 0.001, + 0.003, 0.0001, 0.002, 0.001, 0.005, 0.002, 0.011, 0.002, 0.0001, 0.0001, + 0.001, 0.002, 0.002, 0.001, 0.002, 0.002, 0.002, 0.0001, 0.002, 0.0001, + 0.0001, 0.051, 0.023, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.002, + 0.0001, 0.001, 0.0001, 0.0001, 0.018, 0.006, 0.002, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.054, 0.0001, 0.0001, + 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tt: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.086, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.219, 0.001, 0.085, 0.0001, + 0.0001, 0.04, 0.0001, 0.002, 0.22, 0.221, 0.0001, 0.008, 0.529, 0.164, + 0.713, 0.007, 0.223, 0.276, 0.185, 0.093, 0.09, 0.084, 0.067, 0.069, + 0.089, 0.159, 0.097, 0.008, 0.002, 0.001, 0.002, 0.003, 0.0001, 0.01, + 0.009, 0.017, 0.009, 0.006, 0.003, 0.002, 0.003, 0.017, 0.001, 0.009, + 0.003, 0.013, 0.003, 0.003, 0.004, 0.005, 0.005, 0.013, 0.017, 0.009, + 0.006, 0.002, 0.01, 0.003, 0.001, 0.002, 0.0001, 0.002, 0.0001, 0.002, + 0.0001, 0.245, 0.051, 0.015, 0.059, 0.152, 0.017, 0.027, 0.019, 0.108, + 0.002, 0.051, 0.14, 0.059, 0.158, 0.057, 0.025, 0.035, 0.149, 0.073, + 0.108, 0.056, 0.01, 0.015, 0.014, 0.048, 0.025, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 2.852, 1.726, 1.824, 1.398, 0.151, 0.194, 0.076, 0.605, + 0.638, 0.004, 0.1, 2.623, 0.236, 0.061, 0.057, 0.479, 0.123, 0.129, + 0.053, 0.062, 0.279, 0.075, 0.02, 0.174, 0.096, 1.916, 0.222, 0.025, + 0.1, 0.049, 0.069, 0.128, 0.159, 0.146, 0.119, 0.43, 0.164, 0.055, + 0.003, 0.065, 0.036, 0.325, 0.0001, 0.038, 0.001, 0.013, 0.042, 0.429, + 4.958, 1.044, 0.394, 1.429, 0.959, 3.011, 0.048, 0.384, 1.557, 0.433, + 1.901, 3.01, 1.056, 3.108, 1.043, 0.407, 0.0001, 0.0001, 0.106, 0.225, + 0.139, 0.034, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.004, + 0.0001, 0.003, 0.001, 26.093, 12.748, 1.127, 2.265, 0.0001, 0.0001, + 0.0001, 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.275, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tum: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.34, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.852, 0.004, 0.573, 0.003, + 0.004, 0.004, 0.017, 0.083, 0.308, 0.306, 0.001, 0.0001, 1.303, 0.412, + 1.2, 0.024, 0.557, 0.476, 0.366, 0.176, 0.172, 0.213, 0.206, 0.176, + 0.165, 0.191, 0.118, 0.025, 0.012, 0.007, 0.012, 0.0001, 0.001, 0.268, + 0.377, 0.217, 0.158, 0.11, 0.095, 0.125, 0.123, 0.134, 0.277, 0.29, + 0.111, 0.727, 0.21, 0.076, 0.143, 0.01, 0.116, 0.269, 0.294, 0.069, + 0.067, 0.069, 0.003, 0.068, 0.042, 0.008, 0.0001, 0.008, 0.0001, 0.0001, + 0.0001, 10.116, 1.728, 1.817, 1.937, 5.125, 1.225, 1.488, 3.251, 6.548, + 0.159, 2.454, 2.854, 2.514, 5.282, 4.292, 2.074, 0.028, 2.715, 2.7, + 3.62, 4.127, 0.602, 1.862, 0.051, 1.299, 0.758, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.102, 0.017, 0.014, 0.014, 0.01, 0.006, 0.008, 0.005, + 0.003, 0.001, 0.007, 0.006, 0.02, 0.058, 0.017, 0.003, 0.008, 0.005, + 0.001, 0.016, 0.005, 0.005, 0.003, 0.004, 0.009, 0.043, 0.004, 0.001, + 0.008, 0.005, 0.006, 0.002, 0.103, 0.006, 0.008, 0.007, 0.001, 0.005, + 0.009, 0.025, 0.006, 0.01, 0.003, 0.011, 0.006, 0.004, 0.0001, 0.003, + 0.016, 0.015, 0.003, 0.014, 0.008, 0.112, 0.003, 0.014, 0.012, 0.008, + 0.012, 0.012, 0.008, 0.009, 0.01, 0.003, 0.0001, 0.0001, 0.101, 0.045, + 0.006, 0.195, 0.001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.003, 0.063, 0.038, 0.001, 0.001, 0.001, 0.006, 0.003, + 0.007, 0.053, 0.034, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.016, 0.022, 0.093, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.002, 0.012, 0.008, 0.001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tw: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 4.984, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.303, 0.001, 0.389, 0.0001, + 0.001, 0.0001, 0.004, 0.077, 0.488, 0.486, 0.0001, 0.0001, 0.756, 0.118, + 1.791, 0.025, 0.73, 0.614, 0.579, 0.248, 0.221, 0.18, 0.206, 0.176, + 0.192, 0.286, 0.065, 0.035, 0.004, 0.0001, 0.004, 0.01, 0.0001, 0.602, + 0.283, 0.296, 0.116, 0.311, 0.173, 0.2, 0.1, 0.303, 0.048, 0.367, 0.187, + 0.399, 0.306, 0.149, 0.189, 0.019, 0.18, 0.508, 0.305, 0.203, 0.099, + 0.096, 0.049, 0.077, 0.01, 0.003, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, + 8.315, 0.995, 0.605, 1.602, 5.365, 0.628, 0.659, 0.955, 4.58, 0.091, + 2.249, 1.426, 1.892, 5.378, 5.608, 0.884, 0.03, 3.156, 2.583, 1.888, + 2.004, 0.328, 1.708, 0.075, 2.441, 0.168, 0.0001, 0.0001, 0.0001, 0.01, + 0.0001, 0.083, 0.035, 0.035, 0.017, 0.032, 0.015, 0.093, 0.059, 0.023, + 0.016, 0.025, 0.022, 0.019, 0.022, 0.029, 0.012, 0.046, 0.013, 0.009, + 0.017, 0.855, 0.004, 0.017, 0.017, 0.006, 0.004, 0.012, 1.236, 0.017, + 0.012, 0.01, 0.004, 0.081, 0.046, 0.012, 0.012, 0.086, 0.028, 0.017, + 0.054, 0.03, 0.075, 0.019, 0.012, 0.016, 0.036, 0.009, 0.019, 0.074, + 0.048, 0.057, 0.049, 0.013, 2.039, 0.016, 0.03, 0.109, 0.023, 0.064, + 0.039, 0.051, 0.048, 0.068, 0.015, 0.0001, 0.0001, 0.075, 0.196, 0.058, + 0.036, 0.106, 0.0001, 0.001, 1.812, 0.004, 0.0001, 0.001, 0.0001, 2.053, + 0.006, 0.306, 0.086, 0.0001, 0.0001, 0.0001, 0.012, 0.003, 0.267, 0.158, + 0.09, 0.007, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.209, 0.016, 0.044, + 0.0001, 0.016, 0.052, 0.016, 0.023, 0.012, 0.003, 0.001, 0.0001, 0.003, + 0.0001, 0.0001, 0.019, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, + ], + ty: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 5.596, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.482, 0.002, 0.148, 0.0001, + 0.0001, 0.0001, 0.001, 0.103, 0.185, 0.187, 0.0001, 0.0001, 0.459, + 0.229, 1.457, 0.013, 0.217, 0.354, 0.181, 0.099, 0.109, 0.09, 0.093, + 0.094, 0.097, 0.295, 0.032, 0.014, 0.002, 0.001, 0.023, 0.0001, 0.0001, + 0.336, 0.259, 0.191, 0.056, 0.549, 0.206, 0.061, 0.142, 0.109, 0.062, + 0.031, 0.131, 0.411, 0.099, 0.644, 0.477, 0.008, 0.194, 0.401, 0.951, + 0.146, 0.18, 0.019, 0.004, 0.015, 0.007, 0.008, 0.0001, 0.01, 0.0001, + 0.003, 0.0001, 9.536, 0.253, 0.42, 0.705, 6.452, 0.803, 0.335, 1.722, + 7.016, 0.092, 0.277, 1.311, 1.613, 3.693, 4.012, 0.994, 0.04, 4.455, + 1.038, 5.804, 2.543, 0.371, 0.019, 0.027, 0.146, 0.201, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 2.052, 0.908, 0.007, 0.002, 0.007, 0.001, + 0.0001, 0.003, 0.006, 0.001, 0.003, 0.002, 0.002, 1.282, 0.0001, 0.001, + 0.007, 0.0001, 0.043, 0.549, 0.01, 0.0001, 0.0001, 0.003, 0.114, 1.916, + 0.0001, 0.006, 0.0001, 0.0001, 0.0001, 0.0001, 0.19, 0.144, 0.074, + 0.002, 0.002, 0.003, 0.003, 0.022, 0.06, 0.039, 0.051, 0.598, 0.116, + 0.035, 0.003, 0.018, 0.003, 0.029, 0.506, 0.059, 0.005, 0.003, 0.0001, + 0.001, 0.002, 0.008, 0.013, 0.037, 0.005, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.033, 1.417, 1.711, 1.627, 0.0001, 0.0001, 0.0001, 0.008, 0.01, + 0.005, 0.002, 0.001, 0.0001, 0.0001, 0.009, 0.006, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.012, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.01, 2.037, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + tyv: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.67, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.942, 0.005, 0.141, 0.0001, + 0.0001, 0.004, 0.001, 0.003, 0.097, 0.1, 0.0001, 0.001, 0.649, 0.583, + 0.64, 0.009, 0.087, 0.151, 0.08, 0.042, 0.04, 0.04, 0.033, 0.032, 0.035, + 0.099, 0.046, 0.011, 0.008, 0.002, 0.008, 0.008, 0.0001, 0.007, 0.002, + 0.003, 0.002, 0.002, 0.002, 0.001, 0.002, 0.022, 0.0001, 0.001, 0.001, + 0.002, 0.001, 0.002, 0.001, 0.0001, 0.001, 0.003, 0.003, 0.001, 0.006, + 0.002, 0.011, 0.001, 0.0001, 0.005, 0.0001, 0.005, 0.0001, 0.005, + 0.0001, 0.081, 0.005, 0.006, 0.008, 0.025, 0.002, 0.005, 0.006, 0.02, + 0.002, 0.007, 0.012, 0.016, 0.015, 0.021, 0.013, 0.003, 0.017, 0.01, + 0.014, 0.01, 0.002, 0.004, 0.007, 0.004, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 3.263, 0.883, 1.755, 1.893, 0.056, 0.377, 0.045, 1.004, + 0.604, 0.005, 0.051, 2.643, 0.086, 0.75, 0.036, 0.173, 0.125, 0.135, + 0.03, 0.065, 0.108, 0.011, 0.018, 0.005, 0.038, 0.005, 0.129, 0.036, + 0.079, 0.041, 0.11, 0.022, 0.066, 0.107, 0.147, 0.782, 0.015, 0.082, + 0.008, 0.088, 0.054, 0.476, 0.001, 0.089, 0.001, 0.039, 0.018, 0.892, + 5.51, 0.98, 0.415, 1.888, 1.904, 2.436, 0.478, 0.679, 2.249, 0.486, + 1.593, 2.459, 0.684, 3.034, 1.582, 0.744, 0.0001, 0.0001, 0.143, 0.011, + 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.002, 0.004, 0.003, 0.01, 0.001, + 0.011, 0.002, 28.453, 13.514, 1.663, 0.515, 0.0001, 0.0001, 0.0001, + 0.0001, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.014, 0.001, 0.094, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + udm: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.306, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.09, 0.004, 0.114, 0.0001, + 0.0001, 0.008, 0.0001, 0.002, 0.237, 0.238, 0.002, 0.001, 0.557, 0.317, + 0.775, 0.018, 0.183, 0.302, 0.16, 0.086, 0.075, 0.092, 0.071, 0.074, + 0.085, 0.189, 0.048, 0.012, 0.017, 0.014, 0.016, 0.001, 0.0001, 0.018, + 0.008, 0.012, 0.004, 0.003, 0.003, 0.003, 0.003, 0.016, 0.004, 0.004, + 0.006, 0.014, 0.003, 0.019, 0.021, 0.0001, 0.006, 0.011, 0.006, 0.003, + 0.006, 0.001, 0.009, 0.001, 0.001, 0.003, 0.0001, 0.003, 0.0001, 0.0001, + 0.0001, 0.242, 0.027, 0.103, 0.053, 0.195, 0.007, 0.026, 0.039, 0.148, + 0.005, 0.015, 0.074, 0.03, 0.111, 0.083, 0.028, 0.002, 0.108, 0.083, + 0.059, 0.078, 0.015, 0.004, 0.004, 0.02, 0.008, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 2.622, 2.823, 2.068, 1.727, 0.105, 0.092, 0.121, 0.28, + 0.404, 0.054, 0.451, 2.424, 1.272, 0.932, 0.131, 0.626, 0.166, 0.634, + 0.123, 0.164, 0.252, 0.027, 0.006, 0.023, 0.083, 0.009, 0.22, 0.069, + 0.124, 0.088, 0.082, 0.223, 0.15, 0.209, 0.107, 0.132, 0.033, 0.405, + 0.01, 0.179, 0.05, 0.004, 0.001, 0.088, 0.001, 0.03, 0.018, 0.022, + 2.886, 0.44, 0.8, 0.564, 1.075, 2.236, 0.315, 1.165, 1.904, 0.34, 1.795, + 2.214, 1.337, 2.854, 2.759, 0.664, 0.0001, 0.0001, 0.24, 0.028, 0.005, + 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.023, 0.0001, + 0.001, 0.0001, 25.262, 16.34, 0.005, 0.714, 0.0001, 0.005, 0.001, 0.002, + 0.005, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.003, + 0.006, 0.277, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + ug: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.4, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 6.843, 0.005, 0.045, 0.0001, + 0.0001, 0.006, 0.0001, 0.05, 0.059, 0.061, 0.001, 0.001, 0.064, 0.182, + 0.431, 0.006, 0.116, 0.137, 0.086, 0.058, 0.051, 0.055, 0.044, 0.042, + 0.045, 0.072, 0.055, 0.007, 0.018, 0.009, 0.017, 0.0001, 0.0001, 0.014, + 0.005, 0.004, 0.003, 0.002, 0.001, 0.002, 0.002, 0.011, 0.008, 0.009, + 0.003, 0.013, 0.002, 0.002, 0.005, 0.001, 0.002, 0.015, 0.014, 0.019, + 0.001, 0.002, 0.002, 0.003, 0.0001, 0.003, 0.001, 0.003, 0.0001, 0.008, + 0.0001, 0.198, 0.04, 0.041, 0.081, 0.144, 0.022, 0.07, 0.096, 0.317, + 0.009, 0.06, 0.138, 0.069, 0.164, 0.09, 0.038, 0.044, 0.138, 0.091, + 0.118, 0.088, 0.011, 0.018, 0.015, 0.072, 0.022, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.146, 0.075, 1.421, 1.142, 2.553, 1.322, 3.07, 1.622, + 1.224, 6.252, 1.181, 0.454, 0.501, 0.027, 0.124, 0.02, 0.545, 0.041, + 0.008, 0.046, 0.025, 2.705, 0.02, 0.099, 0.121, 0.09, 0.015, 0.082, + 0.041, 0.012, 0.015, 0.06, 0.068, 0.006, 0.005, 0.06, 0.019, 0.028, + 1.456, 3.601, 1.011, 0.28, 1.856, 0.056, 0.228, 0.623, 0.346, 2.099, + 0.163, 2.119, 0.524, 1.075, 0.873, 0.045, 0.014, 0.035, 0.226, 0.052, + 1.208, 0.825, 0.077, 0.089, 1.1, 0.024, 0.0001, 0.0001, 0.118, 0.051, + 0.009, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.0001, 0.765, 0.262, 0.112, 0.09, 0.0001, 0.0001, + 0.0001, 0.001, 14.938, 17.649, 1.694, 5.905, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.067, 0.002, 0.002, 0.006, 0.003, 0.003, 0.002, + 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.007, 1.731, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ur: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.979, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.161, 0.002, 0.04, 0.0001, + 0.0001, 0.001, 0.0001, 0.006, 0.157, 0.157, 0.0001, 0.001, 0.081, 0.085, + 0.055, 0.007, 0.121, 0.179, 0.119, 0.082, 0.072, 0.073, 0.068, 0.065, + 0.07, 0.096, 0.098, 0.002, 0.004, 0.003, 0.004, 0.0001, 0.0001, 0.02, + 0.016, 0.035, 0.016, 0.006, 0.007, 0.013, 0.009, 0.011, 0.009, 0.012, + 0.015, 0.025, 0.011, 0.007, 0.016, 0.003, 0.012, 0.029, 0.016, 0.005, + 0.006, 0.007, 0.001, 0.005, 0.003, 0.004, 0.0001, 0.004, 0.0001, 0.004, + 0.0001, 0.265, 0.03, 0.059, 0.059, 0.181, 0.032, 0.039, 0.075, 0.194, + 0.006, 0.027, 0.102, 0.048, 0.197, 0.175, 0.037, 0.004, 0.142, 0.109, + 0.147, 0.083, 0.021, 0.026, 0.005, 0.049, 0.011, 0.0001, 0.014, 0.0001, + 0.0001, 0.0001, 0.055, 2.387, 0.534, 0.013, 1.581, 2.193, 2.297, 0.009, + 2.712, 0.004, 0.024, 0.012, 4.725, 0.004, 0.025, 0.025, 0.036, 0.091, + 1.735, 0.008, 0.507, 0.001, 0.001, 0.002, 0.02, 0.012, 0.0001, 0.005, + 0.005, 0.004, 0.001, 0.005, 0.009, 0.069, 0.224, 0.005, 0.08, 0.002, + 0.401, 5.353, 1.186, 2.395, 1.412, 0.054, 0.699, 0.376, 0.232, 1.576, + 0.068, 2.734, 0.325, 1.531, 0.466, 0.218, 0.1, 0.222, 0.073, 1.112, + 0.88, 0.012, 0.002, 0.002, 1.074, 0.003, 0.0001, 0.0001, 0.008, 0.011, + 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.001, 0.005, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.002, 18.028, 10.547, 4.494, 8.618, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.001, 0.049, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.043, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + uz: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.321, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.468, 0.001, 0.189, 0.0001, + 0.0001, 0.012, 0.0001, 0.019, 0.383, 0.392, 0.002, 0.002, 1.018, 0.346, + 1.56, 0.012, 0.451, 0.539, 0.363, 0.217, 0.199, 0.207, 0.182, 0.168, + 0.187, 0.31, 0.029, 0.042, 0.003, 0.005, 0.003, 0.002, 0.0001, 0.288, + 0.177, 0.127, 0.096, 0.051, 0.092, 0.103, 0.072, 0.123, 0.042, 0.115, + 0.075, 0.277, 0.092, 0.158, 0.088, 0.099, 0.095, 0.293, 0.135, 0.08, + 0.063, 0.021, 0.043, 0.077, 0.019, 0.006, 0.0001, 0.006, 0.001, 0.001, + 0.005, 11.395, 1.621, 0.663, 2.97, 1.946, 0.469, 2.488, 2.791, 9.732, + 0.446, 2.32, 4.562, 2.354, 4.897, 4.652, 0.487, 1.34, 4.598, 3.575, + 3.341, 2.208, 1.083, 0.027, 0.322, 2.128, 0.799, 0.0001, 0.002, 0.0001, + 0.001, 0.0001, 0.456, 0.006, 0.008, 0.004, 0.002, 0.001, 0.001, 0.001, + 0.003, 0.002, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.002, 0.001, 0.001, + 0.001, 0.165, 0.164, 0.0001, 0.001, 0.001, 0.064, 0.017, 0.001, 0.002, + 0.019, 0.002, 0.019, 0.002, 0.169, 0.003, 0.003, 0.0001, 0.002, 0.0001, + 0.0001, 0.002, 0.007, 0.014, 0.0001, 0.005, 0.001, 0.001, 0.0001, + 0.0001, 0.04, 0.006, 0.006, 0.01, 0.015, 0.009, 0.006, 0.002, 0.016, + 0.002, 0.006, 0.916, 0.127, 0.009, 0.012, 0.002, 0.0001, 0.0001, 0.192, + 0.06, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 1.018, 0.0001, + 0.0001, 0.0001, 0.001, 0.0001, 0.124, 0.036, 0.003, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.449, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + ve: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.731, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.522, 0.012, 0.078, 0.0001, + 0.0001, 0.001, 0.0001, 0.009, 0.159, 0.16, 0.0001, 0.001, 0.539, 0.225, + 1.016, 0.019, 0.145, 0.2, 0.126, 0.043, 0.046, 0.05, 0.05, 0.043, 0.035, + 0.051, 0.043, 0.011, 0.01, 0.003, 0.01, 0.007, 0.001, 0.246, 0.066, + 0.041, 0.13, 0.054, 0.04, 0.046, 0.163, 0.081, 0.023, 0.129, 0.141, + 0.422, 0.243, 0.021, 0.074, 0.002, 0.073, 0.154, 0.414, 0.061, 0.436, + 0.032, 0.007, 0.055, 0.059, 0.001, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 13.088, 1.237, 0.128, 2.934, 4.075, 0.966, 1.256, 7.989, 6.478, + 0.01, 1.611, 2.964, 2.428, 5.855, 4.328, 0.793, 0.003, 1.372, 2.898, + 2.532, 4.835, 2.93, 2.215, 0.021, 0.876, 1.698, 0.001, 0.0001, 0.001, + 0.0001, 0.0001, 0.04, 0.003, 0.001, 0.0001, 0.002, 0.021, 0.0001, 0.001, + 0.0001, 0.001, 0.0001, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.001, + 0.0001, 0.005, 0.137, 0.0001, 0.0001, 0.0001, 0.001, 0.005, 0.006, + 0.001, 0.001, 0.006, 0.005, 0.0001, 0.0001, 0.002, 0.001, 0.008, 0.001, + 0.0001, 0.0001, 0.007, 0.001, 0.0001, 0.0001, 0.0001, 0.004, 0.002, + 0.0001, 0.0001, 0.001, 0.008, 0.049, 0.003, 0.004, 0.0001, 0.0001, + 0.001, 0.0001, 0.157, 0.074, 0.001, 0.002, 0.0001, 0.026, 0.002, 0.001, + 0.0001, 0.0001, 0.0001, 0.017, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.014, 0.002, 0.006, 0.003, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.006, 0.231, 0.039, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, + ], + vec: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.253, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.683, 0.003, 0.435, 0.0001, + 0.0001, 0.011, 0.001, 0.612, 0.188, 0.187, 0.0001, 0.002, 0.962, 0.099, + 0.799, 0.015, 0.255, 0.324, 0.176, 0.103, 0.099, 0.11, 0.096, 0.095, + 0.113, 0.179, 0.07, 0.031, 0.016, 0.004, 0.016, 0.001, 0.0001, 0.22, + 0.135, 0.257, 0.11, 0.212, 0.092, 0.123, 0.029, 0.211, 0.028, 0.03, + 0.164, 0.197, 0.115, 0.055, 0.192, 0.012, 0.112, 0.28, 0.113, 0.043, + 0.127, 0.024, 0.034, 0.008, 0.022, 0.006, 0.0001, 0.006, 0.0001, 0.006, + 0.0001, 9.014, 0.584, 2.527, 3.084, 9.08, 0.695, 1.267, 0.67, 6.478, + 0.14, 0.121, 3.361, 1.486, 5.29, 5.96, 1.776, 0.156, 4.436, 3.403, + 4.054, 1.601, 1.042, 0.044, 0.834, 0.071, 0.222, 0.0001, 0.006, 0.0001, + 0.0001, 0.0001, 0.081, 0.084, 1.282, 0.004, 0.002, 0.002, 0.001, 0.002, + 0.002, 0.001, 0.001, 0.002, 0.003, 0.004, 0.001, 0.001, 0.002, 0.013, + 0.001, 0.01, 0.002, 0.001, 0.001, 0.008, 0.004, 0.058, 0.055, 0.001, + 0.003, 0.003, 0.0001, 0.001, 0.74, 0.012, 0.002, 0.002, 0.005, 0.001, + 0.002, 0.041, 0.204, 0.163, 0.002, 0.004, 0.188, 0.007, 0.001, 0.002, + 0.019, 0.005, 0.113, 0.084, 0.004, 0.003, 0.003, 0.001, 0.003, 0.085, + 0.013, 0.006, 0.006, 0.01, 0.027, 0.003, 0.0001, 0.0001, 0.074, 1.6, + 0.013, 1.389, 0.061, 0.0001, 0.005, 0.002, 0.001, 0.001, 0.001, 0.0001, + 0.014, 0.007, 0.012, 0.005, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.002, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.005, 0.013, 0.075, 0.002, 0.0001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + vep: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.78, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.379, 0.003, 0.471, 0.0001, + 0.001, 0.103, 0.0001, 0.568, 0.495, 0.495, 0.0001, 0.017, 1.052, 0.379, + 1.489, 0.012, 0.568, 0.707, 0.478, 0.223, 0.214, 0.232, 0.198, 0.192, + 0.203, 0.325, 0.211, 0.045, 0.002, 0.001, 0.002, 0.001, 0.0001, 0.203, + 0.112, 0.053, 0.077, 0.109, 0.05, 0.072, 0.067, 0.085, 0.066, 0.318, + 0.157, 0.187, 0.127, 0.087, 0.197, 0.001, 0.106, 0.305, 0.17, 0.046, + 0.359, 0.008, 0.005, 0.004, 0.023, 0.011, 0.0001, 0.011, 0.0001, 0.0001, + 0.0001, 7.907, 0.771, 0.299, 4.189, 5.699, 0.182, 1.123, 1.305, 7.031, + 1.198, 2.907, 3.562, 2.965, 5.97, 3.852, 1.33, 0.003, 2.724, 3.29, + 3.069, 2.779, 1.746, 0.01, 0.004, 0.024, 0.95, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.243, 0.042, 0.031, 0.026, 0.016, 0.009, 0.007, 0.007, + 0.018, 0.003, 0.008, 0.014, 0.04, 0.228, 0.004, 0.014, 0.011, 0.008, + 0.007, 0.006, 0.198, 0.004, 0.004, 0.004, 0.004, 0.01, 0.011, 0.006, + 0.059, 0.006, 0.007, 0.007, 0.049, 0.512, 0.005, 0.004, 1.459, 0.005, + 0.005, 0.012, 0.007, 0.009, 0.006, 0.076, 0.003, 0.005, 0.006, 0.008, + 0.087, 0.02, 0.049, 0.021, 0.019, 0.048, 0.155, 0.011, 0.041, 0.019, + 0.037, 0.102, 0.539, 0.049, 0.808, 0.016, 0.0001, 0.0001, 0.208, 2.197, + 0.255, 1.283, 0.0001, 0.0001, 0.0001, 0.018, 0.007, 0.013, 0.002, 0.001, + 0.025, 0.012, 0.469, 0.173, 0.003, 0.003, 0.001, 0.006, 0.006, 0.011, + 0.026, 0.019, 0.001, 0.001, 0.001, 0.0001, 0.001, 0.0001, 0.026, 0.012, + 0.203, 0.002, 0.001, 0.003, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + vls: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.228, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.739, 0.003, 0.38, 0.0001, + 0.0001, 0.005, 0.003, 0.744, 0.196, 0.195, 0.001, 0.001, 0.727, 0.325, + 0.943, 0.009, 0.279, 0.491, 0.2, 0.128, 0.127, 0.144, 0.128, 0.137, + 0.161, 0.217, 0.083, 0.01, 0.008, 0.003, 0.008, 0.002, 0.0001, 0.184, + 0.236, 0.118, 0.332, 0.112, 0.115, 0.126, 0.103, 0.261, 0.107, 0.122, + 0.141, 0.163, 0.108, 0.113, 0.118, 0.004, 0.127, 0.191, 0.088, 0.03, + 0.223, 0.122, 0.006, 0.022, 0.104, 0.001, 0.0001, 0.002, 0.0001, 0.001, + 0.0001, 4.751, 0.962, 1.1, 3.988, 12.635, 0.533, 2.162, 1.118, 4.159, + 0.386, 1.909, 2.864, 1.62, 7.645, 4.865, 1.022, 0.013, 4.762, 3.511, + 4.63, 2.292, 1.812, 1.033, 0.041, 0.74, 0.83, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.13, 0.003, 0.003, 0.001, 0.002, 0.001, 0.002, 0.001, + 0.001, 0.001, 0.008, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.008, 0.015, 0.0001, 0.0001, 0.0001, 0.025, 0.093, + 0.0001, 0.0001, 0.002, 0.002, 0.001, 0.001, 0.016, 0.003, 0.001, 0.001, + 0.002, 0.001, 0.001, 0.004, 0.09, 0.034, 0.493, 0.075, 0.001, 0.002, + 0.001, 0.006, 0.006, 0.003, 0.004, 0.004, 0.299, 0.002, 0.003, 0.001, + 0.002, 0.001, 0.002, 0.002, 0.005, 0.002, 0.001, 0.002, 0.0001, 0.0001, + 0.02, 1.045, 0.002, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.001, + 0.001, 0.0001, 0.007, 0.004, 0.008, 0.003, 0.0001, 0.0001, 0.0001, + 0.001, 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.002, 0.13, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + vo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.865, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 14.101, 0.0001, 0.089, 0.0001, + 0.177, 0.768, 0.0001, 0.013, 0.471, 0.471, 0.0001, 0.0001, 1.958, 0.301, + 1.263, 0.002, 1.009, 1.484, 1.145, 0.885, 0.977, 0.988, 0.827, 0.571, + 0.867, 0.731, 0.368, 0.112, 0.003, 0.0001, 0.003, 0.0001, 0.0001, 0.099, + 0.202, 0.186, 0.179, 0.034, 0.122, 0.068, 0.069, 0.028, 0.029, 0.035, + 0.486, 0.223, 0.193, 0.038, 0.198, 0.004, 0.074, 0.506, 0.089, 0.221, + 0.126, 0.048, 0.001, 0.008, 0.039, 0.004, 0.001, 0.005, 0.0001, 0.0001, + 0.0001, 5.558, 2.077, 0.284, 2.834, 4.622, 1.332, 0.379, 0.28, 4.679, + 0.128, 1.147, 4.377, 2.51, 5.854, 4.077, 1.175, 0.015, 1.237, 3.788, + 2.427, 1.276, 0.657, 0.06, 0.029, 0.621, 0.304, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.73, 0.001, 0.0001, 0.005, 0.073, 0.0001, 0.0001, + 0.0001, 0.0001, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.002, 0.0001, + 0.0001, 0.033, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.623, 0.0001, 0.0001, 0.045, 0.0001, 0.038, 0.009, 0.001, 0.006, 0.006, + 0.01, 2.184, 0.0001, 0.0001, 0.003, 0.022, 0.052, 0.002, 0.001, 0.0001, + 0.004, 0.0001, 0.0001, 0.27, 0.001, 0.247, 0.003, 0.014, 0.006, 1.503, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 1.216, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.516, 5.121, 0.006, 0.01, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.003, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.73, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, + ], + wa: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.065, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 16.234, 0.018, 0.387, 0.0001, + 0.0001, 0.001, 0.005, 1.403, 0.391, 0.397, 0.0001, 0.006, 1.323, 0.328, + 1.748, 0.02, 0.212, 0.344, 0.172, 0.086, 0.07, 0.086, 0.076, 0.078, + 0.098, 0.148, 0.393, 0.059, 0.003, 0.003, 0.006, 0.012, 0.0001, 0.126, + 0.117, 0.176, 0.177, 0.152, 0.211, 0.071, 0.055, 0.154, 0.041, 0.016, + 0.325, 0.219, 0.065, 0.097, 0.121, 0.003, 0.069, 0.125, 0.076, 0.016, + 0.053, 0.079, 0.005, 0.007, 0.005, 0.103, 0.0001, 0.103, 0.0001, 0.0001, + 0.0001, 4.343, 0.71, 2.121, 3.465, 9.326, 0.692, 0.491, 0.929, 5.047, + 0.968, 0.844, 3.108, 1.647, 4.913, 4.614, 1.529, 0.028, 3.303, 5.504, + 4.286, 1.947, 1.135, 0.682, 0.179, 1.059, 0.366, 0.0001, 0.075, 0.0001, + 0.0001, 0.0001, 0.076, 0.002, 0.002, 0.001, 0.001, 0.022, 0.001, 0.008, + 0.005, 0.003, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.0001, + 0.0001, 0.002, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.065, 0.0001, + 0.001, 0.004, 0.003, 0.0001, 0.001, 0.371, 0.002, 0.017, 0.001, 0.001, + 0.706, 0.003, 0.089, 0.451, 0.662, 0.205, 0.03, 0.001, 0.001, 0.639, + 0.002, 0.006, 0.002, 0.002, 0.001, 0.243, 0.004, 0.001, 0.001, 0.001, + 0.001, 0.002, 0.257, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.478, + 3.239, 0.002, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, + 0.0001, 0.0001, 0.002, 0.001, 0.006, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.08, 0.0001, 0.0001, 0.001, 0.001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + war: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.118, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 12.933, 0.0001, 1.377, 0.0001, + 0.0001, 0.0001, 0.003, 0.004, 0.008, 0.008, 0.0001, 0.0001, 0.432, + 0.073, 1.214, 0.001, 0.079, 0.266, 0.062, 0.046, 0.041, 0.046, 0.05, + 0.055, 0.111, 0.217, 0.037, 0.004, 0.001, 0.0001, 0.001, 0.0001, 0.0001, + 1.082, 0.154, 0.38, 0.175, 0.141, 0.098, 0.127, 0.173, 0.102, 0.057, + 0.046, 0.208, 0.316, 0.091, 0.096, 0.293, 0.004, 0.105, 0.232, 0.146, + 0.033, 0.038, 0.367, 0.012, 0.008, 0.019, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 13.129, 0.835, 2.123, 1.488, 5.092, 0.584, 3.71, 3.47, + 8.491, 0.033, 1.376, 3.841, 1.504, 9.228, 3.14, 2.313, 0.025, 2.807, + 5.239, 2.428, 2.957, 0.216, 0.413, 0.116, 1.506, 0.106, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, + 0.006, 0.001, 0.001, 0.001, 0.001, 0.0001, 0.002, 0.004, 0.019, 0.0001, + 0.001, 0.0001, 0.003, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.004, + 0.003, 0.0001, 0.004, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.006, + 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.06, 0.002, 0.003, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + wo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.906, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 18.371, 0.007, 0.083, 0.0001, + 0.0001, 0.002, 0.0001, 0.048, 0.243, 0.244, 0.0001, 0.001, 1.526, 0.299, + 0.6, 0.011, 0.077, 0.162, 0.075, 0.048, 0.048, 0.043, 0.038, 0.041, + 0.05, 0.065, 0.149, 0.021, 0.001, 0.005, 0.001, 0.009, 0.0001, 0.248, + 0.196, 0.082, 0.079, 0.037, 0.083, 0.06, 0.026, 0.08, 0.079, 0.082, + 0.102, 0.179, 0.109, 0.049, 0.052, 0.005, 0.054, 0.208, 0.113, 0.015, + 0.012, 0.059, 0.037, 0.106, 0.002, 0.002, 0.0001, 0.002, 0.0001, 0.001, + 0.0001, 10.502, 2.142, 1.408, 2.296, 5.004, 0.815, 2.647, 0.171, 6.017, + 1.265, 2.73, 3.516, 3.296, 5.064, 5.377, 0.616, 0.08, 2.151, 1.518, + 2.39, 4.356, 0.021, 1.494, 1.066, 2.37, 0.019, 0.002, 0.0001, 0.004, + 0.0001, 0.0001, 0.102, 0.006, 0.003, 0.003, 0.01, 0.005, 0.004, 0.003, + 0.005, 0.001, 0.005, 0.02, 0.001, 0.001, 0.008, 0.002, 0.005, 0.039, + 0.003, 0.026, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.041, 0.001, 0.0001, + 0.016, 0.015, 0.0001, 0.0001, 0.641, 0.001, 0.002, 0.004, 0.002, 0.001, + 0.001, 0.012, 0.011, 0.402, 0.004, 0.775, 0.001, 0.002, 0.001, 0.002, + 0.004, 0.912, 0.013, 0.056, 0.002, 0.002, 0.001, 0.002, 0.003, 0.003, + 0.002, 0.013, 0.001, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.028, 2.826, + 0.002, 0.019, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.002, + 0.0001, 0.004, 0.002, 0.016, 0.018, 0.0001, 0.0001, 0.0001, 0.0001, + 0.003, 0.007, 0.033, 0.053, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.001, 0.0001, 0.096, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + wuu: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.208, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.344, 0.001, 0.064, 0.0001, + 0.0001, 0.012, 0.001, 0.005, 0.037, 0.032, 0.001, 0.002, 0.029, 0.05, + 0.042, 0.019, 0.267, 0.364, 0.21, 0.108, 0.106, 0.12, 0.107, 0.1, 0.123, + 0.181, 0.013, 0.001, 0.013, 0.002, 0.013, 0.001, 0.0001, 0.027, 0.021, + 0.029, 0.015, 0.013, 0.01, 0.014, 0.013, 0.018, 0.007, 0.011, 0.017, + 0.022, 0.016, 0.01, 0.023, 0.002, 0.017, 0.03, 0.019, 0.009, 0.006, + 0.008, 0.002, 0.003, 0.002, 0.03, 0.0001, 0.03, 0.0001, 0.003, 0.0001, + 0.184, 0.024, 0.041, 0.051, 0.161, 0.019, 0.037, 0.056, 0.143, 0.005, + 0.024, 0.082, 0.047, 0.138, 0.118, 0.028, 0.006, 0.111, 0.081, 0.088, + 0.07, 0.016, 0.015, 0.01, 0.024, 0.008, 0.001, 0.002, 0.001, 0.001, + 0.0001, 2.843, 1.238, 1.324, 0.655, 0.418, 1.022, 0.586, 0.937, 1.267, + 1.305, 0.731, 1.421, 2.335, 0.988, 0.859, 1.016, 1.143, 0.568, 0.436, + 0.439, 0.836, 0.673, 0.873, 1.003, 0.932, 0.655, 0.691, 1.033, 1.591, + 0.82, 0.469, 0.875, 0.536, 0.577, 0.431, 0.453, 0.911, 0.859, 0.578, + 0.722, 0.777, 0.496, 1.371, 0.496, 0.553, 1.219, 0.891, 1.125, 1.185, + 0.888, 0.563, 0.66, 0.876, 0.472, 0.61, 0.726, 3.021, 1.231, 1.855, + 1.189, 2.708, 1.052, 0.869, 1.001, 0.0001, 0.0001, 0.059, 0.019, 0.003, + 0.003, 0.001, 0.0001, 0.0001, 0.005, 0.002, 0.002, 0.002, 0.0001, 0.011, + 0.004, 0.02, 0.007, 0.0001, 0.0001, 0.0001, 0.0001, 0.001, 0.003, 0.011, + 0.009, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.0001, 0.068, 0.005, + 0.208, 1.565, 4.388, 9.361, 5.679, 3.099, 2.882, 2.131, 0.002, 0.004, + 0.008, 0.002, 0.0001, 1.953, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + xal: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 2.016, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 7.801, 0.002, 0.076, 0.0001, + 0.0001, 0.005, 0.0001, 0.002, 0.134, 0.134, 0.001, 0.003, 0.529, 0.574, + 0.918, 0.006, 0.214, 0.423, 0.268, 0.17, 0.177, 0.128, 0.129, 0.128, + 0.121, 0.185, 0.028, 0.007, 0.006, 0.001, 0.006, 0.006, 0.0001, 0.005, + 0.004, 0.004, 0.001, 0.002, 0.002, 0.002, 0.002, 0.006, 0.001, 0.002, + 0.002, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.002, 0.005, 0.003, 0.001, + 0.002, 0.003, 0.004, 0.001, 0.001, 0.005, 0.0001, 0.006, 0.0001, 0.005, + 0.0001, 0.064, 0.016, 0.035, 0.026, 0.079, 0.017, 0.024, 0.144, 0.059, + 0.003, 0.012, 0.04, 0.028, 0.059, 0.05, 0.015, 0.002, 0.048, 0.045, + 0.048, 0.035, 0.008, 0.009, 0.006, 0.012, 0.006, 0.0001, 0.002, 0.0001, + 0.0001, 0.0001, 2.512, 1.678, 1.585, 1.178, 0.036, 0.859, 0.336, 0.487, + 0.211, 0.008, 0.012, 0.272, 0.319, 0.492, 0.054, 0.135, 0.09, 0.152, + 0.041, 0.073, 0.19, 0.017, 0.022, 0.69, 0.054, 1.446, 0.115, 0.043, + 0.168, 0.153, 0.159, 0.053, 0.055, 0.105, 0.151, 0.242, 0.028, 0.118, + 0.031, 0.02, 0.093, 0.554, 0.004, 0.02, 0.002, 0.072, 0.031, 0.849, + 3.75, 1.252, 0.825, 1.816, 2.139, 1.256, 0.115, 0.387, 2.666, 0.446, + 0.987, 3.364, 1.079, 4.101, 2.147, 0.166, 0.0001, 0.0001, 0.041, 0.006, + 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.038, 0.0001, 0.0001, 0.004, + 0.0001, 0.007, 0.004, 27.749, 10.017, 2.264, 1.98, 0.0001, 0.003, 0.001, + 0.001, 0.002, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.024, 0.035, 0.127, 0.0001, 0.0001, 0.004, 0.002, 0.001, 0.001, 0.0001, + 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, + ], + xh: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.827, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 11.133, 0.013, 0.259, 0.004, + 0.001, 0.009, 0.002, 0.046, 0.125, 0.123, 0.001, 0.005, 0.846, 0.831, + 0.912, 0.026, 0.163, 0.218, 0.112, 0.059, 0.052, 0.058, 0.048, 0.051, + 0.067, 0.118, 0.048, 0.023, 0.018, 0.006, 0.018, 0.006, 0.0001, 0.218, + 0.122, 0.114, 0.05, 0.111, 0.054, 0.063, 0.043, 0.32, 0.057, 0.15, + 0.086, 0.186, 0.216, 0.074, 0.101, 0.011, 0.057, 0.136, 0.094, 0.198, + 0.022, 0.071, 0.041, 0.042, 0.046, 0.076, 0.001, 0.076, 0.0001, 0.013, + 0.0001, 10.703, 2.404, 0.805, 1.231, 8.068, 0.529, 2.029, 3.142, 7.484, + 0.244, 4.325, 4.529, 2.518, 6.863, 5.226, 0.943, 0.434, 1.064, 2.867, + 2.574, 4.687, 0.307, 2.513, 0.353, 2.341, 2.213, 0.002, 0.028, 0.002, + 0.0001, 0.0001, 0.043, 0.003, 0.001, 0.001, 0.002, 0.0001, 0.004, 0.012, + 0.003, 0.001, 0.001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.002, 0.001, + 0.004, 0.01, 0.003, 0.0001, 0.0001, 0.001, 0.003, 0.018, 0.0001, 0.0001, + 0.005, 0.005, 0.0001, 0.001, 0.1, 0.005, 0.001, 0.004, 0.001, 0.0001, + 0.0001, 0.003, 0.001, 0.007, 0.001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.001, 0.001, 0.001, 0.004, 0.001, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.002, 0.001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.101, + 0.03, 0.014, 0.003, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, + 0.0001, 0.004, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.001, 0.049, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + xmf: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.601, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 4.701, 0.001, 0.058, 0.0001, + 0.0001, 0.01, 0.0001, 0.002, 0.121, 0.121, 0.0001, 0.001, 0.458, 0.166, + 0.464, 0.005, 0.164, 0.192, 0.121, 0.06, 0.056, 0.064, 0.055, 0.055, + 0.065, 0.102, 0.028, 0.018, 0.001, 0.001, 0.001, 0.0001, 0.0001, 0.008, + 0.006, 0.008, 0.007, 0.003, 0.004, 0.003, 0.003, 0.027, 0.001, 0.002, + 0.006, 0.007, 0.003, 0.003, 0.005, 0.0001, 0.004, 0.007, 0.009, 0.002, + 0.008, 0.003, 0.01, 0.001, 0.0001, 0.006, 0.0001, 0.006, 0.0001, 0.001, + 0.0001, 0.041, 0.006, 0.016, 0.012, 0.042, 0.004, 0.007, 0.012, 0.032, + 0.001, 0.006, 0.021, 0.011, 0.029, 0.03, 0.007, 0.001, 0.029, 0.023, + 0.023, 0.015, 0.005, 0.003, 0.002, 0.006, 0.002, 0.0001, 0.001, 0.0001, + 0.0001, 0.0001, 0.172, 0.003, 0.002, 30.333, 0.002, 0.001, 0.001, 0.001, + 0.001, 0.0001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 4.083, 0.506, + 0.555, 0.957, 2.283, 0.421, 0.156, 0.803, 3.59, 0.653, 1.19, 1.236, + 1.788, 2.02, 0.312, 0.098, 2.097, 1.217, 0.638, 1.469, 0.698, 0.389, + 0.172, 0.093, 1.339, 0.152, 0.183, 0.083, 0.259, 0.102, 0.41, 0.184, + 0.054, 0.009, 0.013, 0.002, 0.001, 0.003, 0.001, 0.323, 0.062, 0.002, + 0.002, 0.002, 0.002, 0.003, 0.004, 0.002, 0.0001, 0.0001, 0.043, 0.004, + 0.001, 0.001, 0.007, 0.0001, 0.0001, 0.001, 0.0001, 0.001, 0.001, + 0.0001, 0.011, 0.002, 0.023, 0.008, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.001, 0.004, 0.003, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.009, 30.332, 0.17, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + yi: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.709, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.298, 0.002, 0.186, 0.0001, + 0.001, 0.004, 0.006, 0.121, 0.075, 0.076, 0.0001, 0.0001, 0.466, 0.059, + 0.46, 0.006, 0.099, 0.114, 0.062, 0.037, 0.035, 0.037, 0.03, 0.03, + 0.038, 0.064, 0.034, 0.015, 0.001, 0.001, 0.001, 0.002, 0.0001, 0.003, + 0.003, 0.004, 0.003, 0.002, 0.002, 0.002, 0.002, 0.002, 0.001, 0.001, + 0.002, 0.003, 0.002, 0.002, 0.002, 0.0001, 0.002, 0.004, 0.003, 0.001, + 0.001, 0.002, 0.0001, 0.0001, 0.0001, 0.003, 0.0001, 0.003, 0.0001, + 0.001, 0.0001, 0.02, 0.003, 0.006, 0.007, 0.022, 0.003, 0.004, 0.006, + 0.017, 0.0001, 0.003, 0.01, 0.006, 0.015, 0.021, 0.004, 0.006, 0.015, + 0.011, 0.018, 0.013, 0.002, 0.003, 0.001, 0.003, 0.001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.013, 0.004, 0.003, 0.001, 0.001, 0.001, 0.001, + 0.001, 0.001, 0.0001, 0.0001, 0.001, 0.001, 0.0001, 0.0001, 0.001, + 5.002, 1.068, 1.228, 1.611, 0.814, 3.904, 1.071, 0.178, 2.364, 5.673, + 0.275, 0.347, 1.459, 0.389, 1.018, 2.472, 1.73, 1.057, 4.356, 0.098, + 1.356, 0.06, 0.547, 0.832, 3.227, 0.975, 0.239, 0.001, 0.001, 0.001, + 0.0001, 0.001, 0.02, 0.006, 0.026, 0.005, 0.016, 0.005, 0.002, 0.163, + 0.104, 0.003, 0.002, 0.002, 0.041, 0.002, 0.022, 0.034, 0.0001, 0.0001, + 0.015, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.003, 0.001, 0.029, 0.011, 0.0001, 0.0001, + 0.0001, 0.0001, 0.372, 43.367, 0.002, 0.002, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.002, 0.0001, 0.011, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + yo: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 3.162, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 13.013, 0.002, 0.102, 0.0001, + 0.001, 0.004, 0.001, 0.025, 0.251, 0.249, 0.0001, 0.001, 0.499, 0.259, + 1.047, 0.013, 0.386, 0.744, 0.471, 0.336, 0.305, 0.301, 0.323, 0.299, + 0.314, 0.417, 0.09, 0.08, 0.008, 0.009, 0.008, 0.006, 0.0001, 0.462, + 0.171, 0.128, 0.102, 0.134, 0.101, 0.156, 0.11, 0.251, 0.116, 0.194, + 0.108, 0.188, 0.187, 0.263, 0.133, 0.007, 0.102, 0.27, 0.148, 0.037, + 0.042, 0.07, 0.006, 0.044, 0.016, 0.007, 0.0001, 0.008, 0.0001, 0.001, + 0.001, 4.068, 1.959, 0.507, 1.515, 3.958, 0.547, 1.326, 0.747, 4.508, + 1.331, 1.562, 2.445, 1.011, 4.469, 3.265, 1.008, 0.02, 3.063, 1.958, + 2.732, 1.408, 0.219, 0.852, 0.039, 0.732, 0.092, 0.0001, 0.013, 0.0001, + 0.0001, 0.0001, 0.678, 1.441, 0.002, 0.002, 0.064, 0.002, 0.001, 0.002, + 0.025, 0.003, 0.001, 0.001, 0.172, 1.046, 0.0001, 0.0001, 0.001, 0.001, + 0.032, 0.052, 0.002, 0.0001, 0.0001, 0.0001, 0.018, 0.066, 0.002, 0.001, + 0.007, 0.006, 0.0001, 0.001, 1.085, 1.316, 0.01, 0.17, 0.004, 0.001, + 0.001, 0.003, 0.307, 0.812, 0.001, 0.003, 1.559, 1.199, 0.001, 0.002, + 0.003, 0.004, 0.287, 0.374, 0.003, 0.002, 0.006, 0.001, 0.038, 1.787, + 1.887, 1.09, 0.005, 0.003, 0.003, 0.001, 0.0001, 0.0001, 0.021, 7.862, + 0.009, 0.075, 0.0001, 0.008, 0.0001, 0.001, 0.001, 0.001, 1.898, 0.0001, + 0.005, 0.002, 0.012, 0.004, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, + 0.0001, 0.005, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.004, 2.718, 0.12, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + za: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.779, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 9.452, 0.003, 0.07, 0.0001, + 0.001, 0.016, 0.002, 0.054, 0.186, 0.179, 0.001, 0.0001, 0.82, 0.089, + 0.74, 0.012, 0.236, 0.344, 0.171, 0.097, 0.104, 0.109, 0.078, 0.094, + 0.113, 0.172, 0.091, 0.029, 0.001, 0.001, 0.002, 0.003, 0.0001, 0.117, + 0.253, 0.245, 0.236, 0.047, 0.096, 0.232, 0.128, 0.101, 0.031, 0.049, + 0.109, 0.142, 0.114, 0.031, 0.114, 0.005, 0.051, 0.316, 0.07, 0.028, + 0.136, 0.041, 0.012, 0.157, 0.02, 0.003, 0.0001, 0.003, 0.0001, 0.0001, + 0.0001, 4.452, 1.127, 1.557, 2.16, 5.66, 0.54, 3.525, 2.807, 4.357, + 1.245, 0.519, 1.215, 1.057, 5.149, 2.46, 0.332, 0.75, 1.554, 1.842, + 1.639, 2.859, 0.55, 1.169, 0.375, 1.034, 2.115, 0.002, 0.0001, 0.002, + 0.001, 0.0001, 1.059, 0.53, 0.446, 0.215, 0.472, 0.297, 0.257, 0.268, + 0.372, 0.375, 0.213, 0.338, 0.751, 0.361, 0.284, 0.332, 0.27, 0.144, + 0.117, 0.272, 0.266, 0.278, 0.305, 0.293, 0.26, 0.335, 0.49, 0.247, + 0.537, 0.19, 0.142, 0.27, 0.209, 0.19, 0.122, 0.13, 0.301, 0.259, 0.231, + 0.235, 0.283, 0.134, 0.154, 0.156, 0.162, 0.375, 0.302, 0.377, 0.293, + 0.227, 0.124, 0.201, 0.231, 0.092, 0.229, 0.184, 0.748, 0.296, 0.646, + 0.455, 0.756, 0.262, 0.268, 0.277, 0.0001, 0.0001, 0.072, 0.167, 0.018, + 0.011, 0.0001, 0.002, 0.0001, 0.002, 0.001, 0.001, 0.001, 0.0001, 0.006, + 0.002, 0.014, 0.004, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.012, 0.01, 0.002, 0.002, 0.0001, 0.0001, 0.0001, 0.0001, 0.022, 0.008, + 0.114, 0.555, 1.309, 2.559, 1.698, 1.364, 0.916, 0.712, 0.001, 0.001, + 0.001, 0.0001, 0.0001, 0.518, 0.001, 0.0001, 0.0001, 0.003, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, + ], + zea: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.532, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 15.056, 0.008, 0.162, 0.0001, + 0.0001, 0.007, 0.001, 1.415, 0.162, 0.162, 0.0001, 0.0001, 1.0, 0.532, + 1.127, 0.004, 0.395, 0.563, 0.389, 0.394, 0.405, 0.319, 0.329, 0.24, + 0.265, 0.382, 0.062, 0.076, 0.002, 0.003, 0.001, 0.008, 0.0001, 0.28, + 0.228, 0.122, 0.346, 0.208, 0.185, 0.11, 0.117, 0.317, 0.071, 0.084, + 0.154, 0.152, 0.245, 0.188, 0.145, 0.004, 0.099, 0.307, 0.104, 0.026, + 0.15, 0.089, 0.002, 0.005, 0.114, 0.003, 0.0001, 0.003, 0.0001, 0.0001, + 0.001, 4.665, 0.916, 0.779, 3.731, 13.123, 0.39, 1.695, 1.202, 4.867, + 0.455, 1.861, 2.604, 1.621, 7.033, 3.935, 1.063, 0.011, 4.601, 3.105, + 3.908, 1.82, 1.832, 0.958, 0.04, 0.135, 0.573, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.482, 0.005, 0.003, 0.002, 0.003, 0.002, 0.001, 0.001, + 0.002, 0.005, 0.002, 0.001, 0.001, 0.002, 0.0001, 0.001, 0.001, 0.001, + 0.001, 0.005, 0.003, 0.001, 0.0001, 0.001, 0.021, 0.432, 0.001, 0.001, + 0.01, 0.009, 0.003, 0.005, 0.009, 0.008, 0.021, 0.001, 0.002, 0.001, + 0.003, 0.005, 0.09, 0.052, 0.453, 0.056, 0.009, 0.006, 0.003, 0.006, + 0.115, 0.002, 0.14, 0.027, 0.252, 0.001, 0.064, 0.0001, 0.002, 0.002, + 0.002, 0.006, 0.004, 0.002, 0.002, 0.001, 0.0001, 0.0001, 0.239, 1.084, + 0.009, 0.01, 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.005, 0.002, 0.008, 0.003, 0.0001, 0.0001, 0.0001, 0.001, + 0.0001, 0.002, 0.007, 0.005, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.002, 0.003, 0.481, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], + zu: [ + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 1.261, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 10.94, 0.004, 0.267, 0.001, + 0.002, 0.016, 0.003, 0.041, 0.181, 0.181, 0.001, 0.001, 0.907, 0.49, + 0.797, 0.099, 0.343, 0.379, 0.279, 0.134, 0.118, 0.116, 0.102, 0.097, + 0.11, 0.223, 0.065, 0.035, 0.134, 0.003, 0.135, 0.005, 0.0001, 0.296, + 0.147, 0.142, 0.093, 0.11, 0.08, 0.077, 0.065, 0.3, 0.114, 0.141, 0.151, + 0.361, 0.387, 0.067, 0.128, 0.012, 0.082, 0.239, 0.152, 0.188, 0.039, + 0.182, 0.012, 0.045, 0.07, 0.138, 0.0001, 0.139, 0.0001, 0.001, 0.0001, + 10.325, 2.215, 0.829, 1.627, 7.521, 0.687, 2.042, 3.525, 7.719, 0.199, + 3.874, 4.421, 2.406, 6.494, 4.881, 0.951, 0.342, 1.361, 3.011, 2.552, + 4.691, 0.394, 2.227, 0.134, 1.688, 1.779, 0.0001, 0.002, 0.0001, 0.0001, + 0.0001, 0.08, 0.007, 0.001, 0.001, 0.002, 0.0001, 0.014, 0.002, 0.002, + 0.001, 0.0001, 0.001, 0.003, 0.005, 0.001, 0.002, 0.002, 0.014, 0.001, + 0.01, 0.003, 0.0001, 0.001, 0.001, 0.002, 0.06, 0.0001, 0.001, 0.003, + 0.003, 0.001, 0.0001, 0.084, 0.004, 0.0001, 0.001, 0.001, 0.0001, 0.002, + 0.004, 0.002, 0.005, 0.003, 0.001, 0.001, 0.002, 0.001, 0.0001, 0.004, + 0.003, 0.003, 0.005, 0.002, 0.002, 0.001, 0.006, 0.005, 0.002, 0.003, + 0.005, 0.002, 0.003, 0.003, 0.0001, 0.0001, 0.0001, 0.089, 0.024, 0.004, + 0.007, 0.0001, 0.0001, 0.0001, 0.002, 0.001, 0.001, 0.0001, 0.0001, + 0.002, 0.001, 0.029, 0.011, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.001, 0.005, 0.002, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.002, 0.002, 0.091, 0.001, 0.0001, 0.001, 0.002, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, + ], }); /** diff --git a/src/core/lib/PGP.mjs b/src/core/lib/PGP.mjs index cbb31b92..3cb4cad6 100644 --- a/src/core/lib/PGP.mjs +++ b/src/core/lib/PGP.mjs @@ -14,13 +14,15 @@ import OperationError from "../errors/OperationError.mjs"; import { isWorkerEnvironment } from "../Utils.mjs"; import kbpgp from "kbpgp"; import * as es6promisify from "es6-promisify"; -const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; +const promisify = es6promisify.default + ? es6promisify.default.promisify + : es6promisify.promisify; /** * Progress callback */ export const ASP = kbpgp.ASP({ - "progress_hook": info => { + progress_hook: (info) => { let msg = ""; switch (info.what) { @@ -46,9 +48,8 @@ export const ASP = kbpgp.ASP({ msg = `Stage: ${info.what}`; } - if (isWorkerEnvironment()) - self.sendStatusMessage(msg); - } + if (isWorkerEnvironment()) self.sendStatusMessage(msg); + }, }); /** @@ -62,33 +63,35 @@ export function getSubkeySize(keySize) { 1024: 1024, 2048: 1024, 4096: 2048, - 256: 256, - 384: 256, + 256: 256, + 384: 256, }[keySize]; } /** -* Import private key and unlock if necessary -* -* @param {string} privateKey -* @param {string} [passphrase] -* @returns {Object} -*/ + * Import private key and unlock if necessary + * + * @param {string} privateKey + * @param {string} [passphrase] + * @returns {Object} + */ export async function importPrivateKey(privateKey, passphrase) { try { const key = await promisify(kbpgp.KeyManager.import_from_armored_pgp)({ armored: privateKey, opts: { - "no_check_keys": true - } + no_check_keys: true, + }, }); if (key.is_pgp_locked()) { if (passphrase) { await promisify(key.unlock_pgp.bind(key))({ - passphrase + passphrase, }); } else { - throw new OperationError("Did not provide passphrase with locked private key."); + throw new OperationError( + "Did not provide passphrase with locked private key.", + ); } } return key; @@ -103,13 +106,13 @@ export async function importPrivateKey(privateKey, passphrase) { * @param {string} publicKey * @returns {Object} */ -export async function importPublicKey (publicKey) { +export async function importPublicKey(publicKey) { try { const key = await promisify(kbpgp.KeyManager.import_from_armored_pgp)({ armored: publicKey, opts: { - "no_check_keys": true - } + no_check_keys: true, + }, }); return key; } catch (err) { diff --git a/src/core/lib/Protobuf.mjs b/src/core/lib/Protobuf.mjs index e131d3a5..c1fc86d6 100644 --- a/src/core/lib/Protobuf.mjs +++ b/src/core/lib/Protobuf.mjs @@ -13,7 +13,6 @@ import protobuf from "protobufjs"; * @license Apache-2.0 */ class Protobuf { - /** * Protobuf constructor * @@ -125,7 +124,8 @@ class Protobuf { try { this.parsedProto = protobuf.parse(protoText); if (this.parsedProto.package) { - this.parsedProto.root = this.parsedProto.root.nested[this.parsedProto.package]; + this.parsedProto.root = + this.parsedProto.root.nested[this.parsedProto.package]; } this.updateMainMessageName(); } catch (error) { @@ -140,12 +140,14 @@ class Protobuf { static updateMainMessageName() { const messageNames = []; const fieldTypes = []; - this.parsedProto.root.nestedArray.forEach(block => { + this.parsedProto.root.nestedArray.forEach((block) => { if (block instanceof protobuf.Type) { messageNames.push(block.name); - this.parsedProto.root.nested[block.name].fieldsArray.forEach(field => { - fieldTypes.push(field.type); - }); + this.parsedProto.root.nested[block.name].fieldsArray.forEach( + (field) => { + fieldTypes.push(field.type); + }, + ); } }); @@ -175,7 +177,9 @@ class Protobuf { if (this.showTypes) { rawDecode = this.showRawTypes(rawDecode, pb.fieldTypes); - this.parsedProto.root = this.appendTypesToFieldNames(this.parsedProto.root); + this.parsedProto.root = this.appendTypesToFieldNames( + this.parsedProto.root, + ); } try { @@ -184,18 +188,20 @@ class Protobuf { bytes: String, longs: Number, enums: String, - defaults: true + defaults: true, }); const output = {}; if (this.showUnknownFields) { output[message.name] = packageDecode; - output["Unknown Fields"] = this.compareFields(rawDecode, message); + output["Unknown Fields"] = this.compareFields( + rawDecode, + message, + ); return output; } else { return packageDecode; } - } catch (error) { if (message) { throw new Error("Input " + error); @@ -214,9 +220,20 @@ class Protobuf { static appendTypesToFieldNames(schemaRoot) { for (const block of schemaRoot.nestedArray) { if (block instanceof protobuf.Type) { - for (const [fieldName, fieldData] of Object.entries(block.fields)) { - schemaRoot.nested[block.name].remove(block.fields[fieldName]); - schemaRoot.nested[block.name].add(new protobuf.Field(`${fieldName} (${fieldData.type})`, fieldData.id, fieldData.type, fieldData.rule)); + for (const [fieldName, fieldData] of Object.entries( + block.fields, + )) { + schemaRoot.nested[block.name].remove( + block.fields[fieldName], + ); + schemaRoot.nested[block.name].add( + new protobuf.Field( + `${fieldName} (${fieldData.type})`, + fieldData.id, + fieldData.type, + fieldData.rule, + ), + ); } } } @@ -244,27 +261,31 @@ class Protobuf { if (Array.isArray(value)) { const fieldInstances = []; for (const instance of Object.keys(value)) { - if (typeof(value[instance]) !== "string") { - fieldInstances.push(this.showRawTypes(value[instance], fieldType)); + if (typeof value[instance] !== "string") { + fieldInstances.push( + this.showRawTypes(value[instance], fieldType), + ); } else { fieldInstances.push(value[instance]); } } outputFieldValue = fieldInstances; - // Single submessage + // Single submessage } else { outputFieldValue = this.showRawTypes(value, fieldType); } - // Non-submessage field + // Non-submessage field } else { outputFieldType = fieldType; outputFieldValue = value; } // Substitute fieldNum with field number and type - rawDecode[`field #${fieldNum}: ${this.getTypeInfo(outputFieldType)}`] = outputFieldValue; + rawDecode[ + `field #${fieldNum}: ${this.getTypeInfo(outputFieldType)}` + ] = outputFieldValue; delete rawDecode[fieldNum]; } return rawDecode; @@ -281,7 +302,10 @@ class Protobuf { // Define message data using raw decode output and schema const schemaFieldProperties = {}; const schemaFieldNames = Object.keys(schemaMessage.fields); - schemaFieldNames.forEach(field => schemaFieldProperties[schemaMessage.fields[field].id] = field); + schemaFieldNames.forEach( + (field) => + (schemaFieldProperties[schemaMessage.fields[field].id] = field), + ); // Loop over each field present in the raw decode output for (const fieldName in rawDecodedMessage) { @@ -302,21 +326,26 @@ class Protobuf { // Check for repeated fields if (Array.isArray(rawFieldData) && !schemaField.repeated) { - rawDecodedMessage[`(${schemaMessage.name}) ${schemaFieldName} is a repeated field`] = rawFieldData; + rawDecodedMessage[ + `(${schemaMessage.name}) ${schemaFieldName} is a repeated field` + ] = rawFieldData; } // Check for submessage fields if (schemaField.resolvedType instanceof protobuf.Type) { - const subMessageType = schemaMessage.fields[schemaFieldName].type; - const schemaSubMessage = this.parsedProto.root.nested[subMessageType]; + const subMessageType = + schemaMessage.fields[schemaFieldName].type; + const schemaSubMessage = + this.parsedProto.root.nested[subMessageType]; const rawSubMessages = rawDecodedMessage[fieldName]; let rawDecodedSubMessage = {}; // Squash multiple submessage instances into one submessage if (Array.isArray(rawSubMessages)) { - rawSubMessages.forEach(subMessageInstance => { - const instanceFields = Object.entries(subMessageInstance); - instanceFields.forEach(subField => { + rawSubMessages.forEach((subMessageInstance) => { + const instanceFields = + Object.entries(subMessageInstance); + instanceFields.forEach((subField) => { rawDecodedSubMessage[subField[0]] = subField[1]; }); }); @@ -325,9 +354,14 @@ class Protobuf { } // Treat submessage as own message and compare its fields - rawDecodedSubMessage = Protobuf.compareFields(rawDecodedSubMessage, schemaSubMessage); + rawDecodedSubMessage = Protobuf.compareFields( + rawDecodedSubMessage, + schemaSubMessage, + ); if (Object.entries(rawDecodedSubMessage).length !== 0) { - rawDecodedMessage[`${schemaFieldName} (${subMessageType}) has missing fields`] = rawDecodedSubMessage; + rawDecodedMessage[ + `${schemaFieldName} (${subMessageType}) has missing fields` + ] = rawDecodedSubMessage; } } delete rawDecodedMessage[fieldName]; @@ -392,11 +426,11 @@ class Protobuf { // Get the field key/values const key = field.key; const value = field.value; - object[key] = Object.prototype.hasOwnProperty.call(object, key) ? - object[key] instanceof Array ? - object[key].concat([value]) : - [object[key], value] : - value; + object[key] = Object.prototype.hasOwnProperty.call(object, key) + ? object[key] instanceof Array + ? object[key].concat([value]) + : [object[key], value] + : value; return object; } @@ -412,23 +446,23 @@ class Protobuf { const type = header.type; const key = header.key; - if (typeof(this.fieldTypes[key]) !== "object") { + if (typeof this.fieldTypes[key] !== "object") { this.fieldTypes[key] = type; } switch (type) { // varint case 0: - return { "key": key, "value": this._varInt() }; + return { key: key, value: this._varInt() }; // fixed 64 case 1: - return { "key": key, "value": this._uint64() }; + return { key: key, value: this._uint64() }; // length delimited case 2: - return { "key": key, "value": this._lenDelim(key) }; + return { key: key, value: this._lenDelim(key) }; // fixed 32 case 5: - return { "key": key, "value": this._uint32() }; + return { key: key, value: this._uint32() }; // unknown type default: throw new Error("Unknown type 0x" + type.toString(16)); @@ -443,7 +477,7 @@ class Protobuf { */ _fieldHeader() { // Make sure we call type then number to preserve offset - return { "type": this._fieldType(), "key": this._fieldNumber() }; + return { type: this._fieldType(), key: this._fieldNumber() }; } /** @@ -472,11 +506,13 @@ class Protobuf { let shift = -3; let fieldNumber = 0; do { - fieldNumber += shift < 28 ? - shift === -3 ? - (this.data[this.offset] & this.NUMBER) >> -shift : - (this.data[this.offset] & this.VALUE) << shift : - (this.data[this.offset] & this.VALUE) * Math.pow(2, shift); + fieldNumber += + shift < 28 + ? shift === -3 + ? (this.data[this.offset] & this.NUMBER) >> -shift + : (this.data[this.offset] & this.VALUE) << shift + : (this.data[this.offset] & this.VALUE) * + Math.pow(2, shift); shift += 7; } while ((this.data[this.offset++] & this.MSB) === this.MSB); return fieldNumber; @@ -495,9 +531,11 @@ class Protobuf { let shift = 0; // Keep reading while upper bit set do { - value += shift < 28 ? - (this.data[this.offset] & this.VALUE) << shift : - (this.data[this.offset] & this.VALUE) * Math.pow(2, shift); + value += + shift < 28 + ? (this.data[this.offset] & this.VALUE) << shift + : (this.data[this.offset] & this.VALUE) * + Math.pow(2, shift); shift += 7; } while ((this.data[this.offset++] & this.MSB) === this.MSB); return value; @@ -511,8 +549,16 @@ class Protobuf { */ _uint64() { // Read off a Uint64 with little-endian - const lowerHalf = this.data[this.offset++] + (this.data[this.offset++] * 0x100) + (this.data[this.offset++] * 0x10000) + this.data[this.offset++] * 0x1000000; - const upperHalf = this.data[this.offset++] + (this.data[this.offset++] * 0x100) + (this.data[this.offset++] * 0x10000) + this.data[this.offset++] * 0x1000000; + const lowerHalf = + this.data[this.offset++] + + this.data[this.offset++] * 0x100 + + this.data[this.offset++] * 0x10000 + + this.data[this.offset++] * 0x1000000; + const upperHalf = + this.data[this.offset++] + + this.data[this.offset++] * 0x100 + + this.data[this.offset++] * 0x10000 + + this.data[this.offset++] * 0x1000000; return upperHalf * 0x100000000 + lowerHalf; } @@ -533,8 +579,10 @@ class Protobuf { field = pbObject._parse(); // Set field types object - this.fieldTypes[fieldNum] = {...this.fieldTypes[fieldNum], ...pbObject.fieldTypes}; - + this.fieldTypes[fieldNum] = { + ...this.fieldTypes[fieldNum], + ...pbObject.fieldTypes, + }; } catch (err) { // Otherwise treat as bytes field = Utils.byteArrayToChars(fieldBytes); @@ -552,7 +600,10 @@ class Protobuf { */ _uint32() { // Use a dataview to read off the integer - const dataview = new DataView(new Uint8Array(this.data.slice(this.offset, this.offset + 4)).buffer); + const dataview = new DataView( + new Uint8Array(this.data.slice(this.offset, this.offset + 4)) + .buffer, + ); const value = dataview.getUint32(0, true); this.offset += 4; return value; diff --git a/src/core/lib/Protocol.mjs b/src/core/lib/Protocol.mjs index 57d2374a..c3ab8df6 100644 --- a/src/core/lib/Protocol.mjs +++ b/src/core/lib/Protocol.mjs @@ -7,7 +7,7 @@ */ import BigNumber from "bignumber.js"; -import {toHexFast} from "../lib/Hex.mjs"; +import { toHexFast } from "../lib/Hex.mjs"; /** * Recursively displays a JSON object as an HTML table @@ -15,10 +15,14 @@ import {toHexFast} from "../lib/Hex.mjs"; * @param {Object} obj * @returns string */ -export function objToTable(obj, nested=false) { +export function objToTable(obj, nested = false) { let html = ``; + class='table table-sm table-nonfluid ${ + nested ? "mb-0 table-borderless" : "table-bordered" + }' + style='table-layout: fixed; ${ + nested ? "margin: -1px !important;" : "" + }'>`; if (!nested) html += ` @@ -29,8 +33,7 @@ export function objToTable(obj, nested=false) { html += ``; if (typeof obj[key] === "object") html += ``; - else - html += ``; + else html += ``; html += ""; } html += "
Field
${key}${objToTable(obj[key], true)}${obj[key]}${obj[key]}
"; diff --git a/src/core/lib/PublicKey.mjs b/src/core/lib/PublicKey.mjs index ea931d7e..bcecf9dd 100644 --- a/src/core/lib/PublicKey.mjs +++ b/src/core/lib/PublicKey.mjs @@ -35,7 +35,6 @@ export function formatDnObj(dnObj, indent) { return output.slice(0, -1); } - /** * Formats byte strings by adding line breaks and delimiters. * @@ -58,5 +57,5 @@ export function formatByteStr(byteStr, length, indent) { } } - return output.slice(0, output.length-1); + return output.slice(0, output.length - 1); } diff --git a/src/core/lib/QRCode.mjs b/src/core/lib/QRCode.mjs index 842ebd55..f9707b37 100644 --- a/src/core/lib/QRCode.mjs +++ b/src/core/lib/QRCode.mjs @@ -30,7 +30,7 @@ export async function parseQrCode(input, normalise) { try { if (normalise) { image.rgba(false); - image.background(0xFFFFFFFF); + image.background(0xffffffff); image.normalize(); image.greyscale(); image = await image.getBufferAsync(jimp.MIME_JPEG); @@ -58,7 +58,13 @@ export async function parseQrCode(input, normalise) { * @param {string} errorCorrection * @returns {ArrayBuffer} */ -export function generateQrCode(input, format, moduleSize, margin, errorCorrection) { +export function generateQrCode( + input, + format, + moduleSize, + margin, + errorCorrection, +) { const formats = ["SVG", "EPS", "PDF", "PNG"]; if (!formats.includes(format.toUpperCase())) { throw new OperationError("Unsupported QR code format."); @@ -70,7 +76,7 @@ export function generateQrCode(input, format, moduleSize, margin, errorCorrectio type: format, size: moduleSize, margin: margin, - "ec_level": errorCorrection.charAt(0).toUpperCase() + ec_level: errorCorrection.charAt(0).toUpperCase(), }); } catch (err) { throw new OperationError(`Error generating QR code. (${err})`); diff --git a/src/core/lib/RSA.mjs b/src/core/lib/RSA.mjs index 9037379c..b13df765 100644 --- a/src/core/lib/RSA.mjs +++ b/src/core/lib/RSA.mjs @@ -10,7 +10,7 @@ import forge from "node-forge"; export const MD_ALGORITHMS = { "SHA-1": forge.md.sha1, - "MD5": forge.md.md5, + MD5: forge.md.md5, "SHA-256": forge.md.sha256, "SHA-384": forge.md.sha384, "SHA-512": forge.md.sha512, diff --git a/src/core/lib/Rotate.mjs b/src/core/lib/Rotate.mjs index 8d70fb25..30620b73 100644 --- a/src/core/lib/Rotate.mjs +++ b/src/core/lib/Rotate.mjs @@ -8,7 +8,6 @@ * @todo Support for UTF16 */ - /** * Runs rotation operations across the input data. * @@ -29,7 +28,6 @@ export function rot(data, amount, algo) { return result; } - /** * Rotate right bitwise op. * @@ -49,10 +47,9 @@ export function rotr(b) { */ export function rotl(b) { const bit = (b >> 7) & 1; - return ((b << 1) | bit) & 0xFF; + return ((b << 1) | bit) & 0xff; } - /** * Rotates a byte array to the right by a specific amount as a whole, so that bits are wrapped * from the end of the array to the beginning. @@ -70,14 +67,13 @@ export function rotrCarry(data, amount) { for (let i = 0; i < data.length; i++) { const oldByte = data[i] >>> 0; newByte = (oldByte >> amount) | carryBits; - carryBits = (oldByte & (Math.pow(2, amount)-1)) << (8-amount); + carryBits = (oldByte & (Math.pow(2, amount) - 1)) << (8 - amount); result.push(newByte); } result[0] |= carryBits; return result; } - /** * Rotates a byte array to the left by a specific amount as a whole, so that bits are wrapped * from the beginning of the array to the end. @@ -92,12 +88,12 @@ export function rotlCarry(data, amount) { newByte; amount = amount % 8; - for (let i = data.length-1; i >= 0; i--) { + for (let i = data.length - 1; i >= 0; i--) { const oldByte = data[i]; - newByte = ((oldByte << amount) | carryBits) & 0xFF; - carryBits = (oldByte >> (8-amount)) & (Math.pow(2, amount)-1); - result[i] = (newByte); + newByte = ((oldByte << amount) | carryBits) & 0xff; + carryBits = (oldByte >> (8 - amount)) & (Math.pow(2, amount) - 1); + result[i] = newByte; } - result[data.length-1] = result[data.length-1] | carryBits; + result[data.length - 1] = result[data.length - 1] | carryBits; return result; } diff --git a/src/core/lib/SIGABA.mjs b/src/core/lib/SIGABA.mjs index 09951c4f..8d75499e 100644 --- a/src/core/lib/SIGABA.mjs +++ b/src/core/lib/SIGABA.mjs @@ -10,27 +10,27 @@ * A set of randomised example SIGABA cipher/control rotors (these rotors are interchangeable). Cipher and control rotors can be referred to as C and R rotors respectively. */ export const CR_ROTORS = [ - {name: "Example 1", value: "SRGWANHPJZFXVIDQCEUKBYOLMT"}, - {name: "Example 2", value: "THQEFSAZVKJYULBODCPXNIMWRG"}, - {name: "Example 3", value: "XDTUYLEVFNQZBPOGIRCSMHWKAJ"}, - {name: "Example 4", value: "LOHDMCWUPSTNGVXYFJREQIKBZA"}, - {name: "Example 5", value: "ERXWNZQIJYLVOFUMSGHTCKPBDA"}, - {name: "Example 6", value: "FQECYHJIOUMDZVPSLKRTGWXBAN"}, - {name: "Example 7", value: "TBYIUMKZDJSOPEWXVANHLCFQGR"}, - {name: "Example 8", value: "QZUPDTFNYIAOMLEBWJXCGHKRSV"}, - {name: "Example 9", value: "CZWNHEMPOVXLKRSIDGJFYBTQAU"}, - {name: "Example 10", value: "ENPXJVKYQBFZTICAGMOHWRLDUS"} + { name: "Example 1", value: "SRGWANHPJZFXVIDQCEUKBYOLMT" }, + { name: "Example 2", value: "THQEFSAZVKJYULBODCPXNIMWRG" }, + { name: "Example 3", value: "XDTUYLEVFNQZBPOGIRCSMHWKAJ" }, + { name: "Example 4", value: "LOHDMCWUPSTNGVXYFJREQIKBZA" }, + { name: "Example 5", value: "ERXWNZQIJYLVOFUMSGHTCKPBDA" }, + { name: "Example 6", value: "FQECYHJIOUMDZVPSLKRTGWXBAN" }, + { name: "Example 7", value: "TBYIUMKZDJSOPEWXVANHLCFQGR" }, + { name: "Example 8", value: "QZUPDTFNYIAOMLEBWJXCGHKRSV" }, + { name: "Example 9", value: "CZWNHEMPOVXLKRSIDGJFYBTQAU" }, + { name: "Example 10", value: "ENPXJVKYQBFZTICAGMOHWRLDUS" }, ]; /** * A set of randomised example SIGABA index rotors (may be referred to as I rotors). */ export const I_ROTORS = [ - {name: "Example 1", value: "6201348957"}, - {name: "Example 2", value: "6147253089"}, - {name: "Example 3", value: "8239647510"}, - {name: "Example 4", value: "7194835260"}, - {name: "Example 5", value: "4873205916"} + { name: "Example 1", value: "6201348957" }, + { name: "Example 2", value: "6147253089" }, + { name: "Example 3", value: "8239647510" }, + { name: "Example 4", value: "7194835260" }, + { name: "Example 5", value: "4873205916" }, ]; export const NUMBERS = "0123456789".split(""); @@ -43,8 +43,8 @@ export const NUMBERS = "0123456789".split(""); */ export function convToUpperCase(letter) { const charCode = letter.charCodeAt(); - if (97<=charCode && charCode<=122) { - return String.fromCharCode(charCode-32); + if (97 <= charCode && charCode <= 122) { + return String.fromCharCode(charCode - 32); } return letter; } @@ -53,7 +53,6 @@ export function convToUpperCase(letter) { * The SIGABA machine consisting of the 3 rotor banks: cipher, control and index banks. */ export class SigabaMachine { - /** * SigabaMachine constructor * @@ -137,14 +136,12 @@ export class SigabaMachine { } return plaintext; } - } /** * The cipher rotor bank consists of 5 cipher rotors in either a forward or reversed orientation. */ export class CipherBank { - /** * CipherBank constructor * @@ -187,7 +184,13 @@ export class CipherBank { * @param {number[]} indexInputs - the inputs from the index rotors */ step(indexInputs) { - const logicDict = {0: [0, 9], 1: [7, 8], 2: [5, 6], 3: [3, 4], 4: [1, 2]}; + const logicDict = { + 0: [0, 9], + 1: [7, 8], + 2: [5, 6], + 3: [3, 4], + 4: [1, 2], + }; const rotorsToMove = []; for (const key in logicDict) { const item = logicDict[key]; @@ -202,14 +205,12 @@ export class CipherBank { rotor.step(); } } - } /** * The control rotor bank consists of 5 control rotors in either a forward or reversed orientation. Signals to the control rotor bank always go from right-to-left. */ export class ControlBank { - /** * ControlBank constructor. The rotors have been reversed as signals go from right-to-left through the control rotors. * @@ -238,8 +239,23 @@ export class ControlBank { * @returns {number[]} */ getOutputs() { - const outputs = [this.crypt("F"), this.crypt("G"), this.crypt("H"), this.crypt("I")]; - const logicDict = {1: "B", 2: "C", 3: "DE", 4: "FGH", 5: "IJK", 6: "LMNO", 7: "PQRST", 8: "UVWXYZ", 9: "A"}; + const outputs = [ + this.crypt("F"), + this.crypt("G"), + this.crypt("H"), + this.crypt("I"), + ]; + const logicDict = { + 1: "B", + 2: "C", + 3: "DE", + 4: "FGH", + 5: "IJK", + 6: "LMNO", + 7: "PQRST", + 8: "UVWXYZ", + 9: "A", + }; const numberOutputs = []; for (const key in logicDict) { const item = logicDict[key]; @@ -257,7 +273,9 @@ export class ControlBank { * Steps the control rotors. Only 3 of the control rotors step: one after every encryption, one after every 26, and one after every 26 squared. */ step() { - const MRotor = this.rotors[1], FRotor = this.rotors[2], SRotor = this.rotors[3]; + const MRotor = this.rotors[1], + FRotor = this.rotors[2], + SRotor = this.rotors[3]; // 14 is the offset of "O" from "A" - the next rotor steps once the previous rotor reaches "O" if (FRotor.state === 14) { if (MRotor.state === 14) { @@ -278,14 +296,12 @@ export class ControlBank { this.step(); return outputs; } - } /** * The index rotor bank consists of 5 index rotors all placed in the forwards orientation. */ export class IndexBank { - /** * IndexBank constructor * @@ -321,14 +337,12 @@ export class IndexBank { } return outputs; } - } /** * Rotor class */ export class Rotor { - /** * Rotor constructor * @@ -350,12 +364,12 @@ export class Rotor { * @returns {number[]} */ getNumMapping(wireSetting, rev) { - if (rev===false) { + if (rev === false) { return wireSetting; } else { const length = wireSetting.length; const tempMapping = new Array(length); - for (let i=0; i this.state-length; i--) { - let res = i%length; - if (res<0) { + for (let i = this.state; i > this.state - length; i--) { + let res = i % length; + if (res < 0) { res += length; } posMapping.push(res); @@ -418,14 +432,12 @@ export class Rotor { this.posMapping.splice(0, 0, lastNum); this.state = this.posMapping[0]; } - } /** * A CRRotor is a cipher (C) or control (R) rotor. These rotors are identical and interchangeable. A C or R rotor consists of 26 contacts, one for each letter, and may be put into either a forwards of reversed orientation. */ export class CRRotor extends Rotor { - /** * CRRotor constructor * @@ -433,7 +445,7 @@ export class CRRotor extends Rotor { * @param {char} key - initial state of rotor * @param {bool} rev - true if reversed, false if not */ - constructor(wireSetting, key, rev=false) { + constructor(wireSetting, key, rev = false) { wireSetting = wireSetting.split("").map(CRRotor.letterToNum); super(wireSetting, CRRotor.letterToNum(key), rev); } @@ -445,7 +457,7 @@ export class CRRotor extends Rotor { * @returns {number} */ static letterToNum(letter) { - return letter.charCodeAt()-65; + return letter.charCodeAt() - 65; } /** @@ -455,7 +467,7 @@ export class CRRotor extends Rotor { * @returns {char} */ static numToLetter(num) { - return String.fromCharCode(num+65); + return String.fromCharCode(num + 65); } /** @@ -470,14 +482,12 @@ export class CRRotor extends Rotor { const outPos = this.cryptNum(inputPos, direction); return CRRotor.numToLetter(outPos); } - } /** * An IRotor is an index rotor, which consists of 10 contacts each numbered from 0 to 9. Unlike C and R rotors, they cannot be put in the reversed orientation. The index rotors do not step at any point during encryption or decryption. */ export class IRotor extends Rotor { - /** * IRotor constructor * @@ -498,5 +508,4 @@ export class IRotor extends Rotor { crypt(inputPos) { return this.cryptNum(inputPos, "leftToRight"); } - } diff --git a/src/core/lib/SM4.mjs b/src/core/lib/SM4.mjs index 5f5846a2..bc0f0583 100644 --- a/src/core/lib/SM4.mjs +++ b/src/core/lib/SM4.mjs @@ -23,34 +23,38 @@ const BLOCKSIZE = 16; /** The S box, 256 8-bit values */ const Sbox = [ - 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, - 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, - 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, - 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, - 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8, - 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35, - 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, - 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, - 0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, - 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, - 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f, - 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, - 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, - 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, - 0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, - 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48 + 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, + 0x28, 0xfb, 0x2c, 0x05, 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, + 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, 0x9c, 0x42, 0x50, 0xf4, + 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, + 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, + 0x75, 0x8f, 0x3f, 0xa6, 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, + 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8, 0x68, 0x6b, 0x81, 0xb2, + 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35, + 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, + 0x01, 0x21, 0x78, 0x87, 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, + 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, 0xea, 0xbf, 0x8a, 0xd2, + 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, + 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, + 0xf5, 0x8c, 0xb1, 0xe3, 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, + 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f, 0xd5, 0xdb, 0x37, 0x45, + 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, + 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, + 0x1f, 0x10, 0x5a, 0xd8, 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, + 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, 0x89, 0x69, 0x97, 0x4a, + 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, + 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, + 0xd7, 0xcb, 0x39, 0x48, ]; /** "Fixed parameter CK" used in key expansion */ const CK = [ - 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, - 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, - 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, - 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, - 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, - 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, - 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, - 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 + 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, 0x70777e85, 0x8c939aa1, + 0xa8afb6bd, 0xc4cbd2d9, 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, + 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, 0xc0c7ced5, 0xdce3eaf1, + 0xf8ff060d, 0x141b2229, 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, + 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, 0x10171e25, 0x2c333a41, + 0x484f565d, 0x646b7279, ]; /** "System parameter FK" */ @@ -73,8 +77,11 @@ function ROL(i, n) { */ function transformL(b) { /* Replace each of the 4 bytes in b with the value at its offset in the Sbox */ - b = (Sbox[(b >>> 24) & 0xFF] << 24) | (Sbox[(b >>> 16) & 0xFF] << 16) | - (Sbox[(b >>> 8) & 0xFF] << 8) | Sbox[b & 0xFF]; + b = + (Sbox[(b >>> 24) & 0xff] << 24) | + (Sbox[(b >>> 16) & 0xff] << 16) | + (Sbox[(b >>> 8) & 0xff] << 8) | + Sbox[b & 0xff]; /* circular rotate and xor */ return b ^ ROL(b, 2) ^ ROL(b, 10) ^ ROL(b, 18) ^ ROL(b, 24); } @@ -86,8 +93,11 @@ function transformL(b) { */ function transformLprime(b) { /* Replace each of the 4 bytes in b with the value at its offset in the Sbox */ - b = (Sbox[(b >>> 24) & 0xFF] << 24) | (Sbox[(b >>> 16) & 0xFF] << 16) | - (Sbox[(b >>> 8) & 0xFF] << 8) | Sbox[b & 0xFF]; + b = + (Sbox[(b >>> 24) & 0xff] << 24) | + (Sbox[(b >>> 16) & 0xff] << 16) | + (Sbox[(b >>> 8) & 0xff] << 8) | + Sbox[b & 0xff]; return b ^ ROL(b, 13) ^ ROL(b, 23); /* circular rotate and XOR */ } @@ -95,10 +105,11 @@ function transformLprime(b) { * Initialize the round key */ function initSM4RoundKey(rawkey) { - const K = rawkey.map((a, i) => a ^ FK[i]); /* K = rawkey ^ FK */ + const K = rawkey.map((a, i) => a ^ FK[i]); /* K = rawkey ^ FK */ const roundKey = []; for (let i = 0; i < 32; i++) - roundKey[i] = K[i + 4] = K[i] ^ transformLprime(K[i + 1] ^ K[i + 2] ^ K[i + 3] ^ CK[i]); + roundKey[i] = K[i + 4] = + K[i] ^ transformLprime(K[i + 1] ^ K[i + 2] ^ K[i + 3] ^ CK[i]); return roundKey; } @@ -111,7 +122,8 @@ function initSM4RoundKey(rawkey) { */ function encryptBlockSM4(X, roundKey) { for (let i = 0; i < NROUNDS; i++) - X[i + 4] = X[i] ^ transformL(X[i + 1] ^ X[i + 2] ^ X[i + 3] ^ roundKey[i]); + X[i + 4] = + X[i] ^ transformL(X[i + 1] ^ X[i + 2] ^ X[i + 3] ^ roundKey[i]); return [X[35], X[34], X[33], X[32]]; } @@ -122,15 +134,31 @@ function encryptBlockSM4(X, roundKey) { * @param {byteArray} bArray - the array of bytes * @param {integer} offset - starting offset in the array; 15 bytes must follow it. */ -function bytesToInts(bArray, offs=0) { +function bytesToInts(bArray, offs = 0) { let offset = offs; - const A = (bArray[offset] << 24) | (bArray[offset + 1] << 16) | (bArray[offset + 2] << 8) | bArray[offset + 3]; + const A = + (bArray[offset] << 24) | + (bArray[offset + 1] << 16) | + (bArray[offset + 2] << 8) | + bArray[offset + 3]; offset += 4; - const B = (bArray[offset] << 24) | (bArray[offset + 1] << 16) | (bArray[offset + 2] << 8) | bArray[offset + 3]; + const B = + (bArray[offset] << 24) | + (bArray[offset + 1] << 16) | + (bArray[offset + 2] << 8) | + bArray[offset + 3]; offset += 4; - const C = (bArray[offset] << 24) | (bArray[offset + 1] << 16) | (bArray[offset + 2] << 8) | bArray[offset + 3]; + const C = + (bArray[offset] << 24) | + (bArray[offset + 1] << 16) | + (bArray[offset + 2] << 8) | + bArray[offset + 3]; offset += 4; - const D = (bArray[offset] << 24) | (bArray[offset + 1] << 16) | (bArray[offset + 2] << 8) | bArray[offset + 3]; + const D = + (bArray[offset] << 24) | + (bArray[offset + 1] << 16) | + (bArray[offset + 2] << 8) | + bArray[offset + 3]; return [A, B, C, D]; } @@ -141,10 +169,10 @@ function bytesToInts(bArray, offs=0) { function intsToBytes(ints) { const bArr = []; for (let i = 0; i < ints.length; i++) { - bArr.push((ints[i] >> 24) & 0xFF); - bArr.push((ints[i] >> 16) & 0xFF); - bArr.push((ints[i] >> 8) & 0xFF); - bArr.push(ints[i] & 0xFF); + bArr.push((ints[i] >> 24) & 0xff); + bArr.push((ints[i] >> 16) & 0xff); + bArr.push((ints[i] >> 8) & 0xff); + bArr.push(ints[i] & 0xff); } return bArr; } @@ -159,38 +187,44 @@ function intsToBytes(ints) { * @param {boolean} noPadding - Don't add PKCS#7 padding if set. * @returns {byteArray} - The cipher text. */ -export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { +export function encryptSM4(message, key, iv, mode = "ECB", noPadding = false) { const messageLength = message.length; - if (messageLength === 0) - return []; + if (messageLength === 0) return []; const roundKey = initSM4RoundKey(bytesToInts(key, 0)); /* Pad with PKCS#7 if requested for ECB/CBC else add zeroes (which are sliced off at the end) */ let padByte = 0; - let nPadding = 16 - (message.length & 0xF); + let nPadding = 16 - (message.length & 0xf); if (mode === "ECB" || mode === "CBC") { if (noPadding) { if (nPadding !== 16) - throw new OperationError(`No padding requested in ${mode} mode but input is not a 16-byte multiple.`); + throw new OperationError( + `No padding requested in ${mode} mode but input is not a 16-byte multiple.`, + ); nPadding = 0; - } else - padByte = nPadding; + } else padByte = nPadding; } - for (let i = 0; i < nPadding; i++) - message.push(padByte); + for (let i = 0; i < nPadding; i++) message.push(padByte); const cipherText = []; switch (mode) { case "ECB": for (let i = 0; i < message.length; i += BLOCKSIZE) - Array.prototype.push.apply(cipherText, intsToBytes(encryptBlockSM4(bytesToInts(message, i), roundKey))); + Array.prototype.push.apply( + cipherText, + intsToBytes( + encryptBlockSM4(bytesToInts(message, i), roundKey), + ), + ); break; case "CBC": iv = bytesToInts(iv, 0); for (let i = 0; i < message.length; i += BLOCKSIZE) { const block = bytesToInts(message, i); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; iv = encryptBlockSM4(block, roundKey); Array.prototype.push.apply(cipherText, intsToBytes(iv)); } @@ -200,8 +234,10 @@ export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { for (let i = 0; i < message.length; i += BLOCKSIZE) { iv = encryptBlockSM4(iv, roundKey); const block = bytesToInts(message, i); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; Array.prototype.push.apply(cipherText, intsToBytes(block)); iv = block; } @@ -211,8 +247,10 @@ export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { for (let i = 0; i < message.length; i += BLOCKSIZE) { iv = encryptBlockSM4(iv, roundKey); const block = bytesToInts(message, i); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; Array.prototype.push.apply(cipherText, intsToBytes(block)); } break; @@ -220,16 +258,20 @@ export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { iv = bytesToInts(iv, 0); for (let i = 0; i < message.length; i += BLOCKSIZE) { let iv2 = [...iv]; /* containing the IV + counter */ - iv2[3] += (i >> 4);/* Using a 32 bit counter here. 64 Gb encrypts should be enough for everyone. */ + iv2[3] += + i >> + 4; /* Using a 32 bit counter here. 64 Gb encrypts should be enough for everyone. */ iv2 = encryptBlockSM4(iv2, roundKey); const block = bytesToInts(message, i); - block[0] ^= iv2[0]; block[1] ^= iv2[1]; - block[2] ^= iv2[2]; block[3] ^= iv2[3]; + block[0] ^= iv2[0]; + block[1] ^= iv2[1]; + block[2] ^= iv2[2]; + block[3] ^= iv2[3]; Array.prototype.push.apply(cipherText, intsToBytes(block)); } break; default: - throw new OperationError("Invalid block cipher mode: "+mode); + throw new OperationError("Invalid block cipher mode: " + mode); } if (mode !== "ECB" && mode !== "CBC") return cipherText.slice(0, messageLength); @@ -246,34 +288,53 @@ export function encryptSM4(message, key, iv, mode="ECB", noPadding=false) { * @param {boolean] ignorePadding - If true, ignore padding issues in ECB/CBC mode. * @returns {byteArray} - The cipher text. */ -export function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) { +export function decryptSM4( + cipherText, + key, + iv, + mode = "ECB", + ignorePadding = false, +) { const originalLength = cipherText.length; - if (originalLength === 0) - return []; + if (originalLength === 0) return []; let roundKey = initSM4RoundKey(bytesToInts(key, 0)); if (mode === "ECB" || mode === "CBC") { /* Init decryption key */ roundKey = roundKey.reverse(); - if ((originalLength & 0xF) !== 0 && !ignorePadding) - throw new OperationError(`With ECB or CBC modes, the input must be divisible into 16 byte blocks. (${cipherText.length & 0xF} bytes extra)`); - } else { /* Pad dummy bytes for other modes, chop them off at the end */ - while ((cipherText.length & 0xF) !== 0) - cipherText.push(0); + if ((originalLength & 0xf) !== 0 && !ignorePadding) + throw new OperationError( + `With ECB or CBC modes, the input must be divisible into 16 byte blocks. (${ + cipherText.length & 0xf + } bytes extra)`, + ); + } else { + /* Pad dummy bytes for other modes, chop them off at the end */ + while ((cipherText.length & 0xf) !== 0) cipherText.push(0); } const clearText = []; switch (mode) { case "ECB": for (let i = 0; i < cipherText.length; i += BLOCKSIZE) - Array.prototype.push.apply(clearText, intsToBytes(encryptBlockSM4(bytesToInts(cipherText, i), roundKey))); + Array.prototype.push.apply( + clearText, + intsToBytes( + encryptBlockSM4(bytesToInts(cipherText, i), roundKey), + ), + ); break; case "CBC": iv = bytesToInts(iv, 0); for (let i = 0; i < cipherText.length; i += BLOCKSIZE) { - const block = encryptBlockSM4(bytesToInts(cipherText, i), roundKey); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + const block = encryptBlockSM4( + bytesToInts(cipherText, i), + roundKey, + ); + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; Array.prototype.push.apply(clearText, intsToBytes(block)); iv = bytesToInts(cipherText, i); } @@ -283,8 +344,10 @@ export function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) for (let i = 0; i < cipherText.length; i += BLOCKSIZE) { iv = encryptBlockSM4(iv, roundKey); const block = bytesToInts(cipherText, i); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; Array.prototype.push.apply(clearText, intsToBytes(block)); iv = bytesToInts(cipherText, i); } @@ -294,8 +357,10 @@ export function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) for (let i = 0; i < cipherText.length; i += BLOCKSIZE) { iv = encryptBlockSM4(iv, roundKey); const block = bytesToInts(cipherText, i); - block[0] ^= iv[0]; block[1] ^= iv[1]; - block[2] ^= iv[2]; block[3] ^= iv[3]; + block[0] ^= iv[0]; + block[1] ^= iv[1]; + block[2] ^= iv[2]; + block[3] ^= iv[3]; Array.prototype.push.apply(clearText, intsToBytes(block)); } break; @@ -303,11 +368,15 @@ export function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) iv = bytesToInts(iv, 0); for (let i = 0; i < cipherText.length; i += BLOCKSIZE) { let iv2 = [...iv]; /* containing the IV + counter */ - iv2[3] += (i >> 4);/* Using a 32 bit counter here. 64 Gb encrypts should be enough for everyone. */ + iv2[3] += + i >> + 4; /* Using a 32 bit counter here. 64 Gb encrypts should be enough for everyone. */ iv2 = encryptBlockSM4(iv2, roundKey); const block = bytesToInts(cipherText, i); - block[0] ^= iv2[0]; block[1] ^= iv2[1]; - block[2] ^= iv2[2]; block[3] ^= iv2[3]; + block[0] ^= iv2[0]; + block[1] ^= iv2[1]; + block[2] ^= iv2[2]; + block[3] ^= iv2[3]; Array.prototype.push.apply(clearText, intsToBytes(block)); } break; @@ -316,16 +385,13 @@ export function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) } /* Check PKCS#7 padding */ if (mode === "ECB" || mode === "CBC") { - if (ignorePadding) - return clearText; + if (ignorePadding) return clearText; const padByte = clearText[clearText.length - 1]; - if (padByte > 16) - throw new OperationError("Invalid PKCS#7 padding."); + if (padByte > 16) throw new OperationError("Invalid PKCS#7 padding."); for (let i = 0; i < padByte; i++) - if (clearText[clearText.length -i - 1] !== padByte) + if (clearText[clearText.length - i - 1] !== padByte) throw new OperationError("Invalid PKCS#7 padding."); return clearText.slice(0, clearText.length - padByte); } return clearText.slice(0, originalLength); } - diff --git a/src/core/lib/Sort.mjs b/src/core/lib/Sort.mjs index c8998f61..4e58f270 100644 --- a/src/core/lib/Sort.mjs +++ b/src/core/lib/Sort.mjs @@ -18,7 +18,6 @@ export function caseInsensitiveSort(a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); } - /** * Comparison operation for sorting of IPv4 addresses. * @@ -59,7 +58,8 @@ export function numericSort(a, b) { const ret = a_[i].localeCompare(b_[i]); // Compare strings if (ret !== 0) return ret; } - if (!isNaN(a_[i]) && !isNaN(b_[i])) { // Compare numbers + if (!isNaN(a_[i]) && !isNaN(b_[i])) { + // Compare numbers if (a_[i] - b_[i] !== 0) return a_[i] - b_[i]; } } @@ -79,12 +79,12 @@ export function hexadecimalSort(a, b) { let a_ = a.split(/([^\da-f]+)/i), b_ = b.split(/([^\da-f]+)/i); - a_ = a_.map(v => { + a_ = a_.map((v) => { const t = parseInt(v, 16); return isNaN(t) ? v : t; }); - b_ = b_.map(v => { + b_ = b_.map((v) => { const t = parseInt(v, 16); return isNaN(t) ? v : t; }); @@ -96,7 +96,8 @@ export function hexadecimalSort(a, b) { const ret = a_[i].localeCompare(b_[i]); // Compare strings if (ret !== 0) return ret; } - if (!isNaN(a_[i]) && !isNaN(b_[i])) { // Compare numbers + if (!isNaN(a_[i]) && !isNaN(b_[i])) { + // Compare numbers if (a_[i] - b_[i] !== 0) return a_[i] - b_[i]; } } @@ -114,4 +115,3 @@ export function hexadecimalSort(a, b) { export function lengthSort(a, b) { return a.length - b.length; } - diff --git a/src/core/lib/Stream.mjs b/src/core/lib/Stream.mjs index 18ce71c3..9e3d2a5e 100644 --- a/src/core/lib/Stream.mjs +++ b/src/core/lib/Stream.mjs @@ -13,7 +13,6 @@ * as various data types. */ export default class Stream { - /** * Stream constructor. * @@ -32,12 +31,11 @@ export default class Stream { * @param {number} [numBytes=null] * @returns {Uint8Array} */ - getBytes(numBytes=null) { + getBytes(numBytes = null) { if (this.position > this.length) return undefined; - const newPosition = numBytes !== null ? - this.position + numBytes : - this.length; + const newPosition = + numBytes !== null ? this.position + numBytes : this.length; const bytes = this.bytes.slice(this.position, newPosition); this.position = newPosition; this.bitPos = 0; @@ -51,7 +49,7 @@ export default class Stream { * @param {number} [numBytes=-1] * @returns {string} */ - readString(numBytes=-1) { + readString(numBytes = -1) { if (this.position > this.length) return undefined; if (numBytes === -1) numBytes = this.length - this.position; @@ -74,7 +72,7 @@ export default class Stream { * @param {string} [endianness="be"] * @returns {number} */ - readInt(numBytes, endianness="be") { + readInt(numBytes, endianness = "be") { if (this.position > this.length) return undefined; let val = 0; @@ -84,7 +82,11 @@ export default class Stream { val |= this.bytes[i]; } } else { - for (let i = this.position + numBytes - 1; i >= this.position; i--) { + for ( + let i = this.position + numBytes - 1; + i >= this.position; + i-- + ) { val = val << 8; val |= this.bytes[i]; } @@ -101,7 +103,7 @@ export default class Stream { * @param {string} [endianness="be"] * @returns {number} */ - readBits(numBits, endianness="be") { + readBits(numBits, endianness = "be") { if (this.position > this.length) return undefined; let bitBuf = 0, @@ -117,18 +119,15 @@ export default class Stream { while (bitBufLen < numBits) { if (endianness === "be") bitBuf = (bitBuf << bitBufLen) | this.bytes[this.position++]; - else - bitBuf |= this.bytes[this.position++] << bitBufLen; + else bitBuf |= this.bytes[this.position++] << bitBufLen; bitBufLen += 8; } // Reverse back to numBits if (bitBufLen > numBits) { const excess = bitBufLen - numBits; - if (endianness === "be") - bitBuf >>>= excess; - else - bitBuf &= (1 << numBits) - 1; + if (endianness === "be") bitBuf >>>= excess; + else bitBuf &= (1 << numBits) - 1; bitBufLen -= excess; this.position--; this.bitPos = 8 - excess; @@ -143,9 +142,9 @@ export default class Stream { * @returns {number} The bit mask */ function bitMask(bitPos) { - return endianness === "be" ? - (1 << (8 - bitPos)) - 1 : - 256 - (1 << bitPos); + return endianness === "be" + ? (1 << (8 - bitPos)) - 1 + : 256 - (1 << bitPos); } } @@ -160,7 +159,10 @@ export default class Stream { this.bitPos = 0; if (typeof val === "number") { - while (++this.position < this.length && this.bytes[this.position] !== val) { + while ( + ++this.position < this.length && + this.bytes[this.position] !== val + ) { continue; } return; @@ -184,7 +186,7 @@ export default class Stream { } const length = val.length; - const initial = val[length-1]; + const initial = val[length - 1]; this.position = length; // Get the skip table. @@ -193,12 +195,15 @@ export default class Stream { while (this.position < this.length) { // Until we hit the final element of val in the stream. - while ((this.position < this.length) && (this.bytes[this.position++] !== initial)); + while ( + this.position < this.length && + this.bytes[this.position++] !== initial + ); found = true; // Loop through the elements comparing them to val. - for (let x = length-1; x >= 0; x--) { + for (let x = length - 1; x >= 0; x--) { if (this.bytes[this.position - length + x] !== val[x]) { found = false; @@ -214,7 +219,6 @@ export default class Stream { } } - /** * Consume bytes if they match the supplied value. * @@ -250,7 +254,9 @@ export default class Stream { moveForwardsBy(numBytes) { const pos = this.position + numBytes; if (pos < 0 || pos > this.length) - throw new Error("Cannot move to position " + pos + " in stream. Out of bounds."); + throw new Error( + "Cannot move to position " + pos + " in stream. Out of bounds.", + ); this.position = pos; this.bitPos = 0; } @@ -263,7 +269,9 @@ export default class Stream { moveBackwardsBy(numBytes) { const pos = this.position - numBytes; if (pos < 0 || pos > this.length) - throw new Error("Cannot move to position " + pos + " in stream. Out of bounds."); + throw new Error( + "Cannot move to position " + pos + " in stream. Out of bounds.", + ); this.position = pos; this.bitPos = 0; } @@ -298,7 +306,9 @@ export default class Stream { */ moveTo(pos) { if (pos < 0 || pos > this.length) - throw new Error("Cannot move to position " + pos + " in stream. Out of bounds."); + throw new Error( + "Cannot move to position " + pos + " in stream. Out of bounds.", + ); this.position = pos; this.bitPos = 0; } @@ -319,9 +329,8 @@ export default class Stream { * @param {number} [finish=this.position] * @returns {Uint8Array} */ - carve(start=0, finish=this.position) { + carve(start = 0, finish = this.position) { if (this.bitPos > 0) finish++; return this.bytes.slice(start, finish); } - } diff --git a/src/core/lib/TLVParser.mjs b/src/core/lib/TLVParser.mjs index cb8432c1..d08f2e43 100644 --- a/src/core/lib/TLVParser.mjs +++ b/src/core/lib/TLVParser.mjs @@ -10,14 +10,13 @@ const defaults = { location: 0, bytesInLength: 1, - basicEncodingRules: false + basicEncodingRules: false, }; /** * TLVParser library */ export default class TLVParser { - /** * TLVParser constructor * diff --git a/src/core/lib/Typex.mjs b/src/core/lib/Typex.mjs index 39bdee5d..63ee3ffa 100644 --- a/src/core/lib/Typex.mjs +++ b/src/core/lib/Typex.mjs @@ -15,28 +15,47 @@ import Utils from "../Utils.mjs"; * randomised. */ export const ROTORS = [ - {name: "Example 1", value: "MCYLPQUVRXGSAOWNBJEZDTFKHI { + wiring = wiring.replace(/./g, (x) => { return reversed[Enigma.a2i(x)]; }); try { @@ -222,6 +245,9 @@ export class Plugboard extends Enigma.Rotor { * @returns {number} */ revTransform(c) { - return Utils.mod(this.revMap[Utils.mod(c + this.pos, 26)] - this.pos, 26); + return Utils.mod( + this.revMap[Utils.mod(c + this.pos, 26)] - this.pos, + 26, + ); } } diff --git a/src/core/lib/Zlib.mjs b/src/core/lib/Zlib.mjs index 780fd3d7..3b2383bf 100644 --- a/src/core/lib/Zlib.mjs +++ b/src/core/lib/Zlib.mjs @@ -10,10 +10,14 @@ import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min.js"; const Zlib = zlibAndGzip.Zlib; -export const COMPRESSION_TYPE = ["Dynamic Huffman Coding", "Fixed Huffman Coding", "None (Store)"]; +export const COMPRESSION_TYPE = [ + "Dynamic Huffman Coding", + "Fixed Huffman Coding", + "None (Store)", +]; export const INFLATE_BUFFER_TYPE = ["Adaptive", "Block"]; export const ZLIB_COMPRESSION_TYPE_LOOKUP = { - "Fixed Huffman Coding": Zlib.Deflate.CompressionType.FIXED, + "Fixed Huffman Coding": Zlib.Deflate.CompressionType.FIXED, "Dynamic Huffman Coding": Zlib.Deflate.CompressionType.DYNAMIC, - "None (Store)": Zlib.Deflate.CompressionType.NONE, + "None (Store)": Zlib.Deflate.CompressionType.NONE, }; diff --git a/src/core/operations/A1Z26CipherDecode.mjs b/src/core/operations/A1Z26CipherDecode.mjs index 0b097c2b..2c324e6e 100644 --- a/src/core/operations/A1Z26CipherDecode.mjs +++ b/src/core/operations/A1Z26CipherDecode.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * A1Z26 Cipher Decode operation */ class A1Z26CipherDecode extends Operation { - /** * A1Z26CipherDecode constructor */ @@ -22,7 +21,8 @@ class A1Z26CipherDecode extends Operation { this.name = "A1Z26 Cipher Decode"; this.module = "Ciphers"; - this.description = "Converts alphabet order numbers into their corresponding alphabet character.

e.g. 1 becomes a and 2 becomes b."; + this.description = + "Converts alphabet order numbers into their corresponding alphabet character.

e.g. 1 becomes a and 2 becomes b."; this.infoURL = ""; this.inputType = "string"; this.outputType = "string"; @@ -30,40 +30,40 @@ class A1Z26CipherDecode extends Operation { { name: "Delimiter", type: "option", - value: DELIM_OPTIONS - } + value: DELIM_OPTIONS, + }, ]; this.checks = [ { - pattern: "^\\s*([12]?[0-9] )+[12]?[0-9]\\s*$", - flags: "", - args: ["Space"] + pattern: "^\\s*([12]?[0-9] )+[12]?[0-9]\\s*$", + flags: "", + args: ["Space"], }, { - pattern: "^\\s*([12]?[0-9],)+[12]?[0-9]\\s*$", - flags: "", - args: ["Comma"] + pattern: "^\\s*([12]?[0-9],)+[12]?[0-9]\\s*$", + flags: "", + args: ["Comma"], }, { - pattern: "^\\s*([12]?[0-9];)+[12]?[0-9]\\s*$", - flags: "", - args: ["Semi-colon"] + pattern: "^\\s*([12]?[0-9];)+[12]?[0-9]\\s*$", + flags: "", + args: ["Semi-colon"], }, { - pattern: "^\\s*([12]?[0-9]:)+[12]?[0-9]\\s*$", - flags: "", - args: ["Colon"] + pattern: "^\\s*([12]?[0-9]:)+[12]?[0-9]\\s*$", + flags: "", + args: ["Colon"], }, { - pattern: "^\\s*([12]?[0-9]\\n)+[12]?[0-9]\\s*$", - flags: "", - args: ["Line feed"] + pattern: "^\\s*([12]?[0-9]\\n)+[12]?[0-9]\\s*$", + flags: "", + args: ["Line feed"], }, { - pattern: "^\\s*([12]?[0-9]\\r\\n)+[12]?[0-9]\\s*$", - flags: "", - args: ["CRLF"] - } + pattern: "^\\s*([12]?[0-9]\\r\\n)+[12]?[0-9]\\s*$", + flags: "", + args: ["CRLF"], + }, ]; } @@ -83,13 +83,14 @@ class A1Z26CipherDecode extends Operation { let latin1 = ""; for (let i = 0; i < bites.length; i++) { if (bites[i] < 1 || bites[i] > 26) { - throw new OperationError("Error: all numbers must be between 1 and 26."); + throw new OperationError( + "Error: all numbers must be between 1 and 26.", + ); } latin1 += Utils.chr(parseInt(bites[i], 10) + 96); } return latin1; } - } export default A1Z26CipherDecode; diff --git a/src/core/operations/A1Z26CipherEncode.mjs b/src/core/operations/A1Z26CipherEncode.mjs index fc562b9e..439756a5 100644 --- a/src/core/operations/A1Z26CipherEncode.mjs +++ b/src/core/operations/A1Z26CipherEncode.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * A1Z26 Cipher Encode operation */ class A1Z26CipherEncode extends Operation { - /** * A1Z26CipherEncode constructor */ @@ -21,7 +20,8 @@ class A1Z26CipherEncode extends Operation { this.name = "A1Z26 Cipher Encode"; this.module = "Ciphers"; - this.description = "Converts alphabet characters into their corresponding alphabet order number.

e.g. a becomes 1 and b becomes 2.

Non-alphabet characters are dropped."; + this.description = + "Converts alphabet characters into their corresponding alphabet order number.

e.g. a becomes 1 and b becomes 2.

Non-alphabet characters are dropped."; this.infoURL = ""; this.inputType = "string"; this.outputType = "string"; @@ -29,8 +29,8 @@ class A1Z26CipherEncode extends Operation { { name: "Delimiter", type: "option", - value: DELIM_OPTIONS - } + value: DELIM_OPTIONS, + }, ]; } @@ -55,7 +55,6 @@ class A1Z26CipherEncode extends Operation { } return output.slice(0, -delim.length); } - } export default A1Z26CipherEncode; diff --git a/src/core/operations/ADD.mjs b/src/core/operations/ADD.mjs index 78580688..b5b40941 100644 --- a/src/core/operations/ADD.mjs +++ b/src/core/operations/ADD.mjs @@ -12,7 +12,6 @@ import { bitOp, add, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs"; * ADD operation */ class ADD extends Operation { - /** * ADD constructor */ @@ -21,17 +20,19 @@ class ADD extends Operation { this.name = "ADD"; this.module = "Default"; - this.description = "ADD the input with the given key (e.g. fe023da5), MOD 255"; - this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bitwise_operators"; + this.description = + "ADD the input with the given key (e.g. fe023da5), MOD 255"; + this.infoURL = + "https://wikipedia.org/wiki/Bitwise_operation#Bitwise_operators"; this.inputType = "byteArray"; this.outputType = "byteArray"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": BITWISE_OP_DELIMS - } + name: "Key", + type: "toggleString", + value: "", + toggleValues: BITWISE_OP_DELIMS, + }, ]; } @@ -41,7 +42,10 @@ class ADD extends Operation { * @returns {byteArray} */ run(input, args) { - const key = Utils.convertToByteArray(args[0].string || "", args[0].option); + const key = Utils.convertToByteArray( + args[0].string || "", + args[0].option, + ); return bitOp(input, key, add); } @@ -71,7 +75,6 @@ class ADD extends Operation { highlightReverse(pos, args) { return pos; } - } export default ADD; diff --git a/src/core/operations/AESDecrypt.mjs b/src/core/operations/AESDecrypt.mjs index e24a5119..b8263a95 100644 --- a/src/core/operations/AESDecrypt.mjs +++ b/src/core/operations/AESDecrypt.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * AES Decrypt operation */ class AESDecrypt extends Operation { - /** * AESDecrypt constructor */ @@ -22,83 +21,85 @@ class AESDecrypt extends Operation { this.name = "AES Decrypt"; this.module = "Ciphers"; - this.description = "Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.

Key: The following algorithms will be used based on the size of the key:
  • 16 bytes = AES-128
  • 24 bytes = AES-192
  • 32 bytes = AES-256


IV: The Initialization Vector should be 16 bytes long. If not entered, it will default to 16 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default.

GCM Tag: This field is ignored unless 'GCM' mode is used."; - this.infoURL = "https://wikipedia.org/wiki/Advanced_Encryption_Standard"; + this.description = + "Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.

Key: The following algorithms will be used based on the size of the key:
  • 16 bytes = AES-128
  • 24 bytes = AES-192
  • 32 bytes = AES-256


IV: The Initialization Vector should be 16 bytes long. If not entered, it will default to 16 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default.

GCM Tag: This field is ignored unless 'GCM' mode is used."; + this.infoURL = + "https://wikipedia.org/wiki/Advanced_Encryption_Standard"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Mode", - "type": "argSelector", - "value": [ + name: "Mode", + type: "argSelector", + value: [ { name: "CBC", - off: [5, 6] + off: [5, 6], }, { name: "CFB", - off: [5, 6] + off: [5, 6], }, { name: "OFB", - off: [5, 6] + off: [5, 6], }, { name: "CTR", - off: [5, 6] + off: [5, 6], }, { name: "GCM", - on: [5, 6] + on: [5, 6], }, { name: "ECB", - off: [5, 6] + off: [5, 6], }, { name: "CBC/NoPadding", - off: [5, 6] + off: [5, 6], }, { name: "ECB/NoPadding", - off: [5, 6] - } - ] + off: [5, 6], + }, + ], }, { - "name": "Input", - "type": "option", - "value": ["Hex", "Raw"] + name: "Input", + type: "option", + value: ["Hex", "Raw"], }, { - "name": "Output", - "type": "option", - "value": ["Raw", "Hex"] + name: "Output", + type: "option", + value: ["Raw", "Hex"], }, { - "name": "GCM Tag", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "GCM Tag", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Additional Authenticated Data", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] - } + name: "Additional Authenticated Data", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], + }, ]; } @@ -134,7 +135,7 @@ The following algorithms will be used based on the size of the key: /* Allow for a "no padding" mode */ if (noPadding) { - decipher.mode.unpad = function(output, options) { + decipher.mode.unpad = function (output, options) { return true; }; } @@ -142,18 +143,21 @@ The following algorithms will be used based on the size of the key: decipher.start({ iv: iv.length === 0 ? "" : iv, tag: mode === "GCM" ? gcmTag : undefined, - additionalData: mode === "GCM" ? aad : undefined + additionalData: mode === "GCM" ? aad : undefined, }); decipher.update(forge.util.createBuffer(input)); const result = decipher.finish(); if (result) { - return outputType === "Hex" ? decipher.output.toHex() : decipher.output.getBytes(); + return outputType === "Hex" + ? decipher.output.toHex() + : decipher.output.getBytes(); } else { - throw new OperationError("Unable to decrypt input with these parameters."); + throw new OperationError( + "Unable to decrypt input with these parameters.", + ); } } - } export default AESDecrypt; diff --git a/src/core/operations/AESEncrypt.mjs b/src/core/operations/AESEncrypt.mjs index 7b52ff03..8fa52280 100644 --- a/src/core/operations/AESEncrypt.mjs +++ b/src/core/operations/AESEncrypt.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * AES Encrypt operation */ class AESEncrypt extends Operation { - /** * AESEncrypt constructor */ @@ -22,69 +21,71 @@ class AESEncrypt extends Operation { this.name = "AES Encrypt"; this.module = "Ciphers"; - this.description = "Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.

Key: The following algorithms will be used based on the size of the key:
  • 16 bytes = AES-128
  • 24 bytes = AES-192
  • 32 bytes = AES-256
You can generate a password-based key using one of the KDF operations.

IV: The Initialization Vector should be 16 bytes long. If not entered, it will default to 16 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used."; - this.infoURL = "https://wikipedia.org/wiki/Advanced_Encryption_Standard"; + this.description = + "Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.

Key: The following algorithms will be used based on the size of the key:
  • 16 bytes = AES-128
  • 24 bytes = AES-192
  • 32 bytes = AES-256
You can generate a password-based key using one of the KDF operations.

IV: The Initialization Vector should be 16 bytes long. If not entered, it will default to 16 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used."; + this.infoURL = + "https://wikipedia.org/wiki/Advanced_Encryption_Standard"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Mode", - "type": "argSelector", - "value": [ + name: "Mode", + type: "argSelector", + value: [ { name: "CBC", - off: [5] + off: [5], }, { name: "CFB", - off: [5] + off: [5], }, { name: "OFB", - off: [5] + off: [5], }, { name: "CTR", - off: [5] + off: [5], }, { name: "GCM", - on: [5] + on: [5], }, { name: "ECB", - off: [5] - } - ] + off: [5], + }, + ], }, { - "name": "Input", - "type": "option", - "value": ["Raw", "Hex"] + name: "Input", + type: "option", + value: ["Raw", "Hex"], }, { - "name": "Output", - "type": "option", - "value": ["Hex", "Raw"] + name: "Output", + type: "option", + value: ["Hex", "Raw"], }, { - "name": "Additional Authenticated Data", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] - } + name: "Additional Authenticated Data", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], + }, ]; } @@ -117,26 +118,33 @@ The following algorithms will be used based on the size of the key: const cipher = forge.cipher.createCipher("AES-" + mode, key); cipher.start({ iv: iv, - additionalData: mode === "GCM" ? aad : undefined + additionalData: mode === "GCM" ? aad : undefined, }); cipher.update(forge.util.createBuffer(input)); cipher.finish(); if (outputType === "Hex") { if (mode === "GCM") { - return cipher.output.toHex() + "\n\n" + - "Tag: " + cipher.mode.tag.toHex(); + return ( + cipher.output.toHex() + + "\n\n" + + "Tag: " + + cipher.mode.tag.toHex() + ); } return cipher.output.toHex(); } else { if (mode === "GCM") { - return cipher.output.getBytes() + "\n\n" + - "Tag: " + cipher.mode.tag.getBytes(); + return ( + cipher.output.getBytes() + + "\n\n" + + "Tag: " + + cipher.mode.tag.getBytes() + ); } return cipher.output.getBytes(); } } - } export default AESEncrypt; diff --git a/src/core/operations/AESKeyUnwrap.mjs b/src/core/operations/AESKeyUnwrap.mjs index 1558847a..63f45a3f 100644 --- a/src/core/operations/AESKeyUnwrap.mjs +++ b/src/core/operations/AESKeyUnwrap.mjs @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * AES Key Unwrap operation */ class AESKeyUnwrap extends Operation { - /** * AESKeyUnwrap constructor */ @@ -23,32 +22,33 @@ class AESKeyUnwrap extends Operation { this.name = "AES Key Unwrap"; this.module = "Ciphers"; - this.description = "Decryptor for a key wrapping algorithm defined in RFC3394, which is used to protect keys in untrusted storage or communications, using AES.

This algorithm uses an AES key (KEK: key-encryption key) and a 64-bit IV to decrypt 64-bit blocks."; + this.description = + "Decryptor for a key wrapping algorithm defined in RFC3394, which is used to protect keys in untrusted storage or communications, using AES.

This algorithm uses an AES key (KEK: key-encryption key) and a 64-bit IV to decrypt 64-bit blocks."; this.infoURL = "https://wikipedia.org/wiki/Key_wrap"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key (KEK)", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key (KEK)", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "a6a6a6a6a6a6a6a6", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "a6a6a6a6a6a6a6a6", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Input", - "type": "option", - "value": ["Hex", "Raw"] + name: "Input", + type: "option", + value: ["Hex", "Raw"], }, { - "name": "Output", - "type": "option", - "value": ["Hex", "Raw"] + name: "Output", + type: "option", + value: ["Hex", "Raw"], }, ]; } @@ -65,14 +65,24 @@ class AESKeyUnwrap extends Operation { outputType = args[3]; if (kek.length !== 16 && kek.length !== 24 && kek.length !== 32) { - throw new OperationError("KEK must be either 16, 24, or 32 bytes (currently " + kek.length + " bytes)"); + throw new OperationError( + "KEK must be either 16, 24, or 32 bytes (currently " + + kek.length + + " bytes)", + ); } if (iv.length !== 8) { - throw new OperationError("IV must be 8 bytes (currently " + iv.length + " bytes)"); + throw new OperationError( + "IV must be 8 bytes (currently " + iv.length + " bytes)", + ); } const inputData = Utils.convertToByteString(input, inputType); if (inputData.length % 8 !== 0 || inputData.length < 24) { - throw new OperationError("input must be 8n (n>=3) bytes (currently " + inputData.length + " bytes)"); + throw new OperationError( + "input must be 8n (n>=3) bytes (currently " + + inputData.length + + " bytes)", + ); } const cipher = forge.cipher.createCipher("AES-ECB", kek); @@ -90,8 +100,8 @@ class AESKeyUnwrap extends Operation { } let cntLower = R.length >>> 0; let cntUpper = (R.length / ((1 << 30) * 4)) >>> 0; - cntUpper = cntUpper * 6 + ((cntLower * 6 / ((1 << 30) * 4)) >>> 0); - cntLower = cntLower * 6 >>> 0; + cntUpper = cntUpper * 6 + (((cntLower * 6) / ((1 << 30) * 4)) >>> 0); + cntLower = (cntLower * 6) >>> 0; for (let j = 5; j >= 0; j--) { for (let i = R.length - 1; i >= 0; i--) { const aBuffer = Utils.strToArrayBuffer(A); @@ -100,7 +110,9 @@ class AESKeyUnwrap extends Operation { aView.setUint32(4, aView.getUint32(4) ^ cntLower); A = Utils.arrayBufferToStr(aBuffer, false); decipher.start(); - decipher.update(forge.util.createBuffer(A + R[i] + paddingBlock)); + decipher.update( + forge.util.createBuffer(A + R[i] + paddingBlock), + ); decipher.finish(); const B = decipher.output.getBytes(); A = B.substring(0, 8); @@ -122,7 +134,6 @@ class AESKeyUnwrap extends Operation { } return P; } - } export default AESKeyUnwrap; diff --git a/src/core/operations/AESKeyWrap.mjs b/src/core/operations/AESKeyWrap.mjs index 38867156..d1cfe8dc 100644 --- a/src/core/operations/AESKeyWrap.mjs +++ b/src/core/operations/AESKeyWrap.mjs @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * AES Key Wrap operation */ class AESKeyWrap extends Operation { - /** * AESKeyWrap constructor */ @@ -23,32 +22,33 @@ class AESKeyWrap extends Operation { this.name = "AES Key Wrap"; this.module = "Ciphers"; - this.description = "A key wrapping algorithm defined in RFC3394, which is used to protect keys in untrusted storage or communications, using AES.

This algorithm uses an AES key (KEK: key-encryption key) and a 64-bit IV to encrypt 64-bit blocks."; + this.description = + "A key wrapping algorithm defined in RFC3394, which is used to protect keys in untrusted storage or communications, using AES.

This algorithm uses an AES key (KEK: key-encryption key) and a 64-bit IV to encrypt 64-bit blocks."; this.infoURL = "https://wikipedia.org/wiki/Key_wrap"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key (KEK)", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key (KEK)", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "a6a6a6a6a6a6a6a6", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "a6a6a6a6a6a6a6a6", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Input", - "type": "option", - "value": ["Hex", "Raw"] + name: "Input", + type: "option", + value: ["Hex", "Raw"], }, { - "name": "Output", - "type": "option", - "value": ["Hex", "Raw"] + name: "Output", + type: "option", + value: ["Hex", "Raw"], }, ]; } @@ -65,14 +65,24 @@ class AESKeyWrap extends Operation { outputType = args[3]; if (kek.length !== 16 && kek.length !== 24 && kek.length !== 32) { - throw new OperationError("KEK must be either 16, 24, or 32 bytes (currently " + kek.length + " bytes)"); + throw new OperationError( + "KEK must be either 16, 24, or 32 bytes (currently " + + kek.length + + " bytes)", + ); } if (iv.length !== 8) { - throw new OperationError("IV must be 8 bytes (currently " + iv.length + " bytes)"); + throw new OperationError( + "IV must be 8 bytes (currently " + iv.length + " bytes)", + ); } const inputData = Utils.convertToByteString(input, inputType); if (inputData.length % 8 !== 0 || inputData.length < 16) { - throw new OperationError("input must be 8n (n>=2) bytes (currently " + inputData.length + " bytes)"); + throw new OperationError( + "input must be 8n (n>=2) bytes (currently " + + inputData.length + + " bytes)", + ); } const cipher = forge.cipher.createCipher("AES-ECB", kek); @@ -82,7 +92,8 @@ class AESKeyWrap extends Operation { for (let i = 0; i < inputData.length; i += 8) { R.push(inputData.substring(i, i + 8)); } - let cntLower = 1, cntUpper = 0; + let cntLower = 1, + cntUpper = 0; for (let j = 0; j < 6; j++) { for (let i = 0; i < R.length; i++) { cipher.start(); @@ -109,7 +120,6 @@ class AESKeyWrap extends Operation { } return C; } - } export default AESKeyWrap; diff --git a/src/core/operations/AMFDecode.mjs b/src/core/operations/AMFDecode.mjs index 50a0d551..f73332e8 100644 --- a/src/core/operations/AMFDecode.mjs +++ b/src/core/operations/AMFDecode.mjs @@ -12,7 +12,6 @@ import { AMF0, AMF3 } from "@astronautlabs/amf"; * AMF Decode operation */ class AMFDecode extends Operation { - /** * AMFDecode constructor */ @@ -21,7 +20,8 @@ class AMFDecode extends Operation { this.name = "AMF Decode"; this.module = "Encodings"; - this.description = "Action Message Format (AMF) is a binary format used to serialize object graphs such as ActionScript objects and XML, or send messages between an Adobe Flash client and a remote service, usually a Flash Media Server or third party alternatives."; + this.description = + "Action Message Format (AMF) is a binary format used to serialize object graphs such as ActionScript objects and XML, or send messages between an Adobe Flash client and a remote service, usually a Flash Media Server or third party alternatives."; this.infoURL = "https://wikipedia.org/wiki/Action_Message_Format"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -30,8 +30,8 @@ class AMFDecode extends Operation { name: "Format", type: "option", value: ["AMF0", "AMF3"], - defaultIndex: 1 - } + defaultIndex: 1, + }, ]; } @@ -46,7 +46,6 @@ class AMFDecode extends Operation { const encoded = new Uint8Array(input); return handler.Value.deserialize(encoded); } - } export default AMFDecode; diff --git a/src/core/operations/AMFEncode.mjs b/src/core/operations/AMFEncode.mjs index c21ba7dc..84e50716 100644 --- a/src/core/operations/AMFEncode.mjs +++ b/src/core/operations/AMFEncode.mjs @@ -12,7 +12,6 @@ import { AMF0, AMF3 } from "@astronautlabs/amf"; * AMF Encode operation */ class AMFEncode extends Operation { - /** * AMFEncode constructor */ @@ -21,7 +20,8 @@ class AMFEncode extends Operation { this.name = "AMF Encode"; this.module = "Encodings"; - this.description = "Action Message Format (AMF) is a binary format used to serialize object graphs such as ActionScript objects and XML, or send messages between an Adobe Flash client and a remote service, usually a Flash Media Server or third party alternatives."; + this.description = + "Action Message Format (AMF) is a binary format used to serialize object graphs such as ActionScript objects and XML, or send messages between an Adobe Flash client and a remote service, usually a Flash Media Server or third party alternatives."; this.infoURL = "https://wikipedia.org/wiki/Action_Message_Format"; this.inputType = "JSON"; this.outputType = "ArrayBuffer"; @@ -30,8 +30,8 @@ class AMFEncode extends Operation { name: "Format", type: "option", value: ["AMF0", "AMF3"], - defaultIndex: 1 - } + defaultIndex: 1, + }, ]; } @@ -46,7 +46,6 @@ class AMFEncode extends Operation { const output = handler.Value.any(input).serialize(); return output.buffer; } - } export default AMFEncode; diff --git a/src/core/operations/AND.mjs b/src/core/operations/AND.mjs index 6bbc8366..4dfdab93 100644 --- a/src/core/operations/AND.mjs +++ b/src/core/operations/AND.mjs @@ -12,7 +12,6 @@ import { bitOp, and, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs"; * AND operation */ class AND extends Operation { - /** * AND constructor */ @@ -21,17 +20,18 @@ class AND extends Operation { this.name = "AND"; this.module = "Default"; - this.description = "AND the input with the given key.
e.g. fe023da5"; + this.description = + "AND the input with the given key.
e.g. fe023da5"; this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#AND"; this.inputType = "byteArray"; this.outputType = "byteArray"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": BITWISE_OP_DELIMS - } + name: "Key", + type: "toggleString", + value: "", + toggleValues: BITWISE_OP_DELIMS, + }, ]; } @@ -41,7 +41,10 @@ class AND extends Operation { * @returns {byteArray} */ run(input, args) { - const key = Utils.convertToByteArray(args[0].string || "", args[0].option); + const key = Utils.convertToByteArray( + args[0].string || "", + args[0].option, + ); return bitOp(input, key, and); } @@ -71,7 +74,6 @@ class AND extends Operation { highlightReverse(pos, args) { return pos; } - } export default AND; diff --git a/src/core/operations/AddLineNumbers.mjs b/src/core/operations/AddLineNumbers.mjs index c1c6159a..3efd4d75 100644 --- a/src/core/operations/AddLineNumbers.mjs +++ b/src/core/operations/AddLineNumbers.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Add line numbers operation */ class AddLineNumbers extends Operation { - /** * AddLineNumbers constructor */ @@ -36,11 +35,11 @@ class AddLineNumbers extends Operation { let output = ""; for (let n = 0; n < lines.length; n++) { - output += (n+1).toString().padStart(width, " ") + " " + lines[n] + "\n"; + output += + (n + 1).toString().padStart(width, " ") + " " + lines[n] + "\n"; } - return output.slice(0, output.length-1); + return output.slice(0, output.length - 1); } - } export default AddLineNumbers; diff --git a/src/core/operations/AddTextToImage.mjs b/src/core/operations/AddTextToImage.mjs index 084c92ec..cad5e70e 100644 --- a/src/core/operations/AddTextToImage.mjs +++ b/src/core/operations/AddTextToImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Add Text To Image operation */ class AddTextToImage extends Operation { - /** * AddTextToImage constructor */ @@ -24,7 +23,8 @@ class AddTextToImage extends Operation { this.name = "Add Text To Image"; this.module = "Image"; - this.description = "Adds text onto an image.

Text can be horizontally or vertically aligned, or the position can be manually specified.
Variants of the Roboto font face are available in any size or colour."; + this.description = + "Adds text onto an image.

Text can be horizontally or vertically aligned, or the position can be manually specified.
Variants of the Roboto font face are available in any size or colour."; this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -33,72 +33,67 @@ class AddTextToImage extends Operation { { name: "Text", type: "string", - value: "" + value: "", }, { name: "Horizontal align", type: "option", - value: ["None", "Left", "Center", "Right"] + value: ["None", "Left", "Center", "Right"], }, { name: "Vertical align", type: "option", - value: ["None", "Top", "Middle", "Bottom"] + value: ["None", "Top", "Middle", "Bottom"], }, { name: "X position", type: "number", - value: 0 + value: 0, }, { name: "Y position", type: "number", - value: 0 + value: 0, }, { name: "Size", type: "number", value: 32, - min: 8 + min: 8, }, { name: "Font face", type: "option", - value: [ - "Roboto", - "Roboto Black", - "Roboto Mono", - "Roboto Slab" - ] + value: ["Roboto", "Roboto Black", "Roboto Mono", "Roboto Slab"], }, { name: "Red", type: "number", value: 255, min: 0, - max: 255 + max: 255, }, { name: "Green", type: "number", value: 255, min: 0, - max: 255 + max: 255, }, { name: "Blue", type: "number", value: 255, min: 0, - max: 255 + max: 255, }, { name: "Alpha", type: "number", value: 255, min: 0, - max: 255 - } + max: 255, + }, ]; } @@ -137,35 +132,51 @@ class AddTextToImage extends Operation { const fontsMap = {}; const fonts = [ - import(/* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/Roboto72White.fnt"), - import(/* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoBlack72White.fnt"), - import(/* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoMono72White.fnt"), - import(/* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoSlab72White.fnt") + import( + /* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/Roboto72White.fnt" + ), + import( + /* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoBlack72White.fnt" + ), + import( + /* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoMono72White.fnt" + ), + import( + /* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoSlab72White.fnt" + ), ]; - await Promise.all(fonts) - .then(fonts => { - fontsMap.Roboto = fonts[0]; - fontsMap["Roboto Black"] = fonts[1]; - fontsMap["Roboto Mono"] = fonts[2]; - fontsMap["Roboto Slab"] = fonts[3]; - }); - + await Promise.all(fonts).then((fonts) => { + fontsMap.Roboto = fonts[0]; + fontsMap["Roboto Black"] = fonts[1]; + fontsMap["Roboto Mono"] = fonts[2]; + fontsMap["Roboto Slab"] = fonts[3]; + }); // Make Webpack load the png font images await Promise.all([ - import(/* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/Roboto72White.png"), - import(/* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoSlab72White.png"), - import(/* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoMono72White.png"), - import(/* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoBlack72White.png") + import( + /* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/Roboto72White.png" + ), + import( + /* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoSlab72White.png" + ), + import( + /* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoMono72White.png" + ), + import( + /* webpackMode: "eager" */ "../../web/static/fonts/bmfonts/RobotoBlack72White.png" + ), ]); const font = fontsMap[fontFace]; // LoadFont needs an absolute url, so append the font name to self.docURL - const jimpFont = await jimp.loadFont(self.docURL + "/" + font.default); + const jimpFont = await jimp.loadFont( + self.docURL + "/" + font.default, + ); - jimpFont.pages.forEach(function(page) { + jimpFont.pages.forEach(function (page) { if (page.bitmap) { // Adjust the RGB values of the image pages to change the font colour. const pageWidth = page.bitmap.width; @@ -175,22 +186,31 @@ class AddTextToImage extends Operation { const idx = (iy * pageWidth + ix) << 2; const newRed = page.bitmap.data[idx] - (255 - red); - const newGreen = page.bitmap.data[idx + 1] - (255 - green); - const newBlue = page.bitmap.data[idx + 2] - (255 - blue); - const newAlpha = page.bitmap.data[idx + 3] - (255 - alpha); + const newGreen = + page.bitmap.data[idx + 1] - (255 - green); + const newBlue = + page.bitmap.data[idx + 2] - (255 - blue); + const newAlpha = + page.bitmap.data[idx + 3] - (255 - alpha); // Make sure the bitmap values don't go below 0 as that makes jimp very unhappy - page.bitmap.data[idx] = (newRed > 0) ? newRed : 0; - page.bitmap.data[idx + 1] = (newGreen > 0) ? newGreen : 0; - page.bitmap.data[idx + 2] = (newBlue > 0) ? newBlue : 0; - page.bitmap.data[idx + 3] = (newAlpha > 0) ? newAlpha : 0; + page.bitmap.data[idx] = newRed > 0 ? newRed : 0; + page.bitmap.data[idx + 1] = + newGreen > 0 ? newGreen : 0; + page.bitmap.data[idx + 2] = + newBlue > 0 ? newBlue : 0; + page.bitmap.data[idx + 3] = + newAlpha > 0 ? newAlpha : 0; } } } }); // Create a temporary image to hold the rendered text - const textImage = new jimp(jimp.measureText(jimpFont, text), jimp.measureTextHeight(jimpFont, text)); + const textImage = new jimp( + jimp.measureText(jimpFont, text), + jimp.measureTextHeight(jimpFont, text), + ); textImage.print(jimpFont, 0, 0, text); // Scale the rendered text image to the correct size @@ -210,7 +230,7 @@ class AddTextToImage extends Operation { xPos = 0; break; case "Center": - xPos = (image.getWidth() / 2) - (textImage.getWidth() / 2); + xPos = image.getWidth() / 2 - textImage.getWidth() / 2; break; case "Right": xPos = image.getWidth() - textImage.getWidth(); @@ -222,7 +242,7 @@ class AddTextToImage extends Operation { yPos = 0; break; case "Middle": - yPos = (image.getHeight() / 2) - (textImage.getHeight() / 2); + yPos = image.getHeight() / 2 - textImage.getHeight() / 2; break; case "Bottom": yPos = image.getHeight() - textImage.getHeight(); @@ -261,7 +281,6 @@ class AddTextToImage extends Operation { return ``; } - } export default AddTextToImage; diff --git a/src/core/operations/Adler32Checksum.mjs b/src/core/operations/Adler32Checksum.mjs index 80e6e340..83fd5276 100644 --- a/src/core/operations/Adler32Checksum.mjs +++ b/src/core/operations/Adler32Checksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Adler-32 Checksum operation */ class Adler32Checksum extends Operation { - /** * Adler32Checksum constructor */ @@ -20,7 +19,8 @@ class Adler32Checksum extends Operation { this.name = "Adler-32 Checksum"; this.module = "Crypto"; - this.description = "Adler-32 is a checksum algorithm which was invented by Mark Adler in 1995, and is a modification of the Fletcher checksum. Compared to a cyclic redundancy check of the same length, it trades reliability for speed (preferring the latter).

Adler-32 is more reliable than Fletcher-16, and slightly less reliable than Fletcher-32."; + this.description = + "Adler-32 is a checksum algorithm which was invented by Mark Adler in 1995, and is a modification of the Fletcher checksum. Compared to a cyclic redundancy check of the same length, it trades reliability for speed (preferring the latter).

Adler-32 is more reliable than Fletcher-16, and slightly less reliable than Fletcher-32."; this.infoURL = "https://wikipedia.org/wiki/Adler-32"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -48,7 +48,6 @@ class Adler32Checksum extends Operation { return Utils.hex(((b << 16) | a) >>> 0, 8); } - } export default Adler32Checksum; diff --git a/src/core/operations/AffineCipherDecode.mjs b/src/core/operations/AffineCipherDecode.mjs index 869f231a..9555ab8b 100644 --- a/src/core/operations/AffineCipherDecode.mjs +++ b/src/core/operations/AffineCipherDecode.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Affine Cipher Decode operation */ class AffineCipherDecode extends Operation { - /** * AffineCipherDecode constructor */ @@ -21,21 +20,22 @@ class AffineCipherDecode extends Operation { this.name = "Affine Cipher Decode"; this.module = "Ciphers"; - this.description = "The Affine cipher is a type of monoalphabetic substitution cipher. To decrypt, each letter in an alphabet is mapped to its numeric equivalent, decrypted by a mathematical function, and converted back to a letter."; + this.description = + "The Affine cipher is a type of monoalphabetic substitution cipher. To decrypt, each letter in an alphabet is mapped to its numeric equivalent, decrypted by a mathematical function, and converted back to a letter."; this.infoURL = "https://wikipedia.org/wiki/Affine_cipher"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "a", - "type": "number", - "value": 1 + name: "a", + type: "number", + value: 1, }, { - "name": "b", - "type": "number", - "value": 0 - } + name: "b", + type: "number", + value: 0, + }, ]; } @@ -53,7 +53,9 @@ class AffineCipherDecode extends Operation { let output = ""; if (!/^\+?(0|[1-9]\d*)$/.test(a) || !/^\+?(0|[1-9]\d*)$/.test(b)) { - throw new OperationError("The values of a and b can only be integers."); + throw new OperationError( + "The values of a and b can only be integers.", + ); } if (Utils.gcd(a, 26) !== 1) { @@ -63,10 +65,23 @@ class AffineCipherDecode extends Operation { for (let i = 0; i < input.length; i++) { if (alphabet.indexOf(input[i]) >= 0) { // Uses the affine decode function (y-b * A') % m = x (where m is length of the alphabet and A' is modular inverse) - output += alphabet[Utils.mod((alphabet.indexOf(input[i]) - b) * aModInv, 26)]; + output += + alphabet[ + Utils.mod( + (alphabet.indexOf(input[i]) - b) * aModInv, + 26, + ) + ]; } else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) { // Same as above, accounting for uppercase - output += alphabet[Utils.mod((alphabet.indexOf(input[i].toLowerCase()) - b) * aModInv, 26)].toUpperCase(); + output += + alphabet[ + Utils.mod( + (alphabet.indexOf(input[i].toLowerCase()) - b) * + aModInv, + 26, + ) + ].toUpperCase(); } else { // Non-alphabetic characters output += input[i]; @@ -100,7 +115,6 @@ class AffineCipherDecode extends Operation { highlightReverse(pos, args) { return pos; } - } export default AffineCipherDecode; diff --git a/src/core/operations/AffineCipherEncode.mjs b/src/core/operations/AffineCipherEncode.mjs index a9462ae8..107bc657 100644 --- a/src/core/operations/AffineCipherEncode.mjs +++ b/src/core/operations/AffineCipherEncode.mjs @@ -11,7 +11,6 @@ import { affineEncode } from "../lib/Ciphers.mjs"; * Affine Cipher Encode operation */ class AffineCipherEncode extends Operation { - /** * AffineCipherEncode constructor */ @@ -20,21 +19,22 @@ class AffineCipherEncode extends Operation { this.name = "Affine Cipher Encode"; this.module = "Ciphers"; - this.description = "The Affine cipher is a type of monoalphabetic substitution cipher, wherein each letter in an alphabet is mapped to its numeric equivalent, encrypted using simple mathematical function, (ax + b) % 26, and converted back to a letter."; + this.description = + "The Affine cipher is a type of monoalphabetic substitution cipher, wherein each letter in an alphabet is mapped to its numeric equivalent, encrypted using simple mathematical function, (ax + b) % 26, and converted back to a letter."; this.infoURL = "https://wikipedia.org/wiki/Affine_cipher"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "a", - "type": "number", - "value": 1 + name: "a", + type: "number", + value: 1, }, { - "name": "b", - "type": "number", - "value": 0 - } + name: "b", + type: "number", + value: 0, + }, ]; } @@ -72,7 +72,6 @@ class AffineCipherEncode extends Operation { highlightReverse(pos, args) { return pos; } - } export default AffineCipherEncode; diff --git a/src/core/operations/AnalyseHash.mjs b/src/core/operations/AnalyseHash.mjs index 72c80840..67516108 100644 --- a/src/core/operations/AnalyseHash.mjs +++ b/src/core/operations/AnalyseHash.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Analyse hash operation */ class AnalyseHash extends Operation { - /** * AnalyseHash constructor */ @@ -20,8 +19,10 @@ class AnalyseHash extends Operation { this.name = "Analyse hash"; this.module = "Crypto"; - this.description = "Tries to determine information about a given hash and suggests which algorithm may have been used to generate it based on its length."; - this.infoURL = "https://wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions"; + this.description = + "Tries to determine information about a given hash and suggests which algorithm may have been used to generate it based on its length."; + this.infoURL = + "https://wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions"; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -44,9 +45,16 @@ class AnalyseHash extends Operation { throw new OperationError("Invalid hash"); } - output += "Hash length: " + input.length + "\n" + - "Byte length: " + byteLength + "\n" + - "Bit length: " + bitLength + "\n\n" + + output += + "Hash length: " + + input.length + + "\n" + + "Byte length: " + + byteLength + + "\n" + + "Bit length: " + + bitLength + + "\n\n" + "Based on the length, this hash could have been generated by one of the following hashing functions:\n"; switch (bitLength) { @@ -58,31 +66,21 @@ class AnalyseHash extends Operation { ]; break; case 8: - possibleHashFunctions = [ - "Fletcher-8", - ]; + possibleHashFunctions = ["Fletcher-8"]; break; case 16: possibleHashFunctions = [ "BSD checksum", "CRC-16", "SYSV checksum", - "Fletcher-16" + "Fletcher-16", ]; break; case 32: - possibleHashFunctions = [ - "CRC-32", - "Fletcher-32", - "Adler-32", - ]; + possibleHashFunctions = ["CRC-32", "Fletcher-32", "Adler-32"]; break; case 64: - possibleHashFunctions = [ - "CRC-64", - "RIPEMD-64", - "SipHash", - ]; + possibleHashFunctions = ["CRC-64", "RIPEMD-64", "SipHash"]; break; case 128: possibleHashFunctions = [ @@ -107,10 +105,7 @@ class AnalyseHash extends Operation { ]; break; case 192: - possibleHashFunctions = [ - "Tiger", - "HAVAL-192", - ]; + possibleHashFunctions = ["Tiger", "HAVAL-192"]; break; case 224: possibleHashFunctions = [ @@ -137,9 +132,7 @@ class AnalyseHash extends Operation { ]; break; case 320: - possibleHashFunctions = [ - "RIPEMD-320", - ]; + possibleHashFunctions = ["RIPEMD-320"]; break; case 384: possibleHashFunctions = [ @@ -165,20 +158,15 @@ class AnalyseHash extends Operation { ]; break; case 1024: - possibleHashFunctions = [ - "Fowler-Noll-Vo", - ]; + possibleHashFunctions = ["Fowler-Noll-Vo"]; break; default: - possibleHashFunctions = [ - "Unknown" - ]; + possibleHashFunctions = ["Unknown"]; break; } return output + possibleHashFunctions.join("\n"); } - } export default AnalyseHash; diff --git a/src/core/operations/Argon2.mjs b/src/core/operations/Argon2.mjs index 4feb881c..8e128936 100644 --- a/src/core/operations/Argon2.mjs +++ b/src/core/operations/Argon2.mjs @@ -13,7 +13,6 @@ import argon2 from "argon2-browser"; * Argon2 operation */ class Argon2 extends Operation { - /** * Argon2 constructor */ @@ -22,48 +21,49 @@ class Argon2 extends Operation { this.name = "Argon2"; this.module = "Crypto"; - this.description = "Argon2 is a key derivation function that was selected as the winner of the Password Hashing Competition in July 2015. It was designed by Alex Biryukov, Daniel Dinu, and Dmitry Khovratovich from the University of Luxembourg.

Enter the password in the input to generate its hash."; + this.description = + "Argon2 is a key derivation function that was selected as the winner of the Password Hashing Competition in July 2015. It was designed by Alex Biryukov, Daniel Dinu, and Dmitry Khovratovich from the University of Luxembourg.

Enter the password in the input to generate its hash."; this.infoURL = "https://wikipedia.org/wiki/Argon2"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Salt", - "type": "toggleString", - "value": "somesalt", - "toggleValues": ["UTF8", "Hex", "Base64", "Latin1"] + name: "Salt", + type: "toggleString", + value: "somesalt", + toggleValues: ["UTF8", "Hex", "Base64", "Latin1"], }, { - "name": "Iterations", - "type": "number", - "value": 3 + name: "Iterations", + type: "number", + value: 3, }, { - "name": "Memory (KiB)", - "type": "number", - "value": 4096 + name: "Memory (KiB)", + type: "number", + value: 4096, }, { - "name": "Parallelism", - "type": "number", - "value": 1 + name: "Parallelism", + type: "number", + value: 1, }, { - "name": "Hash length (bytes)", - "type": "number", - "value": 32 + name: "Hash length (bytes)", + type: "number", + value: 32, }, { - "name": "Type", - "type": "option", - "value": ["Argon2i", "Argon2d", "Argon2id"], - "defaultIndex": 0 + name: "Type", + type: "option", + value: ["Argon2i", "Argon2d", "Argon2id"], + defaultIndex: 0, }, { - "name": "Output format", - "type": "option", - "value": ["Encoded hash", "Hex hash", "Raw hash"] - } + name: "Output format", + type: "option", + value: ["Encoded hash", "Hex hash", "Raw hash"], + }, ]; } @@ -74,12 +74,15 @@ class Argon2 extends Operation { */ async run(input, args) { const argon2Types = { - "Argon2i": argon2.ArgonType.Argon2i, - "Argon2d": argon2.ArgonType.Argon2d, - "Argon2id": argon2.ArgonType.Argon2id + Argon2i: argon2.ArgonType.Argon2i, + Argon2d: argon2.ArgonType.Argon2d, + Argon2id: argon2.ArgonType.Argon2id, }; - const salt = Utils.convertToByteString(args[0].string || "", args[0].option), + const salt = Utils.convertToByteString( + args[0].string || "", + args[0].option, + ), time = args[1], mem = args[2], parallelism = args[3], @@ -111,7 +114,6 @@ class Argon2 extends Operation { throw new OperationError(`Error: ${err.message}`); } } - } export default Argon2; diff --git a/src/core/operations/Argon2Compare.mjs b/src/core/operations/Argon2Compare.mjs index 68e48ed0..ddbecb23 100644 --- a/src/core/operations/Argon2Compare.mjs +++ b/src/core/operations/Argon2Compare.mjs @@ -11,7 +11,6 @@ import argon2 from "argon2-browser"; * Argon2 compare operation */ class Argon2Compare extends Operation { - /** * Argon2Compare constructor */ @@ -20,16 +19,17 @@ class Argon2Compare extends Operation { this.name = "Argon2 compare"; this.module = "Crypto"; - this.description = "Tests whether the input matches the given Argon2 hash. To test multiple possible passwords, use the 'Fork' operation."; + this.description = + "Tests whether the input matches the given Argon2 hash. To test multiple possible passwords, use the 'Fork' operation."; this.infoURL = "https://wikipedia.org/wiki/Argon2"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Encoded hash", - "type": "string", - "value": "" - } + name: "Encoded hash", + type: "string", + value: "", + }, ]; } @@ -44,7 +44,7 @@ class Argon2Compare extends Operation { try { await argon2.verify({ pass: input, - encoded + encoded, }); return `Match: ${input}`; @@ -52,7 +52,6 @@ class Argon2Compare extends Operation { return "No match"; } } - } export default Argon2Compare; diff --git a/src/core/operations/AtbashCipher.mjs b/src/core/operations/AtbashCipher.mjs index 5635b5b9..14aecc5d 100644 --- a/src/core/operations/AtbashCipher.mjs +++ b/src/core/operations/AtbashCipher.mjs @@ -11,7 +11,6 @@ import { affineEncode } from "../lib/Ciphers.mjs"; * Atbash Cipher operation */ class AtbashCipher extends Operation { - /** * AtbashCipher constructor */ @@ -20,7 +19,8 @@ class AtbashCipher extends Operation { this.name = "Atbash Cipher"; this.module = "Ciphers"; - this.description = "Atbash is a mono-alphabetic substitution cipher originally used to encode the Hebrew alphabet. It has been modified here for use with the Latin alphabet."; + this.description = + "Atbash is a mono-alphabetic substitution cipher originally used to encode the Hebrew alphabet. It has been modified here for use with the Latin alphabet."; this.infoURL = "https://wikipedia.org/wiki/Atbash"; this.inputType = "string"; this.outputType = "string"; @@ -61,7 +61,6 @@ class AtbashCipher extends Operation { highlightReverse(pos, args) { return pos; } - } export default AtbashCipher; diff --git a/src/core/operations/AvroToJSON.mjs b/src/core/operations/AvroToJSON.mjs index 497a3872..53de5c9d 100644 --- a/src/core/operations/AvroToJSON.mjs +++ b/src/core/operations/AvroToJSON.mjs @@ -12,7 +12,6 @@ import avro from "avsc"; * Avro to JSON operation */ class AvroToJSON extends Operation { - /** * AvroToJSON constructor */ @@ -29,8 +28,8 @@ class AvroToJSON extends Operation { { name: "Force Valid JSON", type: "boolean", - value: true - } + value: true, + }, ]; } @@ -60,9 +59,17 @@ class AvroToJSON extends Operation { }) .on("end", function () { if (forceJSON) { - resolve(result.length === 1 ? JSON.stringify(result[0], null, 4) : JSON.stringify(result, null, 4)); + resolve( + result.length === 1 + ? JSON.stringify(result[0], null, 4) + : JSON.stringify(result, null, 4), + ); } else { - const data = result.reduce((result, current) => result + JSON.stringify(current) + "\n", ""); + const data = result.reduce( + (result, current) => + result + JSON.stringify(current) + "\n", + "", + ); resolve(data); } }); diff --git a/src/core/operations/BLAKE2b.mjs b/src/core/operations/BLAKE2b.mjs index 6218f7f0..98673eb3 100644 --- a/src/core/operations/BLAKE2b.mjs +++ b/src/core/operations/BLAKE2b.mjs @@ -14,7 +14,6 @@ import { toBase64 } from "../lib/Base64.mjs"; * BLAKE2b operation */ class BLAKE2b extends Operation { - /** * BLAKE2b constructor */ @@ -26,24 +25,27 @@ class BLAKE2b extends Operation { this.description = `Performs BLAKE2b hashing on the input.

BLAKE2b is a flavour of the BLAKE cryptographic hash function that is optimized for 64-bit platforms and produces digests of any size between 1 and 64 bytes.

Supports the use of an optional key.`; - this.infoURL = "https://wikipedia.org/wiki/BLAKE_(hash_function)#BLAKE2b_algorithm"; + this.infoURL = + "https://wikipedia.org/wiki/BLAKE_(hash_function)#BLAKE2b_algorithm"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Size", - "type": "option", - "value": ["512", "384", "256", "160", "128"] - }, { - "name": "Output Encoding", - "type": "option", - "value": ["Hex", "Base64", "Raw"] - }, { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["UTF8", "Decimal", "Base64", "Hex", "Latin1"] - } + name: "Size", + type: "option", + value: ["512", "384", "256", "160", "128"], + }, + { + name: "Output Encoding", + type: "option", + value: ["Hex", "Base64", "Raw"], + }, + { + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["UTF8", "Decimal", "Base64", "Hex", "Latin1"], + }, ]; } @@ -54,11 +56,19 @@ class BLAKE2b extends Operation { */ run(input, args) { const [outSize, outFormat] = args; - let key = Utils.convertToByteArray(args[2].string || "", args[2].option); + let key = Utils.convertToByteArray( + args[2].string || "", + args[2].option, + ); if (key.length === 0) { key = null; } else if (key.length > 64) { - throw new OperationError(["Key cannot be greater than 64 bytes", "It is currently " + key.length + " bytes."].join("\n")); + throw new OperationError( + [ + "Key cannot be greater than 64 bytes", + "It is currently " + key.length + " bytes.", + ].join("\n"), + ); } input = new Uint8Array(input); @@ -68,12 +78,13 @@ class BLAKE2b extends Operation { case "Base64": return toBase64(blakejs.blake2b(input, key, outSize / 8)); case "Raw": - return Utils.arrayBufferToStr(blakejs.blake2b(input, key, outSize / 8).buffer); + return Utils.arrayBufferToStr( + blakejs.blake2b(input, key, outSize / 8).buffer, + ); default: return new OperationError("Unsupported Output Type"); } } - } export default BLAKE2b; diff --git a/src/core/operations/BLAKE2s.mjs b/src/core/operations/BLAKE2s.mjs index 8f84e041..094cfcb2 100644 --- a/src/core/operations/BLAKE2s.mjs +++ b/src/core/operations/BLAKE2s.mjs @@ -14,7 +14,6 @@ import { toBase64 } from "../lib/Base64.mjs"; * BLAKE2s Operation */ class BLAKE2s extends Operation { - /** * BLAKE2s constructor */ @@ -26,25 +25,27 @@ class BLAKE2s extends Operation { this.description = `Performs BLAKE2s hashing on the input.

BLAKE2s is a flavour of the BLAKE cryptographic hash function that is optimized for 8- to 32-bit platforms and produces digests of any size between 1 and 32 bytes.

Supports the use of an optional key.`; - this.infoURL = "https://wikipedia.org/wiki/BLAKE_(hash_function)#BLAKE2"; + this.infoURL = + "https://wikipedia.org/wiki/BLAKE_(hash_function)#BLAKE2"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Size", - "type": "option", - "value": ["256", "160", "128"] - }, { - "name": "Output Encoding", - "type": "option", - "value": ["Hex", "Base64", "Raw"] + name: "Size", + type: "option", + value: ["256", "160", "128"], }, { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["UTF8", "Decimal", "Base64", "Hex", "Latin1"] - } + name: "Output Encoding", + type: "option", + value: ["Hex", "Base64", "Raw"], + }, + { + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["UTF8", "Decimal", "Base64", "Hex", "Latin1"], + }, ]; } @@ -55,11 +56,19 @@ class BLAKE2s extends Operation { */ run(input, args) { const [outSize, outFormat] = args; - let key = Utils.convertToByteArray(args[2].string || "", args[2].option); + let key = Utils.convertToByteArray( + args[2].string || "", + args[2].option, + ); if (key.length === 0) { key = null; } else if (key.length > 32) { - throw new OperationError(["Key cannot be greater than 32 bytes", "It is currently " + key.length + " bytes."].join("\n")); + throw new OperationError( + [ + "Key cannot be greater than 32 bytes", + "It is currently " + key.length + " bytes.", + ].join("\n"), + ); } input = new Uint8Array(input); @@ -69,12 +78,13 @@ class BLAKE2s extends Operation { case "Base64": return toBase64(blakejs.blake2s(input, key, outSize / 8)); case "Raw": - return Utils.arrayBufferToStr(blakejs.blake2s(input, key, outSize / 8).buffer); + return Utils.arrayBufferToStr( + blakejs.blake2s(input, key, outSize / 8).buffer, + ); default: return new OperationError("Unsupported Output Type"); } } - } export default BLAKE2s; diff --git a/src/core/operations/BSONDeserialise.mjs b/src/core/operations/BSONDeserialise.mjs index cb46b357..06a9e82d 100644 --- a/src/core/operations/BSONDeserialise.mjs +++ b/src/core/operations/BSONDeserialise.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * BSON deserialise operation */ class BSONDeserialise extends Operation { - /** * BSONDeserialise constructor */ @@ -21,7 +20,8 @@ class BSONDeserialise extends Operation { this.name = "BSON deserialise"; this.module = "Serialise"; - this.description = "BSON is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures, associative arrays (called objects or documents in MongoDB), and various data types of specific interest to MongoDB. The name 'BSON' is based on the term JSON and stands for 'Binary JSON'.

Input data should be in a raw bytes format."; + this.description = + "BSON is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures, associative arrays (called objects or documents in MongoDB), and various data types of specific interest to MongoDB. The name 'BSON' is based on the term JSON and stands for 'Binary JSON'.

Input data should be in a raw bytes format."; this.infoURL = "https://wikipedia.org/wiki/BSON"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -43,7 +43,6 @@ class BSONDeserialise extends Operation { throw new OperationError(err.toString()); } } - } export default BSONDeserialise; diff --git a/src/core/operations/BSONSerialise.mjs b/src/core/operations/BSONSerialise.mjs index 25eed876..792e334b 100644 --- a/src/core/operations/BSONSerialise.mjs +++ b/src/core/operations/BSONSerialise.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * BSON serialise operation */ class BSONSerialise extends Operation { - /** * BSONSerialise constructor */ @@ -21,7 +20,8 @@ class BSONSerialise extends Operation { this.name = "BSON serialise"; this.module = "Serialise"; - this.description = "BSON is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures, associative arrays (called objects or documents in MongoDB), and various data types of specific interest to MongoDB. The name 'BSON' is based on the term JSON and stands for 'Binary JSON'.

Input data should be valid JSON."; + this.description = + "BSON is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures, associative arrays (called objects or documents in MongoDB), and various data types of specific interest to MongoDB. The name 'BSON' is based on the term JSON and stands for 'Binary JSON'.

Input data should be valid JSON."; this.infoURL = "https://wikipedia.org/wiki/BSON"; this.inputType = "string"; this.outputType = "ArrayBuffer"; @@ -43,7 +43,6 @@ class BSONSerialise extends Operation { throw new OperationError(err.toString()); } } - } export default BSONSerialise; diff --git a/src/core/operations/BaconCipherDecode.mjs b/src/core/operations/BaconCipherDecode.mjs index 40eba6bb..82e72fe1 100644 --- a/src/core/operations/BaconCipherDecode.mjs +++ b/src/core/operations/BaconCipherDecode.mjs @@ -7,8 +7,12 @@ import Operation from "../Operation.mjs"; import { BACON_ALPHABETS, - BACON_TRANSLATION_CASE, BACON_TRANSLATION_AMNZ, BACON_TRANSLATIONS, BACON_CLEARER_MAP, BACON_NORMALIZE_MAP, - swapZeroAndOne + BACON_TRANSLATION_CASE, + BACON_TRANSLATION_AMNZ, + BACON_TRANSLATIONS, + BACON_CLEARER_MAP, + BACON_NORMALIZE_MAP, + swapZeroAndOne, } from "../lib/Bacon.mjs"; /** @@ -23,68 +27,69 @@ class BaconCipherDecode extends Operation { this.name = "Bacon Cipher Decode"; this.module = "Default"; - this.description = "Bacon's cipher or the Baconian cipher is a method of steganography devised by Francis Bacon in 1605. A message is concealed in the presentation of text, rather than its content."; + this.description = + "Bacon's cipher or the Baconian cipher is a method of steganography devised by Francis Bacon in 1605. A message is concealed in the presentation of text, rather than its content."; this.infoURL = "https://wikipedia.org/wiki/Bacon%27s_cipher"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Alphabet", - "type": "option", - "value": Object.keys(BACON_ALPHABETS) + name: "Alphabet", + type: "option", + value: Object.keys(BACON_ALPHABETS), }, { - "name": "Translation", - "type": "option", - "value": BACON_TRANSLATIONS + name: "Translation", + type: "option", + value: BACON_TRANSLATIONS, }, { - "name": "Invert Translation", - "type": "boolean", - "value": false - } + name: "Invert Translation", + type: "boolean", + value: false, + }, ]; this.checks = [ { - pattern: "^\\s*([01]{5}\\s?)+$", - flags: "", - args: ["Standard (I=J and U=V)", "0/1", false] + pattern: "^\\s*([01]{5}\\s?)+$", + flags: "", + args: ["Standard (I=J and U=V)", "0/1", false], }, { - pattern: "^\\s*([01]{5}\\s?)+$", - flags: "", - args: ["Standard (I=J and U=V)", "0/1", true] + pattern: "^\\s*([01]{5}\\s?)+$", + flags: "", + args: ["Standard (I=J and U=V)", "0/1", true], }, { - pattern: "^\\s*([AB]{5}\\s?)+$", - flags: "", - args: ["Standard (I=J and U=V)", "A/B", false] + pattern: "^\\s*([AB]{5}\\s?)+$", + flags: "", + args: ["Standard (I=J and U=V)", "A/B", false], }, { - pattern: "^\\s*([AB]{5}\\s?)+$", - flags: "", - args: ["Standard (I=J and U=V)", "A/B", true] + pattern: "^\\s*([AB]{5}\\s?)+$", + flags: "", + args: ["Standard (I=J and U=V)", "A/B", true], }, { - pattern: "^\\s*([01]{5}\\s?)+$", - flags: "", - args: ["Complete", "0/1", false] + pattern: "^\\s*([01]{5}\\s?)+$", + flags: "", + args: ["Complete", "0/1", false], }, { - pattern: "^\\s*([01]{5}\\s?)+$", - flags: "", - args: ["Complete", "0/1", true] + pattern: "^\\s*([01]{5}\\s?)+$", + flags: "", + args: ["Complete", "0/1", true], }, { - pattern: "^\\s*([AB]{5}\\s?)+$", - flags: "", - args: ["Complete", "A/B", false] + pattern: "^\\s*([AB]{5}\\s?)+$", + flags: "", + args: ["Complete", "A/B", false], }, { - pattern: "^\\s*([AB]{5}\\s?)+$", - flags: "", - args: ["Complete", "A/B", true] - } + pattern: "^\\s*([AB]{5}\\s?)+$", + flags: "", + args: ["Complete", "A/B", true], + }, ]; } @@ -140,7 +145,10 @@ class BaconCipherDecode extends Operation { for (let i = 0; i < inputArray.length; i++) { const code = inputArray[i]; const number = parseInt(code, 2); - output += number < alphabetObject.alphabet.length ? alphabetObject.alphabet[number] : "?"; + output += + number < alphabetObject.alphabet.length + ? alphabetObject.alphabet[number] + : "?"; } return output; } diff --git a/src/core/operations/BaconCipherEncode.mjs b/src/core/operations/BaconCipherEncode.mjs index 3eb66b57..01c59c03 100644 --- a/src/core/operations/BaconCipherEncode.mjs +++ b/src/core/operations/BaconCipherEncode.mjs @@ -7,8 +7,9 @@ import Operation from "../Operation.mjs"; import { BACON_ALPHABETS, - BACON_TRANSLATIONS_FOR_ENCODING, BACON_TRANSLATION_AB, - swapZeroAndOne + BACON_TRANSLATIONS_FOR_ENCODING, + BACON_TRANSLATION_AB, + swapZeroAndOne, } from "../lib/Bacon.mjs"; /** @@ -23,31 +24,32 @@ class BaconCipherEncode extends Operation { this.name = "Bacon Cipher Encode"; this.module = "Default"; - this.description = "Bacon's cipher or the Baconian cipher is a method of steganography devised by Francis Bacon in 1605. A message is concealed in the presentation of text, rather than its content."; + this.description = + "Bacon's cipher or the Baconian cipher is a method of steganography devised by Francis Bacon in 1605. A message is concealed in the presentation of text, rather than its content."; this.infoURL = "https://wikipedia.org/wiki/Bacon%27s_cipher"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Alphabet", - "type": "option", - "value": Object.keys(BACON_ALPHABETS) + name: "Alphabet", + type: "option", + value: Object.keys(BACON_ALPHABETS), }, { - "name": "Translation", - "type": "option", - "value": BACON_TRANSLATIONS_FOR_ENCODING + name: "Translation", + type: "option", + value: BACON_TRANSLATIONS_FOR_ENCODING, }, { - "name": "Keep extra characters", - "type": "boolean", - "value": false + name: "Keep extra characters", + type: "boolean", + value: false, }, { - "name": "Invert Translation", - "type": "boolean", - "value": false - } + name: "Invert Translation", + type: "boolean", + value: false, + }, ]; } @@ -88,8 +90,8 @@ class BaconCipherEncode extends Operation { if (translation === BACON_TRANSLATION_AB) { output = output.replace(/[01]/g, function (c) { return { - "0": "A", - "1": "B" + 0: "A", + 1: "B", }[c]; }); } diff --git a/src/core/operations/Bcrypt.mjs b/src/core/operations/Bcrypt.mjs index 53b8a92e..3644c1de 100644 --- a/src/core/operations/Bcrypt.mjs +++ b/src/core/operations/Bcrypt.mjs @@ -12,7 +12,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Bcrypt operation */ class Bcrypt extends Operation { - /** * Bcrypt constructor */ @@ -21,16 +20,17 @@ class Bcrypt extends Operation { this.name = "Bcrypt"; this.module = "Crypto"; - this.description = "bcrypt is a password hashing function designed by Niels Provos and David Mazi\xe8res, based on the Blowfish cipher, and presented at USENIX in 1999. Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count (rounds) can be increased to make it slower, so it remains resistant to brute-force search attacks even with increasing computation power.

Enter the password in the input to generate its hash."; + this.description = + "bcrypt is a password hashing function designed by Niels Provos and David Mazi\xe8res, based on the Blowfish cipher, and presented at USENIX in 1999. Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count (rounds) can be increased to make it slower, so it remains resistant to brute-force search attacks even with increasing computation power.

Enter the password in the input to generate its hash."; this.infoURL = "https://wikipedia.org/wiki/Bcrypt"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Rounds", - "type": "number", - "value": 10 - } + name: "Rounds", + type: "number", + value: 10, + }, ]; } @@ -43,14 +43,12 @@ class Bcrypt extends Operation { const rounds = args[0]; const salt = await bcrypt.genSalt(rounds); - return await bcrypt.hash(input, salt, null, p => { + return await bcrypt.hash(input, salt, null, (p) => { // Progress callback if (isWorkerEnvironment()) self.sendStatusMessage(`Progress: ${(p * 100).toFixed(0)}%`); }); - } - } export default Bcrypt; diff --git a/src/core/operations/BcryptCompare.mjs b/src/core/operations/BcryptCompare.mjs index 8d9a6937..53a665f1 100644 --- a/src/core/operations/BcryptCompare.mjs +++ b/src/core/operations/BcryptCompare.mjs @@ -8,12 +8,10 @@ import Operation from "../Operation.mjs"; import bcrypt from "bcryptjs"; import { isWorkerEnvironment } from "../Utils.mjs"; - /** * Bcrypt compare operation */ class BcryptCompare extends Operation { - /** * BcryptCompare constructor */ @@ -22,16 +20,17 @@ class BcryptCompare extends Operation { this.name = "Bcrypt compare"; this.module = "Crypto"; - this.description = "Tests whether the input matches the given bcrypt hash. To test multiple possible passwords, use the 'Fork' operation."; + this.description = + "Tests whether the input matches the given bcrypt hash. To test multiple possible passwords, use the 'Fork' operation."; this.infoURL = "https://wikipedia.org/wiki/Bcrypt"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Hash", - "type": "string", - "value": "" - } + name: "Hash", + type: "string", + value: "", + }, ]; } @@ -43,16 +42,14 @@ class BcryptCompare extends Operation { async run(input, args) { const hash = args[0]; - const match = await bcrypt.compare(input, hash, null, p => { + const match = await bcrypt.compare(input, hash, null, (p) => { // Progress callback if (isWorkerEnvironment()) self.sendStatusMessage(`Progress: ${(p * 100).toFixed(0)}%`); }); return match ? "Match: " + input : "No match"; - } - } export default BcryptCompare; diff --git a/src/core/operations/BcryptParse.mjs b/src/core/operations/BcryptParse.mjs index 600a7dc3..12b22148 100644 --- a/src/core/operations/BcryptParse.mjs +++ b/src/core/operations/BcryptParse.mjs @@ -12,7 +12,6 @@ import bcrypt from "bcryptjs"; * Bcrypt parse operation */ class BcryptParse extends Operation { - /** * BcryptParse constructor */ @@ -21,7 +20,8 @@ class BcryptParse extends Operation { this.name = "Bcrypt parse"; this.module = "Crypto"; - this.description = "Parses a bcrypt hash to determine the number of rounds used, the salt, and the password hash."; + this.description = + "Parses a bcrypt hash to determine the number of rounds used, the salt, and the password hash."; this.infoURL = "https://wikipedia.org/wiki/Bcrypt"; this.inputType = "string"; this.outputType = "string"; @@ -43,7 +43,6 @@ Full hash: ${input}`; throw new OperationError("Error: " + err.toString()); } } - } export default BcryptParse; diff --git a/src/core/operations/BifidCipherDecode.mjs b/src/core/operations/BifidCipherDecode.mjs index 29318a32..a1caac75 100644 --- a/src/core/operations/BifidCipherDecode.mjs +++ b/src/core/operations/BifidCipherDecode.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Bifid Cipher Decode operation */ class BifidCipherDecode extends Operation { - /** * BifidCipherDecode constructor */ @@ -21,16 +20,17 @@ class BifidCipherDecode extends Operation { this.name = "Bifid Cipher Decode"; this.module = "Ciphers"; - this.description = "The Bifid cipher is a cipher which uses a Polybius square in conjunction with transposition, which can be fairly difficult to decipher without knowing the alphabet keyword."; + this.description = + "The Bifid cipher is a cipher which uses a Polybius square in conjunction with transposition, which can be fairly difficult to decipher without knowing the alphabet keyword."; this.infoURL = "https://wikipedia.org/wiki/Bifid_cipher"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Keyword", - "type": "string", - "value": "" - } + name: "Keyword", + type: "string", + value: "", + }, ]; } @@ -52,39 +52,47 @@ class BifidCipherDecode extends Operation { trans = ""; if (!/^[A-Z]+$/.test(keywordStr) && keyword.length > 0) - throw new OperationError("The key must consist only of letters in the English alphabet"); + throw new OperationError( + "The key must consist only of letters in the English alphabet", + ); const polybius = genPolybiusSquare(keywordStr); - input.replace("J", "I").split("").forEach((letter) => { - const alpInd = alpha.split("").indexOf(letter.toLocaleUpperCase()) >= 0; - let polInd; + input + .replace("J", "I") + .split("") + .forEach((letter) => { + const alpInd = + alpha.split("").indexOf(letter.toLocaleUpperCase()) >= 0; + let polInd; - if (alpInd) { - for (let i = 0; i < 5; i++) { - polInd = polybius[i].indexOf(letter.toLocaleUpperCase()); - if (polInd >= 0) { - trans += `${i}${polInd}`; + if (alpInd) { + for (let i = 0; i < 5; i++) { + polInd = polybius[i].indexOf( + letter.toLocaleUpperCase(), + ); + if (polInd >= 0) { + trans += `${i}${polInd}`; + } } - } - if (alpha.split("").indexOf(letter) >= 0) { - structure.push(true); - } else if (alpInd) { - structure.push(false); + if (alpha.split("").indexOf(letter) >= 0) { + structure.push(true); + } else if (alpInd) { + structure.push(false); + } + } else { + structure.push(letter); } - } else { - structure.push(letter); - } - }); + }); - structure.forEach(pos => { + structure.forEach((pos) => { if (typeof pos === "boolean") { - const coords = [trans[count], trans[count+trans.length/2]]; + const coords = [trans[count], trans[count + trans.length / 2]]; - output += pos ? - polybius[coords[0]][coords[1]] : - polybius[coords[0]][coords[1]].toLocaleLowerCase(); + output += pos + ? polybius[coords[0]][coords[1]] + : polybius[coords[0]][coords[1]].toLocaleLowerCase(); count++; } else { output += pos; @@ -119,7 +127,6 @@ class BifidCipherDecode extends Operation { highlightReverse(pos, args) { return pos; } - } export default BifidCipherDecode; diff --git a/src/core/operations/BifidCipherEncode.mjs b/src/core/operations/BifidCipherEncode.mjs index db38a3f2..56cb9c22 100644 --- a/src/core/operations/BifidCipherEncode.mjs +++ b/src/core/operations/BifidCipherEncode.mjs @@ -12,7 +12,6 @@ import { genPolybiusSquare } from "../lib/Ciphers.mjs"; * Bifid Cipher Encode operation */ class BifidCipherEncode extends Operation { - /** * BifidCipherEncode constructor */ @@ -21,16 +20,17 @@ class BifidCipherEncode extends Operation { this.name = "Bifid Cipher Encode"; this.module = "Ciphers"; - this.description = "The Bifid cipher is a cipher which uses a Polybius square in conjunction with transposition, which can be fairly difficult to decipher without knowing the alphabet keyword."; + this.description = + "The Bifid cipher is a cipher which uses a Polybius square in conjunction with transposition, which can be fairly difficult to decipher without knowing the alphabet keyword."; this.infoURL = "https://wikipedia.org/wiki/Bifid_cipher"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Keyword", - "type": "string", - "value": "" - } + name: "Keyword", + type: "string", + value: "", + }, ]; } @@ -52,44 +52,51 @@ class BifidCipherEncode extends Operation { let output = "", count = 0; - if (!/^[A-Z]+$/.test(keywordStr) && keyword.length > 0) - throw new OperationError("The key must consist only of letters in the English alphabet"); + throw new OperationError( + "The key must consist only of letters in the English alphabet", + ); const polybius = genPolybiusSquare(keywordStr); - input.replace("J", "I").split("").forEach(letter => { - const alpInd = alpha.split("").indexOf(letter.toLocaleUpperCase()) >= 0; - let polInd; + input + .replace("J", "I") + .split("") + .forEach((letter) => { + const alpInd = + alpha.split("").indexOf(letter.toLocaleUpperCase()) >= 0; + let polInd; - if (alpInd) { - for (let i = 0; i < 5; i++) { - polInd = polybius[i].indexOf(letter.toLocaleUpperCase()); - if (polInd >= 0) { - xCo.push(polInd); - yCo.push(i); + if (alpInd) { + for (let i = 0; i < 5; i++) { + polInd = polybius[i].indexOf( + letter.toLocaleUpperCase(), + ); + if (polInd >= 0) { + xCo.push(polInd); + yCo.push(i); + } } - } - if (alpha.split("").indexOf(letter) >= 0) { - structure.push(true); - } else if (alpInd) { - structure.push(false); + if (alpha.split("").indexOf(letter) >= 0) { + structure.push(true); + } else if (alpInd) { + structure.push(false); + } + } else { + structure.push(letter); } - } else { - structure.push(letter); - } - }); + }); const trans = `${yCo.join("")}${xCo.join("")}`; - structure.forEach(pos => { + structure.forEach((pos) => { if (typeof pos === "boolean") { - const coords = trans.substr(2*count, 2).split(""); + const coords = trans.substr(2 * count, 2).split(""); - output += pos ? - polybius[coords[0]][coords[1]] : - polybius[coords[0]][coords[1]].toLocaleLowerCase(); + output += pos + ? polybius[coords[0]][coords[1]] + : polybius[coords[0]][coords[1]].toLocaleLowerCase(); count++; } else { output += pos; @@ -124,7 +131,6 @@ class BifidCipherEncode extends Operation { highlightReverse(pos, args) { return pos; } - } export default BifidCipherEncode; diff --git a/src/core/operations/BitShiftLeft.mjs b/src/core/operations/BitShiftLeft.mjs index cd9f4568..5df420ac 100644 --- a/src/core/operations/BitShiftLeft.mjs +++ b/src/core/operations/BitShiftLeft.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Bit shift left operation */ class BitShiftLeft extends Operation { - /** * BitShiftLeft constructor */ @@ -19,16 +18,18 @@ class BitShiftLeft extends Operation { this.name = "Bit shift left"; this.module = "Default"; - this.description = "Shifts the bits in each byte towards the left by the specified amount."; - this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; + this.description = + "Shifts the bits in each byte towards the left by the specified amount."; + this.infoURL = + "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; this.args = [ { - "name": "Amount", - "type": "number", - "value": 1 - } + name: "Amount", + type: "number", + value: 1, + }, ]; } @@ -41,7 +42,7 @@ class BitShiftLeft extends Operation { const amount = args[0]; input = new Uint8Array(input); - return input.map(b => { + return input.map((b) => { return (b << amount) & 0xff; }).buffer; } @@ -71,7 +72,6 @@ class BitShiftLeft extends Operation { highlightReverse(pos, args) { return pos; } - } export default BitShiftLeft; diff --git a/src/core/operations/BitShiftRight.mjs b/src/core/operations/BitShiftRight.mjs index 2d70849e..28741d3e 100644 --- a/src/core/operations/BitShiftRight.mjs +++ b/src/core/operations/BitShiftRight.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Bit shift right operation */ class BitShiftRight extends Operation { - /** * BitShiftRight constructor */ @@ -19,21 +18,23 @@ class BitShiftRight extends Operation { this.name = "Bit shift right"; this.module = "Default"; - this.description = "Shifts the bits in each byte towards the right by the specified amount.

Logical shifts replace the leftmost bits with zeros.
Arithmetic shifts preserve the most significant bit (MSB) of the original byte keeping the sign the same (positive or negative)."; - this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; + this.description = + "Shifts the bits in each byte towards the right by the specified amount.

Logical shifts replace the leftmost bits with zeros.
Arithmetic shifts preserve the most significant bit (MSB) of the original byte keeping the sign the same (positive or negative)."; + this.infoURL = + "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; this.args = [ { - "name": "Amount", - "type": "number", - "value": 1 + name: "Amount", + type: "number", + value: 1, }, { - "name": "Type", - "type": "option", - "value": ["Logical shift", "Arithmetic shift"] - } + name: "Type", + type: "option", + value: ["Logical shift", "Arithmetic shift"], + }, ]; } @@ -48,7 +49,7 @@ class BitShiftRight extends Operation { mask = type === "Logical shift" ? 0 : 0x80; input = new Uint8Array(input); - return input.map(b => { + return input.map((b) => { return (b >>> amount) ^ (b & mask); }).buffer; } @@ -78,7 +79,6 @@ class BitShiftRight extends Operation { highlightReverse(pos, args) { return pos; } - } export default BitShiftRight; diff --git a/src/core/operations/BlowfishDecrypt.mjs b/src/core/operations/BlowfishDecrypt.mjs index f7dc8d17..00b7b9d5 100644 --- a/src/core/operations/BlowfishDecrypt.mjs +++ b/src/core/operations/BlowfishDecrypt.mjs @@ -14,7 +14,6 @@ import { Blowfish } from "../lib/Blowfish.mjs"; * Blowfish Decrypt operation */ class BlowfishDecrypt extends Operation { - /** * BlowfishDecrypt constructor */ @@ -23,38 +22,39 @@ class BlowfishDecrypt extends Operation { this.name = "Blowfish Decrypt"; this.module = "Ciphers"; - this.description = "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes."; + this.description = + "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes."; this.infoURL = "https://wikipedia.org/wiki/Blowfish_(cipher)"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Mode", - "type": "option", - "value": ["CBC", "CFB", "OFB", "CTR", "ECB"] + name: "Mode", + type: "option", + value: ["CBC", "CFB", "OFB", "CTR", "ECB"], }, { - "name": "Input", - "type": "option", - "value": ["Hex", "Raw"] + name: "Input", + type: "option", + value: ["Hex", "Raw"], }, { - "name": "Output", - "type": "option", - "value": ["Raw", "Hex"] - } + name: "Output", + type: "option", + value: ["Raw", "Hex"], + }, ]; } @@ -79,17 +79,20 @@ Blowfish uses a key length of 8 bytes (64 bits).`); input = Utils.convertToByteString(input, inputType); const decipher = Blowfish.createDecipher(key, mode); - decipher.start({iv: iv}); + decipher.start({ iv: iv }); decipher.update(forge.util.createBuffer(input)); const result = decipher.finish(); if (result) { - return outputType === "Hex" ? decipher.output.toHex() : decipher.output.getBytes(); + return outputType === "Hex" + ? decipher.output.toHex() + : decipher.output.getBytes(); } else { - throw new OperationError("Unable to decrypt input with these parameters."); + throw new OperationError( + "Unable to decrypt input with these parameters.", + ); } } - } export default BlowfishDecrypt; diff --git a/src/core/operations/BlowfishEncrypt.mjs b/src/core/operations/BlowfishEncrypt.mjs index 2cf3672b..e8210e68 100644 --- a/src/core/operations/BlowfishEncrypt.mjs +++ b/src/core/operations/BlowfishEncrypt.mjs @@ -14,7 +14,6 @@ import { Blowfish } from "../lib/Blowfish.mjs"; * Blowfish Encrypt operation */ class BlowfishEncrypt extends Operation { - /** * BlowfishEncrypt constructor */ @@ -23,38 +22,39 @@ class BlowfishEncrypt extends Operation { this.name = "Blowfish Encrypt"; this.module = "Ciphers"; - this.description = "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes."; + this.description = + "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes."; this.infoURL = "https://wikipedia.org/wiki/Blowfish_(cipher)"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Mode", - "type": "option", - "value": ["CBC", "CFB", "OFB", "CTR", "ECB"] + name: "Mode", + type: "option", + value: ["CBC", "CFB", "OFB", "CTR", "ECB"], }, { - "name": "Input", - "type": "option", - "value": ["Raw", "Hex"] + name: "Input", + type: "option", + value: ["Raw", "Hex"], }, { - "name": "Output", - "type": "option", - "value": ["Hex", "Raw"] - } + name: "Output", + type: "option", + value: ["Hex", "Raw"], + }, ]; } @@ -79,7 +79,7 @@ Blowfish uses a key length of 8 bytes (64 bits).`); input = Utils.convertToByteString(input, inputType); const cipher = Blowfish.createCipher(key, mode); - cipher.start({iv: iv}); + cipher.start({ iv: iv }); cipher.update(forge.util.createBuffer(input)); cipher.finish(); @@ -89,7 +89,6 @@ Blowfish uses a key length of 8 bytes (64 bits).`); return cipher.output.getBytes(); } } - } export default BlowfishEncrypt; diff --git a/src/core/operations/BlurImage.mjs b/src/core/operations/BlurImage.mjs index 51082e54..74cf69e6 100644 --- a/src/core/operations/BlurImage.mjs +++ b/src/core/operations/BlurImage.mjs @@ -16,7 +16,6 @@ import jimp from "jimp"; * Blur Image operation */ class BlurImage extends Operation { - /** * BlurImage constructor */ @@ -25,7 +24,8 @@ class BlurImage extends Operation { this.name = "Blur Image"; this.module = "Image"; - this.description = "Applies a blur effect to the image.

Gaussian blur is much slower than fast blur, but produces better results."; + this.description = + "Applies a blur effect to the image.

Gaussian blur is much slower than fast blur, but produces better results."; this.infoURL = "https://wikipedia.org/wiki/Gaussian_blur"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -35,13 +35,13 @@ class BlurImage extends Operation { name: "Amount", type: "number", value: 5, - min: 1 + min: 1, }, { name: "Type", type: "option", - value: ["Fast", "Gaussian"] - } + value: ["Fast", "Gaussian"], + }, ]; } @@ -106,7 +106,6 @@ class BlurImage extends Operation { return ``; } - } export default BlurImage; diff --git a/src/core/operations/Bombe.mjs b/src/core/operations/Bombe.mjs index a635b430..4bc43b51 100644 --- a/src/core/operations/Bombe.mjs +++ b/src/core/operations/Bombe.mjs @@ -13,7 +13,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import { isWorkerEnvironment } from "../Utils.mjs"; import { BombeMachine } from "../lib/Bombe.mjs"; -import { ROTORS, ROTORS_FOURTH, REFLECTORS, Reflector } from "../lib/Enigma.mjs"; +import { + ROTORS, + ROTORS_FOURTH, + REFLECTORS, + Reflector, +} from "../lib/Enigma.mjs"; /** * Bombe operation @@ -27,7 +32,8 @@ class Bombe extends Operation { this.name = "Bombe"; this.module = "Bletchley"; - this.description = "Emulation of the Bombe machine used at Bletchley Park to attack Enigma, based on work by Polish and British cryptanalysts.

To run this you need to have a 'crib', which is some known plaintext for a chunk of the target ciphertext, and know the rotors used. (See the 'Bombe (multiple runs)' operation if you don't know the rotors.) The machine will suggest possible configurations of the Enigma. Each suggestion has the rotor start positions (left to right) and known plugboard pairs.

Choosing a crib: First, note that Enigma cannot encrypt a letter to itself, which allows you to rule out some positions for possible cribs. Secondly, the Bombe does not simulate the Enigma's middle rotor stepping. The longer your crib, the more likely a step happened within it, which will prevent the attack working. However, other than that, longer cribs are generally better. The attack produces a 'menu' which maps ciphertext letters to plaintext, and the goal is to produce 'loops': for example, with ciphertext ABC and crib CAB, we have the mappings A<->C, B<->A, and C<->B, which produces a loop A-B-C-A. The more loops, the better the crib. The operation will output this: if your menu has too few loops or is too short, a large number of incorrect outputs will usually be produced. Try a different crib. If the menu seems good but the right answer isn't produced, your crib may be wrong, or you may have overlapped the middle rotor stepping - try a different crib.

Output is not sufficient to fully decrypt the data. You will have to recover the rest of the plugboard settings by inspection. And the ring position is not taken into account: this affects when the middle rotor steps. If your output is correct for a bit, and then goes wrong, adjust the ring and start position on the right-hand rotor together until the output improves. If necessary, repeat for the middle rotor.

By default this operation runs the checking machine, a manual process to verify the quality of Bombe stops, on each stop, discarding stops which fail. If you want to see how many times the hardware actually stops for a given input, disable the checking machine.

More detailed descriptions of the Enigma, Typex and Bombe operations
can be found here."; + this.description = + "Emulation of the Bombe machine used at Bletchley Park to attack Enigma, based on work by Polish and British cryptanalysts.

To run this you need to have a 'crib', which is some known plaintext for a chunk of the target ciphertext, and know the rotors used. (See the 'Bombe (multiple runs)' operation if you don't know the rotors.) The machine will suggest possible configurations of the Enigma. Each suggestion has the rotor start positions (left to right) and known plugboard pairs.

Choosing a crib: First, note that Enigma cannot encrypt a letter to itself, which allows you to rule out some positions for possible cribs. Secondly, the Bombe does not simulate the Enigma's middle rotor stepping. The longer your crib, the more likely a step happened within it, which will prevent the attack working. However, other than that, longer cribs are generally better. The attack produces a 'menu' which maps ciphertext letters to plaintext, and the goal is to produce 'loops': for example, with ciphertext ABC and crib CAB, we have the mappings A<->C, B<->A, and C<->B, which produces a loop A-B-C-A. The more loops, the better the crib. The operation will output this: if your menu has too few loops or is too short, a large number of incorrect outputs will usually be produced. Try a different crib. If the menu seems good but the right answer isn't produced, your crib may be wrong, or you may have overlapped the middle rotor stepping - try a different crib.

Output is not sufficient to fully decrypt the data. You will have to recover the rest of the plugboard settings by inspection. And the ring position is not taken into account: this affects when the middle rotor steps. If your output is correct for a bit, and then goes wrong, adjust the ring and start position on the right-hand rotor together until the output improves. If necessary, repeat for the middle rotor.

By default this operation runs the checking machine, a manual process to verify the quality of Bombe stops, on each stop, discarding stops which fail. If you want to see how many times the hardware actually stops for a given input, disable the checking machine.

More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; this.infoURL = "https://wikipedia.org/wiki/Bombe"; this.inputType = "string"; this.outputType = "JSON"; @@ -39,58 +45,58 @@ class Bombe extends Operation { value: [ { name: "3-rotor", - off: [1] + off: [1], }, { name: "4-rotor", - on: [1] - } - ] + on: [1], + }, + ], }, { name: "Left-most (4th) rotor", type: "editableOption", value: ROTORS_FOURTH, - defaultIndex: 0 + defaultIndex: 0, }, { name: "Left-hand rotor", type: "editableOption", value: ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "Middle rotor", type: "editableOption", value: ROTORS, - defaultIndex: 1 + defaultIndex: 1, }, { name: "Right-hand rotor", type: "editableOption", value: ROTORS, - defaultIndex: 2 + defaultIndex: 2, }, { name: "Reflector", type: "editableOption", - value: REFLECTORS + value: REFLECTORS, }, { name: "Crib", type: "string", - value: "" + value: "", }, { name: "Crib offset", type: "number", - value: 0 + value: 0, }, { name: "Use checking machine", type: "boolean", - value: true - } + value: true, + }, ]; } @@ -101,7 +107,11 @@ class Bombe extends Operation { * @param {number} progress - Progress (as a float in the range 0..1) */ updateStatus(nLoops, nStops, progress) { - const msg = `Bombe run with ${nLoops} loop${nLoops === 1 ? "" : "s"} in menu (2+ desirable): ${nStops} stops, ${Math.floor(100 * progress)}% done`; + const msg = `Bombe run with ${nLoops} loop${ + nLoops === 1 ? "" : "s" + } in menu (2+ desirable): ${nStops} stops, ${Math.floor( + 100 * progress, + )}% done`; self.sendStatusMessage(msg); } @@ -117,7 +127,7 @@ class Bombe extends Operation { const offset = args[7]; const check = args[8]; const rotors = []; - for (let i=0; i<4; i++) { + for (let i = 0; i < 4; i++) { if (i === 0 && model === "3-rotor") { // No fourth rotor continue; @@ -148,15 +158,21 @@ class Bombe extends Operation { } else { update = undefined; } - const bombe = new BombeMachine(rotors, reflector, ciphertext, crib, check, update); + const bombe = new BombeMachine( + rotors, + reflector, + ciphertext, + crib, + check, + update, + ); const result = bombe.run(); return { nLoops: bombe.nLoops, - result: result + result: result, }; } - /** * Displays the Bombe results in an HTML table * @@ -166,8 +182,11 @@ class Bombe extends Operation { * @returns {html} */ present(output) { - let html = `Bombe run on menu with ${output.nLoops} loop${output.nLoops === 1 ? "" : "s"} (2+ desirable). Note: Rotor positions are listed left to right and start at the beginning of the crib, and ignore stepping and the ring setting. Some plugboard settings are determined. A decryption preview starting at the beginning of the crib and ignoring stepping is also provided.\n\n`; - html += "\n"; + let html = `Bombe run on menu with ${output.nLoops} loop${ + output.nLoops === 1 ? "" : "s" + } (2+ desirable). Note: Rotor positions are listed left to right and start at the beginning of the crib, and ignore stepping and the ring setting. Some plugboard settings are determined. A decryption preview starting at the beginning of the crib and ignoring stepping is also provided.\n\n`; + html += + "
Rotor stops Partial plugboard Decryption preview
\n"; for (const [setting, stecker, decrypt] of output.result) { html += `\n`; } diff --git a/src/core/operations/Bzip2Compress.mjs b/src/core/operations/Bzip2Compress.mjs index 45dbfae6..c64f9d18 100644 --- a/src/core/operations/Bzip2Compress.mjs +++ b/src/core/operations/Bzip2Compress.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Bzip2 Compress operation */ class Bzip2Compress extends Operation { - /** * Bzip2Compress constructor */ @@ -22,7 +21,8 @@ class Bzip2Compress extends Operation { this.name = "Bzip2 Compress"; this.module = "Compression"; - this.description = "Bzip2 is a compression library developed by Julian Seward (of GHC fame) that uses the Burrows-Wheeler algorithm. It only supports compressing single files and its compression is slow, however is more effective than Deflate (.gz & .zip)."; + this.description = + "Bzip2 is a compression library developed by Julian Seward (of GHC fame) that uses the Burrows-Wheeler algorithm. It only supports compressing single files and its compression is slow, however is more effective than Deflate (.gz & .zip)."; this.infoURL = "https://wikipedia.org/wiki/Bzip2"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -32,13 +32,13 @@ class Bzip2Compress extends Operation { type: "number", value: 9, min: 1, - max: 9 + max: 9, }, { name: "Work factor", type: "number", - value: 30 - } + value: 30, + }, ]; } @@ -54,20 +54,29 @@ class Bzip2Compress extends Operation { } if (isWorkerEnvironment()) self.sendStatusMessage("Loading Bzip2..."); return new Promise((resolve, reject) => { - Bzip2().then(bzip2 => { - if (isWorkerEnvironment()) self.sendStatusMessage("Compressing data..."); + Bzip2().then((bzip2) => { + if (isWorkerEnvironment()) + self.sendStatusMessage("Compressing data..."); const inpArray = new Uint8Array(input); - const bzip2cc = bzip2.compressBZ2(inpArray, blockSize, workFactor); + const bzip2cc = bzip2.compressBZ2( + inpArray, + blockSize, + workFactor, + ); if (bzip2cc.error !== 0) { reject(new OperationError(bzip2cc.error_msg)); } else { const output = bzip2cc.output; - resolve(output.buffer.slice(output.byteOffset, output.byteLength + output.byteOffset)); + resolve( + output.buffer.slice( + output.byteOffset, + output.byteLength + output.byteOffset, + ), + ); } }); }); } - } export default Bzip2Compress; diff --git a/src/core/operations/Bzip2Decompress.mjs b/src/core/operations/Bzip2Decompress.mjs index fe419265..57616feb 100644 --- a/src/core/operations/Bzip2Decompress.mjs +++ b/src/core/operations/Bzip2Decompress.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Bzip2 Decompress operation */ class Bzip2Decompress extends Operation { - /** * Bzip2Decompress constructor */ @@ -30,15 +29,15 @@ class Bzip2Decompress extends Operation { { name: "Use low-memory, slower decompression algorithm", type: "boolean", - value: false - } + value: false, + }, ]; this.checks = [ { - "pattern": "^\\x42\\x5a\\x68", - "flags": "", - "args": [] - } + pattern: "^\\x42\\x5a\\x68", + flags: "", + args: [], + }, ]; } @@ -54,20 +53,25 @@ class Bzip2Decompress extends Operation { } if (isWorkerEnvironment()) self.sendStatusMessage("Loading Bzip2..."); return new Promise((resolve, reject) => { - Bzip2().then(bzip2 => { - if (isWorkerEnvironment()) self.sendStatusMessage("Decompressing data..."); + Bzip2().then((bzip2) => { + if (isWorkerEnvironment()) + self.sendStatusMessage("Decompressing data..."); const inpArray = new Uint8Array(input); const bzip2cc = bzip2.decompressBZ2(inpArray, small ? 1 : 0); if (bzip2cc.error !== 0) { reject(new OperationError(bzip2cc.error_msg)); } else { const output = bzip2cc.output; - resolve(output.buffer.slice(output.byteOffset, output.byteLength + output.byteOffset)); + resolve( + output.buffer.slice( + output.byteOffset, + output.byteLength + output.byteOffset, + ), + ); } }); }); } - } export default Bzip2Decompress; diff --git a/src/core/operations/CBORDecode.mjs b/src/core/operations/CBORDecode.mjs index f4bda7c0..af217b58 100644 --- a/src/core/operations/CBORDecode.mjs +++ b/src/core/operations/CBORDecode.mjs @@ -11,7 +11,6 @@ import Cbor from "cbor"; * CBOR Decode operation */ class CBORDecode extends Operation { - /** * CBORDecode constructor */ @@ -20,7 +19,8 @@ class CBORDecode extends Operation { this.name = "CBOR Decode"; this.module = "Serialise"; - this.description = "Concise Binary Object Representation (CBOR) is a binary data serialization format loosely based on JSON. Like JSON it allows the transmission of data objects that contain name–value pairs, but in a more concise manner. This increases processing and transfer speeds at the cost of human readability. It is defined in IETF RFC 8949."; + this.description = + "Concise Binary Object Representation (CBOR) is a binary data serialization format loosely based on JSON. Like JSON it allows the transmission of data objects that contain name–value pairs, but in a more concise manner. This increases processing and transfer speeds at the cost of human readability. It is defined in IETF RFC 8949."; this.infoURL = "https://wikipedia.org/wiki/CBOR"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -35,7 +35,6 @@ class CBORDecode extends Operation { run(input, args) { return Cbor.decodeFirstSync(Buffer.from(input).toString("hex")); } - } export default CBORDecode; diff --git a/src/core/operations/CBOREncode.mjs b/src/core/operations/CBOREncode.mjs index c6e094a9..aa096713 100644 --- a/src/core/operations/CBOREncode.mjs +++ b/src/core/operations/CBOREncode.mjs @@ -11,7 +11,6 @@ import Cbor from "cbor"; * CBOR Encode operation */ class CBOREncode extends Operation { - /** * CBOREncode constructor */ @@ -20,7 +19,8 @@ class CBOREncode extends Operation { this.name = "CBOR Encode"; this.module = "Serialise"; - this.description = "Concise Binary Object Representation (CBOR) is a binary data serialization format loosely based on JSON. Like JSON it allows the transmission of data objects that contain name–value pairs, but in a more concise manner. This increases processing and transfer speeds at the cost of human readability. It is defined in IETF RFC 8949."; + this.description = + "Concise Binary Object Representation (CBOR) is a binary data serialization format loosely based on JSON. Like JSON it allows the transmission of data objects that contain name–value pairs, but in a more concise manner. This increases processing and transfer speeds at the cost of human readability. It is defined in IETF RFC 8949."; this.infoURL = "https://wikipedia.org/wiki/CBOR"; this.inputType = "JSON"; this.outputType = "ArrayBuffer"; @@ -35,7 +35,6 @@ class CBOREncode extends Operation { run(input, args) { return new Uint8Array(Cbor.encodeCanonical(input)).buffer; } - } export default CBOREncode; diff --git a/src/core/operations/CMAC.mjs b/src/core/operations/CMAC.mjs index d6491362..bf92b8ee 100644 --- a/src/core/operations/CMAC.mjs +++ b/src/core/operations/CMAC.mjs @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * CMAC operation */ class CMAC extends Operation { - /** * CMAC constructor */ @@ -23,22 +22,23 @@ class CMAC extends Operation { this.name = "CMAC"; this.module = "Crypto"; - this.description = "CMAC is a block-cipher based message authentication code algorithm.

RFC4493 defines AES-CMAC that uses AES encryption with a 128-bit key.
NIST SP 800-38B suggests usages of AES with other key lengths and Triple DES."; + this.description = + "CMAC is a block-cipher based message authentication code algorithm.

RFC4493 defines AES-CMAC that uses AES encryption with a 128-bit key.
NIST SP 800-38B suggests usages of AES with other key lengths and Triple DES."; this.infoURL = "https://wikipedia.org/wiki/CMAC"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Encryption algorithm", - "type": "option", - "value": ["AES", "Triple DES"] - } + name: "Encryption algorithm", + type: "option", + value: ["AES", "Triple DES"], + }, ]; } @@ -51,34 +51,49 @@ class CMAC extends Operation { const key = Utils.convertToByteString(args[0].string, args[0].option); const algo = args[1]; - const info = (function() { + const info = (function () { switch (algo) { case "AES": - if (key.length !== 16 && key.length !== 24 && key.length !== 32) { - throw new OperationError("The key for AES must be either 16, 24, or 32 bytes (currently " + key.length + " bytes)"); + if ( + key.length !== 16 && + key.length !== 24 && + key.length !== 32 + ) { + throw new OperationError( + "The key for AES must be either 16, 24, or 32 bytes (currently " + + key.length + + " bytes)", + ); } return { - "algorithm": "AES-ECB", - "key": key, - "blockSize": 16, - "Rb": new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x87]), + algorithm: "AES-ECB", + key: key, + blockSize: 16, + Rb: new Uint8Array([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x87, + ]), }; case "Triple DES": if (key.length !== 16 && key.length !== 24) { - throw new OperationError("The key for Triple DES must be 16 or 24 bytes (currently " + key.length + " bytes)"); + throw new OperationError( + "The key for Triple DES must be 16 or 24 bytes (currently " + + key.length + + " bytes)", + ); } return { - "algorithm": "3DES-ECB", - "key": key.length === 16 ? key + key.substring(0, 8) : key, - "blockSize": 8, - "Rb": new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0x1b]), + algorithm: "3DES-ECB", + key: + key.length === 16 ? key + key.substring(0, 8) : key, + blockSize: 8, + Rb: new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0x1b]), }; default: throw new OperationError("Undefined encryption algorithm"); } })(); - const xor = function(a, b, out) { + const xor = function (a, b, out) { if (!out) out = new Uint8Array(a.length); for (let i = 0; i < a.length; i++) { out[i] = a[i] ^ b[i]; @@ -86,7 +101,7 @@ class CMAC extends Operation { return out; }; - const leftShift1 = function(a) { + const leftShift1 = function (a) { const out = new Uint8Array(a.length); let carry = 0; for (let i = a.length - 1; i >= 0; i--) { @@ -97,7 +112,7 @@ class CMAC extends Operation { }; const cipher = forge.cipher.createCipher(info.algorithm, info.key); - const encrypt = function(a, out) { + const encrypt = function (a, out) { if (!out) out = new Uint8Array(a.length); cipher.start(); cipher.update(forge.util.createBuffer(a)); @@ -116,7 +131,7 @@ class CMAC extends Operation { if (K1[0] & 0x80) xor(K2, info.Rb, K2); const n = Math.ceil(input.byteLength / info.blockSize); - const lastBlock = (function() { + const lastBlock = (function () { if (n === 0) { const data = new Uint8Array(K2); data[0] ^= 0x80; @@ -136,14 +151,17 @@ class CMAC extends Operation { const X = new Uint8Array(info.blockSize); const Y = new Uint8Array(info.blockSize); for (let i = 0; i < n - 1; i++) { - xor(X, new Uint8Array(input, info.blockSize * i, info.blockSize), Y); + xor( + X, + new Uint8Array(input, info.blockSize * i, info.blockSize), + Y, + ); encrypt(Y, X); } xor(lastBlock, X, Y); const T = encrypt(Y); return toHexFast(T); } - } export default CMAC; diff --git a/src/core/operations/CRC16Checksum.mjs b/src/core/operations/CRC16Checksum.mjs index 035ee04b..c86e4778 100644 --- a/src/core/operations/CRC16Checksum.mjs +++ b/src/core/operations/CRC16Checksum.mjs @@ -11,7 +11,6 @@ import JSCRC from "js-crc"; * CRC-16 Checksum operation */ class CRC16Checksum extends Operation { - /** * CRC16Checksum constructor */ @@ -20,7 +19,8 @@ class CRC16Checksum extends Operation { this.name = "CRC-16 Checksum"; this.module = "Crypto"; - this.description = "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961."; + this.description = + "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961."; this.infoURL = "https://wikipedia.org/wiki/Cyclic_redundancy_check"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -35,7 +35,6 @@ class CRC16Checksum extends Operation { run(input, args) { return JSCRC.crc16(input); } - } export default CRC16Checksum; diff --git a/src/core/operations/CRC32Checksum.mjs b/src/core/operations/CRC32Checksum.mjs index cfe84643..f74974f9 100644 --- a/src/core/operations/CRC32Checksum.mjs +++ b/src/core/operations/CRC32Checksum.mjs @@ -11,7 +11,6 @@ import JSCRC from "js-crc"; * CRC-32 Checksum operation */ class CRC32Checksum extends Operation { - /** * CRC32Checksum constructor */ @@ -20,7 +19,8 @@ class CRC32Checksum extends Operation { this.name = "CRC-32 Checksum"; this.module = "Crypto"; - this.description = "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961; the 32-bit CRC function of Ethernet and many other standards is the work of several researchers and was published in 1975."; + this.description = + "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961; the 32-bit CRC function of Ethernet and many other standards is the work of several researchers and was published in 1975."; this.infoURL = "https://wikipedia.org/wiki/Cyclic_redundancy_check"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -35,7 +35,6 @@ class CRC32Checksum extends Operation { run(input, args) { return JSCRC.crc32(input); } - } export default CRC32Checksum; diff --git a/src/core/operations/CRC8Checksum.mjs b/src/core/operations/CRC8Checksum.mjs index 193cadf9..254e27af 100644 --- a/src/core/operations/CRC8Checksum.mjs +++ b/src/core/operations/CRC8Checksum.mjs @@ -13,7 +13,6 @@ import { toHexFast } from "../lib/Hex.mjs"; * CRC-8 Checksum operation */ class CRC8Checksum extends Operation { - /** * CRC8Checksum constructor */ @@ -22,15 +21,16 @@ class CRC8Checksum extends Operation { this.name = "CRC-8 Checksum"; this.module = "Crypto"; - this.description = "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961."; + this.description = + "A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

The CRC was invented by W. Wesley Peterson in 1961."; this.infoURL = "https://wikipedia.org/wiki/Cyclic_redundancy_check"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Algorithm", - "type": "option", - "value": [ + name: "Algorithm", + type: "option", + value: [ "CRC-8", "CRC-8/CDMA2000", "CRC-8/DARC", @@ -40,9 +40,9 @@ class CRC8Checksum extends Operation { "CRC-8/ITU", "CRC-8/MAXIM", "CRC-8/ROHC", - "CRC-8/WCDMA" - ] - } + "CRC-8/WCDMA", + ], + }, ]; } @@ -82,7 +82,14 @@ class CRC8Checksum extends Operation { * @param {boolean} outputReflection * @param {number} xorOut */ - calculateCRC8(input, polynomial, initializationValue, inputReflection, outputReflection, xorOut) { + calculateCRC8( + input, + polynomial, + initializationValue, + inputReflection, + outputReflection, + xorOut, + ) { const crcSize = 8; const crcTable = this.calculateCRC8LookupTable(polynomial); @@ -91,7 +98,9 @@ class CRC8Checksum extends Operation { input = new Uint8Array(input); for (const inputByte of input) { - currentByte = inputReflection ? this.reverseBits(inputByte, crcSize) : inputByte; + currentByte = inputReflection + ? this.reverseBits(inputByte, crcSize) + : inputByte; position = (currentByte ^ crc) & 255; crc = crcTable[position]; @@ -112,7 +121,7 @@ class CRC8Checksum extends Operation { reverseBits(input, hashSize) { let reversedByte = 0; for (let i = hashSize - 1; i >= 0; i--) { - reversedByte |= ((input & 1) << i); + reversedByte |= (input & 1) << i; input >>= 1; } @@ -131,23 +140,23 @@ class CRC8Checksum extends Operation { case "CRC-8": return this.calculateCRC8(input, 0x7, 0x0, false, false, 0x0); case "CRC-8/CDMA2000": - return this.calculateCRC8(input, 0x9B, 0xFF, false, false, 0x0); + return this.calculateCRC8(input, 0x9b, 0xff, false, false, 0x0); case "CRC-8/DARC": return this.calculateCRC8(input, 0x39, 0x0, true, true, 0x0); case "CRC-8/DVB-S2": - return this.calculateCRC8(input, 0xD5, 0x0, false, false, 0x0); + return this.calculateCRC8(input, 0xd5, 0x0, false, false, 0x0); case "CRC-8/EBU": - return this.calculateCRC8(input, 0x1D, 0xFF, true, true, 0x0); + return this.calculateCRC8(input, 0x1d, 0xff, true, true, 0x0); case "CRC-8/I-CODE": - return this.calculateCRC8(input, 0x1D, 0xFD, false, false, 0x0); + return this.calculateCRC8(input, 0x1d, 0xfd, false, false, 0x0); case "CRC-8/ITU": return this.calculateCRC8(input, 0x7, 0x0, false, false, 0x55); case "CRC-8/MAXIM": return this.calculateCRC8(input, 0x31, 0x0, true, true, 0x0); case "CRC-8/ROHC": - return this.calculateCRC8(input, 0x7, 0xFF, true, true, 0x0); + return this.calculateCRC8(input, 0x7, 0xff, true, true, 0x0); case "CRC-8/WCDMA": - return this.calculateCRC8(input, 0x9B, 0x0, true, true, 0x0); + return this.calculateCRC8(input, 0x9b, 0x0, true, true, 0x0); default: throw new OperationError("Unknown checksum algorithm"); } diff --git a/src/core/operations/CSSBeautify.mjs b/src/core/operations/CSSBeautify.mjs index 3491b618..2bb8947a 100644 --- a/src/core/operations/CSSBeautify.mjs +++ b/src/core/operations/CSSBeautify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * CSS Beautify operation */ class CSSBeautify extends Operation { - /** * CSSBeautify constructor */ @@ -20,15 +19,16 @@ class CSSBeautify extends Operation { this.name = "CSS Beautify"; this.module = "Code"; - this.description = "Indents and prettifies Cascading Style Sheets (CSS) code."; + this.description = + "Indents and prettifies Cascading Style Sheets (CSS) code."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Indent string", - "type": "binaryShortString", - "value": "\\t" - } + name: "Indent string", + type: "binaryShortString", + value: "\\t", + }, ]; } @@ -41,7 +41,6 @@ class CSSBeautify extends Operation { const indentStr = args[0]; return vkbeautify.css(input, indentStr); } - } export default CSSBeautify; diff --git a/src/core/operations/CSSMinify.mjs b/src/core/operations/CSSMinify.mjs index 3aa96bb1..cce0b30f 100644 --- a/src/core/operations/CSSMinify.mjs +++ b/src/core/operations/CSSMinify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * CSS Minify operation */ class CSSMinify extends Operation { - /** * CSSMinify constructor */ @@ -25,10 +24,10 @@ class CSSMinify extends Operation { this.outputType = "string"; this.args = [ { - "name": "Preserve comments", - "type": "boolean", - "value": false - } + name: "Preserve comments", + type: "boolean", + value: false, + }, ]; } @@ -41,7 +40,6 @@ class CSSMinify extends Operation { const preserveComments = args[0]; return vkbeautify.cssmin(input, preserveComments); } - } export default CSSMinify; diff --git a/src/core/operations/CSSSelector.mjs b/src/core/operations/CSSSelector.mjs index d6b8da11..ac1d8756 100644 --- a/src/core/operations/CSSSelector.mjs +++ b/src/core/operations/CSSSelector.mjs @@ -13,7 +13,6 @@ import nwmatcher from "nwmatcher"; * CSS selector operation */ class CSSSelector extends Operation { - /** * CSSSelector constructor */ @@ -22,21 +21,23 @@ class CSSSelector extends Operation { this.name = "CSS selector"; this.module = "Code"; - this.description = "Extract information from an HTML document with a CSS selector"; - this.infoURL = "https://wikipedia.org/wiki/Cascading_Style_Sheets#Selector"; + this.description = + "Extract information from an HTML document with a CSS selector"; + this.infoURL = + "https://wikipedia.org/wiki/Cascading_Style_Sheets#Selector"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "CSS selector", - "type": "string", - "value": "" + name: "CSS selector", + type: "string", + value: "", }, { - "name": "Delimiter", - "type": "binaryShortString", - "value": "\\n" - } + name: "Delimiter", + type: "binaryShortString", + value: "\\n", + }, ]; } @@ -48,8 +49,7 @@ class CSSSelector extends Operation { run(input, args) { const [query, delimiter] = args, parser = new xmldom.DOMParser(); - let dom, - result; + let dom, result; if (!query.length || !input.length) { return ""; @@ -62,13 +62,15 @@ class CSSSelector extends Operation { } try { - const matcher = nwmatcher({document: dom}); + const matcher = nwmatcher({ document: dom }); result = matcher.select(query, dom); } catch (err) { - throw new OperationError("Invalid CSS Selector. Details:\n" + err.message); + throw new OperationError( + "Invalid CSS Selector. Details:\n" + err.message, + ); } - const nodeToString = function(node) { + const nodeToString = function (node) { return node.toString(); /* xmldom does not return the outerHTML value. switch (node.nodeType) { @@ -81,11 +83,8 @@ class CSSSelector extends Operation { }*/ }; - return result - .map(nodeToString) - .join(delimiter); + return result.map(nodeToString).join(delimiter); } - } export default CSSSelector; diff --git a/src/core/operations/CSVToJSON.mjs b/src/core/operations/CSVToJSON.mjs index ca9f1ceb..472c0146 100644 --- a/src/core/operations/CSVToJSON.mjs +++ b/src/core/operations/CSVToJSON.mjs @@ -12,7 +12,6 @@ import Utils from "../Utils.mjs"; * CSV to JSON operation */ class CSVToJSON extends Operation { - /** * CSVToJSON constructor */ @@ -29,18 +28,18 @@ class CSVToJSON extends Operation { { name: "Cell delimiters", type: "binaryShortString", - value: "," + value: ",", }, { name: "Row delimiters", type: "binaryShortString", - value: "\\r\\n" + value: "\\r\\n", }, { name: "Format", type: "option", - value: ["Array of dictionaries", "Array of arrays"] - } + value: ["Array of dictionaries", "Array of arrays"], + }, ]; } @@ -54,7 +53,11 @@ class CSVToJSON extends Operation { let json, header; try { - json = Utils.parseCSV(input, cellDelims.split(""), rowDelims.split("")); + json = Utils.parseCSV( + input, + cellDelims.split(""), + rowDelims.split(""), + ); } catch (err) { throw new OperationError("Unable to parse CSV: " + err); } @@ -62,7 +65,7 @@ class CSVToJSON extends Operation { switch (format) { case "Array of dictionaries": header = json[0]; - return json.slice(1).map(row => { + return json.slice(1).map((row) => { const obj = {}; header.forEach((h, i) => { obj[h] = row[i]; @@ -74,7 +77,6 @@ class CSVToJSON extends Operation { return json; } } - } export default CSVToJSON; diff --git a/src/core/operations/CTPH.mjs b/src/core/operations/CTPH.mjs index 6b6a487d..d99062a1 100644 --- a/src/core/operations/CTPH.mjs +++ b/src/core/operations/CTPH.mjs @@ -11,7 +11,6 @@ import ctphjs from "ctph.js"; * CTPH operation */ class CTPH extends Operation { - /** * CTPH constructor */ @@ -20,8 +19,10 @@ class CTPH extends Operation { this.name = "CTPH"; this.module = "Crypto"; - this.description = "Context Triggered Piecewise Hashing, also called Fuzzy Hashing, can match inputs that have homologies. Such inputs have sequences of identical bytes in the same order, although bytes in between these sequences may be different in both content and length.

CTPH was originally based on the work of Dr. Andrew Tridgell and a spam email detector called SpamSum. This method was adapted by Jesse Kornblum and published at the DFRWS conference in 2006 in a paper 'Identifying Almost Identical Files Using Context Triggered Piecewise Hashing'."; - this.infoURL = "https://forensics.wiki/context_triggered_piecewise_hashing/"; + this.description = + "Context Triggered Piecewise Hashing, also called Fuzzy Hashing, can match inputs that have homologies. Such inputs have sequences of identical bytes in the same order, although bytes in between these sequences may be different in both content and length.

CTPH was originally based on the work of Dr. Andrew Tridgell and a spam email detector called SpamSum. This method was adapted by Jesse Kornblum and published at the DFRWS conference in 2006 in a paper 'Identifying Almost Identical Files Using Context Triggered Piecewise Hashing'."; + this.infoURL = + "https://forensics.wiki/context_triggered_piecewise_hashing/"; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -35,7 +36,6 @@ class CTPH extends Operation { run(input, args) { return ctphjs.digest(input); } - } export default CTPH; diff --git a/src/core/operations/CaesarBoxCipher.mjs b/src/core/operations/CaesarBoxCipher.mjs index 680db900..e76a71c2 100644 --- a/src/core/operations/CaesarBoxCipher.mjs +++ b/src/core/operations/CaesarBoxCipher.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Caesar Box Cipher operation */ class CaesarBoxCipher extends Operation { - /** * CaesarBoxCipher constructor */ @@ -19,7 +18,8 @@ class CaesarBoxCipher extends Operation { this.name = "Caesar Box Cipher"; this.module = "Ciphers"; - this.description = "Caesar Box is a transposition cipher used in the Roman Empire, in which letters of the message are written in rows in a square (or a rectangle) and then, read by column."; + this.description = + "Caesar Box is a transposition cipher used in the Roman Empire, in which letters of the message are written in rows in a square (or a rectangle) and then, read by column."; this.infoURL = "https://www.dcode.fr/caesar-box-cipher"; this.inputType = "string"; this.outputType = "string"; @@ -27,8 +27,8 @@ class CaesarBoxCipher extends Operation { { name: "Box Height", type: "number", - value: 1 - } + value: 1, + }, ]; } @@ -40,9 +40,8 @@ class CaesarBoxCipher extends Operation { run(input, args) { const tableHeight = args[0]; const tableWidth = Math.ceil(input.length / tableHeight); - while (input.indexOf(" ") !== -1) - input = input.replace(" ", ""); - for (let i = 0; i < (tableHeight * tableWidth) - input.length; i++) { + while (input.indexOf(" ") !== -1) input = input.replace(" ", ""); + for (let i = 0; i < tableHeight * tableWidth - input.length; i++) { input += "\x00"; } let result = ""; @@ -55,7 +54,6 @@ class CaesarBoxCipher extends Operation { } return result; } - } export default CaesarBoxCipher; diff --git a/src/core/operations/CaretMdecode.mjs b/src/core/operations/CaretMdecode.mjs index 68c6dacb..68035198 100644 --- a/src/core/operations/CaretMdecode.mjs +++ b/src/core/operations/CaretMdecode.mjs @@ -12,7 +12,6 @@ import Operation from "../Operation.mjs"; * https://gist.githubusercontent.com/JaHIY/3c91bbf7bea5661e6abfbd1349ee81a2/raw/c7b480e9ff24bcb8f5287a8a8a2dcb9bf5628506/decode_m_notation.cpp */ class CaretMdecode extends Operation { - /** * CaretMdecode constructor */ @@ -21,7 +20,8 @@ class CaretMdecode extends Operation { this.name = "Caret/M-decode"; this.module = "Default"; - this.description = "Decodes caret or M-encoded strings, i.e. ^M turns into a newline, M-^] turns into 0x9d. Sources such as `cat -v`.\n\nPlease be aware that when using `cat -v` ^_ (caret-underscore) will not be encoded, but represents a valid encoding (namely that of 0x1f)."; + this.description = + "Decodes caret or M-encoded strings, i.e. ^M turns into a newline, M-^] turns into 0x9d. Sources such as `cat -v`.\n\nPlease be aware that when using `cat -v` ^_ (caret-underscore) will not be encoded, but represents a valid encoding (namely that of 0x1f)."; this.infoURL = "https://en.wikipedia.org/wiki/Caret_notation"; this.inputType = "string"; this.outputType = "byteArray"; @@ -34,13 +34,11 @@ class CaretMdecode extends Operation { * @returns {byteArray} */ run(input, args) { - const bytes = []; let prev = ""; for (let i = 0; i < input.length; i++) { - const charCode = input.charCodeAt(i); const curChar = input.charAt(i); @@ -88,11 +86,9 @@ class CaretMdecode extends Operation { bytes.push(charCode); } } - } return bytes; } - } export default CaretMdecode; diff --git a/src/core/operations/CartesianProduct.mjs b/src/core/operations/CartesianProduct.mjs index 07ac575c..b062accc 100644 --- a/src/core/operations/CartesianProduct.mjs +++ b/src/core/operations/CartesianProduct.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Set cartesian product operation */ class CartesianProduct extends Operation { - /** * Cartesian Product constructor */ @@ -20,7 +19,8 @@ class CartesianProduct extends Operation { this.name = "Cartesian Product"; this.module = "Default"; - this.description = "Calculates the cartesian product of multiple sets of data, returning all possible combinations."; + this.description = + "Calculates the cartesian product of multiple sets of data, returning all possible combinations."; this.infoURL = "https://wikipedia.org/wiki/Cartesian_product"; this.inputType = "string"; this.outputType = "string"; @@ -28,12 +28,12 @@ class CartesianProduct extends Operation { { name: "Sample delimiter", type: "binaryString", - value: "\\n\\n" + value: "\\n\\n", }, { name: "Item delimiter", type: "binaryString", - value: "," + value: ",", }, ]; } @@ -46,8 +46,10 @@ class CartesianProduct extends Operation { */ validateSampleNumbers(sets) { if (!sets || sets.length < 2) { - throw new OperationError("Incorrect number of sets, perhaps you" + - " need to modify the sample delimiter or add more samples?"); + throw new OperationError( + "Incorrect number of sets, perhaps you" + + " need to modify the sample delimiter or add more samples?", + ); } } @@ -65,23 +67,26 @@ class CartesianProduct extends Operation { this.validateSampleNumbers(sets); - return this.runCartesianProduct(...sets.map(s => s.split(this.itemDelimiter))); + return this.runCartesianProduct( + ...sets.map((s) => s.split(this.itemDelimiter)), + ); } /** - * Return the cartesian product of the two inputted sets. - * - * @param {Object[]} a - * @param {Object[]} b - * @param {Object[]} c - * @returns {string} - */ + * Return the cartesian product of the two inputted sets. + * + * @param {Object[]} a + * @param {Object[]} b + * @param {Object[]} c + * @returns {string} + */ runCartesianProduct(a, b, ...c) { /** * https://stackoverflow.com/a/43053803/7200497 * @returns {Object[]} */ - const f = (a, b) => [].concat(...a.map(d => b.map(e => [].concat(d, e)))); + const f = (a, b) => + [].concat(...a.map((d) => b.map((e) => [].concat(d, e)))); /** * https://stackoverflow.com/a/43053803/7200497 * @returns {Object[][]} @@ -89,7 +94,7 @@ class CartesianProduct extends Operation { const cartesian = (a, b, ...c) => (b ? cartesian(f(a, b), ...c) : a); return cartesian(a, b, ...c) - .map(set => `(${set.join(",")})`) + .map((set) => `(${set.join(",")})`) .join(this.itemDelimiter); } } diff --git a/src/core/operations/CetaceanCipherDecode.mjs b/src/core/operations/CetaceanCipherDecode.mjs index a50fe6b7..b54c7d4f 100644 --- a/src/core/operations/CetaceanCipherDecode.mjs +++ b/src/core/operations/CetaceanCipherDecode.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Cetacean Cipher Decode operation */ class CetaceanCipherDecode extends Operation { - /** * CetaceanCipherDecode constructor */ @@ -19,7 +18,8 @@ class CetaceanCipherDecode extends Operation { this.name = "Cetacean Cipher Decode"; this.module = "Ciphers"; - this.description = "Decode Cetacean Cipher input.

e.g. EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe becomes hi"; + this.description = + "Decode Cetacean Cipher input.

e.g. EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe becomes hi"; this.infoURL = "https://hitchhikers.fandom.com/wiki/Dolphins"; this.inputType = "string"; this.outputType = "string"; @@ -28,8 +28,8 @@ class CetaceanCipherDecode extends Operation { { pattern: "^(?:[eE]{16,})(?: [eE]{16,})*$", flags: "", - args: [] - } + args: [], + }, ]; } @@ -42,7 +42,9 @@ class CetaceanCipherDecode extends Operation { const binaryArray = []; for (const char of input) { if (char === " ") { - binaryArray.push(...[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]); + binaryArray.push( + ...[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], + ); } else { binaryArray.push(char === "e" ? 1 : 0); } @@ -50,13 +52,13 @@ class CetaceanCipherDecode extends Operation { const byteArray = []; - for (let i = 0; i < binaryArray.length; i += 16) { + for (let i = 0; i < binaryArray.length; i += 16) { byteArray.push(binaryArray.slice(i, i + 16).join("")); } - return byteArray.map(byte => - String.fromCharCode(parseInt(byte, 2)) - ).join(""); + return byteArray + .map((byte) => String.fromCharCode(parseInt(byte, 2))) + .join(""); } } diff --git a/src/core/operations/CetaceanCipherEncode.mjs b/src/core/operations/CetaceanCipherEncode.mjs index ec5f76d6..432e71dd 100644 --- a/src/core/operations/CetaceanCipherEncode.mjs +++ b/src/core/operations/CetaceanCipherEncode.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {toBinary} from "../lib/Binary.mjs"; +import { toBinary } from "../lib/Binary.mjs"; /** * Cetacean Cipher Encode operation */ class CetaceanCipherEncode extends Operation { - /** * CetaceanCipherEncode constructor */ @@ -20,7 +19,8 @@ class CetaceanCipherEncode extends Operation { this.name = "Cetacean Cipher Encode"; this.module = "Ciphers"; - this.description = "Converts any input into Cetacean Cipher.

e.g. hi becomes EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe"; + this.description = + "Converts any input into Cetacean Cipher.

e.g. hi becomes EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe"; this.infoURL = "https://hitchhikers.fandom.com/wiki/Dolphins"; this.inputType = "string"; this.outputType = "string"; @@ -35,12 +35,20 @@ class CetaceanCipherEncode extends Operation { const result = []; const charArray = input.split(""); - charArray.map(character => { + charArray.map((character) => { if (character === " ") { result.push(character); } else { - const binaryArray = toBinary(character.charCodeAt(0), "None", 16).split(""); - result.push(binaryArray.map(str => str === "1" ? "e" : "E").join("")); + const binaryArray = toBinary( + character.charCodeAt(0), + "None", + 16, + ).split(""); + result.push( + binaryArray + .map((str) => (str === "1" ? "e" : "E")) + .join(""), + ); } }); diff --git a/src/core/operations/ChaCha.mjs b/src/core/operations/ChaCha.mjs index 166c1663..147bfe45 100644 --- a/src/core/operations/ChaCha.mjs +++ b/src/core/operations/ChaCha.mjs @@ -46,7 +46,7 @@ function chacha(key, nonce, counter, rounds) { * @returns {integer} */ function ROL32(x, n) { - return ((x << n) & 0xFFFFFFFF) | (x >>> (32 - n)); + return ((x << n) & 0xffffffff) | (x >>> (32 - n)); } /** @@ -60,25 +60,29 @@ function chacha(key, nonce, counter, rounds) { * @returns {integer} */ function quarterround(x, a, b, c, d) { - x[a] = ((x[a] + x[b]) & 0xFFFFFFFF); x[d] = ROL32(x[d] ^ x[a], 16); - x[c] = ((x[c] + x[d]) & 0xFFFFFFFF); x[b] = ROL32(x[b] ^ x[c], 12); - x[a] = ((x[a] + x[b]) & 0xFFFFFFFF); x[d] = ROL32(x[d] ^ x[a], 8); - x[c] = ((x[c] + x[d]) & 0xFFFFFFFF); x[b] = ROL32(x[b] ^ x[c], 7); + x[a] = (x[a] + x[b]) & 0xffffffff; + x[d] = ROL32(x[d] ^ x[a], 16); + x[c] = (x[c] + x[d]) & 0xffffffff; + x[b] = ROL32(x[b] ^ x[c], 12); + x[a] = (x[a] + x[b]) & 0xffffffff; + x[d] = ROL32(x[d] ^ x[a], 8); + x[c] = (x[c] + x[d]) & 0xffffffff; + x[b] = ROL32(x[b] ^ x[c], 7); } - for (let i = 0; i < rounds / 2; i++) { - quarterround(x, 0, 4, 8, 12); - quarterround(x, 1, 5, 9, 13); + for (let i = 0; i < rounds / 2; i++) { + quarterround(x, 0, 4, 8, 12); + quarterround(x, 1, 5, 9, 13); quarterround(x, 2, 6, 10, 14); quarterround(x, 3, 7, 11, 15); quarterround(x, 0, 5, 10, 15); quarterround(x, 1, 6, 11, 12); - quarterround(x, 2, 7, 8, 13); - quarterround(x, 3, 4, 9, 14); + quarterround(x, 2, 7, 8, 13); + quarterround(x, 3, 4, 9, 14); } for (let i = 0; i < 16; i++) { - x[i] = (x[i] + a[i]) & 0xFFFFFFFF; + x[i] = (x[i] + a[i]) & 0xffffffff; } let output = Array(); @@ -92,7 +96,6 @@ function chacha(key, nonce, counter, rounds) { * ChaCha operation */ class ChaCha extends Operation { - /** * ChaCha constructor */ @@ -101,44 +104,45 @@ class ChaCha extends Operation { this.name = "ChaCha"; this.module = "Default"; - this.description = "ChaCha is a stream cipher designed by Daniel J. Bernstein. It is a variant of the Salsa stream cipher. Several parameterizations exist; 'ChaCha' may refer to the original construction, or to the variant as described in RFC-8439. ChaCha is often used with Poly1305, in the ChaCha20-Poly1305 AEAD construction.

Key: ChaCha uses a key of 16 or 32 bytes (128 or 256 bits).

Nonce: ChaCha uses a nonce of 8 or 12 bytes (64 or 96 bits).

Counter: ChaCha uses a counter of 4 or 8 bytes (32 or 64 bits); together, the nonce and counter must add up to 16 bytes. The counter starts at zero at the start of the keystream, and is incremented at every 64 bytes."; + this.description = + "ChaCha is a stream cipher designed by Daniel J. Bernstein. It is a variant of the Salsa stream cipher. Several parameterizations exist; 'ChaCha' may refer to the original construction, or to the variant as described in RFC-8439. ChaCha is often used with Poly1305, in the ChaCha20-Poly1305 AEAD construction.

Key: ChaCha uses a key of 16 or 32 bytes (128 or 256 bits).

Nonce: ChaCha uses a nonce of 8 or 12 bytes (64 or 96 bits).

Counter: ChaCha uses a counter of 4 or 8 bytes (32 or 64 bits); together, the nonce and counter must add up to 16 bytes. The counter starts at zero at the start of the keystream, and is incremented at every 64 bytes."; this.infoURL = "https://wikipedia.org/wiki/Salsa20#ChaCha_variant"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Nonce", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64", "Integer"] + name: "Nonce", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64", "Integer"], }, { - "name": "Counter", - "type": "number", - "value": 0, - "min": 0 + name: "Counter", + type: "number", + value: 0, + min: 0, }, { - "name": "Rounds", - "type": "option", - "value": ["20", "12", "8"] + name: "Rounds", + type: "option", + value: ["20", "12", "8"], }, { - "name": "Input", - "type": "option", - "value": ["Hex", "Raw"] + name: "Input", + type: "option", + value: ["Hex", "Raw"], }, { - "name": "Output", - "type": "option", - "value": ["Raw", "Hex"] - } + name: "Output", + type: "option", + value: ["Raw", "Hex"], + }, ]; } @@ -162,7 +166,11 @@ ChaCha uses a key of 16 or 32 bytes (128 or 256 bits).`); let counter, nonce, counterLength; if (nonceType === "Integer") { - nonce = Utils.intToByteArray(parseInt(args[1].string, 10), 12, "little"); + nonce = Utils.intToByteArray( + parseInt(args[1].string, 10), + 12, + "little", + ); counterLength = 4; } else { nonce = Utils.convertToByteArray(args[1].string, args[1].option); @@ -180,7 +188,11 @@ ChaCha uses a nonce of 8 or 12 bytes (64 or 96 bits).`); let counterAsInt = Utils.byteArrayToInt(counter, "little"); for (let i = 0; i < input.length; i += 64) { - counter = Utils.intToByteArray(counterAsInt, counterLength, "little"); + counter = Utils.intToByteArray( + counterAsInt, + counterLength, + "little", + ); const stream = chacha(key, nonce, counter, rounds); for (let j = 0; j < 64 && i + j < input.length; j++) { output.push(input[i + j] ^ stream[j]); @@ -228,7 +240,6 @@ ChaCha uses a nonce of 8 or 12 bytes (64 or 96 bits).`); return pos; } } - } export default ChaCha; diff --git a/src/core/operations/ChangeIPFormat.mjs b/src/core/operations/ChangeIPFormat.mjs index c9adc5d8..3da2697d 100644 --- a/src/core/operations/ChangeIPFormat.mjs +++ b/src/core/operations/ChangeIPFormat.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {fromHex} from "../lib/Hex.mjs"; +import { fromHex } from "../lib/Hex.mjs"; /** * Change IP format operation */ class ChangeIPFormat extends Operation { - /** * ChangeIPFormat constructor */ @@ -22,20 +21,21 @@ class ChangeIPFormat extends Operation { this.name = "Change IP format"; this.module = "Default"; - this.description = "Convert an IP address from one format to another, e.g. 172.20.23.54 to ac141736"; + this.description = + "Convert an IP address from one format to another, e.g. 172.20.23.54 to ac141736"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Input format", - "type": "option", - "value": ["Dotted Decimal", "Decimal", "Octal", "Hex"] + name: "Input format", + type: "option", + value: ["Dotted Decimal", "Decimal", "Octal", "Hex"], }, { - "name": "Output format", - "type": "option", - "value": ["Dotted Decimal", "Decimal", "Octal", "Hex"] - } + name: "Output format", + type: "option", + value: ["Dotted Decimal", "Decimal", "Octal", "Hex"], + }, ]; } @@ -92,14 +92,24 @@ class ChangeIPFormat extends Operation { for (j = 0; j < baIp.length; j++) { ddIp += baIp[j] + "."; } - output += ddIp.slice(0, ddIp.length-1) + "\n"; + output += ddIp.slice(0, ddIp.length - 1) + "\n"; break; case "Decimal": - decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0; + decIp = + ((baIp[0] << 24) | + (baIp[1] << 16) | + (baIp[2] << 8) | + baIp[3]) >>> + 0; output += decIp.toString() + "\n"; break; case "Octal": - decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0; + decIp = + ((baIp[0] << 24) | + (baIp[1] << 16) | + (baIp[2] << 8) | + baIp[3]) >>> + 0; output += "0" + decIp.toString(8) + "\n"; break; case "Hex": @@ -114,7 +124,7 @@ class ChangeIPFormat extends Operation { } } - return output.slice(0, output.length-1); + return output.slice(0, output.length - 1); } /** @@ -126,13 +136,12 @@ class ChangeIPFormat extends Operation { fromNumber(value, radix) { const decimal = parseInt(value, radix); const baIp = []; - baIp.push(decimal >> 24 & 255); - baIp.push(decimal >> 16 & 255); - baIp.push(decimal >> 8 & 255); + baIp.push((decimal >> 24) & 255); + baIp.push((decimal >> 16) & 255); + baIp.push((decimal >> 8) & 255); baIp.push(decimal & 255); return baIp; } - } export default ChangeIPFormat; diff --git a/src/core/operations/ChiSquare.mjs b/src/core/operations/ChiSquare.mjs index f78574d6..62a1e316 100644 --- a/src/core/operations/ChiSquare.mjs +++ b/src/core/operations/ChiSquare.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Chi Square operation */ class ChiSquare extends Operation { - /** * ChiSquare constructor */ @@ -42,13 +41,14 @@ class ChiSquare extends Operation { for (let i = 0; i < distArray.length; i++) { if (distArray[i] > 0) { - total += Math.pow(distArray[i] - data.length / 256, 2) / (data.length / 256); + total += + Math.pow(distArray[i] - data.length / 256, 2) / + (data.length / 256); } } return total; } - } export default ChiSquare; diff --git a/src/core/operations/CipherSaber2Decrypt.mjs b/src/core/operations/CipherSaber2Decrypt.mjs index 53d61468..3878d0a6 100644 --- a/src/core/operations/CipherSaber2Decrypt.mjs +++ b/src/core/operations/CipherSaber2Decrypt.mjs @@ -12,7 +12,6 @@ import Utils from "../Utils.mjs"; * CipherSaber2 Decrypt operation */ class CipherSaber2Decrypt extends Operation { - /** * CipherSaber2Decrypt constructor */ @@ -21,7 +20,8 @@ class CipherSaber2Decrypt extends Operation { this.name = "CipherSaber2 Decrypt"; this.module = "Crypto"; - this.description = "CipherSaber is a simple symmetric encryption protocol based on the RC4 stream cipher. It gives reasonably strong protection of message confidentiality, yet it's designed to be simple enough that even novice programmers can memorize the algorithm and implement it from scratch."; + this.description = + "CipherSaber is a simple symmetric encryption protocol based on the RC4 stream cipher. It gives reasonably strong protection of message confidentiality, yet it's designed to be simple enough that even novice programmers can memorize the algorithm and implement it from scratch."; this.infoURL = "https://wikipedia.org/wiki/CipherSaber"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -30,13 +30,13 @@ class CipherSaber2Decrypt extends Operation { name: "Key", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "Rounds", type: "number", - value: 20 - } + value: 20, + }, ]; } @@ -53,9 +53,10 @@ class CipherSaber2Decrypt extends Operation { const tempIVP = input.slice(0, 10); input = input.slice(10); - return new Uint8Array(result.concat(encode(tempIVP, key, rounds, input))).buffer; + return new Uint8Array( + result.concat(encode(tempIVP, key, rounds, input)), + ).buffer; } - } export default CipherSaber2Decrypt; diff --git a/src/core/operations/CipherSaber2Encrypt.mjs b/src/core/operations/CipherSaber2Encrypt.mjs index dd86bd52..dedbe3a9 100644 --- a/src/core/operations/CipherSaber2Encrypt.mjs +++ b/src/core/operations/CipherSaber2Encrypt.mjs @@ -13,7 +13,6 @@ import Utils from "../Utils.mjs"; * CipherSaber2 Encrypt operation */ class CipherSaber2Encrypt extends Operation { - /** * CipherSaber2Encrypt constructor */ @@ -22,7 +21,8 @@ class CipherSaber2Encrypt extends Operation { this.name = "CipherSaber2 Encrypt"; this.module = "Crypto"; - this.description = "CipherSaber is a simple symmetric encryption protocol based on the RC4 stream cipher. It gives reasonably strong protection of message confidentiality, yet it's designed to be simple enough that even novice programmers can memorize the algorithm and implement it from scratch."; + this.description = + "CipherSaber is a simple symmetric encryption protocol based on the RC4 stream cipher. It gives reasonably strong protection of message confidentiality, yet it's designed to be simple enough that even novice programmers can memorize the algorithm and implement it from scratch."; this.infoURL = "https://wikipedia.org/wiki/CipherSaber"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -31,13 +31,13 @@ class CipherSaber2Encrypt extends Operation { name: "Key", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "Rounds", type: "number", - value: 20 - } + value: 20, + }, ]; } @@ -54,12 +54,12 @@ class CipherSaber2Encrypt extends Operation { // Assign into initialisation vector based on cipher mode. const tempIVP = crypto.randomBytes(10); - for (let m = 0; m < 10; m++) - result.push(tempIVP[m]); + for (let m = 0; m < 10; m++) result.push(tempIVP[m]); - return new Uint8Array(result.concat(encode(tempIVP, key, rounds, input))).buffer; + return new Uint8Array( + result.concat(encode(tempIVP, key, rounds, input)), + ).buffer; } - } export default CipherSaber2Encrypt; diff --git a/src/core/operations/CitrixCTX1Decode.mjs b/src/core/operations/CitrixCTX1Decode.mjs index f002c8a2..74de0c11 100644 --- a/src/core/operations/CitrixCTX1Decode.mjs +++ b/src/core/operations/CitrixCTX1Decode.mjs @@ -12,7 +12,6 @@ import cptable from "codepage"; * Citrix CTX1 Decode operation */ class CitrixCTX1Decode extends Operation { - /** * CitrixCTX1Decode constructor */ @@ -21,8 +20,10 @@ class CitrixCTX1Decode extends Operation { this.name = "Citrix CTX1 Decode"; this.module = "Encodings"; - this.description = "Decodes strings in a Citrix CTX1 password format to plaintext."; - this.infoURL = "https://www.reddit.com/r/AskNetsec/comments/1s3r6y/citrix_ctx1_hash_decoding/"; + this.description = + "Decodes strings in a Citrix CTX1 password format to plaintext."; + this.infoURL = + "https://www.reddit.com/r/AskNetsec/comments/1s3r6y/citrix_ctx1_hash_decoding/"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = []; @@ -45,15 +46,20 @@ class CitrixCTX1Decode extends Operation { if (i + 2 >= revinput.length) { temp = 0; } else { - temp = ((revinput[i + 2] - 0x41) & 0xf) ^ (((revinput[i + 3]- 0x41) << 4) & 0xf0); + temp = + ((revinput[i + 2] - 0x41) & 0xf) ^ + (((revinput[i + 3] - 0x41) << 4) & 0xf0); } - temp = (((revinput[i] - 0x41) & 0xf) ^ (((revinput[i + 1] - 0x41) << 4) & 0xf0)) ^ 0xa5 ^ temp; + temp = + ((revinput[i] - 0x41) & 0xf) ^ + (((revinput[i + 1] - 0x41) << 4) & 0xf0) ^ + 0xa5 ^ + temp; result.push(temp); } // Decodes a utf-16le string return cptable.utils.decode(1200, result.reverse()); } - } export default CitrixCTX1Decode; diff --git a/src/core/operations/CitrixCTX1Encode.mjs b/src/core/operations/CitrixCTX1Encode.mjs index 3c0dfcdd..6024a7c7 100644 --- a/src/core/operations/CitrixCTX1Encode.mjs +++ b/src/core/operations/CitrixCTX1Encode.mjs @@ -11,7 +11,6 @@ import cptable from "codepage"; * Citrix CTX1 Encode operation */ class CitrixCTX1Encode extends Operation { - /** * CitrixCTX1Encode constructor */ @@ -21,7 +20,8 @@ class CitrixCTX1Encode extends Operation { this.name = "Citrix CTX1 Encode"; this.module = "Encodings"; this.description = "Encodes strings to Citrix CTX1 password format."; - this.infoURL = "https://www.reddit.com/r/AskNetsec/comments/1s3r6y/citrix_ctx1_hash_decoding/"; + this.infoURL = + "https://www.reddit.com/r/AskNetsec/comments/1s3r6y/citrix_ctx1_hash_decoding/"; this.inputType = "string"; this.outputType = "byteArray"; this.args = []; @@ -44,7 +44,6 @@ class CitrixCTX1Encode extends Operation { return result; } - } export default CitrixCTX1Encode; diff --git a/src/core/operations/Colossus.mjs b/src/core/operations/Colossus.mjs index e9f00cf1..dfeb4de6 100644 --- a/src/core/operations/Colossus.mjs +++ b/src/core/operations/Colossus.mjs @@ -18,7 +18,6 @@ import { SWITCHES, VALID_ITA2 } from "../lib/Lorenz.mjs"; * Colossus operation */ class Colossus extends Operation { - /** * Colossus constructor */ @@ -26,7 +25,8 @@ class Colossus extends Operation { super(); this.name = "Colossus"; this.module = "Bletchley"; - this.description = "Colossus is the name of the world's first electronic computer. Ten Colossi were designed by Tommy Flowers and built at the Post Office Research Labs at Dollis Hill in 1943 during World War 2. They assisted with the breaking of the German Lorenz cipher attachment, a machine created to encipher communications between Hitler and his generals on the front lines.

To learn more, Virtual Colossus, an online, browser based simulation of a Colossus computer is available at virtualcolossus.co.uk.

A more detailed description of this operation can be found here."; + this.description = + "Colossus is the name of the world's first electronic computer. Ten Colossi were designed by Tommy Flowers and built at the Post Office Research Labs at Dollis Hill in 1943 during World War 2. They assisted with the breaking of the German Lorenz cipher attachment, a machine created to encipher communications between Hitler and his generals on the front lines.

To learn more, Virtual Colossus, an online, browser based simulation of a Colossus computer is available at virtualcolossus.co.uk.

A more detailed description of this operation can be found here."; this.infoURL = "https://wikipedia.org/wiki/Colossus_computer"; this.inputType = "string"; this.outputType = "JSON"; @@ -34,32 +34,32 @@ class Colossus extends Operation { this.args = [ { name: "Input", - type: "label" + type: "label", }, { name: "Pattern", type: "option", - value: ["KH Pattern", "ZMUG Pattern", "BREAM Pattern"] + value: ["KH Pattern", "ZMUG Pattern", "BREAM Pattern"], }, { name: "QBusZ", type: "option", - value: ["", "Z", "ΔZ"] + value: ["", "Z", "ΔZ"], }, { name: "QBusΧ", type: "option", - value: ["", "Χ", "ΔΧ"] + value: ["", "Χ", "ΔΧ"], }, { name: "QBusΨ", type: "option", - value: ["", "Ψ", "ΔΨ"] + value: ["", "Ψ", "ΔΨ"], }, { name: "Limitation", type: "option", - value: ["None", "Χ2", "Χ2 + P5", "X2 + Ψ1", "X2 + Ψ1 + P5"] + value: ["None", "Χ2", "Χ2 + P5", "X2 + Ψ1", "X2 + Ψ1 + P5"], }, { name: "K Rack Option", @@ -68,289 +68,337 @@ class Colossus extends Operation { { name: "Select Program", on: [7], - off: [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] + off: [ + 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, + ], }, { name: "Top Section - Conditional", - on: [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], - off: [7, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40] + on: [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + ], + off: [7, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], }, { name: "Bottom Section - Addition", on: [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], - off: [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] + off: [ + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + ], }, { name: "Advanced", - on: [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], - off: [7] - } - ] + on: [ + 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, + ], + off: [7], + }, + ], }, { name: "Program to run", type: "option", - value: ["", "Letter Count", "1+2=. (1+2 Break In, Find X1,X2)", "4=5=/1=2 (Given X1,X2 find X4,X5)", "/,5,U (Count chars to find X3)"] + value: [ + "", + "Letter Count", + "1+2=. (1+2 Break In, Find X1,X2)", + "4=5=/1=2 (Given X1,X2 find X4,X5)", + "/,5,U (Count chars to find X3)", + ], }, { name: "K Rack: Conditional", - type: "label" + type: "label", }, { name: "R1-Q1", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R1-Q2", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R1-Q3", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R1-Q4", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R1-Q5", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R1-Negate", type: "boolean", - value: false + value: false, }, { name: "R1-Counter", type: "option", - value: ["", "1", "2", "3", "4", "5"] + value: ["", "1", "2", "3", "4", "5"], }, { name: "R2-Q1", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R2-Q2", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R2-Q3", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R2-Q4", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R2-Q5", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R2-Negate", type: "boolean", - value: false + value: false, }, { name: "R2-Counter", type: "option", - value: ["", "1", "2", "3", "4", "5"] + value: ["", "1", "2", "3", "4", "5"], }, { name: "R3-Q1", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R3-Q2", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R3-Q3", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R3-Q4", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R3-Q5", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "R3-Negate", type: "boolean", - value: false + value: false, }, { name: "R3-Counter", type: "option", - value: ["", "1", "2", "3", "4", "5"] + value: ["", "1", "2", "3", "4", "5"], }, { name: "Negate All", type: "boolean", - value: false + value: false, }, { name: "K Rack: Addition", - type: "label" + type: "label", }, { name: "Add-Q1", type: "boolean", - value: false + value: false, }, { name: "Add-Q2", type: "boolean", - value: false + value: false, }, { name: "Add-Q3", type: "boolean", - value: false + value: false, }, { name: "Add-Q4", type: "boolean", - value: false + value: false, }, { name: "Add-Q5", type: "boolean", - value: false + value: false, }, { name: "Add-Equals", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "Add-Counter1", type: "boolean", - value: false + value: false, }, { name: "Add Negate All", type: "boolean", - value: false + value: false, }, { name: "Total Motor", type: "editableOptionShort", value: SWITCHES, - defaultIndex: 1 + defaultIndex: 1, }, { name: "Master Control Panel", - type: "label" + type: "label", }, { name: "Set Total", type: "number", - value: 0 + value: 0, }, { name: "Fast Step", type: "option", - value: ["", "X1", "X2", "X3", "X4", "X5", "M37", "M61", "S1", "S2", "S3", "S4", "S5"] + value: [ + "", + "X1", + "X2", + "X3", + "X4", + "X5", + "M37", + "M61", + "S1", + "S2", + "S3", + "S4", + "S5", + ], }, { name: "Slow Step", type: "option", - value: ["", "X1", "X2", "X3", "X4", "X5", "M37", "M61", "S1", "S2", "S3", "S4", "S5"] + value: [ + "", + "X1", + "X2", + "X3", + "X4", + "X5", + "M37", + "M61", + "S1", + "S2", + "S3", + "S4", + "S5", + ], }, { name: "Start Χ1", type: "number", - value: 1 + value: 1, }, { name: "Start Χ2", type: "number", - value: 1 + value: 1, }, { name: "Start Χ3", type: "number", - value: 1 + value: 1, }, { name: "Start Χ4", type: "number", - value: 1 + value: 1, }, { name: "Start Χ5", type: "number", - value: 1 + value: 1, }, { name: "Start M61", type: "number", - value: 1 + value: 1, }, { name: "Start M37", type: "number", - value: 1 + value: 1, }, { name: "Start Ψ1", type: "number", - value: 1 + value: 1, }, { name: "Start Ψ2", type: "number", - value: 1 + value: 1, }, { name: "Start Ψ3", type: "number", - value: 1 + value: 1, }, { name: "Start Ψ4", type: "number", - value: 1 + value: 1, }, { name: "Start Ψ5", type: "number", - value: 1 - } + value: 1, + }, ]; } @@ -372,9 +420,9 @@ class Colossus extends Operation { const pattern = args[1]; const qbusin = { - "Z": args[2], - "Chi": args[3], - "Psi": args[4], + Z: args[2], + Chi: args[3], + Psi: args[4], }; const limitation = args[5]; @@ -383,7 +431,9 @@ class Colossus extends Operation { if (limitation.includes("Ψ1")) lm[1] = true; if (limitation.includes("P5")) lm[2] = true; const limit = { - X2: lm[0], S1: lm[1], P5: lm[2] + X2: lm[0], + S1: lm[1], + P5: lm[2], }; const KRackOpt = args[6]; @@ -394,29 +444,81 @@ class Colossus extends Operation { } const re = new RegExp("^$|^[.x]$"); - for (let qr=0;qr<3;qr++) { - for (let a=0;a<5;a++) { - if (!re.test(args[((qr*7)+(a+9))])) - throw new OperationError("Switch R"+(qr+1)+"-Q"+(a+1)+" can only be set to blank, . or x"); + for (let qr = 0; qr < 3; qr++) { + for (let a = 0; a < 5; a++) { + if (!re.test(args[qr * 7 + (a + 9)])) + throw new OperationError( + "Switch R" + + (qr + 1) + + "-Q" + + (a + 1) + + " can only be set to blank, . or x", + ); } } - if (!re.test(args[37])) throw new OperationError("Switch Add-Equals can only be set to blank, . or x"); - if (!re.test(args[40])) throw new OperationError("Switch Total Motor can only be set to blank, . or x"); + if (!re.test(args[37])) + throw new OperationError( + "Switch Add-Equals can only be set to blank, . or x", + ); + if (!re.test(args[40])) + throw new OperationError( + "Switch Total Motor can only be set to blank, . or x", + ); // Q1,Q2,Q3,Q4,Q5,negate,counter1 const qbusswitches = { condition: [ - {Qswitches: [args[9], args[10], args[11], args[12], args[13]], Negate: args[14], Counter: args[15]}, - {Qswitches: [args[16], args[17], args[18], args[19], args[20]], Negate: args[21], Counter: args[22]}, - {Qswitches: [args[23], args[24], args[25], args[26], args[27]], Negate: args[28], Counter: args[29]} + { + Qswitches: [ + args[9], + args[10], + args[11], + args[12], + args[13], + ], + Negate: args[14], + Counter: args[15], + }, + { + Qswitches: [ + args[16], + args[17], + args[18], + args[19], + args[20], + ], + Negate: args[21], + Counter: args[22], + }, + { + Qswitches: [ + args[23], + args[24], + args[25], + args[26], + args[27], + ], + Negate: args[28], + Counter: args[29], + }, ], condNegateAll: args[30], addition: [ - {Qswitches: [args[32], args[33], args[34], args[35], args[36]], Equals: args[37], C1: args[38]} + { + Qswitches: [ + args[32], + args[33], + args[34], + args[35], + args[36], + ], + Equals: args[37], + C1: args[38], + }, ], addNegateAll: args[39], - totalMotor: args[40] + totalMotor: args[40], }; const settotal = parseInt(args[42], 10); @@ -426,30 +528,60 @@ class Colossus extends Operation { // null|fast|slow for each of S1-5,M1-2,X1-5 const control = { fast: args[43], - slow: args[44] + slow: args[44], }; // Start positions - if (args[52]<1 || args[52]>43) throw new OperationError("Ψ1 start must be between 1 and 43"); - if (args[53]<1 || args[53]>47) throw new OperationError("Ψ2 start must be between 1 and 47"); - if (args[54]<1 || args[54]>51) throw new OperationError("Ψ3 start must be between 1 and 51"); - if (args[55]<1 || args[55]>53) throw new OperationError("Ψ4 start must be between 1 and 53"); - if (args[56]<1 || args[57]>59) throw new OperationError("Ψ5 start must be between 1 and 59"); - if (args[51]<1 || args[51]>37) throw new OperationError("Μ37 start must be between 1 and 37"); - if (args[50]<1 || args[50]>61) throw new OperationError("Μ61 start must be between 1 and 61"); - if (args[45]<1 || args[45]>41) throw new OperationError("Χ1 start must be between 1 and 41"); - if (args[46]<1 || args[46]>31) throw new OperationError("Χ2 start must be between 1 and 31"); - if (args[47]<1 || args[47]>29) throw new OperationError("Χ3 start must be between 1 and 29"); - if (args[48]<1 || args[48]>26) throw new OperationError("Χ4 start must be between 1 and 26"); - if (args[49]<1 || args[49]>23) throw new OperationError("Χ5 start must be between 1 and 23"); + if (args[52] < 1 || args[52] > 43) + throw new OperationError("Ψ1 start must be between 1 and 43"); + if (args[53] < 1 || args[53] > 47) + throw new OperationError("Ψ2 start must be between 1 and 47"); + if (args[54] < 1 || args[54] > 51) + throw new OperationError("Ψ3 start must be between 1 and 51"); + if (args[55] < 1 || args[55] > 53) + throw new OperationError("Ψ4 start must be between 1 and 53"); + if (args[56] < 1 || args[57] > 59) + throw new OperationError("Ψ5 start must be between 1 and 59"); + if (args[51] < 1 || args[51] > 37) + throw new OperationError("Μ37 start must be between 1 and 37"); + if (args[50] < 1 || args[50] > 61) + throw new OperationError("Μ61 start must be between 1 and 61"); + if (args[45] < 1 || args[45] > 41) + throw new OperationError("Χ1 start must be between 1 and 41"); + if (args[46] < 1 || args[46] > 31) + throw new OperationError("Χ2 start must be between 1 and 31"); + if (args[47] < 1 || args[47] > 29) + throw new OperationError("Χ3 start must be between 1 and 29"); + if (args[48] < 1 || args[48] > 26) + throw new OperationError("Χ4 start must be between 1 and 26"); + if (args[49] < 1 || args[49] > 23) + throw new OperationError("Χ5 start must be between 1 and 23"); const starts = { - X1: args[45], X2: args[46], X3: args[47], X4: args[48], X5: args[49], - M61: args[50], M37: args[51], - S1: args[52], S2: args[53], S3: args[54], S4: args[55], S5: args[56] + X1: args[45], + X2: args[46], + X3: args[47], + X4: args[48], + X5: args[49], + M61: args[50], + M37: args[51], + S1: args[52], + S2: args[53], + S3: args[54], + S4: args[55], + S5: args[56], }; - const colossus = new ColossusComputer(input, pattern, qbusin, qbusswitches, control, starts, settotal, limit); + const colossus = new ColossusComputer( + input, + pattern, + qbusin, + qbusswitches, + control, + starts, + settotal, + limit, + ); const result = colossus.run(); return result; @@ -463,7 +595,6 @@ class Colossus extends Operation { * @returns {Object[]} */ selectProgram(progname, args) { - // Basic Letter Count if (progname === "Letter Count") { // Set Conditional R1 : count every character into counter 1 @@ -571,7 +702,8 @@ class Colossus extends Operation { let html = "Colossus Printer\n\n"; html += output.printout + "\n\n"; html += "Colossus Counters\n\n"; - html += "
Rotor stops Partial plugboard Decryption preview
${setting} ${stecker} ${decrypt}
\n"; + html += + "
C1 C2 C3 C4 C5
\n"; html += ""; for (const ct of output.counters) { html += `\n`; @@ -580,7 +712,6 @@ class Colossus extends Operation { html += "
C1 C2 C3 C4 C5
${ct}
"; return html; } - } export default Colossus; diff --git a/src/core/operations/Comment.mjs b/src/core/operations/Comment.mjs index af74cf48..726a44f5 100644 --- a/src/core/operations/Comment.mjs +++ b/src/core/operations/Comment.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Comment operation */ class Comment extends Operation { - /** * Comment constructor */ @@ -20,15 +19,16 @@ class Comment extends Operation { this.name = "Comment"; this.flowControl = true; this.module = "Default"; - this.description = "Provides a place to write comments within the flow of the recipe. This operation has no computational effect."; + this.description = + "Provides a place to write comments within the flow of the recipe. This operation has no computational effect."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "", - "type": "text", - "value": "" - } + name: "", + type: "text", + value: "", + }, ]; } @@ -42,7 +42,6 @@ class Comment extends Operation { run(state) { return state; } - } export default Comment; diff --git a/src/core/operations/CompareCTPHHashes.mjs b/src/core/operations/CompareCTPHHashes.mjs index 91956220..50aae179 100644 --- a/src/core/operations/CompareCTPHHashes.mjs +++ b/src/core/operations/CompareCTPHHashes.mjs @@ -6,7 +6,7 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {HASH_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { HASH_DELIM_OPTIONS } from "../lib/Delim.mjs"; import ctphjs from "ctph.js"; import OperationError from "../errors/OperationError.mjs"; @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * Compare CTPH hashes operation */ class CompareCTPHHashes extends Operation { - /** * CompareCTPHHashes constructor */ @@ -23,16 +22,18 @@ class CompareCTPHHashes extends Operation { this.name = "Compare CTPH hashes"; this.module = "Crypto"; - this.description = "Compares two Context Triggered Piecewise Hashing (CTPH) fuzzy hashes to determine the similarity between them on a scale of 0 to 100."; - this.infoURL = "https://forensics.wiki/context_triggered_piecewise_hashing/"; + this.description = + "Compares two Context Triggered Piecewise Hashing (CTPH) fuzzy hashes to determine the similarity between them on a scale of 0 to 100."; + this.infoURL = + "https://forensics.wiki/context_triggered_piecewise_hashing/"; this.inputType = "string"; this.outputType = "Number"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": HASH_DELIM_OPTIONS - } + name: "Delimiter", + type: "option", + value: HASH_DELIM_OPTIONS, + }, ]; } @@ -43,10 +44,10 @@ class CompareCTPHHashes extends Operation { */ run(input, args) { const samples = input.split(Utils.charRep(args[0])); - if (samples.length !== 2) throw new OperationError("Incorrect number of samples."); + if (samples.length !== 2) + throw new OperationError("Incorrect number of samples."); return ctphjs.similarity(samples[0], samples[1]); } - } export default CompareCTPHHashes; diff --git a/src/core/operations/CompareSSDEEPHashes.mjs b/src/core/operations/CompareSSDEEPHashes.mjs index 9937d7e6..ec4cbb0b 100644 --- a/src/core/operations/CompareSSDEEPHashes.mjs +++ b/src/core/operations/CompareSSDEEPHashes.mjs @@ -6,7 +6,7 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {HASH_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { HASH_DELIM_OPTIONS } from "../lib/Delim.mjs"; import ssdeepjs from "ssdeep.js"; import OperationError from "../errors/OperationError.mjs"; @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * Compare SSDEEP hashes operation */ class CompareSSDEEPHashes extends Operation { - /** * CompareSSDEEPHashes constructor */ @@ -23,16 +22,17 @@ class CompareSSDEEPHashes extends Operation { this.name = "Compare SSDEEP hashes"; this.module = "Crypto"; - this.description = "Compares two SSDEEP fuzzy hashes to determine the similarity between them on a scale of 0 to 100."; + this.description = + "Compares two SSDEEP fuzzy hashes to determine the similarity between them on a scale of 0 to 100."; this.infoURL = "https://forensics.wiki/ssdeep/"; this.inputType = "string"; this.outputType = "Number"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": HASH_DELIM_OPTIONS - } + name: "Delimiter", + type: "option", + value: HASH_DELIM_OPTIONS, + }, ]; } @@ -43,10 +43,10 @@ class CompareSSDEEPHashes extends Operation { */ run(input, args) { const samples = input.split(Utils.charRep(args[0])); - if (samples.length !== 2) throw new OperationError("Incorrect number of samples."); + if (samples.length !== 2) + throw new OperationError("Incorrect number of samples."); return ssdeepjs.similarity(samples[0], samples[1]); } - } export default CompareSSDEEPHashes; diff --git a/src/core/operations/ConditionalJump.mjs b/src/core/operations/ConditionalJump.mjs index 74bf1d21..e2de3606 100644 --- a/src/core/operations/ConditionalJump.mjs +++ b/src/core/operations/ConditionalJump.mjs @@ -12,7 +12,6 @@ import { getLabelIndex } from "../lib/FlowControl.mjs"; * Conditional Jump operation */ class ConditionalJump extends Operation { - /** * ConditionalJump constructor */ @@ -22,30 +21,31 @@ class ConditionalJump extends Operation { this.name = "Conditional Jump"; this.flowControl = true; this.module = "Default"; - this.description = "Conditionally jump forwards or backwards to the specified Label based on whether the data matches the specified regular expression."; + this.description = + "Conditionally jump forwards or backwards to the specified Label based on whether the data matches the specified regular expression."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Match (regex)", - "type": "string", - "value": "" + name: "Match (regex)", + type: "string", + value: "", }, { - "name": "Invert match", - "type": "boolean", - "value": false + name: "Invert match", + type: "boolean", + value: false, }, { - "name": "Label name", - "type": "shortString", - "value": "" + name: "Label name", + type: "shortString", + value: "", }, { - "name": "Maximum jumps (if jumping backwards)", - "type": "number", - "value": 10 - } + name: "Maximum jumps (if jumping backwards)", + type: "number", + value: 10, + }, ]; } @@ -58,8 +58,8 @@ class ConditionalJump extends Operation { * @returns {Object} The updated state of the recipe. */ async run(state) { - const ings = state.opList[state.progress].ingValues, - dish = state.dish, + const ings = state.opList[state.progress].ingValues, + dish = state.dish, [regexStr, invert, label, maxJumps] = ings, jmpIndex = getLabelIndex(label, state); @@ -71,7 +71,7 @@ class ConditionalJump extends Operation { if (regexStr !== "") { const str = await dish.get(Dish.STRING); const strMatch = str.search(regexStr) > -1; - if (!invert && strMatch || invert && !strMatch) { + if ((!invert && strMatch) || (invert && !strMatch)) { state.progress = jmpIndex; state.numJumps++; } else { @@ -81,7 +81,6 @@ class ConditionalJump extends Operation { return state; } - } export default ConditionalJump; diff --git a/src/core/operations/ContainImage.mjs b/src/core/operations/ContainImage.mjs index 09717a28..13eacf3c 100644 --- a/src/core/operations/ContainImage.mjs +++ b/src/core/operations/ContainImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Contain Image operation */ class ContainImage extends Operation { - /** * ContainImage constructor */ @@ -24,7 +23,8 @@ class ContainImage extends Operation { this.name = "Contain Image"; this.module = "Image"; - this.description = "Scales an image to the specified width and height, maintaining the aspect ratio. The image may be letterboxed."; + this.description = + "Scales an image to the specified width and height, maintaining the aspect ratio. The image may be letterboxed."; this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -34,33 +34,25 @@ class ContainImage extends Operation { name: "Width", type: "number", value: 100, - min: 1 + min: 1, }, { name: "Height", type: "number", value: 100, - min: 1 + min: 1, }, { name: "Horizontal align", type: "option", - value: [ - "Left", - "Center", - "Right" - ], - defaultIndex: 1 + value: ["Left", "Center", "Right"], + defaultIndex: 1, }, { name: "Vertical align", type: "option", - value: [ - "Top", - "Middle", - "Bottom" - ], - defaultIndex: 1 + value: ["Top", "Middle", "Bottom"], + defaultIndex: 1, }, { name: "Resizing algorithm", @@ -70,15 +62,15 @@ class ContainImage extends Operation { "Bilinear", "Bicubic", "Hermite", - "Bezier" + "Bezier", ], - defaultIndex: 1 + defaultIndex: 1, }, { name: "Opaque background", type: "boolean", - value: true - } + value: true, + }, ]; } @@ -92,19 +84,19 @@ class ContainImage extends Operation { const resizeMap = { "Nearest Neighbour": jimp.RESIZE_NEAREST_NEIGHBOR, - "Bilinear": jimp.RESIZE_BILINEAR, - "Bicubic": jimp.RESIZE_BICUBIC, - "Hermite": jimp.RESIZE_HERMITE, - "Bezier": jimp.RESIZE_BEZIER + Bilinear: jimp.RESIZE_BILINEAR, + Bicubic: jimp.RESIZE_BICUBIC, + Hermite: jimp.RESIZE_HERMITE, + Bezier: jimp.RESIZE_BEZIER, }; const alignMap = { - "Left": jimp.HORIZONTAL_ALIGN_LEFT, - "Center": jimp.HORIZONTAL_ALIGN_CENTER, - "Right": jimp.HORIZONTAL_ALIGN_RIGHT, - "Top": jimp.VERTICAL_ALIGN_TOP, - "Middle": jimp.VERTICAL_ALIGN_MIDDLE, - "Bottom": jimp.VERTICAL_ALIGN_BOTTOM + Left: jimp.HORIZONTAL_ALIGN_LEFT, + Center: jimp.HORIZONTAL_ALIGN_CENTER, + Right: jimp.HORIZONTAL_ALIGN_RIGHT, + Top: jimp.VERTICAL_ALIGN_TOP, + Middle: jimp.VERTICAL_ALIGN_MIDDLE, + Bottom: jimp.VERTICAL_ALIGN_BOTTOM, }; if (!isImage(input)) { @@ -120,10 +112,15 @@ class ContainImage extends Operation { try { if (isWorkerEnvironment()) self.sendStatusMessage("Containing image..."); - image.contain(width, height, alignMap[hAlign] | alignMap[vAlign], resizeMap[alg]); + image.contain( + width, + height, + alignMap[hAlign] | alignMap[vAlign], + resizeMap[alg], + ); if (opaqueBg) { - const newImage = await jimp.read(width, height, 0x000000FF); + const newImage = await jimp.read(width, height, 0x000000ff); newImage.blit(image, 0, 0); image = newImage; } @@ -156,7 +153,6 @@ class ContainImage extends Operation { return ``; } - } export default ContainImage; diff --git a/src/core/operations/ConvertArea.mjs b/src/core/operations/ConvertArea.mjs index 4cce31b1..4a3c2514 100644 --- a/src/core/operations/ConvertArea.mjs +++ b/src/core/operations/ConvertArea.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Convert area operation */ class ConvertArea extends Operation { - /** * ConvertArea constructor */ @@ -25,15 +24,15 @@ class ConvertArea extends Operation { this.outputType = "BigNumber"; this.args = [ { - "name": "Input units", - "type": "option", - "value": AREA_UNITS + name: "Input units", + type: "option", + value: AREA_UNITS, }, { - "name": "Output units", - "type": "option", - "value": AREA_UNITS - } + name: "Output units", + type: "option", + value: AREA_UNITS, + }, ]; } @@ -48,66 +47,104 @@ class ConvertArea extends Operation { input = input.times(AREA_FACTOR[inputUnits]); return input.div(AREA_FACTOR[outputUnits]); } - } - const AREA_UNITS = [ - "[Metric]", "Square metre (sq m)", "Square kilometre (sq km)", "Centiare (ca)", "Deciare (da)", "Are (a)", "Decare (daa)", "Hectare (ha)", "[/Metric]", - "[Imperial]", "Square inch (sq in)", "Square foot (sq ft)", "Square yard (sq yd)", "Square mile (sq mi)", "Perch (sq per)", "Rood (ro)", "International acre (ac)", "[/Imperial]", - "[US customary units]", "US survey acre (ac)", "US survey square mile (sq mi)", "US survey township", "[/US customary units]", - "[Nuclear physics]", "Yoctobarn (yb)", "Zeptobarn (zb)", "Attobarn (ab)", "Femtobarn (fb)", "Picobarn (pb)", "Nanobarn (nb)", "Microbarn (μb)", "Millibarn (mb)", "Barn (b)", "Kilobarn (kb)", "Megabarn (Mb)", "Outhouse", "Shed", "Planck area", "[/Nuclear physics]", - "[Comparisons]", "Washington D.C.", "Isle of Wight", "Wales", "Texas", "[/Comparisons]", + "[Metric]", + "Square metre (sq m)", + "Square kilometre (sq km)", + "Centiare (ca)", + "Deciare (da)", + "Are (a)", + "Decare (daa)", + "Hectare (ha)", + "[/Metric]", + "[Imperial]", + "Square inch (sq in)", + "Square foot (sq ft)", + "Square yard (sq yd)", + "Square mile (sq mi)", + "Perch (sq per)", + "Rood (ro)", + "International acre (ac)", + "[/Imperial]", + "[US customary units]", + "US survey acre (ac)", + "US survey square mile (sq mi)", + "US survey township", + "[/US customary units]", + "[Nuclear physics]", + "Yoctobarn (yb)", + "Zeptobarn (zb)", + "Attobarn (ab)", + "Femtobarn (fb)", + "Picobarn (pb)", + "Nanobarn (nb)", + "Microbarn (μb)", + "Millibarn (mb)", + "Barn (b)", + "Kilobarn (kb)", + "Megabarn (Mb)", + "Outhouse", + "Shed", + "Planck area", + "[/Nuclear physics]", + "[Comparisons]", + "Washington D.C.", + "Isle of Wight", + "Wales", + "Texas", + "[/Comparisons]", ]; -const AREA_FACTOR = { // Multiples of a square metre +const AREA_FACTOR = { + // Multiples of a square metre // Metric - "Square metre (sq m)": 1, + "Square metre (sq m)": 1, "Square kilometre (sq km)": 1e6, - "Centiare (ca)": 1, - "Deciare (da)": 10, - "Are (a)": 100, - "Decare (daa)": 1e3, - "Hectare (ha)": 1e4, + "Centiare (ca)": 1, + "Deciare (da)": 10, + "Are (a)": 100, + "Decare (daa)": 1e3, + "Hectare (ha)": 1e4, // Imperial - "Square inch (sq in)": 0.00064516, - "Square foot (sq ft)": 0.09290304, - "Square yard (sq yd)": 0.83612736, - "Square mile (sq mi)": 2589988.110336, - "Perch (sq per)": 42.21, - "Rood (ro)": 1011, - "International acre (ac)": 4046.8564224, + "Square inch (sq in)": 0.00064516, + "Square foot (sq ft)": 0.09290304, + "Square yard (sq yd)": 0.83612736, + "Square mile (sq mi)": 2589988.110336, + "Perch (sq per)": 42.21, + "Rood (ro)": 1011, + "International acre (ac)": 4046.8564224, // US customary units - "US survey acre (ac)": 4046.87261, + "US survey acre (ac)": 4046.87261, "US survey square mile (sq mi)": 2589998.470305239, - "US survey township": 93239944.9309886, + "US survey township": 93239944.9309886, // Nuclear physics - "Yoctobarn (yb)": 1e-52, - "Zeptobarn (zb)": 1e-49, - "Attobarn (ab)": 1e-46, - "Femtobarn (fb)": 1e-43, - "Picobarn (pb)": 1e-40, - "Nanobarn (nb)": 1e-37, - "Microbarn (μb)": 1e-34, - "Millibarn (mb)": 1e-31, - "Barn (b)": 1e-28, - "Kilobarn (kb)": 1e-25, - "Megabarn (Mb)": 1e-22, + "Yoctobarn (yb)": 1e-52, + "Zeptobarn (zb)": 1e-49, + "Attobarn (ab)": 1e-46, + "Femtobarn (fb)": 1e-43, + "Picobarn (pb)": 1e-40, + "Nanobarn (nb)": 1e-37, + "Microbarn (μb)": 1e-34, + "Millibarn (mb)": 1e-31, + "Barn (b)": 1e-28, + "Kilobarn (kb)": 1e-25, + "Megabarn (Mb)": 1e-22, - "Planck area": 2.6e-70, - "Shed": 1e-52, - "Outhouse": 1e-34, + "Planck area": 2.6e-70, + Shed: 1e-52, + Outhouse: 1e-34, // Comparisons - "Washington D.C.": 176119191.502848, - "Isle of Wight": 380000000, - "Wales": 20779000000, - "Texas": 696241000000, + "Washington D.C.": 176119191.502848, + "Isle of Wight": 380000000, + Wales: 20779000000, + Texas: 696241000000, }; - export default ConvertArea; diff --git a/src/core/operations/ConvertCoordinateFormat.mjs b/src/core/operations/ConvertCoordinateFormat.mjs index f1e1b20f..dd12dc63 100644 --- a/src/core/operations/ConvertCoordinateFormat.mjs +++ b/src/core/operations/ConvertCoordinateFormat.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {FORMATS, convertCoordinates} from "../lib/ConvertCoordinates.mjs"; +import { FORMATS, convertCoordinates } from "../lib/ConvertCoordinates.mjs"; /** * Convert co-ordinate format operation */ class ConvertCoordinateFormat extends Operation { - /** * ConvertCoordinateFormat constructor */ @@ -20,59 +19,51 @@ class ConvertCoordinateFormat extends Operation { this.name = "Convert co-ordinate format"; this.module = "Hashing"; - this.description = "Converts geographical coordinates between different formats.

Supported formats:
  • Degrees Minutes Seconds (DMS)
  • Degrees Decimal Minutes (DDM)
  • Decimal Degrees (DD)
  • Geohash
  • Military Grid Reference System (MGRS)
  • Ordnance Survey National Grid (OSNG)
  • Universal Transverse Mercator (UTM)

The operation can try to detect the input co-ordinate format and delimiter automatically, but this may not always work correctly."; - this.infoURL = "https://wikipedia.org/wiki/Geographic_coordinate_conversion"; + this.description = + "Converts geographical coordinates between different formats.

Supported formats:
  • Degrees Minutes Seconds (DMS)
  • Degrees Decimal Minutes (DDM)
  • Decimal Degrees (DD)
  • Geohash
  • Military Grid Reference System (MGRS)
  • Ordnance Survey National Grid (OSNG)
  • Universal Transverse Mercator (UTM)

The operation can try to detect the input co-ordinate format and delimiter automatically, but this may not always work correctly."; + this.infoURL = + "https://wikipedia.org/wiki/Geographic_coordinate_conversion"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Input Format", - "type": "option", - "value": ["Auto"].concat(FORMATS) + name: "Input Format", + type: "option", + value: ["Auto"].concat(FORMATS), }, { - "name": "Input Delimiter", - "type": "option", - "value": [ + name: "Input Delimiter", + type: "option", + value: [ "Auto", "Direction Preceding", "Direction Following", "\\n", "Comma", "Semi-colon", - "Colon" - ] + "Colon", + ], }, { - "name": "Output Format", - "type": "option", - "value": FORMATS + name: "Output Format", + type: "option", + value: FORMATS, }, { - "name": "Output Delimiter", - "type": "option", - "value": [ - "Space", - "\\n", - "Comma", - "Semi-colon", - "Colon" - ] + name: "Output Delimiter", + type: "option", + value: ["Space", "\\n", "Comma", "Semi-colon", "Colon"], }, { - "name": "Include Compass Directions", - "type": "option", - "value": [ - "None", - "Before", - "After" - ] + name: "Include Compass Directions", + type: "option", + value: ["None", "Before", "After"], }, { - "name": "Precision", - "type": "number", - "value": 3 - } + name: "Precision", + type: "number", + value: 3, + }, ]; } @@ -83,8 +74,23 @@ class ConvertCoordinateFormat extends Operation { */ run(input, args) { if (input.replace(/[\s+]/g, "") !== "") { - const [inFormat, inDelim, outFormat, outDelim, incDirection, precision] = args; - const result = convertCoordinates(input, inFormat, inDelim, outFormat, outDelim, incDirection, precision); + const [ + inFormat, + inDelim, + outFormat, + outDelim, + incDirection, + precision, + ] = args; + const result = convertCoordinates( + input, + inFormat, + inDelim, + outFormat, + outDelim, + incDirection, + precision, + ); return result; } else { return input; diff --git a/src/core/operations/ConvertDataUnits.mjs b/src/core/operations/ConvertDataUnits.mjs index 0335e852..abbf7568 100644 --- a/src/core/operations/ConvertDataUnits.mjs +++ b/src/core/operations/ConvertDataUnits.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Convert data units operation */ class ConvertDataUnits extends Operation { - /** * ConvertDataUnits constructor */ @@ -25,15 +24,15 @@ class ConvertDataUnits extends Operation { this.outputType = "BigNumber"; this.args = [ { - "name": "Input units", - "type": "option", - "value": DATA_UNITS + name: "Input units", + type: "option", + value: DATA_UNITS, }, { - "name": "Output units", - "type": "option", - "value": DATA_UNITS - } + name: "Output units", + type: "option", + value: DATA_UNITS, + }, ]; } @@ -48,44 +47,85 @@ class ConvertDataUnits extends Operation { input = input.times(DATA_FACTOR[inputUnits]); return input.div(DATA_FACTOR[outputUnits]); } - } const DATA_UNITS = [ - "Bits (b)", "Nibbles", "Octets", "Bytes (B)", - "[Binary bits (2^n)]", "Kibibits (Kib)", "Mebibits (Mib)", "Gibibits (Gib)", "Tebibits (Tib)", "Pebibits (Pib)", "Exbibits (Eib)", "Zebibits (Zib)", "Yobibits (Yib)", "[/Binary bits (2^n)]", - "[Decimal bits (10^n)]", "Decabits", "Hectobits", "Kilobits (Kb)", "Megabits (Mb)", "Gigabits (Gb)", "Terabits (Tb)", "Petabits (Pb)", "Exabits (Eb)", "Zettabits (Zb)", "Yottabits (Yb)", "[/Decimal bits (10^n)]", - "[Binary bytes (8 x 2^n)]", "Kibibytes (KiB)", "Mebibytes (MiB)", "Gibibytes (GiB)", "Tebibytes (TiB)", "Pebibytes (PiB)", "Exbibytes (EiB)", "Zebibytes (ZiB)", "Yobibytes (YiB)", "[/Binary bytes (8 x 2^n)]", - "[Decimal bytes (8 x 10^n)]", "Kilobytes (KB)", "Megabytes (MB)", "Gigabytes (GB)", "Terabytes (TB)", "Petabytes (PB)", "Exabytes (EB)", "Zettabytes (ZB)", "Yottabytes (YB)", "[/Decimal bytes (8 x 10^n)]" + "Bits (b)", + "Nibbles", + "Octets", + "Bytes (B)", + "[Binary bits (2^n)]", + "Kibibits (Kib)", + "Mebibits (Mib)", + "Gibibits (Gib)", + "Tebibits (Tib)", + "Pebibits (Pib)", + "Exbibits (Eib)", + "Zebibits (Zib)", + "Yobibits (Yib)", + "[/Binary bits (2^n)]", + "[Decimal bits (10^n)]", + "Decabits", + "Hectobits", + "Kilobits (Kb)", + "Megabits (Mb)", + "Gigabits (Gb)", + "Terabits (Tb)", + "Petabits (Pb)", + "Exabits (Eb)", + "Zettabits (Zb)", + "Yottabits (Yb)", + "[/Decimal bits (10^n)]", + "[Binary bytes (8 x 2^n)]", + "Kibibytes (KiB)", + "Mebibytes (MiB)", + "Gibibytes (GiB)", + "Tebibytes (TiB)", + "Pebibytes (PiB)", + "Exbibytes (EiB)", + "Zebibytes (ZiB)", + "Yobibytes (YiB)", + "[/Binary bytes (8 x 2^n)]", + "[Decimal bytes (8 x 10^n)]", + "Kilobytes (KB)", + "Megabytes (MB)", + "Gigabytes (GB)", + "Terabytes (TB)", + "Petabytes (PB)", + "Exabytes (EB)", + "Zettabytes (ZB)", + "Yottabytes (YB)", + "[/Decimal bytes (8 x 10^n)]", ]; -const DATA_FACTOR = { // Multiples of a bit - "Bits (b)": 1, - "Nibbles": 4, - "Octets": 8, - "Bytes (B)": 8, +const DATA_FACTOR = { + // Multiples of a bit + "Bits (b)": 1, + Nibbles: 4, + Octets: 8, + "Bytes (B)": 8, // Binary bits (2^n) - "Kibibits (Kib)": 1024, - "Mebibits (Mib)": 1048576, - "Gibibits (Gib)": 1073741824, - "Tebibits (Tib)": 1099511627776, - "Pebibits (Pib)": 1125899906842624, - "Exbibits (Eib)": 1152921504606846976, - "Zebibits (Zib)": 1180591620717411303424, - "Yobibits (Yib)": 1208925819614629174706176, + "Kibibits (Kib)": 1024, + "Mebibits (Mib)": 1048576, + "Gibibits (Gib)": 1073741824, + "Tebibits (Tib)": 1099511627776, + "Pebibits (Pib)": 1125899906842624, + "Exbibits (Eib)": 1152921504606846976, + "Zebibits (Zib)": 1180591620717411303424, + "Yobibits (Yib)": 1208925819614629174706176, // Decimal bits (10^n) - "Decabits": 10, - "Hectobits": 100, - "Kilobits (Kb)": 1e3, - "Megabits (Mb)": 1e6, - "Gigabits (Gb)": 1e9, - "Terabits (Tb)": 1e12, - "Petabits (Pb)": 1e15, - "Exabits (Eb)": 1e18, - "Zettabits (Zb)": 1e21, - "Yottabits (Yb)": 1e24, + Decabits: 10, + Hectobits: 100, + "Kilobits (Kb)": 1e3, + "Megabits (Mb)": 1e6, + "Gigabits (Gb)": 1e9, + "Terabits (Tb)": 1e12, + "Petabits (Pb)": 1e15, + "Exabits (Eb)": 1e18, + "Zettabits (Zb)": 1e21, + "Yottabits (Yb)": 1e24, // Binary bytes (8 x 2^n) "Kibibytes (KiB)": 8192, @@ -98,15 +138,14 @@ const DATA_FACTOR = { // Multiples of a bit "Yobibytes (YiB)": 9671406556917033397649408, // Decimal bytes (8 x 10^n) - "Kilobytes (KB)": 8e3, - "Megabytes (MB)": 8e6, - "Gigabytes (GB)": 8e9, - "Terabytes (TB)": 8e12, - "Petabytes (PB)": 8e15, - "Exabytes (EB)": 8e18, + "Kilobytes (KB)": 8e3, + "Megabytes (MB)": 8e6, + "Gigabytes (GB)": 8e9, + "Terabytes (TB)": 8e12, + "Petabytes (PB)": 8e15, + "Exabytes (EB)": 8e18, "Zettabytes (ZB)": 8e21, "Yottabytes (YB)": 8e24, }; - export default ConvertDataUnits; diff --git a/src/core/operations/ConvertDistance.mjs b/src/core/operations/ConvertDistance.mjs index 1a5fc8af..844b663a 100644 --- a/src/core/operations/ConvertDistance.mjs +++ b/src/core/operations/ConvertDistance.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Convert distance operation */ class ConvertDistance extends Operation { - /** * ConvertDistance constructor */ @@ -20,20 +19,21 @@ class ConvertDistance extends Operation { this.name = "Convert distance"; this.module = "Default"; this.description = "Converts a unit of distance to another format."; - this.infoURL = "https://wikipedia.org/wiki/Orders_of_magnitude_(length)"; + this.infoURL = + "https://wikipedia.org/wiki/Orders_of_magnitude_(length)"; this.inputType = "BigNumber"; this.outputType = "BigNumber"; this.args = [ { - "name": "Input units", - "type": "option", - "value": DISTANCE_UNITS + name: "Input units", + type: "option", + value: DISTANCE_UNITS, }, { - "name": "Output units", - "type": "option", - "value": DISTANCE_UNITS - } + name: "Output units", + type: "option", + value: DISTANCE_UNITS, + }, ]; } @@ -48,49 +48,79 @@ class ConvertDistance extends Operation { input = input.times(DISTANCE_FACTOR[inputUnits]); return input.div(DISTANCE_FACTOR[outputUnits]); } - } const DISTANCE_UNITS = [ - "[Metric]", "Nanometres (nm)", "Micrometres (µm)", "Millimetres (mm)", "Centimetres (cm)", "Metres (m)", "Kilometers (km)", "[/Metric]", - "[Imperial]", "Thou (th)", "Inches (in)", "Feet (ft)", "Yards (yd)", "Chains (ch)", "Furlongs (fur)", "Miles (mi)", "Leagues (lea)", "[/Imperial]", - "[Maritime]", "Fathoms (ftm)", "Cables", "Nautical miles", "[/Maritime]", - "[Comparisons]", "Cars (4m)", "Buses (8.4m)", "American football fields (91m)", "Football pitches (105m)", "[/Comparisons]", - "[Astronomical]", "Earth-to-Moons", "Earth's equators", "Astronomical units (au)", "Light-years (ly)", "Parsecs (pc)", "[/Astronomical]", + "[Metric]", + "Nanometres (nm)", + "Micrometres (µm)", + "Millimetres (mm)", + "Centimetres (cm)", + "Metres (m)", + "Kilometers (km)", + "[/Metric]", + "[Imperial]", + "Thou (th)", + "Inches (in)", + "Feet (ft)", + "Yards (yd)", + "Chains (ch)", + "Furlongs (fur)", + "Miles (mi)", + "Leagues (lea)", + "[/Imperial]", + "[Maritime]", + "Fathoms (ftm)", + "Cables", + "Nautical miles", + "[/Maritime]", + "[Comparisons]", + "Cars (4m)", + "Buses (8.4m)", + "American football fields (91m)", + "Football pitches (105m)", + "[/Comparisons]", + "[Astronomical]", + "Earth-to-Moons", + "Earth's equators", + "Astronomical units (au)", + "Light-years (ly)", + "Parsecs (pc)", + "[/Astronomical]", ]; -const DISTANCE_FACTOR = { // Multiples of a metre - "Nanometres (nm)": 1e-9, - "Micrometres (µm)": 1e-6, - "Millimetres (mm)": 1e-3, - "Centimetres (cm)": 1e-2, - "Metres (m)": 1, - "Kilometers (km)": 1e3, +const DISTANCE_FACTOR = { + // Multiples of a metre + "Nanometres (nm)": 1e-9, + "Micrometres (µm)": 1e-6, + "Millimetres (mm)": 1e-3, + "Centimetres (cm)": 1e-2, + "Metres (m)": 1, + "Kilometers (km)": 1e3, - "Thou (th)": 0.0000254, - "Inches (in)": 0.0254, - "Feet (ft)": 0.3048, - "Yards (yd)": 0.9144, - "Chains (ch)": 20.1168, - "Furlongs (fur)": 201.168, - "Miles (mi)": 1609.344, - "Leagues (lea)": 4828.032, + "Thou (th)": 0.0000254, + "Inches (in)": 0.0254, + "Feet (ft)": 0.3048, + "Yards (yd)": 0.9144, + "Chains (ch)": 20.1168, + "Furlongs (fur)": 201.168, + "Miles (mi)": 1609.344, + "Leagues (lea)": 4828.032, - "Fathoms (ftm)": 1.853184, - "Cables": 185.3184, - "Nautical miles": 1853.184, + "Fathoms (ftm)": 1.853184, + Cables: 185.3184, + "Nautical miles": 1853.184, - "Cars (4m)": 4, - "Buses (8.4m)": 8.4, + "Cars (4m)": 4, + "Buses (8.4m)": 8.4, "American football fields (91m)": 91, "Football pitches (105m)": 105, - "Earth-to-Moons": 380000000, - "Earth's equators": 40075016.686, + "Earth-to-Moons": 380000000, + "Earth's equators": 40075016.686, "Astronomical units (au)": 149597870700, - "Light-years (ly)": 9460730472580800, - "Parsecs (pc)": 3.0856776e16 + "Light-years (ly)": 9460730472580800, + "Parsecs (pc)": 3.0856776e16, }; - export default ConvertDistance; diff --git a/src/core/operations/ConvertImageFormat.mjs b/src/core/operations/ConvertImageFormat.mjs index 9f8cdd91..6e334f5a 100644 --- a/src/core/operations/ConvertImageFormat.mjs +++ b/src/core/operations/ConvertImageFormat.mjs @@ -14,7 +14,6 @@ import jimp from "jimp"; * Convert Image Format operation */ class ConvertImageFormat extends Operation { - /** * ConvertImageFormat constructor */ @@ -23,7 +22,8 @@ class ConvertImageFormat extends Operation { this.name = "Convert Image Format"; this.module = "Image"; - this.description = "Converts an image between different formats. Supported formats:
  • Joint Photographic Experts Group (JPEG)
  • Portable Network Graphics (PNG)
  • Bitmap (BMP)
  • Tagged Image File Format (TIFF)

Note: GIF files are supported for input, but cannot be outputted."; + this.description = + "Converts an image between different formats. Supported formats:
  • Joint Photographic Experts Group (JPEG)
  • Portable Network Graphics (PNG)
  • Bitmap (BMP)
  • Tagged Image File Format (TIFF)

Note: GIF files are supported for input, but cannot be outputted."; this.infoURL = "https://wikipedia.org/wiki/Image_file_formats"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -32,39 +32,27 @@ class ConvertImageFormat extends Operation { { name: "Output Format", type: "option", - value: [ - "JPEG", - "PNG", - "BMP", - "TIFF" - ] + value: ["JPEG", "PNG", "BMP", "TIFF"], }, { name: "JPEG Quality", type: "number", value: 80, min: 1, - max: 100 + max: 100, }, { name: "PNG Filter Type", type: "option", - value: [ - "Auto", - "None", - "Sub", - "Up", - "Average", - "Paeth" - ] + value: ["Auto", "None", "Sub", "Up", "Average", "Paeth"], }, { name: "PNG Deflate Level", type: "number", value: 9, min: 0, - max: 9 - } + max: 9, + }, ]; } @@ -76,19 +64,19 @@ class ConvertImageFormat extends Operation { async run(input, args) { const [format, jpegQuality, pngFilterType, pngDeflateLevel] = args; const formatMap = { - "JPEG": jimp.MIME_JPEG, - "PNG": jimp.MIME_PNG, - "BMP": jimp.MIME_BMP, - "TIFF": jimp.MIME_TIFF + JPEG: jimp.MIME_JPEG, + PNG: jimp.MIME_PNG, + BMP: jimp.MIME_BMP, + TIFF: jimp.MIME_TIFF, }; const pngFilterMap = { - "Auto": jimp.PNG_FILTER_AUTO, - "None": jimp.PNG_FILTER_NONE, - "Sub": jimp.PNG_FILTER_SUB, - "Up": jimp.PNG_FILTER_UP, - "Average": jimp.PNG_FILTER_AVERAGE, - "Paeth": jimp.PNG_FILTER_PATH + Auto: jimp.PNG_FILTER_AUTO, + None: jimp.PNG_FILTER_NONE, + Sub: jimp.PNG_FILTER_SUB, + Up: jimp.PNG_FILTER_UP, + Average: jimp.PNG_FILTER_AVERAGE, + Paeth: jimp.PNG_FILTER_PATH, }; const mime = formatMap[format]; @@ -137,7 +125,6 @@ class ConvertImageFormat extends Operation { return ``; } - } export default ConvertImageFormat; diff --git a/src/core/operations/ConvertMass.mjs b/src/core/operations/ConvertMass.mjs index 712884ed..343b9c7b 100644 --- a/src/core/operations/ConvertMass.mjs +++ b/src/core/operations/ConvertMass.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Convert mass operation */ class ConvertMass extends Operation { - /** * ConvertMass constructor */ @@ -25,15 +24,15 @@ class ConvertMass extends Operation { this.outputType = "BigNumber"; this.args = [ { - "name": "Input units", - "type": "option", - "value": MASS_UNITS + name: "Input units", + type: "option", + value: MASS_UNITS, }, { - "name": "Output units", - "type": "option", - "value": MASS_UNITS - } + name: "Output units", + type: "option", + value: MASS_UNITS, + }, ]; } @@ -48,77 +47,148 @@ class ConvertMass extends Operation { input = input.times(MASS_FACTOR[inputUnits]); return input.div(MASS_FACTOR[outputUnits]); } - } - const MASS_UNITS = [ - "[Metric]", "Yoctogram (yg)", "Zeptogram (zg)", "Attogram (ag)", "Femtogram (fg)", "Picogram (pg)", "Nanogram (ng)", "Microgram (μg)", "Milligram (mg)", "Centigram (cg)", "Decigram (dg)", "Gram (g)", "Decagram (dag)", "Hectogram (hg)", "Kilogram (kg)", "Megagram (Mg)", "Tonne (t)", "Gigagram (Gg)", "Teragram (Tg)", "Petagram (Pg)", "Exagram (Eg)", "Zettagram (Zg)", "Yottagram (Yg)", "[/Metric]", - "[Imperial Avoirdupois]", "Grain (gr)", "Dram (dr)", "Ounce (oz)", "Pound (lb)", "Nail", "Stone (st)", "Quarter (gr)", "Tod", "US hundredweight (cwt)", "Imperial hundredweight (cwt)", "US ton (t)", "Imperial ton (t)", "[/Imperial Avoirdupois]", - "[Imperial Troy]", "Grain (gr)", "Pennyweight (dwt)", "Troy dram (dr t)", "Troy ounce (oz t)", "Troy pound (lb t)", "Mark", "[/Imperial Troy]", - "[Archaic]", "Wey", "Wool wey", "Suffolk wey", "Wool sack", "Coal sack", "Load", "Last", "Flax or feather last", "Gunpowder last", "Picul", "Rice last", "[/Archaic]", - "[Comparisons]", "Big Ben (14 tonnes)", "Blue whale (180 tonnes)", "International Space Station (417 tonnes)", "Space Shuttle (2,041 tonnes)", "RMS Titanic (52,000 tonnes)", "Great Pyramid of Giza (6,000,000 tonnes)", "Earth's oceans (1.4 yottagrams)", "[/Comparisons]", - "[Astronomical]", "A teaspoon of neutron star (5,500 million tonnes)", "Lunar mass (ML)", "Earth mass (M⊕)", "Jupiter mass (MJ)", "Solar mass (M☉)", "Sagittarius A* (7.5 x 10^36 kgs-ish)", "Milky Way galaxy (1.2 x 10^42 kgs)", "The observable universe (1.45 x 10^53 kgs)", "[/Astronomical]", + "[Metric]", + "Yoctogram (yg)", + "Zeptogram (zg)", + "Attogram (ag)", + "Femtogram (fg)", + "Picogram (pg)", + "Nanogram (ng)", + "Microgram (μg)", + "Milligram (mg)", + "Centigram (cg)", + "Decigram (dg)", + "Gram (g)", + "Decagram (dag)", + "Hectogram (hg)", + "Kilogram (kg)", + "Megagram (Mg)", + "Tonne (t)", + "Gigagram (Gg)", + "Teragram (Tg)", + "Petagram (Pg)", + "Exagram (Eg)", + "Zettagram (Zg)", + "Yottagram (Yg)", + "[/Metric]", + "[Imperial Avoirdupois]", + "Grain (gr)", + "Dram (dr)", + "Ounce (oz)", + "Pound (lb)", + "Nail", + "Stone (st)", + "Quarter (gr)", + "Tod", + "US hundredweight (cwt)", + "Imperial hundredweight (cwt)", + "US ton (t)", + "Imperial ton (t)", + "[/Imperial Avoirdupois]", + "[Imperial Troy]", + "Grain (gr)", + "Pennyweight (dwt)", + "Troy dram (dr t)", + "Troy ounce (oz t)", + "Troy pound (lb t)", + "Mark", + "[/Imperial Troy]", + "[Archaic]", + "Wey", + "Wool wey", + "Suffolk wey", + "Wool sack", + "Coal sack", + "Load", + "Last", + "Flax or feather last", + "Gunpowder last", + "Picul", + "Rice last", + "[/Archaic]", + "[Comparisons]", + "Big Ben (14 tonnes)", + "Blue whale (180 tonnes)", + "International Space Station (417 tonnes)", + "Space Shuttle (2,041 tonnes)", + "RMS Titanic (52,000 tonnes)", + "Great Pyramid of Giza (6,000,000 tonnes)", + "Earth's oceans (1.4 yottagrams)", + "[/Comparisons]", + "[Astronomical]", + "A teaspoon of neutron star (5,500 million tonnes)", + "Lunar mass (ML)", + "Earth mass (M⊕)", + "Jupiter mass (MJ)", + "Solar mass (M☉)", + "Sagittarius A* (7.5 x 10^36 kgs-ish)", + "Milky Way galaxy (1.2 x 10^42 kgs)", + "The observable universe (1.45 x 10^53 kgs)", + "[/Astronomical]", ]; -const MASS_FACTOR = { // Multiples of a gram +const MASS_FACTOR = { + // Multiples of a gram // Metric - "Yoctogram (yg)": 1e-24, - "Zeptogram (zg)": 1e-21, - "Attogram (ag)": 1e-18, - "Femtogram (fg)": 1e-15, - "Picogram (pg)": 1e-12, - "Nanogram (ng)": 1e-9, - "Microgram (μg)": 1e-6, - "Milligram (mg)": 1e-3, - "Centigram (cg)": 1e-2, - "Decigram (dg)": 1e-1, - "Gram (g)": 1, - "Decagram (dag)": 10, - "Hectogram (hg)": 100, - "Kilogram (kg)": 1000, - "Megagram (Mg)": 1e6, - "Tonne (t)": 1e6, - "Gigagram (Gg)": 1e9, - "Teragram (Tg)": 1e12, - "Petagram (Pg)": 1e15, - "Exagram (Eg)": 1e18, - "Zettagram (Zg)": 1e21, - "Yottagram (Yg)": 1e24, + "Yoctogram (yg)": 1e-24, + "Zeptogram (zg)": 1e-21, + "Attogram (ag)": 1e-18, + "Femtogram (fg)": 1e-15, + "Picogram (pg)": 1e-12, + "Nanogram (ng)": 1e-9, + "Microgram (μg)": 1e-6, + "Milligram (mg)": 1e-3, + "Centigram (cg)": 1e-2, + "Decigram (dg)": 1e-1, + "Gram (g)": 1, + "Decagram (dag)": 10, + "Hectogram (hg)": 100, + "Kilogram (kg)": 1000, + "Megagram (Mg)": 1e6, + "Tonne (t)": 1e6, + "Gigagram (Gg)": 1e9, + "Teragram (Tg)": 1e12, + "Petagram (Pg)": 1e15, + "Exagram (Eg)": 1e18, + "Zettagram (Zg)": 1e21, + "Yottagram (Yg)": 1e24, // Imperial Avoirdupois - "Grain (gr)": 64.79891e-3, - "Dram (dr)": 1.7718451953125, - "Ounce (oz)": 28.349523125, - "Pound (lb)": 453.59237, - "Nail": 3175.14659, - "Stone (st)": 6.35029318e3, - "Quarter (gr)": 12700.58636, - "Tod": 12700.58636, + "Grain (gr)": 64.79891e-3, + "Dram (dr)": 1.7718451953125, + "Ounce (oz)": 28.349523125, + "Pound (lb)": 453.59237, + Nail: 3175.14659, + "Stone (st)": 6.35029318e3, + "Quarter (gr)": 12700.58636, + Tod: 12700.58636, "US hundredweight (cwt)": 45.359237e3, "Imperial hundredweight (cwt)": 50.80234544e3, - "US ton (t)": 907.18474e3, - "Imperial ton (t)": 1016.0469088e3, + "US ton (t)": 907.18474e3, + "Imperial ton (t)": 1016.0469088e3, // Imperial Troy - "Pennyweight (dwt)": 1.55517384, - "Troy dram (dr t)": 3.8879346, - "Troy ounce (oz t)": 31.1034768, - "Troy pound (lb t)": 373.2417216, - "Mark": 248.8278144, + "Pennyweight (dwt)": 1.55517384, + "Troy dram (dr t)": 3.8879346, + "Troy ounce (oz t)": 31.1034768, + "Troy pound (lb t)": 373.2417216, + Mark: 248.8278144, // Archaic - "Wey": 76.5e3, - "Wool wey": 101.7e3, - "Suffolk wey": 161.5e3, - "Wool sack": 153000, - "Coal sack": 50.80234544e3, - "Load": 918000, - "Last": 1836000, + Wey: 76.5e3, + "Wool wey": 101.7e3, + "Suffolk wey": 161.5e3, + "Wool sack": 153000, + "Coal sack": 50.80234544e3, + Load: 918000, + Last: 1836000, "Flax or feather last": 770e3, - "Gunpowder last": 1090e3, - "Picul": 60.478982e3, - "Rice last": 1200e3, + "Gunpowder last": 1090e3, + Picul: 60.478982e3, + "Rice last": 1200e3, // Comparisons "Big Ben (14 tonnes)": 14e6, @@ -131,14 +201,13 @@ const MASS_FACTOR = { // Multiples of a gram // Astronomical "A teaspoon of neutron star (5,500 million tonnes)": 5.5e15, - "Lunar mass (ML)": 7.342e25, - "Earth mass (M⊕)": 5.97219e27, - "Jupiter mass (MJ)": 1.8981411476999997e30, - "Solar mass (M☉)": 1.98855e33, + "Lunar mass (ML)": 7.342e25, + "Earth mass (M⊕)": 5.97219e27, + "Jupiter mass (MJ)": 1.8981411476999997e30, + "Solar mass (M☉)": 1.98855e33, "Sagittarius A* (7.5 x 10^36 kgs-ish)": 7.5e39, "Milky Way galaxy (1.2 x 10^42 kgs)": 1.2e45, "The observable universe (1.45 x 10^53 kgs)": 1.45e56, }; - export default ConvertMass; diff --git a/src/core/operations/ConvertSpeed.mjs b/src/core/operations/ConvertSpeed.mjs index 7fc6718d..2b9be6e7 100644 --- a/src/core/operations/ConvertSpeed.mjs +++ b/src/core/operations/ConvertSpeed.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Convert speed operation */ class ConvertSpeed extends Operation { - /** * ConvertSpeed constructor */ @@ -25,15 +24,15 @@ class ConvertSpeed extends Operation { this.outputType = "BigNumber"; this.args = [ { - "name": "Input units", - "type": "option", - "value": SPEED_UNITS + name: "Input units", + type: "option", + value: SPEED_UNITS, }, { - "name": "Output units", - "type": "option", - "value": SPEED_UNITS - } + name: "Output units", + type: "option", + value: SPEED_UNITS, + }, ]; } @@ -48,50 +47,78 @@ class ConvertSpeed extends Operation { input = input.times(SPEED_FACTOR[inputUnits]); return input.div(SPEED_FACTOR[outputUnits]); } - } const SPEED_UNITS = [ - "[Metric]", "Metres per second (m/s)", "Kilometres per hour (km/h)", "[/Metric]", - "[Imperial]", "Miles per hour (mph)", "Knots (kn)", "[/Imperial]", - "[Comparisons]", "Human hair growth rate", "Bamboo growth rate", "World's fastest snail", "Usain Bolt's top speed", "Jet airliner cruising speed", "Concorde", "SR-71 Blackbird", "Space Shuttle", "International Space Station", "[/Comparisons]", - "[Scientific]", "Sound in standard atmosphere", "Sound in water", "Lunar escape velocity", "Earth escape velocity", "Earth's solar orbit", "Solar system's Milky Way orbit", "Milky Way relative to the cosmic microwave background", "Solar escape velocity", "Neutron star escape velocity (0.3c)", "Light in a diamond (0.4136c)", "Signal in an optical fibre (0.667c)", "Light (c)", "[/Scientific]", + "[Metric]", + "Metres per second (m/s)", + "Kilometres per hour (km/h)", + "[/Metric]", + "[Imperial]", + "Miles per hour (mph)", + "Knots (kn)", + "[/Imperial]", + "[Comparisons]", + "Human hair growth rate", + "Bamboo growth rate", + "World's fastest snail", + "Usain Bolt's top speed", + "Jet airliner cruising speed", + "Concorde", + "SR-71 Blackbird", + "Space Shuttle", + "International Space Station", + "[/Comparisons]", + "[Scientific]", + "Sound in standard atmosphere", + "Sound in water", + "Lunar escape velocity", + "Earth escape velocity", + "Earth's solar orbit", + "Solar system's Milky Way orbit", + "Milky Way relative to the cosmic microwave background", + "Solar escape velocity", + "Neutron star escape velocity (0.3c)", + "Light in a diamond (0.4136c)", + "Signal in an optical fibre (0.667c)", + "Light (c)", + "[/Scientific]", ]; -const SPEED_FACTOR = { // Multiples of m/s +const SPEED_FACTOR = { + // Multiples of m/s // Metric - "Metres per second (m/s)": 1, - "Kilometres per hour (km/h)": 0.2778, + "Metres per second (m/s)": 1, + "Kilometres per hour (km/h)": 0.2778, // Imperial - "Miles per hour (mph)": 0.44704, - "Knots (kn)": 0.5144, + "Miles per hour (mph)": 0.44704, + "Knots (kn)": 0.5144, // Comparisons - "Human hair growth rate": 4.8e-9, - "Bamboo growth rate": 1.4e-5, - "World's fastest snail": 0.00275, - "Usain Bolt's top speed": 12.42, - "Jet airliner cruising speed": 250, - "Concorde": 603, - "SR-71 Blackbird": 981, - "Space Shuttle": 1400, - "International Space Station": 7700, + "Human hair growth rate": 4.8e-9, + "Bamboo growth rate": 1.4e-5, + "World's fastest snail": 0.00275, + "Usain Bolt's top speed": 12.42, + "Jet airliner cruising speed": 250, + Concorde: 603, + "SR-71 Blackbird": 981, + "Space Shuttle": 1400, + "International Space Station": 7700, // Scientific - "Sound in standard atmosphere": 340.3, - "Sound in water": 1500, - "Lunar escape velocity": 2375, - "Earth escape velocity": 11200, - "Earth's solar orbit": 29800, - "Solar system's Milky Way orbit": 200000, + "Sound in standard atmosphere": 340.3, + "Sound in water": 1500, + "Lunar escape velocity": 2375, + "Earth escape velocity": 11200, + "Earth's solar orbit": 29800, + "Solar system's Milky Way orbit": 200000, "Milky Way relative to the cosmic microwave background": 552000, - "Solar escape velocity": 617700, + "Solar escape velocity": 617700, "Neutron star escape velocity (0.3c)": 100000000, - "Light in a diamond (0.4136c)": 124000000, + "Light in a diamond (0.4136c)": 124000000, "Signal in an optical fibre (0.667c)": 200000000, - "Light (c)": 299792458, + "Light (c)": 299792458, }; - export default ConvertSpeed; diff --git a/src/core/operations/ConvertToNATOAlphabet.mjs b/src/core/operations/ConvertToNATOAlphabet.mjs index ee3b50c9..39f98d4b 100644 --- a/src/core/operations/ConvertToNATOAlphabet.mjs +++ b/src/core/operations/ConvertToNATOAlphabet.mjs @@ -18,7 +18,8 @@ class ConvertToNATOAlphabet extends Operation { this.name = "Convert to NATO alphabet"; this.module = "Default"; - this.description = "Converts characters to their representation in the NATO phonetic alphabet."; + this.description = + "Converts characters to their representation in the NATO phonetic alphabet."; this.infoURL = "https://wikipedia.org/wiki/NATO_phonetic_alphabet"; this.inputType = "string"; this.outputType = "string"; @@ -31,49 +32,49 @@ class ConvertToNATOAlphabet extends Operation { * @returns {string} */ run(input, args) { - return input.replace(/[a-z0-9,/.]/ig, letter => { + return input.replace(/[a-z0-9,/.]/gi, (letter) => { return lookup[letter.toUpperCase()]; }); } } const lookup = { - "A": "Alfa ", - "B": "Bravo ", - "C": "Charlie ", - "D": "Delta ", - "E": "Echo ", - "F": "Foxtrot ", - "G": "Golf ", - "H": "Hotel ", - "I": "India ", - "J": "Juliett ", - "K": "Kilo ", - "L": "Lima ", - "M": "Mike ", - "N": "November ", - "O": "Oscar ", - "P": "Papa ", - "Q": "Quebec ", - "R": "Romeo ", - "S": "Sierra ", - "T": "Tango ", - "U": "Uniform ", - "V": "Victor ", - "W": "Whiskey ", - "X": "X-ray ", - "Y": "Yankee ", - "Z": "Zulu ", - "0": "Zero ", - "1": "One ", - "2": "Two ", - "3": "Three ", - "4": "Four ", - "5": "Five ", - "6": "Six ", - "7": "Seven ", - "8": "Eight ", - "9": "Nine ", + A: "Alfa ", + B: "Bravo ", + C: "Charlie ", + D: "Delta ", + E: "Echo ", + F: "Foxtrot ", + G: "Golf ", + H: "Hotel ", + I: "India ", + J: "Juliett ", + K: "Kilo ", + L: "Lima ", + M: "Mike ", + N: "November ", + O: "Oscar ", + P: "Papa ", + Q: "Quebec ", + R: "Romeo ", + S: "Sierra ", + T: "Tango ", + U: "Uniform ", + V: "Victor ", + W: "Whiskey ", + X: "X-ray ", + Y: "Yankee ", + Z: "Zulu ", + 0: "Zero ", + 1: "One ", + 2: "Two ", + 3: "Three ", + 4: "Four ", + 5: "Five ", + 6: "Six ", + 7: "Seven ", + 8: "Eight ", + 9: "Nine ", ",": "Comma ", "/": "Fraction bar ", ".": "Full stop ", diff --git a/src/core/operations/CountOccurrences.mjs b/src/core/operations/CountOccurrences.mjs index 36ee33a8..caa98b72 100644 --- a/src/core/operations/CountOccurrences.mjs +++ b/src/core/operations/CountOccurrences.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Count occurrences operation */ class CountOccurrences extends Operation { - /** * CountOccurrences constructor */ @@ -20,16 +19,21 @@ class CountOccurrences extends Operation { this.name = "Count occurrences"; this.module = "Default"; - this.description = "Counts the number of times the provided string occurs in the input."; + this.description = + "Counts the number of times the provided string occurs in the input."; this.inputType = "string"; this.outputType = "number"; this.args = [ { - "name": "Search string", - "type": "toggleString", - "value": "", - "toggleValues": ["Regex", "Extended (\\n, \\t, \\x...)", "Simple string"] - } + name: "Search string", + type: "toggleString", + value: "", + toggleValues: [ + "Regex", + "Extended (\\n, \\t, \\x...)", + "Simple string", + ], + }, ]; } @@ -59,7 +63,6 @@ class CountOccurrences extends Operation { return 0; } } - } export default CountOccurrences; diff --git a/src/core/operations/CoverImage.mjs b/src/core/operations/CoverImage.mjs index 07838ecf..2363d6a8 100644 --- a/src/core/operations/CoverImage.mjs +++ b/src/core/operations/CoverImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Cover Image operation */ class CoverImage extends Operation { - /** * CoverImage constructor */ @@ -24,7 +23,8 @@ class CoverImage extends Operation { this.name = "Cover Image"; this.module = "Image"; - this.description = "Scales the image to the given width and height, keeping the aspect ratio. The image may be clipped."; + this.description = + "Scales the image to the given width and height, keeping the aspect ratio. The image may be clipped."; this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -34,33 +34,25 @@ class CoverImage extends Operation { name: "Width", type: "number", value: 100, - min: 1 + min: 1, }, { name: "Height", type: "number", value: 100, - min: 1 + min: 1, }, { name: "Horizontal align", type: "option", - value: [ - "Left", - "Center", - "Right" - ], - defaultIndex: 1 + value: ["Left", "Center", "Right"], + defaultIndex: 1, }, { name: "Vertical align", type: "option", - value: [ - "Top", - "Middle", - "Bottom" - ], - defaultIndex: 1 + value: ["Top", "Middle", "Bottom"], + defaultIndex: 1, }, { name: "Resizing algorithm", @@ -70,10 +62,10 @@ class CoverImage extends Operation { "Bilinear", "Bicubic", "Hermite", - "Bezier" + "Bezier", ], - defaultIndex: 1 - } + defaultIndex: 1, + }, ]; } @@ -87,19 +79,19 @@ class CoverImage extends Operation { const resizeMap = { "Nearest Neighbour": jimp.RESIZE_NEAREST_NEIGHBOR, - "Bilinear": jimp.RESIZE_BILINEAR, - "Bicubic": jimp.RESIZE_BICUBIC, - "Hermite": jimp.RESIZE_HERMITE, - "Bezier": jimp.RESIZE_BEZIER + Bilinear: jimp.RESIZE_BILINEAR, + Bicubic: jimp.RESIZE_BICUBIC, + Hermite: jimp.RESIZE_HERMITE, + Bezier: jimp.RESIZE_BEZIER, }; const alignMap = { - "Left": jimp.HORIZONTAL_ALIGN_LEFT, - "Center": jimp.HORIZONTAL_ALIGN_CENTER, - "Right": jimp.HORIZONTAL_ALIGN_RIGHT, - "Top": jimp.VERTICAL_ALIGN_TOP, - "Middle": jimp.VERTICAL_ALIGN_MIDDLE, - "Bottom": jimp.VERTICAL_ALIGN_BOTTOM + Left: jimp.HORIZONTAL_ALIGN_LEFT, + Center: jimp.HORIZONTAL_ALIGN_CENTER, + Right: jimp.HORIZONTAL_ALIGN_RIGHT, + Top: jimp.VERTICAL_ALIGN_TOP, + Middle: jimp.VERTICAL_ALIGN_MIDDLE, + Bottom: jimp.VERTICAL_ALIGN_BOTTOM, }; if (!isImage(input)) { @@ -115,7 +107,12 @@ class CoverImage extends Operation { try { if (isWorkerEnvironment()) self.sendStatusMessage("Covering image..."); - image.cover(width, height, alignMap[hAlign] | alignMap[vAlign], resizeMap[alg]); + image.cover( + width, + height, + alignMap[hAlign] | alignMap[vAlign], + resizeMap[alg], + ); let imageBuffer; if (image.getMIME() === "image/gif") { imageBuffer = await image.getBufferAsync(jimp.MIME_PNG); @@ -144,7 +141,6 @@ class CoverImage extends Operation { return ``; } - } export default CoverImage; diff --git a/src/core/operations/CropImage.mjs b/src/core/operations/CropImage.mjs index 8b480080..c4c02064 100644 --- a/src/core/operations/CropImage.mjs +++ b/src/core/operations/CropImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Crop Image operation */ class CropImage extends Operation { - /** * CropImage constructor */ @@ -24,7 +23,8 @@ class CropImage extends Operation { this.name = "Crop Image"; this.module = "Image"; - this.description = "Crops an image to the specified region, or automatically crops edges.

Autocrop
Automatically crops same-colour borders from the image.

Autocrop tolerance
A percentage value for the tolerance of colour difference between pixels.

Only autocrop frames
Only crop real frames (all sides must have the same border)

Symmetric autocrop
Force autocrop to be symmetric (top/bottom and left/right are cropped by the same amount)

Autocrop keep border
The number of pixels of border to leave around the image."; + this.description = + "Crops an image to the specified region, or automatically crops edges.

Autocrop
Automatically crops same-colour borders from the image.

Autocrop tolerance
A percentage value for the tolerance of colour difference between pixels.

Only autocrop frames
Only crop real frames (all sides must have the same border)

Symmetric autocrop
Force autocrop to be symmetric (top/bottom and left/right are cropped by the same amount)

Autocrop keep border
The number of pixels of border to leave around the image."; this.infoURL = "https://wikipedia.org/wiki/Cropping_(image)"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -34,30 +34,30 @@ class CropImage extends Operation { name: "X Position", type: "number", value: 0, - min: 0 + min: 0, }, { name: "Y Position", type: "number", value: 0, - min: 0 + min: 0, }, { name: "Width", type: "number", value: 10, - min: 1 + min: 1, }, { name: "Height", type: "number", value: 10, - min: 1 + min: 1, }, { name: "Autocrop", type: "boolean", - value: false + value: false, }, { name: "Autocrop tolerance (%)", @@ -65,24 +65,24 @@ class CropImage extends Operation { value: 0.02, min: 0, max: 100, - step: 0.01 + step: 0.01, }, { name: "Only autocrop frames", type: "boolean", - value: true + value: true, }, { name: "Symmetric autocrop", type: "boolean", - value: false + value: false, }, { name: "Autocrop keep border (px)", type: "number", value: 0, - min: 0 - } + min: 0, + }, ]; } @@ -92,7 +92,17 @@ class CropImage extends Operation { * @returns {byteArray} */ async run(input, args) { - const [xPos, yPos, width, height, autocrop, autoTolerance, autoFrames, autoSymmetric, autoBorder] = args; + const [ + xPos, + yPos, + width, + height, + autocrop, + autoTolerance, + autoFrames, + autoSymmetric, + autoBorder, + ] = args; if (!isImage(input)) { throw new OperationError("Invalid file type."); } @@ -108,10 +118,10 @@ class CropImage extends Operation { self.sendStatusMessage("Cropping image..."); if (autocrop) { image.autocrop({ - tolerance: (autoTolerance / 100), + tolerance: autoTolerance / 100, cropOnlyFrames: autoFrames, cropSymmetric: autoSymmetric, - leaveBorder: autoBorder + leaveBorder: autoBorder, }); } else { image.crop(xPos, yPos, width, height); @@ -145,7 +155,6 @@ class CropImage extends Operation { return ``; } - } export default CropImage; diff --git a/src/core/operations/DESDecrypt.mjs b/src/core/operations/DESDecrypt.mjs index 856aa065..604aebef 100644 --- a/src/core/operations/DESDecrypt.mjs +++ b/src/core/operations/DESDecrypt.mjs @@ -13,7 +13,6 @@ import forge from "node-forge"; * DES Decrypt operation */ class DESDecrypt extends Operation { - /** * DESDecrypt constructor */ @@ -22,38 +21,47 @@ class DESDecrypt extends Operation { this.name = "DES Decrypt"; this.module = "Ciphers"; - this.description = "DES is a previously dominant algorithm for encryption, and was published as an official U.S. Federal Information Processing Standard (FIPS). It is now considered to be insecure due to its small key size.

Key: DES uses a key length of 8 bytes (64 bits).
Triple DES uses a key length of 24 bytes (192 bits).

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default."; + this.description = + "DES is a previously dominant algorithm for encryption, and was published as an official U.S. Federal Information Processing Standard (FIPS). It is now considered to be insecure due to its small key size.

Key: DES uses a key length of 8 bytes (64 bits).
Triple DES uses a key length of 24 bytes (192 bits).

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default."; this.infoURL = "https://wikipedia.org/wiki/Data_Encryption_Standard"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Mode", - "type": "option", - "value": ["CBC", "CFB", "OFB", "CTR", "ECB", "CBC/NoPadding", "ECB/NoPadding"] + name: "Mode", + type: "option", + value: [ + "CBC", + "CFB", + "OFB", + "CTR", + "ECB", + "CBC/NoPadding", + "ECB/NoPadding", + ], }, { - "name": "Input", - "type": "option", - "value": ["Hex", "Raw"] + name: "Input", + type: "option", + value: ["Hex", "Raw"], }, { - "name": "Output", - "type": "option", - "value": ["Raw", "Hex"] - } + name: "Output", + type: "option", + value: ["Raw", "Hex"], + }, ]; } @@ -67,7 +75,7 @@ class DESDecrypt extends Operation { iv = Utils.convertToByteArray(args[1].string, args[1].option), mode = args[2].substring(0, 3), noPadding = args[2].endsWith("NoPadding"), - [,,, inputType, outputType] = args; + [, , , inputType, outputType] = args; if (key.length !== 8) { throw new OperationError(`Invalid key length: ${key.length} bytes @@ -88,22 +96,25 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); /* Allow for a "no padding" mode */ if (noPadding) { - decipher.mode.unpad = function(output, options) { + decipher.mode.unpad = function (output, options) { return true; }; } - decipher.start({iv: iv}); + decipher.start({ iv: iv }); decipher.update(forge.util.createBuffer(input)); const result = decipher.finish(); if (result) { - return outputType === "Hex" ? decipher.output.toHex() : decipher.output.getBytes(); + return outputType === "Hex" + ? decipher.output.toHex() + : decipher.output.getBytes(); } else { - throw new OperationError("Unable to decrypt input with these parameters."); + throw new OperationError( + "Unable to decrypt input with these parameters.", + ); } } - } export default DESDecrypt; diff --git a/src/core/operations/DESEncrypt.mjs b/src/core/operations/DESEncrypt.mjs index 9472abe8..3d6d676b 100644 --- a/src/core/operations/DESEncrypt.mjs +++ b/src/core/operations/DESEncrypt.mjs @@ -13,7 +13,6 @@ import forge from "node-forge"; * DES Encrypt operation */ class DESEncrypt extends Operation { - /** * DESEncrypt constructor */ @@ -22,38 +21,39 @@ class DESEncrypt extends Operation { this.name = "DES Encrypt"; this.module = "Ciphers"; - this.description = "DES is a previously dominant algorithm for encryption, and was published as an official U.S. Federal Information Processing Standard (FIPS). It is now considered to be insecure due to its small key size.

Key: DES uses a key length of 8 bytes (64 bits).
Triple DES uses a key length of 24 bytes (192 bits).

You can generate a password-based key using one of the KDF operations.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used."; + this.description = + "DES is a previously dominant algorithm for encryption, and was published as an official U.S. Federal Information Processing Standard (FIPS). It is now considered to be insecure due to its small key size.

Key: DES uses a key length of 8 bytes (64 bits).
Triple DES uses a key length of 24 bytes (192 bits).

You can generate a password-based key using one of the KDF operations.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

Padding: In CBC and ECB mode, PKCS#7 padding will be used."; this.infoURL = "https://wikipedia.org/wiki/Data_Encryption_Standard"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Mode", - "type": "option", - "value": ["CBC", "CFB", "OFB", "CTR", "ECB"] + name: "Mode", + type: "option", + value: ["CBC", "CFB", "OFB", "CTR", "ECB"], }, { - "name": "Input", - "type": "option", - "value": ["Raw", "Hex"] + name: "Input", + type: "option", + value: ["Raw", "Hex"], }, { - "name": "Output", - "type": "option", - "value": ["Hex", "Raw"] - } + name: "Output", + type: "option", + value: ["Hex", "Raw"], + }, ]; } @@ -65,7 +65,7 @@ class DESEncrypt extends Operation { run(input, args) { const key = Utils.convertToByteString(args[0].string, args[0].option), iv = Utils.convertToByteArray(args[1].string, args[1].option), - [,, mode, inputType, outputType] = args; + [, , mode, inputType, outputType] = args; if (key.length !== 8) { throw new OperationError(`Invalid key length: ${key.length} bytes @@ -83,13 +83,14 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); input = Utils.convertToByteString(input, inputType); const cipher = forge.cipher.createCipher("DES-" + mode, key); - cipher.start({iv: iv}); + cipher.start({ iv: iv }); cipher.update(forge.util.createBuffer(input)); cipher.finish(); - return outputType === "Hex" ? cipher.output.toHex() : cipher.output.getBytes(); + return outputType === "Hex" + ? cipher.output.toHex() + : cipher.output.getBytes(); } - } export default DESEncrypt; diff --git a/src/core/operations/DNSOverHTTPS.mjs b/src/core/operations/DNSOverHTTPS.mjs index 87381226..abba02e4 100644 --- a/src/core/operations/DNSOverHTTPS.mjs +++ b/src/core/operations/DNSOverHTTPS.mjs @@ -10,7 +10,6 @@ import OperationError from "../errors/OperationError.mjs"; * DNS over HTTPS operation */ class DNSOverHTTPS extends Operation { - /** * DNSOverHTTPS constructor */ @@ -24,7 +23,7 @@ class DNSOverHTTPS extends Operation { "

", "By default, Cloudflare and Google DNS over HTTPS services are supported.", "

", - "Can be used with any service that supports the GET parameters name and type." + "Can be used with any service that supports the GET parameters name and type.", ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/DNS_over_HTTPS"; this.inputType = "string"; @@ -37,13 +36,13 @@ class DNSOverHTTPS extends Operation { value: [ { name: "Google", - value: "https://dns.google.com/resolve" + value: "https://dns.google.com/resolve", }, { name: "Cloudflare", - value: "https://cloudflare-dns.com/dns-query" - } - ] + value: "https://cloudflare-dns.com/dns-query", + }, + ], }, { name: "Request Type", @@ -71,19 +70,19 @@ class DNSOverHTTPS extends Operation { "TA", "TXT", "URI", - "ANY" - ] + "ANY", + ], }, { name: "Answer Data Only", type: "boolean", - value: false + value: false, }, { name: "Disable DNSSEC validation", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -98,25 +97,31 @@ class DNSOverHTTPS extends Operation { try { url = new URL(resolver); } catch (error) { - throw new OperationError(error.toString() + - "\n\nThis error could be caused by one of the following:\n" + - " - An invalid Resolver URL\n"); + throw new OperationError( + error.toString() + + "\n\nThis error could be caused by one of the following:\n" + + " - An invalid Resolver URL\n", + ); } - const params = {name: input, type: requestType, cd: DNSSEC}; + const params = { name: input, type: requestType, cd: DNSSEC }; url.search = new URLSearchParams(params); - return fetch(url, {headers: {"accept": "application/dns-json"}}).then(response => { - return response.json(); - }).then(data => { - if (justAnswer) { - return extractData(data.Answer); - } - return data; - }).catch(e => { - throw new OperationError(`Error making request to ${url}\n${e.toString()}`); - }); - + return fetch(url, { headers: { accept: "application/dns-json" } }) + .then((response) => { + return response.json(); + }) + .then((data) => { + if (justAnswer) { + return extractData(data.Answer); + } + return data; + }) + .catch((e) => { + throw new OperationError( + `Error making request to ${url}\n${e.toString()}`, + ); + }); } } @@ -128,11 +133,11 @@ class DNSOverHTTPS extends Operation { * @returns {JSON} */ function extractData(data) { - if (typeof(data) == "undefined") { + if (typeof data == "undefined") { return []; } else { const dataValues = []; - data.forEach(element => { + data.forEach((element) => { dataValues.push(element.data); }); return dataValues; diff --git a/src/core/operations/DechunkHTTPResponse.mjs b/src/core/operations/DechunkHTTPResponse.mjs index da2eb437..cb84fa94 100644 --- a/src/core/operations/DechunkHTTPResponse.mjs +++ b/src/core/operations/DechunkHTTPResponse.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Dechunk HTTP response operation */ class DechunkHTTPResponse extends Operation { - /** * DechunkHTTPResponse constructor */ @@ -19,17 +18,18 @@ class DechunkHTTPResponse extends Operation { this.name = "Dechunk HTTP response"; this.module = "Default"; - this.description = "Parses an HTTP response transferred using Transfer-Encoding: Chunked"; + this.description = + "Parses an HTTP response transferred using Transfer-Encoding: Chunked"; this.infoURL = "https://wikipedia.org/wiki/Chunked_transfer_encoding"; this.inputType = "string"; this.outputType = "string"; this.args = []; this.checks = [ { - pattern: "^[0-9A-F]+\r\n", - flags: "i", - args: [] - } + pattern: "^[0-9A-F]+\r\n", + flags: "i", + args: [], + }, ]; } @@ -41,7 +41,8 @@ class DechunkHTTPResponse extends Operation { run(input, args) { const chunks = []; let chunkSizeEnd = input.indexOf("\n") + 1; - const lineEndings = input.charAt(chunkSizeEnd - 2) === "\r" ? "\r\n" : "\n"; + const lineEndings = + input.charAt(chunkSizeEnd - 2) === "\r" ? "\r\n" : "\n"; const lineEndingsLength = lineEndings.length; let chunkSize = parseInt(input.slice(0, chunkSizeEnd), 16); while (!isNaN(chunkSize)) { @@ -52,7 +53,6 @@ class DechunkHTTPResponse extends Operation { } return chunks.join("") + input; } - } export default DechunkHTTPResponse; diff --git a/src/core/operations/DecodeNetBIOSName.mjs b/src/core/operations/DecodeNetBIOSName.mjs index c726f5d8..a991c869 100644 --- a/src/core/operations/DecodeNetBIOSName.mjs +++ b/src/core/operations/DecodeNetBIOSName.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Decode NetBIOS Name operation */ class DecodeNetBIOSName extends Operation { - /** * DecodeNetBIOSName constructor */ @@ -19,23 +18,24 @@ class DecodeNetBIOSName extends Operation { this.name = "Decode NetBIOS Name"; this.module = "Default"; - this.description = "NetBIOS names as seen across the client interface to NetBIOS are exactly 16 bytes long. Within the NetBIOS-over-TCP protocols, a longer representation is used.

There are two levels of encoding. The first level maps a NetBIOS name into a domain system name. The second level maps the domain system name into the 'compressed' representation required for interaction with the domain name system.

This operation decodes the first level of encoding. See RFC 1001 for full details."; + this.description = + "NetBIOS names as seen across the client interface to NetBIOS are exactly 16 bytes long. Within the NetBIOS-over-TCP protocols, a longer representation is used.

There are two levels of encoding. The first level maps a NetBIOS name into a domain system name. The second level maps the domain system name into the 'compressed' representation required for interaction with the domain name system.

This operation decodes the first level of encoding. See RFC 1001 for full details."; this.infoURL = "https://wikipedia.org/wiki/NetBIOS"; this.inputType = "byteArray"; this.outputType = "byteArray"; this.args = [ { - "name": "Offset", - "type": "number", - "value": 65 - } + name: "Offset", + type: "number", + value: 65, + }, ]; this.checks = [ { - pattern: "^\\s*\\S{32}$", - flags: "", - args: [65] - } + pattern: "^\\s*\\S{32}$", + flags: "", + args: [65], + }, ]; } @@ -48,10 +48,12 @@ class DecodeNetBIOSName extends Operation { const output = [], offset = args[0]; - if (input.length <= 32 && (input.length % 2) === 0) { + if (input.length <= 32 && input.length % 2 === 0) { for (let i = 0; i < input.length; i += 2) { - output.push((((input[i] & 0xff) - offset) << 4) | - (((input[i + 1] & 0xff) - offset) & 0xf)); + output.push( + (((input[i] & 0xff) - offset) << 4) | + (((input[i + 1] & 0xff) - offset) & 0xf), + ); } for (let i = output.length - 1; i > 0; i--) { if (output[i] === 32) output.splice(i, i); @@ -61,7 +63,6 @@ class DecodeNetBIOSName extends Operation { return output; } - } export default DecodeNetBIOSName; diff --git a/src/core/operations/DecodeText.mjs b/src/core/operations/DecodeText.mjs index 0fc9d2b5..23dfbef0 100644 --- a/src/core/operations/DecodeText.mjs +++ b/src/core/operations/DecodeText.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import cptable from "codepage"; -import {CHR_ENC_CODE_PAGES} from "../lib/ChrEnc.mjs"; +import { CHR_ENC_CODE_PAGES } from "../lib/ChrEnc.mjs"; /** * Decode text operation */ class DecodeText extends Operation { - /** * DecodeText constructor */ @@ -26,7 +25,9 @@ class DecodeText extends Operation { "

", "Supported charsets are:", "
    ", - Object.keys(CHR_ENC_CODE_PAGES).map(e => `
  • ${e}
  • `).join("\n"), + Object.keys(CHR_ENC_CODE_PAGES) + .map((e) => `
  • ${e}
  • `) + .join("\n"), "
", ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Character_encoding"; @@ -34,10 +35,10 @@ class DecodeText extends Operation { this.outputType = "string"; this.args = [ { - "name": "Encoding", - "type": "option", - "value": Object.keys(CHR_ENC_CODE_PAGES) - } + name: "Encoding", + type: "option", + value: Object.keys(CHR_ENC_CODE_PAGES), + }, ]; } @@ -50,7 +51,6 @@ class DecodeText extends Operation { const format = CHR_ENC_CODE_PAGES[args[0]]; return cptable.utils.decode(format, new Uint8Array(input)); } - } export default DecodeText; diff --git a/src/core/operations/DefangIPAddresses.mjs b/src/core/operations/DefangIPAddresses.mjs index a869f114..f971304a 100644 --- a/src/core/operations/DefangIPAddresses.mjs +++ b/src/core/operations/DefangIPAddresses.mjs @@ -6,12 +6,10 @@ import Operation from "../Operation.mjs"; - /** * Defang IP Addresses operation */ class DefangIPAddresses extends Operation { - /** * DefangIPAddresses constructor */ @@ -20,21 +18,25 @@ class DefangIPAddresses extends Operation { this.name = "Defang IP Addresses"; this.module = "Default"; - this.description = "Takes a IPv4 or IPv6 address and 'Defangs' it, meaning the IP becomes invalid, removing the risk of accidentally utilising it as an IP address."; - this.infoURL = "https://isc.sans.edu/forums/diary/Defang+all+the+things/22744/"; + this.description = + "Takes a IPv4 or IPv6 address and 'Defangs' it, meaning the IP becomes invalid, removing the risk of accidentally utilising it as an IP address."; + this.infoURL = + "https://isc.sans.edu/forums/diary/Defang+all+the+things/22744/"; this.inputType = "string"; this.outputType = "string"; this.args = []; this.checks = [ { - pattern: "^\\s*(([0-9]{1,3}\\.){3}[0-9]{1,3}|([0-9a-f]{4}:){7}[0-9a-f]{4})\\s*$", + pattern: + "^\\s*(([0-9]{1,3}\\.){3}[0-9]{1,3}|([0-9a-f]{4}:){7}[0-9a-f]{4})\\s*$", flags: "i", args: [], output: { - pattern: "^\\s*(([0-9]{1,3}\\[\\.\\]){3}[0-9]{1,3}|([0-9a-f]{4}\\[\\:\\]){7}[0-9a-f]{4})\\s*$", - flags: "i" - } - } + pattern: + "^\\s*(([0-9]{1,3}\\[\\.\\]){3}[0-9]{1,3}|([0-9a-f]{4}\\[\\:\\]){7}[0-9a-f]{4})\\s*$", + flags: "i", + }, + }, ]; } @@ -44,11 +46,11 @@ class DefangIPAddresses extends Operation { * @returns {string} */ run(input, args) { - input = input.replace(IPV4_REGEX, x => { + input = input.replace(IPV4_REGEX, (x) => { return x.replace(/\./g, "[.]"); }); - input = input.replace(IPV6_REGEX, x => { + input = input.replace(IPV6_REGEX, (x) => { return x.replace(/:/g, "[:]"); }); @@ -58,14 +60,18 @@ class DefangIPAddresses extends Operation { export default DefangIPAddresses; - /** * IPV4 regular expression */ -const IPV4_REGEX = new RegExp("(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", "g"); - +const IPV4_REGEX = new RegExp( + "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", + "g", +); /** * IPV6 regular expression */ -const IPV6_REGEX = new RegExp("((?=.*::)(?!.*::.+::)(::)?([\\dA-Fa-f]{1,4}:(:|\\b)|){5}|([\\dA-Fa-f]{1,4}:){6})((([\\dA-Fa-f]{1,4}((?!\\3)::|:\\b|(?![\\dA-Fa-f])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})", "g"); +const IPV6_REGEX = new RegExp( + "((?=.*::)(?!.*::.+::)(::)?([\\dA-Fa-f]{1,4}:(:|\\b)|){5}|([\\dA-Fa-f]{1,4}:){6})((([\\dA-Fa-f]{1,4}((?!\\3)::|:\\b|(?![\\dA-Fa-f])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})", + "g", +); diff --git a/src/core/operations/DefangURL.mjs b/src/core/operations/DefangURL.mjs index aa783c32..9af78d5d 100644 --- a/src/core/operations/DefangURL.mjs +++ b/src/core/operations/DefangURL.mjs @@ -6,13 +6,12 @@ */ import Operation from "../Operation.mjs"; -import {URL_REGEX, DOMAIN_REGEX} from "../lib/Extract.mjs"; +import { URL_REGEX, DOMAIN_REGEX } from "../lib/Extract.mjs"; /** * DefangURL operation */ class DefangURL extends Operation { - /** * DefangURL constructor */ @@ -21,31 +20,37 @@ class DefangURL extends Operation { this.name = "Defang URL"; this.module = "Default"; - this.description = "Takes a Universal Resource Locator (URL) and 'Defangs' it; meaning the URL becomes invalid, neutralising the risk of accidentally clicking on a malicious link.

This is often used when dealing with malicious links or IOCs.

Works well when combined with the 'Extract URLs' operation."; - this.infoURL = "https://isc.sans.edu/forums/diary/Defang+all+the+things/22744/"; + this.description = + "Takes a Universal Resource Locator (URL) and 'Defangs' it; meaning the URL becomes invalid, neutralising the risk of accidentally clicking on a malicious link.

This is often used when dealing with malicious links or IOCs.

Works well when combined with the 'Extract URLs' operation."; + this.infoURL = + "https://isc.sans.edu/forums/diary/Defang+all+the+things/22744/"; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Escape dots", type: "boolean", - value: true + value: true, }, { name: "Escape http", type: "boolean", - value: true + value: true, }, { name: "Escape ://", type: "boolean", - value: true + value: true, }, { name: "Process", type: "option", - value: ["Valid domains and full URLs", "Only full URLs", "Everything"] - } + value: [ + "Valid domains and full URLs", + "Only full URLs", + "Everything", + ], + }, ]; } @@ -59,15 +64,15 @@ class DefangURL extends Operation { switch (process) { case "Valid domains and full URLs": - input = input.replace(URL_REGEX, x => { + input = input.replace(URL_REGEX, (x) => { return defangURL(x, dots, http, slashes); }); - input = input.replace(DOMAIN_REGEX, x => { + input = input.replace(DOMAIN_REGEX, (x) => { return defangURL(x, dots, http, slashes); }); break; case "Only full URLs": - input = input.replace(URL_REGEX, x => { + input = input.replace(URL_REGEX, (x) => { return defangURL(x, dots, http, slashes); }); break; @@ -78,10 +83,8 @@ class DefangURL extends Operation { return input; } - } - /** * Defangs a given URL * diff --git a/src/core/operations/DeriveEVPKey.mjs b/src/core/operations/DeriveEVPKey.mjs index 5885f892..5eeb59af 100644 --- a/src/core/operations/DeriveEVPKey.mjs +++ b/src/core/operations/DeriveEVPKey.mjs @@ -12,7 +12,6 @@ import CryptoJS from "crypto-js"; * Derive EVP key operation */ class DeriveEVPKey extends Operation { - /** * DeriveEVPKey constructor */ @@ -21,38 +20,39 @@ class DeriveEVPKey extends Operation { this.name = "Derive EVP key"; this.module = "Ciphers"; - this.description = "This operation performs a password-based key derivation function (PBKDF) used extensively in OpenSSL. In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.

A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.

If you leave the salt argument empty, a random salt will be generated."; + this.description = + "This operation performs a password-based key derivation function (PBKDF) used extensively in OpenSSL. In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.

A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.

If you leave the salt argument empty, a random salt will be generated."; this.infoURL = "https://wikipedia.org/wiki/Key_derivation_function"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Passphrase", - "type": "toggleString", - "value": "", - "toggleValues": ["UTF8", "Latin1", "Hex", "Base64"] + name: "Passphrase", + type: "toggleString", + value: "", + toggleValues: ["UTF8", "Latin1", "Hex", "Base64"], }, { - "name": "Key size", - "type": "number", - "value": 128 + name: "Key size", + type: "number", + value: 128, }, { - "name": "Iterations", - "type": "number", - "value": 1 + name: "Iterations", + type: "number", + value: 1, }, { - "name": "Hashing function", - "type": "option", - "value": ["SHA1", "SHA256", "SHA384", "SHA512", "MD5"] + name: "Hashing function", + type: "option", + value: ["SHA1", "SHA256", "SHA384", "SHA512", "MD5"], }, { - "name": "Salt", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] - } + name: "Salt", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], + }, ]; } @@ -62,12 +62,16 @@ class DeriveEVPKey extends Operation { * @returns {string} */ run(input, args) { - const passphrase = Utils.convertToByteString(args[0].string, args[0].option), + const passphrase = Utils.convertToByteString( + args[0].string, + args[0].option, + ), keySize = args[1] / 32, iterations = args[2], hasher = args[3], salt = Utils.convertToByteString(args[4].string, args[4].option), - key = CryptoJS.EvpKDF(passphrase, salt, { // lgtm [js/insufficient-password-hash] + key = CryptoJS.EvpKDF(passphrase, salt, { + // lgtm [js/insufficient-password-hash] keySize: keySize, hasher: CryptoJS.algo[hasher], iterations: iterations, @@ -75,7 +79,6 @@ class DeriveEVPKey extends Operation { return key.toString(CryptoJS.enc.Hex); } - } export default DeriveEVPKey; @@ -106,21 +109,25 @@ CryptoJS.kdf.OpenSSL.execute = function (password, keySize, ivSize, salt) { // Generate random salt if no salt specified and not set to false // This line changed from `if (!salt) {` to the following if (salt === undefined || salt === null) { - salt = CryptoJS.lib.WordArray.random(64/8); + salt = CryptoJS.lib.WordArray.random(64 / 8); } // Derive key and IV - const key = CryptoJS.algo.EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + const key = CryptoJS.algo.EvpKDF.create({ + keySize: keySize + ivSize, + }).compute(password, salt); // Separate key and IV - const iv = CryptoJS.lib.WordArray.create(key.words.slice(keySize), ivSize * 4); + const iv = CryptoJS.lib.WordArray.create( + key.words.slice(keySize), + ivSize * 4, + ); key.sigBytes = keySize * 4; // Return params return CryptoJS.lib.CipherParams.create({ key: key, iv: iv, salt: salt }); }; - /** * Override for the CryptoJS Hex encoding parser to remove whitespace before attempting to parse * the hex string. @@ -138,7 +145,8 @@ CryptoJS.enc.Hex.parse = function (hexStr) { // Convert const words = []; for (let i = 0; i < hexStrLength; i += 2) { - words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + words[i >>> 3] |= + parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); } return new CryptoJS.lib.WordArray.init(words, hexStrLength / 2); diff --git a/src/core/operations/DeriveHKDFKey.mjs b/src/core/operations/DeriveHKDFKey.mjs index 3c594015..0c9d8670 100644 --- a/src/core/operations/DeriveHKDFKey.mjs +++ b/src/core/operations/DeriveHKDFKey.mjs @@ -13,7 +13,6 @@ import CryptoApi from "crypto-api/src/crypto-api.mjs"; * Derive HKDF Key operation */ class DeriveHKDFKey extends Operation { - /** * DeriveHKDFKey constructor */ @@ -22,27 +21,28 @@ class DeriveHKDFKey extends Operation { this.name = "Derive HKDF key"; this.module = "Crypto"; - this.description = "A simple Hashed Message Authenticaton Code (HMAC)-based key derivation function (HKDF), defined in RFC5869."; + this.description = + "A simple Hashed Message Authenticaton Code (HMAC)-based key derivation function (HKDF), defined in RFC5869."; this.infoURL = "https://wikipedia.org/wiki/HKDF"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Salt", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "Decimal", "Base64", "UTF8", "Latin1"] + name: "Salt", + type: "toggleString", + value: "", + toggleValues: ["Hex", "Decimal", "Base64", "UTF8", "Latin1"], }, { - "name": "Info", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "Decimal", "Base64", "UTF8", "Latin1"] + name: "Info", + type: "toggleString", + value: "", + toggleValues: ["Hex", "Decimal", "Base64", "UTF8", "Latin1"], }, { - "name": "Hashing function", - "type": "option", - "value": [ + name: "Hashing function", + type: "option", + value: [ "MD2", "MD4", "MD5", @@ -62,33 +62,33 @@ class DeriveHKDFKey extends Operation { "Whirlpool", "Whirlpool-0", "Whirlpool-T", - "Snefru" + "Snefru", ], - "defaultIndex": 6 + defaultIndex: 6, }, { - "name": "Extract mode", - "type": "argSelector", - "value": [ + name: "Extract mode", + type: "argSelector", + value: [ { - "name": "with salt", - "on": [0] + name: "with salt", + on: [0], }, { - "name": "no salt", - "off": [0] + name: "no salt", + off: [0], }, { - "name": "skip", - "off": [0] - } - ] + name: "skip", + off: [0], + }, + ], }, { - "name": "L (number of output octets)", - "type": "number", - "value": 16, - "min": 0 + name: "L (number of output octets)", + type: "number", + value: 16, + min: 0, }, ]; } @@ -99,8 +99,14 @@ class DeriveHKDFKey extends Operation { * @returns {ArrayBuffer} */ run(input, args) { - const argSalt = Utils.convertToByteString(args[0].string || "", args[0].option), - info = Utils.convertToByteString(args[1].string || "", args[1].option), + const argSalt = Utils.convertToByteString( + args[0].string || "", + args[0].option, + ), + info = Utils.convertToByteString( + args[1].string || "", + args[1].option, + ), hashFunc = args[2].toLowerCase(), extractMode = args[3], L = args[4], @@ -112,16 +118,23 @@ class DeriveHKDFKey extends Operation { throw new OperationError("L must be non-negative"); } if (L > 255 * HashLen) { - throw new OperationError("L too large (maximum length for " + args[2] + " is " + (255 * HashLen) + ")"); + throw new OperationError( + "L too large (maximum length for " + + args[2] + + " is " + + 255 * HashLen + + ")", + ); } - const hmacHash = function(key, data) { + const hmacHash = function (key, data) { hasher.reset(); const mac = CryptoApi.getHmac(key, hasher); mac.update(data); return mac.finalize(); }; - const salt = extractMode === "with salt" ? argSalt : "\0".repeat(HashLen); + const salt = + extractMode === "with salt" ? argSalt : "\0".repeat(HashLen); const PRK = extractMode === "skip" ? IKM : hmacHash(salt, IKM); let T = ""; let result = ""; @@ -132,7 +145,6 @@ class DeriveHKDFKey extends Operation { } return CryptoApi.encoder.toHex(result.substring(0, L)); } - } export default DeriveHKDFKey; diff --git a/src/core/operations/DerivePBKDF2Key.mjs b/src/core/operations/DerivePBKDF2Key.mjs index 98385dad..d5ab5dbb 100644 --- a/src/core/operations/DerivePBKDF2Key.mjs +++ b/src/core/operations/DerivePBKDF2Key.mjs @@ -12,7 +12,6 @@ import forge from "node-forge"; * Derive PBKDF2 key operation */ class DerivePBKDF2Key extends Operation { - /** * DerivePBKDF2Key constructor */ @@ -21,38 +20,39 @@ class DerivePBKDF2Key extends Operation { this.name = "Derive PBKDF2 key"; this.module = "Ciphers"; - this.description = "PBKDF2 is a password-based key derivation function. It is part of RSA Laboratories' Public-Key Cryptography Standards (PKCS) series, specifically PKCS #5 v2.0, also published as Internet Engineering Task Force's RFC 2898.

In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.

A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.

If you leave the salt argument empty, a random salt will be generated."; + this.description = + "PBKDF2 is a password-based key derivation function. It is part of RSA Laboratories' Public-Key Cryptography Standards (PKCS) series, specifically PKCS #5 v2.0, also published as Internet Engineering Task Force's RFC 2898.

In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.

A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.

If you leave the salt argument empty, a random salt will be generated."; this.infoURL = "https://wikipedia.org/wiki/PBKDF2"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Passphrase", - "type": "toggleString", - "value": "", - "toggleValues": ["UTF8", "Latin1", "Hex", "Base64"] + name: "Passphrase", + type: "toggleString", + value: "", + toggleValues: ["UTF8", "Latin1", "Hex", "Base64"], }, { - "name": "Key size", - "type": "number", - "value": 128 + name: "Key size", + type: "number", + value: 128, }, { - "name": "Iterations", - "type": "number", - "value": 1 + name: "Iterations", + type: "number", + value: 1, }, { - "name": "Hashing function", - "type": "option", - "value": ["SHA1", "SHA256", "SHA384", "SHA512", "MD5"] + name: "Hashing function", + type: "option", + value: ["SHA1", "SHA256", "SHA384", "SHA512", "MD5"], }, { - "name": "Salt", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] - } + name: "Salt", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], + }, ]; } @@ -62,17 +62,26 @@ class DerivePBKDF2Key extends Operation { * @returns {string} */ run(input, args) { - const passphrase = Utils.convertToByteString(args[0].string, args[0].option), + const passphrase = Utils.convertToByteString( + args[0].string, + args[0].option, + ), keySize = args[1], iterations = args[2], hasher = args[3], - salt = Utils.convertToByteString(args[4].string, args[4].option) || + salt = + Utils.convertToByteString(args[4].string, args[4].option) || forge.random.getBytesSync(keySize), - derivedKey = forge.pkcs5.pbkdf2(passphrase, salt, iterations, keySize / 8, hasher.toLowerCase()); + derivedKey = forge.pkcs5.pbkdf2( + passphrase, + salt, + iterations, + keySize / 8, + hasher.toLowerCase(), + ); return forge.util.bytesToHex(derivedKey); } - } export default DerivePBKDF2Key; diff --git a/src/core/operations/DetectFileType.mjs b/src/core/operations/DetectFileType.mjs index 58d13c31..1715c64f 100644 --- a/src/core/operations/DetectFileType.mjs +++ b/src/core/operations/DetectFileType.mjs @@ -5,21 +5,28 @@ */ import Operation from "../Operation.mjs"; -import {detectFileType} from "../lib/FileType.mjs"; -import {FILE_SIGNATURES} from "../lib/FileSignatures.mjs"; +import { detectFileType } from "../lib/FileType.mjs"; +import { FILE_SIGNATURES } from "../lib/FileSignatures.mjs"; // Concat all supported extensions into a single flat list -const exts = [].concat.apply([], Object.keys(FILE_SIGNATURES).map(cat => - [].concat.apply([], FILE_SIGNATURES[cat].map(sig => - sig.extension.split(",") - )) -)).unique().sort().join(", "); +const exts = [].concat + .apply( + [], + Object.keys(FILE_SIGNATURES).map((cat) => + [].concat.apply( + [], + FILE_SIGNATURES[cat].map((sig) => sig.extension.split(",")), + ), + ), + ) + .unique() + .sort() + .join(", "); /** * Detect File Type operation */ class DetectFileType extends Operation { - /** * DetectFileType constructor */ @@ -28,16 +35,18 @@ class DetectFileType extends Operation { this.name = "Detect File Type"; this.module = "Default"; - this.description = "Attempts to guess the MIME (Multipurpose Internet Mail Extensions) type of the data based on 'magic bytes'.

Currently supports the following file types: " + - exts + "."; + this.description = + "Attempts to guess the MIME (Multipurpose Internet Mail Extensions) type of the data based on 'magic bytes'.

Currently supports the following file types: " + + exts + + "."; this.infoURL = "https://wikipedia.org/wiki/List_of_file_signatures"; this.inputType = "ArrayBuffer"; this.outputType = "string"; - this.args = Object.keys(FILE_SIGNATURES).map(cat => { + this.args = Object.keys(FILE_SIGNATURES).map((cat) => { return { name: cat, type: "boolean", - value: true + value: true, }; }); } @@ -60,7 +69,7 @@ class DetectFileType extends Operation { if (!types.length) { return "Unknown file type. Have you tried checking the entropy of this data to determine whether it might be encrypted or compressed?"; } else { - const results = types.map(type => { + const results = types.map((type) => { let output = `File type: ${type.name} Extension: ${type.extension} MIME type: ${type.mime}\n`; @@ -75,7 +84,6 @@ MIME type: ${type.mime}\n`; return results.join("\n"); } } - } export default DetectFileType; diff --git a/src/core/operations/Diff.mjs b/src/core/operations/Diff.mjs index 9f180f86..e30ef85d 100644 --- a/src/core/operations/Diff.mjs +++ b/src/core/operations/Diff.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * Diff operation */ class Diff extends Operation { - /** * Diff constructor */ @@ -22,42 +21,43 @@ class Diff extends Operation { this.name = "Diff"; this.module = "Diff"; - this.description = "Compares two inputs (separated by the specified delimiter) and highlights the differences between them."; + this.description = + "Compares two inputs (separated by the specified delimiter) and highlights the differences between them."; this.infoURL = "https://wikipedia.org/wiki/File_comparison"; this.inputType = "string"; this.outputType = "html"; this.args = [ { - "name": "Sample delimiter", - "type": "binaryString", - "value": "\\n\\n" + name: "Sample delimiter", + type: "binaryString", + value: "\\n\\n", }, { - "name": "Diff by", - "type": "option", - "value": ["Character", "Word", "Line", "Sentence", "CSS", "JSON"] + name: "Diff by", + type: "option", + value: ["Character", "Word", "Line", "Sentence", "CSS", "JSON"], }, { - "name": "Show added", - "type": "boolean", - "value": true + name: "Show added", + type: "boolean", + value: true, }, { - "name": "Show removed", - "type": "boolean", - "value": true + name: "Show removed", + type: "boolean", + value: true, }, { - "name": "Show subtraction", - "type": "boolean", - "value": false + name: "Show subtraction", + type: "boolean", + value: false, }, { - "name": "Ignore whitespace", - "type": "boolean", - "value": false, - "hint": "Relevant for word and line" - } + name: "Ignore whitespace", + type: "boolean", + value: false, + hint: "Relevant for word and line", + }, ]; } @@ -73,7 +73,7 @@ class Diff extends Operation { showAdded, showRemoved, showSubtraction, - ignoreWhitespace + ignoreWhitespace, ] = args, samples = input.split(sampleDelim); let output = "", @@ -83,7 +83,9 @@ class Diff extends Operation { const jsdiff = JsDiff.default ? JsDiff.default : JsDiff; if (!samples || samples.length !== 2) { - throw new OperationError("Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?"); + throw new OperationError( + "Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?", + ); } switch (diffBy) { @@ -119,9 +121,13 @@ class Diff extends Operation { for (let i = 0; i < diff.length; i++) { if (diff[i].added) { - if (showAdded) output += "" + Utils.escapeHtml(diff[i].value) + ""; + if (showAdded) + output += + "" + Utils.escapeHtml(diff[i].value) + ""; } else if (diff[i].removed) { - if (showRemoved) output += "" + Utils.escapeHtml(diff[i].value) + ""; + if (showRemoved) + output += + "" + Utils.escapeHtml(diff[i].value) + ""; } else if (!showSubtraction) { output += Utils.escapeHtml(diff[i].value); } @@ -129,7 +135,6 @@ class Diff extends Operation { return output; } - } export default Diff; diff --git a/src/core/operations/DisassembleX86.mjs b/src/core/operations/DisassembleX86.mjs index bdaf348a..b041e330 100644 --- a/src/core/operations/DisassembleX86.mjs +++ b/src/core/operations/DisassembleX86.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Disassemble x86 operation */ class DisassembleX86 extends Operation { - /** * DisassembleX86 constructor */ @@ -21,49 +20,50 @@ class DisassembleX86 extends Operation { this.name = "Disassemble x86"; this.module = "Shellcode"; - this.description = "Disassembly is the process of translating machine language into assembly language.

This operation supports 64-bit, 32-bit and 16-bit code written for Intel or AMD x86 processors. It is particularly useful for reverse engineering shellcode.

Input should be in hexadecimal."; + this.description = + "Disassembly is the process of translating machine language into assembly language.

This operation supports 64-bit, 32-bit and 16-bit code written for Intel or AMD x86 processors. It is particularly useful for reverse engineering shellcode.

Input should be in hexadecimal."; this.infoURL = "https://wikipedia.org/wiki/X86"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Bit mode", - "type": "option", - "value": ["64", "32", "16"] + name: "Bit mode", + type: "option", + value: ["64", "32", "16"], }, { - "name": "Compatibility", - "type": "option", - "value": [ + name: "Compatibility", + type: "option", + value: [ "Full x86 architecture", "Knights Corner", "Larrabee", "Cyrix", "Geode", "Centaur", - "X86/486" - ] + "X86/486", + ], }, { - "name": "Code Segment (CS)", - "type": "number", - "value": 16 + name: "Code Segment (CS)", + type: "number", + value: 16, }, { - "name": "Offset (IP)", - "type": "number", - "value": 0 + name: "Offset (IP)", + type: "number", + value: 0, }, { - "name": "Show instruction hex", - "type": "boolean", - "value": true + name: "Show instruction hex", + type: "boolean", + value: true, }, { - "name": "Show instruction position", - "type": "boolean", - "value": true - } + name: "Show instruction position", + type: "boolean", + value: true, + }, ]; } @@ -81,7 +81,7 @@ class DisassembleX86 extends Operation { codeSegment, offset, showInstructionHex, - showInstructionPos + showInstructionPos, ] = args; switch (mode) { @@ -128,7 +128,6 @@ class DisassembleX86 extends Operation { disassemble.LoadBinCode(input.replace(/\s/g, "")); return disassemble.LDisassemble(); } - } export default DisassembleX86; diff --git a/src/core/operations/DitherImage.mjs b/src/core/operations/DitherImage.mjs index 6aef72dc..cd60c040 100644 --- a/src/core/operations/DitherImage.mjs +++ b/src/core/operations/DitherImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Image Dither operation */ class DitherImage extends Operation { - /** * DitherImage constructor */ @@ -61,7 +60,9 @@ class DitherImage extends Operation { } return imageBuffer.buffer; } catch (err) { - throw new OperationError(`Error applying dither to image. (${err})`); + throw new OperationError( + `Error applying dither to image. (${err})`, + ); } } @@ -81,7 +82,6 @@ class DitherImage extends Operation { return ``; } - } export default DitherImage; diff --git a/src/core/operations/Divide.mjs b/src/core/operations/Divide.mjs index 108c175b..2e17b6d4 100644 --- a/src/core/operations/Divide.mjs +++ b/src/core/operations/Divide.mjs @@ -10,12 +10,10 @@ import Operation from "../Operation.mjs"; import { div, createNumArray } from "../lib/Arithmetic.mjs"; import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; - /** * Divide operation */ class Divide extends Operation { - /** * Divide constructor */ @@ -24,15 +22,16 @@ class Divide extends Operation { this.name = "Divide"; this.module = "Default"; - this.description = "Divides a list of numbers. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 2.5"; + this.description = + "Divides a list of numbers. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 2.5"; this.inputType = "string"; this.outputType = "BigNumber"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, - } + name: "Delimiter", + type: "option", + value: ARITHMETIC_DELIM_OPTIONS, + }, ]; } @@ -45,7 +44,6 @@ class Divide extends Operation { const val = div(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Divide; diff --git a/src/core/operations/DropBytes.mjs b/src/core/operations/DropBytes.mjs index 9ea105f8..f7171e01 100644 --- a/src/core/operations/DropBytes.mjs +++ b/src/core/operations/DropBytes.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Drop bytes operation */ class DropBytes extends Operation { - /** * DropBytes constructor */ @@ -19,25 +18,26 @@ class DropBytes extends Operation { this.name = "Drop bytes"; this.module = "Default"; - this.description = "Cuts a slice of the specified number of bytes out of the data. Negative values are allowed."; + this.description = + "Cuts a slice of the specified number of bytes out of the data. Negative values are allowed."; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; this.args = [ { - "name": "Start", - "type": "number", - "value": 0 + name: "Start", + type: "number", + value: 0, }, { - "name": "Length", - "type": "number", - "value": 5 + name: "Length", + type: "number", + value: 5, }, { - "name": "Apply to each line", - "type": "boolean", - "value": false - } + name: "Apply to each line", + type: "boolean", + value: false, + }, ]; } @@ -54,11 +54,13 @@ class DropBytes extends Operation { const applyToEachLine = args[2]; if (!applyToEachLine) { - if (start < 0) { // Take from the end + if (start < 0) { + // Take from the end start = input.byteLength + start; } - if (length < 0) { // Flip start point + if (length < 0) { + // Flip start point start = start + length; if (start < 0) { start = input.byteLength + start; @@ -96,11 +98,13 @@ class DropBytes extends Operation { s = start, l = length; for (i = 0; i < lines.length; i++) { - if (s < 0) { // Take from the end + if (s < 0) { + // Take from the end s = lines[i].length + s; } - if (l < 0) { // Flip start point + if (l < 0) { + // Flip start point s = s + l; if (s < 0) { s = lines[i].length + s; @@ -110,14 +114,17 @@ class DropBytes extends Operation { } } - output = output.concat(lines[i].slice(0, s).concat(lines[i].slice(s+l, lines[i].length))); + output = output.concat( + lines[i] + .slice(0, s) + .concat(lines[i].slice(s + l, lines[i].length)), + ); output.push(0x0a); s = start; l = length; } - return new Uint8Array(output.slice(0, output.length-1)).buffer; + return new Uint8Array(output.slice(0, output.length - 1)).buffer; } - } export default DropBytes; diff --git a/src/core/operations/ELFInfo.mjs b/src/core/operations/ELFInfo.mjs index 815d3cf1..cace29fb 100644 --- a/src/core/operations/ELFInfo.mjs +++ b/src/core/operations/ELFInfo.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * ELF Info operation */ class ELFInfo extends Operation { - /** * ELFInfo constructor */ @@ -22,8 +21,10 @@ class ELFInfo extends Operation { this.name = "ELF Info"; this.module = "Default"; - this.description = "Implements readelf-like functionality. This operation will extract the ELF Header, Program Headers, Section Headers and Symbol Table for an ELF file."; - this.infoURL = "https://www.wikipedia.org/wiki/Executable_and_Linkable_Format"; + this.description = + "Implements readelf-like functionality. This operation will extract the ELF Header, Program Headers, Section Headers and Symbol Table for an ELF file."; + this.infoURL = + "https://www.wikipedia.org/wiki/Executable_and_Linkable_Format"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = []; @@ -116,15 +117,25 @@ class ELFInfo extends Operation { if (magic.join("") !== [0x7f, 0x45, 0x4c, 0x46].join("")) throw new OperationError("Invalid ELF"); - ehResult.push("Magic:".padEnd(align) + `${Utils.byteArrayToChars(magic)}`); + ehResult.push( + "Magic:".padEnd(align) + `${Utils.byteArrayToChars(magic)}`, + ); format = stream.readInt(1); - ehResult.push("Format:".padEnd(align) + `${format === 1 ? "32-bit" : "64-bit"}`); + ehResult.push( + "Format:".padEnd(align) + + `${format === 1 ? "32-bit" : "64-bit"}`, + ); endianness = stream.readInt(1) === 1 ? "le" : "be"; - ehResult.push("Endianness:".padEnd(align) + `${endianness === "le" ? "Little" : "Big"}`); + ehResult.push( + "Endianness:".padEnd(align) + + `${endianness === "le" ? "Little" : "Big"}`, + ); - ehResult.push("Version:".padEnd(align) + `${stream.readInt(1).toString()}`); + ehResult.push( + "Version:".padEnd(align) + `${stream.readInt(1).toString()}`, + ); let ABI = ""; switch (stream.readInt(1)) { @@ -155,22 +166,22 @@ class ELFInfo extends Operation { case 0x09: ABI = "FreeBSD"; break; - case 0x0A: + case 0x0a: ABI = "Tru64"; break; - case 0x0B: + case 0x0b: ABI = "Novell Modesto"; break; - case 0x0C: + case 0x0c: ABI = "OpenBSD"; break; - case 0x0D: + case 0x0d: ABI = "OpenVMS"; break; - case 0x0E: + case 0x0e: ABI = "NonStop Kernel"; break; - case 0x0F: + case 0x0f: ABI = "AROS"; break; case 0x10: @@ -211,16 +222,16 @@ class ELFInfo extends Operation { case 0x0004: eType = "Core File"; break; - case 0xFE00: + case 0xfe00: eType = "LOOS"; break; - case 0xFEFF: + case 0xfeff: eType = "HIOS"; break; - case 0xFF00: + case 0xff00: eType = "LOPROC"; break; - case 0xFFFF: + case 0xffff: eType = "HIPROC"; break; default: @@ -260,28 +271,28 @@ class ELFInfo extends Operation { case 0x0009: ISA = "IBM System/370"; break; - case 0x000A: + case 0x000a: ISA = "MIPS RS3000 Little-endian"; break; - case 0x000B: - case 0x000C: - case 0x000D: - case 0x000E: + case 0x000b: + case 0x000c: + case 0x000d: + case 0x000e: case 0x0018: case 0x0019: - case 0x001A: - case 0x001B: - case 0x001C: - case 0x001D: - case 0x001E: - case 0x001F: + case 0x001a: + case 0x001b: + case 0x001c: + case 0x001d: + case 0x001e: + case 0x001f: case 0x0020: case 0x0021: case 0x0022: case 0x0023: ISA = "Reserved for future use"; break; - case 0x000F: + case 0x000f: ISA = "Hewlett-Packard PA-RISC"; break; case 0x0011: @@ -323,22 +334,22 @@ class ELFInfo extends Operation { case 0x0029: ISA = "Digital Alpha"; break; - case 0x002A: + case 0x002a: ISA = "SuperH"; break; - case 0x002B: + case 0x002b: ISA = "SPARC Version 9"; break; - case 0x002C: + case 0x002c: ISA = "Siemens TriCore embedded processor"; break; - case 0x002D: + case 0x002d: ISA = "Argonaut RISC Core"; break; - case 0x002E: + case 0x002e: ISA = "Hitachi H8/300"; break; - case 0x002F: + case 0x002f: ISA = "Hitachi H8/300H"; break; case 0x0030: @@ -371,22 +382,23 @@ class ELFInfo extends Operation { case 0x0039: ISA = "Denso NDR1 microprocessor"; break; - case 0x003A: + case 0x003a: ISA = "Motorola Star*Core processor"; break; - case 0x003B: + case 0x003b: ISA = "Toyota ME16 processor"; break; - case 0x003C: + case 0x003c: ISA = "STMicroelectronics ST100 processor"; break; - case 0x003D: - ISA = "Advanced Logic Corp. TinyJ embedded processor family"; + case 0x003d: + ISA = + "Advanced Logic Corp. TinyJ embedded processor family"; break; - case 0x003E: + case 0x003e: ISA = "AMD x86-64"; break; - case 0x003F: + case 0x003f: ISA = "Sony DSP Processor"; break; case 0x0040: @@ -419,22 +431,22 @@ class ELFInfo extends Operation { case 0x0049: ISA = "Silicon Graphics SVx"; break; - case 0x004A: + case 0x004a: ISA = "STMicroelectronics ST19 8-bit microcontroller"; break; - case 0x004B: + case 0x004b: ISA = "Digital VAX"; break; - case 0x004C: + case 0x004c: ISA = "Axis Communications 32-bit embedded processor"; break; - case 0x004D: + case 0x004d: ISA = "Infineon Technologies 32-bit embedded processor"; break; - case 0x004E: + case 0x004e: ISA = "Element 14 64-bit DSP Processor"; break; - case 0x004F: + case 0x004f: ISA = "LSI Logic 16-bit DSP Processor"; break; case 0x0050: @@ -467,22 +479,22 @@ class ELFInfo extends Operation { case 0x0059: ISA = "Matsushita MN10300"; break; - case 0x005A: + case 0x005a: ISA = "Matsushita MN10200"; break; - case 0x005B: + case 0x005b: ISA = "picoJava"; break; - case 0x005C: + case 0x005c: ISA = "OpenRISC 32-bit embedded processor"; break; - case 0x005D: + case 0x005d: ISA = "ARC Cores Tangent-A5"; break; - case 0x005E: + case 0x005e: ISA = "Tensilica Xtensa Architecture"; break; - case 0x005F: + case 0x005f: ISA = "Alphamosaic VideoCore processor"; break; case 0x0060: @@ -498,21 +510,22 @@ class ELFInfo extends Operation { ISA = "Trebia SNP 1000 processor"; break; case 0x0064: - ISA = "STMicroelectronics (www.st.com) ST200 microcontroller"; + ISA = + "STMicroelectronics (www.st.com) ST200 microcontroller"; break; - case 0x008C: + case 0x008c: ISA = "TMS320C6000 Family"; break; - case 0x00AF: + case 0x00af: ISA = "MCST Elbrus e2k"; break; - case 0x00B7: + case 0x00b7: ISA = "ARM 64-bits (ARMv8/Aarch64)"; break; - case 0x00F3: + case 0x00f3: ISA = "RISC-V"; break; - case 0x00F7: + case 0x00f7: ISA = "Berkeley Packet Filter"; break; case 0x0101: @@ -524,25 +537,42 @@ class ELFInfo extends Operation { } ehResult.push("Instruction Set Architecture:".padEnd(align) + ISA); - ehResult.push("ELF Version:".padEnd(align) + `${stream.readInt(4, endianness)}`); + ehResult.push( + "ELF Version:".padEnd(align) + + `${stream.readInt(4, endianness)}`, + ); const readSize = format === 1 ? 4 : 8; entry = stream.readInt(readSize, endianness); phoff = stream.readInt(readSize, endianness); shoff = stream.readInt(readSize, endianness); - ehResult.push("Entry Point:".padEnd(align) + `0x${Utils.hex(entry)}`); - ehResult.push("Entry PHOFF:".padEnd(align) + `0x${Utils.hex(phoff)}`); - ehResult.push("Entry SHOFF:".padEnd(align) + `0x${Utils.hex(shoff)}`); + ehResult.push( + "Entry Point:".padEnd(align) + `0x${Utils.hex(entry)}`, + ); + ehResult.push( + "Entry PHOFF:".padEnd(align) + `0x${Utils.hex(phoff)}`, + ); + ehResult.push( + "Entry SHOFF:".padEnd(align) + `0x${Utils.hex(shoff)}`, + ); const flags = stream.readInt(4, endianness); ehResult.push("Flags:".padEnd(align) + `${Utils.bin(flags)}`); - ehResult.push("ELF Header Size:".padEnd(align) + `${stream.readInt(2, endianness)} bytes`); - ehResult.push("Program Header Size:".padEnd(align) + `${stream.readInt(2, endianness)} bytes`); + ehResult.push( + "ELF Header Size:".padEnd(align) + + `${stream.readInt(2, endianness)} bytes`, + ); + ehResult.push( + "Program Header Size:".padEnd(align) + + `${stream.readInt(2, endianness)} bytes`, + ); phEntries = stream.readInt(2, endianness); ehResult.push("Program Header Entries:".padEnd(align) + phEntries); shentSize = stream.readInt(2, endianness); - ehResult.push("Section Header Size:".padEnd(align) + shentSize + " bytes"); + ehResult.push( + "Section Header Size:".padEnd(align) + shentSize + " bytes", + ); shEntries = stream.readInt(2, endianness); ehResult.push("Section Header Entries:".padEnd(align) + shEntries); shstrtab = stream.readInt(2, endianness); @@ -590,14 +620,10 @@ class ELFInfo extends Operation { */ function readFlags(flags) { const result = []; - if (flags & 0x1) - result.push("Execute"); - if (flags & 0x2) - result.push("Write"); - if (flags & 0x4) - result.push("Read"); - if (flags & 0xf0000000) - result.push("Unspecified"); + if (flags & 0x1) result.push("Execute"); + if (flags & 0x2) result.push("Write"); + if (flags & 0x4) result.push("Read"); + if (flags & 0xf0000000) result.push("Unspecified"); return result.join(","); } @@ -606,54 +632,76 @@ class ELFInfo extends Operation { let pType = ""; const programHeaderType = stream.readInt(4, endianness); switch (true) { - case (programHeaderType === 0x00000000): + case programHeaderType === 0x00000000: pType = "Unused"; break; - case (programHeaderType === 0x00000001): + case programHeaderType === 0x00000001: pType = "Loadable Segment"; break; - case (programHeaderType === 0x00000002): + case programHeaderType === 0x00000002: pType = "Dynamic linking information"; break; - case (programHeaderType === 0x00000003): + case programHeaderType === 0x00000003: pType = "Interpreter Information"; break; - case (programHeaderType === 0x00000004): + case programHeaderType === 0x00000004: pType = "Auxiliary Information"; break; - case (programHeaderType === 0x00000005): + case programHeaderType === 0x00000005: pType = "Reserved"; break; - case (programHeaderType === 0x00000006): + case programHeaderType === 0x00000006: pType = "Program Header Table"; break; - case (programHeaderType === 0x00000007): + case programHeaderType === 0x00000007: pType = "Thread-Local Storage Template"; break; - case (programHeaderType >= 0x60000000 && programHeaderType <= 0x6FFFFFFF): + case programHeaderType >= 0x60000000 && + programHeaderType <= 0x6fffffff: pType = "Reserved Inclusive Range. OS Specific"; break; - case (programHeaderType >= 0x70000000 && programHeaderType <= 0x7FFFFFFF): + case programHeaderType >= 0x70000000 && + programHeaderType <= 0x7fffffff: pType = "Reserved Inclusive Range. Processor Specific"; break; default: break; - } phResult.push("Program Header Type:".padEnd(align) + pType); if (format === 2) - phResult.push("Flags:".padEnd(align) + readFlags(stream.readInt(4, endianness))); + phResult.push( + "Flags:".padEnd(align) + + readFlags(stream.readInt(4, endianness)), + ); - const readSize = format === 1? 4 : 8; - phResult.push("Offset Of Segment:".padEnd(align) + `${stream.readInt(readSize, endianness)}`); - phResult.push("Virtual Address of Segment:".padEnd(align) + `${stream.readInt(readSize, endianness)}`); - phResult.push("Physical Address of Segment:".padEnd(align) + `${stream.readInt(readSize, endianness)}`); - phResult.push("Size of Segment:".padEnd(align) + `${stream.readInt(readSize, endianness)} bytes`); - phResult.push("Size of Segment in Memory:".padEnd(align) + `${stream.readInt(readSize, endianness)} bytes`); + const readSize = format === 1 ? 4 : 8; + phResult.push( + "Offset Of Segment:".padEnd(align) + + `${stream.readInt(readSize, endianness)}`, + ); + phResult.push( + "Virtual Address of Segment:".padEnd(align) + + `${stream.readInt(readSize, endianness)}`, + ); + phResult.push( + "Physical Address of Segment:".padEnd(align) + + `${stream.readInt(readSize, endianness)}`, + ); + phResult.push( + "Size of Segment:".padEnd(align) + + `${stream.readInt(readSize, endianness)} bytes`, + ); + phResult.push( + "Size of Segment in Memory:".padEnd(align) + + `${stream.readInt(readSize, endianness)} bytes`, + ); if (format === 1) - phResult.push("Flags:".padEnd(align) + readFlags(stream.readInt(4, endianness))); + phResult.push( + "Flags:".padEnd(align) + + readFlags(stream.readInt(4, endianness)), + ); stream.moveForwardsBy(readSize); @@ -699,64 +747,64 @@ class ELFInfo extends Operation { let type = ""; const shType = stream.readInt(4, endianness); switch (true) { - case (shType === 0x00000001): + case shType === 0x00000001: type = "Program Data"; break; - case (shType === 0x00000002): + case shType === 0x00000002: type = "Symbol Table"; break; - case (shType === 0x00000003): + case shType === 0x00000003: type = "String Table"; break; - case (shType === 0x00000004): + case shType === 0x00000004: type = "Relocation Entries with Addens"; break; - case (shType === 0x00000005): + case shType === 0x00000005: type = "Symbol Hash Table"; break; - case (shType === 0x00000006): + case shType === 0x00000006: type = "Dynamic Linking Information"; break; - case (shType === 0x00000007): + case shType === 0x00000007: type = "Notes"; break; - case (shType === 0x00000008): + case shType === 0x00000008: type = "Program Space with No Data"; break; - case (shType === 0x00000009): + case shType === 0x00000009: type = "Relocation Entries with no Addens"; break; - case (shType === 0x0000000A): + case shType === 0x0000000a: type = "Reserved"; break; - case (shType === 0x0000000B): + case shType === 0x0000000b: type = "Dynamic Linker Symbol Table"; break; - case (shType === 0x0000000E): + case shType === 0x0000000e: type = "Array of Constructors"; break; - case (shType === 0x0000000F): + case shType === 0x0000000f: type = "Array of Destructors"; break; - case (shType === 0x00000010): + case shType === 0x00000010: type = "Array of pre-constructors"; break; - case (shType === 0x00000011): + case shType === 0x00000011: type = "Section group"; break; - case (shType === 0x00000012): + case shType === 0x00000012: type = "Extended section indices"; break; - case (shType === 0x00000013): + case shType === 0x00000013: type = "Number of defined types"; break; - case (shType >= 0x60000000 && shType <= 0x6fffffff): + case shType >= 0x60000000 && shType <= 0x6fffffff: type = "OS-specific"; break; - case (shType >= 0x70000000 && shType <= 0x7fffffff): + case shType >= 0x70000000 && shType <= 0x7fffffff: type = "Processor-specific"; break; - case (shType >= 0x80000000 && shType <= 0x8fffffff): + case shType >= 0x80000000 && shType <= 0x8fffffff: type = "Application-specific"; break; default: @@ -772,7 +820,7 @@ class ELFInfo extends Operation { shResult.push("Section Name: ".padEnd(align) + nameResult); } - const readSize = (format === 1) ? 4 : 8; + const readSize = format === 1 ? 4 : 8; const flags = stream.readInt(readSize, endianness); const shFlags = []; @@ -787,14 +835,13 @@ class ELFInfo extends Operation { [0x00000100, "OS Specific Handling"], [0x00000200, "Group"], [0x00000400, "Thread Local Data"], - [0x0FF00000, "OS-Specific"], - [0xF0000000, "Processor Specific"], + [0x0ff00000, "OS-Specific"], + [0xf0000000, "Processor Specific"], [0x04000000, "Special Ordering (Solaris)"], - [0x08000000, "Excluded (Solaris)"] + [0x08000000, "Excluded (Solaris)"], ]; - bitMasks.forEach(elem => { - if (flags & elem[0]) - shFlags.push(elem[1]); + bitMasks.forEach((elem) => { + if (flags & elem[0]) shFlags.push(elem[1]); }); shResult.push("Flags:".padEnd(align) + shFlags); @@ -808,10 +855,14 @@ class ELFInfo extends Operation { shResult.push("Section Size:".padEnd(align) + secSize); const associatedSection = stream.readInt(4, endianness); - shResult.push("Associated Section:".padEnd(align) + associatedSection); + shResult.push( + "Associated Section:".padEnd(align) + associatedSection, + ); const extraInfo = stream.readInt(4, endianness); - shResult.push("Section Extra Information:".padEnd(align) + extraInfo); + shResult.push( + "Section Extra Information:".padEnd(align) + extraInfo, + ); // Jump over alignment field. stream.moveForwardsBy(readSize); @@ -838,7 +889,7 @@ class ELFInfo extends Operation { */ function getNamesOffset(stream) { const preMove = stream.position; - stream.moveTo(shoff + (shentSize * shstrtab)); + stream.moveTo(shoff + shentSize * shstrtab); if (format === 1) { stream.moveForwardsBy(0x10); namesOffset = stream.readInt(4, endianness); @@ -901,13 +952,12 @@ class ELFInfo extends Operation { stream.moveTo(symtabOffset); let elem = ""; - for (let i = 0; i < (symtabSize / symtabEntSize); i++) + for (let i = 0; i < symtabSize / symtabEntSize; i++) if ((elem = getSymbols(stream)) !== "") result.push("Symbol Name:".padEnd(align) + elem); return result.join("\n"); } - } export default ELFInfo; diff --git a/src/core/operations/EncodeNetBIOSName.mjs b/src/core/operations/EncodeNetBIOSName.mjs index bcc9a11d..80062f06 100644 --- a/src/core/operations/EncodeNetBIOSName.mjs +++ b/src/core/operations/EncodeNetBIOSName.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Encode NetBIOS Name operation */ class EncodeNetBIOSName extends Operation { - /** * EncodeNetBIOSName constructor */ @@ -19,16 +18,17 @@ class EncodeNetBIOSName extends Operation { this.name = "Encode NetBIOS Name"; this.module = "Default"; - this.description = "NetBIOS names as seen across the client interface to NetBIOS are exactly 16 bytes long. Within the NetBIOS-over-TCP protocols, a longer representation is used.

There are two levels of encoding. The first level maps a NetBIOS name into a domain system name. The second level maps the domain system name into the 'compressed' representation required for interaction with the domain name system.

This operation carries out the first level of encoding. See RFC 1001 for full details."; + this.description = + "NetBIOS names as seen across the client interface to NetBIOS are exactly 16 bytes long. Within the NetBIOS-over-TCP protocols, a longer representation is used.

There are two levels of encoding. The first level maps a NetBIOS name into a domain system name. The second level maps the domain system name into the 'compressed' representation required for interaction with the domain name system.

This operation carries out the first level of encoding. See RFC 1001 for full details."; this.infoURL = "https://wikipedia.org/wiki/NetBIOS"; this.inputType = "byteArray"; this.outputType = "byteArray"; this.args = [ { - "name": "Offset", - "type": "number", - "value": 65 - } + name: "Offset", + type: "number", + value: 65, + }, ]; } @@ -52,9 +52,7 @@ class EncodeNetBIOSName extends Operation { } return output; - } - } export default EncodeNetBIOSName; diff --git a/src/core/operations/EncodeText.mjs b/src/core/operations/EncodeText.mjs index 8cc1450f..a539e96b 100644 --- a/src/core/operations/EncodeText.mjs +++ b/src/core/operations/EncodeText.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import cptable from "codepage"; -import {CHR_ENC_CODE_PAGES} from "../lib/ChrEnc.mjs"; +import { CHR_ENC_CODE_PAGES } from "../lib/ChrEnc.mjs"; /** * Encode text operation */ class EncodeText extends Operation { - /** * EncodeText constructor */ @@ -26,7 +25,9 @@ class EncodeText extends Operation { "

", "Supported charsets are:", "
    ", - Object.keys(CHR_ENC_CODE_PAGES).map(e => `
  • ${e}
  • `).join("\n"), + Object.keys(CHR_ENC_CODE_PAGES) + .map((e) => `
  • ${e}
  • `) + .join("\n"), "
", ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Character_encoding"; @@ -34,10 +35,10 @@ class EncodeText extends Operation { this.outputType = "ArrayBuffer"; this.args = [ { - "name": "Encoding", - "type": "option", - "value": Object.keys(CHR_ENC_CODE_PAGES) - } + name: "Encoding", + type: "option", + value: Object.keys(CHR_ENC_CODE_PAGES), + }, ]; } @@ -51,8 +52,6 @@ class EncodeText extends Operation { const encoded = cptable.utils.encode(format, input); return new Uint8Array(encoded).buffer; } - } - export default EncodeText; diff --git a/src/core/operations/Enigma.mjs b/src/core/operations/Enigma.mjs index c0a75841..12be1fdd 100644 --- a/src/core/operations/Enigma.mjs +++ b/src/core/operations/Enigma.mjs @@ -11,7 +11,16 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ROTORS, LETTERS, ROTORS_FOURTH, REFLECTORS, Rotor, Reflector, Plugboard, EnigmaMachine} from "../lib/Enigma.mjs"; +import { + ROTORS, + LETTERS, + ROTORS_FOURTH, + REFLECTORS, + Rotor, + Reflector, + Plugboard, + EnigmaMachine, +} from "../lib/Enigma.mjs"; /** * Enigma operation @@ -25,7 +34,8 @@ class Enigma extends Operation { this.name = "Enigma"; this.module = "Bletchley"; - this.description = "Encipher/decipher with the WW2 Enigma machine.

Enigma was used by the German military, among others, around the WW2 era as a portable cipher machine to protect sensitive military, diplomatic and commercial communications.

The standard set of German military rotors and reflectors are provided. To configure the plugboard, enter a string of connected pairs of letters, e.g. AB CD EF connects A to B, C to D, and E to F. This is also used to create your own reflectors. To create your own rotor, enter the letters that the rotor maps A to Z to, in order, optionally followed by < then a list of stepping points.
This is deliberately fairly permissive with rotor placements etc compared to a real Enigma (on which, for example, a four-rotor Enigma uses only the thin reflectors and the beta or gamma rotor in the 4th slot).

More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; + this.description = + "Encipher/decipher with the WW2 Enigma machine.

Enigma was used by the German military, among others, around the WW2 era as a portable cipher machine to protect sensitive military, diplomatic and commercial communications.

The standard set of German military rotors and reflectors are provided. To configure the plugboard, enter a string of connected pairs of letters, e.g. AB CD EF connects A to B, C to D, and E to F. This is also used to create your own reflectors. To create your own rotor, enter the letters that the rotor maps A to Z to, in order, optionally followed by < then a list of stepping points.
This is deliberately fairly permissive with rotor placements etc compared to a real Enigma (on which, for example, a four-rotor Enigma uses only the thin reflectors and the beta or gamma rotor in the 4th slot).

More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; this.infoURL = "https://wikipedia.org/wiki/Enigma_machine"; this.inputType = "string"; this.outputType = "string"; @@ -36,94 +46,94 @@ class Enigma extends Operation { value: [ { name: "3-rotor", - off: [1, 2, 3] + off: [1, 2, 3], }, { name: "4-rotor", - on: [1, 2, 3] - } - ] + on: [1, 2, 3], + }, + ], }, { name: "Left-most (4th) rotor", type: "editableOption", value: ROTORS_FOURTH, - defaultIndex: 0 + defaultIndex: 0, }, { name: "Left-most rotor ring setting", type: "option", - value: LETTERS + value: LETTERS, }, { name: "Left-most rotor initial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "Left-hand rotor", type: "editableOption", value: ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "Left-hand rotor ring setting", type: "option", - value: LETTERS + value: LETTERS, }, { name: "Left-hand rotor initial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "Middle rotor", type: "editableOption", value: ROTORS, - defaultIndex: 1 + defaultIndex: 1, }, { name: "Middle rotor ring setting", type: "option", - value: LETTERS + value: LETTERS, }, { name: "Middle rotor initial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "Right-hand rotor", type: "editableOption", value: ROTORS, // Default config is the rotors I-III *left to right* - defaultIndex: 2 + defaultIndex: 2, }, { name: "Right-hand rotor ring setting", type: "option", - value: LETTERS + value: LETTERS, }, { name: "Right-hand rotor initial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "Reflector", type: "editableOption", - value: REFLECTORS + value: REFLECTORS, }, { name: "Plugboard", type: "string", - value: "" + value: "", }, { name: "Strict output", hint: "Remove non-alphabet letters and group output", type: "boolean", - value: true + value: true, }, ]; } @@ -157,13 +167,23 @@ class Enigma extends Operation { const plugboardstr = args[14]; const removeOther = args[15]; const rotors = []; - for (let i=0; i<4; i++) { + for (let i = 0; i < 4; i++) { if (i === 0 && model === "3-rotor") { // Skip the 4th rotor settings continue; } - const [rotorwiring, rotorsteps] = this.parseRotorStr(args[i*3 + 1], 1); - rotors.push(new Rotor(rotorwiring, rotorsteps, args[i*3 + 2], args[i*3 + 3])); + const [rotorwiring, rotorsteps] = this.parseRotorStr( + args[i * 3 + 1], + 1, + ); + rotors.push( + new Rotor( + rotorwiring, + rotorsteps, + args[i * 3 + 2], + args[i * 3 + 3], + ), + ); } // Rotors are handled in reverse rotors.reverse(); @@ -211,7 +231,6 @@ class Enigma extends Operation { return pos; } } - } export default Enigma; diff --git a/src/core/operations/Entropy.mjs b/src/core/operations/Entropy.mjs index 296d5ee8..bdb9329a 100644 --- a/src/core/operations/Entropy.mjs +++ b/src/core/operations/Entropy.mjs @@ -10,13 +10,12 @@ import * as nodomtemp from "nodom"; import Operation from "../Operation.mjs"; const d3 = d3temp.default ? d3temp.default : d3temp; -const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp; +const nodom = nodomtemp.default ? nodomtemp.default : nodomtemp; /** * Entropy operation */ class Entropy extends Operation { - /** * Entropy constructor */ @@ -25,17 +24,25 @@ class Entropy extends Operation { this.name = "Entropy"; this.module = "Charts"; - this.description = "Shannon Entropy, in the context of information theory, is a measure of the rate at which information is produced by a source of data. It can be used, in a broad sense, to detect whether data is likely to be structured or unstructured. 8 is the maximum, representing highly unstructured, 'random' data. English language text usually falls somewhere between 3.5 and 5. Properly encrypted or compressed data should have an entropy of over 7.5."; - this.infoURL = "https://wikipedia.org/wiki/Entropy_(information_theory)"; + this.description = + "Shannon Entropy, in the context of information theory, is a measure of the rate at which information is produced by a source of data. It can be used, in a broad sense, to detect whether data is likely to be structured or unstructured. 8 is the maximum, representing highly unstructured, 'random' data. English language text usually falls somewhere between 3.5 and 5. Properly encrypted or compressed data should have an entropy of over 7.5."; + this.infoURL = + "https://wikipedia.org/wiki/Entropy_(information_theory)"; this.inputType = "ArrayBuffer"; this.outputType = "json"; this.presentType = "html"; this.args = [ { - "name": "Visualisation", - "type": "option", - "value": ["Shannon scale", "Histogram (Bar)", "Histogram (Line)", "Curve", "Image"] - } + name: "Visualisation", + type: "option", + value: [ + "Shannon scale", + "Histogram (Bar)", + "Histogram (Line)", + "Curve", + "Image", + ], + }, ]; } @@ -68,7 +75,7 @@ class Entropy extends Operation { for (i = 0; i < prob.length; i++) { p = prob[i]; - entropy += p * Math.log(p) / Math.log(2); + entropy += (p * Math.log(p)) / Math.log(2); } return -entropy; @@ -84,8 +91,12 @@ class Entropy extends Operation { const entropyData = []; const binWidth = inputBytes.length < 256 ? 8 : 256; - for (let bytePos = 0; bytePos < inputBytes.length; bytePos += binWidth) { - const block = inputBytes.slice(bytePos, bytePos+binWidth); + for ( + let bytePos = 0; + bytePos < inputBytes.length; + bytePos += binWidth + ) { + const block = inputBytes.slice(bytePos, bytePos + binWidth); entropyData.push(this.calculateShannonEntropy(block)); } @@ -104,13 +115,21 @@ class Entropy extends Operation { * @param {string} xTitle * @param {string} yTitle */ - createAxes(svg, xScale, yScale, svgHeight, svgWidth, margins, title, xTitle, yTitle) { + createAxes( + svg, + xScale, + yScale, + svgHeight, + svgWidth, + margins, + title, + xTitle, + yTitle, + ) { // Axes - const yAxis = d3.axisLeft() - .scale(yScale); + const yAxis = d3.axisLeft().scale(yScale); - const xAxis = d3.axisBottom() - .scale(xScale); + const xAxis = d3.axisBottom().scale(xScale); svg.append("g") .attr("transform", `translate(0, ${svgHeight - margins.bottom})`) @@ -124,19 +143,27 @@ class Entropy extends Operation { svg.append("text") .attr("transform", "rotate(-90)") .attr("y", 0 - margins.left) - .attr("x", 0 - (svgHeight / 2)) + .attr("x", 0 - svgHeight / 2) .attr("dy", "1em") .style("text-anchor", "middle") .text(yTitle); svg.append("text") - .attr("transform", `translate(${svgWidth / 2}, ${svgHeight - margins.bottom + 40})`) + .attr( + "transform", + `translate(${svgWidth / 2}, ${ + svgHeight - margins.bottom + 40 + })`, + ) .style("text-anchor", "middle") .text(xTitle); // Add title svg.append("text") - .attr("transform", `translate(${svgWidth / 2}, ${margins.top - 10})`) + .attr( + "transform", + `translate(${svgWidth / 2}, ${margins.top - 10})`, + ) .style("text-anchor", "middle") .text(title); } @@ -179,22 +206,26 @@ class Entropy extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); - const yScale = d3.scaleLinear() - .domain([0, d3.max(byteFrequency, d => d)]) + const yScale = d3 + .scaleLinear() + .domain([0, d3.max(byteFrequency, (d) => d)]) .range([svgHeight - margins.bottom, margins.top]); - const xScale = d3.scaleLinear() + const xScale = d3 + .scaleLinear() .domain([0, byteFrequency.length - 1]) .range([margins.left, svgWidth - margins.right]); - const line = d3.line() + const line = d3 + .line() .x((_, i) => xScale(i)) - .y(d => yScale(d)) + .y((d) => yScale(d)) .curve(d3.curveMonotoneX); svg.append("path") @@ -203,7 +234,17 @@ class Entropy extends Operation { .attr("stroke", "steelblue") .attr("d", line); - this.createAxes(svg, xScale, yScale, svgHeight, svgWidth, margins, "", "Byte", "Byte Frequency"); + this.createAxes( + svg, + xScale, + yScale, + svgHeight, + svgWidth, + margins, + "", + "Byte", + "Byte Frequency", + ); return svg._groups[0][0].outerHTML; } @@ -223,30 +264,47 @@ class Entropy extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); - const yExtent = d3.extent(byteFrequency, d => d); - const yScale = d3.scaleLinear() + const yExtent = d3.extent(byteFrequency, (d) => d); + const yScale = d3 + .scaleLinear() .domain(yExtent) .range([svgHeight - margins.bottom, margins.top]); - const xScale = d3.scaleLinear() + const xScale = d3 + .scaleLinear() .domain([0, byteFrequency.length - 1]) .range([margins.left - binWidth, svgWidth - margins.right]); svg.selectAll("rect") .data(byteFrequency) - .enter().append("rect") + .enter() + .append("rect") .attr("x", (_, i) => xScale(i) + binWidth) - .attr("y", dataPoint => yScale(dataPoint)) + .attr("y", (dataPoint) => yScale(dataPoint)) .attr("width", binWidth) - .attr("height", dataPoint => yScale(yExtent[0]) - yScale(dataPoint)) + .attr( + "height", + (dataPoint) => yScale(yExtent[0]) - yScale(dataPoint), + ) .attr("fill", "blue"); - this.createAxes(svg, xScale, yScale, svgHeight, svgWidth, margins, "", "Byte", "Byte Frequency"); + this.createAxes( + svg, + xScale, + yScale, + svgHeight, + svgWidth, + margins, + "", + "Byte", + "Byte Frequency", + ); return svg._groups[0][0].outerHTML; } @@ -265,33 +323,47 @@ class Entropy extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); - const yScale = d3.scaleLinear() - .domain([0, d3.max(entropyData, d => d)]) + const yScale = d3 + .scaleLinear() + .domain([0, d3.max(entropyData, (d) => d)]) .range([svgHeight - margins.bottom, margins.top]); - const xScale = d3.scaleLinear() + const xScale = d3 + .scaleLinear() .domain([0, entropyData.length]) .range([margins.left, svgWidth - margins.right]); - const line = d3.line() + const line = d3 + .line() .x((_, i) => xScale(i)) - .y(d => yScale(d)) + .y((d) => yScale(d)) .curve(d3.curveMonotoneX); if (entropyData.length > 0) { - svg.append("path") - .datum(entropyData) - .attr("d", line); + svg.append("path").datum(entropyData).attr("d", line); - svg.selectAll("path").attr("fill", "none").attr("stroke", "steelblue"); + svg.selectAll("path") + .attr("fill", "none") + .attr("stroke", "steelblue"); } - this.createAxes(svg, xScale, yScale, svgHeight, svgWidth, margins, "Scanning Entropy", "Block", "Entropy"); + this.createAxes( + svg, + xScale, + yScale, + svgHeight, + svgWidth, + margins, + "Scanning Entropy", + "Block", + "Entropy", + ); return svg._groups[0][0].outerHTML; } @@ -312,31 +384,33 @@ class Entropy extends Operation { nodes.push({ x: i % svgWidth, y: Math.floor(i / svgWidth), - entropy: entropyData[i] + entropy: entropyData[i], }); } const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); - const greyScale = d3.scaleLinear() - .domain([0, d3.max(entropyData, d => d)]) + const greyScale = d3 + .scaleLinear() + .domain([0, d3.max(entropyData, (d) => d)]) .range(["#000000", "#FFFFFF"]) .interpolate(d3.interpolateRgb); - svg - .selectAll("rect") + svg.selectAll("rect") .data(nodes) - .enter().append("rect") - .attr("x", d => d.x * cellSize) - .attr("y", d => d.y * cellSize) + .enter() + .append("rect") + .attr("x", (d) => d.x * cellSize) + .attr("y", (d) => d.y * cellSize) .attr("width", cellSize) .attr("height", cellSize) - .style("fill", d => greyScale(d.entropy)); + .style("fill", (d) => greyScale(d.entropy)); return svg._groups[0][0].outerHTML; } diff --git a/src/core/operations/EscapeString.mjs b/src/core/operations/EscapeString.mjs index 3ddea181..7db8d27c 100644 --- a/src/core/operations/EscapeString.mjs +++ b/src/core/operations/EscapeString.mjs @@ -12,7 +12,6 @@ import jsesc from "jsesc"; * Escape string operation */ class EscapeString extends Operation { - /** * EscapeString constructor */ @@ -21,36 +20,37 @@ class EscapeString extends Operation { this.name = "Escape string"; this.module = "Default"; - this.description = "Escapes special characters in a string so that they do not cause conflicts. For example, Don't stop me now becomes Don\\'t stop me now.

Supports the following escape sequences:
  • \\n (Line feed/newline)
  • \\r (Carriage return)
  • \\t (Horizontal tab)
  • \\b (Backspace)
  • \\f (Form feed)
  • \\xnn (Hex, where n is 0-f)
  • \\\\ (Backslash)
  • \\' (Single quote)
  • \\" (Double quote)
  • \\unnnn (Unicode character)
  • \\u{nnnnnn} (Unicode code point)
"; + this.description = + "Escapes special characters in a string so that they do not cause conflicts. For example, Don't stop me now becomes Don\\'t stop me now.

Supports the following escape sequences:
  • \\n (Line feed/newline)
  • \\r (Carriage return)
  • \\t (Horizontal tab)
  • \\b (Backspace)
  • \\f (Form feed)
  • \\xnn (Hex, where n is 0-f)
  • \\\\ (Backslash)
  • \\' (Single quote)
  • \\" (Double quote)
  • \\unnnn (Unicode character)
  • \\u{nnnnnn} (Unicode code point)
"; this.infoURL = "https://wikipedia.org/wiki/Escape_sequence"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Escape level", - "type": "option", - "value": ["Special chars", "Everything", "Minimal"] + name: "Escape level", + type: "option", + value: ["Special chars", "Everything", "Minimal"], }, { - "name": "Escape quote", - "type": "option", - "value": ["Single", "Double", "Backtick"] + name: "Escape quote", + type: "option", + value: ["Single", "Double", "Backtick"], }, { - "name": "JSON compatible", - "type": "boolean", - "value": false + name: "JSON compatible", + type: "boolean", + value: false, }, { - "name": "ES6 compatible", - "type": "boolean", - "value": true + name: "ES6 compatible", + type: "boolean", + value: true, }, { - "name": "Uppercase hex", - "type": "boolean", - "value": false - } + name: "Uppercase hex", + type: "boolean", + value: false, + }, ]; } @@ -82,7 +82,6 @@ class EscapeString extends Operation { lowercaseHex: lowercaseHex, }); } - } export default EscapeString; diff --git a/src/core/operations/EscapeUnicodeCharacters.mjs b/src/core/operations/EscapeUnicodeCharacters.mjs index db2680c0..49ea409a 100644 --- a/src/core/operations/EscapeUnicodeCharacters.mjs +++ b/src/core/operations/EscapeUnicodeCharacters.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Escape Unicode Characters operation */ class EscapeUnicodeCharacters extends Operation { - /** * EscapeUnicodeCharacters constructor */ @@ -19,47 +18,48 @@ class EscapeUnicodeCharacters extends Operation { this.name = "Escape Unicode Characters"; this.module = "Default"; - this.description = "Converts characters to their unicode-escaped notations.

Supports the prefixes:
  • \\u
  • %u
  • U+
e.g. σου becomes \\u03C3\\u03BF\\u03C5"; + this.description = + "Converts characters to their unicode-escaped notations.

Supports the prefixes:
  • \\u
  • %u
  • U+
e.g. σου becomes \\u03C3\\u03BF\\u03C5"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Prefix", - "type": "option", - "value": ["\\u", "%u", "U+"] + name: "Prefix", + type: "option", + value: ["\\u", "%u", "U+"], }, { - "name": "Encode all chars", - "type": "boolean", - "value": false + name: "Encode all chars", + type: "boolean", + value: false, }, { - "name": "Padding", - "type": "number", - "value": 4 + name: "Padding", + type: "number", + value: 4, }, { - "name": "Uppercase hex", - "type": "boolean", - "value": true - } + name: "Uppercase hex", + type: "boolean", + value: true, + }, ]; this.checks = [ { pattern: "\\\\u(?:[\\da-f]{4,6})", flags: "i", - args: ["\\u"] + args: ["\\u"], }, { pattern: "%u(?:[\\da-f]{4,6})", flags: "i", - args: ["%u"] + args: ["%u"], }, { pattern: "U\\+(?:[\\da-f]{4,6})", flags: "i", - args: ["U+"] - } + args: ["U+"], + }, ]; } @@ -90,7 +90,6 @@ class EscapeUnicodeCharacters extends Operation { return output; } - } export default EscapeUnicodeCharacters; diff --git a/src/core/operations/ExpandAlphabetRange.mjs b/src/core/operations/ExpandAlphabetRange.mjs index 62afeb65..f102cc15 100644 --- a/src/core/operations/ExpandAlphabetRange.mjs +++ b/src/core/operations/ExpandAlphabetRange.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Expand alphabet range operation */ class ExpandAlphabetRange extends Operation { - /** * ExpandAlphabetRange constructor */ @@ -20,15 +19,16 @@ class ExpandAlphabetRange extends Operation { this.name = "Expand alphabet range"; this.module = "Default"; - this.description = "Expand an alphabet range string into a list of the characters in that range.

e.g. a-z becomes abcdefghijklmnopqrstuvwxyz."; + this.description = + "Expand an alphabet range string into a list of the characters in that range.

e.g. a-z becomes abcdefghijklmnopqrstuvwxyz."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "binaryString", - "value": "" - } + name: "Delimiter", + type: "binaryString", + value: "", + }, ]; } @@ -40,7 +40,6 @@ class ExpandAlphabetRange extends Operation { run(input, args) { return Utils.expandAlphRange(input).join(args[0]); } - } export default ExpandAlphabetRange; diff --git a/src/core/operations/ExtractDates.mjs b/src/core/operations/ExtractDates.mjs index 74c177d3..4340565f 100644 --- a/src/core/operations/ExtractDates.mjs +++ b/src/core/operations/ExtractDates.mjs @@ -11,7 +11,6 @@ import { search } from "../lib/Extract.mjs"; * Extract dates operation */ class ExtractDates extends Operation { - /** * ExtractDates constructor */ @@ -20,15 +19,16 @@ class ExtractDates extends Operation { this.name = "Extract dates"; this.module = "Regex"; - this.description = "Extracts dates in the following formats
  • yyyy-mm-dd
  • dd/mm/yyyy
  • mm/dd/yyyy
Dividers can be any of /, -, . or space"; + this.description = + "Extracts dates in the following formats
  • yyyy-mm-dd
  • dd/mm/yyyy
  • mm/dd/yyyy
Dividers can be any of /, -, . or space"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Display total", - "type": "boolean", - "value": false - } + name: "Display total", + type: "boolean", + value: false, + }, ]; } @@ -39,9 +39,12 @@ class ExtractDates extends Operation { */ run(input, args) { const displayTotal = args[0], - date1 = "(?:19|20)\\d\\d[- /.](?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])", // yyyy-mm-dd - date2 = "(?:0[1-9]|[12][0-9]|3[01])[- /.](?:0[1-9]|1[012])[- /.](?:19|20)\\d\\d", // dd/mm/yyyy - date3 = "(?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\\d\\d", // mm/dd/yyyy + date1 = + "(?:19|20)\\d\\d[- /.](?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])", // yyyy-mm-dd + date2 = + "(?:0[1-9]|[12][0-9]|3[01])[- /.](?:0[1-9]|1[012])[- /.](?:19|20)\\d\\d", // dd/mm/yyyy + date3 = + "(?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\\d\\d", // mm/dd/yyyy regex = new RegExp(date1 + "|" + date2 + "|" + date3, "ig"); const results = search(input, regex); @@ -52,7 +55,6 @@ class ExtractDates extends Operation { return results.join("\n"); } } - } export default ExtractDates; diff --git a/src/core/operations/ExtractDomains.mjs b/src/core/operations/ExtractDomains.mjs index c28efbb5..f1cccc97 100644 --- a/src/core/operations/ExtractDomains.mjs +++ b/src/core/operations/ExtractDomains.mjs @@ -12,7 +12,6 @@ import { caseInsensitiveSort } from "../lib/Sort.mjs"; * Extract domains operation */ class ExtractDomains extends Operation { - /** * ExtractDomains constructor */ @@ -21,25 +20,26 @@ class ExtractDomains extends Operation { this.name = "Extract domains"; this.module = "Regex"; - this.description = "Extracts fully qualified domain names.
Note that this will not include paths. Use Extract URLs to find entire URLs."; + this.description = + "Extracts fully qualified domain names.
Note that this will not include paths. Use Extract URLs to find entire URLs."; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Display total", type: "boolean", - value: false + value: false, }, { name: "Sort", type: "boolean", - value: false + value: false, }, { name: "Unique", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -56,7 +56,7 @@ class ExtractDomains extends Operation { DOMAIN_REGEX, null, sort ? caseInsensitiveSort : null, - unique + unique, ); if (displayTotal) { @@ -65,7 +65,6 @@ class ExtractDomains extends Operation { return results.join("\n"); } } - } export default ExtractDomains; diff --git a/src/core/operations/ExtractEXIF.mjs b/src/core/operations/ExtractEXIF.mjs index 7edc8b80..e915de96 100644 --- a/src/core/operations/ExtractEXIF.mjs +++ b/src/core/operations/ExtractEXIF.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Extract EXIF operation */ class ExtractEXIF extends Operation { - /** * ExtractEXIF constructor */ @@ -54,10 +53,11 @@ class ExtractEXIF extends Operation { lines.unshift(`Found ${numTags} tags.\n`); return lines.join("\n"); } catch (err) { - throw new OperationError(`Could not extract EXIF data from image: ${err}`); + throw new OperationError( + `Could not extract EXIF data from image: ${err}`, + ); } } - } export default ExtractEXIF; diff --git a/src/core/operations/ExtractEmailAddresses.mjs b/src/core/operations/ExtractEmailAddresses.mjs index f50e1aaf..e6225788 100644 --- a/src/core/operations/ExtractEmailAddresses.mjs +++ b/src/core/operations/ExtractEmailAddresses.mjs @@ -12,7 +12,6 @@ import { caseInsensitiveSort } from "../lib/Sort.mjs"; * Extract email addresses operation */ class ExtractEmailAddresses extends Operation { - /** * ExtractEmailAddresses constructor */ @@ -28,18 +27,18 @@ class ExtractEmailAddresses extends Operation { { name: "Display total", type: "boolean", - value: false + value: false, }, { name: "Sort", type: "boolean", - value: false + value: false, }, { name: "Unique", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -51,14 +50,15 @@ class ExtractEmailAddresses extends Operation { run(input, args) { const [displayTotal, sort, unique] = args, // email regex from: https://www.regextester.com/98066 - regex = /(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?\.)+[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}\])/ig; + regex = + /(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?\.)+[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9](?:[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9-]*[\u00A0-\uD7FF\uE000-\uFFFFa-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}\])/gi; const results = search( input, regex, null, sort ? caseInsensitiveSort : null, - unique + unique, ); if (displayTotal) { @@ -67,7 +67,6 @@ class ExtractEmailAddresses extends Operation { return results.join("\n"); } } - } export default ExtractEmailAddresses; diff --git a/src/core/operations/ExtractFilePaths.mjs b/src/core/operations/ExtractFilePaths.mjs index 5de76fe5..d307b421 100644 --- a/src/core/operations/ExtractFilePaths.mjs +++ b/src/core/operations/ExtractFilePaths.mjs @@ -12,7 +12,6 @@ import { caseInsensitiveSort } from "../lib/Sort.mjs"; * Extract file paths operation */ class ExtractFilePaths extends Operation { - /** * ExtractFilePaths constructor */ @@ -21,35 +20,36 @@ class ExtractFilePaths extends Operation { this.name = "Extract file paths"; this.module = "Regex"; - this.description = "Extracts anything that looks like a Windows or UNIX file path.

Note that if UNIX is selected, there will likely be a lot of false positives."; + this.description = + "Extracts anything that looks like a Windows or UNIX file path.

Note that if UNIX is selected, there will likely be a lot of false positives."; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Windows", type: "boolean", - value: true + value: true, }, { name: "UNIX", type: "boolean", - value: true + value: true, }, { name: "Display total", type: "boolean", - value: false + value: false, }, { name: "Sort", type: "boolean", - value: false + value: false, }, { name: "Unique", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -59,12 +59,20 @@ class ExtractFilePaths extends Operation { * @returns {string} */ run(input, args) { - const [includeWinPath, includeUnixPath, displayTotal, sort, unique] = args, + const [includeWinPath, includeUnixPath, displayTotal, sort, unique] = + args, winDrive = "[A-Z]:\\\\", winName = "[A-Z\\d][A-Z\\d\\- '_\\(\\)~]{0,61}", winExt = "[A-Z\\d]{1,6}", - winPath = winDrive + "(?:" + winName + "\\\\?)*" + winName + - "(?:\\." + winExt + ")?", + winPath = + winDrive + + "(?:" + + winName + + "\\\\?)*" + + winName + + "(?:\\." + + winExt + + ")?", unixPath = "(?:/[A-Z\\d.][A-Z\\d\\-.]{0,61})+"; let filePaths = ""; @@ -86,7 +94,7 @@ class ExtractFilePaths extends Operation { regex, null, sort ? caseInsensitiveSort : null, - unique + unique, ); if (displayTotal) { @@ -94,9 +102,7 @@ class ExtractFilePaths extends Operation { } else { return results.join("\n"); } - } - } export default ExtractFilePaths; diff --git a/src/core/operations/ExtractFiles.mjs b/src/core/operations/ExtractFiles.mjs index 3ff8ffb6..cc286863 100644 --- a/src/core/operations/ExtractFiles.mjs +++ b/src/core/operations/ExtractFiles.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {scanForFileTypes, extractFile} from "../lib/FileType.mjs"; -import {FILE_SIGNATURES} from "../lib/FileSignatures.mjs"; +import { scanForFileTypes, extractFile } from "../lib/FileType.mjs"; +import { FILE_SIGNATURES } from "../lib/FileSignatures.mjs"; /** * Extract Files operation */ class ExtractFiles extends Operation { - /** * ExtractFiles constructor */ @@ -22,10 +21,10 @@ class ExtractFiles extends Operation { super(); // Get the first extension for each signature that can be extracted - let supportedExts = Object.keys(FILE_SIGNATURES).map(cat => { + let supportedExts = Object.keys(FILE_SIGNATURES).map((cat) => { return FILE_SIGNATURES[cat] - .filter(sig => sig.extractor) - .map(sig => sig.extension.toUpperCase()); + .filter((sig) => sig.extractor) + .map((sig) => sig.extension.toUpperCase()); }); // Flatten categories and remove duplicates @@ -43,24 +42,26 @@ class ExtractFiles extends Operation { this.inputType = "ArrayBuffer"; this.outputType = "List"; this.presentType = "html"; - this.args = Object.keys(FILE_SIGNATURES).map(cat => { - return { - name: cat, - type: "boolean", - value: cat === "Miscellaneous" ? false : true - }; - }).concat([ - { - name: "Ignore failed extractions", - type: "boolean", - value: true - }, - { - name: "Minimum File Size", - type: "number", - value: 100 - } - ]); + this.args = Object.keys(FILE_SIGNATURES) + .map((cat) => { + return { + name: cat, + type: "boolean", + value: cat === "Miscellaneous" ? false : true, + }; + }) + .concat([ + { + name: "Ignore failed extractions", + type: "boolean", + value: true, + }, + { + name: "Minimum File Size", + type: "number", + value: 100, + }, + ]); } /** @@ -84,17 +85,23 @@ class ExtractFiles extends Operation { // Extract each file that we support const files = []; const errors = []; - detectedFiles.forEach(detectedFile => { + detectedFiles.forEach((detectedFile) => { try { - const file = extractFile(bytes, detectedFile.fileDetails, detectedFile.offset); - if (file.size >= minSize) - files.push(file); + const file = extractFile( + bytes, + detectedFile.fileDetails, + detectedFile.offset, + ); + if (file.size >= minSize) files.push(file); } catch (err) { - if (!ignoreFailedExtractions && err.message.indexOf("No extraction algorithm available") < 0) { + if ( + !ignoreFailedExtractions && + err.message.indexOf("No extraction algorithm available") < 0 + ) { errors.push( `Error while attempting to extract ${detectedFile.fileDetails.name} ` + - `at offset ${detectedFile.offset}:\n` + - `${err.message}` + `at offset ${detectedFile.offset}:\n` + + `${err.message}`, ); } } @@ -107,7 +114,6 @@ class ExtractFiles extends Operation { return files; } - /** * Displays the files in HTML for web apps. * @@ -117,7 +123,6 @@ class ExtractFiles extends Operation { async present(files) { return await Utils.displayFilesAsHTML(files); } - } export default ExtractFiles; diff --git a/src/core/operations/ExtractID3.mjs b/src/core/operations/ExtractID3.mjs index b06bdcfe..5437a0d0 100644 --- a/src/core/operations/ExtractID3.mjs +++ b/src/core/operations/ExtractID3.mjs @@ -13,7 +13,6 @@ import Utils from "../Utils.mjs"; * Extract ID3 operation */ class ExtractID3 extends Operation { - /** * ExtractID3 constructor */ @@ -22,7 +21,8 @@ class ExtractID3 extends Operation { this.name = "Extract ID3"; this.module = "Default"; - this.description = "This operation extracts ID3 metadata from an MP3 file.

ID3 is a metadata container most often used in conjunction with the MP3 audio file format. It allows information such as the title, artist, album, track number, and other information about the file to be stored in the file itself."; + this.description = + "This operation extracts ID3 metadata from an MP3 file.

ID3 is a metadata container most often used in conjunction with the MP3 audio file format. It allows information such as the title, artist, album, track number, and other information about the file to be stored in the file itself."; this.infoURL = "https://wikipedia.org/wiki/ID3"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -46,11 +46,11 @@ class ExtractID3 extends Operation { throw new OperationError("No valid ID3 header."); const header = { - "Type": "ID3", + Type: "ID3", // Tag version - "Version": input[3].toString() + "." + input[4].toString(), + Version: input[3].toString() + "." + input[4].toString(), // Header version - "Flags": input[5].toString() + Flags: input[5].toString(), }; input = input.slice(6); @@ -67,7 +67,7 @@ class ExtractID3 extends Operation { let result = 0; // The sizes are 7 bit numbers stored in 8 bit locations - for (let i = (num) * 7; i; i -= 7) { + for (let i = num * 7; i; i -= 7) { result = (result << i) | input[0]; input = input.slice(1); } @@ -111,9 +111,11 @@ class ExtractID3 extends Operation { // While the current element is in the header while (pos < headerTagSize) { - // Frame Identifier of frame - let id = String.fromCharCode(input[0]) + String.fromCharCode(input[1]) + String.fromCharCode(input[2]); + let id = + String.fromCharCode(input[0]) + + String.fromCharCode(input[1]) + + String.fromCharCode(input[2]); input = input.slice(3); // If the next character is non-zero it is an identifier @@ -126,7 +128,8 @@ class ExtractID3 extends Operation { const [frame, size] = readFrame(id); tags[id] = frame; pos += 10 + size; - } else if (id === "\x00\x00\x00") { // end of header + } else if (id === "\x00\x00\x00") { + // end of header break; } else { throw new OperationError("Unknown Frame Identifier: " + id); @@ -153,172 +156,173 @@ class ExtractID3 extends Operation { for (const tagID in data.Tags) { const description = data.Tags[tagID].Description, contents = data.Tags[tagID].Data; - output += `${tagID}${Utils.escapeHtml(description)}${Utils.escapeHtml(contents)}`; + output += `${tagID}${Utils.escapeHtml( + description, + )}${Utils.escapeHtml(contents)}`; } output += ""; return output; } - } // Borrowed from https://github.com/aadsm/jsmediatags const FRAME_DESCRIPTIONS = { // v2.2 - "BUF": "Recommended buffer size", - "CNT": "Play counter", - "COM": "Comments", - "CRA": "Audio encryption", - "CRM": "Encrypted meta frame", - "ETC": "Event timing codes", - "EQU": "Equalization", - "GEO": "General encapsulated object", - "IPL": "Involved people list", - "LNK": "Linked information", - "MCI": "Music CD Identifier", - "MLL": "MPEG location lookup table", - "PIC": "Attached picture", - "POP": "Popularimeter", - "REV": "Reverb", - "RVA": "Relative volume adjustment", - "SLT": "Synchronized lyric/text", - "STC": "Synced tempo codes", - "TAL": "Album/Movie/Show title", - "TBP": "BPM (Beats Per Minute)", - "TCM": "Composer", - "TCO": "Content type", - "TCR": "Copyright message", - "TDA": "Date", - "TDY": "Playlist delay", - "TEN": "Encoded by", - "TFT": "File type", - "TIM": "Time", - "TKE": "Initial key", - "TLA": "Language(s)", - "TLE": "Length", - "TMT": "Media type", - "TOA": "Original artist(s)/performer(s)", - "TOF": "Original filename", - "TOL": "Original Lyricist(s)/text writer(s)", - "TOR": "Original release year", - "TOT": "Original album/Movie/Show title", - "TP1": "Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group", - "TP2": "Band/Orchestra/Accompaniment", - "TP3": "Conductor/Performer refinement", - "TP4": "Interpreted, remixed, or otherwise modified by", - "TPA": "Part of a set", - "TPB": "Publisher", - "TRC": "ISRC (International Standard Recording Code)", - "TRD": "Recording dates", - "TRK": "Track number/Position in set", - "TSI": "Size", - "TSS": "Software/hardware and settings used for encoding", - "TT1": "Content group description", - "TT2": "Title/Songname/Content description", - "TT3": "Subtitle/Description refinement", - "TXT": "Lyricist/text writer", - "TXX": "User defined text information frame", - "TYE": "Year", - "UFI": "Unique file identifier", - "ULT": "Unsychronized lyric/text transcription", - "WAF": "Official audio file webpage", - "WAR": "Official artist/performer webpage", - "WAS": "Official audio source webpage", - "WCM": "Commercial information", - "WCP": "Copyright/Legal information", - "WPB": "Publishers official webpage", - "WXX": "User defined URL link frame", + BUF: "Recommended buffer size", + CNT: "Play counter", + COM: "Comments", + CRA: "Audio encryption", + CRM: "Encrypted meta frame", + ETC: "Event timing codes", + EQU: "Equalization", + GEO: "General encapsulated object", + IPL: "Involved people list", + LNK: "Linked information", + MCI: "Music CD Identifier", + MLL: "MPEG location lookup table", + PIC: "Attached picture", + POP: "Popularimeter", + REV: "Reverb", + RVA: "Relative volume adjustment", + SLT: "Synchronized lyric/text", + STC: "Synced tempo codes", + TAL: "Album/Movie/Show title", + TBP: "BPM (Beats Per Minute)", + TCM: "Composer", + TCO: "Content type", + TCR: "Copyright message", + TDA: "Date", + TDY: "Playlist delay", + TEN: "Encoded by", + TFT: "File type", + TIM: "Time", + TKE: "Initial key", + TLA: "Language(s)", + TLE: "Length", + TMT: "Media type", + TOA: "Original artist(s)/performer(s)", + TOF: "Original filename", + TOL: "Original Lyricist(s)/text writer(s)", + TOR: "Original release year", + TOT: "Original album/Movie/Show title", + TP1: "Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group", + TP2: "Band/Orchestra/Accompaniment", + TP3: "Conductor/Performer refinement", + TP4: "Interpreted, remixed, or otherwise modified by", + TPA: "Part of a set", + TPB: "Publisher", + TRC: "ISRC (International Standard Recording Code)", + TRD: "Recording dates", + TRK: "Track number/Position in set", + TSI: "Size", + TSS: "Software/hardware and settings used for encoding", + TT1: "Content group description", + TT2: "Title/Songname/Content description", + TT3: "Subtitle/Description refinement", + TXT: "Lyricist/text writer", + TXX: "User defined text information frame", + TYE: "Year", + UFI: "Unique file identifier", + ULT: "Unsychronized lyric/text transcription", + WAF: "Official audio file webpage", + WAR: "Official artist/performer webpage", + WAS: "Official audio source webpage", + WCM: "Commercial information", + WCP: "Copyright/Legal information", + WPB: "Publishers official webpage", + WXX: "User defined URL link frame", // v2.3 - "AENC": "Audio encryption", - "APIC": "Attached picture", - "ASPI": "Audio seek point index", - "CHAP": "Chapter", - "CTOC": "Table of contents", - "COMM": "Comments", - "COMR": "Commercial frame", - "ENCR": "Encryption method registration", - "EQU2": "Equalisation (2)", - "EQUA": "Equalization", - "ETCO": "Event timing codes", - "GEOB": "General encapsulated object", - "GRID": "Group identification registration", - "IPLS": "Involved people list", - "LINK": "Linked information", - "MCDI": "Music CD identifier", - "MLLT": "MPEG location lookup table", - "OWNE": "Ownership frame", - "PRIV": "Private frame", - "PCNT": "Play counter", - "POPM": "Popularimeter", - "POSS": "Position synchronisation frame", - "RBUF": "Recommended buffer size", - "RVA2": "Relative volume adjustment (2)", - "RVAD": "Relative volume adjustment", - "RVRB": "Reverb", - "SEEK": "Seek frame", - "SYLT": "Synchronized lyric/text", - "SYTC": "Synchronized tempo codes", - "TALB": "Album/Movie/Show title", - "TBPM": "BPM (beats per minute)", - "TCOM": "Composer", - "TCON": "Content type", - "TCOP": "Copyright message", - "TDAT": "Date", - "TDLY": "Playlist delay", - "TDRC": "Recording time", - "TDRL": "Release time", - "TDTG": "Tagging time", - "TENC": "Encoded by", - "TEXT": "Lyricist/Text writer", - "TFLT": "File type", - "TIME": "Time", - "TIPL": "Involved people list", - "TIT1": "Content group description", - "TIT2": "Title/songname/content description", - "TIT3": "Subtitle/Description refinement", - "TKEY": "Initial key", - "TLAN": "Language(s)", - "TLEN": "Length", - "TMCL": "Musician credits list", - "TMED": "Media type", - "TMOO": "Mood", - "TOAL": "Original album/movie/show title", - "TOFN": "Original filename", - "TOLY": "Original lyricist(s)/text writer(s)", - "TOPE": "Original artist(s)/performer(s)", - "TORY": "Original release year", - "TOWN": "File owner/licensee", - "TPE1": "Lead performer(s)/Soloist(s)", - "TPE2": "Band/orchestra/accompaniment", - "TPE3": "Conductor/performer refinement", - "TPE4": "Interpreted, remixed, or otherwise modified by", - "TPOS": "Part of a set", - "TPRO": "Produced notice", - "TPUB": "Publisher", - "TRCK": "Track number/Position in set", - "TRDA": "Recording dates", - "TRSN": "Internet radio station name", - "TRSO": "Internet radio station owner", - "TSOA": "Album sort order", - "TSOP": "Performer sort order", - "TSOT": "Title sort order", - "TSIZ": "Size", - "TSRC": "ISRC (international standard recording code)", - "TSSE": "Software/Hardware and settings used for encoding", - "TSST": "Set subtitle", - "TYER": "Year", - "TXXX": "User defined text information frame", - "UFID": "Unique file identifier", - "USER": "Terms of use", - "USLT": "Unsychronized lyric/text transcription", - "WCOM": "Commercial information", - "WCOP": "Copyright/Legal information", - "WOAF": "Official audio file webpage", - "WOAR": "Official artist/performer webpage", - "WOAS": "Official audio source webpage", - "WORS": "Official internet radio station homepage", - "WPAY": "Payment", - "WPUB": "Publishers official webpage", - "WXXX": "User defined URL link frame" + AENC: "Audio encryption", + APIC: "Attached picture", + ASPI: "Audio seek point index", + CHAP: "Chapter", + CTOC: "Table of contents", + COMM: "Comments", + COMR: "Commercial frame", + ENCR: "Encryption method registration", + EQU2: "Equalisation (2)", + EQUA: "Equalization", + ETCO: "Event timing codes", + GEOB: "General encapsulated object", + GRID: "Group identification registration", + IPLS: "Involved people list", + LINK: "Linked information", + MCDI: "Music CD identifier", + MLLT: "MPEG location lookup table", + OWNE: "Ownership frame", + PRIV: "Private frame", + PCNT: "Play counter", + POPM: "Popularimeter", + POSS: "Position synchronisation frame", + RBUF: "Recommended buffer size", + RVA2: "Relative volume adjustment (2)", + RVAD: "Relative volume adjustment", + RVRB: "Reverb", + SEEK: "Seek frame", + SYLT: "Synchronized lyric/text", + SYTC: "Synchronized tempo codes", + TALB: "Album/Movie/Show title", + TBPM: "BPM (beats per minute)", + TCOM: "Composer", + TCON: "Content type", + TCOP: "Copyright message", + TDAT: "Date", + TDLY: "Playlist delay", + TDRC: "Recording time", + TDRL: "Release time", + TDTG: "Tagging time", + TENC: "Encoded by", + TEXT: "Lyricist/Text writer", + TFLT: "File type", + TIME: "Time", + TIPL: "Involved people list", + TIT1: "Content group description", + TIT2: "Title/songname/content description", + TIT3: "Subtitle/Description refinement", + TKEY: "Initial key", + TLAN: "Language(s)", + TLEN: "Length", + TMCL: "Musician credits list", + TMED: "Media type", + TMOO: "Mood", + TOAL: "Original album/movie/show title", + TOFN: "Original filename", + TOLY: "Original lyricist(s)/text writer(s)", + TOPE: "Original artist(s)/performer(s)", + TORY: "Original release year", + TOWN: "File owner/licensee", + TPE1: "Lead performer(s)/Soloist(s)", + TPE2: "Band/orchestra/accompaniment", + TPE3: "Conductor/performer refinement", + TPE4: "Interpreted, remixed, or otherwise modified by", + TPOS: "Part of a set", + TPRO: "Produced notice", + TPUB: "Publisher", + TRCK: "Track number/Position in set", + TRDA: "Recording dates", + TRSN: "Internet radio station name", + TRSO: "Internet radio station owner", + TSOA: "Album sort order", + TSOP: "Performer sort order", + TSOT: "Title sort order", + TSIZ: "Size", + TSRC: "ISRC (international standard recording code)", + TSSE: "Software/Hardware and settings used for encoding", + TSST: "Set subtitle", + TYER: "Year", + TXXX: "User defined text information frame", + UFID: "Unique file identifier", + USER: "Terms of use", + USLT: "Unsychronized lyric/text transcription", + WCOM: "Commercial information", + WCOP: "Copyright/Legal information", + WOAF: "Official audio file webpage", + WOAR: "Official artist/performer webpage", + WOAS: "Official audio source webpage", + WORS: "Official internet radio station homepage", + WPAY: "Payment", + WPUB: "Publishers official webpage", + WXXX: "User defined URL link frame", }; export default ExtractID3; diff --git a/src/core/operations/ExtractIPAddresses.mjs b/src/core/operations/ExtractIPAddresses.mjs index 97b52478..8dd9c677 100644 --- a/src/core/operations/ExtractIPAddresses.mjs +++ b/src/core/operations/ExtractIPAddresses.mjs @@ -12,7 +12,6 @@ import { ipSort } from "../lib/Sort.mjs"; * Extract IP addresses operation */ class ExtractIPAddresses extends Operation { - /** * ExtractIPAddresses constructor */ @@ -21,40 +20,41 @@ class ExtractIPAddresses extends Operation { this.name = "Extract IP addresses"; this.module = "Regex"; - this.description = "Extracts all IPv4 and IPv6 addresses.

Warning: Given a string 710.65.0.456, this will match 10.65.0.45 so always check the original input!"; + this.description = + "Extracts all IPv4 and IPv6 addresses.

Warning: Given a string 710.65.0.456, this will match 10.65.0.45 so always check the original input!"; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "IPv4", type: "boolean", - value: true + value: true, }, { name: "IPv6", type: "boolean", - value: false + value: false, }, { name: "Remove local IPv4 addresses", type: "boolean", - value: false + value: false, }, { name: "Display total", type: "boolean", - value: false + value: false, }, { name: "Sort", type: "boolean", - value: false + value: false, }, { name: "Unique", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -64,10 +64,19 @@ class ExtractIPAddresses extends Operation { * @returns {string} */ run(input, args) { - const [includeIpv4, includeIpv6, removeLocal, displayTotal, sort, unique] = args, - ipv4 = "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", - ipv6 = "((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})(([\\dA-F]{1,4}((?!\\3)::|:\\b|(?![\\dA-F])))|(?!\\2\\3)){2}"; - let ips = ""; + const [ + includeIpv4, + includeIpv6, + removeLocal, + displayTotal, + sort, + unique, + ] = args, + ipv4 = + "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", + ipv6 = + "((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})(([\\dA-F]{1,4}((?!\\3)::|:\\b|(?![\\dA-F])))|(?!\\2\\3)){2}"; + let ips = ""; if (includeIpv4 && includeIpv6) { ips = ipv4 + "|" + ipv6; @@ -85,15 +94,24 @@ class ExtractIPAddresses extends Operation { oneninetwo = "192\\.168\\..+", oneseventwo = "172\\.(?:1[6-9]|2\\d|3[01])\\..+", onetwoseven = "127\\..+", - removeRegex = new RegExp("^(?:" + ten + "|" + oneninetwo + - "|" + oneseventwo + "|" + onetwoseven + ")"); + removeRegex = new RegExp( + "^(?:" + + ten + + "|" + + oneninetwo + + "|" + + oneseventwo + + "|" + + onetwoseven + + ")", + ); const results = search( input, regex, removeLocal ? removeRegex : null, sort ? ipSort : null, - unique + unique, ); if (displayTotal) { @@ -102,7 +120,6 @@ class ExtractIPAddresses extends Operation { return results.join("\n"); } } - } export default ExtractIPAddresses; diff --git a/src/core/operations/ExtractLSB.mjs b/src/core/operations/ExtractLSB.mjs index 12f990da..d9b2eb82 100644 --- a/src/core/operations/ExtractLSB.mjs +++ b/src/core/operations/ExtractLSB.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Extract LSB operation */ class ExtractLSB extends Operation { - /** * ExtractLSB constructor */ @@ -24,8 +23,10 @@ class ExtractLSB extends Operation { this.name = "Extract LSB"; this.module = "Image"; - this.description = "Extracts the Least Significant Bit data from each pixel in an image. This is a common way to hide data in Steganography."; - this.infoURL = "https://wikipedia.org/wiki/Bit_numbering#Least_significant_bit_in_digital_steganography"; + this.description = + "Extracts the Least Significant Bit data from each pixel in an image. This is a common way to hide data in Steganography."; + this.infoURL = + "https://wikipedia.org/wiki/Bit_numbering#Least_significant_bit_in_digital_steganography"; this.inputType = "ArrayBuffer"; this.outputType = "byteArray"; this.args = [ @@ -57,8 +58,8 @@ class ExtractLSB extends Operation { { name: "Bit", type: "number", - value: 0 - } + value: 0, + }, ]; } @@ -68,21 +69,27 @@ class ExtractLSB extends Operation { * @returns {byteArray} */ async run(input, args) { - if (!isImage(input)) throw new OperationError("Please enter a valid image file."); + if (!isImage(input)) + throw new OperationError("Please enter a valid image file."); const bit = 7 - args.pop(), pixelOrder = args.pop(), - colours = args.filter(option => option !== "").map(option => COLOUR_OPTIONS.indexOf(option)), + colours = args + .filter((option) => option !== "") + .map((option) => COLOUR_OPTIONS.indexOf(option)), parsedImage = await jimp.read(input), width = parsedImage.bitmap.width, height = parsedImage.bitmap.height, rgba = parsedImage.bitmap.data; if (bit < 0 || bit > 7) { - throw new OperationError("Error: Bit argument must be between 0 and 7"); + throw new OperationError( + "Error: Bit argument must be between 0 and 7", + ); } - let i, combinedBinary = ""; + let i, + combinedBinary = ""; if (pixelOrder === "Row") { for (i = 0; i < rgba.length; i += 4) { @@ -106,7 +113,6 @@ class ExtractLSB extends Operation { return fromBinary(combinedBinary); } - } const COLOUR_OPTIONS = ["R", "G", "B", "A"]; diff --git a/src/core/operations/ExtractMACAddresses.mjs b/src/core/operations/ExtractMACAddresses.mjs index 1689d18f..a9034e32 100644 --- a/src/core/operations/ExtractMACAddresses.mjs +++ b/src/core/operations/ExtractMACAddresses.mjs @@ -12,7 +12,6 @@ import { hexadecimalSort } from "../lib/Sort.mjs"; * Extract MAC addresses operation */ class ExtractMACAddresses extends Operation { - /** * ExtractMACAddresses constructor */ @@ -21,25 +20,26 @@ class ExtractMACAddresses extends Operation { this.name = "Extract MAC addresses"; this.module = "Regex"; - this.description = "Extracts all Media Access Control (MAC) addresses from the input."; + this.description = + "Extracts all Media Access Control (MAC) addresses from the input."; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Display total", type: "boolean", - value: false + value: false, }, { name: "Sort", type: "boolean", - value: false + value: false, }, { name: "Unique", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -50,13 +50,13 @@ class ExtractMACAddresses extends Operation { */ run(input, args) { const [displayTotal, sort, unique] = args, - regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/ig, + regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/gi, results = search( input, regex, null, sort ? hexadecimalSort : null, - unique + unique, ); if (displayTotal) { @@ -65,7 +65,6 @@ class ExtractMACAddresses extends Operation { return results.join("\n"); } } - } export default ExtractMACAddresses; diff --git a/src/core/operations/ExtractRGBA.mjs b/src/core/operations/ExtractRGBA.mjs index 7d2fc274..65538e41 100644 --- a/src/core/operations/ExtractRGBA.mjs +++ b/src/core/operations/ExtractRGBA.mjs @@ -9,13 +9,12 @@ import OperationError from "../errors/OperationError.mjs"; import { isImage } from "../lib/FileType.mjs"; import jimp from "jimp"; -import {RGBA_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { RGBA_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Extract RGBA operation */ class ExtractRGBA extends Operation { - /** * ExtractRGBA constructor */ @@ -24,7 +23,8 @@ class ExtractRGBA extends Operation { this.name = "Extract RGBA"; this.module = "Image"; - this.description = "Extracts each pixel's RGBA value in an image. These are sometimes used in Steganography to hide text or data."; + this.description = + "Extracts each pixel's RGBA value in an image. These are sometimes used in Steganography to hide text or data."; this.infoURL = "https://wikipedia.org/wiki/RGBA_color_space"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -32,13 +32,13 @@ class ExtractRGBA extends Operation { { name: "Delimiter", type: "editableOption", - value: RGBA_DELIM_OPTIONS + value: RGBA_DELIM_OPTIONS, }, { name: "Include Alpha", type: "boolean", - value: true - } + value: true, + }, ]; } @@ -48,18 +48,20 @@ class ExtractRGBA extends Operation { * @returns {string} */ async run(input, args) { - if (!isImage(input)) throw new OperationError("Please enter a valid image file."); + if (!isImage(input)) + throw new OperationError("Please enter a valid image file."); const delimiter = args[0], includeAlpha = args[1], parsedImage = await jimp.read(input); let bitmap = parsedImage.bitmap.data; - bitmap = includeAlpha ? bitmap : bitmap.filter((val, idx) => idx % 4 !== 3); + bitmap = includeAlpha + ? bitmap + : bitmap.filter((val, idx) => idx % 4 !== 3); return bitmap.join(delimiter); } - } export default ExtractRGBA; diff --git a/src/core/operations/ExtractURLs.mjs b/src/core/operations/ExtractURLs.mjs index 32cdb3a7..a5bed952 100644 --- a/src/core/operations/ExtractURLs.mjs +++ b/src/core/operations/ExtractURLs.mjs @@ -12,7 +12,6 @@ import { caseInsensitiveSort } from "../lib/Sort.mjs"; * Extract URLs operation */ class ExtractURLs extends Operation { - /** * ExtractURLs constructor */ @@ -21,25 +20,26 @@ class ExtractURLs extends Operation { this.name = "Extract URLs"; this.module = "Regex"; - this.description = "Extracts Uniform Resource Locators (URLs) from the input. The protocol (http, ftp etc.) is required otherwise there will be far too many false positives."; + this.description = + "Extracts Uniform Resource Locators (URLs) from the input. The protocol (http, ftp etc.) is required otherwise there will be far too many false positives."; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Display total", type: "boolean", - value: false + value: false, }, { name: "Sort", type: "boolean", - value: false + value: false, }, { name: "Unique", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -55,7 +55,7 @@ class ExtractURLs extends Operation { URL_REGEX, null, sort ? caseInsensitiveSort : null, - unique + unique, ); if (displayTotal) { @@ -64,7 +64,6 @@ class ExtractURLs extends Operation { return results.join("\n"); } } - } export default ExtractURLs; diff --git a/src/core/operations/FernetDecrypt.mjs b/src/core/operations/FernetDecrypt.mjs index 78d6efb9..15671610 100644 --- a/src/core/operations/FernetDecrypt.mjs +++ b/src/core/operations/FernetDecrypt.mjs @@ -20,22 +20,23 @@ class FernetDecrypt extends Operation { this.name = "Fernet Decrypt"; this.module = "Default"; - this.description = "Fernet is a symmetric encryption method which makes sure that the message encrypted cannot be manipulated/read without the key. It uses URL safe encoding for the keys. Fernet uses 128-bit AES in CBC mode and PKCS7 padding, with HMAC using SHA256 for authentication. The IV is created from os.random().

Key: The key must be 32 bytes (256 bits) encoded with Base64."; + this.description = + "Fernet is a symmetric encryption method which makes sure that the message encrypted cannot be manipulated/read without the key. It uses URL safe encoding for the keys. Fernet uses 128-bit AES in CBC mode and PKCS7 padding, with HMAC using SHA256 for authentication. The IV is created from os.random().

Key: The key must be 32 bytes (256 bits) encoded with Base64."; this.infoURL = "https://asecuritysite.com/encryption/fer"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "string", - "value": "" + name: "Key", + type: "string", + value: "", }, ]; this.patterns = [ { match: "^[A-Z\\d\\-_=]{20,}$", flags: "i", - args: [] + args: [], }, ]; } @@ -51,7 +52,7 @@ class FernetDecrypt extends Operation { const token = new fernet.Token({ secret: secret, token: input, - ttl: 0 + ttl: 0, }); return token.decode(); } catch (err) { diff --git a/src/core/operations/FernetEncrypt.mjs b/src/core/operations/FernetEncrypt.mjs index 84778486..b0337280 100644 --- a/src/core/operations/FernetEncrypt.mjs +++ b/src/core/operations/FernetEncrypt.mjs @@ -20,15 +20,16 @@ class FernetEncrypt extends Operation { this.name = "Fernet Encrypt"; this.module = "Default"; - this.description = "Fernet is a symmetric encryption method which makes sure that the message encrypted cannot be manipulated/read without the key. It uses URL safe encoding for the keys. Fernet uses 128-bit AES in CBC mode and PKCS7 padding, with HMAC using SHA256 for authentication. The IV is created from os.random().

Key: The key must be 32 bytes (256 bits) encoded with Base64."; + this.description = + "Fernet is a symmetric encryption method which makes sure that the message encrypted cannot be manipulated/read without the key. It uses URL safe encoding for the keys. Fernet uses 128-bit AES in CBC mode and PKCS7 padding, with HMAC using SHA256 for authentication. The IV is created from os.random().

Key: The key must be 32 bytes (256 bits) encoded with Base64."; this.infoURL = "https://asecuritysite.com/encryption/fer"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "string", - "value": "" + name: "Key", + type: "string", + value: "", }, ]; } diff --git a/src/core/operations/FileTree.mjs b/src/core/operations/FileTree.mjs index 8321f8f5..e1160687 100644 --- a/src/core/operations/FileTree.mjs +++ b/src/core/operations/FileTree.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Unique operation */ class FileTree extends Operation { - /** * Unique constructor */ @@ -21,20 +20,21 @@ class FileTree extends Operation { this.name = "File Tree"; this.module = "Default"; - this.description = "Creates file tree from list of file paths (similar to the tree command in Linux)"; + this.description = + "Creates file tree from list of file paths (similar to the tree command in Linux)"; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "File Path Delimiter", type: "binaryString", - value: "/" + value: "/", }, { name: "Delimiter", type: "option", - value: INPUT_DELIM_OPTIONS - } + value: INPUT_DELIM_OPTIONS, + }, ]; } @@ -44,7 +44,6 @@ class FileTree extends Operation { * @returns {string} */ run(input, args) { - // Set up arrow and pipe for nice output display const ARROW = "|---"; const PIPE = "| "; @@ -74,8 +73,8 @@ class FileTree extends Operation { printLine = path[j]; key = path[j]; } else { - printLine = PIPE.repeat(j-1) + ARROW + path[j]; - key = path.slice(0, j+1).join("/"); + printLine = PIPE.repeat(j - 1) + ARROW + path[j]; + key = path.slice(0, j + 1).join("/"); } // Check to see we have already added that path @@ -87,7 +86,6 @@ class FileTree extends Operation { } return printList.join("\n"); } - } export default FileTree; diff --git a/src/core/operations/Filter.mjs b/src/core/operations/Filter.mjs index 904bb65f..56b72f60 100644 --- a/src/core/operations/Filter.mjs +++ b/src/core/operations/Filter.mjs @@ -6,7 +6,7 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; import OperationError from "../errors/OperationError.mjs"; import XRegExp from "xregexp"; @@ -14,7 +14,6 @@ import XRegExp from "xregexp"; * Filter operation */ class Filter extends Operation { - /** * Filter constructor */ @@ -23,25 +22,26 @@ class Filter extends Operation { this.name = "Filter"; this.module = "Regex"; - this.description = "Splits up the input using the specified delimiter and then filters each branch based on a regular expression."; + this.description = + "Splits up the input using the specified delimiter and then filters each branch based on a regular expression."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": INPUT_DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: INPUT_DELIM_OPTIONS, }, { - "name": "Regex", - "type": "string", - "value": "" + name: "Regex", + type: "string", + value: "", }, { - "name": "Invert condition", - "type": "boolean", - "value": false - } + name: "Invert condition", + type: "boolean", + value: false, + }, ]; } @@ -61,13 +61,12 @@ class Filter extends Operation { throw new OperationError(`Invalid regex. Details: ${err.message}`); } - const regexFilter = function(value) { + const regexFilter = function (value) { return reverse ^ regex.test(value); }; return input.split(delim).filter(regexFilter).join(delim); } - } export default Filter; diff --git a/src/core/operations/FindReplace.mjs b/src/core/operations/FindReplace.mjs index 4fc1e43c..eaf825df 100644 --- a/src/core/operations/FindReplace.mjs +++ b/src/core/operations/FindReplace.mjs @@ -12,7 +12,6 @@ import XRegExp from "xregexp"; * Find / Replace operation */ class FindReplace extends Operation { - /** * FindReplace constructor */ @@ -21,42 +20,47 @@ class FindReplace extends Operation { this.name = "Find / Replace"; this.module = "Regex"; - this.description = "Replaces all occurrences of the first string with the second.

Includes support for regular expressions (regex), simple strings and extended strings (which support \\n, \\r, \\t, \\b, \\f and escaped hex bytes using \\x notation, e.g. \\x00 for a null byte)."; + this.description = + "Replaces all occurrences of the first string with the second.

Includes support for regular expressions (regex), simple strings and extended strings (which support \\n, \\r, \\t, \\b, \\f and escaped hex bytes using \\x notation, e.g. \\x00 for a null byte)."; this.infoURL = "https://wikipedia.org/wiki/Regular_expression"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Find", - "type": "toggleString", - "value": "", - "toggleValues": ["Regex", "Extended (\\n, \\t, \\x...)", "Simple string"] + name: "Find", + type: "toggleString", + value: "", + toggleValues: [ + "Regex", + "Extended (\\n, \\t, \\x...)", + "Simple string", + ], }, { - "name": "Replace", - "type": "binaryString", - "value": "" + name: "Replace", + type: "binaryString", + value: "", }, { - "name": "Global match", - "type": "boolean", - "value": true + name: "Global match", + type: "boolean", + value: true, }, { - "name": "Case insensitive", - "type": "boolean", - "value": false + name: "Case insensitive", + type: "boolean", + value: false, }, { - "name": "Multiline matching", - "type": "boolean", - "value": true + name: "Multiline matching", + type: "boolean", + value: true, }, { - "name": "Dot matches all", - "type": "boolean", - "value": false - } + name: "Dot matches all", + type: "boolean", + value: false, + }, ]; } @@ -66,7 +70,7 @@ class FindReplace extends Operation { * @returns {string} */ run(input, args) { - const [{option: type}, replace, g, i, m, s] = args; + const [{ option: type }, replace, g, i, m, s] = args; let find = args[0].string, modifiers = ""; @@ -88,7 +92,6 @@ class FindReplace extends Operation { return input.replace(find, replace); } - } export default FindReplace; diff --git a/src/core/operations/Fletcher16Checksum.mjs b/src/core/operations/Fletcher16Checksum.mjs index b91ec2a8..6045d2db 100644 --- a/src/core/operations/Fletcher16Checksum.mjs +++ b/src/core/operations/Fletcher16Checksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Fletcher-16 Checksum operation */ class Fletcher16Checksum extends Operation { - /** * Fletcher16Checksum constructor */ @@ -20,8 +19,10 @@ class Fletcher16Checksum extends Operation { this.name = "Fletcher-16 Checksum"; this.module = "Crypto"; - this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; - this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-16"; + this.description = + "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; + this.infoURL = + "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-16"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = []; @@ -44,7 +45,6 @@ class Fletcher16Checksum extends Operation { return Utils.hex(((b << 8) | a) >>> 0, 4); } - } export default Fletcher16Checksum; diff --git a/src/core/operations/Fletcher32Checksum.mjs b/src/core/operations/Fletcher32Checksum.mjs index 7b41ce55..ae688127 100644 --- a/src/core/operations/Fletcher32Checksum.mjs +++ b/src/core/operations/Fletcher32Checksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Fletcher-32 Checksum operation */ class Fletcher32Checksum extends Operation { - /** * Fletcher32Checksum constructor */ @@ -20,8 +19,10 @@ class Fletcher32Checksum extends Operation { this.name = "Fletcher-32 Checksum"; this.module = "Crypto"; - this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; - this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-32"; + this.description = + "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; + this.infoURL = + "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-32"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = []; @@ -36,7 +37,11 @@ class Fletcher32Checksum extends Operation { let a = 0, b = 0; if (ArrayBuffer.isView(input)) { - input = new DataView(input.buffer, input.byteOffset, input.byteLength); + input = new DataView( + input.buffer, + input.byteOffset, + input.byteLength, + ); } else { input = new DataView(input); } @@ -52,7 +57,6 @@ class Fletcher32Checksum extends Operation { return Utils.hex(((b << 16) | a) >>> 0, 8); } - } export default Fletcher32Checksum; diff --git a/src/core/operations/Fletcher64Checksum.mjs b/src/core/operations/Fletcher64Checksum.mjs index 68328ea3..126f95f4 100644 --- a/src/core/operations/Fletcher64Checksum.mjs +++ b/src/core/operations/Fletcher64Checksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Fletcher-64 Checksum operation */ class Fletcher64Checksum extends Operation { - /** * Fletcher64Checksum constructor */ @@ -20,8 +19,10 @@ class Fletcher64Checksum extends Operation { this.name = "Fletcher-64 Checksum"; this.module = "Crypto"; - this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; - this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-64"; + this.description = + "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; + this.infoURL = + "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-64"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = []; @@ -36,7 +37,11 @@ class Fletcher64Checksum extends Operation { let a = 0, b = 0; if (ArrayBuffer.isView(input)) { - input = new DataView(input.buffer, input.byteOffset, input.byteLength); + input = new DataView( + input.buffer, + input.byteOffset, + input.byteLength, + ); } else { input = new DataView(input); } @@ -48,7 +53,8 @@ class Fletcher64Checksum extends Operation { if (input.byteLength % 4 !== 0) { let lastValue = 0; for (let i = 0; i < input.byteLength % 4; i++) { - lastValue = (lastValue << 8) | input.getUint8(input.byteLength - 1 - i); + lastValue = + (lastValue << 8) | input.getUint8(input.byteLength - 1 - i); } a = (a + lastValue) % 0xffffffff; b = (b + a) % 0xffffffff; @@ -56,7 +62,6 @@ class Fletcher64Checksum extends Operation { return Utils.hex(b >>> 0, 8) + Utils.hex(a >>> 0, 8); } - } export default Fletcher64Checksum; diff --git a/src/core/operations/Fletcher8Checksum.mjs b/src/core/operations/Fletcher8Checksum.mjs index 1200c00c..4b60549a 100644 --- a/src/core/operations/Fletcher8Checksum.mjs +++ b/src/core/operations/Fletcher8Checksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Fletcher-8 Checksum operation */ class Fletcher8Checksum extends Operation { - /** * Fletcher8Checksum constructor */ @@ -20,7 +19,8 @@ class Fletcher8Checksum extends Operation { this.name = "Fletcher-8 Checksum"; this.module = "Crypto"; - this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; + this.description = + "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques."; this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -44,7 +44,6 @@ class Fletcher8Checksum extends Operation { return Utils.hex(((b << 4) | a) >>> 0, 2); } - } export default Fletcher8Checksum; diff --git a/src/core/operations/FlipImage.mjs b/src/core/operations/FlipImage.mjs index 30be5a4e..0a7d84e3 100644 --- a/src/core/operations/FlipImage.mjs +++ b/src/core/operations/FlipImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Flip Image operation */ class FlipImage extends Operation { - /** * FlipImage constructor */ @@ -33,8 +32,8 @@ class FlipImage extends Operation { { name: "Axis", type: "option", - value: ["Horizontal", "Vertical"] - } + value: ["Horizontal", "Vertical"], + }, ]; } @@ -95,7 +94,6 @@ class FlipImage extends Operation { return ``; } - } export default FlipImage; diff --git a/src/core/operations/Fork.mjs b/src/core/operations/Fork.mjs index 3d4c596a..26d4e6a3 100644 --- a/src/core/operations/Fork.mjs +++ b/src/core/operations/Fork.mjs @@ -12,7 +12,6 @@ import Dish from "../Dish.mjs"; * Fork operation */ class Fork extends Operation { - /** * Fork constructor */ @@ -22,25 +21,26 @@ class Fork extends Operation { this.name = "Fork"; this.flowControl = true; this.module = "Default"; - this.description = "Split the input data up based on the specified delimiter and run all subsequent operations on each branch separately.

For example, to decode multiple Base64 strings, enter them all on separate lines then add the 'Fork' and 'From Base64' operations to the recipe. Each string will be decoded separately."; + this.description = + "Split the input data up based on the specified delimiter and run all subsequent operations on each branch separately.

For example, to decode multiple Base64 strings, enter them all on separate lines then add the 'Fork' and 'From Base64' operations to the recipe. Each string will be decoded separately."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Split delimiter", - "type": "binaryShortString", - "value": "\\n" + name: "Split delimiter", + type: "binaryShortString", + value: "\\n", }, { - "name": "Merge delimiter", - "type": "binaryShortString", - "value": "\\n" + name: "Merge delimiter", + type: "binaryShortString", + value: "\\n", }, { - "name": "Ignore errors", - "type": "boolean", - "value": false - } + name: "Ignore errors", + type: "boolean", + value: false, + }, ]; } @@ -52,18 +52,17 @@ class Fork extends Operation { * @returns {Object} The updated state of the recipe. */ async run(state) { - const opList = state.opList, - inputType = opList[state.progress].inputType, - outputType = opList[state.progress].outputType, - input = await state.dish.get(inputType), - ings = opList[state.progress].ingValues, + const opList = state.opList, + inputType = opList[state.progress].inputType, + outputType = opList[state.progress].outputType, + input = await state.dish.get(inputType), + ings = opList[state.progress].ingValues, [splitDelim, mergeDelim, ignoreErrors] = ings, - subOpList = []; - let inputs = [], + subOpList = []; + let inputs = [], i; - if (input) - inputs = input.split(splitDelim); + if (input) inputs = input.split(splitDelim); // Set to 1 as if we are here, then there is one, the current one. let numOp = 1; @@ -72,13 +71,14 @@ class Fork extends Operation { for (i = state.progress + 1; i < opList.length; i++) { if (opList[i].name === "Merge" && !opList[i].disabled) { numOp--; - if (numOp === 0 || opList[i].ingValues[0]) - break; - else - // Not this Fork's Merge. - subOpList.push(opList[i]); + if (numOp === 0 || opList[i].ingValues[0]) break; + // Not this Fork's Merge. + else subOpList.push(opList[i]); } else { - if (opList[i].name === "Fork" || opList[i].name === "Subsection") + if ( + opList[i].name === "Fork" || + opList[i].name === "Subsection" + ) numOp++; subOpList.push(opList[i]); } @@ -93,7 +93,9 @@ class Fork extends Operation { recipe.addOperations(subOpList); // Take a deep(ish) copy of the ingredient values - const ingValues = subOpList.map(op => JSON.parse(JSON.stringify(op.ingValues))); + const ingValues = subOpList.map((op) => + JSON.parse(JSON.stringify(op.ingValues)), + ); // Run recipe over each tranche for (i = 0; i < inputs.length; i++) { @@ -120,7 +122,6 @@ class Fork extends Operation { state.progress += progress; return state; } - } export default Fork; diff --git a/src/core/operations/FormatMACAddresses.mjs b/src/core/operations/FormatMACAddresses.mjs index 41fac594..f082b8d2 100644 --- a/src/core/operations/FormatMACAddresses.mjs +++ b/src/core/operations/FormatMACAddresses.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Format MAC addresses operation */ class FormatMACAddresses extends Operation { - /** * FormatMACAddresses constructor */ @@ -19,41 +18,43 @@ class FormatMACAddresses extends Operation { this.name = "Format MAC addresses"; this.module = "Default"; - this.description = "Displays given MAC addresses in multiple different formats.

Expects addresses in a list separated by newlines, spaces or commas.

WARNING: There are no validity checks."; - this.infoURL = "https://wikipedia.org/wiki/MAC_address#Notational_conventions"; + this.description = + "Displays given MAC addresses in multiple different formats.

Expects addresses in a list separated by newlines, spaces or commas.

WARNING: There are no validity checks."; + this.infoURL = + "https://wikipedia.org/wiki/MAC_address#Notational_conventions"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Output case", - "type": "option", - "value": ["Both", "Upper only", "Lower only"] + name: "Output case", + type: "option", + value: ["Both", "Upper only", "Lower only"], }, { - "name": "No delimiter", - "type": "boolean", - "value": true + name: "No delimiter", + type: "boolean", + value: true, }, { - "name": "Dash delimiter", - "type": "boolean", - "value": true + name: "Dash delimiter", + type: "boolean", + value: true, }, { - "name": "Colon delimiter", - "type": "boolean", - "value": true + name: "Colon delimiter", + type: "boolean", + value: true, }, { - "name": "Cisco style", - "type": "boolean", - "value": false + name: "Cisco style", + type: "boolean", + value: false, }, { - "name": "IPv6 interface ID", - "type": "boolean", - "value": false - } + name: "IPv6 interface ID", + type: "boolean", + value: false, + }, ]; } @@ -71,12 +72,12 @@ class FormatMACAddresses extends Operation { dashDelim, colonDelim, ciscoStyle, - ipv6IntID + ipv6IntID, ] = args, outputList = [], macs = input.toLowerCase().split(/[,\s\r\n]+/); - macs.forEach(function(mac) { + macs.forEach(function (mac) { const cleanMac = mac.replace(/[:.-]+/g, ""), macHyphen = cleanMac.replace(/(.{2}(?=.))/g, "$1-"), macColon = cleanMac.replace(/(.{2}(?=.))/g, "$1:"), @@ -102,21 +103,23 @@ class FormatMACAddresses extends Operation { if (ipv6IntID) outputList.push(macIPv6.toUpperCase()); } else { if (noDelim) outputList.push(cleanMac, cleanMac.toUpperCase()); - if (dashDelim) outputList.push(macHyphen, macHyphen.toUpperCase()); - if (colonDelim) outputList.push(macColon, macColon.toUpperCase()); - if (ciscoStyle) outputList.push(macCisco, macCisco.toUpperCase()); + if (dashDelim) + outputList.push(macHyphen, macHyphen.toUpperCase()); + if (colonDelim) + outputList.push(macColon, macColon.toUpperCase()); + if (ciscoStyle) + outputList.push(macCisco, macCisco.toUpperCase()); if (ipv6IntID) outputList.push(macIPv6, macIPv6.toUpperCase()); } outputList.push( - "" // Empty line to delimit groups + "", // Empty line to delimit groups ); }); // Return the data as a string return outputList.join("\n"); } - } export default FormatMACAddresses; diff --git a/src/core/operations/FrequencyDistribution.mjs b/src/core/operations/FrequencyDistribution.mjs index 9bcb3f7f..b05d8926 100644 --- a/src/core/operations/FrequencyDistribution.mjs +++ b/src/core/operations/FrequencyDistribution.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Frequency distribution operation */ class FrequencyDistribution extends Operation { - /** * FrequencyDistribution constructor */ @@ -21,22 +20,23 @@ class FrequencyDistribution extends Operation { this.name = "Frequency distribution"; this.module = "Default"; - this.description = "Displays the distribution of bytes in the data as a graph."; + this.description = + "Displays the distribution of bytes in the data as a graph."; this.infoURL = "https://wikipedia.org/wiki/Frequency_distribution"; this.inputType = "ArrayBuffer"; this.outputType = "json"; this.presentType = "html"; this.args = [ { - "name": "Show 0%s", - "type": "boolean", - "value": true + name: "Show 0%s", + type: "boolean", + value: true, }, { - "name": "Show ASCII", - "type": "boolean", - "value": true - } + name: "Show ASCII", + type: "boolean", + value: true, + }, ]; } @@ -63,14 +63,14 @@ class FrequencyDistribution extends Operation { let repr = 0; for (i = 0; i < 256; i++) { if (distrib[i] > 0) repr++; - percentages[i] = distrib[i] / len * 100; + percentages[i] = (distrib[i] / len) * 100; } return { - "dataLength": len, - "percentages": percentages, - "distribution": distrib, - "bytesRepresented": repr + dataLength: len, + percentages: percentages, + distribution: distrib, + bytesRepresented: repr, }; } @@ -100,7 +100,9 @@ Number of bytes not represented: ${256 - freq.bytesRepresented} CanvasComponents.drawBarChart(canvas, scores, "Byte", "Frequency %", 16, 6); - ${showAscii ? "" : ""}`; + ${ + showAscii ? "" : "" + }`; for (let i = 0; i < 256; i++) { if (freq.distribution[i] || showZeroes) { @@ -108,7 +110,7 @@ Number of bytes not represented: ${256 - freq.bytesRepresented} if (showAscii) { if (i <= 32) { c = String.fromCharCode(0x2400 + i); - } else if (i === 127) { + } else if (i === 127) { c = String.fromCharCode(0x2421); } else { c = String.fromCharCode(i); @@ -116,8 +118,12 @@ Number of bytes not represented: ${256 - freq.bytesRepresented} } const bite = ``, ascii = showAscii ? `` : "", - percentage = ``, - bars = ``; + percentage = ``, + bars = ``; output += `${bite}${ascii}${percentage}${bars}`; } @@ -126,7 +132,6 @@ Number of bytes not represented: ${256 - freq.bytesRepresented} output += "
ByteASCIIPercentage
ByteASCIIPercentage
${Utils.hex(i, 2)}${c}${(freq.percentages[i].toFixed(2).replace(".00", "") + "%").padEnd(8, " ")}${Array(Math.ceil(freq.percentages[i])+1).join("|")}${( + freq.percentages[i].toFixed(2).replace(".00", "") + "%" + ).padEnd(8, " ")}${Array( + Math.ceil(freq.percentages[i]) + 1, + ).join("|")}
"; return output; } - } export default FrequencyDistribution; diff --git a/src/core/operations/FromBCD.mjs b/src/core/operations/FromBCD.mjs index 8fa990a4..bef10051 100644 --- a/src/core/operations/FromBCD.mjs +++ b/src/core/operations/FromBCD.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ENCODING_SCHEME, ENCODING_LOOKUP, FORMAT} from "../lib/BCD.mjs"; +import { ENCODING_SCHEME, ENCODING_LOOKUP, FORMAT } from "../lib/BCD.mjs"; import BigNumber from "bignumber.js"; /** * From BCD operation */ class FromBCD extends Operation { - /** * FromBCD constructor */ @@ -23,37 +22,38 @@ class FromBCD extends Operation { this.name = "From BCD"; this.module = "Default"; - this.description = "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign."; + this.description = + "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign."; this.infoURL = "https://wikipedia.org/wiki/Binary-coded_decimal"; this.inputType = "string"; this.outputType = "BigNumber"; this.args = [ { - "name": "Scheme", - "type": "option", - "value": ENCODING_SCHEME + name: "Scheme", + type: "option", + value: ENCODING_SCHEME, }, { - "name": "Packed", - "type": "boolean", - "value": true + name: "Packed", + type: "boolean", + value: true, }, { - "name": "Signed", - "type": "boolean", - "value": false + name: "Signed", + type: "boolean", + value: false, }, { - "name": "Input format", - "type": "option", - "value": FORMAT - } + name: "Input format", + type: "option", + value: FORMAT, + }, ]; this.checks = [ { pattern: "^(?:\\d{4} ){3,}\\d{4}$", flags: "", - args: ["8 4 2 1", true, false, "Nibbles"] + args: ["8 4 2 1", true, false, "Nibbles"], }, ]; } @@ -85,7 +85,7 @@ class FromBCD extends Operation { case "Raw": default: byteArray = new Uint8Array(Utils.strToArrayBuffer(input)); - byteArray.forEach(b => { + byteArray.forEach((b) => { nibbles.push(b >>> 4); nibbles.push(b & 15); }); @@ -101,23 +101,24 @@ class FromBCD extends Operation { if (signed) { const sign = nibbles.pop(); - if (sign === 13 || - sign === 11) { + if (sign === 13 || sign === 11) { // Negative output += "-"; } } - nibbles.forEach(n => { + nibbles.forEach((n) => { if (isNaN(n)) throw new OperationError("Invalid input"); const val = encoding.indexOf(n); - if (val < 0) throw new OperationError(`Value ${Utils.bin(n, 4)} is not in the encoding scheme`); + if (val < 0) + throw new OperationError( + `Value ${Utils.bin(n, 4)} is not in the encoding scheme`, + ); output += val.toString(); }); return new BigNumber(output); } - } export default FromBCD; diff --git a/src/core/operations/FromBase.mjs b/src/core/operations/FromBase.mjs index 4abd5c44..8c3a8b8f 100644 --- a/src/core/operations/FromBase.mjs +++ b/src/core/operations/FromBase.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * From Base operation */ class FromBase extends Operation { - /** * FromBase constructor */ @@ -21,16 +20,17 @@ class FromBase extends Operation { this.name = "From Base"; this.module = "Default"; - this.description = "Converts a number to decimal from a given numerical base."; + this.description = + "Converts a number to decimal from a given numerical base."; this.infoURL = "https://wikipedia.org/wiki/Radix"; this.inputType = "string"; this.outputType = "BigNumber"; this.args = [ { - "name": "Radix", - "type": "number", - "value": 36 - } + name: "Radix", + type: "number", + value: 36, + }, ]; } @@ -42,7 +42,9 @@ class FromBase extends Operation { run(input, args) { const radix = args[0]; if (radix < 2 || radix > 36) { - throw new OperationError("Error: Radix argument must be between 2 and 36"); + throw new OperationError( + "Error: Radix argument must be between 2 and 36", + ); } const number = input.replace(/\s/g, "").split("."); @@ -53,12 +55,11 @@ class FromBase extends Operation { // Fractional part for (let i = 0; i < number[1].length; i++) { const digit = new BigNumber(number[1][i], radix); - result += digit.div(Math.pow(radix, i+1)); + result += digit.div(Math.pow(radix, i + 1)); } return result; } - } export default FromBase; diff --git a/src/core/operations/FromBase32.mjs b/src/core/operations/FromBase32.mjs index 73added6..57eca683 100644 --- a/src/core/operations/FromBase32.mjs +++ b/src/core/operations/FromBase32.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * From Base32 operation */ class FromBase32 extends Operation { - /** * FromBase32 constructor */ @@ -20,7 +19,8 @@ class FromBase32 extends Operation { this.name = "From Base32"; this.module = "Default"; - this.description = "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7."; + this.description = + "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7."; this.infoURL = "https://wikipedia.org/wiki/Base32"; this.inputType = "string"; this.outputType = "byteArray"; @@ -28,20 +28,21 @@ class FromBase32 extends Operation { { name: "Alphabet", type: "binaryString", - value: "A-Z2-7=" + value: "A-Z2-7=", }, { name: "Remove non-alphabet chars", type: "boolean", - value: true - } + value: true, + }, ]; this.checks = [ { - pattern: "^(?:[A-Z2-7]{8})+(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}={1})?$", + pattern: + "^(?:[A-Z2-7]{8})+(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}={1})?$", flags: "", - args: ["A-Z2-7=", false] - } + args: ["A-Z2-7=", false], + }, ]; } @@ -53,17 +54,32 @@ class FromBase32 extends Operation { run(input, args) { if (!input) return []; - const alphabet = args[0] ? - Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", + const alphabet = args[0] + ? Utils.expandAlphRange(args[0]).join("") + : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", removeNonAlphChars = args[1], output = []; - let chr1, chr2, chr3, chr4, chr5, - enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8, + let chr1, + chr2, + chr3, + chr4, + chr5, + enc1, + enc2, + enc3, + enc4, + enc5, + enc6, + enc7, + enc8, i = 0; if (removeNonAlphChars) { - const re = new RegExp("[^" + alphabet.replace(/[\]\\\-^]/g, "\\$&") + "]", "g"); + const re = new RegExp( + "[^" + alphabet.replace(/[\]\\\-^]/g, "\\$&") + "]", + "g", + ); input = input.replace(re, ""); } @@ -92,7 +108,6 @@ class FromBase32 extends Operation { return output; } - } export default FromBase32; diff --git a/src/core/operations/FromBase45.mjs b/src/core/operations/FromBase45.mjs index 8cb202bc..9ef29b5b 100644 --- a/src/core/operations/FromBase45.mjs +++ b/src/core/operations/FromBase45.mjs @@ -4,17 +4,19 @@ * @license Apache-2.0 */ -import {ALPHABET, highlightToBase45, highlightFromBase45} from "../lib/Base45.mjs"; +import { + ALPHABET, + highlightToBase45, + highlightFromBase45, +} from "../lib/Base45.mjs"; import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; - /** * From Base45 operation */ class FromBase45 extends Operation { - /** * FromBase45 constructor */ @@ -23,7 +25,8 @@ class FromBase45 extends Operation { this.name = "From Base45"; this.module = "Default"; - this.description = "Base45 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system. Base45 is optimized for usage with QR codes."; + this.description = + "Base45 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system. Base45 is optimized for usage with QR codes."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "string"; this.outputType = "byteArray"; @@ -31,12 +34,12 @@ class FromBase45 extends Operation { { name: "Alphabet", type: "string", - value: ALPHABET + value: ALPHABET, }, { name: "Remove non-alphabet chars", type: "boolean", - value: true + value: true, }, ]; @@ -58,7 +61,10 @@ class FromBase45 extends Operation { // Remove non-alphabet characters if (removeNonAlphChars) { - const re = new RegExp("[^" + alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", "g"); + const re = new RegExp( + "[^" + alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", + "g", + ); input = input.replace(re, ""); } @@ -68,14 +74,18 @@ class FromBase45 extends Operation { for (const c of triple) { const idx = alphabet.indexOf(c); if (idx === -1) { - throw new OperationError(`Character not in alphabet: '${c}'`); + throw new OperationError( + `Character not in alphabet: '${c}'`, + ); } b *= 45; b += idx; } if (b > 65535) { - throw new OperationError(`Triplet too large: '${triple.join("")}'`); + throw new OperationError( + `Triplet too large: '${triple.join("")}'`, + ); } if (triple.length > 2) { @@ -90,12 +100,10 @@ class FromBase45 extends Operation { * Pushing LSB */ res.push(b & 0xff); - } return res; } - } export default FromBase45; diff --git a/src/core/operations/FromBase58.mjs b/src/core/operations/FromBase58.mjs index f5a9ac3d..d7e1b4ef 100644 --- a/src/core/operations/FromBase58.mjs +++ b/src/core/operations/FromBase58.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ALPHABET_OPTIONS} from "../lib/Base58.mjs"; +import { ALPHABET_OPTIONS } from "../lib/Base58.mjs"; /** * From Base58 operation */ class FromBase58 extends Operation { - /** * FromBase58 constructor */ @@ -22,32 +21,39 @@ class FromBase58 extends Operation { this.name = "From Base58"; this.module = "Default"; - this.description = "Base58 (similar to Base64) is a notation for encoding arbitrary byte data. It differs from Base64 by removing easily misread characters (i.e. l, I, 0 and O) to improve human readability.

This operation decodes data from an ASCII string (with an alphabet of your choosing, presets included) back into its raw form.

e.g. StV1DL6CwTryKyV becomes hello world

Base58 is commonly used in cryptocurrencies (Bitcoin, Ripple, etc)."; + this.description = + "Base58 (similar to Base64) is a notation for encoding arbitrary byte data. It differs from Base64 by removing easily misread characters (i.e. l, I, 0 and O) to improve human readability.

This operation decodes data from an ASCII string (with an alphabet of your choosing, presets included) back into its raw form.

e.g. StV1DL6CwTryKyV becomes hello world

Base58 is commonly used in cryptocurrencies (Bitcoin, Ripple, etc)."; this.infoURL = "https://wikipedia.org/wiki/Base58"; this.inputType = "string"; this.outputType = "byteArray"; this.args = [ { - "name": "Alphabet", - "type": "editableOption", - "value": ALPHABET_OPTIONS + name: "Alphabet", + type: "editableOption", + value: ALPHABET_OPTIONS, }, { - "name": "Remove non-alphabet chars", - "type": "boolean", - "value": true - } + name: "Remove non-alphabet chars", + type: "boolean", + value: true, + }, ]; this.checks = [ { pattern: "^[1-9A-HJ-NP-Za-km-z]{20,}$", flags: "", - args: ["123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", false] + args: [ + "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", + false, + ], }, { pattern: "^[1-9A-HJ-NP-Za-km-z]{20,}$", flags: "", - args: ["rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz", false] + args: [ + "rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz", + false, + ], }, ]; } @@ -64,8 +70,7 @@ class FromBase58 extends Operation { alphabet = Utils.expandAlphRange(alphabet).join(""); - if (alphabet.length !== 58 || - [].unique.call(alphabet).length !== 58) { + if (alphabet.length !== 58 || [].unique.call(alphabet).length !== 58) { throw new OperationError("Alphabet must be of length 58"); } @@ -76,29 +81,31 @@ class FromBase58 extends Operation { zeroPrefix++; } - [].forEach.call(input, function(c, charIndex) { + [].forEach.call(input, function (c, charIndex) { const index = alphabet.indexOf(c); if (index === -1) { if (removeNonAlphaChars) { return; } else { - throw new OperationError(`Char '${c}' at position ${charIndex} not in alphabet`); + throw new OperationError( + `Char '${c}' at position ${charIndex} not in alphabet`, + ); } } let carry = result[0] * 58 + index; - result[0] = carry & 0xFF; + result[0] = carry & 0xff; carry = carry >> 8; for (let i = 1; i < result.length; i++) { carry += result[i] * 58; - result[i] = carry & 0xFF; + result[i] = carry & 0xff; carry = carry >> 8; } while (carry > 0) { - result.push(carry & 0xFF); + result.push(carry & 0xff); carry = carry >> 8; } }); @@ -109,7 +116,6 @@ class FromBase58 extends Operation { return result.reverse(); } - } export default FromBase58; diff --git a/src/core/operations/FromBase62.mjs b/src/core/operations/FromBase62.mjs index 9e91f647..0a12a650 100644 --- a/src/core/operations/FromBase62.mjs +++ b/src/core/operations/FromBase62.mjs @@ -8,12 +8,10 @@ import Operation from "../Operation.mjs"; import BigNumber from "bignumber.js"; import Utils from "../Utils.mjs"; - /** * From Base62 operation */ class FromBase62 extends Operation { - /** * FromBase62 constructor */ @@ -22,7 +20,8 @@ class FromBase62 extends Operation { this.name = "From Base62"; this.module = "Default"; - this.description = "Base62 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system."; + this.description = + "Base62 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "string"; this.outputType = "byteArray"; @@ -30,8 +29,8 @@ class FromBase62 extends Operation { { name: "Alphabet", type: "string", - value: "0-9A-Za-z" - } + value: "0-9A-Za-z", + }, ]; } @@ -45,7 +44,10 @@ class FromBase62 extends Operation { const alphabet = Utils.expandAlphRange(args[0]).join(""); const BN62 = BigNumber.clone({ ALPHABET: alphabet }); - const re = new RegExp("[^" + alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", "g"); + const re = new RegExp( + "[^" + alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", + "g", + ); input = input.replace(re, ""); // Read number in using Base62 alphabet @@ -59,7 +61,6 @@ class FromBase62 extends Operation { return Utils.convertToByteArray(hex, "Hex"); } - } export default FromBase62; diff --git a/src/core/operations/FromBase64.mjs b/src/core/operations/FromBase64.mjs index 292de1e2..d04dbed7 100644 --- a/src/core/operations/FromBase64.mjs +++ b/src/core/operations/FromBase64.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {fromBase64, ALPHABET_OPTIONS} from "../lib/Base64.mjs"; +import { fromBase64, ALPHABET_OPTIONS } from "../lib/Base64.mjs"; /** * From Base64 operation */ class FromBase64 extends Operation { - /** * FromBase64 constructor */ @@ -20,7 +19,8 @@ class FromBase64 extends Operation { this.name = "From Base64"; this.module = "Default"; - this.description = "Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.

This operation decodes data from an ASCII Base64 string back into its raw format.

e.g. aGVsbG8= becomes hello"; + this.description = + "Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.

This operation decodes data from an ASCII Base64 string back into its raw format.

e.g. aGVsbG8= becomes hello"; this.infoURL = "https://wikipedia.org/wiki/Base64"; this.inputType = "string"; this.outputType = "byteArray"; @@ -28,105 +28,133 @@ class FromBase64 extends Operation { { name: "Alphabet", type: "editableOption", - value: ALPHABET_OPTIONS + value: ALPHABET_OPTIONS, }, { name: "Remove non-alphabet chars", type: "boolean", - value: true + value: true, }, { name: "Strict mode", type: "boolean", - value: false - } + value: false, + }, ]; this.checks = [ { - pattern: "^\\s*(?:[A-Z\\d+/]{4})+(?:[A-Z\\d+/]{2}==|[A-Z\\d+/]{3}=)?\\s*$", + pattern: + "^\\s*(?:[A-Z\\d+/]{4})+(?:[A-Z\\d+/]{2}==|[A-Z\\d+/]{3}=)?\\s*$", flags: "i", - args: ["A-Za-z0-9+/=", true, false] + args: ["A-Za-z0-9+/=", true, false], }, { pattern: "^\\s*[A-Z\\d\\-_]{20,}\\s*$", flags: "i", - args: ["A-Za-z0-9-_", true, false] + args: ["A-Za-z0-9-_", true, false], }, { - pattern: "^\\s*(?:[A-Z\\d+\\-]{4}){5,}(?:[A-Z\\d+\\-]{2}==|[A-Z\\d+\\-]{3}=)?\\s*$", + pattern: + "^\\s*(?:[A-Z\\d+\\-]{4}){5,}(?:[A-Z\\d+\\-]{2}==|[A-Z\\d+\\-]{3}=)?\\s*$", flags: "i", - args: ["A-Za-z0-9+\\-=", true, false] + args: ["A-Za-z0-9+\\-=", true, false], }, { - pattern: "^\\s*(?:[A-Z\\d./]{4}){5,}(?:[A-Z\\d./]{2}==|[A-Z\\d./]{3}=)?\\s*$", + pattern: + "^\\s*(?:[A-Z\\d./]{4}){5,}(?:[A-Z\\d./]{2}==|[A-Z\\d./]{3}=)?\\s*$", flags: "i", - args: ["./0-9A-Za-z=", true, false] + args: ["./0-9A-Za-z=", true, false], }, { pattern: "^\\s*[A-Z\\d_.]{20,}\\s*$", flags: "i", - args: ["A-Za-z0-9_.", true, false] + args: ["A-Za-z0-9_.", true, false], }, { - pattern: "^\\s*(?:[A-Z\\d._]{4}){5,}(?:[A-Z\\d._]{2}--|[A-Z\\d._]{3}-)?\\s*$", + pattern: + "^\\s*(?:[A-Z\\d._]{4}){5,}(?:[A-Z\\d._]{2}--|[A-Z\\d._]{3}-)?\\s*$", flags: "i", - args: ["A-Za-z0-9._-", true, false] + args: ["A-Za-z0-9._-", true, false], }, { - pattern: "^\\s*(?:[A-Z\\d+/]{4}){5,}(?:[A-Z\\d+/]{2}==|[A-Z\\d+/]{3}=)?\\s*$", + pattern: + "^\\s*(?:[A-Z\\d+/]{4}){5,}(?:[A-Z\\d+/]{2}==|[A-Z\\d+/]{3}=)?\\s*$", flags: "i", - args: ["0-9a-zA-Z+/=", true, false] + args: ["0-9a-zA-Z+/=", true, false], }, { - pattern: "^\\s*(?:[A-Z\\d+/]{4}){5,}(?:[A-Z\\d+/]{2}==|[A-Z\\d+/]{3}=)?\\s*$", + pattern: + "^\\s*(?:[A-Z\\d+/]{4}){5,}(?:[A-Z\\d+/]{2}==|[A-Z\\d+/]{3}=)?\\s*$", flags: "i", - args: ["0-9A-Za-z+/=", true, false] + args: ["0-9A-Za-z+/=", true, false], }, { pattern: "^[ !\"#$%&'()*+,\\-./\\d:;<=>?@A-Z[\\\\\\]^_]{20,}$", flags: "", - args: [" -_", false, false] + args: [" -_", false, false], }, { pattern: "^\\s*[A-Z\\d+\\-]{20,}\\s*$", flags: "i", - args: ["+\\-0-9A-Za-z", true, false] + args: ["+\\-0-9A-Za-z", true, false], }, { - pattern: "^\\s*[!\"#$%&'()*+,\\-0-689@A-NP-VX-Z[`a-fh-mp-r]{20,}\\s*$", + pattern: + "^\\s*[!\"#$%&'()*+,\\-0-689@A-NP-VX-Z[`a-fh-mp-r]{20,}\\s*$", flags: "", - args: ["!-,-0-689@A-NP-VX-Z[`a-fh-mp-r", true, false] + args: ["!-,-0-689@A-NP-VX-Z[`a-fh-mp-r", true, false], }, { - pattern: "^\\s*(?:[N-ZA-M\\d+/]{4}){5,}(?:[N-ZA-M\\d+/]{2}==|[N-ZA-M\\d+/]{3}=)?\\s*$", + pattern: + "^\\s*(?:[N-ZA-M\\d+/]{4}){5,}(?:[N-ZA-M\\d+/]{2}==|[N-ZA-M\\d+/]{3}=)?\\s*$", flags: "i", - args: ["N-ZA-Mn-za-m0-9+/=", true, false] + args: ["N-ZA-Mn-za-m0-9+/=", true, false], }, { pattern: "^\\s*[A-Z\\d./]{20,}\\s*$", flags: "i", - args: ["./0-9A-Za-z", true, false] + args: ["./0-9A-Za-z", true, false], }, { - pattern: "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}CC|[A-Z=\\d\\+/]{3}C)?\\s*$", + pattern: + "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}CC|[A-Z=\\d\\+/]{3}C)?\\s*$", flags: "i", - args: ["/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC", true, false] + args: [ + "/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC", + true, + false, + ], }, { - pattern: "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}55|[A-Z=\\d\\+/]{3}5)?\\s*$", + pattern: + "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}55|[A-Z=\\d\\+/]{3}5)?\\s*$", flags: "i", - args: ["3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5", true, false] + args: [ + "3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5", + true, + false, + ], }, { - pattern: "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}22|[A-Z=\\d\\+/]{3}2)?\\s*$", + pattern: + "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}22|[A-Z=\\d\\+/]{3}2)?\\s*$", flags: "i", - args: ["ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2", true, false] + args: [ + "ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2", + true, + false, + ], }, { - pattern: "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}55|[A-Z=\\d\\+/]{3}5)?\\s*$", + pattern: + "^\\s*(?:[A-Z=\\d\\+/]{4}){5,}(?:[A-Z=\\d\\+/]{2}55|[A-Z=\\d\\+/]{3}5)?\\s*$", flags: "i", - args: ["HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5", true, false] - } + args: [ + "HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5", + true, + false, + ], + }, ]; } @@ -138,7 +166,13 @@ class FromBase64 extends Operation { run(input, args) { const [alphabet, removeNonAlphChars, strictMode] = args; - return fromBase64(input, alphabet, "byteArray", removeNonAlphChars, strictMode); + return fromBase64( + input, + alphabet, + "byteArray", + removeNonAlphChars, + strictMode, + ); } /** @@ -151,8 +185,8 @@ class FromBase64 extends Operation { * @returns {Object[]} pos */ highlight(pos, args) { - pos[0].start = Math.ceil(pos[0].start / 4 * 3); - pos[0].end = Math.floor(pos[0].end / 4 * 3); + pos[0].start = Math.ceil((pos[0].start / 4) * 3); + pos[0].end = Math.floor((pos[0].end / 4) * 3); return pos; } @@ -166,8 +200,8 @@ class FromBase64 extends Operation { * @returns {Object[]} pos */ highlightReverse(pos, args) { - pos[0].start = Math.floor(pos[0].start / 3 * 4); - pos[0].end = Math.ceil(pos[0].end / 3 * 4); + pos[0].start = Math.floor((pos[0].start / 3) * 4); + pos[0].end = Math.ceil((pos[0].end / 3) * 4); return pos; } } diff --git a/src/core/operations/FromBase85.mjs b/src/core/operations/FromBase85.mjs index d0c70da5..0afa122a 100644 --- a/src/core/operations/FromBase85.mjs +++ b/src/core/operations/FromBase85.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {ALPHABET_OPTIONS} from "../lib/Base85.mjs"; +import { ALPHABET_OPTIONS } from "../lib/Base85.mjs"; /** * From Base85 operation */ class FromBase85 extends Operation { - /** * From Base85 constructor */ @@ -22,7 +21,8 @@ class FromBase85 extends Operation { this.name = "From Base85"; this.module = "Default"; - this.description = "Base85 (also called Ascii85) is a notation for encoding arbitrary byte data. It is usually more efficient that Base64.

This operation decodes data from an ASCII string (with an alphabet of your choosing, presets included).

e.g. BOu!rD]j7BEbo7 becomes hello world

Base85 is commonly used in Adobe's PostScript and PDF file formats."; + this.description = + "Base85 (also called Ascii85) is a notation for encoding arbitrary byte data. It is usually more efficient that Base64.

This operation decodes data from an ASCII string (with an alphabet of your choosing, presets included).

e.g. BOu!rD]j7BEbo7 becomes hello world

Base85 is commonly used in Adobe's PostScript and PDF file formats."; this.infoURL = "https://wikipedia.org/wiki/Ascii85"; this.inputType = "string"; this.outputType = "byteArray"; @@ -30,28 +30,28 @@ class FromBase85 extends Operation { { name: "Alphabet", type: "editableOption", - value: ALPHABET_OPTIONS + value: ALPHABET_OPTIONS, }, { name: "Remove non-alphabet chars", type: "boolean", - value: true + value: true, }, { name: "All-zero group char", type: "binaryShortString", value: "z", - maxLength: 1 - } + maxLength: 1, + }, ]; this.checks = [ { pattern: "^\\s*(?:<~)?" + // Optional whitespace and starting marker - "[\\s!-uz]*" + // Any amount of base85 characters and whitespace - "[!-uz]{15}" + // At least 15 continoues base85 characters without whitespace - "[\\s!-uz]*" + // Any amount of base85 characters and whitespace - "(?:~>)?\\s*$", // Optional ending marker and whitespace + "[\\s!-uz]*" + // Any amount of base85 characters and whitespace + "[!-uz]{15}" + // At least 15 continoues base85 characters without whitespace + "[\\s!-uz]*" + // Any amount of base85 characters and whitespace + "(?:~>)?\\s*$", // Optional ending marker and whitespace args: ["!-u"], }, { @@ -83,16 +83,18 @@ class FromBase85 extends Operation { run(input, args) { const alphabet = Utils.expandAlphRange(args[0]).join(""), removeNonAlphChars = args[1], - allZeroGroupChar = typeof args[2] === "string" ? args[2].slice(0, 1) : "", + allZeroGroupChar = + typeof args[2] === "string" ? args[2].slice(0, 1) : "", result = []; - if (alphabet.length !== 85 || - [].unique.call(alphabet).length !== 85) { + if (alphabet.length !== 85 || [].unique.call(alphabet).length !== 85) { throw new OperationError("Alphabet must be of length 85"); } if (allZeroGroupChar && alphabet.includes(allZeroGroupChar)) { - throw new OperationError("The all-zero group char cannot appear in the alphabet"); + throw new OperationError( + "The all-zero group char cannot appear in the alphabet", + ); } // Remove delimiters if present @@ -101,7 +103,13 @@ class FromBase85 extends Operation { // Remove non-alphabet characters if (removeNonAlphChars) { - const re = new RegExp("[^~" + allZeroGroupChar +alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + "]", "g"); + const re = new RegExp( + "[^~" + + allZeroGroupChar + + alphabet.replace(/[[\]\\\-^$]/g, "\\$&") + + "]", + "g", + ); input = input.replace(re, ""); // Remove delimiters again if present (incase of non-alphabet characters in front/behind delimiters) const matches = input.match(/^<~(.+?)~>$/); @@ -123,8 +131,13 @@ class FromBase85 extends Operation { .split("") .map((chr, idx) => { const digit = alphabet.indexOf(chr); - if ((digit < 0 || digit > 84) && chr !== allZeroGroupChar) { - throw `Invalid character '${chr}' at index ${i + idx}`; + if ( + (digit < 0 || digit > 84) && + chr !== allZeroGroupChar + ) { + throw `Invalid character '${chr}' at index ${ + i + idx + }`; } return digit; }); @@ -140,7 +153,7 @@ class FromBase85 extends Operation { (block >> 24) & 0xff, (block >> 16) & 0xff, (block >> 8) & 0xff, - block & 0xff + block & 0xff, ]; if (input.length < i + 5) { @@ -154,7 +167,6 @@ class FromBase85 extends Operation { return result; } - } export default FromBase85; diff --git a/src/core/operations/FromBase92.mjs b/src/core/operations/FromBase92.mjs index 8315a51c..58ad27be 100644 --- a/src/core/operations/FromBase92.mjs +++ b/src/core/operations/FromBase92.mjs @@ -19,7 +19,8 @@ class FromBase92 extends Operation { this.name = "From Base92"; this.module = "Default"; - this.description = "Base92 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers."; + this.description = + "Base92 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "string"; this.outputType = "byteArray"; diff --git a/src/core/operations/FromBinary.mjs b/src/core/operations/FromBinary.mjs index 9a51fc8b..8840b613 100644 --- a/src/core/operations/FromBinary.mjs +++ b/src/core/operations/FromBinary.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {BIN_DELIM_OPTIONS} from "../lib/Delim.mjs"; -import {fromBinary} from "../lib/Binary.mjs"; +import { BIN_DELIM_OPTIONS } from "../lib/Delim.mjs"; +import { fromBinary } from "../lib/Binary.mjs"; /** * From Binary operation */ class FromBinary extends Operation { - /** * FromBinary constructor */ @@ -22,58 +21,59 @@ class FromBinary extends Operation { this.name = "From Binary"; this.module = "Default"; - this.description = "Converts a binary string back into its raw form.

e.g. 01001000 01101001 becomes Hi"; + this.description = + "Converts a binary string back into its raw form.

e.g. 01001000 01101001 becomes Hi"; this.infoURL = "https://wikipedia.org/wiki/Binary_code"; this.inputType = "string"; this.outputType = "byteArray"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": BIN_DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: BIN_DELIM_OPTIONS, }, { - "name": "Byte Length", - "type": "number", - "value": 8, - "min": 1 - } + name: "Byte Length", + type: "number", + value: 8, + min: 1, + }, ]; this.checks = [ { pattern: "^(?:[01]{8})+$", flags: "", - args: ["None"] + args: ["None"], }, { pattern: "^(?:[01]{8})(?: [01]{8})*$", flags: "", - args: ["Space"] + args: ["Space"], }, { pattern: "^(?:[01]{8})(?:,[01]{8})*$", flags: "", - args: ["Comma"] + args: ["Comma"], }, { pattern: "^(?:[01]{8})(?:;[01]{8})*$", flags: "", - args: ["Semi-colon"] + args: ["Semi-colon"], }, { pattern: "^(?:[01]{8})(?::[01]{8})*$", flags: "", - args: ["Colon"] + args: ["Colon"], }, { pattern: "^(?:[01]{8})(?:\\n[01]{8})*$", flags: "", - args: ["Line feed"] + args: ["Line feed"], }, { pattern: "^(?:[01]{8})(?:\\r\\n[01]{8})*$", flags: "", - args: ["CRLF"] + args: ["CRLF"], }, ]; } @@ -99,8 +99,12 @@ class FromBinary extends Operation { */ highlight(pos, args) { const delim = Utils.charRep(args[0] || "Space"); - pos[0].start = pos[0].start === 0 ? 0 : Math.floor(pos[0].start / (8 + delim.length)); - pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / (8 + delim.length)); + pos[0].start = + pos[0].start === 0 + ? 0 + : Math.floor(pos[0].start / (8 + delim.length)); + pos[0].end = + pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / (8 + delim.length)); return pos; } @@ -119,7 +123,6 @@ class FromBinary extends Operation { pos[0].end = pos[0].end * (8 + delim.length) - delim.length; return pos; } - } export default FromBinary; diff --git a/src/core/operations/FromBraille.mjs b/src/core/operations/FromBraille.mjs index adbcff91..aa6e635e 100644 --- a/src/core/operations/FromBraille.mjs +++ b/src/core/operations/FromBraille.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {BRAILLE_LOOKUP} from "../lib/Braille.mjs"; +import { BRAILLE_LOOKUP } from "../lib/Braille.mjs"; /** * From Braille operation */ class FromBraille extends Operation { - /** * FromBraille constructor */ @@ -33,10 +32,13 @@ class FromBraille extends Operation { * @returns {string} */ run(input, args) { - return input.split("").map(b => { - const idx = BRAILLE_LOOKUP.dot6.indexOf(b); - return idx < 0 ? b : BRAILLE_LOOKUP.ascii[idx]; - }).join(""); + return input + .split("") + .map((b) => { + const idx = BRAILLE_LOOKUP.dot6.indexOf(b); + return idx < 0 ? b : BRAILLE_LOOKUP.ascii[idx]; + }) + .join(""); } /** @@ -64,7 +66,6 @@ class FromBraille extends Operation { highlightReverse(pos, args) { return pos; } - } export default FromBraille; diff --git a/src/core/operations/FromCaseInsensitiveRegex.mjs b/src/core/operations/FromCaseInsensitiveRegex.mjs index 31cbfb99..d7a5869a 100644 --- a/src/core/operations/FromCaseInsensitiveRegex.mjs +++ b/src/core/operations/FromCaseInsensitiveRegex.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * From Case Insensitive Regex operation */ class FromCaseInsensitiveRegex extends Operation { - /** * FromCaseInsensitiveRegex constructor */ @@ -19,7 +18,8 @@ class FromCaseInsensitiveRegex extends Operation { this.name = "From Case Insensitive Regex"; this.module = "Default"; - this.description = "Converts a case-insensitive regex string to a case sensitive regex string (no guarantee on it being the proper original casing) in case the i flag wasn't available at the time but now is, or you need it to be case-sensitive again.

e.g. [mM][oO][zZ][iI][lL][lL][aA]/[0-9].[0-9] .* becomes Mozilla/[0-9].[0-9] .*"; + this.description = + "Converts a case-insensitive regex string to a case sensitive regex string (no guarantee on it being the proper original casing) in case the i flag wasn't available at the time but now is, or you need it to be case-sensitive again.

e.g. [mM][oO][zZ][iI][lL][lL][aA]/[0-9].[0-9] .* becomes Mozilla/[0-9].[0-9] .*"; this.infoURL = "https://wikipedia.org/wiki/Regular_expression"; this.inputType = "string"; this.outputType = "string"; @@ -32,7 +32,9 @@ class FromCaseInsensitiveRegex extends Operation { * @returns {string} */ run(input, args) { - return input.replace(/\[[a-z]{2}\]/ig, m => m[1].toUpperCase() === m[2].toUpperCase() ? m[1] : m); + return input.replace(/\[[a-z]{2}\]/gi, (m) => + m[1].toUpperCase() === m[2].toUpperCase() ? m[1] : m, + ); } } diff --git a/src/core/operations/FromCharcode.mjs b/src/core/operations/FromCharcode.mjs index ef02d394..616dcf95 100644 --- a/src/core/operations/FromCharcode.mjs +++ b/src/core/operations/FromCharcode.mjs @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * From Charcode operation */ class FromCharcode extends Operation { - /** * FromCharcode constructor */ @@ -23,21 +22,22 @@ class FromCharcode extends Operation { this.name = "From Charcode"; this.module = "Default"; - this.description = "Converts unicode character codes back into text.

e.g. 0393 03b5 03b9 03ac 20 03c3 03bf 03c5 becomes Γειά σου"; + this.description = + "Converts unicode character codes back into text.

e.g. 0393 03b5 03b9 03ac 20 03c3 03bf 03c5 becomes Γειά σου"; this.infoURL = "https://wikipedia.org/wiki/Plane_(Unicode)"; this.inputType = "string"; this.outputType = "ArrayBuffer"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: DELIM_OPTIONS, }, { - "name": "Base", - "type": "number", - "value": 16 - } + name: "Base", + type: "number", + value: 16, + }, ]; } @@ -55,21 +55,24 @@ class FromCharcode extends Operation { i = 0; if (base < 2 || base > 36) { - throw new OperationError("Error: Base argument must be between 2 and 36"); + throw new OperationError( + "Error: Base argument must be between 2 and 36", + ); } if (input.length === 0) { - return new ArrayBuffer; + return new ArrayBuffer(); } - if (base !== 16 && isWorkerEnvironment()) self.setOption("attemptHighlight", false); + if (base !== 16 && isWorkerEnvironment()) + self.setOption("attemptHighlight", false); // Split into groups of 2 if the whole string is concatenated and // too long to be a single character if (bites.length === 1 && input.length > 17) { bites = []; for (i = 0; i < input.length; i += 2) { - bites.push(input.slice(i, i+2)); + bites.push(input.slice(i, i + 2)); } } @@ -79,7 +82,6 @@ class FromCharcode extends Operation { } return Utils.strToArrayBuffer(latin1); } - } export default FromCharcode; diff --git a/src/core/operations/FromDecimal.mjs b/src/core/operations/FromDecimal.mjs index f98931d6..a01a1f0e 100644 --- a/src/core/operations/FromDecimal.mjs +++ b/src/core/operations/FromDecimal.mjs @@ -5,14 +5,13 @@ */ import Operation from "../Operation.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; -import {fromDecimal} from "../lib/Decimal.mjs"; +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; +import { fromDecimal } from "../lib/Decimal.mjs"; /** * From Decimal operation */ class FromDecimal extends Operation { - /** * FromDecimal constructor */ @@ -21,52 +20,59 @@ class FromDecimal extends Operation { this.name = "From Decimal"; this.module = "Default"; - this.description = "Converts the data from an ordinal integer array back into its raw form.

e.g. 72 101 108 108 111 becomes Hello"; + this.description = + "Converts the data from an ordinal integer array back into its raw form.

e.g. 72 101 108 108 111 becomes Hello"; this.inputType = "string"; this.outputType = "byteArray"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: DELIM_OPTIONS, }, { - "name": "Support signed values", - "type": "boolean", - "value": false - } + name: "Support signed values", + type: "boolean", + value: false, + }, ]; this.checks = [ { - pattern: "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?: (?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", + pattern: + "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?: (?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", flags: "", - args: ["Space", false] + args: ["Space", false], }, { - pattern: "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?:,(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", + pattern: + "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?:,(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", flags: "", - args: ["Comma", false] + args: ["Comma", false], }, { - pattern: "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?:;(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", + pattern: + "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?:;(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", flags: "", - args: ["Semi-colon", false] + args: ["Semi-colon", false], }, { - pattern: "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?::(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", + pattern: + "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?::(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", flags: "", - args: ["Colon", false] + args: ["Colon", false], }, { - pattern: "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?:\\n(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", + pattern: + "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?:\\n(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", flags: "", - args: ["Line feed", false] + args: ["Line feed", false], }, { - pattern: "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?:\\r\\n(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", + pattern: + "^(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])(?:\\r\\n(?:\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5]))*$", flags: "", - args: ["CRLF", false] - } + args: ["CRLF", false], + }, ]; } @@ -77,12 +83,12 @@ class FromDecimal extends Operation { */ run(input, args) { let data = fromDecimal(input, args[0]); - if (args[1]) { // Convert negatives - data = data.map(v => v < 0 ? 0xFF + v + 1 : v); + if (args[1]) { + // Convert negatives + data = data.map((v) => (v < 0 ? 0xff + v + 1 : v)); } return data; } - } export default FromDecimal; diff --git a/src/core/operations/FromHTMLEntity.mjs b/src/core/operations/FromHTMLEntity.mjs index 4d09876d..179546bf 100644 --- a/src/core/operations/FromHTMLEntity.mjs +++ b/src/core/operations/FromHTMLEntity.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * From HTML Entity operation */ class FromHTMLEntity extends Operation { - /** * FromHTMLEntity constructor */ @@ -20,8 +19,10 @@ class FromHTMLEntity extends Operation { this.name = "From HTML Entity"; this.module = "Encodings"; - this.description = "Converts HTML entities back to characters

e.g. &amp; becomes &"; - this.infoURL = "https://wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references"; + this.description = + "Converts HTML entities back to characters

e.g. &amp; becomes &"; + this.infoURL = + "https://wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references"; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -29,8 +30,8 @@ class FromHTMLEntity extends Operation { { pattern: "&(?:#\\d{2,3}|#x[\\da-f]{2}|[a-z]{2,6});", flags: "i", - args: [] - } + args: [], + }, ]; } @@ -47,1493 +48,1498 @@ class FromHTMLEntity extends Operation { while ((m = regex.exec(input))) { // Add up to match - for (; i < m.index;) - output += input[i++]; + for (; i < m.index; ) output += input[i++]; // Add match const bite = entityToByte[m[1]]; if (bite) { output += Utils.chr(bite); - } else if (!bite && m[1][0] === "#" && m[1].length > 1 && /^#\d{1,6}$/.test(m[1])) { + } else if ( + !bite && + m[1][0] === "#" && + m[1].length > 1 && + /^#\d{1,6}$/.test(m[1]) + ) { // Numeric entity (e.g. ) const num = m[1].slice(1, m[1].length); output += Utils.chr(parseInt(num, 10)); - } else if (!bite && m[1][0] === "#" && m[1].length > 3 && /^#x[\dA-F]{2,8}$/i.test(m[1])) { + } else if ( + !bite && + m[1][0] === "#" && + m[1].length > 3 && + /^#x[\dA-F]{2,8}$/i.test(m[1]) + ) { // Hex entity (e.g. :) const hex = m[1].slice(2, m[1].length); output += Utils.chr(parseInt(hex, 16)); } else { // Not a valid entity, print as normal - for (; i < regex.lastIndex;) - output += input[i++]; + for (; i < regex.lastIndex; ) output += input[i++]; } i = regex.lastIndex; } // Add all after final match - for (; i < input.length;) - output += input[i++]; + for (; i < input.length; ) output += input[i++]; return output; } - } - /** * Lookup table to translate HTML entity codes to their byte values. */ const entityToByte = { - "Tab": 9, - "NewLine": 10, - "excl": 33, - "quot": 34, - "num": 35, - "dollar": 36, - "percnt": 37, - "amp": 38, - "apos": 39, - "lpar": 40, - "rpar": 41, - "ast": 42, - "plus": 43, - "comma": 44, - "period": 46, - "sol": 47, - "colon": 58, - "semi": 59, - "lt": 60, - "equals": 61, - "gt": 62, - "quest": 63, - "commat": 64, - "lsqb": 91, - "bsol": 92, - "rsqb": 93, - "Hat": 94, - "lowbar": 95, - "grave": 96, - "lcub": 123, - "verbar": 124, - "rcub": 125, - "nbsp": 160, - "iexcl": 161, - "cent": 162, - "pound": 163, - "curren": 164, - "yen": 165, - "brvbar": 166, - "sect": 167, - "uml": 168, - "copy": 169, - "ordf": 170, - "laquo": 171, - "not": 172, - "shy": 173, - "reg": 174, - "macr": 175, - "deg": 176, - "plusmn": 177, - "sup2": 178, - "sup3": 179, - "acute": 180, - "micro": 181, - "para": 182, - "middot": 183, - "cedil": 184, - "sup1": 185, - "ordm": 186, - "raquo": 187, - "frac14": 188, - "frac12": 189, - "frac34": 190, - "iquest": 191, - "Agrave": 192, - "Aacute": 193, - "Acirc": 194, - "Atilde": 195, - "Auml": 196, - "Aring": 197, - "AElig": 198, - "Ccedil": 199, - "Egrave": 200, - "Eacute": 201, - "Ecirc": 202, - "Euml": 203, - "Igrave": 204, - "Iacute": 205, - "Icirc": 206, - "Iuml": 207, - "ETH": 208, - "Ntilde": 209, - "Ograve": 210, - "Oacute": 211, - "Ocirc": 212, - "Otilde": 213, - "Ouml": 214, - "times": 215, - "Oslash": 216, - "Ugrave": 217, - "Uacute": 218, - "Ucirc": 219, - "Uuml": 220, - "Yacute": 221, - "THORN": 222, - "szlig": 223, - "agrave": 224, - "aacute": 225, - "acirc": 226, - "atilde": 227, - "auml": 228, - "aring": 229, - "aelig": 230, - "ccedil": 231, - "egrave": 232, - "eacute": 233, - "ecirc": 234, - "euml": 235, - "igrave": 236, - "iacute": 237, - "icirc": 238, - "iuml": 239, - "eth": 240, - "ntilde": 241, - "ograve": 242, - "oacute": 243, - "ocirc": 244, - "otilde": 245, - "ouml": 246, - "divide": 247, - "oslash": 248, - "ugrave": 249, - "uacute": 250, - "ucirc": 251, - "uuml": 252, - "yacute": 253, - "thorn": 254, - "yuml": 255, - "Amacr": 256, - "amacr": 257, - "Abreve": 258, - "abreve": 259, - "Aogon": 260, - "aogon": 261, - "Cacute": 262, - "cacute": 263, - "Ccirc": 264, - "ccirc": 265, - "Cdot": 266, - "cdot": 267, - "Ccaron": 268, - "ccaron": 269, - "Dcaron": 270, - "dcaron": 271, - "Dstrok": 272, - "dstrok": 273, - "Emacr": 274, - "emacr": 275, - "Edot": 278, - "edot": 279, - "Eogon": 280, - "eogon": 281, - "Ecaron": 282, - "ecaron": 283, - "Gcirc": 284, - "gcirc": 285, - "Gbreve": 286, - "gbreve": 287, - "Gdot": 288, - "gdot": 289, - "Gcedil": 290, - "Hcirc": 292, - "hcirc": 293, - "Hstrok": 294, - "hstrok": 295, - "Itilde": 296, - "itilde": 297, - "Imacr": 298, - "imacr": 299, - "Iogon": 302, - "iogon": 303, - "Idot": 304, - "imath": 305, - "IJlig": 306, - "ijlig": 307, - "Jcirc": 308, - "jcirc": 309, - "Kcedil": 310, - "kcedil": 311, - "kgreen": 312, - "Lacute": 313, - "lacute": 314, - "Lcedil": 315, - "lcedil": 316, - "Lcaron": 317, - "lcaron": 318, - "Lmidot": 319, - "lmidot": 320, - "Lstrok": 321, - "lstrok": 322, - "Nacute": 323, - "nacute": 324, - "Ncedil": 325, - "ncedil": 326, - "Ncaron": 327, - "ncaron": 328, - "napos": 329, - "ENG": 330, - "eng": 331, - "Omacr": 332, - "omacr": 333, - "Odblac": 336, - "odblac": 337, - "OElig": 338, - "oelig": 339, - "Racute": 340, - "racute": 341, - "Rcedil": 342, - "rcedil": 343, - "Rcaron": 344, - "rcaron": 345, - "Sacute": 346, - "sacute": 347, - "Scirc": 348, - "scirc": 349, - "Scedil": 350, - "scedil": 351, - "Scaron": 352, - "scaron": 353, - "Tcedil": 354, - "tcedil": 355, - "Tcaron": 356, - "tcaron": 357, - "Tstrok": 358, - "tstrok": 359, - "Utilde": 360, - "utilde": 361, - "Umacr": 362, - "umacr": 363, - "Ubreve": 364, - "ubreve": 365, - "Uring": 366, - "uring": 367, - "Udblac": 368, - "udblac": 369, - "Uogon": 370, - "uogon": 371, - "Wcirc": 372, - "wcirc": 373, - "Ycirc": 374, - "ycirc": 375, - "Yuml": 376, - "Zacute": 377, - "zacute": 378, - "Zdot": 379, - "zdot": 380, - "Zcaron": 381, - "zcaron": 382, - "fnof": 402, - "imped": 437, - "gacute": 501, - "jmath": 567, - "circ": 710, - "caron": 711, - "breve": 728, - "dot": 729, - "ring": 730, - "ogon": 731, - "tilde": 732, - "dblac": 733, - "DownBreve": 785, - "UnderBar": 818, - "Alpha": 913, - "Beta": 914, - "Gamma": 915, - "Delta": 916, - "Epsilon": 917, - "Zeta": 918, - "Eta": 919, - "Theta": 920, - "Iota": 921, - "Kappa": 922, - "Lambda": 923, - "Mu": 924, - "Nu": 925, - "Xi": 926, - "Omicron": 927, - "Pi": 928, - "Rho": 929, - "Sigma": 931, - "Tau": 932, - "Upsilon": 933, - "Phi": 934, - "Chi": 935, - "Psi": 936, - "Omega": 937, - "alpha": 945, - "beta": 946, - "gamma": 947, - "delta": 948, - "epsilon": 949, - "zeta": 950, - "eta": 951, - "theta": 952, - "iota": 953, - "kappa": 954, - "lambda": 955, - "mu": 956, - "nu": 957, - "xi": 958, - "omicron": 959, - "pi": 960, - "rho": 961, - "sigmaf": 962, - "sigma": 963, - "tau": 964, - "upsilon": 965, - "phi": 966, - "chi": 967, - "psi": 968, - "omega": 969, - "thetasym": 977, - "upsih": 978, - "straightphi": 981, - "piv": 982, - "Gammad": 988, - "gammad": 989, - "kappav": 1008, - "rhov": 1009, - "epsi": 1013, - "bepsi": 1014, - "IOcy": 1025, - "DJcy": 1026, - "GJcy": 1027, - "Jukcy": 1028, - "DScy": 1029, - "Iukcy": 1030, - "YIcy": 1031, - "Jsercy": 1032, - "LJcy": 1033, - "NJcy": 1034, - "TSHcy": 1035, - "KJcy": 1036, - "Ubrcy": 1038, - "DZcy": 1039, - "Acy": 1040, - "Bcy": 1041, - "Vcy": 1042, - "Gcy": 1043, - "Dcy": 1044, - "IEcy": 1045, - "ZHcy": 1046, - "Zcy": 1047, - "Icy": 1048, - "Jcy": 1049, - "Kcy": 1050, - "Lcy": 1051, - "Mcy": 1052, - "Ncy": 1053, - "Ocy": 1054, - "Pcy": 1055, - "Rcy": 1056, - "Scy": 1057, - "Tcy": 1058, - "Ucy": 1059, - "Fcy": 1060, - "KHcy": 1061, - "TScy": 1062, - "CHcy": 1063, - "SHcy": 1064, - "SHCHcy": 1065, - "HARDcy": 1066, - "Ycy": 1067, - "SOFTcy": 1068, - "Ecy": 1069, - "YUcy": 1070, - "YAcy": 1071, - "acy": 1072, - "bcy": 1073, - "vcy": 1074, - "gcy": 1075, - "dcy": 1076, - "iecy": 1077, - "zhcy": 1078, - "zcy": 1079, - "icy": 1080, - "jcy": 1081, - "kcy": 1082, - "lcy": 1083, - "mcy": 1084, - "ncy": 1085, - "ocy": 1086, - "pcy": 1087, - "rcy": 1088, - "scy": 1089, - "tcy": 1090, - "ucy": 1091, - "fcy": 1092, - "khcy": 1093, - "tscy": 1094, - "chcy": 1095, - "shcy": 1096, - "shchcy": 1097, - "hardcy": 1098, - "ycy": 1099, - "softcy": 1100, - "ecy": 1101, - "yucy": 1102, - "yacy": 1103, - "iocy": 1105, - "djcy": 1106, - "gjcy": 1107, - "jukcy": 1108, - "dscy": 1109, - "iukcy": 1110, - "yicy": 1111, - "jsercy": 1112, - "ljcy": 1113, - "njcy": 1114, - "tshcy": 1115, - "kjcy": 1116, - "ubrcy": 1118, - "dzcy": 1119, - "ensp": 8194, - "emsp": 8195, - "emsp13": 8196, - "emsp14": 8197, - "numsp": 8199, - "puncsp": 8200, - "thinsp": 8201, - "hairsp": 8202, - "ZeroWidthSpace": 8203, - "zwnj": 8204, - "zwj": 8205, - "lrm": 8206, - "rlm": 8207, - "hyphen": 8208, - "ndash": 8211, - "mdash": 8212, - "horbar": 8213, - "Verbar": 8214, - "lsquo": 8216, - "rsquo": 8217, - "sbquo": 8218, - "ldquo": 8220, - "rdquo": 8221, - "bdquo": 8222, - "dagger": 8224, - "Dagger": 8225, - "bull": 8226, - "nldr": 8229, - "hellip": 8230, - "permil": 8240, - "pertenk": 8241, - "prime": 8242, - "Prime": 8243, - "tprime": 8244, - "bprime": 8245, - "lsaquo": 8249, - "rsaquo": 8250, - "oline": 8254, - "caret": 8257, - "hybull": 8259, - "frasl": 8260, - "bsemi": 8271, - "qprime": 8279, - "MediumSpace": 8287, - "NoBreak": 8288, - "ApplyFunction": 8289, - "InvisibleTimes": 8290, - "InvisibleComma": 8291, - "euro": 8364, - "tdot": 8411, - "TripleDot": 8411, - "DotDot": 8412, - "Copf": 8450, - "incare": 8453, - "gscr": 8458, - "hamilt": 8459, - "Hfr": 8460, - "quaternions": 8461, - "planckh": 8462, - "planck": 8463, - "Iscr": 8464, - "image": 8465, - "Lscr": 8466, - "ell": 8467, - "Nopf": 8469, - "numero": 8470, - "copysr": 8471, - "weierp": 8472, - "Popf": 8473, - "rationals": 8474, - "Rscr": 8475, - "real": 8476, - "reals": 8477, - "rx": 8478, - "trade": 8482, - "integers": 8484, - "ohm": 8486, - "mho": 8487, - "Zfr": 8488, - "iiota": 8489, - "angst": 8491, - "bernou": 8492, - "Cfr": 8493, - "escr": 8495, - "Escr": 8496, - "Fscr": 8497, - "phmmat": 8499, - "order": 8500, - "alefsym": 8501, - "beth": 8502, - "gimel": 8503, - "daleth": 8504, - "CapitalDifferentialD": 8517, - "DifferentialD": 8518, - "ExponentialE": 8519, - "ImaginaryI": 8520, - "frac13": 8531, - "frac23": 8532, - "frac15": 8533, - "frac25": 8534, - "frac35": 8535, - "frac45": 8536, - "frac16": 8537, - "frac56": 8538, - "frac18": 8539, - "frac38": 8540, - "frac58": 8541, - "frac78": 8542, - "larr": 8592, - "uarr": 8593, - "rarr": 8594, - "darr": 8595, - "harr": 8596, - "varr": 8597, - "nwarr": 8598, - "nearr": 8599, - "searr": 8600, - "swarr": 8601, - "nlarr": 8602, - "nrarr": 8603, - "rarrw": 8605, - "Larr": 8606, - "Uarr": 8607, - "Rarr": 8608, - "Darr": 8609, - "larrtl": 8610, - "rarrtl": 8611, - "LeftTeeArrow": 8612, - "UpTeeArrow": 8613, - "map": 8614, - "DownTeeArrow": 8615, - "larrhk": 8617, - "rarrhk": 8618, - "larrlp": 8619, - "rarrlp": 8620, - "harrw": 8621, - "nharr": 8622, - "lsh": 8624, - "rsh": 8625, - "ldsh": 8626, - "rdsh": 8627, - "crarr": 8629, - "cularr": 8630, - "curarr": 8631, - "olarr": 8634, - "orarr": 8635, - "lharu": 8636, - "lhard": 8637, - "uharr": 8638, - "uharl": 8639, - "rharu": 8640, - "rhard": 8641, - "dharr": 8642, - "dharl": 8643, - "rlarr": 8644, - "udarr": 8645, - "lrarr": 8646, - "llarr": 8647, - "uuarr": 8648, - "rrarr": 8649, - "ddarr": 8650, - "lrhar": 8651, - "rlhar": 8652, - "nlArr": 8653, - "nhArr": 8654, - "nrArr": 8655, - "lArr": 8656, - "uArr": 8657, - "rArr": 8658, - "dArr": 8659, - "hArr": 8660, - "vArr": 8661, - "nwArr": 8662, - "neArr": 8663, - "seArr": 8664, - "swArr": 8665, - "lAarr": 8666, - "rAarr": 8667, - "zigrarr": 8669, - "larrb": 8676, - "rarrb": 8677, - "duarr": 8693, - "loarr": 8701, - "roarr": 8702, - "hoarr": 8703, - "forall": 8704, - "comp": 8705, - "part": 8706, - "exist": 8707, - "nexist": 8708, - "empty": 8709, - "nabla": 8711, - "isin": 8712, - "notin": 8713, - "ni": 8715, - "notni": 8716, - "prod": 8719, - "coprod": 8720, - "sum": 8721, - "minus": 8722, - "mnplus": 8723, - "plusdo": 8724, - "setmn": 8726, - "lowast": 8727, - "compfn": 8728, - "radic": 8730, - "prop": 8733, - "infin": 8734, - "angrt": 8735, - "ang": 8736, - "angmsd": 8737, - "angsph": 8738, - "mid": 8739, - "nmid": 8740, - "par": 8741, - "npar": 8742, - "and": 8743, - "or": 8744, - "cap": 8745, - "cup": 8746, - "int": 8747, - "Int": 8748, - "tint": 8749, - "conint": 8750, - "Conint": 8751, - "Cconint": 8752, - "cwint": 8753, - "cwconint": 8754, - "awconint": 8755, - "there4": 8756, - "becaus": 8757, - "ratio": 8758, - "Colon": 8759, - "minusd": 8760, - "mDDot": 8762, - "homtht": 8763, - "sim": 8764, - "bsim": 8765, - "ac": 8766, - "acd": 8767, - "wreath": 8768, - "nsim": 8769, - "esim": 8770, - "sime": 8771, - "nsime": 8772, - "cong": 8773, - "simne": 8774, - "ncong": 8775, - "asymp": 8776, - "nap": 8777, - "ape": 8778, - "apid": 8779, - "bcong": 8780, - "asympeq": 8781, - "bump": 8782, - "bumpe": 8783, - "esdot": 8784, - "eDot": 8785, - "efDot": 8786, - "erDot": 8787, - "colone": 8788, - "ecolon": 8789, - "ecir": 8790, - "cire": 8791, - "wedgeq": 8793, - "veeeq": 8794, - "trie": 8796, - "equest": 8799, - "ne": 8800, - "equiv": 8801, - "nequiv": 8802, - "le": 8804, - "ge": 8805, - "lE": 8806, - "gE": 8807, - "lnE": 8808, - "gnE": 8809, - "Lt": 8810, - "Gt": 8811, - "twixt": 8812, - "NotCupCap": 8813, - "nlt": 8814, - "ngt": 8815, - "nle": 8816, - "nge": 8817, - "lsim": 8818, - "gsim": 8819, - "nlsim": 8820, - "ngsim": 8821, - "lg": 8822, - "gl": 8823, - "ntlg": 8824, - "ntgl": 8825, - "pr": 8826, - "sc": 8827, - "prcue": 8828, - "sccue": 8829, - "prsim": 8830, - "scsim": 8831, - "npr": 8832, - "nsc": 8833, - "sub": 8834, - "sup": 8835, - "nsub": 8836, - "nsup": 8837, - "sube": 8838, - "supe": 8839, - "nsube": 8840, - "nsupe": 8841, - "subne": 8842, - "supne": 8843, - "cupdot": 8845, - "uplus": 8846, - "sqsub": 8847, - "sqsup": 8848, - "sqsube": 8849, - "sqsupe": 8850, - "sqcap": 8851, - "sqcup": 8852, - "oplus": 8853, - "ominus": 8854, - "otimes": 8855, - "osol": 8856, - "odot": 8857, - "ocir": 8858, - "oast": 8859, - "odash": 8861, - "plusb": 8862, - "minusb": 8863, - "timesb": 8864, - "sdotb": 8865, - "vdash": 8866, - "dashv": 8867, - "top": 8868, - "perp": 8869, - "models": 8871, - "vDash": 8872, - "Vdash": 8873, - "Vvdash": 8874, - "VDash": 8875, - "nvdash": 8876, - "nvDash": 8877, - "nVdash": 8878, - "nVDash": 8879, - "prurel": 8880, - "vltri": 8882, - "vrtri": 8883, - "ltrie": 8884, - "rtrie": 8885, - "origof": 8886, - "imof": 8887, - "mumap": 8888, - "hercon": 8889, - "intcal": 8890, - "veebar": 8891, - "barvee": 8893, - "angrtvb": 8894, - "lrtri": 8895, - "xwedge": 8896, - "xvee": 8897, - "xcap": 8898, - "xcup": 8899, - "diam": 8900, - "sdot": 8901, - "sstarf": 8902, - "divonx": 8903, - "bowtie": 8904, - "ltimes": 8905, - "rtimes": 8906, - "lthree": 8907, - "rthree": 8908, - "bsime": 8909, - "cuvee": 8910, - "cuwed": 8911, - "Sub": 8912, - "Sup": 8913, - "Cap": 8914, - "Cup": 8915, - "fork": 8916, - "epar": 8917, - "ltdot": 8918, - "gtdot": 8919, - "Ll": 8920, - "Gg": 8921, - "leg": 8922, - "gel": 8923, - "cuepr": 8926, - "cuesc": 8927, - "nprcue": 8928, - "nsccue": 8929, - "nsqsube": 8930, - "nsqsupe": 8931, - "lnsim": 8934, - "gnsim": 8935, - "prnsim": 8936, - "scnsim": 8937, - "nltri": 8938, - "nrtri": 8939, - "nltrie": 8940, - "nrtrie": 8941, - "vellip": 8942, - "ctdot": 8943, - "utdot": 8944, - "dtdot": 8945, - "disin": 8946, - "isinsv": 8947, - "isins": 8948, - "isindot": 8949, - "notinvc": 8950, - "notinvb": 8951, - "isinE": 8953, - "nisd": 8954, - "xnis": 8955, - "nis": 8956, - "notnivc": 8957, - "notnivb": 8958, - "barwed": 8965, - "Barwed": 8966, - "lceil": 8968, - "rceil": 8969, - "lfloor": 8970, - "rfloor": 8971, - "drcrop": 8972, - "dlcrop": 8973, - "urcrop": 8974, - "ulcrop": 8975, - "bnot": 8976, - "profline": 8978, - "profsurf": 8979, - "telrec": 8981, - "target": 8982, - "ulcorn": 8988, - "urcorn": 8989, - "dlcorn": 8990, - "drcorn": 8991, - "frown": 8994, - "smile": 8995, - "lang": 9001, - "rang": 9002, - "cylcty": 9005, - "profalar": 9006, - "topbot": 9014, - "ovbar": 9021, - "solbar": 9023, - "angzarr": 9084, - "lmoust": 9136, - "rmoust": 9137, - "tbrk": 9140, - "bbrk": 9141, - "bbrktbrk": 9142, - "OverParenthesis": 9180, - "UnderParenthesis": 9181, - "OverBrace": 9182, - "UnderBrace": 9183, - "trpezium": 9186, - "elinters": 9191, - "blank": 9251, - "oS": 9416, - "boxh": 9472, - "boxv": 9474, - "boxdr": 9484, - "boxdl": 9488, - "boxur": 9492, - "boxul": 9496, - "boxvr": 9500, - "boxvl": 9508, - "boxhd": 9516, - "boxhu": 9524, - "boxvh": 9532, - "boxH": 9552, - "boxV": 9553, - "boxdR": 9554, - "boxDr": 9555, - "boxDR": 9556, - "boxdL": 9557, - "boxDl": 9558, - "boxDL": 9559, - "boxuR": 9560, - "boxUr": 9561, - "boxUR": 9562, - "boxuL": 9563, - "boxUl": 9564, - "boxUL": 9565, - "boxvR": 9566, - "boxVr": 9567, - "boxVR": 9568, - "boxvL": 9569, - "boxVl": 9570, - "boxVL": 9571, - "boxHd": 9572, - "boxhD": 9573, - "boxHD": 9574, - "boxHu": 9575, - "boxhU": 9576, - "boxHU": 9577, - "boxvH": 9578, - "boxVh": 9579, - "boxVH": 9580, - "uhblk": 9600, - "lhblk": 9604, - "block": 9608, - "blk14": 9617, - "blk12": 9618, - "blk34": 9619, - "squ": 9633, - "squf": 9642, - "EmptyVerySmallSquare": 9643, - "rect": 9645, - "marker": 9646, - "fltns": 9649, - "xutri": 9651, - "utrif": 9652, - "utri": 9653, - "rtrif": 9656, - "rtri": 9657, - "xdtri": 9661, - "dtrif": 9662, - "dtri": 9663, - "ltrif": 9666, - "ltri": 9667, - "loz": 9674, - "cir": 9675, - "tridot": 9708, - "xcirc": 9711, - "ultri": 9720, - "urtri": 9721, - "lltri": 9722, - "EmptySmallSquare": 9723, - "FilledSmallSquare": 9724, - "starf": 9733, - "bigstar": 9733, - "star": 9734, - "phone": 9742, - "female": 9792, - "male": 9794, - "spades": 9824, - "clubs": 9827, - "hearts": 9829, - "diams": 9830, - "sung": 9834, - "flat": 9837, - "natur": 9838, - "sharp": 9839, - "check": 10003, - "cross": 10007, - "malt": 10016, - "sext": 10038, - "VerticalSeparator": 10072, - "lbbrk": 10098, - "rbbrk": 10099, - "lobrk": 10214, - "robrk": 10215, - "Lang": 10218, - "Rang": 10219, - "loang": 10220, - "roang": 10221, - "xlarr": 10229, - "xrarr": 10230, - "xharr": 10231, - "xlArr": 10232, - "xrArr": 10233, - "xhArr": 10234, - "xmap": 10236, - "dzigrarr": 10239, - "nvlArr": 10498, - "nvrArr": 10499, - "nvHarr": 10500, - "Map": 10501, - "lbarr": 10508, - "rbarr": 10509, - "lBarr": 10510, - "rBarr": 10511, - "RBarr": 10512, - "DDotrahd": 10513, - "UpArrowBar": 10514, - "DownArrowBar": 10515, - "Rarrtl": 10518, - "latail": 10521, - "ratail": 10522, - "lAtail": 10523, - "rAtail": 10524, - "larrfs": 10525, - "rarrfs": 10526, - "larrbfs": 10527, - "rarrbfs": 10528, - "nwarhk": 10531, - "nearhk": 10532, - "searhk": 10533, - "swarhk": 10534, - "nwnear": 10535, - "nesear": 10536, - "seswar": 10537, - "swnwar": 10538, - "rarrc": 10547, - "cudarrr": 10549, - "ldca": 10550, - "rdca": 10551, - "cudarrl": 10552, - "larrpl": 10553, - "curarrm": 10556, - "cularrp": 10557, - "rarrpl": 10565, - "harrcir": 10568, - "Uarrocir": 10569, - "lurdshar": 10570, - "ldrushar": 10571, - "LeftRightVector": 10574, - "RightUpDownVector": 10575, - "DownLeftRightVector": 10576, - "LeftUpDownVector": 10577, - "LeftVectorBar": 10578, - "RightVectorBar": 10579, - "RightUpVectorBar": 10580, - "RightDownVectorBar": 10581, - "DownLeftVectorBar": 10582, - "DownRightVectorBar": 10583, - "LeftUpVectorBar": 10584, - "LeftDownVectorBar": 10585, - "LeftTeeVector": 10586, - "RightTeeVector": 10587, - "RightUpTeeVector": 10588, - "RightDownTeeVector": 10589, - "DownLeftTeeVector": 10590, - "DownRightTeeVector": 10591, - "LeftUpTeeVector": 10592, - "LeftDownTeeVector": 10593, - "lHar": 10594, - "uHar": 10595, - "rHar": 10596, - "dHar": 10597, - "luruhar": 10598, - "ldrdhar": 10599, - "ruluhar": 10600, - "rdldhar": 10601, - "lharul": 10602, - "llhard": 10603, - "rharul": 10604, - "lrhard": 10605, - "udhar": 10606, - "duhar": 10607, - "RoundImplies": 10608, - "erarr": 10609, - "simrarr": 10610, - "larrsim": 10611, - "rarrsim": 10612, - "rarrap": 10613, - "ltlarr": 10614, - "gtrarr": 10616, - "subrarr": 10617, - "suplarr": 10619, - "lfisht": 10620, - "rfisht": 10621, - "ufisht": 10622, - "dfisht": 10623, - "lopar": 10629, - "ropar": 10630, - "lbrke": 10635, - "rbrke": 10636, - "lbrkslu": 10637, - "rbrksld": 10638, - "lbrksld": 10639, - "rbrkslu": 10640, - "langd": 10641, - "rangd": 10642, - "lparlt": 10643, - "rpargt": 10644, - "gtlPar": 10645, - "ltrPar": 10646, - "vzigzag": 10650, - "vangrt": 10652, - "angrtvbd": 10653, - "ange": 10660, - "range": 10661, - "dwangle": 10662, - "uwangle": 10663, - "angmsdaa": 10664, - "angmsdab": 10665, - "angmsdac": 10666, - "angmsdad": 10667, - "angmsdae": 10668, - "angmsdaf": 10669, - "angmsdag": 10670, - "angmsdah": 10671, - "bemptyv": 10672, - "demptyv": 10673, - "cemptyv": 10674, - "raemptyv": 10675, - "laemptyv": 10676, - "ohbar": 10677, - "omid": 10678, - "opar": 10679, - "operp": 10681, - "olcross": 10683, - "odsold": 10684, - "olcir": 10686, - "ofcir": 10687, - "olt": 10688, - "ogt": 10689, - "cirscir": 10690, - "cirE": 10691, - "solb": 10692, - "bsolb": 10693, - "boxbox": 10697, - "trisb": 10701, - "rtriltri": 10702, - "LeftTriangleBar": 10703, - "RightTriangleBar": 10704, - "race": 10714, - "iinfin": 10716, - "infintie": 10717, - "nvinfin": 10718, - "eparsl": 10723, - "smeparsl": 10724, - "eqvparsl": 10725, - "lozf": 10731, - "RuleDelayed": 10740, - "dsol": 10742, - "xodot": 10752, - "xoplus": 10753, - "xotime": 10754, - "xuplus": 10756, - "xsqcup": 10758, - "qint": 10764, - "fpartint": 10765, - "cirfnint": 10768, - "awint": 10769, - "rppolint": 10770, - "scpolint": 10771, - "npolint": 10772, - "pointint": 10773, - "quatint": 10774, - "intlarhk": 10775, - "pluscir": 10786, - "plusacir": 10787, - "simplus": 10788, - "plusdu": 10789, - "plussim": 10790, - "plustwo": 10791, - "mcomma": 10793, - "minusdu": 10794, - "loplus": 10797, - "roplus": 10798, - "Cross": 10799, - "timesd": 10800, - "timesbar": 10801, - "smashp": 10803, - "lotimes": 10804, - "rotimes": 10805, - "otimesas": 10806, - "Otimes": 10807, - "odiv": 10808, - "triplus": 10809, - "triminus": 10810, - "tritime": 10811, - "iprod": 10812, - "amalg": 10815, - "capdot": 10816, - "ncup": 10818, - "ncap": 10819, - "capand": 10820, - "cupor": 10821, - "cupcap": 10822, - "capcup": 10823, - "cupbrcap": 10824, - "capbrcup": 10825, - "cupcup": 10826, - "capcap": 10827, - "ccups": 10828, - "ccaps": 10829, - "ccupssm": 10832, - "And": 10835, - "Or": 10836, - "andand": 10837, - "oror": 10838, - "orslope": 10839, - "andslope": 10840, - "andv": 10842, - "orv": 10843, - "andd": 10844, - "ord": 10845, - "wedbar": 10847, - "sdote": 10854, - "simdot": 10858, - "congdot": 10861, - "easter": 10862, - "apacir": 10863, - "apE": 10864, - "eplus": 10865, - "pluse": 10866, - "Esim": 10867, - "Colone": 10868, - "Equal": 10869, - "eDDot": 10871, - "equivDD": 10872, - "ltcir": 10873, - "gtcir": 10874, - "ltquest": 10875, - "gtquest": 10876, - "les": 10877, - "ges": 10878, - "lesdot": 10879, - "gesdot": 10880, - "lesdoto": 10881, - "gesdoto": 10882, - "lesdotor": 10883, - "gesdotol": 10884, - "lap": 10885, - "gap": 10886, - "lne": 10887, - "gne": 10888, - "lnap": 10889, - "gnap": 10890, - "lEg": 10891, - "gEl": 10892, - "lsime": 10893, - "gsime": 10894, - "lsimg": 10895, - "gsiml": 10896, - "lgE": 10897, - "glE": 10898, - "lesges": 10899, - "gesles": 10900, - "els": 10901, - "egs": 10902, - "elsdot": 10903, - "egsdot": 10904, - "el": 10905, - "eg": 10906, - "siml": 10909, - "simg": 10910, - "simlE": 10911, - "simgE": 10912, - "LessLess": 10913, - "GreaterGreater": 10914, - "glj": 10916, - "gla": 10917, - "ltcc": 10918, - "gtcc": 10919, - "lescc": 10920, - "gescc": 10921, - "smt": 10922, - "lat": 10923, - "smte": 10924, - "late": 10925, - "bumpE": 10926, - "pre": 10927, - "sce": 10928, - "prE": 10931, - "scE": 10932, - "prnE": 10933, - "scnE": 10934, - "prap": 10935, - "scap": 10936, - "prnap": 10937, - "scnap": 10938, - "Pr": 10939, - "Sc": 10940, - "subdot": 10941, - "supdot": 10942, - "subplus": 10943, - "supplus": 10944, - "submult": 10945, - "supmult": 10946, - "subedot": 10947, - "supedot": 10948, - "subE": 10949, - "supE": 10950, - "subsim": 10951, - "supsim": 10952, - "subnE": 10955, - "supnE": 10956, - "csub": 10959, - "csup": 10960, - "csube": 10961, - "csupe": 10962, - "subsup": 10963, - "supsub": 10964, - "subsub": 10965, - "supsup": 10966, - "suphsub": 10967, - "supdsub": 10968, - "forkv": 10969, - "topfork": 10970, - "mlcp": 10971, - "Dashv": 10980, - "Vdashl": 10982, - "Barv": 10983, - "vBar": 10984, - "vBarv": 10985, - "Vbar": 10987, - "Not": 10988, - "bNot": 10989, - "rnmid": 10990, - "cirmid": 10991, - "midcir": 10992, - "topcir": 10993, - "nhpar": 10994, - "parsim": 10995, - "parsl": 11005, - "fflig": 64256, - "filig": 64257, - "fllig": 64258, - "ffilig": 64259, - "ffllig": 64260, - "Ascr": 119964, - "Cscr": 119966, - "Dscr": 119967, - "Gscr": 119970, - "Jscr": 119973, - "Kscr": 119974, - "Nscr": 119977, - "Oscr": 119978, - "Pscr": 119979, - "Qscr": 119980, - "Sscr": 119982, - "Tscr": 119983, - "Uscr": 119984, - "Vscr": 119985, - "Wscr": 119986, - "Xscr": 119987, - "Yscr": 119988, - "Zscr": 119989, - "ascr": 119990, - "bscr": 119991, - "cscr": 119992, - "dscr": 119993, - "fscr": 119995, - "hscr": 119997, - "iscr": 119998, - "jscr": 119999, - "kscr": 120000, - "lscr": 120001, - "mscr": 120002, - "nscr": 120003, - "pscr": 120005, - "qscr": 120006, - "rscr": 120007, - "sscr": 120008, - "tscr": 120009, - "uscr": 120010, - "vscr": 120011, - "wscr": 120012, - "xscr": 120013, - "yscr": 120014, - "zscr": 120015, - "Afr": 120068, - "Bfr": 120069, - "Dfr": 120071, - "Efr": 120072, - "Ffr": 120073, - "Gfr": 120074, - "Jfr": 120077, - "Kfr": 120078, - "Lfr": 120079, - "Mfr": 120080, - "Nfr": 120081, - "Ofr": 120082, - "Pfr": 120083, - "Qfr": 120084, - "Sfr": 120086, - "Tfr": 120087, - "Ufr": 120088, - "Vfr": 120089, - "Wfr": 120090, - "Xfr": 120091, - "Yfr": 120092, - "afr": 120094, - "bfr": 120095, - "cfr": 120096, - "dfr": 120097, - "efr": 120098, - "ffr": 120099, - "gfr": 120100, - "hfr": 120101, - "ifr": 120102, - "jfr": 120103, - "kfr": 120104, - "lfr": 120105, - "mfr": 120106, - "nfr": 120107, - "ofr": 120108, - "pfr": 120109, - "qfr": 120110, - "rfr": 120111, - "sfr": 120112, - "tfr": 120113, - "ufr": 120114, - "vfr": 120115, - "wfr": 120116, - "xfr": 120117, - "yfr": 120118, - "zfr": 120119, - "Aopf": 120120, - "Bopf": 120121, - "Dopf": 120123, - "Eopf": 120124, - "Fopf": 120125, - "Gopf": 120126, - "Iopf": 120128, - "Jopf": 120129, - "Kopf": 120130, - "Lopf": 120131, - "Mopf": 120132, - "Oopf": 120134, - "Sopf": 120138, - "Topf": 120139, - "Uopf": 120140, - "Vopf": 120141, - "Wopf": 120142, - "Xopf": 120143, - "Yopf": 120144, - "aopf": 120146, - "bopf": 120147, - "copf": 120148, - "dopf": 120149, - "eopf": 120150, - "fopf": 120151, - "gopf": 120152, - "hopf": 120153, - "iopf": 120154, - "jopf": 120155, - "kopf": 120156, - "lopf": 120157, - "mopf": 120158, - "nopf": 120159, - "oopf": 120160, - "popf": 120161, - "qopf": 120162, - "ropf": 120163, - "sopf": 120164, - "topf": 120165, - "uopf": 120166, - "vopf": 120167, - "wopf": 120168, - "xopf": 120169, - "yopf": 120170, - "zopf": 120171 + Tab: 9, + NewLine: 10, + excl: 33, + quot: 34, + num: 35, + dollar: 36, + percnt: 37, + amp: 38, + apos: 39, + lpar: 40, + rpar: 41, + ast: 42, + plus: 43, + comma: 44, + period: 46, + sol: 47, + colon: 58, + semi: 59, + lt: 60, + equals: 61, + gt: 62, + quest: 63, + commat: 64, + lsqb: 91, + bsol: 92, + rsqb: 93, + Hat: 94, + lowbar: 95, + grave: 96, + lcub: 123, + verbar: 124, + rcub: 125, + nbsp: 160, + iexcl: 161, + cent: 162, + pound: 163, + curren: 164, + yen: 165, + brvbar: 166, + sect: 167, + uml: 168, + copy: 169, + ordf: 170, + laquo: 171, + not: 172, + shy: 173, + reg: 174, + macr: 175, + deg: 176, + plusmn: 177, + sup2: 178, + sup3: 179, + acute: 180, + micro: 181, + para: 182, + middot: 183, + cedil: 184, + sup1: 185, + ordm: 186, + raquo: 187, + frac14: 188, + frac12: 189, + frac34: 190, + iquest: 191, + Agrave: 192, + Aacute: 193, + Acirc: 194, + Atilde: 195, + Auml: 196, + Aring: 197, + AElig: 198, + Ccedil: 199, + Egrave: 200, + Eacute: 201, + Ecirc: 202, + Euml: 203, + Igrave: 204, + Iacute: 205, + Icirc: 206, + Iuml: 207, + ETH: 208, + Ntilde: 209, + Ograve: 210, + Oacute: 211, + Ocirc: 212, + Otilde: 213, + Ouml: 214, + times: 215, + Oslash: 216, + Ugrave: 217, + Uacute: 218, + Ucirc: 219, + Uuml: 220, + Yacute: 221, + THORN: 222, + szlig: 223, + agrave: 224, + aacute: 225, + acirc: 226, + atilde: 227, + auml: 228, + aring: 229, + aelig: 230, + ccedil: 231, + egrave: 232, + eacute: 233, + ecirc: 234, + euml: 235, + igrave: 236, + iacute: 237, + icirc: 238, + iuml: 239, + eth: 240, + ntilde: 241, + ograve: 242, + oacute: 243, + ocirc: 244, + otilde: 245, + ouml: 246, + divide: 247, + oslash: 248, + ugrave: 249, + uacute: 250, + ucirc: 251, + uuml: 252, + yacute: 253, + thorn: 254, + yuml: 255, + Amacr: 256, + amacr: 257, + Abreve: 258, + abreve: 259, + Aogon: 260, + aogon: 261, + Cacute: 262, + cacute: 263, + Ccirc: 264, + ccirc: 265, + Cdot: 266, + cdot: 267, + Ccaron: 268, + ccaron: 269, + Dcaron: 270, + dcaron: 271, + Dstrok: 272, + dstrok: 273, + Emacr: 274, + emacr: 275, + Edot: 278, + edot: 279, + Eogon: 280, + eogon: 281, + Ecaron: 282, + ecaron: 283, + Gcirc: 284, + gcirc: 285, + Gbreve: 286, + gbreve: 287, + Gdot: 288, + gdot: 289, + Gcedil: 290, + Hcirc: 292, + hcirc: 293, + Hstrok: 294, + hstrok: 295, + Itilde: 296, + itilde: 297, + Imacr: 298, + imacr: 299, + Iogon: 302, + iogon: 303, + Idot: 304, + imath: 305, + IJlig: 306, + ijlig: 307, + Jcirc: 308, + jcirc: 309, + Kcedil: 310, + kcedil: 311, + kgreen: 312, + Lacute: 313, + lacute: 314, + Lcedil: 315, + lcedil: 316, + Lcaron: 317, + lcaron: 318, + Lmidot: 319, + lmidot: 320, + Lstrok: 321, + lstrok: 322, + Nacute: 323, + nacute: 324, + Ncedil: 325, + ncedil: 326, + Ncaron: 327, + ncaron: 328, + napos: 329, + ENG: 330, + eng: 331, + Omacr: 332, + omacr: 333, + Odblac: 336, + odblac: 337, + OElig: 338, + oelig: 339, + Racute: 340, + racute: 341, + Rcedil: 342, + rcedil: 343, + Rcaron: 344, + rcaron: 345, + Sacute: 346, + sacute: 347, + Scirc: 348, + scirc: 349, + Scedil: 350, + scedil: 351, + Scaron: 352, + scaron: 353, + Tcedil: 354, + tcedil: 355, + Tcaron: 356, + tcaron: 357, + Tstrok: 358, + tstrok: 359, + Utilde: 360, + utilde: 361, + Umacr: 362, + umacr: 363, + Ubreve: 364, + ubreve: 365, + Uring: 366, + uring: 367, + Udblac: 368, + udblac: 369, + Uogon: 370, + uogon: 371, + Wcirc: 372, + wcirc: 373, + Ycirc: 374, + ycirc: 375, + Yuml: 376, + Zacute: 377, + zacute: 378, + Zdot: 379, + zdot: 380, + Zcaron: 381, + zcaron: 382, + fnof: 402, + imped: 437, + gacute: 501, + jmath: 567, + circ: 710, + caron: 711, + breve: 728, + dot: 729, + ring: 730, + ogon: 731, + tilde: 732, + dblac: 733, + DownBreve: 785, + UnderBar: 818, + Alpha: 913, + Beta: 914, + Gamma: 915, + Delta: 916, + Epsilon: 917, + Zeta: 918, + Eta: 919, + Theta: 920, + Iota: 921, + Kappa: 922, + Lambda: 923, + Mu: 924, + Nu: 925, + Xi: 926, + Omicron: 927, + Pi: 928, + Rho: 929, + Sigma: 931, + Tau: 932, + Upsilon: 933, + Phi: 934, + Chi: 935, + Psi: 936, + Omega: 937, + alpha: 945, + beta: 946, + gamma: 947, + delta: 948, + epsilon: 949, + zeta: 950, + eta: 951, + theta: 952, + iota: 953, + kappa: 954, + lambda: 955, + mu: 956, + nu: 957, + xi: 958, + omicron: 959, + pi: 960, + rho: 961, + sigmaf: 962, + sigma: 963, + tau: 964, + upsilon: 965, + phi: 966, + chi: 967, + psi: 968, + omega: 969, + thetasym: 977, + upsih: 978, + straightphi: 981, + piv: 982, + Gammad: 988, + gammad: 989, + kappav: 1008, + rhov: 1009, + epsi: 1013, + bepsi: 1014, + IOcy: 1025, + DJcy: 1026, + GJcy: 1027, + Jukcy: 1028, + DScy: 1029, + Iukcy: 1030, + YIcy: 1031, + Jsercy: 1032, + LJcy: 1033, + NJcy: 1034, + TSHcy: 1035, + KJcy: 1036, + Ubrcy: 1038, + DZcy: 1039, + Acy: 1040, + Bcy: 1041, + Vcy: 1042, + Gcy: 1043, + Dcy: 1044, + IEcy: 1045, + ZHcy: 1046, + Zcy: 1047, + Icy: 1048, + Jcy: 1049, + Kcy: 1050, + Lcy: 1051, + Mcy: 1052, + Ncy: 1053, + Ocy: 1054, + Pcy: 1055, + Rcy: 1056, + Scy: 1057, + Tcy: 1058, + Ucy: 1059, + Fcy: 1060, + KHcy: 1061, + TScy: 1062, + CHcy: 1063, + SHcy: 1064, + SHCHcy: 1065, + HARDcy: 1066, + Ycy: 1067, + SOFTcy: 1068, + Ecy: 1069, + YUcy: 1070, + YAcy: 1071, + acy: 1072, + bcy: 1073, + vcy: 1074, + gcy: 1075, + dcy: 1076, + iecy: 1077, + zhcy: 1078, + zcy: 1079, + icy: 1080, + jcy: 1081, + kcy: 1082, + lcy: 1083, + mcy: 1084, + ncy: 1085, + ocy: 1086, + pcy: 1087, + rcy: 1088, + scy: 1089, + tcy: 1090, + ucy: 1091, + fcy: 1092, + khcy: 1093, + tscy: 1094, + chcy: 1095, + shcy: 1096, + shchcy: 1097, + hardcy: 1098, + ycy: 1099, + softcy: 1100, + ecy: 1101, + yucy: 1102, + yacy: 1103, + iocy: 1105, + djcy: 1106, + gjcy: 1107, + jukcy: 1108, + dscy: 1109, + iukcy: 1110, + yicy: 1111, + jsercy: 1112, + ljcy: 1113, + njcy: 1114, + tshcy: 1115, + kjcy: 1116, + ubrcy: 1118, + dzcy: 1119, + ensp: 8194, + emsp: 8195, + emsp13: 8196, + emsp14: 8197, + numsp: 8199, + puncsp: 8200, + thinsp: 8201, + hairsp: 8202, + ZeroWidthSpace: 8203, + zwnj: 8204, + zwj: 8205, + lrm: 8206, + rlm: 8207, + hyphen: 8208, + ndash: 8211, + mdash: 8212, + horbar: 8213, + Verbar: 8214, + lsquo: 8216, + rsquo: 8217, + sbquo: 8218, + ldquo: 8220, + rdquo: 8221, + bdquo: 8222, + dagger: 8224, + Dagger: 8225, + bull: 8226, + nldr: 8229, + hellip: 8230, + permil: 8240, + pertenk: 8241, + prime: 8242, + Prime: 8243, + tprime: 8244, + bprime: 8245, + lsaquo: 8249, + rsaquo: 8250, + oline: 8254, + caret: 8257, + hybull: 8259, + frasl: 8260, + bsemi: 8271, + qprime: 8279, + MediumSpace: 8287, + NoBreak: 8288, + ApplyFunction: 8289, + InvisibleTimes: 8290, + InvisibleComma: 8291, + euro: 8364, + tdot: 8411, + TripleDot: 8411, + DotDot: 8412, + Copf: 8450, + incare: 8453, + gscr: 8458, + hamilt: 8459, + Hfr: 8460, + quaternions: 8461, + planckh: 8462, + planck: 8463, + Iscr: 8464, + image: 8465, + Lscr: 8466, + ell: 8467, + Nopf: 8469, + numero: 8470, + copysr: 8471, + weierp: 8472, + Popf: 8473, + rationals: 8474, + Rscr: 8475, + real: 8476, + reals: 8477, + rx: 8478, + trade: 8482, + integers: 8484, + ohm: 8486, + mho: 8487, + Zfr: 8488, + iiota: 8489, + angst: 8491, + bernou: 8492, + Cfr: 8493, + escr: 8495, + Escr: 8496, + Fscr: 8497, + phmmat: 8499, + order: 8500, + alefsym: 8501, + beth: 8502, + gimel: 8503, + daleth: 8504, + CapitalDifferentialD: 8517, + DifferentialD: 8518, + ExponentialE: 8519, + ImaginaryI: 8520, + frac13: 8531, + frac23: 8532, + frac15: 8533, + frac25: 8534, + frac35: 8535, + frac45: 8536, + frac16: 8537, + frac56: 8538, + frac18: 8539, + frac38: 8540, + frac58: 8541, + frac78: 8542, + larr: 8592, + uarr: 8593, + rarr: 8594, + darr: 8595, + harr: 8596, + varr: 8597, + nwarr: 8598, + nearr: 8599, + searr: 8600, + swarr: 8601, + nlarr: 8602, + nrarr: 8603, + rarrw: 8605, + Larr: 8606, + Uarr: 8607, + Rarr: 8608, + Darr: 8609, + larrtl: 8610, + rarrtl: 8611, + LeftTeeArrow: 8612, + UpTeeArrow: 8613, + map: 8614, + DownTeeArrow: 8615, + larrhk: 8617, + rarrhk: 8618, + larrlp: 8619, + rarrlp: 8620, + harrw: 8621, + nharr: 8622, + lsh: 8624, + rsh: 8625, + ldsh: 8626, + rdsh: 8627, + crarr: 8629, + cularr: 8630, + curarr: 8631, + olarr: 8634, + orarr: 8635, + lharu: 8636, + lhard: 8637, + uharr: 8638, + uharl: 8639, + rharu: 8640, + rhard: 8641, + dharr: 8642, + dharl: 8643, + rlarr: 8644, + udarr: 8645, + lrarr: 8646, + llarr: 8647, + uuarr: 8648, + rrarr: 8649, + ddarr: 8650, + lrhar: 8651, + rlhar: 8652, + nlArr: 8653, + nhArr: 8654, + nrArr: 8655, + lArr: 8656, + uArr: 8657, + rArr: 8658, + dArr: 8659, + hArr: 8660, + vArr: 8661, + nwArr: 8662, + neArr: 8663, + seArr: 8664, + swArr: 8665, + lAarr: 8666, + rAarr: 8667, + zigrarr: 8669, + larrb: 8676, + rarrb: 8677, + duarr: 8693, + loarr: 8701, + roarr: 8702, + hoarr: 8703, + forall: 8704, + comp: 8705, + part: 8706, + exist: 8707, + nexist: 8708, + empty: 8709, + nabla: 8711, + isin: 8712, + notin: 8713, + ni: 8715, + notni: 8716, + prod: 8719, + coprod: 8720, + sum: 8721, + minus: 8722, + mnplus: 8723, + plusdo: 8724, + setmn: 8726, + lowast: 8727, + compfn: 8728, + radic: 8730, + prop: 8733, + infin: 8734, + angrt: 8735, + ang: 8736, + angmsd: 8737, + angsph: 8738, + mid: 8739, + nmid: 8740, + par: 8741, + npar: 8742, + and: 8743, + or: 8744, + cap: 8745, + cup: 8746, + int: 8747, + Int: 8748, + tint: 8749, + conint: 8750, + Conint: 8751, + Cconint: 8752, + cwint: 8753, + cwconint: 8754, + awconint: 8755, + there4: 8756, + becaus: 8757, + ratio: 8758, + Colon: 8759, + minusd: 8760, + mDDot: 8762, + homtht: 8763, + sim: 8764, + bsim: 8765, + ac: 8766, + acd: 8767, + wreath: 8768, + nsim: 8769, + esim: 8770, + sime: 8771, + nsime: 8772, + cong: 8773, + simne: 8774, + ncong: 8775, + asymp: 8776, + nap: 8777, + ape: 8778, + apid: 8779, + bcong: 8780, + asympeq: 8781, + bump: 8782, + bumpe: 8783, + esdot: 8784, + eDot: 8785, + efDot: 8786, + erDot: 8787, + colone: 8788, + ecolon: 8789, + ecir: 8790, + cire: 8791, + wedgeq: 8793, + veeeq: 8794, + trie: 8796, + equest: 8799, + ne: 8800, + equiv: 8801, + nequiv: 8802, + le: 8804, + ge: 8805, + lE: 8806, + gE: 8807, + lnE: 8808, + gnE: 8809, + Lt: 8810, + Gt: 8811, + twixt: 8812, + NotCupCap: 8813, + nlt: 8814, + ngt: 8815, + nle: 8816, + nge: 8817, + lsim: 8818, + gsim: 8819, + nlsim: 8820, + ngsim: 8821, + lg: 8822, + gl: 8823, + ntlg: 8824, + ntgl: 8825, + pr: 8826, + sc: 8827, + prcue: 8828, + sccue: 8829, + prsim: 8830, + scsim: 8831, + npr: 8832, + nsc: 8833, + sub: 8834, + sup: 8835, + nsub: 8836, + nsup: 8837, + sube: 8838, + supe: 8839, + nsube: 8840, + nsupe: 8841, + subne: 8842, + supne: 8843, + cupdot: 8845, + uplus: 8846, + sqsub: 8847, + sqsup: 8848, + sqsube: 8849, + sqsupe: 8850, + sqcap: 8851, + sqcup: 8852, + oplus: 8853, + ominus: 8854, + otimes: 8855, + osol: 8856, + odot: 8857, + ocir: 8858, + oast: 8859, + odash: 8861, + plusb: 8862, + minusb: 8863, + timesb: 8864, + sdotb: 8865, + vdash: 8866, + dashv: 8867, + top: 8868, + perp: 8869, + models: 8871, + vDash: 8872, + Vdash: 8873, + Vvdash: 8874, + VDash: 8875, + nvdash: 8876, + nvDash: 8877, + nVdash: 8878, + nVDash: 8879, + prurel: 8880, + vltri: 8882, + vrtri: 8883, + ltrie: 8884, + rtrie: 8885, + origof: 8886, + imof: 8887, + mumap: 8888, + hercon: 8889, + intcal: 8890, + veebar: 8891, + barvee: 8893, + angrtvb: 8894, + lrtri: 8895, + xwedge: 8896, + xvee: 8897, + xcap: 8898, + xcup: 8899, + diam: 8900, + sdot: 8901, + sstarf: 8902, + divonx: 8903, + bowtie: 8904, + ltimes: 8905, + rtimes: 8906, + lthree: 8907, + rthree: 8908, + bsime: 8909, + cuvee: 8910, + cuwed: 8911, + Sub: 8912, + Sup: 8913, + Cap: 8914, + Cup: 8915, + fork: 8916, + epar: 8917, + ltdot: 8918, + gtdot: 8919, + Ll: 8920, + Gg: 8921, + leg: 8922, + gel: 8923, + cuepr: 8926, + cuesc: 8927, + nprcue: 8928, + nsccue: 8929, + nsqsube: 8930, + nsqsupe: 8931, + lnsim: 8934, + gnsim: 8935, + prnsim: 8936, + scnsim: 8937, + nltri: 8938, + nrtri: 8939, + nltrie: 8940, + nrtrie: 8941, + vellip: 8942, + ctdot: 8943, + utdot: 8944, + dtdot: 8945, + disin: 8946, + isinsv: 8947, + isins: 8948, + isindot: 8949, + notinvc: 8950, + notinvb: 8951, + isinE: 8953, + nisd: 8954, + xnis: 8955, + nis: 8956, + notnivc: 8957, + notnivb: 8958, + barwed: 8965, + Barwed: 8966, + lceil: 8968, + rceil: 8969, + lfloor: 8970, + rfloor: 8971, + drcrop: 8972, + dlcrop: 8973, + urcrop: 8974, + ulcrop: 8975, + bnot: 8976, + profline: 8978, + profsurf: 8979, + telrec: 8981, + target: 8982, + ulcorn: 8988, + urcorn: 8989, + dlcorn: 8990, + drcorn: 8991, + frown: 8994, + smile: 8995, + lang: 9001, + rang: 9002, + cylcty: 9005, + profalar: 9006, + topbot: 9014, + ovbar: 9021, + solbar: 9023, + angzarr: 9084, + lmoust: 9136, + rmoust: 9137, + tbrk: 9140, + bbrk: 9141, + bbrktbrk: 9142, + OverParenthesis: 9180, + UnderParenthesis: 9181, + OverBrace: 9182, + UnderBrace: 9183, + trpezium: 9186, + elinters: 9191, + blank: 9251, + oS: 9416, + boxh: 9472, + boxv: 9474, + boxdr: 9484, + boxdl: 9488, + boxur: 9492, + boxul: 9496, + boxvr: 9500, + boxvl: 9508, + boxhd: 9516, + boxhu: 9524, + boxvh: 9532, + boxH: 9552, + boxV: 9553, + boxdR: 9554, + boxDr: 9555, + boxDR: 9556, + boxdL: 9557, + boxDl: 9558, + boxDL: 9559, + boxuR: 9560, + boxUr: 9561, + boxUR: 9562, + boxuL: 9563, + boxUl: 9564, + boxUL: 9565, + boxvR: 9566, + boxVr: 9567, + boxVR: 9568, + boxvL: 9569, + boxVl: 9570, + boxVL: 9571, + boxHd: 9572, + boxhD: 9573, + boxHD: 9574, + boxHu: 9575, + boxhU: 9576, + boxHU: 9577, + boxvH: 9578, + boxVh: 9579, + boxVH: 9580, + uhblk: 9600, + lhblk: 9604, + block: 9608, + blk14: 9617, + blk12: 9618, + blk34: 9619, + squ: 9633, + squf: 9642, + EmptyVerySmallSquare: 9643, + rect: 9645, + marker: 9646, + fltns: 9649, + xutri: 9651, + utrif: 9652, + utri: 9653, + rtrif: 9656, + rtri: 9657, + xdtri: 9661, + dtrif: 9662, + dtri: 9663, + ltrif: 9666, + ltri: 9667, + loz: 9674, + cir: 9675, + tridot: 9708, + xcirc: 9711, + ultri: 9720, + urtri: 9721, + lltri: 9722, + EmptySmallSquare: 9723, + FilledSmallSquare: 9724, + starf: 9733, + bigstar: 9733, + star: 9734, + phone: 9742, + female: 9792, + male: 9794, + spades: 9824, + clubs: 9827, + hearts: 9829, + diams: 9830, + sung: 9834, + flat: 9837, + natur: 9838, + sharp: 9839, + check: 10003, + cross: 10007, + malt: 10016, + sext: 10038, + VerticalSeparator: 10072, + lbbrk: 10098, + rbbrk: 10099, + lobrk: 10214, + robrk: 10215, + Lang: 10218, + Rang: 10219, + loang: 10220, + roang: 10221, + xlarr: 10229, + xrarr: 10230, + xharr: 10231, + xlArr: 10232, + xrArr: 10233, + xhArr: 10234, + xmap: 10236, + dzigrarr: 10239, + nvlArr: 10498, + nvrArr: 10499, + nvHarr: 10500, + Map: 10501, + lbarr: 10508, + rbarr: 10509, + lBarr: 10510, + rBarr: 10511, + RBarr: 10512, + DDotrahd: 10513, + UpArrowBar: 10514, + DownArrowBar: 10515, + Rarrtl: 10518, + latail: 10521, + ratail: 10522, + lAtail: 10523, + rAtail: 10524, + larrfs: 10525, + rarrfs: 10526, + larrbfs: 10527, + rarrbfs: 10528, + nwarhk: 10531, + nearhk: 10532, + searhk: 10533, + swarhk: 10534, + nwnear: 10535, + nesear: 10536, + seswar: 10537, + swnwar: 10538, + rarrc: 10547, + cudarrr: 10549, + ldca: 10550, + rdca: 10551, + cudarrl: 10552, + larrpl: 10553, + curarrm: 10556, + cularrp: 10557, + rarrpl: 10565, + harrcir: 10568, + Uarrocir: 10569, + lurdshar: 10570, + ldrushar: 10571, + LeftRightVector: 10574, + RightUpDownVector: 10575, + DownLeftRightVector: 10576, + LeftUpDownVector: 10577, + LeftVectorBar: 10578, + RightVectorBar: 10579, + RightUpVectorBar: 10580, + RightDownVectorBar: 10581, + DownLeftVectorBar: 10582, + DownRightVectorBar: 10583, + LeftUpVectorBar: 10584, + LeftDownVectorBar: 10585, + LeftTeeVector: 10586, + RightTeeVector: 10587, + RightUpTeeVector: 10588, + RightDownTeeVector: 10589, + DownLeftTeeVector: 10590, + DownRightTeeVector: 10591, + LeftUpTeeVector: 10592, + LeftDownTeeVector: 10593, + lHar: 10594, + uHar: 10595, + rHar: 10596, + dHar: 10597, + luruhar: 10598, + ldrdhar: 10599, + ruluhar: 10600, + rdldhar: 10601, + lharul: 10602, + llhard: 10603, + rharul: 10604, + lrhard: 10605, + udhar: 10606, + duhar: 10607, + RoundImplies: 10608, + erarr: 10609, + simrarr: 10610, + larrsim: 10611, + rarrsim: 10612, + rarrap: 10613, + ltlarr: 10614, + gtrarr: 10616, + subrarr: 10617, + suplarr: 10619, + lfisht: 10620, + rfisht: 10621, + ufisht: 10622, + dfisht: 10623, + lopar: 10629, + ropar: 10630, + lbrke: 10635, + rbrke: 10636, + lbrkslu: 10637, + rbrksld: 10638, + lbrksld: 10639, + rbrkslu: 10640, + langd: 10641, + rangd: 10642, + lparlt: 10643, + rpargt: 10644, + gtlPar: 10645, + ltrPar: 10646, + vzigzag: 10650, + vangrt: 10652, + angrtvbd: 10653, + ange: 10660, + range: 10661, + dwangle: 10662, + uwangle: 10663, + angmsdaa: 10664, + angmsdab: 10665, + angmsdac: 10666, + angmsdad: 10667, + angmsdae: 10668, + angmsdaf: 10669, + angmsdag: 10670, + angmsdah: 10671, + bemptyv: 10672, + demptyv: 10673, + cemptyv: 10674, + raemptyv: 10675, + laemptyv: 10676, + ohbar: 10677, + omid: 10678, + opar: 10679, + operp: 10681, + olcross: 10683, + odsold: 10684, + olcir: 10686, + ofcir: 10687, + olt: 10688, + ogt: 10689, + cirscir: 10690, + cirE: 10691, + solb: 10692, + bsolb: 10693, + boxbox: 10697, + trisb: 10701, + rtriltri: 10702, + LeftTriangleBar: 10703, + RightTriangleBar: 10704, + race: 10714, + iinfin: 10716, + infintie: 10717, + nvinfin: 10718, + eparsl: 10723, + smeparsl: 10724, + eqvparsl: 10725, + lozf: 10731, + RuleDelayed: 10740, + dsol: 10742, + xodot: 10752, + xoplus: 10753, + xotime: 10754, + xuplus: 10756, + xsqcup: 10758, + qint: 10764, + fpartint: 10765, + cirfnint: 10768, + awint: 10769, + rppolint: 10770, + scpolint: 10771, + npolint: 10772, + pointint: 10773, + quatint: 10774, + intlarhk: 10775, + pluscir: 10786, + plusacir: 10787, + simplus: 10788, + plusdu: 10789, + plussim: 10790, + plustwo: 10791, + mcomma: 10793, + minusdu: 10794, + loplus: 10797, + roplus: 10798, + Cross: 10799, + timesd: 10800, + timesbar: 10801, + smashp: 10803, + lotimes: 10804, + rotimes: 10805, + otimesas: 10806, + Otimes: 10807, + odiv: 10808, + triplus: 10809, + triminus: 10810, + tritime: 10811, + iprod: 10812, + amalg: 10815, + capdot: 10816, + ncup: 10818, + ncap: 10819, + capand: 10820, + cupor: 10821, + cupcap: 10822, + capcup: 10823, + cupbrcap: 10824, + capbrcup: 10825, + cupcup: 10826, + capcap: 10827, + ccups: 10828, + ccaps: 10829, + ccupssm: 10832, + And: 10835, + Or: 10836, + andand: 10837, + oror: 10838, + orslope: 10839, + andslope: 10840, + andv: 10842, + orv: 10843, + andd: 10844, + ord: 10845, + wedbar: 10847, + sdote: 10854, + simdot: 10858, + congdot: 10861, + easter: 10862, + apacir: 10863, + apE: 10864, + eplus: 10865, + pluse: 10866, + Esim: 10867, + Colone: 10868, + Equal: 10869, + eDDot: 10871, + equivDD: 10872, + ltcir: 10873, + gtcir: 10874, + ltquest: 10875, + gtquest: 10876, + les: 10877, + ges: 10878, + lesdot: 10879, + gesdot: 10880, + lesdoto: 10881, + gesdoto: 10882, + lesdotor: 10883, + gesdotol: 10884, + lap: 10885, + gap: 10886, + lne: 10887, + gne: 10888, + lnap: 10889, + gnap: 10890, + lEg: 10891, + gEl: 10892, + lsime: 10893, + gsime: 10894, + lsimg: 10895, + gsiml: 10896, + lgE: 10897, + glE: 10898, + lesges: 10899, + gesles: 10900, + els: 10901, + egs: 10902, + elsdot: 10903, + egsdot: 10904, + el: 10905, + eg: 10906, + siml: 10909, + simg: 10910, + simlE: 10911, + simgE: 10912, + LessLess: 10913, + GreaterGreater: 10914, + glj: 10916, + gla: 10917, + ltcc: 10918, + gtcc: 10919, + lescc: 10920, + gescc: 10921, + smt: 10922, + lat: 10923, + smte: 10924, + late: 10925, + bumpE: 10926, + pre: 10927, + sce: 10928, + prE: 10931, + scE: 10932, + prnE: 10933, + scnE: 10934, + prap: 10935, + scap: 10936, + prnap: 10937, + scnap: 10938, + Pr: 10939, + Sc: 10940, + subdot: 10941, + supdot: 10942, + subplus: 10943, + supplus: 10944, + submult: 10945, + supmult: 10946, + subedot: 10947, + supedot: 10948, + subE: 10949, + supE: 10950, + subsim: 10951, + supsim: 10952, + subnE: 10955, + supnE: 10956, + csub: 10959, + csup: 10960, + csube: 10961, + csupe: 10962, + subsup: 10963, + supsub: 10964, + subsub: 10965, + supsup: 10966, + suphsub: 10967, + supdsub: 10968, + forkv: 10969, + topfork: 10970, + mlcp: 10971, + Dashv: 10980, + Vdashl: 10982, + Barv: 10983, + vBar: 10984, + vBarv: 10985, + Vbar: 10987, + Not: 10988, + bNot: 10989, + rnmid: 10990, + cirmid: 10991, + midcir: 10992, + topcir: 10993, + nhpar: 10994, + parsim: 10995, + parsl: 11005, + fflig: 64256, + filig: 64257, + fllig: 64258, + ffilig: 64259, + ffllig: 64260, + Ascr: 119964, + Cscr: 119966, + Dscr: 119967, + Gscr: 119970, + Jscr: 119973, + Kscr: 119974, + Nscr: 119977, + Oscr: 119978, + Pscr: 119979, + Qscr: 119980, + Sscr: 119982, + Tscr: 119983, + Uscr: 119984, + Vscr: 119985, + Wscr: 119986, + Xscr: 119987, + Yscr: 119988, + Zscr: 119989, + ascr: 119990, + bscr: 119991, + cscr: 119992, + dscr: 119993, + fscr: 119995, + hscr: 119997, + iscr: 119998, + jscr: 119999, + kscr: 120000, + lscr: 120001, + mscr: 120002, + nscr: 120003, + pscr: 120005, + qscr: 120006, + rscr: 120007, + sscr: 120008, + tscr: 120009, + uscr: 120010, + vscr: 120011, + wscr: 120012, + xscr: 120013, + yscr: 120014, + zscr: 120015, + Afr: 120068, + Bfr: 120069, + Dfr: 120071, + Efr: 120072, + Ffr: 120073, + Gfr: 120074, + Jfr: 120077, + Kfr: 120078, + Lfr: 120079, + Mfr: 120080, + Nfr: 120081, + Ofr: 120082, + Pfr: 120083, + Qfr: 120084, + Sfr: 120086, + Tfr: 120087, + Ufr: 120088, + Vfr: 120089, + Wfr: 120090, + Xfr: 120091, + Yfr: 120092, + afr: 120094, + bfr: 120095, + cfr: 120096, + dfr: 120097, + efr: 120098, + ffr: 120099, + gfr: 120100, + hfr: 120101, + ifr: 120102, + jfr: 120103, + kfr: 120104, + lfr: 120105, + mfr: 120106, + nfr: 120107, + ofr: 120108, + pfr: 120109, + qfr: 120110, + rfr: 120111, + sfr: 120112, + tfr: 120113, + ufr: 120114, + vfr: 120115, + wfr: 120116, + xfr: 120117, + yfr: 120118, + zfr: 120119, + Aopf: 120120, + Bopf: 120121, + Dopf: 120123, + Eopf: 120124, + Fopf: 120125, + Gopf: 120126, + Iopf: 120128, + Jopf: 120129, + Kopf: 120130, + Lopf: 120131, + Mopf: 120132, + Oopf: 120134, + Sopf: 120138, + Topf: 120139, + Uopf: 120140, + Vopf: 120141, + Wopf: 120142, + Xopf: 120143, + Yopf: 120144, + aopf: 120146, + bopf: 120147, + copf: 120148, + dopf: 120149, + eopf: 120150, + fopf: 120151, + gopf: 120152, + hopf: 120153, + iopf: 120154, + jopf: 120155, + kopf: 120156, + lopf: 120157, + mopf: 120158, + nopf: 120159, + oopf: 120160, + popf: 120161, + qopf: 120162, + ropf: 120163, + sopf: 120164, + topf: 120165, + uopf: 120166, + vopf: 120167, + wopf: 120168, + xopf: 120169, + yopf: 120170, + zopf: 120171, }; export default FromHTMLEntity; diff --git a/src/core/operations/FromHex.mjs b/src/core/operations/FromHex.mjs index cd82d7df..30386a06 100644 --- a/src/core/operations/FromHex.mjs +++ b/src/core/operations/FromHex.mjs @@ -5,14 +5,13 @@ */ import Operation from "../Operation.mjs"; -import {fromHex, FROM_HEX_DELIM_OPTIONS} from "../lib/Hex.mjs"; +import { fromHex, FROM_HEX_DELIM_OPTIONS } from "../lib/Hex.mjs"; import Utils from "../Utils.mjs"; /** * From Hex operation */ class FromHex extends Operation { - /** * FromHex constructor */ @@ -21,7 +20,8 @@ class FromHex extends Operation { this.name = "From Hex"; this.module = "Default"; - this.description = "Converts a hexadecimal byte string back into its raw value.

e.g. ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a becomes the UTF-8 encoded string Γειά σου"; + this.description = + "Converts a hexadecimal byte string back into its raw value.

e.g. ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a becomes the UTF-8 encoded string Γειά σου"; this.infoURL = "https://wikipedia.org/wiki/Hexadecimal"; this.inputType = "string"; this.outputType = "byteArray"; @@ -29,60 +29,60 @@ class FromHex extends Operation { { name: "Delimiter", type: "option", - value: FROM_HEX_DELIM_OPTIONS - } + value: FROM_HEX_DELIM_OPTIONS, + }, ]; this.checks = [ { pattern: "^(?:[\\dA-F]{2})+$", flags: "i", - args: ["None"] + args: ["None"], }, { pattern: "^[\\dA-F]{2}(?: [\\dA-F]{2})*$", flags: "i", - args: ["Space"] + args: ["Space"], }, { pattern: "^[\\dA-F]{2}(?:,[\\dA-F]{2})*$", flags: "i", - args: ["Comma"] + args: ["Comma"], }, { pattern: "^[\\dA-F]{2}(?:;[\\dA-F]{2})*$", flags: "i", - args: ["Semi-colon"] + args: ["Semi-colon"], }, { pattern: "^[\\dA-F]{2}(?::[\\dA-F]{2})*$", flags: "i", - args: ["Colon"] + args: ["Colon"], }, { pattern: "^[\\dA-F]{2}(?:\\n[\\dA-F]{2})*$", flags: "i", - args: ["Line feed"] + args: ["Line feed"], }, { pattern: "^[\\dA-F]{2}(?:\\r\\n[\\dA-F]{2})*$", flags: "i", - args: ["CRLF"] + args: ["CRLF"], }, { pattern: "^(?:0x[\\dA-F]{2})+$", flags: "i", - args: ["0x"] + args: ["0x"], }, { pattern: "^0x[\\dA-F]{2}(?:,0x[\\dA-F]{2})*$", flags: "i", - args: ["0x with comma"] + args: ["0x with comma"], }, { pattern: "^(?:\\\\x[\\dA-F]{2})+$", flags: "i", - args: ["\\x"] - } + args: ["\\x"], + }, ]; } @@ -119,7 +119,8 @@ class FromHex extends Operation { else pos[0].end = 0; } - pos[0].start = pos[0].start === 0 ? 0 : Math.round(pos[0].start / width); + pos[0].start = + pos[0].start === 0 ? 0 : Math.round(pos[0].start / width); pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / width); return pos; } diff --git a/src/core/operations/FromHexContent.mjs b/src/core/operations/FromHexContent.mjs index dc6c06f1..88114904 100644 --- a/src/core/operations/FromHexContent.mjs +++ b/src/core/operations/FromHexContent.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {fromHex} from "../lib/Hex.mjs"; +import { fromHex } from "../lib/Hex.mjs"; /** * From Hex Content operation */ class FromHexContent extends Operation { - /** * FromHexContent constructor */ @@ -21,17 +20,19 @@ class FromHexContent extends Operation { this.name = "From Hex Content"; this.module = "Default"; - this.description = "Translates hexadecimal bytes in text back to raw bytes. This format is used by SNORT for representing hex within ASCII text.

e.g. foo|3d|bar becomes foo=bar."; - this.infoURL = "http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node32.html#SECTION00451000000000000000"; + this.description = + "Translates hexadecimal bytes in text back to raw bytes. This format is used by SNORT for representing hex within ASCII text.

e.g. foo|3d|bar becomes foo=bar."; + this.infoURL = + "http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node32.html#SECTION00451000000000000000"; this.inputType = "string"; this.outputType = "byteArray"; this.args = []; this.checks = [ { - pattern: "\\|([\\da-f]{2} ?)+\\|", - flags: "i", - args: [] - } + pattern: "\\|([\\da-f]{2} ?)+\\|", + flags: "i", + args: [], + }, ]; } @@ -43,32 +44,29 @@ class FromHexContent extends Operation { run(input, args) { const regex = /\|([a-f\d ]{2,})\|/gi, output = []; - let m, i = 0; + let m, + i = 0; while ((m = regex.exec(input))) { // Add up to match - for (; i < m.index;) - output.push(Utils.ord(input[i++])); + for (; i < m.index; ) output.push(Utils.ord(input[i++])); // Add match const bytes = fromHex(m[1]); if (bytes) { - for (let a = 0; a < bytes.length;) - output.push(bytes[a++]); + for (let a = 0; a < bytes.length; ) output.push(bytes[a++]); } else { // Not valid hex, print as normal - for (; i < regex.lastIndex;) + for (; i < regex.lastIndex; ) output.push(Utils.ord(input[i++])); } i = regex.lastIndex; } // Add all after final match - for (; i < input.length;) - output.push(Utils.ord(input[i++])); + for (; i < input.length; ) output.push(Utils.ord(input[i++])); return output; } - } export default FromHexContent; diff --git a/src/core/operations/FromHexdump.mjs b/src/core/operations/FromHexdump.mjs index e8c25441..4f4be5b1 100644 --- a/src/core/operations/FromHexdump.mjs +++ b/src/core/operations/FromHexdump.mjs @@ -8,12 +8,10 @@ import Operation from "../Operation.mjs"; import { fromHex } from "../lib/Hex.mjs"; import { isWorkerEnvironment } from "../Utils.mjs"; - /** * From Hexdump operation */ class FromHexdump extends Operation { - /** * FromHexdump constructor */ @@ -22,16 +20,18 @@ class FromHexdump extends Operation { this.name = "From Hexdump"; this.module = "Default"; - this.description = "Attempts to convert a hexdump back into raw data. This operation supports many different hexdump variations, but probably not all. Make sure you verify that the data it gives you is correct before continuing analysis."; + this.description = + "Attempts to convert a hexdump back into raw data. This operation supports many different hexdump variations, but probably not all. Make sure you verify that the data it gives you is correct before continuing analysis."; this.infoURL = "https://wikipedia.org/wiki/Hex_dump"; this.inputType = "string"; this.outputType = "byteArray"; this.args = []; this.checks = [ { - pattern: "^(?:(?:[\\dA-F]{4,16}h?:?)?[ \\t]*((?:[\\dA-F]{2} ){1,8}(?:[ \\t]|[\\dA-F]{2}-)(?:[\\dA-F]{2} ){1,8}|(?:[\\dA-F]{4} )*[\\dA-F]{4}|(?:[\\dA-F]{2} )*[\\dA-F]{2})[^\\n]*\\n?){2,}$", + pattern: + "^(?:(?:[\\dA-F]{4,16}h?:?)?[ \\t]*((?:[\\dA-F]{2} ){1,8}(?:[ \\t]|[\\dA-F]{2}-)(?:[\\dA-F]{2} ){1,8}|(?:[\\dA-F]{4} )*[\\dA-F]{4}|(?:[\\dA-F]{2} )*[\\dA-F]{2})[^\\n]*\\n?){2,}$", flags: "i", - args: [] + args: [], }, ]; } @@ -43,7 +43,8 @@ class FromHexdump extends Operation { */ run(input, args) { const output = [], - regex = /^\s*(?:[\dA-F]{4,16}h?:?)?[ \t]+((?:[\dA-F]{2} ){1,8}(?:[ \t]|[\dA-F]{2}-)(?:[\dA-F]{2} ){1,8}|(?:[\dA-F]{4} )*[\dA-F]{4}|(?:[\dA-F]{2} )*[\dA-F]{2})/igm; + regex = + /^\s*(?:[\dA-F]{4,16}h?:?)?[ \t]+((?:[\dA-F]{2} ){1,8}(?:[ \t]|[\dA-F]{2}-)(?:[\dA-F]{2} ){1,8}|(?:[\dA-F]{4} )*[\dA-F]{4}|(?:[\dA-F]{2} )*[\dA-F]{2})/gim; let block, line; while ((block = regex.exec(input))) { @@ -56,8 +57,13 @@ class FromHexdump extends Operation { const width = input.indexOf("\n"); const w = (width - 13) / 4; // w should be the specified width of the hexdump and therefore a round number - if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) { - if (isWorkerEnvironment()) self.setOption("attemptHighlight", false); + if ( + Math.floor(w) !== w || + input.indexOf("\r") !== -1 || + output.indexOf(13) !== -1 + ) { + if (isWorkerEnvironment()) + self.setOption("attemptHighlight", false); } return output; } @@ -73,28 +79,34 @@ class FromHexdump extends Operation { */ highlight(pos, args) { const w = args[0] || 16; - const width = 14 + (w*4); + const width = 14 + w * 4; let line = Math.floor(pos[0].start / width); let offset = pos[0].start % width; - if (offset < 10) { // In line number section - pos[0].start = line*w; - } else if (offset > 10+(w*3)) { // In ASCII section - pos[0].start = (line+1)*w; - } else { // In byte section - pos[0].start = line*w + Math.floor((offset-10)/3); + if (offset < 10) { + // In line number section + pos[0].start = line * w; + } else if (offset > 10 + w * 3) { + // In ASCII section + pos[0].start = (line + 1) * w; + } else { + // In byte section + pos[0].start = line * w + Math.floor((offset - 10) / 3); } line = Math.floor(pos[0].end / width); offset = pos[0].end % width; - if (offset < 10) { // In line number section - pos[0].end = line*w; - } else if (offset > 10+(w*3)) { // In ASCII section - pos[0].end = (line+1)*w; - } else { // In byte section - pos[0].end = line*w + Math.ceil((offset-10)/3); + if (offset < 10) { + // In line number section + pos[0].end = line * w; + } else if (offset > 10 + w * 3) { + // In ASCII section + pos[0].end = (line + 1) * w; + } else { + // In byte section + pos[0].end = line * w + Math.ceil((offset - 10) / 3); } return pos; @@ -112,13 +124,13 @@ class FromHexdump extends Operation { highlightReverse(pos, args) { // Calculate overall selection const w = args[0] || 16, - width = 14 + (w*4); + width = 14 + w * 4; let line = Math.floor(pos[0].start / w), offset = pos[0].start % w, start = 0, end = 0; - pos[0].start = line*width + 10 + offset*3; + pos[0].start = line * width + 10 + offset * 3; line = Math.floor(pos[0].end / w); offset = pos[0].end % w; @@ -126,7 +138,7 @@ class FromHexdump extends Operation { line--; offset = w; } - pos[0].end = line*width + 10 + offset*3 - 1; + pos[0].end = line * width + 10 + offset * 3 - 1; // Set up multiple selections for bytes let startLineNum = Math.floor(pos[0].start / width); @@ -136,12 +148,12 @@ class FromHexdump extends Operation { pos.push(pos[0]); } else { start = pos[0].start; - end = (startLineNum+1) * width - w - 5; + end = (startLineNum + 1) * width - w - 5; pos.push({ start: start, end: end }); while (end < pos[0].end) { startLineNum++; start = startLineNum * width + 10; - end = (startLineNum+1) * width - w - 5; + end = (startLineNum + 1) * width - w - 5; if (end > pos[0].end) end = pos[0].end; pos.push({ start: start, end: end }); } @@ -154,13 +166,18 @@ class FromHexdump extends Operation { end = 0; for (let i = 1; i < len; i++) { lineNum = Math.floor(pos[i].start / width); - start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); - end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); + start = + (pos[i].start - lineNum * width - 10) / 3 + + (width - w - 2) + + lineNum * width; + end = + (pos[i].end + 1 - lineNum * width - 10) / 3 + + (width - w - 2) + + lineNum * width; pos.push({ start: start, end: end }); } return pos; } - } export default FromHexdump; diff --git a/src/core/operations/FromMessagePack.mjs b/src/core/operations/FromMessagePack.mjs index a557ebbe..f2410d7b 100644 --- a/src/core/operations/FromMessagePack.mjs +++ b/src/core/operations/FromMessagePack.mjs @@ -12,7 +12,6 @@ import notepack from "notepack.io"; * From MessagePack operation */ class FromMessagePack extends Operation { - /** * FromMessagePack constructor */ @@ -21,7 +20,8 @@ class FromMessagePack extends Operation { this.name = "From MessagePack"; this.module = "Code"; - this.description = "Converts MessagePack encoded data to JSON. MessagePack is a computer data interchange format. It is a binary form for representing simple data structures like arrays and associative arrays."; + this.description = + "Converts MessagePack encoded data to JSON. MessagePack is a computer data interchange format. It is a binary form for representing simple data structures like arrays and associative arrays."; this.infoURL = "https://wikipedia.org/wiki/MessagePack"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -38,10 +38,11 @@ class FromMessagePack extends Operation { const buf = Buffer.from(new Uint8Array(input)); return notepack.decode(buf); } catch (err) { - throw new OperationError(`Could not decode MessagePack to JSON: ${err}`); + throw new OperationError( + `Could not decode MessagePack to JSON: ${err}`, + ); } } - } export default FromMessagePack; diff --git a/src/core/operations/FromMorseCode.mjs b/src/core/operations/FromMorseCode.mjs index b0aa4ef2..c06a72e7 100644 --- a/src/core/operations/FromMorseCode.mjs +++ b/src/core/operations/FromMorseCode.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {LETTER_DELIM_OPTIONS, WORD_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { LETTER_DELIM_OPTIONS, WORD_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * From Morse Code operation */ class FromMorseCode extends Operation { - /** * FromMorseCode constructor */ @@ -21,28 +20,30 @@ class FromMorseCode extends Operation { this.name = "From Morse Code"; this.module = "Default"; - this.description = "Translates Morse Code into (upper case) alphanumeric characters."; + this.description = + "Translates Morse Code into (upper case) alphanumeric characters."; this.infoURL = "https://wikipedia.org/wiki/Morse_code"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Letter delimiter", - "type": "option", - "value": LETTER_DELIM_OPTIONS + name: "Letter delimiter", + type: "option", + value: LETTER_DELIM_OPTIONS, }, { - "name": "Word delimiter", - "type": "option", - "value": WORD_DELIM_OPTIONS - } + name: "Word delimiter", + type: "option", + value: WORD_DELIM_OPTIONS, + }, ]; this.checks = [ { - pattern: "(?:^[-. \\n]{5,}$|^[_. \\n]{5,}$|^(?:dash|dot| |\\n){5,}$)", + pattern: + "(?:^[-. \\n]{5,}$|^[_. \\n]{5,}$|^(?:dash|dot| |\\n){5,}$)", flags: "i", - args: ["Space", "Line feed"] - } + args: ["Space", "Line feed"], + }, ]; } @@ -59,15 +60,15 @@ class FromMorseCode extends Operation { const letterDelim = Utils.charRep(args[0]); const wordDelim = Utils.charRep(args[1]); - input = input.replace(/-|‐|−|_|–|—|dash/ig, ""); // hyphen-minus|hyphen|minus-sign|undersore|en-dash|em-dash - input = input.replace(/\.|·|dot/ig, ""); + input = input.replace(/-|‐|−|_|–|—|dash/gi, ""); // hyphen-minus|hyphen|minus-sign|undersore|en-dash|em-dash + input = input.replace(/\.|·|dot/gi, ""); let words = input.split(wordDelim); const self = this; - words = Array.prototype.map.call(words, function(word) { + words = Array.prototype.map.call(words, function (word) { const signals = word.split(letterDelim); - const letters = signals.map(function(signal) { + const letters = signals.map(function (signal) { return self.reversedTable[signal]; }); @@ -78,7 +79,6 @@ class FromMorseCode extends Operation { return words; } - /** * Reverses the Morse Code lookup table */ @@ -90,46 +90,45 @@ class FromMorseCode extends Operation { this.reversedTable[signal] = letter; } } - } const MORSE_TABLE = { - "A": "", - "B": "", - "C": "", - "D": "", - "E": "", - "F": "", - "G": "", - "H": "", - "I": "", - "J": "", - "K": "", - "L": "", - "M": "", - "N": "", - "O": "", - "P": "", - "Q": "", - "R": "", - "S": "", - "T": "", - "U": "", - "V": "", - "W": "", - "X": "", - "Y": "", - "Z": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "", - "6": "", - "7": "", - "8": "", - "9": "", - "0": "", + A: "", + B: "", + C: "", + D: "", + E: "", + F: "", + G: "", + H: "", + I: "", + J: "", + K: "", + L: "", + M: "", + N: "", + O: "", + P: "", + Q: "", + R: "", + S: "", + T: "", + U: "", + V: "", + W: "", + X: "", + Y: "", + Z: "", + 1: "", + 2: "", + 3: "", + 4: "", + 5: "", + 6: "", + 7: "", + 8: "", + 9: "", + 0: "", ".": "", ",": "", ":": "", @@ -137,7 +136,7 @@ const MORSE_TABLE = { "!": "", "?": "", "'": "", - "\"": "", + '"': "", "/": "", "-": "", "+": "", @@ -146,9 +145,9 @@ const MORSE_TABLE = { "@": "", "=": "", "&": "", - "_": "", - "$": "", - " ": "" + _: "", + $: "", + " ": "", }; export default FromMorseCode; diff --git a/src/core/operations/FromOctal.mjs b/src/core/operations/FromOctal.mjs index 7060cdfb..3346e8d1 100644 --- a/src/core/operations/FromOctal.mjs +++ b/src/core/operations/FromOctal.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * From Octal operation */ class FromOctal extends Operation { - /** * FromOctal constructor */ @@ -21,48 +20,55 @@ class FromOctal extends Operation { this.name = "From Octal"; this.module = "Default"; - this.description = "Converts an octal byte string back into its raw value.

e.g. 316 223 316 265 316 271 316 254 40 317 203 316 277 317 205 becomes the UTF-8 encoded string Γειά σου"; + this.description = + "Converts an octal byte string back into its raw value.

e.g. 316 223 316 265 316 271 316 254 40 317 203 316 277 317 205 becomes the UTF-8 encoded string Γειά σου"; this.infoURL = "https://wikipedia.org/wiki/Octal"; this.inputType = "string"; this.outputType = "byteArray"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": DELIM_OPTIONS - } + name: "Delimiter", + type: "option", + value: DELIM_OPTIONS, + }, ]; this.checks = [ { - pattern: "^(?:[0-7]{1,2}|[123][0-7]{2})(?: (?:[0-7]{1,2}|[123][0-7]{2}))*$", + pattern: + "^(?:[0-7]{1,2}|[123][0-7]{2})(?: (?:[0-7]{1,2}|[123][0-7]{2}))*$", flags: "", - args: ["Space"] + args: ["Space"], }, { - pattern: "^(?:[0-7]{1,2}|[123][0-7]{2})(?:,(?:[0-7]{1,2}|[123][0-7]{2}))*$", + pattern: + "^(?:[0-7]{1,2}|[123][0-7]{2})(?:,(?:[0-7]{1,2}|[123][0-7]{2}))*$", flags: "", - args: ["Comma"] + args: ["Comma"], }, { - pattern: "^(?:[0-7]{1,2}|[123][0-7]{2})(?:;(?:[0-7]{1,2}|[123][0-7]{2}))*$", + pattern: + "^(?:[0-7]{1,2}|[123][0-7]{2})(?:;(?:[0-7]{1,2}|[123][0-7]{2}))*$", flags: "", - args: ["Semi-colon"] + args: ["Semi-colon"], }, { - pattern: "^(?:[0-7]{1,2}|[123][0-7]{2})(?::(?:[0-7]{1,2}|[123][0-7]{2}))*$", + pattern: + "^(?:[0-7]{1,2}|[123][0-7]{2})(?::(?:[0-7]{1,2}|[123][0-7]{2}))*$", flags: "", - args: ["Colon"] + args: ["Colon"], }, { - pattern: "^(?:[0-7]{1,2}|[123][0-7]{2})(?:\\n(?:[0-7]{1,2}|[123][0-7]{2}))*$", + pattern: + "^(?:[0-7]{1,2}|[123][0-7]{2})(?:\\n(?:[0-7]{1,2}|[123][0-7]{2}))*$", flags: "", - args: ["Line feed"] + args: ["Line feed"], }, { - pattern: "^(?:[0-7]{1,2}|[123][0-7]{2})(?:\\r\\n(?:[0-7]{1,2}|[123][0-7]{2}))*$", + pattern: + "^(?:[0-7]{1,2}|[123][0-7]{2})(?:\\r\\n(?:[0-7]{1,2}|[123][0-7]{2}))*$", flags: "", - args: ["CRLF"] - } + args: ["CRLF"], + }, ]; } @@ -74,9 +80,8 @@ class FromOctal extends Operation { run(input, args) { const delim = Utils.charRep(args[0] || "Space"); if (input.length === 0) return []; - return input.split(delim).map(val => parseInt(val, 8)); + return input.split(delim).map((val) => parseInt(val, 8)); } - } export default FromOctal; diff --git a/src/core/operations/FromPunycode.mjs b/src/core/operations/FromPunycode.mjs index 2217ee3b..db1f538f 100644 --- a/src/core/operations/FromPunycode.mjs +++ b/src/core/operations/FromPunycode.mjs @@ -11,7 +11,6 @@ import punycode from "punycode"; * From Punycode operation */ class FromPunycode extends Operation { - /** * FromPunycode constructor */ @@ -20,16 +19,17 @@ class FromPunycode extends Operation { this.name = "From Punycode"; this.module = "Encodings"; - this.description = "Punycode is a way to represent Unicode with the limited character subset of ASCII supported by the Domain Name System.

e.g. mnchen-3ya decodes to m\xfcnchen"; + this.description = + "Punycode is a way to represent Unicode with the limited character subset of ASCII supported by the Domain Name System.

e.g. mnchen-3ya decodes to m\xfcnchen"; this.infoURL = "https://wikipedia.org/wiki/Punycode"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Internationalised domain name", - "type": "boolean", - "value": false - } + name: "Internationalised domain name", + type: "boolean", + value: false, + }, ]; } @@ -47,7 +47,6 @@ class FromPunycode extends Operation { return punycode.decode(input); } } - } export default FromPunycode; diff --git a/src/core/operations/FromQuotedPrintable.mjs b/src/core/operations/FromQuotedPrintable.mjs index 7dce45b6..f968593f 100644 --- a/src/core/operations/FromQuotedPrintable.mjs +++ b/src/core/operations/FromQuotedPrintable.mjs @@ -14,7 +14,6 @@ import Operation from "../Operation.mjs"; * From Quoted Printable operation */ class FromQuotedPrintable extends Operation { - /** * FromQuotedPrintable constructor */ @@ -23,16 +22,18 @@ class FromQuotedPrintable extends Operation { this.name = "From Quoted Printable"; this.module = "Default"; - this.description = "Converts QP-encoded text back to standard text.

e.g. The quoted-printable encoded string hello=20world becomes hello world"; + this.description = + "Converts QP-encoded text back to standard text.

e.g. The quoted-printable encoded string hello=20world becomes hello world"; this.infoURL = "https://wikipedia.org/wiki/Quoted-printable"; this.inputType = "string"; this.outputType = "byteArray"; this.args = []; this.checks = [ { - pattern: "^[\\x21-\\x3d\\x3f-\\x7e \\t]{0,76}(?:=[\\da-f]{2}|=\\r?\\n)(?:[\\x21-\\x3d\\x3f-\\x7e \\t]|=[\\da-f]{2}|=\\r?\\n)*$", + pattern: + "^[\\x21-\\x3d\\x3f-\\x7e \\t]{0,76}(?:=[\\da-f]{2}|=\\r?\\n)(?:[\\x21-\\x3d\\x3f-\\x7e \\t]|=[\\da-f]{2}|=\\r?\\n)*$", flags: "i", - args: [] + args: [], }, ]; } @@ -48,12 +49,17 @@ class FromQuotedPrintable extends Operation { const encodedBytesCount = (str.match(/=[\da-fA-F]{2}/g) || []).length, bufferLength = str.length - encodedBytesCount * 2, buffer = new Array(bufferLength); - let chr, hex, + let chr, + hex, bufferPos = 0; for (let i = 0, len = str.length; i < len; i++) { chr = str.charAt(i); - if (chr === "=" && (hex = str.substr(i + 1, 2)) && /[\da-fA-F]{2}/.test(hex)) { + if ( + chr === "=" && + (hex = str.substr(i + 1, 2)) && + /[\da-fA-F]{2}/.test(hex) + ) { buffer[bufferPos++] = parseInt(hex, 16); i += 2; continue; @@ -63,7 +69,6 @@ class FromQuotedPrintable extends Operation { return buffer; } - } export default FromQuotedPrintable; diff --git a/src/core/operations/FromUNIXTimestamp.mjs b/src/core/operations/FromUNIXTimestamp.mjs index 50d8539e..cf094e3a 100644 --- a/src/core/operations/FromUNIXTimestamp.mjs +++ b/src/core/operations/FromUNIXTimestamp.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import moment from "moment-timezone"; -import {UNITS} from "../lib/DateTime.mjs"; +import { UNITS } from "../lib/DateTime.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * From UNIX Timestamp operation */ class FromUNIXTimestamp extends Operation { - /** * FromUNIXTimestamp constructor */ @@ -22,38 +21,39 @@ class FromUNIXTimestamp extends Operation { this.name = "From UNIX Timestamp"; this.module = "Default"; - this.description = "Converts a UNIX timestamp to a datetime string.

e.g. 978346800 becomes Mon 1 January 2001 11:00:00 UTC

A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch)."; + this.description = + "Converts a UNIX timestamp to a datetime string.

e.g. 978346800 becomes Mon 1 January 2001 11:00:00 UTC

A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch)."; this.infoURL = "https://wikipedia.org/wiki/Unix_time"; this.inputType = "number"; this.outputType = "string"; this.args = [ { - "name": "Units", - "type": "option", - "value": UNITS - } + name: "Units", + type: "option", + value: UNITS, + }, ]; this.checks = [ { pattern: "^1?\\d{9}$", flags: "", - args: ["Seconds (s)"] + args: ["Seconds (s)"], }, { pattern: "^1?\\d{12}$", flags: "", - args: ["Milliseconds (ms)"] + args: ["Milliseconds (ms)"], }, { pattern: "^1?\\d{15}$", flags: "", - args: ["Microseconds (μs)"] + args: ["Microseconds (μs)"], }, { pattern: "^1?\\d{18}$", flags: "", - args: ["Nanoseconds (ns)"] - } + args: ["Nanoseconds (ns)"], + }, ]; } @@ -86,7 +86,6 @@ class FromUNIXTimestamp extends Operation { throw new OperationError("Unrecognised unit"); } } - } export default FromUNIXTimestamp; diff --git a/src/core/operations/FuzzyMatch.mjs b/src/core/operations/FuzzyMatch.mjs index c35dd0ab..6f00d20b 100644 --- a/src/core/operations/FuzzyMatch.mjs +++ b/src/core/operations/FuzzyMatch.mjs @@ -5,14 +5,17 @@ */ import Operation from "../Operation.mjs"; -import {fuzzyMatch, calcMatchRanges, DEFAULT_WEIGHTS} from "../lib/FuzzyMatch.mjs"; +import { + fuzzyMatch, + calcMatchRanges, + DEFAULT_WEIGHTS, +} from "../lib/FuzzyMatch.mjs"; import Utils from "../Utils.mjs"; /** * Fuzzy Match operation */ class FuzzyMatch extends Operation { - /** * FuzzyMatch constructor */ @@ -21,56 +24,58 @@ class FuzzyMatch extends Operation { this.name = "Fuzzy Match"; this.module = "Default"; - this.description = "Conducts a fuzzy search to find a pattern within the input based on weighted criteria.

e.g. A search for dpan will match on Don't Panic"; - this.infoURL = "https://wikipedia.org/wiki/Fuzzy_matching_(computer-assisted_translation)"; + this.description = + "Conducts a fuzzy search to find a pattern within the input based on weighted criteria.

e.g. A search for dpan will match on Don't Panic"; + this.infoURL = + "https://wikipedia.org/wiki/Fuzzy_matching_(computer-assisted_translation)"; this.inputType = "string"; this.outputType = "html"; this.args = [ { name: "Search", type: "binaryString", - value: "" + value: "", }, { name: "Sequential bonus", type: "number", value: DEFAULT_WEIGHTS.sequentialBonus, - hint: "Bonus for adjacent matches" + hint: "Bonus for adjacent matches", }, { name: "Separator bonus", type: "number", value: DEFAULT_WEIGHTS.separatorBonus, - hint: "Bonus if match occurs after a separator" + hint: "Bonus if match occurs after a separator", }, { name: "Camel bonus", type: "number", value: DEFAULT_WEIGHTS.camelBonus, - hint: "Bonus if match is uppercase and previous is lower" + hint: "Bonus if match is uppercase and previous is lower", }, { name: "First letter bonus", type: "number", value: DEFAULT_WEIGHTS.firstLetterBonus, - hint: "Bonus if the first letter is matched" + hint: "Bonus if the first letter is matched", }, { name: "Leading letter penalty", type: "number", value: DEFAULT_WEIGHTS.leadingLetterPenalty, - hint: "Penalty applied for every letter in the input before the first match" + hint: "Penalty applied for every letter in the input before the first match", }, { name: "Max leading letter penalty", type: "number", value: DEFAULT_WEIGHTS.maxLeadingLetterPenalty, - hint: "Maxiumum penalty for leading letters" + hint: "Maxiumum penalty for leading letters", }, { name: "Unmatched letter penalty", type: "number", - value: DEFAULT_WEIGHTS.unmatchedLetterPenalty + value: DEFAULT_WEIGHTS.unmatchedLetterPenalty, }, ]; } @@ -89,7 +94,7 @@ class FuzzyMatch extends Operation { firstLetterBonus: args[4], leadingLetterPenalty: args[5], maxLeadingLetterPenalty: args[6], - unmatchedLetterPenalty: args[7] + unmatchedLetterPenalty: args[7], }; const matches = fuzzyMatch(searchStr, input, true, weights); @@ -97,7 +102,9 @@ class FuzzyMatch extends Operation { return "No matches."; } - let result = "", pos = 0, hlClass = "hl1"; + let result = "", + pos = 0, + hlClass = "hl1"; matches.forEach(([matches, score, idxs]) => { const matchRanges = calcMatchRanges(idxs); @@ -115,7 +122,6 @@ class FuzzyMatch extends Operation { return result; } - } export default FuzzyMatch; diff --git a/src/core/operations/GOSTDecrypt.mjs b/src/core/operations/GOSTDecrypt.mjs index 8259a0d4..5987d6e8 100644 --- a/src/core/operations/GOSTDecrypt.mjs +++ b/src/core/operations/GOSTDecrypt.mjs @@ -8,13 +8,15 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import { toHexFast, fromHex } from "../lib/Hex.mjs"; -import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js"; +import { + CryptoGost, + GostEngine, +} from "@wavesenterprise/crypto-gost-js/index.js"; /** * GOST Decrypt operation */ class GOSTDecrypt extends Operation { - /** * GOSTDecrypt constructor */ @@ -23,7 +25,8 @@ class GOSTDecrypt extends Operation { this.name = "GOST Decrypt"; this.module = "Ciphers"; - this.description = "The GOST block cipher (Magma), defined in the standard GOST 28147-89 (RFC 5830), is a Soviet and Russian government standard symmetric key block cipher with a block size of 64 bits. The original standard, published in 1989, did not give the cipher any name, but the most recent revision of the standard, GOST R 34.12-2015 (RFC 7801, RFC 8891), specifies that it may be referred to as Magma. The GOST hash function is based on this cipher. The new standard also specifies a new 128-bit block cipher called Kuznyechik.

Developed in the 1970s, the standard had been marked 'Top Secret' and then downgraded to 'Secret' in 1990. Shortly after the dissolution of the USSR, it was declassified and it was released to the public in 1994. GOST 28147 was a Soviet alternative to the United States standard algorithm, DES. Thus, the two are very similar in structure."; + this.description = + "The GOST block cipher (Magma), defined in the standard GOST 28147-89 (RFC 5830), is a Soviet and Russian government standard symmetric key block cipher with a block size of 64 bits. The original standard, published in 1989, did not give the cipher any name, but the most recent revision of the standard, GOST R 34.12-2015 (RFC 7801, RFC 8891), specifies that it may be referred to as Magma. The GOST hash function is based on this cipher. The new standard also specifies a new 128-bit block cipher called Kuznyechik.

Developed in the 1970s, the standard had been marked 'Top Secret' and then downgraded to 'Secret' in 1990. Shortly after the dissolution of the USSR, it was declassified and it was released to the public in 1994. GOST 28147 was a Soviet alternative to the United States standard algorithm, DES. Thus, the two are very similar in structure."; this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -32,23 +35,23 @@ class GOSTDecrypt extends Operation { name: "Key", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "IV", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "Input type", type: "option", - value: ["Hex", "Raw"] + value: ["Hex", "Raw"], }, { name: "Output type", type: "option", - value: ["Raw", "Hex"] + value: ["Raw", "Hex"], }, { name: "Algorithm", @@ -57,40 +60,51 @@ class GOSTDecrypt extends Operation { { name: "GOST 28147 (Magma, 1989)", off: [5], - on: [6] + on: [6], }, { name: "GOST R 34.12 (Kuznyechik, 2015)", on: [5], - off: [6] - } - ] + off: [6], + }, + ], }, { name: "Block length", type: "option", - value: ["64", "128"] + value: ["64", "128"], }, { name: "sBox", type: "option", - value: ["E-TEST", "E-A", "E-B", "E-C", "E-D", "E-SC", "E-Z", "D-TEST", "D-A", "D-SC"] + value: [ + "E-TEST", + "E-A", + "E-B", + "E-C", + "E-D", + "E-SC", + "E-Z", + "D-TEST", + "D-A", + "D-SC", + ], }, { name: "Block mode", type: "option", - value: ["ECB", "CFB", "OFB", "CTR", "CBC"] + value: ["ECB", "CFB", "OFB", "CTR", "CBC"], }, { name: "Key meshing mode", type: "option", - value: ["NO", "CP"] + value: ["NO", "CP"], }, { name: "Padding", type: "option", - value: ["NO", "PKCS5", "ZERO", "RANDOM", "BIT"] - } + value: ["NO", "PKCS5", "ZERO", "RANDOM", "BIT"], + }, ]; } @@ -100,11 +114,29 @@ class GOSTDecrypt extends Operation { * @returns {string} */ async run(input, args) { - const [keyObj, ivObj, inputType, outputType, version, length, sBox, blockMode, keyMeshing, padding] = args; + const [ + keyObj, + ivObj, + inputType, + outputType, + version, + length, + sBox, + blockMode, + keyMeshing, + padding, + ] = args; - const key = toHexFast(Utils.convertToByteArray(keyObj.string, keyObj.option)); - const iv = toHexFast(Utils.convertToByteArray(ivObj.string, ivObj.option)); - input = inputType === "Hex" ? input : toHexFast(Utils.strToArrayBuffer(input)); + const key = toHexFast( + Utils.convertToByteArray(keyObj.string, keyObj.option), + ); + const iv = toHexFast( + Utils.convertToByteArray(ivObj.string, ivObj.option), + ); + input = + inputType === "Hex" + ? input + : toHexFast(Utils.strToArrayBuffer(input)); const versionNum = version === "GOST 28147 (Magma, 1989)" ? 1989 : 2015; const blockLength = versionNum === 1989 ? 64 : parseInt(length, 10); @@ -117,7 +149,7 @@ class GOSTDecrypt extends Operation { sBox: sBoxVal, block: blockMode, keyMeshing: keyMeshing, - padding: padding + padding: padding, }; try { @@ -125,14 +157,17 @@ class GOSTDecrypt extends Operation { if (iv) algorithm.iv = Hex.decode(iv); const cipher = GostEngine.getGostCipher(algorithm); - const out = Hex.encode(cipher.decrypt(Hex.decode(key), Hex.decode(input))); + const out = Hex.encode( + cipher.decrypt(Hex.decode(key), Hex.decode(input)), + ); - return outputType === "Hex" ? out : Utils.byteArrayToChars(fromHex(out)); + return outputType === "Hex" + ? out + : Utils.byteArrayToChars(fromHex(out)); } catch (err) { throw new OperationError(err); } } - } export default GOSTDecrypt; diff --git a/src/core/operations/GOSTEncrypt.mjs b/src/core/operations/GOSTEncrypt.mjs index ce92ecda..4014adcb 100644 --- a/src/core/operations/GOSTEncrypt.mjs +++ b/src/core/operations/GOSTEncrypt.mjs @@ -8,13 +8,15 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import { toHexFast, fromHex } from "../lib/Hex.mjs"; -import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js"; +import { + CryptoGost, + GostEngine, +} from "@wavesenterprise/crypto-gost-js/index.js"; /** * GOST Encrypt operation */ class GOSTEncrypt extends Operation { - /** * GOSTEncrypt constructor */ @@ -23,7 +25,8 @@ class GOSTEncrypt extends Operation { this.name = "GOST Encrypt"; this.module = "Ciphers"; - this.description = "The GOST block cipher (Magma), defined in the standard GOST 28147-89 (RFC 5830), is a Soviet and Russian government standard symmetric key block cipher with a block size of 64 bits. The original standard, published in 1989, did not give the cipher any name, but the most recent revision of the standard, GOST R 34.12-2015 (RFC 7801, RFC 8891), specifies that it may be referred to as Magma. The GOST hash function is based on this cipher. The new standard also specifies a new 128-bit block cipher called Kuznyechik.

Developed in the 1970s, the standard had been marked 'Top Secret' and then downgraded to 'Secret' in 1990. Shortly after the dissolution of the USSR, it was declassified and it was released to the public in 1994. GOST 28147 was a Soviet alternative to the United States standard algorithm, DES. Thus, the two are very similar in structure."; + this.description = + "The GOST block cipher (Magma), defined in the standard GOST 28147-89 (RFC 5830), is a Soviet and Russian government standard symmetric key block cipher with a block size of 64 bits. The original standard, published in 1989, did not give the cipher any name, but the most recent revision of the standard, GOST R 34.12-2015 (RFC 7801, RFC 8891), specifies that it may be referred to as Magma. The GOST hash function is based on this cipher. The new standard also specifies a new 128-bit block cipher called Kuznyechik.

Developed in the 1970s, the standard had been marked 'Top Secret' and then downgraded to 'Secret' in 1990. Shortly after the dissolution of the USSR, it was declassified and it was released to the public in 1994. GOST 28147 was a Soviet alternative to the United States standard algorithm, DES. Thus, the two are very similar in structure."; this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -32,23 +35,23 @@ class GOSTEncrypt extends Operation { name: "Key", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "IV", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "Input type", type: "option", - value: ["Raw", "Hex"] + value: ["Raw", "Hex"], }, { name: "Output type", type: "option", - value: ["Hex", "Raw"] + value: ["Hex", "Raw"], }, { name: "Algorithm", @@ -57,40 +60,51 @@ class GOSTEncrypt extends Operation { { name: "GOST 28147 (Magma, 1989)", off: [5], - on: [6] + on: [6], }, { name: "GOST R 34.12 (Kuznyechik, 2015)", on: [5], - off: [6] - } - ] + off: [6], + }, + ], }, { name: "Block length", type: "option", - value: ["64", "128"] + value: ["64", "128"], }, { name: "sBox", type: "option", - value: ["E-TEST", "E-A", "E-B", "E-C", "E-D", "E-SC", "E-Z", "D-TEST", "D-A", "D-SC"] + value: [ + "E-TEST", + "E-A", + "E-B", + "E-C", + "E-D", + "E-SC", + "E-Z", + "D-TEST", + "D-A", + "D-SC", + ], }, { name: "Block mode", type: "option", - value: ["ECB", "CFB", "OFB", "CTR", "CBC"] + value: ["ECB", "CFB", "OFB", "CTR", "CBC"], }, { name: "Key meshing mode", type: "option", - value: ["NO", "CP"] + value: ["NO", "CP"], }, { name: "Padding", type: "option", - value: ["NO", "PKCS5", "ZERO", "RANDOM", "BIT"] - } + value: ["NO", "PKCS5", "ZERO", "RANDOM", "BIT"], + }, ]; } @@ -100,11 +114,29 @@ class GOSTEncrypt extends Operation { * @returns {string} */ async run(input, args) { - const [keyObj, ivObj, inputType, outputType, version, length, sBox, blockMode, keyMeshing, padding] = args; + const [ + keyObj, + ivObj, + inputType, + outputType, + version, + length, + sBox, + blockMode, + keyMeshing, + padding, + ] = args; - const key = toHexFast(Utils.convertToByteArray(keyObj.string, keyObj.option)); - const iv = toHexFast(Utils.convertToByteArray(ivObj.string, ivObj.option)); - input = inputType === "Hex" ? input : toHexFast(Utils.strToArrayBuffer(input)); + const key = toHexFast( + Utils.convertToByteArray(keyObj.string, keyObj.option), + ); + const iv = toHexFast( + Utils.convertToByteArray(ivObj.string, ivObj.option), + ); + input = + inputType === "Hex" + ? input + : toHexFast(Utils.strToArrayBuffer(input)); const versionNum = version === "GOST 28147 (Magma, 1989)" ? 1989 : 2015; const blockLength = versionNum === 1989 ? 64 : parseInt(length, 10); @@ -117,7 +149,7 @@ class GOSTEncrypt extends Operation { sBox: sBoxVal, block: blockMode, keyMeshing: keyMeshing, - padding: padding + padding: padding, }; try { @@ -125,14 +157,17 @@ class GOSTEncrypt extends Operation { if (iv) algorithm.iv = Hex.decode(iv); const cipher = GostEngine.getGostCipher(algorithm); - const out = Hex.encode(cipher.encrypt(Hex.decode(key), Hex.decode(input))); + const out = Hex.encode( + cipher.encrypt(Hex.decode(key), Hex.decode(input)), + ); - return outputType === "Hex" ? out : Utils.byteArrayToChars(fromHex(out)); + return outputType === "Hex" + ? out + : Utils.byteArrayToChars(fromHex(out)); } catch (err) { throw new OperationError(err); } } - } export default GOSTEncrypt; diff --git a/src/core/operations/GOSTHash.mjs b/src/core/operations/GOSTHash.mjs index 5c8cc6f7..8d7eef66 100644 --- a/src/core/operations/GOSTHash.mjs +++ b/src/core/operations/GOSTHash.mjs @@ -13,7 +13,6 @@ import { toHexFast } from "../lib/Hex.mjs"; * GOST hash operation */ class GOSTHash extends Operation { - /** * GOSTHash constructor */ @@ -22,7 +21,8 @@ class GOSTHash extends Operation { this.name = "GOST Hash"; this.module = "Hashing"; - this.description = "The GOST hash function, defined in the standards GOST R 34.11-94 and GOST 34.311-95 is a 256-bit cryptographic hash function. It was initially defined in the Russian national standard GOST R 34.11-94 Information Technology – Cryptographic Information Security – Hash Function. The equivalent standard used by other member-states of the CIS is GOST 34.311-95.

This function must not be confused with a different Streebog hash function, which is defined in the new revision of the standard GOST R 34.11-2012.

The GOST hash function is based on the GOST block cipher."; + this.description = + "The GOST hash function, defined in the standards GOST R 34.11-94 and GOST 34.311-95 is a 256-bit cryptographic hash function. It was initially defined in the Russian national standard GOST R 34.11-94 Information Technology – Cryptographic Information Security – Hash Function. The equivalent standard used by other member-states of the CIS is GOST 34.311-95.

This function must not be confused with a different Streebog hash function, which is defined in the new revision of the standard GOST R 34.11-2012.

The GOST hash function is based on the GOST block cipher."; this.infoURL = "https://wikipedia.org/wiki/GOST_(hash_function)"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -34,25 +34,36 @@ class GOSTHash extends Operation { { name: "GOST 28147 (1994)", off: [1], - on: [2] + on: [2], }, { name: "GOST R 34.11 (Streebog, 2012)", on: [1], - off: [2] - } - ] + off: [2], + }, + ], }, { name: "Digest length", type: "option", - value: ["256", "512"] + value: ["256", "512"], }, { name: "sBox", type: "option", - value: ["E-TEST", "E-A", "E-B", "E-C", "E-D", "E-SC", "E-Z", "D-TEST", "D-A", "D-SC"] - } + value: [ + "E-TEST", + "E-A", + "E-B", + "E-C", + "E-D", + "E-SC", + "E-Z", + "D-TEST", + "D-A", + "D-SC", + ], + }, ]; } @@ -68,7 +79,7 @@ class GOSTHash extends Operation { const algorithm = { name: versionNum === 1994 ? "GOST 28147" : "GOST R 34.10", version: versionNum, - mode: "HASH" + mode: "HASH", }; if (versionNum === 1994) { @@ -85,7 +96,6 @@ class GOSTHash extends Operation { throw new OperationError(err); } } - } export default GOSTHash; diff --git a/src/core/operations/GOSTKeyUnwrap.mjs b/src/core/operations/GOSTKeyUnwrap.mjs index afcd6287..be56d376 100644 --- a/src/core/operations/GOSTKeyUnwrap.mjs +++ b/src/core/operations/GOSTKeyUnwrap.mjs @@ -8,13 +8,15 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import { toHexFast, fromHex } from "../lib/Hex.mjs"; -import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js"; +import { + CryptoGost, + GostEngine, +} from "@wavesenterprise/crypto-gost-js/index.js"; /** * GOST Key Unwrap operation */ class GOSTKeyUnwrap extends Operation { - /** * GOSTKeyUnwrap constructor */ @@ -23,7 +25,8 @@ class GOSTKeyUnwrap extends Operation { this.name = "GOST Key Unwrap"; this.module = "Ciphers"; - this.description = "A decryptor for keys wrapped using one of the GOST block ciphers."; + this.description = + "A decryptor for keys wrapped using one of the GOST block ciphers."; this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -32,23 +35,23 @@ class GOSTKeyUnwrap extends Operation { name: "Key", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "User Key Material", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "Input type", type: "option", - value: ["Hex", "Raw"] + value: ["Hex", "Raw"], }, { name: "Output type", type: "option", - value: ["Raw", "Hex"] + value: ["Raw", "Hex"], }, { name: "Algorithm", @@ -57,30 +60,41 @@ class GOSTKeyUnwrap extends Operation { { name: "GOST 28147 (Magma, 1989)", off: [5], - on: [6] + on: [6], }, { name: "GOST R 34.12 (Kuznyechik, 2015)", on: [5], - off: [6] - } - ] + off: [6], + }, + ], }, { name: "Block length", type: "option", - value: ["64", "128"] + value: ["64", "128"], }, { name: "sBox", type: "option", - value: ["E-TEST", "E-A", "E-B", "E-C", "E-D", "E-SC", "E-Z", "D-TEST", "D-A", "D-SC"] + value: [ + "E-TEST", + "E-A", + "E-B", + "E-C", + "E-D", + "E-SC", + "E-Z", + "D-TEST", + "D-A", + "D-SC", + ], }, { name: "Key wrapping", type: "option", - value: ["NO", "CP", "SC"] - } + value: ["NO", "CP", "SC"], + }, ]; } @@ -90,11 +104,27 @@ class GOSTKeyUnwrap extends Operation { * @returns {string} */ async run(input, args) { - const [keyObj, ukmObj, inputType, outputType, version, length, sBox, keyWrapping] = args; + const [ + keyObj, + ukmObj, + inputType, + outputType, + version, + length, + sBox, + keyWrapping, + ] = args; - const key = toHexFast(Utils.convertToByteArray(keyObj.string, keyObj.option)); - const ukm = toHexFast(Utils.convertToByteArray(ukmObj.string, ukmObj.option)); - input = inputType === "Hex" ? input : toHexFast(Utils.strToArrayBuffer(input)); + const key = toHexFast( + Utils.convertToByteArray(keyObj.string, keyObj.option), + ); + const ukm = toHexFast( + Utils.convertToByteArray(ukmObj.string, ukmObj.option), + ); + input = + inputType === "Hex" + ? input + : toHexFast(Utils.strToArrayBuffer(input)); const versionNum = version === "GOST 28147 (Magma, 1989)" ? 1989 : 2015; const blockLength = versionNum === 1989 ? 64 : parseInt(length, 10); @@ -105,7 +135,7 @@ class GOSTKeyUnwrap extends Operation { length: blockLength, mode: "KW", sBox: sBoxVal, - keyWrapping: keyWrapping + keyWrapping: keyWrapping, }; try { @@ -113,17 +143,22 @@ class GOSTKeyUnwrap extends Operation { algorithm.ukm = Hex.decode(ukm); const cipher = GostEngine.getGostCipher(algorithm); - const out = Hex.encode(cipher.unwrapKey(Hex.decode(key), Hex.decode(input))); + const out = Hex.encode( + cipher.unwrapKey(Hex.decode(key), Hex.decode(input)), + ); - return outputType === "Hex" ? out : Utils.byteArrayToChars(fromHex(out)); + return outputType === "Hex" + ? out + : Utils.byteArrayToChars(fromHex(out)); } catch (err) { if (err.toString().includes("Invalid typed array length")) { - throw new OperationError("Incorrect input length. Must be a multiple of the block size."); + throw new OperationError( + "Incorrect input length. Must be a multiple of the block size.", + ); } throw new OperationError(err); } } - } export default GOSTKeyUnwrap; diff --git a/src/core/operations/GOSTKeyWrap.mjs b/src/core/operations/GOSTKeyWrap.mjs index 5a3fd4e6..fa875e03 100644 --- a/src/core/operations/GOSTKeyWrap.mjs +++ b/src/core/operations/GOSTKeyWrap.mjs @@ -8,13 +8,15 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import { toHexFast, fromHex } from "../lib/Hex.mjs"; -import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js"; +import { + CryptoGost, + GostEngine, +} from "@wavesenterprise/crypto-gost-js/index.js"; /** * GOST Key Wrap operation */ class GOSTKeyWrap extends Operation { - /** * GOSTKeyWrap constructor */ @@ -23,7 +25,8 @@ class GOSTKeyWrap extends Operation { this.name = "GOST Key Wrap"; this.module = "Ciphers"; - this.description = "A key wrapping algorithm for protecting keys in untrusted storage using one of the GOST block cipers."; + this.description = + "A key wrapping algorithm for protecting keys in untrusted storage using one of the GOST block cipers."; this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -32,23 +35,23 @@ class GOSTKeyWrap extends Operation { name: "Key", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "User Key Material", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "Input type", type: "option", - value: ["Raw", "Hex"] + value: ["Raw", "Hex"], }, { name: "Output type", type: "option", - value: ["Hex", "Raw"] + value: ["Hex", "Raw"], }, { name: "Algorithm", @@ -57,30 +60,41 @@ class GOSTKeyWrap extends Operation { { name: "GOST 28147 (Magma, 1989)", off: [5], - on: [6] + on: [6], }, { name: "GOST R 34.12 (Kuznyechik, 2015)", on: [5], - off: [6] - } - ] + off: [6], + }, + ], }, { name: "Block length", type: "option", - value: ["64", "128"] + value: ["64", "128"], }, { name: "sBox", type: "option", - value: ["E-TEST", "E-A", "E-B", "E-C", "E-D", "E-SC", "E-Z", "D-TEST", "D-A", "D-SC"] + value: [ + "E-TEST", + "E-A", + "E-B", + "E-C", + "E-D", + "E-SC", + "E-Z", + "D-TEST", + "D-A", + "D-SC", + ], }, { name: "Key wrapping", type: "option", - value: ["NO", "CP", "SC"] - } + value: ["NO", "CP", "SC"], + }, ]; } @@ -90,11 +104,27 @@ class GOSTKeyWrap extends Operation { * @returns {string} */ async run(input, args) { - const [keyObj, ukmObj, inputType, outputType, version, length, sBox, keyWrapping] = args; + const [ + keyObj, + ukmObj, + inputType, + outputType, + version, + length, + sBox, + keyWrapping, + ] = args; - const key = toHexFast(Utils.convertToByteArray(keyObj.string, keyObj.option)); - const ukm = toHexFast(Utils.convertToByteArray(ukmObj.string, ukmObj.option)); - input = inputType === "Hex" ? input : toHexFast(Utils.strToArrayBuffer(input)); + const key = toHexFast( + Utils.convertToByteArray(keyObj.string, keyObj.option), + ); + const ukm = toHexFast( + Utils.convertToByteArray(ukmObj.string, ukmObj.option), + ); + input = + inputType === "Hex" + ? input + : toHexFast(Utils.strToArrayBuffer(input)); const versionNum = version === "GOST 28147 (Magma, 1989)" ? 1989 : 2015; const blockLength = versionNum === 1989 ? 64 : parseInt(length, 10); @@ -105,7 +135,7 @@ class GOSTKeyWrap extends Operation { length: blockLength, mode: "KW", sBox: sBoxVal, - keyWrapping: keyWrapping + keyWrapping: keyWrapping, }; try { @@ -113,17 +143,22 @@ class GOSTKeyWrap extends Operation { algorithm.ukm = Hex.decode(ukm); const cipher = GostEngine.getGostCipher(algorithm); - const out = Hex.encode(cipher.wrapKey(Hex.decode(key), Hex.decode(input))); + const out = Hex.encode( + cipher.wrapKey(Hex.decode(key), Hex.decode(input)), + ); - return outputType === "Hex" ? out : Utils.byteArrayToChars(fromHex(out)); + return outputType === "Hex" + ? out + : Utils.byteArrayToChars(fromHex(out)); } catch (err) { if (err.toString().includes("Invalid typed array length")) { - throw new OperationError("Incorrect input length. Must be a multiple of the block size."); + throw new OperationError( + "Incorrect input length. Must be a multiple of the block size.", + ); } throw new OperationError(err); } } - } export default GOSTKeyWrap; diff --git a/src/core/operations/GOSTSign.mjs b/src/core/operations/GOSTSign.mjs index 9195f469..50bf0760 100644 --- a/src/core/operations/GOSTSign.mjs +++ b/src/core/operations/GOSTSign.mjs @@ -8,13 +8,15 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import { toHexFast, fromHex } from "../lib/Hex.mjs"; -import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js"; +import { + CryptoGost, + GostEngine, +} from "@wavesenterprise/crypto-gost-js/index.js"; /** * GOST Sign operation */ class GOSTSign extends Operation { - /** * GOSTSign constructor */ @@ -23,7 +25,8 @@ class GOSTSign extends Operation { this.name = "GOST Sign"; this.module = "Ciphers"; - this.description = "Sign a plaintext message using one of the GOST block ciphers."; + this.description = + "Sign a plaintext message using one of the GOST block ciphers."; this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -32,23 +35,23 @@ class GOSTSign extends Operation { name: "Key", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "IV", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "Input type", type: "option", - value: ["Raw", "Hex"] + value: ["Raw", "Hex"], }, { name: "Output type", type: "option", - value: ["Hex", "Raw"] + value: ["Hex", "Raw"], }, { name: "Algorithm", @@ -57,24 +60,35 @@ class GOSTSign extends Operation { { name: "GOST 28147 (Magma, 1989)", off: [5], - on: [6] + on: [6], }, { name: "GOST R 34.12 (Kuznyechik, 2015)", on: [5], - off: [6] - } - ] + off: [6], + }, + ], }, { name: "Block length", type: "option", - value: ["64", "128"] + value: ["64", "128"], }, { name: "sBox", type: "option", - value: ["E-TEST", "E-A", "E-B", "E-C", "E-D", "E-SC", "E-Z", "D-TEST", "D-A", "D-SC"] + value: [ + "E-TEST", + "E-A", + "E-B", + "E-C", + "E-D", + "E-SC", + "E-Z", + "D-TEST", + "D-A", + "D-SC", + ], }, { name: "MAC length", @@ -82,8 +96,8 @@ class GOSTSign extends Operation { value: 32, min: 8, max: 64, - step: 8 - } + step: 8, + }, ]; } @@ -93,11 +107,27 @@ class GOSTSign extends Operation { * @returns {string} */ async run(input, args) { - const [keyObj, ivObj, inputType, outputType, version, length, sBox, macLength] = args; + const [ + keyObj, + ivObj, + inputType, + outputType, + version, + length, + sBox, + macLength, + ] = args; - const key = toHexFast(Utils.convertToByteArray(keyObj.string, keyObj.option)); - const iv = toHexFast(Utils.convertToByteArray(ivObj.string, ivObj.option)); - input = inputType === "Hex" ? input : toHexFast(Utils.strToArrayBuffer(input)); + const key = toHexFast( + Utils.convertToByteArray(keyObj.string, keyObj.option), + ); + const iv = toHexFast( + Utils.convertToByteArray(ivObj.string, ivObj.option), + ); + input = + inputType === "Hex" + ? input + : toHexFast(Utils.strToArrayBuffer(input)); const versionNum = version === "GOST 28147 (Magma, 1989)" ? 1989 : 2015; const blockLength = versionNum === 1989 ? 64 : parseInt(length, 10); @@ -108,7 +138,7 @@ class GOSTSign extends Operation { length: blockLength, mode: "MAC", sBox: sBoxVal, - macLength: macLength + macLength: macLength, }; try { @@ -116,14 +146,17 @@ class GOSTSign extends Operation { if (iv) algorithm.iv = Hex.decode(iv); const cipher = GostEngine.getGostCipher(algorithm); - const out = Hex.encode(cipher.sign(Hex.decode(key), Hex.decode(input))); + const out = Hex.encode( + cipher.sign(Hex.decode(key), Hex.decode(input)), + ); - return outputType === "Hex" ? out : Utils.byteArrayToChars(fromHex(out)); + return outputType === "Hex" + ? out + : Utils.byteArrayToChars(fromHex(out)); } catch (err) { throw new OperationError(err); } } - } export default GOSTSign; diff --git a/src/core/operations/GOSTVerify.mjs b/src/core/operations/GOSTVerify.mjs index a270e7c5..acd2e9c7 100644 --- a/src/core/operations/GOSTVerify.mjs +++ b/src/core/operations/GOSTVerify.mjs @@ -8,13 +8,15 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import { toHexFast } from "../lib/Hex.mjs"; -import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js"; +import { + CryptoGost, + GostEngine, +} from "@wavesenterprise/crypto-gost-js/index.js"; /** * GOST Verify operation */ class GOSTVerify extends Operation { - /** * GOSTVerify constructor */ @@ -23,7 +25,8 @@ class GOSTVerify extends Operation { this.name = "GOST Verify"; this.module = "Ciphers"; - this.description = "Verify the signature of a plaintext message using one of the GOST block ciphers. Enter the signature in the MAC field."; + this.description = + "Verify the signature of a plaintext message using one of the GOST block ciphers. Enter the signature in the MAC field."; this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; this.inputType = "string"; this.outputType = "string"; @@ -32,24 +35,24 @@ class GOSTVerify extends Operation { name: "Key", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "IV", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "MAC", type: "toggleString", value: "", - toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { name: "Input type", type: "option", - value: ["Raw", "Hex"] + value: ["Raw", "Hex"], }, { name: "Algorithm", @@ -58,25 +61,36 @@ class GOSTVerify extends Operation { { name: "GOST 28147 (Magma, 1989)", off: [5], - on: [6] + on: [6], }, { name: "GOST R 34.12 (Kuznyechik, 2015)", on: [5], - off: [6] - } - ] + off: [6], + }, + ], }, { name: "Block length", type: "option", - value: ["64", "128"] + value: ["64", "128"], }, { name: "sBox", type: "option", - value: ["E-TEST", "E-A", "E-B", "E-C", "E-D", "E-SC", "E-Z", "D-TEST", "D-A", "D-SC"] - } + value: [ + "E-TEST", + "E-A", + "E-B", + "E-C", + "E-D", + "E-SC", + "E-Z", + "D-TEST", + "D-A", + "D-SC", + ], + }, ]; } @@ -88,10 +102,19 @@ class GOSTVerify extends Operation { async run(input, args) { const [keyObj, ivObj, macObj, inputType, version, length, sBox] = args; - const key = toHexFast(Utils.convertToByteArray(keyObj.string, keyObj.option)); - const iv = toHexFast(Utils.convertToByteArray(ivObj.string, ivObj.option)); - const mac = toHexFast(Utils.convertToByteArray(macObj.string, macObj.option)); - input = inputType === "Hex" ? input : toHexFast(Utils.strToArrayBuffer(input)); + const key = toHexFast( + Utils.convertToByteArray(keyObj.string, keyObj.option), + ); + const iv = toHexFast( + Utils.convertToByteArray(ivObj.string, ivObj.option), + ); + const mac = toHexFast( + Utils.convertToByteArray(macObj.string, macObj.option), + ); + input = + inputType === "Hex" + ? input + : toHexFast(Utils.strToArrayBuffer(input)); const versionNum = version === "GOST 28147 (Magma, 1989)" ? 1989 : 2015; const blockLength = versionNum === 1989 ? 64 : parseInt(length, 10); @@ -102,7 +125,7 @@ class GOSTVerify extends Operation { length: blockLength, mode: "MAC", sBox: sBoxVal, - macLength: mac.length * 4 + macLength: mac.length * 4, }; try { @@ -110,14 +133,19 @@ class GOSTVerify extends Operation { if (iv) algorithm.iv = Hex.decode(iv); const cipher = GostEngine.getGostCipher(algorithm); - const out = cipher.verify(Hex.decode(key), Hex.decode(mac), Hex.decode(input)); + const out = cipher.verify( + Hex.decode(key), + Hex.decode(mac), + Hex.decode(input), + ); - return out ? "The signature matches" : "The signature does not match"; + return out + ? "The signature matches" + : "The signature does not match"; } catch (err) { throw new OperationError(err); } } - } export default GOSTVerify; diff --git a/src/core/operations/GenerateAllHashes.mjs b/src/core/operations/GenerateAllHashes.mjs index d9af8065..62059c24 100644 --- a/src/core/operations/GenerateAllHashes.mjs +++ b/src/core/operations/GenerateAllHashes.mjs @@ -42,7 +42,6 @@ import OperationError from "../errors/OperationError.mjs"; * Generate all hashes operation */ class GenerateAllHashes extends Operation { - /** * GenerateAllHashes constructor */ @@ -51,78 +50,318 @@ class GenerateAllHashes extends Operation { this.name = "Generate all hashes"; this.module = "Crypto"; - this.description = "Generates all available hashes and checksums for the input."; - this.infoURL = "https://wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions"; + this.description = + "Generates all available hashes and checksums for the input."; + this.infoURL = + "https://wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { name: "Length (bits)", type: "option", - value: [ - "All", "128", "160", "224", "256", "320", "384", "512" - ] + value: ["All", "128", "160", "224", "256", "320", "384", "512"], }, { name: "Include names", type: "boolean", - value: true + value: true, }, ]; this.hashes = [ - {name: "MD2", algo: (new MD2()), inputType: "arrayBuffer", params: []}, - {name: "MD4", algo: (new MD4()), inputType: "arrayBuffer", params: []}, - {name: "MD5", algo: (new MD5()), inputType: "arrayBuffer", params: []}, - {name: "MD6", algo: (new MD6()), inputType: "str", params: []}, - {name: "SHA0", algo: (new SHA0()), inputType: "arrayBuffer", params: []}, - {name: "SHA1", algo: (new SHA1()), inputType: "arrayBuffer", params: []}, - {name: "SHA2 224", algo: (new SHA2()), inputType: "arrayBuffer", params: ["224"]}, - {name: "SHA2 256", algo: (new SHA2()), inputType: "arrayBuffer", params: ["256"]}, - {name: "SHA2 384", algo: (new SHA2()), inputType: "arrayBuffer", params: ["384"]}, - {name: "SHA2 512", algo: (new SHA2()), inputType: "arrayBuffer", params: ["512"]}, - {name: "SHA3 224", algo: (new SHA3()), inputType: "arrayBuffer", params: ["224"]}, - {name: "SHA3 256", algo: (new SHA3()), inputType: "arrayBuffer", params: ["256"]}, - {name: "SHA3 384", algo: (new SHA3()), inputType: "arrayBuffer", params: ["384"]}, - {name: "SHA3 512", algo: (new SHA3()), inputType: "arrayBuffer", params: ["512"]}, - {name: "Keccak 224", algo: (new Keccak()), inputType: "arrayBuffer", params: ["224"]}, - {name: "Keccak 256", algo: (new Keccak()), inputType: "arrayBuffer", params: ["256"]}, - {name: "Keccak 384", algo: (new Keccak()), inputType: "arrayBuffer", params: ["384"]}, - {name: "Keccak 512", algo: (new Keccak()), inputType: "arrayBuffer", params: ["512"]}, - {name: "Shake 128", algo: (new Shake()), inputType: "arrayBuffer", params: ["128", 256]}, - {name: "Shake 256", algo: (new Shake()), inputType: "arrayBuffer", params: ["256", 512]}, - {name: "RIPEMD-128", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["128"]}, - {name: "RIPEMD-160", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["160"]}, - {name: "RIPEMD-256", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["256"]}, - {name: "RIPEMD-320", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["320"]}, - {name: "HAS-160", algo: (new HAS160()), inputType: "arrayBuffer", params: []}, - {name: "Whirlpool-0", algo: (new Whirlpool()), inputType: "arrayBuffer", params: ["Whirlpool-0"]}, - {name: "Whirlpool-T", algo: (new Whirlpool()), inputType: "arrayBuffer", params: ["Whirlpool-T"]}, - {name: "Whirlpool", algo: (new Whirlpool()), inputType: "arrayBuffer", params: ["Whirlpool"]}, - {name: "BLAKE2b-128", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["128", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2b-160", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["160", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2b-256", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["256", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2b-384", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["384", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2b-512", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["512", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2s-128", algo: (new BLAKE2s), inputType: "arrayBuffer", params: ["128", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2s-160", algo: (new BLAKE2s), inputType: "arrayBuffer", params: ["160", "Hex", {string: "", option: "UTF8"}]}, - {name: "BLAKE2s-256", algo: (new BLAKE2s), inputType: "arrayBuffer", params: ["256", "Hex", {string: "", option: "UTF8"}]}, - {name: "Streebog-256", algo: (new Streebog), inputType: "arrayBuffer", params: ["256"]}, - {name: "Streebog-512", algo: (new Streebog), inputType: "arrayBuffer", params: ["512"]}, - {name: "GOST", algo: (new GOSTHash), inputType: "arrayBuffer", params: ["GOST 28147 (1994)", "256", "D-A"]}, - {name: "LM Hash", algo: (new LMHash), inputType: "str", params: []}, - {name: "NT Hash", algo: (new NTHash), inputType: "str", params: []}, - {name: "SSDEEP", algo: (new SSDEEP()), inputType: "str"}, - {name: "CTPH", algo: (new CTPH()), inputType: "str"} + { + name: "MD2", + algo: new MD2(), + inputType: "arrayBuffer", + params: [], + }, + { + name: "MD4", + algo: new MD4(), + inputType: "arrayBuffer", + params: [], + }, + { + name: "MD5", + algo: new MD5(), + inputType: "arrayBuffer", + params: [], + }, + { name: "MD6", algo: new MD6(), inputType: "str", params: [] }, + { + name: "SHA0", + algo: new SHA0(), + inputType: "arrayBuffer", + params: [], + }, + { + name: "SHA1", + algo: new SHA1(), + inputType: "arrayBuffer", + params: [], + }, + { + name: "SHA2 224", + algo: new SHA2(), + inputType: "arrayBuffer", + params: ["224"], + }, + { + name: "SHA2 256", + algo: new SHA2(), + inputType: "arrayBuffer", + params: ["256"], + }, + { + name: "SHA2 384", + algo: new SHA2(), + inputType: "arrayBuffer", + params: ["384"], + }, + { + name: "SHA2 512", + algo: new SHA2(), + inputType: "arrayBuffer", + params: ["512"], + }, + { + name: "SHA3 224", + algo: new SHA3(), + inputType: "arrayBuffer", + params: ["224"], + }, + { + name: "SHA3 256", + algo: new SHA3(), + inputType: "arrayBuffer", + params: ["256"], + }, + { + name: "SHA3 384", + algo: new SHA3(), + inputType: "arrayBuffer", + params: ["384"], + }, + { + name: "SHA3 512", + algo: new SHA3(), + inputType: "arrayBuffer", + params: ["512"], + }, + { + name: "Keccak 224", + algo: new Keccak(), + inputType: "arrayBuffer", + params: ["224"], + }, + { + name: "Keccak 256", + algo: new Keccak(), + inputType: "arrayBuffer", + params: ["256"], + }, + { + name: "Keccak 384", + algo: new Keccak(), + inputType: "arrayBuffer", + params: ["384"], + }, + { + name: "Keccak 512", + algo: new Keccak(), + inputType: "arrayBuffer", + params: ["512"], + }, + { + name: "Shake 128", + algo: new Shake(), + inputType: "arrayBuffer", + params: ["128", 256], + }, + { + name: "Shake 256", + algo: new Shake(), + inputType: "arrayBuffer", + params: ["256", 512], + }, + { + name: "RIPEMD-128", + algo: new RIPEMD(), + inputType: "arrayBuffer", + params: ["128"], + }, + { + name: "RIPEMD-160", + algo: new RIPEMD(), + inputType: "arrayBuffer", + params: ["160"], + }, + { + name: "RIPEMD-256", + algo: new RIPEMD(), + inputType: "arrayBuffer", + params: ["256"], + }, + { + name: "RIPEMD-320", + algo: new RIPEMD(), + inputType: "arrayBuffer", + params: ["320"], + }, + { + name: "HAS-160", + algo: new HAS160(), + inputType: "arrayBuffer", + params: [], + }, + { + name: "Whirlpool-0", + algo: new Whirlpool(), + inputType: "arrayBuffer", + params: ["Whirlpool-0"], + }, + { + name: "Whirlpool-T", + algo: new Whirlpool(), + inputType: "arrayBuffer", + params: ["Whirlpool-T"], + }, + { + name: "Whirlpool", + algo: new Whirlpool(), + inputType: "arrayBuffer", + params: ["Whirlpool"], + }, + { + name: "BLAKE2b-128", + algo: new BLAKE2b(), + inputType: "arrayBuffer", + params: ["128", "Hex", { string: "", option: "UTF8" }], + }, + { + name: "BLAKE2b-160", + algo: new BLAKE2b(), + inputType: "arrayBuffer", + params: ["160", "Hex", { string: "", option: "UTF8" }], + }, + { + name: "BLAKE2b-256", + algo: new BLAKE2b(), + inputType: "arrayBuffer", + params: ["256", "Hex", { string: "", option: "UTF8" }], + }, + { + name: "BLAKE2b-384", + algo: new BLAKE2b(), + inputType: "arrayBuffer", + params: ["384", "Hex", { string: "", option: "UTF8" }], + }, + { + name: "BLAKE2b-512", + algo: new BLAKE2b(), + inputType: "arrayBuffer", + params: ["512", "Hex", { string: "", option: "UTF8" }], + }, + { + name: "BLAKE2s-128", + algo: new BLAKE2s(), + inputType: "arrayBuffer", + params: ["128", "Hex", { string: "", option: "UTF8" }], + }, + { + name: "BLAKE2s-160", + algo: new BLAKE2s(), + inputType: "arrayBuffer", + params: ["160", "Hex", { string: "", option: "UTF8" }], + }, + { + name: "BLAKE2s-256", + algo: new BLAKE2s(), + inputType: "arrayBuffer", + params: ["256", "Hex", { string: "", option: "UTF8" }], + }, + { + name: "Streebog-256", + algo: new Streebog(), + inputType: "arrayBuffer", + params: ["256"], + }, + { + name: "Streebog-512", + algo: new Streebog(), + inputType: "arrayBuffer", + params: ["512"], + }, + { + name: "GOST", + algo: new GOSTHash(), + inputType: "arrayBuffer", + params: ["GOST 28147 (1994)", "256", "D-A"], + }, + { + name: "LM Hash", + algo: new LMHash(), + inputType: "str", + params: [], + }, + { + name: "NT Hash", + algo: new NTHash(), + inputType: "str", + params: [], + }, + { name: "SSDEEP", algo: new SSDEEP(), inputType: "str" }, + { name: "CTPH", algo: new CTPH(), inputType: "str" }, ]; this.checksums = [ - {name: "Fletcher-8", algo: (new Fletcher8Checksum), inputType: "byteArray", params: []}, - {name: "Fletcher-16", algo: (new Fletcher16Checksum), inputType: "byteArray", params: []}, - {name: "Fletcher-32", algo: (new Fletcher32Checksum), inputType: "byteArray", params: []}, - {name: "Fletcher-64", algo: (new Fletcher64Checksum), inputType: "byteArray", params: []}, - {name: "Adler-32", algo: (new Adler32Checksum), inputType: "byteArray", params: []}, - {name: "CRC-8", algo: (new CRC8Checksum), inputType: "arrayBuffer", params: ["CRC-8"]}, - {name: "CRC-16", algo: (new CRC16Checksum), inputType: "arrayBuffer", params: []}, - {name: "CRC-32", algo: (new CRC32Checksum), inputType: "arrayBuffer", params: []} + { + name: "Fletcher-8", + algo: new Fletcher8Checksum(), + inputType: "byteArray", + params: [], + }, + { + name: "Fletcher-16", + algo: new Fletcher16Checksum(), + inputType: "byteArray", + params: [], + }, + { + name: "Fletcher-32", + algo: new Fletcher32Checksum(), + inputType: "byteArray", + params: [], + }, + { + name: "Fletcher-64", + algo: new Fletcher64Checksum(), + inputType: "byteArray", + params: [], + }, + { + name: "Adler-32", + algo: new Adler32Checksum(), + inputType: "byteArray", + params: [], + }, + { + name: "CRC-8", + algo: new CRC8Checksum(), + inputType: "arrayBuffer", + params: ["CRC-8"], + }, + { + name: "CRC-16", + algo: new CRC16Checksum(), + inputType: "arrayBuffer", + params: [], + }, + { + name: "CRC-32", + algo: new CRC32Checksum(), + inputType: "arrayBuffer", + params: [], + }, ]; } @@ -137,18 +376,37 @@ class GenerateAllHashes extends Operation { this.inputStr = Utils.arrayBufferToStr(input, false); this.inputByteArray = new Uint8Array(input); - let digest, output = ""; + let digest, + output = ""; // iterate over each of the hashes - this.hashes.forEach(hash => { - digest = this.executeAlgo(hash.algo, hash.inputType, hash.params || []); - output += this.formatDigest(digest, length, includeNames, hash.name); + this.hashes.forEach((hash) => { + digest = this.executeAlgo( + hash.algo, + hash.inputType, + hash.params || [], + ); + output += this.formatDigest( + digest, + length, + includeNames, + hash.name, + ); }); if (length === "All") { output += "\nChecksums:\n"; - this.checksums.forEach(checksum => { - digest = this.executeAlgo(checksum.algo, checksum.inputType, checksum.params || []); - output += this.formatDigest(digest, length, includeNames, checksum.name); + this.checksums.forEach((checksum) => { + digest = this.executeAlgo( + checksum.algo, + checksum.inputType, + checksum.params || [], + ); + output += this.formatDigest( + digest, + length, + includeNames, + checksum.name, + ); }); } @@ -163,7 +421,7 @@ class GenerateAllHashes extends Operation { * @param {Object[]} [params=[]] * @returns {string} */ - executeAlgo(algo, inputType, params=[]) { + executeAlgo(algo, inputType, params = []) { let digest = null; switch (inputType) { case "arrayBuffer": @@ -176,7 +434,9 @@ class GenerateAllHashes extends Operation { digest = algo.run(this.inputByteArray, params); break; default: - throw new OperationError("Unknown hash input type: " + inputType); + throw new OperationError( + "Unknown hash input type: " + inputType, + ); } return digest; @@ -191,15 +451,13 @@ class GenerateAllHashes extends Operation { * @returns {string} */ formatDigest(digest, length, includeNames, name) { - if (length !== "All" && (digest.length * 4) !== parseInt(length, 10)) + if (length !== "All" && digest.length * 4 !== parseInt(length, 10)) return ""; - if (!includeNames) - return digest + "\n"; + if (!includeNames) return digest + "\n"; - return `${name}:${" ".repeat(13-name.length)}${digest}\n`; + return `${name}:${" ".repeat(13 - name.length)}${digest}\n`; } - } export default GenerateAllHashes; diff --git a/src/core/operations/GenerateDeBruijnSequence.mjs b/src/core/operations/GenerateDeBruijnSequence.mjs index f28d421f..1ff074b9 100644 --- a/src/core/operations/GenerateDeBruijnSequence.mjs +++ b/src/core/operations/GenerateDeBruijnSequence.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Generate De Bruijn Sequence operation */ class GenerateDeBruijnSequence extends Operation { - /** * GenerateDeBruijnSequence constructor */ @@ -20,7 +19,8 @@ class GenerateDeBruijnSequence extends Operation { this.name = "Generate De Bruijn Sequence"; this.module = "Default"; - this.description = "Generates rolling keycode combinations given a certain alphabet size and key length."; + this.description = + "Generates rolling keycode combinations given a certain alphabet size and key length."; this.infoURL = "https://wikipedia.org/wiki/De_Bruijn_sequence"; this.inputType = "string"; this.outputType = "string"; @@ -28,13 +28,13 @@ class GenerateDeBruijnSequence extends Operation { { name: "Alphabet size (k)", type: "number", - value: 2 + value: 2, }, { name: "Key length (n)", type: "number", - value: 3 - } + value: 3, + }, ]; } @@ -47,15 +47,21 @@ class GenerateDeBruijnSequence extends Operation { const [k, n] = args; if (k < 2 || k > 9) { - throw new OperationError("Invalid alphabet size, required to be between 2 and 9 (inclusive)."); + throw new OperationError( + "Invalid alphabet size, required to be between 2 and 9 (inclusive).", + ); } if (n < 2) { - throw new OperationError("Invalid key length, required to be at least 2."); + throw new OperationError( + "Invalid key length, required to be at least 2.", + ); } if (Math.pow(k, n) > 50000) { - throw new OperationError("Too many permutations, please reduce k^n to under 50,000."); + throw new OperationError( + "Too many permutations, please reduce k^n to under 50,000.", + ); } const a = new Array(k * n).fill(0); diff --git a/src/core/operations/GenerateHOTP.mjs b/src/core/operations/GenerateHOTP.mjs index a800df6b..5ec4713d 100644 --- a/src/core/operations/GenerateHOTP.mjs +++ b/src/core/operations/GenerateHOTP.mjs @@ -12,7 +12,6 @@ import ToBase32 from "./ToBase32.mjs"; * Generate HOTP operation */ class GenerateHOTP extends Operation { - /** * GenerateHOTP constructor */ @@ -21,31 +20,33 @@ class GenerateHOTP extends Operation { this.name = "Generate HOTP"; this.module = "Default"; - this.description = "The HMAC-based One-Time Password algorithm (HOTP) is an algorithm that computes a one-time password from a shared secret key and an incrementing counter. It has been adopted as Internet Engineering Task Force standard RFC 4226, is the cornerstone of Initiative For Open Authentication (OAUTH), and is used in a number of two-factor authentication systems.

Enter the secret as the input or leave it blank for a random secret to be generated."; - this.infoURL = "https://wikipedia.org/wiki/HMAC-based_One-time_Password_algorithm"; + this.description = + "The HMAC-based One-Time Password algorithm (HOTP) is an algorithm that computes a one-time password from a shared secret key and an incrementing counter. It has been adopted as Internet Engineering Task Force standard RFC 4226, is the cornerstone of Initiative For Open Authentication (OAUTH), and is used in a number of two-factor authentication systems.

Enter the secret as the input or leave it blank for a random secret to be generated."; + this.infoURL = + "https://wikipedia.org/wiki/HMAC-based_One-time_Password_algorithm"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Name", - "type": "string", - "value": "" + name: "Name", + type: "string", + value: "", }, { - "name": "Key size", - "type": "number", - "value": 32 + name: "Key size", + type: "number", + value: 32, }, { - "name": "Code length", - "type": "number", - "value": 6 + name: "Code length", + type: "number", + value: 6, }, { - "name": "Counter", - "type": "number", - "value": 0 - } + name: "Counter", + type: "number", + value: 0, + }, ]; } @@ -59,12 +60,11 @@ class GenerateHOTP extends Operation { name: args[0], keySize: args[1], codeLength: args[2], - secret: (new ToBase32).run(input, []).split("=")[0], + secret: new ToBase32().run(input, []).split("=")[0], }); const counter = args[3]; return `URI: ${otpObj.hotpURL}\n\nPassword: ${otpObj.hotp(counter)}`; } - } export default GenerateHOTP; diff --git a/src/core/operations/GenerateImage.mjs b/src/core/operations/GenerateImage.mjs index 66e762b5..9f880b96 100644 --- a/src/core/operations/GenerateImage.mjs +++ b/src/core/operations/GenerateImage.mjs @@ -7,16 +7,15 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {isImage} from "../lib/FileType.mjs"; -import {toBase64} from "../lib/Base64.mjs"; -import {isWorkerEnvironment} from "../Utils.mjs"; +import { isImage } from "../lib/FileType.mjs"; +import { toBase64 } from "../lib/Base64.mjs"; +import { isWorkerEnvironment } from "../Utils.mjs"; import jimp from "jimp"; /** * Generate Image operation */ class GenerateImage extends Operation { - /** * GenerateImage constructor */ @@ -25,27 +24,28 @@ class GenerateImage extends Operation { this.name = "Generate Image"; this.module = "Image"; - this.description = "Generates an image using the input as pixel values."; + this.description = + "Generates an image using the input as pixel values."; this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; this.presentType = "html"; this.args = [ { - "name": "Mode", - "type": "option", - "value": ["Greyscale", "RG", "RGB", "RGBA", "Bits"] + name: "Mode", + type: "option", + value: ["Greyscale", "RG", "RGB", "RGBA", "Bits"], }, { - "name": "Pixel Scale Factor", - "type": "number", - "value": 8, + name: "Pixel Scale Factor", + type: "number", + value: 8, }, { - "name": "Pixels per row", - "type": "number", - "value": 64, - } + name: "Pixels per row", + type: "number", + value: 64, + }, ]; } @@ -67,17 +67,19 @@ class GenerateImage extends Operation { } const bytePerPixelMap = { - "Greyscale": 1, - "RG": 2, - "RGB": 3, - "RGBA": 4, - "Bits": 1/8, + Greyscale: 1, + RG: 2, + RGB: 3, + RGBA: 4, + Bits: 1 / 8, }; const bytesPerPixel = bytePerPixelMap[mode]; - if (bytesPerPixel > 0 && input.length % bytesPerPixel !== 0) { - throw new OperationError(`Number of bytes is not a divisor of ${bytesPerPixel}`); + if (bytesPerPixel > 0 && input.length % bytesPerPixel !== 0) { + throw new OperationError( + `Number of bytes is not a divisor of ${bytesPerPixel}`, + ); } const height = Math.ceil(input.length / bytesPerPixel / width); @@ -94,8 +96,8 @@ class GenerateImage extends Operation { const x = index % width; const y = Math.floor(index / width); - const value = curByte[k] === "0" ? 0xFF : 0x00; - const pixel = jimp.rgbaToInt(value, value, value, 0xFF); + const value = curByte[k] === "0" ? 0xff : 0x00; + const pixel = jimp.rgbaToInt(value, value, value, 0xff); image.setPixelColor(pixel, x, y); } } @@ -109,7 +111,7 @@ class GenerateImage extends Operation { let red = 0x00; let green = 0x00; let blue = 0x00; - let alpha = 0xFF; + let alpha = 0xff; switch (mode) { case "Greyscale": @@ -142,7 +144,9 @@ class GenerateImage extends Operation { const pixel = jimp.rgbaToInt(red, green, blue, alpha); image.setPixelColor(pixel, x, y); } catch (err) { - throw new OperationError(`Error while generating image from pixel values. (${err})`); + throw new OperationError( + `Error while generating image from pixel values. (${err})`, + ); } } } @@ -151,7 +155,11 @@ class GenerateImage extends Operation { if (isWorkerEnvironment()) self.sendStatusMessage("Scaling image..."); - image.scaleToFit(width*scale, height*scale, jimp.RESIZE_NEAREST_NEIGHBOR); + image.scaleToFit( + width * scale, + height * scale, + jimp.RESIZE_NEAREST_NEIGHBOR, + ); } try { @@ -178,7 +186,6 @@ class GenerateImage extends Operation { return ``; } - } export default GenerateImage; diff --git a/src/core/operations/GenerateLoremIpsum.mjs b/src/core/operations/GenerateLoremIpsum.mjs index 7bc636ac..b5e1acc9 100644 --- a/src/core/operations/GenerateLoremIpsum.mjs +++ b/src/core/operations/GenerateLoremIpsum.mjs @@ -6,13 +6,17 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import { GenerateParagraphs, GenerateSentences, GenerateWords, GenerateBytes } from "../lib/LoremIpsum.mjs"; +import { + GenerateParagraphs, + GenerateSentences, + GenerateWords, + GenerateBytes, +} from "../lib/LoremIpsum.mjs"; /** * Generate Lorem Ipsum operation */ class GenerateLoremIpsum extends Operation { - /** * GenerateLoremIpsum constructor */ @@ -21,22 +25,22 @@ class GenerateLoremIpsum extends Operation { this.name = "Generate Lorem Ipsum"; this.module = "Default"; - this.description = "Generate varying length lorem ipsum placeholder text."; + this.description = + "Generate varying length lorem ipsum placeholder text."; this.infoURL = "https://wikipedia.org/wiki/Lorem_ipsum"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Length", - "type": "number", - "value": "3" + name: "Length", + type: "number", + value: "3", }, { - "name": "Length in", - "type": "option", - "value": ["Paragraphs", "Sentences", "Words", "Bytes"] - } - + name: "Length in", + type: "option", + value: ["Paragraphs", "Sentences", "Words", "Bytes"], + }, ]; } @@ -61,10 +65,8 @@ class GenerateLoremIpsum extends Operation { return GenerateBytes(length); default: throw new OperationError("Invalid length type"); - } } - } export default GenerateLoremIpsum; diff --git a/src/core/operations/GeneratePGPKeyPair.mjs b/src/core/operations/GeneratePGPKeyPair.mjs index a26b5cc8..c997fdc7 100644 --- a/src/core/operations/GeneratePGPKeyPair.mjs +++ b/src/core/operations/GeneratePGPKeyPair.mjs @@ -11,14 +11,14 @@ import kbpgp from "kbpgp"; import { getSubkeySize, ASP } from "../lib/PGP.mjs"; import { cryptNotice } from "../lib/Crypt.mjs"; import * as es6promisify from "es6-promisify"; -const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; - +const promisify = es6promisify.default + ? es6promisify.default.promisify + : es6promisify.promisify; /** * Generate PGP Key Pair operation */ class GeneratePGPKeyPair extends Operation { - /** * GeneratePGPKeyPair constructor */ @@ -33,25 +33,32 @@ class GeneratePGPKeyPair extends Operation { this.outputType = "string"; this.args = [ { - "name": "Key type", - "type": "option", - "value": ["RSA-1024", "RSA-2048", "RSA-4096", "ECC-256", "ECC-384", "ECC-521"] + name: "Key type", + type: "option", + value: [ + "RSA-1024", + "RSA-2048", + "RSA-4096", + "ECC-256", + "ECC-384", + "ECC-521", + ], }, { - "name": "Password (optional)", - "type": "string", - "value": "" + name: "Password (optional)", + type: "string", + value: "", }, { - "name": "Name (optional)", - "type": "string", - "value": "" + name: "Name (optional)", + type: "string", + value: "", }, { - "name": "Email (optional)", - "type": "string", - "value": "" - } + name: "Email (optional)", + type: "string", + value: "", + }, ]; } @@ -83,40 +90,50 @@ class GeneratePGPKeyPair extends Operation { userid: userIdentifier, ecc: keyType === "ecc", primary: { - "nbits": keySize, - "flags": flags, - "expire_in": 0 + nbits: keySize, + flags: flags, + expire_in: 0, }, - subkeys: [{ - "nbits": getSubkeySize(keySize), - "flags": kbpgp.const.openpgp.sign_data, - "expire_in": 86400 * 365 * 8 - }, { - "nbits": getSubkeySize(keySize), - "flags": kbpgp.const.openpgp.encrypt_comm | kbpgp.const.openpgp.encrypt_storage, - "expire_in": 86400 * 365 * 2 - }], - asp: ASP + subkeys: [ + { + nbits: getSubkeySize(keySize), + flags: kbpgp.const.openpgp.sign_data, + expire_in: 86400 * 365 * 8, + }, + { + nbits: getSubkeySize(keySize), + flags: + kbpgp.const.openpgp.encrypt_comm | + kbpgp.const.openpgp.encrypt_storage, + expire_in: 86400 * 365 * 2, + }, + ], + asp: ASP, }; return new Promise(async (resolve, reject) => { try { - const unsignedKey = await promisify(kbpgp.KeyManager.generate)(keyGenerationOptions); + const unsignedKey = await promisify(kbpgp.KeyManager.generate)( + keyGenerationOptions, + ); await promisify(unsignedKey.sign.bind(unsignedKey))({}); const signedKey = unsignedKey, privateKeyExportOptions = {}; if (password) privateKeyExportOptions.passphrase = password; - const privateKey = await promisify(signedKey.export_pgp_private.bind(signedKey))(privateKeyExportOptions); - const publicKey = await promisify(signedKey.export_pgp_public.bind(signedKey))({}); + const privateKey = await promisify( + signedKey.export_pgp_private.bind(signedKey), + )(privateKeyExportOptions); + const publicKey = await promisify( + signedKey.export_pgp_public.bind(signedKey), + )({}); resolve(privateKey + "\n" + publicKey.trim()); } catch (err) { reject(`Error whilst generating key pair: ${err}`); } }); } - } export default GeneratePGPKeyPair; diff --git a/src/core/operations/GenerateQRCode.mjs b/src/core/operations/GenerateQRCode.mjs index d3e1ee3b..f335a8e6 100644 --- a/src/core/operations/GenerateQRCode.mjs +++ b/src/core/operations/GenerateQRCode.mjs @@ -15,7 +15,6 @@ import Utils from "../Utils.mjs"; * Generate QR Code operation */ class GenerateQRCode extends Operation { - /** * GenerateQRCode constructor */ @@ -24,35 +23,36 @@ class GenerateQRCode extends Operation { this.name = "Generate QR Code"; this.module = "Image"; - this.description = "Generates a Quick Response (QR) code from the input text.

A QR code is a type of matrix barcode (or two-dimensional barcode) first designed in 1994 for the automotive industry in Japan. A barcode is a machine-readable optical label that contains information about the item to which it is attached."; + this.description = + "Generates a Quick Response (QR) code from the input text.

A QR code is a type of matrix barcode (or two-dimensional barcode) first designed in 1994 for the automotive industry in Japan. A barcode is a machine-readable optical label that contains information about the item to which it is attached."; this.infoURL = "https://wikipedia.org/wiki/QR_code"; this.inputType = "string"; this.outputType = "ArrayBuffer"; this.presentType = "html"; this.args = [ { - "name": "Image Format", - "type": "option", - "value": ["PNG", "SVG", "EPS", "PDF"] + name: "Image Format", + type: "option", + value: ["PNG", "SVG", "EPS", "PDF"], }, { - "name": "Module size (px)", - "type": "number", - "value": 5, - "min": 1 + name: "Module size (px)", + type: "number", + value: 5, + min: 1, }, { - "name": "Margin (num modules)", - "type": "number", - "value": 4, - "min": 0 + name: "Margin (num modules)", + type: "number", + value: 4, + min: 0, }, { - "name": "Error correction", - "type": "option", - "value": ["Low", "Medium", "Quartile", "High"], - "defaultIndex": 1 - } + name: "Error correction", + type: "option", + value: ["Low", "Medium", "Quartile", "High"], + defaultIndex: 1, + }, ]; } @@ -88,7 +88,6 @@ class GenerateQRCode extends Operation { return Utils.arrayBufferToStr(data); } - } export default GenerateQRCode; diff --git a/src/core/operations/GenerateRSAKeyPair.mjs b/src/core/operations/GenerateRSAKeyPair.mjs index 3dd2837d..0acd96ec 100644 --- a/src/core/operations/GenerateRSAKeyPair.mjs +++ b/src/core/operations/GenerateRSAKeyPair.mjs @@ -13,7 +13,6 @@ import { cryptNotice } from "../lib/Crypt.mjs"; * Generate RSA Key Pair operation */ class GenerateRSAKeyPair extends Operation { - /** * GenerateRSAKeyPair constructor */ @@ -30,21 +29,13 @@ class GenerateRSAKeyPair extends Operation { { name: "RSA Key Length", type: "option", - value: [ - "1024", - "2048", - "4096" - ] + value: ["1024", "2048", "4096"], }, { name: "Output Format", type: "option", - value: [ - "PEM", - "JSON", - "DER" - ] - } + value: ["PEM", "JSON", "DER"], + }, ]; } @@ -57,32 +48,43 @@ class GenerateRSAKeyPair extends Operation { const [keyLength, outputFormat] = args; return new Promise((resolve, reject) => { - forge.pki.rsa.generateKeyPair({ - bits: Number(keyLength), - workers: -1, - workerScript: "assets/forge/prime.worker.min.js" - }, (err, keypair) => { - if (err) return reject(err); + forge.pki.rsa.generateKeyPair( + { + bits: Number(keyLength), + workers: -1, + workerScript: "assets/forge/prime.worker.min.js", + }, + (err, keypair) => { + if (err) return reject(err); - let result; + let result; - switch (outputFormat) { - case "PEM": - result = forge.pki.publicKeyToPem(keypair.publicKey) + "\n" + forge.pki.privateKeyToPem(keypair.privateKey); - break; - case "JSON": - result = JSON.stringify(keypair); - break; - case "DER": - result = forge.asn1.toDer(forge.pki.privateKeyToAsn1(keypair.privateKey)).getBytes(); - break; - } + switch (outputFormat) { + case "PEM": + result = + forge.pki.publicKeyToPem(keypair.publicKey) + + "\n" + + forge.pki.privateKeyToPem(keypair.privateKey); + break; + case "JSON": + result = JSON.stringify(keypair); + break; + case "DER": + result = forge.asn1 + .toDer( + forge.pki.privateKeyToAsn1( + keypair.privateKey, + ), + ) + .getBytes(); + break; + } - resolve(result); - }); + resolve(result); + }, + ); }); } - } export default GenerateRSAKeyPair; diff --git a/src/core/operations/GenerateTOTP.mjs b/src/core/operations/GenerateTOTP.mjs index 5c52721d..31b35651 100644 --- a/src/core/operations/GenerateTOTP.mjs +++ b/src/core/operations/GenerateTOTP.mjs @@ -12,7 +12,6 @@ import ToBase32 from "./ToBase32.mjs"; * Generate TOTP operation */ class GenerateTOTP extends Operation { - /** * GenerateTOTP constructor */ @@ -21,36 +20,38 @@ class GenerateTOTP extends Operation { this.name = "Generate TOTP"; this.module = "Default"; - this.description = "The Time-based One-Time Password algorithm (TOTP) is an algorithm that computes a one-time password from a shared secret key and the current time. It has been adopted as Internet Engineering Task Force standard RFC 6238, is the cornerstone of Initiative For Open Authentication (OAUTH), and is used in a number of two-factor authentication systems. A TOTP is an HOTP where the counter is the current time.

Enter the secret as the input or leave it blank for a random secret to be generated. T0 and T1 are in seconds."; - this.infoURL = "https://wikipedia.org/wiki/Time-based_One-time_Password_algorithm"; + this.description = + "The Time-based One-Time Password algorithm (TOTP) is an algorithm that computes a one-time password from a shared secret key and the current time. It has been adopted as Internet Engineering Task Force standard RFC 6238, is the cornerstone of Initiative For Open Authentication (OAUTH), and is used in a number of two-factor authentication systems. A TOTP is an HOTP where the counter is the current time.

Enter the secret as the input or leave it blank for a random secret to be generated. T0 and T1 are in seconds."; + this.infoURL = + "https://wikipedia.org/wiki/Time-based_One-time_Password_algorithm"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Name", - "type": "string", - "value": "" + name: "Name", + type: "string", + value: "", }, { - "name": "Key size", - "type": "number", - "value": 32 + name: "Key size", + type: "number", + value: 32, }, { - "name": "Code length", - "type": "number", - "value": 6 + name: "Code length", + type: "number", + value: 6, }, { - "name": "Epoch offset (T0)", - "type": "number", - "value": 0 + name: "Epoch offset (T0)", + type: "number", + value: 0, }, { - "name": "Interval (T1)", - "type": "number", - "value": 30 - } + name: "Interval (T1)", + type: "number", + value: 30, + }, ]; } @@ -64,13 +65,12 @@ class GenerateTOTP extends Operation { name: args[0], keySize: args[1], codeLength: args[2], - secret: (new ToBase32).run(input, []).split("=")[0], + secret: new ToBase32().run(input, []).split("=")[0], epoch: args[3], - timeSlice: args[4] + timeSlice: args[4], }); return `URI: ${otpObj.totpURL}\n\nPassword: ${otpObj.totp()}`; } - } export default GenerateTOTP; diff --git a/src/core/operations/GenerateUUID.mjs b/src/core/operations/GenerateUUID.mjs index 1ee0faba..5f3a72cb 100644 --- a/src/core/operations/GenerateUUID.mjs +++ b/src/core/operations/GenerateUUID.mjs @@ -11,7 +11,6 @@ import crypto from "crypto"; * Generate UUID operation */ class GenerateUUID extends Operation { - /** * GenerateUUID constructor */ @@ -20,8 +19,10 @@ class GenerateUUID extends Operation { this.name = "Generate UUID"; this.module = "Crypto"; - this.description = "Generates an RFC 4122 version 4 compliant Universally Unique Identifier (UUID), also known as a Globally Unique Identifier (GUID).

A version 4 UUID relies on random numbers, in this case generated using window.crypto if available and falling back to Math.random if not."; - this.infoURL = "https://wikipedia.org/wiki/Universally_unique_identifier"; + this.description = + "Generates an RFC 4122 version 4 compliant Universally Unique Identifier (UUID), also known as a Globally Unique Identifier (GUID).

A version 4 UUID relies on random numbers, in this case generated using window.crypto if available and falling back to Math.random if not."; + this.infoURL = + "https://wikipedia.org/wiki/Universally_unique_identifier"; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -37,14 +38,16 @@ class GenerateUUID extends Operation { return crypto.randomBytes(4).readUInt32BE(0, true); }); let i = 0; - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { - const r = (buf[i >> 3] >> ((i % 8) * 4)) & 0xf, - v = c === "x" ? r : (r & 0x3 | 0x8); - i++; - return v.toString(16); - }); + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace( + /[xy]/g, + function (c) { + const r = (buf[i >> 3] >> ((i % 8) * 4)) & 0xf, + v = c === "x" ? r : (r & 0x3) | 0x8; + i++; + return v.toString(16); + }, + ); } - } export default GenerateUUID; diff --git a/src/core/operations/GenericCodeBeautify.mjs b/src/core/operations/GenericCodeBeautify.mjs index 30e11cb3..880db40f 100644 --- a/src/core/operations/GenericCodeBeautify.mjs +++ b/src/core/operations/GenericCodeBeautify.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Generic Code Beautify operation */ class GenericCodeBeautify extends Operation { - /** * GenericCodeBeautify constructor */ @@ -19,7 +18,8 @@ class GenericCodeBeautify extends Operation { this.name = "Generic Code Beautify"; this.module = "Code"; - this.description = "Attempts to pretty print C-style languages such as C, C++, C#, Java, PHP, JavaScript etc.

This will not do a perfect job, and the resulting code may not work any more. This operation is designed purely to make obfuscated or minified code more easy to read and understand.

Things which will not work properly:
  • For loop formatting
  • Do-While loop formatting
  • Switch/Case indentation
  • Certain bit shift operators
"; + this.description = + "Attempts to pretty print C-style languages such as C, C++, C#, Java, PHP, JavaScript etc.

This will not do a perfect job, and the resulting code may not work any more. This operation is designed purely to make obfuscated or minified code more easy to read and understand.

Things which will not work properly:
  • For loop formatting
  • Do-While loop formatting
  • Switch/Case indentation
  • Certain bit shift operators
"; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -100,13 +100,16 @@ class GenericCodeBeautify extends Operation { level++; break; case "\n": - if (i+1 >= code.length) break; + if (i + 1 >= code.length) break; - if (code[i+1] === "}") level--; - indent = (level >= 0) ? Array(level*4+1).join(" ") : ""; + if (code[i + 1] === "}") level--; + indent = level >= 0 ? Array(level * 4 + 1).join(" ") : ""; - code = code.substring(0, i+1) + indent + code.substring(i+1); - if (level > 0) i += level*4; + code = + code.substring(0, i + 1) + + indent + + code.substring(i + 1); + if (level > 0) i += level * 4; break; } i++; @@ -125,21 +128,33 @@ class GenericCodeBeautify extends Operation { .replace(/\s*{/g, " {") .replace(/}\n/g, "}\n\n") // Hacky horribleness - .replace(/(if|for|while|with|elif|elseif)\s*\(([^\n]*)\)\s*\n([^{])/gim, "$1 ($2)\n $3") - .replace(/(if|for|while|with|elif|elseif)\s*\(([^\n]*)\)([^{])/gim, "$1 ($2) $3") + .replace( + /(if|for|while|with|elif|elseif)\s*\(([^\n]*)\)\s*\n([^{])/gim, + "$1 ($2)\n $3", + ) + .replace( + /(if|for|while|with|elif|elseif)\s*\(([^\n]*)\)([^{])/gim, + "$1 ($2) $3", + ) .replace(/else\s*\n([^{])/gim, "else\n $1") .replace(/else\s+([^{])/gim, "else $1") // Remove strategic spaces .replace(/\s+;/g, ";") .replace(/\{\s+\}/g, "{}") .replace(/\[\s+\]/g, "[]") - .replace(/}\s*(else|catch|except|finally|elif|elseif|else if)/gi, "} $1"); + .replace( + /}\s*(else|catch|except|finally|elif|elseif|else if)/gi, + "} $1", + ); // Replace preserved tokens const ptokens = /###preservedToken(\d+)###/g; while ((m = ptokens.exec(code))) { const ti = parseInt(m[1], 10); - code = code.substring(0, m.index) + preservedTokens[ti] + code.substring(m.index + m[0].length); + code = + code.substring(0, m.index) + + preservedTokens[ti] + + code.substring(m.index + m[0].length); ptokens.lastIndex = m.index; } @@ -150,12 +165,15 @@ class GenericCodeBeautify extends Operation { */ function preserveToken(str, match, t) { preservedTokens[t] = match[0]; - return str.substring(0, match.index) + - "###preservedToken" + t + "###" + - str.substring(match.index + match[0].length); + return ( + str.substring(0, match.index) + + "###preservedToken" + + t + + "###" + + str.substring(match.index + match[0].length) + ); } } - } export default GenericCodeBeautify; diff --git a/src/core/operations/GetAllCasings.mjs b/src/core/operations/GetAllCasings.mjs index b3f3e94e..fc6cd18c 100644 --- a/src/core/operations/GetAllCasings.mjs +++ b/src/core/operations/GetAllCasings.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Permutate String operation */ class GetAllCasings extends Operation { - /** * GetAllCasings constructor */ @@ -19,7 +18,8 @@ class GetAllCasings extends Operation { this.name = "Get All Casings"; this.module = "Default"; - this.description = "Outputs all possible casing variations of a string."; + this.description = + "Outputs all possible casing variations of a string."; this.infoURL = ""; this.inputType = "string"; this.outputType = "string"; diff --git a/src/core/operations/GetTime.mjs b/src/core/operations/GetTime.mjs index 7d10864f..d6bd95d3 100644 --- a/src/core/operations/GetTime.mjs +++ b/src/core/operations/GetTime.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {UNITS} from "../lib/DateTime.mjs"; +import { UNITS } from "../lib/DateTime.mjs"; /** * Get Time operation */ class GetTime extends Operation { - /** * GetTime constructor */ @@ -22,7 +21,8 @@ class GetTime extends Operation { this.name = "Get Time"; this.module = "Default"; - this.description = "Generates a timestamp showing the amount of time since the UNIX epoch (1970-01-01 00:00:00 UTC). Uses the W3C High Resolution Time API."; + this.description = + "Generates a timestamp showing the amount of time since the UNIX epoch (1970-01-01 00:00:00 UTC). Uses the W3C High Resolution Time API."; this.infoURL = "https://wikipedia.org/wiki/Unix_time"; this.inputType = "string"; this.outputType = "number"; @@ -30,8 +30,8 @@ class GetTime extends Operation { { name: "Granularity", type: "option", - value: UNITS - } + value: UNITS, + }, ]; } @@ -41,7 +41,7 @@ class GetTime extends Operation { * @returns {number} */ run(input, args) { - const nowMs = (performance.timeOrigin + performance.now()), + const nowMs = performance.timeOrigin + performance.now(), granularity = args[0]; switch (granularity) { @@ -54,10 +54,11 @@ class GetTime extends Operation { case "Seconds (s)": return Math.round(nowMs / 1000); default: - throw new OperationError("Unknown granularity value: " + granularity); + throw new OperationError( + "Unknown granularity value: " + granularity, + ); } } - } export default GetTime; diff --git a/src/core/operations/GroupIPAddresses.mjs b/src/core/operations/GroupIPAddresses.mjs index 06840eeb..6c952ea9 100644 --- a/src/core/operations/GroupIPAddresses.mjs +++ b/src/core/operations/GroupIPAddresses.mjs @@ -7,14 +7,21 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {IP_DELIM_OPTIONS} from "../lib/Delim.mjs"; -import {ipv6ToStr, genIpv6Mask, IPV4_REGEX, strToIpv6, ipv4ToStr, IPV6_REGEX, strToIpv4} from "../lib/IP.mjs"; +import { IP_DELIM_OPTIONS } from "../lib/Delim.mjs"; +import { + ipv6ToStr, + genIpv6Mask, + IPV4_REGEX, + strToIpv6, + ipv4ToStr, + IPV6_REGEX, + strToIpv4, +} from "../lib/IP.mjs"; /** * Group IP addresses operation */ class GroupIPAddresses extends Operation { - /** * GroupIPAddresses constructor */ @@ -23,26 +30,27 @@ class GroupIPAddresses extends Operation { this.name = "Group IP addresses"; this.module = "Default"; - this.description = "Groups a list of IP addresses into subnets. Supports both IPv4 and IPv6 addresses."; + this.description = + "Groups a list of IP addresses into subnets. Supports both IPv4 and IPv6 addresses."; this.infoURL = "https://wikipedia.org/wiki/Subnetwork"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": IP_DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: IP_DELIM_OPTIONS, }, { - "name": "Subnet (CIDR)", - "type": "number", - "value": 24 + name: "Subnet (CIDR)", + type: "number", + value: 24, }, { - "name": "Only show the subnets", - "type": "boolean", - "value": false, - } + name: "Only show the subnets", + type: "boolean", + value: false, + }, ]; } @@ -55,7 +63,7 @@ class GroupIPAddresses extends Operation { const delim = Utils.charRep(args[0]), cidr = args[1], onlySubnets = args[2], - ipv4Mask = cidr < 32 ? ~(0xFFFFFFFF >>> cidr) : 0xFFFFFFFF, + ipv4Mask = cidr < 32 ? ~(0xffffffff >>> cidr) : 0xffffffff, ipv6Mask = genIpv6Mask(cidr), ips = input.split(delim), ipv4Networks = {}, @@ -68,7 +76,9 @@ class GroupIPAddresses extends Operation { i; if (cidr < 0 || cidr > 127) { - throw new OperationError("CIDR must be less than 32 for IPv4 or 128 for IPv6"); + throw new OperationError( + "CIDR must be less than 32 for IPv4 or 128 for IPv6", + ); } // Parse all IPs and add to network dictionary @@ -123,7 +133,10 @@ class GroupIPAddresses extends Operation { if (!onlySubnets) { for (i = 0; i < ipv6Networks[networkStr].length; i++) { - output += " " + ipv6ToStr(ipv6Networks[networkStr][i], true) + "\n"; + output += + " " + + ipv6ToStr(ipv6Networks[networkStr][i], true) + + "\n"; } output += "\n"; } @@ -131,7 +144,6 @@ class GroupIPAddresses extends Operation { return output; } - } export default GroupIPAddresses; diff --git a/src/core/operations/Gunzip.mjs b/src/core/operations/Gunzip.mjs index d3d97f6d..257fb42f 100644 --- a/src/core/operations/Gunzip.mjs +++ b/src/core/operations/Gunzip.mjs @@ -13,7 +13,6 @@ const Zlib = gunzip.Zlib; * Gunzip operation */ class Gunzip extends Operation { - /** * Gunzip constructor */ @@ -22,7 +21,8 @@ class Gunzip extends Operation { this.name = "Gunzip"; this.module = "Compression"; - this.description = "Decompresses data which has been compressed using the deflate algorithm with gzip headers."; + this.description = + "Decompresses data which has been compressed using the deflate algorithm with gzip headers."; this.infoURL = "https://wikipedia.org/wiki/Gzip"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -31,8 +31,8 @@ class Gunzip extends Operation { { pattern: "^\\x1f\\x8b\\x08", flags: "", - args: [] - } + args: [], + }, ]; } @@ -45,7 +45,6 @@ class Gunzip extends Operation { const gzipObj = new Zlib.Gunzip(new Uint8Array(input)); return new Uint8Array(gzipObj.decompress()).buffer; } - } export default Gunzip; diff --git a/src/core/operations/Gzip.mjs b/src/core/operations/Gzip.mjs index 093ae6a4..25a399fb 100644 --- a/src/core/operations/Gzip.mjs +++ b/src/core/operations/Gzip.mjs @@ -5,7 +5,10 @@ */ import Operation from "../Operation.mjs"; -import {COMPRESSION_TYPE, ZLIB_COMPRESSION_TYPE_LOOKUP} from "../lib/Zlib.mjs"; +import { + COMPRESSION_TYPE, + ZLIB_COMPRESSION_TYPE_LOOKUP, +} from "../lib/Zlib.mjs"; import gzip from "zlibjs/bin/gzip.min.js"; const Zlib = gzip.Zlib; @@ -14,7 +17,6 @@ const Zlib = gzip.Zlib; * Gzip operation */ class Gzip extends Operation { - /** * Gzip constructor */ @@ -23,7 +25,8 @@ class Gzip extends Operation { this.name = "Gzip"; this.module = "Compression"; - this.description = "Compresses data using the deflate algorithm with gzip headers."; + this.description = + "Compresses data using the deflate algorithm with gzip headers."; this.infoURL = "https://wikipedia.org/wiki/Gzip"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -31,23 +34,23 @@ class Gzip extends Operation { { name: "Compression type", type: "option", - value: COMPRESSION_TYPE + value: COMPRESSION_TYPE, }, { name: "Filename (optional)", type: "string", - value: "" + value: "", }, { name: "Comment (optional)", type: "string", - value: "" + value: "", }, { name: "Include file checksum", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -61,11 +64,11 @@ class Gzip extends Operation { comment = args[2], options = { deflateOptions: { - compressionType: ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]] + compressionType: ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]], }, flags: { - fhcrc: args[3] - } + fhcrc: args[3], + }, }; if (filename.length) { @@ -83,7 +86,6 @@ class Gzip extends Operation { } return compressed.buffer; } - } export default Gzip; diff --git a/src/core/operations/HAS160.mjs b/src/core/operations/HAS160.mjs index 707b99b3..93d8dbad 100644 --- a/src/core/operations/HAS160.mjs +++ b/src/core/operations/HAS160.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * HAS-160 operation */ class HAS160 extends Operation { - /** * HAS-160 constructor */ @@ -20,7 +19,8 @@ class HAS160 extends Operation { this.name = "HAS-160"; this.module = "Crypto"; - this.description = "HAS-160 is a cryptographic hash function designed for use with the Korean KCDSA digital signature algorithm. It is derived from SHA-1, with assorted changes intended to increase its security. It produces a 160-bit output.

HAS-160 is used in the same way as SHA-1. First it divides input in blocks of 512 bits each and pads the final block. A digest function updates the intermediate hash value by processing the input blocks in turn.

The message digest algorithm consists, by default, of 80 rounds."; + this.description = + "HAS-160 is a cryptographic hash function designed for use with the Korean KCDSA digital signature algorithm. It is derived from SHA-1, with assorted changes intended to increase its security. It produces a 160-bit output.

HAS-160 is used in the same way as SHA-1. First it divides input in blocks of 512 bits each and pads the final block. A digest function updates the intermediate hash value by processing the input blocks in turn.

The message digest algorithm consists, by default, of 80 rounds."; this.infoURL = "https://wikipedia.org/wiki/HAS-160"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -30,8 +30,8 @@ class HAS160 extends Operation { type: "number", value: 80, min: 1, - max: 80 - } + max: 80, + }, ]; } @@ -41,9 +41,8 @@ class HAS160 extends Operation { * @returns {string} */ run(input, args) { - return runHash("has160", input, {rounds: args[0]}); + return runHash("has160", input, { rounds: args[0] }); } - } export default HAS160; diff --git a/src/core/operations/HASSHClientFingerprint.mjs b/src/core/operations/HASSHClientFingerprint.mjs index e507cea1..024dad37 100644 --- a/src/core/operations/HASSHClientFingerprint.mjs +++ b/src/core/operations/HASSHClientFingerprint.mjs @@ -18,13 +18,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import Stream from "../lib/Stream.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * HASSH Client Fingerprint operation */ class HASSHClientFingerprint extends Operation { - /** * HASSHClientFingerprint constructor */ @@ -33,21 +32,27 @@ class HASSHClientFingerprint extends Operation { this.name = "HASSH Client Fingerprint"; this.module = "Crypto"; - this.description = "Generates a HASSH fingerprint to help identify SSH clients based on hashing together values from the Client Key Exchange Init message.

Input: A hex stream of the SSH_MSG_KEXINIT packet application layer from Client to Server."; - this.infoURL = "https://engineering.salesforce.com/open-sourcing-hassh-abed3ae5044c"; + this.description = + "Generates a HASSH fingerprint to help identify SSH clients based on hashing together values from the Client Key Exchange Init message.

Input: A hex stream of the SSH_MSG_KEXINIT packet application layer from Client to Server."; + this.infoURL = + "https://engineering.salesforce.com/open-sourcing-hassh-abed3ae5044c"; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Input format", type: "option", - value: ["Hex", "Base64", "Raw"] + value: ["Hex", "Base64", "Raw"], }, { name: "Output format", type: "option", - value: ["Hash digest", "HASSH algorithms string", "Full details"] - } + value: [ + "Hash digest", + "HASSH algorithms string", + "Full details", + ], + }, ]; } @@ -128,12 +133,7 @@ class HASSHClientFingerprint extends Operation { s.moveForwardsBy(paddingLength); // Output - const hassh = [ - kexAlgos, - encAlgosC2S, - macAlgosC2S, - compAlgosC2S - ]; + const hassh = [kexAlgos, encAlgosC2S, macAlgosC2S, compAlgosC2S]; const hasshStr = hassh.join(";"); const hasshHash = runHash("md5", Utils.strToArrayBuffer(hasshStr)); @@ -160,7 +160,6 @@ ${compAlgosC2S}`; return hasshHash; } } - } export default HASSHClientFingerprint; diff --git a/src/core/operations/HASSHServerFingerprint.mjs b/src/core/operations/HASSHServerFingerprint.mjs index f08a418b..042f8b8a 100644 --- a/src/core/operations/HASSHServerFingerprint.mjs +++ b/src/core/operations/HASSHServerFingerprint.mjs @@ -12,19 +12,18 @@ * Josh Atkins * * Algorithm released under the BSD-3-clause licence -*/ + */ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import Stream from "../lib/Stream.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * HASSH Server Fingerprint operation */ class HASSHServerFingerprint extends Operation { - /** * HASSHServerFingerprint constructor */ @@ -33,21 +32,27 @@ class HASSHServerFingerprint extends Operation { this.name = "HASSH Server Fingerprint"; this.module = "Crypto"; - this.description = "Generates a HASSH fingerprint to help identify SSH servers based on hashing together values from the Server Key Exchange Init message.

Input: A hex stream of the SSH_MSG_KEXINIT packet application layer from Server to Client."; - this.infoURL = "https://engineering.salesforce.com/open-sourcing-hassh-abed3ae5044c"; + this.description = + "Generates a HASSH fingerprint to help identify SSH servers based on hashing together values from the Server Key Exchange Init message.

Input: A hex stream of the SSH_MSG_KEXINIT packet application layer from Server to Client."; + this.infoURL = + "https://engineering.salesforce.com/open-sourcing-hassh-abed3ae5044c"; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Input format", type: "option", - value: ["Hex", "Base64", "Raw"] + value: ["Hex", "Base64", "Raw"], }, { name: "Output format", type: "option", - value: ["Hash digest", "HASSH algorithms string", "Full details"] - } + value: [ + "Hash digest", + "HASSH algorithms string", + "Full details", + ], + }, ]; } @@ -128,12 +133,7 @@ class HASSHServerFingerprint extends Operation { s.moveForwardsBy(paddingLength); // Output - const hassh = [ - kexAlgos, - encAlgosS2C, - macAlgosS2C, - compAlgosS2C - ]; + const hassh = [kexAlgos, encAlgosS2C, macAlgosS2C, compAlgosS2C]; const hasshStr = hassh.join(";"); const hasshHash = runHash("md5", Utils.strToArrayBuffer(hasshStr)); @@ -160,7 +160,6 @@ ${compAlgosS2C}`; return hasshHash; } } - } export default HASSHServerFingerprint; diff --git a/src/core/operations/HMAC.mjs b/src/core/operations/HMAC.mjs index cb129692..64768bd2 100644 --- a/src/core/operations/HMAC.mjs +++ b/src/core/operations/HMAC.mjs @@ -12,7 +12,6 @@ import CryptoApi from "crypto-api/src/crypto-api.mjs"; * HMAC operation */ class HMAC extends Operation { - /** * HMAC constructor */ @@ -21,21 +20,22 @@ class HMAC extends Operation { this.name = "HMAC"; this.module = "Crypto"; - this.description = "Keyed-Hash Message Authentication Codes (HMAC) are a mechanism for message authentication using cryptographic hash functions."; + this.description = + "Keyed-Hash Message Authentication Codes (HMAC) are a mechanism for message authentication using cryptographic hash functions."; this.infoURL = "https://wikipedia.org/wiki/HMAC"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "Decimal", "Base64", "UTF8", "Latin1"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "Decimal", "Base64", "UTF8", "Latin1"], }, { - "name": "Hashing function", - "type": "option", - "value": [ + name: "Hashing function", + type: "option", + value: [ "MD2", "MD4", "MD5", @@ -55,9 +55,9 @@ class HMAC extends Operation { "Whirlpool", "Whirlpool-0", "Whirlpool-T", - "Snefru" - ] - } + "Snefru", + ], + }, ]; } @@ -67,7 +67,10 @@ class HMAC extends Operation { * @returns {string} */ run(input, args) { - const key = Utils.convertToByteString(args[0].string || "", args[0].option), + const key = Utils.convertToByteString( + args[0].string || "", + args[0].option, + ), hashFunc = args[1].toLowerCase(), msg = Utils.arrayBufferToStr(input, false), hasher = CryptoApi.getHasher(hashFunc); @@ -76,7 +79,6 @@ class HMAC extends Operation { mac.update(msg); return CryptoApi.encoder.toHex(mac.finalize()); } - } export default HMAC; diff --git a/src/core/operations/HTMLToText.mjs b/src/core/operations/HTMLToText.mjs index ff90572a..3064d4ab 100644 --- a/src/core/operations/HTMLToText.mjs +++ b/src/core/operations/HTMLToText.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * HTML To Text operation */ class HTMLToText extends Operation { - /** * HTMLToText constructor */ @@ -20,7 +19,8 @@ class HTMLToText extends Operation { this.name = "HTML To Text"; this.module = "Default"; - this.description = "Converts an HTML output from an operation to a readable string instead of being rendered in the DOM."; + this.description = + "Converts an HTML output from an operation to a readable string instead of being rendered in the DOM."; this.infoURL = ""; this.inputType = "html"; this.outputType = "string"; @@ -35,7 +35,6 @@ class HTMLToText extends Operation { run(input, args) { return input; } - } export default HTMLToText; diff --git a/src/core/operations/HTTPRequest.mjs b/src/core/operations/HTTPRequest.mjs index 7d061f37..9fb96232 100644 --- a/src/core/operations/HTTPRequest.mjs +++ b/src/core/operations/HTTPRequest.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * HTTP request operation */ class HTTPRequest extends Operation { - /** * HTTPRequest constructor */ @@ -30,43 +29,50 @@ class HTTPRequest extends Operation { "

", "The status code of the response, along with a limited selection of exposed headers, can be viewed by checking the 'Show response metadata' option. Only a limited set of response headers are exposed by the browser for security reasons.", ].join("\n"); - this.infoURL = "https://wikipedia.org/wiki/List_of_HTTP_header_fields#Request_fields"; + this.infoURL = + "https://wikipedia.org/wiki/List_of_HTTP_header_fields#Request_fields"; this.inputType = "string"; this.outputType = "string"; this.manualBake = true; this.args = [ { - "name": "Method", - "type": "option", - "value": [ - "GET", "POST", "HEAD", - "PUT", "PATCH", "DELETE", - "CONNECT", "TRACE", "OPTIONS" - ] + name: "Method", + type: "option", + value: [ + "GET", + "POST", + "HEAD", + "PUT", + "PATCH", + "DELETE", + "CONNECT", + "TRACE", + "OPTIONS", + ], }, { - "name": "URL", - "type": "string", - "value": "" + name: "URL", + type: "string", + value: "", }, { - "name": "Headers", - "type": "text", - "value": "" + name: "Headers", + type: "text", + value: "", }, { - "name": "Mode", - "type": "option", - "value": [ + name: "Mode", + type: "option", + value: [ "Cross-Origin Resource Sharing", "No CORS (limited to HEAD, GET or POST)", - ] + ], }, { - "name": "Show response metadata", - "type": "boolean", - "value": false - } + name: "Show response metadata", + type: "boolean", + value: false, + }, ]; } @@ -81,13 +87,14 @@ class HTTPRequest extends Operation { if (url.length === 0) return ""; const headers = new Headers(); - headersText.split(/\r?\n/).forEach(line => { + headersText.split(/\r?\n/).forEach((line) => { line = line.trim(); if (line.length === 0) return; const split = line.split(":"); - if (split.length !== 2) throw `Could not parse header in line: ${line}`; + if (split.length !== 2) + throw `Could not parse header in line: ${line}`; headers.set(split[0].trim(), split[1].trim()); }); @@ -104,9 +111,11 @@ class HTTPRequest extends Operation { } return fetch(url, config) - .then(r => { + .then((r) => { if (r.status === 0 && r.type === "opaque") { - throw new OperationError("Error: Null response. Try setting the connection mode to CORS."); + throw new OperationError( + "Error: Null response. Try setting the connection mode to CORS.", + ); } if (showResponseMetadata) { @@ -114,25 +123,33 @@ class HTTPRequest extends Operation { for (const pair of r.headers.entries()) { headers += " " + pair[0] + ": " + pair[1] + "\n"; } - return r.text().then(b => { - return "####\n Status: " + r.status + " " + r.statusText + - "\n Exposed headers:\n" + headers + "####\n\n" + b; + return r.text().then((b) => { + return ( + "####\n Status: " + + r.status + + " " + + r.statusText + + "\n Exposed headers:\n" + + headers + + "####\n\n" + + b + ); }); } return r.text(); }) - .catch(e => { - throw new OperationError(e.toString() + - "\n\nThis error could be caused by one of the following:\n" + - " - An invalid URL\n" + - " - Making a request to an insecure resource (HTTP) from a secure source (HTTPS)\n" + - " - Making a cross-origin request to a server which does not support CORS\n"); + .catch((e) => { + throw new OperationError( + e.toString() + + "\n\nThis error could be caused by one of the following:\n" + + " - An invalid URL\n" + + " - Making a request to an insecure resource (HTTP) from a secure source (HTTPS)\n" + + " - Making a cross-origin request to a server which does not support CORS\n", + ); }); } - } - /** * Lookup table for HTTP modes * @@ -143,5 +160,4 @@ const modeLookup = { "No CORS (limited to HEAD, GET or POST)": "no-cors", }; - export default HTTPRequest; diff --git a/src/core/operations/HammingDistance.mjs b/src/core/operations/HammingDistance.mjs index 7d5a9b1d..8ee20aed 100644 --- a/src/core/operations/HammingDistance.mjs +++ b/src/core/operations/HammingDistance.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {fromHex} from "../lib/Hex.mjs"; +import { fromHex } from "../lib/Hex.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * Hamming Distance operation */ class HammingDistance extends Operation { - /** * HammingDistance constructor */ @@ -22,26 +21,27 @@ class HammingDistance extends Operation { this.name = "Hamming Distance"; this.module = "Default"; - this.description = "In information theory, the Hamming distance between two strings of equal length is the number of positions at which the corresponding symbols are different. In other words, it measures the minimum number of substitutions required to change one string into the other, or the minimum number of errors that could have transformed one string into the other. In a more general context, the Hamming distance is one of several string metrics for measuring the edit distance between two sequences."; + this.description = + "In information theory, the Hamming distance between two strings of equal length is the number of positions at which the corresponding symbols are different. In other words, it measures the minimum number of substitutions required to change one string into the other, or the minimum number of errors that could have transformed one string into the other. In a more general context, the Hamming distance is one of several string metrics for measuring the edit distance between two sequences."; this.infoURL = "https://wikipedia.org/wiki/Hamming_distance"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "binaryShortString", - "value": "\\n\\n" + name: "Delimiter", + type: "binaryShortString", + value: "\\n\\n", }, { - "name": "Unit", - "type": "option", - "value": ["Byte", "Bit"] + name: "Unit", + type: "option", + value: ["Byte", "Bit"], }, { - "name": "Input type", - "type": "option", - "value": ["Raw string", "Hex"] - } + name: "Input type", + type: "option", + value: ["Raw string", "Hex"], + }, ]; } @@ -57,11 +57,15 @@ class HammingDistance extends Operation { samples = input.split(delim); if (samples.length !== 2) { - throw new OperationError("Error: You can only calculate the edit distance between 2 strings. Please ensure exactly two inputs are provided, separated by the specified delimiter."); + throw new OperationError( + "Error: You can only calculate the edit distance between 2 strings. Please ensure exactly two inputs are provided, separated by the specified delimiter.", + ); } if (samples[0].length !== samples[1].length) { - throw new OperationError("Error: Both inputs must be of the same length."); + throw new OperationError( + "Error: Both inputs must be of the same length.", + ); } if (inputType === "Hex") { @@ -92,7 +96,6 @@ class HammingDistance extends Operation { return dist.toString(); } - } export default HammingDistance; diff --git a/src/core/operations/HaversineDistance.mjs b/src/core/operations/HaversineDistance.mjs index 680bff4d..d45f0a69 100644 --- a/src/core/operations/HaversineDistance.mjs +++ b/src/core/operations/HaversineDistance.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * HaversineDistance operation */ class HaversineDistance extends Operation { - /** * HaversineDistance constructor */ @@ -20,7 +19,8 @@ class HaversineDistance extends Operation { this.name = "Haversine distance"; this.module = "Default"; - this.description = "Returns the distance between two pairs of GPS latitude and longitude co-ordinates in metres.

e.g. 51.487263,-0.124323, 38.9517,-77.1467"; + this.description = + "Returns the distance between two pairs of GPS latitude and longitude co-ordinates in metres.

e.g. 51.487263,-0.124323, 38.9517,-77.1467"; this.infoURL = "https://wikipedia.org/wiki/Haversine_formula"; this.inputType = "string"; this.outputType = "number"; @@ -33,10 +33,13 @@ class HaversineDistance extends Operation { * @returns {number} */ run(input, args) { - - const values = input.match(/^(-?\d+(\.\d+)?), ?(-?\d+(\.\d+)?), ?(-?\d+(\.\d+)?), ?(-?\d+(\.\d+)?)$/); + const values = input.match( + /^(-?\d+(\.\d+)?), ?(-?\d+(\.\d+)?), ?(-?\d+(\.\d+)?), ?(-?\d+(\.\d+)?)$/, + ); if (!values) { - throw new OperationError("Input must in the format lat1, lng1, lat2, lng2"); + throw new OperationError( + "Input must in the format lat1, lng1, lat2, lng2", + ); } const lat1 = parseFloat(values[1]); @@ -45,15 +48,18 @@ class HaversineDistance extends Operation { const lng2 = parseFloat(values[7]); const TO_RAD = Math.PI / 180; - const dLat = (lat2-lat1) * TO_RAD; - const dLng = (lng2-lng1) * TO_RAD; - const a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1 * TO_RAD) * Math.cos(lat2 * TO_RAD) * Math.sin(dLng/2) * Math.sin(dLng/2); - const metres = 6371000 * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); + const dLat = (lat2 - lat1) * TO_RAD; + const dLng = (lng2 - lng1) * TO_RAD; + const a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(lat1 * TO_RAD) * + Math.cos(lat2 * TO_RAD) * + Math.sin(dLng / 2) * + Math.sin(dLng / 2); + const metres = 6371000 * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return metres; - } - } export default HaversineDistance; diff --git a/src/core/operations/Head.mjs b/src/core/operations/Head.mjs index d74c3eea..d580aa3c 100644 --- a/src/core/operations/Head.mjs +++ b/src/core/operations/Head.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Head operation */ class Head extends Operation { - /** * Head constructor */ @@ -21,20 +20,21 @@ class Head extends Operation { this.name = "Head"; this.module = "Default"; - this.description = "Like the UNIX head utility.
Gets the first n lines.
You can select all but the last n lines by entering a negative value for n.
The delimiter can be changed so that instead of lines, fields (i.e. commas) are selected instead."; + this.description = + "Like the UNIX head utility.
Gets the first n lines.
You can select all but the last n lines by entering a negative value for n.
The delimiter can be changed so that instead of lines, fields (i.e. commas) are selected instead."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": INPUT_DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: INPUT_DELIM_OPTIONS, }, { - "name": "Number", - "type": "number", - "value": 10 - } + name: "Number", + type: "number", + value: 10, + }, ]; } @@ -62,7 +62,6 @@ class Head extends Operation { }) .join(delimiter); } - } export default Head; diff --git a/src/core/operations/HeatmapChart.mjs b/src/core/operations/HeatmapChart.mjs index 96636986..a515ae7a 100644 --- a/src/core/operations/HeatmapChart.mjs +++ b/src/core/operations/HeatmapChart.mjs @@ -7,20 +7,24 @@ import * as d3temp from "d3"; import * as nodomtemp from "nodom"; -import { getScatterValues, RECORD_DELIMITER_OPTIONS, COLOURS, FIELD_DELIMITER_OPTIONS } from "../lib/Charts.mjs"; +import { + getScatterValues, + RECORD_DELIMITER_OPTIONS, + COLOURS, + FIELD_DELIMITER_OPTIONS, +} from "../lib/Charts.mjs"; import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; const d3 = d3temp.default ? d3temp.default : d3temp; -const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp; +const nodom = nodomtemp.default ? nodomtemp.default : nodomtemp; /** * Heatmap chart operation */ class HeatmapChart extends Operation { - /** * HeatmapChart constructor */ @@ -29,7 +33,8 @@ class HeatmapChart extends Operation { this.name = "Heatmap chart"; this.module = "Charts"; - this.description = "A heatmap is a graphical representation of data where the individual values contained in a matrix are represented as colors."; + this.description = + "A heatmap is a graphical representation of data where the individual values contained in a matrix are represented as colors."; this.infoURL = "https://wikipedia.org/wiki/Heat_map"; this.inputType = "string"; this.outputType = "html"; @@ -104,8 +109,14 @@ class HeatmapChart extends Operation { minColour = args[8], maxColour = args[9], dimension = 500; - if (vBins <= 0) throw new OperationError("Number of vertical bins must be greater than 0"); - if (hBins <= 0) throw new OperationError("Number of horizontal bins must be greater than 0"); + if (vBins <= 0) + throw new OperationError( + "Number of vertical bins must be greater than 0", + ); + if (hBins <= 0) + throw new OperationError( + "Number of horizontal bins must be greater than 0", + ); let xLabel = args[5], yLabel = args[6]; @@ -113,7 +124,7 @@ class HeatmapChart extends Operation { input, recordDelimiter, fieldDelimiter, - columnHeadingsAreIncluded + columnHeadingsAreIncluded, ); if (headings) { @@ -123,7 +134,8 @@ class HeatmapChart extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${dimension} ${dimension}`); @@ -137,36 +149,41 @@ class HeatmapChart extends Operation { width = dimension - margin.left - margin.right, height = dimension - margin.top - margin.bottom, binWidth = width / hBins, - binHeight = height/ vBins, - marginedSpace = svg.append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + binHeight = height / vBins, + marginedSpace = svg + .append("g") + .attr( + "transform", + "translate(" + margin.left + "," + margin.top + ")", + ); const bins = this.getHeatmapPacking(values, vBins, hBins), - maxCount = Math.max(...bins.map(row => { - const lengths = row.map(cell => cell.length); - return Math.max(...lengths); - })); + maxCount = Math.max( + ...bins.map((row) => { + const lengths = row.map((cell) => cell.length); + return Math.max(...lengths); + }), + ); - const xExtent = d3.extent(values, d => d[0]), - yExtent = d3.extent(values, d => d[1]); + const xExtent = d3.extent(values, (d) => d[0]), + yExtent = d3.extent(values, (d) => d[1]); - const xAxis = d3.scaleLinear() - .domain(xExtent) - .range([0, width]); - const yAxis = d3.scaleLinear() - .domain(yExtent) - .range([height, 0]); + const xAxis = d3.scaleLinear().domain(xExtent).range([0, width]); + const yAxis = d3.scaleLinear().domain(yExtent).range([height, 0]); - const colour = d3.scaleSequential(d3.interpolateLab(minColour, maxColour)) + const colour = d3 + .scaleSequential(d3.interpolateLab(minColour, maxColour)) .domain([0, maxCount]); - marginedSpace.append("clipPath") + marginedSpace + .append("clipPath") .attr("id", "clip") .append("rect") .attr("width", width) .attr("height", height); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "bins") .attr("clip-path", "url(#clip)") .selectAll("g") @@ -174,27 +191,28 @@ class HeatmapChart extends Operation { .enter() .append("g") .selectAll("rect") - .data(d => d) + .data((d) => d) .enter() .append("rect") .attr("x", (d) => binWidth * d.x) - .attr("y", (d) => (height - binHeight * (d.y + 1))) + .attr("y", (d) => height - binHeight * (d.y + 1)) .attr("width", binWidth) .attr("height", binHeight) .attr("fill", (d) => colour(d.length)) .attr("stroke", drawEdges ? "rgba(0, 0, 0, 0.5)" : "none") .attr("stroke-width", drawEdges ? "0.5" : "none") .append("title") - .text(d => { + .text((d) => { const count = d.length, - perc = 100.0 * d.length / values.length, + perc = (100.0 * d.length) / values.length, tooltip = `Count: ${count}\n Percentage: ${perc.toFixed(2)}%\n `.replace(/\s{2,}/g, "\n"); return tooltip; }); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "axis axis--y") .call(d3.axisLeft(yAxis).tickSizeOuter(-width)); @@ -206,7 +224,8 @@ class HeatmapChart extends Operation { .style("text-anchor", "middle") .text(yLabel); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "axis axis--x") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(xAxis).tickSizeOuter(-height)); @@ -229,12 +248,14 @@ class HeatmapChart extends Operation { * @returns {Object[]} a list of bins (each bin is an Array) with x y coordinates, filled with the points */ getHeatmapPacking(values, vBins, hBins) { - const xBounds = d3.extent(values, d => d[0]), - yBounds = d3.extent(values, d => d[1]), + const xBounds = d3.extent(values, (d) => d[0]), + yBounds = d3.extent(values, (d) => d[1]), bins = []; - if (xBounds[0] === xBounds[1]) throw "Cannot pack points. There is no difference between the minimum and maximum X coordinate."; - if (yBounds[0] === yBounds[1]) throw "Cannot pack points. There is no difference between the minimum and maximum Y coordinate."; + if (xBounds[0] === xBounds[1]) + throw "Cannot pack points. There is no difference between the minimum and maximum X coordinate."; + if (yBounds[0] === yBounds[1]) + throw "Cannot pack points. There is no difference between the minimum and maximum Y coordinate."; for (let y = 0; y < vBins; y++) { bins.push([]); @@ -249,18 +270,19 @@ class HeatmapChart extends Operation { const epsilon = 0.000000001; // This is to clamp values that are exactly the maximum; - values.forEach(v => { - const fractionOfY = (v[1] - yBounds[0]) / ((yBounds[1] + epsilon) - yBounds[0]), - fractionOfX = (v[0] - xBounds[0]) / ((xBounds[1] + epsilon) - xBounds[0]), + values.forEach((v) => { + const fractionOfY = + (v[1] - yBounds[0]) / (yBounds[1] + epsilon - yBounds[0]), + fractionOfX = + (v[0] - xBounds[0]) / (xBounds[1] + epsilon - xBounds[0]), y = Math.floor(vBins * fractionOfY), x = Math.floor(hBins * fractionOfX); - bins[y][x].push({x: v[0], y: v[1]}); + bins[y][x].push({ x: v[0], y: v[1] }); }); return bins; } - } export default HeatmapChart; diff --git a/src/core/operations/HexDensityChart.mjs b/src/core/operations/HexDensityChart.mjs index 72cab9fa..d5184415 100644 --- a/src/core/operations/HexDensityChart.mjs +++ b/src/core/operations/HexDensityChart.mjs @@ -8,21 +8,24 @@ import * as d3temp from "d3"; import * as d3hexbintemp from "d3-hexbin"; import * as nodomtemp from "nodom"; -import { getScatterValues, RECORD_DELIMITER_OPTIONS, COLOURS, FIELD_DELIMITER_OPTIONS } from "../lib/Charts.mjs"; +import { + getScatterValues, + RECORD_DELIMITER_OPTIONS, + COLOURS, + FIELD_DELIMITER_OPTIONS, +} from "../lib/Charts.mjs"; import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; const d3 = d3temp.default ? d3temp.default : d3temp; const d3hexbin = d3hexbintemp.default ? d3hexbintemp.default : d3hexbintemp; -const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp; - +const nodom = nodomtemp.default ? nodomtemp.default : nodomtemp; /** * Hex Density chart operation */ class HexDensityChart extends Operation { - /** * HexDensityChart constructor */ @@ -31,7 +34,8 @@ class HexDensityChart extends Operation { this.name = "Hex Density chart"; this.module = "Charts"; - this.description = "Hex density charts are used in a similar way to scatter charts, however rather than rendering tens of thousands of points, it groups the points into a few hundred hexagons to show the distribution."; + this.description = + "Hex density charts are used in a similar way to scatter charts, however rather than rendering tens of thousands of points, it groups the points into a few hundred hexagons to show the distribution."; this.inputType = "string"; this.outputType = "html"; this.args = [ @@ -89,11 +93,10 @@ class HexDensityChart extends Operation { name: "Draw empty hexagons within data boundaries", type: "boolean", value: false, - } + }, ]; } - /** * Hex Bin chart operation. * @@ -119,7 +122,7 @@ class HexDensityChart extends Operation { input, recordDelimiter, fieldDelimiter, - columnHeadingsAreIncluded + columnHeadingsAreIncluded, ); if (headings) { @@ -129,7 +132,8 @@ class HexDensityChart extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${dimension} ${dimension}`); @@ -142,54 +146,60 @@ class HexDensityChart extends Operation { }, width = dimension - margin.left - margin.right, height = dimension - margin.top - margin.bottom, - marginedSpace = svg.append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + marginedSpace = svg + .append("g") + .attr( + "transform", + "translate(" + margin.left + "," + margin.top + ")", + ); - const hexbin = d3hexbin.hexbin() + const hexbin = d3hexbin + .hexbin() .radius(packRadius) .extent([0, 0], [width, height]); const hexPoints = hexbin(values), - maxCount = Math.max(...hexPoints.map(b => b.length)); + maxCount = Math.max(...hexPoints.map((b) => b.length)); - const xExtent = d3.extent(hexPoints, d => d.x), - yExtent = d3.extent(hexPoints, d => d.y); + const xExtent = d3.extent(hexPoints, (d) => d.x), + yExtent = d3.extent(hexPoints, (d) => d.y); xExtent[0] -= 2 * packRadius; xExtent[1] += 3 * packRadius; yExtent[0] -= 2 * packRadius; yExtent[1] += 2 * packRadius; - const xAxis = d3.scaleLinear() - .domain(xExtent) - .range([0, width]); - const yAxis = d3.scaleLinear() - .domain(yExtent) - .range([height, 0]); + const xAxis = d3.scaleLinear().domain(xExtent).range([0, width]); + const yAxis = d3.scaleLinear().domain(yExtent).range([height, 0]); - const colour = d3.scaleSequential(d3.interpolateLab(minColour, maxColour)) + const colour = d3 + .scaleSequential(d3.interpolateLab(minColour, maxColour)) .domain([0, maxCount]); - marginedSpace.append("clipPath") + marginedSpace + .append("clipPath") .attr("id", "clip") .append("rect") .attr("width", width) .attr("height", height); if (drawEmptyHexagons) { - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "empty-hexagon") .selectAll("path") .data(this.getEmptyHexagons(hexPoints, packRadius)) .enter() .append("path") - .attr("d", d => { - return `M${xAxis(d.x)},${yAxis(d.y)} ${hexbin.hexagon(drawRadius)}`; + .attr("d", (d) => { + return `M${xAxis(d.x)},${yAxis(d.y)} ${hexbin.hexagon( + drawRadius, + )}`; }) .attr("fill", (d) => colour(0)) .attr("stroke", drawEdges ? "black" : "none") .attr("stroke-width", drawEdges ? "0.5" : "none") .append("title") - .text(d => { + .text((d) => { const count = 0, perc = 0, tooltip = `Count: ${count}\n @@ -200,29 +210,32 @@ class HexDensityChart extends Operation { }); } - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "hexagon") .attr("clip-path", "url(#clip)") .selectAll("path") .data(hexPoints) .enter() .append("path") - .attr("d", d => { - return `M${xAxis(d.x)},${yAxis(d.y)} ${hexbin.hexagon(drawRadius)}`; + .attr("d", (d) => { + return `M${xAxis(d.x)},${yAxis(d.y)} ${hexbin.hexagon( + drawRadius, + )}`; }) .attr("fill", (d) => colour(d.length)) .attr("stroke", drawEdges ? "black" : "none") .attr("stroke-width", drawEdges ? "0.5" : "none") .append("title") - .text(d => { + .text((d) => { const count = d.length, - perc = 100.0 * d.length / values.length, + perc = (100.0 * d.length) / values.length, CX = d.x, CY = d.y, - xMin = Math.min(...d.map(d => d[0])), - xMax = Math.max(...d.map(d => d[0])), - yMin = Math.min(...d.map(d => d[1])), - yMax = Math.max(...d.map(d => d[1])), + xMin = Math.min(...d.map((d) => d[0])), + xMax = Math.max(...d.map((d) => d[0])), + yMin = Math.min(...d.map((d) => d[1])), + yMax = Math.max(...d.map((d) => d[1])), tooltip = `Count: ${count}\n Percentage: ${perc.toFixed(2)}%\n Center: ${CX.toFixed(2)}, ${CY.toFixed(2)}\n @@ -234,7 +247,8 @@ class HexDensityChart extends Operation { return tooltip; }); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "axis axis--y") .call(d3.axisLeft(yAxis).tickSizeOuter(-width)); @@ -246,7 +260,8 @@ class HexDensityChart extends Operation { .style("text-anchor", "middle") .text(yLabel); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "axis axis--x") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(xAxis).tickSizeOuter(-height)); @@ -260,7 +275,6 @@ class HexDensityChart extends Operation { return svg._groups[0][0].outerHTML; } - /** * Hex Bin chart operation. * @@ -270,27 +284,37 @@ class HexDensityChart extends Operation { */ getEmptyHexagons(centres, radius) { const emptyCentres = [], - boundingRect = [d3.extent(centres, d => d.x), d3.extent(centres, d => d.y)], - hexagonCenterToEdge = Math.cos(2 * Math.PI / 12) * radius, - hexagonEdgeLength = Math.sin(2 * Math.PI / 12) * radius; + boundingRect = [ + d3.extent(centres, (d) => d.x), + d3.extent(centres, (d) => d.y), + ], + hexagonCenterToEdge = Math.cos((2 * Math.PI) / 12) * radius, + hexagonEdgeLength = Math.sin((2 * Math.PI) / 12) * radius; let indent = false; - for (let y = boundingRect[1][0]; y <= boundingRect[1][1] + radius; y += hexagonEdgeLength + radius) { - for (let x = boundingRect[0][0]; x <= boundingRect[0][1] + radius; x += 2 * hexagonCenterToEdge) { + for ( + let y = boundingRect[1][0]; + y <= boundingRect[1][1] + radius; + y += hexagonEdgeLength + radius + ) { + for ( + let x = boundingRect[0][0]; + x <= boundingRect[0][1] + radius; + x += 2 * hexagonCenterToEdge + ) { let cx = x; const cy = y; if (indent && x >= boundingRect[0][1]) break; if (indent) cx += hexagonCenterToEdge; - emptyCentres.push({x: cx, y: cy}); + emptyCentres.push({ x: cx, y: cy }); } indent = !indent; } return emptyCentres; } - } export default HexDensityChart; diff --git a/src/core/operations/HexToObjectIdentifier.mjs b/src/core/operations/HexToObjectIdentifier.mjs index 67971f8d..6d25a3b7 100644 --- a/src/core/operations/HexToObjectIdentifier.mjs +++ b/src/core/operations/HexToObjectIdentifier.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * Hex to Object Identifier operation */ class HexToObjectIdentifier extends Operation { - /** * HexToObjectIdentifier constructor */ @@ -20,7 +19,8 @@ class HexToObjectIdentifier extends Operation { this.name = "Hex to Object Identifier"; this.module = "PublicKey"; - this.description = "Converts a hexadecimal string into an object identifier (OID)."; + this.description = + "Converts a hexadecimal string into an object identifier (OID)."; this.infoURL = "https://wikipedia.org/wiki/Object_identifier"; this.inputType = "string"; this.outputType = "string"; @@ -35,7 +35,6 @@ class HexToObjectIdentifier extends Operation { run(input, args) { return r.KJUR.asn1.ASN1Util.oidHexToInt(input.replace(/\s/g, "")); } - } export default HexToObjectIdentifier; diff --git a/src/core/operations/HexToPEM.mjs b/src/core/operations/HexToPEM.mjs index 8217ffbd..e4f6ddec 100644 --- a/src/core/operations/HexToPEM.mjs +++ b/src/core/operations/HexToPEM.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * Hex to PEM operation */ class HexToPEM extends Operation { - /** * HexToPEM constructor */ @@ -20,16 +19,17 @@ class HexToPEM extends Operation { this.name = "Hex to PEM"; this.module = "PublicKey"; - this.description = "Converts a hexadecimal DER (Distinguished Encoding Rules) string into PEM (Privacy Enhanced Mail) format."; + this.description = + "Converts a hexadecimal DER (Distinguished Encoding Rules) string into PEM (Privacy Enhanced Mail) format."; this.infoURL = "https://wikipedia.org/wiki/Privacy-Enhanced_Mail"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Header string", - "type": "string", - "value": "CERTIFICATE" - } + name: "Header string", + type: "string", + value: "CERTIFICATE", + }, ]; } @@ -39,9 +39,11 @@ class HexToPEM extends Operation { * @returns {string} */ run(input, args) { - return r.KJUR.asn1.ASN1Util.getPEMStringFromHex(input.replace(/\s/g, ""), args[0]); + return r.KJUR.asn1.ASN1Util.getPEMStringFromHex( + input.replace(/\s/g, ""), + args[0], + ); } - } export default HexToPEM; diff --git a/src/core/operations/ImageBrightnessContrast.mjs b/src/core/operations/ImageBrightnessContrast.mjs index 3845bebb..fc4ccc55 100644 --- a/src/core/operations/ImageBrightnessContrast.mjs +++ b/src/core/operations/ImageBrightnessContrast.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Image Brightness / Contrast operation */ class ImageBrightnessContrast extends Operation { - /** * ImageBrightnessContrast constructor */ @@ -35,15 +34,15 @@ class ImageBrightnessContrast extends Operation { type: "number", value: 0, min: -100, - max: 100 + max: 100, }, { name: "Contrast", type: "number", value: 0, min: -100, - max: 100 - } + max: 100, + }, ]; } @@ -84,7 +83,9 @@ class ImageBrightnessContrast extends Operation { } return imageBuffer.buffer; } catch (err) { - throw new OperationError(`Error adjusting image brightness or contrast. (${err})`); + throw new OperationError( + `Error adjusting image brightness or contrast. (${err})`, + ); } } @@ -104,7 +105,6 @@ class ImageBrightnessContrast extends Operation { return ``; } - } export default ImageBrightnessContrast; diff --git a/src/core/operations/ImageFilter.mjs b/src/core/operations/ImageFilter.mjs index 137dd0fc..8dcb9d91 100644 --- a/src/core/operations/ImageFilter.mjs +++ b/src/core/operations/ImageFilter.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Image Filter operation */ class ImageFilter extends Operation { - /** * ImageFilter constructor */ @@ -33,11 +32,8 @@ class ImageFilter extends Operation { { name: "Filter type", type: "option", - value: [ - "Greyscale", - "Sepia" - ] - } + value: ["Greyscale", "Sepia"], + }, ]; } @@ -60,7 +56,11 @@ class ImageFilter extends Operation { } try { if (isWorkerEnvironment()) - self.sendStatusMessage("Applying " + filterType.toLowerCase() + " filter to image..."); + self.sendStatusMessage( + "Applying " + + filterType.toLowerCase() + + " filter to image...", + ); if (filterType === "Greyscale") { image.greyscale(); } else { @@ -75,7 +75,9 @@ class ImageFilter extends Operation { } return imageBuffer.buffer; } catch (err) { - throw new OperationError(`Error applying filter to image. (${err})`); + throw new OperationError( + `Error applying filter to image. (${err})`, + ); } } @@ -95,7 +97,6 @@ class ImageFilter extends Operation { return ``; } - } export default ImageFilter; diff --git a/src/core/operations/ImageHueSaturationLightness.mjs b/src/core/operations/ImageHueSaturationLightness.mjs index b0bad682..273be7a7 100644 --- a/src/core/operations/ImageHueSaturationLightness.mjs +++ b/src/core/operations/ImageHueSaturationLightness.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Image Hue/Saturation/Lightness operation */ class ImageHueSaturationLightness extends Operation { - /** * ImageHueSaturationLightness constructor */ @@ -24,7 +23,8 @@ class ImageHueSaturationLightness extends Operation { this.name = "Image Hue/Saturation/Lightness"; this.module = "Image"; - this.description = "Adjusts the hue / saturation / lightness (HSL) values of an image."; + this.description = + "Adjusts the hue / saturation / lightness (HSL) values of an image."; this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -35,22 +35,22 @@ class ImageHueSaturationLightness extends Operation { type: "number", value: 0, min: -360, - max: 360 + max: 360, }, { name: "Saturation", type: "number", value: 0, min: -100, - max: 100 + max: 100, }, { name: "Lightness", type: "number", value: 0, min: -100, - max: 100 - } + max: 100, + }, ]; } @@ -79,8 +79,8 @@ class ImageHueSaturationLightness extends Operation { image.colour([ { apply: "hue", - params: [hue] - } + params: [hue], + }, ]); } if (saturation !== 0) { @@ -89,8 +89,8 @@ class ImageHueSaturationLightness extends Operation { image.colour([ { apply: "saturate", - params: [saturation] - } + params: [saturation], + }, ]); } if (lightness !== 0) { @@ -99,8 +99,8 @@ class ImageHueSaturationLightness extends Operation { image.colour([ { apply: "lighten", - params: [lightness] - } + params: [lightness], + }, ]); } @@ -112,7 +112,9 @@ class ImageHueSaturationLightness extends Operation { } return imageBuffer.buffer; } catch (err) { - throw new OperationError(`Error adjusting image hue / saturation / lightness. (${err})`); + throw new OperationError( + `Error adjusting image hue / saturation / lightness. (${err})`, + ); } } diff --git a/src/core/operations/ImageOpacity.mjs b/src/core/operations/ImageOpacity.mjs index 622ee96c..37113cdf 100644 --- a/src/core/operations/ImageOpacity.mjs +++ b/src/core/operations/ImageOpacity.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Image Opacity operation */ class ImageOpacity extends Operation { - /** * ImageOpacity constructor */ @@ -35,8 +34,8 @@ class ImageOpacity extends Operation { type: "number", value: 100, min: 0, - max: 100 - } + max: 100, + }, ]; } @@ -90,7 +89,6 @@ class ImageOpacity extends Operation { return ``; } - } export default ImageOpacity; diff --git a/src/core/operations/IndexOfCoincidence.mjs b/src/core/operations/IndexOfCoincidence.mjs index 8655ccd7..40ea5506 100644 --- a/src/core/operations/IndexOfCoincidence.mjs +++ b/src/core/operations/IndexOfCoincidence.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Index of Coincidence operation */ class IndexOfCoincidence extends Operation { - /** * IndexOfCoincidence constructor */ @@ -20,7 +19,8 @@ class IndexOfCoincidence extends Operation { this.name = "Index of Coincidence"; this.module = "Default"; - this.description = "Index of Coincidence (IC) is the probability of two randomly selected characters being the same. This can be used to determine whether text is readable or random, with English text having an IC of around 0.066. IC can therefore be a sound method to automate frequency analysis."; + this.description = + "Index of Coincidence (IC) is the probability of two randomly selected characters being the same. This can be used to determine whether text is readable or random, with English text having an IC of around 0.066. IC can therefore be a sound method to automate frequency analysis."; this.infoURL = "https://wikipedia.org/wiki/Index_of_coincidence"; this.inputType = "string"; this.outputType = "number"; @@ -37,16 +37,16 @@ class IndexOfCoincidence extends Operation { const text = input.toLowerCase().replace(/[^a-z]/g, ""), frequencies = new Array(26).fill(0), alphabet = Utils.expandAlphRange("a-z"); - let coincidence = 0.00, - density = 0.00, - result = 0.00, + let coincidence = 0.0, + density = 0.0, + result = 0.0, i; - for (i=0; i < alphabet.length; i++) { + for (i = 0; i < alphabet.length; i++) { frequencies[i] = text.count(alphabet[i]); } - for (i=0; i < frequencies.length; i++) { + for (i = 0; i < frequencies.length; i++) { coincidence += frequencies[i] * (frequencies[i] - 1); } @@ -101,7 +101,6 @@ The graph shows the IC of the input data. A low IC generally means that the text `; } - } export default IndexOfCoincidence; diff --git a/src/core/operations/InvertImage.mjs b/src/core/operations/InvertImage.mjs index 6b62dea7..1ff7e06f 100644 --- a/src/core/operations/InvertImage.mjs +++ b/src/core/operations/InvertImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Invert Image operation */ class InvertImage extends Operation { - /** * InvertImage constructor */ @@ -81,7 +80,6 @@ class InvertImage extends Operation { return ``; } - } export default InvertImage; diff --git a/src/core/operations/JA3Fingerprint.mjs b/src/core/operations/JA3Fingerprint.mjs index 941e2fcb..d17d6220 100644 --- a/src/core/operations/JA3Fingerprint.mjs +++ b/src/core/operations/JA3Fingerprint.mjs @@ -15,13 +15,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import Stream from "../lib/Stream.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * JA3 Fingerprint operation */ class JA3Fingerprint extends Operation { - /** * JA3Fingerprint constructor */ @@ -30,21 +29,23 @@ class JA3Fingerprint extends Operation { this.name = "JA3 Fingerprint"; this.module = "Crypto"; - this.description = "Generates a JA3 fingerprint to help identify TLS clients based on hashing together values from the Client Hello.

Input: A hex stream of the TLS Client Hello packet application layer."; - this.infoURL = "https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967"; + this.description = + "Generates a JA3 fingerprint to help identify TLS clients based on hashing together values from the Client Hello.

Input: A hex stream of the TLS Client Hello packet application layer."; + this.infoURL = + "https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967"; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Input format", type: "option", - value: ["Hex", "Base64", "Raw"] + value: ["Hex", "Base64", "Raw"], }, { name: "Output format", type: "option", - value: ["Hash digest", "JA3 string", "Full details"] - } + value: ["Hash digest", "JA3 string", "Full details"], + }, ]; } @@ -60,8 +61,7 @@ class JA3Fingerprint extends Operation { const s = new Stream(new Uint8Array(input)); const handshake = s.readInt(1); - if (handshake !== 0x16) - throw new OperationError("Not handshake data."); + if (handshake !== 0x16) throw new OperationError("Not handshake data."); // Version s.moveForwardsBy(2); @@ -105,7 +105,10 @@ class JA3Fingerprint extends Operation { const extensionsLength = s.readInt(2); const extensions = s.getBytes(extensionsLength); const es = new Stream(extensions); - let ecsLen, ecs, ellipticCurves = "", ellipticCurvePointFormats = ""; + let ecsLen, + ecs, + ellipticCurves = "", + ellipticCurvePointFormats = ""; const exts = []; while (es.hasMore()) { const type = es.readInt(2); @@ -124,8 +127,7 @@ class JA3Fingerprint extends Operation { default: es.moveForwardsBy(length); } - if (!GREASE_CIPHERSUITES.includes(type)) - exts.push(type); + if (!GREASE_CIPHERSUITES.includes(type)) exts.push(type); } // Output @@ -134,7 +136,7 @@ class JA3Fingerprint extends Operation { cipherSegment, exts.join("-"), ellipticCurves, - ellipticCurvePointFormats + ellipticCurvePointFormats, ]; const ja3Str = ja3.join(","); const ja3Hash = runHash("md5", Utils.strToArrayBuffer(ja3Str)); @@ -164,7 +166,6 @@ ${ellipticCurvePointFormats}`; return ja3Hash; } } - } /** @@ -173,33 +174,18 @@ ${ellipticCurvePointFormats}`; * @param {Stream} stream * @returns {string} */ -function parseJA3Segment(stream, size=2) { +function parseJA3Segment(stream, size = 2) { const segment = []; while (stream.hasMore()) { const element = stream.readInt(size); - if (!GREASE_CIPHERSUITES.includes(element)) - segment.push(element); + if (!GREASE_CIPHERSUITES.includes(element)) segment.push(element); } return segment.join("-"); } const GREASE_CIPHERSUITES = [ - 0x0a0a, - 0x1a1a, - 0x2a2a, - 0x3a3a, - 0x4a4a, - 0x5a5a, - 0x6a6a, - 0x7a7a, - 0x8a8a, - 0x9a9a, - 0xaaaa, - 0xbaba, - 0xcaca, - 0xdada, - 0xeaea, - 0xfafa + 0x0a0a, 0x1a1a, 0x2a2a, 0x3a3a, 0x4a4a, 0x5a5a, 0x6a6a, 0x7a7a, 0x8a8a, + 0x9a9a, 0xaaaa, 0xbaba, 0xcaca, 0xdada, 0xeaea, 0xfafa, ]; export default JA3Fingerprint; diff --git a/src/core/operations/JA3SFingerprint.mjs b/src/core/operations/JA3SFingerprint.mjs index 9c3b88da..d7ca7b19 100644 --- a/src/core/operations/JA3SFingerprint.mjs +++ b/src/core/operations/JA3SFingerprint.mjs @@ -15,13 +15,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; import Stream from "../lib/Stream.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * JA3S Fingerprint operation */ class JA3SFingerprint extends Operation { - /** * JA3SFingerprint constructor */ @@ -30,21 +29,23 @@ class JA3SFingerprint extends Operation { this.name = "JA3S Fingerprint"; this.module = "Crypto"; - this.description = "Generates a JA3S fingerprint to help identify TLS servers based on hashing together values from the Server Hello.

Input: A hex stream of the TLS Server Hello record application layer."; - this.infoURL = "https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967"; + this.description = + "Generates a JA3S fingerprint to help identify TLS servers based on hashing together values from the Server Hello.

Input: A hex stream of the TLS Server Hello record application layer."; + this.infoURL = + "https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967"; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Input format", type: "option", - value: ["Hex", "Base64", "Raw"] + value: ["Hex", "Base64", "Raw"], }, { name: "Output format", type: "option", - value: ["Hash digest", "JA3S string", "Full details"] - } + value: ["Hash digest", "JA3S string", "Full details"], + }, ]; } @@ -60,8 +61,7 @@ class JA3SFingerprint extends Operation { const s = new Stream(new Uint8Array(input)); const handshake = s.readInt(1); - if (handshake !== 0x16) - throw new OperationError("Not handshake data."); + if (handshake !== 0x16) throw new OperationError("Not handshake data."); // Version s.moveForwardsBy(2); @@ -110,11 +110,7 @@ class JA3SFingerprint extends Operation { } // Output - const ja3s = [ - helloVersion.toString(), - cipherSuite, - exts.join("-") - ]; + const ja3s = [helloVersion.toString(), cipherSuite, exts.join("-")]; const ja3sStr = ja3s.join(","); const ja3sHash = runHash("md5", Utils.strToArrayBuffer(ja3sStr)); @@ -139,7 +135,6 @@ ${exts.join("-")}`; return ja3sHash; } } - } export default JA3SFingerprint; diff --git a/src/core/operations/JPathExpression.mjs b/src/core/operations/JPathExpression.mjs index 73a27433..4697233c 100644 --- a/src/core/operations/JPathExpression.mjs +++ b/src/core/operations/JPathExpression.mjs @@ -4,7 +4,7 @@ * @license Apache-2.0 */ -import {JSONPath} from "jsonpath-plus"; +import { JSONPath } from "jsonpath-plus"; import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * JPath expression operation */ class JPathExpression extends Operation { - /** * JPathExpression constructor */ @@ -21,7 +20,8 @@ class JPathExpression extends Operation { this.name = "JPath expression"; this.module = "Code"; - this.description = "Extract information from a JSON object with a JPath query."; + this.description = + "Extract information from a JSON object with a JPath query."; this.infoURL = "http://goessner.net/articles/JsonPath/"; this.inputType = "string"; this.outputType = "string"; @@ -29,19 +29,20 @@ class JPathExpression extends Operation { { name: "Query", type: "string", - value: "" + value: "", }, { name: "Result delimiter", type: "binaryShortString", - value: "\\n" + value: "\\n", }, { name: "Prevent eval", type: "boolean", value: true, - description: "Evaluated expressions are disabled by default for security reasons" - } + description: + "Evaluated expressions are disabled by default for security reasons", + }, ]; } @@ -64,15 +65,16 @@ class JPathExpression extends Operation { results = JSONPath({ path: query, json: jsonObj, - preventEval: preventEval + preventEval: preventEval, }); } catch (err) { - throw new OperationError(`Invalid JPath expression: ${err.message}`); + throw new OperationError( + `Invalid JPath expression: ${err.message}`, + ); } - return results.map(result => JSON.stringify(result)).join(delimiter); + return results.map((result) => JSON.stringify(result)).join(delimiter); } - } export default JPathExpression; diff --git a/src/core/operations/JSONBeautify.mjs b/src/core/operations/JSONBeautify.mjs index 923ae7dc..0d216e08 100644 --- a/src/core/operations/JSONBeautify.mjs +++ b/src/core/operations/JSONBeautify.mjs @@ -14,7 +14,6 @@ import Utils from "../Utils.mjs"; * JSON Beautify operation */ class JSONBeautify extends Operation { - /** * JSONBeautify constructor */ @@ -23,7 +22,8 @@ class JSONBeautify extends Operation { this.name = "JSON Beautify"; this.module = "Code"; - this.description = "Indents and pretty prints JavaScript Object Notation (JSON) code.

Tags: json viewer, prettify, syntax highlighting"; + this.description = + "Indents and pretty prints JavaScript Object Notation (JSON) code.

Tags: json viewer, prettify, syntax highlighting"; this.inputType = "string"; this.outputType = "string"; this.presentType = "html"; @@ -31,18 +31,18 @@ class JSONBeautify extends Operation { { name: "Indent string", type: "binaryShortString", - value: " " + value: " ", }, { name: "Sort Object Keys", type: "boolean", - value: false + value: false, }, { name: "Formatted", type: "boolean", - value: true - } + value: true, + }, ]; } @@ -82,14 +82,17 @@ class JSONBeautify extends Operation { const json = JSON5.parse(data); const options = { withLinks: true, - bigNumbers: true + bigNumbers: true, }; let html = '
'; if (isCollapsable(json)) { const isArr = json instanceof Array; - html += '
' + - `` + + html += + '
' + + `` + json2html(json, options) + "
"; } else { @@ -112,15 +115,16 @@ function sortKeys(o) { if (Array.isArray(o)) { return o.map(sortKeys); } else if ("[object Object]" === Object.prototype.toString.call(o)) { - return Object.keys(o).sort().reduce(function(a, k) { - a[k] = sortKeys(o[k]); - return a; - }, {}); + return Object.keys(o) + .sort() + .reduce(function (a, k) { + a[k] = sortKeys(o[k]); + return a; + }, {}); } return o; } - /** * Check if arg is either an array with at least 1 element, or a dict with at least 1 key * @returns {boolean} @@ -174,15 +178,19 @@ function json2html(json, options) { html += 'null'; } else if (json instanceof Array) { if (json.length > 0) { - html += '[
    '; + html += + '[
      '; for (let i = 0; i < json.length; i++) { html += "
    1. "; // Add toggle button if item is collapsable if (isCollapsable(json[i])) { const isArr = json[i] instanceof Array; - html += '
      ' + - `` + + html += + '
      ' + + `` + json2html(json[i], options) + "
      "; } else { @@ -203,12 +211,16 @@ function json2html(json, options) { // Optional support different libraries for big numbers // json.isLosslessNumber: package lossless-json // json.toExponential(): packages bignumber.js, big.js, decimal.js, decimal.js-light, others? - if (options.bigNumbers && (typeof json.toExponential === "function" || json.isLosslessNumber)) { + if ( + options.bigNumbers && + (typeof json.toExponential === "function" || json.isLosslessNumber) + ) { html += `${json.toString()}`; } else { let keyCount = Object.keys(json).length; if (keyCount > 0) { - html += '{
        '; + html += + '{
          '; for (const key in json) { if (Object.prototype.hasOwnProperty.call(json, key)) { const safeKey = Utils.escapeHtml(key); @@ -217,12 +229,18 @@ function json2html(json, options) { // Add toggle button if item is collapsable if (isCollapsable(json[key])) { const isArr = json[key] instanceof Array; - html += '
          ' + - `${safeKey}: ` + + html += + '
          ' + + `${safeKey}: ` + json2html(json[key], options) + "
          "; } else { - html += safeKey + ': ' + json2html(json[key], options); + html += + safeKey + + ': ' + + json2html(json[key], options); } // Add comma if item is not last diff --git a/src/core/operations/JSONMinify.mjs b/src/core/operations/JSONMinify.mjs index 7f0c6f2b..0a12c145 100644 --- a/src/core/operations/JSONMinify.mjs +++ b/src/core/operations/JSONMinify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * JSON Minify operation */ class JSONMinify extends Operation { - /** * JSONMinify constructor */ @@ -35,7 +34,6 @@ class JSONMinify extends Operation { if (!input) return ""; return vkbeautify.jsonmin(input); } - } export default JSONMinify; diff --git a/src/core/operations/JSONToCSV.mjs b/src/core/operations/JSONToCSV.mjs index 875ff6e8..5a47513e 100644 --- a/src/core/operations/JSONToCSV.mjs +++ b/src/core/operations/JSONToCSV.mjs @@ -13,7 +13,6 @@ const flatten = flat.default ? flat.default.flatten : flat.flatten; * JSON to CSV operation */ class JSONToCSV extends Operation { - /** * JSONToCSV constructor */ @@ -22,7 +21,8 @@ class JSONToCSV extends Operation { this.name = "JSON to CSV"; this.module = "Default"; - this.description = "Converts JSON data to a CSV based on the definition in RFC 4180."; + this.description = + "Converts JSON data to a CSV based on the definition in RFC 4180."; this.infoURL = "https://wikipedia.org/wiki/Comma-separated_values"; this.inputType = "JSON"; this.outputType = "string"; @@ -30,13 +30,13 @@ class JSONToCSV extends Operation { { name: "Cell delimiter", type: "binaryShortString", - value: "," + value: ",", }, { name: "Row delimiter", type: "binaryShortString", - value: "\\r\\n" - } + value: "\\r\\n", + }, ]; } @@ -46,33 +46,38 @@ class JSONToCSV extends Operation { * @param {boolean} force - Whether to force conversion of data to fit in a cell * @returns {string} */ - toCSV(force=false) { + toCSV(force = false) { const self = this; // If the JSON is an array of arrays, this is easy if (this.flattened[0] instanceof Array) { - return this.flattened - .map(row => row - .map(d => self.escapeCellContents(d, force)) - .join(this.cellDelim) - ) - .join(this.rowDelim) + - this.rowDelim; + return ( + this.flattened + .map((row) => + row + .map((d) => self.escapeCellContents(d, force)) + .join(this.cellDelim), + ) + .join(this.rowDelim) + this.rowDelim + ); } // If it's an array of dictionaries... const header = Object.keys(this.flattened[0]); - return header - .map(d => self.escapeCellContents(d, force)) - .join(this.cellDelim) + + return ( + header + .map((d) => self.escapeCellContents(d, force)) + .join(this.cellDelim) + this.rowDelim + this.flattened - .map(row => header - .map(h => row[h]) - .map(d => self.escapeCellContents(d, force)) - .join(this.cellDelim) + .map((row) => + header + .map((h) => row[h]) + .map((d) => self.escapeCellContents(d, force)) + .join(this.cellDelim), ) .join(this.rowDelim) + - this.rowDelim; + this.rowDelim + ); } /** @@ -101,7 +106,9 @@ class JSONToCSV extends Operation { } return this.toCSV(true); } catch (err) { - throw new OperationError("Unable to parse JSON to CSV: " + err.toString()); + throw new OperationError( + "Unable to parse JSON to CSV: " + err.toString(), + ); } } } @@ -113,7 +120,7 @@ class JSONToCSV extends Operation { * @param {boolean} force - Whether to force conversion of data to fit in a cell * @returns {string} */ - escapeCellContents(data, force=false) { + escapeCellContents(data, force = false) { if (data !== "string") { const isPrimitive = data == null || typeof data !== "object"; if (isPrimitive) data = `${data}`; @@ -136,7 +143,6 @@ class JSONToCSV extends Operation { return data; } - } export default JSONToCSV; diff --git a/src/core/operations/JWTDecode.mjs b/src/core/operations/JWTDecode.mjs index b6356b5a..76d67cf6 100644 --- a/src/core/operations/JWTDecode.mjs +++ b/src/core/operations/JWTDecode.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * JWT Decode operation */ class JWTDecode extends Operation { - /** * JWTDecode constructor */ @@ -21,16 +20,18 @@ class JWTDecode extends Operation { this.name = "JWT Decode"; this.module = "Crypto"; - this.description = "Decodes a JSON Web Token without checking whether the provided secret / private key is valid. Use 'JWT Verify' to check if the signature is valid as well."; + this.description = + "Decodes a JSON Web Token without checking whether the provided secret / private key is valid. Use 'JWT Verify' to check if the signature is valid as well."; this.infoURL = "https://wikipedia.org/wiki/JSON_Web_Token"; this.inputType = "string"; this.outputType = "JSON"; this.args = []; this.checks = [ { - pattern: "^ey([A-Za-z0-9_-]+)\\.ey([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)$", + pattern: + "^ey([A-Za-z0-9_-]+)\\.ey([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)$", flags: "", - args: [] + args: [], }, ]; } @@ -44,7 +45,7 @@ class JWTDecode extends Operation { try { const decoded = jwt.decode(input, { json: true, - complete: true + complete: true, }); return decoded.payload; @@ -52,7 +53,6 @@ class JWTDecode extends Operation { throw new OperationError(err); } } - } export default JWTDecode; diff --git a/src/core/operations/JWTSign.mjs b/src/core/operations/JWTSign.mjs index af46908e..90d6fc07 100644 --- a/src/core/operations/JWTSign.mjs +++ b/src/core/operations/JWTSign.mjs @@ -6,14 +6,12 @@ import Operation from "../Operation.mjs"; import jwt from "jsonwebtoken"; import OperationError from "../errors/OperationError.mjs"; -import {JWT_ALGORITHMS} from "../lib/JWT.mjs"; - +import { JWT_ALGORITHMS } from "../lib/JWT.mjs"; /** * JWT Sign operation */ class JWTSign extends Operation { - /** * JWTSign constructor */ @@ -22,7 +20,8 @@ class JWTSign extends Operation { this.name = "JWT Sign"; this.module = "Crypto"; - this.description = "Signs a JSON object as a JSON Web Token using a provided secret / private key.

          The key should be either the secret for HMAC algorithms or the PEM-encoded private key for RSA and ECDSA."; + this.description = + "Signs a JSON object as a JSON Web Token using a provided secret / private key.

          The key should be either the secret for HMAC algorithms or the PEM-encoded private key for RSA and ECDSA."; this.infoURL = "https://wikipedia.org/wiki/JSON_Web_Token"; this.inputType = "JSON"; this.outputType = "string"; @@ -30,13 +29,13 @@ class JWTSign extends Operation { { name: "Private/Secret Key", type: "text", - value: "secret" + value: "secret", }, { name: "Signing algorithm", type: "option", - value: JWT_ALGORITHMS - } + value: JWT_ALGORITHMS, + }, ]; } @@ -50,7 +49,7 @@ class JWTSign extends Operation { try { return jwt.sign(input, key, { - algorithm: algorithm === "None" ? "none" : algorithm + algorithm: algorithm === "None" ? "none" : algorithm, }); } catch (err) { throw new OperationError(`Error: Have you entered the key correctly? The key should be either the secret for HMAC algorithms or the PEM-encoded private key for RSA and ECDSA. @@ -58,7 +57,6 @@ class JWTSign extends Operation { ${err}`); } } - } export default JWTSign; diff --git a/src/core/operations/JWTVerify.mjs b/src/core/operations/JWTVerify.mjs index 604edc9c..5edb1dfd 100644 --- a/src/core/operations/JWTVerify.mjs +++ b/src/core/operations/JWTVerify.mjs @@ -6,14 +6,12 @@ import Operation from "../Operation.mjs"; import jwt from "jsonwebtoken"; import OperationError from "../errors/OperationError.mjs"; -import {JWT_ALGORITHMS} from "../lib/JWT.mjs"; - +import { JWT_ALGORITHMS } from "../lib/JWT.mjs"; /** * JWT Verify operation */ class JWTVerify extends Operation { - /** * JWTVerify constructor */ @@ -22,7 +20,8 @@ class JWTVerify extends Operation { this.name = "JWT Verify"; this.module = "Crypto"; - this.description = "Verifies that a JSON Web Token is valid and has been signed with the provided secret / private key.

          The key should be either the secret for HMAC algorithms or the PEM-encoded private key for RSA and ECDSA."; + this.description = + "Verifies that a JSON Web Token is valid and has been signed with the provided secret / private key.

          The key should be either the secret for HMAC algorithms or the PEM-encoded private key for RSA and ECDSA."; this.infoURL = "https://wikipedia.org/wiki/JSON_Web_Token"; this.inputType = "string"; this.outputType = "JSON"; @@ -30,7 +29,7 @@ class JWTVerify extends Operation { { name: "Public/Secret Key", type: "text", - value: "secret" + value: "secret", }, ]; } @@ -48,7 +47,10 @@ class JWTVerify extends Operation { try { const verified = jwt.verify(input, key, { algorithms: algos }); - if (Object.prototype.hasOwnProperty.call(verified, "name") && verified.name === "JsonWebTokenError") { + if ( + Object.prototype.hasOwnProperty.call(verified, "name") && + verified.name === "JsonWebTokenError" + ) { throw new OperationError(verified.message); } @@ -57,7 +59,6 @@ class JWTVerify extends Operation { throw new OperationError(err); } } - } export default JWTVerify; diff --git a/src/core/operations/JavaScriptBeautify.mjs b/src/core/operations/JavaScriptBeautify.mjs index 94575fcb..d3afb8c5 100644 --- a/src/core/operations/JavaScriptBeautify.mjs +++ b/src/core/operations/JavaScriptBeautify.mjs @@ -13,7 +13,6 @@ import * as esprima from "esprima"; * JavaScript Beautify operation */ class JavaScriptBeautify extends Operation { - /** * JavaScriptBeautify constructor */ @@ -22,30 +21,31 @@ class JavaScriptBeautify extends Operation { this.name = "JavaScript Beautify"; this.module = "Code"; - this.description = "Parses and pretty prints valid JavaScript code. Also works with JavaScript Object Notation (JSON)."; + this.description = + "Parses and pretty prints valid JavaScript code. Also works with JavaScript Object Notation (JSON)."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Indent string", - "type": "binaryShortString", - "value": "\\t" + name: "Indent string", + type: "binaryShortString", + value: "\\t", }, { - "name": "Quotes", - "type": "option", - "value": ["Auto", "Single", "Double"] + name: "Quotes", + type: "option", + value: ["Auto", "Single", "Double"], }, { - "name": "Semicolons before closing braces", - "type": "boolean", - "value": true + name: "Semicolons before closing braces", + type: "boolean", + value: true, }, { - "name": "Include comments", - "type": "boolean", - "value": true - } + name: "Include comments", + type: "boolean", + value: true, + }, ]; } @@ -57,7 +57,7 @@ class JavaScriptBeautify extends Operation { run(input, args) { const beautifyIndent = args[0] || "\\t", quotes = args[1].toLowerCase(), - [,, beautifySemicolons, beautifyComment] = args; + [, , beautifySemicolons, beautifyComment] = args; let result = "", AST; @@ -65,18 +65,18 @@ class JavaScriptBeautify extends Operation { AST = esprima.parseScript(input, { range: true, tokens: true, - comment: true + comment: true, }); const options = { format: { indent: { - style: beautifyIndent + style: beautifyIndent, }, quotes: quotes, semicolons: beautifySemicolons, }, - comment: beautifyComment + comment: beautifyComment, }; if (options.comment) @@ -85,11 +85,12 @@ class JavaScriptBeautify extends Operation { result = escodegen.generate(AST, options); } catch (e) { // Leave original error so the user can see the detail - throw new OperationError("Unable to parse JavaScript.
          " + e.message); + throw new OperationError( + "Unable to parse JavaScript.
          " + e.message, + ); } return result; } - } export default JavaScriptBeautify; diff --git a/src/core/operations/JavaScriptMinify.mjs b/src/core/operations/JavaScriptMinify.mjs index bfa73f6a..5ba94536 100644 --- a/src/core/operations/JavaScriptMinify.mjs +++ b/src/core/operations/JavaScriptMinify.mjs @@ -12,7 +12,6 @@ import * as terser from "terser"; * JavaScript Minify operation */ class JavaScriptMinify extends Operation { - /** * JavaScriptMinify constructor */ @@ -35,11 +34,12 @@ class JavaScriptMinify extends Operation { async run(input, args) { const result = await terser.minify(input); if (result.error) { - throw new OperationError(`Error minifying JavaScript. (${result.error})`); + throw new OperationError( + `Error minifying JavaScript. (${result.error})`, + ); } return result.code; } - } export default JavaScriptMinify; diff --git a/src/core/operations/JavaScriptParser.mjs b/src/core/operations/JavaScriptParser.mjs index 2fb13891..4bd5276d 100644 --- a/src/core/operations/JavaScriptParser.mjs +++ b/src/core/operations/JavaScriptParser.mjs @@ -11,7 +11,6 @@ import * as esprima from "esprima"; * JavaScript Parser operation */ class JavaScriptParser extends Operation { - /** * JavaScriptParser constructor */ @@ -20,36 +19,37 @@ class JavaScriptParser extends Operation { this.name = "JavaScript Parser"; this.module = "Code"; - this.description = "Returns an Abstract Syntax Tree for valid JavaScript code."; + this.description = + "Returns an Abstract Syntax Tree for valid JavaScript code."; this.infoURL = "https://wikipedia.org/wiki/Abstract_syntax_tree"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Location info", - "type": "boolean", - "value": false + name: "Location info", + type: "boolean", + value: false, }, { - "name": "Range info", - "type": "boolean", - "value": false + name: "Range info", + type: "boolean", + value: false, }, { - "name": "Include tokens array", - "type": "boolean", - "value": false + name: "Include tokens array", + type: "boolean", + value: false, }, { - "name": "Include comments array", - "type": "boolean", - "value": false + name: "Include comments array", + type: "boolean", + value: false, }, { - "name": "Report errors and try to continue", - "type": "boolean", - "value": false - } + name: "Report errors and try to continue", + type: "boolean", + value: false, + }, ]; } @@ -59,20 +59,20 @@ class JavaScriptParser extends Operation { * @returns {string} */ run(input, args) { - const [parseLoc, parseRange, parseTokens, parseComment, parseTolerant] = args, + const [parseLoc, parseRange, parseTokens, parseComment, parseTolerant] = + args, options = { - loc: parseLoc, - range: parseRange, - tokens: parseTokens, - comment: parseComment, - tolerant: parseTolerant + loc: parseLoc, + range: parseRange, + tokens: parseTokens, + comment: parseComment, + tolerant: parseTolerant, }; let result = {}; result = esprima.parseScript(input, options); return JSON.stringify(result, null, 2); } - } export default JavaScriptParser; diff --git a/src/core/operations/Jump.mjs b/src/core/operations/Jump.mjs index 26a2c922..73dc7565 100644 --- a/src/core/operations/Jump.mjs +++ b/src/core/operations/Jump.mjs @@ -11,7 +11,6 @@ import { getLabelIndex } from "../lib/FlowControl.mjs"; * Jump operation */ class Jump extends Operation { - /** * Jump constructor */ @@ -26,15 +25,15 @@ class Jump extends Operation { this.outputType = "string"; this.args = [ { - "name": "Label name", - "type": "string", - "value": "" + name: "Label name", + type: "string", + value: "", }, { - "name": "Maximum jumps (if jumping backwards)", - "type": "number", - "value": 10 - } + name: "Maximum jumps (if jumping backwards)", + type: "number", + value: 10, + }, ]; } @@ -60,7 +59,6 @@ class Jump extends Operation { state.numJumps++; return state; } - } export default Jump; diff --git a/src/core/operations/Keccak.mjs b/src/core/operations/Keccak.mjs index 151a4e82..db10bad6 100644 --- a/src/core/operations/Keccak.mjs +++ b/src/core/operations/Keccak.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Keccak operation */ class Keccak extends Operation { - /** * Keccak constructor */ @@ -21,16 +20,17 @@ class Keccak extends Operation { this.name = "Keccak"; this.module = "Crypto"; - this.description = "The Keccak hash algorithm was designed by Guido Bertoni, Joan Daemen, Micha\xebl Peeters, and Gilles Van Assche, building upon RadioGat\xfan. It was selected as the winner of the SHA-3 design competition.

          This version of the algorithm is Keccak[c=2d] and differs from the SHA-3 specification."; + this.description = + "The Keccak hash algorithm was designed by Guido Bertoni, Joan Daemen, Micha\xebl Peeters, and Gilles Van Assche, building upon RadioGat\xfan. It was selected as the winner of the SHA-3 design competition.

          This version of the algorithm is Keccak[c=2d] and differs from the SHA-3 specification."; this.infoURL = "https://wikipedia.org/wiki/SHA-3"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Size", - "type": "option", - "value": ["512", "384", "256", "224"] - } + name: "Size", + type: "option", + value: ["512", "384", "256", "224"], + }, ]; } @@ -62,7 +62,6 @@ class Keccak extends Operation { return algo(input); } - } export default Keccak; diff --git a/src/core/operations/LMHash.mjs b/src/core/operations/LMHash.mjs index 2bedf0e8..003123f8 100644 --- a/src/core/operations/LMHash.mjs +++ b/src/core/operations/LMHash.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {smbhash} from "ntlm"; +import { smbhash } from "ntlm"; /** * LM Hash operation */ class LMHash extends Operation { - /** * LMHash constructor */ @@ -20,8 +19,10 @@ class LMHash extends Operation { this.name = "LM Hash"; this.module = "Crypto"; - this.description = "An LM Hash, or LAN Manager Hash, is a deprecated way of storing passwords on old Microsoft operating systems. It is particularly weak and can be cracked in seconds on modern hardware using rainbow tables."; - this.infoURL = "https://wikipedia.org/wiki/LAN_Manager#Password_hashing_algorithm"; + this.description = + "An LM Hash, or LAN Manager Hash, is a deprecated way of storing passwords on old Microsoft operating systems. It is particularly weak and can be cracked in seconds on modern hardware using rainbow tables."; + this.infoURL = + "https://wikipedia.org/wiki/LAN_Manager#Password_hashing_algorithm"; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -35,7 +36,6 @@ class LMHash extends Operation { run(input, args) { return smbhash.lmhash(input); } - } export default LMHash; diff --git a/src/core/operations/LS47Decrypt.mjs b/src/core/operations/LS47Decrypt.mjs index d5764d7f..3c62040b 100644 --- a/src/core/operations/LS47Decrypt.mjs +++ b/src/core/operations/LS47Decrypt.mjs @@ -11,7 +11,6 @@ import * as LS47 from "../lib/LS47.mjs"; * LS47 Decrypt operation */ class LS47Decrypt extends Operation { - /** * LS47Decrypt constructor */ @@ -20,7 +19,8 @@ class LS47Decrypt extends Operation { this.name = "LS47 Decrypt"; this.module = "Crypto"; - this.description = "This is a slight improvement of the ElsieFour cipher as described by Alan Kaminsky. We use 7x7 characters instead of original (barely fitting) 6x6, to be able to encrypt some structured information. We also describe a simple key-expansion algorithm, because remembering passwords is popular. Similar security considerations as with ElsieFour hold.
          The LS47 alphabet consists of following characters: _abcdefghijklmnopqrstuvwxyz.0123456789,-+*/:?!'()
          An LS47 key is a permutation of the alphabet that is then represented in a 7x7 grid used for the encryption or decryption."; + this.description = + "This is a slight improvement of the ElsieFour cipher as described by Alan Kaminsky. We use 7x7 characters instead of original (barely fitting) 6x6, to be able to encrypt some structured information. We also describe a simple key-expansion algorithm, because remembering passwords is popular. Similar security considerations as with ElsieFour hold.
          The LS47 alphabet consists of following characters: _abcdefghijklmnopqrstuvwxyz.0123456789,-+*/:?!'()
          An LS47 key is a permutation of the alphabet that is then represented in a 7x7 grid used for the encryption or decryption."; this.infoURL = "https://github.com/exaexa/ls47"; this.inputType = "string"; this.outputType = "string"; @@ -28,13 +28,13 @@ class LS47Decrypt extends Operation { { name: "Password", type: "string", - value: "" + value: "", }, { name: "Padding", type: "number", - value: 10 - } + value: 10, + }, ]; } @@ -51,7 +51,6 @@ class LS47Decrypt extends Operation { const key = LS47.deriveKey(args[0]); return LS47.decryptPad(key, input, this.paddingSize); } - } export default LS47Decrypt; diff --git a/src/core/operations/LS47Encrypt.mjs b/src/core/operations/LS47Encrypt.mjs index 02f7d994..824f673b 100644 --- a/src/core/operations/LS47Encrypt.mjs +++ b/src/core/operations/LS47Encrypt.mjs @@ -11,7 +11,6 @@ import * as LS47 from "../lib/LS47.mjs"; * LS47 Encrypt operation */ class LS47Encrypt extends Operation { - /** * LS47Encrypt constructor */ @@ -20,7 +19,8 @@ class LS47Encrypt extends Operation { this.name = "LS47 Encrypt"; this.module = "Crypto"; - this.description = "This is a slight improvement of the ElsieFour cipher as described by Alan Kaminsky. We use 7x7 characters instead of original (barely fitting) 6x6, to be able to encrypt some structured information. We also describe a simple key-expansion algorithm, because remembering passwords is popular. Similar security considerations as with ElsieFour hold.
          The LS47 alphabet consists of following characters: _abcdefghijklmnopqrstuvwxyz.0123456789,-+*/:?!'()
          A LS47 key is a permutation of the alphabet that is then represented in a 7x7 grid used for the encryption or decryption."; + this.description = + "This is a slight improvement of the ElsieFour cipher as described by Alan Kaminsky. We use 7x7 characters instead of original (barely fitting) 6x6, to be able to encrypt some structured information. We also describe a simple key-expansion algorithm, because remembering passwords is popular. Similar security considerations as with ElsieFour hold.
          The LS47 alphabet consists of following characters: _abcdefghijklmnopqrstuvwxyz.0123456789,-+*/:?!'()
          A LS47 key is a permutation of the alphabet that is then represented in a 7x7 grid used for the encryption or decryption."; this.infoURL = "https://github.com/exaexa/ls47"; this.inputType = "string"; this.outputType = "string"; @@ -28,18 +28,18 @@ class LS47Encrypt extends Operation { { name: "Password", type: "string", - value: "" + value: "", }, { name: "Padding", type: "number", - value: 10 + value: 10, }, { name: "Signature", type: "string", - value: "" - } + value: "", + }, ]; } @@ -56,7 +56,6 @@ class LS47Encrypt extends Operation { const key = LS47.deriveKey(args[0]); return LS47.encryptPad(key, input, args[2], this.paddingSize); } - } export default LS47Encrypt; diff --git a/src/core/operations/LZ4Compress.mjs b/src/core/operations/LZ4Compress.mjs index 1f43785f..02156727 100644 --- a/src/core/operations/LZ4Compress.mjs +++ b/src/core/operations/LZ4Compress.mjs @@ -11,7 +11,6 @@ import lz4 from "lz4js"; * LZ4 Compress operation */ class LZ4Compress extends Operation { - /** * LZ4Compress constructor */ @@ -20,7 +19,8 @@ class LZ4Compress extends Operation { this.name = "LZ4 Compress"; this.module = "Compression"; - this.description = "LZ4 is a lossless data compression algorithm that is focused on compression and decompression speed. It belongs to the LZ77 family of byte-oriented compression schemes."; + this.description = + "LZ4 is a lossless data compression algorithm that is focused on compression and decompression speed. It belongs to the LZ77 family of byte-oriented compression schemes."; this.infoURL = "https://wikipedia.org/wiki/LZ4_(compression_algorithm)"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -37,7 +37,6 @@ class LZ4Compress extends Operation { const compressed = lz4.compress(inBuf); return compressed.buffer; } - } export default LZ4Compress; diff --git a/src/core/operations/LZ4Decompress.mjs b/src/core/operations/LZ4Decompress.mjs index 2ba50416..82a1dbb0 100644 --- a/src/core/operations/LZ4Decompress.mjs +++ b/src/core/operations/LZ4Decompress.mjs @@ -11,7 +11,6 @@ import lz4 from "lz4js"; * LZ4 Decompress operation */ class LZ4Decompress extends Operation { - /** * LZ4Decompress constructor */ @@ -20,7 +19,8 @@ class LZ4Decompress extends Operation { this.name = "LZ4 Decompress"; this.module = "Compression"; - this.description = "LZ4 is a lossless data compression algorithm that is focused on compression and decompression speed. It belongs to the LZ77 family of byte-oriented compression schemes."; + this.description = + "LZ4 is a lossless data compression algorithm that is focused on compression and decompression speed. It belongs to the LZ77 family of byte-oriented compression schemes."; this.infoURL = "https://wikipedia.org/wiki/LZ4_(compression_algorithm)"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -37,7 +37,6 @@ class LZ4Decompress extends Operation { const decompressed = lz4.decompress(inBuf); return decompressed.buffer; } - } export default LZ4Decompress; diff --git a/src/core/operations/LZMACompress.mjs b/src/core/operations/LZMACompress.mjs index 5a252db2..b89dbad0 100644 --- a/src/core/operations/LZMACompress.mjs +++ b/src/core/operations/LZMACompress.mjs @@ -8,13 +8,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import { compress } from "@blu3r4y/lzma"; -import {isWorkerEnvironment} from "../Utils.mjs"; +import { isWorkerEnvironment } from "../Utils.mjs"; /** * LZMA Compress operation */ class LZMACompress extends Operation { - /** * LZMACompress constructor */ @@ -23,19 +22,19 @@ class LZMACompress extends Operation { this.name = "LZMA Compress"; this.module = "Compression"; - this.description = "Compresses data using the Lempel\u2013Ziv\u2013Markov chain algorithm. Compression mode determines the speed and effectiveness of the compression: 1 is fastest and less effective, 9 is slowest and most effective"; - this.infoURL = "https://wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Markov_chain_algorithm"; + this.description = + "Compresses data using the Lempel\u2013Ziv\u2013Markov chain algorithm. Compression mode determines the speed and effectiveness of the compression: 1 is fastest and less effective, 9 is slowest and most effective"; + this.infoURL = + "https://wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Markov_chain_algorithm"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; this.args = [ { name: "Compression Mode", type: "option", - value: [ - "1", "2", "3", "4", "5", "6", "7", "8", "9" - ], - "defaultIndex": 6 - } + value: ["1", "2", "3", "4", "5", "6", "7", "8", "9"], + defaultIndex: 6, + }, ]; } @@ -47,18 +46,29 @@ class LZMACompress extends Operation { async run(input, args) { const mode = Number(args[0]); return new Promise((resolve, reject) => { - compress(new Uint8Array(input), mode, (result, error) => { - if (error) { - reject(new OperationError(`Failed to compress input: ${error.message}`)); - } - // The compression returns as an Int8Array, but we can just get the unsigned data from the buffer - resolve(new Int8Array(result).buffer); - }, (percent) => { - if (isWorkerEnvironment()) self.sendStatusMessage(`Compressing input: ${(percent*100).toFixed(2)}%`); - }); + compress( + new Uint8Array(input), + mode, + (result, error) => { + if (error) { + reject( + new OperationError( + `Failed to compress input: ${error.message}`, + ), + ); + } + // The compression returns as an Int8Array, but we can just get the unsigned data from the buffer + resolve(new Int8Array(result).buffer); + }, + (percent) => { + if (isWorkerEnvironment()) + self.sendStatusMessage( + `Compressing input: ${(percent * 100).toFixed(2)}%`, + ); + }, + ); }); } - } export default LZMACompress; diff --git a/src/core/operations/LZMADecompress.mjs b/src/core/operations/LZMADecompress.mjs index 3bebb860..e4051ee1 100644 --- a/src/core/operations/LZMADecompress.mjs +++ b/src/core/operations/LZMADecompress.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {decompress} from "@blu3r4y/lzma"; -import Utils, {isWorkerEnvironment} from "../Utils.mjs"; +import { decompress } from "@blu3r4y/lzma"; +import Utils, { isWorkerEnvironment } from "../Utils.mjs"; /** * LZMA Decompress operation */ class LZMADecompress extends Operation { - /** * LZMADecompress constructor */ @@ -22,8 +21,10 @@ class LZMADecompress extends Operation { this.name = "LZMA Decompress"; this.module = "Compression"; - this.description = "Decompresses data using the Lempel-Ziv-Markov chain Algorithm."; - this.infoURL = "https://wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Markov_chain_algorithm"; + this.description = + "Decompresses data using the Lempel-Ziv-Markov chain Algorithm."; + this.infoURL = + "https://wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Markov_chain_algorithm"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; } @@ -35,23 +36,35 @@ class LZMADecompress extends Operation { */ async run(input, args) { return new Promise((resolve, reject) => { - decompress(new Uint8Array(input), (result, error) => { - if (error) { - reject(new OperationError(`Failed to decompress input: ${error.message}`)); - } - // The decompression returns either a String or an untyped unsigned int8 array, but we can just get the unsigned data from the buffer + decompress( + new Uint8Array(input), + (result, error) => { + if (error) { + reject( + new OperationError( + `Failed to decompress input: ${error.message}`, + ), + ); + } + // The decompression returns either a String or an untyped unsigned int8 array, but we can just get the unsigned data from the buffer - if (typeof result == "string") { - resolve(Utils.strToArrayBuffer(result)); - } else { - resolve(new Int8Array(result).buffer); - } - }, (percent) => { - if (isWorkerEnvironment()) self.sendStatusMessage(`Decompressing input: ${(percent*100).toFixed(2)}%`); - }); + if (typeof result == "string") { + resolve(Utils.strToArrayBuffer(result)); + } else { + resolve(new Int8Array(result).buffer); + } + }, + (percent) => { + if (isWorkerEnvironment()) + self.sendStatusMessage( + `Decompressing input: ${(percent * 100).toFixed( + 2, + )}%`, + ); + }, + ); }); } - } export default LZMADecompress; diff --git a/src/core/operations/LZNT1Decompress.mjs b/src/core/operations/LZNT1Decompress.mjs index b5308e77..fc1d56f6 100644 --- a/src/core/operations/LZNT1Decompress.mjs +++ b/src/core/operations/LZNT1Decompress.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {decompress} from "../lib/LZNT1.mjs"; +import { decompress } from "../lib/LZNT1.mjs"; /** * LZNT1 Decompress operation */ class LZNT1Decompress extends Operation { - /** * LZNT1 Decompress constructor */ @@ -20,8 +19,10 @@ class LZNT1Decompress extends Operation { this.name = "LZNT1 Decompress"; this.module = "Compression"; - this.description = "Decompresses data using the LZNT1 algorithm.

          Similar to the Windows API RtlDecompressBuffer."; - this.infoURL = "https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-xca/5655f4a3-6ba4-489b-959f-e1f407c52f15"; + this.description = + "Decompresses data using the LZNT1 algorithm.

          Similar to the Windows API RtlDecompressBuffer."; + this.infoURL = + "https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-xca/5655f4a3-6ba4-489b-959f-e1f407c52f15"; this.inputType = "byteArray"; this.outputType = "byteArray"; this.args = []; @@ -35,7 +36,6 @@ class LZNT1Decompress extends Operation { run(input, args) { return decompress(input); } - } export default LZNT1Decompress; diff --git a/src/core/operations/LZStringCompress.mjs b/src/core/operations/LZStringCompress.mjs index 11d5710a..36abe11d 100644 --- a/src/core/operations/LZStringCompress.mjs +++ b/src/core/operations/LZStringCompress.mjs @@ -7,13 +7,15 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {COMPRESSION_OUTPUT_FORMATS, COMPRESSION_FUNCTIONS} from "../lib/LZString.mjs"; +import { + COMPRESSION_OUTPUT_FORMATS, + COMPRESSION_FUNCTIONS, +} from "../lib/LZString.mjs"; /** * LZString Compress operation */ class LZStringCompress extends Operation { - /** * LZStringCompress constructor */ @@ -31,8 +33,8 @@ class LZStringCompress extends Operation { name: "Compression Format", type: "option", defaultIndex: 0, - value: COMPRESSION_OUTPUT_FORMATS - } + value: COMPRESSION_OUTPUT_FORMATS, + }, ]; } @@ -49,7 +51,6 @@ class LZStringCompress extends Operation { throw new OperationError("Unable to find compression function"); } } - } export default LZStringCompress; diff --git a/src/core/operations/LZStringDecompress.mjs b/src/core/operations/LZStringDecompress.mjs index 87d0d85b..93974d7f 100644 --- a/src/core/operations/LZStringDecompress.mjs +++ b/src/core/operations/LZStringDecompress.mjs @@ -7,13 +7,15 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {COMPRESSION_OUTPUT_FORMATS, DECOMPRESSION_FUNCTIONS} from "../lib/LZString.mjs"; +import { + COMPRESSION_OUTPUT_FORMATS, + DECOMPRESSION_FUNCTIONS, +} from "../lib/LZString.mjs"; /** * LZString Decompress operation */ class LZStringDecompress extends Operation { - /** * LZStringDecompress constructor */ @@ -22,7 +24,8 @@ class LZStringDecompress extends Operation { this.name = "LZString Decompress"; this.module = "Compression"; - this.description = "Decompresses data that was compressed with lz-string."; + this.description = + "Decompresses data that was compressed with lz-string."; this.infoURL = "https://pieroxy.net/blog/pages/lz-string/index.html"; this.inputType = "string"; this.outputType = "string"; @@ -31,8 +34,8 @@ class LZStringDecompress extends Operation { name: "Compression Format", type: "option", defaultIndex: 0, - value: COMPRESSION_OUTPUT_FORMATS - } + value: COMPRESSION_OUTPUT_FORMATS, + }, ]; } @@ -49,8 +52,6 @@ class LZStringDecompress extends Operation { throw new OperationError("Unable to find decompression function"); } } - - } export default LZStringDecompress; diff --git a/src/core/operations/Label.mjs b/src/core/operations/Label.mjs index fb13d803..5aebe0a4 100644 --- a/src/core/operations/Label.mjs +++ b/src/core/operations/Label.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Label operation. For use with Jump and Conditional Jump. */ class Label extends Operation { - /** * Label constructor */ @@ -20,15 +19,16 @@ class Label extends Operation { this.name = "Label"; this.flowControl = true; this.module = "Default"; - this.description = "Provides a location for conditional and fixed jumps to redirect execution to."; + this.description = + "Provides a location for conditional and fixed jumps to redirect execution to."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Name", - "type": "shortString", - "value": "" - } + name: "Name", + type: "shortString", + value: "", + }, ]; } @@ -42,7 +42,6 @@ class Label extends Operation { run(state) { return state; } - } export default Label; diff --git a/src/core/operations/LevenshteinDistance.mjs b/src/core/operations/LevenshteinDistance.mjs index b9d30aa0..bbf2f27b 100644 --- a/src/core/operations/LevenshteinDistance.mjs +++ b/src/core/operations/LevenshteinDistance.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Levenshtein Distance operation */ class LevenshteinDistance extends Operation { - /** * LevenshteinDistance constructor */ @@ -20,7 +19,8 @@ class LevenshteinDistance extends Operation { this.name = "Levenshtein Distance"; this.module = "Default"; - this.description = "Levenshtein Distance (also known as Edit Distance) is a string metric to measure a difference between two strings that counts operations (insertions, deletions, and substitutions) on single character that are required to change one string to another."; + this.description = + "Levenshtein Distance (also known as Edit Distance) is a string metric to measure a difference between two strings that counts operations (insertions, deletions, and substitutions) on single character that are required to change one string to another."; this.infoURL = "https://wikipedia.org/wiki/Levenshtein_distance"; this.inputType = "string"; this.outputType = "number"; @@ -28,22 +28,22 @@ class LevenshteinDistance extends Operation { { name: "Sample delimiter", type: "binaryString", - value: "\\n" + value: "\\n", }, { name: "Insertion cost", type: "number", - value: 1 + value: 1, }, { name: "Deletion cost", type: "number", - value: 1 + value: 1, }, { name: "Substitution cost", type: "number", - value: 1 + value: 1, }, ]; } @@ -57,12 +57,15 @@ class LevenshteinDistance extends Operation { const [delim, insCost, delCost, subCost] = args; const samples = input.split(delim); if (samples.length !== 2) { - throw new OperationError("Incorrect number of samples. Check your input and/or delimiter."); + throw new OperationError( + "Incorrect number of samples. Check your input and/or delimiter.", + ); } if (insCost < 0 || delCost < 0 || subCost < 0) { throw new OperationError("Negative costs are not allowed."); } - const src = samples[0], dest = samples[1]; + const src = samples[0], + dest = samples[1]; let currentCost = new Array(src.length + 1); let nextCost = new Array(src.length + 1); for (let i = 0; i < currentCost.length; i++) { @@ -92,7 +95,6 @@ class LevenshteinDistance extends Operation { return currentCost[currentCost.length - 1]; } - } export default LevenshteinDistance; diff --git a/src/core/operations/Lorenz.mjs b/src/core/operations/Lorenz.mjs index 28ac3bf7..eb8177f5 100644 --- a/src/core/operations/Lorenz.mjs +++ b/src/core/operations/Lorenz.mjs @@ -16,7 +16,6 @@ import OperationError from "../errors/OperationError.mjs"; * Lorenz operation */ class Lorenz extends Operation { - /** * Lorenz constructor */ @@ -25,7 +24,8 @@ class Lorenz extends Operation { this.name = "Lorenz"; this.module = "Bletchley"; - this.description = "The Lorenz SZ40/42 cipher attachment was a WW2 German rotor cipher machine with twelve rotors which attached in-line between remote teleprinters.

          It used the Vernam cipher with two groups of five rotors (named the psi(ψ) wheels and chi(χ) wheels at Bletchley Park) to create two pseudorandom streams of five bits, encoded in ITA2, which were XOR added to the plaintext. Two other rotors, dubbed the mu(μ) or motor wheels, could hold up the stepping of the psi wheels meaning they stepped intermittently.

          Each rotor has a different number of cams/lugs around their circumference which could be set active or inactive changing the key stream.

          Three models of the Lorenz are emulated, SZ40, SZ42a and SZ42b and three example wheel patterns (the lug settings) are included (KH, ZMUG & BREAM) with the option to set a custom set using the letter 'x' for active or '.' for an inactive lug.

          The input can either be plaintext or ITA2 when sending and ITA2 when receiving.

          To learn more, Virtual Lorenz, an online, browser based simulation of the Lorenz SZ40/42 is available at lorenz.virtualcolossus.co.uk.

          A more detailed description of this operation can be found here."; + this.description = + "The Lorenz SZ40/42 cipher attachment was a WW2 German rotor cipher machine with twelve rotors which attached in-line between remote teleprinters.

          It used the Vernam cipher with two groups of five rotors (named the psi(ψ) wheels and chi(χ) wheels at Bletchley Park) to create two pseudorandom streams of five bits, encoded in ITA2, which were XOR added to the plaintext. Two other rotors, dubbed the mu(μ) or motor wheels, could hold up the stepping of the psi wheels meaning they stepped intermittently.

          Each rotor has a different number of cams/lugs around their circumference which could be set active or inactive changing the key stream.

          Three models of the Lorenz are emulated, SZ40, SZ42a and SZ42b and three example wheel patterns (the lug settings) are included (KH, ZMUG & BREAM) with the option to set a custom set using the letter 'x' for active or '.' for an inactive lug.

          The input can either be plaintext or ITA2 when sending and ITA2 when receiving.

          To learn more, Virtual Lorenz, an online, browser based simulation of the Lorenz SZ40/42 is available at lorenz.virtualcolossus.co.uk.

          A more detailed description of this operation can be found here."; this.infoURL = "https://wikipedia.org/wiki/Lorenz_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -33,7 +33,7 @@ class Lorenz extends Operation { { name: "Model", type: "option", - value: ["SZ40", "SZ42a", "SZ42b"] + value: ["SZ40", "SZ42a", "SZ42b"], }, { name: "Wheel Pattern", @@ -41,30 +41,30 @@ class Lorenz extends Operation { value: [ { name: "KH Pattern", - off: [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] + off: [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], }, { name: "ZMUG Pattern", - off: [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] + off: [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], }, { name: "BREAM Pattern", - off: [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] + off: [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], }, { name: "No Pattern", - off: [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] + off: [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], }, { name: "Custom", - on: [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] - } - ] + on: [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], + }, + ], }, { name: "KT-Schalter", type: "boolean", - value: false + value: false, }, { name: "Mode", @@ -73,150 +73,150 @@ class Lorenz extends Operation { { name: "Send", on: [4], - off: [5] + off: [5], }, { name: "Receive", off: [4], - on: [5] - } - ] + on: [5], + }, + ], }, { name: "Input Type", type: "option", - value: ["Plaintext", "ITA2"] + value: ["Plaintext", "ITA2"], }, { name: "Output Type", type: "option", - value: ["Plaintext", "ITA2"] + value: ["Plaintext", "ITA2"], }, { name: "ITA2 Format", type: "option", - value: ["5/8/9", "+/-/."] + value: ["5/8/9", "+/-/."], }, { name: "Ψ1 start (1-43)", type: "number", - value: 1 + value: 1, }, { name: "Ψ2 start (1-47)", type: "number", - value: 1 + value: 1, }, { name: "Ψ3 start (1-51)", type: "number", - value: 1 + value: 1, }, { name: "Ψ4 start (1-53)", type: "number", - value: 1 + value: 1, }, { name: "Ψ5 start (1-59)", type: "number", - value: 1 + value: 1, }, { name: "Μ37 start (1-37)", type: "number", - value: 1 + value: 1, }, { name: "Μ61 start (1-61)", type: "number", - value: 1 + value: 1, }, { name: "Χ1 start (1-41)", type: "number", - value: 1 + value: 1, }, { name: "Χ2 start (1-31)", type: "number", - value: 1 + value: 1, }, { name: "Χ3 start (1-29)", type: "number", - value: 1 + value: 1, }, { name: "Χ4 start (1-26)", type: "number", - value: 1 + value: 1, }, { name: "Χ5 start (1-23)", type: "number", - value: 1 + value: 1, }, { name: "Ψ1 lugs (43)", type: "string", - value: ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x" + value: ".x...xx.x.x..xxx.x.x.xxxx.x.x.x.x.x..x.xx.x", }, { name: "Ψ2 lugs (47)", type: "string", - value: ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x" + value: ".xx.x.xxx..x.x.x..x.xx.x.xxx.x....x.xx.x.x.x..x", }, { name: "Ψ3 lugs (51)", type: "string", - value: ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x" + value: ".x.x.x..xxx....x.x.xx.x.x.x..xxx.x.x..x.x.xx..x.x.x", }, { name: "Ψ4 lugs (53)", type: "string", - value: ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x." + value: ".xx...xxxxx.x.x.xx...x.xx.x.x..x.x.xx.x..x.x.x.x.x.x.", }, { name: "Ψ5 lugs (59)", type: "string", - value: "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x." + value: "xx...xx.x..x.xx.x...x.x.x.x.x.x.x.x.xx..xxxx.x.x...xx.x..x.", }, { name: "Μ37 lugs (37)", type: "string", - value: "x.x.x.x.x.x...x.x.x...x.x.x...x.x...." + value: "x.x.x.x.x.x...x.x.x...x.x.x...x.x....", }, { name: "Μ61 lugs (61)", type: "string", - value: ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx..." + value: ".xxxx.xxxx.xxx.xxxx.xx....xxx.xxxx.xxxx.xxxx.xxxx.xxx.xxxx...", }, { name: "Χ1 lugs (41)", type: "string", - value: ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx.." + value: ".x...xxx.x.xxxx.x...x.x..xxx....xx.xxxx..", }, { name: "Χ2 lugs (31)", type: "string", - value: "x..xxx...x.xxxx..xx..x..xx.xx.." + value: "x..xxx...x.xxxx..xx..x..xx.xx..", }, { name: "Χ3 lugs (29)", type: "string", - value: "..xx..x.xxx...xx...xx..xx.xx." + value: "..xx..x.xxx...xx...xx..xx.xx.", }, { name: "Χ4 lugs (26)", type: "string", - value: "xx..x..xxxx..xx.xxx....x.." + value: "xx..x..xxxx..xx.xxx....x..", }, { name: "Χ5 lugs (23)", type: "string", - value: "xx..xx....xxxx.x..x.x.." - } + value: "xx..xx....xxxx.x..x.x..", + }, ]; } @@ -226,7 +226,6 @@ class Lorenz extends Operation { * @returns {string} */ run(input, args) { - const model = args[0], pattern = args[1], kt = args[2], @@ -262,35 +261,83 @@ class Lorenz extends Operation { this.reverseTable(); - if (s1<1 || s1>43) throw new OperationError("Ψ1 start must be between 1 and 43"); - if (s2<1 || s2>47) throw new OperationError("Ψ2 start must be between 1 and 47"); - if (s3<1 || s3>51) throw new OperationError("Ψ3 start must be between 1 and 51"); - if (s4<1 || s4>53) throw new OperationError("Ψ4 start must be between 1 and 53"); - if (s5<1 || s5>59) throw new OperationError("Ψ5 start must be between 1 and 59"); - if (m37<1 || m37>37) throw new OperationError("Μ37 start must be between 1 and 37"); - if (m61<1 || m61>61) throw new OperationError("Μ61 start must be between 1 and 61"); - if (x1<1 || x1>41) throw new OperationError("Χ1 start must be between 1 and 41"); - if (x2<1 || x2>31) throw new OperationError("Χ2 start must be between 1 and 31"); - if (x3<1 || x3>29) throw new OperationError("Χ3 start must be between 1 and 29"); - if (x4<1 || x4>26) throw new OperationError("Χ4 start must be between 1 and 26"); - if (x5<1 || x5>23) throw new OperationError("Χ5 start must be between 1 and 23"); + if (s1 < 1 || s1 > 43) + throw new OperationError("Ψ1 start must be between 1 and 43"); + if (s2 < 1 || s2 > 47) + throw new OperationError("Ψ2 start must be between 1 and 47"); + if (s3 < 1 || s3 > 51) + throw new OperationError("Ψ3 start must be between 1 and 51"); + if (s4 < 1 || s4 > 53) + throw new OperationError("Ψ4 start must be between 1 and 53"); + if (s5 < 1 || s5 > 59) + throw new OperationError("Ψ5 start must be between 1 and 59"); + if (m37 < 1 || m37 > 37) + throw new OperationError("Μ37 start must be between 1 and 37"); + if (m61 < 1 || m61 > 61) + throw new OperationError("Μ61 start must be between 1 and 61"); + if (x1 < 1 || x1 > 41) + throw new OperationError("Χ1 start must be between 1 and 41"); + if (x2 < 1 || x2 > 31) + throw new OperationError("Χ2 start must be between 1 and 31"); + if (x3 < 1 || x3 > 29) + throw new OperationError("Χ3 start must be between 1 and 29"); + if (x4 < 1 || x4 > 26) + throw new OperationError("Χ4 start must be between 1 and 26"); + if (x5 < 1 || x5 > 23) + throw new OperationError("Χ5 start must be between 1 and 23"); // Initialise chosen wheel pattern let chosenSetting = ""; if (pattern === "Custom") { const re = new RegExp("^[.xX]*$"); - if (lugs1.length !== 43 || !re.test(lugs1)) throw new OperationError("Ψ1 custom lugs must be 43 long and can only include . or x "); - if (lugs2.length !== 47 || !re.test(lugs2)) throw new OperationError("Ψ2 custom lugs must be 47 long and can only include . or x"); - if (lugs3.length !== 51 || !re.test(lugs3)) throw new OperationError("Ψ3 custom lugs must be 51 long and can only include . or x"); - if (lugs4.length !== 53 || !re.test(lugs4)) throw new OperationError("Ψ4 custom lugs must be 53 long and can only include . or x"); - if (lugs5.length !== 59 || !re.test(lugs5)) throw new OperationError("Ψ5 custom lugs must be 59 long and can only include . or x"); - if (lugm37.length !== 37 || !re.test(lugm37)) throw new OperationError("M37 custom lugs must be 37 long and can only include . or x"); - if (lugm61.length !== 61 || !re.test(lugm61)) throw new OperationError("M61 custom lugs must be 61 long and can only include . or x"); - if (lugx1.length !== 41 || !re.test(lugx1)) throw new OperationError("Χ1 custom lugs must be 41 long and can only include . or x"); - if (lugx2.length !== 31 || !re.test(lugx2)) throw new OperationError("Χ2 custom lugs must be 31 long and can only include . or x"); - if (lugx3.length !== 29 || !re.test(lugx3)) throw new OperationError("Χ3 custom lugs must be 29 long and can only include . or x"); - if (lugx4.length !== 26 || !re.test(lugx4)) throw new OperationError("Χ4 custom lugs must be 26 long and can only include . or x"); - if (lugx5.length !== 23 || !re.test(lugx5)) throw new OperationError("Χ5 custom lugs must be 23 long and can only include . or x"); + if (lugs1.length !== 43 || !re.test(lugs1)) + throw new OperationError( + "Ψ1 custom lugs must be 43 long and can only include . or x ", + ); + if (lugs2.length !== 47 || !re.test(lugs2)) + throw new OperationError( + "Ψ2 custom lugs must be 47 long and can only include . or x", + ); + if (lugs3.length !== 51 || !re.test(lugs3)) + throw new OperationError( + "Ψ3 custom lugs must be 51 long and can only include . or x", + ); + if (lugs4.length !== 53 || !re.test(lugs4)) + throw new OperationError( + "Ψ4 custom lugs must be 53 long and can only include . or x", + ); + if (lugs5.length !== 59 || !re.test(lugs5)) + throw new OperationError( + "Ψ5 custom lugs must be 59 long and can only include . or x", + ); + if (lugm37.length !== 37 || !re.test(lugm37)) + throw new OperationError( + "M37 custom lugs must be 37 long and can only include . or x", + ); + if (lugm61.length !== 61 || !re.test(lugm61)) + throw new OperationError( + "M61 custom lugs must be 61 long and can only include . or x", + ); + if (lugx1.length !== 41 || !re.test(lugx1)) + throw new OperationError( + "Χ1 custom lugs must be 41 long and can only include . or x", + ); + if (lugx2.length !== 31 || !re.test(lugx2)) + throw new OperationError( + "Χ2 custom lugs must be 31 long and can only include . or x", + ); + if (lugx3.length !== 29 || !re.test(lugx3)) + throw new OperationError( + "Χ3 custom lugs must be 29 long and can only include . or x", + ); + if (lugx4.length !== 26 || !re.test(lugx4)) + throw new OperationError( + "Χ4 custom lugs must be 26 long and can only include . or x", + ); + if (lugx5.length !== 23 || !re.test(lugx5)) + throw new OperationError( + "Χ5 custom lugs must be 23 long and can only include . or x", + ); chosenSetting = INIT_PATTERNS["No Pattern"]; chosenSetting.S[1] = this.readLugs(lugs1); chosenSetting.S[2] = this.readLugs(lugs2); @@ -316,153 +363,155 @@ class Lorenz extends Operation { let thisPsi = []; let thisChi = []; - let m61lug = muSettings[1][m61-1]; - let m37lug = muSettings[2][m37-1]; + let m61lug = muSettings[1][m61 - 1]; + let m37lug = muSettings[2][m37 - 1]; const p5 = [0, 0, 0]; const self = this; - const letters = Array.prototype.map.call(ita2Input, function(character) { - const letter = character.toUpperCase(); + const letters = Array.prototype.map.call( + ita2Input, + function (character) { + const letter = character.toUpperCase(); - // Store lugs used in limitations, need these later - let x2bptr = x2+1; - if (x2bptr===32) x2bptr=1; - let s1bptr = s1+1; - if (s1bptr===44) s1bptr=1; + // Store lugs used in limitations, need these later + let x2bptr = x2 + 1; + if (x2bptr === 32) x2bptr = 1; + let s1bptr = s1 + 1; + if (s1bptr === 44) s1bptr = 1; - thisChi = [ - chiSettings[1][x1-1], - chiSettings[2][x2-1], - chiSettings[3][x3-1], - chiSettings[4][x4-1], - chiSettings[5][x5-1] - ]; + thisChi = [ + chiSettings[1][x1 - 1], + chiSettings[2][x2 - 1], + chiSettings[3][x3 - 1], + chiSettings[4][x4 - 1], + chiSettings[5][x5 - 1], + ]; - thisPsi = [ - psiSettings[1][s1-1], - psiSettings[2][s2-1], - psiSettings[3][s3-1], - psiSettings[4][s4-1], - psiSettings[5][s5-1] - ]; + thisPsi = [ + psiSettings[1][s1 - 1], + psiSettings[2][s2 - 1], + psiSettings[3][s3 - 1], + psiSettings[4][s4 - 1], + psiSettings[5][s5 - 1], + ]; - if (typeof ITA2_TABLE[letter] == "undefined") { - return ""; - } - - // The encipher calculation - - // We calculate Bitwise XOR for each of the 5 bits across our input ( K XOR Psi XOR Chi ) - const xorSum = []; - for (let i=0;i<=4;i++) { - xorSum[i] = ITA2_TABLE[letter][i] ^ thisPsi[i] ^ thisChi[i]; - } - const resultStr = xorSum.join(""); - - // Wheel movement - - // Chi wheels always move one back after each letter - if (--x1 < 1) x1 = 41; - if (--x2 < 1) x2 = 31; - if (--x3 < 1) x3 = 29; - if (--x4 < 1) x4 = 26; - if (--x5 < 1) x5 = 23; - - // Motor wheel (61 pin) also moves one each letter - if (--m61 < 1) m61 = 61; - - // If M61 is set, we also move M37 - if (m61lug === 1) { - if (--m37 < 1) m37 = 37; - } - - // Psi wheels only move sometimes, dependent on M37 current setting and limitations - - const basicmotor = m37lug; - let totalmotor; - let lim = 0; - - p5[2] = p5[1]; - p5[1] = p5[0]; - if (mode==="Send") { - p5[0] = parseInt(ITA2_TABLE[letter][4], 10); - } else { - p5[0] = parseInt(xorSum[4], 10); - } - - // Limitations here - if (model==="SZ42a") { - // Chi 2 one back lim - The active character of Chi 2 (2nd Chi wheel) in the previous position - lim = parseInt(chiSettings[2][x2bptr-1], 10); - if (kt) { - // p5 back 2 - if (lim===p5[2]) { - lim = 0; - } else { - lim=1; - } + if (typeof ITA2_TABLE[letter] == "undefined") { + return ""; } - // If basic motor = 0 and limitation = 1, Total motor = 0 [no move], otherwise, total motor = 1 [move] - if (basicmotor===0 && lim===1) { - totalmotor = 0; + // The encipher calculation + + // We calculate Bitwise XOR for each of the 5 bits across our input ( K XOR Psi XOR Chi ) + const xorSum = []; + for (let i = 0; i <= 4; i++) { + xorSum[i] = ITA2_TABLE[letter][i] ^ thisPsi[i] ^ thisChi[i]; + } + const resultStr = xorSum.join(""); + + // Wheel movement + + // Chi wheels always move one back after each letter + if (--x1 < 1) x1 = 41; + if (--x2 < 1) x2 = 31; + if (--x3 < 1) x3 = 29; + if (--x4 < 1) x4 = 26; + if (--x5 < 1) x5 = 23; + + // Motor wheel (61 pin) also moves one each letter + if (--m61 < 1) m61 = 61; + + // If M61 is set, we also move M37 + if (m61lug === 1) { + if (--m37 < 1) m37 = 37; + } + + // Psi wheels only move sometimes, dependent on M37 current setting and limitations + + const basicmotor = m37lug; + let totalmotor; + let lim = 0; + + p5[2] = p5[1]; + p5[1] = p5[0]; + if (mode === "Send") { + p5[0] = parseInt(ITA2_TABLE[letter][4], 10); } else { - totalmotor = 1; + p5[0] = parseInt(xorSum[4], 10); } - } else if (model==="SZ42b") { - // Chi 2 one back + Psi 1 one back. - const x2b1lug = parseInt(chiSettings[2][x2bptr-1], 10); - const s1b1lug = parseInt(psiSettings[1][s1bptr-1], 10); - lim = 1; - if (x2b1lug===s1b1lug) lim=0; - if (kt) { - // p5 back 2 - if (lim===p5[2]) { - lim=0; - } else { - lim=1; + // Limitations here + if (model === "SZ42a") { + // Chi 2 one back lim - The active character of Chi 2 (2nd Chi wheel) in the previous position + lim = parseInt(chiSettings[2][x2bptr - 1], 10); + if (kt) { + // p5 back 2 + if (lim === p5[2]) { + lim = 0; + } else { + lim = 1; + } } - } - // If basic motor = 0 and limitation = 1, Total motor = 0 [no move], otherwise, total motor = 1 [move] - if (basicmotor===0 && lim===1) { - totalmotor = 0; + + // If basic motor = 0 and limitation = 1, Total motor = 0 [no move], otherwise, total motor = 1 [move] + if (basicmotor === 0 && lim === 1) { + totalmotor = 0; + } else { + totalmotor = 1; + } + } else if (model === "SZ42b") { + // Chi 2 one back + Psi 1 one back. + const x2b1lug = parseInt(chiSettings[2][x2bptr - 1], 10); + const s1b1lug = parseInt(psiSettings[1][s1bptr - 1], 10); + lim = 1; + if (x2b1lug === s1b1lug) lim = 0; + if (kt) { + // p5 back 2 + if (lim === p5[2]) { + lim = 0; + } else { + lim = 1; + } + } + // If basic motor = 0 and limitation = 1, Total motor = 0 [no move], otherwise, total motor = 1 [move] + if (basicmotor === 0 && lim === 1) { + totalmotor = 0; + } else { + totalmotor = 1; + } + } else if (model === "SZ40") { + // SZ40 - just move based on the M37 motor wheel + totalmotor = basicmotor; } else { - totalmotor = 1; + throw new OperationError( + "Lorenz model type not recognised", + ); } - } else if (model==="SZ40") { - // SZ40 - just move based on the M37 motor wheel - totalmotor = basicmotor; - } else { - throw new OperationError("Lorenz model type not recognised"); - } + // Move the Psi wheels when current totalmotor active + if (totalmotor === 1) { + if (--s1 < 1) s1 = 43; + if (--s2 < 1) s2 = 47; + if (--s3 < 1) s3 = 51; + if (--s4 < 1) s4 = 53; + if (--s5 < 1) s5 = 59; + } - // Move the Psi wheels when current totalmotor active - if (totalmotor === 1) { - if (--s1 < 1) s1 = 43; - if (--s2 < 1) s2 = 47; - if (--s3 < 1) s3 = 51; - if (--s4 < 1) s4 = 53; - if (--s5 < 1) s5 = 59; - } + m61lug = muSettings[1][m61 - 1]; + m37lug = muSettings[2][m37 - 1]; - m61lug = muSettings[1][m61-1]; - m37lug = muSettings[2][m37-1]; - - let rtnstr = self.REVERSE_ITA2_TABLE[resultStr]; - if (format==="5/8/9") { - if (rtnstr==="+") rtnstr="5"; // + or 5 used to represent figure shift - if (rtnstr==="-") rtnstr="8"; // - or 8 used to represent letter shift - if (rtnstr===".") rtnstr="9"; // . or 9 used to represent space - } - return rtnstr; - }); + let rtnstr = self.REVERSE_ITA2_TABLE[resultStr]; + if (format === "5/8/9") { + if (rtnstr === "+") rtnstr = "5"; // + or 5 used to represent figure shift + if (rtnstr === "-") rtnstr = "8"; // - or 8 used to represent letter shift + if (rtnstr === ".") rtnstr = "9"; // . or 9 used to represent space + } + return rtnstr; + }, + ); const ita2output = letters.join(""); return this.convertFromITA2(ita2output, outtype, mode); - } /** @@ -486,8 +535,8 @@ class Lorenz extends Operation { * Read lugs settings - convert to 0|1 */ readLugs(lugstr) { - const arr = Array.prototype.map.call(lugstr, function(lug) { - if (lug===".") { + const arr = Array.prototype.map.call(lugstr, function (lug) { + if (lug === ".") { return 0; } else { return 1; @@ -510,13 +559,18 @@ class Lorenz extends Operation { if (intype === "ITA2" || mode === "Receive") { if (validITA2.indexOf(letter) === -1) { let errltr = letter; - if (errltr==="\n") errltr = "Carriage Return"; - if (errltr===" ") errltr = "Space"; - throw new OperationError("Invalid ITA2 character : "+errltr); + if (errltr === "\n") errltr = "Carriage Return"; + if (errltr === " ") errltr = "Space"; + throw new OperationError( + "Invalid ITA2 character : " + errltr, + ); } result += letter; } else { - if (validChars.indexOf(letter) === -1) throw new OperationError("Invalid Plaintext character : "+letter); + if (validChars.indexOf(letter) === -1) + throw new OperationError( + "Invalid Plaintext character : " + letter, + ); if (!figShifted && figShiftedChars.indexOf(letter) !== -1) { // in letters mode and next char needs to be figure shifted @@ -524,9 +578,9 @@ class Lorenz extends Operation { result += "55" + figShiftArr[letter]; } else if (figShifted) { // in figures mode and next char needs to be letter shifted - if (letter==="\n") { + if (letter === "\n") { result += "34"; - } else if (letter==="\r") { + } else if (letter === "\r") { result += "4"; } else if (figShiftedChars.indexOf(letter) === -1) { figShifted = false; @@ -534,19 +588,16 @@ class Lorenz extends Operation { } else { result += figShiftArr[letter]; } - } else { - if (letter==="\n") { + if (letter === "\n") { result += "34"; - } else if (letter==="\r") { + } else if (letter === "\r") { result += "4"; } else { result += letter; } } - } - } return result; @@ -560,10 +611,8 @@ class Lorenz extends Operation { let figShifted = false; for (const letter of input) { if (mode === "Receive") { - // Convert output ITA2 to plaintext (including figure/letter shifts) if (outtype === "Plaintext") { - if (letter === "5" || letter === "+") { figShifted = true; } else if (letter === "8" || letter === "-") { @@ -577,67 +626,61 @@ class Lorenz extends Operation { } else if (letter === "/") { result += "/"; } else { - if (figShifted) { result += this.REVERSE_FIGSHIFT_TABLE[letter]; } else { result += letter; } - } - } else { result += letter; } - } else { result += letter; } } return result; - } - } const ITA2_TABLE = { - "A": "11000", - "B": "10011", - "C": "01110", - "D": "10010", - "E": "10000", - "F": "10110", - "G": "01011", - "H": "00101", - "I": "01100", - "J": "11010", - "K": "11110", - "L": "01001", - "M": "00111", - "N": "00110", - "O": "00011", - "P": "01101", - "Q": "11101", - "R": "01010", - "S": "10100", - "T": "00001", - "U": "11100", - "V": "01111", - "W": "11001", - "X": "10111", - "Y": "10101", - "Z": "10001", - "3": "00010", - "4": "01000", - "9": "00100", + A: "11000", + B: "10011", + C: "01110", + D: "10010", + E: "10000", + F: "10110", + G: "01011", + H: "00101", + I: "01100", + J: "11010", + K: "11110", + L: "01001", + M: "00111", + N: "00110", + O: "00011", + P: "01101", + Q: "11101", + R: "01010", + S: "10100", + T: "00001", + U: "11100", + V: "01111", + W: "11001", + X: "10111", + Y: "10101", + Z: "10001", + 3: "00010", + 4: "01000", + 9: "00100", "/": "00000", " ": "00100", ".": "00100", - "8": "11111", - "5": "11011", + 8: "11111", + 5: "11011", "-": "11111", - "+": "11011" + "+": "11011", }; const validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-'()/:=?,. \n\r"; @@ -645,16 +688,16 @@ const validITA2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ34589+-./"; const figShiftedChars = "1234567890+-'()/:=?,."; const figShiftArr = { - "1": "Q", - "2": "W", - "3": "E", - "4": "R", - "5": "T", - "6": "Y", - "7": "U", - "8": "I", - "9": "O", - "0": "P", + 1: "Q", + 2: "W", + 3: "E", + 4: "R", + 5: "T", + 6: "Y", + 7: "U", + 8: "I", + 9: "O", + 0: "P", " ": "9", "-": "A", "?": "B", @@ -673,91 +716,258 @@ const figShiftArr = { "/": "X", "+": "Z", "\n": "3", - "\r": "4" + "\r": "4", }; const INIT_PATTERNS = { "No Pattern": { - "X": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 5: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + X: { + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + 2: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + 3: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + ], + 4: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + ], + 5: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + ], }, - "S": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 5: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + S: { + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + ], + 2: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + ], + 3: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + 4: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + 5: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }, + M: { + 1: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + 2: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], }, - "M": { - 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, "KH Pattern": { - "X": { - 1: [0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0], - 2: [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0], - 3: [0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0], - 4: [1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0], - 5: [1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0] + X: { + 1: [ + 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, + 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, + ], + 2: [ + 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, + 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, + ], + 3: [ + 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, + 0, 0, 1, 1, 0, 1, 1, 0, + ], + 4: [ + 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, + 0, 0, 1, 0, 0, + ], + 5: [ + 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, + ], }, - "S": { - 1: [0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1], - 2: [0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1], - 3: [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1], - 4: [0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], - 5: [1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0] + S: { + 1: [ + 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, + 1, + ], + 2: [ + 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, + 0, 1, 0, 0, 1, + ], + 3: [ + 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, + 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, + 1, 1, 0, 0, 1, 0, 1, 0, 1, + ], + 4: [ + 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, + 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + ], + 5: [ + 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, + ], + }, + M: { + 1: [ + 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, + ], + 2: [ + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, + 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + ], }, - "M": { - 1: [0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0], - 2: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0] - } }, - "ZMUG Pattern": { - "X": { - 1: [0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0], - 2: [1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0], - 3: [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0], - 4: [1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1], - 5: [0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1] + "ZMUG Pattern": { + X: { + 1: [ + 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, + ], + 2: [ + 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, + 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, + ], + 3: [ + 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 1, 1, 0, 1, 1, 1, 1, 0, + ], + 4: [ + 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, + 0, 0, 1, 0, 1, + ], + 5: [ + 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, + 0, 1, + ], }, - "S": { - 1: [1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0], - 2: [0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1], - 3: [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1], - 4: [0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1], - 5: [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0] + S: { + 1: [ + 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, + ], + 2: [ + 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, + 0, 1, 0, 1, 1, + ], + 3: [ + 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, + 0, 0, 1, 1, 0, 0, 1, 1, 1, + ], + 4: [ + 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, + 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, + ], + 5: [ + 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, + ], + }, + M: { + 1: [ + 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, + 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, + ], + 2: [ + 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, + 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, + ], }, - "M": { - 1: [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1], - 2: [0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1] - } }, "BREAM Pattern": { - "X": { - 1: [0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0], - 2: [0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1], - 3: [1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0], - 4: [1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0], - 5: [0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0] + X: { + 1: [ + 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, + 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, + ], + 2: [ + 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, + 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, + ], + 3: [ + 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 1, 1, 0, 1, 1, 1, 0, 0, + ], + 4: [ + 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, + 0, 1, 1, 0, 0, + ], + 5: [ + 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, + 1, 0, + ], }, - "S": { - 1: [0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0], - 2: [1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0], - 3: [1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], - 4: [0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1], - 5: [1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0] + S: { + 1: [ + 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, + 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, + ], + 2: [ + 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, + 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 1, 0, 1, 0, 0, + ], + 3: [ + 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, + ], + 4: [ + 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, + 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, + ], + 5: [ + 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + ], }, - "M": { - 1: [1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1], - 2: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1] - } - } + M: { + 1: [ + 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, + ], + 2: [ + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, + ], + }, + }, }; export default Lorenz; diff --git a/src/core/operations/LuhnChecksum.mjs b/src/core/operations/LuhnChecksum.mjs index cb3a7c24..bea66f52 100644 --- a/src/core/operations/LuhnChecksum.mjs +++ b/src/core/operations/LuhnChecksum.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Luhn Checksum operation */ class LuhnChecksum extends Operation { - /** * LuhnChecksum constructor */ @@ -20,7 +19,8 @@ class LuhnChecksum extends Operation { this.name = "Luhn Checksum"; this.module = "Default"; - this.description = "The Luhn algorithm, also known as the modulus 10 or mod 10 algorithm, is a simple checksum formula used to validate a variety of identification numbers, such as credit card numbers, IMEI numbers and Canadian Social Insurance Numbers."; + this.description = + "The Luhn algorithm, also known as the modulus 10 or mod 10 algorithm, is a simple checksum formula used to validate a variety of identification numbers, such as credit card numbers, IMEI numbers and Canadian Social Insurance Numbers."; this.infoURL = "https://wikipedia.org/wiki/Luhn_algorithm"; this.inputType = "string"; this.outputType = "string"; @@ -35,24 +35,31 @@ class LuhnChecksum extends Operation { */ checksum(inputStr) { let even = false; - return inputStr.split("").reverse().reduce((acc, elem) => { - // Convert element to integer. - let temp = parseInt(elem, 10); + return ( + inputStr + .split("") + .reverse() + .reduce((acc, elem) => { + // Convert element to integer. + let temp = parseInt(elem, 10); - // If element is not an integer. - if (isNaN(temp)) - throw new OperationError("Character: " + elem + " is not a digit."); + // If element is not an integer. + if (isNaN(temp)) + throw new OperationError( + "Character: " + elem + " is not a digit.", + ); - // If element is in an even position - if (even) { - // Double the element and add the quotient and remainder together. - temp = 2 * elem; - temp = Math.floor(temp/10) + (temp % 10); - } + // If element is in an even position + if (even) { + // Double the element and add the quotient and remainder together. + temp = 2 * elem; + temp = Math.floor(temp / 10) + (temp % 10); + } - even = !even; - return acc + temp; - }, 0) % 10; + even = !even; + return acc + temp; + }, 0) % 10 + ); } /** @@ -65,13 +72,12 @@ class LuhnChecksum extends Operation { const checkSum = this.checksum(input); let checkDigit = this.checksum(input + "0"); - checkDigit = checkDigit === 0 ? 0 : (10-checkDigit); + checkDigit = checkDigit === 0 ? 0 : 10 - checkDigit; return `Checksum: ${checkSum} Checkdigit: ${checkDigit} Luhn Validated String: ${input + "" + checkDigit}`; } - } export default LuhnChecksum; diff --git a/src/core/operations/MD2.mjs b/src/core/operations/MD2.mjs index 38f6d325..0bb702cc 100644 --- a/src/core/operations/MD2.mjs +++ b/src/core/operations/MD2.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * MD2 operation */ class MD2 extends Operation { - /** * MD2 constructor */ @@ -20,7 +19,8 @@ class MD2 extends Operation { this.name = "MD2"; this.module = "Crypto"; - this.description = "The MD2 (Message-Digest 2) algorithm is a cryptographic hash function developed by Ronald Rivest in 1989. The algorithm is optimized for 8-bit computers.

          Although MD2 is no longer considered secure, even as of 2014, it remains in use in public key infrastructures as part of certificates generated with MD2 and RSA. The message digest algorithm consists, by default, of 18 rounds."; + this.description = + "The MD2 (Message-Digest 2) algorithm is a cryptographic hash function developed by Ronald Rivest in 1989. The algorithm is optimized for 8-bit computers.

          Although MD2 is no longer considered secure, even as of 2014, it remains in use in public key infrastructures as part of certificates generated with MD2 and RSA. The message digest algorithm consists, by default, of 18 rounds."; this.infoURL = "https://wikipedia.org/wiki/MD2_(cryptography)"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -29,8 +29,8 @@ class MD2 extends Operation { name: "Rounds", type: "number", value: 18, - min: 0 - } + min: 0, + }, ]; } @@ -40,9 +40,8 @@ class MD2 extends Operation { * @returns {string} */ run(input, args) { - return runHash("md2", input, {rounds: args[0]}); + return runHash("md2", input, { rounds: args[0] }); } - } export default MD2; diff --git a/src/core/operations/MD4.mjs b/src/core/operations/MD4.mjs index 381528cc..d2b102bf 100644 --- a/src/core/operations/MD4.mjs +++ b/src/core/operations/MD4.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * MD4 operation */ class MD4 extends Operation { - /** * MD4 constructor */ @@ -20,7 +19,8 @@ class MD4 extends Operation { this.name = "MD4"; this.module = "Crypto"; - this.description = "The MD4 (Message-Digest 4) algorithm is a cryptographic hash function developed by Ronald Rivest in 1990. The digest length is 128 bits. The algorithm has influenced later designs, such as the MD5, SHA-1 and RIPEMD algorithms.

          The security of MD4 has been severely compromised."; + this.description = + "The MD4 (Message-Digest 4) algorithm is a cryptographic hash function developed by Ronald Rivest in 1990. The digest length is 128 bits. The algorithm has influenced later designs, such as the MD5, SHA-1 and RIPEMD algorithms.

          The security of MD4 has been severely compromised."; this.infoURL = "https://wikipedia.org/wiki/MD4"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -35,7 +35,6 @@ class MD4 extends Operation { run(input, args) { return runHash("md4", input); } - } export default MD4; diff --git a/src/core/operations/MD5.mjs b/src/core/operations/MD5.mjs index f55edaf5..35cffa9d 100644 --- a/src/core/operations/MD5.mjs +++ b/src/core/operations/MD5.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * MD5 operation */ class MD5 extends Operation { - /** * MD5 constructor */ @@ -20,7 +19,8 @@ class MD5 extends Operation { this.name = "MD5"; this.module = "Crypto"; - this.description = "MD5 (Message-Digest 5) is a widely used hash function. It has been used in a variety of security applications and is also commonly used to check the integrity of files.

          However, MD5 is not collision resistant and it isn't suitable for applications like SSL/TLS certificates or digital signatures that rely on this property."; + this.description = + "MD5 (Message-Digest 5) is a widely used hash function. It has been used in a variety of security applications and is also commonly used to check the integrity of files.

          However, MD5 is not collision resistant and it isn't suitable for applications like SSL/TLS certificates or digital signatures that rely on this property."; this.infoURL = "https://wikipedia.org/wiki/MD5"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -35,7 +35,6 @@ class MD5 extends Operation { run(input, args) { return runHash("md5", input); } - } export default MD5; diff --git a/src/core/operations/MD6.mjs b/src/core/operations/MD6.mjs index 0ab13ffe..5600ee67 100644 --- a/src/core/operations/MD6.mjs +++ b/src/core/operations/MD6.mjs @@ -12,7 +12,6 @@ import NodeMD6 from "node-md6"; * MD6 operation */ class MD6 extends Operation { - /** * MD6 constructor */ @@ -21,26 +20,27 @@ class MD6 extends Operation { this.name = "MD6"; this.module = "Crypto"; - this.description = "The MD6 (Message-Digest 6) algorithm is a cryptographic hash function. It uses a Merkle tree-like structure to allow for immense parallel computation of hashes for very long inputs."; + this.description = + "The MD6 (Message-Digest 6) algorithm is a cryptographic hash function. It uses a Merkle tree-like structure to allow for immense parallel computation of hashes for very long inputs."; this.infoURL = "https://wikipedia.org/wiki/MD6"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Size", - "type": "number", - "value": 256 + name: "Size", + type: "number", + value: 256, }, { - "name": "Levels", - "type": "number", - "value": 64 + name: "Levels", + type: "number", + value: 64, }, { - "name": "Key", - "type": "string", - "value": "" - } + name: "Key", + type: "string", + value: "", + }, ]; } @@ -59,7 +59,6 @@ class MD6 extends Operation { return NodeMD6.getHashOfText(input, size, key, levels); } - } export default MD6; diff --git a/src/core/operations/Magic.mjs b/src/core/operations/Magic.mjs index 69cad1db..cf6d9df0 100644 --- a/src/core/operations/Magic.mjs +++ b/src/core/operations/Magic.mjs @@ -13,7 +13,6 @@ import MagicLib from "../lib/Magic.mjs"; * Magic operation */ class Magic extends Operation { - /** * Magic constructor */ @@ -23,32 +22,34 @@ class Magic extends Operation { this.name = "Magic"; this.flowControl = true; this.module = "Default"; - this.description = "The Magic operation attempts to detect various properties of the input data and suggests which operations could help to make more sense of it.

          Options
          Depth: If an operation appears to match the data, it will be run and the result will be analysed further. This argument controls the maximum number of levels of recursion.

          Intensive mode: When this is turned on, various operations like XOR, bit rotates, and character encodings are brute-forced to attempt to detect valid data underneath. To improve performance, only the first 100 bytes of the data is brute-forced.

          Extensive language support: At each stage, the relative byte frequencies of the data will be compared to average frequencies for a number of languages. The default set consists of ~40 of the most commonly used languages on the Internet. The extensive list consists of 284 languages and can result in many languages matching the data if their byte frequencies are similar.

          Optionally enter a regular expression to match a string you expect to find to filter results (crib)."; - this.infoURL = "https://github.com/gchq/CyberChef/wiki/Automatic-detection-of-encoded-data-using-CyberChef-Magic"; + this.description = + "The Magic operation attempts to detect various properties of the input data and suggests which operations could help to make more sense of it.

          Options
          Depth: If an operation appears to match the data, it will be run and the result will be analysed further. This argument controls the maximum number of levels of recursion.

          Intensive mode: When this is turned on, various operations like XOR, bit rotates, and character encodings are brute-forced to attempt to detect valid data underneath. To improve performance, only the first 100 bytes of the data is brute-forced.

          Extensive language support: At each stage, the relative byte frequencies of the data will be compared to average frequencies for a number of languages. The default set consists of ~40 of the most commonly used languages on the Internet. The extensive list consists of 284 languages and can result in many languages matching the data if their byte frequencies are similar.

          Optionally enter a regular expression to match a string you expect to find to filter results (crib)."; + this.infoURL = + "https://github.com/gchq/CyberChef/wiki/Automatic-detection-of-encoded-data-using-CyberChef-Magic"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; this.presentType = "html"; this.args = [ { - "name": "Depth", - "type": "number", - "value": 3 + name: "Depth", + type: "number", + value: 3, }, { - "name": "Intensive mode", - "type": "boolean", - "value": false + name: "Intensive mode", + type: "boolean", + value: false, }, { - "name": "Extensive language support", - "type": "boolean", - "value": false + name: "Extensive language support", + type: "boolean", + value: false, }, { - "name": "Crib (known plaintext string or regex)", - "type": "string", - "value": "" - } + name: "Crib (known plaintext string or regex)", + type: "string", + value: "", + }, ]; } @@ -64,12 +65,19 @@ class Magic extends Operation { [depth, intensive, extLang, crib] = ings, dish = state.dish, magic = new MagicLib(await dish.get(Dish.ARRAY_BUFFER)), - cribRegex = (crib && crib.length) ? new RegExp(crib, "i") : null; - let options = await magic.speculativeExecution(depth, extLang, intensive, [], false, cribRegex); + cribRegex = crib && crib.length ? new RegExp(crib, "i") : null; + let options = await magic.speculativeExecution( + depth, + extLang, + intensive, + [], + false, + cribRegex, + ); // Filter down to results which matched the crib if (cribRegex) { - options = options.filter(option => option.matchesCrib); + options = options.filter((option) => option.matchesCrib); } // Record the current state for use when presenting @@ -86,7 +94,7 @@ class Magic extends Operation { * @returns {html} */ present(options) { - const currentRecipeConfig = this.state.opList.map(op => op.config); + const currentRecipeConfig = this.state.opList.map((op) => op.config); let output = ` { + options.forEach((option) => { // Construct recipe URL // Replace this Magic op with the generated recipe - const recipeConfig = currentRecipeConfig.slice(0, this.state.progress) + const recipeConfig = currentRecipeConfig + .slice(0, this.state.progress) .concat(option.recipe) .concat(currentRecipeConfig.slice(this.state.progress + 1)), - recipeURL = "recipe=" + Utils.encodeURIFragment(Utils.generatePrettyRecipe(recipeConfig)); + recipeURL = + "recipe=" + + Utils.encodeURIFragment( + Utils.generatePrettyRecipe(recipeConfig), + ); let language = "", fileType = "", matchingOps = "", useful = ""; - const entropy = `Entropy: ${option.entropy.toFixed(2)}`, - validUTF8 = option.isUTF8 ? "Valid UTF8\n" : ""; + const entropy = `Entropy: ${option.entropy.toFixed(2)}`, + validUTF8 = option.isUTF8 + ? "Valid UTF8\n" + : ""; if (option.languageScores[0].probability > 0) { - let likelyLangs = option.languageScores.filter(l => l.probability > 0); - if (likelyLangs.length < 1) likelyLangs = [option.languageScores[0]]; - language = "" + + let likelyLangs = option.languageScores.filter( + (l) => l.probability > 0, + ); + if (likelyLangs.length < 1) + likelyLangs = [option.languageScores[0]]; + language = + "" + "Possible languages:\n " + - likelyLangs.map(lang => { - return MagicLib.codeToLanguage(lang.lang); - }).join("\n ") + + likelyLangs + .map((lang) => { + return MagicLib.codeToLanguage(lang.lang); + }) + .join("\n ") + "\n"; } @@ -140,29 +163,38 @@ class Magic extends Operation { } if (option.matchingOps.length) { - matchingOps = `Matching ops: ${[...new Set(option.matchingOps.map(op => op.op))].join(", ")}\n`; + matchingOps = `Matching ops: ${[ + ...new Set(option.matchingOps.map((op) => op.op)), + ].join(", ")}\n`; } if (option.useful) { - useful = "Useful op detected\n"; + useful = + "Useful op detected\n"; } output += ` - - + + `; }); - output += "
          ${Utils.generatePrettyRecipe(option.recipe, true)}${Utils.escapeHtml(Utils.escapeWhitespace(Utils.truncate(option.data, 99)))}${Utils.generatePrettyRecipe( + option.recipe, + true, + )}${Utils.escapeHtml( + Utils.escapeWhitespace(Utils.truncate(option.data, 99)), + )} ${language}${fileType}${matchingOps}${useful}${validUTF8}${entropy}
          "; + output += + ""; if (!options.length) { - output = "Nothing of interest could be detected about the input data.\nHave you tried modifying the operation arguments?"; + output = + "Nothing of interest could be detected about the input data.\nHave you tried modifying the operation arguments?"; } return output; } - } export default Magic; diff --git a/src/core/operations/Mean.mjs b/src/core/operations/Mean.mjs index ee826201..f3fd6573 100644 --- a/src/core/operations/Mean.mjs +++ b/src/core/operations/Mean.mjs @@ -14,7 +14,6 @@ import BigNumber from "bignumber.js"; * Mean operation */ class Mean extends Operation { - /** * Mean constructor */ @@ -23,16 +22,17 @@ class Mean extends Operation { this.name = "Mean"; this.module = "Default"; - this.description = "Computes the mean (average) of a number list. If an item in the string is not a number it is excluded from the list.

          e.g. 0x0a 8 .5 .5 becomes 4.75"; + this.description = + "Computes the mean (average) of a number list. If an item in the string is not a number it is excluded from the list.

          e.g. 0x0a 8 .5 .5 becomes 4.75"; this.infoURL = "https://wikipedia.org/wiki/Arithmetic_mean"; this.inputType = "string"; this.outputType = "BigNumber"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, - } + name: "Delimiter", + type: "option", + value: ARITHMETIC_DELIM_OPTIONS, + }, ]; } @@ -45,7 +45,6 @@ class Mean extends Operation { const val = mean(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Mean; diff --git a/src/core/operations/Median.mjs b/src/core/operations/Median.mjs index 4ec9eceb..e081cb82 100644 --- a/src/core/operations/Median.mjs +++ b/src/core/operations/Median.mjs @@ -14,7 +14,6 @@ import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; * Median operation */ class Median extends Operation { - /** * Median constructor */ @@ -23,16 +22,17 @@ class Median extends Operation { this.name = "Median"; this.module = "Default"; - this.description = "Computes the median of a number list. If an item in the string is not a number it is excluded from the list.

          e.g. 0x0a 8 1 .5 becomes 4.5"; + this.description = + "Computes the median of a number list. If an item in the string is not a number it is excluded from the list.

          e.g. 0x0a 8 1 .5 becomes 4.5"; this.infoURL = "https://wikipedia.org/wiki/Median"; this.inputType = "string"; this.outputType = "BigNumber"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, - } + name: "Delimiter", + type: "option", + value: ARITHMETIC_DELIM_OPTIONS, + }, ]; } @@ -45,7 +45,6 @@ class Median extends Operation { const val = median(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Median; diff --git a/src/core/operations/Merge.mjs b/src/core/operations/Merge.mjs index 573e62e0..fceaf9e3 100644 --- a/src/core/operations/Merge.mjs +++ b/src/core/operations/Merge.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Merge operation */ class Merge extends Operation { - /** * Merge constructor */ @@ -20,7 +19,8 @@ class Merge extends Operation { this.name = "Merge"; this.flowControl = true; this.module = "Default"; - this.description = "Consolidate all branches back into a single trunk. The opposite of Fork. Unticking the Merge All checkbox will only consolidate all branches up to the nearest Fork/Subsection."; + this.description = + "Consolidate all branches back into a single trunk. The opposite of Fork. Unticking the Merge All checkbox will only consolidate all branches up to the nearest Fork/Subsection."; this.inputType = "string"; this.outputType = "string"; this.args = [ @@ -28,7 +28,7 @@ class Merge extends Operation { name: "Merge All", type: "boolean", value: true, - } + }, ]; } @@ -44,7 +44,6 @@ class Merge extends Operation { // merge when it sees this operation. return state; } - } export default Merge; diff --git a/src/core/operations/MicrosoftScriptDecoder.mjs b/src/core/operations/MicrosoftScriptDecoder.mjs index 3e59e95e..08d6fbb4 100644 --- a/src/core/operations/MicrosoftScriptDecoder.mjs +++ b/src/core/operations/MicrosoftScriptDecoder.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Microsoft Script Decoder operation */ class MicrosoftScriptDecoder extends Operation { - /** * MicrosoftScriptDecoder constructor */ @@ -19,7 +18,8 @@ class MicrosoftScriptDecoder extends Operation { this.name = "Microsoft Script Decoder"; this.module = "Default"; - this.description = "Decodes Microsoft Encoded Script files that have been encoded with Microsoft's custom encoding. These are often VBS (Visual Basic Script) files that are encoded and renamed with a '.vbe' extention or JS (JScript) files renamed with a '.jse' extention.

          Sample

          Encoded:
          #@~^RQAAAA==-mD~sX|:/TP{~J:+dYbxL~@!F@*@!+@*@!&@*eEI@#@&@#@&.jm.raY 214Wv:zms/obI0xEAAA==^#~@

          Decoded:
          var my_msg = "Testing <1><2><3>!";\n\nVScript.Echo(my_msg);"; + this.description = + "Decodes Microsoft Encoded Script files that have been encoded with Microsoft's custom encoding. These are often VBS (Visual Basic Script) files that are encoded and renamed with a '.vbe' extention or JS (JScript) files renamed with a '.jse' extention.

          Sample

          Encoded:
          #@~^RQAAAA==-mD~sX|:/TP{~J:+dYbxL~@!F@*@!+@*@!&@*eEI@#@&@#@&.jm.raY 214Wv:zms/obI0xEAAA==^#~@

          Decoded:
          var my_msg = "Testing <1><2><3>!";\n\nVScript.Echo(my_msg);"; this.infoURL = "https://wikipedia.org/wiki/JScript.Encode"; this.inputType = "string"; this.outputType = "string"; @@ -28,8 +28,8 @@ class MicrosoftScriptDecoder extends Operation { { pattern: "#@~\\^.{6}==(.+).{6}==\\^#~@", flags: "i", - args: [] - } + args: [], + }, ]; } @@ -60,7 +60,8 @@ class MicrosoftScriptDecoder extends Operation { static _decode(data) { const result = []; let index = -1; - data = data.replace(/@&/g, String.fromCharCode(10)) + data = data + .replace(/@&/g, String.fromCharCode(10)) .replace(/@#/g, String.fromCharCode(13)) .replace(/@\*/g, ">") .replace(/@!/g, "<") @@ -73,17 +74,18 @@ class MicrosoftScriptDecoder extends Operation { index++; } - if ((byte === 9 || byte > 31 && byte < 128) && + if ( + (byte === 9 || (byte > 31 && byte < 128)) && byte !== 60 && byte !== 62 && - byte !== 64) { + byte !== 64 + ) { char = D_DECODE[byte].charAt(D_COMBINATION[index % 64]); } result.push(char); } return result.join(""); } - } const D_DECODE = [ @@ -214,12 +216,13 @@ const D_DECODE = [ "\x60\x5F\x4B", "\x51\x4F\x5A", "\x20\x42\x2C", - "\x36\x65\x57" + "\x36\x65\x57", ]; const D_COMBINATION = [ - 0, 1, 2, 0, 1, 2, 1, 2, 2, 1, 2, 1, 0, 2, 1, 2, 0, 2, 1, 2, 0, 0, 1, 2, 2, 1, 0, 2, 1, 2, 2, 1, - 0, 0, 2, 1, 2, 1, 2, 0, 2, 0, 0, 1, 2, 0, 2, 1, 0, 2, 1, 2, 0, 0, 1, 2, 2, 0, 0, 1, 2, 0, 2, 1 + 0, 1, 2, 0, 1, 2, 1, 2, 2, 1, 2, 1, 0, 2, 1, 2, 0, 2, 1, 2, 0, 0, 1, 2, 2, + 1, 0, 2, 1, 2, 2, 1, 0, 0, 2, 1, 2, 1, 2, 0, 2, 0, 0, 1, 2, 0, 2, 1, 0, 2, + 1, 2, 0, 0, 1, 2, 2, 0, 0, 1, 2, 0, 2, 1, ]; export default MicrosoftScriptDecoder; diff --git a/src/core/operations/MultipleBombe.mjs b/src/core/operations/MultipleBombe.mjs index 1af471c2..c021a5e1 100644 --- a/src/core/operations/MultipleBombe.mjs +++ b/src/core/operations/MultipleBombe.mjs @@ -10,10 +10,14 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import { BombeMachine } from "../lib/Bombe.mjs"; -import { ROTORS, ROTORS_FOURTH, REFLECTORS, Reflector } from "../lib/Enigma.mjs"; +import { + ROTORS, + ROTORS_FOURTH, + REFLECTORS, + Reflector, +} from "../lib/Enigma.mjs"; import { isWorkerEnvironment } from "../Utils.mjs"; - /** * Convenience method for flattening the preset ROTORS object into a newline-separated string. * @param {Object[]} - Preset rotors object @@ -37,7 +41,7 @@ function rotorsFormat(rotors, s, n) { */ function choose(n, k) { let res = 1; - for (let i=1; i<=k; i++) { + for (let i = 1; i <= k; i++) { res *= (n + 1 - i) / i; } return res; @@ -55,85 +59,86 @@ class MultipleBombe extends Operation { this.name = "Multiple Bombe"; this.module = "Bletchley"; - this.description = "Emulation of the Bombe machine used to attack Enigma. This version carries out multiple Bombe runs to handle unknown rotor configurations.

          You should test your menu on the single Bombe operation before running it here. See the description of the Bombe operation for instructions on choosing a crib.

          More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; + this.description = + "Emulation of the Bombe machine used to attack Enigma. This version carries out multiple Bombe runs to handle unknown rotor configurations.

          You should test your menu on the single Bombe operation before running it here. See the description of the Bombe operation for instructions on choosing a crib.

          More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; this.infoURL = "https://wikipedia.org/wiki/Bombe"; this.inputType = "string"; this.outputType = "JSON"; this.presentType = "html"; this.args = [ { - "name": "Standard Enigmas", - "type": "populateMultiOption", - "value": [ + name: "Standard Enigmas", + type: "populateMultiOption", + value: [ { name: "German Service Enigma (First - 3 rotor)", value: [ rotorsFormat(ROTORS, 0, 5), "", - rotorsFormat(REFLECTORS, 0, 1) - ] + rotorsFormat(REFLECTORS, 0, 1), + ], }, { name: "German Service Enigma (Second - 3 rotor)", value: [ rotorsFormat(ROTORS, 0, 8), "", - rotorsFormat(REFLECTORS, 0, 2) - ] + rotorsFormat(REFLECTORS, 0, 2), + ], }, { name: "German Service Enigma (Third - 4 rotor)", value: [ rotorsFormat(ROTORS, 0, 8), rotorsFormat(ROTORS_FOURTH, 1, 2), - rotorsFormat(REFLECTORS, 2, 3) - ] + rotorsFormat(REFLECTORS, 2, 3), + ], }, { name: "German Service Enigma (Fourth - 4 rotor)", value: [ rotorsFormat(ROTORS, 0, 8), rotorsFormat(ROTORS_FOURTH, 1, 3), - rotorsFormat(REFLECTORS, 2, 4) - ] + rotorsFormat(REFLECTORS, 2, 4), + ], }, { name: "User defined", - value: ["", "", ""] + value: ["", "", ""], }, ], - "target": [1, 2, 3] + target: [1, 2, 3], }, { name: "Main rotors", type: "text", - value: "" + value: "", }, { name: "4th rotor", type: "text", - value: "" + value: "", }, { name: "Reflectors", type: "text", - value: "" + value: "", }, { name: "Crib", type: "string", - value: "" + value: "", }, { name: "Crib offset", type: "number", - value: 0 + value: 0, }, { name: "Use checking machine", type: "boolean", - value: true - } + value: true, + }, ]; } @@ -145,11 +150,15 @@ class MultipleBombe extends Operation { */ updateStatus(nLoops, nStops, progress, start) { const elapsed = Date.now() - start; - const remaining = (elapsed / progress) * (1 - progress) / 1000; + const remaining = ((elapsed / progress) * (1 - progress)) / 1000; const hours = Math.floor(remaining / 3600); const minutes = `0${Math.floor((remaining % 3600) / 60)}`.slice(-2); const seconds = `0${Math.floor(remaining % 60)}`.slice(-2); - const msg = `Bombe run with ${nLoops} loop${nLoops === 1 ? "" : "s"} in menu (2+ desirable): ${nStops} stops, ${Math.floor(100 * progress)}% done, ${hours}:${minutes}:${seconds} remaining`; + const msg = `Bombe run with ${nLoops} loop${ + nLoops === 1 ? "" : "s" + } in menu (2+ desirable): ${nStops} stops, ${Math.floor( + 100 * progress, + )}% done, ${hours}:${minutes}:${seconds} remaining`; self.sendStatusMessage(msg); } @@ -167,10 +176,14 @@ class MultipleBombe extends Operation { // Duplicate the validation of the rotor strings here, otherwise you might get an error // thrown halfway into a big Bombe run if (!/^[A-Z]{26}$/.test(rstr)) { - throw new OperationError("Rotor wiring must be 26 unique uppercase letters"); + throw new OperationError( + "Rotor wiring must be 26 unique uppercase letters", + ); } if (new Set(rstr).size !== 26) { - throw new OperationError("Rotor wiring must be 26 unique uppercase letters"); + throw new OperationError( + "Rotor wiring must be 26 unique uppercase letters", + ); } return rstr; } @@ -195,7 +208,9 @@ class MultipleBombe extends Operation { rotors.push(rstr); } if (rotors.length < 3) { - throw new OperationError("A minimum of three rotors must be supplied"); + throw new OperationError( + "A minimum of three rotors must be supplied", + ); } if (fourthRotorsStr !== "") { for (let rstr of fourthRotorsStr.split("\n")) { @@ -211,7 +226,9 @@ class MultipleBombe extends Operation { reflectors.push(reflector); } if (reflectors.length === 0) { - throw new OperationError("A minimum of one reflector must be supplied"); + throw new OperationError( + "A minimum of one reflector must be supplied", + ); } if (crib.length === 0) { throw new OperationError("Crib cannot be empty"); @@ -230,11 +247,15 @@ class MultipleBombe extends Operation { update = undefined; } let bombe = undefined; - const output = {bombeRuns: []}; + const output = { bombeRuns: [] }; // I could use a proper combinatorics algorithm here... but it would be more code to // write one, and we don't seem to have one in our existing libraries, so massively nested // for loop it is - const totalRuns = choose(rotors.length, 3) * 6 * fourthRotors.length * reflectors.length; + const totalRuns = + choose(rotors.length, 3) * + 6 * + fourthRotors.length * + reflectors.length; let nRuns = 0; let nStops = 0; const start = Date.now(); @@ -255,7 +276,13 @@ class MultipleBombe extends Operation { runRotors.push(rotor4); } if (bombe === undefined) { - bombe = new BombeMachine(runRotors, reflector, ciphertext, crib, check); + bombe = new BombeMachine( + runRotors, + reflector, + ciphertext, + crib, + check, + ); output.nLoops = bombe.nLoops; } else { bombe.changeRotors(runRotors, reflector); @@ -263,13 +290,18 @@ class MultipleBombe extends Operation { const result = bombe.run(); nStops += result.length; if (update !== undefined) { - update(bombe.nLoops, nStops, nRuns / totalRuns, start); + update( + bombe.nLoops, + nStops, + nRuns / totalRuns, + start, + ); } if (result.length > 0) { output.bombeRuns.push({ rotors: runRotors, reflector: reflector.pairs, - result: result + result: result, }); } } @@ -280,7 +312,6 @@ class MultipleBombe extends Operation { return output; } - /** * Displays the MultiBombe results in an HTML table * @@ -290,11 +321,17 @@ class MultipleBombe extends Operation { * @returns {html} */ present(output) { - let html = `Bombe run on menu with ${output.nLoops} loop${output.nLoops === 1 ? "" : "s"} (2+ desirable). Note: Rotors and rotor positions are listed left to right, ignore stepping and the ring setting, and positions start at the beginning of the crib. Some plugboard settings are determined. A decryption preview starting at the beginning of the crib and ignoring stepping is also provided.\n`; + let html = `Bombe run on menu with ${output.nLoops} loop${ + output.nLoops === 1 ? "" : "s" + } (2+ desirable). Note: Rotors and rotor positions are listed left to right, ignore stepping and the ring setting, and positions start at the beginning of the crib. Some plugboard settings are determined. A decryption preview starting at the beginning of the crib and ignoring stepping is also provided.\n`; for (const run of output.bombeRuns) { - html += `\nRotors: ${run.rotors.slice().reverse().join(", ")}\nReflector: ${run.reflector}\n`; - html += "\n"; + html += `\nRotors: ${run.rotors + .slice() + .reverse() + .join(", ")}\nReflector: ${run.reflector}\n`; + html += + "
          Rotor stops Partial plugboard Decryption preview
          \n"; for (const [setting, stecker, decrypt] of run.result) { html += `\n`; } diff --git a/src/core/operations/Multiply.mjs b/src/core/operations/Multiply.mjs index 9f1666e8..26d01f33 100644 --- a/src/core/operations/Multiply.mjs +++ b/src/core/operations/Multiply.mjs @@ -10,12 +10,10 @@ import Operation from "../Operation.mjs"; import { multi, createNumArray } from "../lib/Arithmetic.mjs"; import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; - /** * Multiply operation */ class Multiply extends Operation { - /** * Multiply constructor */ @@ -24,16 +22,17 @@ class Multiply extends Operation { this.name = "Multiply"; this.module = "Default"; - this.description = "Multiplies a list of numbers. If an item in the string is not a number it is excluded from the list.

          e.g. 0x0a 8 .5 becomes 40"; + this.description = + "Multiplies a list of numbers. If an item in the string is not a number it is excluded from the list.

          e.g. 0x0a 8 .5 becomes 40"; this.infoURL = "https://wikipedia.org/wiki/Multiplication"; this.inputType = "string"; this.outputType = "BigNumber"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, - } + name: "Delimiter", + type: "option", + value: ARITHMETIC_DELIM_OPTIONS, + }, ]; } @@ -46,7 +45,6 @@ class Multiply extends Operation { const val = multi(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Multiply; diff --git a/src/core/operations/MurmurHash3.mjs b/src/core/operations/MurmurHash3.mjs index f4aea611..e30bce20 100644 --- a/src/core/operations/MurmurHash3.mjs +++ b/src/core/operations/MurmurHash3.mjs @@ -14,7 +14,6 @@ import Operation from "../Operation.mjs"; * MurmurHash3 operation */ class MurmurHash3 extends Operation { - /** * MurmurHash3 constructor */ @@ -23,7 +22,8 @@ class MurmurHash3 extends Operation { this.name = "MurmurHash3"; this.module = "Default"; - this.description = "Generates a MurmurHash v3 for a string input and an optional seed input"; + this.description = + "Generates a MurmurHash v3 for a string input and an optional seed input"; this.infoURL = "https://wikipedia.org/wiki/MurmurHash"; this.inputType = "string"; this.outputType = "number"; @@ -31,25 +31,25 @@ class MurmurHash3 extends Operation { { name: "Seed", type: "number", - value: 0 + value: 0, }, { name: "Convert to Signed", type: "boolean", - value: false - } + value: false, + }, ]; } - /** - * Calculates the MurmurHash3 hash of the input. - * Based on Gary Court's JS MurmurHash implementation - * @see http://github.com/garycourt/murmurhash-js - * @author AliceGrey [alice@grey.systems] - * @param {string} input ASCII only - * @param {number} seed Positive integer only - * @return {number} 32-bit positive integer hash - */ + /** + * Calculates the MurmurHash3 hash of the input. + * Based on Gary Court's JS MurmurHash implementation + * @see http://github.com/garycourt/murmurhash-js + * @author AliceGrey [alice@grey.systems] + * @param {string} input ASCII only + * @param {number} seed Positive integer only + * @return {number} 32-bit positive integer hash + */ mmh3(input, seed) { let h1b; let k1; @@ -62,20 +62,29 @@ class MurmurHash3 extends Operation { while (i < bytes) { k1 = - ((input.charCodeAt(i) & 0xff)) | + (input.charCodeAt(i) & 0xff) | ((input.charCodeAt(++i) & 0xff) << 8) | ((input.charCodeAt(++i) & 0xff) << 16) | ((input.charCodeAt(++i) & 0xff) << 24); ++i; - k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff; + k1 = + ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & + 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); - k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff; + k1 = + ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & + 0xffffffff; h1 ^= k1; h1 = (h1 << 13) | (h1 >>> 19); - h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff; - h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16)); + h1b = + ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & + 0xffffffff; + h1 = + (h1b & 0xffff) + + 0x6b64 + + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16); } k1 = 0; @@ -89,31 +98,41 @@ class MurmurHash3 extends Operation { } if (remainder === 3 || remainder === 2 || remainder === 1) { - k1 ^= (input.charCodeAt(i) & 0xff); + k1 ^= input.charCodeAt(i) & 0xff; - k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; + k1 = + ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & + 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); - k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; + k1 = + ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & + 0xffffffff; h1 ^= k1; } h1 ^= input.length; h1 ^= h1 >>> 16; - h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; + h1 = + ((h1 & 0xffff) * 0x85ebca6b + + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & + 0xffffffff; h1 ^= h1 >>> 13; - h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff; + h1 = + ((h1 & 0xffff) * 0xc2b2ae35 + + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & + 0xffffffff; h1 ^= h1 >>> 16; return h1 >>> 0; } /** - * Converts an unsigned 32-bit integer to a signed 32-bit integer - * @author AliceGrey [alice@grey.systems] - * @param {value} 32-bit unsigned integer - * @return {number} 32-bit signed integer - */ + * Converts an unsigned 32-bit integer to a signed 32-bit integer + * @author AliceGrey [alice@grey.systems] + * @param {value} 32-bit unsigned integer + * @return {number} 32-bit signed integer + */ unsignedToSigned(value) { if (value & 0x80000000) { return -0x100000000 + value; diff --git a/src/core/operations/NOT.mjs b/src/core/operations/NOT.mjs index 46fc1b8c..6bc1299d 100644 --- a/src/core/operations/NOT.mjs +++ b/src/core/operations/NOT.mjs @@ -11,7 +11,6 @@ import { bitOp, not } from "../lib/BitwiseOp.mjs"; * NOT operation */ class NOT extends Operation { - /** * NOT constructor */ @@ -62,7 +61,6 @@ class NOT extends Operation { highlightReverse(pos, args) { return pos; } - } export default NOT; diff --git a/src/core/operations/NTHash.mjs b/src/core/operations/NTHash.mjs index bde7a24a..478ce567 100644 --- a/src/core/operations/NTHash.mjs +++ b/src/core/operations/NTHash.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * NT Hash operation */ class NTHash extends Operation { - /** * NTHash constructor */ @@ -20,7 +19,8 @@ class NTHash extends Operation { this.name = "NT Hash"; this.module = "Crypto"; - this.description = "An NT Hash, sometimes referred to as an NTLM hash, is a method of storing passwords on Windows systems. It works by running MD4 on UTF-16LE encoded input. NTLM hashes are considered weak because they can be brute-forced very easily with modern hardware."; + this.description = + "An NT Hash, sometimes referred to as an NTLM hash, is a method of storing passwords on Windows systems. It works by running MD4 on UTF-16LE encoded input. NTLM hashes are considered weak because they can be brute-forced very easily with modern hardware."; this.infoURL = "https://wikipedia.org/wiki/NT_LAN_Manager"; this.inputType = "string"; this.outputType = "string"; diff --git a/src/core/operations/NormaliseImage.mjs b/src/core/operations/NormaliseImage.mjs index 08de9ed5..29c2e0cc 100644 --- a/src/core/operations/NormaliseImage.mjs +++ b/src/core/operations/NormaliseImage.mjs @@ -14,7 +14,6 @@ import jimp from "jimp"; * Normalise Image operation */ class NormaliseImage extends Operation { - /** * NormaliseImage constructor */ @@ -27,7 +26,7 @@ class NormaliseImage extends Operation { this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; - this.presentType= "html"; + this.presentType = "html"; this.args = []; } @@ -79,7 +78,6 @@ class NormaliseImage extends Operation { return ``; } - } export default NormaliseImage; diff --git a/src/core/operations/NormaliseUnicode.mjs b/src/core/operations/NormaliseUnicode.mjs index 80d3be3c..d54b5683 100644 --- a/src/core/operations/NormaliseUnicode.mjs +++ b/src/core/operations/NormaliseUnicode.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {UNICODE_NORMALISATION_FORMS} from "../lib/ChrEnc.mjs"; +import { UNICODE_NORMALISATION_FORMS } from "../lib/ChrEnc.mjs"; import unorm from "unorm"; /** * Normalise Unicode operation */ class NormaliseUnicode extends Operation { - /** * NormaliseUnicode constructor */ @@ -22,16 +21,18 @@ class NormaliseUnicode extends Operation { this.name = "Normalise Unicode"; this.module = "Encodings"; - this.description = "Transform Unicode characters to one of the Normalisation Forms"; - this.infoURL = "https://wikipedia.org/wiki/Unicode_equivalence#Normal_forms"; + this.description = + "Transform Unicode characters to one of the Normalisation Forms"; + this.infoURL = + "https://wikipedia.org/wiki/Unicode_equivalence#Normal_forms"; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Normal Form", type: "option", - value: UNICODE_NORMALISATION_FORMS - } + value: UNICODE_NORMALISATION_FORMS, + }, ]; } @@ -56,7 +57,6 @@ class NormaliseUnicode extends Operation { throw new OperationError("Unknown Normalisation Form"); } } - } export default NormaliseUnicode; diff --git a/src/core/operations/Numberwang.mjs b/src/core/operations/Numberwang.mjs index 7f94e360..7df070d2 100644 --- a/src/core/operations/Numberwang.mjs +++ b/src/core/operations/Numberwang.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Numberwang operation. Remain indoors. */ class Numberwang extends Operation { - /** * Numberwang constructor */ @@ -19,8 +18,10 @@ class Numberwang extends Operation { this.name = "Numberwang"; this.module = "Default"; - this.description = "Based on the popular gameshow by Mitchell and Webb."; - this.infoURL = "https://wikipedia.org/wiki/That_Mitchell_and_Webb_Look#Recurring_sketches"; + this.description = + "Based on the popular gameshow by Mitchell and Webb."; + this.infoURL = + "https://wikipedia.org/wiki/That_Mitchell_and_Webb_Look#Recurring_sketches"; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -36,20 +37,22 @@ class Numberwang extends Operation { if (!input) { output = "Let's play Wangernumb!"; } else { - const match = input.match(/(f0rty-s1x|shinty-six|filth-hundred and neeb|-?√?\d+(\.\d+)?i?([a-z]?)%?)/i); + const match = input.match( + /(f0rty-s1x|shinty-six|filth-hundred and neeb|-?√?\d+(\.\d+)?i?([a-z]?)%?)/i, + ); if (match) { if (match[3]) output = match[0] + "! That's AlphaNumericWang!"; else output = match[0] + "! That's Numberwang!"; } else { // That's a bad miss! - output = "Sorry, that's not Numberwang. Let's rotate the board!"; + output = + "Sorry, that's not Numberwang. Let's rotate the board!"; } } const rand = Math.floor(Math.random() * didYouKnow.length); return output + "\n\nDid you know: " + didYouKnow[rand]; } - } /** @@ -64,37 +67,37 @@ const didYouKnow = [ "Numberwang was invented on a Sevenday.", "Contrary to popular belief, Albert Einstein always got good grades in Numberwang at school. He once scored ^4$ on a test.", "680 asteroids have been named after Numberwang.", - "Archimedes is most famous for proclaiming \"That's Numberwang!\" during an epiphany about water displacement he had while taking a bath.", + 'Archimedes is most famous for proclaiming "That\'s Numberwang!" during an epiphany about water displacement he had while taking a bath.', "Numberwang Day is celebrated in Japan on every day of the year apart from June 6.", "Biologists recently discovered Numberwang within a strand of human DNA.", - "Numbernot is a special type of non-Numberwang number. It is divisible by 3 and the letter \"y\".", + 'Numbernot is a special type of non-Numberwang number. It is divisible by 3 and the letter "y".', "Julie once got 612.04 Numberwangs in a single episode of Emmerdale.", - "In India, it is traditional to shout out \"Numberwang!\" instead of checkmate during games of chess.", + 'In India, it is traditional to shout out "Numberwang!" instead of checkmate during games of chess.', "There is a rule on Countdown which states that if you get Numberwang in the numbers round, you automatically win. It has only ever been invoked twice.", - "\"Numberwang\" was the third-most common baby name for a brief period in 1722.", - "\"The Lion King\" was loosely based on Numberwang.", - "\"A Numberwang a day keeps the doctor away\" is how Donny Cosy, the oldest man in the world, explained how he was in such good health at the age of 136.", - "The \"number lock\" button on a keyboard is based on the popular round of the same name in \"Numberwang\".", + '"Numberwang" was the third-most common baby name for a brief period in 1722.', + '"The Lion King" was loosely based on Numberwang.', + '"A Numberwang a day keeps the doctor away" is how Donny Cosy, the oldest man in the world, explained how he was in such good health at the age of 136.', + 'The "number lock" button on a keyboard is based on the popular round of the same name in "Numberwang".', "Cambridge became the first university to offer a course in Numberwang in 1567.", "Schrödinger's Numberwang is a number that has been confusing dentists for centuries.", - "\"Harry Potter and the Numberwang of Numberwang\" was rejected by publishers -41 times before it became a bestseller.", - "\"Numberwang\" is the longest-running British game show in history; it has aired 226 seasons, each containing 19 episodes, which makes a grand total of 132 episodes.", + '"Harry Potter and the Numberwang of Numberwang" was rejected by publishers -41 times before it became a bestseller.', + '"Numberwang" is the longest-running British game show in history; it has aired 226 seasons, each containing 19 episodes, which makes a grand total of 132 episodes.', "The triple Numberwang bonus was discovered by archaeologist Thomas Jefferson in Somerset.", "Numberwang is illegal in parts of Czechoslovakia.", "Numberwang was discovered in India in the 12th century.", "Numberwang has the chemical formula Zn4SO2(HgEs)3.", - "The first pack of cards ever created featured two \"Numberwang\" cards instead of jokers.", + 'The first pack of cards ever created featured two "Numberwang" cards instead of jokers.', "Julius Caesar was killed by an overdose of Numberwang.", "The most Numberwang musical note is G#.", - "In 1934, the forty-third Google Doodle promoted the upcoming television show \"Numberwang on Ice\".", + 'In 1934, the forty-third Google Doodle promoted the upcoming television show "Numberwang on Ice".', "A recent psychology study found that toddlers were 17% faster at identifying numbers which were Numberwang.", - "There are 700 ways to commit a foul in the television show \"Numberwang\". All 700 of these fouls were committed by Julie in one single episode in 1473.", + 'There are 700 ways to commit a foul in the television show "Numberwang". All 700 of these fouls were committed by Julie in one single episode in 1473.', "Astronomers suspect God is Numberwang.", "Numberwang is the official beverage of Canada.", - "In the pilot episode of \"The Price is Right\", if a contestant got the value of an item exactly right they were told \"That's Numberwang!\" and immediately won ₹5.7032.", + 'In the pilot episode of "The Price is Right", if a contestant got the value of an item exactly right they were told "That\'s Numberwang!" and immediately won ₹5.7032.', "The first person to get three Numberwangs in a row was Madonna.", - "\"Numberwang\" has the code U+46402 in Unicode.", - "The musical note \"Numberwang\" is between D# and E♮.", + '"Numberwang" has the code U+46402 in Unicode.', + 'The musical note "Numberwang" is between D# and E♮.', "Numberwang was first played on the moon in 1834.", ]; diff --git a/src/core/operations/OR.mjs b/src/core/operations/OR.mjs index 183fb1fe..7c49dd3c 100644 --- a/src/core/operations/OR.mjs +++ b/src/core/operations/OR.mjs @@ -12,7 +12,6 @@ import { bitOp, or, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs"; * OR operation */ class OR extends Operation { - /** * OR constructor */ @@ -21,17 +20,18 @@ class OR extends Operation { this.name = "OR"; this.module = "Default"; - this.description = "OR the input with the given key.
          e.g. fe023da5"; + this.description = + "OR the input with the given key.
          e.g. fe023da5"; this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#OR"; this.inputType = "ArrayBuffer"; this.outputType = "byteArray"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": BITWISE_OP_DELIMS - } + name: "Key", + type: "toggleString", + value: "", + toggleValues: BITWISE_OP_DELIMS, + }, ]; } @@ -41,7 +41,10 @@ class OR extends Operation { * @returns {byteArray} */ run(input, args) { - const key = Utils.convertToByteArray(args[0].string || "", args[0].option); + const key = Utils.convertToByteArray( + args[0].string || "", + args[0].option, + ); input = new Uint8Array(input); return bitOp(input, key, or); @@ -72,7 +75,6 @@ class OR extends Operation { highlightReverse(pos, args) { return pos; } - } export default OR; diff --git a/src/core/operations/ObjectIdentifierToHex.mjs b/src/core/operations/ObjectIdentifierToHex.mjs index 3e78cc03..cbf50528 100644 --- a/src/core/operations/ObjectIdentifierToHex.mjs +++ b/src/core/operations/ObjectIdentifierToHex.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * Object Identifier to Hex operation */ class ObjectIdentifierToHex extends Operation { - /** * ObjectIdentifierToHex constructor */ @@ -20,7 +19,8 @@ class ObjectIdentifierToHex extends Operation { this.name = "Object Identifier to Hex"; this.module = "PublicKey"; - this.description = "Converts an object identifier (OID) into a hexadecimal string."; + this.description = + "Converts an object identifier (OID) into a hexadecimal string."; this.infoURL = "https://wikipedia.org/wiki/Object_identifier"; this.inputType = "string"; this.outputType = "string"; @@ -35,7 +35,6 @@ class ObjectIdentifierToHex extends Operation { run(input, args) { return r.KJUR.asn1.ASN1Util.oidIntToHex(input); } - } export default ObjectIdentifierToHex; diff --git a/src/core/operations/OffsetChecker.mjs b/src/core/operations/OffsetChecker.mjs index 0f66e591..dc9dd846 100644 --- a/src/core/operations/OffsetChecker.mjs +++ b/src/core/operations/OffsetChecker.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Offset checker operation */ class OffsetChecker extends Operation { - /** * OffsetChecker constructor */ @@ -21,15 +20,16 @@ class OffsetChecker extends Operation { this.name = "Offset checker"; this.module = "Default"; - this.description = "Compares multiple inputs (separated by the specified delimiter) and highlights matching characters which appear at the same position in all samples."; + this.description = + "Compares multiple inputs (separated by the specified delimiter) and highlights matching characters which appear at the same position in all samples."; this.inputType = "string"; this.outputType = "html"; this.args = [ { - "name": "Sample delimiter", - "type": "binaryString", - "value": "\\n\\n" - } + name: "Sample delimiter", + type: "binaryString", + value: "\\n\\n", + }, ]; } @@ -49,7 +49,9 @@ class OffsetChecker extends Operation { chr; if (!samples || samples.length < 2) { - throw new OperationError("Not enough samples, perhaps you need to modify the sample delimiter or add more data?"); + throw new OperationError( + "Not enough samples, perhaps you need to modify the sample delimiter or add more data?", + ); } // Initialise output strings @@ -78,7 +80,8 @@ class OffsetChecker extends Operation { } if (match && !inMatch) { - outputs[s] += "" + Utils.escapeHtml(samples[s][i]); + outputs[s] += + "" + Utils.escapeHtml(samples[s][i]); if (samples[s].length === i + 1) outputs[s] += ""; if (s === samples.length - 1) inMatch = true; } else if (!match && inMatch) { @@ -101,7 +104,6 @@ class OffsetChecker extends Operation { return outputs.join(sampleDelim); } - } export default OffsetChecker; diff --git a/src/core/operations/OpticalCharacterRecognition.mjs b/src/core/operations/OpticalCharacterRecognition.mjs index 6262df7b..730f2bbe 100644 --- a/src/core/operations/OpticalCharacterRecognition.mjs +++ b/src/core/operations/OpticalCharacterRecognition.mjs @@ -19,7 +19,6 @@ import { createWorker } from "tesseract.js"; * Optical Character Recognition operation */ class OpticalCharacterRecognition extends Operation { - /** * OpticalCharacterRecognition constructor */ @@ -28,16 +27,18 @@ class OpticalCharacterRecognition extends Operation { this.name = "Optical Character Recognition"; this.module = "OCR"; - this.description = "Optical character recognition or optical character reader (OCR) is the mechanical or electronic conversion of images of typed, handwritten or printed text into machine-encoded text.

          Supported image formats: png, jpg, bmp, pbm."; - this.infoURL = "https://wikipedia.org/wiki/Optical_character_recognition"; + this.description = + "Optical character recognition or optical character reader (OCR) is the mechanical or electronic conversion of images of typed, handwritten or printed text into machine-encoded text.

          Supported image formats: png, jpg, bmp, pbm."; + this.infoURL = + "https://wikipedia.org/wiki/Optical_character_recognition"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { name: "Show confidence", type: "boolean", - value: true - } + value: true, + }, ]; } @@ -49,14 +50,19 @@ class OpticalCharacterRecognition extends Operation { async run(input, args) { const [showConfidence] = args; - if (!isWorkerEnvironment()) throw new OperationError("This operation only works in a browser"); + if (!isWorkerEnvironment()) + throw new OperationError("This operation only works in a browser"); const type = isImage(input); if (!type) { - throw new OperationError("Unsupported file type (supported: jpg,png,pbm,bmp) or no file provided"); + throw new OperationError( + "Unsupported file type (supported: jpg,png,pbm,bmp) or no file provided", + ); } - const assetDir = isWorkerEnvironment() ? `${self.docURL}/assets/` : `${process.cwd()}/src/core/vendor/`; + const assetDir = isWorkerEnvironment() + ? `${self.docURL}/assets/` + : `${process.cwd()}/src/core/vendor/`; try { self.sendStatusMessage("Spinning up Tesseract worker..."); @@ -65,11 +71,19 @@ class OpticalCharacterRecognition extends Operation { workerPath: `${assetDir}tesseract/worker.min.js`, langPath: `${assetDir}tesseract/lang-data`, corePath: `${assetDir}tesseract/tesseract-core.wasm.js`, - logger: progress => { + logger: (progress) => { if (isWorkerEnvironment()) { - self.sendStatusMessage(`Status: ${progress.status}${progress.status === "recognizing text" ? ` - ${(parseFloat(progress.progress)*100).toFixed(2)}%`: "" }`); + self.sendStatusMessage( + `Status: ${progress.status}${ + progress.status === "recognizing text" + ? ` - ${( + parseFloat(progress.progress) * 100 + ).toFixed(2)}%` + : "" + }`, + ); } - } + }, }); await worker.load(); self.sendStatusMessage(`Loading English language pack...`); diff --git a/src/core/operations/PEMToHex.mjs b/src/core/operations/PEMToHex.mjs index afbb4972..20af5ead 100644 --- a/src/core/operations/PEMToHex.mjs +++ b/src/core/operations/PEMToHex.mjs @@ -14,7 +14,6 @@ import OperationError from "../errors/OperationError.mjs"; * PEM to Hex operation */ class PEMToHex extends Operation { - /** * PEMToHex constructor */ @@ -23,16 +22,18 @@ class PEMToHex extends Operation { this.name = "PEM to Hex"; this.module = "Default"; - this.description = "Converts PEM (Privacy Enhanced Mail) format to a hexadecimal DER (Distinguished Encoding Rules) string."; - this.infoURL = "https://wikipedia.org/wiki/Privacy-Enhanced_Mail#Format"; + this.description = + "Converts PEM (Privacy Enhanced Mail) format to a hexadecimal DER (Distinguished Encoding Rules) string."; + this.infoURL = + "https://wikipedia.org/wiki/Privacy-Enhanced_Mail#Format"; this.inputType = "string"; this.outputType = "string"; this.args = []; this.checks = [ { - "pattern": "----BEGIN ([A-Z][A-Z ]+[A-Z])-----", - "args": [] - } + pattern: "----BEGIN ([A-Z][A-Z ]+[A-Z])-----", + args: [], + }, ]; } @@ -62,7 +63,6 @@ class PEMToHex extends Operation { } return output.join("\n"); } - } export default PEMToHex; diff --git a/src/core/operations/PGPDecrypt.mjs b/src/core/operations/PGPDecrypt.mjs index d69b88ea..1444328f 100644 --- a/src/core/operations/PGPDecrypt.mjs +++ b/src/core/operations/PGPDecrypt.mjs @@ -9,13 +9,14 @@ import kbpgp from "kbpgp"; import { ASP, importPrivateKey } from "../lib/PGP.mjs"; import OperationError from "../errors/OperationError.mjs"; import * as es6promisify from "es6-promisify"; -const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; +const promisify = es6promisify.default + ? es6promisify.default.promisify + : es6promisify.promisify; /** * PGP Decrypt operation */ class PGPDecrypt extends Operation { - /** * PGPDecrypt constructor */ @@ -39,15 +40,15 @@ class PGPDecrypt extends Operation { this.outputType = "string"; this.args = [ { - "name": "Private key of recipient", - "type": "text", - "value": "" + name: "Private key of recipient", + type: "text", + value: "", }, { - "name": "Private key passphrase", - "type": "string", - "value": "" - } + name: "Private key passphrase", + type: "string", + value: "", + }, ]; } @@ -64,7 +65,8 @@ class PGPDecrypt extends Operation { keyring = new kbpgp.keyring.KeyRing(); let plaintextMessage; - if (!privateKey) throw new OperationError("Enter the private key of the recipient."); + if (!privateKey) + throw new OperationError("Enter the private key of the recipient."); const key = await importPrivateKey(privateKey, passphrase); keyring.add_key_manager(key); @@ -73,15 +75,16 @@ class PGPDecrypt extends Operation { plaintextMessage = await promisify(kbpgp.unbox)({ armored: encryptedMessage, keyfetch: keyring, - asp: ASP + asp: ASP, }); } catch (err) { - throw new OperationError(`Couldn't decrypt message with provided private key: ${err}`); + throw new OperationError( + `Couldn't decrypt message with provided private key: ${err}`, + ); } return plaintextMessage.toString(); } - } export default PGPDecrypt; diff --git a/src/core/operations/PGPDecryptAndVerify.mjs b/src/core/operations/PGPDecryptAndVerify.mjs index 119ccf16..e40dd70f 100644 --- a/src/core/operations/PGPDecryptAndVerify.mjs +++ b/src/core/operations/PGPDecryptAndVerify.mjs @@ -9,13 +9,14 @@ import kbpgp from "kbpgp"; import { ASP, importPrivateKey, importPublicKey } from "../lib/PGP.mjs"; import OperationError from "../errors/OperationError.mjs"; import * as es6promisify from "es6-promisify"; -const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; +const promisify = es6promisify.default + ? es6promisify.default.promisify + : es6promisify.promisify; /** * PGP Decrypt and Verify operation */ class PGPDecryptAndVerify extends Operation { - /** * PGPDecryptAndVerify constructor */ @@ -41,20 +42,20 @@ class PGPDecryptAndVerify extends Operation { this.outputType = "string"; this.args = [ { - "name": "Public key of signer", - "type": "text", - "value": "" + name: "Public key of signer", + type: "text", + value: "", }, { - "name": "Private key of recipient", - "type": "text", - "value": "" + name: "Private key of recipient", + type: "text", + value: "", }, { - "name": "Private key password", - "type": "string", - "value": "" - } + name: "Private key password", + type: "string", + value: "", + }, ]; } @@ -69,8 +70,10 @@ class PGPDecryptAndVerify extends Operation { keyring = new kbpgp.keyring.KeyRing(); let unboxedLiterals; - if (!publicKey) throw new OperationError("Enter the public key of the signer."); - if (!privateKey) throw new OperationError("Enter the private key of the recipient."); + if (!publicKey) + throw new OperationError("Enter the public key of the signer."); + if (!privateKey) + throw new OperationError("Enter the private key of the recipient."); const privKey = await importPrivateKey(privateKey, passphrase); const pubKey = await importPublicKey(publicKey); keyring.add_key_manager(privKey); @@ -80,7 +83,7 @@ class PGPDecryptAndVerify extends Operation { unboxedLiterals = await promisify(kbpgp.unbox)({ armored: signedMessage, keyfetch: keyring, - asp: ASP + asp: ASP, }); const ds = unboxedLiterals[0].get_data_signer(); if (ds) { @@ -102,23 +105,30 @@ class PGPDecryptAndVerify extends Operation { } text += [ `PGP key ID: ${km.get_pgp_short_key_id()}`, - `PGP fingerprint: ${km.get_pgp_fingerprint().toString("hex")}`, - `Signed on ${new Date(ds.sig.when_generated() * 1000).toUTCString()}`, - "----------------------------------\n" + `PGP fingerprint: ${km + .get_pgp_fingerprint() + .toString("hex")}`, + `Signed on ${new Date( + ds.sig.when_generated() * 1000, + ).toUTCString()}`, + "----------------------------------\n", ].join("\n"); text += unboxedLiterals.toString(); return text.trim(); } else { - throw new OperationError("Could not identify a key manager."); + throw new OperationError( + "Could not identify a key manager.", + ); } } else { - throw new OperationError("The data does not appear to be signed."); + throw new OperationError( + "The data does not appear to be signed.", + ); } } catch (err) { throw new OperationError(`Couldn't verify message: ${err}`); } } - } export default PGPDecryptAndVerify; diff --git a/src/core/operations/PGPEncrypt.mjs b/src/core/operations/PGPEncrypt.mjs index 2f41cc0b..e9250faa 100644 --- a/src/core/operations/PGPEncrypt.mjs +++ b/src/core/operations/PGPEncrypt.mjs @@ -9,13 +9,14 @@ import kbpgp from "kbpgp"; import { ASP, importPublicKey } from "../lib/PGP.mjs"; import OperationError from "../errors/OperationError.mjs"; import * as es6promisify from "es6-promisify"; -const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; +const promisify = es6promisify.default + ? es6promisify.default.promisify + : es6promisify.promisify; /** * PGP Encrypt operation */ class PGPEncrypt extends Operation { - /** * PGPEncrypt constructor */ @@ -38,10 +39,10 @@ class PGPEncrypt extends Operation { this.outputType = "string"; this.args = [ { - "name": "Public key of recipient", - "type": "text", - "value": "" - } + name: "Public key of recipient", + type: "text", + value: "", + }, ]; } @@ -57,23 +58,25 @@ class PGPEncrypt extends Operation { plainPubKey = args[0]; let encryptedMessage; - if (!plainPubKey) throw new OperationError("Enter the public key of the recipient."); + if (!plainPubKey) + throw new OperationError("Enter the public key of the recipient."); const key = await importPublicKey(plainPubKey); try { encryptedMessage = await promisify(kbpgp.box)({ - "msg": plaintextMessage, - "encrypt_for": key, - "asp": ASP + msg: plaintextMessage, + encrypt_for: key, + asp: ASP, }); } catch (err) { - throw new OperationError(`Couldn't encrypt message with provided public key: ${err}`); + throw new OperationError( + `Couldn't encrypt message with provided public key: ${err}`, + ); } return encryptedMessage.toString(); } - } export default PGPEncrypt; diff --git a/src/core/operations/PGPEncryptAndSign.mjs b/src/core/operations/PGPEncryptAndSign.mjs index 8fdbe4c3..c7fff837 100644 --- a/src/core/operations/PGPEncryptAndSign.mjs +++ b/src/core/operations/PGPEncryptAndSign.mjs @@ -9,13 +9,14 @@ import kbpgp from "kbpgp"; import { ASP, importPrivateKey, importPublicKey } from "../lib/PGP.mjs"; import OperationError from "../errors/OperationError.mjs"; import * as es6promisify from "es6-promisify"; -const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; +const promisify = es6promisify.default + ? es6promisify.default.promisify + : es6promisify.promisify; /** * PGP Encrypt and Sign operation */ class PGPEncryptAndSign extends Operation { - /** * PGPEncryptAndSign constructor */ @@ -41,20 +42,20 @@ class PGPEncryptAndSign extends Operation { this.outputType = "string"; this.args = [ { - "name": "Private key of signer", - "type": "text", - "value": "" + name: "Private key of signer", + type: "text", + value: "", }, { - "name": "Private key passphrase", - "type": "string", - "value": "" + name: "Private key passphrase", + type: "string", + value: "", }, { - "name": "Public key of recipient", - "type": "text", - "value": "" - } + name: "Public key of recipient", + type: "text", + value: "", + }, ]; } @@ -70,17 +71,19 @@ class PGPEncryptAndSign extends Operation { [privateKey, passphrase, publicKey] = args; let signedMessage; - if (!privateKey) throw new OperationError("Enter the private key of the signer."); - if (!publicKey) throw new OperationError("Enter the public key of the recipient."); + if (!privateKey) + throw new OperationError("Enter the private key of the signer."); + if (!publicKey) + throw new OperationError("Enter the public key of the recipient."); const privKey = await importPrivateKey(privateKey, passphrase); const pubKey = await importPublicKey(publicKey); try { signedMessage = await promisify(kbpgp.box)({ - "msg": message, - "encrypt_for": pubKey, - "sign_with": privKey, - "asp": ASP + msg: message, + encrypt_for: pubKey, + sign_with: privKey, + asp: ASP, }); } catch (err) { throw new OperationError(`Couldn't sign message: ${err}`); @@ -88,7 +91,6 @@ class PGPEncryptAndSign extends Operation { return signedMessage; } - } export default PGPEncryptAndSign; diff --git a/src/core/operations/PGPVerify.mjs b/src/core/operations/PGPVerify.mjs index ee346916..a3a1d2a4 100644 --- a/src/core/operations/PGPVerify.mjs +++ b/src/core/operations/PGPVerify.mjs @@ -10,13 +10,14 @@ import OperationError from "../errors/OperationError.mjs"; import kbpgp from "kbpgp"; import { ASP, importPublicKey } from "../lib/PGP.mjs"; import * as es6promisify from "es6-promisify"; -const promisify = es6promisify.default ? es6promisify.default.promisify : es6promisify.promisify; +const promisify = es6promisify.default + ? es6promisify.default.promisify + : es6promisify.promisify; /** * PGP Verify operation */ class PGPVerify extends Operation { - /** * PGPVerify constructor */ @@ -41,10 +42,10 @@ class PGPVerify extends Operation { this.outputType = "string"; this.args = [ { - "name": "Public key of signer", - "type": "text", - "value": "" - } + name: "Public key of signer", + type: "text", + value: "", + }, ]; } @@ -59,7 +60,8 @@ class PGPVerify extends Operation { keyring = new kbpgp.keyring.KeyRing(); let unboxedLiterals; - if (!publicKey) throw new OperationError("Enter the public key of the signer."); + if (!publicKey) + throw new OperationError("Enter the public key of the signer."); const pubKey = await importPublicKey(publicKey); keyring.add_key_manager(pubKey); @@ -67,7 +69,7 @@ class PGPVerify extends Operation { unboxedLiterals = await promisify(kbpgp.unbox)({ armored: signedMessage, keyfetch: keyring, - asp: ASP + asp: ASP, }); const ds = unboxedLiterals[0].get_data_signer(); if (ds) { @@ -89,23 +91,30 @@ class PGPVerify extends Operation { } text += [ `PGP key ID: ${km.get_pgp_short_key_id()}`, - `PGP fingerprint: ${km.get_pgp_fingerprint().toString("hex")}`, - `Signed on ${new Date(ds.sig.when_generated() * 1000).toUTCString()}`, - "----------------------------------\n" + `PGP fingerprint: ${km + .get_pgp_fingerprint() + .toString("hex")}`, + `Signed on ${new Date( + ds.sig.when_generated() * 1000, + ).toUTCString()}`, + "----------------------------------\n", ].join("\n"); text += unboxedLiterals.toString(); return text.trim(); } else { - throw new OperationError("Could not identify a key manager."); + throw new OperationError( + "Could not identify a key manager.", + ); } } else { - throw new OperationError("The data does not appear to be signed."); + throw new OperationError( + "The data does not appear to be signed.", + ); } } catch (err) { throw new OperationError(`Couldn't verify message: ${err}`); } } - } export default PGPVerify; diff --git a/src/core/operations/PHPDeserialize.mjs b/src/core/operations/PHPDeserialize.mjs index 77d18bc2..0453ca16 100644 --- a/src/core/operations/PHPDeserialize.mjs +++ b/src/core/operations/PHPDeserialize.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * PHP Deserialize operation */ class PHPDeserialize extends Operation { - /** * PHPDeserialize constructor */ @@ -20,16 +19,18 @@ class PHPDeserialize extends Operation { this.name = "PHP Deserialize"; this.module = "Default"; - this.description = "Deserializes PHP serialized data, outputting keyed arrays as JSON.

          This function does not support object tags.

          Example:
          a:2:{s:1:"a";i:10;i:0;a:1:{s:2:"ab";b:1;}}
          becomes
          {"a": 10,0: {"ab": true}}

          Output valid JSON: JSON doesn't support integers as keys, whereas PHP serialization does. Enabling this will cast these integers to strings. This will also escape backslashes."; - this.infoURL = "http://www.phpinternalsbook.com/classes_objects/serialization.html"; + this.description = + "Deserializes PHP serialized data, outputting keyed arrays as JSON.

          This function does not support object tags.

          Example:
          a:2:{s:1:"a";i:10;i:0;a:1:{s:2:"ab";b:1;}}
          becomes
          {"a": 10,0: {"ab": true}}

          Output valid JSON: JSON doesn't support integers as keys, whereas PHP serialization does. Enabling this will cast these integers to strings. This will also escape backslashes."; + this.infoURL = + "http://www.phpinternalsbook.com/classes_objects/serialization.html"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Output valid JSON", - "type": "boolean", - "value": true - } + name: "Output valid JSON", + type: "boolean", + value: true, + }, ]; } @@ -54,7 +55,9 @@ class PHPDeserialize extends Operation { for (let idx = 0; idx < length; idx++) { const char = inputPart.shift(); if (char === undefined) { - throw new OperationError("End of input reached before end of script"); + throw new OperationError( + "End of input reached before end of script", + ); } result += char; } @@ -77,7 +80,6 @@ class PHPDeserialize extends Operation { } } return result; - } /** @@ -110,7 +112,11 @@ class PHPDeserialize extends Operation { isKey = false; } else { const numberCheck = lastItem.match(/[0-9]+/); - if (args[0] && numberCheck && numberCheck[0].length === lastItem.length) { + if ( + args[0] && + numberCheck && + numberCheck[0].length === lastItem.length + ) { result.push('"' + lastItem + '": ' + item); } else { result.push(lastItem + ": " + item); @@ -122,7 +128,6 @@ class PHPDeserialize extends Operation { return result; } - const kind = read(1).toLowerCase(); switch (kind) { @@ -135,7 +140,7 @@ class PHPDeserialize extends Operation { expect(":"); const data = readUntil(";"); if (kind === "b") { - return (parseInt(data, 10) !== 0); + return parseInt(data, 10) !== 0; } return data; } @@ -147,7 +152,7 @@ class PHPDeserialize extends Operation { case "s": { expect(":"); const length = readUntil(":"); - expect("\""); + expect('"'); const value = read(length); expect('";'); if (args[0]) { @@ -165,7 +170,6 @@ class PHPDeserialize extends Operation { const inputPart = input.split(""); return handleInput(); } - } export default PHPDeserialize; diff --git a/src/core/operations/PLISTViewer.mjs b/src/core/operations/PLISTViewer.mjs index 9b4aada4..0abb28ef 100644 --- a/src/core/operations/PLISTViewer.mjs +++ b/src/core/operations/PLISTViewer.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * P-list Viewer operation */ class PlistViewer extends Operation { - /** * PlistViewer constructor */ @@ -19,7 +18,8 @@ class PlistViewer extends Operation { this.name = "P-list Viewer"; this.module = "Default"; - this.description = "In the macOS, iOS, NeXTSTEP, and GNUstep programming frameworks, property list files are files that store serialized objects. Property list files use the filename extension .plist, and thus are often referred to as p-list files.

          This operation displays plist files in a human readable format."; + this.description = + "In the macOS, iOS, NeXTSTEP, and GNUstep programming frameworks, property list files are files that store serialized objects. Property list files use the filename extension .plist, and thus are often referred to as p-list files.

          This operation displays plist files in a human readable format."; this.infoURL = "https://wikipedia.org/wiki/Property_list"; this.inputType = "string"; this.outputType = "string"; @@ -32,23 +32,41 @@ class PlistViewer extends Operation { * @returns {string} */ run(input, args) { - // Regexes are designed to transform the xml format into a more readable string format. - input = input.slice(input.indexOf("/g, "plist => ") .replace(//g, "{") .replace(/<\/dict>/g, "}") .replace(//g, "[") .replace(/<\/array>/g, "]") - .replace(/.+<\/key>/g, m => `${m.slice(5, m.indexOf(/<\/key>/g)-5)}\t=> `) - .replace(/.+<\/real>/g, m => `${m.slice(6, m.indexOf(/<\/real>/g)-6)}\n`) - .replace(/.+<\/string>/g, m => `"${m.slice(8, m.indexOf(/<\/string>/g)-8)}"\n`) - .replace(/.+<\/integer>/g, m => `${m.slice(9, m.indexOf(/<\/integer>/g)-9)}\n`) - .replace(//g, m => "false") - .replace(//g, m => "true") + .replace( + /.+<\/key>/g, + (m) => `${m.slice(5, m.indexOf(/<\/key>/g) - 5)}\t=> `, + ) + .replace( + /.+<\/real>/g, + (m) => `${m.slice(6, m.indexOf(/<\/real>/g) - 6)}\n`, + ) + .replace( + /.+<\/string>/g, + (m) => `"${m.slice(8, m.indexOf(/<\/string>/g) - 8)}"\n`, + ) + .replace( + /.+<\/integer>/g, + (m) => `${m.slice(9, m.indexOf(/<\/integer>/g) - 9)}\n`, + ) + .replace(//g, (m) => "false") + .replace(//g, (m) => "true") .replace(/<\/plist>/g, "/plist") - .replace(/.+<\/date>/g, m => `${m.slice(6, m.indexOf(/<\/integer>/g)-6)}`) - .replace(/[\s\S]+?<\/data>/g, m => `${m.slice(6, m.indexOf(/<\/data>/g)-6)}`) + .replace( + /.+<\/date>/g, + (m) => `${m.slice(6, m.indexOf(/<\/integer>/g) - 6)}`, + ) + .replace( + /[\s\S]+?<\/data>/g, + (m) => `${m.slice(6, m.indexOf(/<\/data>/g) - 6)}`, + ) .replace(/[ \t\r\f\v]/g, ""); /** @@ -62,8 +80,7 @@ class PlistViewer extends Operation { const temp = vals.indexOf(elem); if (temp !== -1) { depthCount += offset; - if (temp === 1) - arrCount += offset; + if (temp === 1) arrCount += offset; } } @@ -78,8 +95,7 @@ class PlistViewer extends Operation { * @param {number} index */ function printIt(input, index) { - if (!(input.length)) - return; + if (!input.length) return; let temp = ""; const origArr = arrCount; @@ -87,12 +103,14 @@ class PlistViewer extends Operation { // If the current position points at a larger dynamic structure. if (currElem.indexOf("=>") !== -1) { - // If the LHS also points at a larger structure (nested plists in a dictionary). if (input[1].indexOf("=>") !== -1) - temp = currElem.slice(0, -2) + " => " + input[1].slice(0, -2) + " =>\n"; - else - temp = currElem.slice(0, -2) + " => " + input[1] + "\n"; + temp = + currElem.slice(0, -2) + + " => " + + input[1].slice(0, -2) + + " =>\n"; + else temp = currElem.slice(0, -2) + " => " + input[1] + "\n"; input = input.slice(1); } else { @@ -107,7 +125,7 @@ class PlistViewer extends Operation { currElem = input[0]; // Tab out to the correct distance. - result += ("\t".repeat(depthCount)); + result += "\t".repeat(depthCount); // If it is enclosed in an array show index. if (arrCount > 0 && currElem !== "]") @@ -119,12 +137,11 @@ class PlistViewer extends Operation { braces(currElem, ["{", "["], 1); // If there has been a new array then reset index. - if (arrCount > origArr) - return printIt(input.slice(1), 0); + if (arrCount > origArr) return printIt(input.slice(1), 0); return printIt(input.slice(1), ++index); } - input = input.split("\n").filter(e => e !== ""); + input = input.split("\n").filter((e) => e !== ""); printIt(input, 0); return result; } diff --git a/src/core/operations/PadLines.mjs b/src/core/operations/PadLines.mjs index c1464cce..b05e93df 100644 --- a/src/core/operations/PadLines.mjs +++ b/src/core/operations/PadLines.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Pad lines operation */ class PadLines extends Operation { - /** * PadLines constructor */ @@ -19,25 +18,26 @@ class PadLines extends Operation { this.name = "Pad lines"; this.module = "Default"; - this.description = "Add the specified number of the specified character to the beginning or end of each line"; + this.description = + "Add the specified number of the specified character to the beginning or end of each line"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Position", - "type": "option", - "value": ["Start", "End"] + name: "Position", + type: "option", + value: ["Start", "End"], }, { - "name": "Length", - "type": "number", - "value": 5 + name: "Length", + type: "number", + value: 5, }, { - "name": "Character", - "type": "binaryShortString", - "value": " " - } + name: "Character", + type: "binaryShortString", + value: " ", + }, ]; } @@ -54,17 +54,16 @@ class PadLines extends Operation { if (position === "Start") { for (i = 0; i < lines.length; i++) { - output += lines[i].padStart(lines[i].length+len, chr) + "\n"; + output += lines[i].padStart(lines[i].length + len, chr) + "\n"; } } else if (position === "End") { for (i = 0; i < lines.length; i++) { - output += lines[i].padEnd(lines[i].length+len, chr) + "\n"; + output += lines[i].padEnd(lines[i].length + len, chr) + "\n"; } } - return output.slice(0, output.length-1); + return output.slice(0, output.length - 1); } - } export default PadLines; diff --git a/src/core/operations/ParseASN1HexString.mjs b/src/core/operations/ParseASN1HexString.mjs index 35fd5ba4..28a40975 100644 --- a/src/core/operations/ParseASN1HexString.mjs +++ b/src/core/operations/ParseASN1HexString.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * Parse ASN.1 hex string operation */ class ParseASN1HexString extends Operation { - /** * ParseASN1HexString constructor */ @@ -20,21 +19,23 @@ class ParseASN1HexString extends Operation { this.name = "Parse ASN.1 hex string"; this.module = "PublicKey"; - this.description = "Abstract Syntax Notation One (ASN.1) is a standard and notation that describes rules and structures for representing, encoding, transmitting, and decoding data in telecommunications and computer networking.

          This operation parses arbitrary ASN.1 data (encoded as an hex string: use the 'To Hex' operation if necessary) and presents the resulting tree."; - this.infoURL = "https://wikipedia.org/wiki/Abstract_Syntax_Notation_One"; + this.description = + "Abstract Syntax Notation One (ASN.1) is a standard and notation that describes rules and structures for representing, encoding, transmitting, and decoding data in telecommunications and computer networking.

          This operation parses arbitrary ASN.1 data (encoded as an hex string: use the 'To Hex' operation if necessary) and presents the resulting tree."; + this.infoURL = + "https://wikipedia.org/wiki/Abstract_Syntax_Notation_One"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Starting index", - "type": "number", - "value": 0 + name: "Starting index", + type: "number", + value: 0, }, { - "name": "Truncate octet strings longer than", - "type": "number", - "value": 32 - } + name: "Truncate octet strings longer than", + type: "number", + value: 32, + }, ]; } @@ -45,11 +46,14 @@ class ParseASN1HexString extends Operation { */ run(input, args) { const [index, truncateLen] = args; - return r.ASN1HEX.dump(input.replace(/\s/g, "").toLowerCase(), { - "ommit_long_octet": truncateLen - }, index); + return r.ASN1HEX.dump( + input.replace(/\s/g, "").toLowerCase(), + { + ommit_long_octet: truncateLen, + }, + index, + ); } - } export default ParseASN1HexString; diff --git a/src/core/operations/ParseColourCode.mjs b/src/core/operations/ParseColourCode.mjs index 31e575a1..003da290 100644 --- a/src/core/operations/ParseColourCode.mjs +++ b/src/core/operations/ParseColourCode.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Parse colour code operation */ class ParseColourCode extends Operation { - /** * ParseColourCode constructor */ @@ -19,7 +18,8 @@ class ParseColourCode extends Operation { this.name = "Parse colour code"; this.module = "Default"; - this.description = "Converts a colour code in a standard format to other standard formats and displays the colour itself.

          Example inputs
          • #d9edf7
          • rgba(217,237,247,1)
          • hsla(200,65%,91%,1)
          • cmyk(0.12, 0.04, 0.00, 0.03)
          "; + this.description = + "Converts a colour code in a standard format to other standard formats and displays the colour itself.

          Example inputs
          • #d9edf7
          • rgba(217,237,247,1)
          • hsla(200,65%,91%,1)
          • cmyk(0.12, 0.04, 0.00, 0.03)
          "; this.infoURL = "https://wikipedia.org/wiki/Web_colors"; this.inputType = "string"; this.outputType = "html"; @@ -33,7 +33,10 @@ class ParseColourCode extends Operation { */ run(input, args) { let m = null, - r = 0, g = 0, b = 0, a = 1; + r = 0, + g = 0, + b = 0, + a = 1; // Read in the input if ((m = input.match(/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/i))) { @@ -41,13 +44,21 @@ class ParseColourCode extends Operation { r = parseInt(m[1], 16); g = parseInt(m[2], 16); b = parseInt(m[3], 16); - } else if ((m = input.match(/rgba?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)(?:,\s?(\d(?:\.\d+)?))?\)/i))) { + } else if ( + (m = input.match( + /rgba?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)(?:,\s?(\d(?:\.\d+)?))?\)/i, + )) + ) { // RGB or RGBA - rgb(217,237,247) or rgba(217,237,247,1) r = parseFloat(m[1]); g = parseFloat(m[2]); b = parseFloat(m[3]); a = m[4] ? parseFloat(m[4]) : 1; - } else if ((m = input.match(/hsla?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)%,\s?(\d{1,3}(?:\.\d+)?)%(?:,\s?(\d(?:\.\d+)?))?\)/i))) { + } else if ( + (m = input.match( + /hsla?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)%,\s?(\d{1,3}(?:\.\d+)?)%(?:,\s?(\d(?:\.\d+)?))?\)/i, + )) + ) { // HSL or HSLA - hsl(200, 65%, 91%) or hsla(200, 65%, 91%, 1) const h_ = parseFloat(m[1]) / 360, s_ = parseFloat(m[2]) / 100, @@ -58,7 +69,11 @@ class ParseColourCode extends Operation { g = rgb_[1]; b = rgb_[2]; a = m[4] ? parseFloat(m[4]) : 1; - } else if ((m = input.match(/cmyk\((\d(?:\.\d+)?),\s?(\d(?:\.\d+)?),\s?(\d(?:\.\d+)?),\s?(\d(?:\.\d+)?)\)/i))) { + } else if ( + (m = input.match( + /cmyk\((\d(?:\.\d+)?),\s?(\d(?:\.\d+)?),\s?(\d(?:\.\d+)?),\s?(\d(?:\.\d+)?)\)/i, + )) + ) { // CMYK - cmyk(0.12, 0.04, 0.00, 0.03) const c_ = parseFloat(m[1]), m_ = parseFloat(m[2]), @@ -74,24 +89,25 @@ class ParseColourCode extends Operation { h = Math.round(hsl_[0] * 360), s = Math.round(hsl_[1] * 100), l = Math.round(hsl_[2] * 100); - let k = 1 - Math.max(r/255, g/255, b/255), - c = (1 - r/255 - k) / (1 - k), - y = (1 - b/255 - k) / (1 - k); + let k = 1 - Math.max(r / 255, g / 255, b / 255), + c = (1 - r / 255 - k) / (1 - k), + y = (1 - b / 255 - k) / (1 - k); - m = (1 - g/255 - k) / (1 - k); + m = (1 - g / 255 - k) / (1 - k); c = isNaN(c) ? "0" : c.toFixed(2); m = isNaN(m) ? "0" : m.toFixed(2); y = isNaN(y) ? "0" : y.toFixed(2); k = k.toFixed(2); - const hex = "#" + + const hex = + "#" + Math.round(r).toString(16).padStart(2, "0") + Math.round(g).toString(16).padStart(2, "0") + Math.round(b).toString(16).padStart(2, "0"), - rgb = "rgb(" + r + ", " + g + ", " + b + ")", + rgb = "rgb(" + r + ", " + g + ", " + b + ")", rgba = "rgba(" + r + ", " + g + ", " + b + ", " + a + ")", - hsl = "hsl(" + h + ", " + s + "%, " + l + "%)", + hsl = "hsl(" + h + ", " + s + "%, " + l + "%)", hsla = "hsla(" + h + ", " + s + "%, " + l + "%, " + a + ")", cmyk = "cmyk(" + c + ", " + m + ", " + y + ", " + k + ")"; @@ -140,17 +156,17 @@ CMYK: ${cmyk} const hue2rgb = function hue2rgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; - if (t < 1/6) return p + (q - p) * 6 * t; - if (t < 1/2) return q; - if (t < 2/3) return p + (q - p) * (2/3 - t) * 6; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; }; const q = l < 0.5 ? l * (1 + s) : l + s - l * s; const p = 2 * l - q; - r = hue2rgb(p, q, h + 1/3); + r = hue2rgb(p, q, h + 1 / 3); g = hue2rgb(p, q, h); - b = hue2rgb(p, q, h - 1/3); + b = hue2rgb(p, q, h - 1 / 3); } return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; @@ -170,7 +186,9 @@ CMYK: ${cmyk} * @return {Array} The HSL representation */ static _rgbToHsl(r, g, b) { - r /= 255; g /= 255; b /= 255; + r /= 255; + g /= 255; + b /= 255; const max = Math.max(r, g, b), min = Math.min(r, g, b), l = (max + min) / 2; @@ -182,9 +200,15 @@ CMYK: ${cmyk} const d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch (max) { - case r: h = (g - b) / d + (g < b ? 6 : 0); break; - case g: h = (b - r) / d + 2; break; - case b: h = (r - g) / d + 4; break; + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; } h /= 6; } diff --git a/src/core/operations/ParseDateTime.mjs b/src/core/operations/ParseDateTime.mjs index 1fb6fb5e..7b4566ad 100644 --- a/src/core/operations/ParseDateTime.mjs +++ b/src/core/operations/ParseDateTime.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import moment from "moment-timezone"; -import {DATETIME_FORMATS, FORMAT_EXAMPLES} from "../lib/DateTime.mjs"; +import { DATETIME_FORMATS, FORMAT_EXAMPLES } from "../lib/DateTime.mjs"; /** * Parse DateTime operation */ class ParseDateTime extends Operation { - /** * ParseDateTime constructor */ @@ -21,27 +20,28 @@ class ParseDateTime extends Operation { this.name = "Parse DateTime"; this.module = "Default"; - this.description = "Parses a DateTime string in your specified format and displays it in whichever timezone you choose with the following information:
          • Date
          • Time
          • Period (AM/PM)
          • Timezone
          • UTC offset
          • Daylight Saving Time
          • Leap year
          • Days in this month
          • Day of year
          • Week number
          • Quarter
          Run with no input to see format string examples if required."; + this.description = + "Parses a DateTime string in your specified format and displays it in whichever timezone you choose with the following information:
          • Date
          • Time
          • Period (AM/PM)
          • Timezone
          • UTC offset
          • Daylight Saving Time
          • Leap year
          • Days in this month
          • Day of year
          • Week number
          • Quarter
          Run with no input to see format string examples if required."; this.infoURL = "https://momentjs.com/docs/#/parsing/string-format/"; this.inputType = "string"; this.outputType = "html"; this.args = [ { - "name": "Built in formats", - "type": "populateOption", - "value": DATETIME_FORMATS, - "target": 1 + name: "Built in formats", + type: "populateOption", + value: DATETIME_FORMATS, + target: 1, }, { - "name": "Input format string", - "type": "binaryString", - "value": "DD/MM/YYYY HH:mm:ss" + name: "Input format string", + type: "binaryString", + value: "DD/MM/YYYY HH:mm:ss", }, { - "name": "Input timezone", - "type": "option", - "value": ["UTC"].concat(moment.tz.names()) - } + name: "Input timezone", + type: "option", + value: ["UTC"].concat(moment.tz.names()), + }, ]; } @@ -63,21 +63,32 @@ class ParseDateTime extends Operation { return `Invalid format.\n\n${FORMAT_EXAMPLES}`; } - output += "Date: " + date.format("dddd Do MMMM YYYY") + - "\nTime: " + date.format("HH:mm:ss") + - "\nPeriod: " + date.format("A") + - "\nTimezone: " + date.format("z") + - "\nUTC offset: " + date.format("ZZ") + - "\n\nDaylight Saving Time: " + date.isDST() + - "\nLeap year: " + date.isLeapYear() + - "\nDays in this month: " + date.daysInMonth() + - "\n\nDay of year: " + date.dayOfYear() + - "\nWeek number: " + date.week() + - "\nQuarter: " + date.quarter(); + output += + "Date: " + + date.format("dddd Do MMMM YYYY") + + "\nTime: " + + date.format("HH:mm:ss") + + "\nPeriod: " + + date.format("A") + + "\nTimezone: " + + date.format("z") + + "\nUTC offset: " + + date.format("ZZ") + + "\n\nDaylight Saving Time: " + + date.isDST() + + "\nLeap year: " + + date.isLeapYear() + + "\nDays in this month: " + + date.daysInMonth() + + "\n\nDay of year: " + + date.dayOfYear() + + "\nWeek number: " + + date.week() + + "\nQuarter: " + + date.quarter(); return output; } - } export default ParseDateTime; diff --git a/src/core/operations/ParseIPRange.mjs b/src/core/operations/ParseIPRange.mjs index 2c59c015..735a92a2 100644 --- a/src/core/operations/ParseIPRange.mjs +++ b/src/core/operations/ParseIPRange.mjs @@ -7,13 +7,19 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ipv4CidrRange, ipv4HyphenatedRange, ipv4ListedRange, ipv6CidrRange, ipv6HyphenatedRange, ipv6ListedRange} from "../lib/IP.mjs"; +import { + ipv4CidrRange, + ipv4HyphenatedRange, + ipv4ListedRange, + ipv6CidrRange, + ipv6HyphenatedRange, + ipv6ListedRange, +} from "../lib/IP.mjs"; /** * Parse IP range operation */ class ParseIPRange extends Operation { - /** * ParseIPRange constructor */ @@ -22,26 +28,27 @@ class ParseIPRange extends Operation { this.name = "Parse IP range"; this.module = "Default"; - this.description = "Given a CIDR range (e.g. 10.0.0.0/24), hyphenated range (e.g. 10.0.0.0 - 10.0.1.0), or a list of IPs and/or CIDR ranges (separated by a new line), this operation provides network information and enumerates all IP addresses in the range.

          IPv6 is supported but will not be enumerated."; + this.description = + "Given a CIDR range (e.g. 10.0.0.0/24), hyphenated range (e.g. 10.0.0.0 - 10.0.1.0), or a list of IPs and/or CIDR ranges (separated by a new line), this operation provides network information and enumerates all IP addresses in the range.

          IPv6 is supported but will not be enumerated."; this.infoURL = "https://wikipedia.org/wiki/Subnetwork"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Include network info", - "type": "boolean", - "value": true + name: "Include network info", + type: "boolean", + value: true, }, { - "name": "Enumerate IP addresses", - "type": "boolean", - "value": true + name: "Enumerate IP addresses", + type: "boolean", + value: true, }, { - "name": "Allow large queries", - "type": "boolean", - "value": false - } + name: "Allow large queries", + type: "boolean", + value: false, + }, ]; } @@ -51,27 +58,43 @@ class ParseIPRange extends Operation { * @returns {string} */ run(input, args) { - const [ - includeNetworkInfo, - enumerateAddresses, - allowLargeList - ] = args; + const [includeNetworkInfo, enumerateAddresses, allowLargeList] = args; // Check what type of input we are looking at const ipv4CidrRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\/(\d\d?)\s*$/, - ipv4RangeRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*-\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/, - ipv4ListRegex = /^\s*(((?:\d{1,3}\.){3}\d{1,3})(\/(\d\d?))?(\n|$)(\n*))+\s*$/, - ipv6CidrRegex = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\/(\d\d?\d?)\s*$/i, - ipv6RangeRegex = /^\s*(((?=.*::)(?!.*::[^-]+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*-\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\17)::|:\b|(?![\dA-F])))|(?!\16\17)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, - ipv6ListRegex = /^\s*((((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))(\/(\d\d?\d?))?(\n|$)(\n*))+\s*$/i; + ipv4RangeRegex = + /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*-\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/, + ipv4ListRegex = + /^\s*(((?:\d{1,3}\.){3}\d{1,3})(\/(\d\d?))?(\n|$)(\n*))+\s*$/, + ipv6CidrRegex = + /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\/(\d\d?\d?)\s*$/i, + ipv6RangeRegex = + /^\s*(((?=.*::)(?!.*::[^-]+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*-\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\17)::|:\b|(?![\dA-F])))|(?!\16\17)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, + ipv6ListRegex = + /^\s*((((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))(\/(\d\d?\d?))?(\n|$)(\n*))+\s*$/i; let match; if ((match = ipv4CidrRegex.exec(input))) { - return ipv4CidrRange(match, includeNetworkInfo, enumerateAddresses, allowLargeList); + return ipv4CidrRange( + match, + includeNetworkInfo, + enumerateAddresses, + allowLargeList, + ); } else if ((match = ipv4RangeRegex.exec(input))) { - return ipv4HyphenatedRange(match, includeNetworkInfo, enumerateAddresses, allowLargeList); + return ipv4HyphenatedRange( + match, + includeNetworkInfo, + enumerateAddresses, + allowLargeList, + ); } else if ((match = ipv4ListRegex.exec(input))) { - return ipv4ListedRange(match, includeNetworkInfo, enumerateAddresses, allowLargeList); + return ipv4ListedRange( + match, + includeNetworkInfo, + enumerateAddresses, + allowLargeList, + ); } else if ((match = ipv6CidrRegex.exec(input))) { return ipv6CidrRange(match, includeNetworkInfo); } else if ((match = ipv6RangeRegex.exec(input))) { @@ -79,11 +102,11 @@ class ParseIPRange extends Operation { } else if ((match = ipv6ListRegex.exec(input))) { return ipv6ListedRange(match, includeNetworkInfo); } else { - throw new OperationError("Invalid input.\n\nEnter either a CIDR range (e.g. 10.0.0.0/24) or a hyphenated range (e.g. 10.0.0.0 - 10.0.1.0). IPv6 also supported."); + throw new OperationError( + "Invalid input.\n\nEnter either a CIDR range (e.g. 10.0.0.0/24) or a hyphenated range (e.g. 10.0.0.0 - 10.0.1.0). IPv6 also supported.", + ); } } - } - export default ParseIPRange; diff --git a/src/core/operations/ParseIPv4Header.mjs b/src/core/operations/ParseIPv4Header.mjs index 84351cdc..ed213294 100644 --- a/src/core/operations/ParseIPv4Header.mjs +++ b/src/core/operations/ParseIPv4Header.mjs @@ -7,15 +7,14 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {fromHex, toHex} from "../lib/Hex.mjs"; -import {ipv4ToStr, protocolLookup} from "../lib/IP.mjs"; +import { fromHex, toHex } from "../lib/Hex.mjs"; +import { ipv4ToStr, protocolLookup } from "../lib/IP.mjs"; import TCPIPChecksum from "./TCPIPChecksum.mjs"; /** * Parse IPv4 header operation */ class ParseIPv4Header extends Operation { - /** * ParseIPv4Header constructor */ @@ -24,16 +23,17 @@ class ParseIPv4Header extends Operation { this.name = "Parse IPv4 header"; this.module = "Default"; - this.description = "Given an IPv4 header, this operations parses and displays each field in an easily readable format."; + this.description = + "Given an IPv4 header, this operations parses and displays each field in an easily readable format."; this.infoURL = "https://wikipedia.org/wiki/IPv4#Header"; this.inputType = "string"; this.outputType = "html"; this.args = [ { - "name": "Input format", - "type": "option", - "value": ["Hex", "Raw"] - } + name: "Input format", + type: "option", + value: ["Hex", "Raw"], + }, ]; } @@ -57,23 +57,35 @@ class ParseIPv4Header extends Operation { let ihl = input[0] & 0x0f; const dscp = (input[1] >>> 2) & 0x3f, ecn = input[1] & 0x03, - length = input[2] << 8 | input[3], - identification = input[4] << 8 | input[5], + length = (input[2] << 8) | input[3], + identification = (input[4] << 8) | input[5], flags = (input[6] >>> 5) & 0x07, - fragOffset = (input[6] & 0x1f) << 8 | input[7], + fragOffset = ((input[6] & 0x1f) << 8) | input[7], ttl = input[8], protocol = input[9], - checksum = input[10] << 8 | input[11], - srcIP = input[12] << 24 | input[13] << 16 | input[14] << 8 | input[15], - dstIP = input[16] << 24 | input[17] << 16 | input[18] << 8 | input[19], - checksumHeader = input.slice(0, 10).concat([0, 0]).concat(input.slice(12, 20)); + checksum = (input[10] << 8) | input[11], + srcIP = + (input[12] << 24) | + (input[13] << 16) | + (input[14] << 8) | + input[15], + dstIP = + (input[16] << 24) | + (input[17] << 16) | + (input[18] << 8) | + input[19], + checksumHeader = input + .slice(0, 10) + .concat([0, 0]) + .concat(input.slice(12, 20)); let version = (input[0] >>> 4) & 0x0f, options = []; - // Version if (version !== 4) { - version = version + " (Error: for IPv4 headers, this should always be set to 4)"; + version = + version + + " (Error: for IPv4 headers, this should always be set to 4)"; } // IHL @@ -86,16 +98,23 @@ class ParseIPv4Header extends Operation { } // Protocol - const protocolInfo = protocolLookup[protocol] || {keyword: "", protocol: ""}; + const protocolInfo = protocolLookup[protocol] || { + keyword: "", + protocol: "", + }; // Checksum - const correctChecksum = (new TCPIPChecksum).run(checksumHeader), + const correctChecksum = new TCPIPChecksum().run(checksumHeader), givenChecksum = Utils.hex(checksum); let checksumResult; if (correctChecksum === givenChecksum) { checksumResult = givenChecksum + " (correct)"; } else { - checksumResult = givenChecksum + " (incorrect, should be " + correctChecksum + ")"; + checksumResult = + givenChecksum + + " (incorrect, should be " + + correctChecksum + + ")"; } output = `
          Rotor stops Partial plugboard Decryption preview
          ${setting} ${stecker} ${decrypt}
          @@ -109,11 +128,13 @@ class ParseIPv4Header extends Operation { - +`; @@ -124,7 +145,6 @@ class ParseIPv4Header extends Operation { return output + "
          FieldValue
          Identification0x${Utils.hex(identification)} (${identification})
          Flags0x${Utils.hex(flags, 2)} Reserved bit:${flags >> 2} (must be 0) - Don't fragment:${flags >> 1 & 1} + Don't fragment:${(flags >> 1) & 1} More fragments:${flags & 1}
          Fragment offset${fragOffset}
          Time-To-Live${ttl}
          Protocol${protocol}, ${protocolInfo.protocol} (${protocolInfo.keyword})
          Protocol${protocol}, ${protocolInfo.protocol} (${ + protocolInfo.keyword + })
          Header checksum${checksumResult}
          Source IP address${ipv4ToStr(srcIP)}
          Destination IP address${ipv4ToStr(dstIP)}
          "; } - } export default ParseIPv4Header; diff --git a/src/core/operations/ParseIPv6Address.mjs b/src/core/operations/ParseIPv6Address.mjs index f2141e01..da9e2bbd 100644 --- a/src/core/operations/ParseIPv6Address.mjs +++ b/src/core/operations/ParseIPv6Address.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {strToIpv6, ipv6ToStr, ipv4ToStr, IPV6_REGEX} from "../lib/IP.mjs"; +import { strToIpv6, ipv6ToStr, ipv4ToStr, IPV6_REGEX } from "../lib/IP.mjs"; import BigNumber from "bignumber.js"; /** * Parse IPv6 address operation */ class ParseIPv6Address extends Operation { - /** * ParseIPv6Address constructor */ @@ -23,7 +22,8 @@ class ParseIPv6Address extends Operation { this.name = "Parse IPv6 address"; this.module = "Default"; - this.description = "Displays the longhand and shorthand versions of a valid IPv6 address.

          Recognises all reserved ranges and parses encapsulated or tunnelled addresses including Teredo and 6to4."; + this.description = + "Displays the longhand and shorthand versions of a valid IPv6 address.

          Recognises all reserved ranges and parses encapsulated or tunnelled addresses including Teredo and 6to4."; this.infoURL = "https://wikipedia.org/wiki/IPv6_address"; this.inputType = "string"; this.outputType = "string"; @@ -44,56 +44,92 @@ class ParseIPv6Address extends Operation { longhand = ipv6ToStr(ipv6), shorthand = ipv6ToStr(ipv6, true); - output += "Longhand: " + longhand + "\nShorthand: " + shorthand + "\n"; + output += + "Longhand: " + longhand + "\nShorthand: " + shorthand + "\n"; // Detect reserved addresses if (shorthand === "::") { // Unspecified address - output += "\nUnspecified address corresponding to 0.0.0.0/32 in IPv4."; + output += + "\nUnspecified address corresponding to 0.0.0.0/32 in IPv4."; output += "\nUnspecified address range: ::/128"; } else if (shorthand === "::1") { // Loopback address - output += "\nLoopback address to the local host corresponding to 127.0.0.1/8 in IPv4."; + output += + "\nLoopback address to the local host corresponding to 127.0.0.1/8 in IPv4."; output += "\nLoopback addresses range: ::1/128"; - } else if (ipv6[0] === 0 && ipv6[1] === 0 && ipv6[2] === 0 && - ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0xffff) { + } else if ( + ipv6[0] === 0 && + ipv6[1] === 0 && + ipv6[2] === 0 && + ipv6[3] === 0 && + ipv6[4] === 0 && + ipv6[5] === 0xffff + ) { // IPv4-mapped IPv6 address - output += "\nIPv4-mapped IPv6 address detected. IPv6 clients will be handled natively by default, and IPv4 clients appear as IPv6 clients at their IPv4-mapped IPv6 address."; - output += "\nMapped IPv4 address: " + ipv4ToStr((ipv6[6] << 16) + ipv6[7]); + output += + "\nIPv4-mapped IPv6 address detected. IPv6 clients will be handled natively by default, and IPv4 clients appear as IPv6 clients at their IPv4-mapped IPv6 address."; + output += + "\nMapped IPv4 address: " + + ipv4ToStr((ipv6[6] << 16) + ipv6[7]); output += "\nIPv4-mapped IPv6 addresses range: ::ffff:0:0/96"; - } else if (ipv6[0] === 0 && ipv6[1] === 0 && ipv6[2] === 0 && - ipv6[3] === 0 && ipv6[4] === 0xffff && ipv6[5] === 0) { + } else if ( + ipv6[0] === 0 && + ipv6[1] === 0 && + ipv6[2] === 0 && + ipv6[3] === 0 && + ipv6[4] === 0xffff && + ipv6[5] === 0 + ) { // IPv4-translated address - output += "\nIPv4-translated address detected. Used by Stateless IP/ICMP Translation (SIIT). See RFCs 6145 and 6052 for more details."; - output += "\nTranslated IPv4 address: " + ipv4ToStr((ipv6[6] << 16) + ipv6[7]); + output += + "\nIPv4-translated address detected. Used by Stateless IP/ICMP Translation (SIIT). See RFCs 6145 and 6052 for more details."; + output += + "\nTranslated IPv4 address: " + + ipv4ToStr((ipv6[6] << 16) + ipv6[7]); output += "\nIPv4-translated addresses range: ::ffff:0:0:0/96"; } else if (ipv6[0] === 0x100) { // Discard prefix per RFC 6666 - output += "\nDiscard prefix detected. This is used when forwarding traffic to a sinkhole router to mitigate the effects of a denial-of-service attack. See RFC 6666 for more details."; + output += + "\nDiscard prefix detected. This is used when forwarding traffic to a sinkhole router to mitigate the effects of a denial-of-service attack. See RFC 6666 for more details."; output += "\nDiscard range: 100::/64"; - } else if (ipv6[0] === 0x64 && ipv6[1] === 0xff9b && ipv6[2] === 0 && - ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0) { + } else if ( + ipv6[0] === 0x64 && + ipv6[1] === 0xff9b && + ipv6[2] === 0 && + ipv6[3] === 0 && + ipv6[4] === 0 && + ipv6[5] === 0 + ) { // IPv4/IPv6 translation per RFC 6052 - output += "\n'Well-Known' prefix for IPv4/IPv6 translation detected. See RFC 6052 for more details."; - output += "\nTranslated IPv4 address: " + ipv4ToStr((ipv6[6] << 16) + ipv6[7]); + output += + "\n'Well-Known' prefix for IPv4/IPv6 translation detected. See RFC 6052 for more details."; + output += + "\nTranslated IPv4 address: " + + ipv4ToStr((ipv6[6] << 16) + ipv6[7]); output += "\n'Well-Known' prefix range: 64:ff9b::/96"; } else if (ipv6[0] === 0x2001 && ipv6[1] === 0) { // Teredo tunneling output += "\nTeredo tunneling IPv6 address detected\n"; - const serverIpv4 = (ipv6[2] << 16) + ipv6[3], - udpPort = (~ipv6[5]) & 0xffff, - clientIpv4 = ~((ipv6[6] << 16) + ipv6[7]), - flagCone = (ipv6[4] >>> 15) & 1, - flagR = (ipv6[4] >>> 14) & 1, + const serverIpv4 = (ipv6[2] << 16) + ipv6[3], + udpPort = ~ipv6[5] & 0xffff, + clientIpv4 = ~((ipv6[6] << 16) + ipv6[7]), + flagCone = (ipv6[4] >>> 15) & 1, + flagR = (ipv6[4] >>> 14) & 1, flagRandom1 = (ipv6[4] >>> 10) & 15, - flagUg = (ipv6[4] >>> 8) & 3, + flagUg = (ipv6[4] >>> 8) & 3, flagRandom2 = ipv6[4] & 255; - output += "\nServer IPv4 address: " + ipv4ToStr(serverIpv4) + - "\nClient IPv4 address: " + ipv4ToStr(clientIpv4) + - "\nClient UDP port: " + udpPort + + output += + "\nServer IPv4 address: " + + ipv4ToStr(serverIpv4) + + "\nClient IPv4 address: " + + ipv4ToStr(clientIpv4) + + "\nClient UDP port: " + + udpPort + "\nFlags:" + - "\n\tCone: " + flagCone; + "\n\tCone: " + + flagCone; if (flagCone) { output += " (Client is behind a cone NAT)"; @@ -104,62 +140,93 @@ class ParseIPv6Address extends Operation { output += "\n\tR: " + flagR; if (flagR) { - output += " Error: This flag should be set to 0. See RFC 5991 and RFC 4380."; + output += + " Error: This flag should be set to 0. See RFC 5991 and RFC 4380."; } - output += "\n\tRandom1: " + Utils.bin(flagRandom1, 4) + - "\n\tUG: " + Utils.bin(flagUg, 2); + output += + "\n\tRandom1: " + + Utils.bin(flagRandom1, 4) + + "\n\tUG: " + + Utils.bin(flagUg, 2); if (flagUg) { - output += " Error: This flag should be set to 00. See RFC 4380."; + output += + " Error: This flag should be set to 00. See RFC 4380."; } output += "\n\tRandom2: " + Utils.bin(flagRandom2, 8); if (!flagR && !flagUg && flagRandom1 && flagRandom2) { - output += "\n\nThis is a valid Teredo address which complies with RFC 4380 and RFC 5991."; + output += + "\n\nThis is a valid Teredo address which complies with RFC 4380 and RFC 5991."; } else if (!flagR && !flagUg) { - output += "\n\nThis is a valid Teredo address which complies with RFC 4380, however it does not comply with RFC 5991 (Teredo Security Updates) as there are no randomised bits in the flag field."; + output += + "\n\nThis is a valid Teredo address which complies with RFC 4380, however it does not comply with RFC 5991 (Teredo Security Updates) as there are no randomised bits in the flag field."; } else { output += "\n\nThis is an invalid Teredo address."; } output += "\n\nTeredo prefix range: 2001::/32"; } else if (ipv6[0] === 0x2001 && ipv6[1] === 0x2 && ipv6[2] === 0) { // Benchmarking - output += "\nAssigned to the Benchmarking Methodology Working Group (BMWG) for benchmarking IPv6. Corresponds to 198.18.0.0/15 for benchmarking IPv4. See RFC 5180 for more details."; + output += + "\nAssigned to the Benchmarking Methodology Working Group (BMWG) for benchmarking IPv6. Corresponds to 198.18.0.0/15 for benchmarking IPv4. See RFC 5180 for more details."; output += "\nBMWG range: 2001:2::/48"; - } else if (ipv6[0] === 0x2001 && ipv6[1] >= 0x10 && ipv6[1] <= 0x1f) { + } else if ( + ipv6[0] === 0x2001 && + ipv6[1] >= 0x10 && + ipv6[1] <= 0x1f + ) { // ORCHIDv1 - output += "\nDeprecated, previously ORCHIDv1 (Overlay Routable Cryptographic Hash Identifiers).\nORCHIDv1 range: 2001:10::/28\nORCHIDv2 now uses 2001:20::/28."; - } else if (ipv6[0] === 0x2001 && ipv6[1] >= 0x20 && ipv6[1] <= 0x2f) { + output += + "\nDeprecated, previously ORCHIDv1 (Overlay Routable Cryptographic Hash Identifiers).\nORCHIDv1 range: 2001:10::/28\nORCHIDv2 now uses 2001:20::/28."; + } else if ( + ipv6[0] === 0x2001 && + ipv6[1] >= 0x20 && + ipv6[1] <= 0x2f + ) { // ORCHIDv2 - output += "\nORCHIDv2 (Overlay Routable Cryptographic Hash Identifiers).\nThese are non-routed IPv6 addresses used for Cryptographic Hash Identifiers."; + output += + "\nORCHIDv2 (Overlay Routable Cryptographic Hash Identifiers).\nThese are non-routed IPv6 addresses used for Cryptographic Hash Identifiers."; output += "\nORCHIDv2 range: 2001:20::/28"; } else if (ipv6[0] === 0x2001 && ipv6[1] === 0xdb8) { // Documentation - output += "\nThis is a documentation IPv6 address. This range should be used whenever an example IPv6 address is given or to model networking scenarios. Corresponds to 192.0.2.0/24, 198.51.100.0/24, and 203.0.113.0/24 in IPv4."; + output += + "\nThis is a documentation IPv6 address. This range should be used whenever an example IPv6 address is given or to model networking scenarios. Corresponds to 192.0.2.0/24, 198.51.100.0/24, and 203.0.113.0/24 in IPv4."; output += "\nDocumentation range: 2001:db8::/32"; } else if (ipv6[0] === 0x2002) { // 6to4 - output += "\n6to4 transition IPv6 address detected. See RFC 3056 for more details." + + output += + "\n6to4 transition IPv6 address detected. See RFC 3056 for more details." + "\n6to4 prefix range: 2002::/16"; const v4Addr = ipv4ToStr((ipv6[1] << 16) + ipv6[2]), slaId = ipv6[3], - interfaceIdStr = ipv6[4].toString(16) + ipv6[5].toString(16) + ipv6[6].toString(16) + ipv6[7].toString(16), + interfaceIdStr = + ipv6[4].toString(16) + + ipv6[5].toString(16) + + ipv6[6].toString(16) + + ipv6[7].toString(16), interfaceId = new BigNumber(interfaceIdStr, 16); - output += "\n\nEncapsulated IPv4 address: " + v4Addr + - "\nSLA ID: " + slaId + - "\nInterface ID (base 16): " + interfaceIdStr + - "\nInterface ID (base 10): " + interfaceId.toString(); + output += + "\n\nEncapsulated IPv4 address: " + + v4Addr + + "\nSLA ID: " + + slaId + + "\nInterface ID (base 16): " + + interfaceIdStr + + "\nInterface ID (base 10): " + + interfaceId.toString(); } else if (ipv6[0] >= 0xfc00 && ipv6[0] <= 0xfdff) { // Unique local address - output += "\nThis is a unique local address comparable to the IPv4 private addresses 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. See RFC 4193 for more details."; + output += + "\nThis is a unique local address comparable to the IPv4 private addresses 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. See RFC 4193 for more details."; output += "\nUnique local addresses range: fc00::/7"; } else if (ipv6[0] >= 0xfe80 && ipv6[0] <= 0xfebf) { // Link-local address - output += "\nThis is a link-local address comparable to the auto-configuration addresses 169.254.0.0/16 in IPv4."; + output += + "\nThis is a link-local address comparable to the auto-configuration addresses 169.254.0.0/16 in IPv4."; output += "\nLink-local addresses range: fe80::/10"; } else if (ipv6[0] >= 0xff00) { // Multicast @@ -168,109 +235,157 @@ class ParseIPv6Address extends Operation { switch (ipv6[0]) { case 0xff01: - output += "\n\nReserved Multicast Block for Interface Local Scope"; + output += + "\n\nReserved Multicast Block for Interface Local Scope"; break; case 0xff02: - output += "\n\nReserved Multicast Block for Link Local Scope"; + output += + "\n\nReserved Multicast Block for Link Local Scope"; break; case 0xff03: - output += "\n\nReserved Multicast Block for Realm Local Scope"; + output += + "\n\nReserved Multicast Block for Realm Local Scope"; break; case 0xff04: - output += "\n\nReserved Multicast Block for Admin Local Scope"; + output += + "\n\nReserved Multicast Block for Admin Local Scope"; break; case 0xff05: - output += "\n\nReserved Multicast Block for Site Local Scope"; + output += + "\n\nReserved Multicast Block for Site Local Scope"; break; case 0xff08: - output += "\n\nReserved Multicast Block for Organisation Local Scope"; + output += + "\n\nReserved Multicast Block for Organisation Local Scope"; break; case 0xff0e: - output += "\n\nReserved Multicast Block for Global Scope"; + output += + "\n\nReserved Multicast Block for Global Scope"; break; } if (ipv6[6] === 1) { if (ipv6[7] === 2) { - output += "\nReserved Multicast Address for 'All DHCP Servers and Relay Agents (defined in RFC3315)'"; + output += + "\nReserved Multicast Address for 'All DHCP Servers and Relay Agents (defined in RFC3315)'"; } else if (ipv6[7] === 3) { - output += "\nReserved Multicast Address for 'All LLMNR Hosts (defined in RFC4795)'"; + output += + "\nReserved Multicast Address for 'All LLMNR Hosts (defined in RFC4795)'"; } } else { switch (ipv6[7]) { case 1: - output += "\nReserved Multicast Address for 'All nodes'"; + output += + "\nReserved Multicast Address for 'All nodes'"; break; case 2: - output += "\nReserved Multicast Address for 'All routers'"; + output += + "\nReserved Multicast Address for 'All routers'"; break; case 5: - output += "\nReserved Multicast Address for 'OSPFv3 - All OSPF routers'"; + output += + "\nReserved Multicast Address for 'OSPFv3 - All OSPF routers'"; break; case 6: - output += "\nReserved Multicast Address for 'OSPFv3 - All Designated Routers'"; + output += + "\nReserved Multicast Address for 'OSPFv3 - All Designated Routers'"; break; case 8: - output += "\nReserved Multicast Address for 'IS-IS for IPv6 Routers'"; + output += + "\nReserved Multicast Address for 'IS-IS for IPv6 Routers'"; break; case 9: - output += "\nReserved Multicast Address for 'RIP Routers'"; + output += + "\nReserved Multicast Address for 'RIP Routers'"; break; case 0xa: - output += "\nReserved Multicast Address for 'EIGRP Routers'"; + output += + "\nReserved Multicast Address for 'EIGRP Routers'"; break; case 0xc: - output += "\nReserved Multicast Address for 'Simple Service Discovery Protocol'"; + output += + "\nReserved Multicast Address for 'Simple Service Discovery Protocol'"; break; case 0xd: - output += "\nReserved Multicast Address for 'PIM Routers'"; + output += + "\nReserved Multicast Address for 'PIM Routers'"; break; case 0x16: - output += "\nReserved Multicast Address for 'MLDv2 Reports (defined in RFC3810)'"; + output += + "\nReserved Multicast Address for 'MLDv2 Reports (defined in RFC3810)'"; break; case 0x6b: - output += "\nReserved Multicast Address for 'Precision Time Protocol v2 Peer Delay Measurement Messages'"; + output += + "\nReserved Multicast Address for 'Precision Time Protocol v2 Peer Delay Measurement Messages'"; break; case 0xfb: - output += "\nReserved Multicast Address for 'Multicast DNS'"; + output += + "\nReserved Multicast Address for 'Multicast DNS'"; break; case 0x101: - output += "\nReserved Multicast Address for 'Network Time Protocol'"; + output += + "\nReserved Multicast Address for 'Network Time Protocol'"; break; case 0x108: - output += "\nReserved Multicast Address for 'Network Information Service'"; + output += + "\nReserved Multicast Address for 'Network Information Service'"; break; case 0x114: - output += "\nReserved Multicast Address for 'Experiments'"; + output += + "\nReserved Multicast Address for 'Experiments'"; break; case 0x181: - output += "\nReserved Multicast Address for 'Precision Time Protocol v2 Messages (exc. Peer Delay)'"; + output += + "\nReserved Multicast Address for 'Precision Time Protocol v2 Messages (exc. Peer Delay)'"; break; } } } - // Detect possible EUI-64 addresses - if (((ipv6[5] & 0xff) === 0xff) && (ipv6[6] >>> 8 === 0xfe)) { - output += "\n\nThis IPv6 address contains a modified EUI-64 address, identified by the presence of FF:FE in the 12th and 13th octets."; + if ((ipv6[5] & 0xff) === 0xff && ipv6[6] >>> 8 === 0xfe) { + output += + "\n\nThis IPv6 address contains a modified EUI-64 address, identified by the presence of FF:FE in the 12th and 13th octets."; - const intIdent = Utils.hex(ipv6[4] >>> 8) + ":" + Utils.hex(ipv6[4] & 0xff) + ":" + - Utils.hex(ipv6[5] >>> 8) + ":" + Utils.hex(ipv6[5] & 0xff) + ":" + - Utils.hex(ipv6[6] >>> 8) + ":" + Utils.hex(ipv6[6] & 0xff) + ":" + - Utils.hex(ipv6[7] >>> 8) + ":" + Utils.hex(ipv6[7] & 0xff), - mac = Utils.hex((ipv6[4] >>> 8) ^ 2) + ":" + Utils.hex(ipv6[4] & 0xff) + ":" + - Utils.hex(ipv6[5] >>> 8) + ":" + Utils.hex(ipv6[6] & 0xff) + ":" + - Utils.hex(ipv6[7] >>> 8) + ":" + Utils.hex(ipv6[7] & 0xff); - output += "\nInterface identifier: " + intIdent + - "\nMAC address: " + mac; + const intIdent = + Utils.hex(ipv6[4] >>> 8) + + ":" + + Utils.hex(ipv6[4] & 0xff) + + ":" + + Utils.hex(ipv6[5] >>> 8) + + ":" + + Utils.hex(ipv6[5] & 0xff) + + ":" + + Utils.hex(ipv6[6] >>> 8) + + ":" + + Utils.hex(ipv6[6] & 0xff) + + ":" + + Utils.hex(ipv6[7] >>> 8) + + ":" + + Utils.hex(ipv6[7] & 0xff), + mac = + Utils.hex((ipv6[4] >>> 8) ^ 2) + + ":" + + Utils.hex(ipv6[4] & 0xff) + + ":" + + Utils.hex(ipv6[5] >>> 8) + + ":" + + Utils.hex(ipv6[6] & 0xff) + + ":" + + Utils.hex(ipv6[7] >>> 8) + + ":" + + Utils.hex(ipv6[7] & 0xff); + output += + "\nInterface identifier: " + + intIdent + + "\nMAC address: " + + mac; } } else { throw new OperationError("Invalid IPv6 address"); } return output; } - } export default ParseIPv6Address; diff --git a/src/core/operations/ParseObjectIDTimestamp.mjs b/src/core/operations/ParseObjectIDTimestamp.mjs index f86c098e..c56ee8c9 100644 --- a/src/core/operations/ParseObjectIDTimestamp.mjs +++ b/src/core/operations/ParseObjectIDTimestamp.mjs @@ -12,7 +12,6 @@ import BSON from "bson"; * Parse ObjectID timestamp operation */ class ParseObjectIDTimestamp extends Operation { - /** * ParseObjectIDTimestamp constructor */ @@ -21,8 +20,10 @@ class ParseObjectIDTimestamp extends Operation { this.name = "Parse ObjectID timestamp"; this.module = "Serialise"; - this.description = "Parse timestamp from MongoDB/BSON ObjectID hex string."; - this.infoURL = "https://docs.mongodb.com/manual/reference/method/ObjectId.getTimestamp/"; + this.description = + "Parse timestamp from MongoDB/BSON ObjectID hex string."; + this.infoURL = + "https://docs.mongodb.com/manual/reference/method/ObjectId.getTimestamp/"; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -41,7 +42,6 @@ class ParseObjectIDTimestamp extends Operation { throw new OperationError(err); } } - } export default ParseObjectIDTimestamp; diff --git a/src/core/operations/ParseQRCode.mjs b/src/core/operations/ParseQRCode.mjs index 77ab7d21..05032d2b 100644 --- a/src/core/operations/ParseQRCode.mjs +++ b/src/core/operations/ParseQRCode.mjs @@ -13,7 +13,6 @@ import { parseQrCode } from "../lib/QRCode.mjs"; * Parse QR Code operation */ class ParseQRCode extends Operation { - /** * ParseQRCode constructor */ @@ -22,24 +21,26 @@ class ParseQRCode extends Operation { this.name = "Parse QR Code"; this.module = "Image"; - this.description = "Reads an image file and attempts to detect and read a Quick Response (QR) code from the image.

          Normalise Image
          Attempts to normalise the image before parsing it to improve detection of a QR code."; + this.description = + "Reads an image file and attempts to detect and read a Quick Response (QR) code from the image.

          Normalise Image
          Attempts to normalise the image before parsing it to improve detection of a QR code."; this.infoURL = "https://wikipedia.org/wiki/QR_code"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Normalise image", - "type": "boolean", - "value": false - } + name: "Normalise image", + type: "boolean", + value: false, + }, ]; this.checks = [ { - "pattern": "^(?:\\xff\\xd8\\xff|\\x89\\x50\\x4e\\x47|\\x47\\x49\\x46|.{8}\\x57\\x45\\x42\\x50|\\x42\\x4d)", - "flags": "", - "args": [false], - "useful": true - } + pattern: + "^(?:\\xff\\xd8\\xff|\\x89\\x50\\x4e\\x47|\\x47\\x49\\x46|.{8}\\x57\\x45\\x42\\x50|\\x42\\x4d)", + flags: "", + args: [false], + useful: true, + }, ]; } @@ -56,7 +57,6 @@ class ParseQRCode extends Operation { } return await parseQrCode(input, normalise); } - } export default ParseQRCode; diff --git a/src/core/operations/ParseSSHHostKey.mjs b/src/core/operations/ParseSSHHostKey.mjs index f1a1f58c..22d0916c 100644 --- a/src/core/operations/ParseSSHHostKey.mjs +++ b/src/core/operations/ParseSSHHostKey.mjs @@ -14,7 +14,6 @@ import { fromHex, toHexFast } from "../lib/Hex.mjs"; * Parse SSH Host Key operation */ class ParseSSHHostKey extends Operation { - /** * ParseSSHHostKey constructor */ @@ -23,7 +22,8 @@ class ParseSSHHostKey extends Operation { this.name = "Parse SSH Host Key"; this.module = "Default"; - this.description = "Parses a SSH host key and extracts fields from it.
          The key type can be:
          • ssh-rsa
          • ssh-dss
          • ecdsa-sha2
          • ssh-ed25519
          The key format can be either Hex or Base64."; + this.description = + "Parses a SSH host key and extracts fields from it.
          The key type can be:
          • ssh-rsa
          • ssh-dss
          • ecdsa-sha2
          • ssh-ed25519
          The key format can be either Hex or Base64."; this.infoURL = "https://wikipedia.org/wiki/Secure_Shell"; this.inputType = "string"; this.outputType = "string"; @@ -31,19 +31,15 @@ class ParseSSHHostKey extends Operation { { name: "Input Format", type: "option", - value: [ - "Auto", - "Base64", - "Hex" - ] - } + value: ["Auto", "Base64", "Hex"], + }, ]; this.checks = [ { - pattern: "^\\s*([A-F\\d]{2}[,;:]){15,}[A-F\\d]{2}\\s*$", - flags: "i", - args: ["Hex"] - } + pattern: "^\\s*([A-F\\d]{2}[,;:]){15,}[A-F\\d]{2}\\s*$", + flags: "i", + args: ["Hex"], + }, ]; } @@ -108,7 +104,6 @@ class ParseSSHHostKey extends Operation { } } - /** * Detects if the key is base64 or hex encoded * @@ -117,7 +112,9 @@ class ParseSSHHostKey extends Operation { */ detectKeyFormat(inputKey) { const hexPattern = new RegExp(/^(?:[\dA-Fa-f]{2}[ ,;:]?)+$/); - const b64Pattern = new RegExp(/^\s*(?:[A-Za-z\d+/]{4})+(?:[A-Za-z\d+/]{2}==|[A-Za-z\d+/]{3}=)?\s*$/); + const b64Pattern = new RegExp( + /^\s*(?:[A-Za-z\d+/]{4})+(?:[A-Za-z\d+/]{2}==|[A-Za-z\d+/]{3}=)?\s*$/, + ); if (hexPattern.test(inputKey)) { return "Hex"; @@ -128,7 +125,6 @@ class ParseSSHHostKey extends Operation { } } - /** * Parses fields from the key * @@ -153,7 +149,6 @@ class ParseSSHHostKey extends Operation { return fields; } - } export default ParseSSHHostKey; diff --git a/src/core/operations/ParseTCP.mjs b/src/core/operations/ParseTCP.mjs index 7adb37e0..29f5766d 100644 --- a/src/core/operations/ParseTCP.mjs +++ b/src/core/operations/ParseTCP.mjs @@ -6,9 +6,9 @@ import Operation from "../Operation.mjs"; import Stream from "../lib/Stream.mjs"; -import {toHexFast, fromHex} from "../lib/Hex.mjs"; -import {toBinary} from "../lib/Binary.mjs"; -import {objToTable, bytesToLargeNumber} from "../lib/Protocol.mjs"; +import { toHexFast, fromHex } from "../lib/Hex.mjs"; +import { toBinary } from "../lib/Binary.mjs"; +import { objToTable, bytesToLargeNumber } from "../lib/Protocol.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; import BigNumber from "bignumber.js"; @@ -17,7 +17,6 @@ import BigNumber from "bignumber.js"; * Parse TCP operation */ class ParseTCP extends Operation { - /** * ParseTCP constructor */ @@ -27,7 +26,8 @@ class ParseTCP extends Operation { this.name = "Parse TCP"; this.module = "Default"; this.description = "Parses a TCP header and payload (if present)."; - this.infoURL = "https://wikipedia.org/wiki/Transmission_Control_Protocol"; + this.infoURL = + "https://wikipedia.org/wiki/Transmission_Control_Protocol"; this.inputType = "string"; this.outputType = "json"; this.presentType = "html"; @@ -35,8 +35,8 @@ class ParseTCP extends Operation { { name: "Input format", type: "option", - value: ["Hex", "Raw"] - } + value: ["Hex", "Raw"], + }, ]; } @@ -68,21 +68,21 @@ class ParseTCP extends Operation { "Sequence number": bytesToLargeNumber(s.getBytes(4)), "Acknowledgement number": s.readInt(4), "Data offset": s.readBits(4), - "Flags": { - "Reserved": toBinary(s.readBits(3), "", 3), - "NS": s.readBits(1), - "CWR": s.readBits(1), - "ECE": s.readBits(1), - "URG": s.readBits(1), - "ACK": s.readBits(1), - "PSH": s.readBits(1), - "RST": s.readBits(1), - "SYN": s.readBits(1), - "FIN": s.readBits(1), + Flags: { + Reserved: toBinary(s.readBits(3), "", 3), + NS: s.readBits(1), + CWR: s.readBits(1), + ECE: s.readBits(1), + URG: s.readBits(1), + ACK: s.readBits(1), + PSH: s.readBits(1), + RST: s.readBits(1), + SYN: s.readBits(1), + FIN: s.readBits(1), }, "Window size": s.readInt(2), - "Checksum": "0x" + toHexFast(s.getBytes(2)), - "Urgent pointer": "0x" + toHexFast(s.getBytes(2)) + Checksum: "0x" + toHexFast(s.getBytes(2)), + "Urgent pointer": "0x" + toHexFast(s.getBytes(2)), }; // Parse options if present @@ -93,11 +93,16 @@ class ParseTCP extends Operation { const options = {}; while (remainingLength > 0) { const option = { - "Kind": s.readInt(1) + Kind: s.readInt(1), }; let opt = { name: "Reserved", length: true }; - if (Object.prototype.hasOwnProperty.call(TCP_OPTION_KIND_LOOKUP, option.Kind)) { + if ( + Object.prototype.hasOwnProperty.call( + TCP_OPTION_KIND_LOOKUP, + option.Kind, + ) + ) { opt = TCP_OPTION_KIND_LOOKUP[option.Kind]; } @@ -106,12 +111,18 @@ class ParseTCP extends Operation { option.Length = s.readInt(1); if (option.Length > 2) { - if (Object.prototype.hasOwnProperty.call(opt, "parser")) { - option.Value = opt.parser(s.getBytes(option.Length - 2)); + if ( + Object.prototype.hasOwnProperty.call(opt, "parser") + ) { + option.Value = opt.parser( + s.getBytes(option.Length - 2), + ); } else { - option.Value = option.Length <= 6 ? - s.readInt(option.Length - 2): - "0x" + toHexFast(s.getBytes(option.Length - 2)); + option.Value = + option.Length <= 6 + ? s.readInt(option.Length - 2) + : "0x" + + toHexFast(s.getBytes(option.Length - 2)); } // Store Window Scale shift for later @@ -133,9 +144,14 @@ class ParseTCP extends Operation { } // Improve values - TCPPacket["Data offset"] = `${TCPPacket["Data offset"]} (${TCPPacket["Data offset"] * 4} bytes)`; - const trueWndSize = BigNumber(TCPPacket["Window size"]).multipliedBy(BigNumber(2).pow(BigNumber(windowScaleShift))); - TCPPacket["Window size"] = `${TCPPacket["Window size"]} (Scaled: ${trueWndSize})`; + TCPPacket["Data offset"] = `${TCPPacket["Data offset"]} (${ + TCPPacket["Data offset"] * 4 + } bytes)`; + const trueWndSize = BigNumber(TCPPacket["Window size"]).multipliedBy( + BigNumber(2).pow(BigNumber(windowScaleShift)), + ); + TCPPacket["Window size"] = + `${TCPPacket["Window size"]} (Scaled: ${trueWndSize})`; return TCPPacket; } @@ -148,7 +164,6 @@ class ParseTCP extends Operation { present(data) { return objToTable(data); } - } // Taken from https://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml @@ -168,7 +183,11 @@ const TCP_OPTION_KIND_LOOKUP = { 11: { name: "CC (obsolete)", length: true }, 12: { name: "CC.NEW (obsolete)", length: true }, 13: { name: "CC.ECHO (obsolete)", length: true }, - 14: { name: "TCP Alternate Checksum Request (obsolete)", length: true, parser: tcpAlternateChecksumParser }, + 14: { + name: "TCP Alternate Checksum Request (obsolete)", + length: true, + parser: tcpAlternateChecksumParser, + }, 15: { name: "TCP Alternate Checksum Data (obsolete)", length: true }, 16: { name: "Skeeter", length: true }, 17: { name: "Bubba", length: true }, @@ -182,16 +201,37 @@ const TCP_OPTION_KIND_LOOKUP = { 25: { name: "Unassigned (released 2000-12-18)", length: true }, 26: { name: "TCP Compression Filter", length: true }, 27: { name: "Quick-Start Response", length: true }, - 28: { name: "User Timeout Option (also, other known unauthorized use)", length: true }, + 28: { + name: "User Timeout Option (also, other known unauthorized use)", + length: true, + }, 29: { name: "TCP Authentication Option (TCP-AO)", length: true }, 30: { name: "Multipath TCP (MPTCP)", length: true }, 69: { name: "Encryption Negotiation (TCP-ENO)", length: true }, - 70: { name: "Reserved (known unauthorized use without proper IANA assignment)", length: true }, - 76: { name: "Reserved (known unauthorized use without proper IANA assignment)", length: true }, - 77: { name: "Reserved (known unauthorized use without proper IANA assignment)", length: true }, - 78: { name: "Reserved (known unauthorized use without proper IANA assignment)", length: true }, - 253: { name: "RFC3692-style Experiment 1 (also improperly used for shipping products) ", length: true }, - 254: { name: "RFC3692-style Experiment 2 (also improperly used for shipping products) ", length: true } + 70: { + name: "Reserved (known unauthorized use without proper IANA assignment)", + length: true, + }, + 76: { + name: "Reserved (known unauthorized use without proper IANA assignment)", + length: true, + }, + 77: { + name: "Reserved (known unauthorized use without proper IANA assignment)", + length: true, + }, + 78: { + name: "Reserved (known unauthorized use without proper IANA assignment)", + length: true, + }, + 253: { + name: "RFC3692-style Experiment 1 (also improperly used for shipping products) ", + length: true, + }, + 254: { + name: "RFC3692-style Experiment 2 (also improperly used for shipping products) ", + length: true, + }, }; /** @@ -203,7 +243,7 @@ function tcpAlternateChecksumParser(data) { 0: "TCP Checksum", 1: "8-bit Fletchers's algorithm", 2: "16-bit Fletchers's algorithm", - 3: "Redundant Checksum Avoidance" + 3: "Redundant Checksum Avoidance", }[data[0]]; return `${lookup} (0x${toHexFast(data)})`; @@ -217,14 +257,16 @@ function tcpTimestampParser(data) { const s = new Stream(data); if (s.length !== 8) - return `Error: Timestamp field should be 8 bytes long (received 0x${toHexFast(data)})`; + return `Error: Timestamp field should be 8 bytes long (received 0x${toHexFast( + data, + )})`; const tsval = bytesToLargeNumber(s.getBytes(4)), tsecr = bytesToLargeNumber(s.getBytes(4)); return { "Current Timestamp": tsval, - "Echo Reply": tsecr + "Echo Reply": tsecr, }; } @@ -234,11 +276,13 @@ function tcpTimestampParser(data) { */ function windowScaleParser(data) { if (data.length !== 1) - return `Error: Window Scale should be one byte long (received 0x${toHexFast(data)})`; + return `Error: Window Scale should be one byte long (received 0x${toHexFast( + data, + )})`; return { "Shift count": data[0], - "Multiplier": 1 << data[0] + Multiplier: 1 << data[0], }; } diff --git a/src/core/operations/ParseTLV.mjs b/src/core/operations/ParseTLV.mjs index d4c4e11c..5800e6b8 100644 --- a/src/core/operations/ParseTLV.mjs +++ b/src/core/operations/ParseTLV.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * Parse TLV operation */ class ParseTLV extends Operation { - /** * ParseTLV constructor */ @@ -22,7 +21,8 @@ class ParseTLV extends Operation { this.name = "Parse TLV"; this.module = "Default"; - this.description = "Converts a Type-Length-Value (TLV) encoded string into a JSON object. Can optionally include a Key / Type entry.

          Tags: Key-Length-Value, KLV, Length-Value, LV"; + this.description = + "Converts a Type-Length-Value (TLV) encoded string into a JSON object. Can optionally include a Key / Type entry.

          Tags: Key-Length-Value, KLV, Length-Value, LV"; this.infoURL = "https://wikipedia.org/wiki/Type-length-value"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -30,18 +30,18 @@ class ParseTLV extends Operation { { name: "Type/Key size", type: "number", - value: 1 + value: 1, }, { name: "Length size", type: "number", - value: 1 + value: 1, }, { name: "Use BER", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -55,7 +55,9 @@ class ParseTLV extends Operation { input = new Uint8Array(input); if (bytesInKey <= 0 && bytesInLength <= 0) - throw new OperationError("Type or Length size must be greater than 0"); + throw new OperationError( + "Type or Length size must be greater than 0", + ); const tlv = new TLVParser(input, { bytesInLength, basicEncodingRules }); @@ -71,7 +73,6 @@ class ParseTLV extends Operation { return data; } - } export default ParseTLV; diff --git a/src/core/operations/ParseUDP.mjs b/src/core/operations/ParseUDP.mjs index 2aa762ae..48b77614 100644 --- a/src/core/operations/ParseUDP.mjs +++ b/src/core/operations/ParseUDP.mjs @@ -6,8 +6,8 @@ import Operation from "../Operation.mjs"; import Stream from "../lib/Stream.mjs"; -import {toHexFast, fromHex} from "../lib/Hex.mjs"; -import {objToTable} from "../lib/Protocol.mjs"; +import { toHexFast, fromHex } from "../lib/Hex.mjs"; +import { objToTable } from "../lib/Protocol.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; @@ -15,7 +15,6 @@ import OperationError from "../errors/OperationError.mjs"; * Parse UDP operation */ class ParseUDP extends Operation { - /** * ParseUDP constructor */ @@ -33,8 +32,8 @@ class ParseUDP extends Operation { { name: "Input format", type: "option", - value: ["Hex", "Raw"] - } + value: ["Hex", "Raw"], + }, ]; } @@ -63,8 +62,8 @@ class ParseUDP extends Operation { const UDPPacket = { "Source port": s.readInt(2), "Destination port": s.readInt(2), - "Length": s.readInt(2), - "Checksum": "0x" + toHexFast(s.getBytes(2)) + Length: s.readInt(2), + Checksum: "0x" + toHexFast(s.getBytes(2)), }; // Parse data if present if (s.hasMore()) { @@ -82,8 +81,6 @@ class ParseUDP extends Operation { present(data) { return objToTable(data); } - } - export default ParseUDP; diff --git a/src/core/operations/ParseUNIXFilePermissions.mjs b/src/core/operations/ParseUNIXFilePermissions.mjs index ae472a83..bf0e3d5c 100644 --- a/src/core/operations/ParseUNIXFilePermissions.mjs +++ b/src/core/operations/ParseUNIXFilePermissions.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Parse UNIX file permissions operation */ class ParseUNIXFilePermissions extends Operation { - /** * ParseUNIXFilePermissions constructor */ @@ -20,17 +19,19 @@ class ParseUNIXFilePermissions extends Operation { this.name = "Parse UNIX file permissions"; this.module = "Default"; - this.description = "Given a UNIX/Linux file permission string in octal or textual format, this operation explains which permissions are granted to which user groups.

          Input should be in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format."; - this.infoURL = "https://wikipedia.org/wiki/File_system_permissions#Traditional_Unix_permissions"; + this.description = + "Given a UNIX/Linux file permission string in octal or textual format, this operation explains which permissions are granted to which user groups.

          Input should be in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format."; + this.infoURL = + "https://wikipedia.org/wiki/File_system_permissions#Traditional_Unix_permissions"; this.inputType = "string"; this.outputType = "string"; this.args = []; this.checks = [ { - pattern: "^\\s*d[rxw-]{9}\\s*$", - flags: "", - args: [] - } + pattern: "^\\s*d[rxw-]{9}\\s*$", + flags: "", + args: [], + }, ]; } @@ -41,10 +42,10 @@ class ParseUNIXFilePermissions extends Operation { */ run(input, args) { const perms = { - d: false, // directory + d: false, // directory sl: false, // symbolic link np: false, // named pipe - s: false, // socket + s: false, // socket cd: false, // character device bd: false, // block device dr: false, // door @@ -59,7 +60,7 @@ class ParseUNIXFilePermissions extends Operation { eg: false, // execute group ro: false, // read other wo: false, // write other - eo: false // execute other + eo: false, // execute other }; let d = 0, u = 0, @@ -84,20 +85,20 @@ class ParseUNIXFilePermissions extends Operation { if (octal.length > 2) o = parseInt(octal[2], 8); } - perms.su = d >> 2 & 0x1; - perms.sg = d >> 1 & 0x1; + perms.su = (d >> 2) & 0x1; + perms.sg = (d >> 1) & 0x1; perms.sb = d & 0x1; - perms.ru = u >> 2 & 0x1; - perms.wu = u >> 1 & 0x1; + perms.ru = (u >> 2) & 0x1; + perms.wu = (u >> 1) & 0x1; perms.eu = u & 0x1; - perms.rg = g >> 2 & 0x1; - perms.wg = g >> 1 & 0x1; + perms.rg = (g >> 2) & 0x1; + perms.wg = (g >> 1) & 0x1; perms.eg = g & 0x1; - perms.ro = o >> 2 & 0x1; - perms.wo = o >> 1 & 0x1; + perms.ro = (o >> 2) & 0x1; + perms.wo = (o >> 1) & 0x1; perms.eo = o & 0x1; } else if (input.search(/\s*[dlpcbDrwxsStT-]{1,10}\s*/) === 0) { // Input is textual @@ -178,7 +179,9 @@ class ParseUNIXFilePermissions extends Operation { } } } else { - throw new OperationError("Invalid input format.\nPlease enter the permissions in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format."); + throw new OperationError( + "Invalid input format.\nPlease enter the permissions in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format.", + ); } output += "Textual representation: " + permsToStr(perms); @@ -208,19 +211,23 @@ class ParseUNIXFilePermissions extends Operation { +---------+-------+-------+-------+ | | User | Group | Other | +---------+-------+-------+-------+ - | Read | ${perms.ru ? "X" : " "} | ${perms.rg ? "X" : " "} | ${perms.ro ? "X" : " "} | + | Read | ${perms.ru ? "X" : " "} | ${perms.rg ? "X" : " "} | ${ + perms.ro ? "X" : " " + } | +---------+-------+-------+-------+ - | Write | ${perms.wu ? "X" : " "} | ${perms.wg ? "X" : " "} | ${perms.wo ? "X" : " "} | + | Write | ${perms.wu ? "X" : " "} | ${perms.wg ? "X" : " "} | ${ + perms.wo ? "X" : " " + } | +---------+-------+-------+-------+ - | Execute | ${perms.eu ? "X" : " "} | ${perms.eg ? "X" : " "} | ${perms.eo ? "X" : " "} | + | Execute | ${perms.eu ? "X" : " "} | ${perms.eg ? "X" : " "} | ${ + perms.eo ? "X" : " " + } | +---------+-------+-------+-------+`; return output; } - } - /** * Given a permissions object dictionary, generates a textual permissions string. * @@ -311,7 +318,6 @@ function permsToOctal(perms) { return d.toString() + u.toString() + g.toString() + o.toString(); } - /** * Given a permissions object dictionary, returns the file type. * diff --git a/src/core/operations/ParseURI.mjs b/src/core/operations/ParseURI.mjs index 17ca90db..60ed1a0b 100644 --- a/src/core/operations/ParseURI.mjs +++ b/src/core/operations/ParseURI.mjs @@ -11,7 +11,6 @@ import url from "url"; * Parse URI operation */ class ParseURI extends Operation { - /** * ParseURI constructor */ @@ -20,7 +19,8 @@ class ParseURI extends Operation { this.name = "Parse URI"; this.module = "URL"; - this.description = "Pretty prints complicated Uniform Resource Identifier (URI) strings for ease of reading. Particularly useful for Uniform Resource Locators (URLs) with a lot of arguments."; + this.description = + "Pretty prints complicated Uniform Resource Identifier (URI) strings for ease of reading. Particularly useful for Uniform Resource Locators (URLs) with a lot of arguments."; this.infoURL = "https://wikipedia.org/wiki/Uniform_Resource_Identifier"; this.inputType = "string"; this.outputType = "string"; @@ -46,8 +46,8 @@ class ParseURI extends Operation { const keys = Object.keys(uri.query); let padding = 0; - keys.forEach(k => { - padding = (k.length > padding) ? k.length : padding; + keys.forEach((k) => { + padding = k.length > padding ? k.length : padding; }); output += "Arguments:\n"; @@ -64,7 +64,6 @@ class ParseURI extends Operation { return output; } - } export default ParseURI; diff --git a/src/core/operations/ParseUserAgent.mjs b/src/core/operations/ParseUserAgent.mjs index 57ac9312..ef3f247a 100644 --- a/src/core/operations/ParseUserAgent.mjs +++ b/src/core/operations/ParseUserAgent.mjs @@ -11,7 +11,6 @@ import UAParser from "ua-parser-js"; * Parse User Agent operation */ class ParseUserAgent extends Operation { - /** * ParseUserAgent constructor */ @@ -20,17 +19,18 @@ class ParseUserAgent extends Operation { this.name = "Parse User Agent"; this.module = "UserAgent"; - this.description = "Attempts to identify and categorise information contained in a user-agent string."; + this.description = + "Attempts to identify and categorise information contained in a user-agent string."; this.infoURL = "https://wikipedia.org/wiki/User_agent"; this.inputType = "string"; this.outputType = "string"; this.args = []; this.checks = [ { - pattern: "^(User-Agent:|Mozilla\\/)[^\\n\\r]+\\s*$", - flags: "i", - args: [] - } + pattern: "^(User-Agent:|Mozilla\\/)[^\\n\\r]+\\s*$", + flags: "i", + args: [], + }, ]; } @@ -57,7 +57,6 @@ OS CPU Architecture: ${ua.cpu.architecture || "unknown"}`; } - } export default ParseUserAgent; diff --git a/src/core/operations/ParseX509Certificate.mjs b/src/core/operations/ParseX509Certificate.mjs index 11e63424..c66b70c8 100644 --- a/src/core/operations/ParseX509Certificate.mjs +++ b/src/core/operations/ParseX509Certificate.mjs @@ -15,7 +15,6 @@ import Utils from "../Utils.mjs"; * Parse X.509 certificate operation */ class ParseX509Certificate extends Operation { - /** * ParseX509Certificate constructor */ @@ -24,23 +23,25 @@ class ParseX509Certificate extends Operation { this.name = "Parse X.509 certificate"; this.module = "PublicKey"; - this.description = "X.509 is an ITU-T standard for a public key infrastructure (PKI) and Privilege Management Infrastructure (PMI). It is commonly involved with SSL/TLS security.

          This operation displays the contents of a certificate in a human readable format, similar to the openssl command line tool.

          Tags: X509, server hello, handshake"; + this.description = + "X.509 is an ITU-T standard for a public key infrastructure (PKI) and Privilege Management Infrastructure (PMI). It is commonly involved with SSL/TLS security.

          This operation displays the contents of a certificate in a human readable format, similar to the openssl command line tool.

          Tags: X509, server hello, handshake"; this.infoURL = "https://wikipedia.org/wiki/X.509"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Input format", - "type": "option", - "value": ["PEM", "DER Hex", "Base64", "Raw"] - } + name: "Input format", + type: "option", + value: ["PEM", "DER Hex", "Base64", "Raw"], + }, ]; this.checks = [ { - "pattern": "^-+BEGIN CERTIFICATE-+\\r?\\n[\\da-z+/\\n\\r]+-+END CERTIFICATE-+\\r?\\n?$", - "flags": "i", - "args": ["PEM"] - } + pattern: + "^-+BEGIN CERTIFICATE-+\\r?\\n[\\da-z+/\\n\\r]+-+END CERTIFICATE-+\\r?\\n?$", + flags: "i", + args: ["PEM"], + }, ]; } @@ -68,7 +69,9 @@ class ParseX509Certificate extends Operation { cert.readCertPEM(input); break; case "Base64": - cert.readCertHex(toHex(fromBase64(input, null, "byteArray"), "")); + cert.readCertHex( + toHex(fromBase64(input, null, "byteArray"), ""), + ); break; case "Raw": cert.readCertHex(toHex(Utils.strToArrayBuffer(input), "")); @@ -95,64 +98,74 @@ class ParseX509Certificate extends Operation { // Public Key fields pkFields.push({ key: "Algorithm", - value: pk.type + value: pk.type, }); - if (pk.type === "EC") { // ECDSA + if (pk.type === "EC") { + // ECDSA pkFields.push({ key: "Curve Name", - value: pk.curveName + value: pk.curveName, }); pkFields.push({ key: "Length", - value: (((new r.BigInteger(pk.pubKeyHex, 16)).bitLength()-3) /2) + " bits" + value: + (new r.BigInteger(pk.pubKeyHex, 16).bitLength() - 3) / 2 + + " bits", }); pkFields.push({ key: "pub", - value: formatByteStr(pk.pubKeyHex, 16, 18) + value: formatByteStr(pk.pubKeyHex, 16, 18), }); - } else if (pk.type === "DSA") { // DSA + } else if (pk.type === "DSA") { + // DSA pkFields.push({ key: "pub", - value: formatByteStr(pk.y.toString(16), 16, 18) + value: formatByteStr(pk.y.toString(16), 16, 18), }); pkFields.push({ key: "P", - value: formatByteStr(pk.p.toString(16), 16, 18) + value: formatByteStr(pk.p.toString(16), 16, 18), }); pkFields.push({ key: "Q", - value: formatByteStr(pk.q.toString(16), 16, 18) + value: formatByteStr(pk.q.toString(16), 16, 18), }); pkFields.push({ key: "G", - value: formatByteStr(pk.g.toString(16), 16, 18) + value: formatByteStr(pk.g.toString(16), 16, 18), }); - } else if (pk.e) { // RSA + } else if (pk.e) { + // RSA pkFields.push({ key: "Length", - value: pk.n.bitLength() + " bits" + value: pk.n.bitLength() + " bits", }); pkFields.push({ key: "Modulus", - value: formatByteStr(pk.n.toString(16), 16, 18) + value: formatByteStr(pk.n.toString(16), 16, 18), }); pkFields.push({ key: "Exponent", - value: pk.e + " (0x" + pk.e.toString(16) + ")" + value: pk.e + " (0x" + pk.e.toString(16) + ")", }); } else { pkFields.push({ key: "Error", - value: "Unknown Public Key type" + value: "Unknown Public Key type", }); } // Format Public Key fields for (let i = 0; i < pkFields.length; i++) { - pkStr += ` ${pkFields[i].key}:${(pkFields[i].value + "\n").padStart( - 18 - (pkFields[i].key.length + 3) + pkFields[i].value.length + 1, - " " + pkStr += ` ${pkFields[i].key}:${( + pkFields[i].value + "\n" + ).padStart( + 18 - + (pkFields[i].key.length + 3) + + pkFields[i].value.length + + 1, + " ", )}`; } @@ -164,16 +177,25 @@ class ParseX509Certificate extends Operation { // Error processing signature, output without further breakout } - if (breakoutSig) { // DSA or ECDSA - sigStr = ` r: ${formatByteStr(r.ASN1HEX.getV(sig, 4), 16, 18)} + if (breakoutSig) { + // DSA or ECDSA + sigStr = ` r: ${formatByteStr( + r.ASN1HEX.getV(sig, 4), + 16, + 18, + )} s: ${formatByteStr(r.ASN1HEX.getV(sig, 48), 16, 18)}`; - } else { // RSA or unknown + } else { + // RSA or unknown sigStr = ` Signature: ${formatByteStr(sig, 16, 18)}`; } // Extensions try { - extensions = cert.getInfo().split("X509v3 Extensions:\n")[1].split("signature")[0]; + extensions = cert + .getInfo() + .split("X509v3 Extensions:\n")[1] + .split("signature")[0]; } catch (err) {} const issuerStr = formatDnObj(issuer, 2), @@ -181,7 +203,9 @@ class ParseX509Certificate extends Operation { naDate = formatDate(cert.getNotAfter()), subjectStr = formatDnObj(subject, 2); - return `Version: ${cert.version} (0x${Utils.hex(cert.version - 1)}) + return `Version: ${cert.version} (0x${Utils.hex( + cert.version - 1, + )}) Serial number: ${new r.BigInteger(sn, 16).toString()} (0x${sn}) Algorithm ID: ${cert.getSignatureAlgorithmField()} Validity @@ -200,7 +224,6 @@ ${sigStr} Extensions ${extensions}`; } - } /** @@ -209,16 +232,32 @@ ${extensions}`; * @param {string} dateStr * @returns {string} */ -function formatDate (dateStr) { - if (dateStr.length === 13) { // UTC Time +function formatDate(dateStr) { + if (dateStr.length === 13) { + // UTC Time dateStr = (dateStr[0] < "5" ? "20" : "19") + dateStr; } - return dateStr[6] + dateStr[7] + "/" + - dateStr[4] + dateStr[5] + "/" + - dateStr[0] + dateStr[1] + dateStr[2] + dateStr[3] + " " + - dateStr[8] + dateStr[9] + ":" + - dateStr[10] + dateStr[11] + ":" + - dateStr[12] + dateStr[13]; + return ( + dateStr[6] + + dateStr[7] + + "/" + + dateStr[4] + + dateStr[5] + + "/" + + dateStr[0] + + dateStr[1] + + dateStr[2] + + dateStr[3] + + " " + + dateStr[8] + + dateStr[9] + + ":" + + dateStr[10] + + dateStr[11] + + ":" + + dateStr[12] + + dateStr[13] + ); } export default ParseX509Certificate; diff --git a/src/core/operations/PlayMedia.mjs b/src/core/operations/PlayMedia.mjs index 22b7d8a2..2688039a 100644 --- a/src/core/operations/PlayMedia.mjs +++ b/src/core/operations/PlayMedia.mjs @@ -15,7 +15,6 @@ import { isType, detectFileType } from "../lib/FileType.mjs"; * PlayMedia operation */ class PlayMedia extends Operation { - /** * PlayMedia constructor */ @@ -24,17 +23,18 @@ class PlayMedia extends Operation { this.name = "Play Media"; this.module = "Default"; - this.description = "Plays the input as audio or video depending on the type.

          Tags: sound, movie, mp3, mp4, mov, webm, wav, ogg"; + this.description = + "Plays the input as audio or video depending on the type.

          Tags: sound, movie, mp3, mp4, mov, webm, wav, ogg"; this.infoURL = ""; this.inputType = "string"; this.outputType = "byteArray"; this.presentType = "html"; this.args = [ { - "name": "Input format", - "type": "option", - "value": ["Raw", "Base64", "Hex"] - } + name: "Input format", + type: "option", + value: ["Raw", "Base64", "Hex"], + }, ]; } @@ -64,7 +64,6 @@ class PlayMedia extends Operation { break; } - // Determine file type if (!isType(/^(audio|video)/, input)) { throw new OperationError("Invalid or unrecognised file type"); diff --git a/src/core/operations/PowerSet.mjs b/src/core/operations/PowerSet.mjs index a05dd783..79586c15 100644 --- a/src/core/operations/PowerSet.mjs +++ b/src/core/operations/PowerSet.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Power Set operation */ class PowerSet extends Operation { - /** * Power set constructor */ @@ -27,7 +26,7 @@ class PowerSet extends Operation { { name: "Item delimiter", type: "binaryString", - value: "," + value: ",", }, ]; } @@ -42,7 +41,7 @@ class PowerSet extends Operation { run(input, args) { [this.itemDelimiter] = args; // Split and filter empty strings - const inputArray = input.split(this.itemDelimiter).filter(a => a); + const inputArray = input.split(this.itemDelimiter).filter((a) => a); if (inputArray.length) { return this.runPowerSet(inputArray); @@ -59,7 +58,7 @@ class PowerSet extends Operation { */ runPowerSet(a) { // empty array items getting picked up - a = a.filter(i => i.length); + a = a.filter((i) => i.length); if (!a.length) { return []; } @@ -71,11 +70,14 @@ class PowerSet extends Operation { const toBinary = (dec) => (dec >>> 0).toString(2); const result = new Set(); // Get the decimal number to make a binary as long as the input - const maxBinaryValue = parseInt(Number(a.map(i => "1").reduce((p, c) => p + c)), 2); + const maxBinaryValue = parseInt( + Number(a.map((i) => "1").reduce((p, c) => p + c)), + 2, + ); // Make an array of each binary number from 0 to maximum const binaries = [...Array(maxBinaryValue + 1).keys()] .map(toBinary) - .map(i => i.padStart(toBinary(maxBinaryValue).length, "0")); + .map((i) => i.padStart(toBinary(maxBinaryValue).length, "0")); // XOR the input with each binary to get each unique permutation binaries.forEach((binary) => { @@ -85,8 +87,10 @@ class PowerSet extends Operation { // map for formatting & put in length order. return [...result] - .map(r => r.join(this.itemDelimiter)).sort((a, b) => a.length - b.length) - .map(i => `${i}\n`).join(""); + .map((r) => r.join(this.itemDelimiter)) + .sort((a, b) => a.length - b.length) + .map((i) => `${i}\n`) + .join(""); } } diff --git a/src/core/operations/ProtobufDecode.mjs b/src/core/operations/ProtobufDecode.mjs index fbc16dc4..dd1b8886 100644 --- a/src/core/operations/ProtobufDecode.mjs +++ b/src/core/operations/ProtobufDecode.mjs @@ -12,7 +12,6 @@ import Protobuf from "../lib/Protobuf.mjs"; * Protobuf Decode operation */ class ProtobufDecode extends Operation { - /** * ProtobufDecode constructor */ @@ -21,7 +20,8 @@ class ProtobufDecode extends Operation { this.name = "Protobuf Decode"; this.module = "Protobuf"; - this.description = "Decodes any Protobuf encoded data to a JSON representation of the data using the field number as the field key.

          If a .proto schema is defined, the encoded data will be decoded with reference to the schema. Only one message instance will be decoded.

          Show Unknown Fields
          When a schema is used, this option shows fields that are present in the input data but not defined in the schema.

          Show Types
          Show the type of a field next to its name. For undefined fields, the wiretype and example types are shown instead."; + this.description = + "Decodes any Protobuf encoded data to a JSON representation of the data using the field number as the field key.

          If a .proto schema is defined, the encoded data will be decoded with reference to the schema. Only one message instance will be decoded.

          Show Unknown Fields
          When a schema is used, this option shows fields that are present in the input data but not defined in the schema.

          Show Types
          Show the type of a field next to its name. For undefined fields, the wiretype and example types are shown instead."; this.infoURL = "https://wikipedia.org/wiki/Protocol_Buffers"; this.inputType = "ArrayBuffer"; this.outputType = "JSON"; @@ -31,18 +31,18 @@ class ProtobufDecode extends Operation { type: "text", value: "", rows: 8, - hint: "Drag and drop is enabled on this ingredient" + hint: "Drag and drop is enabled on this ingredient", }, { name: "Show Unknown Fields", type: "boolean", - value: false + value: false, }, { name: "Show Types", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -59,7 +59,6 @@ class ProtobufDecode extends Operation { throw new OperationError(err); } } - } export default ProtobufDecode; diff --git a/src/core/operations/ProtobufEncode.mjs b/src/core/operations/ProtobufEncode.mjs index eaf4d6c4..241ac6e6 100644 --- a/src/core/operations/ProtobufEncode.mjs +++ b/src/core/operations/ProtobufEncode.mjs @@ -12,7 +12,6 @@ import Protobuf from "../lib/Protobuf.mjs"; * Protobuf Encode operation */ class ProtobufEncode extends Operation { - /** * ProtobufEncode constructor */ @@ -21,8 +20,10 @@ class ProtobufEncode extends Operation { this.name = "Protobuf Encode"; this.module = "Protobuf"; - this.description = "Encodes a valid JSON object into a protobuf byte array using the input .proto schema."; - this.infoURL = "https://developers.google.com/protocol-buffers/docs/encoding"; + this.description = + "Encodes a valid JSON object into a protobuf byte array using the input .proto schema."; + this.infoURL = + "https://developers.google.com/protocol-buffers/docs/encoding"; this.inputType = "JSON"; this.outputType = "ArrayBuffer"; this.args = [ @@ -31,8 +32,8 @@ class ProtobufEncode extends Operation { type: "text", value: "", rows: 8, - hint: "Drag and drop is enabled on this ingredient" - } + hint: "Drag and drop is enabled on this ingredient", + }, ]; } @@ -48,7 +49,6 @@ class ProtobufEncode extends Operation { throw new OperationError(error); } } - } export default ProtobufEncode; diff --git a/src/core/operations/PseudoRandomNumberGenerator.mjs b/src/core/operations/PseudoRandomNumberGenerator.mjs index 53150566..2f7156e4 100644 --- a/src/core/operations/PseudoRandomNumberGenerator.mjs +++ b/src/core/operations/PseudoRandomNumberGenerator.mjs @@ -14,7 +14,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Pseudo-Random Number Generator operation */ class PseudoRandomNumberGenerator extends Operation { - /** * PseudoRandomNumberGenerator constructor */ @@ -23,21 +22,23 @@ class PseudoRandomNumberGenerator extends Operation { this.name = "Pseudo-Random Number Generator"; this.module = "Ciphers"; - this.description = "A cryptographically-secure pseudo-random number generator (PRNG).

          This operation uses the browser's built-in crypto.getRandomValues() method if available. If this cannot be found, it falls back to a Fortuna-based PRNG algorithm."; - this.infoURL = "https://wikipedia.org/wiki/Pseudorandom_number_generator"; + this.description = + "A cryptographically-secure pseudo-random number generator (PRNG).

          This operation uses the browser's built-in crypto.getRandomValues() method if available. If this cannot be found, it falls back to a Fortuna-based PRNG algorithm."; + this.infoURL = + "https://wikipedia.org/wiki/Pseudorandom_number_generator"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Number of bytes", - "type": "number", - "value": 32 + name: "Number of bytes", + type: "number", + value: 32, }, { - "name": "Output as", - "type": "option", - "value": ["Hex", "Integer", "Byte array", "Raw"] - } + name: "Output as", + type: "option", + value: ["Hex", "Integer", "Byte array", "Raw"], + }, ]; } @@ -55,7 +56,13 @@ class PseudoRandomNumberGenerator extends Operation { bytes = new ArrayBuffer(numBytes); const CHUNK_SIZE = 65536; for (let i = 0; i < numBytes; i += CHUNK_SIZE) { - self.crypto.getRandomValues(new Uint8Array(bytes, i, Math.min(numBytes - i, CHUNK_SIZE))); + self.crypto.getRandomValues( + new Uint8Array( + bytes, + i, + Math.min(numBytes - i, CHUNK_SIZE), + ), + ); } bytes = Utils.arrayBufferToStr(bytes); } else { @@ -80,7 +87,6 @@ class PseudoRandomNumberGenerator extends Operation { return bytes; } } - } export default PseudoRandomNumberGenerator; diff --git a/src/core/operations/RAKE.mjs b/src/core/operations/RAKE.mjs index d1165b51..bf457a47 100644 --- a/src/core/operations/RAKE.mjs +++ b/src/core/operations/RAKE.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * RAKE operation */ class RAKE extends Operation { - /** * RAKE constructor */ @@ -32,18 +31,18 @@ class RAKE extends Operation { { name: "Word Delimiter (Regex)", type: "text", - value: "\\s" + value: "\\s", }, { name: "Sentence Delimiter (Regex)", type: "text", - value: "\\.\\s|\\n" + value: "\\.\\s|\\n", }, { name: "Stop Words", type: "text", - value: "i,me,my,myself,we,our,ours,ourselves,you,you're,you've,you'll,you'd,your,yours,yourself,yourselves,he,him,his,himself,she,she's,her,hers,herself,it,it's,its,itsef,they,them,their,theirs,themselves,what,which,who,whom,this,that,that'll,these,those,am,is,are,was,were,be,been,being,have,has,had,having,do,does',did,doing,a,an,the,and,but,if,or,because,as,until,while,of,at,by,for,with,about,against,between,into,through,during,before,after,above,below,to,from,up,down,in,out,on,off,over,under,again,further,then,once,here,there,when,where,why,how,all,any,both,each,few,more,most,other,some,such,no,nor,not,only,own,same,so,than,too,very,s,t,can,will,just,don,don't,should,should've,now,d,ll,m,o,re,ve,y,ain,aren,aren't,couldn,couldn't,didn,didn't,doesn,doesn't,hadn,hadn't,hasn,hasn't,haven,haven't,isn,isn't,ma,mightn,mightn't,mustn,mustn't,needn,needn't,shan,shan't,shouldn,shouldn't,wasn,wasn't,weren,weren't,won,won't,wouldn,wouldn't" - } + value: "i,me,my,myself,we,our,ours,ourselves,you,you're,you've,you'll,you'd,your,yours,yourself,yourselves,he,him,his,himself,she,she's,her,hers,herself,it,it's,its,itsef,they,them,their,theirs,themselves,what,which,who,whom,this,that,that'll,these,those,am,is,are,was,were,be,been,being,have,has,had,having,do,does',did,doing,a,an,the,and,but,if,or,because,as,until,while,of,at,by,for,with,about,against,between,into,through,during,before,after,above,below,to,from,up,down,in,out,on,off,over,under,again,further,then,once,here,there,when,where,why,how,all,any,both,each,few,more,most,other,some,such,no,nor,not,only,own,same,so,than,too,very,s,t,can,will,just,don,don't,should,should've,now,d,ll,m,o,re,ve,y,ain,aren,aren't,couldn,couldn't,didn,didn't,doesn,doesn't,hadn,hadn't,hasn,hasn't,haven,haven't,isn,isn't,ma,mightn,mightn't,mustn,mustn't,needn,needn't,shan,shan't,shouldn,shouldn't,wasn,wasn't,weren,weren't,won,won't,wouldn,wouldn't", + }, ]; } @@ -53,13 +52,16 @@ class RAKE extends Operation { * @returns {string} */ run(input, args) { - // Get delimiter regexs - const wordDelim = new RegExp(args[0], "g"); + const wordDelim = new RegExp(args[0], "g"); const sentDelim = new RegExp(args[1], "g"); // Deduplicate the stop words and add the empty string - const stopWords = args[2].toLowerCase().replace(/ /g, "").split(",").unique(); + const stopWords = args[2] + .toLowerCase() + .replace(/ /g, "") + .split(",") + .unique(); stopWords.push(""); // Lower case input and remove start and ending whitespace @@ -73,7 +75,6 @@ class RAKE extends Operation { // Build up list of phrases and token counts const sentences = input.split(sentDelim); for (const sent of sentences) { - // Split sentence into words const splitSent = sent.split(wordDelim); let startIndex = 0; @@ -87,7 +88,7 @@ class RAKE extends Operation { } else { // If token is not a stop word add to the count of the list of words if (tokens.includes(token)) { - wordFrequencies[tokens.indexOf(token)]+=1; + wordFrequencies[tokens.indexOf(token)] += 1; } else { tokens.push(token); wordFrequencies.push(1); @@ -98,31 +99,39 @@ class RAKE extends Operation { } // remove empty phrases - phrases = phrases.filter(subArray => subArray.length > 0); + phrases = phrases.filter((subArray) => subArray.length > 0); // Remove duplicate phrases - const uniquePhrases = [...new Set(phrases.map(function (phrase) { - return phrase.join(" "); - }))]; + const uniquePhrases = [ + ...new Set( + phrases.map(function (phrase) { + return phrase.join(" "); + }), + ), + ]; phrases = uniquePhrases.map(function (phrase) { return phrase.split(" "); }); // Generate word_degree_matrix and populate - const wordDegreeMatrix = Array.from(Array(tokens.length), _ => Array(tokens.length).fill(0)); + const wordDegreeMatrix = Array.from(Array(tokens.length), (_) => + Array(tokens.length).fill(0), + ); phrases.forEach(function (phrase) { phrase.forEach(function (word1) { phrase.forEach(function (word2) { - wordDegreeMatrix[tokens.indexOf(word1)][tokens.indexOf(word2)]++; + wordDegreeMatrix[tokens.indexOf(word1)][ + tokens.indexOf(word2) + ]++; }); }); }); // Calculate degree score for each token const degreeScores = Array(tokens.length).fill(0); - for (let i=0; i
          Key: RC2 uses a variable size key.

          IV: To run the cipher in CBC mode, the Initialization Vector should be 8 bytes long. If the IV is left blank, the cipher will run in ECB mode.

          Padding: In both CBC and ECB mode, PKCS#7 padding will be used."; this.infoURL = "https://wikipedia.org/wiki/RC2"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Input", - "type": "option", - "value": ["Hex", "Raw"] + name: "Input", + type: "option", + value: ["Hex", "Raw"], }, { - "name": "Output", - "type": "option", - "value": ["Raw", "Hex"] - } + name: "Output", + type: "option", + value: ["Raw", "Hex"], + }, ]; } @@ -59,7 +59,7 @@ class RC2Decrypt extends Operation { run(input, args) { const key = Utils.convertToByteString(args[0].string, args[0].option), iv = Utils.convertToByteString(args[1].string, args[1].option), - [,, inputType, outputType] = args, + [, , inputType, outputType] = args, decipher = forge.rc2.createDecryptionCipher(key); input = Utils.convertToByteString(input, inputType); @@ -68,9 +68,10 @@ class RC2Decrypt extends Operation { decipher.update(forge.util.createBuffer(input)); decipher.finish(); - return outputType === "Hex" ? decipher.output.toHex() : decipher.output.getBytes(); + return outputType === "Hex" + ? decipher.output.toHex() + : decipher.output.getBytes(); } - } export default RC2Decrypt; diff --git a/src/core/operations/RC2Encrypt.mjs b/src/core/operations/RC2Encrypt.mjs index 88dae5b1..f8e34261 100644 --- a/src/core/operations/RC2Encrypt.mjs +++ b/src/core/operations/RC2Encrypt.mjs @@ -8,12 +8,10 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import forge from "node-forge"; - /** * RC2 Encrypt operation */ class RC2Encrypt extends Operation { - /** * RC2Encrypt constructor */ @@ -22,33 +20,34 @@ class RC2Encrypt extends Operation { this.name = "RC2 Encrypt"; this.module = "Ciphers"; - this.description = "RC2 (also known as ARC2) is a symmetric-key block cipher designed by Ron Rivest in 1987. 'RC' stands for 'Rivest Cipher'.

          Key: RC2 uses a variable size key.

          You can generate a password-based key using one of the KDF operations.

          IV: To run the cipher in CBC mode, the Initialization Vector should be 8 bytes long. If the IV is left blank, the cipher will run in ECB mode.

          Padding: In both CBC and ECB mode, PKCS#7 padding will be used."; + this.description = + "RC2 (also known as ARC2) is a symmetric-key block cipher designed by Ron Rivest in 1987. 'RC' stands for 'Rivest Cipher'.

          Key: RC2 uses a variable size key.

          You can generate a password-based key using one of the KDF operations.

          IV: To run the cipher in CBC mode, the Initialization Vector should be 8 bytes long. If the IV is left blank, the cipher will run in ECB mode.

          Padding: In both CBC and ECB mode, PKCS#7 padding will be used."; this.infoURL = "https://wikipedia.org/wiki/RC2"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Input", - "type": "option", - "value": ["Raw", "Hex"] + name: "Input", + type: "option", + value: ["Raw", "Hex"], }, { - "name": "Output", - "type": "option", - "value": ["Hex", "Raw"] - } + name: "Output", + type: "option", + value: ["Hex", "Raw"], + }, ]; } @@ -60,7 +59,7 @@ class RC2Encrypt extends Operation { run(input, args) { const key = Utils.convertToByteString(args[0].string, args[0].option), iv = Utils.convertToByteString(args[1].string, args[1].option), - [,, inputType, outputType] = args, + [, , inputType, outputType] = args, cipher = forge.rc2.createEncryptionCipher(key); input = Utils.convertToByteString(input, inputType); @@ -69,9 +68,10 @@ class RC2Encrypt extends Operation { cipher.update(forge.util.createBuffer(input)); cipher.finish(); - return outputType === "Hex" ? cipher.output.toHex() : cipher.output.getBytes(); + return outputType === "Hex" + ? cipher.output.toHex() + : cipher.output.getBytes(); } - } export default RC2Encrypt; diff --git a/src/core/operations/RC4.mjs b/src/core/operations/RC4.mjs index 183db742..104c5d4e 100644 --- a/src/core/operations/RC4.mjs +++ b/src/core/operations/RC4.mjs @@ -12,7 +12,6 @@ import { format } from "../lib/Ciphers.mjs"; * RC4 operation */ class RC4 extends Operation { - /** * RC4 constructor */ @@ -21,27 +20,52 @@ class RC4 extends Operation { this.name = "RC4"; this.module = "Ciphers"; - this.description = "RC4 (also known as ARC4) is a widely-used stream cipher designed by Ron Rivest. It is used in popular protocols such as SSL and WEP. Although remarkable for its simplicity and speed, the algorithm's history doesn't inspire confidence in its security."; + this.description = + "RC4 (also known as ARC4) is a widely-used stream cipher designed by Ron Rivest. It is used in popular protocols such as SSL and WEP. Although remarkable for its simplicity and speed, the algorithm's history doesn't inspire confidence in its security."; this.infoURL = "https://wikipedia.org/wiki/RC4"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Passphrase", - "type": "toggleString", - "value": "", - "toggleValues": ["UTF8", "UTF16", "UTF16LE", "UTF16BE", "Latin1", "Hex", "Base64"] + name: "Passphrase", + type: "toggleString", + value: "", + toggleValues: [ + "UTF8", + "UTF16", + "UTF16LE", + "UTF16BE", + "Latin1", + "Hex", + "Base64", + ], }, { - "name": "Input format", - "type": "option", - "value": ["Latin1", "UTF8", "UTF16", "UTF16LE", "UTF16BE", "Hex", "Base64"] + name: "Input format", + type: "option", + value: [ + "Latin1", + "UTF8", + "UTF16", + "UTF16LE", + "UTF16BE", + "Hex", + "Base64", + ], }, { - "name": "Output format", - "type": "option", - "value": ["Latin1", "UTF8", "UTF16", "UTF16LE", "UTF16BE", "Hex", "Base64"] - } + name: "Output format", + type: "option", + value: [ + "Latin1", + "UTF8", + "UTF16", + "UTF16LE", + "UTF16BE", + "Hex", + "Base64", + ], + }, ]; } @@ -83,7 +107,6 @@ class RC4 extends Operation { highlightReverse(pos, args) { return pos; } - } export default RC4; diff --git a/src/core/operations/RC4Drop.mjs b/src/core/operations/RC4Drop.mjs index c6bb536a..947977e2 100644 --- a/src/core/operations/RC4Drop.mjs +++ b/src/core/operations/RC4Drop.mjs @@ -12,7 +12,6 @@ import CryptoJS from "crypto-js"; * RC4 Drop operation */ class RC4Drop extends Operation { - /** * RC4Drop constructor */ @@ -21,32 +20,58 @@ class RC4Drop extends Operation { this.name = "RC4 Drop"; this.module = "Ciphers"; - this.description = "It was discovered that the first few bytes of the RC4 keystream are strongly non-random and leak information about the key. We can defend against this attack by discarding the initial portion of the keystream. This modified algorithm is traditionally called RC4-drop."; - this.infoURL = "https://wikipedia.org/wiki/RC4#Fluhrer,_Mantin_and_Shamir_attack"; + this.description = + "It was discovered that the first few bytes of the RC4 keystream are strongly non-random and leak information about the key. We can defend against this attack by discarding the initial portion of the keystream. This modified algorithm is traditionally called RC4-drop."; + this.infoURL = + "https://wikipedia.org/wiki/RC4#Fluhrer,_Mantin_and_Shamir_attack"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Passphrase", - "type": "toggleString", - "value": "", - "toggleValues": ["UTF8", "UTF16", "UTF16LE", "UTF16BE", "Latin1", "Hex", "Base64"] + name: "Passphrase", + type: "toggleString", + value: "", + toggleValues: [ + "UTF8", + "UTF16", + "UTF16LE", + "UTF16BE", + "Latin1", + "Hex", + "Base64", + ], }, { - "name": "Input format", - "type": "option", - "value": ["Latin1", "UTF8", "UTF16", "UTF16LE", "UTF16BE", "Hex", "Base64"] + name: "Input format", + type: "option", + value: [ + "Latin1", + "UTF8", + "UTF16", + "UTF16LE", + "UTF16BE", + "Hex", + "Base64", + ], }, { - "name": "Output format", - "type": "option", - "value": ["Latin1", "UTF8", "UTF16", "UTF16LE", "UTF16BE", "Hex", "Base64"] + name: "Output format", + type: "option", + value: [ + "Latin1", + "UTF8", + "UTF16", + "UTF16LE", + "UTF16BE", + "Hex", + "Base64", + ], }, { - "name": "Number of dwords to drop", - "type": "number", - "value": 192 - } + name: "Number of dwords to drop", + type: "number", + value: 192, + }, ]; } @@ -59,7 +84,9 @@ class RC4Drop extends Operation { const message = format[args[1]].parse(input), passphrase = format[args[0].option].parse(args[0].string), drop = args[3], - encrypted = CryptoJS.RC4Drop.encrypt(message, passphrase, { drop: drop }); + encrypted = CryptoJS.RC4Drop.encrypt(message, passphrase, { + drop: drop, + }); return encrypted.ciphertext.toString(format[args[2]]); } @@ -89,7 +116,6 @@ class RC4Drop extends Operation { highlightReverse(pos, args) { return pos; } - } export default RC4Drop; diff --git a/src/core/operations/RIPEMD.mjs b/src/core/operations/RIPEMD.mjs index f326b694..33661cbf 100644 --- a/src/core/operations/RIPEMD.mjs +++ b/src/core/operations/RIPEMD.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * RIPEMD operation */ class RIPEMD extends Operation { - /** * RIPEMD constructor */ @@ -20,16 +19,17 @@ class RIPEMD extends Operation { this.name = "RIPEMD"; this.module = "Crypto"; - this.description = "RIPEMD (RACE Integrity Primitives Evaluation Message Digest) is a family of cryptographic hash functions developed in Leuven, Belgium, by Hans Dobbertin, Antoon Bosselaers and Bart Preneel at the COSIC research group at the Katholieke Universiteit Leuven, and first published in 1996.

          RIPEMD was based upon the design principles used in MD4, and is similar in performance to the more popular SHA-1.

          "; + this.description = + "RIPEMD (RACE Integrity Primitives Evaluation Message Digest) is a family of cryptographic hash functions developed in Leuven, Belgium, by Hans Dobbertin, Antoon Bosselaers and Bart Preneel at the COSIC research group at the Katholieke Universiteit Leuven, and first published in 1996.

          RIPEMD was based upon the design principles used in MD4, and is similar in performance to the more popular SHA-1.

          "; this.infoURL = "https://wikipedia.org/wiki/RIPEMD"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Size", - "type": "option", - "value": ["320", "256", "160", "128"] - } + name: "Size", + type: "option", + value: ["320", "256", "160", "128"], + }, ]; } @@ -42,7 +42,6 @@ class RIPEMD extends Operation { const size = args[0]; return runHash("ripemd" + size, input); } - } export default RIPEMD; diff --git a/src/core/operations/ROT13.mjs b/src/core/operations/ROT13.mjs index 1d059565..93e9e31e 100644 --- a/src/core/operations/ROT13.mjs +++ b/src/core/operations/ROT13.mjs @@ -6,12 +6,10 @@ import Operation from "../Operation.mjs"; - /** * ROT13 operation. */ class ROT13 extends Operation { - /** * ROT13 constructor */ @@ -20,7 +18,8 @@ class ROT13 extends Operation { this.name = "ROT13"; this.module = "Default"; - this.description = "A simple caesar substitution cipher which rotates alphabet characters by the specified amount (default 13)."; + this.description = + "A simple caesar substitution cipher which rotates alphabet characters by the specified amount (default 13)."; this.infoURL = "https://wikipedia.org/wiki/ROT13"; this.inputType = "byteArray"; this.outputType = "byteArray"; @@ -28,22 +27,22 @@ class ROT13 extends Operation { { name: "Rotate lower case chars", type: "boolean", - value: true + value: true, }, { name: "Rotate upper case chars", type: "boolean", - value: true + value: true, }, { name: "Rotate numbers", type: "boolean", - value: false + value: false, }, { name: "Amount", type: "number", - value: 13 + value: 13, }, ]; } @@ -68,13 +67,16 @@ class ROT13 extends Operation { for (let i = 0; i < input.length; i++) { chr = input[i]; - if (rot13Upperacse && chr >= 65 && chr <= 90) { // Upper case + if (rot13Upperacse && chr >= 65 && chr <= 90) { + // Upper case chr = (chr - 65 + amount) % 26; output[i] = chr + 65; - } else if (rot13Lowercase && chr >= 97 && chr <= 122) { // Lower case + } else if (rot13Lowercase && chr >= 97 && chr <= 122) { + // Lower case chr = (chr - 97 + amount) % 26; output[i] = chr + 97; - } else if (rotNumbers && chr >= 48 && chr <= 57) { // Numbers + } else if (rotNumbers && chr >= 48 && chr <= 57) { + // Numbers chr = (chr - 48 + amount) % 10; output[i] = chr + 48; } diff --git a/src/core/operations/ROT13BruteForce.mjs b/src/core/operations/ROT13BruteForce.mjs index 7468ee11..57fcec29 100644 --- a/src/core/operations/ROT13BruteForce.mjs +++ b/src/core/operations/ROT13BruteForce.mjs @@ -10,7 +10,6 @@ import Utils from "../Utils.mjs"; * ROT13 Brute Force operation. */ class ROT13BruteForce extends Operation { - /** * ROT13BruteForce constructor */ @@ -19,7 +18,8 @@ class ROT13BruteForce extends Operation { this.name = "ROT13 Brute Force"; this.module = "Default"; - this.description = "Try all meaningful amounts for ROT13.

          Optionally you can enter your known plaintext (crib) to filter the result."; + this.description = + "Try all meaningful amounts for ROT13.

          Optionally you can enter your known plaintext (crib) to filter the result."; this.infoURL = "https://wikipedia.org/wiki/ROT13"; this.inputType = "byteArray"; this.outputType = "string"; @@ -27,38 +27,38 @@ class ROT13BruteForce extends Operation { { name: "Rotate lower case chars", type: "boolean", - value: true + value: true, }, { name: "Rotate upper case chars", type: "boolean", - value: true + value: true, }, { name: "Rotate numbers", type: "boolean", - value: false + value: false, }, { name: "Sample length", type: "number", - value: 100 + value: 100, }, { name: "Sample offset", type: "number", - value: 0 + value: 0, }, { name: "Print amount", type: "boolean", - value: true + value: true, }, { name: "Crib (known plaintext string)", type: "string", - value: "" - } + value: "", + }, ]; } @@ -68,27 +68,54 @@ class ROT13BruteForce extends Operation { * @returns {string} */ run(input, args) { - const [rotateLower, rotateUpper, rotateNum, sampleLength, sampleOffset, printAmount, crib] = args; + const [ + rotateLower, + rotateUpper, + rotateNum, + sampleLength, + sampleOffset, + printAmount, + crib, + ] = args; const sample = input.slice(sampleOffset, sampleOffset + sampleLength); const cribLower = crib.toLowerCase(); - const lowerStart = "a".charCodeAt(0), upperStart = "A".charCodeAt(0), numStart = "0".charCodeAt(0); + const lowerStart = "a".charCodeAt(0), + upperStart = "A".charCodeAt(0), + numStart = "0".charCodeAt(0); const result = []; for (let amount = 1; amount < 26; amount++) { const rotated = sample.slice(); for (let i = 0; i < rotated.length; i++) { - if (rotateLower && lowerStart <= rotated[i] && rotated[i] < lowerStart + 26) { - rotated[i] = (rotated[i] - lowerStart + amount) % 26 + lowerStart; - } else if (rotateUpper && upperStart <= rotated[i] && rotated[i] < upperStart + 26) { - rotated[i] = (rotated[i] - upperStart + amount) % 26 + upperStart; - } else if (rotateNum && numStart <= rotated[i] && rotated[i] < numStart + 10) { - rotated[i] = (rotated[i] - numStart + amount) % 10 + numStart; + if ( + rotateLower && + lowerStart <= rotated[i] && + rotated[i] < lowerStart + 26 + ) { + rotated[i] = + ((rotated[i] - lowerStart + amount) % 26) + lowerStart; + } else if ( + rotateUpper && + upperStart <= rotated[i] && + rotated[i] < upperStart + 26 + ) { + rotated[i] = + ((rotated[i] - upperStart + amount) % 26) + upperStart; + } else if ( + rotateNum && + numStart <= rotated[i] && + rotated[i] < numStart + 10 + ) { + rotated[i] = + ((rotated[i] - numStart + amount) % 10) + numStart; } } const rotatedString = Utils.byteArrayToUtf8(rotated); if (rotatedString.toLowerCase().indexOf(cribLower) >= 0) { - const rotatedStringEscaped = Utils.escapeWhitespace(rotatedString); + const rotatedStringEscaped = + Utils.escapeWhitespace(rotatedString); if (printAmount) { - const amountStr = "Amount = " + (" " + amount).slice(-2) + ": "; + const amountStr = + "Amount = " + (" " + amount).slice(-2) + ": "; result.push(amountStr + rotatedStringEscaped); } else { result.push(rotatedStringEscaped); diff --git a/src/core/operations/ROT47.mjs b/src/core/operations/ROT47.mjs index 39bf79a2..ad9229d9 100644 --- a/src/core/operations/ROT47.mjs +++ b/src/core/operations/ROT47.mjs @@ -6,12 +6,10 @@ import Operation from "../Operation.mjs"; - /** * ROT47 operation. */ class ROT47 extends Operation { - /** * ROT47 constructor */ @@ -20,7 +18,8 @@ class ROT47 extends Operation { this.name = "ROT47"; this.module = "Default"; - this.description = "A slightly more complex variation of a caesar cipher, which includes ASCII characters from 33 '!' to 126 '~'. Default rotation: 47."; + this.description = + "A slightly more complex variation of a caesar cipher, which includes ASCII characters from 33 '!' to 126 '~'. Default rotation: 47."; this.infoURL = "https://wikipedia.org/wiki/ROT13#Variants"; this.inputType = "byteArray"; this.outputType = "byteArray"; @@ -28,7 +27,7 @@ class ROT47 extends Operation { { name: "Amount", type: "number", - value: 47 + value: 47, }, ]; } diff --git a/src/core/operations/ROT47BruteForce.mjs b/src/core/operations/ROT47BruteForce.mjs index fa1e90dc..a8cc3515 100644 --- a/src/core/operations/ROT47BruteForce.mjs +++ b/src/core/operations/ROT47BruteForce.mjs @@ -10,7 +10,6 @@ import Utils from "../Utils.mjs"; * ROT47 Brute Force operation. */ class ROT47BruteForce extends Operation { - /** * ROT47BruteForce constructor */ @@ -19,7 +18,8 @@ class ROT47BruteForce extends Operation { this.name = "ROT47 Brute Force"; this.module = "Default"; - this.description = "Try all meaningful amounts for ROT47.

          Optionally you can enter your known plaintext (crib) to filter the result."; + this.description = + "Try all meaningful amounts for ROT47.

          Optionally you can enter your known plaintext (crib) to filter the result."; this.infoURL = "https://wikipedia.org/wiki/ROT13#Variants"; this.inputType = "byteArray"; this.outputType = "string"; @@ -27,23 +27,23 @@ class ROT47BruteForce extends Operation { { name: "Sample length", type: "number", - value: 100 + value: 100, }, { name: "Sample offset", type: "number", - value: 0 + value: 0, }, { name: "Print amount", type: "boolean", - value: true + value: true, }, { name: "Crib (known plaintext string)", type: "string", - value: "" - } + value: "", + }, ]; } @@ -61,14 +61,16 @@ class ROT47BruteForce extends Operation { const rotated = sample.slice(); for (let i = 0; i < rotated.length; i++) { if (33 <= rotated[i] && rotated[i] <= 126) { - rotated[i] = (rotated[i] - 33 + amount) % 94 + 33; + rotated[i] = ((rotated[i] - 33 + amount) % 94) + 33; } } const rotatedString = Utils.byteArrayToUtf8(rotated); if (rotatedString.toLowerCase().indexOf(cribLower) >= 0) { - const rotatedStringEscaped = Utils.escapeWhitespace(rotatedString); + const rotatedStringEscaped = + Utils.escapeWhitespace(rotatedString); if (printAmount) { - const amountStr = "Amount = " + (" " + amount).slice(-2) + ": "; + const amountStr = + "Amount = " + (" " + amount).slice(-2) + ": "; result.push(amountStr + rotatedStringEscaped); } else { result.push(rotatedStringEscaped); diff --git a/src/core/operations/ROT8000.mjs b/src/core/operations/ROT8000.mjs index 322ceaa3..477ef5a0 100644 --- a/src/core/operations/ROT8000.mjs +++ b/src/core/operations/ROT8000.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * ROT8000 operation. */ class ROT8000 extends Operation { - /** * ROT8000 constructor */ @@ -19,7 +18,8 @@ class ROT8000 extends Operation { super(); this.name = "ROT8000"; this.module = "Default"; - this.description = "The simple Caesar-cypher encryption that replaces each Unicode character with the one 0x8000 places forward or back along the alphabet."; + this.description = + "The simple Caesar-cypher encryption that replaces each Unicode character with the one 0x8000 places forward or back along the alphabet."; this.infoURL = "https://rot8000.com/info"; this.inputType = "string"; this.outputType = "string"; @@ -36,23 +36,23 @@ class ROT8000 extends Operation { // these come from the valid-code-point-transitions.json file generated from the c# proj // this is done bc: 1) don't trust JS's understanging of surrogate pairs and 2) consistency with original rot8000 const validCodePoints = { - "33": true, - "127": false, - "161": true, - "5760": false, - "5761": true, - "8192": false, - "8203": true, - "8232": false, - "8234": true, - "8239": false, - "8240": true, - "8287": false, - "8288": true, - "12288": false, - "12289": true, - "55296": false, - "57344": true + 33: true, + 127: false, + 161: true, + 5760: false, + 5761: true, + 8192: false, + 8203: true, + 8232: false, + 8234: true, + 8239: false, + 8240: true, + 8287: false, + 8288: true, + 12288: false, + 12289: true, + 55296: false, + 57344: true, }; const bmpSize = 0x10000; const rotList = {}; // the mapping of char to rotated char @@ -61,9 +61,11 @@ class ROT8000 extends Operation { for (const key in validCodePoints) { if (Object.prototype.hasOwnProperty.call(validCodePoints, key)) { if (validCodePoints[key] === true) - hiddenBlocks.push({ start: startBlock, end: parseInt(key, 10) - 1 }); - else - startBlock = parseInt(key, 10); + hiddenBlocks.push({ + start: startBlock, + end: parseInt(key, 10) - 1, + }); + else startBlock = parseInt(key, 10); } } const validIntList = []; // list of all valid chars @@ -77,8 +79,9 @@ class ROT8000 extends Operation { const rotateNum = Object.keys(validIntList).length / 2; // go through every valid char and find its match for (let i = 0; i < validIntList.length; i++) { - rotList[String.fromCharCode(validIntList[i])] = - String.fromCharCode(validIntList[(i + rotateNum) % (rotateNum * 2)]); + rotList[String.fromCharCode(validIntList[i])] = String.fromCharCode( + validIntList[(i + rotateNum) % (rotateNum * 2)], + ); } let output = ""; for (let count = 0; count < input.length; count++) { diff --git a/src/core/operations/RSADecrypt.mjs b/src/core/operations/RSADecrypt.mjs index 5b32b790..b382a54a 100644 --- a/src/core/operations/RSADecrypt.mjs +++ b/src/core/operations/RSADecrypt.mjs @@ -13,7 +13,6 @@ import { MD_ALGORITHMS } from "../lib/RSA.mjs"; * RSA Decrypt operation */ class RSADecrypt extends Operation { - /** * RSADecrypt constructor */ @@ -22,7 +21,8 @@ class RSADecrypt extends Operation { this.name = "RSA Decrypt"; this.module = "Ciphers"; - this.description = "Decrypt an RSA encrypted message with a PEM encoded private key."; + this.description = + "Decrypt an RSA encrypted message with a PEM encoded private key."; this.infoURL = "https://wikipedia.org/wiki/RSA_(cryptosystem)"; this.inputType = "string"; this.outputType = "string"; @@ -30,12 +30,12 @@ class RSADecrypt extends Operation { { name: "RSA Private Key (PEM)", type: "text", - value: "-----BEGIN RSA PRIVATE KEY-----" + value: "-----BEGIN RSA PRIVATE KEY-----", }, { name: "Key Password", type: "text", - value: "" + value: "", }, { name: "Encryption Scheme", @@ -43,22 +43,23 @@ class RSADecrypt extends Operation { value: [ { name: "RSA-OAEP", - on: [3] + on: [3], }, { name: "RSAES-PKCS1-V1_5", - off: [3] + off: [3], }, { name: "RAW", - off: [3] - }] + off: [3], + }, + ], }, { name: "Message Digest Algorithm", type: "option", - value: Object.keys(MD_ALGORITHMS) - } + value: Object.keys(MD_ALGORITHMS), + }, ]; } @@ -69,18 +70,21 @@ class RSADecrypt extends Operation { */ run(input, args) { const [pemKey, password, scheme, md] = args; - if (pemKey.replace("-----BEGIN RSA PRIVATE KEY-----", "").length === 0) { + if ( + pemKey.replace("-----BEGIN RSA PRIVATE KEY-----", "").length === 0 + ) { throw new OperationError("Please enter a private key."); } try { const privKey = forge.pki.decryptRsaPrivateKey(pemKey, password); - const dMsg = privKey.decrypt(input, scheme, {md: MD_ALGORITHMS[md].create()}); + const dMsg = privKey.decrypt(input, scheme, { + md: MD_ALGORITHMS[md].create(), + }); return forge.util.decodeUtf8(dMsg); } catch (err) { throw new OperationError(err); } } - } export default RSADecrypt; diff --git a/src/core/operations/RSAEncrypt.mjs b/src/core/operations/RSAEncrypt.mjs index 859ce132..0c6f95b6 100644 --- a/src/core/operations/RSAEncrypt.mjs +++ b/src/core/operations/RSAEncrypt.mjs @@ -13,7 +13,6 @@ import { MD_ALGORITHMS } from "../lib/RSA.mjs"; * RSA Encrypt operation */ class RSAEncrypt extends Operation { - /** * RSAEncrypt constructor */ @@ -22,7 +21,8 @@ class RSAEncrypt extends Operation { this.name = "RSA Encrypt"; this.module = "Ciphers"; - this.description = "Encrypt a message with a PEM encoded RSA public key."; + this.description = + "Encrypt a message with a PEM encoded RSA public key."; this.infoURL = "https://wikipedia.org/wiki/RSA_(cryptosystem)"; this.inputType = "string"; this.outputType = "string"; @@ -30,7 +30,7 @@ class RSAEncrypt extends Operation { { name: "RSA Public Key (PEM)", type: "text", - value: "-----BEGIN RSA PUBLIC KEY-----" + value: "-----BEGIN RSA PUBLIC KEY-----", }, { name: "Encryption Scheme", @@ -38,22 +38,23 @@ class RSAEncrypt extends Operation { value: [ { name: "RSA-OAEP", - on: [2] + on: [2], }, { name: "RSAES-PKCS1-V1_5", - off: [2] + off: [2], }, { name: "RAW", - off: [2] - }] + off: [2], + }, + ], }, { name: "Message Digest Algorithm", type: "option", - value: Object.keys(MD_ALGORITHMS) - } + value: Object.keys(MD_ALGORITHMS), + }, ]; } @@ -74,16 +75,21 @@ class RSAEncrypt extends Operation { // https://github.com/digitalbazaar/forge/issues/465#issuecomment-271097600 const plaintextBytes = forge.util.encodeUtf8(input); // Encrypt message - const eMsg = pubKey.encrypt(plaintextBytes, scheme, {md: MD_ALGORITHMS[md].create()}); + const eMsg = pubKey.encrypt(plaintextBytes, scheme, { + md: MD_ALGORITHMS[md].create(), + }); return eMsg; } catch (err) { - if (err.message === "RSAES-OAEP input message length is too long.") { - throw new OperationError(`RSAES-OAEP input message length (${err.length}) is longer than the maximum allowed length (${err.maxLength}).`); + if ( + err.message === "RSAES-OAEP input message length is too long." + ) { + throw new OperationError( + `RSAES-OAEP input message length (${err.length}) is longer than the maximum allowed length (${err.maxLength}).`, + ); } throw new OperationError(err); } } - } export default RSAEncrypt; diff --git a/src/core/operations/RSASign.mjs b/src/core/operations/RSASign.mjs index 25160f53..6ef52e06 100644 --- a/src/core/operations/RSASign.mjs +++ b/src/core/operations/RSASign.mjs @@ -14,7 +14,6 @@ import { MD_ALGORITHMS } from "../lib/RSA.mjs"; * RSA Sign operation */ class RSASign extends Operation { - /** * RSASign constructor */ @@ -23,7 +22,8 @@ class RSASign extends Operation { this.name = "RSA Sign"; this.module = "Ciphers"; - this.description = "Sign a plaintext message with a PEM encoded RSA key."; + this.description = + "Sign a plaintext message with a PEM encoded RSA key."; this.infoURL = "https://wikipedia.org/wiki/RSA_(cryptosystem)"; this.inputType = "string"; this.outputType = "string"; @@ -31,18 +31,18 @@ class RSASign extends Operation { { name: "RSA Private Key (PEM)", type: "text", - value: "-----BEGIN RSA PRIVATE KEY-----" + value: "-----BEGIN RSA PRIVATE KEY-----", }, { name: "Key Password", type: "text", - value: "" + value: "", }, { name: "Message Digest Algorithm", type: "option", - value: Object.keys(MD_ALGORITHMS) - } + value: Object.keys(MD_ALGORITHMS), + }, ]; } @@ -68,7 +68,6 @@ class RSASign extends Operation { throw new OperationError(err); } } - } export default RSASign; diff --git a/src/core/operations/RSAVerify.mjs b/src/core/operations/RSAVerify.mjs index 89b7d81f..a9e6012f 100644 --- a/src/core/operations/RSAVerify.mjs +++ b/src/core/operations/RSAVerify.mjs @@ -13,7 +13,6 @@ import { MD_ALGORITHMS } from "../lib/RSA.mjs"; * RSA Verify operation */ class RSAVerify extends Operation { - /** * RSAVerify constructor */ @@ -22,7 +21,8 @@ class RSAVerify extends Operation { this.name = "RSA Verify"; this.module = "Ciphers"; - this.description = "Verify a message against a signature and a public PEM encoded RSA key."; + this.description = + "Verify a message against a signature and a public PEM encoded RSA key."; this.infoURL = "https://wikipedia.org/wiki/RSA_(cryptosystem)"; this.inputType = "string"; this.outputType = "string"; @@ -30,18 +30,18 @@ class RSAVerify extends Operation { { name: "RSA Public Key (PEM)", type: "text", - value: "-----BEGIN RSA PUBLIC KEY-----" + value: "-----BEGIN RSA PUBLIC KEY-----", }, { name: "Message", type: "text", - value: "" + value: "", }, { name: "Message Digest Algorithm", type: "option", - value: Object.keys(MD_ALGORITHMS) - } + value: Object.keys(MD_ALGORITHMS), + }, ]; } @@ -66,12 +66,13 @@ class RSAVerify extends Operation { return result ? "Verified OK" : "Verification Failure"; } catch (err) { if (err.message === "Encrypted message length is invalid.") { - throw new OperationError(`Signature length (${err.length}) does not match expected length based on key (${err.expected}).`); + throw new OperationError( + `Signature length (${err.length}) does not match expected length based on key (${err.expected}).`, + ); } throw new OperationError(err); } } - } export default RSAVerify; diff --git a/src/core/operations/Rabbit.mjs b/src/core/operations/Rabbit.mjs index 91ff24a3..df1f0923 100644 --- a/src/core/operations/Rabbit.mjs +++ b/src/core/operations/Rabbit.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * Rabbit operation */ class Rabbit extends Operation { - /** * Rabbit constructor */ @@ -22,38 +21,39 @@ class Rabbit extends Operation { this.name = "Rabbit"; this.module = "Ciphers"; - this.description = "Rabbit is a high-speed stream cipher introduced in 2003 and defined in RFC 4503.

          The cipher uses a 128-bit key and an optional 64-bit initialization vector (IV).

          big-endian: based on RFC4503 and RFC3447
          little-endian: compatible with Crypto++"; + this.description = + "Rabbit is a high-speed stream cipher introduced in 2003 and defined in RFC 4503.

          The cipher uses a 128-bit key and an optional 64-bit initialization vector (IV).

          big-endian: based on RFC4503 and RFC3447
          little-endian: compatible with Crypto++"; this.infoURL = "https://wikipedia.org/wiki/Rabbit_(cipher)"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Endianness", - "type": "option", - "value": ["Big", "Little"] + name: "Endianness", + type: "option", + value: ["Big", "Little"], }, { - "name": "Input", - "type": "option", - "value": ["Raw", "Hex"] + name: "Input", + type: "option", + value: ["Raw", "Hex"], }, { - "name": "Output", - "type": "option", - "value": ["Raw", "Hex"] - } + name: "Output", + type: "option", + value: ["Raw", "Hex"], + }, ]; } @@ -72,22 +72,27 @@ class Rabbit extends Operation { const littleEndian = endianness === "Little"; if (key.length !== 16) { - throw new OperationError(`Invalid key length: ${key.length} bytes (expected: 16)`); + throw new OperationError( + `Invalid key length: ${key.length} bytes (expected: 16)`, + ); } if (iv.length !== 0 && iv.length !== 8) { - throw new OperationError(`Invalid IV length: ${iv.length} bytes (expected: 0 or 8)`); + throw new OperationError( + `Invalid IV length: ${iv.length} bytes (expected: 0 or 8)`, + ); } // Inner State - const X = new Uint32Array(8), C = new Uint32Array(8); + const X = new Uint32Array(8), + C = new Uint32Array(8); let b = 0; // Counter System const A = [ - 0x4d34d34d, 0xd34d34d3, 0x34d34d34, 0x4d34d34d, - 0xd34d34d3, 0x34d34d34, 0x4d34d34d, 0xd34d34d3 + 0x4d34d34d, 0xd34d34d3, 0x34d34d34, 0x4d34d34d, 0xd34d34d3, + 0x34d34d34, 0x4d34d34d, 0xd34d34d3, ]; - const counterUpdate = function() { + const counterUpdate = function () { for (let j = 0; j < 8; j++) { const temp = C[j] + A[j] + b; b = (temp / ((1 << 30) * 4)) >>> 0; @@ -96,9 +101,10 @@ class Rabbit extends Operation { }; // Next-State Function - const g = function(u, v) { + const g = function (u, v) { const uv = (u + v) >>> 0; - const upper = uv >>> 16, lower = uv & 0xffff; + const upper = uv >>> 16, + lower = uv & 0xffff; const upperUpper = upper * upper; const upperLower2 = 2 * upper * lower; const lowerLower = lower * lower; @@ -108,17 +114,17 @@ class Rabbit extends Operation { const lsw = lswTemp >>> 0; return lsw ^ msw; }; - const leftRotate = function(value, width) { + const leftRotate = function (value, width) { return (value << width) | (value >>> (32 - width)); }; - const nextStateHelper1 = function(v0, v1, v2) { + const nextStateHelper1 = function (v0, v1, v2) { return v0 + leftRotate(v1, 16) + leftRotate(v2, 16); }; - const nextStateHelper2 = function(v0, v1, v2) { + const nextStateHelper2 = function (v0, v1, v2) { return v0 + leftRotate(v1, 8) + v2; }; const G = new Uint32Array(8); - const nextState = function() { + const nextState = function () { for (let j = 0; j < 8; j++) { G[j] = g(X[j], C[j]); } @@ -162,13 +168,16 @@ class Rabbit extends Operation { // IV Setup Scheme if (iv.length === 8) { - const getIVValue = function(a, b, c, d) { + const getIVValue = function (a, b, c, d) { if (littleEndian) { - return (iv[a] << 24) | (iv[b] << 16) | - (iv[c] << 8) | iv[d]; + return (iv[a] << 24) | (iv[b] << 16) | (iv[c] << 8) | iv[d]; } else { - return (iv[7 - a] << 24) | (iv[7 - b] << 16) | - (iv[7 - c] << 8) | iv[7 - d]; + return ( + (iv[7 - a] << 24) | + (iv[7 - b] << 16) | + (iv[7 - c] << 8) | + iv[7 - d] + ); } }; C[0] = C[0] ^ getIVValue(3, 2, 1, 0); @@ -187,9 +196,9 @@ class Rabbit extends Operation { // Extraction Scheme const S = new Uint8Array(16); - const extract = function() { + const extract = function () { let pos = 0; - const addPart = function(value) { + const addPart = function (value) { S[pos++] = value >>> 8; S[pos++] = value & 0xff; }; @@ -204,7 +213,7 @@ class Rabbit extends Operation { addPart((X[0] >>> 16) ^ (X[3] & 0xffff)); addPart((X[0] & 0xffff) ^ (X[5] >>> 16)); if (littleEndian) { - for (let i = 0, j = S.length - 1; i < j;) { + for (let i = 0, j = S.length - 1; i < j; ) { const temp = S[i]; S[i] = S[j]; S[j] = temp; @@ -223,7 +232,7 @@ class Rabbit extends Operation { } } if (data.length % 16 !== 0) { - const offset = data.length - data.length % 16; + const offset = data.length - (data.length % 16); const length = data.length - offset; extract(); if (littleEndian) { @@ -232,7 +241,8 @@ class Rabbit extends Operation { } } else { for (let j = 0; j < length; j++) { - result[offset + j] = data.charCodeAt(offset + j) ^ S[16 - length + j]; + result[offset + j] = + data.charCodeAt(offset + j) ^ S[16 - length + j]; } } } @@ -241,7 +251,6 @@ class Rabbit extends Operation { } return Utils.byteArrayToChars(result); } - } export default Rabbit; diff --git a/src/core/operations/RailFenceCipherDecode.mjs b/src/core/operations/RailFenceCipherDecode.mjs index be54ee12..0c072877 100644 --- a/src/core/operations/RailFenceCipherDecode.mjs +++ b/src/core/operations/RailFenceCipherDecode.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Rail Fence Cipher Decode operation */ class RailFenceCipherDecode extends Operation { - /** * RailFenceCipherDecode constructor */ @@ -20,7 +19,8 @@ class RailFenceCipherDecode extends Operation { this.name = "Rail Fence Cipher Decode"; this.module = "Ciphers"; - this.description = "Decodes Strings that were created using the Rail fence Cipher provided a key and an offset"; + this.description = + "Decodes Strings that were created using the Rail fence Cipher provided a key and an offset"; this.infoURL = "https://wikipedia.org/wiki/Rail_fence_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -28,13 +28,13 @@ class RailFenceCipherDecode extends Operation { { name: "Key", type: "number", - value: 2 + value: 2, }, { name: "Offset", type: "number", - value: 0 - } + value: 0, + }, ]; } @@ -51,7 +51,9 @@ class RailFenceCipherDecode extends Operation { if (key < 2) { throw new OperationError("Key has to be bigger than 2"); } else if (key > cipher.length) { - throw new OperationError("Key should be smaller than the cipher's length"); + throw new OperationError( + "Key should be smaller than the cipher's length", + ); } if (offset < 0) { @@ -66,7 +68,10 @@ class RailFenceCipherDecode extends Operation { for (y = 0; y < key; y++) { for (x = 0; x < cipher.length; x++) { - if ((y + x + offset) % cycle === 0 || (y - x - offset) % cycle === 0) { + if ( + (y + x + offset) % cycle === 0 || + (y - x - offset) % cycle === 0 + ) { plaintext[x] = cipher[j++]; } } @@ -74,8 +79,6 @@ class RailFenceCipherDecode extends Operation { return plaintext.join("").trim(); } - } - export default RailFenceCipherDecode; diff --git a/src/core/operations/RailFenceCipherEncode.mjs b/src/core/operations/RailFenceCipherEncode.mjs index 03651f85..5f00d821 100644 --- a/src/core/operations/RailFenceCipherEncode.mjs +++ b/src/core/operations/RailFenceCipherEncode.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Rail Fence Cipher Encode operation */ class RailFenceCipherEncode extends Operation { - /** * RailFenceCipherEncode constructor */ @@ -20,7 +19,8 @@ class RailFenceCipherEncode extends Operation { this.name = "Rail Fence Cipher Encode"; this.module = "Ciphers"; - this.description = "Encodes Strings using the Rail fence Cipher provided a key and an offset"; + this.description = + "Encodes Strings using the Rail fence Cipher provided a key and an offset"; this.infoURL = "https://wikipedia.org/wiki/Rail_fence_cipher"; this.inputType = "string"; this.outputType = "string"; @@ -28,13 +28,13 @@ class RailFenceCipherEncode extends Operation { { name: "Key", type: "number", - value: 2 + value: 2, }, { name: "Offset", type: "number", - value: 0 - } + value: 0, + }, ]; } @@ -50,7 +50,9 @@ class RailFenceCipherEncode extends Operation { if (key < 2) { throw new OperationError("Key has to be bigger than 2"); } else if (key > plaintext.length) { - throw new OperationError("Key should be smaller than the plain text's length"); + throw new OperationError( + "Key should be smaller than the plain text's length", + ); } if (offset < 0) { @@ -61,14 +63,14 @@ class RailFenceCipherEncode extends Operation { const rows = new Array(key).fill(""); for (let pos = 0; pos < plaintext.length; pos++) { - const rowIdx = key - 1 - Math.abs(cycle / 2 - (pos + offset) % cycle); + const rowIdx = + key - 1 - Math.abs(cycle / 2 - ((pos + offset) % cycle)); rows[rowIdx] += plaintext[pos]; } return rows.join("").trim(); } - } export default RailFenceCipherEncode; diff --git a/src/core/operations/RandomizeColourPalette.mjs b/src/core/operations/RandomizeColourPalette.mjs index e3baf54b..8d0e50f0 100644 --- a/src/core/operations/RandomizeColourPalette.mjs +++ b/src/core/operations/RandomizeColourPalette.mjs @@ -16,7 +16,6 @@ import jimp from "jimp"; * Randomize Colour Palette operation */ class RandomizeColourPalette extends Operation { - /** * RandomizeColourPalette constructor */ @@ -25,7 +24,8 @@ class RandomizeColourPalette extends Operation { this.name = "Randomize Colour Palette"; this.module = "Image"; - this.description = "Randomizes each colour in an image's colour palette. This can often reveal text or symbols that were previously a very similar colour to their surroundings, a technique sometimes used in Steganography."; + this.description = + "Randomizes each colour in an image's colour palette. This can often reveal text or symbols that were previously a very similar colour to their surroundings, a technique sometimes used in Steganography."; this.infoURL = "https://wikipedia.org/wiki/Indexed_color"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -34,8 +34,8 @@ class RandomizeColourPalette extends Operation { { name: "Seed", type: "string", - value: "" - } + value: "", + }, ]; } @@ -45,17 +45,18 @@ class RandomizeColourPalette extends Operation { * @returns {ArrayBuffer} */ async run(input, args) { - if (!isImage(input)) throw new OperationError("Please enter a valid image file."); + if (!isImage(input)) + throw new OperationError("Please enter a valid image file."); - const seed = args[0] || (Math.random().toString().substr(2)), + const seed = args[0] || Math.random().toString().substr(2), parsedImage = await jimp.read(input), width = parsedImage.bitmap.width, height = parsedImage.bitmap.height; let rgbString, rgbHash, rgbHex; - parsedImage.scan(0, 0, width, height, function(x, y, idx) { - rgbString = this.bitmap.data.slice(idx, idx+3).join("."); + parsedImage.scan(0, 0, width, height, function (x, y, idx) { + rgbString = this.bitmap.data.slice(idx, idx + 3).join("."); rgbHash = runHash("md5", Utils.strToArrayBuffer(seed + rgbString)); rgbHex = rgbHash.substr(0, 6) + "ff"; parsedImage.setPixelColor(parseInt(rgbHex, 16), x, y); @@ -77,7 +78,6 @@ class RandomizeColourPalette extends Operation { return ``; } - } export default RandomizeColourPalette; diff --git a/src/core/operations/RawDeflate.mjs b/src/core/operations/RawDeflate.mjs index 0df243f4..64b4eb6d 100644 --- a/src/core/operations/RawDeflate.mjs +++ b/src/core/operations/RawDeflate.mjs @@ -5,22 +5,21 @@ */ import Operation from "../Operation.mjs"; -import {COMPRESSION_TYPE} from "../lib/Zlib.mjs"; +import { COMPRESSION_TYPE } from "../lib/Zlib.mjs"; import rawdeflate from "zlibjs/bin/rawdeflate.min.js"; const Zlib = rawdeflate.Zlib; const RAW_COMPRESSION_TYPE_LOOKUP = { - "Fixed Huffman Coding": Zlib.RawDeflate.CompressionType.FIXED, + "Fixed Huffman Coding": Zlib.RawDeflate.CompressionType.FIXED, "Dynamic Huffman Coding": Zlib.RawDeflate.CompressionType.DYNAMIC, - "None (Store)": Zlib.RawDeflate.CompressionType.NONE, + "None (Store)": Zlib.RawDeflate.CompressionType.NONE, }; /** * Raw Deflate operation */ class RawDeflate extends Operation { - /** * RawDeflate constructor */ @@ -29,7 +28,8 @@ class RawDeflate extends Operation { this.name = "Raw Deflate"; this.module = "Compression"; - this.description = "Compresses data using the deflate algorithm with no headers."; + this.description = + "Compresses data using the deflate algorithm with no headers."; this.infoURL = "https://wikipedia.org/wiki/DEFLATE"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -37,8 +37,8 @@ class RawDeflate extends Operation { { name: "Compression type", type: "option", - value: COMPRESSION_TYPE - } + value: COMPRESSION_TYPE, + }, ]; } @@ -49,11 +49,10 @@ class RawDeflate extends Operation { */ run(input, args) { const deflate = new Zlib.RawDeflate(new Uint8Array(input), { - compressionType: RAW_COMPRESSION_TYPE_LOOKUP[args[0]] + compressionType: RAW_COMPRESSION_TYPE_LOOKUP[args[0]], }); return new Uint8Array(deflate.compress()).buffer; } - } export default RawDeflate; diff --git a/src/core/operations/RawInflate.mjs b/src/core/operations/RawInflate.mjs index f5b57bde..e130e753 100644 --- a/src/core/operations/RawInflate.mjs +++ b/src/core/operations/RawInflate.mjs @@ -5,21 +5,20 @@ */ import Operation from "../Operation.mjs"; -import {INFLATE_BUFFER_TYPE} from "../lib/Zlib.mjs"; +import { INFLATE_BUFFER_TYPE } from "../lib/Zlib.mjs"; import rawinflate from "zlibjs/bin/rawinflate.min.js"; const Zlib = rawinflate.Zlib; const RAW_BUFFER_TYPE_LOOKUP = { - "Adaptive": Zlib.RawInflate.BufferType.ADAPTIVE, - "Block": Zlib.RawInflate.BufferType.BLOCK, + Adaptive: Zlib.RawInflate.BufferType.ADAPTIVE, + Block: Zlib.RawInflate.BufferType.BLOCK, }; /** * Raw Inflate operation */ class RawInflate extends Operation { - /** * RawInflate constructor */ @@ -28,7 +27,8 @@ class RawInflate extends Operation { this.name = "Raw Inflate"; this.module = "Compression"; - this.description = "Decompresses data which has been compressed using the deflate algorithm with no headers."; + this.description = + "Decompresses data which has been compressed using the deflate algorithm with no headers."; this.infoURL = "https://wikipedia.org/wiki/DEFLATE"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -36,34 +36,34 @@ class RawInflate extends Operation { { name: "Start index", type: "number", - value: 0 + value: 0, }, { name: "Initial output buffer size", type: "number", - value: 0 + value: 0, }, { name: "Buffer expansion type", type: "option", - value: INFLATE_BUFFER_TYPE + value: INFLATE_BUFFER_TYPE, }, { name: "Resize buffer after decompression", type: "boolean", - value: false + value: false, }, { name: "Verify result", type: "boolean", - value: false - } + value: false, + }, ]; this.checks = [ { entropyRange: [7.5, 8], - args: [0, 0, INFLATE_BUFFER_TYPE, false, false] - } + args: [0, 0, INFLATE_BUFFER_TYPE, false, false], + }, ]; } @@ -78,13 +78,12 @@ class RawInflate extends Operation { bufferSize: args[1], bufferType: RAW_BUFFER_TYPE_LOOKUP[args[2]], resize: args[3], - verify: args[4] + verify: args[4], }), result = new Uint8Array(inflate.decompress()); return result.buffer; } - } export default RawInflate; diff --git a/src/core/operations/Register.mjs b/src/core/operations/Register.mjs index 2f696edd..3529f24e 100644 --- a/src/core/operations/Register.mjs +++ b/src/core/operations/Register.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Register operation */ class Register extends Operation { - /** * Register constructor */ @@ -23,31 +22,32 @@ class Register extends Operation { this.name = "Register"; this.flowControl = true; this.module = "Regex"; - this.description = "Extract data from the input and store it in registers which can then be passed into subsequent operations as arguments. Regular expression capture groups are used to select the data to extract.

          To use registers in arguments, refer to them using the notation $Rn where n is the register number, starting at 0.

          For example:
          Input: Test
          Extractor: (.*)
          Argument: $R0 becomes Test

          Registers can be escaped in arguments using a backslash. e.g. \\$R0 would become $R0 rather than Test."; + this.description = + "Extract data from the input and store it in registers which can then be passed into subsequent operations as arguments. Regular expression capture groups are used to select the data to extract.

          To use registers in arguments, refer to them using the notation $Rn where n is the register number, starting at 0.

          For example:
          Input: Test
          Extractor: (.*)
          Argument: $R0 becomes Test

          Registers can be escaped in arguments using a backslash. e.g. \\$R0 would become $R0 rather than Test."; this.infoURL = "https://wikipedia.org/wiki/Regular_expression#Syntax"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Extractor", - "type": "binaryString", - "value": "([\\s\\S]*)" + name: "Extractor", + type: "binaryString", + value: "([\\s\\S]*)", }, { - "name": "Case insensitive", - "type": "boolean", - "value": true + name: "Case insensitive", + type: "boolean", + value: true, }, { - "name": "Multiline matching", - "type": "boolean", - "value": false + name: "Multiline matching", + type: "boolean", + value: false, }, { - "name": "Dot matches all", - "type": "boolean", - "value": false - } + name: "Dot matches all", + type: "boolean", + value: false, + }, ]; } @@ -74,7 +74,11 @@ class Register extends Operation { if (!registers) return state; if (isWorkerEnvironment()) { - self.setRegisters(state.forkOffset + state.progress, state.numRegisters, registers.slice(1)); + self.setRegisters( + state.forkOffset + state.progress, + state.numRegisters, + registers.slice(1), + ); } /** @@ -85,13 +89,19 @@ class Register extends Operation { */ function replaceRegister(str) { // Replace references to registers ($Rn) with contents of registers - return str.replace(/(\\*)\$R(\d{1,2})/g, (match, slashes, regNum) => { - const index = parseInt(regNum, 10) + 1; - if (index <= state.numRegisters || index >= state.numRegisters + registers.length) - return match; - if (slashes.length % 2 !== 0) return match.slice(1); // Remove escape - return slashes + registers[index - state.numRegisters]; - }); + return str.replace( + /(\\*)\$R(\d{1,2})/g, + (match, slashes, regNum) => { + const index = parseInt(regNum, 10) + 1; + if ( + index <= state.numRegisters || + index >= state.numRegisters + registers.length + ) + return match; + if (slashes.length % 2 !== 0) return match.slice(1); // Remove escape + return slashes + registers[index - state.numRegisters]; + }, + ); } // Step through all subsequent ops and replace registers in args with extracted content @@ -99,10 +109,14 @@ class Register extends Operation { if (state.opList[i].disabled) continue; let args = state.opList[i].ingValues; - args = args.map(arg => { - if (typeof arg !== "string" && typeof arg !== "object") return arg; + args = args.map((arg) => { + if (typeof arg !== "string" && typeof arg !== "object") + return arg; - if (typeof arg === "object" && Object.prototype.hasOwnProperty.call(arg, "string")) { + if ( + typeof arg === "object" && + Object.prototype.hasOwnProperty.call(arg, "string") + ) { arg.string = replaceRegister(arg.string); return arg; } @@ -114,7 +128,6 @@ class Register extends Operation { state.numRegisters += registers.length - 1; return state; } - } export default Register; diff --git a/src/core/operations/RegularExpression.mjs b/src/core/operations/RegularExpression.mjs index 18d3fda9..ed1f4ec3 100644 --- a/src/core/operations/RegularExpression.mjs +++ b/src/core/operations/RegularExpression.mjs @@ -13,7 +13,6 @@ import OperationError from "../errors/OperationError.mjs"; * Regular expression operation */ class RegularExpression extends Operation { - /** * RegularExpression constructor */ @@ -22,114 +21,120 @@ class RegularExpression extends Operation { this.name = "Regular expression"; this.module = "Regex"; - this.description = "Define your own regular expression (regex) to search the input data with, optionally choosing from a list of pre-defined patterns.

          Supports extended regex syntax including the 'dot matches all' flag, named capture groups, full unicode coverage (including \\p{} categories and scripts as well as astral codes) and recursive matching."; + this.description = + "Define your own regular expression (regex) to search the input data with, optionally choosing from a list of pre-defined patterns.

          Supports extended regex syntax including the 'dot matches all' flag, named capture groups, full unicode coverage (including \\p{} categories and scripts as well as astral codes) and recursive matching."; this.infoURL = "https://wikipedia.org/wiki/Regular_expression"; this.inputType = "string"; this.outputType = "html"; this.args = [ { - "name": "Built in regexes", - "type": "populateOption", - "value": [ + name: "Built in regexes", + type: "populateOption", + value: [ { name: "User defined", - value: "" + value: "", }, { name: "IPv4 address", - value: "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?" + value: "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", }, { name: "IPv6 address", - value: "((?=.*::)(?!.*::.+::)(::)?([\\dA-Fa-f]{1,4}:(:|\\b)|){5}|([\\dA-Fa-f]{1,4}:){6})((([\\dA-Fa-f]{1,4}((?!\\3)::|:\\b|(?![\\dA-Fa-f])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})" + value: "((?=.*::)(?!.*::.+::)(::)?([\\dA-Fa-f]{1,4}:(:|\\b)|){5}|([\\dA-Fa-f]{1,4}:){6})((([\\dA-Fa-f]{1,4}((?!\\3)::|:\\b|(?![\\dA-Fa-f])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})", }, { name: "Email address", - value: "(?:[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9](?:[\\u00A0-\\uD7FF\\uE000-\\uFFFF-a-z0-9-]*[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9])?\\.)+[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9](?:[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9-]*[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}\\])" + value: "(?:[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9](?:[\\u00A0-\\uD7FF\\uE000-\\uFFFF-a-z0-9-]*[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9])?\\.)+[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9](?:[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9-]*[\\u00A0-\\uD7FF\\uE000-\\uFFFFa-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}\\])", }, { name: "URL", - value: "([A-Za-z]+://)([-\\w]+(?:\\.\\w[-\\w]*)+)(:\\d+)?(/[^.!,?\"<>\\[\\]{}\\s\\x7F-\\xFF]*(?:[.!,?]+[^.!,?\"<>\\[\\]{}\\s\\x7F-\\xFF]+)*)?" + value: '([A-Za-z]+://)([-\\w]+(?:\\.\\w[-\\w]*)+)(:\\d+)?(/[^.!,?"<>\\[\\]{}\\s\\x7F-\\xFF]*(?:[.!,?]+[^.!,?"<>\\[\\]{}\\s\\x7F-\\xFF]+)*)?', }, { name: "Domain", - value: "\\b((?=[a-z0-9-]{1,63}\\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}\\b" + value: "\\b((?=[a-z0-9-]{1,63}\\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}\\b", }, { name: "Windows file path", - value: "([A-Za-z]):\\\\((?:[A-Za-z\\d][A-Za-z\\d\\- \\x27_\\(\\)~]{0,61}\\\\?)*[A-Za-z\\d][A-Za-z\\d\\- \\x27_\\(\\)]{0,61})(\\.[A-Za-z\\d]{1,6})?" + value: "([A-Za-z]):\\\\((?:[A-Za-z\\d][A-Za-z\\d\\- \\x27_\\(\\)~]{0,61}\\\\?)*[A-Za-z\\d][A-Za-z\\d\\- \\x27_\\(\\)]{0,61})(\\.[A-Za-z\\d]{1,6})?", }, { name: "UNIX file path", - value: "(?:/[A-Za-z\\d.][A-Za-z\\d\\-.]{0,61})+" + value: "(?:/[A-Za-z\\d.][A-Za-z\\d\\-.]{0,61})+", }, { name: "MAC address", - value: "[A-Fa-f\\d]{2}(?:[:-][A-Fa-f\\d]{2}){5}" + value: "[A-Fa-f\\d]{2}(?:[:-][A-Fa-f\\d]{2}){5}", }, { name: "Date (yyyy-mm-dd)", - value: "((?:19|20)\\d\\d)[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])" + value: "((?:19|20)\\d\\d)[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])", }, { name: "Date (dd/mm/yyyy)", - value: "(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((?:19|20)\\d\\d)" + value: "(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((?:19|20)\\d\\d)", }, { name: "Date (mm/dd/yyyy)", - value: "(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.]((?:19|20)\\d\\d)" + value: "(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.]((?:19|20)\\d\\d)", }, { name: "Strings", - value: "[A-Za-z\\d/\\-:.,_$%\\x27\"()<>= !\\[\\]{}@]{4,}" + value: '[A-Za-z\\d/\\-:.,_$%\\x27"()<>= !\\[\\]{}@]{4,}', }, { name: "UUID (any version)", - value: "[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}" + value: "[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}", }, ], - "target": 1 + target: 1, }, { - "name": "Regex", - "type": "text", - "value": "" + name: "Regex", + type: "text", + value: "", }, { - "name": "Case insensitive", - "type": "boolean", - "value": true + name: "Case insensitive", + type: "boolean", + value: true, }, { - "name": "^ and $ match at newlines", - "type": "boolean", - "value": true + name: "^ and $ match at newlines", + type: "boolean", + value: true, }, { - "name": "Dot matches all", - "type": "boolean", - "value": false + name: "Dot matches all", + type: "boolean", + value: false, }, { - "name": "Unicode support", - "type": "boolean", - "value": false + name: "Unicode support", + type: "boolean", + value: false, }, { - "name": "Astral support", - "type": "boolean", - "value": false + name: "Astral support", + type: "boolean", + value: false, }, { - "name": "Display total", - "type": "boolean", - "value": false + name: "Display total", + type: "boolean", + value: false, }, { - "name": "Output format", - "type": "option", - "value": ["Highlight matches", "List matches", "List capture groups", "List matches with capture groups"] - } + name: "Output format", + type: "option", + value: [ + "Highlight matches", + "List matches", + "List capture groups", + "List matches with capture groups", + ], + }, ]; } @@ -139,12 +144,7 @@ class RegularExpression extends Operation { * @returns {html} */ run(input, args) { - const [, - userRegex, - i, m, s, u, a, - displayTotal, - outputFormat - ] = args; + const [, userRegex, i, m, s, u, a, displayTotal, outputFormat] = args; let modifiers = "g"; if (i) modifiers += "i"; @@ -161,22 +161,31 @@ class RegularExpression extends Operation { case "Highlight matches": return regexHighlight(input, regex, displayTotal); case "List matches": - return Utils.escapeHtml(regexList(input, regex, displayTotal, true, false)); + return Utils.escapeHtml( + regexList(input, regex, displayTotal, true, false), + ); case "List capture groups": - return Utils.escapeHtml(regexList(input, regex, displayTotal, false, true)); + return Utils.escapeHtml( + regexList(input, regex, displayTotal, false, true), + ); case "List matches with capture groups": - return Utils.escapeHtml(regexList(input, regex, displayTotal, true, true)); + return Utils.escapeHtml( + regexList(input, regex, displayTotal, true, true), + ); default: - throw new OperationError("Error: Invalid output format"); + throw new OperationError( + "Error: Invalid output format", + ); } } catch (err) { - throw new OperationError("Invalid regex. Details: " + err.message); + throw new OperationError( + "Invalid regex. Details: " + err.message, + ); } } else { return Utils.escapeHtml(input); } } - } /** @@ -214,8 +223,7 @@ function regexList(input, regex, displayTotal, matches, captureGroups) { } } - if (displayTotal) - output = "Total found: " + total + "\n\n" + output; + if (displayTotal) output = "Total found: " + total + "\n\n" + output; return output.slice(0, -1); } @@ -245,7 +253,7 @@ function regexHighlight(input, regex, displayTotal) { if (groups.length) { title += "Groups:\n"; for (let i = 0; i < groups.length; i++) { - title += `\t${i+1}: ${Utils.escapeHtml(groups[i] || "")}\n`; + title += `\t${i + 1}: ${Utils.escapeHtml(groups[i] || "")}\n`; } } @@ -253,7 +261,11 @@ function regexHighlight(input, regex, displayTotal) { hl = hl === 1 ? 2 : 1; // Store highlighted match and replace with a placeholder - captureGroups.push(`${Utils.escapeHtml(match)}`); + captureGroups.push( + `${Utils.escapeHtml( + match, + )}`, + ); return `[cc_capture_group_${total++}]`; }); @@ -263,8 +275,7 @@ function regexHighlight(input, regex, displayTotal) { return captureGroups[i]; }); - if (displayTotal) - output = "Total found: " + total + "\n\n" + output; + if (displayTotal) output = "Total found: " + total + "\n\n" + output; return output; } diff --git a/src/core/operations/RemoveDiacritics.mjs b/src/core/operations/RemoveDiacritics.mjs index 859d86d7..ca1d8918 100644 --- a/src/core/operations/RemoveDiacritics.mjs +++ b/src/core/operations/RemoveDiacritics.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Remove Diacritics operation */ class RemoveDiacritics extends Operation { - /** * RemoveDiacritics constructor */ @@ -19,7 +18,8 @@ class RemoveDiacritics extends Operation { this.name = "Remove Diacritics"; this.module = "Default"; - this.description = "Replaces accented characters with their latin character equivalent. Accented characters are made up of Unicode combining characters, so unicode text formatting such as strikethroughs and underlines will also be removed."; + this.description = + "Replaces accented characters with their latin character equivalent. Accented characters are made up of Unicode combining characters, so unicode text formatting such as strikethroughs and underlines will also be removed."; this.infoURL = "https://wikipedia.org/wiki/Diacritic"; this.inputType = "string"; this.outputType = "string"; @@ -35,7 +35,6 @@ class RemoveDiacritics extends Operation { // reference: https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript/37511463 return input.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); } - } export default RemoveDiacritics; diff --git a/src/core/operations/RemoveEXIF.mjs b/src/core/operations/RemoveEXIF.mjs index fff4f6b5..15f96143 100644 --- a/src/core/operations/RemoveEXIF.mjs +++ b/src/core/operations/RemoveEXIF.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Remove EXIF operation */ class RemoveEXIF extends Operation { - /** * RemoveEXIF constructor */ @@ -47,10 +46,11 @@ class RemoveEXIF extends Operation { } catch (err) { // Simply return input if no EXIF data is found if (err === "Exif not found.") return input; - throw new OperationError(`Could not remove EXIF data from image: ${err}`); + throw new OperationError( + `Could not remove EXIF data from image: ${err}`, + ); } } - } export default RemoveEXIF; diff --git a/src/core/operations/RemoveLineNumbers.mjs b/src/core/operations/RemoveLineNumbers.mjs index 0fbf7115..8814ba6e 100644 --- a/src/core/operations/RemoveLineNumbers.mjs +++ b/src/core/operations/RemoveLineNumbers.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Remove line numbers operation */ class RemoveLineNumbers extends Operation { - /** * RemoveLineNumbers constructor */ @@ -19,7 +18,8 @@ class RemoveLineNumbers extends Operation { this.name = "Remove line numbers"; this.module = "Default"; - this.description = "Removes line numbers from the output if they can be trivially detected."; + this.description = + "Removes line numbers from the output if they can be trivially detected."; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -33,7 +33,6 @@ class RemoveLineNumbers extends Operation { run(input, args) { return input.replace(/^[ \t]{0,5}\d+[\s:|\-,.)\]]/gm, ""); } - } export default RemoveLineNumbers; diff --git a/src/core/operations/RemoveNullBytes.mjs b/src/core/operations/RemoveNullBytes.mjs index b633e82d..1003a6b5 100644 --- a/src/core/operations/RemoveNullBytes.mjs +++ b/src/core/operations/RemoveNullBytes.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Remove null bytes operation */ class RemoveNullBytes extends Operation { - /** * RemoveNullBytes constructor */ @@ -19,7 +18,8 @@ class RemoveNullBytes extends Operation { this.name = "Remove null bytes"; this.module = "Default"; - this.description = "Removes all null bytes (0x00) from the input."; + this.description = + "Removes all null bytes (0x00) from the input."; this.inputType = "ArrayBuffer"; this.outputType = "byteArray"; this.args = []; @@ -38,7 +38,6 @@ class RemoveNullBytes extends Operation { } return output; } - } export default RemoveNullBytes; diff --git a/src/core/operations/RemoveWhitespace.mjs b/src/core/operations/RemoveWhitespace.mjs index 0689f766..1ffe18cf 100644 --- a/src/core/operations/RemoveWhitespace.mjs +++ b/src/core/operations/RemoveWhitespace.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Remove whitespace operation */ class RemoveWhitespace extends Operation { - /** * RemoveWhitespace constructor */ @@ -19,40 +18,41 @@ class RemoveWhitespace extends Operation { this.name = "Remove whitespace"; this.module = "Default"; - this.description = "Optionally removes all spaces, carriage returns, line feeds, tabs and form feeds from the input data.

          This operation also supports the removal of full stops which are sometimes used to represent non-printable bytes in ASCII output."; + this.description = + "Optionally removes all spaces, carriage returns, line feeds, tabs and form feeds from the input data.

          This operation also supports the removal of full stops which are sometimes used to represent non-printable bytes in ASCII output."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Spaces", - "type": "boolean", - "value": true + name: "Spaces", + type: "boolean", + value: true, }, { - "name": "Carriage returns (\\r)", - "type": "boolean", - "value": true + name: "Carriage returns (\\r)", + type: "boolean", + value: true, }, { - "name": "Line feeds (\\n)", - "type": "boolean", - "value": true + name: "Line feeds (\\n)", + type: "boolean", + value: true, }, { - "name": "Tabs", - "type": "boolean", - "value": true + name: "Tabs", + type: "boolean", + value: true, }, { - "name": "Form feeds (\\f)", - "type": "boolean", - "value": true + name: "Form feeds (\\f)", + type: "boolean", + value: true, }, { - "name": "Full stops", - "type": "boolean", - "value": false - } + name: "Full stops", + type: "boolean", + value: false, + }, ]; } @@ -68,7 +68,7 @@ class RemoveWhitespace extends Operation { removeLineFeeds, removeTabs, removeFormFeeds, - removeFullStops + removeFullStops, ] = args; let data = input; @@ -80,7 +80,6 @@ class RemoveWhitespace extends Operation { if (removeFullStops) data = data.replace(/\./g, ""); return data; } - } export default RemoveWhitespace; diff --git a/src/core/operations/RenderImage.mjs b/src/core/operations/RenderImage.mjs index 5dee6d3c..74acee1c 100644 --- a/src/core/operations/RenderImage.mjs +++ b/src/core/operations/RenderImage.mjs @@ -9,13 +9,12 @@ import { fromHex } from "../lib/Hex.mjs"; import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {isImage} from "../lib/FileType.mjs"; +import { isImage } from "../lib/FileType.mjs"; /** * Render Image operation */ class RenderImage extends Operation { - /** * RenderImage constructor */ @@ -24,27 +23,29 @@ class RenderImage extends Operation { this.name = "Render Image"; this.module = "Image"; - this.description = "Displays the input as an image. Supports the following formats:

          • jpg/jpeg
          • png
          • gif
          • webp
          • bmp
          • ico
          "; + this.description = + "Displays the input as an image. Supports the following formats:

          • jpg/jpeg
          • png
          • gif
          • webp
          • bmp
          • ico
          "; this.inputType = "string"; this.outputType = "byteArray"; this.presentType = "html"; this.args = [ { - "name": "Input format", - "type": "option", - "value": ["Raw", "Base64", "Hex"] - } + name: "Input format", + type: "option", + value: ["Raw", "Base64", "Hex"], + }, ]; this.checks = [ { - pattern: "^(?:\\xff\\xd8\\xff|\\x89\\x50\\x4e\\x47|\\x47\\x49\\x46|.{8}\\x57\\x45\\x42\\x50|\\x42\\x4d)", + pattern: + "^(?:\\xff\\xd8\\xff|\\x89\\x50\\x4e\\x47|\\x47\\x49\\x46|.{8}\\x57\\x45\\x42\\x50|\\x42\\x4d)", flags: "", args: ["Raw"], useful: true, output: { - mime: "image" - } - } + mime: "image", + }, + }, ]; } @@ -106,7 +107,6 @@ class RenderImage extends Operation { return ""; } - } export default RenderImage; diff --git a/src/core/operations/RenderMarkdown.mjs b/src/core/operations/RenderMarkdown.mjs index c656bf5b..436208fa 100644 --- a/src/core/operations/RenderMarkdown.mjs +++ b/src/core/operations/RenderMarkdown.mjs @@ -12,7 +12,6 @@ import hljs from "highlight.js"; * Render Markdown operation */ class RenderMarkdown extends Operation { - /** * RenderMarkdown constructor */ @@ -21,7 +20,8 @@ class RenderMarkdown extends Operation { this.name = "Render Markdown"; this.module = "Code"; - this.description = "Renders input Markdown as HTML. HTML rendering is disabled to avoid XSS."; + this.description = + "Renders input Markdown as HTML. HTML rendering is disabled to avoid XSS."; this.infoURL = "https://wikipedia.org/wiki/Markdown"; this.inputType = "string"; this.outputType = "html"; @@ -29,13 +29,13 @@ class RenderMarkdown extends Operation { { name: "Autoconvert URLs to links", type: "boolean", - value: false + value: false, }, { name: "Enable syntax highlighting", type: "boolean", - value: true - } + value: true, + }, ]; } @@ -49,7 +49,7 @@ class RenderMarkdown extends Operation { md = new MarkdownIt({ linkify: convertLinks, html: false, // Explicitly disable HTML rendering - highlight: function(str, lang) { + highlight: function (str, lang) { if (lang && hljs.getLanguage(lang) && enableHighlighting) { try { return hljs.highlight(lang, str).value; @@ -57,13 +57,12 @@ class RenderMarkdown extends Operation { } return ""; - } + }, }), rendered = md.render(input); return `
          ${rendered}
          `; } - } export default RenderMarkdown; diff --git a/src/core/operations/ResizeImage.mjs b/src/core/operations/ResizeImage.mjs index b2ed3bbf..3cd34269 100644 --- a/src/core/operations/ResizeImage.mjs +++ b/src/core/operations/ResizeImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Resize Image operation */ class ResizeImage extends Operation { - /** * ResizeImage constructor */ @@ -24,7 +23,8 @@ class ResizeImage extends Operation { this.name = "Resize Image"; this.module = "Image"; - this.description = "Resizes an image to the specified width and height values."; + this.description = + "Resizes an image to the specified width and height values."; this.infoURL = "https://wikipedia.org/wiki/Image_scaling"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -34,23 +34,23 @@ class ResizeImage extends Operation { name: "Width", type: "number", value: 100, - min: 1 + min: 1, }, { name: "Height", type: "number", value: 100, - min: 1 + min: 1, }, { name: "Unit type", type: "option", - value: ["Pixels", "Percent"] + value: ["Pixels", "Percent"], }, { name: "Maintain aspect ratio", type: "boolean", - value: false + value: false, }, { name: "Resizing algorithm", @@ -60,10 +60,10 @@ class ResizeImage extends Operation { "Bilinear", "Bicubic", "Hermite", - "Bezier" + "Bezier", ], - defaultIndex: 1 - } + defaultIndex: 1, + }, ]; } @@ -81,10 +81,10 @@ class ResizeImage extends Operation { const resizeMap = { "Nearest Neighbour": jimp.RESIZE_NEAREST_NEIGHBOR, - "Bilinear": jimp.RESIZE_BILINEAR, - "Bicubic": jimp.RESIZE_BICUBIC, - "Hermite": jimp.RESIZE_HERMITE, - "Bezier": jimp.RESIZE_BEZIER + Bilinear: jimp.RESIZE_BILINEAR, + Bicubic: jimp.RESIZE_BICUBIC, + Hermite: jimp.RESIZE_HERMITE, + Bezier: jimp.RESIZE_BEZIER, }; if (!isImage(input)) { @@ -139,7 +139,6 @@ class ResizeImage extends Operation { return ``; } - } export default ResizeImage; diff --git a/src/core/operations/Return.mjs b/src/core/operations/Return.mjs index 2a1c6a38..410635ce 100644 --- a/src/core/operations/Return.mjs +++ b/src/core/operations/Return.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Return operation */ class Return extends Operation { - /** * Return constructor */ @@ -20,7 +19,8 @@ class Return extends Operation { this.name = "Return"; this.flowControl = true; this.module = "Default"; - this.description = "End execution of operations at this point in the recipe."; + this.description = + "End execution of operations at this point in the recipe."; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -37,7 +37,6 @@ class Return extends Operation { state.progress = state.opList.length; return state; } - } export default Return; diff --git a/src/core/operations/Reverse.mjs b/src/core/operations/Reverse.mjs index 49c752a8..6f646bdf 100644 --- a/src/core/operations/Reverse.mjs +++ b/src/core/operations/Reverse.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Reverse operation */ class Reverse extends Operation { - /** * Reverse constructor */ @@ -25,11 +24,11 @@ class Reverse extends Operation { this.outputType = "byteArray"; this.args = [ { - "name": "By", - "type": "option", - "value": ["Byte", "Character", "Line"], - "defaultIndex": 1 - } + name: "By", + type: "option", + value: ["Byte", "Character", "Line"], + defaultIndex: 1, + }, ]; } @@ -81,7 +80,6 @@ class Reverse extends Operation { return input.reverse(); } } - } export default Reverse; diff --git a/src/core/operations/RisonDecode.mjs b/src/core/operations/RisonDecode.mjs index 1b9741a8..bf12c754 100644 --- a/src/core/operations/RisonDecode.mjs +++ b/src/core/operations/RisonDecode.mjs @@ -12,7 +12,6 @@ import rison from "rison"; * Rison Decode operation */ class RisonDecode extends Operation { - /** * RisonDecode constructor */ @@ -21,7 +20,8 @@ class RisonDecode extends Operation { this.name = "Rison Decode"; this.module = "Default"; - this.description = "Rison, a data serialization format optimized for compactness in URIs. Rison is a slight variation of JSON that looks vastly superior after URI encoding. Rison still expresses exactly the same set of data structures as JSON, so data can be translated back and forth without loss or guesswork."; + this.description = + "Rison, a data serialization format optimized for compactness in URIs. Rison is a slight variation of JSON that looks vastly superior after URI encoding. Rison still expresses exactly the same set of data structures as JSON, so data can be translated back and forth without loss or guesswork."; this.infoURL = "https://github.com/Nanonid/rison"; this.inputType = "string"; this.outputType = "Object"; @@ -30,10 +30,10 @@ class RisonDecode extends Operation { name: "Decode Option", type: "editableOption", value: [ - { name: "Decode", value: "Decode", }, - { name: "Decode Object", value: "Decode Object", }, - { name: "Decode Array", value: "Decode Array", }, - ] + { name: "Decode", value: "Decode" }, + { name: "Decode Object", value: "Decode Object" }, + { name: "Decode Array", value: "Decode Array" }, + ], }, ]; } diff --git a/src/core/operations/RisonEncode.mjs b/src/core/operations/RisonEncode.mjs index 36a61017..4aed2440 100644 --- a/src/core/operations/RisonEncode.mjs +++ b/src/core/operations/RisonEncode.mjs @@ -12,7 +12,6 @@ import rison from "rison"; * Rison Encode operation */ class RisonEncode extends Operation { - /** * RisonEncode constructor */ @@ -21,7 +20,8 @@ class RisonEncode extends Operation { this.name = "Rison Encode"; this.module = "Default"; - this.description = "Rison, a data serialization format optimized for compactness in URIs. Rison is a slight variation of JSON that looks vastly superior after URI encoding. Rison still expresses exactly the same set of data structures as JSON, so data can be translated back and forth without loss or guesswork."; + this.description = + "Rison, a data serialization format optimized for compactness in URIs. Rison is a slight variation of JSON that looks vastly superior after URI encoding. Rison still expresses exactly the same set of data structures as JSON, so data can be translated back and forth without loss or guesswork."; this.infoURL = "https://github.com/Nanonid/rison"; this.inputType = "Object"; this.outputType = "string"; @@ -30,11 +30,11 @@ class RisonEncode extends Operation { name: "Encode Option", type: "editableOption", value: [ - { name: "Encode", value: "Encode", }, - { name: "Encode Object", value: "Encode Object", }, - { name: "Encode Array", value: "Encode Array", }, - { name: "Encode URI", value: "Encode URI", } - ] + { name: "Encode", value: "Encode" }, + { name: "Encode Object", value: "Encode Object" }, + { name: "Encode Array", value: "Encode Array" }, + { name: "Encode URI", value: "Encode URI" }, + ], }, ]; } diff --git a/src/core/operations/RotateImage.mjs b/src/core/operations/RotateImage.mjs index a4659b12..36024ee6 100644 --- a/src/core/operations/RotateImage.mjs +++ b/src/core/operations/RotateImage.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * Rotate Image operation */ class RotateImage extends Operation { - /** * RotateImage constructor */ @@ -24,7 +23,8 @@ class RotateImage extends Operation { this.name = "Rotate Image"; this.module = "Image"; - this.description = "Rotates an image by the specified number of degrees."; + this.description = + "Rotates an image by the specified number of degrees."; this.infoURL = ""; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -33,8 +33,8 @@ class RotateImage extends Operation { { name: "Rotation amount (degrees)", type: "number", - value: 90 - } + value: 90, + }, ]; } @@ -89,7 +89,6 @@ class RotateImage extends Operation { return ``; } - } export default RotateImage; diff --git a/src/core/operations/RotateLeft.mjs b/src/core/operations/RotateLeft.mjs index e9ef8329..f6e06ca9 100644 --- a/src/core/operations/RotateLeft.mjs +++ b/src/core/operations/RotateLeft.mjs @@ -5,14 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {rot, rotl, rotlCarry} from "../lib/Rotate.mjs"; - +import { rot, rotl, rotlCarry } from "../lib/Rotate.mjs"; /** * Rotate left operation. */ class RotateLeft extends Operation { - /** * RotateLeft constructor */ @@ -21,21 +19,23 @@ class RotateLeft extends Operation { this.name = "Rotate left"; this.module = "Default"; - this.description = "Rotates each byte to the left by the number of bits specified, optionally carrying the excess bits over to the next byte. Currently only supports 8-bit values."; - this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; + this.description = + "Rotates each byte to the left by the number of bits specified, optionally carrying the excess bits over to the next byte. Currently only supports 8-bit values."; + this.infoURL = + "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; this.inputType = "byteArray"; this.outputType = "byteArray"; this.args = [ { name: "Amount", type: "number", - value: 1 + value: 1, }, { name: "Carry through", type: "boolean", - value: false - } + value: false, + }, ]; } diff --git a/src/core/operations/RotateRight.mjs b/src/core/operations/RotateRight.mjs index 4e9451fc..d3787ae4 100644 --- a/src/core/operations/RotateRight.mjs +++ b/src/core/operations/RotateRight.mjs @@ -5,14 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {rot, rotr, rotrCarry} from "../lib/Rotate.mjs"; - +import { rot, rotr, rotrCarry } from "../lib/Rotate.mjs"; /** * Rotate right operation. */ class RotateRight extends Operation { - /** * RotateRight constructor */ @@ -21,21 +19,23 @@ class RotateRight extends Operation { this.name = "Rotate right"; this.module = "Default"; - this.description = "Rotates each byte to the right by the number of bits specified, optionally carrying the excess bits over to the next byte. Currently only supports 8-bit values."; - this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; + this.description = + "Rotates each byte to the right by the number of bits specified, optionally carrying the excess bits over to the next byte. Currently only supports 8-bit values."; + this.infoURL = + "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts"; this.inputType = "byteArray"; this.outputType = "byteArray"; this.args = [ { name: "Amount", type: "number", - value: 1 + value: 1, }, { name: "Carry through", type: "boolean", - value: false - } + value: false, + }, ]; } diff --git a/src/core/operations/SHA0.mjs b/src/core/operations/SHA0.mjs index 7f712ad9..01d5d758 100644 --- a/src/core/operations/SHA0.mjs +++ b/src/core/operations/SHA0.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * SHA0 operation */ class SHA0 extends Operation { - /** * SHA0 constructor */ @@ -20,7 +19,8 @@ class SHA0 extends Operation { this.name = "SHA0"; this.module = "Crypto"; - this.description = "SHA-0 is a retronym applied to the original version of the 160-bit hash function published in 1993 under the name 'SHA'. It was withdrawn shortly after publication due to an undisclosed 'significant flaw' and replaced by the slightly revised version SHA-1. The message digest algorithm consists, by default, of 80 rounds."; + this.description = + "SHA-0 is a retronym applied to the original version of the 160-bit hash function published in 1993 under the name 'SHA'. It was withdrawn shortly after publication due to an undisclosed 'significant flaw' and replaced by the slightly revised version SHA-1. The message digest algorithm consists, by default, of 80 rounds."; this.infoURL = "https://wikipedia.org/wiki/SHA-1#SHA-0"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -29,8 +29,8 @@ class SHA0 extends Operation { name: "Rounds", type: "number", value: 80, - min: 16 - } + min: 16, + }, ]; } @@ -40,9 +40,8 @@ class SHA0 extends Operation { * @returns {string} */ run(input, args) { - return runHash("sha0", input, {rounds: args[0]}); + return runHash("sha0", input, { rounds: args[0] }); } - } export default SHA0; diff --git a/src/core/operations/SHA1.mjs b/src/core/operations/SHA1.mjs index 8c081f2f..a1ee8d41 100644 --- a/src/core/operations/SHA1.mjs +++ b/src/core/operations/SHA1.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * SHA1 operation */ class SHA1 extends Operation { - /** * SHA1 constructor */ @@ -20,7 +19,8 @@ class SHA1 extends Operation { this.name = "SHA1"; this.module = "Crypto"; - this.description = "The SHA (Secure Hash Algorithm) hash functions were designed by the NSA. SHA-1 is the most established of the existing SHA hash functions and it is used in a variety of security applications and protocols.

          However, SHA-1's collision resistance has been weakening as new attacks are discovered or improved. The message digest algorithm consists, by default, of 80 rounds."; + this.description = + "The SHA (Secure Hash Algorithm) hash functions were designed by the NSA. SHA-1 is the most established of the existing SHA hash functions and it is used in a variety of security applications and protocols.

          However, SHA-1's collision resistance has been weakening as new attacks are discovered or improved. The message digest algorithm consists, by default, of 80 rounds."; this.infoURL = "https://wikipedia.org/wiki/SHA-1"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -29,8 +29,8 @@ class SHA1 extends Operation { name: "Rounds", type: "number", value: 80, - min: 16 - } + min: 16, + }, ]; } @@ -40,9 +40,8 @@ class SHA1 extends Operation { * @returns {string} */ run(input, args) { - return runHash("sha1", input, {rounds: args[0]}); + return runHash("sha1", input, { rounds: args[0] }); } - } export default SHA1; diff --git a/src/core/operations/SHA2.mjs b/src/core/operations/SHA2.mjs index ecdc4cc5..e2e2b4ed 100644 --- a/src/core/operations/SHA2.mjs +++ b/src/core/operations/SHA2.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * SHA2 operation */ class SHA2 extends Operation { - /** * SHA2 constructor */ @@ -20,7 +19,8 @@ class SHA2 extends Operation { this.name = "SHA2"; this.module = "Crypto"; - this.description = "The SHA-2 (Secure Hash Algorithm 2) hash functions were designed by the NSA. SHA-2 includes significant changes from its predecessor, SHA-1. The SHA-2 family consists of hash functions with digests (hash values) that are 224, 256, 384 or 512 bits: SHA224, SHA256, SHA384, SHA512.

          • SHA-512 operates on 64-bit words.
          • SHA-256 operates on 32-bit words.
          • SHA-384 is largely identical to SHA-512 but is truncated to 384 bytes.
          • SHA-224 is largely identical to SHA-256 but is truncated to 224 bytes.
          • SHA-512/224 and SHA-512/256 are truncated versions of SHA-512, but the initial values are generated using the method described in Federal Information Processing Standards (FIPS) PUB 180-4.
          The message digest algorithm for SHA256 variants consists, by default, of 64 rounds, and for SHA512 variants, it is, by default, 160."; + this.description = + "The SHA-2 (Secure Hash Algorithm 2) hash functions were designed by the NSA. SHA-2 includes significant changes from its predecessor, SHA-1. The SHA-2 family consists of hash functions with digests (hash values) that are 224, 256, 384 or 512 bits: SHA224, SHA256, SHA384, SHA512.

          • SHA-512 operates on 64-bit words.
          • SHA-256 operates on 32-bit words.
          • SHA-384 is largely identical to SHA-512 but is truncated to 384 bytes.
          • SHA-224 is largely identical to SHA-256 but is truncated to 224 bytes.
          • SHA-512/224 and SHA-512/256 are truncated versions of SHA-512, but the initial values are generated using the method described in Federal Information Processing Standards (FIPS) PUB 180-4.
          The message digest algorithm for SHA256 variants consists, by default, of 64 rounds, and for SHA512 variants, it is, by default, 160."; this.infoURL = "https://wikipedia.org/wiki/SHA-2"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -32,47 +32,47 @@ class SHA2 extends Operation { { name: "512", on: [2], - off: [1] + off: [1], }, { name: "384", on: [2], - off: [1] + off: [1], }, { name: "256", on: [1], - off: [2] + off: [2], }, { name: "224", on: [1], - off: [2] + off: [2], }, { name: "512/256", on: [2], - off: [1] + off: [1], }, { name: "512/224", on: [2], - off: [1] - } - ] + off: [1], + }, + ], }, { name: "Rounds", // For SHA256 variants type: "number", value: 64, - min: 16 + min: 16, }, { name: "Rounds", // For SHA512 variants type: "number", value: 160, - min: 32 - } + min: 32, + }, ]; } @@ -83,10 +83,9 @@ class SHA2 extends Operation { */ run(input, args) { const size = args[0]; - const rounds = (size === "256" || size === "224") ? args[1] : args[2]; - return runHash("sha" + size, input, {rounds: rounds}); + const rounds = size === "256" || size === "224" ? args[1] : args[2]; + return runHash("sha" + size, input, { rounds: rounds }); } - } export default SHA2; diff --git a/src/core/operations/SHA3.mjs b/src/core/operations/SHA3.mjs index 0f3cdef7..ab895a2f 100644 --- a/src/core/operations/SHA3.mjs +++ b/src/core/operations/SHA3.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * SHA3 operation */ class SHA3 extends Operation { - /** * SHA3 constructor */ @@ -21,16 +20,17 @@ class SHA3 extends Operation { this.name = "SHA3"; this.module = "Crypto"; - this.description = "The SHA-3 (Secure Hash Algorithm 3) hash functions were released by NIST on August 5, 2015. Although part of the same series of standards, SHA-3 is internally quite different from the MD5-like structure of SHA-1 and SHA-2.

          SHA-3 is a subset of the broader cryptographic primitive family Keccak designed by Guido Bertoni, Joan Daemen, Micha\xebl Peeters, and Gilles Van Assche, building upon RadioGat\xfan."; + this.description = + "The SHA-3 (Secure Hash Algorithm 3) hash functions were released by NIST on August 5, 2015. Although part of the same series of standards, SHA-3 is internally quite different from the MD5-like structure of SHA-1 and SHA-2.

          SHA-3 is a subset of the broader cryptographic primitive family Keccak designed by Guido Bertoni, Joan Daemen, Micha\xebl Peeters, and Gilles Van Assche, building upon RadioGat\xfan."; this.infoURL = "https://wikipedia.org/wiki/SHA-3"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Size", - "type": "option", - "value": ["512", "384", "256", "224"] - } + name: "Size", + type: "option", + value: ["512", "384", "256", "224"], + }, ]; } @@ -62,7 +62,6 @@ class SHA3 extends Operation { return algo(input); } - } export default SHA3; diff --git a/src/core/operations/SIGABA.mjs b/src/core/operations/SIGABA.mjs index 274f09f6..be237aca 100644 --- a/src/core/operations/SIGABA.mjs +++ b/src/core/operations/SIGABA.mjs @@ -7,14 +7,20 @@ */ import Operation from "../Operation.mjs"; -import {LETTERS} from "../lib/Enigma.mjs"; -import {NUMBERS, CR_ROTORS, I_ROTORS, SigabaMachine, CRRotor, IRotor} from "../lib/SIGABA.mjs"; +import { LETTERS } from "../lib/Enigma.mjs"; +import { + NUMBERS, + CR_ROTORS, + I_ROTORS, + SigabaMachine, + CRRotor, + IRotor, +} from "../lib/SIGABA.mjs"; /** * Sigaba operation */ class Sigaba extends Operation { - /** * Sigaba constructor */ @@ -23,7 +29,8 @@ class Sigaba extends Operation { this.name = "SIGABA"; this.module = "Bletchley"; - this.description = "Encipher/decipher with the WW2 SIGABA machine.

          SIGABA, otherwise known as ECM Mark II, was used by the United States for message encryption during WW2 up to the 1950s. It was developed in the 1930s by the US Army and Navy, and has up to this day never been broken. Consisting of 15 rotors: 5 cipher rotors and 10 rotors (5 control rotors and 5 index rotors) controlling the stepping of the cipher rotors, the rotor stepping for SIGABA is much more complex than other rotor machines of its time, such as Enigma. All example rotor wirings are random example sets.

          To configure rotor wirings, for the cipher and control rotors enter a string of letters which map from A to Z, and for the index rotors enter a sequence of numbers which map from 0 to 9. Note that encryption is not the same as decryption, so first choose the desired mode.

          Note: Whilst this has been tested against other software emulators, it has not been tested against hardware."; + this.description = + "Encipher/decipher with the WW2 SIGABA machine.

          SIGABA, otherwise known as ECM Mark II, was used by the United States for message encryption during WW2 up to the 1950s. It was developed in the 1930s by the US Army and Navy, and has up to this day never been broken. Consisting of 15 rotors: 5 cipher rotors and 10 rotors (5 control rotors and 5 index rotors) controlling the stepping of the cipher rotors, the rotor stepping for SIGABA is much more complex than other rotor machines of its time, such as Enigma. All example rotor wirings are random example sets.

          To configure rotor wirings, for the cipher and control rotors enter a string of letters which map from A to Z, and for the index rotors enter a sequence of numbers which map from 0 to 9. Note that encryption is not the same as decryption, so first choose the desired mode.

          Note: Whilst this has been tested against other software emulators, it has not been tested against hardware."; this.infoURL = "https://wikipedia.org/wiki/SIGABA"; this.inputType = "string"; this.outputType = "string"; @@ -32,222 +39,222 @@ class Sigaba extends Operation { name: "1st (left-hand) cipher rotor", type: "editableOption", value: CR_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "1st cipher rotor reversed", type: "boolean", - value: false + value: false, }, { name: "1st cipher rotor intial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "2nd cipher rotor", type: "editableOption", value: CR_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "2nd cipher rotor reversed", type: "boolean", - value: false + value: false, }, { name: "2nd cipher rotor intial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "3rd (middle) cipher rotor", type: "editableOption", value: CR_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "3rd cipher rotor reversed", type: "boolean", - value: false + value: false, }, { name: "3rd cipher rotor intial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "4th cipher rotor", type: "editableOption", value: CR_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "4th cipher rotor reversed", type: "boolean", - value: false + value: false, }, { name: "4th cipher rotor intial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "5th (right-hand) cipher rotor", type: "editableOption", value: CR_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "5th cipher rotor reversed", type: "boolean", - value: false + value: false, }, { name: "5th cipher rotor intial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "1st (left-hand) control rotor", type: "editableOption", value: CR_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "1st control rotor reversed", type: "boolean", - value: false + value: false, }, { name: "1st control rotor intial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "2nd control rotor", type: "editableOption", value: CR_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "2nd control rotor reversed", type: "boolean", - value: false + value: false, }, { name: "2nd control rotor intial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "3rd (middle) control rotor", type: "editableOption", value: CR_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "3rd control rotor reversed", type: "boolean", - value: false + value: false, }, { name: "3rd control rotor intial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "4th control rotor", type: "editableOption", value: CR_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "4th control rotor reversed", type: "boolean", - value: false + value: false, }, { name: "4th control rotor intial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "5th (right-hand) control rotor", type: "editableOption", value: CR_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "5th control rotor reversed", type: "boolean", - value: false + value: false, }, { name: "5th control rotor intial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "1st (left-hand) index rotor", type: "editableOption", value: I_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "1st index rotor intial value", type: "option", - value: NUMBERS + value: NUMBERS, }, { name: "2nd index rotor", type: "editableOption", value: I_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "2nd index rotor intial value", type: "option", - value: NUMBERS + value: NUMBERS, }, { name: "3rd (middle) index rotor", type: "editableOption", value: I_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "3rd index rotor intial value", type: "option", - value: NUMBERS + value: NUMBERS, }, { name: "4th index rotor", type: "editableOption", value: I_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "4th index rotor intial value", type: "option", - value: NUMBERS + value: NUMBERS, }, { name: "5th (right-hand) index rotor", type: "editableOption", value: I_ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "5th index rotor intial value", type: "option", - value: NUMBERS + value: NUMBERS, }, { name: "SIGABA mode", type: "option", - value: ["Encrypt", "Decrypt"] - } + value: ["Encrypt", "Decrypt"], + }, ]; } @@ -261,19 +268,27 @@ class Sigaba extends Operation { const cipherRotors = []; const controlRotors = []; const indexRotors = []; - for (let i=0; i<5; i++) { - const rotorWiring = args[i*3]; - cipherRotors.push(new CRRotor(rotorWiring, args[i*3+2], args[i*3+1])); + for (let i = 0; i < 5; i++) { + const rotorWiring = args[i * 3]; + cipherRotors.push( + new CRRotor(rotorWiring, args[i * 3 + 2], args[i * 3 + 1]), + ); } - for (let i=5; i<10; i++) { - const rotorWiring = args[i*3]; - controlRotors.push(new CRRotor(rotorWiring, args[i*3+2], args[i*3+1])); + for (let i = 5; i < 10; i++) { + const rotorWiring = args[i * 3]; + controlRotors.push( + new CRRotor(rotorWiring, args[i * 3 + 2], args[i * 3 + 1]), + ); } - for (let i=15; i<20; i++) { - const rotorWiring = args[i*2]; - indexRotors.push(new IRotor(rotorWiring, args[i*2+1])); + for (let i = 15; i < 20; i++) { + const rotorWiring = args[i * 2]; + indexRotors.push(new IRotor(rotorWiring, args[i * 2 + 1])); } - const sigaba = new SigabaMachine(cipherRotors, controlRotors, indexRotors); + const sigaba = new SigabaMachine( + cipherRotors, + controlRotors, + indexRotors, + ); let result; if (sigabaSwitch === "Encrypt") { result = sigaba.encrypt(input); @@ -282,6 +297,5 @@ class Sigaba extends Operation { } return result; } - } export default Sigaba; diff --git a/src/core/operations/SM3.mjs b/src/core/operations/SM3.mjs index 1441476a..1b3d8041 100644 --- a/src/core/operations/SM3.mjs +++ b/src/core/operations/SM3.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import Sm3 from "crypto-api/src/hasher/sm3.mjs"; -import {toHex} from "crypto-api/src/encoder/hex.mjs"; +import { toHex } from "crypto-api/src/encoder/hex.mjs"; /** * SM3 operation */ class SM3 extends Operation { - /** * SM3 constructor */ @@ -22,7 +21,8 @@ class SM3 extends Operation { this.name = "SM3"; this.module = "Crypto"; - this.description = "SM3 is a cryptographic hash function used in the Chinese National Standard. SM3 is mainly used in digital signatures, message authentication codes, and pseudorandom number generators. The message digest algorithm consists, by default, of 64 rounds and length of 256."; + this.description = + "SM3 is a cryptographic hash function used in the Chinese National Standard. SM3 is mainly used in digital signatures, message authentication codes, and pseudorandom number generators. The message digest algorithm consists, by default, of 64 rounds and length of 256."; this.infoURL = "https://wikipedia.org/wiki/SM3_(hash_function)"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -30,14 +30,14 @@ class SM3 extends Operation { { name: "Length", type: "number", - value: 256 + value: 256, }, { name: "Rounds", type: "number", value: 64, - min: 16 - } + min: 16, + }, ]; } @@ -48,7 +48,7 @@ class SM3 extends Operation { */ run(input, args) { const msg = Utils.arrayBufferToStr(input, false); - const hasher = new Sm3({length: args[0], rounds: args[1]}); + const hasher = new Sm3({ length: args[0], rounds: args[1] }); hasher.update(msg); return toHex(hasher.finalize()); } diff --git a/src/core/operations/SM4Decrypt.mjs b/src/core/operations/SM4Decrypt.mjs index a0853021..0e862f0d 100644 --- a/src/core/operations/SM4Decrypt.mjs +++ b/src/core/operations/SM4Decrypt.mjs @@ -14,7 +14,6 @@ import { decryptSM4 } from "../lib/SM4.mjs"; * SM4 Decrypt operation */ class SM4Decrypt extends Operation { - /** * SM4Encrypt constructor */ @@ -23,38 +22,47 @@ class SM4Decrypt extends Operation { this.name = "SM4 Decrypt"; this.module = "Ciphers"; - this.description = "SM4 is a 128-bit block cipher, currently established as a national standard (GB/T 32907-2016) of China."; + this.description = + "SM4 is a 128-bit block cipher, currently established as a national standard (GB/T 32907-2016) of China."; this.infoURL = "https://wikipedia.org/wiki/SM4_(cipher)"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Mode", - "type": "option", - "value": ["CBC", "CFB", "OFB", "CTR", "ECB", "CBC/NoPadding", "ECB/NoPadding"] + name: "Mode", + type: "option", + value: [ + "CBC", + "CFB", + "OFB", + "CTR", + "ECB", + "CBC/NoPadding", + "ECB/NoPadding", + ], }, { - "name": "Input", - "type": "option", - "value": ["Raw", "Hex"] + name: "Input", + type: "option", + value: ["Raw", "Hex"], }, { - "name": "Output", - "type": "option", - "value": ["Hex", "Raw"] - } + name: "Output", + type: "option", + value: ["Hex", "Raw"], + }, ]; } @@ -66,7 +74,7 @@ class SM4Decrypt extends Operation { run(input, args) { const key = Utils.convertToByteArray(args[0].string, args[0].option), iv = Utils.convertToByteArray(args[1].string, args[1].option), - [,, mode, inputType, outputType] = args; + [, , mode, inputType, outputType] = args; if (key.length !== 16) throw new OperationError(`Invalid key length: ${key.length} bytes @@ -79,10 +87,17 @@ SM4 uses an IV length of 16 bytes (128 bits). Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); input = Utils.convertToByteArray(input, inputType); - const output = decryptSM4(input, key, iv, mode.substring(0, 3), mode.endsWith("NoPadding")); - return outputType === "Hex" ? toHex(output) : Utils.byteArrayToUtf8(output); + const output = decryptSM4( + input, + key, + iv, + mode.substring(0, 3), + mode.endsWith("NoPadding"), + ); + return outputType === "Hex" + ? toHex(output) + : Utils.byteArrayToUtf8(output); } - } export default SM4Decrypt; diff --git a/src/core/operations/SM4Encrypt.mjs b/src/core/operations/SM4Encrypt.mjs index 0a58dfb9..a69b2979 100644 --- a/src/core/operations/SM4Encrypt.mjs +++ b/src/core/operations/SM4Encrypt.mjs @@ -14,7 +14,6 @@ import { encryptSM4 } from "../lib/SM4.mjs"; * SM4 Encrypt operation */ class SM4Encrypt extends Operation { - /** * SM4Encrypt constructor */ @@ -23,38 +22,39 @@ class SM4Encrypt extends Operation { this.name = "SM4 Encrypt"; this.module = "Ciphers"; - this.description = "SM4 is a 128-bit block cipher, currently established as a national standard (GB/T 32907-2016) of China. Multiple block cipher modes are supported. When using CBC or ECB mode, the PKCS#7 padding scheme is used."; + this.description = + "SM4 is a 128-bit block cipher, currently established as a national standard (GB/T 32907-2016) of China. Multiple block cipher modes are supported. When using CBC or ECB mode, the PKCS#7 padding scheme is used."; this.infoURL = "https://wikipedia.org/wiki/SM4_(cipher)"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Mode", - "type": "option", - "value": ["CBC", "CFB", "OFB", "CTR", "ECB"] + name: "Mode", + type: "option", + value: ["CBC", "CFB", "OFB", "CTR", "ECB"], }, { - "name": "Input", - "type": "option", - "value": ["Raw", "Hex"] + name: "Input", + type: "option", + value: ["Raw", "Hex"], }, { - "name": "Output", - "type": "option", - "value": ["Hex", "Raw"] - } + name: "Output", + type: "option", + value: ["Hex", "Raw"], + }, ]; } @@ -66,7 +66,7 @@ class SM4Encrypt extends Operation { run(input, args) { const key = Utils.convertToByteArray(args[0].string, args[0].option), iv = Utils.convertToByteArray(args[1].string, args[1].option), - [,, mode, inputType, outputType] = args; + [, , mode, inputType, outputType] = args; if (key.length !== 16) throw new OperationError(`Invalid key length: ${key.length} bytes @@ -79,10 +79,17 @@ SM4 uses an IV length of 16 bytes (128 bits). Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); input = Utils.convertToByteArray(input, inputType); - const output = encryptSM4(input, key, iv, mode.substring(0, 3), mode.endsWith("NoPadding")); - return outputType === "Hex" ? toHex(output) : Utils.byteArrayToUtf8(output); + const output = encryptSM4( + input, + key, + iv, + mode.substring(0, 3), + mode.endsWith("NoPadding"), + ); + return outputType === "Hex" + ? toHex(output) + : Utils.byteArrayToUtf8(output); } - } export default SM4Encrypt; diff --git a/src/core/operations/SQLBeautify.mjs b/src/core/operations/SQLBeautify.mjs index 0f3d2e3c..c5968822 100644 --- a/src/core/operations/SQLBeautify.mjs +++ b/src/core/operations/SQLBeautify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * SQL Beautify operation */ class SQLBeautify extends Operation { - /** * SQLBeautify constructor */ @@ -20,15 +19,16 @@ class SQLBeautify extends Operation { this.name = "SQL Beautify"; this.module = "Code"; - this.description = "Indents and prettifies Structured Query Language (SQL) code."; + this.description = + "Indents and prettifies Structured Query Language (SQL) code."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Indent string", - "type": "binaryShortString", - "value": "\\t" - } + name: "Indent string", + type: "binaryShortString", + value: "\\t", + }, ]; } @@ -41,7 +41,6 @@ class SQLBeautify extends Operation { const indentStr = args[0]; return vkbeautify.sql(input, indentStr); } - } export default SQLBeautify; diff --git a/src/core/operations/SQLMinify.mjs b/src/core/operations/SQLMinify.mjs index 582ad43d..0ff90c2a 100644 --- a/src/core/operations/SQLMinify.mjs +++ b/src/core/operations/SQLMinify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * SQL Minify operation */ class SQLMinify extends Operation { - /** * SQLMinify constructor */ @@ -34,7 +33,6 @@ class SQLMinify extends Operation { run(input, args) { return vkbeautify.sqlmin(input); } - } export default SQLMinify; diff --git a/src/core/operations/SSDEEP.mjs b/src/core/operations/SSDEEP.mjs index 6a76a68b..ceaa8d07 100644 --- a/src/core/operations/SSDEEP.mjs +++ b/src/core/operations/SSDEEP.mjs @@ -11,7 +11,6 @@ import ssdeepjs from "ssdeep.js"; * SSDEEP operation */ class SSDEEP extends Operation { - /** * SSDEEP constructor */ @@ -20,7 +19,8 @@ class SSDEEP extends Operation { this.name = "SSDEEP"; this.module = "Crypto"; - this.description = "SSDEEP is a program for computing context triggered piecewise hashes (CTPH). Also called fuzzy hashes, CTPH can match inputs that have homologies. Such inputs have sequences of identical bytes in the same order, although bytes in between these sequences may be different in both content and length.

          SSDEEP hashes are now widely used for simple identification purposes (e.g. the 'Basic Properties' section in VirusTotal). Although 'better' fuzzy hashes are available, SSDEEP is still one of the primary choices because of its speed and being a de facto standard.

          This operation is fundamentally the same as the CTPH operation, however their outputs differ in format."; + this.description = + "SSDEEP is a program for computing context triggered piecewise hashes (CTPH). Also called fuzzy hashes, CTPH can match inputs that have homologies. Such inputs have sequences of identical bytes in the same order, although bytes in between these sequences may be different in both content and length.

          SSDEEP hashes are now widely used for simple identification purposes (e.g. the 'Basic Properties' section in VirusTotal). Although 'better' fuzzy hashes are available, SSDEEP is still one of the primary choices because of its speed and being a de facto standard.

          This operation is fundamentally the same as the CTPH operation, however their outputs differ in format."; this.infoURL = "https://forensics.wiki/ssdeep"; this.inputType = "string"; this.outputType = "string"; @@ -35,7 +35,6 @@ class SSDEEP extends Operation { run(input, args) { return ssdeepjs.digest(input); } - } export default SSDEEP; diff --git a/src/core/operations/SUB.mjs b/src/core/operations/SUB.mjs index ef9777c6..7491f7c6 100644 --- a/src/core/operations/SUB.mjs +++ b/src/core/operations/SUB.mjs @@ -12,7 +12,6 @@ import { bitOp, sub, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs"; * SUB operation */ class SUB extends Operation { - /** * SUB constructor */ @@ -21,17 +20,19 @@ class SUB extends Operation { this.name = "SUB"; this.module = "Default"; - this.description = "SUB the input with the given key (e.g. fe023da5), MOD 255"; - this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bitwise_operators"; + this.description = + "SUB the input with the given key (e.g. fe023da5), MOD 255"; + this.infoURL = + "https://wikipedia.org/wiki/Bitwise_operation#Bitwise_operators"; this.inputType = "byteArray"; this.outputType = "byteArray"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": BITWISE_OP_DELIMS - } + name: "Key", + type: "toggleString", + value: "", + toggleValues: BITWISE_OP_DELIMS, + }, ]; } @@ -41,7 +42,10 @@ class SUB extends Operation { * @returns {byteArray} */ run(input, args) { - const key = Utils.convertToByteArray(args[0].string || "", args[0].option); + const key = Utils.convertToByteArray( + args[0].string || "", + args[0].option, + ); return bitOp(input, key, sub); } @@ -71,7 +75,6 @@ class SUB extends Operation { highlightReverse(pos, args) { return pos; } - } export default SUB; diff --git a/src/core/operations/ScanForEmbeddedFiles.mjs b/src/core/operations/ScanForEmbeddedFiles.mjs index 2e83fcb9..505e4fbf 100644 --- a/src/core/operations/ScanForEmbeddedFiles.mjs +++ b/src/core/operations/ScanForEmbeddedFiles.mjs @@ -13,7 +13,6 @@ import { FILE_SIGNATURES } from "../lib/FileSignatures.mjs"; * Scan for Embedded Files operation */ class ScanForEmbeddedFiles extends Operation { - /** * ScanForEmbeddedFiles constructor */ @@ -22,15 +21,16 @@ class ScanForEmbeddedFiles extends Operation { this.name = "Scan for Embedded Files"; this.module = "Default"; - this.description = "Scans the data for potential embedded files by looking for magic bytes at all offsets. This operation is prone to false positives.

          WARNING: Files over about 100KB in size will take a VERY long time to process."; + this.description = + "Scans the data for potential embedded files by looking for magic bytes at all offsets. This operation is prone to false positives.

          WARNING: Files over about 100KB in size will take a VERY long time to process."; this.infoURL = "https://wikipedia.org/wiki/List_of_file_signatures"; this.inputType = "ArrayBuffer"; this.outputType = "string"; - this.args = Object.keys(FILE_SIGNATURES).map(cat => { + this.args = Object.keys(FILE_SIGNATURES).map((cat) => { return { name: cat, type: "boolean", - value: cat === "Miscellaneous" ? false : true + value: cat === "Miscellaneous" ? false : true, }; }); } @@ -41,7 +41,8 @@ class ScanForEmbeddedFiles extends Operation { * @returns {string} */ run(input, args) { - let output = "Scanning data for 'magic bytes' which may indicate embedded files. The following results may be false positives and should not be treated as reliable. Any sufficiently long file is likely to contain these magic bytes coincidentally.\n", + let output = + "Scanning data for 'magic bytes' which may indicate embedded files. The following results may be false positives and should not be treated as reliable. Any sufficiently long file is likely to contain these magic bytes coincidentally.\n", numFound = 0; const categories = [], data = new Uint8Array(input); @@ -53,7 +54,7 @@ class ScanForEmbeddedFiles extends Operation { const types = scanForFileTypes(data, categories); if (types.length) { - types.forEach(type => { + types.forEach((type) => { numFound++; output += `\nOffset ${type.offset} (0x${Utils.hex(type.offset)}): File type: ${type.fileDetails.name} @@ -72,7 +73,6 @@ class ScanForEmbeddedFiles extends Operation { return output; } - } export default ScanForEmbeddedFiles; diff --git a/src/core/operations/ScatterChart.mjs b/src/core/operations/ScatterChart.mjs index fc0caf03..a093de7c 100644 --- a/src/core/operations/ScatterChart.mjs +++ b/src/core/operations/ScatterChart.mjs @@ -7,19 +7,24 @@ import * as d3temp from "d3"; import * as nodomtemp from "nodom"; -import { getScatterValues, getScatterValuesWithColour, RECORD_DELIMITER_OPTIONS, COLOURS, FIELD_DELIMITER_OPTIONS } from "../lib/Charts.mjs"; +import { + getScatterValues, + getScatterValuesWithColour, + RECORD_DELIMITER_OPTIONS, + COLOURS, + FIELD_DELIMITER_OPTIONS, +} from "../lib/Charts.mjs"; import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; const d3 = d3temp.default ? d3temp.default : d3temp; -const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp; +const nodom = nodomtemp.default ? nodomtemp.default : nodomtemp; /** * Scatter chart operation */ class ScatterChart extends Operation { - /** * ScatterChart constructor */ @@ -28,7 +33,8 @@ class ScatterChart extends Operation { this.name = "Scatter chart"; this.module = "Charts"; - this.description = "Plots two-variable data as single points on a graph."; + this.description = + "Plots two-variable data as single points on a graph."; this.infoURL = "https://wikipedia.org/wiki/Scatter_plot"; this.inputType = "string"; this.outputType = "html"; @@ -72,7 +78,7 @@ class ScatterChart extends Operation { name: "Use colour from third column", type: "boolean", value: false, - } + }, ]; } @@ -95,12 +101,14 @@ class ScatterChart extends Operation { let xLabel = args[3], yLabel = args[4]; - const dataFunction = colourInInput ? getScatterValuesWithColour : getScatterValues; + const dataFunction = colourInInput + ? getScatterValuesWithColour + : getScatterValues; const { headings, values } = dataFunction( input, recordDelimiter, fieldDelimiter, - columnHeadingsAreIncluded + columnHeadingsAreIncluded, ); if (headings) { @@ -110,7 +118,8 @@ class ScatterChart extends Operation { const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${dimension} ${dimension}`); @@ -123,27 +132,35 @@ class ScatterChart extends Operation { }, width = dimension - margin.left - margin.right, height = dimension - margin.top - margin.bottom, - marginedSpace = svg.append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + marginedSpace = svg + .append("g") + .attr( + "transform", + "translate(" + margin.left + "," + margin.top + ")", + ); - const xExtent = d3.extent(values, d => d[0]), + const xExtent = d3.extent(values, (d) => d[0]), xDelta = xExtent[1] - xExtent[0], - yExtent = d3.extent(values, d => d[1]), + yExtent = d3.extent(values, (d) => d[1]), yDelta = yExtent[1] - yExtent[0], - xAxis = d3.scaleLinear() - .domain([xExtent[0] - (0.1 * xDelta), xExtent[1] + (0.1 * xDelta)]) + xAxis = d3 + .scaleLinear() + .domain([xExtent[0] - 0.1 * xDelta, xExtent[1] + 0.1 * xDelta]) .range([0, width]), - yAxis = d3.scaleLinear() - .domain([yExtent[0] - (0.1 * yDelta), yExtent[1] + (0.1 * yDelta)]) + yAxis = d3 + .scaleLinear() + .domain([yExtent[0] - 0.1 * yDelta, yExtent[1] + 0.1 * yDelta]) .range([height, 0]); - marginedSpace.append("clipPath") + marginedSpace + .append("clipPath") .attr("id", "clip") .append("rect") .attr("width", width) .attr("height", height); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "points") .attr("clip-path", "url(#clip)") .selectAll("circle") @@ -152,14 +169,14 @@ class ScatterChart extends Operation { .append("circle") .attr("cx", (d) => xAxis(d[0])) .attr("cy", (d) => yAxis(d[1])) - .attr("r", d => radius) - .attr("fill", d => { + .attr("r", (d) => radius) + .attr("fill", (d) => { return colourInInput ? d[2] : fillColour; }) .attr("stroke", "rgba(0, 0, 0, 0.5)") .attr("stroke-width", "0.5") .append("title") - .text(d => { + .text((d) => { const x = d[0], y = d[1], tooltip = `X: ${x}\n @@ -168,7 +185,8 @@ class ScatterChart extends Operation { return tooltip; }); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "axis axis--y") .call(d3.axisLeft(yAxis).tickSizeOuter(-width)); @@ -180,7 +198,8 @@ class ScatterChart extends Operation { .style("text-anchor", "middle") .text(yLabel); - marginedSpace.append("g") + marginedSpace + .append("g") .attr("class", "axis axis--x") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(xAxis).tickSizeOuter(-height)); @@ -193,7 +212,6 @@ class ScatterChart extends Operation { return svg._groups[0][0].outerHTML; } - } export default ScatterChart; diff --git a/src/core/operations/Scrypt.mjs b/src/core/operations/Scrypt.mjs index 9c4ba304..db9edd5a 100644 --- a/src/core/operations/Scrypt.mjs +++ b/src/core/operations/Scrypt.mjs @@ -14,7 +14,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * Scrypt operation */ class Scrypt extends Operation { - /** * Scrypt constructor */ @@ -23,37 +22,38 @@ class Scrypt extends Operation { this.name = "Scrypt"; this.module = "Crypto"; - this.description = "scrypt is a password-based key derivation function (PBKDF) created by Colin Percival. The algorithm was specifically designed to make it costly to perform large-scale custom hardware attacks by requiring large amounts of memory. In 2016, the scrypt algorithm was published by IETF as RFC 7914.

          Enter the password in the input to generate its hash."; + this.description = + "scrypt is a password-based key derivation function (PBKDF) created by Colin Percival. The algorithm was specifically designed to make it costly to perform large-scale custom hardware attacks by requiring large amounts of memory. In 2016, the scrypt algorithm was published by IETF as RFC 7914.

          Enter the password in the input to generate its hash."; this.infoURL = "https://wikipedia.org/wiki/Scrypt"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Salt", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "Base64", "UTF8", "Latin1"] + name: "Salt", + type: "toggleString", + value: "", + toggleValues: ["Hex", "Base64", "UTF8", "Latin1"], }, { - "name": "Iterations (N)", - "type": "number", - "value": 16384 + name: "Iterations (N)", + type: "number", + value: 16384, }, { - "name": "Memory factor (r)", - "type": "number", - "value": 8 + name: "Memory factor (r)", + type: "number", + value: 8, }, { - "name": "Parallelization factor (p)", - "type": "number", - "value": 1 + name: "Parallelization factor (p)", + type: "number", + value: 1, }, { - "name": "Key length", - "type": "number", - "value": 64 - } + name: "Key length", + type: "number", + value: 64, + }, ]; } @@ -63,7 +63,9 @@ class Scrypt extends Operation { * @returns {string} */ run(input, args) { - const salt = Buffer.from(Utils.convertToByteArray(args[0].string || "", args[0].option)), + const salt = Buffer.from( + Utils.convertToByteArray(args[0].string || "", args[0].option), + ), iterations = args[1], memFactor = args[2], parallelFactor = args[3], @@ -71,12 +73,19 @@ class Scrypt extends Operation { try { const data = scryptsy( - input, salt, iterations, memFactor, parallelFactor, keyLength, - p => { + input, + salt, + iterations, + memFactor, + parallelFactor, + keyLength, + (p) => { // Progress callback if (isWorkerEnvironment()) - self.sendStatusMessage(`Progress: ${p.percent.toFixed(0)}%`); - } + self.sendStatusMessage( + `Progress: ${p.percent.toFixed(0)}%`, + ); + }, ); return data.toString("hex"); @@ -84,7 +93,6 @@ class Scrypt extends Operation { throw new OperationError("Error: " + err.toString()); } } - } export default Scrypt; diff --git a/src/core/operations/SeriesChart.mjs b/src/core/operations/SeriesChart.mjs index 7baf594c..ba5f02a4 100644 --- a/src/core/operations/SeriesChart.mjs +++ b/src/core/operations/SeriesChart.mjs @@ -7,19 +7,22 @@ import * as d3temp from "d3"; import * as nodomtemp from "nodom"; -import { getSeriesValues, RECORD_DELIMITER_OPTIONS, FIELD_DELIMITER_OPTIONS } from "../lib/Charts.mjs"; +import { + getSeriesValues, + RECORD_DELIMITER_OPTIONS, + FIELD_DELIMITER_OPTIONS, +} from "../lib/Charts.mjs"; import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; const d3 = d3temp.default ? d3temp.default : d3temp; -const nodom = nodomtemp.default ? nodomtemp.default: nodomtemp; +const nodom = nodomtemp.default ? nodomtemp.default : nodomtemp; /** * Series chart operation */ class SeriesChart extends Operation { - /** * SeriesChart constructor */ @@ -28,7 +31,8 @@ class SeriesChart extends Operation { this.name = "Series chart"; this.module = "Charts"; - this.description = "A time series graph is a line graph of repeated measurements taken over regular time intervals."; + this.description = + "A time series graph is a line graph of repeated measurements taken over regular time intervals."; this.inputType = "string"; this.outputType = "html"; this.args = [ @@ -83,28 +87,41 @@ class SeriesChart extends Operation { seriesHeight = 100, seriesWidth = svgWidth - seriesLabelWidth - interSeriesPadding; - const { xValues, series } = getSeriesValues(input, recordDelimiter, fieldDelimiter), - allSeriesHeight = Object.keys(series).length * (interSeriesPadding + seriesHeight), + const { xValues, series } = getSeriesValues( + input, + recordDelimiter, + fieldDelimiter, + ), + allSeriesHeight = + Object.keys(series).length * + (interSeriesPadding + seriesHeight), svgHeight = allSeriesHeight + xAxisHeight + interSeriesPadding; const document = new nodom.Document(); let svg = document.createElement("svg"); - svg = d3.select(svg) + svg = d3 + .select(svg) .attr("width", "100%") .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); - const xAxis = d3.scalePoint() - .domain(xValues) - .range([0, seriesWidth]); + const xAxis = d3.scalePoint().domain(xValues).range([0, seriesWidth]); svg.append("g") .attr("class", "axis axis--x") .attr("transform", `translate(${seriesLabelWidth}, ${xAxisHeight})`) .call( - d3.axisTop(xAxis).tickValues(xValues.filter((x, i) => { - return [0, Math.round(xValues.length / 2), xValues.length -1].indexOf(i) >= 0; - })) + d3.axisTop(xAxis).tickValues( + xValues.filter((x, i) => { + return ( + [ + 0, + Math.round(xValues.length / 2), + xValues.length - 1, + ].indexOf(i) >= 0 + ); + }), + ), ); svg.append("text") @@ -116,10 +133,10 @@ class SeriesChart extends Operation { const tooltipText = {}, tooltipAreaWidth = seriesWidth / xValues.length; - xValues.forEach(x => { + xValues.forEach((x) => { const tooltip = []; - series.forEach(serie => { + series.forEach((serie) => { const y = serie.data[x]; if (typeof y === "undefined") return; @@ -129,8 +146,12 @@ class SeriesChart extends Operation { tooltipText[x] = tooltip.join("\n"); }); - const chartArea = svg.append("g") - .attr("transform", `translate(${seriesLabelWidth}, ${xAxisHeight})`); + const chartArea = svg + .append("g") + .attr( + "transform", + `translate(${seriesLabelWidth}, ${xAxisHeight})`, + ); chartArea .append("g") @@ -138,8 +159,8 @@ class SeriesChart extends Operation { .data(xValues) .enter() .append("rect") - .attr("x", x => { - return xAxis(x) - (tooltipAreaWidth / 2); + .attr("x", (x) => { + return xAxis(x) - tooltipAreaWidth / 2; }) .attr("y", 0) .attr("width", tooltipAreaWidth) @@ -147,36 +168,47 @@ class SeriesChart extends Operation { .attr("stroke", "none") .attr("fill", "transparent") .append("title") - .text(x => { + .text((x) => { return `${x}\n --\n ${tooltipText[x]}\n `.replace(/\s{2,}/g, "\n"); }); - const yAxesArea = svg.append("g") + const yAxesArea = svg + .append("g") .attr("transform", `translate(0, ${xAxisHeight})`); series.forEach((serie, seriesIndex) => { const yExtent = d3.extent(Object.values(serie.data)), - yAxis = d3.scaleLinear() + yAxis = d3 + .scaleLinear() .domain(yExtent) .range([seriesHeight, 0]); const seriesGroup = chartArea .append("g") - .attr("transform", `translate(0, ${seriesHeight * seriesIndex + interSeriesPadding * (seriesIndex + 1)})`); + .attr( + "transform", + `translate(0, ${ + seriesHeight * seriesIndex + + interSeriesPadding * (seriesIndex + 1) + })`, + ); let path = ""; xValues.forEach((x, xIndex) => { let nextX = xValues[xIndex + 1], y = serie.data[x], - nextY= serie.data[nextX]; + nextY = serie.data[nextX]; - if (typeof y === "undefined" || typeof nextY === "undefined") return; + if (typeof y === "undefined" || typeof nextY === "undefined") + return; - x = xAxis(x); nextX = xAxis(nextX); - y = yAxis(y); nextY = yAxis(nextY); + x = xAxis(x); + nextX = xAxis(nextX); + y = yAxis(y); + nextY = yAxis(nextY); path += `M ${x} ${y} L ${nextX} ${nextY} z `; }); @@ -185,10 +217,13 @@ class SeriesChart extends Operation { .append("path") .attr("d", path) .attr("fill", "none") - .attr("stroke", seriesColours[seriesIndex % seriesColours.length]) + .attr( + "stroke", + seriesColours[seriesIndex % seriesColours.length], + ) .attr("stroke-width", "1"); - xValues.forEach(x => { + xValues.forEach((x) => { const y = serie.data[x]; if (typeof y === "undefined") return; @@ -197,9 +232,12 @@ class SeriesChart extends Operation { .attr("cx", xAxis(x)) .attr("cy", yAxis(y)) .attr("r", pipRadius) - .attr("fill", seriesColours[seriesIndex % seriesColours.length]) + .attr( + "fill", + seriesColours[seriesIndex % seriesColours.length], + ) .append("title") - .text(d => { + .text((d) => { return `${x}\n --\n ${tooltipText[x]}\n @@ -209,13 +247,26 @@ class SeriesChart extends Operation { yAxesArea .append("g") - .attr("transform", `translate(${seriesLabelWidth - interSeriesPadding}, ${seriesHeight * seriesIndex + interSeriesPadding * (seriesIndex + 1)})`) + .attr( + "transform", + `translate(${seriesLabelWidth - interSeriesPadding}, ${ + seriesHeight * seriesIndex + + interSeriesPadding * (seriesIndex + 1) + })`, + ) .attr("class", "axis axis--y") .call(d3.axisLeft(yAxis).ticks(5)); yAxesArea .append("g") - .attr("transform", `translate(0, ${seriesHeight / 2 + seriesHeight * seriesIndex + interSeriesPadding * (seriesIndex + 1)})`) + .attr( + "transform", + `translate(0, ${ + seriesHeight / 2 + + seriesHeight * seriesIndex + + interSeriesPadding * (seriesIndex + 1) + })`, + ) .append("text") .style("text-anchor", "middle") .attr("transform", "rotate(-90)") @@ -224,7 +275,6 @@ class SeriesChart extends Operation { return svg._groups[0][0].outerHTML; } - } export default SeriesChart; diff --git a/src/core/operations/SetDifference.mjs b/src/core/operations/SetDifference.mjs index dc46c079..47fb0fd4 100644 --- a/src/core/operations/SetDifference.mjs +++ b/src/core/operations/SetDifference.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Set Difference operation */ class SetDifference extends Operation { - /** * Set Difference constructor */ @@ -20,20 +19,22 @@ class SetDifference extends Operation { this.name = "Set Difference"; this.module = "Default"; - this.description = "Calculates the difference, or relative complement, of two sets."; - this.infoURL = "https://wikipedia.org/wiki/Complement_(set_theory)#Relative_complement"; + this.description = + "Calculates the difference, or relative complement, of two sets."; + this.infoURL = + "https://wikipedia.org/wiki/Complement_(set_theory)#Relative_complement"; this.inputType = "string"; this.outputType = "string"; this.args = [ { name: "Sample delimiter", type: "binaryString", - value: "\\n\\n" + value: "\\n\\n", }, { name: "Item delimiter", type: "binaryString", - value: "," + value: ",", }, ]; } @@ -45,8 +46,10 @@ class SetDifference extends Operation { * @throws {Error} if not two sets */ validateSampleNumbers(sets) { - if (!sets || (sets.length !== 2)) { - throw new OperationError("Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?"); + if (!sets || sets.length !== 2) { + throw new OperationError( + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", + ); } } @@ -64,7 +67,9 @@ class SetDifference extends Operation { this.validateSampleNumbers(sets); - return this.runSetDifference(...sets.map(s => s.split(this.itemDelimiter))); + return this.runSetDifference( + ...sets.map((s) => s.split(this.itemDelimiter)), + ); } /** @@ -81,7 +86,6 @@ class SetDifference extends Operation { }) .join(this.itemDelimiter); } - } export default SetDifference; diff --git a/src/core/operations/SetIntersection.mjs b/src/core/operations/SetIntersection.mjs index 7e6dbe10..6fc6bb83 100644 --- a/src/core/operations/SetIntersection.mjs +++ b/src/core/operations/SetIntersection.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Set Intersection operation */ class SetIntersection extends Operation { - /** * Set Intersection constructor */ @@ -28,12 +27,12 @@ class SetIntersection extends Operation { { name: "Sample delimiter", type: "binaryString", - value: "\\n\\n" + value: "\\n\\n", }, { name: "Item delimiter", type: "binaryString", - value: "," + value: ",", }, ]; } @@ -45,8 +44,10 @@ class SetIntersection extends Operation { * @throws {Error} if not two sets */ validateSampleNumbers(sets) { - if (!sets || (sets.length !== 2)) { - throw new OperationError("Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?"); + if (!sets || sets.length !== 2) { + throw new OperationError( + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", + ); } } @@ -64,7 +65,9 @@ class SetIntersection extends Operation { this.validateSampleNumbers(sets); - return this.runIntersect(...sets.map(s => s.split(this.itemDelimiter))); + return this.runIntersect( + ...sets.map((s) => s.split(this.itemDelimiter)), + ); } /** @@ -81,7 +84,6 @@ class SetIntersection extends Operation { }) .join(this.itemDelimiter); } - } export default SetIntersection; diff --git a/src/core/operations/SetUnion.mjs b/src/core/operations/SetUnion.mjs index 80913063..be23754a 100644 --- a/src/core/operations/SetUnion.mjs +++ b/src/core/operations/SetUnion.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Set Union operation */ class SetUnion extends Operation { - /** * Set Union constructor */ @@ -28,12 +27,12 @@ class SetUnion extends Operation { { name: "Sample delimiter", type: "binaryString", - value: "\\n\\n" + value: "\\n\\n", }, { name: "Item delimiter", type: "binaryString", - value: "," + value: ",", }, ]; } @@ -45,8 +44,10 @@ class SetUnion extends Operation { * @throws {Error} if not two sets */ validateSampleNumbers(sets) { - if (!sets || (sets.length !== 2)) { - throw new OperationError("Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?"); + if (!sets || sets.length !== 2) { + throw new OperationError( + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", + ); } } @@ -64,7 +65,7 @@ class SetUnion extends Operation { this.validateSampleNumbers(sets); - return this.runUnion(...sets.map(s => s.split(this.itemDelimiter))); + return this.runUnion(...sets.map((s) => s.split(this.itemDelimiter))); } /** diff --git a/src/core/operations/Shake.mjs b/src/core/operations/Shake.mjs index 69e034e6..cdf9afcd 100644 --- a/src/core/operations/Shake.mjs +++ b/src/core/operations/Shake.mjs @@ -12,7 +12,6 @@ import JSSHA3 from "js-sha3"; * Shake operation */ class Shake extends Operation { - /** * Shake constructor */ @@ -21,21 +20,22 @@ class Shake extends Operation { this.name = "Shake"; this.module = "Crypto"; - this.description = "Shake is an Extendable Output Function (XOF) of the SHA-3 hash algorithm, part of the Keccak family, allowing for variable output length/size."; + this.description = + "Shake is an Extendable Output Function (XOF) of the SHA-3 hash algorithm, part of the Keccak family, allowing for variable output length/size."; this.infoURL = "https://wikipedia.org/wiki/SHA-3#Instances"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Capacity", - "type": "option", - "value": ["256", "128"] + name: "Capacity", + type: "option", + value: ["256", "128"], }, { - "name": "Size", - "type": "number", - "value": 512 - } + name: "Size", + type: "number", + value: 512, + }, ]; } @@ -49,8 +49,7 @@ class Shake extends Operation { size = args[1]; let algo; - if (size < 0) - throw new OperationError("Size must be greater than 0"); + if (size < 0) throw new OperationError("Size must be greater than 0"); switch (capacity) { case 128: @@ -65,7 +64,6 @@ class Shake extends Operation { return algo(input, size); } - } export default Shake; diff --git a/src/core/operations/SharpenImage.mjs b/src/core/operations/SharpenImage.mjs index eb033ad2..dc943d00 100644 --- a/src/core/operations/SharpenImage.mjs +++ b/src/core/operations/SharpenImage.mjs @@ -16,7 +16,6 @@ import jimp from "jimp"; * Sharpen Image operation */ class SharpenImage extends Operation { - /** * SharpenImage constructor */ @@ -35,22 +34,22 @@ class SharpenImage extends Operation { name: "Radius", type: "number", value: 2, - min: 1 + min: 1, }, { name: "Amount", type: "number", value: 1, min: 0, - step: 0.1 + step: 0.1, }, { name: "Threshold", type: "number", value: 10, min: 0, - max: 100 - } + max: 100, + }, ]; } @@ -79,61 +78,96 @@ class SharpenImage extends Operation { const blurMask = image.clone(); if (isWorkerEnvironment()) - self.sendStatusMessage("Sharpening image... (Blurring cloned image)"); + self.sendStatusMessage( + "Sharpening image... (Blurring cloned image)", + ); const blurImage = gaussianBlur(image.clone(), radius); + if (isWorkerEnvironment()) + self.sendStatusMessage( + "Sharpening image... (Creating unsharp mask)", + ); + blurMask.scan( + 0, + 0, + blurMask.bitmap.width, + blurMask.bitmap.height, + function (x, y, idx) { + const blurRed = blurImage.bitmap.data[idx]; + const blurGreen = blurImage.bitmap.data[idx + 1]; + const blurBlue = blurImage.bitmap.data[idx + 2]; + + const normalRed = this.bitmap.data[idx]; + const normalGreen = this.bitmap.data[idx + 1]; + const normalBlue = this.bitmap.data[idx + 2]; + + // Subtract blurred pixel value from normal image + this.bitmap.data[idx] = + normalRed > blurRed ? normalRed - blurRed : 0; + this.bitmap.data[idx + 1] = + normalGreen > blurGreen ? normalGreen - blurGreen : 0; + this.bitmap.data[idx + 2] = + normalBlue > blurBlue ? normalBlue - blurBlue : 0; + }, + ); if (isWorkerEnvironment()) - self.sendStatusMessage("Sharpening image... (Creating unsharp mask)"); - blurMask.scan(0, 0, blurMask.bitmap.width, blurMask.bitmap.height, function(x, y, idx) { - const blurRed = blurImage.bitmap.data[idx]; - const blurGreen = blurImage.bitmap.data[idx + 1]; - const blurBlue = blurImage.bitmap.data[idx + 2]; + self.sendStatusMessage( + "Sharpening image... (Merging with unsharp mask)", + ); + image.scan( + 0, + 0, + image.bitmap.width, + image.bitmap.height, + function (x, y, idx) { + let maskRed = blurMask.bitmap.data[idx]; + let maskGreen = blurMask.bitmap.data[idx + 1]; + let maskBlue = blurMask.bitmap.data[idx + 2]; - const normalRed = this.bitmap.data[idx]; - const normalGreen = this.bitmap.data[idx + 1]; - const normalBlue = this.bitmap.data[idx + 2]; + const normalRed = this.bitmap.data[idx]; + const normalGreen = this.bitmap.data[idx + 1]; + const normalBlue = this.bitmap.data[idx + 2]; - // Subtract blurred pixel value from normal image - this.bitmap.data[idx] = (normalRed > blurRed) ? normalRed - blurRed : 0; - this.bitmap.data[idx + 1] = (normalGreen > blurGreen) ? normalGreen - blurGreen : 0; - this.bitmap.data[idx + 2] = (normalBlue > blurBlue) ? normalBlue - blurBlue : 0; - }); + // Calculate luminance + const maskLuminance = + 0.2126 * maskRed + + 0.7152 * maskGreen + + 0.0722 * maskBlue; + const normalLuminance = + 0.2126 * normalRed + + 0.7152 * normalGreen + + 0.0722 * normalBlue; - if (isWorkerEnvironment()) - self.sendStatusMessage("Sharpening image... (Merging with unsharp mask)"); - image.scan(0, 0, image.bitmap.width, image.bitmap.height, function(x, y, idx) { - let maskRed = blurMask.bitmap.data[idx]; - let maskGreen = blurMask.bitmap.data[idx + 1]; - let maskBlue = blurMask.bitmap.data[idx + 2]; + let luminanceDiff; + if (maskLuminance > normalLuminance) { + luminanceDiff = maskLuminance - normalLuminance; + } else { + luminanceDiff = normalLuminance - maskLuminance; + } - const normalRed = this.bitmap.data[idx]; - const normalGreen = this.bitmap.data[idx + 1]; - const normalBlue = this.bitmap.data[idx + 2]; + // Scale mask colours by amount + maskRed = maskRed * amount; + maskGreen = maskGreen * amount; + maskBlue = maskBlue * amount; - // Calculate luminance - const maskLuminance = (0.2126 * maskRed + 0.7152 * maskGreen + 0.0722 * maskBlue); - const normalLuminance = (0.2126 * normalRed + 0.7152 * normalGreen + 0.0722 * normalBlue); - - let luminanceDiff; - if (maskLuminance > normalLuminance) { - luminanceDiff = maskLuminance - normalLuminance; - } else { - luminanceDiff = normalLuminance - maskLuminance; - } - - // Scale mask colours by amount - maskRed = maskRed * amount; - maskGreen = maskGreen * amount; - maskBlue = maskBlue * amount; - - // Only change pixel value if the difference is higher than threshold - if ((luminanceDiff / 255) * 100 >= threshold) { - this.bitmap.data[idx] = (normalRed + maskRed) <= 255 ? normalRed + maskRed : 255; - this.bitmap.data[idx + 1] = (normalGreen + maskGreen) <= 255 ? normalGreen + maskGreen : 255; - this.bitmap.data[idx + 2] = (normalBlue + maskBlue) <= 255 ? normalBlue + maskBlue : 255; - } - }); + // Only change pixel value if the difference is higher than threshold + if ((luminanceDiff / 255) * 100 >= threshold) { + this.bitmap.data[idx] = + normalRed + maskRed <= 255 + ? normalRed + maskRed + : 255; + this.bitmap.data[idx + 1] = + normalGreen + maskGreen <= 255 + ? normalGreen + maskGreen + : 255; + this.bitmap.data[idx + 2] = + normalBlue + maskBlue <= 255 + ? normalBlue + maskBlue + : 255; + } + }, + ); let imageBuffer; if (image.getMIME() === "image/gif") { @@ -163,7 +197,6 @@ class SharpenImage extends Operation { return ``; } - } export default SharpenImage; diff --git a/src/core/operations/ShowBase64Offsets.mjs b/src/core/operations/ShowBase64Offsets.mjs index 37d8a6ce..8cfc27ca 100644 --- a/src/core/operations/ShowBase64Offsets.mjs +++ b/src/core/operations/ShowBase64Offsets.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {fromBase64, toBase64} from "../lib/Base64.mjs"; +import { fromBase64, toBase64 } from "../lib/Base64.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * Show Base64 offsets operation */ class ShowBase64Offsets extends Operation { - /** * ShowBase64Offsets constructor */ @@ -22,7 +21,8 @@ class ShowBase64Offsets extends Operation { this.name = "Show Base64 offsets"; this.module = "Default"; - this.description = "When a string is within a block of data and the whole block is Base64'd, the string itself could be represented in Base64 in three distinct ways depending on its offset within the block.

          This operation shows all possible offsets for a given string so that each possible encoding can be considered."; + this.description = + "When a string is within a block of data and the whole block is Base64'd, the string itself could be represented in Base64 in three distinct ways depending on its offset within the block.

          This operation shows all possible offsets for a given string so that each possible encoding can be considered."; this.infoURL = "https://wikipedia.org/wiki/Base64#Output_padding"; this.inputType = "byteArray"; this.outputType = "html"; @@ -30,18 +30,18 @@ class ShowBase64Offsets extends Operation { { name: "Alphabet", type: "binaryString", - value: "A-Za-z0-9+/=" + value: "A-Za-z0-9+/=", }, { name: "Show variable chars and padding", type: "boolean", - value: true + value: true, }, { name: "Input format", type: "option", - value: ["Raw", "Base64"] - } + value: ["Raw", "Base64"], + }, ]; } @@ -66,7 +66,8 @@ class ShowBase64Offsets extends Operation { const len0 = offset0.indexOf("="), len1 = offset1.indexOf("="), len2 = offset2.indexOf("="), - script = ""; + script = + ""; if (input.length < 1) { throw new OperationError("Please enter a string."); @@ -75,53 +76,104 @@ class ShowBase64Offsets extends Operation { // Highlight offset 0 if (len0 % 4 === 2) { staticSection = offset0.slice(0, -3); - offset0 = "" + - staticSection + "" + - "" + offset0.substr(offset0.length - 3, 1) + "" + - "" + offset0.substr(offset0.length - 2) + ""; + offset0 = + "" + + staticSection + + "" + + "" + + offset0.substr(offset0.length - 3, 1) + + "" + + "" + + offset0.substr(offset0.length - 2) + + ""; } else if (len0 % 4 === 3) { staticSection = offset0.slice(0, -2); - offset0 = "" + - staticSection + "" + - "" + offset0.substr(offset0.length - 2, 1) + "" + - "" + offset0.substr(offset0.length - 1) + ""; + offset0 = + "" + + staticSection + + "" + + "" + + offset0.substr(offset0.length - 2, 1) + + "" + + "" + + offset0.substr(offset0.length - 1) + + ""; } else { staticSection = offset0; - offset0 = "" + - staticSection + ""; + offset0 = + "" + + staticSection + + ""; } if (!showVariable) { offset0 = staticSection; } - // Highlight offset 1 - padding = "" + offset1.substr(0, 1) + "" + - "" + offset1.substr(1, 1) + ""; + padding = + "" + + offset1.substr(0, 1) + + "" + + "" + + offset1.substr(1, 1) + + ""; offset1 = offset1.substr(2); if (len1 % 4 === 2) { staticSection = offset1.slice(0, -3); - offset1 = padding + "" + - staticSection + "" + - "" + offset1.substr(offset1.length - 3, 1) + "" + - "" + offset1.substr(offset1.length - 2) + ""; + offset1 = + padding + + "" + + staticSection + + "" + + "" + + offset1.substr(offset1.length - 3, 1) + + "" + + "" + + offset1.substr(offset1.length - 2) + + ""; } else if (len1 % 4 === 3) { staticSection = offset1.slice(0, -2); - offset1 = padding + "" + - staticSection + "" + - "" + offset1.substr(offset1.length - 2, 1) + "" + - "" + offset1.substr(offset1.length - 1) + ""; + offset1 = + padding + + "" + + staticSection + + "" + + "" + + offset1.substr(offset1.length - 2, 1) + + "" + + "" + + offset1.substr(offset1.length - 1) + + ""; } else { staticSection = offset1; - offset1 = padding + "" + - staticSection + ""; + offset1 = + padding + + "" + + staticSection + + ""; } if (!showVariable) { @@ -129,45 +181,79 @@ class ShowBase64Offsets extends Operation { } // Highlight offset 2 - padding = "" + offset2.substr(0, 2) + "" + - "" + offset2.substr(2, 1) + ""; + padding = + "" + + offset2.substr(0, 2) + + "" + + "" + + offset2.substr(2, 1) + + ""; offset2 = offset2.substr(3); if (len2 % 4 === 2) { staticSection = offset2.slice(0, -3); - offset2 = padding + "" + - staticSection + "" + - "" + offset2.substr(offset2.length - 3, 1) + "" + - "" + offset2.substr(offset2.length - 2) + ""; + offset2 = + padding + + "" + + staticSection + + "" + + "" + + offset2.substr(offset2.length - 3, 1) + + "" + + "" + + offset2.substr(offset2.length - 2) + + ""; } else if (len2 % 4 === 3) { staticSection = offset2.slice(0, -2); - offset2 = padding + "" + - staticSection + "" + - "" + offset2.substr(offset2.length - 2, 1) + "" + - "" + offset2.substr(offset2.length - 1) + ""; + offset2 = + padding + + "" + + staticSection + + "" + + "" + + offset2.substr(offset2.length - 2, 1) + + "" + + "" + + offset2.substr(offset2.length - 1) + + ""; } else { staticSection = offset2; - offset2 = padding + "" + - staticSection + ""; + offset2 = + padding + + "" + + staticSection + + ""; } if (!showVariable) { offset2 = staticSection; } - return (showVariable ? "Characters highlighted in green could change if the input is surrounded by more data." + - "\nCharacters highlighted in red are for padding purposes only." + - "\nUnhighlighted characters are static." + - "\nHover over the static sections to see what they decode to on their own.\n" + - "\nOffset 0: " + offset0 + - "\nOffset 1: " + offset1 + - "\nOffset 2: " + offset2 + - script : - offset0 + "\n" + offset1 + "\n" + offset2); + return showVariable + ? "Characters highlighted in green could change if the input is surrounded by more data." + + "\nCharacters highlighted in red are for padding purposes only." + + "\nUnhighlighted characters are static." + + "\nHover over the static sections to see what they decode to on their own.\n" + + "\nOffset 0: " + + offset0 + + "\nOffset 1: " + + offset1 + + "\nOffset 2: " + + offset2 + + script + : offset0 + "\n" + offset1 + "\n" + offset2; } - } export default ShowBase64Offsets; diff --git a/src/core/operations/ShowOnMap.mjs b/src/core/operations/ShowOnMap.mjs index c2ac1c6e..08c70f22 100644 --- a/src/core/operations/ShowOnMap.mjs +++ b/src/core/operations/ShowOnMap.mjs @@ -5,14 +5,13 @@ */ import Operation from "../Operation.mjs"; -import {FORMATS, convertCoordinates} from "../lib/ConvertCoordinates.mjs"; +import { FORMATS, convertCoordinates } from "../lib/ConvertCoordinates.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * Show on map operation */ class ShowOnMap extends Operation { - /** * ShowOnMap constructor */ @@ -21,8 +20,10 @@ class ShowOnMap extends Operation { this.name = "Show on map"; this.module = "Hashing"; - this.description = "Displays co-ordinates on a slippy map.

          Co-ordinates will be converted to decimal degrees before being shown on the map.

          Supported formats:
          • Degrees Minutes Seconds (DMS)
          • Degrees Decimal Minutes (DDM)
          • Decimal Degrees (DD)
          • Geohash
          • Military Grid Reference System (MGRS)
          • Ordnance Survey National Grid (OSNG)
          • Universal Transverse Mercator (UTM)

          This operation will not work offline."; - this.infoURL = "https://foundation.wikimedia.org/wiki/Maps_Terms_of_Use"; + this.description = + "Displays co-ordinates on a slippy map.

          Co-ordinates will be converted to decimal degrees before being shown on the map.

          Supported formats:
          • Degrees Minutes Seconds (DMS)
          • Degrees Decimal Minutes (DDM)
          • Decimal Degrees (DD)
          • Geohash
          • Military Grid Reference System (MGRS)
          • Ordnance Survey National Grid (OSNG)
          • Universal Transverse Mercator (UTM)

          This operation will not work offline."; + this.infoURL = + "https://foundation.wikimedia.org/wiki/Maps_Terms_of_Use"; this.inputType = "string"; this.outputType = "string"; this.presentType = "html"; @@ -30,12 +31,12 @@ class ShowOnMap extends Operation { { name: "Zoom Level", type: "number", - value: 13 + value: 13, }, { name: "Input Format", type: "option", - value: ["Auto"].concat(FORMATS) + value: ["Auto"].concat(FORMATS), }, { name: "Input Delimiter", @@ -47,9 +48,9 @@ class ShowOnMap extends Operation { "\\n", "Comma", "Semi-colon", - "Colon" - ] - } + "Colon", + ], + }, ]; } @@ -64,7 +65,15 @@ class ShowOnMap extends Operation { inDelim = args[2]; let latLong; try { - latLong = convertCoordinates(input, inFormat, inDelim, "Decimal Degrees", "Comma", "None", 5); + latLong = convertCoordinates( + input, + inFormat, + inDelim, + "Decimal Degrees", + "Comma", + "None", + 5, + ); } catch (error) { throw new OperationError(error); } @@ -86,7 +95,8 @@ class ShowOnMap extends Operation { } const zoomLevel = args[0]; const tileUrl = "https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png", - tileAttribution = "Wikimedia maps | © OpenStreetMap contributors", + tileAttribution = + 'Wikimedia maps | © OpenStreetMap contributors', leafletUrl = "https://unpkg.com/leaflet@1.5.0/dist/leaflet.js", leafletCssUrl = "https://unpkg.com/leaflet@1.5.0/dist/leaflet.css"; return ` diff --git a/src/core/operations/Shuffle.mjs b/src/core/operations/Shuffle.mjs index 14c4ffab..d5c9d43d 100644 --- a/src/core/operations/Shuffle.mjs +++ b/src/core/operations/Shuffle.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Shuffle operation */ class Shuffle extends Operation { - /** * Shuffle constructor */ @@ -29,8 +28,8 @@ class Shuffle extends Operation { { name: "Delimiter", type: "option", - value: INPUT_DELIM_OPTIONS - } + value: INPUT_DELIM_OPTIONS, + }, ]; } @@ -44,18 +43,22 @@ class Shuffle extends Operation { if (input.length === 0) return input; // return a random number in [0, 1) - const rng = (typeof crypto) !== "undefined" && crypto.getRandomValues ? (function() { - const buf = new Uint32Array(2); - return function() { - // generate 53-bit random integer: 21 + 32 bits - crypto.getRandomValues(buf); - const value = (buf[0] >>> (32 - 21)) * ((1 << 30) * 4) + buf[1]; - return value / ((1 << 23) * (1 << 30)); - }; - })() : Math.random; + const rng = + typeof crypto !== "undefined" && crypto.getRandomValues + ? (function () { + const buf = new Uint32Array(2); + return function () { + // generate 53-bit random integer: 21 + 32 bits + crypto.getRandomValues(buf); + const value = + (buf[0] >>> (32 - 21)) * ((1 << 30) * 4) + buf[1]; + return value / ((1 << 23) * (1 << 30)); + }; + })() + : Math.random; // return a random integer in [0, max) - const randint = function(max) { + const randint = function (max) { return Math.floor(rng() * max); }; @@ -72,7 +75,6 @@ class Shuffle extends Operation { return toShuffle.join(delim); } - } export default Shuffle; diff --git a/src/core/operations/Sleep.mjs b/src/core/operations/Sleep.mjs index 1e7b657a..02fa4e10 100644 --- a/src/core/operations/Sleep.mjs +++ b/src/core/operations/Sleep.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Sleep operation */ class Sleep extends Operation { - /** * Sleep constructor */ @@ -19,15 +18,16 @@ class Sleep extends Operation { this.name = "Sleep"; this.module = "Default"; - this.description = "Sleep causes the recipe to wait for a specified number of milliseconds before continuing execution."; + this.description = + "Sleep causes the recipe to wait for a specified number of milliseconds before continuing execution."; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; this.args = [ { - "name": "Time (ms)", - "type": "number", - "value": 1000 - } + name: "Time (ms)", + type: "number", + value: 1000, + }, ]; } @@ -38,10 +38,9 @@ class Sleep extends Operation { */ async run(input, args) { const ms = args[0]; - await new Promise(r => setTimeout(r, ms)); + await new Promise((r) => setTimeout(r, ms)); return input; } - } export default Sleep; diff --git a/src/core/operations/Snefru.mjs b/src/core/operations/Snefru.mjs index ae5859b3..08e984af 100644 --- a/src/core/operations/Snefru.mjs +++ b/src/core/operations/Snefru.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * Snefru operation */ class Snefru extends Operation { - /** * Snefru constructor */ @@ -20,7 +19,8 @@ class Snefru extends Operation { this.name = "Snefru"; this.module = "Crypto"; - this.description = "Snefru is a cryptographic hash function invented by Ralph Merkle in 1990 while working at Xerox PARC. The function supports 128-bit and 256-bit output. It was named after the Egyptian Pharaoh Sneferu, continuing the tradition of the Khufu and Khafre block ciphers.

          The original design of Snefru was shown to be insecure by Eli Biham and Adi Shamir who were able to use differential cryptanalysis to find hash collisions. The design was then modified by increasing the number of iterations of the main pass of the algorithm from two to eight."; + this.description = + "Snefru is a cryptographic hash function invented by Ralph Merkle in 1990 while working at Xerox PARC. The function supports 128-bit and 256-bit output. It was named after the Egyptian Pharaoh Sneferu, continuing the tradition of the Khufu and Khafre block ciphers.

          The original design of Snefru was shown to be insecure by Eli Biham and Adi Shamir who were able to use differential cryptanalysis to find hash collisions. The design was then modified by increasing the number of iterations of the main pass of the algorithm from two to eight."; this.infoURL = "https://wikipedia.org/wiki/Snefru"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -31,13 +31,13 @@ class Snefru extends Operation { value: 128, min: 32, max: 480, - step: 32 + step: 32, }, { name: "Rounds", type: "option", - value: ["8", "4", "2"] - } + value: ["8", "4", "2"], + }, ]; } @@ -49,10 +49,9 @@ class Snefru extends Operation { run(input, args) { return runHash("snefru", input, { length: args[0], - rounds: args[1] + rounds: args[1], }); } - } export default Snefru; diff --git a/src/core/operations/Sort.mjs b/src/core/operations/Sort.mjs index 7a4714be..e615acd9 100644 --- a/src/core/operations/Sort.mjs +++ b/src/core/operations/Sort.mjs @@ -6,14 +6,19 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; -import {caseInsensitiveSort, ipSort, numericSort, hexadecimalSort, lengthSort} from "../lib/Sort.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; +import { + caseInsensitiveSort, + ipSort, + numericSort, + hexadecimalSort, + lengthSort, +} from "../lib/Sort.mjs"; /** * Sort operation */ class Sort extends Operation { - /** * Sort constructor */ @@ -22,25 +27,33 @@ class Sort extends Operation { this.name = "Sort"; this.module = "Default"; - this.description = "Alphabetically sorts strings separated by the specified delimiter.

          The IP address option supports IPv4 only."; + this.description = + "Alphabetically sorts strings separated by the specified delimiter.

          The IP address option supports IPv4 only."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": INPUT_DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: INPUT_DELIM_OPTIONS, }, { - "name": "Reverse", - "type": "boolean", - "value": false + name: "Reverse", + type: "boolean", + value: false, }, { - "name": "Order", - "type": "option", - "value": ["Alphabetical (case sensitive)", "Alphabetical (case insensitive)", "IP address", "Numeric", "Numeric (hexadecimal)", "Length"] - } + name: "Order", + type: "option", + value: [ + "Alphabetical (case sensitive)", + "Alphabetical (case insensitive)", + "IP address", + "Numeric", + "Numeric (hexadecimal)", + "Length", + ], + }, ]; } @@ -72,7 +85,6 @@ class Sort extends Operation { if (sortReverse) sorted.reverse(); return sorted.join(delim); } - } export default Sort; diff --git a/src/core/operations/Split.mjs b/src/core/operations/Split.mjs index 0da1f101..b87f846e 100644 --- a/src/core/operations/Split.mjs +++ b/src/core/operations/Split.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {SPLIT_DELIM_OPTIONS, JOIN_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { SPLIT_DELIM_OPTIONS, JOIN_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Split operation */ class Split extends Operation { - /** * Split constructor */ @@ -20,20 +19,21 @@ class Split extends Operation { this.name = "Split"; this.module = "Default"; - this.description = "Splits a string into sections around a given delimiter."; + this.description = + "Splits a string into sections around a given delimiter."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Split delimiter", - "type": "editableOptionShort", - "value": SPLIT_DELIM_OPTIONS + name: "Split delimiter", + type: "editableOptionShort", + value: SPLIT_DELIM_OPTIONS, }, { - "name": "Join delimiter", - "type": "editableOptionShort", - "value": JOIN_DELIM_OPTIONS - } + name: "Join delimiter", + type: "editableOptionShort", + value: JOIN_DELIM_OPTIONS, + }, ]; } @@ -49,7 +49,6 @@ class Split extends Operation { return sections.join(joinDelim); } - } export default Split; diff --git a/src/core/operations/SplitColourChannels.mjs b/src/core/operations/SplitColourChannels.mjs index 339a356d..d3ea8488 100644 --- a/src/core/operations/SplitColourChannels.mjs +++ b/src/core/operations/SplitColourChannels.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {isImage} from "../lib/FileType.mjs"; +import { isImage } from "../lib/FileType.mjs"; import jimp from "jimp"; /** * Split Colour Channels operation */ class SplitColourChannels extends Operation { - /** * SplitColourChannels constructor */ @@ -23,7 +22,8 @@ class SplitColourChannels extends Operation { this.name = "Split Colour Channels"; this.module = "Image"; - this.description = "Splits the given image into its red, green and blue colour channels."; + this.description = + "Splits the given image into its red, green and blue colour channels."; this.infoURL = "https://wikipedia.org/wiki/Channel_(digital_image)"; this.inputType = "ArrayBuffer"; this.outputType = "List"; @@ -48,26 +48,44 @@ class SplitColourChannels extends Operation { const split = parsedImage .clone() .color([ - {apply: "blue", params: [-255]}, - {apply: "green", params: [-255]} + { apply: "blue", params: [-255] }, + { apply: "green", params: [-255] }, ]) .getBufferAsync(jimp.MIME_PNG); - resolve(new File([new Uint8Array((await split).values())], "red.png", {type: "image/png"})); + resolve( + new File( + [new Uint8Array((await split).values())], + "red.png", + { type: "image/png" }, + ), + ); } catch (err) { - reject(new OperationError(`Could not split red channel: ${err}`)); + reject( + new OperationError(`Could not split red channel: ${err}`), + ); } }); const green = new Promise(async (resolve, reject) => { try { - const split = parsedImage.clone() + const split = parsedImage + .clone() .color([ - {apply: "red", params: [-255]}, - {apply: "blue", params: [-255]}, - ]).getBufferAsync(jimp.MIME_PNG); - resolve(new File([new Uint8Array((await split).values())], "green.png", {type: "image/png"})); + { apply: "red", params: [-255] }, + { apply: "blue", params: [-255] }, + ]) + .getBufferAsync(jimp.MIME_PNG); + resolve( + new File( + [new Uint8Array((await split).values())], + "green.png", + { type: "image/png" }, + ), + ); } catch (err) { - reject(new OperationError(`Could not split green channel: ${err}`)); + reject( + new OperationError(`Could not split green channel: ${err}`), + ); } }); @@ -75,12 +93,21 @@ class SplitColourChannels extends Operation { try { const split = parsedImage .color([ - {apply: "red", params: [-255]}, - {apply: "green", params: [-255]}, - ]).getBufferAsync(jimp.MIME_PNG); - resolve(new File([new Uint8Array((await split).values())], "blue.png", {type: "image/png"})); + { apply: "red", params: [-255] }, + { apply: "green", params: [-255] }, + ]) + .getBufferAsync(jimp.MIME_PNG); + resolve( + new File( + [new Uint8Array((await split).values())], + "blue.png", + { type: "image/png" }, + ), + ); } catch (err) { - reject(new OperationError(`Could not split blue channel: ${err}`)); + reject( + new OperationError(`Could not split blue channel: ${err}`), + ); } }); @@ -96,7 +123,6 @@ class SplitColourChannels extends Operation { async present(files) { return await Utils.displayFilesAsHTML(files); } - } export default SplitColourChannels; diff --git a/src/core/operations/StandardDeviation.mjs b/src/core/operations/StandardDeviation.mjs index d0509dcd..5210d959 100644 --- a/src/core/operations/StandardDeviation.mjs +++ b/src/core/operations/StandardDeviation.mjs @@ -10,12 +10,10 @@ import Operation from "../Operation.mjs"; import { stdDev, createNumArray } from "../lib/Arithmetic.mjs"; import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; - /** * Standard Deviation operation */ class StandardDeviation extends Operation { - /** * StandardDeviation constructor */ @@ -24,16 +22,17 @@ class StandardDeviation extends Operation { this.name = "Standard Deviation"; this.module = "Default"; - this.description = "Computes the standard deviation of a number list. If an item in the string is not a number it is excluded from the list.

          e.g. 0x0a 8 .5 becomes 4.089281382128433"; + this.description = + "Computes the standard deviation of a number list. If an item in the string is not a number it is excluded from the list.

          e.g. 0x0a 8 .5 becomes 4.089281382128433"; this.infoURL = "https://wikipedia.org/wiki/Standard_deviation"; this.inputType = "string"; this.outputType = "BigNumber"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, - } + name: "Delimiter", + type: "option", + value: ARITHMETIC_DELIM_OPTIONS, + }, ]; } @@ -45,9 +44,7 @@ class StandardDeviation extends Operation { run(input, args) { const val = stdDev(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); - } - } export default StandardDeviation; diff --git a/src/core/operations/Streebog.mjs b/src/core/operations/Streebog.mjs index b65accf6..5211c1ad 100644 --- a/src/core/operations/Streebog.mjs +++ b/src/core/operations/Streebog.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import GostDigest from "../vendor/gost/gostDigest.mjs"; -import {toHexFast} from "../lib/Hex.mjs"; +import { toHexFast } from "../lib/Hex.mjs"; /** * Streebog operation */ class Streebog extends Operation { - /** * Streebog constructor */ @@ -22,16 +21,17 @@ class Streebog extends Operation { this.name = "Streebog"; this.module = "Hashing"; - this.description = "Streebog is a cryptographic hash function defined in the Russian national standard GOST R 34.11-2012 Information Technology \u2013 Cryptographic Information Security \u2013 Hash Function. It was created to replace an obsolete GOST hash function defined in the old standard GOST R 34.11-94, and as an asymmetric reply to SHA-3 competition by the US National Institute of Standards and Technology."; + this.description = + "Streebog is a cryptographic hash function defined in the Russian national standard GOST R 34.11-2012 Information Technology \u2013 Cryptographic Information Security \u2013 Hash Function. It was created to replace an obsolete GOST hash function defined in the old standard GOST R 34.11-94, and as an asymmetric reply to SHA-3 competition by the US National Institute of Standards and Technology."; this.infoURL = "https://wikipedia.org/wiki/Streebog"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Digest length", - "type": "option", - "value": ["256", "512"] - } + name: "Digest length", + type: "option", + value: ["256", "512"], + }, ]; } @@ -46,7 +46,7 @@ class Streebog extends Operation { const algorithm = { version: 2012, mode: "HASH", - length: parseInt(length, 10) + length: parseInt(length, 10), }; try { @@ -57,7 +57,6 @@ class Streebog extends Operation { throw new OperationError(err); } } - } export default Streebog; diff --git a/src/core/operations/Strings.mjs b/src/core/operations/Strings.mjs index dca2433a..4c713c73 100644 --- a/src/core/operations/Strings.mjs +++ b/src/core/operations/Strings.mjs @@ -13,7 +13,6 @@ import { caseInsensitiveSort } from "../lib/Sort.mjs"; * Strings operation */ class Strings extends Operation { - /** * Strings constructor */ @@ -30,36 +29,47 @@ class Strings extends Operation { { name: "Encoding", type: "option", - value: ["Single byte", "16-bit littleendian", "16-bit bigendian", "All"] + value: [ + "Single byte", + "16-bit littleendian", + "16-bit bigendian", + "All", + ], }, { name: "Minimum length", type: "number", - value: 4 + value: 4, }, { name: "Match", type: "option", value: [ - "[ASCII]", "Alphanumeric + punctuation (A)", "All printable chars (A)", "Null-terminated strings (A)", - "[Unicode]", "Alphanumeric + punctuation (U)", "All printable chars (U)", "Null-terminated strings (U)" - ] + "[ASCII]", + "Alphanumeric + punctuation (A)", + "All printable chars (A)", + "Null-terminated strings (A)", + "[Unicode]", + "Alphanumeric + punctuation (U)", + "All printable chars (U)", + "Null-terminated strings (U)", + ], }, { name: "Display total", type: "boolean", - value: false + value: false, }, { name: "Sort", type: "boolean", - value: false + value: false, }, { name: "Unique", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -124,7 +134,7 @@ class Strings extends Operation { regex, null, sort ? caseInsensitiveSort : null, - unique + unique, ); if (displayTotal) { @@ -133,7 +143,6 @@ class Strings extends Operation { return results.join("\n"); } } - } export default Strings; diff --git a/src/core/operations/StripHTMLTags.mjs b/src/core/operations/StripHTMLTags.mjs index 9670cc3d..da106e57 100644 --- a/src/core/operations/StripHTMLTags.mjs +++ b/src/core/operations/StripHTMLTags.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Strip HTML tags operation */ class StripHTMLTags extends Operation { - /** * StripHTMLTags constructor */ @@ -25,22 +24,22 @@ class StripHTMLTags extends Operation { this.outputType = "string"; this.args = [ { - "name": "Remove indentation", - "type": "boolean", - "value": true + name: "Remove indentation", + type: "boolean", + value: true, }, { - "name": "Remove excess line breaks", - "type": "boolean", - "value": true - } + name: "Remove excess line breaks", + type: "boolean", + value: true, + }, ]; this.checks = [ { - pattern: "(|
|)", - flags: "i", - args: [true, true] - } + pattern: "(|
|)", + flags: "i", + args: [true, true], + }, ]; } @@ -66,7 +65,6 @@ class StripHTMLTags extends Operation { return input; } - } export default StripHTMLTags; diff --git a/src/core/operations/StripHTTPHeaders.mjs b/src/core/operations/StripHTTPHeaders.mjs index 2160e3e7..6dbf0c39 100644 --- a/src/core/operations/StripHTTPHeaders.mjs +++ b/src/core/operations/StripHTTPHeaders.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Strip HTTP headers operation */ class StripHTTPHeaders extends Operation { - /** * StripHTTPHeaders constructor */ @@ -19,17 +18,19 @@ class StripHTTPHeaders extends Operation { this.name = "Strip HTTP headers"; this.module = "Default"; - this.description = "Removes HTTP headers from a request or response by looking for the first instance of a double newline."; - this.infoURL = "https://wikipedia.org/wiki/Hypertext_Transfer_Protocol#Message_format"; + this.description = + "Removes HTTP headers from a request or response by looking for the first instance of a double newline."; + this.infoURL = + "https://wikipedia.org/wiki/Hypertext_Transfer_Protocol#Message_format"; this.inputType = "string"; this.outputType = "string"; this.args = []; this.checks = [ { - pattern: "^HTTP(.|\\s)+?(\\r?\\n){2}", - flags: "", - args: [] - } + pattern: "^HTTP(.|\\s)+?(\\r?\\n){2}", + flags: "", + args: [], + }, ]; } @@ -40,11 +41,10 @@ class StripHTTPHeaders extends Operation { */ run(input, args) { let headerEnd = input.indexOf("\r\n\r\n"); - headerEnd = (headerEnd < 0) ? input.indexOf("\n\n") + 2 : headerEnd + 4; + headerEnd = headerEnd < 0 ? input.indexOf("\n\n") + 2 : headerEnd + 4; - return (headerEnd < 2) ? input : input.slice(headerEnd, input.length); + return headerEnd < 2 ? input : input.slice(headerEnd, input.length); } - } export default StripHTTPHeaders; diff --git a/src/core/operations/Subsection.mjs b/src/core/operations/Subsection.mjs index a7da44b0..879a46cd 100644 --- a/src/core/operations/Subsection.mjs +++ b/src/core/operations/Subsection.mjs @@ -12,7 +12,6 @@ import Dish from "../Dish.mjs"; * Subsection operation */ class Subsection extends Operation { - /** * Subsection constructor */ @@ -22,31 +21,32 @@ class Subsection extends Operation { this.name = "Subsection"; this.flowControl = true; this.module = "Default"; - this.description = "Select a part of the input data using a regular expression (regex), and run all subsequent operations on each match separately.

You can use up to one capture group, where the recipe will only be run on the data in the capture group. If there's more than one capture group, only the first one will be operated on.

Use the Merge operation to reset the effects of subsection."; + this.description = + "Select a part of the input data using a regular expression (regex), and run all subsequent operations on each match separately.

You can use up to one capture group, where the recipe will only be run on the data in the capture group. If there's more than one capture group, only the first one will be operated on.

Use the Merge operation to reset the effects of subsection."; this.infoURL = ""; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Section (regex)", - "type": "string", - "value": "" + name: "Section (regex)", + type: "string", + value: "", }, { - "name": "Case sensitive matching", - "type": "boolean", - "value": true + name: "Case sensitive matching", + type: "boolean", + value: true, }, { - "name": "Global matching", - "type": "boolean", - "value": true + name: "Global matching", + type: "boolean", + value: true, }, { - "name": "Ignore errors", - "type": "boolean", - "value": false - } + name: "Ignore errors", + type: "boolean", + value: false, + }, ]; } @@ -58,13 +58,13 @@ class Subsection extends Operation { * @returns {Object} - The updated state of the recipe */ async run(state) { - const opList = state.opList, - inputType = opList[state.progress].inputType, - outputType = opList[state.progress].outputType, - input = await state.dish.get(inputType), - ings = opList[state.progress].ingValues, + const opList = state.opList, + inputType = opList[state.progress].inputType, + outputType = opList[state.progress].outputType, + input = await state.dish.get(inputType), + ings = opList[state.progress].ingValues, [section, caseSensitive, global, ignoreErrors] = ings, - subOpList = []; + subOpList = []; if (input && section !== "") { // Set to 1 as if we are here, then there is one, the current one. @@ -74,13 +74,14 @@ class Subsection extends Operation { for (let i = state.progress + 1; i < opList.length; i++) { if (opList[i].name === "Merge" && !opList[i].disabled) { numOp--; - if (numOp === 0 || opList[i].ingValues[0]) - break; - else - // Not this subsection's Merge. - subOpList.push(opList[i]); + if (numOp === 0 || opList[i].ingValues[0]) break; + // Not this subsection's Merge. + else subOpList.push(opList[i]); } else { - if (opList[i].name === "Fork" || opList[i].name === "Subsection") + if ( + opList[i].name === "Fork" || + opList[i].name === "Subsection" + ) numOp++; subOpList.push(opList[i]); } @@ -102,7 +103,9 @@ class Subsection extends Operation { state.forkOffset += state.progress + 1; // Take a deep(ish) copy of the ingredient values - const ingValues = subOpList.map(op => JSON.parse(JSON.stringify(op.ingValues))); + const ingValues = subOpList.map((op) => + JSON.parse(JSON.stringify(op.ingValues)), + ); let matched = false; // Run recipe over each match @@ -111,14 +114,18 @@ class Subsection extends Operation { // Add up to match let matchStr = m[0]; - if (m.length === 1) { // No capture groups + if (m.length === 1) { + // No capture groups output += input.slice(inOffset, m.index); inOffset = m.index + m[0].length; } else if (m.length >= 2) { matchStr = m[1]; // Need to add some of the matched string that isn't in the capture group - output += input.slice(inOffset, m.index + m[0].indexOf(m[1])); + output += input.slice( + inOffset, + m.index + m[0].indexOf(m[1]), + ); // Set i to be after the end of the first capture group inOffset = m.index + m[0].indexOf(m[1]) + m[1].length; } @@ -155,7 +162,6 @@ class Subsection extends Operation { } return state; } - } export default Subsection; diff --git a/src/core/operations/Substitute.mjs b/src/core/operations/Substitute.mjs index 4a8cdc5d..3f5d4a8c 100644 --- a/src/core/operations/Substitute.mjs +++ b/src/core/operations/Substitute.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Substitute operation */ class Substitute extends Operation { - /** * Substitute constructor */ @@ -20,26 +19,27 @@ class Substitute extends Operation { this.name = "Substitute"; this.module = "Default"; - this.description = "A substitution cipher allowing you to specify bytes to replace with other byte values. This can be used to create Caesar ciphers but is more powerful as any byte value can be substituted, not just letters, and the substitution values need not be in order.

Enter the bytes you want to replace in the Plaintext field and the bytes to replace them with in the Ciphertext field.

Non-printable bytes can be specified using string escape notation. For example, a line feed character can be written as either \\n or \\x0a.

Byte ranges can be specified using a hyphen. For example, the sequence 0123456789 can be written as 0-9.

Note that blackslash characters are used to escape special characters, so will need to be escaped themselves if you want to use them on their own (e.g.\\\\)."; + this.description = + "A substitution cipher allowing you to specify bytes to replace with other byte values. This can be used to create Caesar ciphers but is more powerful as any byte value can be substituted, not just letters, and the substitution values need not be in order.

Enter the bytes you want to replace in the Plaintext field and the bytes to replace them with in the Ciphertext field.

Non-printable bytes can be specified using string escape notation. For example, a line feed character can be written as either \\n or \\x0a.

Byte ranges can be specified using a hyphen. For example, the sequence 0123456789 can be written as 0-9.

Note that blackslash characters are used to escape special characters, so will need to be escaped themselves if you want to use them on their own (e.g.\\\\)."; this.infoURL = "https://wikipedia.org/wiki/Substitution_cipher"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Plaintext", - "type": "binaryString", - "value": "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + name: "Plaintext", + type: "binaryString", + value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", }, { - "name": "Ciphertext", - "type": "binaryString", - "value": "XYZABCDEFGHIJKLMNOPQRSTUVW" + name: "Ciphertext", + type: "binaryString", + value: "XYZABCDEFGHIJKLMNOPQRSTUVW", }, { - "name": "Ignore case", - "type": "boolean", - "value": false - } + name: "Ignore case", + type: "boolean", + value: false, + }, ]; } @@ -53,8 +53,7 @@ class Substitute extends Operation { * @returns {string} */ cipherSingleChar(char, dict, ignoreCase) { - if (!ignoreCase) - return dict[char] || char; + if (!ignoreCase) return dict[char] || char; const isUpperCase = char === char.toUpperCase(); @@ -62,7 +61,9 @@ class Substitute extends Operation { if (dict[char] !== undefined) { // if the character is in the dictionary return the value with the input case - return isUpperCase ? dict[char].toUpperCase() : dict[char].toLowerCase(); + return isUpperCase + ? dict[char].toUpperCase() + : dict[char].toLowerCase(); } // check for the other case, if it is in the dictionary return the value with the right case @@ -77,7 +78,6 @@ class Substitute extends Operation { return char; } - /** * @param {string} input * @param {Object[]} args @@ -95,7 +95,11 @@ class Substitute extends Operation { // create dictionary for conversion const dict = {}; - for (let i = 0; i < Math.min(ciphertext.length, plaintext.length); i++) { + for ( + let i = 0; + i < Math.min(ciphertext.length, plaintext.length); + i++ + ) { dict[plaintext[i]] = ciphertext[i]; } @@ -106,7 +110,6 @@ class Substitute extends Operation { return output; } - } export default Substitute; diff --git a/src/core/operations/Subtract.mjs b/src/core/operations/Subtract.mjs index 3d9cb176..c10ed095 100644 --- a/src/core/operations/Subtract.mjs +++ b/src/core/operations/Subtract.mjs @@ -10,12 +10,10 @@ import Operation from "../Operation.mjs"; import { sub, createNumArray } from "../lib/Arithmetic.mjs"; import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; - /** * Subtract operation */ class Subtract extends Operation { - /** * Subtract constructor */ @@ -24,16 +22,17 @@ class Subtract extends Operation { this.name = "Subtract"; this.module = "Default"; - this.description = "Subtracts a list of numbers. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 1.5"; + this.description = + "Subtracts a list of numbers. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 1.5"; this.infoURL = "https://wikipedia.org/wiki/Subtraction"; this.inputType = "string"; this.outputType = "BigNumber"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, - } + name: "Delimiter", + type: "option", + value: ARITHMETIC_DELIM_OPTIONS, + }, ]; } @@ -46,7 +45,6 @@ class Subtract extends Operation { const val = sub(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Subtract; diff --git a/src/core/operations/Sum.mjs b/src/core/operations/Sum.mjs index dd7ebd3b..2e9c26f9 100644 --- a/src/core/operations/Sum.mjs +++ b/src/core/operations/Sum.mjs @@ -10,12 +10,10 @@ import Operation from "../Operation.mjs"; import { sum, createNumArray } from "../lib/Arithmetic.mjs"; import { ARITHMETIC_DELIM_OPTIONS } from "../lib/Delim.mjs"; - /** * Sum operation */ class Sum extends Operation { - /** * Sum constructor */ @@ -24,16 +22,17 @@ class Sum extends Operation { this.name = "Sum"; this.module = "Default"; - this.description = "Adds together a list of numbers. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 18.5"; + this.description = + "Adds together a list of numbers. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 18.5"; this.infoURL = "https://wikipedia.org/wiki/Summation"; this.inputType = "string"; this.outputType = "BigNumber"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": ARITHMETIC_DELIM_OPTIONS, - } + name: "Delimiter", + type: "option", + value: ARITHMETIC_DELIM_OPTIONS, + }, ]; } @@ -46,7 +45,6 @@ class Sum extends Operation { const val = sum(createNumArray(input, args[0])); return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); } - } export default Sum; diff --git a/src/core/operations/SwapCase.mjs b/src/core/operations/SwapCase.mjs index 679d7703..e72151ba 100644 --- a/src/core/operations/SwapCase.mjs +++ b/src/core/operations/SwapCase.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Swap case operation */ class SwapCase extends Operation { - /** * SwapCase constructor */ @@ -19,7 +18,8 @@ class SwapCase extends Operation { this.name = "Swap case"; this.module = "Default"; - this.description = "Converts uppercase letters to lowercase ones, and lowercase ones to uppercase ones."; + this.description = + "Converts uppercase letters to lowercase ones, and lowercase ones to uppercase ones."; this.infoURL = ""; this.inputType = "string"; this.outputType = "string"; @@ -70,7 +70,6 @@ class SwapCase extends Operation { highlightReverse(pos, args) { return pos; } - } export default SwapCase; diff --git a/src/core/operations/SwapEndianness.mjs b/src/core/operations/SwapEndianness.mjs index 872d3529..6ecb0106 100644 --- a/src/core/operations/SwapEndianness.mjs +++ b/src/core/operations/SwapEndianness.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {toHex, fromHex} from "../lib/Hex.mjs"; +import { toHex, fromHex } from "../lib/Hex.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * Swap endianness operation */ class SwapEndianness extends Operation { - /** * SwapEndianness constructor */ @@ -22,26 +21,27 @@ class SwapEndianness extends Operation { this.name = "Swap endianness"; this.module = "Default"; - this.description = "Switches the data from big-endian to little-endian or vice-versa. Data can be read in as hexadecimal or raw bytes. It will be returned in the same format as it is entered."; + this.description = + "Switches the data from big-endian to little-endian or vice-versa. Data can be read in as hexadecimal or raw bytes. It will be returned in the same format as it is entered."; this.infoURL = "https://wikipedia.org/wiki/Endianness"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Data format", - "type": "option", - "value": ["Hex", "Raw"] + name: "Data format", + type: "option", + value: ["Hex", "Raw"], }, { - "name": "Word length (bytes)", - "type": "number", - "value": 4 + name: "Word length (bytes)", + type: "number", + value: 4, }, { - "name": "Pad incomplete words", - "type": "boolean", - "value": true - } + name: "Pad incomplete words", + type: "boolean", + value: true, + }, ]; } @@ -132,7 +132,6 @@ class SwapEndianness extends Operation { highlightReverse(pos, args) { return pos; } - } export default SwapEndianness; diff --git a/src/core/operations/SymmetricDifference.mjs b/src/core/operations/SymmetricDifference.mjs index f9044769..0e89a40d 100644 --- a/src/core/operations/SymmetricDifference.mjs +++ b/src/core/operations/SymmetricDifference.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Set Symmetric Difference operation */ class SymmetricDifference extends Operation { - /** * Symmetric Difference constructor */ @@ -29,12 +28,12 @@ class SymmetricDifference extends Operation { { name: "Sample delimiter", type: "binaryString", - value: Utils.escapeHtml("\\n\\n") + value: Utils.escapeHtml("\\n\\n"), }, { name: "Item delimiter", type: "binaryString", - value: "," + value: ",", }, ]; } @@ -46,8 +45,10 @@ class SymmetricDifference extends Operation { * @throws {Error} if not two sets */ validateSampleNumbers(sets) { - if (!sets || (sets.length !== 2)) { - throw new OperationError("Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?"); + if (!sets || sets.length !== 2) { + throw new OperationError( + "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?", + ); } } @@ -65,7 +66,9 @@ class SymmetricDifference extends Operation { this.validateSampleNumbers(sets); - return this.runSymmetricDifference(...sets.map(s => s.split(this.itemDelimiter))); + return this.runSymmetricDifference( + ...sets.map((s) => s.split(this.itemDelimiter)), + ); } /** @@ -93,7 +96,6 @@ class SymmetricDifference extends Operation { .concat(this.runSetDifference(b, a)) .join(this.itemDelimiter); } - } export default SymmetricDifference; diff --git a/src/core/operations/SyntaxHighlighter.mjs b/src/core/operations/SyntaxHighlighter.mjs index b8c578d6..eae6fd53 100644 --- a/src/core/operations/SyntaxHighlighter.mjs +++ b/src/core/operations/SyntaxHighlighter.mjs @@ -11,7 +11,6 @@ import hljs from "highlight.js"; * Syntax highlighter operation */ class SyntaxHighlighter extends Operation { - /** * SyntaxHighlighter constructor */ @@ -20,16 +19,17 @@ class SyntaxHighlighter extends Operation { this.name = "Syntax highlighter"; this.module = "Code"; - this.description = "Adds syntax highlighting to a range of source code languages. Note that this will not indent the code. Use one of the 'Beautify' operations for that."; + this.description = + "Adds syntax highlighting to a range of source code languages. Note that this will not indent the code. Use one of the 'Beautify' operations for that."; this.infoURL = "https://wikipedia.org/wiki/Syntax_highlighting"; this.inputType = "string"; this.outputType = "html"; this.args = [ { - "name": "Language", - "type": "option", - "value": ["auto detect"].concat(hljs.listLanguages()) - } + name: "Language", + type: "option", + value: ["auto detect"].concat(hljs.listLanguages()), + }, ]; } @@ -73,7 +73,6 @@ class SyntaxHighlighter extends Operation { highlightReverse(pos, args) { return pos; } - } export default SyntaxHighlighter; diff --git a/src/core/operations/TCPIPChecksum.mjs b/src/core/operations/TCPIPChecksum.mjs index 0e5c6c60..ad33e064 100644 --- a/src/core/operations/TCPIPChecksum.mjs +++ b/src/core/operations/TCPIPChecksum.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * TCP/IP Checksum operation */ class TCPIPChecksum extends Operation { - /** * TCPIPChecksum constructor */ @@ -20,7 +19,8 @@ class TCPIPChecksum extends Operation { this.name = "TCP/IP Checksum"; this.module = "Crypto"; - this.description = "Calculates the checksum for a TCP (Transport Control Protocol) or IP (Internet Protocol) header from an input of raw bytes."; + this.description = + "Calculates the checksum for a TCP (Transport Control Protocol) or IP (Internet Protocol) header from an input of raw bytes."; this.infoURL = "https://wikipedia.org/wiki/IPv4_header_checksum"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -38,7 +38,7 @@ class TCPIPChecksum extends Operation { for (let i = 0; i < input.length; i++) { if (i % 2 === 0) { - csum += (input[i] << 8); + csum += input[i] << 8; } else { csum += input[i]; } @@ -48,7 +48,6 @@ class TCPIPChecksum extends Operation { return Utils.hex(0xffff - csum); } - } export default TCPIPChecksum; diff --git a/src/core/operations/Tail.mjs b/src/core/operations/Tail.mjs index 8a29bb2d..5ec5a0d9 100644 --- a/src/core/operations/Tail.mjs +++ b/src/core/operations/Tail.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Tail operation */ class Tail extends Operation { - /** * Tail constructor */ @@ -21,21 +20,22 @@ class Tail extends Operation { this.name = "Tail"; this.module = "Default"; - this.description = "Like the UNIX tail utility.
Gets the last n lines.
Optionally you can select all lines after line n by entering a negative value for n.
The delimiter can be changed so that instead of lines, fields (i.e. commas) are selected instead."; + this.description = + "Like the UNIX tail utility.
Gets the last n lines.
Optionally you can select all lines after line n by entering a negative value for n.
The delimiter can be changed so that instead of lines, fields (i.e. commas) are selected instead."; this.infoURL = "https://wikipedia.org/wiki/Tail_(Unix)"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": INPUT_DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: INPUT_DELIM_OPTIONS, }, { - "name": "Number", - "type": "number", - "value": 10 - } + name: "Number", + type: "number", + value: 10, + }, ]; } @@ -62,9 +62,7 @@ class Tail extends Operation { } }) .join(delimiter); - } - } export default Tail; diff --git a/src/core/operations/TakeBytes.mjs b/src/core/operations/TakeBytes.mjs index 431bbee1..880940b9 100644 --- a/src/core/operations/TakeBytes.mjs +++ b/src/core/operations/TakeBytes.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * Take bytes operation */ class TakeBytes extends Operation { - /** * TakeBytes constructor */ @@ -19,25 +18,26 @@ class TakeBytes extends Operation { this.name = "Take bytes"; this.module = "Default"; - this.description = "Takes a slice of the specified number of bytes from the data. Negative values are allowed."; + this.description = + "Takes a slice of the specified number of bytes from the data. Negative values are allowed."; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; this.args = [ { - "name": "Start", - "type": "number", - "value": 0 + name: "Start", + type: "number", + value: 0, }, { - "name": "Length", - "type": "number", - "value": 5 + name: "Length", + type: "number", + value: 5, }, { - "name": "Apply to each line", - "type": "boolean", - "value": false - } + name: "Apply to each line", + type: "boolean", + value: false, + }, ]; } @@ -54,11 +54,13 @@ class TakeBytes extends Operation { const applyToEachLine = args[2]; if (!applyToEachLine) { - if (start < 0) { // Take from the end + if (start < 0) { + // Take from the end start = input.byteLength + start; } - if (length < 0) { // Flip start point + if (length < 0) { + // Flip start point start = start + length; if (start < 0) { start = input.byteLength + start; @@ -68,7 +70,7 @@ class TakeBytes extends Operation { } } - return input.slice(start, start+length); + return input.slice(start, start + length); } // Split input into lines @@ -91,11 +93,13 @@ class TakeBytes extends Operation { let s = start, l = length; for (i = 0; i < lines.length; i++) { - if (s < 0) { // Take from the end + if (s < 0) { + // Take from the end s = lines[i].length + s; } - if (l < 0) { // Flip start point + if (l < 0) { + // Flip start point s = s + l; if (s < 0) { s = lines[i].length + s; @@ -104,14 +108,13 @@ class TakeBytes extends Operation { l = -l; } } - output = output.concat(lines[i].slice(s, s+l)); + output = output.concat(lines[i].slice(s, s + l)); output.push(0x0a); s = start; l = length; } - return new Uint8Array(output.slice(0, output.length-1)).buffer; + return new Uint8Array(output.slice(0, output.length - 1)).buffer; } - } export default TakeBytes; diff --git a/src/core/operations/Tar.mjs b/src/core/operations/Tar.mjs index 3078d959..79426665 100644 --- a/src/core/operations/Tar.mjs +++ b/src/core/operations/Tar.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Tar operation */ class Tar extends Operation { - /** * Tar constructor */ @@ -20,16 +19,17 @@ class Tar extends Operation { this.name = "Tar"; this.module = "Compression"; - this.description = "Packs the input into a tarball.

No support for multiple files at this time."; + this.description = + "Packs the input into a tarball.

No support for multiple files at this time."; this.infoURL = "https://wikipedia.org/wiki/Tar_(computing)"; this.inputType = "ArrayBuffer"; this.outputType = "File"; this.args = [ { - "name": "Filename", - "type": "string", - "value": "file.txt" - } + name: "Filename", + type: "string", + value: "file.txt", + }, ]; } @@ -41,25 +41,25 @@ class Tar extends Operation { run(input, args) { input = new Uint8Array(input); - const Tarball = function() { + const Tarball = function () { this.bytes = new Array(512); this.position = 0; }; - Tarball.prototype.addEmptyBlock = function() { + Tarball.prototype.addEmptyBlock = function () { const filler = new Array(512); filler.fill(0); this.bytes = this.bytes.concat(filler); }; - Tarball.prototype.writeBytes = function(bytes) { + Tarball.prototype.writeBytes = function (bytes) { const self = this; if (this.position + bytes.length > this.bytes.length) { this.addEmptyBlock(); } - Array.prototype.forEach.call(bytes, function(b, i) { + Array.prototype.forEach.call(bytes, function (b, i) { if (typeof b.charCodeAt !== "undefined") { b = b.charCodeAt(); } @@ -69,7 +69,7 @@ class Tar extends Operation { }); }; - Tarball.prototype.writeEndBlocks = function() { + Tarball.prototype.writeEndBlocks = function () { const numEmptyBlocks = 2; for (let i = 0; i < numEmptyBlocks; i++) { this.addEmptyBlock(); @@ -102,7 +102,7 @@ class Tar extends Operation { let checksum = 0; for (const key in file) { const bytes = file[key]; - Array.prototype.forEach.call(bytes, function(b) { + Array.prototype.forEach.call(bytes, function (b) { if (typeof b.charCodeAt !== "undefined") { checksum += b.charCodeAt(); } else { @@ -110,7 +110,10 @@ class Tar extends Operation { } }); } - checksum = Utils.padBytesRight(checksum.toString(8).padStart(7, "0"), 8); + checksum = Utils.padBytesRight( + checksum.toString(8).padStart(7, "0"), + 8, + ); file.checksum = checksum; const tarball = new Tarball(); @@ -136,7 +139,6 @@ class Tar extends Operation { return new File([new Uint8Array(tarball.bytes)], args[0]); } - } export default Tar; diff --git a/src/core/operations/TextEncodingBruteForce.mjs b/src/core/operations/TextEncodingBruteForce.mjs index ae96fd0a..fecaf589 100644 --- a/src/core/operations/TextEncodingBruteForce.mjs +++ b/src/core/operations/TextEncodingBruteForce.mjs @@ -8,13 +8,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import cptable from "codepage"; -import {CHR_ENC_CODE_PAGES} from "../lib/ChrEnc.mjs"; +import { CHR_ENC_CODE_PAGES } from "../lib/ChrEnc.mjs"; /** * Text Encoding Brute Force operation */ class TextEncodingBruteForce extends Operation { - /** * TextEncodingBruteForce constructor */ @@ -28,8 +27,10 @@ class TextEncodingBruteForce extends Operation { "

", "Supported charsets are:", "
    ", - Object.keys(CHR_ENC_CODE_PAGES).map(e => `
  • ${e}
  • `).join("\n"), - "
" + Object.keys(CHR_ENC_CODE_PAGES) + .map((e) => `
  • ${e}
  • `) + .join("\n"), + "", ].join("\n"); this.infoURL = "https://wikipedia.org/wiki/Character_encoding"; this.inputType = "string"; @@ -39,8 +40,8 @@ class TextEncodingBruteForce extends Operation { { name: "Mode", type: "option", - value: ["Encode", "Decode"] - } + value: ["Encode", "Decode"], + }, ]; } @@ -54,12 +55,20 @@ class TextEncodingBruteForce extends Operation { charsets = Object.keys(CHR_ENC_CODE_PAGES), mode = args[0]; - charsets.forEach(charset => { + charsets.forEach((charset) => { try { if (mode === "Decode") { - output[charset] = cptable.utils.decode(CHR_ENC_CODE_PAGES[charset], input); + output[charset] = cptable.utils.decode( + CHR_ENC_CODE_PAGES[charset], + input, + ); } else { - output[charset] = Utils.arrayBufferToStr(cptable.utils.encode(CHR_ENC_CODE_PAGES[charset], input)); + output[charset] = Utils.arrayBufferToStr( + cptable.utils.encode( + CHR_ENC_CODE_PAGES[charset], + input, + ), + ); } } catch (err) { output[charset] = "Could not decode."; @@ -76,17 +85,19 @@ class TextEncodingBruteForce extends Operation { * @returns {html} */ present(encodings) { - let table = ""; + let table = + "
    EncodingValue
    "; for (const enc in encodings) { - const value = Utils.escapeHtml(Utils.escapeWhitespace(encodings[enc])); + const value = Utils.escapeHtml( + Utils.escapeWhitespace(encodings[enc]), + ); table += ``; } table += "
    EncodingValue
    ${enc}${value}
    "; return table; } - } export default TextEncodingBruteForce; diff --git a/src/core/operations/ToBCD.mjs b/src/core/operations/ToBCD.mjs index 3908742c..5dfac249 100644 --- a/src/core/operations/ToBCD.mjs +++ b/src/core/operations/ToBCD.mjs @@ -7,14 +7,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ENCODING_SCHEME, ENCODING_LOOKUP, FORMAT} from "../lib/BCD.mjs"; +import { ENCODING_SCHEME, ENCODING_LOOKUP, FORMAT } from "../lib/BCD.mjs"; import BigNumber from "bignumber.js"; /** * To BCD operation */ class ToBCD extends Operation { - /** * ToBCD constructor */ @@ -23,31 +22,32 @@ class ToBCD extends Operation { this.name = "To BCD"; this.module = "Default"; - this.description = "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign"; + this.description = + "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign"; this.infoURL = "https://wikipedia.org/wiki/Binary-coded_decimal"; this.inputType = "BigNumber"; this.outputType = "string"; this.args = [ { - "name": "Scheme", - "type": "option", - "value": ENCODING_SCHEME + name: "Scheme", + type: "option", + value: ENCODING_SCHEME, }, { - "name": "Packed", - "type": "boolean", - "value": true + name: "Packed", + type: "boolean", + value: true, }, { - "name": "Signed", - "type": "boolean", - "value": false + name: "Signed", + type: "boolean", + value: false, }, { - "name": "Output format", - "type": "option", - "value": FORMAT - } + name: "Output format", + type: "option", + value: FORMAT, + }, ]; } @@ -57,10 +57,11 @@ class ToBCD extends Operation { * @returns {string} */ run(input, args) { - if (input.isNaN()) - throw new OperationError("Invalid input"); + if (input.isNaN()) throw new OperationError("Invalid input"); if (!input.integerValue(BigNumber.ROUND_DOWN).isEqualTo(input)) - throw new OperationError("Fractional values are not supported by BCD"); + throw new OperationError( + "Fractional values are not supported by BCD", + ); const encoding = ENCODING_LOOKUP[args[0]], packed = args[1], @@ -76,7 +77,7 @@ class ToBCD extends Operation { let nibbles = []; - digits.forEach(d => { + digits.forEach((d) => { const n = parseInt(d, 10); nibbles.push(encoding[n]); }); @@ -100,8 +101,8 @@ class ToBCD extends Operation { let encoded = 0, little = false; - nibbles.forEach(n => { - encoded ^= little ? n : (n << 4); + nibbles.forEach((n) => { + encoded ^= little ? n : n << 4; if (little) { bytes.push(encoded); encoded = 0; @@ -114,29 +115,34 @@ class ToBCD extends Operation { bytes = nibbles; // Add null high nibbles - nibbles = nibbles.map(n => { - return [0, n]; - }).reduce((a, b) => { - return a.concat(b); - }); + nibbles = nibbles + .map((n) => { + return [0, n]; + }) + .reduce((a, b) => { + return a.concat(b); + }); } // Output switch (outputFormat) { case "Nibbles": - return nibbles.map(n => { - return n.toString(2).padStart(4, "0"); - }).join(" "); + return nibbles + .map((n) => { + return n.toString(2).padStart(4, "0"); + }) + .join(" "); case "Bytes": - return bytes.map(b => { - return b.toString(2).padStart(8, "0"); - }).join(" "); + return bytes + .map((b) => { + return b.toString(2).padStart(8, "0"); + }) + .join(" "); case "Raw": default: return Utils.byteArrayToChars(bytes); } } - } export default ToBCD; diff --git a/src/core/operations/ToBase.mjs b/src/core/operations/ToBase.mjs index 09a91571..f5958fea 100644 --- a/src/core/operations/ToBase.mjs +++ b/src/core/operations/ToBase.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * To Base operation */ class ToBase extends Operation { - /** * ToBase constructor */ @@ -20,16 +19,17 @@ class ToBase extends Operation { this.name = "To Base"; this.module = "Default"; - this.description = "Converts a decimal number to a given numerical base."; + this.description = + "Converts a decimal number to a given numerical base."; this.infoURL = "https://wikipedia.org/wiki/Radix"; this.inputType = "BigNumber"; this.outputType = "string"; this.args = [ { - "name": "Radix", - "type": "number", - "value": 36 - } + name: "Radix", + type: "number", + value: 36, + }, ]; } @@ -44,11 +44,12 @@ class ToBase extends Operation { } const radix = args[0]; if (radix < 2 || radix > 36) { - throw new OperationError("Error: Radix argument must be between 2 and 36"); + throw new OperationError( + "Error: Radix argument must be between 2 and 36", + ); } return input.toString(radix); } - } export default ToBase; diff --git a/src/core/operations/ToBase32.mjs b/src/core/operations/ToBase32.mjs index fd36f550..0af7cec5 100644 --- a/src/core/operations/ToBase32.mjs +++ b/src/core/operations/ToBase32.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * To Base32 operation */ class ToBase32 extends Operation { - /** * ToBase32 constructor */ @@ -20,7 +19,8 @@ class ToBase32 extends Operation { this.name = "To Base32"; this.module = "Default"; - this.description = "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7."; + this.description = + "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7."; this.infoURL = "https://wikipedia.org/wiki/Base32"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -28,8 +28,8 @@ class ToBase32 extends Operation { { name: "Alphabet", type: "binaryString", - value: "A-Z2-7=" - } + value: "A-Z2-7=", + }, ]; } @@ -42,10 +42,23 @@ class ToBase32 extends Operation { if (!input) return ""; input = new Uint8Array(input); - const alphabet = args[0] ? Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567="; + const alphabet = args[0] + ? Utils.expandAlphRange(args[0]).join("") + : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567="; let output = "", - chr1, chr2, chr3, chr4, chr5, - enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8, + chr1, + chr2, + chr3, + chr4, + chr5, + enc1, + enc2, + enc3, + enc4, + enc5, + enc6, + enc7, + enc8, i = 0; while (i < input.length) { chr1 = input[i++]; @@ -73,13 +86,18 @@ class ToBase32 extends Operation { enc8 = 32; } - output += alphabet.charAt(enc1) + alphabet.charAt(enc2) + alphabet.charAt(enc3) + - alphabet.charAt(enc4) + alphabet.charAt(enc5) + alphabet.charAt(enc6) + - alphabet.charAt(enc7) + alphabet.charAt(enc8); + output += + alphabet.charAt(enc1) + + alphabet.charAt(enc2) + + alphabet.charAt(enc3) + + alphabet.charAt(enc4) + + alphabet.charAt(enc5) + + alphabet.charAt(enc6) + + alphabet.charAt(enc7) + + alphabet.charAt(enc8); } return output; } - } export default ToBase32; diff --git a/src/core/operations/ToBase45.mjs b/src/core/operations/ToBase45.mjs index a1cd9d2f..ae415dca 100644 --- a/src/core/operations/ToBase45.mjs +++ b/src/core/operations/ToBase45.mjs @@ -4,7 +4,11 @@ * @license Apache-2.0 */ -import {ALPHABET, highlightToBase45, highlightFromBase45} from "../lib/Base45.mjs"; +import { + ALPHABET, + highlightToBase45, + highlightFromBase45, +} from "../lib/Base45.mjs"; import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; @@ -12,7 +16,6 @@ import Utils from "../Utils.mjs"; * To Base45 operation */ class ToBase45 extends Operation { - /** * ToBase45 constructor */ @@ -21,7 +24,8 @@ class ToBase45 extends Operation { this.name = "To Base45"; this.module = "Default"; - this.description = "Base45 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system. Base45 is optimized for usage with QR codes."; + this.description = + "Base45 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system. Base45 is optimized for usage with QR codes."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -29,8 +33,8 @@ class ToBase45 extends Operation { { name: "Alphabet", type: "string", - value: ALPHABET - } + value: ALPHABET, + }, ]; this.highlight = highlightToBase45; @@ -72,11 +76,8 @@ class ToBase45 extends Operation { } } - return res.join(""); - } - } export default ToBase45; diff --git a/src/core/operations/ToBase58.mjs b/src/core/operations/ToBase58.mjs index 5353c40e..abc63a75 100644 --- a/src/core/operations/ToBase58.mjs +++ b/src/core/operations/ToBase58.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {ALPHABET_OPTIONS} from "../lib/Base58.mjs"; +import { ALPHABET_OPTIONS } from "../lib/Base58.mjs"; /** * To Base58 operation */ class ToBase58 extends Operation { - /** * ToBase58 constructor */ @@ -22,16 +21,17 @@ class ToBase58 extends Operation { this.name = "To Base58"; this.module = "Default"; - this.description = "Base58 (similar to Base64) is a notation for encoding arbitrary byte data. It differs from Base64 by removing easily misread characters (i.e. l, I, 0 and O) to improve human readability.

    This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).

    e.g. hello world becomes StV1DL6CwTryKyV

    Base58 is commonly used in cryptocurrencies (Bitcoin, Ripple, etc)."; + this.description = + "Base58 (similar to Base64) is a notation for encoding arbitrary byte data. It differs from Base64 by removing easily misread characters (i.e. l, I, 0 and O) to improve human readability.

    This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).

    e.g. hello world becomes StV1DL6CwTryKyV

    Base58 is commonly used in cryptocurrencies (Bitcoin, Ripple, etc)."; this.infoURL = "https://wikipedia.org/wiki/Base58"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Alphabet", - "type": "editableOption", - "value": ALPHABET_OPTIONS - } + name: "Alphabet", + type: "editableOption", + value: ALPHABET_OPTIONS, + }, ]; } @@ -47,8 +47,7 @@ class ToBase58 extends Operation { alphabet = Utils.expandAlphRange(alphabet).join(""); - if (alphabet.length !== 58 || - [].unique.call(alphabet).length !== 58) { + if (alphabet.length !== 58 || [].unique.call(alphabet).length !== 58) { throw new OperationError("Error: alphabet must be of length 58"); } @@ -59,7 +58,7 @@ class ToBase58 extends Operation { zeroPrefix++; } - input.forEach(function(b) { + input.forEach(function (b) { let carry = (result[0] << 8) + b; result[0] = carry % 58; carry = (carry / 58) | 0; @@ -76,9 +75,12 @@ class ToBase58 extends Operation { } }); - result = result.map(function(b) { - return alphabet[b]; - }).reverse().join(""); + result = result + .map(function (b) { + return alphabet[b]; + }) + .reverse() + .join(""); while (zeroPrefix--) { result = alphabet[0] + result; @@ -86,7 +88,6 @@ class ToBase58 extends Operation { return result; } - } export default ToBase58; diff --git a/src/core/operations/ToBase62.mjs b/src/core/operations/ToBase62.mjs index a00d9275..681e342f 100644 --- a/src/core/operations/ToBase62.mjs +++ b/src/core/operations/ToBase62.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import BigNumber from "bignumber.js"; import Utils from "../Utils.mjs"; -import {toHexFast} from "../lib/Hex.mjs"; +import { toHexFast } from "../lib/Hex.mjs"; /** * To Base62 operation */ class ToBase62 extends Operation { - /** * ToBase62 constructor */ @@ -22,7 +21,8 @@ class ToBase62 extends Operation { this.name = "To Base62"; this.module = "Default"; - this.description = "Base62 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system."; + this.description = + "Base62 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -30,8 +30,8 @@ class ToBase62 extends Operation { { name: "Alphabet", type: "string", - value: "0-9A-Za-z" - } + value: "0-9A-Za-z", + }, ]; } @@ -56,7 +56,6 @@ class ToBase62 extends Operation { return number.toString(62); } - } export default ToBase62; diff --git a/src/core/operations/ToBase64.mjs b/src/core/operations/ToBase64.mjs index 53516a9f..8f6fa4f6 100644 --- a/src/core/operations/ToBase64.mjs +++ b/src/core/operations/ToBase64.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {toBase64, ALPHABET_OPTIONS} from "../lib/Base64.mjs"; +import { toBase64, ALPHABET_OPTIONS } from "../lib/Base64.mjs"; /** * To Base64 operation */ class ToBase64 extends Operation { - /** * ToBase64 constructor */ @@ -20,7 +19,8 @@ class ToBase64 extends Operation { this.name = "To Base64"; this.module = "Default"; - this.description = "Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.

    This operation encodes raw data into an ASCII Base64 string.

    e.g. hello becomes aGVsbG8="; + this.description = + "Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.

    This operation encodes raw data into an ASCII Base64 string.

    e.g. hello becomes aGVsbG8="; this.infoURL = "https://wikipedia.org/wiki/Base64"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -28,8 +28,8 @@ class ToBase64 extends Operation { { name: "Alphabet", type: "editableOption", - value: ALPHABET_OPTIONS - } + value: ALPHABET_OPTIONS, + }, ]; } @@ -53,8 +53,8 @@ class ToBase64 extends Operation { * @returns {Object[]} pos */ highlight(pos, args) { - pos[0].start = Math.floor(pos[0].start / 3 * 4); - pos[0].end = Math.ceil(pos[0].end / 3 * 4); + pos[0].start = Math.floor((pos[0].start / 3) * 4); + pos[0].end = Math.ceil((pos[0].end / 3) * 4); return pos; } @@ -68,8 +68,8 @@ class ToBase64 extends Operation { * @returns {Object[]} pos */ highlightReverse(pos, args) { - pos[0].start = Math.ceil(pos[0].start / 4 * 3); - pos[0].end = Math.floor(pos[0].end / 4 * 3); + pos[0].start = Math.ceil((pos[0].start / 4) * 3); + pos[0].end = Math.floor((pos[0].end / 4) * 3); return pos; } } diff --git a/src/core/operations/ToBase85.mjs b/src/core/operations/ToBase85.mjs index 839ef1e4..9ce5c3c0 100644 --- a/src/core/operations/ToBase85.mjs +++ b/src/core/operations/ToBase85.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import Utils from "../Utils.mjs"; -import {alphabetName, ALPHABET_OPTIONS} from "../lib/Base85.mjs"; +import { alphabetName, ALPHABET_OPTIONS } from "../lib/Base85.mjs"; /** * To Base85 operation */ class ToBase85 extends Operation { - /** * To Base85 constructor */ @@ -22,7 +21,8 @@ class ToBase85 extends Operation { this.name = "To Base85"; this.module = "Default"; - this.description = "Base85 (also called Ascii85) is a notation for encoding arbitrary byte data. It is usually more efficient that Base64.

    This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).

    e.g. hello world becomes BOu!rD]j7BEbo7

    Base85 is commonly used in Adobe's PostScript and PDF file formats.

    Options
    Alphabet
    • Standard - The standard alphabet, referred to as Ascii85
    • Z85 (ZeroMQ) - A string-safe variant of Base85, which avoids quote marks and backslash characters
    • IPv6 - A variant of Base85 suitable for encoding IPv6 addresses (RFC 1924)
    Include delimiter
    Adds a '<~' and '~>' delimiter to the start and end of the data. This is standard for Adobe's implementation of Base85."; + this.description = + "Base85 (also called Ascii85) is a notation for encoding arbitrary byte data. It is usually more efficient that Base64.

    This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).

    e.g. hello world becomes BOu!rD]j7BEbo7

    Base85 is commonly used in Adobe's PostScript and PDF file formats.

    Options
    Alphabet
    • Standard - The standard alphabet, referred to as Ascii85
    • Z85 (ZeroMQ) - A string-safe variant of Base85, which avoids quote marks and backslash characters
    • IPv6 - A variant of Base85 suitable for encoding IPv6 addresses (RFC 1924)
    Include delimiter
    Adds a '<~' and '~>' delimiter to the start and end of the data. This is standard for Adobe's implementation of Base85."; this.infoURL = "https://wikipedia.org/wiki/Ascii85"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -30,13 +30,13 @@ class ToBase85 extends Operation { { name: "Alphabet", type: "editableOption", - value: ALPHABET_OPTIONS + value: ALPHABET_OPTIONS, }, { name: "Include delimeter", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -44,7 +44,7 @@ class ToBase85 extends Operation { * @param {ArrayBuffer} input * @param {Object[]} args * @returns {string} - */ + */ run(input, args) { input = new Uint8Array(input); const alphabet = Utils.expandAlphRange(args[0]).join(""), @@ -52,8 +52,7 @@ class ToBase85 extends Operation { includeDelim = args[1]; let result = ""; - if (alphabet.length !== 85 || - [].unique.call(alphabet).length !== 85) { + if (alphabet.length !== 85 || [].unique.call(alphabet).length !== 85) { throw new OperationError("Error: Alphabet must be of length 85"); } @@ -61,12 +60,12 @@ class ToBase85 extends Operation { let block; for (let i = 0; i < input.length; i += 4) { - block = ( - ((input[i]) << 24) + - ((input[i + 1] || 0) << 16) + - ((input[i + 2] || 0) << 8) + - ((input[i + 3] || 0)) - ) >>> 0; + block = + ((input[i] << 24) + + ((input[i + 1] || 0) << 16) + + ((input[i + 2] || 0) << 8) + + (input[i + 3] || 0)) >>> + 0; if (encoding !== "Standard" || block > 0) { let digits = []; @@ -81,9 +80,9 @@ class ToBase85 extends Operation { digits.splice(input.length - (i + 4), 4); } - result += digits.map(digit => alphabet[digit]).join(""); + result += digits.map((digit) => alphabet[digit]).join(""); } else { - result += (encoding === "Standard") ? "z" : null; + result += encoding === "Standard" ? "z" : null; } } diff --git a/src/core/operations/ToBase92.mjs b/src/core/operations/ToBase92.mjs index bca8e872..90541a9d 100644 --- a/src/core/operations/ToBase92.mjs +++ b/src/core/operations/ToBase92.mjs @@ -19,7 +19,8 @@ class ToBase92 extends Operation { this.name = "To Base92"; this.module = "Default"; - this.description = "Base92 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers."; + this.description = + "Base92 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers."; this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems"; this.inputType = "string"; this.outputType = "byteArray"; @@ -36,11 +37,13 @@ class ToBase92 extends Operation { while (input.length > 0) { while (bitString.length < 13 && input.length > 0) { - bitString += input[0].charCodeAt(0).toString(2).padStart(8, "0"); + bitString += input[0] + .charCodeAt(0) + .toString(2) + .padStart(8, "0"); input = input.slice(1); } - if (bitString.length < 13) - break; + if (bitString.length < 13) break; const i = parseInt(bitString.slice(0, 13), 2); res.push(base92Chr(Math.floor(i / 91))); res.push(base92Chr(i % 91)); @@ -60,7 +63,6 @@ class ToBase92 extends Operation { } return res; - } } diff --git a/src/core/operations/ToBinary.mjs b/src/core/operations/ToBinary.mjs index ba72a55b..3d44ed0f 100644 --- a/src/core/operations/ToBinary.mjs +++ b/src/core/operations/ToBinary.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {BIN_DELIM_OPTIONS} from "../lib/Delim.mjs"; -import {toBinary} from "../lib/Binary.mjs"; +import { BIN_DELIM_OPTIONS } from "../lib/Delim.mjs"; +import { toBinary } from "../lib/Binary.mjs"; /** * To Binary operation */ class ToBinary extends Operation { - /** * ToBinary constructor */ @@ -22,21 +21,22 @@ class ToBinary extends Operation { this.name = "To Binary"; this.module = "Default"; - this.description = "Displays the input data as a binary string.

    e.g. Hi becomes 01001000 01101001"; + this.description = + "Displays the input data as a binary string.

    e.g. Hi becomes 01001000 01101001"; this.infoURL = "https://wikipedia.org/wiki/Binary_code"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": BIN_DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: BIN_DELIM_OPTIONS, }, { - "name": "Byte Length", - "type": "number", - "value": 8 - } + name: "Byte Length", + type: "number", + value: 8, + }, ]; } @@ -78,11 +78,14 @@ class ToBinary extends Operation { */ highlightReverse(pos, args) { const delim = Utils.charRep(args[0] || "Space"); - pos[0].start = pos[0].start === 0 ? 0 : Math.floor(pos[0].start / (8 + delim.length)); - pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / (8 + delim.length)); + pos[0].start = + pos[0].start === 0 + ? 0 + : Math.floor(pos[0].start / (8 + delim.length)); + pos[0].end = + pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / (8 + delim.length)); return pos; } - } export default ToBinary; diff --git a/src/core/operations/ToBraille.mjs b/src/core/operations/ToBraille.mjs index fcf13de2..47c3dfbf 100644 --- a/src/core/operations/ToBraille.mjs +++ b/src/core/operations/ToBraille.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {BRAILLE_LOOKUP} from "../lib/Braille.mjs"; +import { BRAILLE_LOOKUP } from "../lib/Braille.mjs"; /** * To Braille operation */ class ToBraille extends Operation { - /** * ToBraille constructor */ @@ -33,10 +32,13 @@ class ToBraille extends Operation { * @returns {string} */ run(input, args) { - return input.split("").map(c => { - const idx = BRAILLE_LOOKUP.ascii.indexOf(c.toUpperCase()); - return idx < 0 ? c : BRAILLE_LOOKUP.dot6[idx]; - }).join(""); + return input + .split("") + .map((c) => { + const idx = BRAILLE_LOOKUP.ascii.indexOf(c.toUpperCase()); + return idx < 0 ? c : BRAILLE_LOOKUP.dot6[idx]; + }) + .join(""); } /** @@ -64,7 +66,6 @@ class ToBraille extends Operation { highlightReverse(pos, args) { return pos; } - } export default ToBraille; diff --git a/src/core/operations/ToCamelCase.mjs b/src/core/operations/ToCamelCase.mjs index 8d7c5445..1ed00489 100644 --- a/src/core/operations/ToCamelCase.mjs +++ b/src/core/operations/ToCamelCase.mjs @@ -12,7 +12,6 @@ import { replaceVariableNames } from "../lib/Code.mjs"; * To Camel case operation */ class ToCamelCase extends Operation { - /** * ToCamelCase constructor */ @@ -21,16 +20,17 @@ class ToCamelCase extends Operation { this.name = "To Camel case"; this.module = "Code"; - this.description = "Converts the input string to camel case.\n

    \nCamel case is all lower case except letters after word boundaries which are uppercase.\n

    \ne.g. thisIsCamelCase\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; + this.description = + "Converts the input string to camel case.\n

    \nCamel case is all lower case except letters after word boundaries which are uppercase.\n

    \ne.g. thisIsCamelCase\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; this.infoURL = "https://wikipedia.org/wiki/Camel_case"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Attempt to be context aware", - "type": "boolean", - "value": false - } + name: "Attempt to be context aware", + type: "boolean", + value: false, + }, ]; } @@ -48,7 +48,6 @@ class ToCamelCase extends Operation { return camelCase(input); } } - } export default ToCamelCase; diff --git a/src/core/operations/ToCaseInsensitiveRegex.mjs b/src/core/operations/ToCaseInsensitiveRegex.mjs index 77b14172..a31517c3 100644 --- a/src/core/operations/ToCaseInsensitiveRegex.mjs +++ b/src/core/operations/ToCaseInsensitiveRegex.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * To Case Insensitive Regex operation */ class ToCaseInsensitiveRegex extends Operation { - /** * ToCaseInsensitiveRegex constructor */ @@ -21,7 +20,8 @@ class ToCaseInsensitiveRegex extends Operation { this.name = "To Case Insensitive Regex"; this.module = "Default"; - this.description = "Converts a case-sensitive regex string into a case-insensitive regex string in case the i flag is unavailable to you.

    e.g. Mozilla/[0-9].[0-9] .* becomes [mM][oO][zZ][iI][lL][lL][aA]/[0-9].[0-9] .*"; + this.description = + "Converts a case-sensitive regex string into a case-insensitive regex string in case the i flag is unavailable to you.

    e.g. Mozilla/[0-9].[0-9] .* becomes [mM][oO][zZ][iI][lL][lL][aA]/[0-9].[0-9] .*"; this.infoURL = "https://wikipedia.org/wiki/Regular_expression"; this.inputType = "string"; this.outputType = "string"; @@ -34,7 +34,6 @@ class ToCaseInsensitiveRegex extends Operation { * @returns {string} */ run(input, args) { - /** * Simulates look behind behaviour since javascript doesn't support it. * @@ -45,10 +44,14 @@ class ToCaseInsensitiveRegex extends Operation { let result = ""; for (let i = 0; i < input.length; i++) { const temp = input.charAt(i); - if (temp.match(/[a-zA-Z]/g) && (input.charAt(i-1) !== "-") && (input.charAt(i+1) !== "-")) - result += "[" + temp.toLowerCase() + temp.toUpperCase() + "]"; - else - result += temp; + if ( + temp.match(/[a-zA-Z]/g) && + input.charAt(i - 1) !== "-" && + input.charAt(i + 1) !== "-" + ) + result += + "[" + temp.toLowerCase() + temp.toUpperCase() + "]"; + else result += temp; } return result; } @@ -56,39 +59,61 @@ class ToCaseInsensitiveRegex extends Operation { try { RegExp(input); } catch (error) { - throw new OperationError("Invalid Regular Expression (Please note this version of node does not support look behinds)."); + throw new OperationError( + "Invalid Regular Expression (Please note this version of node does not support look behinds).", + ); } // Example: [test] -> [[tT][eE][sS][tT]] - return preProcess(input) + return ( + preProcess(input) - // Example: [A-Z] -> [A-Za-z] - .replace(/([A-Z]-[A-Z]|[a-z]-[a-z])/g, m => `${m[0].toUpperCase()}-${m[2].toUpperCase()}${m[0].toLowerCase()}-${m[2].toLowerCase()}`) + // Example: [A-Z] -> [A-Za-z] + .replace( + /([A-Z]-[A-Z]|[a-z]-[a-z])/g, + (m) => + `${m[0].toUpperCase()}-${m[2].toUpperCase()}${m[0].toLowerCase()}-${m[2].toLowerCase()}`, + ) - // Example: [H-d] -> [A-DH-dh-z] - .replace(/[A-Z]-[a-z]/g, m => `A-${m[2].toUpperCase()}${m}${m[0].toLowerCase()}-z`) + // Example: [H-d] -> [A-DH-dh-z] + .replace( + /[A-Z]-[a-z]/g, + (m) => `A-${m[2].toUpperCase()}${m}${m[0].toLowerCase()}-z`, + ) - // Example: [!-D] -> [!-Da-d] - .replace(/\\?[ -@]-[A-Z]/g, m => `${m}a-${m[2].toLowerCase()}`) + // Example: [!-D] -> [!-Da-d] + .replace( + /\\?[ -@]-[A-Z]/g, + (m) => `${m}a-${m[2].toLowerCase()}`, + ) - // Example: [%-^] -> [%-^a-z] - .replace(/\\?[ -@]-\\?[[-`]/g, m => `${m}a-z`) + // Example: [%-^] -> [%-^a-z] + .replace(/\\?[ -@]-\\?[[-`]/g, (m) => `${m}a-z`) - // Example: [K-`] -> [K-`k-z] - .replace(/[A-Z]-\\?[[-`]/g, m => `${m}${m[0].toLowerCase()}-z`) + // Example: [K-`] -> [K-`k-z] + .replace( + /[A-Z]-\\?[[-`]/g, + (m) => `${m}${m[0].toLowerCase()}-z`, + ) - // Example: [[-}] -> [[-}A-Z] - .replace(/\\?[[-`]-\\?[{-~]/g, m => `${m}A-Z`) + // Example: [[-}] -> [[-}A-Z] + .replace(/\\?[[-`]-\\?[{-~]/g, (m) => `${m}A-Z`) - // Example: [b-}] -> [b-}B-Z] - .replace(/[a-z]-\\?[{-~]/g, m => `${m}${m[0].toUpperCase()}-Z`) + // Example: [b-}] -> [b-}B-Z] + .replace( + /[a-z]-\\?[{-~]/g, + (m) => `${m}${m[0].toUpperCase()}-Z`, + ) - // Example: [<-j] -> [<-z] - .replace(/\\?[ -@]-[a-z]/g, m => `${m[0]}-z`) - - // Example: [^-j] -> [A-J^-j] - .replace(/\\?[[-`]-[a-z]/g, m => `A-${m[2].toUpperCase()}${m}`); + // Example: [<-j] -> [<-z] + .replace(/\\?[ -@]-[a-z]/g, (m) => `${m[0]}-z`) + // Example: [^-j] -> [A-J^-j] + .replace( + /\\?[[-`]-[a-z]/g, + (m) => `A-${m[2].toUpperCase()}${m}`, + ) + ); } } diff --git a/src/core/operations/ToCharcode.mjs b/src/core/operations/ToCharcode.mjs index a4806115..f060d477 100644 --- a/src/core/operations/ToCharcode.mjs +++ b/src/core/operations/ToCharcode.mjs @@ -14,7 +14,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * To Charcode operation */ class ToCharcode extends Operation { - /** * ToCharcode constructor */ @@ -23,21 +22,22 @@ class ToCharcode extends Operation { this.name = "To Charcode"; this.module = "Default"; - this.description = "Converts text to its unicode character code equivalent.

    e.g. Γειά σου becomes 0393 03b5 03b9 03ac 20 03c3 03bf 03c5"; + this.description = + "Converts text to its unicode character code equivalent.

    e.g. Γειά σου becomes 0393 03b5 03b9 03ac 20 03c3 03bf 03c5"; this.infoURL = "https://wikipedia.org/wiki/Plane_(Unicode)"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: DELIM_OPTIONS, }, { - "name": "Base", - "type": "number", - "value": 16 - } + name: "Base", + type: "number", + value: 16, + }, ]; } @@ -56,7 +56,9 @@ class ToCharcode extends Operation { ordinal; if (base < 2 || base > 36) { - throw new OperationError("Error: Base argument must be between 2 and 36"); + throw new OperationError( + "Error: Base argument must be between 2 and 36", + ); } const charcode = Utils.strToCharcode(input); @@ -70,18 +72,19 @@ class ToCharcode extends Operation { else if (ordinal < 4294967296) padding = 8; else padding = 2; - if (padding > 2 && isWorkerEnvironment()) self.setOption("attemptHighlight", false); + if (padding > 2 && isWorkerEnvironment()) + self.setOption("attemptHighlight", false); output += Utils.hex(ordinal, padding) + delim; } else { - if (isWorkerEnvironment()) self.setOption("attemptHighlight", false); + if (isWorkerEnvironment()) + self.setOption("attemptHighlight", false); output += ordinal.toString(base) + delim; } } return output.slice(0, -delim.length); } - } export default ToCharcode; diff --git a/src/core/operations/ToDecimal.mjs b/src/core/operations/ToDecimal.mjs index 65798a7c..b95cfc71 100644 --- a/src/core/operations/ToDecimal.mjs +++ b/src/core/operations/ToDecimal.mjs @@ -6,14 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; - +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * To Decimal operation */ class ToDecimal extends Operation { - /** * ToDecimal constructor */ @@ -22,20 +20,21 @@ class ToDecimal extends Operation { this.name = "To Decimal"; this.module = "Default"; - this.description = "Converts the input data to an ordinal integer array.

    e.g. Hello becomes 72 101 108 108 111"; + this.description = + "Converts the input data to an ordinal integer array.

    e.g. Hello becomes 72 101 108 108 111"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": DELIM_OPTIONS + name: "Delimiter", + type: "option", + value: DELIM_OPTIONS, }, { - "name": "Support signed values", - "type": "boolean", - "value": false - } + name: "Support signed values", + type: "boolean", + value: false, + }, ]; } @@ -49,11 +48,10 @@ class ToDecimal extends Operation { const delim = Utils.charRep(args[0]), signed = args[1]; if (signed) { - input = input.map(v => v > 0x7F ? v - 0xFF - 1 : v); + input = input.map((v) => (v > 0x7f ? v - 0xff - 1 : v)); } return input.join(delim); } - } export default ToDecimal; diff --git a/src/core/operations/ToHTMLEntity.mjs b/src/core/operations/ToHTMLEntity.mjs index f2a57a43..aa9202fe 100644 --- a/src/core/operations/ToHTMLEntity.mjs +++ b/src/core/operations/ToHTMLEntity.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * To HTML Entity operation */ class ToHTMLEntity extends Operation { - /** * ToHTMLEntity constructor */ @@ -20,21 +19,23 @@ class ToHTMLEntity extends Operation { this.name = "To HTML Entity"; this.module = "Encodings"; - this.description = "Converts characters to HTML entities

    e.g. & becomes &amp;"; - this.infoURL = "https://wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references"; + this.description = + "Converts characters to HTML entities

    e.g. & becomes &amp;"; + this.infoURL = + "https://wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Convert all characters", - "type": "boolean", - "value": false + name: "Convert all characters", + type: "boolean", + value: false, }, { - "name": "Convert to", - "type": "option", - "value": ["Named entities", "Numeric entities", "Hex entities"] - } + name: "Convert to", + type: "option", + value: ["Named entities", "Numeric entities", "Hex entities"], + }, ]; } @@ -57,7 +58,8 @@ class ToHTMLEntity extends Operation { } else if (convertAll && hexa) { output += "&#x" + Utils.hex(charcodes[i]) + ";"; } else if (convertAll) { - output += byteToEntity[charcodes[i]] || "&#" + charcodes[i] + ";"; + output += + byteToEntity[charcodes[i]] || "&#" + charcodes[i] + ";"; } else if (numeric) { if (charcodes[i] > 255 || charcodes[i] in byteToEntity) { output += "&#" + charcodes[i] + ";"; @@ -71,16 +73,15 @@ class ToHTMLEntity extends Operation { output += Utils.chr(charcodes[i]); } } else { - output += byteToEntity[charcodes[i]] || ( - charcodes[i] > 255 ? - "&#" + charcodes[i] + ";" : - Utils.chr(charcodes[i]) - ); + output += + byteToEntity[charcodes[i]] || + (charcodes[i] > 255 + ? "&#" + charcodes[i] + ";" + : Utils.chr(charcodes[i])); } } return output; } - } /** @@ -1506,7 +1507,7 @@ const byteToEntity = { 120168: "𝕨", 120169: "𝕩", 120170: "𝕪", - 120171: "𝕫" + 120171: "𝕫", }; export default ToHTMLEntity; diff --git a/src/core/operations/ToHex.mjs b/src/core/operations/ToHex.mjs index 092155a9..034616ee 100644 --- a/src/core/operations/ToHex.mjs +++ b/src/core/operations/ToHex.mjs @@ -5,14 +5,13 @@ */ import Operation from "../Operation.mjs"; -import {toHex, TO_HEX_DELIM_OPTIONS} from "../lib/Hex.mjs"; +import { toHex, TO_HEX_DELIM_OPTIONS } from "../lib/Hex.mjs"; import Utils from "../Utils.mjs"; /** * To Hex operation */ class ToHex extends Operation { - /** * ToHex constructor */ @@ -21,7 +20,8 @@ class ToHex extends Operation { this.name = "To Hex"; this.module = "Default"; - this.description = "Converts the input string to hexadecimal bytes separated by the specified delimiter.

    e.g. The UTF-8 encoded string Γειά σου becomes ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a"; + this.description = + "Converts the input string to hexadecimal bytes separated by the specified delimiter.

    e.g. The UTF-8 encoded string Γειά σου becomes ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a"; this.infoURL = "https://wikipedia.org/wiki/Hexadecimal"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -29,13 +29,13 @@ class ToHex extends Operation { { name: "Delimiter", type: "option", - value: TO_HEX_DELIM_OPTIONS + value: TO_HEX_DELIM_OPTIONS, }, { name: "Bytes per line", type: "number", - value: 0 - } + value: 0, + }, ]; } @@ -67,7 +67,8 @@ class ToHex extends Operation { * @returns {Object[]} pos */ highlight(pos, args) { - let delim, commaLen = 0; + let delim, + commaLen = 0; if (args[0] === "0x with comma") { delim = "0x"; commaLen = 1; @@ -78,9 +79,9 @@ class ToHex extends Operation { const lineSize = args[1], len = delim.length + commaLen; - const countLF = function(p) { + const countLF = function (p) { // Count the number of LFs from 0 upto p - return (p / lineSize | 0) - (p >= lineSize && p % lineSize === 0); + return ((p / lineSize) | 0) - (p >= lineSize && p % lineSize === 0); }; pos[0].start = pos[0].start * (2 + len) + countLF(pos[0].start); @@ -105,7 +106,8 @@ class ToHex extends Operation { * @returns {Object[]} pos */ highlightReverse(pos, args) { - let delim, commaLen = 0; + let delim, + commaLen = 0; if (args[0] === "0x with comma") { delim = "0x"; commaLen = 1; @@ -117,14 +119,23 @@ class ToHex extends Operation { len = delim.length + commaLen, width = len + 2; - const countLF = function(p) { + const countLF = function (p) { // Count the number of LFs from 0 up to p const lineLength = width * lineSize; - return (p / lineLength | 0) - (p >= lineLength && p % lineLength === 0); + return ( + ((p / lineLength) | 0) - + (p >= lineLength && p % lineLength === 0) + ); }; - pos[0].start = pos[0].start === 0 ? 0 : Math.round((pos[0].start - countLF(pos[0].start)) / width); - pos[0].end = pos[0].end === 0 ? 0 : Math.ceil((pos[0].end - countLF(pos[0].end)) / width); + pos[0].start = + pos[0].start === 0 + ? 0 + : Math.round((pos[0].start - countLF(pos[0].start)) / width); + pos[0].end = + pos[0].end === 0 + ? 0 + : Math.ceil((pos[0].end - countLF(pos[0].end)) / width); return pos; } } diff --git a/src/core/operations/ToHexContent.mjs b/src/core/operations/ToHexContent.mjs index 9af09f24..b0549189 100644 --- a/src/core/operations/ToHexContent.mjs +++ b/src/core/operations/ToHexContent.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {toHex} from "../lib/Hex.mjs"; +import { toHex } from "../lib/Hex.mjs"; /** * To Hex Content operation */ class ToHexContent extends Operation { - /** * ToHexContent constructor */ @@ -21,21 +20,27 @@ class ToHexContent extends Operation { this.name = "To Hex Content"; this.module = "Default"; - this.description = "Converts special characters in a string to hexadecimal. This format is used by SNORT for representing hex within ASCII text.

    e.g. foo=bar becomes foo|3d|bar."; - this.infoURL = "http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node32.html#SECTION00451000000000000000"; + this.description = + "Converts special characters in a string to hexadecimal. This format is used by SNORT for representing hex within ASCII text.

    e.g. foo=bar becomes foo|3d|bar."; + this.infoURL = + "http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node32.html#SECTION00451000000000000000"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Convert", - "type": "option", - "value": ["Only special chars", "Only special chars including spaces", "All chars"] + name: "Convert", + type: "option", + value: [ + "Only special chars", + "Only special chars including spaces", + "All chars", + ], }, { - "name": "Print spaces between bytes", - "type": "boolean", - "value": false - } + name: "Print spaces between bytes", + type: "boolean", + value: false, + }, ]; } @@ -60,7 +65,13 @@ class ToHexContent extends Operation { const convertSpaces = convert === "Only special chars including spaces"; for (let i = 0; i < input.length; i++) { b = input[i]; - if ((b === 32 && convertSpaces) || (b < 48 && b !== 32) || (b > 57 && b < 65) || (b > 90 && b < 97) || b > 122) { + if ( + (b === 32 && convertSpaces) || + (b < 48 && b !== 32) || + (b > 57 && b < 65) || + (b > 90 && b < 97) || + b > 122 + ) { if (!inHex) { output += "|"; inHex = true; @@ -77,7 +88,6 @@ class ToHexContent extends Operation { if (inHex) output += "|"; return output; } - } export default ToHexContent; diff --git a/src/core/operations/ToHexdump.mjs b/src/core/operations/ToHexdump.mjs index a52b0451..4f596737 100644 --- a/src/core/operations/ToHexdump.mjs +++ b/src/core/operations/ToHexdump.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * To Hexdump operation */ class ToHexdump extends Operation { - /** * ToHexdump constructor */ @@ -21,32 +20,33 @@ class ToHexdump extends Operation { this.name = "To Hexdump"; this.module = "Default"; - this.description = "Creates a hexdump of the input data, displaying both the hexadecimal values of each byte and an ASCII representation alongside.

    The 'UNIX format' argument defines which subset of printable characters are displayed in the preview column."; + this.description = + "Creates a hexdump of the input data, displaying both the hexadecimal values of each byte and an ASCII representation alongside.

    The 'UNIX format' argument defines which subset of printable characters are displayed in the preview column."; this.infoURL = "https://wikipedia.org/wiki/Hex_dump"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Width", - "type": "number", - "value": 16, - "min": 1 + name: "Width", + type: "number", + value: 16, + min: 1, }, { - "name": "Upper case hex", - "type": "boolean", - "value": false + name: "Upper case hex", + type: "boolean", + value: false, }, { - "name": "Include final length", - "type": "boolean", - "value": false + name: "Include final length", + type: "boolean", + value: false, }, { - "name": "UNIX format", - "type": "boolean", - "value": false - } + name: "UNIX format", + type: "boolean", + value: false, + }, ]; } @@ -67,12 +67,16 @@ class ToHexdump extends Operation { for (let i = 0; i < data.length; i += length) { let lineNo = Utils.hex(i, 8); - const buff = data.slice(i, i+length); + const buff = data.slice(i, i + length); const hex = []; - buff.forEach(b => hex.push(Utils.hex(b, padding))); - let hexStr = hex.join(" ").padEnd(length*(padding+1), " "); + buff.forEach((b) => hex.push(Utils.hex(b, padding))); + let hexStr = hex.join(" ").padEnd(length * (padding + 1), " "); - const ascii = Utils.printable(Utils.byteArrayToChars(buff), false, unixFormat); + const ascii = Utils.printable( + Utils.byteArrayToChars(buff), + false, + unixFormat, + ); const asciiStr = ascii.padEnd(buff.length, " "); if (upperCase) { @@ -82,9 +86,8 @@ class ToHexdump extends Operation { lines.push(`${lineNo} ${hexStr} |${asciiStr}|`); - - if (includeFinalLength && i+buff.length === data.length) { - lines.push(Utils.hex(i+buff.length, 8)); + if (includeFinalLength && i + buff.length === data.length) { + lines.push(Utils.hex(i + buff.length, 8)); } } @@ -103,13 +106,13 @@ class ToHexdump extends Operation { highlight(pos, args) { // Calculate overall selection const w = args[0] || 16, - width = 14 + (w*4); + width = 14 + w * 4; let line = Math.floor(pos[0].start / w), offset = pos[0].start % w, start = 0, end = 0; - pos[0].start = line*width + 10 + offset*3; + pos[0].start = line * width + 10 + offset * 3; line = Math.floor(pos[0].end / w); offset = pos[0].end % w; @@ -117,7 +120,7 @@ class ToHexdump extends Operation { line--; offset = w; } - pos[0].end = line*width + 10 + offset*3 - 1; + pos[0].end = line * width + 10 + offset * 3 - 1; // Set up multiple selections for bytes let startLineNum = Math.floor(pos[0].start / width); @@ -127,12 +130,12 @@ class ToHexdump extends Operation { pos.push(pos[0]); } else { start = pos[0].start; - end = (startLineNum+1) * width - w - 5; + end = (startLineNum + 1) * width - w - 5; pos.push({ start: start, end: end }); while (end < pos[0].end) { startLineNum++; start = startLineNum * width + 10; - end = (startLineNum+1) * width - w - 5; + end = (startLineNum + 1) * width - w - 5; if (end > pos[0].end) end = pos[0].end; pos.push({ start: start, end: end }); } @@ -145,8 +148,14 @@ class ToHexdump extends Operation { end = 0; for (let i = 1; i < len; i++) { lineNum = Math.floor(pos[i].start / width); - start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); - end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); + start = + (pos[i].start - lineNum * width - 10) / 3 + + (width - w - 2) + + lineNum * width; + end = + (pos[i].end + 1 - lineNum * width - 10) / 3 + + (width - w - 2) + + lineNum * width; pos.push({ start: start, end: end }); } return pos; @@ -163,33 +172,38 @@ class ToHexdump extends Operation { */ highlightReverse(pos, args) { const w = args[0] || 16; - const width = 14 + (w*4); + const width = 14 + w * 4; let line = Math.floor(pos[0].start / width); let offset = pos[0].start % width; - if (offset < 10) { // In line number section - pos[0].start = line*w; - } else if (offset > 10+(w*3)) { // In ASCII section - pos[0].start = (line+1)*w; - } else { // In byte section - pos[0].start = line*w + Math.floor((offset-10)/3); + if (offset < 10) { + // In line number section + pos[0].start = line * w; + } else if (offset > 10 + w * 3) { + // In ASCII section + pos[0].start = (line + 1) * w; + } else { + // In byte section + pos[0].start = line * w + Math.floor((offset - 10) / 3); } line = Math.floor(pos[0].end / width); offset = pos[0].end % width; - if (offset < 10) { // In line number section - pos[0].end = line*w; - } else if (offset > 10+(w*3)) { // In ASCII section - pos[0].end = (line+1)*w; - } else { // In byte section - pos[0].end = line*w + Math.ceil((offset-10)/3); + if (offset < 10) { + // In line number section + pos[0].end = line * w; + } else if (offset > 10 + w * 3) { + // In ASCII section + pos[0].end = (line + 1) * w; + } else { + // In byte section + pos[0].end = line * w + Math.ceil((offset - 10) / 3); } return pos; } - } export default ToHexdump; diff --git a/src/core/operations/ToKebabCase.mjs b/src/core/operations/ToKebabCase.mjs index 27a8ecac..148e524f 100644 --- a/src/core/operations/ToKebabCase.mjs +++ b/src/core/operations/ToKebabCase.mjs @@ -12,7 +12,6 @@ import { replaceVariableNames } from "../lib/Code.mjs"; * To Kebab case operation */ class ToKebabCase extends Operation { - /** * ToKebabCase constructor */ @@ -21,16 +20,17 @@ class ToKebabCase extends Operation { this.name = "To Kebab case"; this.module = "Code"; - this.description = "Converts the input string to kebab case.\n

    \nKebab case is all lower case with dashes as word boundaries.\n

    \ne.g. this-is-kebab-case\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; + this.description = + "Converts the input string to kebab case.\n

    \nKebab case is all lower case with dashes as word boundaries.\n

    \ne.g. this-is-kebab-case\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; this.infoURL = "https://wikipedia.org/wiki/Kebab_case"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Attempt to be context aware", - "type": "boolean", - "value": false - } + name: "Attempt to be context aware", + type: "boolean", + value: false, + }, ]; } @@ -48,7 +48,6 @@ class ToKebabCase extends Operation { return kebabCase(input); } } - } export default ToKebabCase; diff --git a/src/core/operations/ToLowerCase.mjs b/src/core/operations/ToLowerCase.mjs index 82a99a48..0935864d 100644 --- a/src/core/operations/ToLowerCase.mjs +++ b/src/core/operations/ToLowerCase.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * To Lower case operation */ class ToLowerCase extends Operation { - /** * ToLowerCase constructor */ @@ -19,7 +18,8 @@ class ToLowerCase extends Operation { this.name = "To Lower case"; this.module = "Default"; - this.description = "Converts every character in the input to lower case."; + this.description = + "Converts every character in the input to lower case."; this.inputType = "string"; this.outputType = "string"; this.args = []; @@ -59,7 +59,6 @@ class ToLowerCase extends Operation { highlightReverse(pos, args) { return pos; } - } export default ToLowerCase; diff --git a/src/core/operations/ToMessagePack.mjs b/src/core/operations/ToMessagePack.mjs index b56e408d..2cc7c6ae 100644 --- a/src/core/operations/ToMessagePack.mjs +++ b/src/core/operations/ToMessagePack.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * To MessagePack operation */ class ToMessagePack extends Operation { - /** * ToMessagePack constructor */ @@ -22,7 +21,8 @@ class ToMessagePack extends Operation { this.name = "To MessagePack"; this.module = "Code"; - this.description = "Converts JSON to MessagePack encoded byte buffer. MessagePack is a computer data interchange format. It is a binary form for representing simple data structures like arrays and associative arrays."; + this.description = + "Converts JSON to MessagePack encoded byte buffer. MessagePack is a computer data interchange format. It is a binary form for representing simple data structures like arrays and associative arrays."; this.infoURL = "https://wikipedia.org/wiki/MessagePack"; this.inputType = "JSON"; this.outputType = "ArrayBuffer"; @@ -41,13 +41,14 @@ class ToMessagePack extends Operation { } else { const res = notepack.encode(input); // Safely convert from Node Buffer to ArrayBuffer using the correct view of the data - return (new Uint8Array(res)).buffer; + return new Uint8Array(res).buffer; } } catch (err) { - throw new OperationError(`Could not encode JSON to MessagePack: ${err}`); + throw new OperationError( + `Could not encode JSON to MessagePack: ${err}`, + ); } } - } export default ToMessagePack; diff --git a/src/core/operations/ToMorseCode.mjs b/src/core/operations/ToMorseCode.mjs index ce3c6b5c..a88c9a25 100644 --- a/src/core/operations/ToMorseCode.mjs +++ b/src/core/operations/ToMorseCode.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {LETTER_DELIM_OPTIONS, WORD_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { LETTER_DELIM_OPTIONS, WORD_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * To Morse Code operation */ class ToMorseCode extends Operation { - /** * ToMorseCode constructor */ @@ -21,26 +20,27 @@ class ToMorseCode extends Operation { this.name = "To Morse Code"; this.module = "Default"; - this.description = "Translates alphanumeric characters into International Morse Code.

    Ignores non-Morse characters.

    e.g. SOS becomes ... --- ..."; + this.description = + "Translates alphanumeric characters into International Morse Code.

    Ignores non-Morse characters.

    e.g. SOS becomes ... --- ..."; this.infoURL = "https://wikipedia.org/wiki/Morse_code"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Format options", - "type": "option", - "value": ["-/.", "_/.", "Dash/Dot", "DASH/DOT", "dash/dot"] + name: "Format options", + type: "option", + value: ["-/.", "_/.", "Dash/Dot", "DASH/DOT", "dash/dot"], }, { - "name": "Letter delimiter", - "type": "option", - "value": LETTER_DELIM_OPTIONS + name: "Letter delimiter", + type: "option", + value: LETTER_DELIM_OPTIONS, }, { - "name": "Word delimiter", - "type": "option", - "value": WORD_DELIM_OPTIONS - } + name: "Word delimiter", + type: "option", + value: WORD_DELIM_OPTIONS, + }, ]; } @@ -58,17 +58,20 @@ class ToMorseCode extends Operation { const wordDelim = Utils.charRep(args[2]); input = input.split(/\r?\n/); - input = Array.prototype.map.call(input, function(line) { + input = Array.prototype.map.call(input, function (line) { let words = line.split(/ +/); - words = Array.prototype.map.call(words, function(word) { - const letters = Array.prototype.map.call(word, function(character) { - const letter = character.toUpperCase(); - if (typeof MORSE_TABLE[letter] == "undefined") { - return ""; - } + words = Array.prototype.map.call(words, function (word) { + const letters = Array.prototype.map.call( + word, + function (character) { + const letter = character.toUpperCase(); + if (typeof MORSE_TABLE[letter] == "undefined") { + return ""; + } - return MORSE_TABLE[letter]; - }); + return MORSE_TABLE[letter]; + }, + ); return letters.join(""); }); @@ -77,60 +80,60 @@ class ToMorseCode extends Operation { }); input = input.join("\n"); - input = input.replace( - /|||/g, - function(match) { - switch (match) { - case "": return dash; - case "": return dot; - case "": return letterDelim; - case "": return wordDelim; - } + input = input.replace(/|||/g, function (match) { + switch (match) { + case "": + return dash; + case "": + return dot; + case "": + return letterDelim; + case "": + return wordDelim; } - ); + }); return input; } - } const MORSE_TABLE = { - "A": "", - "B": "", - "C": "", - "D": "", - "E": "", - "F": "", - "G": "", - "H": "", - "I": "", - "J": "", - "K": "", - "L": "", - "M": "", - "N": "", - "O": "", - "P": "", - "Q": "", - "R": "", - "S": "", - "T": "", - "U": "", - "V": "", - "W": "", - "X": "", - "Y": "", - "Z": "", - "1": "", - "2": "", - "3": "", - "4": "", - "5": "", - "6": "", - "7": "", - "8": "", - "9": "", - "0": "", + A: "", + B: "", + C: "", + D: "", + E: "", + F: "", + G: "", + H: "", + I: "", + J: "", + K: "", + L: "", + M: "", + N: "", + O: "", + P: "", + Q: "", + R: "", + S: "", + T: "", + U: "", + V: "", + W: "", + X: "", + Y: "", + Z: "", + 1: "", + 2: "", + 3: "", + 4: "", + 5: "", + 6: "", + 7: "", + 8: "", + 9: "", + 0: "", ".": "", ",": "", ":": "", @@ -138,7 +141,7 @@ const MORSE_TABLE = { "!": "", "?": "", "'": "", - "\"": "", + '"': "", "/": "", "-": "", "+": "", @@ -147,9 +150,9 @@ const MORSE_TABLE = { "@": "", "=": "", "&": "", - "_": "", - "$": "", - " ": "" + _: "", + $: "", + " ": "", }; export default ToMorseCode; diff --git a/src/core/operations/ToOctal.mjs b/src/core/operations/ToOctal.mjs index 2ed8ef97..4a856e8d 100644 --- a/src/core/operations/ToOctal.mjs +++ b/src/core/operations/ToOctal.mjs @@ -6,14 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {DELIM_OPTIONS} from "../lib/Delim.mjs"; - +import { DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * To Octal operation */ class ToOctal extends Operation { - /** * ToOctal constructor */ @@ -22,16 +20,17 @@ class ToOctal extends Operation { this.name = "To Octal"; this.module = "Default"; - this.description = "Converts the input string to octal bytes separated by the specified delimiter.

    e.g. The UTF-8 encoded string Γειά σου becomes 316 223 316 265 316 271 316 254 40 317 203 316 277 317 205"; + this.description = + "Converts the input string to octal bytes separated by the specified delimiter.

    e.g. The UTF-8 encoded string Γειά σου becomes 316 223 316 265 316 271 316 254 40 317 203 316 277 317 205"; this.infoURL = "https://wikipedia.org/wiki/Octal"; this.inputType = "byteArray"; this.outputType = "string"; this.args = [ { - "name": "Delimiter", - "type": "option", - "value": DELIM_OPTIONS - } + name: "Delimiter", + type: "option", + value: DELIM_OPTIONS, + }, ]; } @@ -42,9 +41,8 @@ class ToOctal extends Operation { */ run(input, args) { const delim = Utils.charRep(args[0] || "Space"); - return input.map(val => val.toString(8)).join(delim); + return input.map((val) => val.toString(8)).join(delim); } - } export default ToOctal; diff --git a/src/core/operations/ToPunycode.mjs b/src/core/operations/ToPunycode.mjs index 0e579079..d6e31ff0 100644 --- a/src/core/operations/ToPunycode.mjs +++ b/src/core/operations/ToPunycode.mjs @@ -11,7 +11,6 @@ import punycode from "punycode"; * To Punycode operation */ class ToPunycode extends Operation { - /** * ToPunycode constructor */ @@ -20,16 +19,17 @@ class ToPunycode extends Operation { this.name = "To Punycode"; this.module = "Encodings"; - this.description = "Punycode is a way to represent Unicode with the limited character subset of ASCII supported by the Domain Name System.

    e.g. m\xfcnchen encodes to mnchen-3ya"; + this.description = + "Punycode is a way to represent Unicode with the limited character subset of ASCII supported by the Domain Name System.

    e.g. m\xfcnchen encodes to mnchen-3ya"; this.infoURL = "https://wikipedia.org/wiki/Punycode"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Internationalised domain name", - "type": "boolean", - "value": false - } + name: "Internationalised domain name", + type: "boolean", + value: false, + }, ]; } @@ -47,7 +47,6 @@ class ToPunycode extends Operation { return punycode.encode(input); } } - } export default ToPunycode; diff --git a/src/core/operations/ToQuotedPrintable.mjs b/src/core/operations/ToQuotedPrintable.mjs index 9db5c5a5..60705fab 100644 --- a/src/core/operations/ToQuotedPrintable.mjs +++ b/src/core/operations/ToQuotedPrintable.mjs @@ -14,7 +14,6 @@ import Operation from "../Operation.mjs"; * To Quoted Printable operation */ class ToQuotedPrintable extends Operation { - /** * ToQuotedPrintable constructor */ @@ -23,7 +22,8 @@ class ToQuotedPrintable extends Operation { this.name = "To Quoted Printable"; this.module = "Default"; - this.description = "Quoted-Printable, or QP encoding, is an encoding using printable ASCII characters (alphanumeric and the equals sign '=') to transmit 8-bit data over a 7-bit data path or, generally, over a medium which is not 8-bit clean. It is defined as a MIME content transfer encoding for use in e-mail.

    QP works by using the equals sign '=' as an escape character. It also limits line length to 76, as some software has limits on line length."; + this.description = + "Quoted-Printable, or QP encoding, is an encoding using printable ASCII characters (alphanumeric and the equals sign '=') to transmit 8-bit data over a 7-bit data path or, generally, over a medium which is not 8-bit clean. It is defined as a MIME content transfer encoding for use in e-mail.

    QP works by using the equals sign '=' as an escape character. It also limits line length to 76, as some software has limits on line length."; this.infoURL = "https://wikipedia.org/wiki/Quoted-printable"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -40,16 +40,17 @@ class ToQuotedPrintable extends Operation { let mimeEncodedStr = this.mimeEncode(input); // fix line breaks - mimeEncodedStr = mimeEncodedStr.replace(/\r?\n|\r/g, function() { - return "\r\n"; - }).replace(/[\t ]+$/gm, function(spaces) { - return spaces.replace(/ /g, "=20").replace(/\t/g, "=09"); - }); + mimeEncodedStr = mimeEncodedStr + .replace(/\r?\n|\r/g, function () { + return "\r\n"; + }) + .replace(/[\t ]+$/gm, function (spaces) { + return spaces.replace(/ /g, "=20").replace(/\t/g, "=09"); + }); return this._addSoftLinebreaks(mimeEncodedStr, "qp"); } - /** @license ======================================================================== mimelib: http://github.com/andris9/mimelib @@ -80,14 +81,14 @@ class ToQuotedPrintable extends Operation { mimeEncode(buffer) { const ranges = [ [0x09], - [0x0A], - [0x0D], + [0x0a], + [0x0d], [0x20], [0x21], - [0x23, 0x3C], - [0x3E], - [0x40, 0x5E], - [0x60, 0x7E] + [0x23, 0x3c], + [0x3e], + [0x40, 0x5e], + [0x60, 0x7e], ]; let result = ""; @@ -96,7 +97,10 @@ class ToQuotedPrintable extends Operation { result += String.fromCharCode(buffer[i]); continue; } - result += "=" + (buffer[i] < 0x10 ? "0" : "") + buffer[i].toString(16).toUpperCase(); + result += + "=" + + (buffer[i] < 0x10 ? "0" : "") + + buffer[i].toString(16).toUpperCase(); } return result; @@ -112,11 +116,13 @@ class ToQuotedPrintable extends Operation { */ _checkRanges(nr, ranges) { for (let i = ranges.length - 1; i >= 0; i--) { - if (!ranges[i].length) - continue; - if (ranges[i].length === 1 && nr === ranges[i][0]) - return true; - if (ranges[i].length === 2 && nr >= ranges[i][0] && nr <= ranges[i][1]) + if (!ranges[i].length) continue; + if (ranges[i].length === 1 && nr === ranges[i][0]) return true; + if ( + ranges[i].length === 2 && + nr >= ranges[i][0] && + nr <= ranges[i][1] + ) return true; } return false; @@ -154,7 +160,9 @@ class ToQuotedPrintable extends Operation { */ _addBase64SoftLinebreaks(base64EncodedStr, lineLengthMax) { base64EncodedStr = (base64EncodedStr || "").toString().trim(); - return base64EncodedStr.replace(new RegExp(".{" + lineLengthMax + "}", "g"), "$&\r\n").trim(); + return base64EncodedStr + .replace(new RegExp(".{" + lineLengthMax + "}", "g"), "$&\r\n") + .trim(); } /** @@ -169,7 +177,9 @@ class ToQuotedPrintable extends Operation { const len = mimeEncodedStr.length, lineMargin = Math.floor(lineLengthMax / 3); let pos = 0, - match, code, line, + match, + code, + line, result = ""; // insert soft linebreaks where needed @@ -193,21 +203,30 @@ class ToQuotedPrintable extends Operation { result += line; pos += line.length; continue; - } else if (line.length > lineLengthMax - lineMargin && (match = line.substr(-lineMargin).match(/[ \t.,!?][^ \t.,!?]*$/))) { + } else if ( + line.length > lineLengthMax - lineMargin && + (match = line + .substr(-lineMargin) + .match(/[ \t.,!?][^ \t.,!?]*$/)) + ) { // truncate to nearest space line = line.substr(0, line.length - (match[0].length - 1)); } else if (line.substr(-1) === "\r") { line = line.substr(0, line.length - 1); } else { if (line.match(/=[\da-f]{0,2}$/i)) { - // push incomplete encoding sequences to the next line if ((match = line.match(/=[\da-f]{0,1}$/i))) { line = line.substr(0, line.length - match[0].length); } // ensure that utf-8 sequences are not split - while (line.length > 3 && line.length < len - pos && !line.match(/^(?:=[\da-f]{2}){1,4}$/i) && (match = line.match(/=[\da-f]{2}$/ig))) { + while ( + line.length > 3 && + line.length < len - pos && + !line.match(/^(?:=[\da-f]{2}){1,4}$/i) && + (match = line.match(/=[\da-f]{2}$/gi)) + ) { code = parseInt(match[0].substr(1, 2), 16); if (code < 128) { break; @@ -215,11 +234,10 @@ class ToQuotedPrintable extends Operation { line = line.substr(0, line.length - 3); - if (code >= 0xC0) { + if (code >= 0xc0) { break; } } - } } @@ -240,7 +258,6 @@ class ToQuotedPrintable extends Operation { return result; } - } export default ToQuotedPrintable; diff --git a/src/core/operations/ToSnakeCase.mjs b/src/core/operations/ToSnakeCase.mjs index 5cb566af..17c70f4f 100644 --- a/src/core/operations/ToSnakeCase.mjs +++ b/src/core/operations/ToSnakeCase.mjs @@ -12,7 +12,6 @@ import { replaceVariableNames } from "../lib/Code.mjs"; * To Snake case operation */ class ToSnakeCase extends Operation { - /** * ToSnakeCase constructor */ @@ -21,16 +20,17 @@ class ToSnakeCase extends Operation { this.name = "To Snake case"; this.module = "Code"; - this.description = "Converts the input string to snake case.\n

    \nSnake case is all lower case with underscores as word boundaries.\n

    \ne.g. this_is_snake_case\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; + this.description = + "Converts the input string to snake case.\n

    \nSnake case is all lower case with underscores as word boundaries.\n

    \ne.g. this_is_snake_case\n

    \n'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names."; this.infoURL = "https://wikipedia.org/wiki/Snake_case"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Attempt to be context aware", - "type": "boolean", - "value": false - } + name: "Attempt to be context aware", + type: "boolean", + value: false, + }, ]; } diff --git a/src/core/operations/ToTable.mjs b/src/core/operations/ToTable.mjs index 082c39bc..96ce6397 100644 --- a/src/core/operations/ToTable.mjs +++ b/src/core/operations/ToTable.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * To Table operation */ class ToTable extends Operation { - /** * ToTable constructor */ @@ -20,31 +19,32 @@ class ToTable extends Operation { this.name = "To Table"; this.module = "Default"; - this.description = "Data can be split on different characters and rendered as an HTML, ASCII or Markdown table with an optional header row.

    Supports the CSV (Comma Separated Values) file format by default. Change the cell delimiter argument to \\t to support TSV (Tab Separated Values) or | for PSV (Pipe Separated Values).

    You can enter as many delimiters as you like. Each character will be treat as a separate possible delimiter."; + this.description = + "Data can be split on different characters and rendered as an HTML, ASCII or Markdown table with an optional header row.

    Supports the CSV (Comma Separated Values) file format by default. Change the cell delimiter argument to \\t to support TSV (Tab Separated Values) or | for PSV (Pipe Separated Values).

    You can enter as many delimiters as you like. Each character will be treat as a separate possible delimiter."; this.infoURL = "https://wikipedia.org/wiki/Comma-separated_values"; this.inputType = "string"; this.outputType = "html"; this.args = [ { - "name": "Cell delimiters", - "type": "binaryShortString", - "value": "," + name: "Cell delimiters", + type: "binaryShortString", + value: ",", }, { - "name": "Row delimiters", - "type": "binaryShortString", - "value": "\\r\\n" + name: "Row delimiters", + type: "binaryShortString", + value: "\\r\\n", }, { - "name": "Make first row header", - "type": "boolean", - "value": false + name: "Make first row header", + type: "boolean", + value: false, }, { - "name": "Format", - "type": "option", - "value": ["ASCII", "HTML", "Markdown"] - } + name: "Format", + type: "option", + value: ["ASCII", "HTML", "Markdown"], + }, ]; } @@ -57,7 +57,11 @@ class ToTable extends Operation { const [cellDelims, rowDelims, firstRowHeader, format] = args; // Process the input into a nested array of elements. - const tableData = Utils.parseCSV(Utils.escapeHtml(input), cellDelims.split(""), rowDelims.split("")); + const tableData = Utils.parseCSV( + Utils.escapeHtml(input), + cellDelims.split(""), + rowDelims.split(""), + ); if (!tableData.length) return ""; @@ -88,9 +92,12 @@ class ToTable extends Operation { const longestCells = []; // Find longestCells value per column to pad cells equally. - tableData.forEach(function(row, index) { - row.forEach(function(cell, cellIndex) { - if (longestCells[cellIndex] === undefined || cell.length > longestCells[cellIndex]) { + tableData.forEach(function (row, index) { + row.forEach(function (cell, cellIndex) { + if ( + longestCells[cellIndex] === undefined || + cell.length > longestCells[cellIndex] + ) { longestCells[cellIndex] = cell.length; } }); @@ -108,7 +115,7 @@ class ToTable extends Operation { } // Add the rest of the table rows. - tableData.forEach(function(row, index) { + tableData.forEach(function (row, index) { output += outputRow(row, longestCells); }); @@ -122,8 +129,13 @@ class ToTable extends Operation { */ function outputRow(row, longestCells) { let rowOutput = verticalBorder; - row.forEach(function(cell, index) { - rowOutput += " " + cell + " ".repeat(longestCells[index] - cell.length) + " " + verticalBorder; + row.forEach(function (cell, index) { + rowOutput += + " " + + cell + + " ".repeat(longestCells[index] - cell.length) + + " " + + verticalBorder; }); rowOutput += "\n"; return rowOutput; @@ -135,8 +147,9 @@ class ToTable extends Operation { */ function outputHorizontalBorder(longestCells) { let rowOutput = crossBorder; - longestCells.forEach(function(cellLength) { - rowOutput += horizontalBorder.repeat(cellLength + 2) + crossBorder; + longestCells.forEach(function (cellLength) { + rowOutput += + horizontalBorder.repeat(cellLength + 2) + crossBorder; }); rowOutput += "\n"; return rowOutput; @@ -151,7 +164,8 @@ class ToTable extends Operation { */ function htmlOutput(tableData) { // Start the HTML output with suitable classes for styling. - let output = "
    "; + let output = + "
    "; // If the first row is a header then put it in with . output += ""; - tableData.forEach(function(row, index) { + tableData.forEach(function (row, index) { output += outputRow(row, "td"); }); @@ -171,16 +185,17 @@ class ToTable extends Operation { output += "
    cells. if (firstRowHeader) { @@ -163,7 +177,7 @@ class ToTable extends Operation { // Output the rest of the rows in the
    "; return output; - /** - * Outputs a table row. - * - * @param {string[]} row - * @param {string} cellType - */ + /** + * Outputs a table row. + * + * @param {string[]} row + * @param {string} cellType + */ function outputRow(row, cellType) { let output = ""; - row.forEach(function(cell) { - output += "<" + cellType + ">" + cell + ""; + row.forEach(function (cell) { + output += + "<" + cellType + ">" + cell + ""; }); output += ""; return output; @@ -201,9 +216,12 @@ class ToTable extends Operation { const longestCells = []; // Find longestCells value per column to pad cells equally. - tableData.forEach(function(row, index) { - row.forEach(function(cell, cellIndex) { - if (longestCells[cellIndex] === undefined || cell.length > longestCells[cellIndex]) { + tableData.forEach(function (row, index) { + row.forEach(function (cell, cellIndex) { + if ( + longestCells[cellIndex] === undefined || + cell.length > longestCells[cellIndex] + ) { longestCells[cellIndex] = cell.length; } }); @@ -213,13 +231,17 @@ class ToTable extends Operation { const row = tableData.shift(); output += outputRow(row, longestCells); let rowOutput = verticalBorder; - row.forEach(function(cell, index) { - rowOutput += " " + headerDivider.repeat(longestCells[index]) + " " + verticalBorder; + row.forEach(function (cell, index) { + rowOutput += + " " + + headerDivider.repeat(longestCells[index]) + + " " + + verticalBorder; }); output += rowOutput += "\n"; // Add the rest of the table rows. - tableData.forEach(function(row, index) { + tableData.forEach(function (row, index) { output += outputRow(row, longestCells); }); @@ -230,17 +252,19 @@ class ToTable extends Operation { */ function outputRow(row, longestCells) { let rowOutput = verticalBorder; - row.forEach(function(cell, index) { - rowOutput += " " + cell + " ".repeat(longestCells[index] - cell.length) + " " + verticalBorder; + row.forEach(function (cell, index) { + rowOutput += + " " + + cell + + " ".repeat(longestCells[index] - cell.length) + + " " + + verticalBorder; }); rowOutput += "\n"; return rowOutput; } - } - } - } export default ToTable; diff --git a/src/core/operations/ToUNIXTimestamp.mjs b/src/core/operations/ToUNIXTimestamp.mjs index 3eaf2ba2..b3af6102 100644 --- a/src/core/operations/ToUNIXTimestamp.mjs +++ b/src/core/operations/ToUNIXTimestamp.mjs @@ -6,14 +6,13 @@ import Operation from "../Operation.mjs"; import moment from "moment-timezone"; -import {UNITS} from "../lib/DateTime.mjs"; +import { UNITS } from "../lib/DateTime.mjs"; import OperationError from "../errors/OperationError.mjs"; /** * To UNIX Timestamp operation */ class ToUNIXTimestamp extends Operation { - /** * ToUNIXTimestamp constructor */ @@ -22,26 +21,27 @@ class ToUNIXTimestamp extends Operation { this.name = "To UNIX Timestamp"; this.module = "Default"; - this.description = "Parses a datetime string in UTC and returns the corresponding UNIX timestamp.

    e.g. Mon 1 January 2001 11:00:00 becomes 978346800

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch)."; + this.description = + "Parses a datetime string in UTC and returns the corresponding UNIX timestamp.

    e.g. Mon 1 January 2001 11:00:00 becomes 978346800

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch)."; this.infoURL = "https://wikipedia.org/wiki/Unix_time"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Units", - "type": "option", - "value": UNITS + name: "Units", + type: "option", + value: UNITS, }, { - "name": "Treat as UTC", - "type": "boolean", - "value": true + name: "Treat as UTC", + type: "boolean", + value: true, }, { - "name": "Show parsed datetime", - "type": "boolean", - "value": true - } + name: "Show parsed datetime", + type: "boolean", + value: true, + }, ]; } @@ -70,9 +70,12 @@ class ToUNIXTimestamp extends Operation { throw new OperationError("Unrecognised unit"); } - return showDateTime ? `${result} (${d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss")} UTC)` : result.toString(); + return showDateTime + ? `${result} (${d + .tz("UTC") + .format("ddd D MMMM YYYY HH:mm:ss")} UTC)` + : result.toString(); } - } export default ToUNIXTimestamp; diff --git a/src/core/operations/ToUpperCase.mjs b/src/core/operations/ToUpperCase.mjs index 8eb00731..4aec7e9d 100644 --- a/src/core/operations/ToUpperCase.mjs +++ b/src/core/operations/ToUpperCase.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * To Upper case operation */ class ToUpperCase extends Operation { - /** * ToUpperCase constructor */ @@ -20,15 +19,16 @@ class ToUpperCase extends Operation { this.name = "To Upper case"; this.module = "Default"; - this.description = "Converts the input string to upper case, optionally limiting scope to only the first character in each word, sentence or paragraph."; + this.description = + "Converts the input string to upper case, optionally limiting scope to only the first character in each word, sentence or paragraph."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Scope", - "type": "option", - "value": ["All", "Word", "Sentence", "Paragraph"] - } + name: "Scope", + type: "option", + value: ["All", "Word", "Sentence", "Paragraph"], + }, ]; } @@ -49,9 +49,9 @@ class ToUpperCase extends Operation { } const scopeRegex = { - "Word": /(\b\w)/gi, - "Sentence": /(?:\.|^)\s*(\b\w)/gi, - "Paragraph": /(?:\n|^)\s*(\b\w)/gi + Word: /(\b\w)/gi, + Sentence: /(?:\.|^)\s*(\b\w)/gi, + Paragraph: /(?:\n|^)\s*(\b\w)/gi, }[scope]; if (scopeRegex === undefined) { @@ -59,7 +59,7 @@ class ToUpperCase extends Operation { } // Use the regex to capitalize the input - return input.replace(scopeRegex, function(m) { + return input.replace(scopeRegex, function (m) { return m.toUpperCase(); }); } @@ -89,7 +89,6 @@ class ToUpperCase extends Operation { highlightReverse(pos, args) { return pos; } - } export default ToUpperCase; diff --git a/src/core/operations/TranslateDateTimeFormat.mjs b/src/core/operations/TranslateDateTimeFormat.mjs index 70c76ac9..8b66c855 100644 --- a/src/core/operations/TranslateDateTimeFormat.mjs +++ b/src/core/operations/TranslateDateTimeFormat.mjs @@ -7,13 +7,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; import moment from "moment-timezone"; -import {DATETIME_FORMATS, FORMAT_EXAMPLES} from "../lib/DateTime.mjs"; +import { DATETIME_FORMATS, FORMAT_EXAMPLES } from "../lib/DateTime.mjs"; /** * Translate DateTime Format operation */ class TranslateDateTimeFormat extends Operation { - /** * TranslateDateTimeFormat constructor */ @@ -22,38 +21,39 @@ class TranslateDateTimeFormat extends Operation { this.name = "Translate DateTime Format"; this.module = "Default"; - this.description = "Parses a datetime string in one format and re-writes it in another.

    Run with no input to see the relevant format string examples."; + this.description = + "Parses a datetime string in one format and re-writes it in another.

    Run with no input to see the relevant format string examples."; this.infoURL = "https://momentjs.com/docs/#/parsing/string-format/"; this.inputType = "string"; this.outputType = "string"; this.presentType = "html"; this.args = [ { - "name": "Built in formats", - "type": "populateOption", - "value": DATETIME_FORMATS, - "target": 1 + name: "Built in formats", + type: "populateOption", + value: DATETIME_FORMATS, + target: 1, }, { - "name": "Input format string", - "type": "binaryString", - "value": "DD/MM/YYYY HH:mm:ss" + name: "Input format string", + type: "binaryString", + value: "DD/MM/YYYY HH:mm:ss", }, { - "name": "Input timezone", - "type": "option", - "value": ["UTC"].concat(moment.tz.names()) + name: "Input timezone", + type: "option", + value: ["UTC"].concat(moment.tz.names()), }, { - "name": "Output format string", - "type": "binaryString", - "value": "dddd Do MMMM YYYY HH:mm:ss Z z" + name: "Output format string", + type: "binaryString", + value: "dddd Do MMMM YYYY HH:mm:ss Z z", }, { - "name": "Output timezone", - "type": "option", - "value": ["UTC"].concat(moment.tz.names()) - } + name: "Output timezone", + type: "option", + value: ["UTC"].concat(moment.tz.names()), + }, ]; this.invalidFormatMessage = "Invalid format."; @@ -65,7 +65,8 @@ class TranslateDateTimeFormat extends Operation { * @returns {string} */ run(input, args) { - const [inputFormat, inputTimezone, outputFormat, outputTimezone] = args.slice(1); + const [inputFormat, inputTimezone, outputFormat, outputTimezone] = + args.slice(1); let date; try { @@ -75,7 +76,9 @@ class TranslateDateTimeFormat extends Operation { return this.invalidFormatMessage; } - return date.tz(outputTimezone).format(outputFormat.replace(/[<>]/g, "")); + return date + .tz(outputTimezone) + .format(outputFormat.replace(/[<>]/g, "")); } /** diff --git a/src/core/operations/TripleDESDecrypt.mjs b/src/core/operations/TripleDESDecrypt.mjs index 8487509f..99c86fdd 100644 --- a/src/core/operations/TripleDESDecrypt.mjs +++ b/src/core/operations/TripleDESDecrypt.mjs @@ -13,7 +13,6 @@ import forge from "node-forge"; * Triple DES Decrypt operation */ class TripleDESDecrypt extends Operation { - /** * TripleDESDecrypt constructor */ @@ -22,38 +21,47 @@ class TripleDESDecrypt extends Operation { this.name = "Triple DES Decrypt"; this.module = "Ciphers"; - this.description = "Triple DES applies DES three times to each block to increase key size.

    Key: Triple DES uses a key length of 24 bytes (192 bits).
    DES uses a key length of 8 bytes (64 bits).

    IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

    Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default."; + this.description = + "Triple DES applies DES three times to each block to increase key size.

    Key: Triple DES uses a key length of 24 bytes (192 bits).
    DES uses a key length of 8 bytes (64 bits).

    IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

    Padding: In CBC and ECB mode, PKCS#7 padding will be used as a default."; this.infoURL = "https://wikipedia.org/wiki/Triple_DES"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Mode", - "type": "option", - "value": ["CBC", "CFB", "OFB", "CTR", "ECB", "CBC/NoPadding", "ECB/NoPadding"] + name: "Mode", + type: "option", + value: [ + "CBC", + "CFB", + "OFB", + "CTR", + "ECB", + "CBC/NoPadding", + "ECB/NoPadding", + ], }, { - "name": "Input", - "type": "option", - "value": ["Hex", "Raw"] + name: "Input", + type: "option", + value: ["Hex", "Raw"], }, { - "name": "Output", - "type": "option", - "value": ["Raw", "Hex"] - } + name: "Output", + type: "option", + value: ["Raw", "Hex"], + }, ]; } @@ -85,27 +93,32 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); input = Utils.convertToByteString(input, inputType); - const decipher = forge.cipher.createDecipher("3DES-" + mode, - key.length === 16 ? key + key.substring(0, 8) : key); + const decipher = forge.cipher.createDecipher( + "3DES-" + mode, + key.length === 16 ? key + key.substring(0, 8) : key, + ); /* Allow for a "no padding" mode */ if (noPadding) { - decipher.mode.unpad = function(output, options) { + decipher.mode.unpad = function (output, options) { return true; }; } - decipher.start({iv: iv}); + decipher.start({ iv: iv }); decipher.update(forge.util.createBuffer(input)); const result = decipher.finish(); if (result) { - return outputType === "Hex" ? decipher.output.toHex() : decipher.output.getBytes(); + return outputType === "Hex" + ? decipher.output.toHex() + : decipher.output.getBytes(); } else { - throw new OperationError("Unable to decrypt input with these parameters."); + throw new OperationError( + "Unable to decrypt input with these parameters.", + ); } } - } export default TripleDESDecrypt; diff --git a/src/core/operations/TripleDESEncrypt.mjs b/src/core/operations/TripleDESEncrypt.mjs index 720d155d..d7d63145 100644 --- a/src/core/operations/TripleDESEncrypt.mjs +++ b/src/core/operations/TripleDESEncrypt.mjs @@ -13,7 +13,6 @@ import forge from "node-forge"; * Triple DES Encrypt operation */ class TripleDESEncrypt extends Operation { - /** * TripleDESEncrypt constructor */ @@ -22,38 +21,39 @@ class TripleDESEncrypt extends Operation { this.name = "Triple DES Encrypt"; this.module = "Ciphers"; - this.description = "Triple DES applies DES three times to each block to increase key size.

    Key: Triple DES uses a key length of 24 bytes (192 bits).
    DES uses a key length of 8 bytes (64 bits).

    You can generate a password-based key using one of the KDF operations.

    IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

    Padding: In CBC and ECB mode, PKCS#7 padding will be used."; + this.description = + "Triple DES applies DES three times to each block to increase key size.

    Key: Triple DES uses a key length of 24 bytes (192 bits).
    DES uses a key length of 8 bytes (64 bits).

    You can generate a password-based key using one of the KDF operations.

    IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.

    Padding: In CBC and ECB mode, PKCS#7 padding will be used."; this.infoURL = "https://wikipedia.org/wiki/Triple_DES"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "Key", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "IV", - "type": "toggleString", - "value": "", - "toggleValues": ["Hex", "UTF8", "Latin1", "Base64"] + name: "IV", + type: "toggleString", + value: "", + toggleValues: ["Hex", "UTF8", "Latin1", "Base64"], }, { - "name": "Mode", - "type": "option", - "value": ["CBC", "CFB", "OFB", "CTR", "ECB"] + name: "Mode", + type: "option", + value: ["CBC", "CFB", "OFB", "CTR", "ECB"], }, { - "name": "Input", - "type": "option", - "value": ["Raw", "Hex"] + name: "Input", + type: "option", + value: ["Raw", "Hex"], }, { - "name": "Output", - "type": "option", - "value": ["Hex", "Raw"] - } + name: "Output", + type: "option", + value: ["Hex", "Raw"], + }, ]; } @@ -84,15 +84,18 @@ Make sure you have specified the type correctly (e.g. Hex vs UTF8).`); input = Utils.convertToByteString(input, inputType); - const cipher = forge.cipher.createCipher("3DES-" + mode, - key.length === 16 ? key + key.substring(0, 8) : key); - cipher.start({iv: iv}); + const cipher = forge.cipher.createCipher( + "3DES-" + mode, + key.length === 16 ? key + key.substring(0, 8) : key, + ); + cipher.start({ iv: iv }); cipher.update(forge.util.createBuffer(input)); cipher.finish(); - return outputType === "Hex" ? cipher.output.toHex() : cipher.output.getBytes(); + return outputType === "Hex" + ? cipher.output.toHex() + : cipher.output.getBytes(); } - } export default TripleDESEncrypt; diff --git a/src/core/operations/Typex.mjs b/src/core/operations/Typex.mjs index 5c9d952e..152d5831 100644 --- a/src/core/operations/Typex.mjs +++ b/src/core/operations/Typex.mjs @@ -11,8 +11,14 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; -import {LETTERS, Reflector} from "../lib/Enigma.mjs"; -import {ROTORS, REFLECTORS, TypexMachine, Plugboard, Rotor} from "../lib/Typex.mjs"; +import { LETTERS, Reflector } from "../lib/Enigma.mjs"; +import { + ROTORS, + REFLECTORS, + TypexMachine, + Plugboard, + Rotor, +} from "../lib/Typex.mjs"; /** * Typex operation @@ -26,7 +32,8 @@ class Typex extends Operation { this.name = "Typex"; this.module = "Bletchley"; - this.description = "Encipher/decipher with the WW2 Typex machine.

    Typex was originally built by the British Royal Air Force prior to WW2, and is based on the Enigma machine with some improvements made, including using five rotors with more stepping points and interchangeable wiring cores. It was used across the British and Commonwealth militaries. A number of later variants were produced; here we simulate a WW2 era Mark 22 Typex with plugboards for the reflector and input. Typex rotors were changed regularly and none are public: a random example set are provided.

    To configure the reflector plugboard, enter a string of connected pairs of letters in the reflector box, e.g. AB CD EF connects A to B, C to D, and E to F (you'll need to connect every letter). There is also an input plugboard: unlike Enigma's plugboard, it's not restricted to pairs, so it's entered like a rotor (without stepping). To create your own rotor, enter the letters that the rotor maps A to Z to, in order, optionally followed by < then a list of stepping points.

    More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; + this.description = + "Encipher/decipher with the WW2 Typex machine.

    Typex was originally built by the British Royal Air Force prior to WW2, and is based on the Enigma machine with some improvements made, including using five rotors with more stepping points and interchangeable wiring cores. It was used across the British and Commonwealth militaries. A number of later variants were produced; here we simulate a WW2 era Mark 22 Typex with plugboards for the reflector and input. Typex rotors were changed regularly and none are public: a random example set are provided.

    To configure the reflector plugboard, enter a string of connected pairs of letters in the reflector box, e.g. AB CD EF connects A to B, C to D, and E to F (you'll need to connect every letter). There is also an input plugboard: unlike Enigma's plugboard, it's not restricted to pairs, so it's entered like a rotor (without stepping). To create your own rotor, enter the letters that the rotor maps A to Z to, in order, optionally followed by < then a list of stepping points.

    More detailed descriptions of the Enigma, Typex and Bombe operations can be found here."; this.infoURL = "https://wikipedia.org/wiki/Typex"; this.inputType = "string"; this.outputType = "string"; @@ -35,127 +42,127 @@ class Typex extends Operation { name: "1st (left-hand) rotor", type: "editableOption", value: ROTORS, - defaultIndex: 0 + defaultIndex: 0, }, { name: "1st rotor reversed", type: "boolean", - value: false + value: false, }, { name: "1st rotor ring setting", type: "option", - value: LETTERS + value: LETTERS, }, { name: "1st rotor initial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "2nd rotor", type: "editableOption", value: ROTORS, - defaultIndex: 1 + defaultIndex: 1, }, { name: "2nd rotor reversed", type: "boolean", - value: false + value: false, }, { name: "2nd rotor ring setting", type: "option", - value: LETTERS + value: LETTERS, }, { name: "2nd rotor initial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "3rd (middle) rotor", type: "editableOption", value: ROTORS, - defaultIndex: 2 + defaultIndex: 2, }, { name: "3rd rotor reversed", type: "boolean", - value: false + value: false, }, { name: "3rd rotor ring setting", type: "option", - value: LETTERS + value: LETTERS, }, { name: "3rd rotor initial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "4th (static) rotor", type: "editableOption", value: ROTORS, - defaultIndex: 3 + defaultIndex: 3, }, { name: "4th rotor reversed", type: "boolean", - value: false + value: false, }, { name: "4th rotor ring setting", type: "option", - value: LETTERS + value: LETTERS, }, { name: "4th rotor initial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "5th (right-hand, static) rotor", type: "editableOption", value: ROTORS, - defaultIndex: 4 + defaultIndex: 4, }, { name: "5th rotor reversed", type: "boolean", - value: false + value: false, }, { name: "5th rotor ring setting", type: "option", - value: LETTERS + value: LETTERS, }, { name: "5th rotor initial value", type: "option", - value: LETTERS + value: LETTERS, }, { name: "Reflector", type: "editableOption", - value: REFLECTORS + value: REFLECTORS, }, { name: "Plugboard", type: "string", - value: "" + value: "", }, { name: "Typex keyboard emulation", type: "option", - value: ["None", "Encrypt", "Decrypt"] + value: ["None", "Encrypt", "Decrypt"], }, { name: "Strict output", hint: "Remove non-alphabet letters and group output", type: "boolean", - value: true + value: true, }, ]; } @@ -189,9 +196,17 @@ class Typex extends Operation { const typexKeyboard = args[22]; const removeOther = args[23]; const rotors = []; - for (let i=0; i<5; i++) { - const [rotorwiring, rotorsteps] = this.parseRotorStr(args[i*4]); - rotors.push(new Rotor(rotorwiring, rotorsteps, args[i*4 + 1], args[i*4+2], args[i*4+3])); + for (let i = 0; i < 5; i++) { + const [rotorwiring, rotorsteps] = this.parseRotorStr(args[i * 4]); + rotors.push( + new Rotor( + rotorwiring, + rotorsteps, + args[i * 4 + 1], + args[i * 4 + 2], + args[i * 4 + 3], + ), + ); } // Rotors are handled in reverse rotors.reverse(); @@ -208,7 +223,12 @@ class Typex extends Operation { input = input.replace(/[^A-Za-z]/g, ""); } } - const typex = new TypexMachine(rotors, reflector, plugboard, typexKeyboard); + const typex = new TypexMachine( + rotors, + reflector, + plugboard, + typexKeyboard, + ); let result = typex.crypt(input); if (removeOther && typexKeyboard !== "Decrypt") { // Five character cipher groups is traditional @@ -247,7 +267,6 @@ class Typex extends Operation { return pos; } } - } export default Typex; diff --git a/src/core/operations/UNIXTimestampToWindowsFiletime.mjs b/src/core/operations/UNIXTimestampToWindowsFiletime.mjs index ad88fb97..728448f2 100644 --- a/src/core/operations/UNIXTimestampToWindowsFiletime.mjs +++ b/src/core/operations/UNIXTimestampToWindowsFiletime.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * UNIX Timestamp to Windows Filetime operation */ class UNIXTimestampToWindowsFiletime extends Operation { - /** * UNIXTimestampToWindowsFiletime constructor */ @@ -21,21 +20,28 @@ class UNIXTimestampToWindowsFiletime extends Operation { this.name = "UNIX Timestamp to Windows Filetime"; this.module = "Default"; - this.description = "Converts a UNIX timestamp to a Windows Filetime value.

    A Windows Filetime is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 UTC.

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch).

    This operation also supports UNIX timestamps in milliseconds, microseconds and nanoseconds."; - this.infoURL = "https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx"; + this.description = + "Converts a UNIX timestamp to a Windows Filetime value.

    A Windows Filetime is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 UTC.

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch).

    This operation also supports UNIX timestamps in milliseconds, microseconds and nanoseconds."; + this.infoURL = + "https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Input units", - "type": "option", - "value": ["Seconds (s)", "Milliseconds (ms)", "Microseconds (μs)", "Nanoseconds (ns)"] + name: "Input units", + type: "option", + value: [ + "Seconds (s)", + "Milliseconds (ms)", + "Microseconds (μs)", + "Nanoseconds (ns)", + ], }, { - "name": "Output format", - "type": "option", - "value": ["Decimal", "Hex (big endian)", "Hex (little endian)"] - } + name: "Output format", + type: "option", + value: ["Decimal", "Hex (big endian)", "Hex (little endian)"], + }, ]; } @@ -87,7 +93,6 @@ class UNIXTimestampToWindowsFiletime extends Operation { return result; } - } export default UNIXTimestampToWindowsFiletime; diff --git a/src/core/operations/URLDecode.mjs b/src/core/operations/URLDecode.mjs index 7d6544ac..98fa7c8c 100644 --- a/src/core/operations/URLDecode.mjs +++ b/src/core/operations/URLDecode.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * URL Decode operation */ class URLDecode extends Operation { - /** * URLDecode constructor */ @@ -19,7 +18,8 @@ class URLDecode extends Operation { this.name = "URL Decode"; this.module = "URL"; - this.description = "Converts URI/URL percent-encoded characters back to their raw values.

    e.g. %3d becomes ="; + this.description = + "Converts URI/URL percent-encoded characters back to their raw values.

    e.g. %3d becomes ="; this.infoURL = "https://wikipedia.org/wiki/Percent-encoding"; this.inputType = "string"; this.outputType = "string"; @@ -28,7 +28,7 @@ class URLDecode extends Operation { { pattern: ".*(?:%[\\da-f]{2}.*){4}", flags: "i", - args: [] + args: [], }, ]; } @@ -46,7 +46,6 @@ class URLDecode extends Operation { return unescape(data); } } - } export default URLDecode; diff --git a/src/core/operations/URLEncode.mjs b/src/core/operations/URLEncode.mjs index a5efd213..797f3706 100644 --- a/src/core/operations/URLEncode.mjs +++ b/src/core/operations/URLEncode.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * URL Encode operation */ class URLEncode extends Operation { - /** * URLEncode constructor */ @@ -19,16 +18,17 @@ class URLEncode extends Operation { this.name = "URL Encode"; this.module = "URL"; - this.description = "Encodes problematic characters into percent-encoding, a format supported by URIs/URLs.

    e.g. = becomes %3d"; + this.description = + "Encodes problematic characters into percent-encoding, a format supported by URIs/URLs.

    e.g. = becomes %3d"; this.infoURL = "https://wikipedia.org/wiki/Percent-encoding"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Encode all special chars", - "type": "boolean", - "value": false - } + name: "Encode all special chars", + type: "boolean", + value: false, + }, ]; } @@ -48,7 +48,7 @@ class URLEncode extends Operation { * @param {string} str * @returns {string} */ - encodeAllChars (str) { + encodeAllChars(str) { // TODO Do this programmatically return encodeURIComponent(str) .replace(/!/g, "%21") @@ -62,8 +62,6 @@ class URLEncode extends Operation { .replace(/_/g, "%5F") .replace(/~/g, "%7E"); } - } - export default URLEncode; diff --git a/src/core/operations/UnescapeString.mjs b/src/core/operations/UnescapeString.mjs index 8fafb446..3d584f20 100644 --- a/src/core/operations/UnescapeString.mjs +++ b/src/core/operations/UnescapeString.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Unescape string operation */ class UnescapeString extends Operation { - /** * UnescapeString constructor */ @@ -20,7 +19,8 @@ class UnescapeString extends Operation { this.name = "Unescape string"; this.module = "Default"; - this.description = "Unescapes characters in a string that have been escaped. For example, Don\\'t stop me now becomes Don't stop me now.

    Supports the following escape sequences:
    • \\n (Line feed/newline)
    • \\r (Carriage return)
    • \\t (Horizontal tab)
    • \\b (Backspace)
    • \\f (Form feed)
    • \\nnn (Octal, where n is 0-7)
    • \\xnn (Hex, where n is 0-f)
    • \\\\ (Backslash)
    • \\' (Single quote)
    • \\" (Double quote)
    • \\unnnn (Unicode character)
    • \\u{nnnnnn} (Unicode code point)
    "; + this.description = + "Unescapes characters in a string that have been escaped. For example, Don\\'t stop me now becomes Don't stop me now.

    Supports the following escape sequences:
    • \\n (Line feed/newline)
    • \\r (Carriage return)
    • \\t (Horizontal tab)
    • \\b (Backspace)
    • \\f (Form feed)
    • \\nnn (Octal, where n is 0-7)
    • \\xnn (Hex, where n is 0-f)
    • \\\\ (Backslash)
    • \\' (Single quote)
    • \\" (Double quote)
    • \\unnnn (Unicode character)
    • \\u{nnnnnn} (Unicode code point)
    "; this.infoURL = "https://wikipedia.org/wiki/Escape_sequence"; this.inputType = "string"; this.outputType = "string"; @@ -35,7 +35,6 @@ class UnescapeString extends Operation { run(input, args) { return Utils.parseEscapedChars(input); } - } export default UnescapeString; diff --git a/src/core/operations/UnescapeUnicodeCharacters.mjs b/src/core/operations/UnescapeUnicodeCharacters.mjs index 5bb0e5ac..e433654d 100644 --- a/src/core/operations/UnescapeUnicodeCharacters.mjs +++ b/src/core/operations/UnescapeUnicodeCharacters.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Unescape Unicode Characters operation */ class UnescapeUnicodeCharacters extends Operation { - /** * UnescapeUnicodeCharacters constructor */ @@ -20,15 +19,16 @@ class UnescapeUnicodeCharacters extends Operation { this.name = "Unescape Unicode Characters"; this.module = "Default"; - this.description = "Converts unicode-escaped character notation back into raw characters.

    Supports the prefixes:
    • \\u
    • %u
    • U+
    e.g. \\u03c3\\u03bf\\u03c5 becomes σου"; + this.description = + "Converts unicode-escaped character notation back into raw characters.

    Supports the prefixes:
    • \\u
    • %u
    • U+
    e.g. \\u03c3\\u03bf\\u03c5 becomes σου"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Prefix", - "type": "option", - "value": ["\\u", "%u", "U+"] - } + name: "Prefix", + type: "option", + value: ["\\u", "%u", "U+"], + }, ]; } @@ -39,7 +39,7 @@ class UnescapeUnicodeCharacters extends Operation { */ run(input, args) { const prefix = prefixToRegex[args[0]], - regex = new RegExp(prefix+"([a-f\\d]{4})", "ig"); + regex = new RegExp(prefix + "([a-f\\d]{4})", "ig"); let output = "", m, i = 0; @@ -59,7 +59,6 @@ class UnescapeUnicodeCharacters extends Operation { return output; } - } /** @@ -68,7 +67,7 @@ class UnescapeUnicodeCharacters extends Operation { const prefixToRegex = { "\\u": "\\\\u", "%u": "%u", - "U+": "U\\+" + "U+": "U\\+", }; export default UnescapeUnicodeCharacters; diff --git a/src/core/operations/UnicodeTextFormat.mjs b/src/core/operations/UnicodeTextFormat.mjs index 2c18848f..8378fa8a 100644 --- a/src/core/operations/UnicodeTextFormat.mjs +++ b/src/core/operations/UnicodeTextFormat.mjs @@ -11,7 +11,6 @@ import Utils from "../Utils.mjs"; * Unicode Text Format operation */ class UnicodeTextFormat extends Operation { - /** * UnicodeTextFormat constructor */ @@ -20,7 +19,8 @@ class UnicodeTextFormat extends Operation { this.name = "Unicode Text Format"; this.module = "Default"; - this.description = "Adds Unicode combining characters to change formatting of plaintext."; + this.description = + "Adds Unicode combining characters to change formatting of plaintext."; this.infoURL = "https://wikipedia.org/wiki/Combining_character"; this.inputType = "byteArray"; this.outputType = "byteArray"; @@ -28,13 +28,13 @@ class UnicodeTextFormat extends Operation { { name: "Underline", type: "boolean", - value: "false" + value: "false", }, { name: "Strikethrough", type: "boolean", - value: "false" - } + value: "false", + }, ]; } @@ -45,15 +45,15 @@ class UnicodeTextFormat extends Operation { */ run(input, args) { const [underline, strikethrough] = args; - let output = input.map(char => [char]); + let output = input.map((char) => [char]); if (strikethrough) { - output = output.map(charFormat => { + output = output.map((charFormat) => { charFormat.push(...Utils.strToUtf8ByteArray("\u0336")); return charFormat; }); } if (underline) { - output = output.map(charFormat => { + output = output.map((charFormat) => { charFormat.push(...Utils.strToUtf8ByteArray("\u0332")); return charFormat; }); @@ -61,7 +61,6 @@ class UnicodeTextFormat extends Operation { // return output.flat(); - Not supported in Node 10, polyfilled return [].concat(...output); } - } export default UnicodeTextFormat; diff --git a/src/core/operations/Unique.mjs b/src/core/operations/Unique.mjs index 7ca2db66..79eb643f 100644 --- a/src/core/operations/Unique.mjs +++ b/src/core/operations/Unique.mjs @@ -6,13 +6,12 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; +import { INPUT_DELIM_OPTIONS } from "../lib/Delim.mjs"; /** * Unique operation */ class Unique extends Operation { - /** * Unique constructor */ @@ -28,13 +27,13 @@ class Unique extends Operation { { name: "Delimiter", type: "option", - value: INPUT_DELIM_OPTIONS + value: INPUT_DELIM_OPTIONS, }, { name: "Display count", type: "boolean", - value: false - } + value: false, + }, ]; } @@ -57,12 +56,13 @@ class Unique extends Operation { return acc; }, {}); - return Object.keys(valMap).map(val => `${valMap[val]} ${val}`).join(delim); + return Object.keys(valMap) + .map((val) => `${valMap[val]} ${val}`) + .join(delim); } else { return input.split(delim).unique().join(delim); } } - } export default Unique; diff --git a/src/core/operations/Untar.mjs b/src/core/operations/Untar.mjs index 4e6af250..d49f99bd 100644 --- a/src/core/operations/Untar.mjs +++ b/src/core/operations/Untar.mjs @@ -12,7 +12,6 @@ import Stream from "../lib/Stream.mjs"; * Untar operation */ class Untar extends Operation { - /** * Untar constructor */ @@ -29,10 +28,10 @@ class Untar extends Operation { this.args = []; this.checks = [ { - "pattern": "^.{257}\\x75\\x73\\x74\\x61\\x72", - "flags": "", - "args": [] - } + pattern: "^.{257}\\x75\\x73\\x74\\x61\\x72", + flags: "", + args: [], + }, ]; } @@ -55,7 +54,9 @@ class Untar extends Operation { ownerUID: stream.readString(8), ownerGID: stream.readString(8), size: parseInt(stream.readString(12), 8), // Octal - lastModTime: new Date(1000 * parseInt(stream.readString(12), 8)), // Octal + lastModTime: new Date( + 1000 * parseInt(stream.readString(12), 8), + ), // Octal checksum: stream.readString(8), type: stream.readString(1), linkedFileName: stream.readString(100), @@ -81,11 +82,15 @@ class Untar extends Operation { } file.bytes = stream.getBytes(file.size); - files.push(new File([new Uint8Array(file.bytes)], file.fileName)); + files.push( + new File([new Uint8Array(file.bytes)], file.fileName), + ); stream.position = endPosition; } else if (file.type === "5") { // Directory - files.push(new File([new Uint8Array(file.bytes)], file.fileName)); + files.push( + new File([new Uint8Array(file.bytes)], file.fileName), + ); } else { // Symlink or empty bytes } @@ -103,7 +108,6 @@ class Untar extends Operation { async present(files) { return await Utils.displayFilesAsHTML(files); } - } export default Untar; diff --git a/src/core/operations/Unzip.mjs b/src/core/operations/Unzip.mjs index 2e8be411..182bd97c 100644 --- a/src/core/operations/Unzip.mjs +++ b/src/core/operations/Unzip.mjs @@ -14,7 +14,6 @@ const Zlib = unzip.Zlib; * Unzip operation */ class Unzip extends Operation { - /** * Unzip constructor */ @@ -23,7 +22,8 @@ class Unzip extends Operation { this.name = "Unzip"; this.module = "Compression"; - this.description = "Decompresses data using the PKZIP algorithm and displays it per file, with support for passwords."; + this.description = + "Decompresses data using the PKZIP algorithm and displays it per file, with support for passwords."; this.infoURL = "https://wikipedia.org/wiki/Zip_(file_format)"; this.inputType = "ArrayBuffer"; this.outputType = "List"; @@ -32,20 +32,21 @@ class Unzip extends Operation { { name: "Password", type: "binaryString", - value: "" + value: "", }, { name: "Verify result", type: "boolean", - value: false - } + value: false, + }, ]; this.checks = [ { - pattern: "^\\x50\\x4b(?:\\x03|\\x05|\\x07)(?:\\x04|\\x06|\\x08)", + pattern: + "^\\x50\\x4b(?:\\x03|\\x05|\\x07)(?:\\x04|\\x06|\\x08)", flags: "", - args: ["", false] - } + args: ["", false], + }, ]; } @@ -57,12 +58,12 @@ class Unzip extends Operation { run(input, args) { const options = { password: Utils.strToByteArray(args[0]), - verify: args[1] + verify: args[1], }, unzip = new Zlib.Unzip(new Uint8Array(input), options), filenames = unzip.getFilenames(); - return filenames.map(fileName => { + return filenames.map((fileName) => { const bytes = unzip.decompress(fileName); return new File([bytes], fileName); }); @@ -77,7 +78,6 @@ class Unzip extends Operation { async present(files) { return await Utils.displayFilesAsHTML(files); } - } export default Unzip; diff --git a/src/core/operations/VarIntDecode.mjs b/src/core/operations/VarIntDecode.mjs index 46c99cb7..83cac713 100644 --- a/src/core/operations/VarIntDecode.mjs +++ b/src/core/operations/VarIntDecode.mjs @@ -12,7 +12,6 @@ import Protobuf from "../lib/Protobuf.mjs"; * VarInt Decode operation */ class VarIntDecode extends Operation { - /** * VarIntDecode constructor */ @@ -21,8 +20,10 @@ class VarIntDecode extends Operation { this.name = "VarInt Decode"; this.module = "Default"; - this.description = "Decodes a VarInt encoded integer. VarInt is an efficient way of encoding variable length integers and is commonly used with Protobuf."; - this.infoURL = "https://developers.google.com/protocol-buffers/docs/encoding#varints"; + this.description = + "Decodes a VarInt encoded integer. VarInt is an efficient way of encoding variable length integers and is commonly used with Protobuf."; + this.infoURL = + "https://developers.google.com/protocol-buffers/docs/encoding#varints"; this.inputType = "byteArray"; this.outputType = "number"; this.args = []; @@ -40,7 +41,6 @@ class VarIntDecode extends Operation { throw new OperationError(err); } } - } export default VarIntDecode; diff --git a/src/core/operations/VarIntEncode.mjs b/src/core/operations/VarIntEncode.mjs index d86d33f5..4ad41f2f 100644 --- a/src/core/operations/VarIntEncode.mjs +++ b/src/core/operations/VarIntEncode.mjs @@ -12,7 +12,6 @@ import Protobuf from "../lib/Protobuf.mjs"; * VarInt Encode operation */ class VarIntEncode extends Operation { - /** * VarIntEncode constructor */ @@ -21,8 +20,10 @@ class VarIntEncode extends Operation { this.name = "VarInt Encode"; this.module = "Default"; - this.description = "Encodes a Vn integer as a VarInt. VarInt is an efficient way of encoding variable length integers and is commonly used with Protobuf."; - this.infoURL = "https://developers.google.com/protocol-buffers/docs/encoding#varints"; + this.description = + "Encodes a Vn integer as a VarInt. VarInt is an efficient way of encoding variable length integers and is commonly used with Protobuf."; + this.infoURL = + "https://developers.google.com/protocol-buffers/docs/encoding#varints"; this.inputType = "number"; this.outputType = "byteArray"; this.args = []; @@ -40,7 +41,6 @@ class VarIntEncode extends Operation { throw new OperationError(err); } } - } export default VarIntEncode; diff --git a/src/core/operations/ViewBitPlane.mjs b/src/core/operations/ViewBitPlane.mjs index acdd6cdd..8fc50056 100644 --- a/src/core/operations/ViewBitPlane.mjs +++ b/src/core/operations/ViewBitPlane.mjs @@ -15,7 +15,6 @@ import jimp from "jimp"; * View Bit Plane operation */ class ViewBitPlane extends Operation { - /** * ViewBitPlane constructor */ @@ -24,7 +23,8 @@ class ViewBitPlane extends Operation { this.name = "View Bit Plane"; this.module = "Image"; - this.description = "Extracts and displays a bit plane of any given image. These show only a single bit from each pixel, and can be used to hide messages in Steganography."; + this.description = + "Extracts and displays a bit plane of any given image. These show only a single bit from each pixel, and can be used to hide messages in Steganography."; this.infoURL = "https://wikipedia.org/wiki/Bit_plane"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -33,13 +33,13 @@ class ViewBitPlane extends Operation { { name: "Colour", type: "option", - value: COLOUR_OPTIONS + value: COLOUR_OPTIONS, }, { name: "Bit", type: "number", - value: 0 - } + value: 0, + }, ]; } @@ -49,33 +49,35 @@ class ViewBitPlane extends Operation { * @returns {ArrayBuffer} */ async run(input, args) { - if (!isImage(input)) throw new OperationError("Please enter a valid image file."); + if (!isImage(input)) + throw new OperationError("Please enter a valid image file."); const [colour, bit] = args, parsedImage = await jimp.read(input), width = parsedImage.bitmap.width, height = parsedImage.bitmap.height, colourIndex = COLOUR_OPTIONS.indexOf(colour), - bitIndex = 7-bit; + bitIndex = 7 - bit; if (bit < 0 || bit > 7) { - throw new OperationError("Error: Bit argument must be between 0 and 7"); + throw new OperationError( + "Error: Bit argument must be between 0 and 7", + ); } let pixel, bin, newPixelValue; - parsedImage.scan(0, 0, width, height, function(x, y, idx) { + parsedImage.scan(0, 0, width, height, function (x, y, idx) { pixel = this.bitmap.data[idx + colourIndex]; bin = Utils.bin(pixel); newPixelValue = 255; if (bin.charAt(bitIndex) === "1") newPixelValue = 0; - for (let i=0; i < 3; i++) { + for (let i = 0; i < 3; i++) { this.bitmap.data[idx + i] = newPixelValue; } this.bitmap.data[idx + 3] = 255; - }); const imageBuffer = await parsedImage.getBufferAsync(jimp.AUTO); @@ -94,14 +96,8 @@ class ViewBitPlane extends Operation { return ``; } - } -const COLOUR_OPTIONS = [ - "Red", - "Green", - "Blue", - "Alpha" -]; +const COLOUR_OPTIONS = ["Red", "Green", "Blue", "Alpha"]; export default ViewBitPlane; diff --git a/src/core/operations/VigenèreDecode.mjs b/src/core/operations/VigenèreDecode.mjs index 8abaeed8..ee8a5f8b 100644 --- a/src/core/operations/VigenèreDecode.mjs +++ b/src/core/operations/VigenèreDecode.mjs @@ -10,7 +10,6 @@ import OperationError from "../errors/OperationError.mjs"; * Vigenère Decode operation */ class VigenèreDecode extends Operation { - /** * VigenèreDecode constructor */ @@ -19,16 +18,17 @@ class VigenèreDecode extends Operation { this.name = "Vigenère Decode"; this.module = "Ciphers"; - this.description = "The Vigenere cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution."; + this.description = + "The Vigenere cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution."; this.infoURL = "https://wikipedia.org/wiki/Vigenère_cipher"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "string", - "value": "" - } + name: "Key", + type: "string", + value: "", + }, ]; } @@ -47,7 +47,8 @@ class VigenèreDecode extends Operation { chr; if (!key) throw new OperationError("No key entered"); - if (!/^[a-zA-Z]+$/.test(key)) throw new OperationError("The key must consist only of letters"); + if (!/^[a-zA-Z]+$/.test(key)) + throw new OperationError("The key must consist only of letters"); for (let i = 0; i < input.length; i++) { if (alphabet.indexOf(input[i]) >= 0) { @@ -56,12 +57,16 @@ class VigenèreDecode extends Operation { msgIndex = alphabet.indexOf(input[i]); // Subtract indexes from each other, add 26 just in case the value is negative, // modulo to remove if necessary - output += alphabet[(msgIndex - keyIndex + alphabet.length) % 26]; + output += + alphabet[(msgIndex - keyIndex + alphabet.length) % 26]; } else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) { chr = key[(i - fail) % key.length].toLowerCase(); keyIndex = alphabet.indexOf(chr); msgIndex = alphabet.indexOf(input[i].toLowerCase()); - output += alphabet[(msgIndex + alphabet.length - keyIndex) % 26].toUpperCase(); + output += + alphabet[ + (msgIndex + alphabet.length - keyIndex) % 26 + ].toUpperCase(); } else { output += input[i]; fail++; @@ -96,7 +101,6 @@ class VigenèreDecode extends Operation { highlightReverse(pos, args) { return pos; } - } export default VigenèreDecode; diff --git a/src/core/operations/VigenèreEncode.mjs b/src/core/operations/VigenèreEncode.mjs index db212fe2..647f7816 100644 --- a/src/core/operations/VigenèreEncode.mjs +++ b/src/core/operations/VigenèreEncode.mjs @@ -11,7 +11,6 @@ import OperationError from "../errors/OperationError.mjs"; * Vigenère Encode operation */ class VigenèreEncode extends Operation { - /** * VigenèreEncode constructor */ @@ -20,16 +19,17 @@ class VigenèreEncode extends Operation { this.name = "Vigenère Encode"; this.module = "Ciphers"; - this.description = "The Vigenere cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution."; + this.description = + "The Vigenere cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution."; this.infoURL = "https://wikipedia.org/wiki/Vigenère_cipher"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Key", - "type": "string", - "value": "" - } + name: "Key", + type: "string", + value: "", + }, ]; } @@ -48,7 +48,8 @@ class VigenèreEncode extends Operation { chr; if (!key) throw new OperationError("No key entered"); - if (!/^[a-zA-Z]+$/.test(key)) throw new OperationError("The key must consist only of letters"); + if (!/^[a-zA-Z]+$/.test(key)) + throw new OperationError("The key must consist only of letters"); for (let i = 0; i < input.length; i++) { if (alphabet.indexOf(input[i]) >= 0) { @@ -101,7 +102,6 @@ class VigenèreEncode extends Operation { highlightReverse(pos, args) { return pos; } - } export default VigenèreEncode; diff --git a/src/core/operations/Whirlpool.mjs b/src/core/operations/Whirlpool.mjs index c2364912..17ab8ec2 100644 --- a/src/core/operations/Whirlpool.mjs +++ b/src/core/operations/Whirlpool.mjs @@ -5,13 +5,12 @@ */ import Operation from "../Operation.mjs"; -import {runHash} from "../lib/Hash.mjs"; +import { runHash } from "../lib/Hash.mjs"; /** * Whirlpool operation */ class Whirlpool extends Operation { - /** * Whirlpool constructor */ @@ -20,7 +19,8 @@ class Whirlpool extends Operation { this.name = "Whirlpool"; this.module = "Crypto"; - this.description = "Whirlpool is a cryptographic hash function designed by Vincent Rijmen (co-creator of AES) and Paulo S. L. M. Barreto, who first described it in 2000.

    Several variants exist:
    • Whirlpool-0 is the original version released in 2000.
    • Whirlpool-T is the first revision, released in 2001, improving the generation of the s-box.
    • Whirlpool is the latest revision, released in 2003, fixing a flaw in the diffusion matrix.
    "; + this.description = + "Whirlpool is a cryptographic hash function designed by Vincent Rijmen (co-creator of AES) and Paulo S. L. M. Barreto, who first described it in 2000.

    Several variants exist:
    • Whirlpool-0 is the original version released in 2000.
    • Whirlpool-T is the first revision, released in 2001, improving the generation of the s-box.
    • Whirlpool is the latest revision, released in 2003, fixing a flaw in the diffusion matrix.
    "; this.infoURL = "https://wikipedia.org/wiki/Whirlpool_(cryptography)"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -28,15 +28,15 @@ class Whirlpool extends Operation { { name: "Variant", type: "option", - value: ["Whirlpool", "Whirlpool-T", "Whirlpool-0"] + value: ["Whirlpool", "Whirlpool-T", "Whirlpool-0"], }, { name: "Rounds", type: "number", value: 10, min: 1, - max: 10 - } + max: 10, + }, ]; } @@ -47,9 +47,8 @@ class Whirlpool extends Operation { */ run(input, args) { const variant = args[0].toLowerCase(); - return runHash(variant, input, {rounds: args[1]}); + return runHash(variant, input, { rounds: args[1] }); } - } export default Whirlpool; diff --git a/src/core/operations/WindowsFiletimeToUNIXTimestamp.mjs b/src/core/operations/WindowsFiletimeToUNIXTimestamp.mjs index 786cbcce..04b15c9e 100644 --- a/src/core/operations/WindowsFiletimeToUNIXTimestamp.mjs +++ b/src/core/operations/WindowsFiletimeToUNIXTimestamp.mjs @@ -12,7 +12,6 @@ import OperationError from "../errors/OperationError.mjs"; * Windows Filetime to UNIX Timestamp operation */ class WindowsFiletimeToUNIXTimestamp extends Operation { - /** * WindowsFiletimeToUNIXTimestamp constructor */ @@ -21,21 +20,28 @@ class WindowsFiletimeToUNIXTimestamp extends Operation { this.name = "Windows Filetime to UNIX Timestamp"; this.module = "Default"; - this.description = "Converts a Windows Filetime value to a UNIX timestamp.

    A Windows Filetime is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 UTC.

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch).

    This operation also supports UNIX timestamps in milliseconds, microseconds and nanoseconds."; - this.infoURL = "https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx"; + this.description = + "Converts a Windows Filetime value to a UNIX timestamp.

    A Windows Filetime is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 UTC.

    A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch).

    This operation also supports UNIX timestamps in milliseconds, microseconds and nanoseconds."; + this.infoURL = + "https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Output units", - "type": "option", - "value": ["Seconds (s)", "Milliseconds (ms)", "Microseconds (μs)", "Nanoseconds (ns)"] + name: "Output units", + type: "option", + value: [ + "Seconds (s)", + "Milliseconds (ms)", + "Microseconds (μs)", + "Nanoseconds (ns)", + ], }, { - "name": "Input format", - "type": "option", - "value": ["Decimal", "Hex (big endian)", "Hex (little endian)"] - } + name: "Input format", + type: "option", + value: ["Decimal", "Hex (big endian)", "Hex (little endian)"], + }, ]; } @@ -55,7 +61,11 @@ class WindowsFiletimeToUNIXTimestamp extends Operation { if (input.length % 2 !== 0) { result += input.charAt(input.length - 1); } - for (let i = input.length - input.length % 2 - 2; i >= 0; i -= 2) { + for ( + let i = input.length - (input.length % 2) - 2; + i >= 0; + i -= 2 + ) { result += input.charAt(i); result += input.charAt(i + 1); } @@ -84,7 +94,6 @@ class WindowsFiletimeToUNIXTimestamp extends Operation { return input.toFixed(); } - } export default WindowsFiletimeToUNIXTimestamp; diff --git a/src/core/operations/XKCDRandomNumber.mjs b/src/core/operations/XKCDRandomNumber.mjs index ba9b5e27..684b250b 100644 --- a/src/core/operations/XKCDRandomNumber.mjs +++ b/src/core/operations/XKCDRandomNumber.mjs @@ -10,7 +10,6 @@ import Operation from "../Operation.mjs"; * XKCD Random Number operation */ class XKCDRandomNumber extends Operation { - /** * XKCDRandomNumber constructor */ @@ -19,7 +18,8 @@ class XKCDRandomNumber extends Operation { this.name = "XKCD Random Number"; this.module = "Default"; - this.description = "RFC 1149.5 specifies 4 as the standard IEEE-vetted random number."; + this.description = + "RFC 1149.5 specifies 4 as the standard IEEE-vetted random number."; this.infoURL = "https://xkcd.com/221/"; this.inputType = "string"; this.outputType = "number"; @@ -33,9 +33,8 @@ class XKCDRandomNumber extends Operation { */ run(input, args) { return 4; // chosen by fair dice roll. - // guaranteed to be random. + // guaranteed to be random. } - } export default XKCDRandomNumber; diff --git a/src/core/operations/XMLBeautify.mjs b/src/core/operations/XMLBeautify.mjs index 2cabb9b2..d15f26d5 100644 --- a/src/core/operations/XMLBeautify.mjs +++ b/src/core/operations/XMLBeautify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * XML Beautify operation */ class XMLBeautify extends Operation { - /** * XMLBeautify constructor */ @@ -20,15 +19,16 @@ class XMLBeautify extends Operation { this.name = "XML Beautify"; this.module = "Code"; - this.description = "Indents and prettifies eXtensible Markup Language (XML) code."; + this.description = + "Indents and prettifies eXtensible Markup Language (XML) code."; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "Indent string", - "type": "binaryShortString", - "value": "\\t" - } + name: "Indent string", + type: "binaryShortString", + value: "\\t", + }, ]; } @@ -41,7 +41,6 @@ class XMLBeautify extends Operation { const indentStr = args[0]; return vkbeautify.xml(input, indentStr); } - } export default XMLBeautify; diff --git a/src/core/operations/XMLMinify.mjs b/src/core/operations/XMLMinify.mjs index 5c710951..0908978c 100644 --- a/src/core/operations/XMLMinify.mjs +++ b/src/core/operations/XMLMinify.mjs @@ -11,7 +11,6 @@ import Operation from "../Operation.mjs"; * XML Minify operation */ class XMLMinify extends Operation { - /** * XMLMinify constructor */ @@ -25,10 +24,10 @@ class XMLMinify extends Operation { this.outputType = "string"; this.args = [ { - "name": "Preserve comments", - "type": "boolean", - "value": false - } + name: "Preserve comments", + type: "boolean", + value: false, + }, ]; } @@ -41,7 +40,6 @@ class XMLMinify extends Operation { const preserveComments = args[0]; return vkbeautify.xmlmin(input, preserveComments); } - } export default XMLMinify; diff --git a/src/core/operations/XOR.mjs b/src/core/operations/XOR.mjs index aa228842..fe686610 100644 --- a/src/core/operations/XOR.mjs +++ b/src/core/operations/XOR.mjs @@ -12,7 +12,6 @@ import { bitOp, xor, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs"; * XOR operation */ class XOR extends Operation { - /** * XOR constructor */ @@ -21,27 +20,33 @@ class XOR extends Operation { this.name = "XOR"; this.module = "Default"; - this.description = "XOR the input with the given key.
    e.g. fe023da5

    Options
    Null preserving: If the current byte is 0x00 or the same as the key, skip it.

    Scheme:
    • Standard - key is unchanged after each round
    • Input differential - key is set to the value of the previous unprocessed byte
    • Output differential - key is set to the value of the previous processed byte
    • Cascade - key is set to the input byte shifted by one
    "; + this.description = + "XOR the input with the given key.
    e.g. fe023da5

    Options
    Null preserving: If the current byte is 0x00 or the same as the key, skip it.

    Scheme:
    • Standard - key is unchanged after each round
    • Input differential - key is set to the value of the previous unprocessed byte
    • Output differential - key is set to the value of the previous processed byte
    • Cascade - key is set to the input byte shifted by one
    "; this.infoURL = "https://wikipedia.org/wiki/XOR"; this.inputType = "ArrayBuffer"; this.outputType = "byteArray"; this.args = [ { - "name": "Key", - "type": "toggleString", - "value": "", - "toggleValues": BITWISE_OP_DELIMS + name: "Key", + type: "toggleString", + value: "", + toggleValues: BITWISE_OP_DELIMS, }, { - "name": "Scheme", - "type": "option", - "value": ["Standard", "Input differential", "Output differential", "Cascade"] + name: "Scheme", + type: "option", + value: [ + "Standard", + "Input differential", + "Output differential", + "Cascade", + ], }, { - "name": "Null preserving", - "type": "boolean", - "value": false - } + name: "Null preserving", + type: "boolean", + value: false, + }, ]; } @@ -52,7 +57,10 @@ class XOR extends Operation { */ run(input, args) { input = new Uint8Array(input); - const key = Utils.convertToByteArray(args[0].string || "", args[0].option), + const key = Utils.convertToByteArray( + args[0].string || "", + args[0].option, + ), [, scheme, nullPreserving] = args; return bitOp(input, key, xor, nullPreserving, scheme); @@ -83,7 +91,6 @@ class XOR extends Operation { highlightReverse(pos, args) { return pos; } - } export default XOR; diff --git a/src/core/operations/XORBruteForce.mjs b/src/core/operations/XORBruteForce.mjs index 8c097731..7e462216 100644 --- a/src/core/operations/XORBruteForce.mjs +++ b/src/core/operations/XORBruteForce.mjs @@ -14,7 +14,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * XOR Brute Force operation */ class XORBruteForce extends Operation { - /** * XORBruteForce constructor */ @@ -23,51 +22,56 @@ class XORBruteForce extends Operation { this.name = "XOR Brute Force"; this.module = "Default"; - this.description = "Enumerate all possible XOR solutions. Current maximum key length is 2 due to browser performance.

    Optionally enter a string that you expect to find in the plaintext to filter results (crib)."; + this.description = + "Enumerate all possible XOR solutions. Current maximum key length is 2 due to browser performance.

    Optionally enter a string that you expect to find in the plaintext to filter results (crib)."; this.infoURL = "https://wikipedia.org/wiki/Exclusive_or"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Key length", - "type": "number", - "value": 1 + name: "Key length", + type: "number", + value: 1, }, { - "name": "Sample length", - "type": "number", - "value": 100 + name: "Sample length", + type: "number", + value: 100, }, { - "name": "Sample offset", - "type": "number", - "value": 0 + name: "Sample offset", + type: "number", + value: 0, }, { - "name": "Scheme", - "type": "option", - "value": ["Standard", "Input differential", "Output differential"] + name: "Scheme", + type: "option", + value: [ + "Standard", + "Input differential", + "Output differential", + ], }, { - "name": "Null preserving", - "type": "boolean", - "value": false + name: "Null preserving", + type: "boolean", + value: false, }, { - "name": "Print key", - "type": "boolean", - "value": true + name: "Print key", + type: "boolean", + value: true, }, { - "name": "Output as hex", - "type": "boolean", - "value": false + name: "Output as hex", + type: "boolean", + value: false, }, { - "name": "Crib (known plaintext string)", - "type": "binaryString", - "value": "" - } + name: "Crib (known plaintext string)", + type: "binaryString", + value: "", + }, ]; } @@ -86,7 +90,7 @@ class XORBruteForce extends Operation { nullPreserving, printKey, outputHex, - rawCrib + rawCrib, ] = args, crib = rawCrib.toLowerCase(), output = []; @@ -97,7 +101,9 @@ class XORBruteForce extends Operation { input = input.slice(sampleOffset, sampleOffset + sampleLength); if (isWorkerEnvironment()) - self.sendStatusMessage("Calculating " + Math.pow(256, keyLength) + " values..."); + self.sendStatusMessage( + "Calculating " + Math.pow(256, keyLength) + " values...", + ); /** * Converts an integer to an array of bytes expressing that number. @@ -117,23 +123,37 @@ class XORBruteForce extends Operation { for (let key = 1, l = Math.pow(256, keyLength); key < l; key++) { if (key % 10000 === 0 && isWorkerEnvironment()) { - self.sendStatusMessage("Calculating " + l + " values... " + Math.floor(key / l * 100) + "%"); + self.sendStatusMessage( + "Calculating " + + l + + " values... " + + Math.floor((key / l) * 100) + + "%", + ); } - result = bitOp(input, intToByteArray(key, keyLength), xor, nullPreserving, scheme); + result = bitOp( + input, + intToByteArray(key, keyLength), + xor, + nullPreserving, + scheme, + ); resultUtf8 = Utils.byteArrayToUtf8(result); record = ""; if (crib && resultUtf8.toLowerCase().indexOf(crib) < 0) continue; - if (printKey) record += "Key = " + Utils.hex(key, (2*keyLength)) + ": "; - record += outputHex ? toHex(result) : Utils.escapeWhitespace(resultUtf8); + if (printKey) + record += "Key = " + Utils.hex(key, 2 * keyLength) + ": "; + record += outputHex + ? toHex(result) + : Utils.escapeWhitespace(resultUtf8); output.push(record); } return output.join("\n"); } - } export default XORBruteForce; diff --git a/src/core/operations/XPathExpression.mjs b/src/core/operations/XPathExpression.mjs index 7bfe3ee1..8444e761 100644 --- a/src/core/operations/XPathExpression.mjs +++ b/src/core/operations/XPathExpression.mjs @@ -13,7 +13,6 @@ import xpath from "xpath"; * XPath expression operation */ class XPathExpression extends Operation { - /** * XPathExpression constructor */ @@ -22,21 +21,22 @@ class XPathExpression extends Operation { this.name = "XPath expression"; this.module = "Code"; - this.description = "Extract information from an XML document with an XPath query"; + this.description = + "Extract information from an XML document with an XPath query"; this.infoURL = "https://wikipedia.org/wiki/XPath"; this.inputType = "string"; this.outputType = "string"; this.args = [ { - "name": "XPath", - "type": "string", - "value": "" + name: "XPath", + type: "string", + value: "", }, { - "name": "Result delimiter", - "type": "binaryShortString", - "value": "\\n" - } + name: "Result delimiter", + type: "binaryShortString", + value: "\\n", + }, ]; } @@ -60,8 +60,8 @@ class XPathExpression extends Operation { }, fatalError(e) { throw e; - } - } + }, + }, }).parseFromString(input, "application/xml"); } catch (err) { throw new OperationError("Invalid input XML."); @@ -69,18 +69,21 @@ class XPathExpression extends Operation { let nodes; try { - nodes = xpath.parse(query).select({ node: doc, allowAnyNamespaceForNoPrefix: true }); + nodes = xpath + .parse(query) + .select({ node: doc, allowAnyNamespaceForNoPrefix: true }); } catch (err) { - throw new OperationError(`Invalid XPath. Details:\n${err.message}.`); + throw new OperationError( + `Invalid XPath. Details:\n${err.message}.`, + ); } - const nodeToString = function(node) { + const nodeToString = function (node) { return node.toString(); }; return nodes.map(nodeToString).join(delimiter); } - } export default XPathExpression; diff --git a/src/core/operations/YARARules.mjs b/src/core/operations/YARARules.mjs index d91f50ae..8a679e61 100644 --- a/src/core/operations/YARARules.mjs +++ b/src/core/operations/YARARules.mjs @@ -13,7 +13,6 @@ import { isWorkerEnvironment } from "../Utils.mjs"; * YARA Rules operation */ class YARARules extends Operation { - /** * YARARules constructor */ @@ -22,7 +21,8 @@ class YARARules extends Operation { this.name = "YARA Rules"; this.module = "Yara"; - this.description = "YARA is a tool developed at VirusTotal, primarily aimed at helping malware researchers to identify and classify malware samples. It matches based on rules specified by the user containing textual or binary patterns and a boolean expression. For help on writing rules, see the YARA documentation."; + this.description = + "YARA is a tool developed at VirusTotal, primarily aimed at helping malware researchers to identify and classify malware samples. It matches based on rules specified by the user containing textual or binary patterns and a boolean expression. For help on writing rules, see the YARA documentation."; this.infoURL = "https://wikipedia.org/wiki/YARA"; this.inputType = "ArrayBuffer"; this.outputType = "string"; @@ -31,37 +31,37 @@ class YARARules extends Operation { name: "Rules", type: "text", value: "", - rows: 5 + rows: 5, }, { name: "Show strings", type: "boolean", - value: false + value: false, }, { name: "Show string lengths", type: "boolean", - value: false + value: false, }, { name: "Show metadata", type: "boolean", - value: false + value: false, }, { name: "Show counts", type: "boolean", - value: true + value: true, }, { name: "Show rule warnings", type: "boolean", - value: true + value: true, }, { name: "Show console module messages", type: "boolean", - value: true + value: true, }, ]; } @@ -74,25 +74,40 @@ class YARARules extends Operation { async run(input, args) { if (isWorkerEnvironment()) self.sendStatusMessage("Instantiating YARA..."); - const [rules, showStrings, showLengths, showMeta, showCounts, showRuleWarns, showConsole] = args; + const [ + rules, + showStrings, + showLengths, + showMeta, + showCounts, + showRuleWarns, + showConsole, + ] = args; return new Promise((resolve, reject) => { - Yara().then(yara => { - if (isWorkerEnvironment()) self.sendStatusMessage("Converting data for YARA."); + Yara().then((yara) => { + if (isWorkerEnvironment()) + self.sendStatusMessage("Converting data for YARA."); let matchString = ""; const inpArr = new Uint8Array(input); // Turns out embind knows that JS uint8array <==> C++ std::string - if (isWorkerEnvironment()) self.sendStatusMessage("Running YARA matching."); + if (isWorkerEnvironment()) + self.sendStatusMessage("Running YARA matching."); const resp = yara.run(inpArr, rules); - if (isWorkerEnvironment()) self.sendStatusMessage("Processing data."); + if (isWorkerEnvironment()) + self.sendStatusMessage("Processing data."); if (resp.compileErrors.size() > 0) { for (let i = 0; i < resp.compileErrors.size(); i++) { const compileError = resp.compileErrors.get(i); if (!compileError.warning) { - reject(new OperationError(`Error on line ${compileError.lineNumber}: ${compileError.message}`)); + reject( + new OperationError( + `Error on line ${compileError.lineNumber}: ${compileError.message}`, + ), + ); } else if (showRuleWarns) { matchString += `Warning on line ${compileError.lineNumber}: ${compileError.message}\n`; } @@ -114,19 +129,38 @@ class YARARules extends Operation { if (showMeta && rule.metadata.size() > 0) { meta += " ["; for (let j = 0; j < rule.metadata.size(); j++) { - meta += `${rule.metadata.get(j).identifier}: ${rule.metadata.get(j).data}, `; + meta += `${rule.metadata.get(j).identifier}: ${ + rule.metadata.get(j).data + }, `; } meta = meta.slice(0, -2) + "]"; } - const countString = matches.size() === 0 ? "" : (showCounts ? ` (${matches.size()} time${matches.size() > 1 ? "s" : ""})` : ""); + const countString = + matches.size() === 0 + ? "" + : showCounts + ? ` (${matches.size()} time${ + matches.size() > 1 ? "s" : "" + })` + : ""; if (matches.size() === 0 || !(showStrings || showLengths)) { - matchString += `Input matches rule "${rule.ruleName}"${meta}${countString.length > 0 ? ` ${countString}`: ""}.\n`; + matchString += `Input matches rule "${ + rule.ruleName + }"${meta}${ + countString.length > 0 ? ` ${countString}` : "" + }.\n`; } else { matchString += `Rule "${rule.ruleName}"${meta} matches${countString}:\n`; for (let j = 0; j < matches.size(); j++) { const match = matches.get(j); if (showStrings || showLengths) { - matchString += `Pos ${match.location}, ${showLengths ? `length ${match.matchLength}, ` : ""}identifier ${match.stringIdentifier}${showStrings ? `, data: "${match.data}"` : ""}\n`; + matchString += `Pos ${match.location}, ${ + showLengths + ? `length ${match.matchLength}, ` + : "" + }identifier ${match.stringIdentifier}${ + showStrings ? `, data: "${match.data}"` : "" + }\n`; } } } @@ -135,7 +169,6 @@ class YARARules extends Operation { }); }); } - } export default YARARules; diff --git a/src/core/operations/Zip.mjs b/src/core/operations/Zip.mjs index dbe51462..98df9acf 100644 --- a/src/core/operations/Zip.mjs +++ b/src/core/operations/Zip.mjs @@ -6,27 +6,29 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import {COMPRESSION_TYPE, ZLIB_COMPRESSION_TYPE_LOOKUP} from "../lib/Zlib.mjs"; +import { + COMPRESSION_TYPE, + ZLIB_COMPRESSION_TYPE_LOOKUP, +} from "../lib/Zlib.mjs"; import zip from "zlibjs/bin/zip.min.js"; const Zlib = zip.Zlib; const ZIP_COMPRESSION_METHOD_LOOKUP = { - "Deflate": Zlib.Zip.CompressionMethod.DEFLATE, - "None (Store)": Zlib.Zip.CompressionMethod.STORE + Deflate: Zlib.Zip.CompressionMethod.DEFLATE, + "None (Store)": Zlib.Zip.CompressionMethod.STORE, }; const ZIP_OS_LOOKUP = { - "MSDOS": Zlib.Zip.OperatingSystem.MSDOS, - "Unix": Zlib.Zip.OperatingSystem.UNIX, - "Macintosh": Zlib.Zip.OperatingSystem.MACINTOSH + MSDOS: Zlib.Zip.OperatingSystem.MSDOS, + Unix: Zlib.Zip.OperatingSystem.UNIX, + Macintosh: Zlib.Zip.OperatingSystem.MACINTOSH, }; /** * Zip operation */ class Zip extends Operation { - /** * Zip constructor */ @@ -35,7 +37,8 @@ class Zip extends Operation { this.name = "Zip"; this.module = "Compression"; - this.description = "Compresses data using the PKZIP algorithm with the given filename.

    No support for multiple files at this time."; + this.description = + "Compresses data using the PKZIP algorithm with the given filename.

    No support for multiple files at this time."; this.infoURL = "https://wikipedia.org/wiki/Zip_(file_format)"; this.inputType = "ArrayBuffer"; this.outputType = "File"; @@ -43,33 +46,33 @@ class Zip extends Operation { { name: "Filename", type: "string", - value: "file.txt" + value: "file.txt", }, { name: "Comment", type: "string", - value: "" + value: "", }, { name: "Password", type: "binaryString", - value: "" + value: "", }, { name: "Compression method", type: "option", - value: ["Deflate", "None (Store)"] + value: ["Deflate", "None (Store)"], }, { name: "Operating system", type: "option", - value: ["MSDOS", "Unix", "Macintosh"] + value: ["MSDOS", "Unix", "Macintosh"], }, { name: "Compression type", type: "option", - value: COMPRESSION_TYPE - } + value: COMPRESSION_TYPE, + }, ]; } @@ -87,17 +90,15 @@ class Zip extends Operation { compressionMethod: ZIP_COMPRESSION_METHOD_LOOKUP[args[3]], os: ZIP_OS_LOOKUP[args[4]], deflateOption: { - compressionType: ZLIB_COMPRESSION_TYPE_LOOKUP[args[5]] + compressionType: ZLIB_COMPRESSION_TYPE_LOOKUP[args[5]], }, }, zip = new Zlib.Zip(); - if (password.length) - zip.setPassword(password); + if (password.length) zip.setPassword(password); zip.addFile(new Uint8Array(input), options); return new File([zip.compress()], filename); } - } export default Zip; diff --git a/src/core/operations/ZlibDeflate.mjs b/src/core/operations/ZlibDeflate.mjs index 4436d84a..be71c414 100644 --- a/src/core/operations/ZlibDeflate.mjs +++ b/src/core/operations/ZlibDeflate.mjs @@ -5,7 +5,10 @@ */ import Operation from "../Operation.mjs"; -import {COMPRESSION_TYPE, ZLIB_COMPRESSION_TYPE_LOOKUP} from "../lib/Zlib.mjs"; +import { + COMPRESSION_TYPE, + ZLIB_COMPRESSION_TYPE_LOOKUP, +} from "../lib/Zlib.mjs"; import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min.js"; const Zlib = zlibAndGzip.Zlib; @@ -14,7 +17,6 @@ const Zlib = zlibAndGzip.Zlib; * Zlib Deflate operation */ class ZlibDeflate extends Operation { - /** * ZlibDeflate constructor */ @@ -23,7 +25,8 @@ class ZlibDeflate extends Operation { this.name = "Zlib Deflate"; this.module = "Compression"; - this.description = "Compresses data using the deflate algorithm adding zlib headers."; + this.description = + "Compresses data using the deflate algorithm adding zlib headers."; this.infoURL = "https://wikipedia.org/wiki/Zlib"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -31,8 +34,8 @@ class ZlibDeflate extends Operation { { name: "Compression type", type: "option", - value: COMPRESSION_TYPE - } + value: COMPRESSION_TYPE, + }, ]; } @@ -43,11 +46,10 @@ class ZlibDeflate extends Operation { */ run(input, args) { const deflate = new Zlib.Deflate(new Uint8Array(input), { - compressionType: ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]] + compressionType: ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]], }); return new Uint8Array(deflate.compress()).buffer; } - } export default ZlibDeflate; diff --git a/src/core/operations/ZlibInflate.mjs b/src/core/operations/ZlibInflate.mjs index a24d7476..cc286614 100644 --- a/src/core/operations/ZlibInflate.mjs +++ b/src/core/operations/ZlibInflate.mjs @@ -5,21 +5,20 @@ */ import Operation from "../Operation.mjs"; -import {INFLATE_BUFFER_TYPE} from "../lib/Zlib.mjs"; +import { INFLATE_BUFFER_TYPE } from "../lib/Zlib.mjs"; import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min.js"; const Zlib = zlibAndGzip.Zlib; const ZLIB_BUFFER_TYPE_LOOKUP = { - "Adaptive": Zlib.Inflate.BufferType.ADAPTIVE, - "Block": Zlib.Inflate.BufferType.BLOCK, + Adaptive: Zlib.Inflate.BufferType.ADAPTIVE, + Block: Zlib.Inflate.BufferType.BLOCK, }; /** * Zlib Inflate operation */ class ZlibInflate extends Operation { - /** * ZlibInflate constructor */ @@ -28,7 +27,8 @@ class ZlibInflate extends Operation { this.name = "Zlib Inflate"; this.module = "Compression"; - this.description = "Decompresses data which has been compressed using the deflate algorithm with zlib headers."; + this.description = + "Decompresses data which has been compressed using the deflate algorithm with zlib headers."; this.infoURL = "https://wikipedia.org/wiki/Zlib"; this.inputType = "ArrayBuffer"; this.outputType = "ArrayBuffer"; @@ -36,34 +36,34 @@ class ZlibInflate extends Operation { { name: "Start index", type: "number", - value: 0 + value: 0, }, { name: "Initial output buffer size", type: "number", - value: 0 + value: 0, }, { name: "Buffer expansion type", type: "option", - value: INFLATE_BUFFER_TYPE + value: INFLATE_BUFFER_TYPE, }, { name: "Resize buffer after decompression", type: "boolean", - value: false + value: false, }, { name: "Verify result", type: "boolean", - value: false - } + value: false, + }, ]; this.checks = [ { pattern: "^\\x78(\\x01|\\x9c|\\xda|\\x5e)", flags: "", - args: [0, 0, "Adaptive", false, false] + args: [0, 0, "Adaptive", false, false], }, ]; } @@ -79,11 +79,10 @@ class ZlibInflate extends Operation { bufferSize: args[1], bufferType: ZLIB_BUFFER_TYPE_LOOKUP[args[2]], resize: args[3], - verify: args[4] + verify: args[4], }); return new Uint8Array(inflate.decompress()).buffer; } - } export default ZlibInflate; diff --git a/src/core/vendor/DisassembleX86-64.mjs b/src/core/vendor/DisassembleX86-64.mjs index 5f0ac65d..cd47992f 100644 --- a/src/core/vendor/DisassembleX86-64.mjs +++ b/src/core/vendor/DisassembleX86-64.mjs @@ -25,7 +25,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------------------------------------------------*/ - /*------------------------------------------------------------------------------------------------------------------------- Binary byte code array. --------------------------------------------------------------------------------------------------------------------------- @@ -57,7 +56,8 @@ into the BinCode array using the Function ^LoadBinCode()^. The function ^SetBasePosition()^ sets the base location in Pos64, and Pos32, and Code Segment. -------------------------------------------------------------------------------------------------------------------------*/ -var Pos64 = 0x00000000, Pos32 = 0x00000000; +var Pos64 = 0x00000000, + Pos32 = 0x00000000; /*------------------------------------------------------------------------------------------------------------------------- Code Segment is used in 16 bit binaries in which the segment is times 16 (Left Shift 4) added to the 16 bit address position. @@ -157,1157 +157,3666 @@ The function ^DecodeOpcode()^ Gives back the instructions name. --------------------------------------------------------------------------------------------------------------------------*/ const Mnemonics = [ - /*------------------------------------------------------------------------------------------------------------------------ + /*------------------------------------------------------------------------------------------------------------------------ First Byte operations 0 to 255. ------------------------------------------------------------------------------------------------------------------------*/ - "ADD","ADD","ADD","ADD","ADD","ADD","PUSH ES","POP ES", - "OR","OR","OR","OR","OR","OR","PUSH CS" - , - "" //*Two byte instructions prefix sets opcode 01,000000000 next byte read is added to the lower 8 bit's. - , - "ADC","ADC","ADC","ADC","ADC","ADC","PUSH SS","POP SS", - "SBB","SBB","SBB","SBB","SBB","SBB","PUSH DS","POP DS", - "AND","AND","AND","AND","AND","AND", - "ES:[", //Extra segment override sets SegOveride "ES:[". - "DAA", - "SUB","SUB","SUB","SUB","SUB","SUB", - "CS:[", //Code segment override sets SegOveride "CS:[". - "DAS", - "XOR","XOR","XOR","XOR","XOR","XOR", - "SS:[", //Stack segment override sets SegOveride "SS:[". - "AAA", - "CMP","CMP","CMP","CMP","CMP","CMP", - "DS:[", //Data Segment override sets SegOveride "DS:[". - "AAS", - /*------------------------------------------------------------------------------------------------------------------------ + "ADD", + "ADD", + "ADD", + "ADD", + "ADD", + "ADD", + "PUSH ES", + "POP ES", + "OR", + "OR", + "OR", + "OR", + "OR", + "OR", + "PUSH CS", + "", //*Two byte instructions prefix sets opcode 01,000000000 next byte read is added to the lower 8 bit's. + "ADC", + "ADC", + "ADC", + "ADC", + "ADC", + "ADC", + "PUSH SS", + "POP SS", + "SBB", + "SBB", + "SBB", + "SBB", + "SBB", + "SBB", + "PUSH DS", + "POP DS", + "AND", + "AND", + "AND", + "AND", + "AND", + "AND", + "ES:[", //Extra segment override sets SegOveride "ES:[". + "DAA", + "SUB", + "SUB", + "SUB", + "SUB", + "SUB", + "SUB", + "CS:[", //Code segment override sets SegOveride "CS:[". + "DAS", + "XOR", + "XOR", + "XOR", + "XOR", + "XOR", + "XOR", + "SS:[", //Stack segment override sets SegOveride "SS:[". + "AAA", + "CMP", + "CMP", + "CMP", + "CMP", + "CMP", + "CMP", + "DS:[", //Data Segment override sets SegOveride "DS:[". + "AAS", + /*------------------------------------------------------------------------------------------------------------------------ Start of Rex Prefix adjustment setting uses opcodes 40 to 4F. These opcodes are only decoded as adjustment settings by the function ^DecodePrefixAdjustments()^ while in 64 bit mode. If not in 64 bit mode the codes are not read by the function ^DecodePrefixAdjustments()^ which allows the opcode to be set 40 to 4F hex in which the defined instructions bellow are used by ^DecodeOpcode()^. ------------------------------------------------------------------------------------------------------------------------*/ - "INC","INC","INC","INC","INC","INC","INC","INC", - "DEC","DEC","DEC","DEC","DEC","DEC","DEC","DEC", - /*------------------------------------------------------------------------------------------------------------------------ + "INC", + "INC", + "INC", + "INC", + "INC", + "INC", + "INC", + "INC", + "DEC", + "DEC", + "DEC", + "DEC", + "DEC", + "DEC", + "DEC", + "DEC", + /*------------------------------------------------------------------------------------------------------------------------ End of the Rex Prefix adjustment setting opcodes. ------------------------------------------------------------------------------------------------------------------------*/ - "PUSH","PUSH","PUSH","PUSH","PUSH","PUSH","PUSH","PUSH", - "POP","POP","POP","POP","POP","POP","POP","POP", - ["PUSHA","PUSHAD",""],["POPA","POPAD",""], - ["BOUND","BOUND",""], //EVEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined BOUND instruction is used. - "MOVSXD", - "FS:[","GS:[", //Sets SegOveride "FS:[" next opcode sets "GS:[". - "","", //Operand Size, and Address size adjustment to ModR/M. - "PUSH","IMUL","PUSH","IMUL", - "INS","INS","OUTS","OUTS", - "JO","JNO","JB","JAE","JE","JNE","JBE","JA", - "JS","JNS","JP","JNP","JL","JGE","JLE","JG", - ["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"], //Group opcode uses the ModR/M register selection 0 though 7 giving 8 instruction in one opcode. - ["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"], - ["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"], - ["ADD","OR","ADC","SBB","AND","SUB","XOR","CMP"], - "TEST","TEST","XCHG","XCHG", - "MOV","MOV","MOV","MOV","MOV", - ["LEA","???"], //*ModR/M Register, and memory mode separation. - "MOV", - ["POP","???","???","???","???","???","???","???"], - [["NOP","","",""],["NOP","","",""],["PAUSE","","",""],["NOP","","",""]], - "XCHG","XCHG","XCHG","XCHG","XCHG","XCHG","XCHG", - ["CWDE","CBW","CDQE"], //*Opcode 0 to 3 for instructions that change name by size setting. - ["CDQ","CWD","CQO"], - "CALL","WAIT", - ["PUSHFQ","PUSHF","PUSHFQ"], - ["POPFQ","POPF","POPFQ"], - "SAHF","LAHF", - "MOV","MOV","MOV","MOV", - "MOVS","MOVS", - "CMPS","CMPS", - "TEST","TEST", - "STOS","STOS", - "LODS","LODS", - "SCAS","SCAS", - "MOV","MOV","MOV","MOV","MOV","MOV","MOV","MOV", - "MOV","MOV","MOV","MOV","MOV","MOV","MOV","MOV", - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - "RET","RET", - "LES", //VEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined instruction is used. - "LDS", //VEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined instruction is used. - [ - "MOV","???","???","???","???","???","???", - ["XABORT","XABORT","XABORT","XABORT","XABORT","XABORT","XABORT","XABORT"] - ], - [ - "MOV","???","???","???","???","???","???", - ["XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN","XBEGIN"] - ], - "ENTER","LEAVE","RETF","RETF","INT","INT","INTO", - ["IRETD","IRET","IRETQ"], - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - ["ROL","ROR","RCL","RCR","SHL","SHR","SAL","SAR"], - "AAMB","AADB","???", - "XLAT", - /*------------------------------------------------------------------------------------------------------------------------ + "PUSH", + "PUSH", + "PUSH", + "PUSH", + "PUSH", + "PUSH", + "PUSH", + "PUSH", + "POP", + "POP", + "POP", + "POP", + "POP", + "POP", + "POP", + "POP", + ["PUSHA", "PUSHAD", ""], + ["POPA", "POPAD", ""], + ["BOUND", "BOUND", ""], //EVEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined BOUND instruction is used. + "MOVSXD", + "FS:[", + "GS:[", //Sets SegOveride "FS:[" next opcode sets "GS:[". + "", + "", //Operand Size, and Address size adjustment to ModR/M. + "PUSH", + "IMUL", + "PUSH", + "IMUL", + "INS", + "INS", + "OUTS", + "OUTS", + "JO", + "JNO", + "JB", + "JAE", + "JE", + "JNE", + "JBE", + "JA", + "JS", + "JNS", + "JP", + "JNP", + "JL", + "JGE", + "JLE", + "JG", + ["ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"], //Group opcode uses the ModR/M register selection 0 though 7 giving 8 instruction in one opcode. + ["ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"], + ["ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"], + ["ADD", "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP"], + "TEST", + "TEST", + "XCHG", + "XCHG", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + ["LEA", "???"], //*ModR/M Register, and memory mode separation. + "MOV", + ["POP", "???", "???", "???", "???", "???", "???", "???"], + [ + ["NOP", "", "", ""], + ["NOP", "", "", ""], + ["PAUSE", "", "", ""], + ["NOP", "", "", ""], + ], + "XCHG", + "XCHG", + "XCHG", + "XCHG", + "XCHG", + "XCHG", + "XCHG", + ["CWDE", "CBW", "CDQE"], //*Opcode 0 to 3 for instructions that change name by size setting. + ["CDQ", "CWD", "CQO"], + "CALL", + "WAIT", + ["PUSHFQ", "PUSHF", "PUSHFQ"], + ["POPFQ", "POPF", "POPFQ"], + "SAHF", + "LAHF", + "MOV", + "MOV", + "MOV", + "MOV", + "MOVS", + "MOVS", + "CMPS", + "CMPS", + "TEST", + "TEST", + "STOS", + "STOS", + "LODS", + "LODS", + "SCAS", + "SCAS", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + "MOV", + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + "RET", + "RET", + "LES", //VEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined instruction is used. + "LDS", //VEX prefix adjustment settings only if used in register to register, or in 64 bit mode, otherwise the defined instruction is used. + [ + "MOV", + "???", + "???", + "???", + "???", + "???", + "???", + [ + "XABORT", + "XABORT", + "XABORT", + "XABORT", + "XABORT", + "XABORT", + "XABORT", + "XABORT", + ], + ], + [ + "MOV", + "???", + "???", + "???", + "???", + "???", + "???", + [ + "XBEGIN", + "XBEGIN", + "XBEGIN", + "XBEGIN", + "XBEGIN", + "XBEGIN", + "XBEGIN", + "XBEGIN", + ], + ], + "ENTER", + "LEAVE", + "RETF", + "RETF", + "INT", + "INT", + "INTO", + ["IRETD", "IRET", "IRETQ"], + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + ["ROL", "ROR", "RCL", "RCR", "SHL", "SHR", "SAL", "SAR"], + "AAMB", + "AADB", + "???", + "XLAT", + /*------------------------------------------------------------------------------------------------------------------------ X87 FPU. ------------------------------------------------------------------------------------------------------------------------*/ - [ - ["FADD","FMUL","FCOM","FCOMP","FSUB","FSUBR","FDIV","FDIVR"], - ["FADD","FMUL","FCOM","FCOMP","FSUB","FSUBR","FDIV","FDIVR"] - ], - [ - ["FLD","???","FST","FSTP","FLDENV","FLDCW","FNSTENV","FNSTCW"], [ - "FLD","FXCH", - ["FNOP","???","???","???","???","???","???","???"], - "FSTP1", - ["FCHS","FABS","???","???","FTST","FXAM","???","???"], - ["FLD1","FLDL2T","FLDL2E","FLDPI","FLDLG2","FLDLN2","FLDZ","???"], - ["F2XM1","FYL2X","FPTAN","FPATAN","FXTRACT","FPREM1","FDECSTP","FINCSTP"], - ["FPREM","FYL2XP1","FSQRT","FSINCOS","FRNDINT","FSCALE","FSIN","FCOS"] - ] - ], - [ - ["FIADD","FIMUL","FICOM","FICOMP","FISUB","FISUBR","FIDIV","FIDIVR"], + ["FADD", "FMUL", "FCOM", "FCOMP", "FSUB", "FSUBR", "FDIV", "FDIVR"], + ["FADD", "FMUL", "FCOM", "FCOMP", "FSUB", "FSUBR", "FDIV", "FDIVR"], + ], [ - "FCMOVB","FCMOVE","FCMOVBE","FCMOVU","???", - ["???","FUCOMPP","???","???","???","???","???","???"], - "???","???" - ] - ], - [ - ["FILD","FISTTP","FIST","FISTP","???","FLD","???","FSTP"], + ["FLD", "???", "FST", "FSTP", "FLDENV", "FLDCW", "FNSTENV", "FNSTCW"], + [ + "FLD", + "FXCH", + ["FNOP", "???", "???", "???", "???", "???", "???", "???"], + "FSTP1", + ["FCHS", "FABS", "???", "???", "FTST", "FXAM", "???", "???"], + [ + "FLD1", + "FLDL2T", + "FLDL2E", + "FLDPI", + "FLDLG2", + "FLDLN2", + "FLDZ", + "???", + ], + [ + "F2XM1", + "FYL2X", + "FPTAN", + "FPATAN", + "FXTRACT", + "FPREM1", + "FDECSTP", + "FINCSTP", + ], + [ + "FPREM", + "FYL2XP1", + "FSQRT", + "FSINCOS", + "FRNDINT", + "FSCALE", + "FSIN", + "FCOS", + ], + ], + ], [ - "CMOVNB","FCMOVNE","FCMOVNBE","FCMOVNU", - ["FENI","FDISI","FNCLEX","FNINIT","FSETPM","???","???","???"], - "FUCOMI","FCOMI","???" - ] - ], - [ - ["FADD","FMUL","FCOM","DCOMP","FSUB","FSUBR","FDIV","FDIVR"], - ["FADD","FMUL","FCOM2","FCOMP3","FSUBR","FSUB","FDIVR","FDIV"] - ], - [ - ["FLD","FISTTP","FST","FSTP","FRSTOR","???","FNSAVE","FNSTSW"], - ["FFREE","FXCH4","FST","FSTP","FUCOM","FUCOMP","???","???"] - ], - [ - ["FIADD","FIMUL","FICOM","FICOMP","FISUB","FISUBR","FIDIV","FIDIVR"], + [ + "FIADD", + "FIMUL", + "FICOM", + "FICOMP", + "FISUB", + "FISUBR", + "FIDIV", + "FIDIVR", + ], + [ + "FCMOVB", + "FCMOVE", + "FCMOVBE", + "FCMOVU", + "???", + ["???", "FUCOMPP", "???", "???", "???", "???", "???", "???"], + "???", + "???", + ], + ], [ - "FADDP","FMULP","FCOMP5", - ["???","FCOMPP","???","???","???","???","???","???"], - "FSUBRP","FSUBP","FDIVRP","FDIVP" - ] - ], - [ - ["FILD","FISTTP","FIST","FISTP","FBLD","FILD","FBSTP","FISTP"], + ["FILD", "FISTTP", "FIST", "FISTP", "???", "FLD", "???", "FSTP"], + [ + "CMOVNB", + "FCMOVNE", + "FCMOVNBE", + "FCMOVNU", + [ + "FENI", + "FDISI", + "FNCLEX", + "FNINIT", + "FSETPM", + "???", + "???", + "???", + ], + "FUCOMI", + "FCOMI", + "???", + ], + ], [ - "FFREEP","FXCH7","FSTP8","FSTP9", - ["FNSTSW","???","???","???","???","???","???","???"], - "FUCOMIP","FCOMIP","???" - ] - ], - /*------------------------------------------------------------------------------------------------------------------------ + ["FADD", "FMUL", "FCOM", "DCOMP", "FSUB", "FSUBR", "FDIV", "FDIVR"], + ["FADD", "FMUL", "FCOM2", "FCOMP3", "FSUBR", "FSUB", "FDIVR", "FDIV"], + ], + [ + ["FLD", "FISTTP", "FST", "FSTP", "FRSTOR", "???", "FNSAVE", "FNSTSW"], + ["FFREE", "FXCH4", "FST", "FSTP", "FUCOM", "FUCOMP", "???", "???"], + ], + [ + [ + "FIADD", + "FIMUL", + "FICOM", + "FICOMP", + "FISUB", + "FISUBR", + "FIDIV", + "FIDIVR", + ], + [ + "FADDP", + "FMULP", + "FCOMP5", + ["???", "FCOMPP", "???", "???", "???", "???", "???", "???"], + "FSUBRP", + "FSUBP", + "FDIVRP", + "FDIVP", + ], + ], + [ + ["FILD", "FISTTP", "FIST", "FISTP", "FBLD", "FILD", "FBSTP", "FISTP"], + [ + "FFREEP", + "FXCH7", + "FSTP8", + "FSTP9", + ["FNSTSW", "???", "???", "???", "???", "???", "???", "???"], + "FUCOMIP", + "FCOMIP", + "???", + ], + ], + /*------------------------------------------------------------------------------------------------------------------------ End of X87 FPU. ------------------------------------------------------------------------------------------------------------------------*/ - "LOOPNE","LOOPE","LOOP","JRCXZ", - "IN","IN","OUT","OUT", - "CALL","JMP","JMP","JMP", - "IN","IN","OUT","OUT", - /*------------------------------------------------------------------------------------------------------------------------ + "LOOPNE", + "LOOPE", + "LOOP", + "JRCXZ", + "IN", + "IN", + "OUT", + "OUT", + "CALL", + "JMP", + "JMP", + "JMP", + "IN", + "IN", + "OUT", + "OUT", + /*------------------------------------------------------------------------------------------------------------------------ The Repeat, and lock prefix opcodes apply to the next opcode. ------------------------------------------------------------------------------------------------------------------------*/ - "LOCK", //Adds LOCK to the start of instruction. When Opcode F0 hex is read by function ^DecodePrefixAdjustments()^ sets PrefixG2 to LOCK. - "ICEBP", //Instruction ICEBP. - "REPNE", //Adds REPNE (Opcode F2 hex) to the start of instruction. Read by function ^DecodePrefixAdjustments()^ sets PrefixG1 to REPNE. - "REP", //Adds REP (Opcode F3 hex) to the start of instruction. Read by function ^DecodePrefixAdjustments()^ sets PrefixG1 to REP. - /*------------------------------------------------------------------------------------------------------------------------ + "LOCK", //Adds LOCK to the start of instruction. When Opcode F0 hex is read by function ^DecodePrefixAdjustments()^ sets PrefixG2 to LOCK. + "ICEBP", //Instruction ICEBP. + "REPNE", //Adds REPNE (Opcode F2 hex) to the start of instruction. Read by function ^DecodePrefixAdjustments()^ sets PrefixG1 to REPNE. + "REP", //Adds REP (Opcode F3 hex) to the start of instruction. Read by function ^DecodePrefixAdjustments()^ sets PrefixG1 to REP. + /*------------------------------------------------------------------------------------------------------------------------ End of Repeat, and lock instruction adjustment codes. ------------------------------------------------------------------------------------------------------------------------*/ - "HLT","CMC", - ["TEST","???","NOT","NEG","MUL","IMUL","DIV","IDIV"], - ["TEST","???","NOT","NEG","MUL","IMUL","DIV","IDIV"], - "CLC","STC","CLI","STI","CLD","STD", - ["INC","DEC","???","???","???","???","???","???"], - [ - ["INC","DEC","CALL","CALL","JMP","JMP","PUSH","???"], - ["INC","DEC","CALL","???","JMP","???","PUSH","???"] - ], - /*------------------------------------------------------------------------------------------------------------------------ + "HLT", + "CMC", + ["TEST", "???", "NOT", "NEG", "MUL", "IMUL", "DIV", "IDIV"], + ["TEST", "???", "NOT", "NEG", "MUL", "IMUL", "DIV", "IDIV"], + "CLC", + "STC", + "CLI", + "STI", + "CLD", + "STD", + ["INC", "DEC", "???", "???", "???", "???", "???", "???"], + [ + ["INC", "DEC", "CALL", "CALL", "JMP", "JMP", "PUSH", "???"], + ["INC", "DEC", "CALL", "???", "JMP", "???", "PUSH", "???"], + ], + /*------------------------------------------------------------------------------------------------------------------------ Two Byte Opcodes 256 to 511. Opcodes plus 256 goes to 511 used by escape code "0F", Or set directly by adding map bits "01" because "01 00000000" bin = 256 plus opcode. ------------------------------------------------------------------------------------------------------------------------*/ - [ - ["SLDT","STR","LLDT","LTR","VERR","VERW","JMPE","???"], - ["SLDT","STR","LLDT","LTR","VERR","VERW","JMPE","???"] - ], - [ - ["SGDT","SIDT","LGDT","LIDT","SMSW","???","LMSW","INVLPG"], [ - ["???","VMCALL","VMLAUNCH","VMRESUME","VMXOFF","???","???","???"], - ["MONITOR","MWAIT","CLAC","STAC","???","???","???","ENCLS"], - ["XGETBV","XSETBV","???","???","VMFUNC","XEND","XTEST","ENCLU"], - ["VMRUN","VMMCALL","VMLOAD","VMSAVE","STGI","CLGI","SKINIT","INVLPGA"], - "SMSW","???","LMSW", - ["SWAPGS","RDTSCP","MONITORX","MWAITX","???","???","???","???"] - ] - ], - ["LAR","LAR"],["LSL","LSL"],"???", - "SYSCALL","CLTS","SYSRET","INVD", - "WBINVD","???","UD2","???", - [["PREFETCH","PREFETCHW","???","???","???","???","???","???"],"???"], - "FEMMS", - "", //3DNow Instruction name is encoded by the IMM8 operand. - [ - ["MOVUPS","MOVUPD","MOVSS","MOVSD"], - ["MOVUPS","MOVUPD","MOVSS","MOVSD"] - ], - [ - ["MOVUPS","MOVUPD","MOVSS","MOVSD"], - ["MOVUPS","MOVUPD","MOVSS","MOVSD"] - ], - [ - ["MOVLPS","MOVLPD","MOVSLDUP","MOVDDUP"], - ["MOVHLPS","???","MOVSLDUP","MOVDDUP"] - ], - [["MOVLPS","MOVLPD","???","???"],"???"], - ["UNPCKLPS","UNPCKLPD","???","???"], //An instruction with 4 operations uses the 4 SIMD modes as an Vector instruction. - ["UNPCKHPS","UNPCKHPD","???","???"], - [["MOVHPS","MOVHPD","MOVSHDUP","???"],["MOVLHPS","???","MOVSHDUP","???"]], - [["MOVHPS","MOVHPD","???","???"],"???"], - [["PREFETCHNTA","PREFETCHT0","PREFETCHT1","PREFETCHT2","???","???","???","???"],"???"], - "???", - [[["BNDLDX","","",""],["BNDMOV","","",""],["BNDCL","","",""],["BNDCU","","",""]], - ["???",["BNDMOV","","",""],["BNDCL","","",""],["BNDCU","","",""]]], - [[["BNDSTX","","",""],["BNDMOV","","",""],["BNDMK","","",""],["BNDCN","","",""]], - ["???",["BNDMOV","","",""],"???",["BNDCN","","",""]]], - "???","???","???", - "NOP", - ["???","MOV"],["???","MOV"], //CR and DR register Move - ["???","MOV"],["???","MOV"], //CR and DR register Move - ["???","MOV"],"???", //TR (TEST REGISTER) register Move - ["???","MOV"],"???", //TR (TEST REGISTER) register Move - [ - ["MOVAPS","MOVAPS","MOVAPS","MOVAPS"], - ["MOVAPD","MOVAPD","MOVAPD","MOVAPD"], - "???","???" - ], - [ - [ - ["MOVAPS","MOVAPS","MOVAPS","MOVAPS"], - ["MOVAPD","MOVAPD","MOVAPD","MOVAPD"], - ["","","",["MOVNRAPS","MOVNRNGOAPS","MOVNRAPS"]], - ["","","",["MOVNRAPD","MOVNRNGOAPD","MOVNRAPD"]] + ["SLDT", "STR", "LLDT", "LTR", "VERR", "VERW", "JMPE", "???"], + ["SLDT", "STR", "LLDT", "LTR", "VERR", "VERW", "JMPE", "???"], ], [ - ["MOVAPS","MOVAPS","MOVAPS","MOVAPS"], - ["MOVAPD","MOVAPD","MOVAPD","MOVAPD"], - "???","???" - ] - ], - [ - ["CVTPI2PS","","",""],["CVTPI2PD","","",""], //Is not allowed to be Vector encoded. - "CVTSI2SS","CVTSI2SD" - ], - [ - [ - "MOVNTPS","MOVNTPD", - ["MOVNTSS","","",""],["MOVNTSD","","",""] //SSE4a can not be vector encoded. - ],"???" - ], - [ - ["CVTTPS2PI","","",""],["CVTTPD2PI","","",""], //Is not allowed to be Vector encoded. - "CVTTSS2SI","CVTTSD2SI" - ], - [ - ["CVTPS2PI","","",""],["CVTPD2PI","","",""], //Is not allowed to be Vector encoded. - "CVTSS2SI","CVTSD2SI" - ], - ["UCOMISS","UCOMISD","???","???"], - ["COMISS","COMISD","???","???"], - "WRMSR","RDTSC","RDMSR","RDPMC", - "SYSENTER","SYSEXIT","???", - "GETSEC", - "", //*Three byte instructions prefix combo 0F 38 (Opcode = 01,00111000) sets opcode 10,000000000 next byte read is added to the lower 8 bit's. - "???", - "", //*Three byte instructions prefix combo 0F 3A (Opcode = 01,00111010) sets opcode 11,000000000 next byte read is added to the lower 8 bit's. - "???","???","???","???","???", - "CMOVO", - [ - ["CMOVNO",["KANDW","","KANDQ"],"",""], - ["CMOVNO",["KANDB","","KANDD"],"",""],"","" - ], - [ - ["CMOVB",["KANDNW","","KANDNQ"],"",""], - ["CMOVB",["KANDNB","","KANDND"],"",""],"","" - ], - [["CMOVAE","KANDNR","",""],"","",""], - [ - ["CMOVE",["KNOTW","","KNOTQ"],"",""], - ["CMOVE",["KNOTB","","KNOTD"],"",""],"","" - ], - [ - ["CMOVNE",["KORW","","KORQ"],"",""], - ["CMOVNE",["KORB","","KORD"],"",""],"","" - ], - [ - ["CMOVBE",["KXNORW","","KXNORQ"],"",""], - ["CMOVBE",["KXNORB","","KXNORD"],"",""],"","" - ], - [ - ["CMOVA",["KXORW","","KXORQ"],"",""], - ["CMOVA",["KXORB","","KXORD"],"",""],"","" - ], - [["CMOVS","KMERGE2L1H","",""],"","",""], - [["CMOVNS","KMERGE2L1L","",""],"","",""], - [ - ["CMOVP",["KADDW","","KADDQ"],"",""], - ["CMOVP",["KADDB","","KADDD"],"",""],"","" - ], - [ - ["CMOVNP",["KUNPCKWD","","KUNPCKDQ"],"",""], - ["CMOVNP",["KUNPCKBW","","???"],"",""],"","" - ], - "CMOVL","CMOVGE","CMOVLE","CMOVG", - [ + ["SGDT", "SIDT", "LGDT", "LIDT", "SMSW", "???", "LMSW", "INVLPG"], + [ + [ + "???", + "VMCALL", + "VMLAUNCH", + "VMRESUME", + "VMXOFF", + "???", + "???", + "???", + ], + ["MONITOR", "MWAIT", "CLAC", "STAC", "???", "???", "???", "ENCLS"], + [ + "XGETBV", + "XSETBV", + "???", + "???", + "VMFUNC", + "XEND", + "XTEST", + "ENCLU", + ], + [ + "VMRUN", + "VMMCALL", + "VMLOAD", + "VMSAVE", + "STGI", + "CLGI", + "SKINIT", + "INVLPGA", + ], + "SMSW", + "???", + "LMSW", + [ + "SWAPGS", + "RDTSCP", + "MONITORX", + "MWAITX", + "???", + "???", + "???", + "???", + ], + ], + ], + ["LAR", "LAR"], + ["LSL", "LSL"], + "???", + "SYSCALL", + "CLTS", + "SYSRET", + "INVD", + "WBINVD", + "???", + "UD2", "???", [ - ["MOVMSKPS","MOVMSKPS","",""],["MOVMSKPD","MOVMSKPD","",""], - "???","???" - ] - ], - ["SQRTPS","SQRTPD","SQRTSS","SQRTSD"], - [ - ["RSQRTPS","RSQRTPS","",""],"???", - ["RSQRTSS","RSQRTSS","",""],"???" - ], - [ - ["RCPPS","RCPPS","",""],"???", - ["RCPSS","RCPSS","",""],"???" - ], - ["ANDPS","ANDPD","???","???"], - ["ANDNPS","ANDNPD","???","???"], - ["ORPS","ORPD","???","???"], - ["XORPS","XORPD","???","???"], - [ - ["ADDPS","ADDPS","ADDPS","ADDPS"], - ["ADDPD","ADDPD","ADDPD","ADDPD"], - "ADDSS","ADDSD" - ], - [ - ["MULPS","MULPS","MULPS","MULPS"], - ["MULPD","MULPD","MULPD","MULPD"], - "MULSS","MULSD" - ], - [ - ["CVTPS2PD","CVTPS2PD","CVTPS2PD","CVTPS2PD"], - ["CVTPD2PS","CVTPD2PS","CVTPD2PS","CVTPD2PS"], - "CVTSS2SD","CVTSD2SS" - ], - [["CVTDQ2PS","","CVTQQ2PS"],["CVTPS2DQ","","???"],"CVTTPS2DQ","???"], - [ - ["SUBPS","SUBPS","SUBPS","SUBPS"], - ["SUBPD","SUBPD","SUBPD","SUBPD"], - "SUBSS","SUBSD" - ], - ["MINPS","MINPD","MINSS","MINSD"], - ["DIVPS","DIVPD","DIVSS","DIVSD"], - ["MAXPS","MAXPD","MAXSS","MAXSD"], - [["PUNPCKLBW","","",""],"PUNPCKLBW","",""], - [["PUNPCKLWD","","",""],"PUNPCKLWD","",""], - [["PUNPCKLDQ","","",""],"PUNPCKLDQ","",""], - [["PACKSSWB","","",""],"PACKSSWB","",""], - [["PCMPGTB","","",""],["PCMPGTB","PCMPGTB","PCMPGTB",""],"",""], - [["PCMPGTW","","",""],["PCMPGTW","PCMPGTW","PCMPGTW",""],"",""], - [["PCMPGTD","","",""],["PCMPGTD","PCMPGTD",["PCMPGTD","","???"],["PCMPGTD","","???"]],"",""], - [["PACKUSWB","","",""],"PACKUSWB","",""], - [["PUNPCKHBW","","",""],"PUNPCKHBW","",""], - [["PUNPCKHWD","","",""],"PUNPCKHWD","",""], - [["PUNPCKHDQ","","",""],["PUNPCKHDQ","","???"],"",""], - [["PACKSSDW","","",""],["PACKSSDW","","???"],"",""], - ["???","PUNPCKLQDQ","???","???"], - ["???","PUNPCKHQDQ","???","???"], - [["MOVD","","",""],["MOVD","","MOVQ"],"",""], - [ + ["PREFETCH", "PREFETCHW", "???", "???", "???", "???", "???", "???"], + "???", + ], + "FEMMS", + "", //3DNow Instruction name is encoded by the IMM8 operand. [ - ["MOVQ","","",""], - ["MOVDQA","MOVDQA",["MOVDQA32","","MOVDQA64"],["MOVDQA32","","MOVDQA64"]], - ["MOVDQU","MOVDQU",["MOVDQU32","","MOVDQU64"],""], - ["","",["MOVDQU8","","MOVDQU16"],""] + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], ], [ - ["MOVQ","","",""], - ["MOVDQA","MOVDQA",["MOVDQA32","","MOVDQA64"],["MOVDQA32","","MOVDQA64"]], - ["MOVDQU","MOVDQU",["MOVDQU32","","MOVDQU64"],""], - ["","",["MOVDQU8","","MOVDQU16"],""] - ] - ], - [ - ["PSHUFW","","",""], - ["PSHUFD","PSHUFD",["PSHUFD","","???"],["PSHUFD","","???"]], - "PSHUFHW", - "PSHUFLW" - ], - [ - "???", - [ - "???","???", - [["PSRLW","","",""],"PSRLW","",""],"???", - [["PSRAW","","",""],"PSRAW","",""],"???", - [["PSLLW","","",""],"PSLLW","",""],"???" - ] - ], - [ - ["???",["","",["PRORD","","PRORQ"],""],"???","???"], - ["???",["","",["PROLD","","PROLQ"],""],"???","???"], - [["PSRLD","","",""],["PSRLD","PSRLD",["PSRLD","","???"],["PSRLD","","???"]],"",""], - "???", - [["PSRAD","","",""],["PSRAD","PSRAD",["PSRAD","","PSRAQ"],["PSRAD","","???"]],"",""], - "???", - [["PSLLD","","",""],["PSLLD","PSLLD",["PSLLD","","???"],["PSLLD","","???"]],"",""], - "???" - ], - [ - "???", - [ - "???","???", - [["PSRLQ","PSRLQ","",""],"PSRLQ","",""],["???","PSRLDQ","???","???"], - "???","???", - [["PSLLQ","PSLLQ","",""],"PSLLQ","",""],["???","PSLLDQ","???","???"] - ] - ], - [["PCMPEQB","","",""],["PCMPEQB","PCMPEQB","PCMPEQB",""],"",""], - [["PCMPEQW","","",""],["PCMPEQW","PCMPEQW","PCMPEQW",""],"",""], - [["PCMPEQD","","",""],["PCMPEQD","PCMPEQD",["PCMPEQD","","???"],["PCMPEQD","","???"]],"",""], - [["EMMS",["ZEROUPPER","ZEROALL",""],"",""],"???","???","???"], - [ - ["VMREAD","",["CVTTPS2UDQ","","CVTTPD2UDQ"],""], - ["EXTRQ","",["CVTTPS2UQQ","","CVTTPD2UQQ"],""], - ["???","","CVTTSS2USI",""], - ["INSERTQ","","CVTTSD2USI",""] - ], - [ - ["VMWRITE","",["CVTPS2UDQ","","CVTPD2UDQ"], ""], - ["EXTRQ","",["CVTPS2UQQ","","CVTPD2UQQ"],""], - ["???","","CVTSS2USI",""], - ["INSERTQ","","CVTSD2USI",""] - ], - [ - "???", - ["","",["CVTTPS2QQ","","CVTTPD2QQ"],""], - ["","",["CVTUDQ2PD","","CVTUQQ2PD"],"CVTUDQ2PD"], - ["","",["CVTUDQ2PS","","CVTUQQ2PS"],""] - ], - [ - "???", - ["","",["CVTPS2QQ","","CVTPD2QQ"],""], - ["","","CVTUSI2SS",""], - ["","","CVTUSI2SD",""] - ], - [ - "???",["HADDPD","HADDPD","",""], - "???",["HADDPS","HADDPS","",""] - ], - [ - "???",["HSUBPD","HSUBPD","",""], - "???",["HSUBPS","HSUBPS","",""] - ], - [["MOVD","","",""],["MOVD","","MOVQ"],["MOVQ","MOVQ",["???","","MOVQ"],""],"???"], - [ - ["MOVQ","","",""], - ["MOVDQA","MOVDQA",["MOVDQA32","","MOVDQA64"],["MOVDQA32","","MOVDQA64"]], - ["MOVDQU","MOVDQU",["MOVDQU32","","MOVDQU64"],""], - ["???","",["MOVDQU8","","MOVDQU16"],""] - ], - "JO","JNO","JB","JAE", - [["JE","JKZD","",""],"","",""],[["JNE","JKNZD","",""],"","",""], //K1OM. - "JBE","JA","JS","JNS","JP","JNP","JL","JGE","JLE","JG", - [ - ["SETO",["KMOVW","","KMOVQ"],"",""], - ["SETO",["KMOVB","","KMOVD"],"",""],"","" - ], - [ - ["SETNO",["KMOVW","","KMOVQ"],"",""], - ["SETNO",["KMOVB","","KMOVD"],"",""],"","" - ], - [ - ["SETB",["KMOVW","","???"],"",""], - ["SETB",["KMOVB","","???"],"",""],"", - ["SETB",["KMOVD","","KMOVQ"],"",""] - ], - [ - ["SETAE",["KMOVW","","???"],"",""], - ["SETAE",["KMOVB","","???"],"",""],"", - ["SETAE",["KMOVD","","KMOVQ"],"",""] - ], - "SETE",[["SETNE","KCONCATH","",""],"","",""], - "SETBE",[["SETA","KCONCATL","",""],"","",""], - [ - ["SETS",["KORTESTW","","KORTESTQ"],"",""], - ["SETS",["KORTESTB","","KORTESTD"],"",""],"","" - ], - [ - ["SETNS",["KTESTW","","KTESTQ"],"",""], - ["SETNS",["KTESTB","","KTESTD"],"",""],"","" - ], - "SETP","SETNP","SETL","SETGE","SETLE","SETG", - "PUSH","POP", - "CPUID", //Identifies the CPU and which Instructions the current CPU can use. - "BT", - "SHLD","SHLD", - "XBTS","IBTS", - "PUSH","POP", - "RSM", - "BTS", - "SHRD","SHRD", - [ - [ - ["FXSAVE","???","FXSAVE64"],["FXRSTOR","???","FXRSTOR64"], - "LDMXCSR","STMXCSR", - ["XSAVE","","XSAVE64"],["XRSTOR","","XRSTOR64"], - ["XSAVEOPT","CLWB","XSAVEOPT64"], - ["CLFLUSHOPT","CLFLUSH",""] + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], ], [ - ["???","???",["RDFSBASE","","",""],"???"],["???","???",["RDGSBASE","","",""],"???"], - ["???","???",["WRFSBASE","","",""],"???"],["???","???",["WRGSBASE","","",""],"???"], - "???", - ["LFENCE","???","???","???","???","???","???","???"], - ["MFENCE","???","???","???","???","???","???","???"], - ["SFENCE","???","???","???","???","???","???","???"] - ] - ], - "IMUL", - "CMPXCHG","CMPXCHG", - ["LSS","???"], - "BTR", - ["LFS","???"], - ["LGS","???"], - "MOVZX","MOVZX", - [ - ["JMPE","","",""],"???", - ["POPCNT","POPCNT","",""],"???" - ], - "???", - ["???","???","???","???","BT","BTS","BTR","BTC"], - "BTC", - [ - ["BSF","","",""],"???", - ["TZCNT","TZCNT","",""],["BSF","TZCNTI","",""] - ], - [ - ["BSR","","",""],"???", - ["LZCNT","LZCNT","",""],["BSR","","",""] - ], - "MOVSX","MOVSX", - "XADD","XADD", - [ - ["CMP,PS,","CMP,PS,","CMP,PS,","CMP,PS,"], - ["CMP,PD,","CMP,PD,","CMP,PD,","CMP,PD,"], - ["CMP,SS,","CMP,SS,","CMP,SS,",""], - ["CMP,SD,","CMP,SD,","CMP,SD,",""] - ], - ["MOVNTI","???"], - [["PINSRW","","",""],"PINSRW","",""], - ["???",[["PEXTRW","","",""],"PEXTRW","",""]], - ["SHUFPS","SHUFPD","???","???"], - [ + ["MOVLPS", "MOVLPD", "MOVSLDUP", "MOVDDUP"], + ["MOVHLPS", "???", "MOVSLDUP", "MOVDDUP"], + ], + [["MOVLPS", "MOVLPD", "???", "???"], "???"], + ["UNPCKLPS", "UNPCKLPD", "???", "???"], //An instruction with 4 operations uses the 4 SIMD modes as an Vector instruction. + ["UNPCKHPS", "UNPCKHPD", "???", "???"], [ - "???", - ["CMPXCHG8B","","CMPXCHG16B"], - "???", - ["XRSTORS","","XRSTORS64"], - ["XSAVEC","","XSAVEC64"], - ["XSAVES","","XSAVES64"], - ["VMPTRLD","VMCLEAR","VMXON","???"],["VMPTRST","???","???","???"] + ["MOVHPS", "MOVHPD", "MOVSHDUP", "???"], + ["MOVLHPS", "???", "MOVSHDUP", "???"], + ], + [["MOVHPS", "MOVHPD", "???", "???"], "???"], + [ + [ + "PREFETCHNTA", + "PREFETCHT0", + "PREFETCHT1", + "PREFETCHT2", + "???", + "???", + "???", + "???", + ], + "???", + ], + "???", + [ + [ + ["BNDLDX", "", "", ""], + ["BNDMOV", "", "", ""], + ["BNDCL", "", "", ""], + ["BNDCU", "", "", ""], + ], + [ + "???", + ["BNDMOV", "", "", ""], + ["BNDCL", "", "", ""], + ["BNDCU", "", "", ""], + ], ], [ - "???", - ["SSS","???","???","???","???","???","???","???"], //Synthetic virtual machine operation codes. - "???","???","???","???", - "RDRAND","RDSEED" - ] - ], - "BSWAP","BSWAP","BSWAP","BSWAP","BSWAP","BSWAP","BSWAP","BSWAP", - ["???",["ADDSUBPD","ADDSUBPD","",""],"???",["ADDSUBPS","ADDSUBPS","",""]], - [["PSRLW","","",""],"PSRLW","",""], - [["PSRLD","","",""],["PSRLD","PSRLD",["PSRLD","","???"],""],"",""], - [["PSRLQ","","",""],"PSRLQ","",""], - [["PADDQ","","",""],"PADDQ","",""], - [["PMULLW","","",""],"PMULLW","",""], - [ - ["???","MOVQ","???","???"], - ["???","MOVQ",["MOVQ2DQ","","",""],["MOVDQ2Q","","",""]] - ], - ["???",[["PMOVMSKB","","",""],["PMOVMSKB","PMOVMSKB","",""],"???","???"]], - [["PSUBUSB","","",""],"PSUBUSB","",""], - [["PSUBUSW","","",""],"PSUBUSW","",""], - [["PMINUB","","",""],"PMINUB","",""], - [["PAND","","",""],["PAND","PAND",["PANDD","","PANDQ"],["PANDD","","PANDQ"]],"",""], - [["PADDUSB","","",""],"PADDUSB","",""], - [["PADDUSW","","",""],"PADDUSW","",""], - [["PMAXUB","","",""],"PMAXUB","",""], - [["PANDN","","",""],["PANDN","PANDN",["PANDND","","PANDNQ"],["PANDND","","PANDNQ"]],"",""], - [["PAVGB","","",""],"PAVGB","",""], - [ - [["PSRAW","","",""],["PSRAW","PSRAW","PSRAW",""],"",""], - [["PSRAW","","",""],["PSRAW","PSRAW","PSRAW",""],"",""] - ], - [["PSRAD","","",""],["PSRAD","PSRAD",["PSRAD","","PSRAQ"],""],"",""], - [["PAVGW","","",""],"PAVGW","",""], - [["PMULHUW","","",""],"PMULHUW","",""], - [["PMULHW","","",""],"PMULHW","",""], - [ + [ + ["BNDSTX", "", "", ""], + ["BNDMOV", "", "", ""], + ["BNDMK", "", "", ""], + ["BNDCN", "", "", ""], + ], + ["???", ["BNDMOV", "", "", ""], "???", ["BNDCN", "", "", ""]], + ], "???", - ["CVTTPD2DQ","CVTTPD2DQ","CVTTPD2DQ",""], - ["CVTDQ2PD","CVTDQ2PD",["CVTDQ2PD","CVTDQ2PD","CVTQQ2PD"],"CVTDQ2PD"], - "CVTPD2DQ" - ], - [[["MOVNTQ","","",""],["MOVNTDQ","","???"],"???","???"],"???"], - [["PSUBSB","","",""],"PSUBSB","",""], - [["PSUBSW","","",""],"PSUBSW","",""], - [["PMINSW","","",""],"PMINSW","",""], - [["POR","","",""],["POR","POR",["PORD","","PORQ"],["PORD","","PORQ"]],"",""], - [["PADDSB","","",""],"PADDSB","",""], - [["PADDSW","","",""],"PADDSW","",""], - [["PMAXSW","","",""],"PMAXSW","",""], - [["PXOR","","",""],["PXOR","PXOR",["PXORD","","PXORQ"],["PXORD","","PXORQ"]],"",""], - [["???","???","???",["LDDQU","LDDQU","",""]],"???"], - [["PSLLW","","",""],"PSLLW","",""], - [["PSLLD","","",""],["PSLLD","","???"],"",""], - [["PSLLQ","","",""],"PSLLQ","",""], - [["PMULUDQ","","",""],"PMULUDQ","",""], - [["PMADDWD","","",""],"PMADDWD","",""], - [["PSADBW","","",""],"PSADBW","",""], - ["???",[["MASKMOVQ","","",""],["MASKMOVDQU","MASKMOVDQU","",""],"???","???"]], - [["PSUBB","","",""],"PSUBB","",""], - [["PSUBW","","",""],"PSUBW","",""], - [["PSUBD","","",""],["PSUBD","PSUBD",["PSUBD","","???"],["PSUBD","","???"]],"",""], - [["PSUBQ","","",""],"PSUBQ","",""], - [["PADDB","","",""],"PADDB","",""], - [["PADDW","","",""],"PADDW","",""], - [["PADDD","","",""],["PADDD","PADDD",["PADDD","","???"],["PADDD","","???"]],"",""], - "???", - /*------------------------------------------------------------------------------------------------------------------------ + "???", + "???", + "NOP", + ["???", "MOV"], + ["???", "MOV"], //CR and DR register Move + ["???", "MOV"], + ["???", "MOV"], //CR and DR register Move + ["???", "MOV"], + "???", //TR (TEST REGISTER) register Move + ["???", "MOV"], + "???", //TR (TEST REGISTER) register Move + [ + ["MOVAPS", "MOVAPS", "MOVAPS", "MOVAPS"], + ["MOVAPD", "MOVAPD", "MOVAPD", "MOVAPD"], + "???", + "???", + ], + [ + [ + ["MOVAPS", "MOVAPS", "MOVAPS", "MOVAPS"], + ["MOVAPD", "MOVAPD", "MOVAPD", "MOVAPD"], + ["", "", "", ["MOVNRAPS", "MOVNRNGOAPS", "MOVNRAPS"]], + ["", "", "", ["MOVNRAPD", "MOVNRNGOAPD", "MOVNRAPD"]], + ], + [ + ["MOVAPS", "MOVAPS", "MOVAPS", "MOVAPS"], + ["MOVAPD", "MOVAPD", "MOVAPD", "MOVAPD"], + "???", + "???", + ], + ], + [ + ["CVTPI2PS", "", "", ""], + ["CVTPI2PD", "", "", ""], //Is not allowed to be Vector encoded. + "CVTSI2SS", + "CVTSI2SD", + ], + [ + [ + "MOVNTPS", + "MOVNTPD", + ["MOVNTSS", "", "", ""], + ["MOVNTSD", "", "", ""], //SSE4a can not be vector encoded. + ], + "???", + ], + [ + ["CVTTPS2PI", "", "", ""], + ["CVTTPD2PI", "", "", ""], //Is not allowed to be Vector encoded. + "CVTTSS2SI", + "CVTTSD2SI", + ], + [ + ["CVTPS2PI", "", "", ""], + ["CVTPD2PI", "", "", ""], //Is not allowed to be Vector encoded. + "CVTSS2SI", + "CVTSD2SI", + ], + ["UCOMISS", "UCOMISD", "???", "???"], + ["COMISS", "COMISD", "???", "???"], + "WRMSR", + "RDTSC", + "RDMSR", + "RDPMC", + "SYSENTER", + "SYSEXIT", + "???", + "GETSEC", + "", //*Three byte instructions prefix combo 0F 38 (Opcode = 01,00111000) sets opcode 10,000000000 next byte read is added to the lower 8 bit's. + "???", + "", //*Three byte instructions prefix combo 0F 3A (Opcode = 01,00111010) sets opcode 11,000000000 next byte read is added to the lower 8 bit's. + "???", + "???", + "???", + "???", + "???", + "CMOVO", + [ + ["CMOVNO", ["KANDW", "", "KANDQ"], "", ""], + ["CMOVNO", ["KANDB", "", "KANDD"], "", ""], + "", + "", + ], + [ + ["CMOVB", ["KANDNW", "", "KANDNQ"], "", ""], + ["CMOVB", ["KANDNB", "", "KANDND"], "", ""], + "", + "", + ], + [["CMOVAE", "KANDNR", "", ""], "", "", ""], + [ + ["CMOVE", ["KNOTW", "", "KNOTQ"], "", ""], + ["CMOVE", ["KNOTB", "", "KNOTD"], "", ""], + "", + "", + ], + [ + ["CMOVNE", ["KORW", "", "KORQ"], "", ""], + ["CMOVNE", ["KORB", "", "KORD"], "", ""], + "", + "", + ], + [ + ["CMOVBE", ["KXNORW", "", "KXNORQ"], "", ""], + ["CMOVBE", ["KXNORB", "", "KXNORD"], "", ""], + "", + "", + ], + [ + ["CMOVA", ["KXORW", "", "KXORQ"], "", ""], + ["CMOVA", ["KXORB", "", "KXORD"], "", ""], + "", + "", + ], + [["CMOVS", "KMERGE2L1H", "", ""], "", "", ""], + [["CMOVNS", "KMERGE2L1L", "", ""], "", "", ""], + [ + ["CMOVP", ["KADDW", "", "KADDQ"], "", ""], + ["CMOVP", ["KADDB", "", "KADDD"], "", ""], + "", + "", + ], + [ + ["CMOVNP", ["KUNPCKWD", "", "KUNPCKDQ"], "", ""], + ["CMOVNP", ["KUNPCKBW", "", "???"], "", ""], + "", + "", + ], + "CMOVL", + "CMOVGE", + "CMOVLE", + "CMOVG", + [ + "???", + [ + ["MOVMSKPS", "MOVMSKPS", "", ""], + ["MOVMSKPD", "MOVMSKPD", "", ""], + "???", + "???", + ], + ], + ["SQRTPS", "SQRTPD", "SQRTSS", "SQRTSD"], + [ + ["RSQRTPS", "RSQRTPS", "", ""], + "???", + ["RSQRTSS", "RSQRTSS", "", ""], + "???", + ], + [["RCPPS", "RCPPS", "", ""], "???", ["RCPSS", "RCPSS", "", ""], "???"], + ["ANDPS", "ANDPD", "???", "???"], + ["ANDNPS", "ANDNPD", "???", "???"], + ["ORPS", "ORPD", "???", "???"], + ["XORPS", "XORPD", "???", "???"], + [ + ["ADDPS", "ADDPS", "ADDPS", "ADDPS"], + ["ADDPD", "ADDPD", "ADDPD", "ADDPD"], + "ADDSS", + "ADDSD", + ], + [ + ["MULPS", "MULPS", "MULPS", "MULPS"], + ["MULPD", "MULPD", "MULPD", "MULPD"], + "MULSS", + "MULSD", + ], + [ + ["CVTPS2PD", "CVTPS2PD", "CVTPS2PD", "CVTPS2PD"], + ["CVTPD2PS", "CVTPD2PS", "CVTPD2PS", "CVTPD2PS"], + "CVTSS2SD", + "CVTSD2SS", + ], + [["CVTDQ2PS", "", "CVTQQ2PS"], ["CVTPS2DQ", "", "???"], "CVTTPS2DQ", "???"], + [ + ["SUBPS", "SUBPS", "SUBPS", "SUBPS"], + ["SUBPD", "SUBPD", "SUBPD", "SUBPD"], + "SUBSS", + "SUBSD", + ], + ["MINPS", "MINPD", "MINSS", "MINSD"], + ["DIVPS", "DIVPD", "DIVSS", "DIVSD"], + ["MAXPS", "MAXPD", "MAXSS", "MAXSD"], + [["PUNPCKLBW", "", "", ""], "PUNPCKLBW", "", ""], + [["PUNPCKLWD", "", "", ""], "PUNPCKLWD", "", ""], + [["PUNPCKLDQ", "", "", ""], "PUNPCKLDQ", "", ""], + [["PACKSSWB", "", "", ""], "PACKSSWB", "", ""], + [["PCMPGTB", "", "", ""], ["PCMPGTB", "PCMPGTB", "PCMPGTB", ""], "", ""], + [["PCMPGTW", "", "", ""], ["PCMPGTW", "PCMPGTW", "PCMPGTW", ""], "", ""], + [ + ["PCMPGTD", "", "", ""], + ["PCMPGTD", "PCMPGTD", ["PCMPGTD", "", "???"], ["PCMPGTD", "", "???"]], + "", + "", + ], + [["PACKUSWB", "", "", ""], "PACKUSWB", "", ""], + [["PUNPCKHBW", "", "", ""], "PUNPCKHBW", "", ""], + [["PUNPCKHWD", "", "", ""], "PUNPCKHWD", "", ""], + [["PUNPCKHDQ", "", "", ""], ["PUNPCKHDQ", "", "???"], "", ""], + [["PACKSSDW", "", "", ""], ["PACKSSDW", "", "???"], "", ""], + ["???", "PUNPCKLQDQ", "???", "???"], + ["???", "PUNPCKHQDQ", "???", "???"], + [["MOVD", "", "", ""], ["MOVD", "", "MOVQ"], "", ""], + [ + [ + ["MOVQ", "", "", ""], + [ + "MOVDQA", + "MOVDQA", + ["MOVDQA32", "", "MOVDQA64"], + ["MOVDQA32", "", "MOVDQA64"], + ], + ["MOVDQU", "MOVDQU", ["MOVDQU32", "", "MOVDQU64"], ""], + ["", "", ["MOVDQU8", "", "MOVDQU16"], ""], + ], + [ + ["MOVQ", "", "", ""], + [ + "MOVDQA", + "MOVDQA", + ["MOVDQA32", "", "MOVDQA64"], + ["MOVDQA32", "", "MOVDQA64"], + ], + ["MOVDQU", "MOVDQU", ["MOVDQU32", "", "MOVDQU64"], ""], + ["", "", ["MOVDQU8", "", "MOVDQU16"], ""], + ], + ], + [ + ["PSHUFW", "", "", ""], + ["PSHUFD", "PSHUFD", ["PSHUFD", "", "???"], ["PSHUFD", "", "???"]], + "PSHUFHW", + "PSHUFLW", + ], + [ + "???", + [ + "???", + "???", + [["PSRLW", "", "", ""], "PSRLW", "", ""], + "???", + [["PSRAW", "", "", ""], "PSRAW", "", ""], + "???", + [["PSLLW", "", "", ""], "PSLLW", "", ""], + "???", + ], + ], + [ + ["???", ["", "", ["PRORD", "", "PRORQ"], ""], "???", "???"], + ["???", ["", "", ["PROLD", "", "PROLQ"], ""], "???", "???"], + [ + ["PSRLD", "", "", ""], + ["PSRLD", "PSRLD", ["PSRLD", "", "???"], ["PSRLD", "", "???"]], + "", + "", + ], + "???", + [ + ["PSRAD", "", "", ""], + ["PSRAD", "PSRAD", ["PSRAD", "", "PSRAQ"], ["PSRAD", "", "???"]], + "", + "", + ], + "???", + [ + ["PSLLD", "", "", ""], + ["PSLLD", "PSLLD", ["PSLLD", "", "???"], ["PSLLD", "", "???"]], + "", + "", + ], + "???", + ], + [ + "???", + [ + "???", + "???", + [["PSRLQ", "PSRLQ", "", ""], "PSRLQ", "", ""], + ["???", "PSRLDQ", "???", "???"], + "???", + "???", + [["PSLLQ", "PSLLQ", "", ""], "PSLLQ", "", ""], + ["???", "PSLLDQ", "???", "???"], + ], + ], + [["PCMPEQB", "", "", ""], ["PCMPEQB", "PCMPEQB", "PCMPEQB", ""], "", ""], + [["PCMPEQW", "", "", ""], ["PCMPEQW", "PCMPEQW", "PCMPEQW", ""], "", ""], + [ + ["PCMPEQD", "", "", ""], + ["PCMPEQD", "PCMPEQD", ["PCMPEQD", "", "???"], ["PCMPEQD", "", "???"]], + "", + "", + ], + [["EMMS", ["ZEROUPPER", "ZEROALL", ""], "", ""], "???", "???", "???"], + [ + ["VMREAD", "", ["CVTTPS2UDQ", "", "CVTTPD2UDQ"], ""], + ["EXTRQ", "", ["CVTTPS2UQQ", "", "CVTTPD2UQQ"], ""], + ["???", "", "CVTTSS2USI", ""], + ["INSERTQ", "", "CVTTSD2USI", ""], + ], + [ + ["VMWRITE", "", ["CVTPS2UDQ", "", "CVTPD2UDQ"], ""], + ["EXTRQ", "", ["CVTPS2UQQ", "", "CVTPD2UQQ"], ""], + ["???", "", "CVTSS2USI", ""], + ["INSERTQ", "", "CVTSD2USI", ""], + ], + [ + "???", + ["", "", ["CVTTPS2QQ", "", "CVTTPD2QQ"], ""], + ["", "", ["CVTUDQ2PD", "", "CVTUQQ2PD"], "CVTUDQ2PD"], + ["", "", ["CVTUDQ2PS", "", "CVTUQQ2PS"], ""], + ], + [ + "???", + ["", "", ["CVTPS2QQ", "", "CVTPD2QQ"], ""], + ["", "", "CVTUSI2SS", ""], + ["", "", "CVTUSI2SD", ""], + ], + ["???", ["HADDPD", "HADDPD", "", ""], "???", ["HADDPS", "HADDPS", "", ""]], + ["???", ["HSUBPD", "HSUBPD", "", ""], "???", ["HSUBPS", "HSUBPS", "", ""]], + [ + ["MOVD", "", "", ""], + ["MOVD", "", "MOVQ"], + ["MOVQ", "MOVQ", ["???", "", "MOVQ"], ""], + "???", + ], + [ + ["MOVQ", "", "", ""], + [ + "MOVDQA", + "MOVDQA", + ["MOVDQA32", "", "MOVDQA64"], + ["MOVDQA32", "", "MOVDQA64"], + ], + ["MOVDQU", "MOVDQU", ["MOVDQU32", "", "MOVDQU64"], ""], + ["???", "", ["MOVDQU8", "", "MOVDQU16"], ""], + ], + "JO", + "JNO", + "JB", + "JAE", + [["JE", "JKZD", "", ""], "", "", ""], + [["JNE", "JKNZD", "", ""], "", "", ""], //K1OM. + "JBE", + "JA", + "JS", + "JNS", + "JP", + "JNP", + "JL", + "JGE", + "JLE", + "JG", + [ + ["SETO", ["KMOVW", "", "KMOVQ"], "", ""], + ["SETO", ["KMOVB", "", "KMOVD"], "", ""], + "", + "", + ], + [ + ["SETNO", ["KMOVW", "", "KMOVQ"], "", ""], + ["SETNO", ["KMOVB", "", "KMOVD"], "", ""], + "", + "", + ], + [ + ["SETB", ["KMOVW", "", "???"], "", ""], + ["SETB", ["KMOVB", "", "???"], "", ""], + "", + ["SETB", ["KMOVD", "", "KMOVQ"], "", ""], + ], + [ + ["SETAE", ["KMOVW", "", "???"], "", ""], + ["SETAE", ["KMOVB", "", "???"], "", ""], + "", + ["SETAE", ["KMOVD", "", "KMOVQ"], "", ""], + ], + "SETE", + [["SETNE", "KCONCATH", "", ""], "", "", ""], + "SETBE", + [["SETA", "KCONCATL", "", ""], "", "", ""], + [ + ["SETS", ["KORTESTW", "", "KORTESTQ"], "", ""], + ["SETS", ["KORTESTB", "", "KORTESTD"], "", ""], + "", + "", + ], + [ + ["SETNS", ["KTESTW", "", "KTESTQ"], "", ""], + ["SETNS", ["KTESTB", "", "KTESTD"], "", ""], + "", + "", + ], + "SETP", + "SETNP", + "SETL", + "SETGE", + "SETLE", + "SETG", + "PUSH", + "POP", + "CPUID", //Identifies the CPU and which Instructions the current CPU can use. + "BT", + "SHLD", + "SHLD", + "XBTS", + "IBTS", + "PUSH", + "POP", + "RSM", + "BTS", + "SHRD", + "SHRD", + [ + [ + ["FXSAVE", "???", "FXSAVE64"], + ["FXRSTOR", "???", "FXRSTOR64"], + "LDMXCSR", + "STMXCSR", + ["XSAVE", "", "XSAVE64"], + ["XRSTOR", "", "XRSTOR64"], + ["XSAVEOPT", "CLWB", "XSAVEOPT64"], + ["CLFLUSHOPT", "CLFLUSH", ""], + ], + [ + ["???", "???", ["RDFSBASE", "", "", ""], "???"], + ["???", "???", ["RDGSBASE", "", "", ""], "???"], + ["???", "???", ["WRFSBASE", "", "", ""], "???"], + ["???", "???", ["WRGSBASE", "", "", ""], "???"], + "???", + ["LFENCE", "???", "???", "???", "???", "???", "???", "???"], + ["MFENCE", "???", "???", "???", "???", "???", "???", "???"], + ["SFENCE", "???", "???", "???", "???", "???", "???", "???"], + ], + ], + "IMUL", + "CMPXCHG", + "CMPXCHG", + ["LSS", "???"], + "BTR", + ["LFS", "???"], + ["LGS", "???"], + "MOVZX", + "MOVZX", + [["JMPE", "", "", ""], "???", ["POPCNT", "POPCNT", "", ""], "???"], + "???", + ["???", "???", "???", "???", "BT", "BTS", "BTR", "BTC"], + "BTC", + [ + ["BSF", "", "", ""], + "???", + ["TZCNT", "TZCNT", "", ""], + ["BSF", "TZCNTI", "", ""], + ], + [ + ["BSR", "", "", ""], + "???", + ["LZCNT", "LZCNT", "", ""], + ["BSR", "", "", ""], + ], + "MOVSX", + "MOVSX", + "XADD", + "XADD", + [ + ["CMP,PS,", "CMP,PS,", "CMP,PS,", "CMP,PS,"], + ["CMP,PD,", "CMP,PD,", "CMP,PD,", "CMP,PD,"], + ["CMP,SS,", "CMP,SS,", "CMP,SS,", ""], + ["CMP,SD,", "CMP,SD,", "CMP,SD,", ""], + ], + ["MOVNTI", "???"], + [["PINSRW", "", "", ""], "PINSRW", "", ""], + ["???", [["PEXTRW", "", "", ""], "PEXTRW", "", ""]], + ["SHUFPS", "SHUFPD", "???", "???"], + [ + [ + "???", + ["CMPXCHG8B", "", "CMPXCHG16B"], + "???", + ["XRSTORS", "", "XRSTORS64"], + ["XSAVEC", "", "XSAVEC64"], + ["XSAVES", "", "XSAVES64"], + ["VMPTRLD", "VMCLEAR", "VMXON", "???"], + ["VMPTRST", "???", "???", "???"], + ], + [ + "???", + ["SSS", "???", "???", "???", "???", "???", "???", "???"], //Synthetic virtual machine operation codes. + "???", + "???", + "???", + "???", + "RDRAND", + "RDSEED", + ], + ], + "BSWAP", + "BSWAP", + "BSWAP", + "BSWAP", + "BSWAP", + "BSWAP", + "BSWAP", + "BSWAP", + [ + "???", + ["ADDSUBPD", "ADDSUBPD", "", ""], + "???", + ["ADDSUBPS", "ADDSUBPS", "", ""], + ], + [["PSRLW", "", "", ""], "PSRLW", "", ""], + [ + ["PSRLD", "", "", ""], + ["PSRLD", "PSRLD", ["PSRLD", "", "???"], ""], + "", + "", + ], + [["PSRLQ", "", "", ""], "PSRLQ", "", ""], + [["PADDQ", "", "", ""], "PADDQ", "", ""], + [["PMULLW", "", "", ""], "PMULLW", "", ""], + [ + ["???", "MOVQ", "???", "???"], + ["???", "MOVQ", ["MOVQ2DQ", "", "", ""], ["MOVDQ2Q", "", "", ""]], + ], + [ + "???", + [ + ["PMOVMSKB", "", "", ""], + ["PMOVMSKB", "PMOVMSKB", "", ""], + "???", + "???", + ], + ], + [["PSUBUSB", "", "", ""], "PSUBUSB", "", ""], + [["PSUBUSW", "", "", ""], "PSUBUSW", "", ""], + [["PMINUB", "", "", ""], "PMINUB", "", ""], + [ + ["PAND", "", "", ""], + ["PAND", "PAND", ["PANDD", "", "PANDQ"], ["PANDD", "", "PANDQ"]], + "", + "", + ], + [["PADDUSB", "", "", ""], "PADDUSB", "", ""], + [["PADDUSW", "", "", ""], "PADDUSW", "", ""], + [["PMAXUB", "", "", ""], "PMAXUB", "", ""], + [ + ["PANDN", "", "", ""], + ["PANDN", "PANDN", ["PANDND", "", "PANDNQ"], ["PANDND", "", "PANDNQ"]], + "", + "", + ], + [["PAVGB", "", "", ""], "PAVGB", "", ""], + [ + [["PSRAW", "", "", ""], ["PSRAW", "PSRAW", "PSRAW", ""], "", ""], + [["PSRAW", "", "", ""], ["PSRAW", "PSRAW", "PSRAW", ""], "", ""], + ], + [ + ["PSRAD", "", "", ""], + ["PSRAD", "PSRAD", ["PSRAD", "", "PSRAQ"], ""], + "", + "", + ], + [["PAVGW", "", "", ""], "PAVGW", "", ""], + [["PMULHUW", "", "", ""], "PMULHUW", "", ""], + [["PMULHW", "", "", ""], "PMULHW", "", ""], + [ + "???", + ["CVTTPD2DQ", "CVTTPD2DQ", "CVTTPD2DQ", ""], + [ + "CVTDQ2PD", + "CVTDQ2PD", + ["CVTDQ2PD", "CVTDQ2PD", "CVTQQ2PD"], + "CVTDQ2PD", + ], + "CVTPD2DQ", + ], + [[["MOVNTQ", "", "", ""], ["MOVNTDQ", "", "???"], "???", "???"], "???"], + [["PSUBSB", "", "", ""], "PSUBSB", "", ""], + [["PSUBSW", "", "", ""], "PSUBSW", "", ""], + [["PMINSW", "", "", ""], "PMINSW", "", ""], + [ + ["POR", "", "", ""], + ["POR", "POR", ["PORD", "", "PORQ"], ["PORD", "", "PORQ"]], + "", + "", + ], + [["PADDSB", "", "", ""], "PADDSB", "", ""], + [["PADDSW", "", "", ""], "PADDSW", "", ""], + [["PMAXSW", "", "", ""], "PMAXSW", "", ""], + [ + ["PXOR", "", "", ""], + ["PXOR", "PXOR", ["PXORD", "", "PXORQ"], ["PXORD", "", "PXORQ"]], + "", + "", + ], + [["???", "???", "???", ["LDDQU", "LDDQU", "", ""]], "???"], + [["PSLLW", "", "", ""], "PSLLW", "", ""], + [["PSLLD", "", "", ""], ["PSLLD", "", "???"], "", ""], + [["PSLLQ", "", "", ""], "PSLLQ", "", ""], + [["PMULUDQ", "", "", ""], "PMULUDQ", "", ""], + [["PMADDWD", "", "", ""], "PMADDWD", "", ""], + [["PSADBW", "", "", ""], "PSADBW", "", ""], + [ + "???", + [ + ["MASKMOVQ", "", "", ""], + ["MASKMOVDQU", "MASKMOVDQU", "", ""], + "???", + "???", + ], + ], + [["PSUBB", "", "", ""], "PSUBB", "", ""], + [["PSUBW", "", "", ""], "PSUBW", "", ""], + [ + ["PSUBD", "", "", ""], + ["PSUBD", "PSUBD", ["PSUBD", "", "???"], ["PSUBD", "", "???"]], + "", + "", + ], + [["PSUBQ", "", "", ""], "PSUBQ", "", ""], + [["PADDB", "", "", ""], "PADDB", "", ""], + [["PADDW", "", "", ""], "PADDW", "", ""], + [ + ["PADDD", "", "", ""], + ["PADDD", "PADDD", ["PADDD", "", "???"], ["PADDD", "", "???"]], + "", + "", + ], + "???", + /*------------------------------------------------------------------------------------------------------------------------ Three Byte operations 0F38. Opcodes plus 512 goes to 767 used by escape codes "0F,38", Or set directly by adding map bits "10" because "10 00000000" bin = 512 plus opcode. ------------------------------------------------------------------------------------------------------------------------*/ - [["PSHUFB","","",""],"PSHUFB","???","???"], - [["PHADDW","","",""],["PHADDW","PHADDW","",""],"???","???"], - [["PHADDD","","",""],["PHADDD","PHADDD","",""],"???","???"], - [["PHADDSW","","",""],["PHADDSW","PHADDSW","",""],"???","???"], - [["PMADDUBSW","","",""],"PMADDUBSW","???","???"], - [["PHSUBW","","",""],["PHSUBW","PHSUBW","",""],"???","???"], - [["PHSUBD","","",""],["PHSUBD","PHSUBD","",""],"???","???"], - [["PHSUBSW","","",""],["PHSUBSW","PHSUBSW","",""],"???","???"], - [["PSIGNB","","",""],["PSIGNB","PSIGNB","",""],"???","???"], - [["PSIGNW","","",""],["PSIGNW","PSIGNW","",""],"???","???"], - [["PSIGND","","",""],["PSIGND","PSIGND","",""],"???","???"], - [["PMULHRSW","","",""],"PMULHRSW","???","???"], - ["???",["","PERMILPS",["PERMILPS","","???"],""],"???","???"], - ["???",["","PERMILPD","PERMILPD",""],"???","???"], - ["???",["","TESTPS","",""],"???","???"], - ["???",["","TESTPD","",""],"???","???"], - ["???",["PBLENDVB","PBLENDVB","PSRLVW",""],["","","PMOVUSWB",""],"???"], - ["???",["","","PSRAVW",""],["","","PMOVUSDB",""],"???"], - ["???",["","","PSLLVW",""],["","","PMOVUSQB",""],"???"], - ["???",["","CVTPH2PS",["CVTPH2PS","","???"],""],["","","PMOVUSDW",""],"???"], - ["???",["BLENDVPS","BLENDVPS",["PRORVD","","PRORVQ"],""],["","","PMOVUSQW",""],"???"], - ["???",["BLENDVPD","BLENDVPD",["PROLVD","","PROLVQ"],""],["","","PMOVUSQD",""],"???"], - ["???",["","PERMPS",["PERMPS","","PERMPD"],""],"???","???"], - ["???",["PTEST","PTEST","",""],"???","???"], - ["???",["","BROADCASTSS",["BROADCASTSS","","???"],["BROADCASTSS","","???"]],"???","???"], - ["???",["","BROADCASTSD",["BROADCASTF32X2","","BROADCASTSD"],["???","","BROADCASTSD"]],"???","???"], - ["???",["","BROADCASTF128",["BROADCASTF32X4","","BROADCASTF64X2"],["BROADCASTF32X4","","???"]],"???","???"], - ["???",["","",["BROADCASTF32X8","","BROADCASTF64X4"],["???","","BROADCASTF64X4"]],"???","???"], - [["PABSB","","",""],"PABSB","???","???"], - [["PABSW","","",""],"PABSW","???","???"], - [["PABSD","","",""],["PABSD","","???"],"???","???"], - ["???",["","","PABSQ",""],"???","???"], - ["???","PMOVSXBW",["","","PMOVSWB",""],"???"], - ["???","PMOVSXBD",["","","PMOVSDB",""],"???"], - ["???","PMOVSXBQ",["","","PMOVSQB",""],"???"], - ["???","PMOVSXWD",["","","PMOVSDW",""],"???"], - ["???","PMOVSXWQ",["","","PMOVSQW",""],"???"], - ["???","PMOVSXDQ",["","","PMOVSQD",""],"???"], - ["???",["","",["PTESTMB","","PTESTMW"],""],["","",["PTESTNMB","","PTESTNMW"],""],"???"], - ["???",["","",["PTESTMD","","PTESTMQ"],["PTESTMD","","???"]],["","",["PTESTNMD","","PTESTNMQ"],""],"???"], - ["???","PMULDQ",["","",["PMOVM2B","","PMOVM2W"],""],"???"], - ["???",["PCMPEQQ","PCMPEQQ","PCMPEQQ",""],["","",["PMOVB2M","","PMOVW2M"],""],"???"], - [["???",["MOVNTDQA","","???"],"???","???"],["???","???",["","",["???","","PBROADCASTMB2Q"],""],"???"]], - ["???",["PACKUSDW","","???"],"???","???"], - ["???",["","MASKMOVPS",["SCALEFPS","","SCALEFPD"],""],"???","???"], - ["???",["","MASKMOVPD",["SCALEFSS","","SCALEFSD"],""],"???","???"], - ["???",["","MASKMOVPS","",""],"???","???"], - ["???",["","MASKMOVPD","",""],"???","???"], - ["???","PMOVZXBW",["","","PMOVWB",""],"???"], - ["???","PMOVZXBD",["","","PMOVDB",""],"???"], - ["???","PMOVZXBQ",["","","PMOVQB",""],"???"], - ["???","PMOVZXWD",["","","PMOVDW",""],"???"], - ["???","PMOVZXWQ",["","","PMOVQW",""],"???"], - ["???","PMOVZXDQ",["","",["PMOVQD","PMOVQD",""],""],"???"], - ["???",["","PERMD",["PERMD","","PERMQ"],["PERMD","","???"]],"???","???"], - ["???",["PCMPGTQ","PCMPGTQ","PCMPGTQ",""],"???","???"], - ["???","PMINSB",["","",["PMOVM2D","","PMOVM2Q"],""],"???"], - ["???",["PMINSD","PMINSD",["PMINSD","","PMINSQ"],["PMINSD","","???"]],["","",["PMOVD2M","","PMOVQ2M"],""],"???"], - ["???","PMINUW",["","","PBROADCASTMW2D",""],"???"], - ["???",["PMINUD","PMINUD",["PMINUD","","PMINUQ"],["PMINUD","","???"]],"???","???"], - ["???","PMAXSB","???","???"], - ["???",["PMAXSD","PMAXSD",["PMAXSD","","PMAXSQ"],["PMAXSD","","???"]],"???","???"], - ["???","PMAXUW","???","???"], - ["???",["PMAXUD","PMAXUD",["PMAXUD","","PMAXUQ"],["PMAXUD","","???"]],"???","???"], - ["???",["PMULLD","PMULLD",["PMULLD","","PMULLQ"],["PMULLD","",""]],"???","???"], - ["???",["PHMINPOSUW",["PHMINPOSUW","PHMINPOSUW",""],"",""],"???","???"], - ["???",["","",["GETEXPPS","","GETEXPPD"],["GETEXPPS","","GETEXPPD"]],"???","???"], - ["???",["","",["GETEXPSS","","GETEXPSD"],""],"???","???"], - ["???",["","",["PLZCNTD","","PLZCNTQ"],""],"???","???"], - ["???",["",["PSRLVD","","PSRLVQ"],["PSRLVD","","PSRLVQ"],["PSRLVD","","???"]],"???","???"], - ["???",["",["PSRAVD","",""],["PSRAVD","","PSRAVQ"],["PSRAVD","","???"]],"???","???"], - ["???",["",["PSLLVD","","PSLLVQ"],["PSLLVD","","PSLLVQ"],["PSLLVD","","???"]],"???","???"], - "???","???","???","???", - ["???",["","",["RCP14PS","","RCP14PD"],""],"???","???"], - ["???",["","",["RCP14SS","","RCP14SD"],""],"???","???"], - ["???",["","",["RSQRT14PS","","RSQRT14PD"],""],"???","???"], - ["???",["","",["RSQRT14SS","","RSQRT14SD"],""],"???","???"], - ["???",["","","",["ADDNPS","","ADDNPD"]],"???","???"], - ["???",["","","",["GMAXABSPS","","???"]],"???","???"], - ["???",["","","",["GMINPS","","GMINPD"]],"???","???"], - ["???",["","","",["GMAXPS","","GMAXPD"]],"???","???"], - "", - ["???",["","","",["FIXUPNANPS","","FIXUPNANPD"]],"???","???"], - "","", - ["???",["","PBROADCASTD",["PBROADCASTD","","???"],["PBROADCASTD","","???"]],"???","???"], - ["???",["","PBROADCASTQ",["BROADCASTI32X2","","PBROADCASTQ"],["???","","PBROADCASTQ"]],"???","???"], - ["???",["","BROADCASTI128",["BROADCASTI32X4","","BROADCASTI64X2"],["BROADCASTI32X4","","???"]],"???","???"], - ["???",["","",["BROADCASTI32X8","","BROADCASTI64X4"],["???","","BROADCASTI64X4"]],"???","???"], - ["???",["","","",["PADCD","","???"]],"???","???"], - ["???",["","","",["PADDSETCD","","???"]],"???","???"], - ["???",["","","",["PSBBD","","???"]],"???","???"], - ["???",["","","",["PSUBSETBD","","???"]],"???","???"], - "???","???","???","???", - ["???",["","",["PBLENDMD","","PBLENDMQ"],["PBLENDMD","","PBLENDMQ"]],"???","???"], - ["???",["","",["BLENDMPS","","BLENDMPD"],["BLENDMPS","","BLENDMPD"]],"???","???"], - ["???",["","",["PBLENDMB","","PBLENDMW"],""],"???","???"], - "???","???","???","???","???", - ["???",["","","",["PSUBRD","","???"]],"???","???"], - ["???",["","","",["SUBRPS","","SUBRPD"]],"???","???"], - ["???",["","","",["PSBBRD","","???"]],"???","???"], - ["???",["","","",["PSUBRSETBD","","???"]],"???","???"], - "???","???","???","???", - ["???",["","","",["PCMPLTD","","???"]],"???","???"], - ["???",["","",["PERMI2B","","PERMI2W"],""],"???","???"], - ["???",["","",["PERMI2D","","PERMI2Q"],""],"???","???"], - ["???",["","",["PERMI2PS","","PERMI2PD"],""],"???","???"], - ["???",["","PBROADCASTB",["PBROADCASTB","","???"],""],"???","???"], - ["???",["","PBROADCASTW",["PBROADCASTW","","???"],""],"???","???"], - ["???",["???",["","",["PBROADCASTB","","???"],""],"???","???"]], - ["???",["???",["","",["PBROADCASTW","","???"],""],"???","???"]], - ["???",["","",["PBROADCASTD","","PBROADCASTQ"],""],"???","???"], - ["???",["","",["PERMT2B","","PERMT2W"],""],"???","???"], - ["???",["","",["PERMT2D","","PERMT2Q"],""],"???","???"], - ["???",["","",["PERMT2PS","","PERMT2PD"],""],"???","???"], - [["???","INVEPT","???","???"],"???"], - [["???","INVVPID","???","???"],"???"], - [["???","INVPCID","???","???"],"???"], - ["???",["???","???","PMULTISHIFTQB","???"],"???","???"], - ["???",["","","",["SCALEPS","","???"]],"???","???"], - "???", - ["???",["","","",["PMULHUD","","???"]],"???","???"], - ["???",["","","",["PMULHD","","???"]],"???","???"], - ["???",["","",["EXPANDPS","","EXPANDPD"],""],"???","???"], - ["???",["","",["PEXPANDD","","PEXPANDQ"],""],"???","???"], - ["???",["","",["COMPRESSPS","","COMPRESSPD"],""],"???","???"], - ["???",["","",["PCOMPRESSD","","PCOMPRESSQ"],""],"???","???"], - "???", - ["???",["","",["PERMB","","PERMW"],""],"???","???"], - "???","???", - ["???",["",["PGATHERDD","","PGATHERDQ"],["PGATHERDD","","PGATHERDQ"],["PGATHERDD","","PGATHERDQ"]],"???","???"], - ["???",["",["PGATHERQD","","PGATHERQQ"],["PGATHERQD","","PGATHERQQ"],""],"???","???"], - ["???",["",["GATHERDPS","","GATHERDPD"],["GATHERDPS","","GATHERDPD"],["GATHERDPS","","GATHERDPD"]],"???","???"], - ["???",["",["GATHERQPS","","GATHERQPD"],["GATHERQPS","","GATHERQPD"],""],"???","???"], - "???","???", - ["???",["",["FMADDSUB132PS","","FMADDSUB132PD"],["FMADDSUB132PS","","FMADDSUB132PD"],""],"???","???"], - ["???",["",["FMSUBADD132PS","","FMSUBADD132PD"],["FMSUBADD132PS","","FMSUBADD132PD"],""],"???","???"], - ["???",["",["FMADD132PS","","FMADD132PD"],["FMADD132PS","","FMADD132PD"],["FMADD132PS","","FMADD132PD"]],"???","???"], - ["???",["",["FMADD132SS","","FMADD132SD"],["FMADD132SS","","FMADD132SD"],""],"???","???"], - ["???",["",["FMSUB132PS","","FMSUB132PD"],["FMSUB132PS","","FMSUB132PD"],["FMSUB132PS","","FMSUB132PD"]],"???","???"], - ["???",["",["FMSUB132SS","","FMSUB132SD"],["FMSUB132SS","","FMSUB132SD"],""],"???","???"], - ["???",["",["FNMADD132PS","","FNMADD132PD"],["FNMADD132PS","","FNMADD132PD"],["NMADD132PS","","FNMADD132PD"]],"???","???"], - ["???",["",["FNMADD132SS","","FNMADD132SD"],["FNMADD132SS","","FNMADD132SD"],""],"???","???"], - ["???",["",["FNMSUB132PS","","FNMSUB132PD"],["FNMSUB132PS","","FNMSUB132PD"],["FNMSUB132PS","","FNMSUB132PS"]],"???","???"], - ["???",["",["FNMSUB132SS","","FNMSUB132SD"],["FNMSUB132SS","","FNMSUB132SD"],""],"???","???"], - ["???",["","",["PSCATTERDD","","PSCATTERDQ"],["PSCATTERDD","","PSCATTERDQ"]],"???","???"], - ["???",["","",["PSCATTERQD","","PSCATTERQQ"],""],"???","???"], - ["???",["","",["SCATTERDPS","","SCATTERDPD"],["SCATTERDPS","","SCATTERDPD"]],"???","???"], - ["???",["","",["SCATTERQPS","","SCATTERQPD"],""],"???","???"], - ["???",["","","",["FMADD233PS","","???"]],"???","???"], - "???", - ["???",["",["FMADDSUB213PS","","FMADDSUB213PD"],["FMADDSUB213PS","","FMADDSUB213PD"],""],"???","???"], - ["???",["",["FMSUBADD213PS","","FMSUBADD213PD"],["FMSUBADD213PS","","FMSUBADD213PD"],""],"???","???"], - ["???",["",["FMADD213PS","","FMADD213PD"],["FMADD213PS","","FMADD213PD"],["FMADD213PS","","FMADD213PD"]],"???","???"], - ["???",["",["FMADD213SS","","FMADD213SD"],["FMADD213SS","","FMADD213SD"],""],"???","???"], - ["???",["",["FMSUB213PS","","FMSUB213PD"],["FMSUB213PS","","FMSUB213PD"],["FMSUB213PS","","FMSUB213PD"]],"???","???"], - ["???",["",["FMSUB213SS","","FMSUB213SD"],["FMSUB213SS","","FMSUB213SD"],""],"???","???"], - ["???",["",["FNMADD213PS","","FNMADD213PD"],["FNMADD213PS","","FNMADD213PD"],["FNMADD213PS","","FNMADD213PD"]],"???","???"], - ["???",["",["FNMADD213SS","","FNMADD213SD"],["FNMADD213SS","","FNMADD213SD"],""],"???","???"], - ["???",["",["FNMSUB213PS","","FNMSUB213PD"],["FNMSUB213PS","","FNMSUB213PD"],["FNMSUB213PS","","FNMSUB213PD"]],"???","???"], - ["???",["",["FNMSUB213SS","","FNMSUB213SD"],["FNMSUB213SS","","FNMSUB213SD"],""],"???","???"], - "???","???","???","???", - ["???",["","","PMADD52LUQ",["PMADD233D","","???"]],"???","???"], - ["???",["","","PMADD52HUQ",["PMADD231D","","???"]],"???","???"], - ["???",["",["FMADDSUB231PS","","FMADDSUB231PD"],["FMADDSUB231PS","","FMADDSUB231PD"],""],"???","???"], - ["???",["",["FMSUBADD231PS","","FMSUBADD231PD"],["FMSUBADD231PS","","FMSUBADD231PD"],""],"???","???"], - ["???",["",["FMADD231PS","","FMADD231PD"],["FMADD231PS","","FMADD231PD"],["FMADD231PS","","FMADD231PD"]],"???","???"], - ["???",["",["FMADD231SS","","FMADD231SD"],["FMADD231SS","","FMADD231SD"],""],"???","???"], - ["???",["",["FMSUB231PS","","FMSUB231PD"],["FMSUB231PS","","FMSUB231PD"],["FMSUB231PS","","FMSUB231PD"]],"???","???"], - ["???",["",["FMSUB231SS","","FMSUB231SD"],["FMSUB231SS","","FMSUB231SD"],""],"???","???"], - ["???",["",["FNMADD231PS","","FNMADD231PD"],["FNMADD231PS","","FNMADD231PD"],["FNMADD231PS","","FNMADD231PD"]],"???","???"], - ["???",["",["FNMADD231SS","","FNMADD231SD"],["FNMADD231SS","","FNMADD231SD"],""],"???","???"], - ["???",["",["FNMSUB231PS","","FNMSUB231PD"],["FNMSUB231PS","","FNMSUB231PD"],["FNMSUB231PS","","FNMSUB231PD"]],"???","???"], - ["???",["",["FNMSUB231SS","","FNMSUB231SD"],["FNMSUB231SS","","FNMSUB231SD"],""],"???","???"], - "???","???","???","???", - ["???",["","",["PCONFLICTD","","PCONFLICTQ"],""],"???","???"], - "???", - [ + [["PSHUFB", "", "", ""], "PSHUFB", "???", "???"], + [["PHADDW", "", "", ""], ["PHADDW", "PHADDW", "", ""], "???", "???"], + [["PHADDD", "", "", ""], ["PHADDD", "PHADDD", "", ""], "???", "???"], + [["PHADDSW", "", "", ""], ["PHADDSW", "PHADDSW", "", ""], "???", "???"], + [["PMADDUBSW", "", "", ""], "PMADDUBSW", "???", "???"], + [["PHSUBW", "", "", ""], ["PHSUBW", "PHSUBW", "", ""], "???", "???"], + [["PHSUBD", "", "", ""], ["PHSUBD", "PHSUBD", "", ""], "???", "???"], + [["PHSUBSW", "", "", ""], ["PHSUBSW", "PHSUBSW", "", ""], "???", "???"], + [["PSIGNB", "", "", ""], ["PSIGNB", "PSIGNB", "", ""], "???", "???"], + [["PSIGNW", "", "", ""], ["PSIGNW", "PSIGNW", "", ""], "???", "???"], + [["PSIGND", "", "", ""], ["PSIGND", "PSIGND", "", ""], "???", "???"], + [["PMULHRSW", "", "", ""], "PMULHRSW", "???", "???"], + ["???", ["", "PERMILPS", ["PERMILPS", "", "???"], ""], "???", "???"], + ["???", ["", "PERMILPD", "PERMILPD", ""], "???", "???"], + ["???", ["", "TESTPS", "", ""], "???", "???"], + ["???", ["", "TESTPD", "", ""], "???", "???"], [ - ["???",["","","",["GATHERPF0HINTDPS","","GATHERPF0HINTDPD"]],"???","???"], - ["???",["","",["GATHERPF0DPS","","GATHERPF0DPD"],["GATHERPF0DPS","",""]],"???","???"], - ["???",["","",["GATHERPF1DPS","","GATHERPF1DPD"],["GATHERPF1DPS","",""]],"???","???"], - "???", - ["???",["","","",["SCATTERPF0HINTDPS","","SCATTERPF0HINTDPD"]],"???","???"], - ["???",["","",["SCATTERPF0DPS","","SCATTERPF0DPD"],["VSCATTERPF0DPS","",""]],"???","???"], - ["???",["","",["SCATTERPF1DPS","","SCATTERPF1DPD"],["VSCATTERPF1DPS","",""]],"???","???"], - "???" - ],"???" - ], - [ + "???", + ["PBLENDVB", "PBLENDVB", "PSRLVW", ""], + ["", "", "PMOVUSWB", ""], + "???", + ], + ["???", ["", "", "PSRAVW", ""], ["", "", "PMOVUSDB", ""], "???"], + ["???", ["", "", "PSLLVW", ""], ["", "", "PMOVUSQB", ""], "???"], [ - "???", - ["???",["","",["GATHERPF0QPS","","GATHERPF0QPD"],""],"???","???"], - ["???",["","",["GATHERPF1QPS","","GATHERPF1QPD"],""],"???","???"], - "???","???", - ["???",["","",["SCATTERPF0QPS","","SCATTERPF0QPD"],""],"???","???"], - ["???",["","",["SCATTERPF1QPS","","SCATTERPF1QPD"],""],"???","???"], - "???" - ],"???" - ], - [["SHA1NEXTE","","",""],["","",["EXP2PS","","EXP2PD"],["EXP223PS","","???"]],"???","???"], - [["SHA1MSG1","","",""],["","","",["LOG2PS","","???"]],"???","???"], - [["SHA1MSG2","","",""],["","",["RCP28PS","","RCP28PD"],["RCP23PS","","???"]],"???","???"], - [["SHA256RNDS2","","",""],["","",["RCP28SS","","RCP28SD"],["RSQRT23PS","","???"]],"???","???"], - [["SHA256MSG1","","",""],["","",["RSQRT28PS","","RSQRT28PD"],["ADDSETSPS","","???"]],"???","???"], - [["SHA256MSG2","","",""],["","",["RSQRT28SS","","RSQRT28SD"],["PADDSETSD","","???"]],"???","???"], - "???","???", - [[["","","",["LOADUNPACKLD","","LOADUNPACKLQ"]],["","","",["PACKSTORELD","","PACKSTORELQ"]],"???","???"],"???"], - [[["","","",["LOADUNPACKLPS","","LOADUNPACKLPD"]],["","","",["PACKSTORELPS","","PACKSTORELPD"]],"???","???"],"???"], - "???","???", - [[["","","",["LOADUNPACKHD","","LOADUNPACKHQ"]],["","","",["PACKSTOREHD","","PACKSTOREHQ"]],"???","???"],"???"], - [[["","","",["LOADUNPACKHPS","","LOADUNPACKHPD"]],["","","",["PACKSTOREHPS","","PACKSTOREHPD"]],"???","???"],"???"], - "???","???","???","???","???", - ["???",["AESIMC","AESIMC","",""],"???","???"], - ["???",["AESENC","AESENC","",""],"???","???"], - ["???",["AESENCLAST","AESENCLAST","",""],"???","???"], - ["???",["AESDEC","AESDEC","",""],"???","???"], - ["???",["AESDECLAST","AESDECLAST","",""],"???","???"], - "???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???", - [ - ["MOVBE","","",""], - ["MOVBE","","",""],"???", - ["CRC32","","",""] - ], - [ - ["MOVBE","","",""], - ["MOVBE","","",""],"???", - ["CRC32","","",""] - ], - ["???",["","ANDN","",""],"???","???"], - [ + "???", + ["", "CVTPH2PS", ["CVTPH2PS", "", "???"], ""], + ["", "", "PMOVUSDW", ""], + "???", + ], + [ + "???", + ["BLENDVPS", "BLENDVPS", ["PRORVD", "", "PRORVQ"], ""], + ["", "", "PMOVUSQW", ""], + "???", + ], + [ + "???", + ["BLENDVPD", "BLENDVPD", ["PROLVD", "", "PROLVQ"], ""], + ["", "", "PMOVUSQD", ""], + "???", + ], + ["???", ["", "PERMPS", ["PERMPS", "", "PERMPD"], ""], "???", "???"], + ["???", ["PTEST", "PTEST", "", ""], "???", "???"], + [ + "???", + [ + "", + "BROADCASTSS", + ["BROADCASTSS", "", "???"], + ["BROADCASTSS", "", "???"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + "BROADCASTSD", + ["BROADCASTF32X2", "", "BROADCASTSD"], + ["???", "", "BROADCASTSD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + "BROADCASTF128", + ["BROADCASTF32X4", "", "BROADCASTF64X2"], + ["BROADCASTF32X4", "", "???"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + "", + ["BROADCASTF32X8", "", "BROADCASTF64X4"], + ["???", "", "BROADCASTF64X4"], + ], + "???", + "???", + ], + [["PABSB", "", "", ""], "PABSB", "???", "???"], + [["PABSW", "", "", ""], "PABSW", "???", "???"], + [["PABSD", "", "", ""], ["PABSD", "", "???"], "???", "???"], + ["???", ["", "", "PABSQ", ""], "???", "???"], + ["???", "PMOVSXBW", ["", "", "PMOVSWB", ""], "???"], + ["???", "PMOVSXBD", ["", "", "PMOVSDB", ""], "???"], + ["???", "PMOVSXBQ", ["", "", "PMOVSQB", ""], "???"], + ["???", "PMOVSXWD", ["", "", "PMOVSDW", ""], "???"], + ["???", "PMOVSXWQ", ["", "", "PMOVSQW", ""], "???"], + ["???", "PMOVSXDQ", ["", "", "PMOVSQD", ""], "???"], + [ + "???", + ["", "", ["PTESTMB", "", "PTESTMW"], ""], + ["", "", ["PTESTNMB", "", "PTESTNMW"], ""], + "???", + ], + [ + "???", + ["", "", ["PTESTMD", "", "PTESTMQ"], ["PTESTMD", "", "???"]], + ["", "", ["PTESTNMD", "", "PTESTNMQ"], ""], + "???", + ], + ["???", "PMULDQ", ["", "", ["PMOVM2B", "", "PMOVM2W"], ""], "???"], + [ + "???", + ["PCMPEQQ", "PCMPEQQ", "PCMPEQQ", ""], + ["", "", ["PMOVB2M", "", "PMOVW2M"], ""], + "???", + ], + [ + ["???", ["MOVNTDQA", "", "???"], "???", "???"], + ["???", "???", ["", "", ["???", "", "PBROADCASTMB2Q"], ""], "???"], + ], + ["???", ["PACKUSDW", "", "???"], "???", "???"], + ["???", ["", "MASKMOVPS", ["SCALEFPS", "", "SCALEFPD"], ""], "???", "???"], + ["???", ["", "MASKMOVPD", ["SCALEFSS", "", "SCALEFSD"], ""], "???", "???"], + ["???", ["", "MASKMOVPS", "", ""], "???", "???"], + ["???", ["", "MASKMOVPD", "", ""], "???", "???"], + ["???", "PMOVZXBW", ["", "", "PMOVWB", ""], "???"], + ["???", "PMOVZXBD", ["", "", "PMOVDB", ""], "???"], + ["???", "PMOVZXBQ", ["", "", "PMOVQB", ""], "???"], + ["???", "PMOVZXWD", ["", "", "PMOVDW", ""], "???"], + ["???", "PMOVZXWQ", ["", "", "PMOVQW", ""], "???"], + ["???", "PMOVZXDQ", ["", "", ["PMOVQD", "PMOVQD", ""], ""], "???"], + [ + "???", + ["", "PERMD", ["PERMD", "", "PERMQ"], ["PERMD", "", "???"]], + "???", + "???", + ], + ["???", ["PCMPGTQ", "PCMPGTQ", "PCMPGTQ", ""], "???", "???"], + ["???", "PMINSB", ["", "", ["PMOVM2D", "", "PMOVM2Q"], ""], "???"], + [ + "???", + ["PMINSD", "PMINSD", ["PMINSD", "", "PMINSQ"], ["PMINSD", "", "???"]], + ["", "", ["PMOVD2M", "", "PMOVQ2M"], ""], + "???", + ], + ["???", "PMINUW", ["", "", "PBROADCASTMW2D", ""], "???"], + [ + "???", + ["PMINUD", "PMINUD", ["PMINUD", "", "PMINUQ"], ["PMINUD", "", "???"]], + "???", + "???", + ], + ["???", "PMAXSB", "???", "???"], + [ + "???", + ["PMAXSD", "PMAXSD", ["PMAXSD", "", "PMAXSQ"], ["PMAXSD", "", "???"]], + "???", + "???", + ], + ["???", "PMAXUW", "???", "???"], + [ + "???", + ["PMAXUD", "PMAXUD", ["PMAXUD", "", "PMAXUQ"], ["PMAXUD", "", "???"]], + "???", + "???", + ], + [ + "???", + ["PMULLD", "PMULLD", ["PMULLD", "", "PMULLQ"], ["PMULLD", "", ""]], + "???", + "???", + ], + [ + "???", + ["PHMINPOSUW", ["PHMINPOSUW", "PHMINPOSUW", ""], "", ""], + "???", + "???", + ], + [ + "???", + ["", "", ["GETEXPPS", "", "GETEXPPD"], ["GETEXPPS", "", "GETEXPPD"]], + "???", + "???", + ], + ["???", ["", "", ["GETEXPSS", "", "GETEXPSD"], ""], "???", "???"], + ["???", ["", "", ["PLZCNTD", "", "PLZCNTQ"], ""], "???", "???"], + [ + "???", + [ + "", + ["PSRLVD", "", "PSRLVQ"], + ["PSRLVD", "", "PSRLVQ"], + ["PSRLVD", "", "???"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["PSRAVD", "", ""], + ["PSRAVD", "", "PSRAVQ"], + ["PSRAVD", "", "???"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["PSLLVD", "", "PSLLVQ"], + ["PSLLVD", "", "PSLLVQ"], + ["PSLLVD", "", "???"], + ], + "???", + "???", + ], "???", - ["???",["","BLSR","",""],"???","???"], - ["???",["","BLSMSK","",""],"???","???"], - ["???",["","BLSI","",""],"???","???"], - "???","???","???","???" - ],"???", - [ - ["","BZHI","",""],"???", - ["","PEXT","",""], - ["","PDEP","",""] - ], - [ "???", - ["ADCX","","",""], - ["ADOX","","",""], - ["","MULX","",""] - ], - [ - ["","BEXTR","",""], - ["","SHLX","",""], - ["","SARX","",""], - ["","SHRX","",""] - ], - "???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------ + "???", + "???", + ["???", ["", "", ["RCP14PS", "", "RCP14PD"], ""], "???", "???"], + ["???", ["", "", ["RCP14SS", "", "RCP14SD"], ""], "???", "???"], + ["???", ["", "", ["RSQRT14PS", "", "RSQRT14PD"], ""], "???", "???"], + ["???", ["", "", ["RSQRT14SS", "", "RSQRT14SD"], ""], "???", "???"], + ["???", ["", "", "", ["ADDNPS", "", "ADDNPD"]], "???", "???"], + ["???", ["", "", "", ["GMAXABSPS", "", "???"]], "???", "???"], + ["???", ["", "", "", ["GMINPS", "", "GMINPD"]], "???", "???"], + ["???", ["", "", "", ["GMAXPS", "", "GMAXPD"]], "???", "???"], + "", + ["???", ["", "", "", ["FIXUPNANPS", "", "FIXUPNANPD"]], "???", "???"], + "", + "", + [ + "???", + [ + "", + "PBROADCASTD", + ["PBROADCASTD", "", "???"], + ["PBROADCASTD", "", "???"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + "PBROADCASTQ", + ["BROADCASTI32X2", "", "PBROADCASTQ"], + ["???", "", "PBROADCASTQ"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + "BROADCASTI128", + ["BROADCASTI32X4", "", "BROADCASTI64X2"], + ["BROADCASTI32X4", "", "???"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + "", + ["BROADCASTI32X8", "", "BROADCASTI64X4"], + ["???", "", "BROADCASTI64X4"], + ], + "???", + "???", + ], + ["???", ["", "", "", ["PADCD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["PADDSETCD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["PSBBD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["PSUBSETBD", "", "???"]], "???", "???"], + "???", + "???", + "???", + "???", + [ + "???", + ["", "", ["PBLENDMD", "", "PBLENDMQ"], ["PBLENDMD", "", "PBLENDMQ"]], + "???", + "???", + ], + [ + "???", + ["", "", ["BLENDMPS", "", "BLENDMPD"], ["BLENDMPS", "", "BLENDMPD"]], + "???", + "???", + ], + ["???", ["", "", ["PBLENDMB", "", "PBLENDMW"], ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + ["???", ["", "", "", ["PSUBRD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["SUBRPS", "", "SUBRPD"]], "???", "???"], + ["???", ["", "", "", ["PSBBRD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["PSUBRSETBD", "", "???"]], "???", "???"], + "???", + "???", + "???", + "???", + ["???", ["", "", "", ["PCMPLTD", "", "???"]], "???", "???"], + ["???", ["", "", ["PERMI2B", "", "PERMI2W"], ""], "???", "???"], + ["???", ["", "", ["PERMI2D", "", "PERMI2Q"], ""], "???", "???"], + ["???", ["", "", ["PERMI2PS", "", "PERMI2PD"], ""], "???", "???"], + ["???", ["", "PBROADCASTB", ["PBROADCASTB", "", "???"], ""], "???", "???"], + ["???", ["", "PBROADCASTW", ["PBROADCASTW", "", "???"], ""], "???", "???"], + ["???", ["???", ["", "", ["PBROADCASTB", "", "???"], ""], "???", "???"]], + ["???", ["???", ["", "", ["PBROADCASTW", "", "???"], ""], "???", "???"]], + ["???", ["", "", ["PBROADCASTD", "", "PBROADCASTQ"], ""], "???", "???"], + ["???", ["", "", ["PERMT2B", "", "PERMT2W"], ""], "???", "???"], + ["???", ["", "", ["PERMT2D", "", "PERMT2Q"], ""], "???", "???"], + ["???", ["", "", ["PERMT2PS", "", "PERMT2PD"], ""], "???", "???"], + [["???", "INVEPT", "???", "???"], "???"], + [["???", "INVVPID", "???", "???"], "???"], + [["???", "INVPCID", "???", "???"], "???"], + ["???", ["???", "???", "PMULTISHIFTQB", "???"], "???", "???"], + ["???", ["", "", "", ["SCALEPS", "", "???"]], "???", "???"], + "???", + ["???", ["", "", "", ["PMULHUD", "", "???"]], "???", "???"], + ["???", ["", "", "", ["PMULHD", "", "???"]], "???", "???"], + ["???", ["", "", ["EXPANDPS", "", "EXPANDPD"], ""], "???", "???"], + ["???", ["", "", ["PEXPANDD", "", "PEXPANDQ"], ""], "???", "???"], + ["???", ["", "", ["COMPRESSPS", "", "COMPRESSPD"], ""], "???", "???"], + ["???", ["", "", ["PCOMPRESSD", "", "PCOMPRESSQ"], ""], "???", "???"], + "???", + ["???", ["", "", ["PERMB", "", "PERMW"], ""], "???", "???"], + "???", + "???", + [ + "???", + [ + "", + ["PGATHERDD", "", "PGATHERDQ"], + ["PGATHERDD", "", "PGATHERDQ"], + ["PGATHERDD", "", "PGATHERDQ"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["PGATHERQD", "", "PGATHERQQ"], + ["PGATHERQD", "", "PGATHERQQ"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["GATHERDPS", "", "GATHERDPD"], + ["GATHERDPS", "", "GATHERDPD"], + ["GATHERDPS", "", "GATHERDPD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["GATHERQPS", "", "GATHERQPD"], + ["GATHERQPS", "", "GATHERQPD"], + "", + ], + "???", + "???", + ], + "???", + "???", + [ + "???", + [ + "", + ["FMADDSUB132PS", "", "FMADDSUB132PD"], + ["FMADDSUB132PS", "", "FMADDSUB132PD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMSUBADD132PS", "", "FMSUBADD132PD"], + ["FMSUBADD132PS", "", "FMSUBADD132PD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMADD132PS", "", "FMADD132PD"], + ["FMADD132PS", "", "FMADD132PD"], + ["FMADD132PS", "", "FMADD132PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMADD132SS", "", "FMADD132SD"], + ["FMADD132SS", "", "FMADD132SD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMSUB132PS", "", "FMSUB132PD"], + ["FMSUB132PS", "", "FMSUB132PD"], + ["FMSUB132PS", "", "FMSUB132PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMSUB132SS", "", "FMSUB132SD"], + ["FMSUB132SS", "", "FMSUB132SD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMADD132PS", "", "FNMADD132PD"], + ["FNMADD132PS", "", "FNMADD132PD"], + ["NMADD132PS", "", "FNMADD132PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMADD132SS", "", "FNMADD132SD"], + ["FNMADD132SS", "", "FNMADD132SD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMSUB132PS", "", "FNMSUB132PD"], + ["FNMSUB132PS", "", "FNMSUB132PD"], + ["FNMSUB132PS", "", "FNMSUB132PS"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMSUB132SS", "", "FNMSUB132SD"], + ["FNMSUB132SS", "", "FNMSUB132SD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + "", + ["PSCATTERDD", "", "PSCATTERDQ"], + ["PSCATTERDD", "", "PSCATTERDQ"], + ], + "???", + "???", + ], + ["???", ["", "", ["PSCATTERQD", "", "PSCATTERQQ"], ""], "???", "???"], + [ + "???", + [ + "", + "", + ["SCATTERDPS", "", "SCATTERDPD"], + ["SCATTERDPS", "", "SCATTERDPD"], + ], + "???", + "???", + ], + ["???", ["", "", ["SCATTERQPS", "", "SCATTERQPD"], ""], "???", "???"], + ["???", ["", "", "", ["FMADD233PS", "", "???"]], "???", "???"], + "???", + [ + "???", + [ + "", + ["FMADDSUB213PS", "", "FMADDSUB213PD"], + ["FMADDSUB213PS", "", "FMADDSUB213PD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMSUBADD213PS", "", "FMSUBADD213PD"], + ["FMSUBADD213PS", "", "FMSUBADD213PD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMADD213PS", "", "FMADD213PD"], + ["FMADD213PS", "", "FMADD213PD"], + ["FMADD213PS", "", "FMADD213PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMADD213SS", "", "FMADD213SD"], + ["FMADD213SS", "", "FMADD213SD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMSUB213PS", "", "FMSUB213PD"], + ["FMSUB213PS", "", "FMSUB213PD"], + ["FMSUB213PS", "", "FMSUB213PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMSUB213SS", "", "FMSUB213SD"], + ["FMSUB213SS", "", "FMSUB213SD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMADD213PS", "", "FNMADD213PD"], + ["FNMADD213PS", "", "FNMADD213PD"], + ["FNMADD213PS", "", "FNMADD213PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMADD213SS", "", "FNMADD213SD"], + ["FNMADD213SS", "", "FNMADD213SD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMSUB213PS", "", "FNMSUB213PD"], + ["FNMSUB213PS", "", "FNMSUB213PD"], + ["FNMSUB213PS", "", "FNMSUB213PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMSUB213SS", "", "FNMSUB213SD"], + ["FNMSUB213SS", "", "FNMSUB213SD"], + "", + ], + "???", + "???", + ], + "???", + "???", + "???", + "???", + ["???", ["", "", "PMADD52LUQ", ["PMADD233D", "", "???"]], "???", "???"], + ["???", ["", "", "PMADD52HUQ", ["PMADD231D", "", "???"]], "???", "???"], + [ + "???", + [ + "", + ["FMADDSUB231PS", "", "FMADDSUB231PD"], + ["FMADDSUB231PS", "", "FMADDSUB231PD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMSUBADD231PS", "", "FMSUBADD231PD"], + ["FMSUBADD231PS", "", "FMSUBADD231PD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMADD231PS", "", "FMADD231PD"], + ["FMADD231PS", "", "FMADD231PD"], + ["FMADD231PS", "", "FMADD231PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMADD231SS", "", "FMADD231SD"], + ["FMADD231SS", "", "FMADD231SD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMSUB231PS", "", "FMSUB231PD"], + ["FMSUB231PS", "", "FMSUB231PD"], + ["FMSUB231PS", "", "FMSUB231PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FMSUB231SS", "", "FMSUB231SD"], + ["FMSUB231SS", "", "FMSUB231SD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMADD231PS", "", "FNMADD231PD"], + ["FNMADD231PS", "", "FNMADD231PD"], + ["FNMADD231PS", "", "FNMADD231PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMADD231SS", "", "FNMADD231SD"], + ["FNMADD231SS", "", "FNMADD231SD"], + "", + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMSUB231PS", "", "FNMSUB231PD"], + ["FNMSUB231PS", "", "FNMSUB231PD"], + ["FNMSUB231PS", "", "FNMSUB231PD"], + ], + "???", + "???", + ], + [ + "???", + [ + "", + ["FNMSUB231SS", "", "FNMSUB231SD"], + ["FNMSUB231SS", "", "FNMSUB231SD"], + "", + ], + "???", + "???", + ], + "???", + "???", + "???", + "???", + ["???", ["", "", ["PCONFLICTD", "", "PCONFLICTQ"], ""], "???", "???"], + "???", + [ + [ + [ + "???", + ["", "", "", ["GATHERPF0HINTDPS", "", "GATHERPF0HINTDPD"]], + "???", + "???", + ], + [ + "???", + [ + "", + "", + ["GATHERPF0DPS", "", "GATHERPF0DPD"], + ["GATHERPF0DPS", "", ""], + ], + "???", + "???", + ], + [ + "???", + [ + "", + "", + ["GATHERPF1DPS", "", "GATHERPF1DPD"], + ["GATHERPF1DPS", "", ""], + ], + "???", + "???", + ], + "???", + [ + "???", + ["", "", "", ["SCATTERPF0HINTDPS", "", "SCATTERPF0HINTDPD"]], + "???", + "???", + ], + [ + "???", + [ + "", + "", + ["SCATTERPF0DPS", "", "SCATTERPF0DPD"], + ["VSCATTERPF0DPS", "", ""], + ], + "???", + "???", + ], + [ + "???", + [ + "", + "", + ["SCATTERPF1DPS", "", "SCATTERPF1DPD"], + ["VSCATTERPF1DPS", "", ""], + ], + "???", + "???", + ], + "???", + ], + "???", + ], + [ + [ + "???", + [ + "???", + ["", "", ["GATHERPF0QPS", "", "GATHERPF0QPD"], ""], + "???", + "???", + ], + [ + "???", + ["", "", ["GATHERPF1QPS", "", "GATHERPF1QPD"], ""], + "???", + "???", + ], + "???", + "???", + [ + "???", + ["", "", ["SCATTERPF0QPS", "", "SCATTERPF0QPD"], ""], + "???", + "???", + ], + [ + "???", + ["", "", ["SCATTERPF1QPS", "", "SCATTERPF1QPD"], ""], + "???", + "???", + ], + "???", + ], + "???", + ], + [ + ["SHA1NEXTE", "", "", ""], + ["", "", ["EXP2PS", "", "EXP2PD"], ["EXP223PS", "", "???"]], + "???", + "???", + ], + [ + ["SHA1MSG1", "", "", ""], + ["", "", "", ["LOG2PS", "", "???"]], + "???", + "???", + ], + [ + ["SHA1MSG2", "", "", ""], + ["", "", ["RCP28PS", "", "RCP28PD"], ["RCP23PS", "", "???"]], + "???", + "???", + ], + [ + ["SHA256RNDS2", "", "", ""], + ["", "", ["RCP28SS", "", "RCP28SD"], ["RSQRT23PS", "", "???"]], + "???", + "???", + ], + [ + ["SHA256MSG1", "", "", ""], + ["", "", ["RSQRT28PS", "", "RSQRT28PD"], ["ADDSETSPS", "", "???"]], + "???", + "???", + ], + [ + ["SHA256MSG2", "", "", ""], + ["", "", ["RSQRT28SS", "", "RSQRT28SD"], ["PADDSETSD", "", "???"]], + "???", + "???", + ], + "???", + "???", + [ + [ + ["", "", "", ["LOADUNPACKLD", "", "LOADUNPACKLQ"]], + ["", "", "", ["PACKSTORELD", "", "PACKSTORELQ"]], + "???", + "???", + ], + "???", + ], + [ + [ + ["", "", "", ["LOADUNPACKLPS", "", "LOADUNPACKLPD"]], + ["", "", "", ["PACKSTORELPS", "", "PACKSTORELPD"]], + "???", + "???", + ], + "???", + ], + "???", + "???", + [ + [ + ["", "", "", ["LOADUNPACKHD", "", "LOADUNPACKHQ"]], + ["", "", "", ["PACKSTOREHD", "", "PACKSTOREHQ"]], + "???", + "???", + ], + "???", + ], + [ + [ + ["", "", "", ["LOADUNPACKHPS", "", "LOADUNPACKHPD"]], + ["", "", "", ["PACKSTOREHPS", "", "PACKSTOREHPD"]], + "???", + "???", + ], + "???", + ], + "???", + "???", + "???", + "???", + "???", + ["???", ["AESIMC", "AESIMC", "", ""], "???", "???"], + ["???", ["AESENC", "AESENC", "", ""], "???", "???"], + ["???", ["AESENCLAST", "AESENCLAST", "", ""], "???", "???"], + ["???", ["AESDEC", "AESDEC", "", ""], "???", "???"], + ["???", ["AESDECLAST", "AESDECLAST", "", ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + [ + ["MOVBE", "", "", ""], + ["MOVBE", "", "", ""], + "???", + ["CRC32", "", "", ""], + ], + [ + ["MOVBE", "", "", ""], + ["MOVBE", "", "", ""], + "???", + ["CRC32", "", "", ""], + ], + ["???", ["", "ANDN", "", ""], "???", "???"], + [ + "???", + ["???", ["", "BLSR", "", ""], "???", "???"], + ["???", ["", "BLSMSK", "", ""], "???", "???"], + ["???", ["", "BLSI", "", ""], "???", "???"], + "???", + "???", + "???", + "???", + ], + "???", + [["", "BZHI", "", ""], "???", ["", "PEXT", "", ""], ["", "PDEP", "", ""]], + ["???", ["ADCX", "", "", ""], ["ADOX", "", "", ""], ["", "MULX", "", ""]], + [ + ["", "BEXTR", "", ""], + ["", "SHLX", "", ""], + ["", "SARX", "", ""], + ["", "SHRX", "", ""], + ], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------ Three Byte operations 0F38. Opcodes plus 768 goes to 767 used by escape codes "0F, 3A", Or set directly by adding map bits "11" because "11 00000000" bin = 768 plus opcode. ------------------------------------------------------------------------------------------------------------------------*/ - ["???",["","PERMQ","PERMQ",""],"???","???"], - ["???",["","PERMPD","PERMPD",""],"???","???"], - ["???",["",["PBLENDD","",""],"",""],"???","???"], - ["???",["","",["ALIGND","","ALIGNQ"],["ALIGND","","???"]],"???","???"], - ["???",["","PERMILPS",["PERMILPS","","???"],""],"???","???"], - ["???",["","PERMILPD","PERMILPD",""],"???","???"], - ["???",["","PERM2F128","",""],"???","???"], - ["???",["","","",["PERMF32X4","","???"]],"???","???"], - ["???",["ROUNDPS","ROUNDPS",["RNDSCALEPS","","???"],""],"???","???"], - ["???",["ROUNDPD","ROUNDPD","RNDSCALEPD",""],"???","???"], - ["???",["ROUNDSS","ROUNDSS",["RNDSCALESS","","???"],""],"???","???"], - ["???",["ROUNDSD","ROUNDSD","RNDSCALESD",""],"???","???"], - ["???",["BLENDPS","BLENDPS","",""],"???","???"], - ["???",["BLENDPD","BLENDPD","",""],"???","???"], - ["???",["PBLENDW","PBLENDW","",""],"???","???"], - [["PALIGNR","","",""],"PALIGNR","???","???"], - "???","???","???","???", - [["???","PEXTRB","???","???"],["???","PEXTRB","???","???"]], - [["???","PEXTRW","???","???"],["???","PEXTRW","???","???"]], - ["???",["PEXTRD","","PEXTRQ"],"???","???"], - ["???","EXTRACTPS","???","???"], - ["???",["","INSERTF128",["INSERTF32X4","","INSERTF64X2"],""],"???","???"], - ["???",["","EXTRACTF128",["EXTRACTF32X4","","EXTRACTF64X2"],""],"???","???"], - ["???",["","",["INSERTF32X8","","INSERTF64X4"],""],"???","???"], - ["???",["","",["EXTRACTF32X8","","EXTRACTF64X4"],""],"???","???"], - "???", - ["???",["","CVTPS2PH",["CVTPS2PH","","???"],""],"???","???"], - ["???",["","",["PCMP,UD,","","PCMP,UQ,"],["PCMP,UD,","","???"]],"???","???"], - ["???",["","",["PCM,PD,","","PCM,PQ,"],["PCM,PD,","","???"]],"???","???"], - ["???","PINSRB","???","???"], - ["???",["INSERTPS","","???"],"???","???"], - ["???",["",["PINSRD","","PINSRQ"],["PINSRD","","PINSRQ"],""],"???","???"], - ["???",["","",["SHUFF32X4","","SHUFF64X2"],""],"???","???"], - "???", - ["???",["","",["PTERNLOGD","","PTERNLOGQ"],""],"???","???"], - ["???",["","",["GETMANTPS","","GETMANTPD"],["GETMANTPS","","GETMANTPD"]],"???","???"], - ["???",["","",["GETMANTSS","","GETMANTSD"],""],"???","???"], - "???","???","???","???","???","???","???","???", - ["???",["",["KSHIFTRB","","KSHIFTRW"],"",""],"???","???"], - ["???",["",["KSHIFTRD","","KSHIFTRQ"],"",""],"???","???"], - ["???",["",["KSHIFTLB","","KSHIFTLW"],"",""],"???","???"], - ["???",["",["KSHIFTLD","","KSHIFTLQ"],"",""],"???","???"], - "???","???","???","???", - ["???",["","INSERTI128",["INSERTI32X4","","INSERTI64X2"],""],"???","???"], - ["???",["","EXTRACTI128",["EXTRACTI32X4","","EXTRACTI64X2"],""],"???","???"], - ["???",["","",["INSERTI32X8","","INSERTI64X4"],""],"???","???"], - ["???",["","",["EXTRACTI32X8","","EXTRACTI64X4"],""],"???","???"], - "???","???", - ["???",["","KEXTRACT",["PCMP,UB,","","PCMP,UW,"],""],"???","???"], - ["???",["","",["PCM,PB,","","PCM,PW,"],""],"???","???"], - ["???",["DPPS","DPPS","",""],"???","???"], - ["???",["DPPD","DPPD","",""],"???","???"], - ["???",["MPSADBW","MPSADBW",["DBPSADBW","","???"],""],"???","???"], - ["???",["","",["SHUFI32X4","","SHUFI64X2"],""],"???","???"], - ["???",["PCLMULQDQ","PCLMULQDQ","",""],"???","???"], - "???", - ["???",["","PERM2I128","",""],"???","???"], - "???", - ["???",["",["PERMIL2PS","","PERMIL2PS"],"",""],"???","???"], - ["???",["",["PERMIL2PD","","PERMIL2PD"],"",""],"???","???"], - ["???",["","BLENDVPS","",""],"???","???"], - ["???",["","BLENDVPD","",""],"???","???"], - ["???",["","PBLENDVB","",""],"???","???"], - "???","???","???", - ["???",["","",["RANGEPS","","RANGEPD"],""],"???","???"], - ["???",["","",["RANGESS","","RANGESD"],""],"???","???"], - ["???",["","","",["RNDFXPNTPS","","RNDFXPNTPD"]],"???","???"], - "???", - ["???",["","",["FIXUPIMMPS","","FIXUPIMMPD"],""],"???","???"], - ["???",["","",["FIXUPIMMSS","","FIXUPIMMSD"],""],"???","???"], - ["???",["","",["REDUCEPS","","REDUCEPD"],""],"???","???"], - ["???",["","",["REDUCESS","","REDUCESD"],""],"???","???"], - "???","???","???","???", - ["???",["",["FMADDSUBPS","","FMADDSUBPS"],"",""],"???","???"], - ["???",["",["FMADDSUBPD","","FMADDSUBPD"],"",""],"???","???"], - ["???",["",["FMSUBADDPS","","FMSUBADDPS"],"",""],"???","???"], - ["???",["",["FMSUBADDPD","","FMSUBADDPD"],"",""],"???","???"], - ["???",["PCMPESTRM","PCMPESTRM","",""],"???","???"], - ["???",["PCMPESTRI","PCMPESTRI","",""],"???","???"], - ["???",["PCMPISTRM","PCMPISTRM","",""],"???","???"], - ["???",["PCMPISTRI","PCMPISTRI","",""],"???","???"], - "???","???", - ["???",["","",["FPCLASSPS","","FPCLASSPD"],""],"???","???"], - ["???",["","",["FPCLASSSS","","FPCLASSSD"],""],"???","???"], - ["???",["",["FMADDPS","","FMADDPS"],"",""],"???","???"], - ["???",["",["FMADDPD","","FMADDPD"],"",""],"???","???"], - ["???",["",["FMADDSS","","FMADDSS"],"",""],"???","???"], - ["???",["",["FMADDSD","","FMADDSD"],"",""],"???","???"], - ["???",["",["FMSUBPS","","FMSUBPS"],"",""],"???","???"], - ["???",["",["FMSUBPD","","FMSUBPD"],"",""],"???","???"], - ["???",["",["FMSUBSS","","FMSUBSS"],"",""],"???","???"], - ["???",["",["FMSUBSD","","FMSUBSD"],"",""],"???","???"], - "???","???","???","???","???","???","???","???", - ["???",["",["FNMADDPS","","FNMADDPS"],"",""],"???","???"], - ["???",["",["FNMADDPD","","FNMADDPD"],"",""],"???","???"], - ["???",["",["FNMADDSS","","FNMADDSS"],"",""],"???","???"], - ["???",["",["FNMADDSD","","FNMADDSD"],"",""],"???","???"], - ["???",["",["FNMSUBPS","","FNMSUBPS"],"",""],"???","???"], - ["???",["",["FNMSUBPD","","FNMSUBPD"],"",""],"???","???"], - ["???",["",["FNMSUBSS","","FNMSUBSS"],"",""],"???","???"], - ["???",["",["FNMSUBSD","","FNMSUBSD"],"",""],"???","???"], - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???", - [["","","","CVTFXPNTUDQ2PS"],["","","",["CVTFXPNTPS2UDQ","","???"]],"???",["","","","CVTFXPNTPD2UDQ"]], - [["","","","CVTFXPNTDQ2PS"],["","","",["CVTFXPNTPS2DQ","","???"]],"???","???"], - "SHA1RNDS4", - "???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - ["???",["AESKEYGENASSIST","AESKEYGENASSIST","",""],"???","???"], - "???","???","???","???","???","???", - ["???","???","???",["","","","CVTFXPNTPD2DQ"]], - "???","???","???","???","???","???","???","???","???", - ["???","???","???",["","RORX","",""]], - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------ + ["???", ["", "PERMQ", "PERMQ", ""], "???", "???"], + ["???", ["", "PERMPD", "PERMPD", ""], "???", "???"], + ["???", ["", ["PBLENDD", "", ""], "", ""], "???", "???"], + [ + "???", + ["", "", ["ALIGND", "", "ALIGNQ"], ["ALIGND", "", "???"]], + "???", + "???", + ], + ["???", ["", "PERMILPS", ["PERMILPS", "", "???"], ""], "???", "???"], + ["???", ["", "PERMILPD", "PERMILPD", ""], "???", "???"], + ["???", ["", "PERM2F128", "", ""], "???", "???"], + ["???", ["", "", "", ["PERMF32X4", "", "???"]], "???", "???"], + [ + "???", + ["ROUNDPS", "ROUNDPS", ["RNDSCALEPS", "", "???"], ""], + "???", + "???", + ], + ["???", ["ROUNDPD", "ROUNDPD", "RNDSCALEPD", ""], "???", "???"], + [ + "???", + ["ROUNDSS", "ROUNDSS", ["RNDSCALESS", "", "???"], ""], + "???", + "???", + ], + ["???", ["ROUNDSD", "ROUNDSD", "RNDSCALESD", ""], "???", "???"], + ["???", ["BLENDPS", "BLENDPS", "", ""], "???", "???"], + ["???", ["BLENDPD", "BLENDPD", "", ""], "???", "???"], + ["???", ["PBLENDW", "PBLENDW", "", ""], "???", "???"], + [["PALIGNR", "", "", ""], "PALIGNR", "???", "???"], + "???", + "???", + "???", + "???", + [ + ["???", "PEXTRB", "???", "???"], + ["???", "PEXTRB", "???", "???"], + ], + [ + ["???", "PEXTRW", "???", "???"], + ["???", "PEXTRW", "???", "???"], + ], + ["???", ["PEXTRD", "", "PEXTRQ"], "???", "???"], + ["???", "EXTRACTPS", "???", "???"], + [ + "???", + ["", "INSERTF128", ["INSERTF32X4", "", "INSERTF64X2"], ""], + "???", + "???", + ], + [ + "???", + ["", "EXTRACTF128", ["EXTRACTF32X4", "", "EXTRACTF64X2"], ""], + "???", + "???", + ], + ["???", ["", "", ["INSERTF32X8", "", "INSERTF64X4"], ""], "???", "???"], + ["???", ["", "", ["EXTRACTF32X8", "", "EXTRACTF64X4"], ""], "???", "???"], + "???", + ["???", ["", "CVTPS2PH", ["CVTPS2PH", "", "???"], ""], "???", "???"], + [ + "???", + ["", "", ["PCMP,UD,", "", "PCMP,UQ,"], ["PCMP,UD,", "", "???"]], + "???", + "???", + ], + [ + "???", + ["", "", ["PCM,PD,", "", "PCM,PQ,"], ["PCM,PD,", "", "???"]], + "???", + "???", + ], + ["???", "PINSRB", "???", "???"], + ["???", ["INSERTPS", "", "???"], "???", "???"], + [ + "???", + ["", ["PINSRD", "", "PINSRQ"], ["PINSRD", "", "PINSRQ"], ""], + "???", + "???", + ], + ["???", ["", "", ["SHUFF32X4", "", "SHUFF64X2"], ""], "???", "???"], + "???", + ["???", ["", "", ["PTERNLOGD", "", "PTERNLOGQ"], ""], "???", "???"], + [ + "???", + [ + "", + "", + ["GETMANTPS", "", "GETMANTPD"], + ["GETMANTPS", "", "GETMANTPD"], + ], + "???", + "???", + ], + ["???", ["", "", ["GETMANTSS", "", "GETMANTSD"], ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["???", ["", ["KSHIFTRB", "", "KSHIFTRW"], "", ""], "???", "???"], + ["???", ["", ["KSHIFTRD", "", "KSHIFTRQ"], "", ""], "???", "???"], + ["???", ["", ["KSHIFTLB", "", "KSHIFTLW"], "", ""], "???", "???"], + ["???", ["", ["KSHIFTLD", "", "KSHIFTLQ"], "", ""], "???", "???"], + "???", + "???", + "???", + "???", + [ + "???", + ["", "INSERTI128", ["INSERTI32X4", "", "INSERTI64X2"], ""], + "???", + "???", + ], + [ + "???", + ["", "EXTRACTI128", ["EXTRACTI32X4", "", "EXTRACTI64X2"], ""], + "???", + "???", + ], + ["???", ["", "", ["INSERTI32X8", "", "INSERTI64X4"], ""], "???", "???"], + ["???", ["", "", ["EXTRACTI32X8", "", "EXTRACTI64X4"], ""], "???", "???"], + "???", + "???", + ["???", ["", "KEXTRACT", ["PCMP,UB,", "", "PCMP,UW,"], ""], "???", "???"], + ["???", ["", "", ["PCM,PB,", "", "PCM,PW,"], ""], "???", "???"], + ["???", ["DPPS", "DPPS", "", ""], "???", "???"], + ["???", ["DPPD", "DPPD", "", ""], "???", "???"], + ["???", ["MPSADBW", "MPSADBW", ["DBPSADBW", "", "???"], ""], "???", "???"], + ["???", ["", "", ["SHUFI32X4", "", "SHUFI64X2"], ""], "???", "???"], + ["???", ["PCLMULQDQ", "PCLMULQDQ", "", ""], "???", "???"], + "???", + ["???", ["", "PERM2I128", "", ""], "???", "???"], + "???", + ["???", ["", ["PERMIL2PS", "", "PERMIL2PS"], "", ""], "???", "???"], + ["???", ["", ["PERMIL2PD", "", "PERMIL2PD"], "", ""], "???", "???"], + ["???", ["", "BLENDVPS", "", ""], "???", "???"], + ["???", ["", "BLENDVPD", "", ""], "???", "???"], + ["???", ["", "PBLENDVB", "", ""], "???", "???"], + "???", + "???", + "???", + ["???", ["", "", ["RANGEPS", "", "RANGEPD"], ""], "???", "???"], + ["???", ["", "", ["RANGESS", "", "RANGESD"], ""], "???", "???"], + ["???", ["", "", "", ["RNDFXPNTPS", "", "RNDFXPNTPD"]], "???", "???"], + "???", + ["???", ["", "", ["FIXUPIMMPS", "", "FIXUPIMMPD"], ""], "???", "???"], + ["???", ["", "", ["FIXUPIMMSS", "", "FIXUPIMMSD"], ""], "???", "???"], + ["???", ["", "", ["REDUCEPS", "", "REDUCEPD"], ""], "???", "???"], + ["???", ["", "", ["REDUCESS", "", "REDUCESD"], ""], "???", "???"], + "???", + "???", + "???", + "???", + ["???", ["", ["FMADDSUBPS", "", "FMADDSUBPS"], "", ""], "???", "???"], + ["???", ["", ["FMADDSUBPD", "", "FMADDSUBPD"], "", ""], "???", "???"], + ["???", ["", ["FMSUBADDPS", "", "FMSUBADDPS"], "", ""], "???", "???"], + ["???", ["", ["FMSUBADDPD", "", "FMSUBADDPD"], "", ""], "???", "???"], + ["???", ["PCMPESTRM", "PCMPESTRM", "", ""], "???", "???"], + ["???", ["PCMPESTRI", "PCMPESTRI", "", ""], "???", "???"], + ["???", ["PCMPISTRM", "PCMPISTRM", "", ""], "???", "???"], + ["???", ["PCMPISTRI", "PCMPISTRI", "", ""], "???", "???"], + "???", + "???", + ["???", ["", "", ["FPCLASSPS", "", "FPCLASSPD"], ""], "???", "???"], + ["???", ["", "", ["FPCLASSSS", "", "FPCLASSSD"], ""], "???", "???"], + ["???", ["", ["FMADDPS", "", "FMADDPS"], "", ""], "???", "???"], + ["???", ["", ["FMADDPD", "", "FMADDPD"], "", ""], "???", "???"], + ["???", ["", ["FMADDSS", "", "FMADDSS"], "", ""], "???", "???"], + ["???", ["", ["FMADDSD", "", "FMADDSD"], "", ""], "???", "???"], + ["???", ["", ["FMSUBPS", "", "FMSUBPS"], "", ""], "???", "???"], + ["???", ["", ["FMSUBPD", "", "FMSUBPD"], "", ""], "???", "???"], + ["???", ["", ["FMSUBSS", "", "FMSUBSS"], "", ""], "???", "???"], + ["???", ["", ["FMSUBSD", "", "FMSUBSD"], "", ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["???", ["", ["FNMADDPS", "", "FNMADDPS"], "", ""], "???", "???"], + ["???", ["", ["FNMADDPD", "", "FNMADDPD"], "", ""], "???", "???"], + ["???", ["", ["FNMADDSS", "", "FNMADDSS"], "", ""], "???", "???"], + ["???", ["", ["FNMADDSD", "", "FNMADDSD"], "", ""], "???", "???"], + ["???", ["", ["FNMSUBPS", "", "FNMSUBPS"], "", ""], "???", "???"], + ["???", ["", ["FNMSUBPD", "", "FNMSUBPD"], "", ""], "???", "???"], + ["???", ["", ["FNMSUBSS", "", "FNMSUBSS"], "", ""], "???", "???"], + ["???", ["", ["FNMSUBSD", "", "FNMSUBSD"], "", ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + [ + ["", "", "", "CVTFXPNTUDQ2PS"], + ["", "", "", ["CVTFXPNTPS2UDQ", "", "???"]], + "???", + ["", "", "", "CVTFXPNTPD2UDQ"], + ], + [ + ["", "", "", "CVTFXPNTDQ2PS"], + ["", "", "", ["CVTFXPNTPS2DQ", "", "???"]], + "???", + "???", + ], + "SHA1RNDS4", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["???", ["AESKEYGENASSIST", "AESKEYGENASSIST", "", ""], "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + ["???", "???", "???", ["", "", "", "CVTFXPNTPD2DQ"]], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["???", "???", "???", ["", "RORX", "", ""]], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP 8. ------------------------------------------------------------------------------------------------------------------------*/ - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VPMACSSWW","VPMACSSWD","VPMACSSDQL","???","???","???","???","???","???", - "VPMACSSDD","VPMACSSDQH","???","???","???","???","???","VPMACSWW","VPMACSWD","VPMACSDQL", - "???","???","???","???","???","???","VPMACSDD","VPMACSDQH", - "???","???",["VPCMOV","","VPCMOV"],["VPPERM","","VPPERM"],"???","???","VPMADCSSWD", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VPMADCSWD","???","???","???","???","???","???","???","???","???", - "VPROTB","VPROTW","VPROTD","VPROTQ","???","???","???","???","???","???","???","???", - "VPCOM,B,","VPCOM,W,","VPCOM,D,","VPCOM,Q,","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VPCOM,UB,","VPCOM,UW,","VPCOM,UD,","VPCOM,UQ,", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------ + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPMACSSWW", + "VPMACSSWD", + "VPMACSSDQL", + "???", + "???", + "???", + "???", + "???", + "???", + "VPMACSSDD", + "VPMACSSDQH", + "???", + "???", + "???", + "???", + "???", + "VPMACSWW", + "VPMACSWD", + "VPMACSDQL", + "???", + "???", + "???", + "???", + "???", + "???", + "VPMACSDD", + "VPMACSDQH", + "???", + "???", + ["VPCMOV", "", "VPCMOV"], + ["VPPERM", "", "VPPERM"], + "???", + "???", + "VPMADCSSWD", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPMADCSWD", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPROTB", + "VPROTW", + "VPROTD", + "VPROTQ", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPCOM,B,", + "VPCOM,W,", + "VPCOM,D,", + "VPCOM,Q,", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPCOM,UB,", + "VPCOM,UW,", + "VPCOM,UD,", + "VPCOM,UQ,", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP 9. ------------------------------------------------------------------------------------------------------------------------*/ - "???", - ["???","BLCFILL","BLSFILL","BLCS","TZMSK","BLCIC","BLSIC","T1MSKC"],["???","BLCMSK","???","???","???","???","BLCI","???"], - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - ["???",["LLWPCB","SLWPCB","???","???","???","???","???","???"]], - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VFRCZPS","VFRCZPD","VFRCZSS","VFRCZSD","???","???","???","???","???","???","???","???","???","???","???","???", - ["VPROTB","","VPROTB"],["VPROTW","","VPROTW"],["VPROTD","","VPROTD"],["VPROTQ","","VPROTQ"], - ["VPSHLB","","VPSHLB"],["VPSHLW","","VPSHLW"],["VPSHLD","","VPSHLD"],["VPSHLQ","","VPSHLQ"], - ["VPSHAB","","VPSHAB"],["VPSHAW","","VPSHAW"],["VPSHAD","","VPSHAD"],["VPSHAQ","","VPSHAQ"], - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VPHADDBW","VPHADDBD","VPHADDBQ","???","???","VPHADDWD","VPHADDWQ","???","???","???","VPHADDDQ","???","???","???","???","???", - "VPHADDUBWD","VPHADDUBD","VPHADDUBQ","???","???","VPHADDUWD","VPHADDUWQ","???","???","???","VPHADDUDQ","???","???","???","???","???", - "VPHSUBBW","VPHSUBWD","VPHSUBDQ","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------ + "???", + ["???", "BLCFILL", "BLSFILL", "BLCS", "TZMSK", "BLCIC", "BLSIC", "T1MSKC"], + ["???", "BLCMSK", "???", "???", "???", "???", "BLCI", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["???", ["LLWPCB", "SLWPCB", "???", "???", "???", "???", "???", "???"]], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VFRCZPS", + "VFRCZPD", + "VFRCZSS", + "VFRCZSD", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["VPROTB", "", "VPROTB"], + ["VPROTW", "", "VPROTW"], + ["VPROTD", "", "VPROTD"], + ["VPROTQ", "", "VPROTQ"], + ["VPSHLB", "", "VPSHLB"], + ["VPSHLW", "", "VPSHLW"], + ["VPSHLD", "", "VPSHLD"], + ["VPSHLQ", "", "VPSHLQ"], + ["VPSHAB", "", "VPSHAB"], + ["VPSHAW", "", "VPSHAW"], + ["VPSHAD", "", "VPSHAD"], + ["VPSHAQ", "", "VPSHAQ"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VPHADDBW", + "VPHADDBD", + "VPHADDBQ", + "???", + "???", + "VPHADDWD", + "VPHADDWQ", + "???", + "???", + "???", + "VPHADDDQ", + "???", + "???", + "???", + "???", + "???", + "VPHADDUBWD", + "VPHADDUBD", + "VPHADDUBQ", + "???", + "???", + "VPHADDUWD", + "VPHADDUWQ", + "???", + "???", + "???", + "VPHADDUDQ", + "???", + "???", + "???", + "???", + "???", + "VPHSUBBW", + "VPHSUBWD", + "VPHSUBDQ", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP A. ------------------------------------------------------------------------------------------------------------------------*/ - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "BEXTR","???",["LWPINS","LWPVAL","???","???","???","???","???","???"], - "???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------- + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "BEXTR", + "???", + ["LWPINS", "LWPVAL", "???", "???", "???", "???", "???", "???"], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------- L1OM Vector. -------------------------------------------------------------------------------------------------------------------------*/ - "???","???","???","???","DELAY","???","???","???","???","???","???","???","???","???","???","???", - [["VLOADD","VLOADQ","",""],"???"],"???", - [["VLOADUNPACKLD","VLOADUNPACKLQ","",""],"???"], - [["VLOADUNPACKHD","VLOADUNPACKHQ","",""],"???"], - [["VSTORED","VSTOREQ","",""],"???"],"???", - [["VPACKSTORELD","VPACKSTORELQ","",""],"???"], - [["VPACKSTOREHD","VPACKSTOREHQ","",""],"???"], - ["VGATHERD","???"],["VGATHERPFD","???"],"???",["VGATHERPF2D","???"], - ["VSCATTERD","???"],["VSCATTERPFD","???"],"???",["VSCATTERPF2D","???"], - ["VCMP,PS,","VCMP,PD,","",""],"VCMP,PI,","VCMP,PU,","???", - ["VCMP,PS,","VCMP,PD,","",""],"VCMP,PI,","VCMP,PU,","???", - "???","???","???","???","???","???","???","???", - "VTESTPI","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - ["VADDPS","VADDPD","",""],"VADDPI","???","VADDSETCPI","???","VADCPI","VADDSETSPS","VADDSETSPI", - ["VADDNPS","VADDNPD","",""],"???","???","???","???","???","???","???", - ["VSUBPS","VSUBPD","",""],"VSUBPI","???","VSUBSETBPI","???","VSBBPI","???","???", - ["VSUBRPS","VSUBRPD","",""],"VSUBRPI","???","VSUBRSETBPI","???","VSBBRPI","???","???", - ["VMADD231PS","VMADD231PD","",""],"VMADD231PI", - ["VMADD213PS","VMADD213PD","",""],"???", - ["VMADD132PS","VMADD132PD","",""],"???", - "VMADD233PS","VMADD233PI", - ["VMSUB231PS","VMSUB231PD","",""],"???", - ["VMSUB213PS","VMSUB213PD","",""],"???", - ["VMSUB132PS","VMSUB132PD","",""],"???","???","???", - ["VMADDN231PS","VMADDN231PD","",""],"???", - ["VMADDN213PS","VMADDN213PD","",""],"???", - ["VMADDN132PS","VMADDN132PD","",""],"???","???","???", - ["VMSUBR231PS","VMSUBR231PD","",""],"???", - ["VMSUBR213PS","VMSUBR213PD","",""],"???", - ["VMSUBR132PS","VMSUBR132PD","",""],"???", - ["VMSUBR23C1PS","VMSUBR23C1PD","",""],"???", - ["VMULPS","VMULPD","",""],"VMULHPI","VMULHPU","VMULLPI","???","???","VCLAMPZPS","VCLAMPZPI", - ["VMAXPS","VMAXPD","",""],"VMAXPI","VMAXPU","???", - ["VMINPS","VMINPD","",""],"VMINPI","VMINPU","???", - ["???","VCVT,PD2PS,","",""],["VCVTPS2PI","VCVT,PD2PI,","",""],["VCVTPS2PU","VCVT,PD2PU,","",""],"???", - ["???","VCVT,PS2PD,","",""],["VCVTPI2PS","VCVT,PI2PD,","",""],["VCVTPU2PS","VCVT,PU2PD,","",""],"???", - "VROUNDPS","???","VCVTINSPS2U10","VCVTINSPS2F11","???","VCVTPS2SRGB8","VMAXABSPS","???", - "VSLLPI","VSRAPI","VSRLPI","???", - ["VANDNPI","VANDNPQ","",""],["VANDPI","VANDPQ","",""], - ["VORPI","VORPQ","",""],["VXORPI","VXORPQ","",""], - "VBINTINTERLEAVE11PI","VBINTINTERLEAVE21PI","???","???","???","???","???","???", - "VEXP2LUTPS","VLOG2LUTPS","VRSQRTLUTPS","???","VGETEXPPS","???","???","???", - "VSCALEPS","???","???","???","???","???","???","???", - "VRCPRESPS","???","VRCPREFINEPS","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "???","???","???","???","???","???","???","???","???","???","???","???","???","???","???","???", - "VFIXUPPS","VSHUF128X32","VINSERTFIELDPI","VROTATEFIELDPI","???","???","???","???", - "???","???","???","???","???","???","???","???", - /*------------------------------------------------------------------------------------------------------------------------- + "???", + "???", + "???", + "???", + "DELAY", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + [["VLOADD", "VLOADQ", "", ""], "???"], + "???", + [["VLOADUNPACKLD", "VLOADUNPACKLQ", "", ""], "???"], + [["VLOADUNPACKHD", "VLOADUNPACKHQ", "", ""], "???"], + [["VSTORED", "VSTOREQ", "", ""], "???"], + "???", + [["VPACKSTORELD", "VPACKSTORELQ", "", ""], "???"], + [["VPACKSTOREHD", "VPACKSTOREHQ", "", ""], "???"], + ["VGATHERD", "???"], + ["VGATHERPFD", "???"], + "???", + ["VGATHERPF2D", "???"], + ["VSCATTERD", "???"], + ["VSCATTERPFD", "???"], + "???", + ["VSCATTERPF2D", "???"], + ["VCMP,PS,", "VCMP,PD,", "", ""], + "VCMP,PI,", + "VCMP,PU,", + "???", + ["VCMP,PS,", "VCMP,PD,", "", ""], + "VCMP,PI,", + "VCMP,PU,", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VTESTPI", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["VADDPS", "VADDPD", "", ""], + "VADDPI", + "???", + "VADDSETCPI", + "???", + "VADCPI", + "VADDSETSPS", + "VADDSETSPI", + ["VADDNPS", "VADDNPD", "", ""], + "???", + "???", + "???", + "???", + "???", + "???", + "???", + ["VSUBPS", "VSUBPD", "", ""], + "VSUBPI", + "???", + "VSUBSETBPI", + "???", + "VSBBPI", + "???", + "???", + ["VSUBRPS", "VSUBRPD", "", ""], + "VSUBRPI", + "???", + "VSUBRSETBPI", + "???", + "VSBBRPI", + "???", + "???", + ["VMADD231PS", "VMADD231PD", "", ""], + "VMADD231PI", + ["VMADD213PS", "VMADD213PD", "", ""], + "???", + ["VMADD132PS", "VMADD132PD", "", ""], + "???", + "VMADD233PS", + "VMADD233PI", + ["VMSUB231PS", "VMSUB231PD", "", ""], + "???", + ["VMSUB213PS", "VMSUB213PD", "", ""], + "???", + ["VMSUB132PS", "VMSUB132PD", "", ""], + "???", + "???", + "???", + ["VMADDN231PS", "VMADDN231PD", "", ""], + "???", + ["VMADDN213PS", "VMADDN213PD", "", ""], + "???", + ["VMADDN132PS", "VMADDN132PD", "", ""], + "???", + "???", + "???", + ["VMSUBR231PS", "VMSUBR231PD", "", ""], + "???", + ["VMSUBR213PS", "VMSUBR213PD", "", ""], + "???", + ["VMSUBR132PS", "VMSUBR132PD", "", ""], + "???", + ["VMSUBR23C1PS", "VMSUBR23C1PD", "", ""], + "???", + ["VMULPS", "VMULPD", "", ""], + "VMULHPI", + "VMULHPU", + "VMULLPI", + "???", + "???", + "VCLAMPZPS", + "VCLAMPZPI", + ["VMAXPS", "VMAXPD", "", ""], + "VMAXPI", + "VMAXPU", + "???", + ["VMINPS", "VMINPD", "", ""], + "VMINPI", + "VMINPU", + "???", + ["???", "VCVT,PD2PS,", "", ""], + ["VCVTPS2PI", "VCVT,PD2PI,", "", ""], + ["VCVTPS2PU", "VCVT,PD2PU,", "", ""], + "???", + ["???", "VCVT,PS2PD,", "", ""], + ["VCVTPI2PS", "VCVT,PI2PD,", "", ""], + ["VCVTPU2PS", "VCVT,PU2PD,", "", ""], + "???", + "VROUNDPS", + "???", + "VCVTINSPS2U10", + "VCVTINSPS2F11", + "???", + "VCVTPS2SRGB8", + "VMAXABSPS", + "???", + "VSLLPI", + "VSRAPI", + "VSRLPI", + "???", + ["VANDNPI", "VANDNPQ", "", ""], + ["VANDPI", "VANDPQ", "", ""], + ["VORPI", "VORPQ", "", ""], + ["VXORPI", "VXORPQ", "", ""], + "VBINTINTERLEAVE11PI", + "VBINTINTERLEAVE21PI", + "???", + "???", + "???", + "???", + "???", + "???", + "VEXP2LUTPS", + "VLOG2LUTPS", + "VRSQRTLUTPS", + "???", + "VGETEXPPS", + "???", + "???", + "???", + "VSCALEPS", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VRCPRESPS", + "???", + "VRCPREFINEPS", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "VFIXUPPS", + "VSHUF128X32", + "VINSERTFIELDPI", + "VROTATEFIELDPI", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + /*------------------------------------------------------------------------------------------------------------------------- L1OM Mask, Mem, and bit opcodes. -------------------------------------------------------------------------------------------------------------------------*/ - ["???","BSFI"],["???","BSFI"],["???","BSFI"],["???","BSFI"], - ["???","BSRI"],["???","BSRI"],["???","BSRI"],["???","BSRI"], - ["???","BSFF"],["???","BSFF"],["???","BSFF"],["???","BSFF"], - ["???","BSRF"],["???","BSRF"],["???","BSRF"],["???","BSRF"], - ["???","BITINTERLEAVE11"],["???","BITINTERLEAVE11"],["???","BITINTERLEAVE11"],["???","BITINTERLEAVE11"], - ["???","BITINTERLEAVE21"],["???","BITINTERLEAVE21"],["???","BITINTERLEAVE21"],["???","BITINTERLEAVE21"], - ["???","INSERTFIELD"],["???","INSERTFIELD"],["???","INSERTFIELD"],["???","INSERTFIELD"], - ["???","ROTATEFIELD"],["???","ROTATEFIELD"],["???","ROTATEFIELD"],["???","ROTATEFIELD"], - ["???","COUNTBITS"],["???","COUNTBITS"],["???","COUNTBITS"],["???","COUNTBITS"], - ["???","QUADMASK16"],["???","QUADMASK16"],["???","QUADMASK16"],["???","QUADMASK16"], - "???","???","???","???", - "VKMOVLHB", - [["CLEVICT1","CLEVICT2","LDVXCSR","STVXCSR","???","???","???","???"],"???"], - [["VPREFETCH1","VPREFETCH2","???","???","???","???","???","???"],"???"], - [["VPREFETCH1","VPREFETCH2","???","???","???","???","???","???"],"???"], - "VKMOV","VKMOV","VKMOV","VKMOV", - "VKNOT","VKANDNR","VKANDN","VKAND", - "VKXNOR","VKXOR","VKORTEST","VKOR", - "???","VKSWAPB", - ["???",["DELAY","SPFLT","???","???","???","???","???","???"]], - ["???",["DELAY","SPFLT","???","???","???","???","???","???"]] + ["???", "BSFI"], + ["???", "BSFI"], + ["???", "BSFI"], + ["???", "BSFI"], + ["???", "BSRI"], + ["???", "BSRI"], + ["???", "BSRI"], + ["???", "BSRI"], + ["???", "BSFF"], + ["???", "BSFF"], + ["???", "BSFF"], + ["???", "BSFF"], + ["???", "BSRF"], + ["???", "BSRF"], + ["???", "BSRF"], + ["???", "BSRF"], + ["???", "BITINTERLEAVE11"], + ["???", "BITINTERLEAVE11"], + ["???", "BITINTERLEAVE11"], + ["???", "BITINTERLEAVE11"], + ["???", "BITINTERLEAVE21"], + ["???", "BITINTERLEAVE21"], + ["???", "BITINTERLEAVE21"], + ["???", "BITINTERLEAVE21"], + ["???", "INSERTFIELD"], + ["???", "INSERTFIELD"], + ["???", "INSERTFIELD"], + ["???", "INSERTFIELD"], + ["???", "ROTATEFIELD"], + ["???", "ROTATEFIELD"], + ["???", "ROTATEFIELD"], + ["???", "ROTATEFIELD"], + ["???", "COUNTBITS"], + ["???", "COUNTBITS"], + ["???", "COUNTBITS"], + ["???", "COUNTBITS"], + ["???", "QUADMASK16"], + ["???", "QUADMASK16"], + ["???", "QUADMASK16"], + ["???", "QUADMASK16"], + "???", + "???", + "???", + "???", + "VKMOVLHB", + [ + [ + "CLEVICT1", + "CLEVICT2", + "LDVXCSR", + "STVXCSR", + "???", + "???", + "???", + "???", + ], + "???", + ], + [ + ["VPREFETCH1", "VPREFETCH2", "???", "???", "???", "???", "???", "???"], + "???", + ], + [ + ["VPREFETCH1", "VPREFETCH2", "???", "???", "???", "???", "???", "???"], + "???", + ], + "VKMOV", + "VKMOV", + "VKMOV", + "VKMOV", + "VKNOT", + "VKANDNR", + "VKANDN", + "VKAND", + "VKXNOR", + "VKXOR", + "VKORTEST", + "VKOR", + "???", + "VKSWAPB", + ["???", ["DELAY", "SPFLT", "???", "???", "???", "???", "???", "???"]], + ["???", ["DELAY", "SPFLT", "???", "???", "???", "???", "???", "???"]], ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -1334,1123 +3843,3975 @@ Used by function ^DecodeOpcode()^ after ^DecodePrefixAdjustments()^. -------------------------------------------------------------------------------------------------------------------------*/ const Operands = [ - //------------------------------------------------------------------------------------------------------------------------ - //First Byte operations. - //------------------------------------------------------------------------------------------------------------------------ - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A000003","070E0B0E0003","0A0006000003","0B0E070E0003","16000C000003","170E0DE60003","","", - "06000A00","070E0B0E","0A000600","0B0E070E","16000C00","170E0DE6","","", - "03060003","03060003","03060003","03060003","03060003","03060003","03060003","03060003", - "03060003","03060003","03060003","03060003","03060003","03060003","03060003","03060003", - "030A","030A","030A","030A","030A","030A","030A","030A", - "030A","030A","030A","030A","030A","030A","030A","030A", - ["","",""],["","",""], - ["0A020606","0A010604",""], - "0B0E0704", - "","","","", - "0DE6","0B0E070E0DE6", - "0DA1","0B0E070E0DE1", - "22001A01","230E1A01","1A012000","1A01210E", - "10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C", - "10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C","10000002000C", - ["06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C00"], - ["070E0DE60003","070E0DE60003","070E0DE60003","070E0DE60003","070E0DE60003","070E0DE60003","070E0DE60003","070E0DE6"], - ["06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C000003","06000C00"], - ["070E0DE10003","070E0DE10003","070E0DE10003","070E0DE10003","070E0DE10003","070E0DE10003","070E0DE10003","070E0DE1"], - "06000A00","070E0B0E", - "0A0006000003","0B0E070E0003", - "06000A000001","070E0B0E0001", - "0A0006000001","0B0E070E0001", - "06020A080001", - ["0B0E0601",""], - "0A0806020001", - ["070A","","","","","","",""], - [["","","",""],["","","",""],["","","",""],["","","",""]], - "170E030E0003","170E030E0003","170E030E0003","170E030E0003","170E030E0003","170E030E0003","170E030E0003", - ["","",""],["","",""], - "0D060C01", //CALL Ap (w:z). - "", - ["","",""],["","",""], - "","", - "160004000001","170E050E0001", - "040016000001","050E170E0001", - "22002000","230E210E", - "22002000","230E210E", - "16000C00","170E0DE6", - "22001600","230E170E","16002000","170E210E","16002200","170E230E", - "02000C000001","02000C000001","02000C000001","02000C000001","02000C000001","02000C000001","02000C000001","02000C000001", - "030E0D0E0001","030E0D0E0001","030E0D0E0001","030E0D0E0001","030E0D0E0001","030E0D0E0001","030E0D0E0001","030E0D0E0001", - ["06000C00","06000C00","06000C00","06000C00","06000C00","06000C00","06000C00","06000C00"], - ["070E0C00","070E0C00","070E0C00","070E0C00","070E0C00","070E0C00","070E0C00","070E0C00"], - "0C010008","0008", - "0B060906","0B060906", - [ - "06000C000001","","","","","","", - ["0C00","0C00","0C00","0C00","0C00","0C00","0C00","0C00"] - ], - [ - "070E0D060001","","","","","","", - ["1002","1002","1002","1002","1002","1002","1002","1002"] - ], - "0C010C00","", - "0C01","","2C00", - "0C00","", - ["","",""], - ["06002A00","06002A00","06002A00","06002A00","06002A00","06002A00","06002A00","06002A00"], - ["070E2A00","070E2A00","070E2A00","070E2A00","070E2A00","070E2A00","070E2A00","070E2A00"], - ["06001800","06001800","06001800","06001800","06001800","06001800","06001800","06001800"], - ["070E1800","070E1800","070E1800","070E1800","070E1800","070E1800","070E1800","070E1800"], - "0C00","0C00","", - "1E00", - /*------------------------------------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------------------------------------ + //First Byte operations. + //------------------------------------------------------------------------------------------------------------------------ + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A000003", + "070E0B0E0003", + "0A0006000003", + "0B0E070E0003", + "16000C000003", + "170E0DE60003", + "", + "", + "06000A00", + "070E0B0E", + "0A000600", + "0B0E070E", + "16000C00", + "170E0DE6", + "", + "", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "03060003", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + "030A", + ["", "", ""], + ["", "", ""], + ["0A020606", "0A010604", ""], + "0B0E0704", + "", + "", + "", + "", + "0DE6", + "0B0E070E0DE6", + "0DA1", + "0B0E070E0DE1", + "22001A01", + "230E1A01", + "1A012000", + "1A01210E", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + "10000002000C", + [ + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C00", + ], + [ + "070E0DE60003", + "070E0DE60003", + "070E0DE60003", + "070E0DE60003", + "070E0DE60003", + "070E0DE60003", + "070E0DE60003", + "070E0DE6", + ], + [ + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C000003", + "06000C00", + ], + [ + "070E0DE10003", + "070E0DE10003", + "070E0DE10003", + "070E0DE10003", + "070E0DE10003", + "070E0DE10003", + "070E0DE10003", + "070E0DE1", + ], + "06000A00", + "070E0B0E", + "0A0006000003", + "0B0E070E0003", + "06000A000001", + "070E0B0E0001", + "0A0006000001", + "0B0E070E0001", + "06020A080001", + ["0B0E0601", ""], + "0A0806020001", + ["070A", "", "", "", "", "", "", ""], + [ + ["", "", "", ""], + ["", "", "", ""], + ["", "", "", ""], + ["", "", "", ""], + ], + "170E030E0003", + "170E030E0003", + "170E030E0003", + "170E030E0003", + "170E030E0003", + "170E030E0003", + "170E030E0003", + ["", "", ""], + ["", "", ""], + "0D060C01", //CALL Ap (w:z). + "", + ["", "", ""], + ["", "", ""], + "", + "", + "160004000001", + "170E050E0001", + "040016000001", + "050E170E0001", + "22002000", + "230E210E", + "22002000", + "230E210E", + "16000C00", + "170E0DE6", + "22001600", + "230E170E", + "16002000", + "170E210E", + "16002200", + "170E230E", + "02000C000001", + "02000C000001", + "02000C000001", + "02000C000001", + "02000C000001", + "02000C000001", + "02000C000001", + "02000C000001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + "030E0D0E0001", + [ + "06000C00", + "06000C00", + "06000C00", + "06000C00", + "06000C00", + "06000C00", + "06000C00", + "06000C00", + ], + [ + "070E0C00", + "070E0C00", + "070E0C00", + "070E0C00", + "070E0C00", + "070E0C00", + "070E0C00", + "070E0C00", + ], + "0C010008", + "0008", + "0B060906", + "0B060906", + [ + "06000C000001", + "", + "", + "", + "", + "", + "", + ["0C00", "0C00", "0C00", "0C00", "0C00", "0C00", "0C00", "0C00"], + ], + [ + "070E0D060001", + "", + "", + "", + "", + "", + "", + ["1002", "1002", "1002", "1002", "1002", "1002", "1002", "1002"], + ], + "0C010C00", + "", + "0C01", + "", + "2C00", + "0C00", + "", + ["", "", ""], + [ + "06002A00", + "06002A00", + "06002A00", + "06002A00", + "06002A00", + "06002A00", + "06002A00", + "06002A00", + ], + [ + "070E2A00", + "070E2A00", + "070E2A00", + "070E2A00", + "070E2A00", + "070E2A00", + "070E2A00", + "070E2A00", + ], + [ + "06001800", + "06001800", + "06001800", + "06001800", + "06001800", + "06001800", + "06001800", + "06001800", + ], + [ + "070E1800", + "070E1800", + "070E1800", + "070E1800", + "070E1800", + "070E1800", + "070E1800", + "070E1800", + ], + "0C00", + "0C00", + "", + "1E00", + /*------------------------------------------------------------------------------------------------------------------------ X87 FPU. ------------------------------------------------------------------------------------------------------------------------*/ - [ - ["0604","0604","0604","0604","0604","0604","0604","0604"], - ["24080609","24080609","0609","0609","24080609","24080609","24080609","24080609"] - ], - [ - ["0604","","0604","0604","0601","0602","0601","0602"], [ - "0609","0609", - ["","","","","","","",""], - "0609", - ["","","","","","","",""], - ["","","","","","","",""], - ["","","","","","","",""], - ["","","","","","","",""] - ] - ], - [ - ["0604","0604","0604","0604","0604","0604","0604","0604"], + ["0604", "0604", "0604", "0604", "0604", "0604", "0604", "0604"], + [ + "24080609", + "24080609", + "0609", + "0609", + "24080609", + "24080609", + "24080609", + "24080609", + ], + ], [ - "24080609","24080609","24080609","24080609","", - ["","","","","","","",""],"","" - ] - ], - [ - ["0604","0604","0604","0604","","0607","","0607",""], + ["0604", "", "0604", "0604", "0601", "0602", "0601", "0602"], + [ + "0609", + "0609", + ["", "", "", "", "", "", "", ""], + "0609", + ["", "", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""], + ], + ], [ - "24080609","24080609","24080609","24080609", - ["","","","","","","",""], - "24080609","24080609","" - ] - ], - [ - ["0606","0606","0606","0606","0606","0606","0606","0606"], - ["06092408","06092408","0609","0609","06092408","06092408","06092408","06092408"] - ], - [ - ["0606","0606","0606","0606","0606","","0601","0602"], - ["0609","0609","0609","0609","0609","0609","",""] - ], - [ - ["0602","0602","0602","0602","0602","0602","0602","0602"], + ["0604", "0604", "0604", "0604", "0604", "0604", "0604", "0604"], + [ + "24080609", + "24080609", + "24080609", + "24080609", + "", + ["", "", "", "", "", "", "", ""], + "", + "", + ], + ], [ - "06092408","06092408","0609", - ["","","","","","","",""], - "06092408","06092408","06092408","06092408" - ] - ], - [ - ["0602","0602","0602","0602","0607","0606","0607","0606"], + ["0604", "0604", "0604", "0604", "", "0607", "", "0607", ""], + [ + "24080609", + "24080609", + "24080609", + "24080609", + ["", "", "", "", "", "", "", ""], + "24080609", + "24080609", + "", + ], + ], [ - "0609","0609","0609","0609", - ["1601","","","","","","",""], - "24080609","24080609", - "" - ] - ], - /*------------------------------------------------------------------------------------------------------------------------ + ["0606", "0606", "0606", "0606", "0606", "0606", "0606", "0606"], + [ + "06092408", + "06092408", + "0609", + "0609", + "06092408", + "06092408", + "06092408", + "06092408", + ], + ], + [ + ["0606", "0606", "0606", "0606", "0606", "", "0601", "0602"], + ["0609", "0609", "0609", "0609", "0609", "0609", "", ""], + ], + [ + ["0602", "0602", "0602", "0602", "0602", "0602", "0602", "0602"], + [ + "06092408", + "06092408", + "0609", + ["", "", "", "", "", "", "", ""], + "06092408", + "06092408", + "06092408", + "06092408", + ], + ], + [ + ["0602", "0602", "0602", "0602", "0607", "0606", "0607", "0606"], + [ + "0609", + "0609", + "0609", + "0609", + ["1601", "", "", "", "", "", "", ""], + "24080609", + "24080609", + "", + ], + ], + /*------------------------------------------------------------------------------------------------------------------------ End of X87 FPU. ------------------------------------------------------------------------------------------------------------------------*/ - "10000004","10000004","10000004","10000004", - "16000C00","170E0C00","0C001600","0C00170E", - "110E0008", - "110E0008", - "0D060C01", //JMP Ap (w:z). - "100000040004", - "16001A01","170E1A01", - "1A011600","1A01170E", - "","","","","","", - ["06000C00","","06000003","06000003","16000600","0600","16000600","0600"], - ["070E0D06","","070E0003","070E0003","170E070E","070E","170E070E","170E070E"], - "","","","","","", - ["06000003","06000003","","","","","",""], - [ - ["070E0003","070E0003","070A0004","090E0008","070A0008","090E0008","070A",""], - ["070E0003","070E0003","070A0008","","070A0008","","070A",""] - ], - /*------------------------------------------------------------------------------------------------------------------------ + "10000004", + "10000004", + "10000004", + "10000004", + "16000C00", + "170E0C00", + "0C001600", + "0C00170E", + "110E0008", + "110E0008", + "0D060C01", //JMP Ap (w:z). + "100000040004", + "16001A01", + "170E1A01", + "1A011600", + "1A01170E", + "", + "", + "", + "", + "", + "", + [ + "06000C00", + "", + "06000003", + "06000003", + "16000600", + "0600", + "16000600", + "0600", + ], + [ + "070E0D06", + "", + "070E0003", + "070E0003", + "170E070E", + "070E", + "170E070E", + "170E070E", + ], + "", + "", + "", + "", + "", + "", + ["06000003", "06000003", "", "", "", "", "", ""], + [ + [ + "070E0003", + "070E0003", + "070A0004", + "090E0008", + "070A0008", + "090E0008", + "070A", + "", + ], + ["070E0003", "070E0003", "070A0008", "", "070A0008", "", "070A", ""], + ], + /*------------------------------------------------------------------------------------------------------------------------ Two Byte operations. ------------------------------------------------------------------------------------------------------------------------*/ - [ - ["0602","0602","0602","0602","0602","0602","070E",""], - ["070E","070E","0601","0601","0601","0601","070E",""] - ], - [ - ["0908","0908","0908","0908","0602","","0602","0601"], [ - ["","","","","","","",""], - ["170819081B08","17081908","","","","","",""], - ["","","","","","","",""], - ["1708","","1708","1708","","","1602","17081802"], - "070E","","0601", - ["","","170819081B08","170819081B08","","","",""] - ] - ], - ["0B0E0612","0B0E070E"],["0B0E0612","0B0E070E"],"", - "","","","", - "","","","", - [["0601","0601","","","","","",""],""], - "", - "0A0A06A9", //3DNow takes ModR/M, IMM8. - [ - ["0B700770","0B700770","0A040603","0A040609"], - ["0B700770","0B700770","0A0412040604","0A0412040604"] - ], - [ - ["07700B70","07700B70","06030A04","06090A04"], - ["07700B70","07700B70","060412040A04","060412040A04"] - ], - [ - ["0A0412040606","0A0412040606","0B700770","0B700768"], - ["0A0412040604","","0B700770","0B700770"] - ], - [["06060A04","06060A04","",""],""], - ["0B70137007700140","0B70137007700140","",""], - ["0B70137007700140","0B70137007700140","",""], - [["0A0412040606","0A0412040606","0B700770",""],["0A0412040604","","0B700770",""]], - [["06060A04","06060A04","",""],""], - [["0601","0601","0601","0601","","","",""],""], - "", - [[["0A0B07080180","","",""],["0A0B07100180","","",""],["0A0B07080180","","",""],["0A0B07080180","","",""]], - ["",["0A0B060B","","",""],["0A0B07080180","","",""],["0A0B07080180","","",""]]], - [[["07080A0B0180","","",""],["07100A0B0180","","",""],["0A0B07080180","","",""],["0A0B07080180","","",""]], - ["",["0A0B060B","","",""],"",["0A0B07080180","","",""]]], - "","","", - "070E", - ["","07080A0C0001"],["","07080A0D0001"], - ["","0A0C07080001"],["","0A0D07080001"], - ["","07080A0E0001"],"", - ["","0A0E07080001"],"", - [ - ["0A040648","0B300730","0B700770","0A06066C0130"], - ["0A040648","0B300730","0B700770","0A06066C0130"], - "","" - ], - [ - [ - ["06480A04","07300B30","07700B70","066C0A060130"], - ["06480A04","07300B30","07700B70","066C0A060130"], - ["","","",["066C0A060138","066C0A060138","066C0A060138"]], - ["","","",["066C0A060138","066C0A060138","066C0A060138"]] + ["0602", "0602", "0602", "0602", "0602", "0602", "070E", ""], + ["070E", "070E", "0601", "0601", "0601", "0601", "070E", ""], ], [ - ["06480A04","07300B30","07700B70","066C0A06"], - ["06480A04","07300B30","07700B70","066C0A06"], - "","" - ] - ], - [ - ["0A0406A9","","",""],["0A0406A9","","",""], //Not Allowed to be Vector encoded. - "0A041204070C010A","0A041204070C010A" - ], - [ + ["0908", "0908", "0908", "0908", "0602", "", "0602", "0601"], + [ + ["", "", "", "", "", "", "", ""], + ["170819081B08", "17081908", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""], + ["1708", "", "1708", "1708", "", "", "1602", "17081802"], + "070E", + "", + "0601", + ["", "", "170819081B08", "170819081B08", "", "", "", ""], + ], + ], + ["0B0E0612", "0B0E070E"], + ["0B0E0612", "0B0E070E"], + "", + "", + "", + "", + "", + "", + "", + "", + "", + [["0601", "0601", "", "", "", "", "", ""], ""], + "", + "0A0A06A9", //3DNow takes ModR/M, IMM8. [ - "07700B70","07700B70", - ["06030A04","","",""],["06060A04","","",""] //SSE4a can not be vector encoded. - ],"" - ], - [ - ["0A0A0649","","",""],["0A0A0648","","",""], //Not allowed to be Vector encoded. - "0B0C06430109","0B0C06490109" - ], - [ - ["0A0A0649","","",""],["0A0A0648","","",""], //Not allowed to be vector encoded. - "0B0C0643010A","0B0C0649010A" - ], - ["0A0406430101","0A0406490101","",""], - ["0A0406430101","0A0406490101","",""], - "","","","", - "","","", - "", - "",//Three byte opcodes 0F38 - "", - "",//Three byte opcodes 0F3A - "","","","","", - "0B0E070E", - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [["0B0E070E0180","0A0F06FF","",""],"","",""], - [ - ["0B0E070E0180",["0A0F06FF","","0A0F06FF"],"",""], - ["0B0E070E0180",["0A0F06FF","","0A0F06FF"],"",""],"","" - ], - [ - ["0A02070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0A02070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [["0B0E070E0180","0A0F06FF","",""],"","",""], - [["0B0E070E0180","0A0F06FF","",""],"","",""], - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"","" - ], - [ - ["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""], - ["0B0E070E0180",["0A0F120F06FF","",""],"",""],"","" - ], - "0B0E070E","0B0E070E","0B0E070E","0B0E070E", - ["",[["0B0C0648","0B0C0730","",""],["0B0C0648","0B0C0730","",""],"",""]], - ["0B7007700142","0B7007700142","0A04120406430102","0A04120406490102"], - [ - ["0A040648","0A040648","",""],"", - ["0A040643","0A0412040643","",""],"" - ], - [ - ["0A040648","0A040648","",""],"", - ["0A040643","0A0412040643","",""],"" - ], - ["0B70137007700140","0B70137007700140","",""], - ["0B70137007700140","0B70137007700140","",""], - ["0B70137007700140","0B70137007700140","",""], - ["0B70137007700140","0B70137007700140","",""], - [ - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - "0A04120406430102","0A04120406460102" - ], - [ - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - "0A04120406430102","0A04120406460102" - ], - [ - ["0A040648","0B300718","0B7007380151","0A06065A0171"], - ["0A040648","0B180730","0B3807700152","0A05066C0152"], - "0A04120406430101","0A04120406460102" - ], - [["0B7007700142","","0B380770014A"],["0B700770014A","",""],"0B7007700141",""], - [ - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - ["0A040648","0B3013300730","0B70137007700152","0A061206066C0152"], - "0A04120406430102","0A04120406460102" - ], - ["0B70137007700141","0B70137007700141","0A04120406430101","0A04120406460101"], - ["0B70137007700142","0B70137007700142","0A04120406430102","0A04120406460102"], - ["0B70137007700141","0B70137007700141","0A04120406430101","0A04120406460101"], - [["0A0A06A3","","",""],"0B70137007700108","",""], - [["0A0A06A3","","",""],"0B70137007700108","",""], - [["0A0A06A3","","",""],"0B701370077001400108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","0A0F137007700108",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","0A0F137007700108",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0A0F137007700148","",""],["0A0F1206066C0148","",""]],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0B70137007700148","",""],"",""], - [["0A0A06A9","","",""],["0B70137007700148","",""],"",""], - ["","0B70137007700140","",""], - ["","0B70137007700140","",""], - [["0A0A070C","","",""],["0A04070C0108","","0A04070C0108"],"",""], - [ - [ - ["0A0A06A9","", "",""], - ["0B700770","0B700770",["0B7007700108","","0B700770"],["0A06066C0128","","0A06066C0120"]], - ["0A040710","0B700770",["0B700770","","0B7007700108"],""], - ["","",["0B7007700108","","0B700770"],""] + ["0B700770", "0B700770", "0A040603", "0A040609"], + ["0B700770", "0B700770", "0A0412040604", "0A0412040604"], ], [ - ["0A0A06A9","", "",""], - ["0B700770","0B700770",["0B7007700108","","0B700770"],["0A06066C0148","","0A06066C0140"]], - ["0A040710","0B700770",["0B700770","","0B7007700108"],""], - ["","",["0B7007700108","","0B700770"],""] - ] - ], - [ - ["0A0A06A90C00","","",""], - ["0A0406480C00","0B3007300C00",["0B7007700C000108","",""],["0A06066C0C000108","",""]], - "0B7007700C000108", - "0B7007700C000108" - ], - [ - "", - [ - "","", - [["060A0C00","","",""],"137007700C000108","",""],"", - [["060A0C00","","",""],"137007700C000108","",""],"", - [["060A0C00","","",""],"137007700C000108","",""],"" - ] - ], - [ - ["",["","",["137007700C000148","","137007700C000140"],""],"",""], - ["",["","",["137007700C000148","","137007700C000140"],""],"",""], - [["060A0C00","","",""],["06480C00","133007300C00",["137007700C000148","",""],["1206066C0C000148","",""]],"",""], - "", - [["060A0C00","","",""],["06480C00","133007300C00",["137007700C000148","","137007700C000140"],["1206066C0C000148","",""]],"",""], - "", - [["060A0C00","","",""],["06480C00","133007300C00",["137007700C000148","",""],["1206066C0C000148","",""]],"",""], - "" - ], - [ - "", - [ - "","", - [["137007700C00","137007700C00","",""],"137007700C000140","",""],["","137007700C000108","",""], - "","", - [["137007700C00","137007700C00","",""],"137007100C000140","",""],["","137007700C000108","",""] - ] - ], - [["0A0A06A9","","",""],["0A040710","13300B300730","0A0F137007700108",""],"",""], - [["0A0A06A9","","",""],["0A040710","13300B300730","0A0F137007700108",""],"",""], - [["0A0A06A9","","",""],["0A040710","13300B300730",["0A0F137007700148","",""],["0A0F1206066C0148","",""]],"",""], - [["",["","",""],"",""],"","",""], - [ - ["07080B080180","",["0B7007700141","","0B3807700149"],""], - ["064F0C000C00","",["0B7007380149","","0B7007700141"],""], - ["","","0B0C06440109",""], - ["0A04064F0C000C00","","0B0C06460109",""] - ], - [ - ["0B0807080180","",["0B7007700142","","0B380770014A"],""], - ["0A04064F","",["0B700738014A","","0B7007700142"],""], - ["","","0B0C0644010A",""], - ["0A04064F","","0B0C0646010A",""] - ], - [ - "", - ["","",["0B7007380149","","0B7007700141"],""], - ["","",["0B7007380142","","0B700770014A"],"0A06065A0170"], - ["","",["0B700770014A","","0B3807700142"],""] - ], - [ - "", - ["","",["0B700738014A","","0B7007700142"],""], - ["","","0A041204070C010A",""], - ["","","0A041204070C010A",""] - ], - [ - "",["0A040604","0B7013700770","",""], - "",["0A040604","0B7013700770","",""] - ], - [ - "",["0A040604","0B7013700770","",""], - "",["0A040604","0B7013700770","",""] - ], - [["070C0A0A","","",""],["06240A040108","","06360A040108"],["0A040646","0A040646",["","","0A0406460108"],""],""], - [ - ["06A90A0A","","",""], - ["06480A04","07300B30",["07700B700108","","07700B70"],["066C0A060128","","066C0A060120"]], - ["06480A04","07300B30",["07700B70","","07700B700108"],""], - ["","",["07700B700108","","07700B70"],""] - ], - "1106000C","1106000C","1106000C","1106000C", - [["1106000C","120F1002","",""],"","",""],[["1106000C","120F1002","",""],"","",""], - "1106000C","1106000C","1106000C","1106000C","1106000C","1106000C","1106000C","1106000C","1106000C","1106000C", - [ - ["0600",["0A0F06F2","","0A0F06F6"],"",""], - ["0600",["0A0F06F0","","0A0F06F4"],"",""],"","" - ], - [ - ["0600",["06120A0F","","06360A0F"],"",""], - ["0600",["06000A0F","","06240A0F"],"",""],"","" - ], - [ - ["0600",["0A0F062F","",""],"",""], - ["0600",["0A0F062F","",""],"",""],"", - ["0600",["0A0F062F","","0A0F063F"],"",""] - ], - [ - ["0600",["062F0A0F","",""],"",""], - ["0600",["062F0A0F","",""],"",""],"", - ["0600",["062F0A0F","","063F0A0F"],"",""] - ], - "0600",[["0600","0A03120F06FF","",""],"","",""], - "0600",[["0600","0A03120F06FF","",""],"","",""], - [ - ["0600",["0A0F06FF","","0A0F06FF"],"",""], - ["0600",["0A0F06FF","","0A0F06FF"],"",""],"","" - ], - [ - ["0600",["0A0F06FF","","0A0F06FF"],"",""], - ["0600",["0A0F06FF","","0A0F06FF"],"",""],"","" - ], - "0600","0600","0600","0600","0600","0600", - "2608","2608", - "", - "070E0B0E0003", - "070E0B0E0C00","070E0B0E1800", - "0B0E070E","070E0B0E", - "2808","2808", - "", - "070E0B0E0003", - "070E0B0E0C00","070E0B0E1800", - [ - [ - ["0601","","0601"],["0601","","0601"], - "0603","0603", - ["0601","","0601"],["0601","","0601"], - ["0601","0601","0601"], - ["0601","0601",""] + ["07700B70", "07700B70", "06030A04", "06090A04"], + ["07700B70", "07700B70", "060412040A04", "060412040A04"], ], [ - ["","",["0602","","",""],""],["","",["0602","","",""],""], - ["","",["0602","","",""],""],["","",["0602","","",""],""], - "", - ["","","","","","","",""], - ["","","","","","","",""], - ["","","","","","","",""] - ] - ], - "0B0E070E", - "06000A000003","070E0B0E0003", - ["0B0E090E",""], - "070E0B0E0003", - ["0B0E090E",""], - ["0B0E090E",""], - "0B0E0600","0B0E0602", - [ - ["1002","","",""],"", - ["0B060706","0A020602","",""],"" - ],"", - ["","","","","070E0C000003","070E0C000003","070E0C000003","070E0C000003"], - "0B0E070E0003", - [ - ["0B0E070E0180","","",""],"", - ["0B0E070E0180","0A020602","",""],["0B0E070E0180","0A020602","",""] - ], - [ - ["0B0E070E0180","","",""],"", - ["0B0E070E0180","0A020602","",""],["0B0E070E0180","","",""] - ], - "0B0E0600","0B0E0602", - "06000A000003","070E0B0E0003", - [ - ["0A0406480C00","0B30133007300C00","0A0F137007700C000151","0A0F066C0C000151"], - ["0A0406480C00","0B30133007300C00","0A0F137007700C000151","0A0F066C0C000151"], - ["0A0406440C00","0A04120406480C00","0A0F120406440C000151",""], - ["0A0406490C00","0A04120406480C00","0A0F120406460C000151",""] - ], - ["06030A02",""], - [["0A0A06220C00","","",""],"0A04120406220C000108","",""], - ["",[["06020A0A0C00","","",""],"06020A040C000108","",""]], - ["0B70137007700C000140","0B70137007700C000140","",""], - [ + ["0A0412040606", "0A0412040606", "0B700770", "0B700768"], + ["0A0412040604", "", "0B700770", "0B700770"], + ], + [["06060A04", "06060A04", "", ""], ""], + ["0B70137007700140", "0B70137007700140", "", ""], + ["0B70137007700140", "0B70137007700140", "", ""], [ - "", - ["06060003","","060B0003"], - "", - ["0601","","0601"], - ["0601","","0601"], - ["0601","","0601"], - ["0606","0606","0606",""],["0606","","",""] + ["0A0412040606", "0A0412040606", "0B700770", ""], + ["0A0412040604", "", "0B700770", ""], + ], + [["06060A04", "06060A04", "", ""], ""], + [["0601", "0601", "0601", "0601", "", "", "", ""], ""], + "", + [ + [ + ["0A0B07080180", "", "", ""], + ["0A0B07100180", "", "", ""], + ["0A0B07080180", "", "", ""], + ["0A0B07080180", "", "", ""], + ], + [ + "", + ["0A0B060B", "", "", ""], + ["0A0B07080180", "", "", ""], + ["0A0B07080180", "", "", ""], + ], ], [ - "", - ["","","","","","","",""], - "","","","", - "070E","070E" - ] - ], - "030E","030E","030E","030E","030E","030E","030E","030E", - ["",["0A040648","0B3013300730","",""],"",["0A040648","0B3013300730","",""]], - [["0A0A06A9","","",""],"0B70137006480108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300648",["0B70137006480108","",""],""],"",""], - [["0A0A06A9","","",""],"0B70137006480100","",""], - [["0A0A06A9","","",""],"0B70137007700140","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [ - ["","06490A040100","",""], - ["","06490A040100",["0A040649","","",""],["0A040649","","",""]] - ], - ["",[["0B0C06A0","","",""],["0B0C0640","0B0C0730","",""],"",""]], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","","0A061206066C0140"]],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","","0A061206066C0140"]],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [ - [["0A0A06A9","","",""],["0A040648","0B3013300648","0B70137006480108",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","0B70137006480108",""],"",""] - ], - [["0A0A06A9","","",""],["0A040648","0B3013300648",["0B70137006480108","","0B7013700648"],""],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [ + [ + ["07080A0B0180", "", "", ""], + ["07100A0B0180", "", "", ""], + ["0A0B07080180", "", "", ""], + ["0A0B07080180", "", "", ""], + ], + ["", ["0A0B060B", "", "", ""], "", ["0A0B07080180", "", "", ""]], + ], "", - ["0A040648","0A040730","0B3807700141",""], - ["0A040649","0B300738",["0A0406480140","0B7007380140","0B700770014A"],"0A06065A0170"], - "0B3807700142" - ], - [[["06090A0A","","",""],["07700B700108","",""],"",""],""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","","0A061206066C0140"]],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","","0A061206066C0140"]],"",""], - [["","","",["0A040648","0A040730","",""]],"0000"], - [["0A0A06A9","","",""],"0B70137006480108","",""], - [["0A0A06A9","","",""],["0B70137006480108","",""],"",""], - [["0A0A06A9","","",""],"0B7013700648","",""], - [["0A0A06A9","","",""],"0B70137007700140","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - ["",[["0A0A060A","","",""],["0B040648","0B040648","",""],"",""]], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","",""],["0A061206066C0148","",""]],"",""], - [["0A0A06A9","","",""],"0B70137007700140","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730",["0B70137007700148","",""],["0A061206066C0148","",""]],"",""], - "", - /*------------------------------------------------------------------------------------------------------------------------ + "", + "", + "070E", + ["", "07080A0C0001"], + ["", "07080A0D0001"], + ["", "0A0C07080001"], + ["", "0A0D07080001"], + ["", "07080A0E0001"], + "", + ["", "0A0E07080001"], + "", + [ + ["0A040648", "0B300730", "0B700770", "0A06066C0130"], + ["0A040648", "0B300730", "0B700770", "0A06066C0130"], + "", + "", + ], + [ + [ + ["06480A04", "07300B30", "07700B70", "066C0A060130"], + ["06480A04", "07300B30", "07700B70", "066C0A060130"], + ["", "", "", ["066C0A060138", "066C0A060138", "066C0A060138"]], + ["", "", "", ["066C0A060138", "066C0A060138", "066C0A060138"]], + ], + [ + ["06480A04", "07300B30", "07700B70", "066C0A06"], + ["06480A04", "07300B30", "07700B70", "066C0A06"], + "", + "", + ], + ], + [ + ["0A0406A9", "", "", ""], + ["0A0406A9", "", "", ""], //Not Allowed to be Vector encoded. + "0A041204070C010A", + "0A041204070C010A", + ], + [ + [ + "07700B70", + "07700B70", + ["06030A04", "", "", ""], + ["06060A04", "", "", ""], //SSE4a can not be vector encoded. + ], + "", + ], + [ + ["0A0A0649", "", "", ""], + ["0A0A0648", "", "", ""], //Not allowed to be Vector encoded. + "0B0C06430109", + "0B0C06490109", + ], + [ + ["0A0A0649", "", "", ""], + ["0A0A0648", "", "", ""], //Not allowed to be vector encoded. + "0B0C0643010A", + "0B0C0649010A", + ], + ["0A0406430101", "0A0406490101", "", ""], + ["0A0406430101", "0A0406490101", "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + "", //Three byte opcodes 0F38 + "", + "", //Three byte opcodes 0F3A + "", + "", + "", + "", + "", + "0B0E070E", + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "", + ], + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "", + ], + [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""], + [ + ["0B0E070E0180", ["0A0F06FF", "", "0A0F06FF"], "", ""], + ["0B0E070E0180", ["0A0F06FF", "", "0A0F06FF"], "", ""], + "", + "", + ], + [ + ["0A02070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0A02070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "", + ], + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "", + ], + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "", + ], + [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""], + [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""], + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "", + ], + [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", ""], "", ""], + "", + "", + ], + "0B0E070E", + "0B0E070E", + "0B0E070E", + "0B0E070E", + [ + "", + [ + ["0B0C0648", "0B0C0730", "", ""], + ["0B0C0648", "0B0C0730", "", ""], + "", + "", + ], + ], + ["0B7007700142", "0B7007700142", "0A04120406430102", "0A04120406490102"], + [ + ["0A040648", "0A040648", "", ""], + "", + ["0A040643", "0A0412040643", "", ""], + "", + ], + [ + ["0A040648", "0A040648", "", ""], + "", + ["0A040643", "0A0412040643", "", ""], + "", + ], + ["0B70137007700140", "0B70137007700140", "", ""], + ["0B70137007700140", "0B70137007700140", "", ""], + ["0B70137007700140", "0B70137007700140", "", ""], + ["0B70137007700140", "0B70137007700140", "", ""], + [ + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + "0A04120406430102", + "0A04120406460102", + ], + [ + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + "0A04120406430102", + "0A04120406460102", + ], + [ + ["0A040648", "0B300718", "0B7007380151", "0A06065A0171"], + ["0A040648", "0B180730", "0B3807700152", "0A05066C0152"], + "0A04120406430101", + "0A04120406460102", + ], + [ + ["0B7007700142", "", "0B380770014A"], + ["0B700770014A", "", ""], + "0B7007700141", + "", + ], + [ + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + ["0A040648", "0B3013300730", "0B70137007700152", "0A061206066C0152"], + "0A04120406430102", + "0A04120406460102", + ], + [ + "0B70137007700141", + "0B70137007700141", + "0A04120406430101", + "0A04120406460101", + ], + [ + "0B70137007700142", + "0B70137007700142", + "0A04120406430102", + "0A04120406460102", + ], + [ + "0B70137007700141", + "0B70137007700141", + "0A04120406430101", + "0A04120406460101", + ], + [["0A0A06A3", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A3", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A3", "", "", ""], "0B701370077001400108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + ["0A040648", "0B3013300730", "0A0F137007700108", ""], + "", + "", + ], + [ + ["0A0A06A9", "", "", ""], + ["0A040648", "0B3013300730", "0A0F137007700108", ""], + "", + "", + ], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0A0F137007700148", "", ""], + ["0A0F1206066C0148", "", ""], + ], + "", + "", + ], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], ["0B70137007700148", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0B70137007700148", "", ""], "", ""], + ["", "0B70137007700140", "", ""], + ["", "0B70137007700140", "", ""], + [["0A0A070C", "", "", ""], ["0A04070C0108", "", "0A04070C0108"], "", ""], + [ + [ + ["0A0A06A9", "", "", ""], + [ + "0B700770", + "0B700770", + ["0B7007700108", "", "0B700770"], + ["0A06066C0128", "", "0A06066C0120"], + ], + ["0A040710", "0B700770", ["0B700770", "", "0B7007700108"], ""], + ["", "", ["0B7007700108", "", "0B700770"], ""], + ], + [ + ["0A0A06A9", "", "", ""], + [ + "0B700770", + "0B700770", + ["0B7007700108", "", "0B700770"], + ["0A06066C0148", "", "0A06066C0140"], + ], + ["0A040710", "0B700770", ["0B700770", "", "0B7007700108"], ""], + ["", "", ["0B7007700108", "", "0B700770"], ""], + ], + ], + [ + ["0A0A06A90C00", "", "", ""], + [ + "0A0406480C00", + "0B3007300C00", + ["0B7007700C000108", "", ""], + ["0A06066C0C000108", "", ""], + ], + "0B7007700C000108", + "0B7007700C000108", + ], + [ + "", + [ + "", + "", + [["060A0C00", "", "", ""], "137007700C000108", "", ""], + "", + [["060A0C00", "", "", ""], "137007700C000108", "", ""], + "", + [["060A0C00", "", "", ""], "137007700C000108", "", ""], + "", + ], + ], + [ + [ + "", + ["", "", ["137007700C000148", "", "137007700C000140"], ""], + "", + "", + ], + [ + "", + ["", "", ["137007700C000148", "", "137007700C000140"], ""], + "", + "", + ], + [ + ["060A0C00", "", "", ""], + [ + "06480C00", + "133007300C00", + ["137007700C000148", "", ""], + ["1206066C0C000148", "", ""], + ], + "", + "", + ], + "", + [ + ["060A0C00", "", "", ""], + [ + "06480C00", + "133007300C00", + ["137007700C000148", "", "137007700C000140"], + ["1206066C0C000148", "", ""], + ], + "", + "", + ], + "", + [ + ["060A0C00", "", "", ""], + [ + "06480C00", + "133007300C00", + ["137007700C000148", "", ""], + ["1206066C0C000148", "", ""], + ], + "", + "", + ], + "", + ], + [ + "", + [ + "", + "", + [ + ["137007700C00", "137007700C00", "", ""], + "137007700C000140", + "", + "", + ], + ["", "137007700C000108", "", ""], + "", + "", + [ + ["137007700C00", "137007700C00", "", ""], + "137007100C000140", + "", + "", + ], + ["", "137007700C000108", "", ""], + ], + ], + [ + ["0A0A06A9", "", "", ""], + ["0A040710", "13300B300730", "0A0F137007700108", ""], + "", + "", + ], + [ + ["0A0A06A9", "", "", ""], + ["0A040710", "13300B300730", "0A0F137007700108", ""], + "", + "", + ], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040710", + "13300B300730", + ["0A0F137007700148", "", ""], + ["0A0F1206066C0148", "", ""], + ], + "", + "", + ], + [["", ["", "", ""], "", ""], "", "", ""], + [ + ["07080B080180", "", ["0B7007700141", "", "0B3807700149"], ""], + ["064F0C000C00", "", ["0B7007380149", "", "0B7007700141"], ""], + ["", "", "0B0C06440109", ""], + ["0A04064F0C000C00", "", "0B0C06460109", ""], + ], + [ + ["0B0807080180", "", ["0B7007700142", "", "0B380770014A"], ""], + ["0A04064F", "", ["0B700738014A", "", "0B7007700142"], ""], + ["", "", "0B0C0644010A", ""], + ["0A04064F", "", "0B0C0646010A", ""], + ], + [ + "", + ["", "", ["0B7007380149", "", "0B7007700141"], ""], + ["", "", ["0B7007380142", "", "0B700770014A"], "0A06065A0170"], + ["", "", ["0B700770014A", "", "0B3807700142"], ""], + ], + [ + "", + ["", "", ["0B700738014A", "", "0B7007700142"], ""], + ["", "", "0A041204070C010A", ""], + ["", "", "0A041204070C010A", ""], + ], + [ + "", + ["0A040604", "0B7013700770", "", ""], + "", + ["0A040604", "0B7013700770", "", ""], + ], + [ + "", + ["0A040604", "0B7013700770", "", ""], + "", + ["0A040604", "0B7013700770", "", ""], + ], + [ + ["070C0A0A", "", "", ""], + ["06240A040108", "", "06360A040108"], + ["0A040646", "0A040646", ["", "", "0A0406460108"], ""], + "", + ], + [ + ["06A90A0A", "", "", ""], + [ + "06480A04", + "07300B30", + ["07700B700108", "", "07700B70"], + ["066C0A060128", "", "066C0A060120"], + ], + ["06480A04", "07300B30", ["07700B70", "", "07700B700108"], ""], + ["", "", ["07700B700108", "", "07700B70"], ""], + ], + "1106000C", + "1106000C", + "1106000C", + "1106000C", + [["1106000C", "120F1002", "", ""], "", "", ""], + [["1106000C", "120F1002", "", ""], "", "", ""], + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + "1106000C", + [ + ["0600", ["0A0F06F2", "", "0A0F06F6"], "", ""], + ["0600", ["0A0F06F0", "", "0A0F06F4"], "", ""], + "", + "", + ], + [ + ["0600", ["06120A0F", "", "06360A0F"], "", ""], + ["0600", ["06000A0F", "", "06240A0F"], "", ""], + "", + "", + ], + [ + ["0600", ["0A0F062F", "", ""], "", ""], + ["0600", ["0A0F062F", "", ""], "", ""], + "", + ["0600", ["0A0F062F", "", "0A0F063F"], "", ""], + ], + [ + ["0600", ["062F0A0F", "", ""], "", ""], + ["0600", ["062F0A0F", "", ""], "", ""], + "", + ["0600", ["062F0A0F", "", "063F0A0F"], "", ""], + ], + "0600", + [["0600", "0A03120F06FF", "", ""], "", "", ""], + "0600", + [["0600", "0A03120F06FF", "", ""], "", "", ""], + [ + ["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], + ["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], + "", + "", + ], + [ + ["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], + ["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], + "", + "", + ], + "0600", + "0600", + "0600", + "0600", + "0600", + "0600", + "2608", + "2608", + "", + "070E0B0E0003", + "070E0B0E0C00", + "070E0B0E1800", + "0B0E070E", + "070E0B0E", + "2808", + "2808", + "", + "070E0B0E0003", + "070E0B0E0C00", + "070E0B0E1800", + [ + [ + ["0601", "", "0601"], + ["0601", "", "0601"], + "0603", + "0603", + ["0601", "", "0601"], + ["0601", "", "0601"], + ["0601", "0601", "0601"], + ["0601", "0601", ""], + ], + [ + ["", "", ["0602", "", "", ""], ""], + ["", "", ["0602", "", "", ""], ""], + ["", "", ["0602", "", "", ""], ""], + ["", "", ["0602", "", "", ""], ""], + "", + ["", "", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""], + ["", "", "", "", "", "", "", ""], + ], + ], + "0B0E070E", + "06000A000003", + "070E0B0E0003", + ["0B0E090E", ""], + "070E0B0E0003", + ["0B0E090E", ""], + ["0B0E090E", ""], + "0B0E0600", + "0B0E0602", + [["1002", "", "", ""], "", ["0B060706", "0A020602", "", ""], ""], + "", + [ + "", + "", + "", + "", + "070E0C000003", + "070E0C000003", + "070E0C000003", + "070E0C000003", + ], + "0B0E070E0003", + [ + ["0B0E070E0180", "", "", ""], + "", + ["0B0E070E0180", "0A020602", "", ""], + ["0B0E070E0180", "0A020602", "", ""], + ], + [ + ["0B0E070E0180", "", "", ""], + "", + ["0B0E070E0180", "0A020602", "", ""], + ["0B0E070E0180", "", "", ""], + ], + "0B0E0600", + "0B0E0602", + "06000A000003", + "070E0B0E0003", + [ + [ + "0A0406480C00", + "0B30133007300C00", + "0A0F137007700C000151", + "0A0F066C0C000151", + ], + [ + "0A0406480C00", + "0B30133007300C00", + "0A0F137007700C000151", + "0A0F066C0C000151", + ], + ["0A0406440C00", "0A04120406480C00", "0A0F120406440C000151", ""], + ["0A0406490C00", "0A04120406480C00", "0A0F120406460C000151", ""], + ], + ["06030A02", ""], + [["0A0A06220C00", "", "", ""], "0A04120406220C000108", "", ""], + ["", [["06020A0A0C00", "", "", ""], "06020A040C000108", "", ""]], + ["0B70137007700C000140", "0B70137007700C000140", "", ""], + [ + [ + "", + ["06060003", "", "060B0003"], + "", + ["0601", "", "0601"], + ["0601", "", "0601"], + ["0601", "", "0601"], + ["0606", "0606", "0606", ""], + ["0606", "", "", ""], + ], + ["", ["", "", "", "", "", "", "", ""], "", "", "", "", "070E", "070E"], + ], + "030E", + "030E", + "030E", + "030E", + "030E", + "030E", + "030E", + "030E", + [ + "", + ["0A040648", "0B3013300730", "", ""], + "", + ["0A040648", "0B3013300730", "", ""], + ], + [["0A0A06A9", "", "", ""], "0B70137006480108", "", ""], + [ + ["0A0A06A9", "", "", ""], + ["0A040648", "0B3013300648", ["0B70137006480108", "", ""], ""], + "", + "", + ], + [["0A0A06A9", "", "", ""], "0B70137006480100", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700140", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["", "06490A040100", "", ""], + [ + "", + "06490A040100", + ["0A040649", "", "", ""], + ["0A040649", "", "", ""], + ], + ], + ["", [["0B0C06A0", "", "", ""], ["0B0C0640", "0B0C0730", "", ""], "", ""]], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", "0A061206066C0140"], + ], + "", + "", + ], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", "0A061206066C0140"], + ], + "", + "", + ], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + [ + ["0A0A06A9", "", "", ""], + ["0A040648", "0B3013300648", "0B70137006480108", ""], + "", + "", + ], + [ + ["0A0A06A9", "", "", ""], + ["0A040648", "0B3013300730", "0B70137006480108", ""], + "", + "", + ], + ], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300648", + ["0B70137006480108", "", "0B7013700648"], + "", + ], + "", + "", + ], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + "", + ["0A040648", "0A040730", "0B3807700141", ""], + [ + "0A040649", + "0B300738", + ["0A0406480140", "0B7007380140", "0B700770014A"], + "0A06065A0170", + ], + "0B3807700142", + ], + [[["06090A0A", "", "", ""], ["07700B700108", "", ""], "", ""], ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", "0A061206066C0140"], + ], + "", + "", + ], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", "0A061206066C0140"], + ], + "", + "", + ], + [["", "", "", ["0A040648", "0A040730", "", ""]], "0000"], + [["0A0A06A9", "", "", ""], "0B70137006480108", "", ""], + [["0A0A06A9", "", "", ""], ["0B70137006480108", "", ""], "", ""], + [["0A0A06A9", "", "", ""], "0B7013700648", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700140", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + ["", [["0A0A060A", "", "", ""], ["0B040648", "0B040648", "", ""], "", ""]], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0B70137007700148", "", ""], + ["0A061206066C0148", "", ""], + ], + "", + "", + ], + [["0A0A06A9", "", "", ""], "0B70137007700140", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [ + ["0A0A06A9", "", "", ""], + [ + "0A040648", + "0B3013300730", + ["0B70137007700148", "", ""], + ["0A061206066C0148", "", ""], + ], + "", + "", + ], + "", + /*------------------------------------------------------------------------------------------------------------------------ Three Byte operations 0F38. ------------------------------------------------------------------------------------------------------------------------*/ - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],["0A040648","0B3013300730","",""],"",""], - [["0A0A06A9","","",""],"0B70137007700108","",""], - ["",["","0B3013300730",["0B70137007700148","",""],""],"",""], - ["",["","0B3013300730","0B70137007700140",""],"",""], - ["",["","0B300730","",""],"",""], - ["",["","0B300730","",""],"",""], - ["",["0A0406482E00","0B30133007301530","0B7013700770",""],["","","07380B70",""],""], - ["",["","","0B7013700770",""],["","","071C0B70",""],""], - ["",["","","0B7013700770",""],["","","070E0B70",""],""], - ["",["","0B300718",["0B7007380109","",""],""],["","","07380B70",""],""], - ["",["0A0407102E00","0B30133007301530",["0B70137007700148","","0B70137007700140"],""],["","","071C0B70",""],""], - ["",["0A0407102E00","0B30133007301530",["0B70137007700148","","0B70137007700140"],""],["","","07380B70",""],""], - ["",["","0B3013300730",["0B70137007700148","","0B70137007700140"],""],"",""], - ["",["0A040648","0B300730","",""],"",""], - ["",["","0B300644",["0B7006440138","",""],["0A0606440138","",""]],"",""], - ["",["","0A050646",["0B6806460108","","0B700646"],["","","0A060646"]],"",""], - ["",["","0A050648",["0B6806480138","","0B680648"],["0A0606480138","",""]],"",""], - ["",["","",["0A06065A0108","","0A06065A"],["","","0A06065A"]],"",""], - [["0A0A06A9","","",""],"0B7007700108","",""], - [["0A0A06A9","","",""],"0B7007700108","",""], - [["0A0A06A9","","",""],["0B7007700148","",""],"",""], - ["",["","","0B7007700140",""],"",""], - ["","0B7007380108",["","","07380B70",""],""], - ["","0B70071C0108",["","","071C0B70",""],""], - ["","0B70070E0108",["","","070E0B70",""],""], - ["","0B7007380108",["","","07380B70",""],""], - ["","0B70071C0108",["","","071C0B70",""],""], - ["","0B7007380108",["","","07380B70",""],""], - ["",["","",["0A0F137007700108","","0A0F13700770"],""],["","",["0A0F13700770","","0A0F137007700108"],""],""], - ["",["","",["0A0F137007700148","","0A0F137007700140"],["0A0F1206066C0148","",""]],["","",["0A0F137007700140","","0A0F137007700148"],""],""], - ["","0B70137007700140",["","",["0B7006FF","","0B7006FF0108"],""],""], - ["",["0A040648","0B3013300730","0A0F137007700140",""],["","",["0A0F0770","","0A0F07700108"],""],""], - [["",["0B7007700108","",""],"",""],["","",["","",["","","0B7006FF0108"],""],""]], - ["",["0B70137007700148","",""],"",""], - ["",["","0B3013300730",["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["","0B3013300730",["0A0412040644014A","","0A04120406480142"],""],"",""], - ["",["","073013300B30","",""],"",""], - ["",["","0B3013300730","",""],"",""], - ["","0B7007380108",["","","07380B70",""],""], - ["","0B70071C0108",["","","071C0B70",""],""], - ["","0B70070E0108",["","","070E0B70",""],""], - ["","0B7007380108",["","","07380B70",""],""], - ["","0B70071C0108",["","","071C0B70",""],""], - ["","0B7007380108",["","",["06480A04","07380B70",""],""],""], - ["",["","0A051205065A",["0B70137007700148","","0B70137007700140"],["0A061206066C0108","",""]],"",""], - ["",["0A040710","0B3013300730","0A0F137007700140",""],"",""], - ["","0B70137007700108",["","",["0B7006FF","","0B7006FF0108"],""],""], - ["",["0A0412040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],["","",["0A0F0770","","0A0F07700108"],""],""], - ["","0B70137007700108",["","","0B7006FF0100",""],""], - ["",["0A0412040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["","0B70137007700108","",""], - ["",["0A0412040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["","0B70137007700108","",""], - ["",["0A0412040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["",["0A0412040648","0B3013300730",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["",["0A040648",["0A040648","0A040648","",""],"",""],"",""], - ["",["","",["0B7007700159","","0B7007700151"],["0A06066C0159","","0A06066C0151"]],"",""], - ["",["","",["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["","",["0B7007700148","","0B7007700140"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["",["",["0B3013300730","",""],["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B70137007700148","","0B70137007700140"],["0A061206066C0148","",""]],"",""], - "","","","", - ["",["","",["0B7007700148","","0B7007700140"],""],"",""], - ["",["","",["0A04120406440108","","0A0412040646"],""],"",""], - ["",["","",["0B7007700148","","0B7007700140"],""],"",""], - ["",["","",["0A04120406440108","","0A0412040646"],""],"",""], - ["",["","","",["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["","","",["0A061206066C0159","",""]],"",""], - ["",["","","",["0A061206066C0159","","0A061206066C0151"]],"",""], - ["",["","","",["0A061206066C0159","","0A061206066C0151"]],"",""], - "", - ["",["","","",["0A061206066C0149","","0A061206066C0141"]],"",""], - "","", - ["",["","0B300644",["0B7006440128","",""],["0A0606440128","",""]],"",""], - ["",["","0B300646",["0B7006460128","","0B7006460120"],["","","0A0606460120"]],"",""], - ["",["","0A050648",["0B6806480128","","0B6806480120"],["0A0606480128","",""]],"",""], - ["",["","",["0A06065A0128","","0A06065A0120"],["","","0A06065A0120"]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - "","","","", - ["",["","",["0B70137007700148","","0B70137007700140"],["0A061206066C0148","","0A061206066C0140"]],"",""], - ["",["","",["0B70137007700158","","0B70137007700150"],["0A061206066C0158","","0A061206066C0150"]],"",""], - ["",["","",["0B70137007700108","","0B7013700770"],""],"",""], - "","","","","", - ["",["","","",["0A061206066C0148","",""]],"",""], - ["",["","","",["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - ["",["","","",["0A06120F066C0148","",""]],"",""], - "","","","", - ["",["","","",["0A0F1206066C0148","",""]],"",""], - ["",["","",["0B70137007700108","","0B7013700770"],""],"",""], - ["",["","",["0B70137007700148","","0B70137007700140"],""],"",""], - ["",["","",["0B70137007700148","","0B70137007700140"],""],"",""], - ["",["","0B300640",["0B7006400108","",""],""],"",""], - ["",["","0B300642",["0B7006420108","",""],""],"",""], - ["",["",["","",["0B7006000108","",""],""],"",""]], - ["",["",["","",["0B7006100108","",""],""],"",""]], - ["",["","",["0B70062F0108","","0B70063F"],""],"",""], - ["",["","",["0B70137007700108","","0B7013700770"],""],"",""], - ["",["","",["0B70137007700148","","0B70137007700140"],""],"",""], - ["",["","",["0B70137007700148","","0B70137007700140"],""],"",""], - [["","0B0C060B0180","",""],""], - [["","0B0C060B0180","",""],""], - [["","0B0C060B0180","",""],""], - ["",["","","0B70137007700140",""],"",""], - ["",["","","",["0A061206066C014A","",""]],"",""], - "", - ["",["","","",["0A061206066C0148","",""]],"",""], - ["",["","","",["0A061206066C0148","",""]],"",""], - ["",["","",["0B7007700108","","0B700770"],""],"",""], - ["",["","",["0B7007700108","","0B700770"],""],"",""], - ["",["","",["07700B700108","","07700B70"],""],"",""], - ["",["","",["07700B700108","","07700B70"],""],"",""], - "", - ["",["","",["0B70137007700108","","0B7013700770"],""],"",""], - "","", - ["",["",["0B30073013300124","","0B30064813300124"],["0B700770012C","","0B7007380124"],["0A06066C012C","","0A06065A0124"]],"",""], - ["",["",["0A04073012040104","","0B30073013300104"],["0B380770010C","","0B7007700104"],""],"",""], - ["",["",["0B30073013300134","","0B30064813300134"],["0B700770013C","","0B7007380134"],["0A06066C013C","","0A06065A0104"]],"",""], - ["",["",["0A04073012040104","","0B30073013300104"],["0B380770010C","","0B7007700104"],""],"",""], - "","", - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040714","","0A0412040718"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040714","","0A0412040718"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040714","","0A0412040718"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040714","","0A0412040718"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["","",["07700B70010C","","07380B700104"],["066C0A06012C","","065A0A060124"]],"",""], - ["",["","",["07700B38010C","","07700B700104"],""],"",""], - ["",["","",["07700B70013C","","07380B700134"],["066C0A06013C","","065A0A060134"]],"",""], - ["",["","",["07700B38010C","","07700B700104"],""],"",""], - ["",["","","",["0A061206066C011A","",""]],"",""], - "", - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - "","","","", - ["",["","","0B70137007700140",["0A061206066C0118","",""]],"",""], - ["",["","","0B70137007700140",["0A061206066C0148","",""]],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - ["",["",["0B3013300730","","0B3013300730"],["0B7013700770014A","","0B70137007700142"],["0A061206066C015A","","0A061206066C0152"]],"",""], - ["",["",["0A0412040644","","0A0412040646"],["0A0412040644010A","","0A04120406460102"],""],"",""], - "","","","", - ["",["","",["0B7007700148","","0B7007700140"],""],"",""], - "", - [ + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], ["0A040648", "0B3013300730", "", ""], "", ""], + [["0A0A06A9", "", "", ""], "0B70137007700108", "", ""], + ["", ["", "0B3013300730", ["0B70137007700148", "", ""], ""], "", ""], + ["", ["", "0B3013300730", "0B70137007700140", ""], "", ""], + ["", ["", "0B300730", "", ""], "", ""], + ["", ["", "0B300730", "", ""], "", ""], [ - ["",["","","",["060C013C","","060A0134"]],"",""], - ["",["","",["060C013C","","060A0134"],["060C013C","",""]],"",""], - ["",["","",["060C013C","","070A0134"],["060C013C","",""]],"",""], - "", - ["",["","","",["060C013C","","060A0134"]],"",""], - ["",["","",["060C013C","","060A0134"],["060C013C","",""]],"",""], - ["",["","",["060C013C","","060A0134"],["060C013C","",""]],"",""], - "" - ],"" - ], - [ + "", + ["0A0406482E00", "0B30133007301530", "0B7013700770", ""], + ["", "", "07380B70", ""], + "", + ], + ["", ["", "", "0B7013700770", ""], ["", "", "071C0B70", ""], ""], + ["", ["", "", "0B7013700770", ""], ["", "", "070E0B70", ""], ""], [ - "", - ["",["","",["060C010C","","060C0104"],""],"",""], - ["",["","",["060C010C","","060C0104"],""],"",""], - "","", - ["",["","",["060C010C","","060C0104"],""],"",""], - ["",["","",["060C010C","","060C0104"],""],"",""], - "" - ],"" - ], - [["0A040648","","",""],["","",["0A06066C0159","","0A06066C0151"],["0A06066C0109","",""]],"",""], - [["0A040648","","",""],["","","",["0A06066C0109","",""]],"",""], - [["0A040648","","",""],["","",["0A06066C0159","","0A06066C0151"],["0A06066C0109","",""]],"",""], - [["0A0406482E00","","",""],["","",["0A04120406440109","","0A04120406460101"],["0A06066C0109","",""]],"",""], - [["0A040648","","",""],["","",["0A06066C0159","","0A06066C0151"],["0A06066C015A","",""]],"",""], - [["0A040648","","",""],["","",["0A04120406440109","","0A04120406460101"],["0A06066C0148","",""]],"",""], - "","", - [[["","","",["0A06060C0120","","0A06060C0128"]],["","","",["060C0A060128","","060C0A060120"]],"",""],""], - [[["","","",["0A06060C0130","","0A06060C0138"]],["","","",["060C0A060138","","060C0A060130"]],"",""],""], - "","", - [[["","","",["0A06060C0120","","0A06060C0128"]],["","","",["060C0A060128","","060C0A060120"]],"",""],""], - [[["","","",["0A06060C0130","","0A06060C0138"]],["","","",["060C0A060138","","060C0A060130"]],"",""],""], - "","","","","", - ["",["0A040648","0A040648","",""],"",""], - ["",["0A040648","0A0412040648","",""],"",""], - ["",["0A040648","0A0412040648","",""],"",""], - ["",["0A040648","0A0412040648","",""],"",""], - ["",["0A040648","0A0412040648","",""],"",""], - "","","","","","","","","","","","","","","","", - [ - ["0B0E070E0180","","",""], - ["0B0E070E0180","","",""],"", - ["0B0C06000180","","",""] - ], - [ - ["070E0B0E0180","","",""], - ["070E0B0E0180","","",""],"", - ["0B0C070E0180","","",""] - ], - ["",["","0B0C130C070C","",""],"",""], - [ + "", + ["", "0B300718", ["0B7007380109", "", ""], ""], + ["", "", "07380B70", ""], + "", + ], + [ + "", + [ + "0A0407102E00", + "0B30133007301530", + ["0B70137007700148", "", "0B70137007700140"], + "", + ], + ["", "", "071C0B70", ""], + "", + ], + [ + "", + [ + "0A0407102E00", + "0B30133007301530", + ["0B70137007700148", "", "0B70137007700140"], + "", + ], + ["", "", "07380B70", ""], + "", + ], + [ + "", + ["", "0B3013300730", ["0B70137007700148", "", "0B70137007700140"], ""], + "", + "", + ], + ["", ["0A040648", "0B300730", "", ""], "", ""], + [ + "", + ["", "0B300644", ["0B7006440138", "", ""], ["0A0606440138", "", ""]], + "", + "", + ], + [ + "", + [ + "", + "0A050646", + ["0B6806460108", "", "0B700646"], + ["", "", "0A060646"], + ], + "", + "", + ], + [ + "", + [ + "", + "0A050648", + ["0B6806480138", "", "0B680648"], + ["0A0606480138", "", ""], + ], + "", + "", + ], + [ + "", + ["", "", ["0A06065A0108", "", "0A06065A"], ["", "", "0A06065A"]], + "", + "", + ], + [["0A0A06A9", "", "", ""], "0B7007700108", "", ""], + [["0A0A06A9", "", "", ""], "0B7007700108", "", ""], + [["0A0A06A9", "", "", ""], ["0B7007700148", "", ""], "", ""], + ["", ["", "", "0B7007700140", ""], "", ""], + ["", "0B7007380108", ["", "", "07380B70", ""], ""], + ["", "0B70071C0108", ["", "", "071C0B70", ""], ""], + ["", "0B70070E0108", ["", "", "070E0B70", ""], ""], + ["", "0B7007380108", ["", "", "07380B70", ""], ""], + ["", "0B70071C0108", ["", "", "071C0B70", ""], ""], + ["", "0B7007380108", ["", "", "07380B70", ""], ""], + [ + "", + ["", "", ["0A0F137007700108", "", "0A0F13700770"], ""], + ["", "", ["0A0F13700770", "", "0A0F137007700108"], ""], + "", + ], + [ + "", + [ + "", + "", + ["0A0F137007700148", "", "0A0F137007700140"], + ["0A0F1206066C0148", "", ""], + ], + ["", "", ["0A0F137007700140", "", "0A0F137007700148"], ""], + "", + ], + [ + "", + "0B70137007700140", + ["", "", ["0B7006FF", "", "0B7006FF0108"], ""], + "", + ], + [ + "", + ["0A040648", "0B3013300730", "0A0F137007700140", ""], + ["", "", ["0A0F0770", "", "0A0F07700108"], ""], + "", + ], + [ + ["", ["0B7007700108", "", ""], "", ""], + ["", "", ["", "", ["", "", "0B7006FF0108"], ""], ""], + ], + ["", ["0B70137007700148", "", ""], "", ""], + [ + "", + ["", "0B3013300730", ["0B7013700770014A", "", "0B70137007700142"], ""], + "", + "", + ], + [ + "", + ["", "0B3013300730", ["0A0412040644014A", "", "0A04120406480142"], ""], + "", + "", + ], + ["", ["", "073013300B30", "", ""], "", ""], + ["", ["", "0B3013300730", "", ""], "", ""], + ["", "0B7007380108", ["", "", "07380B70", ""], ""], + ["", "0B70071C0108", ["", "", "071C0B70", ""], ""], + ["", "0B70070E0108", ["", "", "070E0B70", ""], ""], + ["", "0B7007380108", ["", "", "07380B70", ""], ""], + ["", "0B70071C0108", ["", "", "071C0B70", ""], ""], + ["", "0B7007380108", ["", "", ["06480A04", "07380B70", ""], ""], ""], + [ + "", + [ + "", + "0A051205065A", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0108", "", ""], + ], + "", + "", + ], + ["", ["0A040710", "0B3013300730", "0A0F137007700140", ""], "", ""], + [ + "", + "0B70137007700108", + ["", "", ["0B7006FF", "", "0B7006FF0108"], ""], + "", + ], + [ + "", + [ + "0A0412040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", ""], + ], + ["", "", ["0A0F0770", "", "0A0F07700108"], ""], + "", + ], + ["", "0B70137007700108", ["", "", "0B7006FF0100", ""], ""], + [ + "", + [ + "0A0412040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", ""], + ], + "", + "", + ], + ["", "0B70137007700108", "", ""], + [ + "", + [ + "0A0412040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", ""], + ], + "", + "", + ], + ["", "0B70137007700108", "", ""], + [ + "", + [ + "0A0412040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", ""], + ], + "", + "", + ], + [ + "", + [ + "0A0412040648", + "0B3013300730", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", ""], + ], + "", + "", + ], + ["", ["0A040648", ["0A040648", "0A040648", "", ""], "", ""], "", ""], + [ + "", + [ + "", + "", + ["0B7007700159", "", "0B7007700151"], + ["0A06066C0159", "", "0A06066C0151"], + ], + "", + "", + ], + ["", ["", "", ["0A0412040644010A", "", "0A04120406460102"], ""], "", ""], + ["", ["", "", ["0B7007700148", "", "0B7007700140"], ""], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", ""], + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", ""], + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", ""], + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", ""], + ], + "", + "", + ], "", - ["",["","130C070C","",""],"",""], - ["",["","130C070C","",""],"",""], - ["",["","130C070C","",""],"",""], - "","","","" - ],"", - [ - ["","0B0C070C130C","",""],"", - ["","0B0C130C070C","",""], - ["","0B0C130C070C","",""] - ], - [ "", - ["0B0C070C","","",""], - ["0B0C070C","","",""], - ["","0B0C130C070C1B0C","",""] - ], - [ - ["","0B0C130C070C","",""], - ["","0B0C130C070C","",""], - ["","0B0C130C070C","",""], - ["","0B0C130C070C","",""] - ], - "","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------ + "", + "", + ["", ["", "", ["0B7007700148", "", "0B7007700140"], ""], "", ""], + ["", ["", "", ["0A04120406440108", "", "0A0412040646"], ""], "", ""], + ["", ["", "", ["0B7007700148", "", "0B7007700140"], ""], "", ""], + ["", ["", "", ["0A04120406440108", "", "0A0412040646"], ""], "", ""], + ["", ["", "", "", ["0A061206066C015A", "", "0A061206066C0152"]], "", ""], + ["", ["", "", "", ["0A061206066C0159", "", ""]], "", ""], + ["", ["", "", "", ["0A061206066C0159", "", "0A061206066C0151"]], "", ""], + ["", ["", "", "", ["0A061206066C0159", "", "0A061206066C0151"]], "", ""], + "", + ["", ["", "", "", ["0A061206066C0149", "", "0A061206066C0141"]], "", ""], + "", + "", + [ + "", + ["", "0B300644", ["0B7006440128", "", ""], ["0A0606440128", "", ""]], + "", + "", + ], + [ + "", + [ + "", + "0B300646", + ["0B7006460128", "", "0B7006460120"], + ["", "", "0A0606460120"], + ], + "", + "", + ], + [ + "", + [ + "", + "0A050648", + ["0B6806480128", "", "0B6806480120"], + ["0A0606480128", "", ""], + ], + "", + "", + ], + [ + "", + [ + "", + "", + ["0A06065A0128", "", "0A06065A0120"], + ["", "", "0A06065A0120"], + ], + "", + "", + ], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + "", + "", + "", + "", + [ + "", + [ + "", + "", + ["0B70137007700148", "", "0B70137007700140"], + ["0A061206066C0148", "", "0A061206066C0140"], + ], + "", + "", + ], + [ + "", + [ + "", + "", + ["0B70137007700158", "", "0B70137007700150"], + ["0A061206066C0158", "", "0A061206066C0150"], + ], + "", + "", + ], + ["", ["", "", ["0B70137007700108", "", "0B7013700770"], ""], "", ""], + "", + "", + "", + "", + "", + ["", ["", "", "", ["0A061206066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A061206066C015A", "", "0A061206066C0152"]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A06120F066C0148", "", ""]], "", ""], + "", + "", + "", + "", + ["", ["", "", "", ["0A0F1206066C0148", "", ""]], "", ""], + ["", ["", "", ["0B70137007700108", "", "0B7013700770"], ""], "", ""], + ["", ["", "", ["0B70137007700148", "", "0B70137007700140"], ""], "", ""], + ["", ["", "", ["0B70137007700148", "", "0B70137007700140"], ""], "", ""], + ["", ["", "0B300640", ["0B7006400108", "", ""], ""], "", ""], + ["", ["", "0B300642", ["0B7006420108", "", ""], ""], "", ""], + ["", ["", ["", "", ["0B7006000108", "", ""], ""], "", ""]], + ["", ["", ["", "", ["0B7006100108", "", ""], ""], "", ""]], + ["", ["", "", ["0B70062F0108", "", "0B70063F"], ""], "", ""], + ["", ["", "", ["0B70137007700108", "", "0B7013700770"], ""], "", ""], + ["", ["", "", ["0B70137007700148", "", "0B70137007700140"], ""], "", ""], + ["", ["", "", ["0B70137007700148", "", "0B70137007700140"], ""], "", ""], + [["", "0B0C060B0180", "", ""], ""], + [["", "0B0C060B0180", "", ""], ""], + [["", "0B0C060B0180", "", ""], ""], + ["", ["", "", "0B70137007700140", ""], "", ""], + ["", ["", "", "", ["0A061206066C014A", "", ""]], "", ""], + "", + ["", ["", "", "", ["0A061206066C0148", "", ""]], "", ""], + ["", ["", "", "", ["0A061206066C0148", "", ""]], "", ""], + ["", ["", "", ["0B7007700108", "", "0B700770"], ""], "", ""], + ["", ["", "", ["0B7007700108", "", "0B700770"], ""], "", ""], + ["", ["", "", ["07700B700108", "", "07700B70"], ""], "", ""], + ["", ["", "", ["07700B700108", "", "07700B70"], ""], "", ""], + "", + ["", ["", "", ["0B70137007700108", "", "0B7013700770"], ""], "", ""], + "", + "", + [ + "", + [ + "", + ["0B30073013300124", "", "0B30064813300124"], + ["0B700770012C", "", "0B7007380124"], + ["0A06066C012C", "", "0A06065A0124"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A04073012040104", "", "0B30073013300104"], + ["0B380770010C", "", "0B7007700104"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B30073013300134", "", "0B30064813300134"], + ["0B700770013C", "", "0B7007380134"], + ["0A06066C013C", "", "0A06065A0104"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A04073012040104", "", "0B30073013300104"], + ["0B380770010C", "", "0B7007700104"], + "", + ], + "", + "", + ], + "", + "", + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040714", "", "0A0412040718"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040714", "", "0A0412040718"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040714", "", "0A0412040718"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040714", "", "0A0412040718"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + "", + ["07700B70010C", "", "07380B700104"], + ["066C0A06012C", "", "065A0A060124"], + ], + "", + "", + ], + ["", ["", "", ["07700B38010C", "", "07700B700104"], ""], "", ""], + [ + "", + [ + "", + "", + ["07700B70013C", "", "07380B700134"], + ["066C0A06013C", "", "065A0A060134"], + ], + "", + "", + ], + ["", ["", "", ["07700B38010C", "", "07700B700104"], ""], "", ""], + ["", ["", "", "", ["0A061206066C011A", "", ""]], "", ""], + "", + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040644", "", "0A0412040646"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040644", "", "0A0412040646"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040644", "", "0A0412040646"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040644", "", "0A0412040646"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + "", + "", + "", + "", + ["", ["", "", "0B70137007700140", ["0A061206066C0118", "", ""]], "", ""], + ["", ["", "", "0B70137007700140", ["0A061206066C0148", "", ""]], "", ""], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040644", "", "0A0412040646"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040644", "", "0A0412040646"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040644", "", "0A0412040646"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + [ + "", + [ + "", + ["0B3013300730", "", "0B3013300730"], + ["0B7013700770014A", "", "0B70137007700142"], + ["0A061206066C015A", "", "0A061206066C0152"], + ], + "", + "", + ], + [ + "", + [ + "", + ["0A0412040644", "", "0A0412040646"], + ["0A0412040644010A", "", "0A04120406460102"], + "", + ], + "", + "", + ], + "", + "", + "", + "", + ["", ["", "", ["0B7007700148", "", "0B7007700140"], ""], "", ""], + "", + [ + [ + ["", ["", "", "", ["060C013C", "", "060A0134"]], "", ""], + [ + "", + ["", "", ["060C013C", "", "060A0134"], ["060C013C", "", ""]], + "", + "", + ], + [ + "", + ["", "", ["060C013C", "", "070A0134"], ["060C013C", "", ""]], + "", + "", + ], + "", + ["", ["", "", "", ["060C013C", "", "060A0134"]], "", ""], + [ + "", + ["", "", ["060C013C", "", "060A0134"], ["060C013C", "", ""]], + "", + "", + ], + [ + "", + ["", "", ["060C013C", "", "060A0134"], ["060C013C", "", ""]], + "", + "", + ], + "", + ], + "", + ], + [ + [ + "", + ["", ["", "", ["060C010C", "", "060C0104"], ""], "", ""], + ["", ["", "", ["060C010C", "", "060C0104"], ""], "", ""], + "", + "", + ["", ["", "", ["060C010C", "", "060C0104"], ""], "", ""], + ["", ["", "", ["060C010C", "", "060C0104"], ""], "", ""], + "", + ], + "", + ], + [ + ["0A040648", "", "", ""], + [ + "", + "", + ["0A06066C0159", "", "0A06066C0151"], + ["0A06066C0109", "", ""], + ], + "", + "", + ], + [["0A040648", "", "", ""], ["", "", "", ["0A06066C0109", "", ""]], "", ""], + [ + ["0A040648", "", "", ""], + [ + "", + "", + ["0A06066C0159", "", "0A06066C0151"], + ["0A06066C0109", "", ""], + ], + "", + "", + ], + [ + ["0A0406482E00", "", "", ""], + [ + "", + "", + ["0A04120406440109", "", "0A04120406460101"], + ["0A06066C0109", "", ""], + ], + "", + "", + ], + [ + ["0A040648", "", "", ""], + [ + "", + "", + ["0A06066C0159", "", "0A06066C0151"], + ["0A06066C015A", "", ""], + ], + "", + "", + ], + [ + ["0A040648", "", "", ""], + [ + "", + "", + ["0A04120406440109", "", "0A04120406460101"], + ["0A06066C0148", "", ""], + ], + "", + "", + ], + "", + "", + [ + [ + ["", "", "", ["0A06060C0120", "", "0A06060C0128"]], + ["", "", "", ["060C0A060128", "", "060C0A060120"]], + "", + "", + ], + "", + ], + [ + [ + ["", "", "", ["0A06060C0130", "", "0A06060C0138"]], + ["", "", "", ["060C0A060138", "", "060C0A060130"]], + "", + "", + ], + "", + ], + "", + "", + [ + [ + ["", "", "", ["0A06060C0120", "", "0A06060C0128"]], + ["", "", "", ["060C0A060128", "", "060C0A060120"]], + "", + "", + ], + "", + ], + [ + [ + ["", "", "", ["0A06060C0130", "", "0A06060C0138"]], + ["", "", "", ["060C0A060138", "", "060C0A060130"]], + "", + "", + ], + "", + ], + "", + "", + "", + "", + "", + ["", ["0A040648", "0A040648", "", ""], "", ""], + ["", ["0A040648", "0A0412040648", "", ""], "", ""], + ["", ["0A040648", "0A0412040648", "", ""], "", ""], + ["", ["0A040648", "0A0412040648", "", ""], "", ""], + ["", ["0A040648", "0A0412040648", "", ""], "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + [ + ["0B0E070E0180", "", "", ""], + ["0B0E070E0180", "", "", ""], + "", + ["0B0C06000180", "", "", ""], + ], + [ + ["070E0B0E0180", "", "", ""], + ["070E0B0E0180", "", "", ""], + "", + ["0B0C070E0180", "", "", ""], + ], + ["", ["", "0B0C130C070C", "", ""], "", ""], + [ + "", + ["", ["", "130C070C", "", ""], "", ""], + ["", ["", "130C070C", "", ""], "", ""], + ["", ["", "130C070C", "", ""], "", ""], + "", + "", + "", + "", + ], + "", + [ + ["", "0B0C070C130C", "", ""], + "", + ["", "0B0C130C070C", "", ""], + ["", "0B0C130C070C", "", ""], + ], + [ + "", + ["0B0C070C", "", "", ""], + ["0B0C070C", "", "", ""], + ["", "0B0C130C070C1B0C", "", ""], + ], + [ + ["", "0B0C130C070C", "", ""], + ["", "0B0C130C070C", "", ""], + ["", "0B0C130C070C", "", ""], + ["", "0B0C130C070C", "", ""], + ], + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------ Three Byte operations 0F3A. ------------------------------------------------------------------------------------------------------------------------*/ - ["",["","0A05065A0C00","0B7007700C000140",""],"",""], - ["",["","0A05065A0C00","0B7007700C000140",""],"",""], - ["",["",["0B30133007300C00","",""],"",""],"",""], - ["",["","",["0B70137007700C000148","","0B70137007700C000140"],["0A061206066C0C000108","",""]],"",""], - ["",["","0B3007300C00",["0B7007700C000148","",""],""],"",""], - ["",["","0B3007300C00","0B7007700C000140",""],"",""], - ["",["","0A051205065A0C00","",""],"",""], - ["",["","","",["0A06066C0C000108","",""]],"",""], - ["",["0A0406480C00","0B3007300C00",["0B7007700C000149","",""],""],"",""], - ["",["0A0406480C00","0B3007300C00","0B7007700C000141",""],"",""], - ["",["0A0406440C00","0A04120406440C00",["0A04120406440C000109","",""],""],"",""], - ["",["0A0406460C00","0A04120406460C00","0A04120406460C000101",""],"",""], - ["",["0A0406480C00","0B30133007300C00","",""],"",""], - ["",["0A0406480C00","0B30133007300C00","",""],"",""], - ["",["0A0406480C00","0B30133007300C00","",""],"",""], - [["0A0A06A90C00","","",""],"0B70137007700C000108","",""], - "","","","", - [["","06000A040C000108","",""],["","070C0A040C000108","",""]], - [["","06020A040C000108","",""],["","070C0A040C000108","",""]], - ["",["06240A040C000108","","06360A040C00"],"",""], - ["","070C0A040C000108","",""], - ["",["","0A05120506480C00",["0B70137006480C000108","","0B70137006480C00"],""],"",""], - ["",["","06480A050C00",["06480B700C000108","","06480B700C00"],""],"",""], - ["",["","",["0A061206065A0C000108","","0A061206065A0C00"],""],"",""], - ["",["","",["065A0A060C000108","","065A0A060C00"],""],"",""], - "", - ["",["","07180B300C00",["07380B700C000109","",""],""],"",""], - ["",["","",["0A0F137007700C000148","","0A0F137007700C000140"],["0A0F1206066C0C000148","",""]],"",""], - ["",["","",["0A0F137007700C000148","","0A0F137007700C000140"],["0A0F1206066C0C000148","",""]],"",""], - ["","0A04120406200C000108","",""], - ["",["0A04120406440C000108","",""],"",""], - ["",["",["0A04120406240C00","","0A04120406360C00"],["0A04120406240C000108","","0A04120406360C00"],""],"",""], - ["",["","",["0B70137007700C000148","","0B70137007700C000140"],""],"",""], - "", - ["",["","",["0B70137007700C000148","","0B70137007700C000140"],""],"",""], - ["",["","",["0B7007700C000149","","0B7007700C000141"],["0A06066C0C000159","","0A06066C0C000151"]],"",""], - ["",["","",["0A04120406440C000109","","0A04120406460C000101"],""],"",""], - "","","","","","","","", - ["",["",["0A0F06FF0C00","","0A0F06FF0C00"],"",""],"",""], - ["",["",["0A0F06FF0C00","","0A0F06FF0C00"],"",""],"",""], - ["",["",["0A0F06FF0C00","","0A0F06FF0C00"],"",""],"",""], - ["",["",["0A0F06FF0C00","","0A0F06FF0C00"],"",""],"",""], - "","","","", - ["",["","0A05120506480C00",["0B70137006480C000108","","0B70137006480C00"],""],"",""], - ["",["","06480A050C00",["06480B700C000108","","06480B700C00"],""],"",""], - ["",["","",["0A061206065A0C000108","","0A061206065A0C00"],""],"",""], - ["",["","",["065A0A060C000108","","065A0A060C00"],""],"",""], - "","", - ["",["","0A0F063F0C00",["0A0F137007700C000108","","0A0F137007700C00"],""],"",""], - ["",["","",["0A0F137007700C000108","","0A0F137007700C00"],""],"",""], - ["",["0A0406480C00","0B30133007300C00","",""],"",""], - ["",["0A0406480C00","0A04120406480C00","",""],"",""], - ["",["0A0406480C00","0B30133007300C00",["0B70137007700C000108","",""],""],"",""], - ["",["","",["0B70137007700C000148","","0B70137007700C000140"],""],"",""], - ["",["0A0406480C00","0A04120406480C00","",""],"",""], - "", - ["",["","0A051205065A0C00","",""],"",""], - "", - ["",["",["0B301330073015300E00","","0B301330153007300E00"],"",""],"",""], - ["",["",["0B301330073015300E00","","0B301330153007300E00"],"",""],"",""], - ["",["","0B30133007301530","",""],"",""], - ["",["","0B30133007301530","",""],"",""], - ["",["","0A051205065A1505","",""],"",""], - "","","", - ["",["","",["0B70137007700C000149","","0B70137007700C000141"],""],"",""], - ["",["","",["0A04120406440C000109","","0A04120406460C000101"],""],"",""], - ["",["","","",["0A06066C0C000159","","0A06066C0C000151"]],"",""], - "", - ["",["","",["0B70137007700C000149","","0B70137007700C000141"],""],"",""], - ["",["","",["0A04120406440C000109","","0A04120406460C000101"],""],"",""], - ["",["","",["0B7007700C000149","","0B7007700C000141"],""],"",""], - ["",["","",["0A04120406440C000109","","0A04120406460C000101"],""],"",""], - "","","","", - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["0A0406480C00","0A0406480C00","",""],"",""], - ["",["0A0406480C00","0A0406480C00","",""],"",""], - ["",["0A0406480C00","0A0406480C00","",""],"",""], - ["",["0A0406480C00","0A0406480C00","",""],"",""], - "","", - ["",["","",["0A0F07700C000148","","0A0F07700C000140"],""],"",""], - ["",["","",["0A0F06440C000108","","0A0F06460C00"],""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0A04120406441530","","0A04120415300644"],"",""],"",""], - ["",["",["0A04120406461530","","0A04120415300646"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0A04120406441530","","0A04120415300644"],"",""],"",""], - ["",["",["0A04120406461530","","0A04120415300646"],"",""],"",""], - "","","","","","","","", - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0A04120406441530","","0A04120415300644"],"",""],"",""], - ["",["",["0A04120406461530","","0A04120415300646"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0B30133007301530","","0B30133015300730"],"",""],"",""], - ["",["",["0A04120406441530","","0A04120415300644"],"",""],"",""], - ["",["",["0A04120406461530","","0A04120415300646"],"",""],"",""], - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","", - [["","","","0A06066C0C000141"],["","","",["0A06066C0C000159","",""]],"",["","","","0A06066C0C000151"]], - [["","","","0A06066C0C000141"],["","","",["0A06066C0C000159","",""]],"",""], - "0A0406480C00","","","", - "","","","","","","","","","","","","","","", - ["",["0A0406480C00","0A0406480C00","",""],"",""], - "","","","","","", - ["","","",["","","","0A06066C0C000151"]], - "","","","","","","","","", - ["","","",["","0B0C070C0C00","",""]], - "","","","","","","","","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------ + ["", ["", "0A05065A0C00", "0B7007700C000140", ""], "", ""], + ["", ["", "0A05065A0C00", "0B7007700C000140", ""], "", ""], + ["", ["", ["0B30133007300C00", "", ""], "", ""], "", ""], + [ + "", + [ + "", + "", + ["0B70137007700C000148", "", "0B70137007700C000140"], + ["0A061206066C0C000108", "", ""], + ], + "", + "", + ], + ["", ["", "0B3007300C00", ["0B7007700C000148", "", ""], ""], "", ""], + ["", ["", "0B3007300C00", "0B7007700C000140", ""], "", ""], + ["", ["", "0A051205065A0C00", "", ""], "", ""], + ["", ["", "", "", ["0A06066C0C000108", "", ""]], "", ""], + [ + "", + ["0A0406480C00", "0B3007300C00", ["0B7007700C000149", "", ""], ""], + "", + "", + ], + ["", ["0A0406480C00", "0B3007300C00", "0B7007700C000141", ""], "", ""], + [ + "", + [ + "0A0406440C00", + "0A04120406440C00", + ["0A04120406440C000109", "", ""], + "", + ], + "", + "", + ], + [ + "", + ["0A0406460C00", "0A04120406460C00", "0A04120406460C000101", ""], + "", + "", + ], + ["", ["0A0406480C00", "0B30133007300C00", "", ""], "", ""], + ["", ["0A0406480C00", "0B30133007300C00", "", ""], "", ""], + ["", ["0A0406480C00", "0B30133007300C00", "", ""], "", ""], + [["0A0A06A90C00", "", "", ""], "0B70137007700C000108", "", ""], + "", + "", + "", + "", + [ + ["", "06000A040C000108", "", ""], + ["", "070C0A040C000108", "", ""], + ], + [ + ["", "06020A040C000108", "", ""], + ["", "070C0A040C000108", "", ""], + ], + ["", ["06240A040C000108", "", "06360A040C00"], "", ""], + ["", "070C0A040C000108", "", ""], + [ + "", + [ + "", + "0A05120506480C00", + ["0B70137006480C000108", "", "0B70137006480C00"], + "", + ], + "", + "", + ], + [ + "", + ["", "06480A050C00", ["06480B700C000108", "", "06480B700C00"], ""], + "", + "", + ], + [ + "", + ["", "", ["0A061206065A0C000108", "", "0A061206065A0C00"], ""], + "", + "", + ], + ["", ["", "", ["065A0A060C000108", "", "065A0A060C00"], ""], "", ""], + "", + ["", ["", "07180B300C00", ["07380B700C000109", "", ""], ""], "", ""], + [ + "", + [ + "", + "", + ["0A0F137007700C000148", "", "0A0F137007700C000140"], + ["0A0F1206066C0C000148", "", ""], + ], + "", + "", + ], + [ + "", + [ + "", + "", + ["0A0F137007700C000148", "", "0A0F137007700C000140"], + ["0A0F1206066C0C000148", "", ""], + ], + "", + "", + ], + ["", "0A04120406200C000108", "", ""], + ["", ["0A04120406440C000108", "", ""], "", ""], + [ + "", + [ + "", + ["0A04120406240C00", "", "0A04120406360C00"], + ["0A04120406240C000108", "", "0A04120406360C00"], + "", + ], + "", + "", + ], + [ + "", + ["", "", ["0B70137007700C000148", "", "0B70137007700C000140"], ""], + "", + "", + ], + "", + [ + "", + ["", "", ["0B70137007700C000148", "", "0B70137007700C000140"], ""], + "", + "", + ], + [ + "", + [ + "", + "", + ["0B7007700C000149", "", "0B7007700C000141"], + ["0A06066C0C000159", "", "0A06066C0C000151"], + ], + "", + "", + ], + [ + "", + ["", "", ["0A04120406440C000109", "", "0A04120406460C000101"], ""], + "", + "", + ], + "", + "", + "", + "", + "", + "", + "", + "", + ["", ["", ["0A0F06FF0C00", "", "0A0F06FF0C00"], "", ""], "", ""], + ["", ["", ["0A0F06FF0C00", "", "0A0F06FF0C00"], "", ""], "", ""], + ["", ["", ["0A0F06FF0C00", "", "0A0F06FF0C00"], "", ""], "", ""], + ["", ["", ["0A0F06FF0C00", "", "0A0F06FF0C00"], "", ""], "", ""], + "", + "", + "", + "", + [ + "", + [ + "", + "0A05120506480C00", + ["0B70137006480C000108", "", "0B70137006480C00"], + "", + ], + "", + "", + ], + [ + "", + ["", "06480A050C00", ["06480B700C000108", "", "06480B700C00"], ""], + "", + "", + ], + [ + "", + ["", "", ["0A061206065A0C000108", "", "0A061206065A0C00"], ""], + "", + "", + ], + ["", ["", "", ["065A0A060C000108", "", "065A0A060C00"], ""], "", ""], + "", + "", + [ + "", + [ + "", + "0A0F063F0C00", + ["0A0F137007700C000108", "", "0A0F137007700C00"], + "", + ], + "", + "", + ], + [ + "", + ["", "", ["0A0F137007700C000108", "", "0A0F137007700C00"], ""], + "", + "", + ], + ["", ["0A0406480C00", "0B30133007300C00", "", ""], "", ""], + ["", ["0A0406480C00", "0A04120406480C00", "", ""], "", ""], + [ + "", + [ + "0A0406480C00", + "0B30133007300C00", + ["0B70137007700C000108", "", ""], + "", + ], + "", + "", + ], + [ + "", + ["", "", ["0B70137007700C000148", "", "0B70137007700C000140"], ""], + "", + "", + ], + ["", ["0A0406480C00", "0A04120406480C00", "", ""], "", ""], + "", + ["", ["", "0A051205065A0C00", "", ""], "", ""], + "", + [ + "", + ["", ["0B301330073015300E00", "", "0B301330153007300E00"], "", ""], + "", + "", + ], + [ + "", + ["", ["0B301330073015300E00", "", "0B301330153007300E00"], "", ""], + "", + "", + ], + ["", ["", "0B30133007301530", "", ""], "", ""], + ["", ["", "0B30133007301530", "", ""], "", ""], + ["", ["", "0A051205065A1505", "", ""], "", ""], + "", + "", + "", + [ + "", + ["", "", ["0B70137007700C000149", "", "0B70137007700C000141"], ""], + "", + "", + ], + [ + "", + ["", "", ["0A04120406440C000109", "", "0A04120406460C000101"], ""], + "", + "", + ], + ["", ["", "", "", ["0A06066C0C000159", "", "0A06066C0C000151"]], "", ""], + "", + [ + "", + ["", "", ["0B70137007700C000149", "", "0B70137007700C000141"], ""], + "", + "", + ], + [ + "", + ["", "", ["0A04120406440C000109", "", "0A04120406460C000101"], ""], + "", + "", + ], + ["", ["", "", ["0B7007700C000149", "", "0B7007700C000141"], ""], "", ""], + [ + "", + ["", "", ["0A04120406440C000109", "", "0A04120406460C000101"], ""], + "", + "", + ], + "", + "", + "", + "", + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["0A0406480C00", "0A0406480C00", "", ""], "", ""], + ["", ["0A0406480C00", "0A0406480C00", "", ""], "", ""], + ["", ["0A0406480C00", "0A0406480C00", "", ""], "", ""], + ["", ["0A0406480C00", "0A0406480C00", "", ""], "", ""], + "", + "", + ["", ["", "", ["0A0F07700C000148", "", "0A0F07700C000140"], ""], "", ""], + ["", ["", "", ["0A0F06440C000108", "", "0A0F06460C00"], ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0A04120406441530", "", "0A04120415300644"], "", ""], "", ""], + ["", ["", ["0A04120406461530", "", "0A04120415300646"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0A04120406441530", "", "0A04120415300644"], "", ""], "", ""], + ["", ["", ["0A04120406461530", "", "0A04120415300646"], "", ""], "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0A04120406441530", "", "0A04120415300644"], "", ""], "", ""], + ["", ["", ["0A04120406461530", "", "0A04120415300646"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0B30133007301530", "", "0B30133015300730"], "", ""], "", ""], + ["", ["", ["0A04120406441530", "", "0A04120415300644"], "", ""], "", ""], + ["", ["", ["0A04120406461530", "", "0A04120415300646"], "", ""], "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + [ + ["", "", "", "0A06066C0C000141"], + ["", "", "", ["0A06066C0C000159", "", ""]], + "", + ["", "", "", "0A06066C0C000151"], + ], + [ + ["", "", "", "0A06066C0C000141"], + ["", "", "", ["0A06066C0C000159", "", ""]], + "", + "", + ], + "0A0406480C00", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ["", ["0A0406480C00", "0A0406480C00", "", ""], "", ""], + "", + "", + "", + "", + "", + "", + ["", "", "", ["", "", "", "0A06066C0C000151"]], + "", + "", + "", + "", + "", + "", + "", + "", + "", + ["", "", "", ["", "0B0C070C0C00", "", ""]], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP 8. ------------------------------------------------------------------------------------------------------------------------*/ - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","", - "0A04120406481404","0A04120406481404","0A04120406481404","","","","","","", - "0A04120406481404","0A04120406481404","","","","","","0A04120406481404","0A04120406481404","0A04120406481404", - "","","","","","","0A04120406481404","0A04120406481404", - "","",["0B30133007301530","","0B30133015300730"],["0A04120406481404","","0A04120414040648"],"","","0A04120406481404", - "","","","","","","","","","","","","","","", - "0A04120406481404","","","","","","","","","","0A0406480C00","0A0406480C00","0A0406480C00","0A0406480C00", - "","","","","","","","", - "0A04120406480C00","0A04120406480C00","0A04120406480C00","0A04120406480C00", - "","","","","","","","","","","","","","","","","","","","","","","","","","","","", - "0A04120406480C00","0A04120406480C00","0A04120406480C00","0A04120406480C00", - "","","","","","","","","","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A04120406481404", + "0A04120406481404", + "0A04120406481404", + "", + "", + "", + "", + "", + "", + "0A04120406481404", + "0A04120406481404", + "", + "", + "", + "", + "", + "0A04120406481404", + "0A04120406481404", + "0A04120406481404", + "", + "", + "", + "", + "", + "", + "0A04120406481404", + "0A04120406481404", + "", + "", + ["0B30133007301530", "", "0B30133015300730"], + ["0A04120406481404", "", "0A04120414040648"], + "", + "", + "0A04120406481404", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A04120406481404", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A0406480C00", + "0A0406480C00", + "0A0406480C00", + "0A0406480C00", + "", + "", + "", + "", + "", + "", + "", + "", + "0A04120406480C00", + "0A04120406480C00", + "0A04120406480C00", + "0A04120406480C00", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A04120406480C00", + "0A04120406480C00", + "0A04120406480C00", + "0A04120406480C00", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP 9. ------------------------------------------------------------------------------------------------------------------------*/ - "", - ["","130C070C","130C070C","130C070C","130C070C","130C070C","130C070C","130C070C"], - ["","130C070C","","","","","130C070C",""], - "","","","","","","","","","","","","","","", - ["",["070C","070C","","","","","",""]], - "","","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "0B300730","0B300730","0B300730","0B300730", - "","","","","","","","","","","","", - ["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"], - ["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"], - ["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"],["0A0406481204","","0A0412040648"], - "","","","","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","","","", - "0A040648","0A040648","0A040648","","","0A040648","0A040648","","","","0A040648","","","","","", - "0A040648","0A040648","0A040648","","","0A040648","0A040648","","","","0A040648","","","","","", - "0A040648","0A040648","0A040648","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------ + "", + [ + "", + "130C070C", + "130C070C", + "130C070C", + "130C070C", + "130C070C", + "130C070C", + "130C070C", + ], + ["", "130C070C", "", "", "", "", "130C070C", ""], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ["", ["070C", "070C", "", "", "", "", "", ""]], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0B300730", + "0B300730", + "0B300730", + "0B300730", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + ["0A0406481204", "", "0A0412040648"], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A040648", + "0A040648", + "0A040648", + "", + "", + "0A040648", + "0A040648", + "", + "", + "", + "0A040648", + "", + "", + "", + "", + "", + "0A040648", + "0A040648", + "0A040648", + "", + "", + "0A040648", + "0A040648", + "", + "", + "", + "0A040648", + "", + "", + "", + "", + "", + "0A040648", + "0A040648", + "0A040648", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------ AMD XOP A. ------------------------------------------------------------------------------------------------------------------------*/ - "","","","","","","","","","","","","","","","", - "0B0C070C0C020180","",["130C06240C020180","130C06240C020180","","","","","",""], - "","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------- + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0B0C070C0C020180", + "", + ["130C06240C020180", "130C06240C020180", "", "", "", "", "", ""], + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------- L1OM Vector. -------------------------------------------------------------------------------------------------------------------------*/ - "","","","","1206","","","","","","","","","","","", - [["0A0606610120","0A0606610120","",""],""],"", - [["0A0606610120","0A0606610120","",""],""], - [["0A0606610120","0A0606610120","",""],""], - [["0A0606610100","0A0606610100","",""],""],"", - [["0A0606610100","0A0606610100","",""],""], - [["0A0606610100","0A0606610100","",""],""], - ["0A06066C0124",""],["066C0124",""],"",["066C0124",""], - ["066C0A060104",""],["066C0104",""],"",["066C0104",""], - ["0A0F120606610150","0A0F120606610150","",""],"0A0F120606610140","0A0F120606610140","", - ["0A0F120606610150","0A0F120606610150","",""],"0A0F120606610140","0A0F120606610140","", - "","","","","","","","", - "0A0F120606610140","","","","","","","","","","","","","","","", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","","0A06120F06610140","","0A06120F06610140","0A06120606610150","0A06120606610140", - ["0A06120606610150","0A06120606610150","",""],"","","","","","","", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","","0A06120F06610140","","0A06120F06610140","","", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","","0A06120F06610140","","0A06120F06610140","","", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - "0A06120606610150","0A06120606610140", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"","","", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"","","", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","0A06120606610140","0A06120606610140","","","0A06120606610150","0A06120606610140", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","0A06120606610140","", - ["0A06120606610150","0A06120606610150","",""],"0A06120606610140","0A06120606610140","", - ["","0A0606610152","",""],["0A0606610153","0A0606610152","",""],["0A0606610153","0A0606610152","",""],"", - ["","0A0606610158","",""],["0A0606610141","0A0606610148","",""],["0A0606610141","0A0606610148","",""],"", - "0A0606610153","","0A0606610150","0A0606610152","","0A0606610150","0A0606610150","", - "0A06120606610140","0A06120606610140","0A06120606610140","", - ["0A06120606610140","0A06120606610140","",""],["0A06120606610140","0A06120606610140","",""], - ["0A06120606610140","0A06120606610140","",""],["0A06120606610140","0A06120606610140","",""], - "0A06120606610140","0A06120606610140","","","","","","", - "0A0606610140","0A0606610150","0A0606610150","","0A0606610150","","","", - "0A06120606610140","","","","","","","", - "0A0606610150","","0A06120606610150","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "0A0606610C010150","0A0606610C000C00","0A06120606610C010140","0A0606610C010140","","","","", - "","","","","","","","", - /*------------------------------------------------------------------------------------------------------------------------- + "", + "", + "", + "", + "1206", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + [["0A0606610120", "0A0606610120", "", ""], ""], + "", + [["0A0606610120", "0A0606610120", "", ""], ""], + [["0A0606610120", "0A0606610120", "", ""], ""], + [["0A0606610100", "0A0606610100", "", ""], ""], + "", + [["0A0606610100", "0A0606610100", "", ""], ""], + [["0A0606610100", "0A0606610100", "", ""], ""], + ["0A06066C0124", ""], + ["066C0124", ""], + "", + ["066C0124", ""], + ["066C0A060104", ""], + ["066C0104", ""], + "", + ["066C0104", ""], + ["0A0F120606610150", "0A0F120606610150", "", ""], + "0A0F120606610140", + "0A0F120606610140", + "", + ["0A0F120606610150", "0A0F120606610150", "", ""], + "0A0F120606610140", + "0A0F120606610140", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A0F120606610140", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "", + "0A06120F06610140", + "", + "0A06120F06610140", + "0A06120606610150", + "0A06120606610140", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + "", + "", + "", + "", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "", + "0A06120F06610140", + "", + "0A06120F06610140", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "", + "0A06120F06610140", + "", + "0A06120F06610140", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + "0A06120606610150", + "0A06120606610140", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + "", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "0A06120606610140", + "0A06120606610140", + "", + "", + "0A06120606610150", + "0A06120606610140", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "0A06120606610140", + "", + ["0A06120606610150", "0A06120606610150", "", ""], + "0A06120606610140", + "0A06120606610140", + "", + ["", "0A0606610152", "", ""], + ["0A0606610153", "0A0606610152", "", ""], + ["0A0606610153", "0A0606610152", "", ""], + "", + ["", "0A0606610158", "", ""], + ["0A0606610141", "0A0606610148", "", ""], + ["0A0606610141", "0A0606610148", "", ""], + "", + "0A0606610153", + "", + "0A0606610150", + "0A0606610152", + "", + "0A0606610150", + "0A0606610150", + "", + "0A06120606610140", + "0A06120606610140", + "0A06120606610140", + "", + ["0A06120606610140", "0A06120606610140", "", ""], + ["0A06120606610140", "0A06120606610140", "", ""], + ["0A06120606610140", "0A06120606610140", "", ""], + ["0A06120606610140", "0A06120606610140", "", ""], + "0A06120606610140", + "0A06120606610140", + "", + "", + "", + "", + "", + "", + "0A0606610140", + "0A0606610150", + "0A0606610150", + "", + "0A0606610150", + "", + "", + "", + "0A06120606610140", + "", + "", + "", + "", + "", + "", + "", + "0A0606610150", + "", + "0A06120606610150", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "0A0606610C010150", + "0A0606610C000C00", + "0A06120606610C010140", + "0A0606610C010140", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + /*------------------------------------------------------------------------------------------------------------------------- L1OM Mask, Mem, and bit opcodes. -------------------------------------------------------------------------------------------------------------------------*/ - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"], - ["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"],["","0B0E070E0C010C000C00"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - ["","0B0E070E"],["","0B0E070E"],["","0B0E070E"],["","0B0E070E"], - "","","","", - "06FF0A0F", - [["0601","0601","0604","0604","","","",""],""], - [["0601","0601","","","","","",""],""], - [["0601","0601","","","","","",""],""], - "06FF0A0F","06FF0B06","07060A0F","06FF0B06", - "06FF0A0F","06FF0A0F","06FF0A0F","06FF0A0F", - "06FF0A0F","06FF0A0F","06FF0A0F","06FF0A0F", - "","06FF0A0F", - ["",["0B07","0B07","","","","","",""]], - ["",["0B07","0B07","","","","","",""]] + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E0C010C000C00"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + ["", "0B0E070E"], + "", + "", + "", + "", + "06FF0A0F", + [["0601", "0601", "0604", "0604", "", "", "", ""], ""], + [["0601", "0601", "", "", "", "", "", ""], ""], + [["0601", "0601", "", "", "", "", "", ""], ""], + "06FF0A0F", + "06FF0B06", + "07060A0F", + "06FF0B06", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "06FF0A0F", + "", + "06FF0A0F", + ["", ["0B07", "0B07", "", "", "", "", "", ""]], + ["", ["0B07", "0B07", "", "", "", "", "", ""]], ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2464,22 +7825,262 @@ compared for if the operation code is 0x10F then the next byte is read and is us -------------------------------------------------------------------------------------------------------------------------*/ const M3DNow = [ - "","","","","","","","","","","","","PI2FW","PI2FD","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","PFNACC","","","","PFPNACC","", - "PFCMPGE","","","","PFMIN","","PFRCP","PFRSQRT","","","FPSUB","","","","FPADD","", - "PFCMPGT","","","","PFMAX","","PFRCPIT1","PFRSQIT1","","","PFSUBR","","","","PFACC","", - "PFCMPEQ","","","","PFMUL","","PFRCPIT2","PMULHRW","","","","PSWAPD","","","","PAVGUSB", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","", - "","","","","","","","","","","","","","","","" + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "PI2FW", + "PI2FD", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "PFNACC", + "", + "", + "", + "PFPNACC", + "", + "PFCMPGE", + "", + "", + "", + "PFMIN", + "", + "PFRCP", + "PFRSQRT", + "", + "", + "FPSUB", + "", + "", + "", + "FPADD", + "", + "PFCMPGT", + "", + "", + "", + "PFMAX", + "", + "PFRCPIT1", + "PFRSQIT1", + "", + "", + "PFSUBR", + "", + "", + "", + "PFACC", + "", + "PFCMPEQ", + "", + "", + "", + "PFMUL", + "", + "PFRCPIT2", + "PMULHRW", + "", + "", + "", + "PSWAPD", + "", + "", + "", + "PAVGUSB", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2500,11 +8101,31 @@ link to the patent https://www.google.com/patents/US7552426 -------------------------------------------------------------------------------------------------------------------------*/ const MSynthetic = [ - "VMGETINFO","VMSETINFO","VMDXDSBL","VMDXENBL","", - "VMCPUID","VMHLT","VMSPLAF","","", - "VMPUSHFD","VMPOPFD","VMCLI","VMSTI","VMIRETD", - "VMSGDT","VMSIDT","VMSLDT","VMSTR","", - "VMSDTE","","","","" + "VMGETINFO", + "VMSETINFO", + "VMDXDSBL", + "VMDXENBL", + "", + "VMCPUID", + "VMHLT", + "VMSPLAF", + "", + "", + "VMPUSHFD", + "VMPOPFD", + "VMCLI", + "VMSTI", + "VMIRETD", + "VMSGDT", + "VMSIDT", + "VMSLDT", + "VMSTR", + "", + "VMSDTE", + "", + "", + "", + "", ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2513,11 +8134,46 @@ XOP condition codes map differently. -------------------------------------------------------------------------------------------------------------------------*/ const ConditionCodes = [ - "EQ","LT","LE","UNORD","NEQ","NLT","NLE","ORD", //SSE/L1OM/MVEX. - "EQ_UQ","NGE","NGT","FALSE","NEQ_OQ","GE","GT","TRUE", //VEX/EVEX. - "EQ_OS","LT_OQ","LE_OQ","UNORD_S","NEQ_US","NLT_UQ","NLE_UQ","ORD_S", //VEX/EVEX. - "EQ_US","NGE_UQ","NGT_UQ","FALSE_OS","NEQ_OS","GE_OQ","GT_OQ","TRUE_US", //VEX/EVEX. - "LT","LE","GT","GE","EQ","NEQ","FALSE","TRUE" //XOP. + "EQ", + "LT", + "LE", + "UNORD", + "NEQ", + "NLT", + "NLE", + "ORD", //SSE/L1OM/MVEX. + "EQ_UQ", + "NGE", + "NGT", + "FALSE", + "NEQ_OQ", + "GE", + "GT", + "TRUE", //VEX/EVEX. + "EQ_OS", + "LT_OQ", + "LE_OQ", + "UNORD_S", + "NEQ_US", + "NLT_UQ", + "NLE_UQ", + "ORD_S", //VEX/EVEX. + "EQ_US", + "NGE_UQ", + "NGT_UQ", + "FALSE_OS", + "NEQ_OS", + "GE_OQ", + "GT_OQ", + "TRUE_US", //VEX/EVEX. + "LT", + "LE", + "GT", + "GE", + "EQ", + "NEQ", + "FALSE", + "TRUE", //XOP. ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2543,31 +8199,30 @@ Used by function ^DecodeOperandString()^ Which sets the operands active and give The following X86 patent link might help http://www.google.com/patents/US7640417 -------------------------------------------------------------------------------------------------------------------------*/ -var Operand = function(){ - return( - { - Type:0, //The operand type some operands have different formats like DecodeImmediate() which has a type input. - BySizeAttrubute:false, //Effects how size is used depends on which operand type for which operand across the decoder array. - /*------------------------------------------------------------------------------------------------------------------------- +var Operand = function () { + return { + Type: 0, //The operand type some operands have different formats like DecodeImmediate() which has a type input. + BySizeAttrubute: false, //Effects how size is used depends on which operand type for which operand across the decoder array. + /*------------------------------------------------------------------------------------------------------------------------- How Size is used depends on the operand it is along the decoder array for which function it uses to decode Like DecodeRegValue(), or Decode_ModRM_SIB_Address(), and lastly DecodeImmediate() as they all take the BySize. -------------------------------------------------------------------------------------------------------------------------*/ - Size:0x00, //The Setting. - OperandNum:0, //The operand number basically the order each operand is read in the operand string. - Active:false, //This is set by the set function not all operand are used across the decoder array. - //set the operands attributes then set it active in the decoder array. - set:function(T, BySize, Settings, OperandNumber) - { - this.Type = T; - this.BySizeAttrubute = BySize; - this.Size = Settings; - this.OpNum = OperandNumber; //Give the operand the number it was read in the operand string. - this.Active = true; //set the operand active so it's settings are decoded by the ^DecodeOperands()^ function. - }, - //Deactivates the operand after they are decoded by the ^DecodeOperands()^ function. - Deactivate:function(){ this.Active = false; } - } - ); + Size: 0x00, //The Setting. + OperandNum: 0, //The operand number basically the order each operand is read in the operand string. + Active: false, //This is set by the set function not all operand are used across the decoder array. + //set the operands attributes then set it active in the decoder array. + set: function (T, BySize, Settings, OperandNumber) { + this.Type = T; + this.BySizeAttrubute = BySize; + this.Size = Settings; + this.OpNum = OperandNumber; //Give the operand the number it was read in the operand string. + this.Active = true; //set the operand active so it's settings are decoded by the ^DecodeOperands()^ function. + }, + //Deactivates the operand after they are decoded by the ^DecodeOperands()^ function. + Deactivate: function () { + this.Active = false; + }, + }; }; /*------------------------------------------------------------------------------------------------------------------------- @@ -2583,60 +8238,60 @@ Used by functions ^DecodeOperandString()^, and ^DecodeOperands()^, after functio -------------------------------------------------------------------------------------------------------------------------*/ var X86Decoder = [ - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- First operand that is always decoded is "Reg Opcode" if used. Uses the function ^DecodeRegValue()^ the input RValue is the three first bits of the opcode. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Reg Opcode if used. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //Reg Opcode if used. + /*------------------------------------------------------------------------------------------------------------------------- The Second operand that is decoded in series is the ModR/M address if used. Reads a byte using function ^Decode_ModRM_SIB_Value()^ gives it to the function ^Decode_ModRM_SIB_Address()^ which only reads the Mode, and Base register for the address, and then decodes the SIB byte if base register is "100" binary in value. does not use the Register value in the ModR/M because the register can also be used as a group opcode used by the function ^DecodeOpcode()^, or uses a different register in single size with a different address pointer. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //ModR/M address if used. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //ModR/M address if used. + /*------------------------------------------------------------------------------------------------------------------------- The third operand that is decoded if used is for the ModR/M reg bits. Uses the already decoded byte from ^Decode_ModRM_SIB_Value()^ gives the three bit reg value to the function ^DecodeRegValue()^. The ModR/M address, and reg are usually used together, but can also change direction in the encoding string. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //ModR/M reg bits if used. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //ModR/M reg bits if used. + /*------------------------------------------------------------------------------------------------------------------------- The fourth operand that is decoded in sequence is the first Immediate input if used. The function ^DecodeImmediate()^ starts reading bytes as a number for input to instruction. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //First Immediate if used. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //First Immediate if used. + /*------------------------------------------------------------------------------------------------------------------------- The fifth operand that is decoded in sequence is the second Immediate input if used. The function ^DecodeImmediate()^ starts reading bytes as a number for input to instruction. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Second Immediate if used (Note that the instruction "Enter" uses two immediate inputs). - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //Second Immediate if used (Note that the instruction "Enter" uses two immediate inputs). + /*------------------------------------------------------------------------------------------------------------------------- The sixth operand that is decoded in sequence is the third Immediate input if used. The function ^DecodeImmediate()^ starts reading bytes as a number for input to instruction. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Third Immediate if used (Note that the Larrabee vector instructions can use three immediate inputs). - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //Third Immediate if used (Note that the Larrabee vector instructions can use three immediate inputs). + /*------------------------------------------------------------------------------------------------------------------------- Vector adjustment codes allow the selection of the vector register value that is stored into variable VectorRegister that applies to the selected SSE instruction that is read after that uses it. The adjusted vector value is given to the function ^DecodeRegValue()^. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Vector register if used. And if vector adjustments are applied to the SSE instruction. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //Vector register if used. And if vector adjustments are applied to the SSE instruction. + /*------------------------------------------------------------------------------------------------------------------------- Immediate Register encoding if used. During the decoding of the immediate operands the ^DecodeImmediate()^ function stores the read IMM into an variable called IMMValue. The upper four bits of IMMValue is given to the input RValue to the function ^DecodeRegValue()^. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Immediate Register encoding if used. - /*------------------------------------------------------------------------------------------------------------------------- + new Operand(), //Immediate Register encoding if used. + /*------------------------------------------------------------------------------------------------------------------------- It does not matter which order the explicit operands decode as they do not require reading another byte after the opcode. Explicit operands are selected internally in the cpu for instruction codes that only use one register, or pointer, or number input. -------------------------------------------------------------------------------------------------------------------------*/ - new Operand(), //Explicit Operand one. - new Operand(), //Explicit Operand two. - new Operand(), //Explicit Operand three. - new Operand() //Explicit Operand four. + new Operand(), //Explicit Operand one. + new Operand(), //Explicit Operand two. + new Operand(), //Explicit Operand three. + new Operand(), //Explicit Operand four. ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2867,19 +8522,47 @@ Some instructions use SAE which suppresses all errors, but if an instruction use -------------------------------------------------------------------------------------------------------------------------*/ const RoundModes = [ - "","","","","","","","", //First 8 No rounding mode. - /*------------------------------------------------------------------------------------------------------------------------- + "", + "", + "", + "", + "", + "", + "", + "", //First 8 No rounding mode. + /*------------------------------------------------------------------------------------------------------------------------- MVEX/EVEX round Modes {SAE} Note MVEX (1xx) must be set 4 or higher, while EVEX uses upper 4 in rounding mode by vector length. -------------------------------------------------------------------------------------------------------------------------*/ - ", {Error}", ", {Error}", ", {Error}", ", {Error}", ", {SAE}", ", {SAE}", ", {SAE}", ", {SAE}", - /*------------------------------------------------------------------------------------------------------------------------- + ", {Error}", + ", {Error}", + ", {Error}", + ", {Error}", + ", {SAE}", + ", {SAE}", + ", {SAE}", + ", {SAE}", + /*------------------------------------------------------------------------------------------------------------------------- L1OM/MVEX/EVEX round modes {ER}. L1OM uses the first 4, and EVEX uses the upper 4, while MVEX can use all 8. -------------------------------------------------------------------------------------------------------------------------*/ - ", {RN}", ", {RD}", ", {RU}", ", {RZ}", ", {RN-SAE}", ", {RD-SAE}", ", {RU-SAE}", ", {RZ-SAE}", - /*------------------------------------------------------------------------------------------------------------------------- + ", {RN}", + ", {RD}", + ", {RU}", + ", {RZ}", + ", {RN-SAE}", + ", {RD-SAE}", + ", {RU-SAE}", + ", {RZ-SAE}", + /*------------------------------------------------------------------------------------------------------------------------- MVEX/EVEX round modes {SAE}, {ER} Both rounding modes can not possibly be set both at the same time. -------------------------------------------------------------------------------------------------------------------------*/ - "0B", "4B", "5B", "8B", "16B", "24B", "31B", "32B" //L1OM exponent adjustments. + "0B", + "4B", + "5B", + "8B", + "16B", + "24B", + "31B", + "32B", //L1OM exponent adjustments. ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -2887,7 +8570,17 @@ L1OM/MVEX register swizzle modes. When an swizzle operation is done register to Note L1OM skips swizzle type DACB thus the last swizzle type is an repeat of the DACB as the last L1OM swizzle. -------------------------------------------------------------------------------------------------------------------------*/ -const RegSwizzleModes = [ "", "CDAB", "BADC", "DACB", "AAAA", "BBBB", "CCCC", "DDDD", "DACB" ]; +const RegSwizzleModes = [ + "", + "CDAB", + "BADC", + "DACB", + "AAAA", + "BBBB", + "CCCC", + "DDDD", + "DACB", +]; /*------------------------------------------------------------------------------------------------------------------------- EVEX does not support conversion modes. Only broadcast round of 1To16, or 1To8 controlled by the data size. @@ -2910,58 +8603,92 @@ Lastly the elements are in order to the "CCCCC" value, and "SSS" value times 2, -------------------------------------------------------------------------------------------------------------------------*/ const ConversionModes = [ - //------------------------------------------------------------------------ - "", "", //Not used. - //------------------------------------------------------------------------ - "1To16", "1To8", //Settable as L1OM.sss/MVEX.sss = 001. Settable using EVEX broadcast round. - "4To16", "4To8", //Settable as L1OM.sss/MVEX.sss = 010. Settable using EVEX broadcast round. - //------------------------------------------------------------------------ - "Float16", "Error", //Settable as "MVEX.sss = 011", and "L1OM.sss = 110 , L1OM.CCCCC = 00001". - //------------------------------------------------------------------------ - "Float16RZ", "Error", //Settable only as L1OM.CCCCC = 00010. - //------------------------------------------------------------------------ - "SRGB8", "Error", //Settable only as L1OM.CCCCC = 00011. - /*------------------------------------------------------------------------ + //------------------------------------------------------------------------ + "", + "", //Not used. + //------------------------------------------------------------------------ + "1To16", + "1To8", //Settable as L1OM.sss/MVEX.sss = 001. Settable using EVEX broadcast round. + "4To16", + "4To8", //Settable as L1OM.sss/MVEX.sss = 010. Settable using EVEX broadcast round. + //------------------------------------------------------------------------ + "Float16", + "Error", //Settable as "MVEX.sss = 011", and "L1OM.sss = 110 , L1OM.CCCCC = 00001". + //------------------------------------------------------------------------ + "Float16RZ", + "Error", //Settable only as L1OM.CCCCC = 00010. + //------------------------------------------------------------------------ + "SRGB8", + "Error", //Settable only as L1OM.CCCCC = 00011. + /*------------------------------------------------------------------------ MVEX/L1OM Up conversion, and down conversion types. ------------------------------------------------------------------------*/ - "UInt8", "Error", //Settable as L1OM.sss/MVEX.sss = 100, and L1OM.CCCCC = 00100. - "SInt8", "Error", //Settable as L1OM.sss/MVEX.sss = 101, and L1OM.CCCCC = 00101. - //------------------------------------------------------------------------ - "UNorm8", "Error", //Settable as L1OM.sss = 101, or L1OM.CCCCC = 00110. - "SNorm8", "Error", //Settable as L1OM.CCCCC = 00111. - //------------------------------------------------------------------------ - "UInt16", "Error", //Settable as L1OM.sss/MVEX.sss = 110, and L1OM.CCCCC = 01000 - "SInt16", "Error", //Settable as L1OM.sss/MVEX.sss = 111, and L1OM.CCCCC = 01001 - //------------------------------------------------------------------------ - "UNorm16", "Error", //Settable as L1OM.CCCCC = 01010. - "SNorm16", "Error", //Settable as L1OM.CCCCC = 01011. - "UInt8I", "Error", //Settable as L1OM.CCCCC = 01100. - "SInt8I", "Error", //Settable as L1OM.CCCCC = 01101. - "UInt16I", "Error", //Settable as L1OM.CCCCC = 01110. - "SInt16I", "Error", //Settable as L1OM.CCCCC = 01111. - /*------------------------------------------------------------------------ + "UInt8", + "Error", //Settable as L1OM.sss/MVEX.sss = 100, and L1OM.CCCCC = 00100. + "SInt8", + "Error", //Settable as L1OM.sss/MVEX.sss = 101, and L1OM.CCCCC = 00101. + //------------------------------------------------------------------------ + "UNorm8", + "Error", //Settable as L1OM.sss = 101, or L1OM.CCCCC = 00110. + "SNorm8", + "Error", //Settable as L1OM.CCCCC = 00111. + //------------------------------------------------------------------------ + "UInt16", + "Error", //Settable as L1OM.sss/MVEX.sss = 110, and L1OM.CCCCC = 01000 + "SInt16", + "Error", //Settable as L1OM.sss/MVEX.sss = 111, and L1OM.CCCCC = 01001 + //------------------------------------------------------------------------ + "UNorm16", + "Error", //Settable as L1OM.CCCCC = 01010. + "SNorm16", + "Error", //Settable as L1OM.CCCCC = 01011. + "UInt8I", + "Error", //Settable as L1OM.CCCCC = 01100. + "SInt8I", + "Error", //Settable as L1OM.CCCCC = 01101. + "UInt16I", + "Error", //Settable as L1OM.CCCCC = 01110. + "SInt16I", + "Error", //Settable as L1OM.CCCCC = 01111. + /*------------------------------------------------------------------------ L1OM Up conversion, and field conversion. ------------------------------------------------------------------------*/ - "UNorm10A", "Error", //Settable as L1OM.CCCCC = 10000. Also Usable as Integer Field control. - "UNorm10B", "Error", //Settable as L1OM.CCCCC = 10001. Also Usable as Integer Field control. - "UNorm10C", "Error", //Settable as L1OM.CCCCC = 10010. Also Usable as Integer Field control. - "UNorm2D", "Error", //Settable as L1OM.CCCCC = 10011. Also Usable as Integer Field control. - //------------------------------------------------------------------------ - "Float11A", "Error", //Settable as L1OM.CCCCC = 10100. Also Usable as Float Field control. - "Float11B", "Error", //Settable as L1OM.CCCCC = 10101. Also Usable as Float Field control. - "Float10C", "Error", //Settable as L1OM.CCCCC = 10110. Also Usable as Float Field control. - "Error", "Error", //Settable as L1OM.CCCCC = 10111. Also Usable as Float Field control. - /*------------------------------------------------------------------------ + "UNorm10A", + "Error", //Settable as L1OM.CCCCC = 10000. Also Usable as Integer Field control. + "UNorm10B", + "Error", //Settable as L1OM.CCCCC = 10001. Also Usable as Integer Field control. + "UNorm10C", + "Error", //Settable as L1OM.CCCCC = 10010. Also Usable as Integer Field control. + "UNorm2D", + "Error", //Settable as L1OM.CCCCC = 10011. Also Usable as Integer Field control. + //------------------------------------------------------------------------ + "Float11A", + "Error", //Settable as L1OM.CCCCC = 10100. Also Usable as Float Field control. + "Float11B", + "Error", //Settable as L1OM.CCCCC = 10101. Also Usable as Float Field control. + "Float10C", + "Error", //Settable as L1OM.CCCCC = 10110. Also Usable as Float Field control. + "Error", + "Error", //Settable as L1OM.CCCCC = 10111. Also Usable as Float Field control. + /*------------------------------------------------------------------------ Unused Conversion modes. ------------------------------------------------------------------------*/ - "Error", "Error", //Settable as L1OM.CCCCC = 11000. - "Error", "Error", //Settable as L1OM.CCCCC = 11001. - "Error", "Error", //Settable as L1OM.CCCCC = 11010. - "Error", "Error", //Settable as L1OM.CCCCC = 11011. - "Error", "Error", //Settable as L1OM.CCCCC = 11100. - "Error", "Error", //Settable as L1OM.CCCCC = 11101. - "Error", "Error", //Settable as L1OM.CCCCC = 11110. - "Error", "Error" //Settable as L1OM.CCCCC = 11111. + "Error", + "Error", //Settable as L1OM.CCCCC = 11000. + "Error", + "Error", //Settable as L1OM.CCCCC = 11001. + "Error", + "Error", //Settable as L1OM.CCCCC = 11010. + "Error", + "Error", //Settable as L1OM.CCCCC = 11011. + "Error", + "Error", //Settable as L1OM.CCCCC = 11100. + "Error", + "Error", //Settable as L1OM.CCCCC = 11101. + "Error", + "Error", //Settable as L1OM.CCCCC = 11110. + "Error", + "Error", //Settable as L1OM.CCCCC = 11111. ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -3011,7 +8738,8 @@ Prefix G1, and G2 are used with Intel HLE, and other prefix codes such as repeat applied to any instruction unless it is an SIMD instruction which uses F2, and F3 as the SIMD Mode. -------------------------------------------------------------------------------------------------------------------------*/ -var PrefixG1 = "", PrefixG2 = ""; +var PrefixG1 = "", + PrefixG2 = ""; /*------------------------------------------------------------------------------------------------------------------------- Intel HLE is used with basic arithmetic instructions like Add, and subtract, and shift operations. @@ -3020,7 +8748,8 @@ Intel HLE instructions replace the Repeat F2, and F3, also lock F0 with XACQUIRE This is used by function ^DecodeInstruction()^. -------------------------------------------------------------------------------------------------------------------------*/ -var XRelease = false, XAcquire = false; +var XRelease = false, + XAcquire = false; /*------------------------------------------------------------------------------------------------------------------------- Intel HLE flip "G1 is used as = REP (XACQUIRE), or RENP (XRELEASE)", and "G2 is used as = LOCK" if the lock prefix was @@ -3066,7 +8795,7 @@ Used by functions ^DecodeRegValue()^, ^Decode_ModRM_SIB_Address()^. -------------------------------------------------------------------------------------------------------------------------*/ const REG = [ - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 0 Is used only if the value returned from the GetOperandSize is 0 in value which is the 8 bit general use Arithmetic registers names. Note that these same registers can be made 16 bit across instead of using just the first 8 bit in size it depends on the instruction codes extension size. @@ -3080,122 +8809,322 @@ const REG = [ used then the first 8 bit's is used by all general use arithmetic registers. Because of this the array is broken into two name listings that is used with the "RValue" number given to the function ^DecodeRegValue()^. -------------------------------------------------------------------------------------------------------------------------*/ - [ - /*------------------------------------------------------------------------------------------------------------------------- + [ + /*------------------------------------------------------------------------------------------------------------------------- 8 bit registers without any rex prefix active is the normal low byte to high byte order of the first 4 general use registers "A, C, D, and B" using 8 bits. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Registers 8 bit names without any rex prefix index 0 to 7. - "AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Registers 8 bit names without any rex prefix index 0 to 7. + "AL", + "CL", + "DL", + "BL", + "AH", + "CH", + "DH", + "BH", + ], + /*------------------------------------------------------------------------------------------------------------------------- 8 bit registers with any rex prefix active uses all 15 registers in low byte order. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Registers 8 bit names with any rex prefix index 0 to 7. - "AL", "CL", "DL", "BL", "SPL", "BPL", "SIL", "DIL", - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Registers 8 bit names with any rex prefix index 0 to 7. + "AL", + "CL", + "DL", + "BL", + "SPL", + "BPL", + "SIL", + "DIL", + /*------------------------------------------------------------------------------------------------------------------------- Registers 8 bit names Extended using the REX.R extend setting in the Rex prefix, or VEX.R bit, or EVEX.R. What ever RegExtend is set based on prefix settings is added to the select Reg Index -------------------------------------------------------------------------------------------------------------------------*/ - "R8B", "R9B", "R10B", "R11B", "R12B", "R13B", "R14B", "R15B" - ] - ], - /*------------------------------------------------------------------------------------------------------------------------- + "R8B", + "R9B", + "R10B", + "R11B", + "R12B", + "R13B", + "R14B", + "R15B", + ], + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 1 Is used only if the value returned from the GetOperandSize function is 1 in value in which bellow is the general use Arithmetic register names 16 in size. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Registers 16 bit names index 0 to 15. - "AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI", "R8W", "R9W", "R10W", "R11W", "R12W", "R13W", "R14W", "R15W" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Registers 16 bit names index 0 to 15. + "AX", + "CX", + "DX", + "BX", + "SP", + "BP", + "SI", + "DI", + "R8W", + "R9W", + "R10W", + "R11W", + "R12W", + "R13W", + "R14W", + "R15W", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 2 Is used only if the value from the GetOperandSize function is 2 in value in which bellow is the general use Arithmetic register names 32 in size. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Registers 32 bit names index 0 to 15. - "EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI", "R8D", "R9D", "R10D", "R11D", "R12D", "R13D", "R14D", "R15D" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Registers 32 bit names index 0 to 15. + "EAX", + "ECX", + "EDX", + "EBX", + "ESP", + "EBP", + "ESI", + "EDI", + "R8D", + "R9D", + "R10D", + "R11D", + "R12D", + "R13D", + "R14D", + "R15D", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 3 Is used only if the value returned from the GetOperandSize function is 3 in value in which bellow is the general use Arithmetic register names 64 in size. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //general use Arithmetic registers 64 names index 0 to 15. - "RAX", "RCX", "RDX", "RBX", "RSP", "RBP", "RSI", "RDI", "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //general use Arithmetic registers 64 names index 0 to 15. + "RAX", + "RCX", + "RDX", + "RBX", + "RSP", + "RBP", + "RSI", + "RDI", + "R8", + "R9", + "R10", + "R11", + "R12", + "R13", + "R14", + "R15", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 4 SIMD registers 128 across in size names. The SIMD registers are used by the SIMD Vector math unit. Used only if the value from the GetOperandSize function is 4 in value. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Register XMM names index 0 to 15. - "XMM0", "XMM1", "XMM2", "XMM3", "XMM4", "XMM5", "XMM6", "XMM7", "XMM8", "XMM9", "XMM10", "XMM11", "XMM12", "XMM13", "XMM14", "XMM15", - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Register XMM names index 0 to 15. + "XMM0", + "XMM1", + "XMM2", + "XMM3", + "XMM4", + "XMM5", + "XMM6", + "XMM7", + "XMM8", + "XMM9", + "XMM10", + "XMM11", + "XMM12", + "XMM13", + "XMM14", + "XMM15", + /*------------------------------------------------------------------------------------------------------------------------- Register XMM names index 16 to 31. Note different bit settings in the EVEX prefixes allow higher Extension values in the Register Extend variables. -------------------------------------------------------------------------------------------------------------------------*/ - "XMM16", "XMM17", "XMM18", "XMM19", "XMM20", "XMM21", "XMM22", "XMM23", "XMM24", "XMM25", "XMM26", "XMM27", "XMM28", "XMM29", "XMM30", "XMM31" - ], - /*------------------------------------------------------------------------------------------------------------------------- + "XMM16", + "XMM17", + "XMM18", + "XMM19", + "XMM20", + "XMM21", + "XMM22", + "XMM23", + "XMM24", + "XMM25", + "XMM26", + "XMM27", + "XMM28", + "XMM29", + "XMM30", + "XMM31", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 5 SIMD registers 256 across in size names. Used only if the value from the GetOperandSize function is 5 in value. Set by vector length setting. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Register YMM names index 0 to 15. - "YMM0", "YMM1", "YMM2", "YMM3", "YMM4", "YMM5", "YMM6", "YMM7", "YMM8", "YMM9", "YMM10", "YMM11", "YMM12", "YMM13", "YMM14", "YMM15", - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Register YMM names index 0 to 15. + "YMM0", + "YMM1", + "YMM2", + "YMM3", + "YMM4", + "YMM5", + "YMM6", + "YMM7", + "YMM8", + "YMM9", + "YMM10", + "YMM11", + "YMM12", + "YMM13", + "YMM14", + "YMM15", + /*------------------------------------------------------------------------------------------------------------------------- Register YMM names index 16 to 31. Note different bit settings in the EVEX prefixes allow higher Extension values in the Register Extend variables. -------------------------------------------------------------------------------------------------------------------------*/ - "YMM16", "YMM17", "YMM18", "YMM19", "YMM20", "YMM21", "YMM22", "YMM23", "YMM24", "YMM25", "YMM26", "YMM27", "YMM28", "YMM29", "YMM30", "YMM31" - ], - /*------------------------------------------------------------------------------------------------------------------------- + "YMM16", + "YMM17", + "YMM18", + "YMM19", + "YMM20", + "YMM21", + "YMM22", + "YMM23", + "YMM24", + "YMM25", + "YMM26", + "YMM27", + "YMM28", + "YMM29", + "YMM30", + "YMM31", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 6 SIMD registers 512 across in size names. Used only if the value from the GetOperandSize function is 6 in value. Set by Vector length setting. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Register ZMM names index 0 to 15. - "ZMM0", "ZMM1", "ZMM2", "ZMM3", "ZMM4", "ZMM5", "ZMM6", "ZMM7", "ZMM8", "ZMM9", "ZMM10", "ZMM11", "ZMM12", "ZMM13", "ZMM14", "ZMM15", - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Register ZMM names index 0 to 15. + "ZMM0", + "ZMM1", + "ZMM2", + "ZMM3", + "ZMM4", + "ZMM5", + "ZMM6", + "ZMM7", + "ZMM8", + "ZMM9", + "ZMM10", + "ZMM11", + "ZMM12", + "ZMM13", + "ZMM14", + "ZMM15", + /*------------------------------------------------------------------------------------------------------------------------- Register ZMM names index 16 to 31. Note different bit settings in the EVEX prefixes allow higher Extension values in the Register Extend variables. -------------------------------------------------------------------------------------------------------------------------*/ - "ZMM16", "ZMM17", "ZMM18", "ZMM19", "ZMM20", "ZMM21", "ZMM22", "ZMM23", "ZMM24", "ZMM25", "ZMM26", "ZMM27", "ZMM28", "ZMM29", "ZMM30", "ZMM31" - ], - /*------------------------------------------------------------------------------------------------------------------------- + "ZMM16", + "ZMM17", + "ZMM18", + "ZMM19", + "ZMM20", + "ZMM21", + "ZMM22", + "ZMM23", + "ZMM24", + "ZMM25", + "ZMM26", + "ZMM27", + "ZMM28", + "ZMM29", + "ZMM30", + "ZMM31", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 7 SIMD registers 1024 bit. The SIMD registers have not been made this long yet. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Register unknowable names index 0 to 15. - "?MM0", "?MM1", "?MM2", "?MM3", "?MM4", "?MM5", "?MM6", "?MM7", "?MM8", "?MM9", "?MM10", "?MM11", "?MM12", "?MM13", "?MM14", "?MM15", - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Register unknowable names index 0 to 15. + "?MM0", + "?MM1", + "?MM2", + "?MM3", + "?MM4", + "?MM5", + "?MM6", + "?MM7", + "?MM8", + "?MM9", + "?MM10", + "?MM11", + "?MM12", + "?MM13", + "?MM14", + "?MM15", + /*------------------------------------------------------------------------------------------------------------------------- Register unknowable names index 16 to 31. Note different bit settings in the EVEX prefixes allow higher Extension values in the Register Extend variables. -------------------------------------------------------------------------------------------------------------------------*/ - "?MM16", "?MM17", "?MM18", "?MM19", "?MM20", "?MM21", "?MM22", "?MM23", "?MM24", "?MM25", "?MM26", "?MM27", "?MM28", "?MM29", "?MM30", "?MM31" - ], - /*------------------------------------------------------------------------------------------------------------------------- + "?MM16", + "?MM17", + "?MM18", + "?MM19", + "?MM20", + "?MM21", + "?MM22", + "?MM23", + "?MM24", + "?MM25", + "?MM26", + "?MM27", + "?MM28", + "?MM29", + "?MM30", + "?MM31", + ], + /*------------------------------------------------------------------------------------------------------------------------- The Registers bellow do not change size they are completely separate, thus are used for special purposes. These registers are selected by using size as a value for the index instead instead of giving size to the function ^GetOperandSize()^. --------------------------------------------------------------------------------------------------------------------------- REG array Index 8 Segment Registers. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Segment Registers names index 0 to 7 - "ES", "CS", "SS", "DS", "FS", "GS", "ST(-2)", "ST(-1)" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Segment Registers names index 0 to 7 + "ES", + "CS", + "SS", + "DS", + "FS", + "GS", + "ST(-2)", + "ST(-1)", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 9 Stack, and MM registers used by the X87 Float point unit. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //ST registers Names index 0 to 7 - //note these are used with the X87 FPU, but are aliased to MM in MMX SSE. - "ST(0)", "ST(1)", "ST(2)", "ST(3)", "ST(4)", "ST(5)", "ST(6)", "ST(7)" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //ST registers Names index 0 to 7 + //note these are used with the X87 FPU, but are aliased to MM in MMX SSE. + "ST(0)", + "ST(1)", + "ST(2)", + "ST(3)", + "ST(4)", + "ST(5)", + "ST(6)", + "ST(7)", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG index 10 Intel MM qword technology MMX vector instructions. --------------------------------------------------------------------------------------------------------------------------- These can not be used with Vector length adjustment used in vector extensions. The MM register are the ST registers aliased @@ -3206,53 +9135,164 @@ const REG = [ that can be adjusted by vector length are separate from the MM registers, but still use the same SIMD unit. Because of this some Vector instruction codes can not be used with vector extension setting codes. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //Register MM names index 0 to 7 - "MM0", "MM1", "MM2", "MM3", "MM4", "MM5", "MM6", "MM7" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //Register MM names index 0 to 7 + "MM0", + "MM1", + "MM2", + "MM3", + "MM4", + "MM5", + "MM6", + "MM7", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG Array Index 11 bound registers introduced with MPX instructions. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //BND0 to BND3,and CR0 to CR3 for two byte opcodes 0x0F1A,and 0x0F1B register index 0 to 7 - "BND0", "BND1", "BND2", "BND3", "CR0", "CR1", "CR2", "CR3" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //BND0 to BND3,and CR0 to CR3 for two byte opcodes 0x0F1A,and 0x0F1B register index 0 to 7 + "BND0", + "BND1", + "BND2", + "BND3", + "CR0", + "CR1", + "CR2", + "CR3", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 12 control registers depending on the values they are set changes the modes of the CPU. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //control Registers index 0 to 15 - "CR0", "CR1", "CR2", "CR3", "CR4", "CR5", "CR6", "CR7", "CR8", "CR9", "CR10", "CR11", "CR12", "CR13", "CR14", "CR15" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //control Registers index 0 to 15 + "CR0", + "CR1", + "CR2", + "CR3", + "CR4", + "CR5", + "CR6", + "CR7", + "CR8", + "CR9", + "CR10", + "CR11", + "CR12", + "CR13", + "CR14", + "CR15", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 13 Debug mode registers. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //debug registers index 0 to 15 - "DR0", "DR1", "DR2", "DR3", "DR4", "DR5", "DR6", "DR7", "DR8", "DR9", "DR10", "DR11", "DR12", "DR13", "DR14", "DR15" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //debug registers index 0 to 15 + "DR0", + "DR1", + "DR2", + "DR3", + "DR4", + "DR5", + "DR6", + "DR7", + "DR8", + "DR9", + "DR10", + "DR11", + "DR12", + "DR13", + "DR14", + "DR15", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG array Index 14 test registers. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //TR registers index 0 to 7 - "TR0", "TR1", "TR2", "TR3", "TR4", "TR5", "TR6", "TR7" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //TR registers index 0 to 7 + "TR0", + "TR1", + "TR2", + "TR3", + "TR4", + "TR5", + "TR6", + "TR7", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG Array Index 15 SIMD vector mask registers. -------------------------------------------------------------------------------------------------------------------------*/ - [ - //K registers index 0 to 7, because of vector extensions it is repeated till last extension. - "K0", "K1", "K2", "K3", "K4", "K5", "K6", "K7","K0", "K1", "K2", "K3", "K4", "K5", "K6", "K7", - "K0", "K1", "K2", "K3", "K4", "K5", "K6", "K7","K0", "K1", "K2", "K3", "K4", "K5", "K6", "K7" - ], - /*------------------------------------------------------------------------------------------------------------------------- + [ + //K registers index 0 to 7, because of vector extensions it is repeated till last extension. + "K0", + "K1", + "K2", + "K3", + "K4", + "K5", + "K6", + "K7", + "K0", + "K1", + "K2", + "K3", + "K4", + "K5", + "K6", + "K7", + "K0", + "K1", + "K2", + "K3", + "K4", + "K5", + "K6", + "K7", + "K0", + "K1", + "K2", + "K3", + "K4", + "K5", + "K6", + "K7", + ], + /*------------------------------------------------------------------------------------------------------------------------- REG Array Index 16 SIMD L1OM vector registers. -------------------------------------------------------------------------------------------------------------------------*/ - [ - "V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15", - "V16", "V17", "V18", "V19", "V20", "V21", "V22", "V23", "V24", "V25", "V26", "V27", "V28", "V29", "V30", "V31" - ] + [ + "V0", + "V1", + "V2", + "V3", + "V4", + "V5", + "V6", + "V7", + "V8", + "V9", + "V10", + "V11", + "V12", + "V13", + "V14", + "V15", + "V16", + "V17", + "V18", + "V19", + "V20", + "V21", + "V22", + "V23", + "V24", + "V25", + "V26", + "V27", + "V28", + "V29", + "V30", + "V31", + ], ]; /*------------------------------------------------------------------------------------------------------------------------- @@ -3274,49 +9314,58 @@ Used by the function ^Decode_ModRM_SIB_Address()^. -------------------------------------------------------------------------------------------------------------------------*/ const PTR = [ - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 0 when GetOperandSize returns size 0 then times 2 for 8 bit pointer. In plus 16 bit shift array index 0 is added by 1 making 0+1=1 no pointer name is used. The blank pointer is used for instructions like LEA which loads the effective address. -------------------------------------------------------------------------------------------------------------------------*/ - "BYTE PTR ","", - /*------------------------------------------------------------------------------------------------------------------------- + "BYTE PTR ", + "", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 2 when GetOperandSize returns size 1 then times 2 for 16 bit pointer alignment. In plus 16 bit shift index 2 is added by 1 making 2+1=3 The 32 bit pointer name is used (mathematically 16+16=32). -------------------------------------------------------------------------------------------------------------------------*/ - "WORD PTR ","DWORD PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "WORD PTR ", + "DWORD PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 4 when GetOperandSize returns size 2 then multiply by 2 for index 4 for the 32 bit pointer. In plus 16 bit shift index 4 is added by 1 making 4+1=5 the 48 bit Far pointer name is used (mathematically 32+16=48). -------------------------------------------------------------------------------------------------------------------------*/ - "DWORD PTR ","FWORD PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "DWORD PTR ", + "FWORD PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 6 when GetOperandSize returns size 3 then multiply by 2 gives index 6 for the 64 bit pointer. The Non shifted 64 bit pointer has two types the 64 bit vector "MM", and regular "QWORD" the same as the REG array. In plus 16 bit shift index 6 is added by 1 making 6+1=7 the 80 bit TBYTE pointer name is used (mathematically 64+16=80). -------------------------------------------------------------------------------------------------------------------------*/ - "QWORD PTR ","TBYTE PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "QWORD PTR ", + "TBYTE PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 8 when GetOperandSize returns size 4 then multiply by 2 gives index 8 for the 128 bit Vector pointer. In far pointer shift the MMX vector pointer is used. MM is designed to be used when the by size system is false using index 9 for Pointer, and index 10 for Reg. -------------------------------------------------------------------------------------------------------------------------*/ - "XMMWORD PTR ","MMWORD PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "XMMWORD PTR ", + "MMWORD PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 10 when GetOperandSize returns size 5 then multiply by 2 gives index 10 for the 256 bit SIMD pointer. In far pointer shift the OWORD pointer is used with the bounds instructions it is also designed to be used when the by size is set false same as MM. -------------------------------------------------------------------------------------------------------------------------*/ - "YMMWORD PTR ","OWORD PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "YMMWORD PTR ", + "OWORD PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 12 when GetOperandSize returns size 6 then multiply by 2 gives index 12 for the 512 bit pointer. In plus 16 bit shift index 12 is added by 1 making 12+1=13 there is no 528 bit pointer name (mathematically 5126+16=528). -------------------------------------------------------------------------------------------------------------------------*/ - "ZMMWORD PTR ","ERROR PTR ", - /*------------------------------------------------------------------------------------------------------------------------- + "ZMMWORD PTR ", + "ERROR PTR ", + /*------------------------------------------------------------------------------------------------------------------------- Pointer array index 14 when GetOperandSize returns size 7 then multiply by 2 gives index 12 for the 1024 bit pointer. In plus 16 bit shift index 14 is added by 1 making 12+1=13 there is no 1 bit pointer name (mathematically 5126+16=528). -------------------------------------------------------------------------------------------------------------------------*/ - "?MMWORD PTR ","ERROR PTR "]; + "?MMWORD PTR ", + "ERROR PTR ", +]; /*------------------------------------------------------------------------------------------------------------------------- SIB byte scale Note the Scale bits value is the selected index of the array bellow only used under @@ -3326,12 +9375,12 @@ used by the ^Decode_ModRM_SIB_Address function()^. -------------------------------------------------------------------------------------------------------------------------*/ const scale = [ - "", //when scale bits are 0 in value no scale multiple is used - "*2", //when scale bits are 1 in value a scale multiple of times two is used - "*4", //when scale bits are 2 in value a scale multiple of times four is used - "*8" //when scale bits are 3 in value a scale multiple of times eight is used - ]; - + "", //when scale bits are 0 in value no scale multiple is used + "*2", //when scale bits are 1 in value a scale multiple of times two is used + "*4", //when scale bits are 2 in value a scale multiple of times four is used + "*8", //when scale bits are 3 in value a scale multiple of times eight is used +]; + /*------------------------------------------------------------------------------------------------------------------------- This function changes the Mnemonics array, for older instruction codes used by specific X86 cores that are under the same instruction codes. --------------------------------------------------------------------------------------------------------------------------- @@ -3344,192 +9393,508 @@ If input "type" is set 5 it will adjust the mnemonic array to decode Centaur ins If input "type" is set 6 it will adjust the mnemonic array to decode instruction for the X86/486 CPU which conflict with the vector unit instructions with UMOV. -------------------------------------------------------------------------------------------------------------------------*/ -export function CompatibilityMode( type ) -{ - //Reset the changeable sections of the Mnemonics array, and operand encoding array. - - Mnemonics[0x062] = ["BOUND","BOUND",""]; - Mnemonics[0x110] = [["MOVUPS","MOVUPD","MOVSS","MOVSD"],["MOVUPS","MOVUPD","MOVSS","MOVSD"]]; - Mnemonics[0x111] = [["MOVUPS","MOVUPD","MOVSS","MOVSD"],["MOVUPS","MOVUPD","MOVSS","MOVSD"]]; - Mnemonics[0x112] = [["MOVLPS","MOVLPD","MOVSLDUP","MOVDDUP"],["MOVHLPS","???","MOVSLDUP","MOVDDUP"]]; - Mnemonics[0x113] = [["MOVLPS","MOVLPD","???","???"],"???"]; - Mnemonics[0x138] = ""; Mnemonics[0x139] = "???"; Mnemonics[0x13A] = ""; Mnemonics[0x13B] = "???"; Mnemonics[0x13C] = "???"; Mnemonics[0x13D] = "???"; Mnemonics[0x13F] = "???"; - Mnemonics[0x141] = [["CMOVNO",["KANDW","","KANDQ"],"",""],["CMOVNO",["KANDB","","KANDD"],"",""],"",""]; - Mnemonics[0x142] = [["CMOVB",["KANDNW","","KANDNQ"],"",""],["CMOVB",["KANDNB","","KANDND"],"",""],"",""]; - Mnemonics[0x144] = [["CMOVE",["KNOTW","","KNOTQ"],"",""],["CMOVE",["KNOTB","","KNOTD"],"",""],"",""]; - Mnemonics[0x145] = [["CMOVNE",["KORW","","KORQ"],"",""],["CMOVNE",["KORB","","KORD"],"",""],"",""]; - Mnemonics[0x146] = [["CMOVBE",["KXNORW","","KXNORQ"],"",""],["CMOVBE",["KXNORB","","KXNORD"],"",""],"",""]; - Mnemonics[0x147] = [["CMOVA",["KXORW","","KXORQ"],"",""],["CMOVA",["KXORB","","KXORD"],"",""],"",""]; - Mnemonics[0x150] = ["???",[["MOVMSKPS","MOVMSKPS","",""],["MOVMSKPD","MOVMSKPD","",""],"???","???"]]; - Mnemonics[0x151] = ["SQRTPS","SQRTPD","SQRTSS","SQRTSD"]; - Mnemonics[0x152] = [["RSQRTPS","RSQRTPS","",""],"???",["RSQRTSS","RSQRTSS","",""],"???"]; - Mnemonics[0x154] = ["ANDPS","ANDPD","???","???"]; - Mnemonics[0x155] = ["ANDNPS","ANDNPD","???","???"]; - Mnemonics[0x158] = [["ADDPS","ADDPS","ADDPS","ADDPS"],["ADDPD","ADDPD","ADDPD","ADDPD"],"ADDSS","ADDSD"]; - Mnemonics[0x159] = [["MULPS","MULPS","MULPS","MULPS"],["MULPD","MULPD","MULPD","MULPD"],"MULSS","MULSD"]; - Mnemonics[0x15A] = [["CVTPS2PD","CVTPS2PD","CVTPS2PD","CVTPS2PD"],["CVTPD2PS","CVTPD2PS","CVTPD2PS","CVTPD2PS"],"CVTSS2SD","CVTSD2SS"]; - Mnemonics[0x15B] = [[["CVTDQ2PS","","CVTQQ2PS"],"CVTPS2DQ",""],"???","CVTTPS2DQ","???"]; - Mnemonics[0x15C] = [["SUBPS","SUBPS","SUBPS","SUBPS"],["SUBPD","SUBPD","SUBPD","SUBPD"],"SUBSS","SUBSD"]; - Mnemonics[0x15D] = ["MINPS","MINPD","MINSS","MINSD"]; - Mnemonics[0x15E] = ["DIVPS","DIVPD","DIVSS","DIVSD"]; - Mnemonics[0x178] = [["VMREAD","",["CVTTPS2UDQ","","CVTTPD2UDQ"],""],["EXTRQ","",["CVTTPS2UQQ","","CVTTPD2UQQ"],""],["???","","CVTTSS2USI",""],["INSERTQ","","CVTTSD2USI",""]]; - Mnemonics[0x179] = [["VMWRITE","",["CVTPS2UDQ","","CVTPD2UDQ"],""],["EXTRQ","",["CVTPS2UQQ","","CVTPD2UQQ"],""],["???","","CVTSS2USI",""],["INSERTQ","","CVTSD2USI",""]]; - Mnemonics[0x17A] = ["???",["","",["CVTTPS2QQ","","CVTTPD2QQ"],""],["","",["CVTUDQ2PD","","CVTUQQ2PD"],"CVTUDQ2PD"],["","",["CVTUDQ2PS","","CVTUQQ2PS"],""]]; - Mnemonics[0x17B] = ["???",["","",["CVTPS2QQ","","CVTPD2QQ"],""],["","","CVTUSI2SS",""],["","","CVTUSI2SD",""]]; - Mnemonics[0x17C] = ["???",["HADDPD","HADDPD","",""],"???",["HADDPS","HADDPS","",""]]; - Mnemonics[0x17D] = ["???",["HSUBPD","HSUBPD","",""],"???",["HSUBPS","HSUBPS","",""]]; - Mnemonics[0x17E] = [["MOVD","","",""],["MOVD","","MOVQ"],["MOVQ","MOVQ",["???","","MOVQ"],""],"???"], - Mnemonics[0x190] = [["SETO",["KMOVW","","KMOVQ"],"",""],["SETO",["KMOVB","","KMOVD"],"",""],"",""]; - Mnemonics[0x192] = [["SETB",["KMOVW","","???"],"",""],["SETB",["KMOVB","","???"],"",""],"",["SETB",["KMOVD","","KMOVQ"],"",""]]; - Mnemonics[0x193] = [["SETAE",["KMOVW","","???"],"",""],["SETAE",["KMOVB","","???"],"",""],"",["SETAE",["KMOVD","","KMOVQ"],"",""]]; - Mnemonics[0x198] = [["SETS",["KORTESTW","","KORTESTQ"],"",""],["SETS",["KORTESTB","","KORTESTD"],"",""],"",""]; - Mnemonics[0x1A6] = "XBTS"; - Mnemonics[0x1A7] = "IBTS"; +export function CompatibilityMode(type) { + //Reset the changeable sections of the Mnemonics array, and operand encoding array. - Operands[0x110] = [["0B700770","0B700770","0A040603","0A040609"],["0B700770","0B700770","0A0412040604","0A0412040604"]]; - Operands[0x111] = [["07700B70","07700B70","06030A04","06090A04"],["07700B70","07700B70","060412040A04","060412040A04"]]; - Operands[0x112] = [["0A0412040606","0A0412040606","0B700770","0B700768"],["0A0412040604","","0B700770","0B700770"]]; - Operands[0x113] = [["06060A04","06060A04","",""],""]; - Operands[0x141] = [["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"",""]; - Operands[0x142] = [["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"",""]; - Operands[0x144] = [["0B0E070E0180",["0A0F06FF","","0A0F06FF"],"",""],["0B0E070E0180",["0A0F06FF","","0A0F06FF"],"",""],"",""]; - Operands[0x145] = [["0A02070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],["0A02070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"",""]; - Operands[0x146] = [["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],"",""]; - Operands[0x147] = [["0B0E070E0180",["0A0F120F06FF","","0A0F120F06FF"],"",""],["0B0E070E0180",["0A0F120F06FF","",""],"",""],"",""]; - Operands[0x150] = ["",[["0B0C0648","0B0C0730","",""],["0B0C0648","0B0C0730","",""],"",""]]; - Operands[0x151] = ["0B7007700112","0B7007700112","0A04120406430102","0A04120406490102"]; - Operands[0x152] = [["0A040648","0A040648","",""],"",["0A040643","0A0412040643","",""],""]; - Operands[0x154] = ["0B70137007700110","0B70137007700110","",""]; - Operands[0x155] = ["0B70137007700110","0B70137007700110","",""]; - Operands[0x158] = [["0A040648","0B3013300730","0B70137007700112","0A061206066C0172"],["0A040648","0B3013300730","0B70137007700112","0A061206066C0112"],"0A04120406430102","0A04120406460102"]; - Operands[0x159] = [["0A040648","0B3013300730","0B70137007700112","0A061206066C0172"],["0A040648","0B3013300730","0B70137007700112","0A061206066C0112"],"0A04120406430102","0A04120406460102"]; - Operands[0x15A] = [["0A040648","0B300718","0B7007380111","0A06065A0111"],["0A040648","0B180730","0B3807700112","0A05066C0112"],"0A04120406430101","0A04120406460102"]; - Operands[0x15B] = [[["0B7007700112","","0B380770011A"],"0B700770011A","",""],"","0B7007700111",""]; - Operands[0x15C] = [["0A060648","0B3013300730","0B70137007700112","0A061206066C0172"],["0A060648","0B3013300730","0B70137007700112","0A061206066C0112"],"0A04120406430102","0A04120406460102"]; - Operands[0x15D] = ["0B70137007700111","0B70137007700111","0A04120406430101","0A04120406460101"]; - Operands[0x15E] = ["0B70137007700112","0B70137007700112","0A04120406430102","0A04120406460102"]; - Operands[0x178] = [["07080B080180","",["0B7007700111","","0B3807700119"],""],["064F0C000C00","",["0B7007380119","","0B7007700111"],""],["","","0B0C06440109",""],["0A04064F0C000C00","","0B0C06460109",""]]; - Operands[0x179] = [["0B0807080180","",["0B7007700112","","0B380770011A"],""],["0A04064F","",["0B700738011A","","0B7007700112"],""],["","","0B0C0644010A",""],["0A04064F","","0B0C0646010A",""]]; - Operands[0x17A] = ["",["","",["0B7007380119","","0B7007700111"],""],["","",["0B7007380112","","0B700770011A"],"0A06065A0112"],["","",["0B700770011A","","0B3807700112"],""]]; - Operands[0x17B] = ["",["","",["0B700738011A","","0B7007700112"],""],["","","0A041204070C010A",""],["","","0A041204070C010A",""]]; - Operands[0x17C] = ["",["0A040604","0B7013700770","",""],"",["0A040604","0B7013700770","",""]]; - Operands[0x17D] = ["",["0A040604","0B7013700770","",""],"",["0A040604","0B7013700770","",""]]; - Operands[0x17E] = [["070C0A0A","","",""],["06240A040108","","06360A040108"],["0A040646","0A040646",["","","0A0406460108"],""],""]; - Operands[0x190] = [["0600",["0A0F0612","","0A0F0636"],"",""],["0600",["0A0F0600","","0A0F0624"],"",""],"",""]; - Operands[0x192] = [["0600",["0A0F06F4","",""],"",""],["0600",["0A0F06F4","",""],"",""],"",["0600",["0A0F06F6","","0A0F06F6"],"",""]]; - Operands[0x193] = [["0600",["06F40A0F","",""],"",""],["0600",["06F40A0F","",""],"",""],"",["0600",["06F60A0F","","06F60A0F"],"",""]]; - Operands[0x198] = [["0600",["0A0F06FF","","0A0F06FF"],"",""],["0600",["0A0F06FF","","0A0F06FF"],"",""],"",""]; - Operands[0x1A6] = "0B0E070E"; - Operands[0x1A7] = "070E0B0E"; - - //Adjust the VEX mask instructions for K1OM (Knights corner) which conflict with the enhanced AVX512 versions. - - if( type === 1 ) - { - Mnemonics[0x141] = [["CMOVNO","KAND","",""],"","",""]; - Mnemonics[0x142] = [["CMOVB","KANDN","",""],"","",""]; - Mnemonics[0x144] = [["CMOVE","KNOT","",""],"","",""]; - Mnemonics[0x145] = [["CMOVNE","KOR","",""],"","",""]; - Mnemonics[0x146] = [["CMOVBE","KXNOR","",""],"","",""]; - Mnemonics[0x147] = [["CMOVA","KXOR","",""],"","",""]; - Mnemonics[0x190] = [["SETO","KMOV","",""],"","",""]; - Mnemonics[0x192] = [["SETB","KMOV","",""],"","",""]; - Mnemonics[0x193] = [["SETAE","KMOV","",""],"","",""]; - Mnemonics[0x198] = [["SETS","KORTEST","",""],"","",""]; - Operands[0x141] = [["0B0E070E0180","0A0F06FF","",""],"","",""]; - Operands[0x142] = [["0B0E070E0180","0A0F06FF","",""],"","",""]; - Operands[0x144] = [["0B0E070E0180","0A0F06FF","",""],"","",""]; - Operands[0x145] = [["0A02070E0180","0A0F06FF","",""],"","",""]; - Operands[0x146] = [["0B0E070E0180","0A0F06FF","",""],"","",""]; - Operands[0x147] = [["0B0E070E0180","0A0F06FF","",""],"","",""]; - Operands[0x190] = [["0600","0A0F06FF","",""],"","",""]; - Operands[0x192] = [["0600","06FF0B06","",""],"","",""]; - Operands[0x193] = [["0600","07060A0F","",""],"","",""]; - Operands[0x198] = [["0600","0A0F06FF","",""],"","",""]; - } - - //Disable Knights corner, and AVX512, for L1OM (Intel Larrabee). - - if( type === 2 ) - { - Mnemonics[0x62] = ""; - } - - //Adjust the Mnemonics, and Operand encoding, for the Cyrix processors. - - if( type === 3 ) - { - Mnemonics[0x138] = "SMINT"; Mnemonics[0x13A] = "BB0_RESET"; Mnemonics[0x13B] = "BB1_RESET"; Mnemonics[0x13C] = "CPU_WRITE"; Mnemonics[0x13D] = "CPU_READ"; - Mnemonics[0x150] = "PAVEB"; Mnemonics[0x151] = "PADDSIW"; Mnemonics[0x152] = "PMAGW"; - Mnemonics[0x154] = "PDISTIB"; Mnemonics[0x155] = "PSUBSIW"; - Mnemonics[0x158] = "PMVZB"; Mnemonics[0x159] = "PMULHRW"; Mnemonics[0x15A] = "PMVNZB"; - Mnemonics[0x15B] = "PMVLZB"; Mnemonics[0x15C] = "PMVGEZB"; Mnemonics[0x15D] = "PMULHRIW"; - Mnemonics[0x15E] = "PMACHRIW"; - Mnemonics[0x178] = "SVDC"; Mnemonics[0x179] = "RSDC"; Mnemonics[0x17A] = "SVLDT"; - Mnemonics[0x17B] = "RSLDT"; Mnemonics[0x17C] = "SVTS"; Mnemonics[0x17D] = "RSTS"; - Mnemonics[0x17E] = "SMINT"; - Operands[0x150] = "0A0A06A9"; Operands[0x151] = "0A0A06A9"; Mnemonics[0x152] = "0A0A06A9"; - Operands[0x154] = "0A0A06AF"; Operands[0x155] = "0A0A06A9"; - Operands[0x158] = "0A0A06AF"; Operands[0x159] = "0A0A06A9"; Mnemonics[0x15A] = "0A0A06AF"; - Operands[0x15B] = "0A0A06AF"; Operands[0x15C] = "0A0A06AF"; Mnemonics[0x15D] = "0A0A06A9"; - Operands[0x15E] = "0A0A06AF"; - Operands[0x178] = "30000A08"; Operands[0x179] = "0A083000"; Operands[0x17A] = "3000"; - Operands[0x17B] = "3000"; Operands[0x17C] = "3000"; Operands[0x17D] = "3000"; - Operands[0x17E] = ""; - } - - //Adjust the Mnemonics, and Operand encoding, for the Geode processor. - - if( type === 4 ) - { - Mnemonics[0x138] = "SMINT"; Mnemonics[0x139] = "DMINT"; Mnemonics[0x13A] = "RDM"; - } - - //Adjust the Mnemonics, for the Centaur processor. - - if( type === 5 ) - { - Mnemonics[0x13F] = "ALTINST"; - Mnemonics[0x1A6] = ["???",["MONTMUL","XSA1","XSA256","???","???","???","???","???"]]; - Mnemonics[0x1A7] = [ - "???", - [ - "XSTORE", - ["???","???","XCRYPT-ECB","???"], - ["???","???","XCRYPT-CBC","???"], - ["???","???","XCRYPT-CTR","???"], - ["???","???","XCRYPT-CFB","???"], - ["???","???","XCRYPT-OFB","???"], + Mnemonics[0x062] = ["BOUND", "BOUND", ""]; + Mnemonics[0x110] = [ + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], + ]; + Mnemonics[0x111] = [ + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], + ["MOVUPS", "MOVUPD", "MOVSS", "MOVSD"], + ]; + Mnemonics[0x112] = [ + ["MOVLPS", "MOVLPD", "MOVSLDUP", "MOVDDUP"], + ["MOVHLPS", "???", "MOVSLDUP", "MOVDDUP"], + ]; + Mnemonics[0x113] = [["MOVLPS", "MOVLPD", "???", "???"], "???"]; + Mnemonics[0x138] = ""; + Mnemonics[0x139] = "???"; + Mnemonics[0x13a] = ""; + Mnemonics[0x13b] = "???"; + Mnemonics[0x13c] = "???"; + Mnemonics[0x13d] = "???"; + Mnemonics[0x13f] = "???"; + Mnemonics[0x141] = [ + ["CMOVNO", ["KANDW", "", "KANDQ"], "", ""], + ["CMOVNO", ["KANDB", "", "KANDD"], "", ""], + "", + "", + ]; + Mnemonics[0x142] = [ + ["CMOVB", ["KANDNW", "", "KANDNQ"], "", ""], + ["CMOVB", ["KANDNB", "", "KANDND"], "", ""], + "", + "", + ]; + Mnemonics[0x144] = [ + ["CMOVE", ["KNOTW", "", "KNOTQ"], "", ""], + ["CMOVE", ["KNOTB", "", "KNOTD"], "", ""], + "", + "", + ]; + Mnemonics[0x145] = [ + ["CMOVNE", ["KORW", "", "KORQ"], "", ""], + ["CMOVNE", ["KORB", "", "KORD"], "", ""], + "", + "", + ]; + Mnemonics[0x146] = [ + ["CMOVBE", ["KXNORW", "", "KXNORQ"], "", ""], + ["CMOVBE", ["KXNORB", "", "KXNORD"], "", ""], + "", + "", + ]; + Mnemonics[0x147] = [ + ["CMOVA", ["KXORW", "", "KXORQ"], "", ""], + ["CMOVA", ["KXORB", "", "KXORD"], "", ""], + "", + "", + ]; + Mnemonics[0x150] = [ "???", - "???" - ] + [ + ["MOVMSKPS", "MOVMSKPS", "", ""], + ["MOVMSKPD", "MOVMSKPD", "", ""], + "???", + "???", + ], ]; - Operands[0x1A6] = ["",["","","","","","","",""]]; - Operands[0x1A7] = [ - "", - [ - "", - ["","","",""], - ["","","",""], - ["","","",""], - ["","","",""], - ["","","",""], - "", - "" - ] + Mnemonics[0x151] = ["SQRTPS", "SQRTPD", "SQRTSS", "SQRTSD"]; + Mnemonics[0x152] = [ + ["RSQRTPS", "RSQRTPS", "", ""], + "???", + ["RSQRTSS", "RSQRTSS", "", ""], + "???", ]; - } - - //Adjust the Mnemonics, for the X86/486 processor and older. - - if( type === 6 ) - { - Mnemonics[0x110] = "UMOV"; Mnemonics[0x111] = "UMOV"; Mnemonics[0x112] = "UMOV"; Mnemonics[0x113] = "UMOV"; - Mnemonics[0x1A6] = "CMPXCHG"; Mnemonics[0x1A7] = "CMPXCHG"; - Operands[0x110] = "06000A00"; Operands[0x111] = "070E0B0E"; Operands[0x112] = "0A000600"; Operands[0x113] = "0B0E070E"; - Operands[0x1A6] = ""; Operands[0x1A7] = ""; - } - + Mnemonics[0x154] = ["ANDPS", "ANDPD", "???", "???"]; + Mnemonics[0x155] = ["ANDNPS", "ANDNPD", "???", "???"]; + Mnemonics[0x158] = [ + ["ADDPS", "ADDPS", "ADDPS", "ADDPS"], + ["ADDPD", "ADDPD", "ADDPD", "ADDPD"], + "ADDSS", + "ADDSD", + ]; + Mnemonics[0x159] = [ + ["MULPS", "MULPS", "MULPS", "MULPS"], + ["MULPD", "MULPD", "MULPD", "MULPD"], + "MULSS", + "MULSD", + ]; + Mnemonics[0x15a] = [ + ["CVTPS2PD", "CVTPS2PD", "CVTPS2PD", "CVTPS2PD"], + ["CVTPD2PS", "CVTPD2PS", "CVTPD2PS", "CVTPD2PS"], + "CVTSS2SD", + "CVTSD2SS", + ]; + Mnemonics[0x15b] = [ + [["CVTDQ2PS", "", "CVTQQ2PS"], "CVTPS2DQ", ""], + "???", + "CVTTPS2DQ", + "???", + ]; + Mnemonics[0x15c] = [ + ["SUBPS", "SUBPS", "SUBPS", "SUBPS"], + ["SUBPD", "SUBPD", "SUBPD", "SUBPD"], + "SUBSS", + "SUBSD", + ]; + Mnemonics[0x15d] = ["MINPS", "MINPD", "MINSS", "MINSD"]; + Mnemonics[0x15e] = ["DIVPS", "DIVPD", "DIVSS", "DIVSD"]; + Mnemonics[0x178] = [ + ["VMREAD", "", ["CVTTPS2UDQ", "", "CVTTPD2UDQ"], ""], + ["EXTRQ", "", ["CVTTPS2UQQ", "", "CVTTPD2UQQ"], ""], + ["???", "", "CVTTSS2USI", ""], + ["INSERTQ", "", "CVTTSD2USI", ""], + ]; + Mnemonics[0x179] = [ + ["VMWRITE", "", ["CVTPS2UDQ", "", "CVTPD2UDQ"], ""], + ["EXTRQ", "", ["CVTPS2UQQ", "", "CVTPD2UQQ"], ""], + ["???", "", "CVTSS2USI", ""], + ["INSERTQ", "", "CVTSD2USI", ""], + ]; + Mnemonics[0x17a] = [ + "???", + ["", "", ["CVTTPS2QQ", "", "CVTTPD2QQ"], ""], + ["", "", ["CVTUDQ2PD", "", "CVTUQQ2PD"], "CVTUDQ2PD"], + ["", "", ["CVTUDQ2PS", "", "CVTUQQ2PS"], ""], + ]; + Mnemonics[0x17b] = [ + "???", + ["", "", ["CVTPS2QQ", "", "CVTPD2QQ"], ""], + ["", "", "CVTUSI2SS", ""], + ["", "", "CVTUSI2SD", ""], + ]; + Mnemonics[0x17c] = [ + "???", + ["HADDPD", "HADDPD", "", ""], + "???", + ["HADDPS", "HADDPS", "", ""], + ]; + Mnemonics[0x17d] = [ + "???", + ["HSUBPD", "HSUBPD", "", ""], + "???", + ["HSUBPS", "HSUBPS", "", ""], + ]; + (Mnemonics[0x17e] = [ + ["MOVD", "", "", ""], + ["MOVD", "", "MOVQ"], + ["MOVQ", "MOVQ", ["???", "", "MOVQ"], ""], + "???", + ]), + (Mnemonics[0x190] = [ + ["SETO", ["KMOVW", "", "KMOVQ"], "", ""], + ["SETO", ["KMOVB", "", "KMOVD"], "", ""], + "", + "", + ]); + Mnemonics[0x192] = [ + ["SETB", ["KMOVW", "", "???"], "", ""], + ["SETB", ["KMOVB", "", "???"], "", ""], + "", + ["SETB", ["KMOVD", "", "KMOVQ"], "", ""], + ]; + Mnemonics[0x193] = [ + ["SETAE", ["KMOVW", "", "???"], "", ""], + ["SETAE", ["KMOVB", "", "???"], "", ""], + "", + ["SETAE", ["KMOVD", "", "KMOVQ"], "", ""], + ]; + Mnemonics[0x198] = [ + ["SETS", ["KORTESTW", "", "KORTESTQ"], "", ""], + ["SETS", ["KORTESTB", "", "KORTESTD"], "", ""], + "", + "", + ]; + Mnemonics[0x1a6] = "XBTS"; + Mnemonics[0x1a7] = "IBTS"; + + Operands[0x110] = [ + ["0B700770", "0B700770", "0A040603", "0A040609"], + ["0B700770", "0B700770", "0A0412040604", "0A0412040604"], + ]; + Operands[0x111] = [ + ["07700B70", "07700B70", "06030A04", "06090A04"], + ["07700B70", "07700B70", "060412040A04", "060412040A04"], + ]; + Operands[0x112] = [ + ["0A0412040606", "0A0412040606", "0B700770", "0B700768"], + ["0A0412040604", "", "0B700770", "0B700770"], + ]; + Operands[0x113] = [["06060A04", "06060A04", "", ""], ""]; + Operands[0x141] = [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "", + ]; + Operands[0x142] = [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "", + ]; + Operands[0x144] = [ + ["0B0E070E0180", ["0A0F06FF", "", "0A0F06FF"], "", ""], + ["0B0E070E0180", ["0A0F06FF", "", "0A0F06FF"], "", ""], + "", + "", + ]; + Operands[0x145] = [ + ["0A02070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0A02070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "", + ]; + Operands[0x146] = [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + "", + "", + ]; + Operands[0x147] = [ + ["0B0E070E0180", ["0A0F120F06FF", "", "0A0F120F06FF"], "", ""], + ["0B0E070E0180", ["0A0F120F06FF", "", ""], "", ""], + "", + "", + ]; + Operands[0x150] = [ + "", + [ + ["0B0C0648", "0B0C0730", "", ""], + ["0B0C0648", "0B0C0730", "", ""], + "", + "", + ], + ]; + Operands[0x151] = [ + "0B7007700112", + "0B7007700112", + "0A04120406430102", + "0A04120406490102", + ]; + Operands[0x152] = [ + ["0A040648", "0A040648", "", ""], + "", + ["0A040643", "0A0412040643", "", ""], + "", + ]; + Operands[0x154] = ["0B70137007700110", "0B70137007700110", "", ""]; + Operands[0x155] = ["0B70137007700110", "0B70137007700110", "", ""]; + Operands[0x158] = [ + ["0A040648", "0B3013300730", "0B70137007700112", "0A061206066C0172"], + ["0A040648", "0B3013300730", "0B70137007700112", "0A061206066C0112"], + "0A04120406430102", + "0A04120406460102", + ]; + Operands[0x159] = [ + ["0A040648", "0B3013300730", "0B70137007700112", "0A061206066C0172"], + ["0A040648", "0B3013300730", "0B70137007700112", "0A061206066C0112"], + "0A04120406430102", + "0A04120406460102", + ]; + Operands[0x15a] = [ + ["0A040648", "0B300718", "0B7007380111", "0A06065A0111"], + ["0A040648", "0B180730", "0B3807700112", "0A05066C0112"], + "0A04120406430101", + "0A04120406460102", + ]; + Operands[0x15b] = [ + [["0B7007700112", "", "0B380770011A"], "0B700770011A", "", ""], + "", + "0B7007700111", + "", + ]; + Operands[0x15c] = [ + ["0A060648", "0B3013300730", "0B70137007700112", "0A061206066C0172"], + ["0A060648", "0B3013300730", "0B70137007700112", "0A061206066C0112"], + "0A04120406430102", + "0A04120406460102", + ]; + Operands[0x15d] = [ + "0B70137007700111", + "0B70137007700111", + "0A04120406430101", + "0A04120406460101", + ]; + Operands[0x15e] = [ + "0B70137007700112", + "0B70137007700112", + "0A04120406430102", + "0A04120406460102", + ]; + Operands[0x178] = [ + ["07080B080180", "", ["0B7007700111", "", "0B3807700119"], ""], + ["064F0C000C00", "", ["0B7007380119", "", "0B7007700111"], ""], + ["", "", "0B0C06440109", ""], + ["0A04064F0C000C00", "", "0B0C06460109", ""], + ]; + Operands[0x179] = [ + ["0B0807080180", "", ["0B7007700112", "", "0B380770011A"], ""], + ["0A04064F", "", ["0B700738011A", "", "0B7007700112"], ""], + ["", "", "0B0C0644010A", ""], + ["0A04064F", "", "0B0C0646010A", ""], + ]; + Operands[0x17a] = [ + "", + ["", "", ["0B7007380119", "", "0B7007700111"], ""], + ["", "", ["0B7007380112", "", "0B700770011A"], "0A06065A0112"], + ["", "", ["0B700770011A", "", "0B3807700112"], ""], + ]; + Operands[0x17b] = [ + "", + ["", "", ["0B700738011A", "", "0B7007700112"], ""], + ["", "", "0A041204070C010A", ""], + ["", "", "0A041204070C010A", ""], + ]; + Operands[0x17c] = [ + "", + ["0A040604", "0B7013700770", "", ""], + "", + ["0A040604", "0B7013700770", "", ""], + ]; + Operands[0x17d] = [ + "", + ["0A040604", "0B7013700770", "", ""], + "", + ["0A040604", "0B7013700770", "", ""], + ]; + Operands[0x17e] = [ + ["070C0A0A", "", "", ""], + ["06240A040108", "", "06360A040108"], + ["0A040646", "0A040646", ["", "", "0A0406460108"], ""], + "", + ]; + Operands[0x190] = [ + ["0600", ["0A0F0612", "", "0A0F0636"], "", ""], + ["0600", ["0A0F0600", "", "0A0F0624"], "", ""], + "", + "", + ]; + Operands[0x192] = [ + ["0600", ["0A0F06F4", "", ""], "", ""], + ["0600", ["0A0F06F4", "", ""], "", ""], + "", + ["0600", ["0A0F06F6", "", "0A0F06F6"], "", ""], + ]; + Operands[0x193] = [ + ["0600", ["06F40A0F", "", ""], "", ""], + ["0600", ["06F40A0F", "", ""], "", ""], + "", + ["0600", ["06F60A0F", "", "06F60A0F"], "", ""], + ]; + Operands[0x198] = [ + ["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], + ["0600", ["0A0F06FF", "", "0A0F06FF"], "", ""], + "", + "", + ]; + Operands[0x1a6] = "0B0E070E"; + Operands[0x1a7] = "070E0B0E"; + + //Adjust the VEX mask instructions for K1OM (Knights corner) which conflict with the enhanced AVX512 versions. + + if (type === 1) { + Mnemonics[0x141] = [["CMOVNO", "KAND", "", ""], "", "", ""]; + Mnemonics[0x142] = [["CMOVB", "KANDN", "", ""], "", "", ""]; + Mnemonics[0x144] = [["CMOVE", "KNOT", "", ""], "", "", ""]; + Mnemonics[0x145] = [["CMOVNE", "KOR", "", ""], "", "", ""]; + Mnemonics[0x146] = [["CMOVBE", "KXNOR", "", ""], "", "", ""]; + Mnemonics[0x147] = [["CMOVA", "KXOR", "", ""], "", "", ""]; + Mnemonics[0x190] = [["SETO", "KMOV", "", ""], "", "", ""]; + Mnemonics[0x192] = [["SETB", "KMOV", "", ""], "", "", ""]; + Mnemonics[0x193] = [["SETAE", "KMOV", "", ""], "", "", ""]; + Mnemonics[0x198] = [["SETS", "KORTEST", "", ""], "", "", ""]; + Operands[0x141] = [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x142] = [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x144] = [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x145] = [["0A02070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x146] = [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x147] = [["0B0E070E0180", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x190] = [["0600", "0A0F06FF", "", ""], "", "", ""]; + Operands[0x192] = [["0600", "06FF0B06", "", ""], "", "", ""]; + Operands[0x193] = [["0600", "07060A0F", "", ""], "", "", ""]; + Operands[0x198] = [["0600", "0A0F06FF", "", ""], "", "", ""]; + } + + //Disable Knights corner, and AVX512, for L1OM (Intel Larrabee). + + if (type === 2) { + Mnemonics[0x62] = ""; + } + + //Adjust the Mnemonics, and Operand encoding, for the Cyrix processors. + + if (type === 3) { + Mnemonics[0x138] = "SMINT"; + Mnemonics[0x13a] = "BB0_RESET"; + Mnemonics[0x13b] = "BB1_RESET"; + Mnemonics[0x13c] = "CPU_WRITE"; + Mnemonics[0x13d] = "CPU_READ"; + Mnemonics[0x150] = "PAVEB"; + Mnemonics[0x151] = "PADDSIW"; + Mnemonics[0x152] = "PMAGW"; + Mnemonics[0x154] = "PDISTIB"; + Mnemonics[0x155] = "PSUBSIW"; + Mnemonics[0x158] = "PMVZB"; + Mnemonics[0x159] = "PMULHRW"; + Mnemonics[0x15a] = "PMVNZB"; + Mnemonics[0x15b] = "PMVLZB"; + Mnemonics[0x15c] = "PMVGEZB"; + Mnemonics[0x15d] = "PMULHRIW"; + Mnemonics[0x15e] = "PMACHRIW"; + Mnemonics[0x178] = "SVDC"; + Mnemonics[0x179] = "RSDC"; + Mnemonics[0x17a] = "SVLDT"; + Mnemonics[0x17b] = "RSLDT"; + Mnemonics[0x17c] = "SVTS"; + Mnemonics[0x17d] = "RSTS"; + Mnemonics[0x17e] = "SMINT"; + Operands[0x150] = "0A0A06A9"; + Operands[0x151] = "0A0A06A9"; + Mnemonics[0x152] = "0A0A06A9"; + Operands[0x154] = "0A0A06AF"; + Operands[0x155] = "0A0A06A9"; + Operands[0x158] = "0A0A06AF"; + Operands[0x159] = "0A0A06A9"; + Mnemonics[0x15a] = "0A0A06AF"; + Operands[0x15b] = "0A0A06AF"; + Operands[0x15c] = "0A0A06AF"; + Mnemonics[0x15d] = "0A0A06A9"; + Operands[0x15e] = "0A0A06AF"; + Operands[0x178] = "30000A08"; + Operands[0x179] = "0A083000"; + Operands[0x17a] = "3000"; + Operands[0x17b] = "3000"; + Operands[0x17c] = "3000"; + Operands[0x17d] = "3000"; + Operands[0x17e] = ""; + } + + //Adjust the Mnemonics, and Operand encoding, for the Geode processor. + + if (type === 4) { + Mnemonics[0x138] = "SMINT"; + Mnemonics[0x139] = "DMINT"; + Mnemonics[0x13a] = "RDM"; + } + + //Adjust the Mnemonics, for the Centaur processor. + + if (type === 5) { + Mnemonics[0x13f] = "ALTINST"; + Mnemonics[0x1a6] = [ + "???", + ["MONTMUL", "XSA1", "XSA256", "???", "???", "???", "???", "???"], + ]; + Mnemonics[0x1a7] = [ + "???", + [ + "XSTORE", + ["???", "???", "XCRYPT-ECB", "???"], + ["???", "???", "XCRYPT-CBC", "???"], + ["???", "???", "XCRYPT-CTR", "???"], + ["???", "???", "XCRYPT-CFB", "???"], + ["???", "???", "XCRYPT-OFB", "???"], + "???", + "???", + ], + ]; + Operands[0x1a6] = ["", ["", "", "", "", "", "", "", ""]]; + Operands[0x1a7] = [ + "", + [ + "", + ["", "", "", ""], + ["", "", "", ""], + ["", "", "", ""], + ["", "", "", ""], + ["", "", "", ""], + "", + "", + ], + ]; + } + + //Adjust the Mnemonics, for the X86/486 processor and older. + + if (type === 6) { + Mnemonics[0x110] = "UMOV"; + Mnemonics[0x111] = "UMOV"; + Mnemonics[0x112] = "UMOV"; + Mnemonics[0x113] = "UMOV"; + Mnemonics[0x1a6] = "CMPXCHG"; + Mnemonics[0x1a7] = "CMPXCHG"; + Operands[0x110] = "06000A00"; + Operands[0x111] = "070E0B0E"; + Operands[0x112] = "0A000600"; + Operands[0x113] = "0B0E070E"; + Operands[0x1a6] = ""; + Operands[0x1a7] = ""; + } } /*------------------------------------------------------------------------------------------------------------------------- @@ -3543,59 +9908,60 @@ The function "GetPosition()" Gives back the current base address in it's proper If the hex input is invalid returns false. -------------------------------------------------------------------------------------------------------------------------*/ -export function LoadBinCode( HexStr ) -{ - //Clear BinCode, and Reset Code Position in Bin Code array. +export function LoadBinCode(HexStr) { + //Clear BinCode, and Reset Code Position in Bin Code array. - BinCode = []; CodePos = 0; + BinCode = []; + CodePos = 0; - //Iterate though the hex string and covert to 0 to 255 byte values into the BinCode array. + //Iterate though the hex string and covert to 0 to 255 byte values into the BinCode array. - var len = HexStr.length; + var len = HexStr.length; - for( var i = 0, el = 0, Sign = 0, int32 = 0; i < len; i += 8 ) - { - //It is faster to read 8 hex digits at a time if possible. + for (var i = 0, el = 0, Sign = 0, int32 = 0; i < len; i += 8) { + //It is faster to read 8 hex digits at a time if possible. - int32 = parseInt( HexStr.slice( i, i + 8 ), 16 ); + int32 = parseInt(HexStr.slice(i, i + 8), 16); - //If input is invalid return false. + //If input is invalid return false. - if( isNaN( int32 ) ){ return ( false ); } + if (isNaN(int32)) { + return false; + } - //If the end of the Hex string is reached and is not 8 digits the number has to be lined up. + //If the end of the Hex string is reached and is not 8 digits the number has to be lined up. - ( ( len - i ) < 8 ) && ( int32 <<= ( 8 - len - i ) << 2 ); + len - i < 8 && (int32 <<= (8 - len - i) << 2); - //The variable sing corrects the unusable sing bits during the 4 byte rotation algorithm. + //The variable sing corrects the unusable sing bits during the 4 byte rotation algorithm. - Sign = int32; + Sign = int32; - //Remove the Sign bit value if active for when the number is changed to int32 during rotation. + //Remove the Sign bit value if active for when the number is changed to int32 during rotation. - int32 ^= int32 & 0x80000000; + int32 ^= int32 & 0x80000000; - //Rotate the 32 bit int so that each number is put in order in the BinCode array. Add the Sign Bit positions back though each rotation. + //Rotate the 32 bit int so that each number is put in order in the BinCode array. Add the Sign Bit positions back though each rotation. - int32 = ( int32 >> 24 ) | ( ( int32 << 8 ) & 0x7FFFFFFF ); - BinCode[el++] = ( ( ( Sign >> 24 ) & 0x80 ) | int32 ) & 0xFF; - int32 = ( int32 >> 24 ) | ( ( int32 << 8 ) & 0x7FFFFFFF ); - BinCode[el++] = ( ( ( Sign >> 16 ) & 0x80 ) | int32 ) & 0xFF; - int32 = ( int32 >> 24 ) | ( ( int32 << 8 ) & 0x7FFFFFFF ); - BinCode[el++] = ( ( ( Sign >> 8 ) & 0x80 ) | int32 ) & 0xFF; - int32 = ( int32 >> 24 ) | ( ( int32 << 8 ) & 0x7FFFFFFF ); - BinCode[el++] = ( ( Sign & 0x80 ) | int32 ) & 0xFF; - } + int32 = (int32 >> 24) | ((int32 << 8) & 0x7fffffff); + BinCode[el++] = (((Sign >> 24) & 0x80) | int32) & 0xff; + int32 = (int32 >> 24) | ((int32 << 8) & 0x7fffffff); + BinCode[el++] = (((Sign >> 16) & 0x80) | int32) & 0xff; + int32 = (int32 >> 24) | ((int32 << 8) & 0x7fffffff); + BinCode[el++] = (((Sign >> 8) & 0x80) | int32) & 0xff; + int32 = (int32 >> 24) | ((int32 << 8) & 0x7fffffff); + BinCode[el++] = ((Sign & 0x80) | int32) & 0xff; + } - //Remove elements past the Number of bytes in HexStr because int 32 is always 4 bytes it is possible to end in an uneven number. + //Remove elements past the Number of bytes in HexStr because int 32 is always 4 bytes it is possible to end in an uneven number. - len >>= 1; + len >>= 1; - for(; len < BinCode.length; BinCode.pop() ); + for (; len < BinCode.length; BinCode.pop()); - //Return true for that the binary code loaded properly. + //Return true for that the binary code loaded properly. - return ( true ); + return true; } /*------------------------------------------------------------------------------------------------------------------------- @@ -3605,25 +9971,25 @@ This function also moves the binary code array position CodePos by one basically disassembler as it is decoding a sequence of bytes. -------------------------------------------------------------------------------------------------------------------------*/ -function NextByte() -{ - //Add the current byte as hex to InstructionHex which will be displayed beside the decoded instruction. - //After an instruction decodes InstructionHex is only added beside the instruction if ShowInstructionHex is active. - var t; - if ( CodePos < BinCode.length ) //If not out of bounds. - { - //Convert current byte to String, and pad. +function NextByte() { + //Add the current byte as hex to InstructionHex which will be displayed beside the decoded instruction. + //After an instruction decodes InstructionHex is only added beside the instruction if ShowInstructionHex is active. + var t; + if (CodePos < BinCode.length) { + //If not out of bounds. + //Convert current byte to String, and pad. - ( ( t = BinCode[CodePos++].toString(16) ).length === 1) && ( t = "0" + t ); + (t = BinCode[CodePos++].toString(16)).length === 1 && (t = "0" + t); - //Add it to the current bytes used for the decode instruction. + //Add it to the current bytes used for the decode instruction. - InstructionHex += t; + InstructionHex += t; - //Continue the Base address. + //Continue the Base address. - ( ( Pos32 += 1 ) > 0xFFFFFFFF ) && ( Pos32 = 0, ( ( Pos64 += 1 ) > 0xFFFFFFFF ) && ( Pos64 = 0 ) ); - } + (Pos32 += 1) > 0xffffffff && + ((Pos32 = 0), (Pos64 += 1) > 0xffffffff && (Pos64 = 0)); + } } /*------------------------------------------------------------------------------------------------------------------------- @@ -3632,27 +9998,36 @@ segment, and offset address. Note that the Code Segment is used in 16 bit code. if set 36, or higher. Effects instruction location in memory when decoding a program. -------------------------------------------------------------------------------------------------------------------------*/ -export function SetBasePosition( Address ) -{ - //Split the Segment:offset. +export function SetBasePosition(Address) { + //Split the Segment:offset. - var t = Address.split(":"); + var t = Address.split(":"); - //Set the 16 bit code segment position if there is one. + //Set the 16 bit code segment position if there is one. - if ( typeof t[1] !== "undefined" ){ CodeSeg = parseInt( t[0].slice( t[0].length - 4 ), 16 ); Address = t[1]; } + if (typeof t[1] !== "undefined") { + CodeSeg = parseInt(t[0].slice(t[0].length - 4), 16); + Address = t[1]; + } - //Adjust the Instruction pointer 16(IP)/32(EIP)/64(RIP). Also varies based on Bit Mode. + //Adjust the Instruction pointer 16(IP)/32(EIP)/64(RIP). Also varies based on Bit Mode. - var Len = Address.length; + var Len = Address.length; - if( Len >= 9 && BitMode == 2 ){ Pos64 = parseInt( Address.slice( Len - 16, Len - 8 ), 16 ); } - if( Len >= 5 && BitMode >= 1 && !( BitMode == 1 & CodeSeg >= 36 ) ){ Pos32 = parseInt( Address.slice( Len - 8 ), 16 ); } - else if( Len >= 1 && BitMode >= 0 ){ Pos32 = ( Pos32 & 0xFFFF0000 ) | ( parseInt( Address.slice( Len - 4 ), 16 ) ); } + if (Len >= 9 && BitMode == 2) { + Pos64 = parseInt(Address.slice(Len - 16, Len - 8), 16); + } + if (Len >= 5 && BitMode >= 1 && !((BitMode == 1) & (CodeSeg >= 36))) { + Pos32 = parseInt(Address.slice(Len - 8), 16); + } else if (Len >= 1 && BitMode >= 0) { + Pos32 = (Pos32 & 0xffff0000) | parseInt(Address.slice(Len - 4), 16); + } - //Convert Pos32 to undignified integer. + //Convert Pos32 to undignified integer. - if ( Pos32 < 0 ) { Pos32 += 0x100000000; } + if (Pos32 < 0) { + Pos32 += 0x100000000; + } } /*------------------------------------------------------------------------------------------------------------------------- @@ -3661,124 +10036,119 @@ In 16 bit an instruction location is Bound to the code segment location in memor In 32 bit an instruction location uses the first 32 bit's of the instruction pointer. -------------------------------------------------------------------------------------------------------------------------*/ -function GetPosition() -{ - //If 16 bit Seg:Offset, or if 32 bit and CodeSeg is 36, or higher. +function GetPosition() { + //If 16 bit Seg:Offset, or if 32 bit and CodeSeg is 36, or higher. - if( BitMode === 0 | ( BitMode === 1 & CodeSeg >= 36 ) ) - { - for ( var S16 = ( Pos32 & 0xFFFF ).toString(16); S16.length < 4; S16 = "0" + S16 ); - for ( var Seg = ( CodeSeg ).toString(16); Seg.length < 4; Seg = "0" + Seg ); - return( ( Seg + ":" + S16 ).toUpperCase() ); - } + if ((BitMode === 0) | ((BitMode === 1) & (CodeSeg >= 36))) { + for ( + var S16 = (Pos32 & 0xffff).toString(16); + S16.length < 4; + S16 = "0" + S16 + ); + for (var Seg = CodeSeg.toString(16); Seg.length < 4; Seg = "0" + Seg); + return (Seg + ":" + S16).toUpperCase(); + } - //32 bit, and 64 bit section. + //32 bit, and 64 bit section. - var S64="", S32=""; + var S64 = "", + S32 = ""; - //If 32 bit or higher. + //If 32 bit or higher. - if( BitMode >= 1 ) - { - for ( S32 = Pos32.toString(16); S32.length < 8; S32 = "0" + S32 ); - } + if (BitMode >= 1) { + for (S32 = Pos32.toString(16); S32.length < 8; S32 = "0" + S32); + } - //If 64 bit. + //If 64 bit. - if( BitMode === 2 ) - { - for ( S64 = Pos64.toString(16); S64.length < 8; S64 = "0" + S64 ); - } + if (BitMode === 2) { + for (S64 = Pos64.toString(16); S64.length < 8; S64 = "0" + S64); + } - //Return the 32/64 address. + //Return the 32/64 address. - return ( ( S64 + S32 ).toUpperCase() ); + return (S64 + S32).toUpperCase(); } /*------------------------------------------------------------------------------------------------------------------------- Moves the dissembler 64 bit address, and CodePos to correct address. Returns false if address location is out of bounds. -------------------------------------------------------------------------------------------------------------------------*/ -function GotoPosition( Address ) -{ - //Current address location. +function GotoPosition(Address) { + //Current address location. - var LocPos32 = Pos32; - var LocPos64 = Pos64; - var LocCodeSeg = CodeSeg; + var LocPos32 = Pos32; + var LocPos64 = Pos64; + var LocCodeSeg = CodeSeg; - //Split the by Segment:offset address format. + //Split the by Segment:offset address format. - var t = Address.split(":"); + var t = Address.split(":"); - //Set the 16 bit code segment location if there is one. + //Set the 16 bit code segment location if there is one. - if ( typeof t[1] !== "undefined" ) - { - LocCodeSeg = parseInt(t[0].slice( t[0].length - 4 ), 16); - Address = t[1]; - } + if (typeof t[1] !== "undefined") { + LocCodeSeg = parseInt(t[0].slice(t[0].length - 4), 16); + Address = t[1]; + } - var len = Address.length; + var len = Address.length; - //If the address is 64 bit's long, and bit mode is 64 bit adjust the 64 bit location. + //If the address is 64 bit's long, and bit mode is 64 bit adjust the 64 bit location. - if( len >= 9 && BitMode === 2 ) - { - LocPos64 = parseInt( Address.slice( len - 16, len - 8 ), 16 ); - } + if (len >= 9 && BitMode === 2) { + LocPos64 = parseInt(Address.slice(len - 16, len - 8), 16); + } - //If the address is 32 bit's long, and bit mode is 32 bit, or higher adjust the 32 bit location. + //If the address is 32 bit's long, and bit mode is 32 bit, or higher adjust the 32 bit location. - if( len >= 5 && BitMode >= 1 & !( BitMode === 1 & CodeSeg >= 36 ) ) - { - LocPos32 = parseInt( Address.slice( len - 8 ), 16 ); - } + if (len >= 5 && (BitMode >= 1) & !((BitMode === 1) & (CodeSeg >= 36))) { + LocPos32 = parseInt(Address.slice(len - 8), 16); + } - //Else If the address is 16 bit's long, and bit mode is 16 bit, or higher adjust the first 16 bit's in location 32. + //Else If the address is 16 bit's long, and bit mode is 16 bit, or higher adjust the first 16 bit's in location 32. + else if (len >= 1 && BitMode >= 0) { + LocPos32 = LocPos32 - LocPos32 + parseInt(Address.slice(len - 4), 16); + } - else if( len >= 1 && BitMode >= 0 ) - { - LocPos32 = ( LocPos32 - LocPos32 + parseInt( Address.slice( len - 4 ), 16 ) ); - } + //Find the difference between the current base address and the selected address location. - //Find the difference between the current base address and the selected address location. + var Dif32 = Pos32 - LocPos32, + Dif64 = Pos64 - LocPos64; - var Dif32 = Pos32 - LocPos32, Dif64 = Pos64 - LocPos64; + //Only calculate the Code Segment location if The program uses 16 bit address mode otherwise the + //code segment does not affect the address location. - //Only calculate the Code Segment location if The program uses 16 bit address mode otherwise the - //code segment does not affect the address location. + if ((BitMode === 1) & (CodeSeg >= 36) || BitMode === 0) { + Dif32 += (CodeSeg - LocCodeSeg) << 4; + } - if( ( BitMode === 1 & CodeSeg >= 36 ) || BitMode === 0 ) - { - Dif32 += ( CodeSeg - LocCodeSeg ) << 4; - } + //Before adjusting the Code Position Backup the Code Position in case that the address is out of bounds. - //Before adjusting the Code Position Backup the Code Position in case that the address is out of bounds. + t = CodePos; - t = CodePos; + //Subtract the difference to the CodePos position. - //Subtract the difference to the CodePos position. + CodePos -= Dif64 * 4294967296 + Dif32; - CodePos -= Dif64 * 4294967296 + Dif32; + //If code position is out of bound for the loaded binary in the BinCode array, or + //is a negative index return false and reset CodePos. - //If code position is out of bound for the loaded binary in the BinCode array, or - //is a negative index return false and reset CodePos. + if (CodePos < 0 || CodePos > BinCode.length) { + CodePos = t; + return false; + } - if( CodePos < 0 || CodePos > BinCode.length ) - { - CodePos = t; return ( false ); - } + //Set the base address so that it matches the Selected address location that Code position is moved to in relative space in the BinCode Array. - //Set the base address so that it matches the Selected address location that Code position is moved to in relative space in the BinCode Array. + CodeSeg = LocCodeSeg; + Pos32 = LocPos32; + Pos64 = LocPos64; - CodeSeg = LocCodeSeg; - Pos32 = LocPos32 - Pos64 = LocPos64; + //Return true for that the address Position is moved in range correctly. - //Return true for that the address Position is moved in range correctly. - - return ( true ); + return true; } /*------------------------------------------------------------------------------------------------------------------------- @@ -3793,107 +10163,141 @@ from this function Lines up With the Pinter array, and Register array indexes fo The variable SizeAttrSelect is separate from this function it is adjusted by prefixes that adjust Vector size, and General purpose registers. -------------------------------------------------------------------------------------------------------------------------*/ -function GetOperandSize( SizeAttribute ) -{ - /*---------------------------------------------------------------------------------------------------------------------------------------- +function GetOperandSize(SizeAttribute) { + /*---------------------------------------------------------------------------------------------------------------------------------------- Each S value goes in order to the vector length value in EVEX, and VEX Smallest to biggest in perfect alignment. SizeAttrSelect is set 1 by default, unless it is set 0 to 3 by the vector length bit's in the EVEX prefix, or 0 to 1 in the VEX prefix. In which if it is not an Vector instruction S2 acts as the mid default size attribute in 32 bit mode, and 64 bit mode for all instructions. ----------------------------------------------------------------------------------------------------------------------------------------*/ - var S4 = 0, S3 = 0, S2 = 0, S1 = 0, S0 = -1; //Note S0 is Vector size 1024, which is unused. + var S4 = 0, + S3 = 0, + S2 = 0, + S1 = 0, + S0 = -1; //Note S0 is Vector size 1024, which is unused. - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Lookup the Highest active bit in the SizeAttribute value giving the position the bit is in the number. S1 will be the biggest size attribute. In which this size attribute is only used when the extended size is active from the Rex prefix using the W (width) bit setting. In which sets variable SizeAttrSelect to 2 in value when the Width bit prefix setting is decoded, or if it is an Vector this is the Max vector size 512 in which when the EVEX.L'L bit's are set 10 = 2 sets SizeAttrSelect 2, note 11 = 3 is reserved for vectors 1024 in size. ----------------------------------------------------------------------------------------------------------------------------------------*/ - S1 = SizeAttribute; S1 = ( ( S1 & 0xF0 ) !== 0 ? ( S1 >>= 4, 4 ) : 0 ) | ( ( S1 & 0xC ) !== 0 ? ( S1 >>= 2, 2 ) : 0 ) | ( ( S1 >>= 1 ) !== 0 ); + S1 = SizeAttribute; + S1 = + ((S1 & 0xf0) !== 0 ? ((S1 >>= 4), 4) : 0) | + ((S1 & 0xc) !== 0 ? ((S1 >>= 2), 2) : 0) | + ((S1 >>= 1) !== 0); - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- If there is no size attributes then set S1 to -1 then the rest are set to S1 as they should have no size setting. ----------------------------------------------------------------------------------------------------------------------------------------*/ - if( SizeAttribute === 0 ) { S1 = -1; } + if (SizeAttribute === 0) { + S1 = -1; + } - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Convert the Bit Position of S1 into it's value and remove it by subtracting it into the SizeAttribute settings. ----------------------------------------------------------------------------------------------------------------------------------------*/ - SizeAttribute -= ( 1 << S1 ); + SizeAttribute -= 1 << S1; - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Lookup the Highest Second active bit in the SizeAttribute value giving the position the bit is in the number. In which S2 will be the default size attribute when SizeAttrSelect is 1 and has not been changed by prefixes, or If this is an vector SizeAttrSelect is set one by the EVEX.L'L bit's 01 = 1, or VEX.L is active 1 = 1 in which the Mid vector size is used. In which 256 is the Mid vector size some vectors are smaller some go 64/128/256 in which the mid size is 128. ----------------------------------------------------------------------------------------------------------------------------------------*/ - S2 = SizeAttribute; S2 = ( ( S2 & 0xF0 ) !== 0 ? ( S2 >>= 4, 4 ) : 0 ) | ( ( S2 & 0xC ) !== 0 ? ( S2 >>= 2, 2 ) : 0 ) | ( ( S2 >>= 1 ) !== 0 ); + S2 = SizeAttribute; + S2 = + ((S2 & 0xf0) !== 0 ? ((S2 >>= 4), 4) : 0) | + ((S2 & 0xc) !== 0 ? ((S2 >>= 2), 2) : 0) | + ((S2 >>= 1) !== 0); - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Convert the Bit Position of S2 into it's value and remove it by subtracting it if it is not 0. ----------------------------------------------------------------------------------------------------------------------------------------*/ - if( S2 !== 0 ) { SizeAttribute -= ( 1 << S2 ); } - - /*---------------------------------------------------------------------------------------------------------------------------------------- + if (S2 !== 0) { + SizeAttribute -= 1 << S2; + } else { + /*---------------------------------------------------------------------------------------------------------------------------------------- If it is 0 The highest size attribute is set as the default operand size. So S2 is aliased to S1, if there is no other Size setting attributes. ----------------------------------------------------------------------------------------------------------------------------------------*/ + S2 = S1; + } - else { S2 = S1; } - - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Lookup the Highest third active bit in the SizeAttribute value giving the position the bit is in the number. The third Size is only used if the Operand override prefix is used setting SizeAttrSelect to 0, or if this is an vector the EVEX.L'L bit's are 00 = 0 sets SizeAttrSelect 0, or VEX.L = 0 in which SizeAttrSelect is 0 using the smallest vector size. ----------------------------------------------------------------------------------------------------------------------------------------*/ - S3 = SizeAttribute; S3 = ( ( S3 & 0xF0 ) !== 0 ? ( S3 >>= 4, 4 ) : 0 ) | ( ( S3 & 0xC ) !== 0 ? ( S3 >>= 2, 2 ) : 0 ) | ( ( S3 >>= 1 ) !== 0 ); + S3 = SizeAttribute; + S3 = + ((S3 & 0xf0) !== 0 ? ((S3 >>= 4), 4) : 0) | + ((S3 & 0xc) !== 0 ? ((S3 >>= 2), 2) : 0) | + ((S3 >>= 1) !== 0); - /*---------------------------------------------------------------------------------------------------------------------------------------- + /*---------------------------------------------------------------------------------------------------------------------------------------- Convert the Bit Position of S3 into it's value and remove it by subtracting it if it is not 0. ----------------------------------------------------------------------------------------------------------------------------------------*/ - if( S3 !== 0 ) { SizeAttribute -= ( 1 << S3 ); } - - /*---------------------------------------------------------------------------------------------------------------------------------------- + if (S3 !== 0) { + SizeAttribute -= 1 << S3; + } else { + /*---------------------------------------------------------------------------------------------------------------------------------------- If it is 0 The second size attribute is set as the operand size. So S3 is aliased to S2, if there is no other Size setting attributes. ----------------------------------------------------------------------------------------------------------------------------------------*/ + S3 = S2; + if (S2 !== 2) { + S2 = S1; + } + } - else { S3 = S2; if( S2 !== 2 ) { S2 = S1; } }; + //In 32/16 bit mode the operand size must never exceed 32. - //In 32/16 bit mode the operand size must never exceed 32. + if (BitMode <= 1 && S2 >= 3 && !Vect) { + if ((S1 | S2 | S3) === S3) { + S1 = 2; + S3 = 2; + } //If single size all adjust 32. + S2 = 2; //Default operand size 32. + } - if ( BitMode <= 1 && S2 >= 3 && !Vect ) - { - if( ( S1 | S2 | S3 ) === S3 ){ S1 = 2; S3 = 2; } //If single size all adjust 32. - S2 = 2; //Default operand size 32. - } + //In 16 bit mode The operand override is always active until used. This makes all operands 16 bit size. + //When Operand override is used it is the default 32 size. Flip S3 with S2. - //In 16 bit mode The operand override is always active until used. This makes all operands 16 bit size. - //When Operand override is used it is the default 32 size. Flip S3 with S2. + if (BitMode === 0 && !Vect) { + var t = S3; + S3 = S2; + S2 = t; + } - if( BitMode === 0 && !Vect ) { var t = S3; S3 = S2; S2 = t; } + //If an Vect is active, then EVEX.W, VEX.W, or XOP.W bit acts as 32/64. - //If an Vect is active, then EVEX.W, VEX.W, or XOP.W bit acts as 32/64. + if ( + (Vect || Extension > 0) && + (S1 + S2 + S3 === 7) | (S1 + S2 + S3 === 5) + ) { + Vect = false; + return [S2, S1][WidthBit & 1]; + } - if( ( Vect || Extension > 0 ) && ( ( S1 + S2 + S3 ) === 7 | ( S1 + S2 + S3 ) === 5 ) ) { Vect = false; return( ( [ S2, S1 ] )[ WidthBit & 1 ] ); } + //If it is an vector, and Bround is active vector goes max size. - //If it is an vector, and Bround is active vector goes max size. + if (Vect && ConversionMode === 1) { + S0 = S1; + S3 = S1; + S2 = S1; + } - if( Vect && ConversionMode === 1 ) - { - S0 = S1; S3 = S1; S2 = S1; - } - - //Note the fourth size that is -1 in the returned size attribute is Vector length 11=3 which is invalid unless Intel decides to add 1024 bit vectors. - //The only time S0 is not negative one is if vector broadcast round is active. - - return( ( [ S3, S2, S1, S0 ] )[ SizeAttrSelect ] ); + //Note the fourth size that is -1 in the returned size attribute is Vector length 11=3 which is invalid unless Intel decides to add 1024 bit vectors. + //The only time S0 is not negative one is if vector broadcast round is active. + return [S3, S2, S1, S0][SizeAttrSelect]; } /*------------------------------------------------------------------------------------------------------------------------- @@ -3905,44 +10309,42 @@ The second element is the three bits for the ModR/M byte Opcode/Reg bits, or the The third element is the last three bits for the ModR/M byte the R/M bits, or the SIB Base Register value as a number value 0 to 7. -------------------------------------------------------------------------------------------------------------------------*/ -function Decode_ModRM_SIB_Value() -{ - //Get the current position byte value +function Decode_ModRM_SIB_Value() { + //Get the current position byte value - var v = BinCode[CodePos]; + var v = BinCode[CodePos]; - //The first tow binary digits of the read byte is the Mode bits of the ModR/M byte or - //The first tow binary digits of the byte is the Scale bits of the SIB byte. + //The first tow binary digits of the read byte is the Mode bits of the ModR/M byte or + //The first tow binary digits of the byte is the Scale bits of the SIB byte. - var ModeScale = (v >> 6) & 0x03; //value 0 to 3 + var ModeScale = (v >> 6) & 0x03; //value 0 to 3 - //The three binary digits of the read byte after the first two digits is the OpcodeReg Value of the ModR/M byte or - //The three binary digits of the read byte after the first two digits is the Index Register value for the SIB byte. + //The three binary digits of the read byte after the first two digits is the OpcodeReg Value of the ModR/M byte or + //The three binary digits of the read byte after the first two digits is the Index Register value for the SIB byte. - var OpcodeRegIndex = (v >> 3) & 0x07; //value 0 to 7 + var OpcodeRegIndex = (v >> 3) & 0x07; //value 0 to 7 - //The three binary digits at the end of the read byte is the R/M (Register,or Memory) Value of the ModR/M byte or - //The three binary digits at the end of the read byte is the Base Register Value of the SIB byte. + //The three binary digits at the end of the read byte is the R/M (Register,or Memory) Value of the ModR/M byte or + //The three binary digits at the end of the read byte is the Base Register Value of the SIB byte. - var RMBase = v & 0x07; //value 0 to 7 + var RMBase = v & 0x07; //value 0 to 7 - //Put the array together containing the three indexes with the value - //Note both the ModR/M byte and SIB byte use the same bit value pattern + //Put the array together containing the three indexes with the value + //Note both the ModR/M byte and SIB byte use the same bit value pattern - var ByteValueArray = [ - ModeScale,//Index 0 is the first tow bits for the Mode, or Scale Depending on what the byte value is used for. - OpcodeRegIndex,//Index 1 is the three bits for the OpcodeReg, or Index Depending on what the byte value is used for. - RMBase //Index 2 is the three bits for the RM, or BASE bits Depending on what the byte value is used for. - ]; + var ByteValueArray = [ + ModeScale, //Index 0 is the first tow bits for the Mode, or Scale Depending on what the byte value is used for. + OpcodeRegIndex, //Index 1 is the three bits for the OpcodeReg, or Index Depending on what the byte value is used for. + RMBase, //Index 2 is the three bits for the RM, or BASE bits Depending on what the byte value is used for. + ]; - //Move the Decoders Position by one. - - NextByte(); + //Move the Decoders Position by one. - //return the array containing the decoded values of the byte. + NextByte(); - return (ByteValueArray); + //return the array containing the decoded values of the byte. + return ByteValueArray; } /*------------------------------------------------------------------------------------------------------------------------- @@ -3958,250 +10360,270 @@ If BySize is false the SizeSetting is used numerically as a single size selectio 0=8,1=16,2=32,3=64 by size setting value. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeImmediate( type, BySize, SizeSetting ) -{ - - /*------------------------------------------------------------------------------------------------------------------------- +function DecodeImmediate(type, BySize, SizeSetting) { + /*------------------------------------------------------------------------------------------------------------------------- Initialize V32, and V64 which will store the Immediate value. JavaScript Float64 numbers can not accurately work with numbers 64 bit's long. So numbers are split into two numbers that should never exceed an 32 bit value though calculation. Numbers that are too big for the first 32 bit's are stored as the next 32 bit's in V64. -------------------------------------------------------------------------------------------------------------------------*/ - var V32 = 0, V64 = 0; + var V32 = 0, + V64 = 0; - //*Initialize the Pad Size for V32, and V64 depending On the Immediate type Calculation they use. + //*Initialize the Pad Size for V32, and V64 depending On the Immediate type Calculation they use. - var Pad32 = 0, Pad64 = 0; + var Pad32 = 0, + Pad64 = 0; - //*Initialize the Sign value that is only set for Negative, or Positive Relative displacements. + //*Initialize the Sign value that is only set for Negative, or Positive Relative displacements. - var Sign = 0; + var Sign = 0; - //*Initialize the Sign Extend variable size as 0 Some Immediate numbers Sign extend. + //*Initialize the Sign Extend variable size as 0 Some Immediate numbers Sign extend. - var Extend = 0; + var Extend = 0; - //*The variable S is the size of the Immediate. + //*The variable S is the size of the Immediate. - var S = SizeSetting & 0x0F; + var S = SizeSetting & 0x0f; - //*Extend size. + //*Extend size. - Extend = SizeSetting >> 4; + Extend = SizeSetting >> 4; - //*If by Size attributes is set true. + //*If by Size attributes is set true. - if ( BySize ) - { - S = GetOperandSize( S ); + if (BySize) { + S = GetOperandSize(S); - if ( Extend > 0 ) - { - Extend = GetOperandSize( Extend ); + if (Extend > 0) { + Extend = GetOperandSize(Extend); + } } - } - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- The possible values of S (Calculated Size) are S=0 is IMM8, S=1 is IMM16, S=2 is IMM32, S=3 is IMM64. Calculate how many bytes that are going to have to be read based on the value of S. S=0 is 1 byte, S=1 is 2 bytes, S=2 is 4 bytes, S=3 is 8 bytes. The Number of bytes to read is 2 to the power of S. -------------------------------------------------------------------------------------------------------------------------*/ - var n = 1 << S; + var n = 1 << S; - //Adjust Pad32, and Pad64. + //Adjust Pad32, and Pad64. - Pad32 = Math.min( n, 4 ); ( n >= 8 ) && ( Pad64 = 8 ); + Pad32 = Math.min(n, 4); + n >= 8 && (Pad64 = 8); - //Store the first byte of the immediate because IMM8 can use different encodings. + //Store the first byte of the immediate because IMM8 can use different encodings. - IMMValue = BinCode[CodePos]; + IMMValue = BinCode[CodePos]; - //*Loop and Move the Decoder to the next byte Code position to the number of bytes to read for V32, and V64. + //*Loop and Move the Decoder to the next byte Code position to the number of bytes to read for V32, and V64. - for ( var i = 0, v = 1; i < Pad32; V32 += BinCode[CodePos] * v, i++, v *= 256, NextByte() ); - for ( v = 1; i < Pad64; V64 += BinCode[CodePos] * v, i++, v *= 256, NextByte() ); + for ( + var i = 0, v = 1; + i < Pad32; + V32 += BinCode[CodePos] * v, i++, v *= 256, NextByte() + ); + for ( + v = 1; + i < Pad64; + V64 += BinCode[CodePos] * v, i++, v *= 256, NextByte() + ); - //*Adjust Pad32 so it matches the length the Immediate should be in hex for number of bytes read. + //*Adjust Pad32 so it matches the length the Immediate should be in hex for number of bytes read. - Pad32 <<= 1; Pad64 <<= 1; + Pad32 <<= 1; + Pad64 <<= 1; - /*--------------------------------------------------------------------------------------------------------------------------- + /*--------------------------------------------------------------------------------------------------------------------------- If the IMM type is used with an register operand on the upper four bit's then the IMM byte does not use the upper 4 bit's. ---------------------------------------------------------------------------------------------------------------------------*/ - if( type === 1 ) { V32 &= ( 1 << ( ( n << 3 ) - 4 ) ) - 1; } + if (type === 1) { + V32 &= (1 << ((n << 3) - 4)) - 1; + } - /*--------------------------------------------------------------------------------------------------------------------------- + /*--------------------------------------------------------------------------------------------------------------------------- If the Immediate is an relative address calculation. ---------------------------------------------------------------------------------------------------------------------------*/ - if ( type === 2 ) - { - //Calculate the Padded size for at the end of the function an Relative is padded to the size of the address based on bit mode. + if (type === 2) { + //Calculate the Padded size for at the end of the function an Relative is padded to the size of the address based on bit mode. - Pad32 = ( Math.min( BitMode, 1 ) << 2 ) + 4; Pad64 = Math.max( Math.min( BitMode, 2 ), 1 ) << 3; + Pad32 = (Math.min(BitMode, 1) << 2) + 4; + Pad64 = Math.max(Math.min(BitMode, 2), 1) << 3; - //Carry bit to 64 bit section. - - var C64 = 0; - - //Relative size. - - var n = Math.min( 0x100000000, Math.pow( 2, 4 << ( S + 1 ) ) ); - - //Sign bit adjust. - - if( V32 >= ( n >> 1 ) ) { V32 -= n; } - - //Add position. - - V32 += Pos32; - - //Remove carry bit and add it to C64. + //Carry bit to 64 bit section. - ( C64 = ( ( V32 ) >= 0x100000000 ) ) && ( V32 -= 0x100000000 ); - - //Do not carry to 64 if address is 32, and below. - - if ( S <= 2 ) { C64 = false; } + var C64 = 0; - //Add the 64 bit position plus carry. + //Relative size. - ( ( V64 += Pos64 + C64 ) > 0xFFFFFFFF ) && ( V64 -= 0x100000000 ); - } + var n = Math.min(0x100000000, Math.pow(2, 4 << (S + 1))); - /*--------------------------------------------------------------------------------------------------------------------------- + //Sign bit adjust. + + if (V32 >= n >> 1) { + V32 -= n; + } + + //Add position. + + V32 += Pos32; + + //Remove carry bit and add it to C64. + + (C64 = V32 >= 0x100000000) && (V32 -= 0x100000000); + + //Do not carry to 64 if address is 32, and below. + + if (S <= 2) { + C64 = false; + } + + //Add the 64 bit position plus carry. + + (V64 += Pos64 + C64) > 0xffffffff && (V64 -= 0x100000000); + } + + /*--------------------------------------------------------------------------------------------------------------------------- If the Immediate is an displacement calculation. ---------------------------------------------------------------------------------------------------------------------------*/ - if ( type === 3 ) - { - /*------------------------------------------------------------------------------------------------------------------------- + if (type === 3) { + /*------------------------------------------------------------------------------------------------------------------------- Calculate the displacement center point based on Immediate size. -------------------------------------------------------------------------------------------------------------------------*/ - //An displacement can not be bigger than 32 bit's, so Pad64 is set 0. + //An displacement can not be bigger than 32 bit's, so Pad64 is set 0. - Pad64 = 0; + Pad64 = 0; - //Now calculate the Center Point. + //Now calculate the Center Point. - var Center = 2 * ( 1 << ( n << 3 ) - 2 ); + var Center = 2 * (1 << ((n << 3) - 2)); - //By default the Sign is Positive. + //By default the Sign is Positive. - Sign = 1; + Sign = 1; - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- Calculate the VSIB displacement size if it is a VSIB Disp8. -------------------------------------------------------------------------------------------------------------------------*/ - if ( VSIB && S === 0 ) - { - var VScale = WidthBit | 2; - Center <<= VScale; V32 <<= VScale; + if (VSIB && S === 0) { + var VScale = WidthBit | 2; + Center <<= VScale; + V32 <<= VScale; + } + + //When the value is higher than the center it is negative. + + if (V32 >= Center) { + //Convert the number to the negative side of the center point. + + V32 = Center * 2 - V32; + + //The Sign is negative. + + Sign = 2; + } } - //When the value is higher than the center it is negative. - - if ( V32 >= Center ) - { - //Convert the number to the negative side of the center point. - - V32 = Center * 2 - V32; - - //The Sign is negative. - - Sign = 2; - } - } - - /*--------------------------------------------------------------------------------------------------------------------------- + /*--------------------------------------------------------------------------------------------------------------------------- Pad Imm based on the calculated Immediate size, because when an value is converted to an number as text that can be displayed the 0 digits to the left are removed. Think of this as like the number 000179 the actual length of the number is 6 digits, but is displayed as 179, because the unused digits are not displayed, but they still exist in the memory. ---------------------------------------------------------------------------------------------------------------------------*/ - for( var Imm = V32.toString(16), L = Pad32; Imm.length < L; Imm = "0" + Imm ); - if( Pad64 > 8 ) { for( Imm = V64.toString(16) + Imm, L = Pad64; Imm.length < L; Imm = "0" + Imm ); } + for ( + var Imm = V32.toString(16), L = Pad32; + Imm.length < L; + Imm = "0" + Imm + ); + if (Pad64 > 8) { + for ( + Imm = V64.toString(16) + Imm, L = Pad64; + Imm.length < L; + Imm = "0" + Imm + ); + } - /*--------------------------------------------------------------------------------------------------------------------------- + /*--------------------------------------------------------------------------------------------------------------------------- Extend Imm if it's extend size is bigger than the Current Imm size. ---------------------------------------------------------------------------------------------------------------------------*/ - if ( Extend !== S ) - { - //Calculate number of bytes to Extend till by size. + if (Extend !== S) { + //Calculate number of bytes to Extend till by size. - Extend = Math.pow( 2, Extend ) * 2; + Extend = Math.pow(2, Extend) * 2; - //Setup the Signified pad value. + //Setup the Signified pad value. - var spd = "00"; ( ( ( parseInt( Imm.substring(0, 1), 16) & 8 ) >> 3 ) ) && ( spd = "FF" ); + var spd = "00"; + (parseInt(Imm.substring(0, 1), 16) & 8) >> 3 && (spd = "FF"); - //Start padding. + //Start padding. - for (; Imm.length < Extend; Imm = spd + Imm); - } + for (; Imm.length < Extend; Imm = spd + Imm); + } - //*Return the Imm. - - return ( ( Sign > 0 ? ( Sign > 1 ? "-" : "+" ) : "" ) + Imm.toUpperCase() ); + //*Return the Imm. + return (Sign > 0 ? (Sign > 1 ? "-" : "+") : "") + Imm.toUpperCase(); } /*------------------------------------------------------------------------------------------------------------------------- Decode registers by Size attributes, or a select register index. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeRegValue( RValue, BySize, Setting ) -{ - //If the instruction is a Vector instruction, and no extension is active like EVEX, VEX Make sure Size attribute uses the default vector size. +function DecodeRegValue(RValue, BySize, Setting) { + //If the instruction is a Vector instruction, and no extension is active like EVEX, VEX Make sure Size attribute uses the default vector size. - if( Vect && Extension === 0 ) - { - SizeAttrSelect = 0; - } + if (Vect && Extension === 0) { + SizeAttrSelect = 0; + } - //If By size is true Use the Setting with the GetOperandSize + //If By size is true Use the Setting with the GetOperandSize - if ( BySize ) - { - Setting = GetOperandSize( Setting ); //get decoded size value. + if (BySize) { + Setting = GetOperandSize(Setting); //get decoded size value. - //Any Vector register smaller than 128 has to XMM because XMM is the smallest SIMD Vector register. + //Any Vector register smaller than 128 has to XMM because XMM is the smallest SIMD Vector register. - if( Vect && Setting < 4 ) { Setting = 4; } - } + if (Vect && Setting < 4) { + Setting = 4; + } + } - //If XOP only vector 0 to 15 are usable. - - if( Opcode >= 0x400 ) { RValue &= 15; } + //If XOP only vector 0 to 15 are usable. - //Else If 16/32 bit mode in VEX/EVEX/MVEX vctor register can only go 0 though 7. + if (Opcode >= 0x400) { + RValue &= 15; + } - else if( BitMode <= 1 && Extension >= 1 ) { RValue &= 7; } + //Else If 16/32 bit mode in VEX/EVEX/MVEX vctor register can only go 0 though 7. + else if (BitMode <= 1 && Extension >= 1) { + RValue &= 7; + } - //If L1OM ZMM to V reg. + //If L1OM ZMM to V reg. - if ( Opcode >= 0x700 && Setting === 6 ) - { - Setting = 16; - } + if (Opcode >= 0x700 && Setting === 6) { + Setting = 16; + } - //Else if 8 bit high/low Registers + //Else if 8 bit high/low Registers + else if (Setting === 0) { + return REG[0][RexActive][RValue]; + } - else if ( Setting === 0 ) - { - return (REG[0][RexActive][ RValue ]); - } + //Return the Register. - //Return the Register. - - return (REG[Setting][ RValue ]); + return REG[Setting][RValue]; } /*------------------------------------------------------------------------------------------------------------------------- @@ -4210,96 +10632,94 @@ Note if by size attributes is false the lower four bits is the selected Memory p and the higher four bits is the selected register. -------------------------------------------------------------------------------------------------------------------------*/ -function Decode_ModRM_SIB_Address( ModRM, BySize, Setting ) -{ - var out = ""; //the variable out is what stores the decoded address pointer, or Register if Register mode. - var S_C = "{"; //L1OM, and K1OM {SSS,CCCCC} setting decoding, or EVEX broadcast round. - - //------------------------------------------------------------------------------------------------------------------------- - //If the ModR/M is not in register mode decode it as an Effective address. - //------------------------------------------------------------------------------------------------------------------------- - - if( ModRM[0] !== 3 ) - { - - //If the instruction is a Vector instruction, and no extension is active like EVEX, VEX Make sure Size attribute uses the default vector size. - - if( Vect && Extension === 0 ) - { - SizeAttrSelect = 0; - } +function Decode_ModRM_SIB_Address(ModRM, BySize, Setting) { + var out = ""; //the variable out is what stores the decoded address pointer, or Register if Register mode. + var S_C = "{"; //L1OM, and K1OM {SSS,CCCCC} setting decoding, or EVEX broadcast round. //------------------------------------------------------------------------------------------------------------------------- - //The Selected Size is setting unless BySize attribute is true. + //If the ModR/M is not in register mode decode it as an Effective address. //------------------------------------------------------------------------------------------------------------------------- - if ( BySize ) - { - //------------------------------------------------------------------------------------------------------------------------- - //Check if it is not the non vectorized 128 which uses "Oword ptr". - //------------------------------------------------------------------------------------------------------------------------- + if (ModRM[0] !== 3) { + //If the instruction is a Vector instruction, and no extension is active like EVEX, VEX Make sure Size attribute uses the default vector size. - if ( Setting !== 16 || Vect ) - { - Setting = ( GetOperandSize( Setting ) << 1 ) | FarPointer; - } + if (Vect && Extension === 0) { + SizeAttrSelect = 0; + } - //------------------------------------------------------------------------------------------------------------------------- - //Non vectorized 128 uses "Oword ptr" alaises to "QWord ptr" in 32 bit mode, or lower. - //------------------------------------------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------------------------------------------- + //The Selected Size is setting unless BySize attribute is true. + //------------------------------------------------------------------------------------------------------------------------- - else if ( !Vect ) { Setting = 11 - ( ( BitMode <= 1 ) * 5 ); } - } + if (BySize) { + //------------------------------------------------------------------------------------------------------------------------- + //Check if it is not the non vectorized 128 which uses "Oword ptr". + //------------------------------------------------------------------------------------------------------------------------- - //------------------------------------------------------------------------------------------------------------------------- - //If By size attributes is false the selected Memory pointer is the first four bits of the size setting for all pointer indexes 0 to 15. - //Also if By size attribute is also true the selected by size index can not exceed 15 anyways which is the max combination the first four bits. - //------------------------------------------------------------------------------------------------------------------------- + if (Setting !== 16 || Vect) { + Setting = (GetOperandSize(Setting) << 1) | FarPointer; + } - Setting = Setting & 0x0F; + //------------------------------------------------------------------------------------------------------------------------- + //Non vectorized 128 uses "Oword ptr" alaises to "QWord ptr" in 32 bit mode, or lower. + //------------------------------------------------------------------------------------------------------------------------- + else if (!Vect) { + Setting = 11 - (BitMode <= 1) * 5; + } + } - //If Vector extended then MM is changed to QWORD. + //------------------------------------------------------------------------------------------------------------------------- + //If By size attributes is false the selected Memory pointer is the first four bits of the size setting for all pointer indexes 0 to 15. + //Also if By size attribute is also true the selected by size index can not exceed 15 anyways which is the max combination the first four bits. + //------------------------------------------------------------------------------------------------------------------------- - if( Extension !== 0 && Setting === 9 ){ Setting = 6; } + Setting = Setting & 0x0f; - //Bround control, or 32/64 VSIB. + //If Vector extended then MM is changed to QWORD. - if ( ConversionMode === 1 || ConversionMode === 2 || VSIB ) { out += PTR[WidthBit > 0 ? 6 : 4]; } + if (Extension !== 0 && Setting === 9) { + Setting = 6; + } - //------------------------------------------------------------------------------------------------------------------------- - //Get the pointer size by Size setting. - //------------------------------------------------------------------------------------------------------------------------- + //Bround control, or 32/64 VSIB. - else{ out = PTR[Setting]; } + if (ConversionMode === 1 || ConversionMode === 2 || VSIB) { + out += PTR[WidthBit > 0 ? 6 : 4]; + } - //Add the Segment override left address bracket if any segment override was used otherwise the SegOverride string should be just a normal left bracket. + //------------------------------------------------------------------------------------------------------------------------- + //Get the pointer size by Size setting. + //------------------------------------------------------------------------------------------------------------------------- + else { + out = PTR[Setting]; + } - out += SegOverride; + //Add the Segment override left address bracket if any segment override was used otherwise the SegOverride string should be just a normal left bracket. - //------------------------------------------------------------------------------------------------------------------------- - //calculate the actual address size according to the Address override and the CPU bit mode. - //------------------------------------------------------------------------------------------------------------------------- - //AddressSize 1 is 16, AddressSize 2 is 32, AddressSize 3 is 64. - //The Bit mode is the address size except AddressOverride reacts differently in different bit modes. - //In 16 bit AddressOverride switches to the 32 bit ModR/M effective address system. - //In both 32/64 the Address size goes down by one is size. - //------------------------------------------------------------------------------------------------------------------------- + out += SegOverride; - var AddressSize = BitMode + 1; + //------------------------------------------------------------------------------------------------------------------------- + //calculate the actual address size according to the Address override and the CPU bit mode. + //------------------------------------------------------------------------------------------------------------------------- + //AddressSize 1 is 16, AddressSize 2 is 32, AddressSize 3 is 64. + //The Bit mode is the address size except AddressOverride reacts differently in different bit modes. + //In 16 bit AddressOverride switches to the 32 bit ModR/M effective address system. + //In both 32/64 the Address size goes down by one is size. + //------------------------------------------------------------------------------------------------------------------------- - if (AddressOverride) - { - AddressSize = AddressSize - 1; + var AddressSize = BitMode + 1; - //the only time the address size is 0 is if the BitMode is 16 bit's and is subtracted by one resulting in 0. + if (AddressOverride) { + AddressSize = AddressSize - 1; - if(AddressSize === 0) - { - AddressSize = 2; //set the address size to 32 bit from the 16 bit address mode. - } - } + //the only time the address size is 0 is if the BitMode is 16 bit's and is subtracted by one resulting in 0. - /*------------------------------------------------------------------------------------------------------------------------- + if (AddressSize === 0) { + AddressSize = 2; //set the address size to 32 bit from the 16 bit address mode. + } + } + + /*------------------------------------------------------------------------------------------------------------------------- The displacement size calculation. --------------------------------------------------------------------------------------------------------------------------- In 16/32/64 the mode setting 1 will always add a Displacement of 8 to the address. @@ -4307,19 +10727,18 @@ function Decode_ModRM_SIB_Address( ModRM, BySize, Setting ) In 32/64 the Mode Setting 2 for the effective address adds an displacement of 32 to the effective address. -------------------------------------------------------------------------------------------------------------------------*/ - var Disp = ModRM[0] - 1; //Let disp relate size to mode value of the ModR/M. + var Disp = ModRM[0] - 1; //Let disp relate size to mode value of the ModR/M. - //if 32 bit and above, and if Mode is 2 then disp size is disp32. + //if 32 bit and above, and if Mode is 2 then disp size is disp32. - if(AddressSize >= 2 && ModRM[0] === 2) - { - Disp += 1; //Only one more higher in size is 32. - } + if (AddressSize >= 2 && ModRM[0] === 2) { + Disp += 1; //Only one more higher in size is 32. + } - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- End of calculation. -------------------------------------------------------------------------------------------------------------------------*/ - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- Normally the displacement type is an relative Immediate that is added ("+"), or subtracted ("-") from the center point to the selected base register, and the size depends on mode settings 1, and 2, and also Address bit mode (Displacement calculation). @@ -4327,255 +10746,296 @@ function Decode_ModRM_SIB_Address( ModRM, BySize, Setting ) so some modes, and registers combinations where used for different Immediate displacements. -------------------------------------------------------------------------------------------------------------------------*/ - var DispType = 3; //by default the displacement size is added to the selected base register, or Index register if SIB byte combination is used. + var DispType = 3; //by default the displacement size is added to the selected base register, or Index register if SIB byte combination is used. - //-------------------------------------------16 Bit ModR/M address decode logic------------------------------------------- + //-------------------------------------------16 Bit ModR/M address decode logic------------------------------------------- - if( AddressSize === 1 ) - { + if (AddressSize === 1) { + //if ModR/M mode bits 0, and Base Register value is 6 then disp16 with DispType mode 0. - //if ModR/M mode bits 0, and Base Register value is 6 then disp16 with DispType mode 0. + if (AddressSize === 1 && ModRM[0] === 0 && ModRM[2] === 6) { + Disp = 1; + DispType = 0; + } - if(AddressSize === 1 && ModRM[0] === 0 && ModRM[2] === 6) - { - Disp = 1; - DispType = 0; - } + //BX , BP switch based on bit 2 of the Register value - //BX , BP switch based on bit 2 of the Register value + if (ModRM[2] < 4) { + out += REG[AddressSize][3 + (ModRM[2] & 2)] + "+"; + } - if( ModRM[2] < 4 ){ out += REG[ AddressSize ][ 3 + ( ModRM[2] & 2 ) ] + "+"; } + //The first bit switches between Destination index, and source index - //The first bit switches between Destination index, and source index + if (ModRM[2] < 6) { + out += REG[AddressSize][6 + (ModRM[2] & 1)]; + } - if( ModRM[2] < 6 ){ out += REG[ AddressSize ][ 6 + ( ModRM[2] & 1 ) ]; } + //[BP], and [BX] as long as Mode is not 0, and Register is not 6 which sets DispType 0. + else if (DispType !== 0) { + out += REG[AddressSize][17 - (ModRM[2] << 1)]; + } + } //End of 16 bit ModR/M decode logic. - //[BP], and [BX] as long as Mode is not 0, and Register is not 6 which sets DispType 0. + //-------------------------------------------Else 32/64 ModR/M------------------------------------------- + else { + //if Mode is 0 and Base Register value is 5 then it uses an Relative (RIP) disp32. - else if ( DispType !== 0 ) { out += REG[ AddressSize ][ 17 - ( ModRM[2] << 1 ) ]; } - } //End of 16 bit ModR/M decode logic. + if (ModRM[0] === 0 && ModRM[2] === 5) { + Disp = 2; + DispType = 2; + } - //-------------------------------------------Else 32/64 ModR/M------------------------------------------- + //check if Base Register is 4 which goes into the SIB address system - else - { + if (ModRM[2] === 4) { + //Decode the SIB byte. - //if Mode is 0 and Base Register value is 5 then it uses an Relative (RIP) disp32. + var SIB = Decode_ModRM_SIB_Value(); - if( ModRM[0] === 0 && ModRM[2] === 5 ) - { - Disp = 2; - DispType = 2; - } + //Calculate the Index register with it's Extended value because the index register will only cancel out if 4 in value. - //check if Base Register is 4 which goes into the SIB address system + var IndexReg = IndexExtend | SIB[1]; - if( ModRM[2] === 4 ) - { - //Decode the SIB byte. + //check if the base register is 5 in value in the SIB without it's added extended value, and that the ModR/M Mode is 0 this activates Disp32 - var SIB = Decode_ModRM_SIB_Value(); + if (ModRM[0] === 0 && SIB[2] === 5 && !VSIB) { + Disp = 2; //Set Disp32 - //Calculate the Index register with it's Extended value because the index register will only cancel out if 4 in value. + //check if the Index register is canceled out as well - var IndexReg = IndexExtend | SIB[1]; + if (IndexReg === 4) { + //if the Index is canceled out then + DispType = 0; //a regular IMM32 is used as the address. - //check if the base register is 5 in value in the SIB without it's added extended value, and that the ModR/M Mode is 0 this activates Disp32 + //*if the Address size is 64 then the 32 bit Immediate must pad to the full 64 bit address. - if ( ModRM[0] === 0 && SIB[2] === 5 && !VSIB ) - { - Disp = 2; //Set Disp32 + if (AddressSize === 3) { + Disp = 50; + } + } + } - //check if the Index register is canceled out as well + //Else Base register is not 5, and the Mode is not 0 then decode the base register normally. + else { + out += REG[AddressSize][(BaseExtend & 8) | SIB[2]]; - if (IndexReg === 4) //if the Index is canceled out then - { - DispType = 0; //a regular IMM32 is used as the address. + //If the Index Register is not Canceled out (Note this is only reachable if base register was decoded and not canceled out) - //*if the Address size is 64 then the 32 bit Immediate must pad to the full 64 bit address. + if (IndexReg !== 4 || VSIB) { + out = out + "+"; //Then add the Plus in front of the Base register to add the index register + } + } - if( AddressSize === 3 ) { Disp = 50; } - } + //if Index Register is not Canceled, and that it is not an Vector register then decode the Index with the possibility of the base register. + + if (IndexReg !== 4 && !VSIB) { + out += REG[AddressSize][IndexExtend | IndexReg]; + + //add what the scale bits decode to the Index register by the value of the scale bits which select the name from the scale array. + + out = out + scale[SIB[0]]; + } + + //Else if it is an vector register. + else if (VSIB) { + Setting = Setting < 8 ? 4 : Setting >> 1; + + if (Opcode < 0x700) { + IndexReg |= VectorRegister & 0x10; + } + + out += DecodeRegValue( + IndexExtend | IndexReg, + false, + Setting, + ); //Decode Vector register by length setting and the V' extension. + + //add what the scale bits decode to the Index register by the value of the scale bits which select the name from the scale array. + + out = out + scale[SIB[0]]; + } + } //END OF THE SIB BYTE ADDRESS DECODE. + + //else Base register is not 4 and does not go into the SIB ADDRESS. + //Decode the Base register regularly plus it's Extended value if relative (RIP) disp32 is not used. + else if (DispType !== 2) { + out += REG[AddressSize][(BaseExtend & 8) | ModRM[2]]; + } } - //Else Base register is not 5, and the Mode is not 0 then decode the base register normally. + //Finally the Immediate displacement is put into the Address last. - else - { - out += REG[ AddressSize ][ BaseExtend & 8 | SIB[2] ]; - - //If the Index Register is not Canceled out (Note this is only reachable if base register was decoded and not canceled out) - - if ( IndexReg !== 4 || VSIB ) - { - out = out + "+"; //Then add the Plus in front of the Base register to add the index register - } + if (Disp >= 0) { + out += DecodeImmediate(DispType, false, Disp); } - //if Index Register is not Canceled, and that it is not an Vector register then decode the Index with the possibility of the base register. + //Put the right bracket on the address. - if ( IndexReg !== 4 && !VSIB ) - { - out += REG[ AddressSize ][ IndexExtend | IndexReg ]; + out += "]"; - //add what the scale bits decode to the Index register by the value of the scale bits which select the name from the scale array. + //----------------------L1OM/MVEX/EVEX memory conversion mode, or broadcast round----------------------- - out = out + scale[SIB[0]]; + if ( + ConversionMode !== 0 && //Not used if set 0. + !( + ( + (ConversionMode === 3 && + (Opcode >= 0x700 || (!(Opcode >= 0x700) && !Float))) || //If bad L1OM/K1OM float conversion. + (!(Opcode >= 0x700) && + (VectS === 0 || + (ConversionMode === 5 && VectS === 5) || //If K1OM UNorm conversion L1OM only. + (ConversionMode !== 1 && VectS === 1) ^ + (ConversionMode < 3 && !Swizzle))) + ) //Or K1OM broadcast Swizzle, and special case {4to16} only. + ) + ) { + //Calculate Conversion. + + if (ConversionMode >= 4) { + ConversionMode += 2; + } + if (ConversionMode >= 8) { + ConversionMode += 2; + } + + //If L1OM. + + if (Opcode >= 0x700) { + //If L1OM without Swizzle. + + if (!Swizzle && ConversionMode > 2) { + ConversionMode = 31; + } + + //L1OM Float adjust. + else if (Float) { + if (ConversionMode === 7) { + ConversionMode++; + } + if (ConversionMode === 10) { + ConversionMode = 3; + } + } + } + + //Set conversion. Note K1OM special case inverts width bit. + + out += + S_C + + ConversionModes[ + (ConversionMode << 1) | + ((WidthBit ^ (!(Opcode >= 0x700) & (VectS === 7))) & 1) + ]; + S_C = ","; } - - //Else if it is an vector register. - - else if ( VSIB ) - { - Setting = ( Setting < 8 ) ? 4 : Setting >> 1; - if( Opcode < 0x700 ) { IndexReg |= ( VectorRegister & 0x10 ); } - - out += DecodeRegValue( IndexExtend | IndexReg, false, Setting ); //Decode Vector register by length setting and the V' extension. - - //add what the scale bits decode to the Index register by the value of the scale bits which select the name from the scale array. - - out = out + scale[SIB[0]]; + //Else bad Conversion setting. + else if (ConversionMode !== 0) { + out += S_C + "Error"; + S_C = ","; } - } //END OF THE SIB BYTE ADDRESS DECODE. - //else Base register is not 4 and does not go into the SIB ADDRESS. - //Decode the Base register regularly plus it's Extended value if relative (RIP) disp32 is not used. + //--------------------------------END of memory Conversion control logic-------------------------------- + } //End of Memory address Modes 00, 01, 10 decode. - else if(DispType !== 2) - { - out += REG[ AddressSize ][ BaseExtend & 8 | ModRM[2] ]; - } - } + //-----------------------------else the ModR/M mode bits are 11 register Mode----------------------------- + else { + //------------------------------------------------------------------------------------------------------------------------- + //The Selected Size is setting unless BySize attribute is true. + //------------------------------------------------------------------------------------------------------------------------- + //MVEX/EVEX round mode. - //Finally the Immediate displacement is put into the Address last. - - if( Disp >= 0 ) { out += DecodeImmediate( DispType, false, Disp ); } - - //Put the right bracket on the address. - - out += "]"; - - //----------------------L1OM/MVEX/EVEX memory conversion mode, or broadcast round----------------------- - - if( - ( ConversionMode !== 0 ) && //Not used if set 0. - !( - ( ConversionMode === 3 && ( Opcode >= 0x700 || !( Opcode >= 0x700 ) && !Float ) ) || //If bad L1OM/K1OM float conversion. - ( !( Opcode >= 0x700 ) && ( VectS === 0 || ( ConversionMode === 5 && VectS === 5 ) || //If K1OM UNorm conversion L1OM only. - ( ConversionMode !== 1 && VectS === 1 ) ^ ( ConversionMode < 3 && !Swizzle ) ) ) //Or K1OM broadcast Swizzle, and special case {4to16} only. - ) - ) - { - //Calculate Conversion. - - if( ConversionMode >= 4 ){ ConversionMode += 2; } - if( ConversionMode >= 8 ){ ConversionMode += 2; } - - //If L1OM. - - if( Opcode >= 0x700 ) - { - //If L1OM without Swizzle. - - if ( !Swizzle && ConversionMode > 2 ) { ConversionMode = 31; } - - //L1OM Float adjust. - - else if( Float ) - { - if( ConversionMode === 7 ) { ConversionMode++; } - if( ConversionMode === 10 ) { ConversionMode = 3; } + if ( + (Extension === 3 && HInt_ZeroMerg) || + (Extension === 2 && ConversionMode === 1) + ) { + RoundMode |= RoundingSetting; } - } - //Set conversion. Note K1OM special case inverts width bit. + //If the upper 4 bits are defined and by size is false then the upper four bits is the selected register. - out += S_C + ConversionModes[ ( ConversionMode << 1 ) | ( WidthBit ^ ( !( Opcode >= 0x700 ) & VectS === 7 ) ) & 1 ]; S_C = ","; + if ((Setting & 0xf0) > 0 && !BySize) { + Setting >>= 4; + } + + //Decode the register with Base expansion. + + out = DecodeRegValue(BaseExtend | ModRM[2], BySize, Setting); + + //L1OM/K1OM Register swizzle modes. + + if (Opcode >= 0x700 || (Extension === 3 && !HInt_ZeroMerg && Swizzle)) { + if (Opcode >= 0x700 && ConversionMode >= 3) { + ConversionMode++; + } //L1OM skips swizzle type DACB. + if (ConversionMode !== 0) { + out += S_C + RegSwizzleModes[ConversionMode]; + S_C = ","; + } + } + if (Extension !== 2) { + HInt_ZeroMerg = false; + } //Cache memory control is not possible in Register mode. } - //Else bad Conversion setting. + //--------------------------------------------------L1OM.CCCCC conversions------------------------------------------------- - else if( ConversionMode !== 0 ) { out += S_C + "Error"; S_C = ","; } - - //--------------------------------END of memory Conversion control logic-------------------------------- + if (Opcode >= 0x700) { + //Swizzle Field control Int/Float, or Exponent adjustment. - } //End of Memory address Modes 00, 01, 10 decode. + if (Swizzle) { + if (Opcode === 0x79a) { + out += S_C + ConversionModes[(18 | (VectorRegister & 3)) << 1]; + S_C = "}"; + } else if (Opcode === 0x79b) { + out += S_C + ConversionModes[(22 + (VectorRegister & 3)) << 1]; + S_C = "}"; + } else if ((RoundingSetting & 8) === 8) { + out += S_C + RoundModes[24 | (VectorRegister & 7)]; + S_C = "}"; + } + } - //-----------------------------else the ModR/M mode bits are 11 register Mode----------------------------- - - else - { - //------------------------------------------------------------------------------------------------------------------------- - //The Selected Size is setting unless BySize attribute is true. - //------------------------------------------------------------------------------------------------------------------------- - - //MVEX/EVEX round mode. - - if ( ( Extension === 3 && HInt_ZeroMerg ) || ( Extension === 2 && ConversionMode === 1 ) ) - { - RoundMode |= RoundingSetting; + //Up/Down Conversion. + else if (VectorRegister !== 0) { + if ( + (Up && VectorRegister !== 2) || //Up conversion "float16rz" is bad. + (!Up && VectorRegister !== 3 && VectorRegister <= 15) //Down conversion "srgb8", and field control is bad. + ) { + out += + S_C + + ConversionModes[((VectorRegister + 2) << 1) | WidthBit]; + S_C = "}"; + } else { + out += S_C + "Error"; + S_C = "}"; + } //Else Invalid setting. + } + } + if (S_C === ",") { + S_C = "}"; } - //If the upper 4 bits are defined and by size is false then the upper four bits is the selected register. + //Right bracket if any SSS,CCCCC conversion mode setting. - if( ( ( Setting & 0xF0 ) > 0 ) && !BySize ) { Setting >>= 4; } - - //Decode the register with Base expansion. - - out = DecodeRegValue( BaseExtend | ModRM[2], BySize, Setting ); - - //L1OM/K1OM Register swizzle modes. - - if( Opcode >= 0x700 || ( Extension === 3 && !HInt_ZeroMerg && Swizzle ) ) - { - if( Opcode >= 0x700 && ConversionMode >= 3 ){ ConversionMode++; } //L1OM skips swizzle type DACB. - if( ConversionMode !== 0 ){ out += S_C + RegSwizzleModes[ ConversionMode ]; S_C = ","; } - } - if( Extension !== 2 ){ HInt_ZeroMerg = false; } //Cache memory control is not possible in Register mode. - } - - //--------------------------------------------------L1OM.CCCCC conversions------------------------------------------------- - - if( Opcode >= 0x700 ) - { - //Swizzle Field control Int/Float, or Exponent adjustment. - - if(Swizzle) - { - if( Opcode === 0x79A ) { out += S_C + ConversionModes[ ( 18 | ( VectorRegister & 3 ) ) << 1 ]; S_C = "}"; } - else if( Opcode === 0x79B ) { out += S_C + ConversionModes[ ( 22 + ( VectorRegister & 3 ) ) << 1 ]; S_C = "}"; } - else if( ( RoundingSetting & 8 ) === 8 ) { out += S_C + RoundModes [ 24 | ( VectorRegister & 7 ) ]; S_C = "}"; } + if (S_C === "}") { + out += S_C; } - //Up/Down Conversion. + //------------------------------------------L1OM/K1OM Hint cache memory control-------------------------------------------- - else if( VectorRegister !== 0 ) - { - if( ( ( Up && VectorRegister !== 2 ) || //Up conversion "float16rz" is bad. - ( !Up && VectorRegister !== 3 && VectorRegister <= 15 ) ) //Down conversion "srgb8", and field control is bad. - ) { out += S_C + ConversionModes[ ( ( VectorRegister + 2 ) << 1 ) | WidthBit ]; S_C = "}"; } - else { out += S_C + "Error"; S_C = "}"; } //Else Invalid setting. + if (HInt_ZeroMerg) { + if (Extension === 3) { + out += "{EH}"; + } else if (Opcode >= 0x700) { + out += "{NT}"; + } } - } - if ( S_C === "," ) { S_C = "}"; } - //Right bracket if any SSS,CCCCC conversion mode setting. + //-------------------------------------------Return the Register/Memory address-------------------------------------------- - if( S_C === "}" ) { out += S_C; } - - //------------------------------------------L1OM/K1OM Hint cache memory control-------------------------------------------- - - if( HInt_ZeroMerg ) - { - if ( Extension === 3 ) { out += "{EH}"; } - else if ( Opcode >= 0x700 ) { out += "{NT}"; } - } - - //-------------------------------------------Return the Register/Memory address-------------------------------------------- - - return (out); + return out; } /*------------------------------------------------------------------------------------------------------------------------- @@ -4585,351 +11045,331 @@ controls in the CPU to be applied to an select instruction code that is not an P At the end of this function "Opcode" should not hold any prefix code, so then Opcode contains an operation code. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodePrefixAdjustments() -{ - //------------------------------------------------------------------------------------------------------------------------- - Opcode = ( Opcode & 0x300 ) | BinCode[CodePos]; //Add 8 bit opcode while bits 9, and 10 are used for opcode map. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - //if 0F hex start at 256 for Opcode. - - if(Opcode === 0x0F) - { - Opcode = 0x100; //By starting at 0x100 with binary bit 9 set one then adding the 8 bit opcode then Opcode goes 256 to 511. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } - - //if 38 hex while using two byte opcode. - - else if(Opcode === 0x138 && Mnemonics[0x138] === "") - { - Opcode = 0x200; //By starting at 0x200 with binary bit 10 set one then adding the 8 bit opcode then Opcode goes 512 to 767. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } - - //if 3A hex while using two byte opcode go three byte opcodes. - - else if(Opcode === 0x13A && Mnemonics[0x13A] === "") - { - Opcode = 0x300; //By starting at 0x300 hex and adding the 8 bit opcode then Opcode goes 768 to 1023. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } - - //Rex prefix decodes only in 64 bit mode. - - if( Opcode >= 0x40 & Opcode <= 0x4F && BitMode === 2 ) - { - RexActive = 1; //Set Rex active uses 8 bit registers in lower order as 0 to 15. - BaseExtend = ( Opcode & 0x01 ) << 3; //Base Register extend setting. - IndexExtend = ( Opcode & 0x02 ) << 2; //Index Register extend setting. - RegExtend = ( Opcode & 0x04 ) << 1; //Register Extend Setting. - WidthBit = ( Opcode & 0x08 ) >> 3; //Set The Width Bit setting if active. - SizeAttrSelect = WidthBit ? 2 : 1; //The width Bit open all 64 bits. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } - - //The VEX2 Operation code Extension to SSE settings decoding. - - if( Opcode === 0xC5 && ( BinCode[CodePos] >= 0xC0 || BitMode === 2 ) ) - { - Extension = 1; +function DecodePrefixAdjustments() { //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read VEX2 byte settings. + Opcode = (Opcode & 0x300) | BinCode[CodePos]; //Add 8 bit opcode while bits 9, and 10 are used for opcode map. NextByte(); //Move to the next byte. //------------------------------------------------------------------------------------------------------------------------- - //some bits are inverted, so uninvert them arithmetically. + //if 0F hex start at 256 for Opcode. - Opcode ^= 0xF8; - - //Decode bit settings. - - if( BitMode === 2 ) - { - RegExtend = ( Opcode & 0x80 ) >> 4; //Register Extend. - VectorRegister = ( Opcode & 0x78 ) >> 3; //The added in Vector register to SSE. + if (Opcode === 0x0f) { + Opcode = 0x100; //By starting at 0x100 with binary bit 9 set one then adding the 8 bit opcode then Opcode goes 256 to 511. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. } - SizeAttrSelect = ( Opcode & 0x04 ) >> 2; //The L bit for 256 vector size. - SIMD = Opcode & 0x03; //The SIMD mode. - - //Automatically uses the two byte opcode map starts at 256 goes to 511. - - Opcode = 0x100; - - //------------------------------------------------------------------------------------------------------------------------- - Opcode = ( Opcode & 0x300 ) | BinCode[CodePos]; //read the opcode. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - //Stop decoding prefixes. - - return(null); - } - - //The VEX3 prefix settings decoding. - - if( Opcode === 0xC4 && ( BinCode[CodePos] >= 0xC0 || BitMode === 2 ) ) - { - Extension = 1; - //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read VEX3 byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - Opcode |= ( BinCode[CodePos] << 8 ); //Read next VEX3 byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - //Some bits are inverted, so uninvert them arithmetically. - - Opcode ^= 0x78E0; - - //Decode bit settings. - - if( BitMode === 2 ) - { - RegExtend = ( Opcode & 0x0080 ) >> 4; //Extend Register Setting. - IndexExtend = ( Opcode & 0x0040 ) >> 3; //Extend Index register setting. - BaseExtend = ( Opcode & 0x0020 ) >> 2; //Extend base Register setting. + //if 38 hex while using two byte opcode. + else if (Opcode === 0x138 && Mnemonics[0x138] === "") { + Opcode = 0x200; //By starting at 0x200 with binary bit 10 set one then adding the 8 bit opcode then Opcode goes 512 to 767. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. } - WidthBit = ( Opcode & 0x8000 ) >> 15; //The width bit works as a separator. - VectorRegister = ( Opcode & 0x7800 ) >> 11; //The added in Vector register to SSE. - SizeAttrSelect = ( Opcode & 0x0400 ) >> 10; //Vector length for 256 setting. - SIMD = ( Opcode & 0x0300 ) >> 8; //The SIMD mode. - Opcode = ( Opcode & 0x001F ) << 8; //Change Operation code map. - - //------------------------------------------------------------------------------------------------------------------------- - Opcode = ( Opcode & 0x300 ) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map bit's. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - return(null); - } - - //The AMD XOP prefix. - - if( Opcode === 0x8F ) - { - //If XOP - - var Code = BinCode[ CodePos ] & 0x0F; - - if( Code >= 8 && Code <= 10 ) - { - Extension = 1; - //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read XOP byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - Opcode |= ( BinCode[CodePos] << 8 ); //Read next XOP byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - //Some bits are inverted, so uninvert them arithmetically. - - Opcode ^= 0x78E0; - - //Decode bit settings. - - RegExtend = ( Opcode & 0x0080 ) >> 4; //Extend Register Setting. - IndexExtend = ( Opcode & 0x0040 ) >> 3; //Extend Index register setting. - BaseExtend = ( Opcode & 0x0020 ) >> 2; //Extend base Register setting. - WidthBit = ( Opcode & 0x8000 ) >> 15; //The width bit works as a separator. - VectorRegister = ( Opcode & 0x7800 ) >> 11; //The added in Vector register to SSE. - SizeAttrSelect = ( Opcode & 0x0400 ) >> 10; //Vector length for 256 setting. - SIMD = ( Opcode & 0x0300 ) >> 8; //The SIMD mode. - if( SIMD > 0 ) { InvalidOp = true; } //If SIMD MODE is set anything other than 0 the instruction is invalid. - Opcode = 0x400 | ( ( Opcode & 0x0003 ) << 8 ); //Change Operation code map. - - //------------------------------------------------------------------------------------------------------------------------- - Opcode = ( Opcode & 0x700 ) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map bit's. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - return(null); - } - } - - //The L1OM vector prefix settings decoding. - - if( Opcode === 0xD6 ) - { - //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read L1OM byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - Opcode |= ( BinCode[CodePos] << 8 ); //Read next L1OM byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - WidthBit = SIMD & 1; - VectorRegister = ( Opcode & 0xF800 ) >> 11; - RoundMode = VectorRegister >> 3; - MaskRegister = ( Opcode & 0x0700 ) >> 8; - HInt_ZeroMerg = ( Opcode & 0x0080 ) >> 7; - ConversionMode = ( Opcode & 0x0070 ) >> 4; - RegExtend = ( Opcode & 0x000C ) << 1; - BaseExtend = ( Opcode & 0x0003 ) << 3; - IndexExtend = ( Opcode & 0x0002 ) << 2; - - //------------------------------------------------------------------------------------------------------------------------- - Opcode = 0x700 | BinCode[CodePos]; //read the 8 bit opcode. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - return(null); - } - - //Only decode L1OM instead of MVEX/EVEX if L1OM compatibility mode is set. - - if( Mnemonics[0x62] === "" && Opcode === 0x62 ) - { - //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read L1OM byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - Opcode ^= 0xF0; - - IndexExtend = ( Opcode & 0x80 ) >> 4; - BaseExtend = ( Opcode & 0x40 ) >> 3; - RegExtend = ( Opcode & 0x20 ) >> 2; - - if ( SIMD !== 1 ) { SizeAttrSelect = ( ( Opcode & 0x10 ) === 0x10 ) ? 2 : 1; } else { SIMD = 0; } - - Opcode = 0x800 | ( ( Opcode & 0x30 ) >> 4 ) | ( ( Opcode & 0x0F ) << 2 ); - - return(null); - } - - //The MVEX/EVEX prefix settings decoding. - - if ( Opcode === 0x62 && ( BinCode[CodePos] >= 0xC0 || BitMode === 2 ) ) - { - Extension = 2; - //------------------------------------------------------------------------------------------------------------------------- - Opcode = BinCode[CodePos]; //read MVEX/EVEX byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - Opcode |= ( BinCode[CodePos] << 8 ); //read next MVEX/EVEX byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - Opcode |= ( BinCode[CodePos] << 16 ); //read next MVEX/EVEX byte settings. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- - - //Some bits are inverted, so uninvert them arithmetically. - - Opcode ^= 0x0878F0; - - //Check if Reserved bits are 0 if they are not 0 the MVEX/EVEX instruction is invalid. - - InvalidOp = ( Opcode & 0x00000C ) > 0; - - //Decode bit settings. - - if( BitMode === 2 ) - { - RegExtend = ( ( Opcode & 0x80 ) >> 4 ) | ( Opcode & 0x10 ); //The Double R'R bit decode for Register Extension 0 to 32. - BaseExtend = ( Opcode & 0x60 ) >> 2; //The X bit, and B Bit base register extend combination 0 to 32. - IndexExtend = ( Opcode & 0x40 ) >> 3; //The X extends the SIB Index by 8. - } - - VectorRegister = ( ( Opcode & 0x7800 ) >> 11 ) | ( ( Opcode & 0x080000 ) >> 15 ); //The Added in Vector Register for SSE under MVEX/EVEX. - - WidthBit = ( Opcode & 0x8000 ) >> 15; //The width bit separator for MVEX/EVEX. - SIMD = ( Opcode & 0x0300 ) >> 8; //decode the SIMD mode setting. - HInt_ZeroMerg = ( Opcode & 0x800000 ) >> 23; //Zero Merge to destination control, or MVEX EH control. - - //EVEX option bits take the place of Vector length control. - - if ( ( Opcode & 0x0400 ) > 0 ) - { - SizeAttrSelect = ( Opcode & 0x600000 ) >> 21; //The EVEX.L'L Size combination. - RoundMode = SizeAttrSelect | 4; //Rounding mode is Vector length if used. - ConversionMode = (Opcode & 0x100000 ) >> 20; //Broadcast Round Memory address system. - } - - //MVEX Vector Length, and Broadcast round. - - else - { - SizeAttrSelect = 2; //Max Size by default. - ConversionMode = ( Opcode & 0x700000 ) >> 20; //"MVEX.sss" Option bits. - RoundMode = ConversionMode; //Rounding mode selection is ConversionMode if used. - Extension = 3; + //if 3A hex while using two byte opcode go three byte opcodes. + else if (Opcode === 0x13a && Mnemonics[0x13a] === "") { + Opcode = 0x300; //By starting at 0x300 hex and adding the 8 bit opcode then Opcode goes 768 to 1023. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. } - MaskRegister = ( Opcode & 0x070000 ) >> 16; //Mask to destination. - Opcode = ( Opcode & 0x03 ) << 8; //Change Operation code map. + //Rex prefix decodes only in 64 bit mode. - //------------------------------------------------------------------------------------------------------------------------- - Opcode = ( Opcode & 0x300 ) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map extend bit's. - NextByte(); //Move to the next byte. - //------------------------------------------------------------------------------------------------------------------------- + if ((Opcode >= 0x40) & (Opcode <= 0x4f) && BitMode === 2) { + RexActive = 1; //Set Rex active uses 8 bit registers in lower order as 0 to 15. + BaseExtend = (Opcode & 0x01) << 3; //Base Register extend setting. + IndexExtend = (Opcode & 0x02) << 2; //Index Register extend setting. + RegExtend = (Opcode & 0x04) << 1; //Register Extend Setting. + WidthBit = (Opcode & 0x08) >> 3; //Set The Width Bit setting if active. + SizeAttrSelect = WidthBit ? 2 : 1; //The width Bit open all 64 bits. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } - //Stop decoding prefixes. + //The VEX2 Operation code Extension to SSE settings decoding. - return(null); - } + if (Opcode === 0xc5 && (BinCode[CodePos] >= 0xc0 || BitMode === 2)) { + Extension = 1; + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read VEX2 byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- - //Segment overrides + //some bits are inverted, so uninvert them arithmetically. - if ( ( Opcode & 0x7E7 ) === 0x26 || ( Opcode & 0x7FE ) === 0x64 ) - { - SegOverride = Mnemonics[ Opcode ]; //Set the Left Bracket for the ModR/M memory address. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } + Opcode ^= 0xf8; - //Operand override Prefix + //Decode bit settings. - if(Opcode === 0x66) - { - SIMD = 1; //sets SIMD mode 1 in case of SSE instruction opcode. - SizeAttrSelect = 0; //Adjust the size attribute setting for the size adjustment to the next instruction. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } + if (BitMode === 2) { + RegExtend = (Opcode & 0x80) >> 4; //Register Extend. + VectorRegister = (Opcode & 0x78) >> 3; //The added in Vector register to SSE. + } - //Ram address size override. + SizeAttrSelect = (Opcode & 0x04) >> 2; //The L bit for 256 vector size. + SIMD = Opcode & 0x03; //The SIMD mode. - if(Opcode === 0x67) - { - AddressOverride = true; //Set the setting active for the ModR/M address size. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } + //Automatically uses the two byte opcode map starts at 256 goes to 511. - //if repeat Prefixes F2 hex REP,or F3 hex RENP + Opcode = 0x100; - if (Opcode === 0xF2 || Opcode === 0xF3) - { - SIMD = (Opcode & 0x02 ) | ( 1 - Opcode & 0x01 ); //F2, and F3 change the SIMD mode during SSE instructions. - PrefixG1 = Mnemonics[ Opcode ]; //set the Prefix string. - HLEFlipG1G2 = true; //set Filp HLE in case this is the last prefix read, and LOCK was set in string G2 first for HLE. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } + //------------------------------------------------------------------------------------------------------------------------- + Opcode = (Opcode & 0x300) | BinCode[CodePos]; //read the opcode. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- - //if the lock prefix note the lock prefix is separate + //Stop decoding prefixes. - if (Opcode === 0xF0) - { - PrefixG2 = Mnemonics[ Opcode ]; //set the Prefix string - HLEFlipG1G2 = false; //set Flip HLE false in case this is the last prefix read, and REP, or REPNE was set in string G2 first for HLE. - return(DecodePrefixAdjustments()); //restart function decode more prefix settings that can effect the decode instruction. - } + return null; + } - //Before ending the function "DecodePrefixAdjustments()" some opcode combinations are invalid in 64 bit mode. + //The VEX3 prefix settings decoding. - if ( BitMode === 2 ) - { - InvalidOp |= ( ( ( Opcode & 0x07 ) >= 0x06 ) & ( Opcode <= 0x40 ) ); - InvalidOp |= ( Opcode === 0x60 | Opcode === 0x61 ); - InvalidOp |= ( Opcode === 0xD4 | Opcode === 0xD5 ); - InvalidOp |= ( Opcode === 0x9A | Opcode === 0xEA ); - InvalidOp |= ( Opcode === 0x82 ); - } + if (Opcode === 0xc4 && (BinCode[CodePos] >= 0xc0 || BitMode === 2)) { + Extension = 1; + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read VEX3 byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + Opcode |= BinCode[CodePos] << 8; //Read next VEX3 byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + //Some bits are inverted, so uninvert them arithmetically. + + Opcode ^= 0x78e0; + + //Decode bit settings. + + if (BitMode === 2) { + RegExtend = (Opcode & 0x0080) >> 4; //Extend Register Setting. + IndexExtend = (Opcode & 0x0040) >> 3; //Extend Index register setting. + BaseExtend = (Opcode & 0x0020) >> 2; //Extend base Register setting. + } + + WidthBit = (Opcode & 0x8000) >> 15; //The width bit works as a separator. + VectorRegister = (Opcode & 0x7800) >> 11; //The added in Vector register to SSE. + SizeAttrSelect = (Opcode & 0x0400) >> 10; //Vector length for 256 setting. + SIMD = (Opcode & 0x0300) >> 8; //The SIMD mode. + Opcode = (Opcode & 0x001f) << 8; //Change Operation code map. + + //------------------------------------------------------------------------------------------------------------------------- + Opcode = (Opcode & 0x300) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map bit's. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + return null; + } + + //The AMD XOP prefix. + + if (Opcode === 0x8f) { + //If XOP + + var Code = BinCode[CodePos] & 0x0f; + + if (Code >= 8 && Code <= 10) { + Extension = 1; + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read XOP byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + Opcode |= BinCode[CodePos] << 8; //Read next XOP byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + //Some bits are inverted, so uninvert them arithmetically. + + Opcode ^= 0x78e0; + + //Decode bit settings. + + RegExtend = (Opcode & 0x0080) >> 4; //Extend Register Setting. + IndexExtend = (Opcode & 0x0040) >> 3; //Extend Index register setting. + BaseExtend = (Opcode & 0x0020) >> 2; //Extend base Register setting. + WidthBit = (Opcode & 0x8000) >> 15; //The width bit works as a separator. + VectorRegister = (Opcode & 0x7800) >> 11; //The added in Vector register to SSE. + SizeAttrSelect = (Opcode & 0x0400) >> 10; //Vector length for 256 setting. + SIMD = (Opcode & 0x0300) >> 8; //The SIMD mode. + if (SIMD > 0) { + InvalidOp = true; + } //If SIMD MODE is set anything other than 0 the instruction is invalid. + Opcode = 0x400 | ((Opcode & 0x0003) << 8); //Change Operation code map. + + //------------------------------------------------------------------------------------------------------------------------- + Opcode = (Opcode & 0x700) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map bit's. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + return null; + } + } + + //The L1OM vector prefix settings decoding. + + if (Opcode === 0xd6) { + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read L1OM byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + Opcode |= BinCode[CodePos] << 8; //Read next L1OM byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + WidthBit = SIMD & 1; + VectorRegister = (Opcode & 0xf800) >> 11; + RoundMode = VectorRegister >> 3; + MaskRegister = (Opcode & 0x0700) >> 8; + HInt_ZeroMerg = (Opcode & 0x0080) >> 7; + ConversionMode = (Opcode & 0x0070) >> 4; + RegExtend = (Opcode & 0x000c) << 1; + BaseExtend = (Opcode & 0x0003) << 3; + IndexExtend = (Opcode & 0x0002) << 2; + + //------------------------------------------------------------------------------------------------------------------------- + Opcode = 0x700 | BinCode[CodePos]; //read the 8 bit opcode. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + return null; + } + + //Only decode L1OM instead of MVEX/EVEX if L1OM compatibility mode is set. + + if (Mnemonics[0x62] === "" && Opcode === 0x62) { + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read L1OM byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + Opcode ^= 0xf0; + + IndexExtend = (Opcode & 0x80) >> 4; + BaseExtend = (Opcode & 0x40) >> 3; + RegExtend = (Opcode & 0x20) >> 2; + + if (SIMD !== 1) { + SizeAttrSelect = (Opcode & 0x10) === 0x10 ? 2 : 1; + } else { + SIMD = 0; + } + + Opcode = 0x800 | ((Opcode & 0x30) >> 4) | ((Opcode & 0x0f) << 2); + + return null; + } + + //The MVEX/EVEX prefix settings decoding. + + if (Opcode === 0x62 && (BinCode[CodePos] >= 0xc0 || BitMode === 2)) { + Extension = 2; + //------------------------------------------------------------------------------------------------------------------------- + Opcode = BinCode[CodePos]; //read MVEX/EVEX byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + Opcode |= BinCode[CodePos] << 8; //read next MVEX/EVEX byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + Opcode |= BinCode[CodePos] << 16; //read next MVEX/EVEX byte settings. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + //Some bits are inverted, so uninvert them arithmetically. + + Opcode ^= 0x0878f0; + + //Check if Reserved bits are 0 if they are not 0 the MVEX/EVEX instruction is invalid. + + InvalidOp = (Opcode & 0x00000c) > 0; + + //Decode bit settings. + + if (BitMode === 2) { + RegExtend = ((Opcode & 0x80) >> 4) | (Opcode & 0x10); //The Double R'R bit decode for Register Extension 0 to 32. + BaseExtend = (Opcode & 0x60) >> 2; //The X bit, and B Bit base register extend combination 0 to 32. + IndexExtend = (Opcode & 0x40) >> 3; //The X extends the SIB Index by 8. + } + + VectorRegister = + ((Opcode & 0x7800) >> 11) | ((Opcode & 0x080000) >> 15); //The Added in Vector Register for SSE under MVEX/EVEX. + + WidthBit = (Opcode & 0x8000) >> 15; //The width bit separator for MVEX/EVEX. + SIMD = (Opcode & 0x0300) >> 8; //decode the SIMD mode setting. + HInt_ZeroMerg = (Opcode & 0x800000) >> 23; //Zero Merge to destination control, or MVEX EH control. + + //EVEX option bits take the place of Vector length control. + + if ((Opcode & 0x0400) > 0) { + SizeAttrSelect = (Opcode & 0x600000) >> 21; //The EVEX.L'L Size combination. + RoundMode = SizeAttrSelect | 4; //Rounding mode is Vector length if used. + ConversionMode = (Opcode & 0x100000) >> 20; //Broadcast Round Memory address system. + } + + //MVEX Vector Length, and Broadcast round. + else { + SizeAttrSelect = 2; //Max Size by default. + ConversionMode = (Opcode & 0x700000) >> 20; //"MVEX.sss" Option bits. + RoundMode = ConversionMode; //Rounding mode selection is ConversionMode if used. + Extension = 3; + } + + MaskRegister = (Opcode & 0x070000) >> 16; //Mask to destination. + Opcode = (Opcode & 0x03) << 8; //Change Operation code map. + + //------------------------------------------------------------------------------------------------------------------------- + Opcode = (Opcode & 0x300) | BinCode[CodePos]; //read the 8 bit opcode put them in the lower 8 bits away from opcode map extend bit's. + NextByte(); //Move to the next byte. + //------------------------------------------------------------------------------------------------------------------------- + + //Stop decoding prefixes. + + return null; + } + + //Segment overrides + + if ((Opcode & 0x7e7) === 0x26 || (Opcode & 0x7fe) === 0x64) { + SegOverride = Mnemonics[Opcode]; //Set the Left Bracket for the ModR/M memory address. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } + + //Operand override Prefix + + if (Opcode === 0x66) { + SIMD = 1; //sets SIMD mode 1 in case of SSE instruction opcode. + SizeAttrSelect = 0; //Adjust the size attribute setting for the size adjustment to the next instruction. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } + + //Ram address size override. + + if (Opcode === 0x67) { + AddressOverride = true; //Set the setting active for the ModR/M address size. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } + + //if repeat Prefixes F2 hex REP,or F3 hex RENP + + if (Opcode === 0xf2 || Opcode === 0xf3) { + SIMD = (Opcode & 0x02) | ((1 - Opcode) & 0x01); //F2, and F3 change the SIMD mode during SSE instructions. + PrefixG1 = Mnemonics[Opcode]; //set the Prefix string. + HLEFlipG1G2 = true; //set Filp HLE in case this is the last prefix read, and LOCK was set in string G2 first for HLE. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } + + //if the lock prefix note the lock prefix is separate + + if (Opcode === 0xf0) { + PrefixG2 = Mnemonics[Opcode]; //set the Prefix string + HLEFlipG1G2 = false; //set Flip HLE false in case this is the last prefix read, and REP, or REPNE was set in string G2 first for HLE. + return DecodePrefixAdjustments(); //restart function decode more prefix settings that can effect the decode instruction. + } + + //Before ending the function "DecodePrefixAdjustments()" some opcode combinations are invalid in 64 bit mode. + + if (BitMode === 2) { + InvalidOp |= ((Opcode & 0x07) >= 0x06) & (Opcode <= 0x40); + InvalidOp |= (Opcode === 0x60) | (Opcode === 0x61); + InvalidOp |= (Opcode === 0xd4) | (Opcode === 0xd5); + InvalidOp |= (Opcode === 0x9a) | (Opcode === 0xea); + InvalidOp |= Opcode === 0x82; + } } /*------------------------------------------------------------------------------------------------------------------------- @@ -4943,89 +11383,131 @@ However DecodePrefixAdjustments can also prevent this function from being called used for the bit mode the CPU is in as it will set InvalidOp true. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeOpcode() -{ - //get the Operation name by the operations opcode. +function DecodeOpcode() { + //get the Operation name by the operations opcode. - Instruction = Mnemonics[Opcode]; + Instruction = Mnemonics[Opcode]; - //get the Operands for this opcode it follows the same array structure as Mnemonics array + //get the Operands for this opcode it follows the same array structure as Mnemonics array - InsOperands = Operands[Opcode]; + InsOperands = Operands[Opcode]; - //Some Opcodes use the next byte automatically for extended opcode selection. Or current SIMD mode. + //Some Opcodes use the next byte automatically for extended opcode selection. Or current SIMD mode. - var ModRMByte = BinCode[CodePos]; //Read the byte but do not move to the next byte. + var ModRMByte = BinCode[CodePos]; //Read the byte but do not move to the next byte. - //If the current Mnemonic is an array two in size then Register Mode, and memory mode are separate from each other. - //Used in combination with Grouped opcodes, and Static opcodes. + //If the current Mnemonic is an array two in size then Register Mode, and memory mode are separate from each other. + //Used in combination with Grouped opcodes, and Static opcodes. - if(Instruction instanceof Array && Instruction.length == 2) { var bits = ( ModRMByte >> 6 ) & ( ModRMByte >> 7 ); Instruction = Instruction[bits]; InsOperands = InsOperands[bits]; } - - //Arithmetic unit 8x8 combinational logic array combinations. - //If the current Mnemonic is an array 8 in length It is a group opcode instruction may repeat previous instructions in different forums. - - if(Instruction instanceof Array && Instruction.length == 8) { var bits = ( ModRMByte & 0x38 ) >> 3; Instruction = Instruction[bits]; InsOperands = InsOperands[bits]; - - //if The select Group opcode is another array 8 in size it is a static opcode selection which makes the last three bits of the ModR/M byte combination. - - if(Instruction instanceof Array && Instruction.length == 8) { var bits = ( ModRMByte & 0x07 ); Instruction = Instruction[bits]; InsOperands = InsOperands[bits]; NextByte(); } } - - //Vector unit 4x4 combinational array logic. - //if the current Mnemonic is an array 4 in size it is an SIMD instruction with four possible modes N/A, 66, F3, F2. - //The mode is set to SIMD, it could have been set by the EVEX.pp, VEX.pp bit combination, or by prefixes N/A, 66, F3, F2. - - if(Instruction instanceof Array && Instruction.length == 4) - { - Vect = true; //Set Vector Encoding true. - - //Reset the prefix string G1 because prefix codes F2, and F3 are used with SSE which forum the repeat prefix. - //Some SSE instructions can use the REP, RENP prefixes. - //The Vectors that do support the repeat prefix uses Packed Single format. - - if(Instruction[2] !== "" && Instruction[3] !== "") { PrefixG1 = ""; } else { SIMD = ( SIMD === 1 ) & 1; } - Instruction = Instruction[SIMD]; InsOperands = InsOperands[SIMD]; - - //If the SIMD instruction uses another array 4 in length in the Selected SIMD vector Instruction. - //Then each vector Extension is separate. The first extension is used if no extension is active for Regular instructions, and vector instruction septation. - //0=None. 1=VEX only. 2=EVEX only. 3=??? unused. - - if(Instruction instanceof Array && Instruction.length == 4) - { - //Get the correct Instruction for the Active Extension type. - - if(Instruction[Extension] !== "") { Instruction = Instruction[Extension]; InsOperands = InsOperands[Extension]; } - else{ Instruction = "???"; InsOperands = ""; } + if (Instruction instanceof Array && Instruction.length == 2) { + var bits = (ModRMByte >> 6) & (ModRMByte >> 7); + Instruction = Instruction[bits]; + InsOperands = InsOperands[bits]; } - else if( Extension === 3 ){ Instruction = "???"; InsOperands = ""; } - } - else if( Opcode >= 0x700 && SIMD > 0 ){ Instruction = "???"; InsOperands = ""; } - //if Any Mnemonic is an array 3 in size the instruction name goes by size. + //Arithmetic unit 8x8 combinational logic array combinations. + //If the current Mnemonic is an array 8 in length It is a group opcode instruction may repeat previous instructions in different forums. - if(Instruction instanceof Array && Instruction.length == 3) - { - var bits = ( Extension === 0 & BitMode !== 0 ) ^ ( SizeAttrSelect >= 1 ); //The first bit in SizeAttrSelect for size 32/16 Flips if 16 bit mode. - ( WidthBit ) && ( bits = 2 ); //Goes 64 using the Width bit. - ( Extension === 3 && HInt_ZeroMerg && Instruction[1] !== "" ) && ( HInt_ZeroMerg = false, bits = 1 ); //MVEX uses element 1 if MVEX.E is set for instruction that change name. + if (Instruction instanceof Array && Instruction.length == 8) { + var bits = (ModRMByte & 0x38) >> 3; + Instruction = Instruction[bits]; + InsOperands = InsOperands[bits]; - if (Instruction[bits] !== "") { Instruction = Instruction[bits]; InsOperands = InsOperands[bits]; } + //if The select Group opcode is another array 8 in size it is a static opcode selection which makes the last three bits of the ModR/M byte combination. - //else no size prefix name then use the default size Mnemonic name. + if (Instruction instanceof Array && Instruction.length == 8) { + var bits = ModRMByte & 0x07; + Instruction = Instruction[bits]; + InsOperands = InsOperands[bits]; + NextByte(); + } + } - else { Instruction = Instruction[0]; InsOperands = InsOperands[0]; } - } + //Vector unit 4x4 combinational array logic. + //if the current Mnemonic is an array 4 in size it is an SIMD instruction with four possible modes N/A, 66, F3, F2. + //The mode is set to SIMD, it could have been set by the EVEX.pp, VEX.pp bit combination, or by prefixes N/A, 66, F3, F2. - //If Extension is not 0 then add the vector extend "V" to the instruction. - //During the decoding of the operands the instruction can be returned as invalid if it is an Arithmetic, or MM, ST instruction. - //Vector mask instructions start with K instead of V any instruction that starts with K and is an - //vector mask Instruction which starts with K instead of V. + if (Instruction instanceof Array && Instruction.length == 4) { + Vect = true; //Set Vector Encoding true. - if( Opcode <= 0x400 && Extension > 0 && Instruction.charAt(0) !== "K" && Instruction !== "???" ) { Instruction = "V" + Instruction; } + //Reset the prefix string G1 because prefix codes F2, and F3 are used with SSE which forum the repeat prefix. + //Some SSE instructions can use the REP, RENP prefixes. + //The Vectors that do support the repeat prefix uses Packed Single format. - //In 32 bit mode, or bellow only one instruction MOVSXD is replaced with ARPL. + if (Instruction[2] !== "" && Instruction[3] !== "") { + PrefixG1 = ""; + } else { + SIMD = (SIMD === 1) & 1; + } + Instruction = Instruction[SIMD]; + InsOperands = InsOperands[SIMD]; - if( BitMode <= 1 && Instruction === "MOVSXD" ) { Instruction = "ARPL"; InsOperands = "06020A01"; } + //If the SIMD instruction uses another array 4 in length in the Selected SIMD vector Instruction. + //Then each vector Extension is separate. The first extension is used if no extension is active for Regular instructions, and vector instruction septation. + //0=None. 1=VEX only. 2=EVEX only. 3=??? unused. + + if (Instruction instanceof Array && Instruction.length == 4) { + //Get the correct Instruction for the Active Extension type. + + if (Instruction[Extension] !== "") { + Instruction = Instruction[Extension]; + InsOperands = InsOperands[Extension]; + } else { + Instruction = "???"; + InsOperands = ""; + } + } else if (Extension === 3) { + Instruction = "???"; + InsOperands = ""; + } + } else if (Opcode >= 0x700 && SIMD > 0) { + Instruction = "???"; + InsOperands = ""; + } + + //if Any Mnemonic is an array 3 in size the instruction name goes by size. + + if (Instruction instanceof Array && Instruction.length == 3) { + var bits = + ((Extension === 0) & (BitMode !== 0)) ^ (SizeAttrSelect >= 1); //The first bit in SizeAttrSelect for size 32/16 Flips if 16 bit mode. + WidthBit && (bits = 2); //Goes 64 using the Width bit. + Extension === 3 && + HInt_ZeroMerg && + Instruction[1] !== "" && + ((HInt_ZeroMerg = false), (bits = 1)); //MVEX uses element 1 if MVEX.E is set for instruction that change name. + + if (Instruction[bits] !== "") { + Instruction = Instruction[bits]; + InsOperands = InsOperands[bits]; + } + + //else no size prefix name then use the default size Mnemonic name. + else { + Instruction = Instruction[0]; + InsOperands = InsOperands[0]; + } + } + + //If Extension is not 0 then add the vector extend "V" to the instruction. + //During the decoding of the operands the instruction can be returned as invalid if it is an Arithmetic, or MM, ST instruction. + //Vector mask instructions start with K instead of V any instruction that starts with K and is an + //vector mask Instruction which starts with K instead of V. + + if ( + Opcode <= 0x400 && + Extension > 0 && + Instruction.charAt(0) !== "K" && + Instruction !== "???" + ) { + Instruction = "V" + Instruction; + } + + //In 32 bit mode, or bellow only one instruction MOVSXD is replaced with ARPL. + + if (BitMode <= 1 && Instruction === "MOVSXD") { + Instruction = "ARPL"; + InsOperands = "06020A01"; + } } /*------------------------------------------------------------------------------------------------------------------------- @@ -5038,110 +11520,106 @@ This function is used after the function ^DecodeOpcode()^ because the function ^ operand string for what the instruction takes as input. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeOperandString() -{ - //Variables that are used for decoding one operands across the operand string. +function DecodeOperandString() { + //Variables that are used for decoding one operands across the operand string. - var OperandValue = 0, Code = 0, BySize = 0, Setting = 0; + var OperandValue = 0, + Code = 0, + BySize = 0, + Setting = 0; - //It does not matter which order the explicit operands decode as they do not require reading another byte. - //They start at 7 and are set in order, but the order they are displayed is the order they are read in the operand string because of OpNum. + //It does not matter which order the explicit operands decode as they do not require reading another byte. + //They start at 7 and are set in order, but the order they are displayed is the order they are read in the operand string because of OpNum. - var ExplicitOp = 8, ImmOp = 3; + var ExplicitOp = 8, + ImmOp = 3; - //Each operand is 4 hex digits, and OpNum is added by one for each operand that is read per Iteration. + //Each operand is 4 hex digits, and OpNum is added by one for each operand that is read per Iteration. - for( var i = 0, OpNum = 0; i < InsOperands.length; i+=4 ) //Iterate though operand string. - { - OperandValue = parseInt( InsOperands.substring(i, (i + 4) ), 16 ); //Convert the four hex digits to a 16 bit number value. - Code = ( OperandValue & 0xFE00 ) >> 9; //Get the operand Code. - BySize = ( OperandValue & 0x0100 ) >> 8; //Get it's by size attributes setting for if Setting is used as size attributes. - Setting = ( OperandValue & 0x00FF ); //Get the 8 bit Size setting. + for ( + var i = 0, OpNum = 0; + i < InsOperands.length; + i += 4 //Iterate though operand string. + ) { + OperandValue = parseInt(InsOperands.substring(i, i + 4), 16); //Convert the four hex digits to a 16 bit number value. + Code = (OperandValue & 0xfe00) >> 9; //Get the operand Code. + BySize = (OperandValue & 0x0100) >> 8; //Get it's by size attributes setting for if Setting is used as size attributes. + Setting = OperandValue & 0x00ff; //Get the 8 bit Size setting. - //If code is 0 the next 8 bit value specifies which type of of prefix settings are active. + //If code is 0 the next 8 bit value specifies which type of of prefix settings are active. - if( Code === 0 ) - { - if(BySize) //Vector adjustment settings. - { - RoundingSetting = ( Setting & 0x03 ) << 3; - if( Opcode >= 0x700 && RoundingSetting >= 0x10 ){ RoundMode |= 0x10; } - VSIB = ( Setting >> 2 ) & 1; - IgnoresWidthbit = ( Setting >> 3 ) & 1; - VectS = ( Setting >> 4 ) & 7; - Swizzle = ( VectS >> 2 ) & 1; - Up = ( VectS >> 1 ) & 1; - Float = VectS & 1; - if( ( Setting & 0x80 ) == 0x80 ) { Vect = false; } //If Non vector instruction set Vect false. - } - else //Instruction Prefix types. - { - XRelease = Setting & 0x01; - XAcquire = ( Setting & 0x02 ) >> 1; - HT = ( Setting & 0x04 ) >> 2; - BND = ( Setting & 0x08 ) >> 3; - } + if (Code === 0) { + if (BySize) { + //Vector adjustment settings. + RoundingSetting = (Setting & 0x03) << 3; + if (Opcode >= 0x700 && RoundingSetting >= 0x10) { + RoundMode |= 0x10; + } + VSIB = (Setting >> 2) & 1; + IgnoresWidthbit = (Setting >> 3) & 1; + VectS = (Setting >> 4) & 7; + Swizzle = (VectS >> 2) & 1; + Up = (VectS >> 1) & 1; + Float = VectS & 1; + if ((Setting & 0x80) == 0x80) { + Vect = false; + } //If Non vector instruction set Vect false. + } //Instruction Prefix types. + else { + XRelease = Setting & 0x01; + XAcquire = (Setting & 0x02) >> 1; + HT = (Setting & 0x04) >> 2; + BND = (Setting & 0x08) >> 3; + } + } + + //if it is a opcode Reg Encoding then first element along the decoder is set as this has to be decode first, before moving to the + //byte for modR/M. + else if (Code === 1) { + X86Decoder[0].set(0, BySize, Setting, OpNum++); + } + + //if it is a ModR/M, or Far pointer ModR/M, or Moffs address then second decoder element is set. + else if (Code >= 2 && Code <= 4) { + X86Decoder[1].set(Code - 2, BySize, Setting, OpNum++); + if (Code == 4) { + FarPointer = 1; + } //If code is 4 it is a far pointer. + } + + //The ModR/M Reg bit's are separated from the address system above. The ModR/M register can be used as a different register with a + //different address pointer. The Reg bits of the ModR/M decode next as it would be inefficient to read the register value if the + //decoder moves to the immediate. + else if (Code === 5) { + X86Decoder[2].set(0, BySize, Setting, OpNum++); + } + + //Immediate input one. The immediate input is just a number input it is decoded last unless the instruction does not use a + //ModR/M encoding, or Reg Opcode. + else if (Code >= 6 && Code <= 8 && ImmOp <= 5) { + X86Decoder[ImmOp++].set(Code - 6, BySize, Setting, OpNum++); + } + + //Vector register. If the instruction uses this register it will not be decoded or displayed unless one of the vector extension codes are + //decoded by the function ^DecodePrefixAdjustments()^. The Vector extension codes also have a Vector register value that is stored into + //the variable VectorRegister. The variable VectorRegister is given to the function ^DecodeRegValue()^. + else if (Code === 9 && (Extension > 0 || Opcode >= 0x700)) { + X86Decoder[6].set(0, BySize, Setting, OpNum++); + } + + //The upper four bits of the Immediate is used as an register. The variable IMM stores the last immediate byte that is read by ^DecodeImmediate()^. + //The upper four bits of the IMM is given to the function ^DecodeRegValue()^. + else if (Code === 10) { + X86Decoder[7].set(0, BySize, Setting, OpNum++); + } + + //Else any other encoding type higher than 13 is an explicit operand selection. + //And also there can only be an max of four explicit operands. + else if (Code >= 11 && ExplicitOp <= 11) { + X86Decoder[ExplicitOp].set(Code - 11, BySize, Setting, OpNum++); + ExplicitOp++; //move to the next Explicit operand. + } } - - //if it is a opcode Reg Encoding then first element along the decoder is set as this has to be decode first, before moving to the - //byte for modR/M. - - else if( Code === 1 ) - { - X86Decoder[0].set( 0, BySize, Setting, OpNum++ ); - } - - //if it is a ModR/M, or Far pointer ModR/M, or Moffs address then second decoder element is set. - - else if( Code >= 2 && Code <= 4 ) - { - X86Decoder[1].set( ( Code - 2 ), BySize, Setting, OpNum++ ); - if( Code == 4 ){ FarPointer = 1; } //If code is 4 it is a far pointer. - } - - //The ModR/M Reg bit's are separated from the address system above. The ModR/M register can be used as a different register with a - //different address pointer. The Reg bits of the ModR/M decode next as it would be inefficient to read the register value if the - //decoder moves to the immediate. - - else if( Code === 5 ) - { - X86Decoder[2].set( 0, BySize, Setting, OpNum++ ); - } - - //Immediate input one. The immediate input is just a number input it is decoded last unless the instruction does not use a - //ModR/M encoding, or Reg Opcode. - - else if( Code >= 6 && Code <= 8 && ImmOp <= 5 ) - { - X86Decoder[ImmOp++].set( ( Code - 6 ), BySize, Setting, OpNum++ ); - } - - //Vector register. If the instruction uses this register it will not be decoded or displayed unless one of the vector extension codes are - //decoded by the function ^DecodePrefixAdjustments()^. The Vector extension codes also have a Vector register value that is stored into - //the variable VectorRegister. The variable VectorRegister is given to the function ^DecodeRegValue()^. - - else if( Code === 9 && ( Extension > 0 || Opcode >= 0x700 ) ) - { - X86Decoder[6].set( 0, BySize, Setting, OpNum++ ); - } - - //The upper four bits of the Immediate is used as an register. The variable IMM stores the last immediate byte that is read by ^DecodeImmediate()^. - //The upper four bits of the IMM is given to the function ^DecodeRegValue()^. - - else if( Code === 10 ) - { - X86Decoder[7].set( 0, BySize, Setting, OpNum++ ); - } - - //Else any other encoding type higher than 13 is an explicit operand selection. - //And also there can only be an max of four explicit operands. - - else if( Code >= 11 && ExplicitOp <= 11) - { - X86Decoder[ExplicitOp].set( ( Code - 11 ), BySize, Setting, OpNum++ ); - ExplicitOp++; //move to the next Explicit operand. - } - } } /*------------------------------------------------------------------------------------------------------------------------- @@ -5149,597 +11627,639 @@ Decode each of the operands along the X86Decoder and deactivate them. This function is used after ^DecodeOperandString()^ which sets up the X86 Decoder for the instructions operands. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeOperands() -{ - //The Operands array is a string array in which the operand number is the element the decoded operand is positioned. +function DecodeOperands() { + //The Operands array is a string array in which the operand number is the element the decoded operand is positioned. - var out = []; + var out = []; - //This holds the decoded ModR/M byte from the "Decode_ModRM_SIB_Value()" function because the Register, and Address can decode differently. + //This holds the decoded ModR/M byte from the "Decode_ModRM_SIB_Value()" function because the Register, and Address can decode differently. - var ModRMByte = [ -1, //Mode is set negative one used to check if the ModR/M has been decoded. - 0, //The register value is decoded separately if used. - 0 //the base register for the address location. - ]; + var ModRMByte = [ + -1, //Mode is set negative one used to check if the ModR/M has been decoded. + 0, //The register value is decoded separately if used. + 0, //the base register for the address location. + ]; - //If no Immediate operand is used then the Immediate register encoding forces an IMM8 for the register even if the immediate is not used. + //If no Immediate operand is used then the Immediate register encoding forces an IMM8 for the register even if the immediate is not used. - var IMM_Used = false; //This is set true for if any Immediate is read because the last Immediate byte is used as the register on the upper four bits. + var IMM_Used = false; //This is set true for if any Immediate is read because the last Immediate byte is used as the register on the upper four bits. - //If reg opcode is active. + //If reg opcode is active. - if( X86Decoder[0].Active ) - { - out[ X86Decoder[0].OpNum ] = DecodeRegValue( - ( RegExtend | ( Opcode & 0x07 ) ), //Register value. - X86Decoder[0].BySizeAttrubute, //By size attribute or not. - X86Decoder[0].Size //Size settings. - ); - } - - //If ModR/M Address is active. - - if( X86Decoder[1].Active ) - { - //Decode the ModR/M byte Address which can end up reading another byte for SIB address, and including displacements. - - if(X86Decoder[1].Type !== 0) - { - ModRMByte = Decode_ModRM_SIB_Value(); //Decode the ModR/M byte. - out[ X86Decoder[1].OpNum ] = Decode_ModRM_SIB_Address( - ModRMByte, //The ModR/M byte. - X86Decoder[1].BySizeAttrubute, //By size attribute or not. - X86Decoder[1].Size //Size settings. - ); - } - - //Else If the ModR/M type is 0 then it is a moffs address. - - else - { - var s=0, AddrsSize = 0; - if( X86Decoder[1].BySizeAttrubute ) - { - AddrsSize = ( Math.pow( 2, BitMode ) << 1 ); - s = GetOperandSize( X86Decoder[1].Size, true ) << 1; - } - else - { - AddrsSize = BitMode + 1; - s = X86Decoder[1].Size; - } - out[ X86Decoder[1].OpNum ] = PTR[ s ]; - out[ X86Decoder[1].OpNum ] += SegOverride + DecodeImmediate( 0, X86Decoder[1].BySizeAttrubute, AddrsSize ) + "]"; - } - } - - //Decode the Register value of the ModR/M byte. - - if( X86Decoder[2].Active ) - { - //If the ModR/M address is not used, and ModR/M byte was not previously decoded then decode it. - - if( ModRMByte[0] === -1 ){ ModRMByte = Decode_ModRM_SIB_Value(); } - - //Decode only the Register Section of the ModR/M byte values. - - out[ X86Decoder[2].OpNum ] = DecodeRegValue( - ( RegExtend | ( ModRMByte[1] & 0x07 ) ), //Register value. - X86Decoder[2].BySizeAttrubute, //By size attribute or not. - X86Decoder[2].Size //Size settings. - ); - } - - //First Immediate if used. - - if( X86Decoder[3].Active ) - { - var t = DecodeImmediate( - X86Decoder[3].Type, //Immediate input type. - X86Decoder[3].BySizeAttrubute, //By size attribute or not. - X86Decoder[3].Size //Size settings. - ); - - //Check if Instruction uses condition codes. - - if( Instruction.slice(-1) === "," ) - { - Instruction = Instruction.split(","); - - if( ( Extension >= 1 && Extension <= 2 && Opcode <= 0x400 && IMMValue < 0x20 ) || IMMValue < 0x08 ) - { - IMMValue |= ( ( ( Opcode > 0x400 ) & 1 ) << 5 ); //XOP adjust. - Instruction = Instruction[0] + ConditionCodes[ IMMValue ] + Instruction[1]; - } - else { Instruction = Instruction[0] + Instruction[1]; out[ X86Decoder[3].OpNum ] = t; } - } - - //else add the Immediate byte encoding to the decoded instruction operands. - - else { out[ X86Decoder[3].OpNum ] = t; } - - IMM_Used = true; //Immediate byte is read. - } - - //Second Immediate if used. - - if( X86Decoder[4].Active ) - { - out[ X86Decoder[4].OpNum ] = DecodeImmediate( - X86Decoder[4].Type, //Immediate input type. - X86Decoder[4].BySizeAttrubute, //By size attribute or not. - X86Decoder[4].Size //Size settings. - ); - } - - //Third Immediate if used. - - if( X86Decoder[5].Active ) - { - out[ X86Decoder[5].OpNum ] = DecodeImmediate( - X86Decoder[5].Type, //Immediate input type. - X86Decoder[5].BySizeAttrubute, //By size attribute or not. - X86Decoder[5].Size //Size settings. - ); - } - - //Vector register if used from an SIMD vector extended instruction. - - if( X86Decoder[6].Active ) - { - out[ X86Decoder[6].OpNum ] = DecodeRegValue( - VectorRegister, //Register value. - X86Decoder[6].BySizeAttrubute, //By size attribute or not. - X86Decoder[6].Size //Size settings. - ); - } - - //Immediate register encoding. - - if( X86Decoder[7].Active ) - { - if( !IMM_Used ) { DecodeImmediate(0, false, 0); } //forces IMM8 if no Immediate has been used. - out[ X86Decoder[7].OpNum ] = DecodeRegValue( - ( ( ( IMMValue & 0xF0 ) >> 4 ) | ( ( IMMValue & 0x08 ) << 1 ) ), //Register value. - X86Decoder[7].BySizeAttrubute, //By size attribute or not. - X86Decoder[7].Size //Size settings. - ); - } - - //------------------------------------------------------------------------------------------------------------------------- - //Iterate though the 4 possible Explicit operands The first operands that is not active ends the Iteration. - //------------------------------------------------------------------------------------------------------------------------- - - for( var i = 8; i < 11; i++ ) - { - //------------------------------------------------------------------------------------------------------------------------- - //if Active Type is used as which Explicit operand. - //------------------------------------------------------------------------------------------------------------------------- - - if( X86Decoder[i].Active ) - { - //General use registers value 0 though 4 there size can change by size setting but can not be extended or changed. - - if( X86Decoder[i].Type <= 3 ) - { - out[ X86Decoder[i].OpNum ] = DecodeRegValue( - X86Decoder[i].Type, //register by value for Explicit Registers A, C, D, B. - X86Decoder[i].BySizeAttrubute, //By size attribute or not. - X86Decoder[i].Size //Size attribute. + if (X86Decoder[0].Active) { + out[X86Decoder[0].OpNum] = DecodeRegValue( + RegExtend | (Opcode & 0x07), //Register value. + X86Decoder[0].BySizeAttrubute, //By size attribute or not. + X86Decoder[0].Size, //Size settings. ); - } + } - //RBX address Explicit Operands prefixes can extend the registers and change pointer size RegMode 0. + //If ModR/M Address is active. - else if( X86Decoder[i].Type === 4 ) - { - s = 3; //If 32, or 64 bit ModR/M. - if( ( BitMode === 0 && !AddressOverride ) || ( BitMode === 1 && AddressOverride ) ){ s = 7; } //If 16 bit ModR/M. - out[ X86Decoder[i].OpNum ] = Decode_ModRM_SIB_Address( - [ 0, 0, s ], //the RBX register only for the pointer. - X86Decoder[i].BySizeAttrubute, //By size attribute or not. - X86Decoder[i].Size //size attributes. + if (X86Decoder[1].Active) { + //Decode the ModR/M byte Address which can end up reading another byte for SIB address, and including displacements. + + if (X86Decoder[1].Type !== 0) { + ModRMByte = Decode_ModRM_SIB_Value(); //Decode the ModR/M byte. + out[X86Decoder[1].OpNum] = Decode_ModRM_SIB_Address( + ModRMByte, //The ModR/M byte. + X86Decoder[1].BySizeAttrubute, //By size attribute or not. + X86Decoder[1].Size, //Size settings. + ); + } + + //Else If the ModR/M type is 0 then it is a moffs address. + else { + var s = 0, + AddrsSize = 0; + if (X86Decoder[1].BySizeAttrubute) { + AddrsSize = Math.pow(2, BitMode) << 1; + s = GetOperandSize(X86Decoder[1].Size, true) << 1; + } else { + AddrsSize = BitMode + 1; + s = X86Decoder[1].Size; + } + out[X86Decoder[1].OpNum] = PTR[s]; + out[X86Decoder[1].OpNum] += + SegOverride + + DecodeImmediate(0, X86Decoder[1].BySizeAttrubute, AddrsSize) + + "]"; + } + } + + //Decode the Register value of the ModR/M byte. + + if (X86Decoder[2].Active) { + //If the ModR/M address is not used, and ModR/M byte was not previously decoded then decode it. + + if (ModRMByte[0] === -1) { + ModRMByte = Decode_ModRM_SIB_Value(); + } + + //Decode only the Register Section of the ModR/M byte values. + + out[X86Decoder[2].OpNum] = DecodeRegValue( + RegExtend | (ModRMByte[1] & 0x07), //Register value. + X86Decoder[2].BySizeAttrubute, //By size attribute or not. + X86Decoder[2].Size, //Size settings. ); - } + } - //source and destination address Explicit Operands prefixes can extend the registers and change pointer size. + //First Immediate if used. - else if( X86Decoder[i].Type === 5 | X86Decoder[i].Type === 6 ) - { - s = 1; //If 32, or 64 bit ModR/M. - if( ( BitMode === 0 && !AddressOverride ) || ( BitMode === 1 & AddressOverride ) ) { s = -1; } //If 16 bit ModR/M. - out[ X86Decoder[i].OpNum ] = Decode_ModRM_SIB_Address( - [ 0, 0, ( X86Decoder[i].Type + s ) ], //source and destination pointer register by type value. - X86Decoder[i].BySizeAttrubute, //By size attribute or not. - X86Decoder[i].Size //size attributes. + if (X86Decoder[3].Active) { + var t = DecodeImmediate( + X86Decoder[3].Type, //Immediate input type. + X86Decoder[3].BySizeAttrubute, //By size attribute or not. + X86Decoder[3].Size, //Size settings. ); - } - //The ST only Operand, and FS, GS. + //Check if Instruction uses condition codes. - else if( X86Decoder[i].Type >= 7 ) - { - out[ X86Decoder[i].OpNum ] = ["ST", "FS", "GS", "1", "3", "XMM0", "M10"][ ( X86Decoder[i].Type - 7 ) ]; - } + if (Instruction.slice(-1) === ",") { + Instruction = Instruction.split(","); + + if ( + (Extension >= 1 && + Extension <= 2 && + Opcode <= 0x400 && + IMMValue < 0x20) || + IMMValue < 0x08 + ) { + IMMValue |= ((Opcode > 0x400) & 1) << 5; //XOP adjust. + Instruction = + Instruction[0] + ConditionCodes[IMMValue] + Instruction[1]; + } else { + Instruction = Instruction[0] + Instruction[1]; + out[X86Decoder[3].OpNum] = t; + } + } + + //else add the Immediate byte encoding to the decoded instruction operands. + else { + out[X86Decoder[3].OpNum] = t; + } + + IMM_Used = true; //Immediate byte is read. + } + + //Second Immediate if used. + + if (X86Decoder[4].Active) { + out[X86Decoder[4].OpNum] = DecodeImmediate( + X86Decoder[4].Type, //Immediate input type. + X86Decoder[4].BySizeAttrubute, //By size attribute or not. + X86Decoder[4].Size, //Size settings. + ); + } + + //Third Immediate if used. + + if (X86Decoder[5].Active) { + out[X86Decoder[5].OpNum] = DecodeImmediate( + X86Decoder[5].Type, //Immediate input type. + X86Decoder[5].BySizeAttrubute, //By size attribute or not. + X86Decoder[5].Size, //Size settings. + ); + } + + //Vector register if used from an SIMD vector extended instruction. + + if (X86Decoder[6].Active) { + out[X86Decoder[6].OpNum] = DecodeRegValue( + VectorRegister, //Register value. + X86Decoder[6].BySizeAttrubute, //By size attribute or not. + X86Decoder[6].Size, //Size settings. + ); + } + + //Immediate register encoding. + + if (X86Decoder[7].Active) { + if (!IMM_Used) { + DecodeImmediate(0, false, 0); + } //forces IMM8 if no Immediate has been used. + out[X86Decoder[7].OpNum] = DecodeRegValue( + ((IMMValue & 0xf0) >> 4) | ((IMMValue & 0x08) << 1), //Register value. + X86Decoder[7].BySizeAttrubute, //By size attribute or not. + X86Decoder[7].Size, //Size settings. + ); } //------------------------------------------------------------------------------------------------------------------------- - //else inactive end iteration. + //Iterate though the 4 possible Explicit operands The first operands that is not active ends the Iteration. //------------------------------------------------------------------------------------------------------------------------- - else { break; } + for (var i = 8; i < 11; i++) { + //------------------------------------------------------------------------------------------------------------------------- + //if Active Type is used as which Explicit operand. + //------------------------------------------------------------------------------------------------------------------------- - } + if (X86Decoder[i].Active) { + //General use registers value 0 though 4 there size can change by size setting but can not be extended or changed. - /*------------------------------------------------------------------------------------------------------------------------- + if (X86Decoder[i].Type <= 3) { + out[X86Decoder[i].OpNum] = DecodeRegValue( + X86Decoder[i].Type, //register by value for Explicit Registers A, C, D, B. + X86Decoder[i].BySizeAttrubute, //By size attribute or not. + X86Decoder[i].Size, //Size attribute. + ); + } + + //RBX address Explicit Operands prefixes can extend the registers and change pointer size RegMode 0. + else if (X86Decoder[i].Type === 4) { + s = 3; //If 32, or 64 bit ModR/M. + if ( + (BitMode === 0 && !AddressOverride) || + (BitMode === 1 && AddressOverride) + ) { + s = 7; + } //If 16 bit ModR/M. + out[X86Decoder[i].OpNum] = Decode_ModRM_SIB_Address( + [0, 0, s], //the RBX register only for the pointer. + X86Decoder[i].BySizeAttrubute, //By size attribute or not. + X86Decoder[i].Size, //size attributes. + ); + } + + //source and destination address Explicit Operands prefixes can extend the registers and change pointer size. + else if ((X86Decoder[i].Type === 5) | (X86Decoder[i].Type === 6)) { + s = 1; //If 32, or 64 bit ModR/M. + if ( + (BitMode === 0 && !AddressOverride) || + (BitMode === 1) & AddressOverride + ) { + s = -1; + } //If 16 bit ModR/M. + out[X86Decoder[i].OpNum] = Decode_ModRM_SIB_Address( + [0, 0, X86Decoder[i].Type + s], //source and destination pointer register by type value. + X86Decoder[i].BySizeAttrubute, //By size attribute or not. + X86Decoder[i].Size, //size attributes. + ); + } + + //The ST only Operand, and FS, GS. + else if (X86Decoder[i].Type >= 7) { + out[X86Decoder[i].OpNum] = [ + "ST", + "FS", + "GS", + "1", + "3", + "XMM0", + "M10", + ][X86Decoder[i].Type - 7]; + } + } + + //------------------------------------------------------------------------------------------------------------------------- + //else inactive end iteration. + //------------------------------------------------------------------------------------------------------------------------- + else { + break; + } + } + + /*------------------------------------------------------------------------------------------------------------------------- If the EVEX vector extension is active the Mask, and Zero merge control are inserted into operand 0 (Destination operand). -------------------------------------------------------------------------------------------------------------------------*/ - //Mask Register is used if it is not 0 in value. + //Mask Register is used if it is not 0 in value. - if( MaskRegister !== 0 ){ out[0] += "{K" + MaskRegister + "}"; } - - //EVEX Zero Merge control. + if (MaskRegister !== 0) { + out[0] += "{K" + MaskRegister + "}"; + } - if( Extension === 2 && HInt_ZeroMerg ) { out[0] += "{Z}"; } + //EVEX Zero Merge control. - //convert the operand array to a string and return it. + if (Extension === 2 && HInt_ZeroMerg) { + out[0] += "{Z}"; + } - InsOperands = out.toString(); + //convert the operand array to a string and return it. + + InsOperands = out.toString(); } /*------------------------------------------------------------------------------------------------------------------------- The main Instruction decode function plugs everything in together for the steps required to decode a full X86 instruction. -------------------------------------------------------------------------------------------------------------------------*/ -function DecodeInstruction() -{ - //Reset Prefix adjustments, and vector setting adjustments. +function DecodeInstruction() { + //Reset Prefix adjustments, and vector setting adjustments. - Reset(); + Reset(); - var out = ""; //The instruction code that will be returned back from this function. + var out = ""; //The instruction code that will be returned back from this function. - //Record the starting position. + //Record the starting position. - InstructionPos = GetPosition(); + InstructionPos = GetPosition(); - //First read any opcodes (prefix) that act as adjustments to the main three operand decode functions ^DecodeRegValue()^, - //^Decode_ModRM_SIB_Address()^, and ^DecodeImmediate()^. + //First read any opcodes (prefix) that act as adjustments to the main three operand decode functions ^DecodeRegValue()^, + //^Decode_ModRM_SIB_Address()^, and ^DecodeImmediate()^. - DecodePrefixAdjustments(); + DecodePrefixAdjustments(); - //Only continue if an invalid opcode is not read by DecodePrefixAdjustments() for cpu bit mode setting. + //Only continue if an invalid opcode is not read by DecodePrefixAdjustments() for cpu bit mode setting. - if( !InvalidOp ) - { - //Decode the instruction. + if (!InvalidOp) { + //Decode the instruction. - DecodeOpcode(); + DecodeOpcode(); - //------------------------------------------------------------------------------------------------------------------------- - //Intel Larrabee CCCCC condition codes. - //------------------------------------------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------------------------------------------- + //Intel Larrabee CCCCC condition codes. + //------------------------------------------------------------------------------------------------------------------------- - if( Opcode >= 0x700 && Instruction.slice(-1) === "," ) - { - Instruction = Instruction.split(","); + if (Opcode >= 0x700 && Instruction.slice(-1) === ",") { + Instruction = Instruction.split(","); - //CMP conditions. + //CMP conditions. - if( Opcode >= 0x720 && Opcode <= 0x72F ) - { - IMMValue = VectorRegister >> 2; + if (Opcode >= 0x720 && Opcode <= 0x72f) { + IMMValue = VectorRegister >> 2; - if( Float || ( IMMValue !== 3 && IMMValue !== 7 ) ) - { - Instruction = Instruction[0] + ConditionCodes[IMMValue] + Instruction[1]; + if (Float || (IMMValue !== 3 && IMMValue !== 7)) { + Instruction = + Instruction[0] + + ConditionCodes[IMMValue] + + Instruction[1]; + } else { + Instruction = Instruction[0] + Instruction[1]; + } + + IMMValue = 0; + VectorRegister &= 0x03; + } + + //Else High/Low. + else { + Instruction = + Instruction[0] + + ((VectorRegister & 1) === 1 ? "H" : "L") + + Instruction[1]; + } } - else { Instruction = Instruction[0] + Instruction[1]; } - IMMValue = 0; VectorRegister &= 0x03; - } + //Setup the X86 Decoder for which operands the instruction uses. - //Else High/Low. + DecodeOperandString(); - else - { - Instruction = Instruction[0] + ( ( ( VectorRegister & 1 ) === 1 ) ? "H" : "L" ) + Instruction[1]; - } + //Now only some instructions can vector extend, and that is only if the instruction is an SIMD Vector format instruction. + + if (!Vect && Extension > 0 && Opcode <= 0x400) { + InvalidOp = true; + } + + //The Width Bit setting must match the vector numbers size otherwise this create an invalid operation code in MVEX/EVEX unless the Width bit is ignored. + + if (Vect && !IgnoresWidthbit && Extension >= 2) { + InvalidOp = (SIMD & 1) !== (WidthBit & 1); //Note use, and ignore width bit pastern EVEX. + } + if (Opcode >= 0x700) { + WidthBit ^= IgnoresWidthbit; + } //L1OM Width bit invert. } - //Setup the X86 Decoder for which operands the instruction uses. + //If the instruction is invalid then set the instruction to "???" - DecodeOperandString(); - - //Now only some instructions can vector extend, and that is only if the instruction is an SIMD Vector format instruction. - - if( !Vect && Extension > 0 && Opcode <= 0x400 ) { InvalidOp = true; } - - //The Width Bit setting must match the vector numbers size otherwise this create an invalid operation code in MVEX/EVEX unless the Width bit is ignored. - - if( Vect && !IgnoresWidthbit && Extension >= 2 ) - { - InvalidOp = ( ( SIMD & 1 ) !== ( WidthBit & 1 ) ); //Note use, and ignore width bit pastern EVEX. + if (InvalidOp) { + out = "???"; //set the returned instruction to invalid } - if( Opcode >= 0x700 ) { WidthBit ^= IgnoresWidthbit; } //L1OM Width bit invert. - } - //If the instruction is invalid then set the instruction to "???" + //Else finish decoding the valid instruction. + else { + //Decode each operand along the Decoder array in order, and deactivate them. - if( InvalidOp ) - { - out = "???" //set the returned instruction to invalid - } + DecodeOperands(); - //Else finish decoding the valid instruction. - - else - { - //Decode each operand along the Decoder array in order, and deactivate them. - - DecodeOperands(); - - /*------------------------------------------------------------------------------------------------------------------------- + /*------------------------------------------------------------------------------------------------------------------------- 3DNow Instruction name is encoded by the next byte after the ModR/M, and Reg operands. -------------------------------------------------------------------------------------------------------------------------*/ - if( Opcode === 0x10F ) - { - //Lookup operation code. + if (Opcode === 0x10f) { + //Lookup operation code. - Instruction = M3DNow[ BinCode[CodePos] ]; NextByte(); + Instruction = M3DNow[BinCode[CodePos]]; + NextByte(); - //If Invalid instruction. + //If Invalid instruction. - if( Instruction === "" || Instruction == null ) - { - Instruction = "???"; InsOperands = ""; - } - } - - /*------------------------------------------------------------------------------------------------------------------------- + if (Instruction === "" || Instruction == null) { + Instruction = "???"; + InsOperands = ""; + } + } else if (Instruction === "SSS") { + /*------------------------------------------------------------------------------------------------------------------------- Synthetic virtual machine operation codes. -------------------------------------------------------------------------------------------------------------------------*/ + //The Next two bytes after the static opcode is the select synthetic virtual machine operation code. - else if( Instruction === "SSS" ) - { - //The Next two bytes after the static opcode is the select synthetic virtual machine operation code. + var Code1 = BinCode[CodePos]; + NextByte(); + var Code2 = BinCode[CodePos]; + NextByte(); - var Code1 = BinCode[CodePos]; NextByte(); - var Code2 = BinCode[CodePos]; NextByte(); + //No operations exist past 4 in value for both bytes that combine to the operation code. - //No operations exist past 4 in value for both bytes that combine to the operation code. + if (Code1 >= 5 || Code2 >= 5) { + Instruction = "???"; + } - if( Code1 >= 5 || Code2 >= 5 ) { Instruction = "???"; } + //Else calculate the operation code in the 5x5 map. + else { + Instruction = MSynthetic[Code1 * 5 + Code2]; - //Else calculate the operation code in the 5x5 map. + //If Invalid instruction. - else - { - Instruction = MSynthetic[ ( Code1 * 5 ) + Code2 ]; - - //If Invalid instruction. - - if( Instruction === "" || Instruction == null ) - { - Instruction = "???"; + if (Instruction === "" || Instruction == null) { + Instruction = "???"; + } + } } - } + + //32/16 bit instructions 9A, and EA use Segment, and offset with Immediate format. + + if (Opcode === 0x9a || Opcode === 0xea) { + var t = InsOperands.split(","); + InsOperands = t[1] + ":" + t[0]; + } + + //**Depending on the operation different prefixes replace others for HLE, or MPX, and branch prediction. + //if REP prefix, and LOCK prefix are used together, and the current decoded operation allows HLE XRELEASE. + + if ( + PrefixG1 === Mnemonics[0xf3] && + PrefixG2 === Mnemonics[0xf0] && + XRelease + ) { + PrefixG1 = "XRELEASE"; //Then change REP to XRELEASE. + } + + //if REPNE prefix, and LOCK prefix are used together, and the current decoded operation allows HLE XACQUIRE. + + if ( + PrefixG1 === Mnemonics[0xf2] && + PrefixG2 === Mnemonics[0xf0] && + XAcquire + ) { + PrefixG1 = "XACQUIRE"; //Then change REP to XACQUIRE + } + + //Depending on the order that the Repeat prefix, and Lock prefix is used flip Prefix G1, and G2 if HLEFlipG1G2 it is true. + + if ( + (PrefixG1 === "XRELEASE" || PrefixG1 === "XACQUIRE") && + HLEFlipG1G2 + ) { + t = PrefixG1; + PrefixG1 = PrefixG2; + PrefixG2 = t; + } + + //if HT is active then it is a jump instruction check and adjust for the HT,and HNT prefix. + + if (HT) { + if (SegOverride === Mnemonics[0x2e]) { + PrefixG1 = "HNT"; + } else if (SegOverride === Mnemonics[0x3e]) { + PrefixG1 = "HT"; + } + } + + //else if Prefix is REPNE switch it to BND if operation is a MPX instruction. + + if (PrefixG1 === Mnemonics[0xf2] && BND) { + PrefixG1 = "BND"; + } + + //Before the Instruction is put together check the length of the instruction if it is longer than 15 bytes the instruction is undefined. + + if (InstructionHex.length > 30) { + //Calculate how many bytes over. + + var Dif32 = (InstructionHex.length - 30) >> 1; + + //Limit the instruction hex output to 15 bytes. + + InstructionHex = InstructionHex.substring(0, 30); + + //Calculate the Difference between the Disassembler current position. + + Dif32 = Pos32 - Dif32; + + //Convert Dif to unsignified numbers. + + if (Dif32 < 0) { + Dif32 += 0x100000000; + } + + //Convert to strings. + + for (var S32 = Dif32.toString(16); S32.length < 8; S32 = "0" + S32); + for (var S64 = Pos64.toString(16); S64.length < 8; S64 = "0" + S64); + + //Go to the Calculated address right after the Instruction UD. + + GotoPosition(S64 + S32); + + //Set prefixes, and operands to empty strings, and set Instruction to UD. + + PrefixG1 = ""; + PrefixG2 = ""; + Instruction = "???"; + InsOperands = ""; + } + + //Put the Instruction sequence together. + + out = PrefixG1 + " " + PrefixG2 + " " + Instruction + " " + InsOperands; + + //Remove any trailing spaces because of unused prefixes. + + out = out.replace(/^[ ]+|[ ]+$/g, ""); + + //Add error suppression if used. + + if (Opcode >= 0x700 || RoundMode !== 0) { + out += RoundModes[RoundMode]; + } + + //Return the instruction. } - //32/16 bit instructions 9A, and EA use Segment, and offset with Immediate format. - - if( Opcode === 0x9A || Opcode === 0xEA ) - { - var t = InsOperands.split(","); - InsOperands = t[1] + ":" +t[0]; - } - - //**Depending on the operation different prefixes replace others for HLE, or MPX, and branch prediction. - //if REP prefix, and LOCK prefix are used together, and the current decoded operation allows HLE XRELEASE. - - if(PrefixG1 === Mnemonics[0xF3] && PrefixG2 === Mnemonics[0xF0] && XRelease) - { - PrefixG1 = "XRELEASE"; //Then change REP to XRELEASE. - } - - //if REPNE prefix, and LOCK prefix are used together, and the current decoded operation allows HLE XACQUIRE. - - if(PrefixG1 === Mnemonics[0xF2] && PrefixG2 === Mnemonics[0xF0] && XAcquire) - { - PrefixG1 = "XACQUIRE"; //Then change REP to XACQUIRE - } - - //Depending on the order that the Repeat prefix, and Lock prefix is used flip Prefix G1, and G2 if HLEFlipG1G2 it is true. - - if((PrefixG1 === "XRELEASE" || PrefixG1 === "XACQUIRE") && HLEFlipG1G2) - { - t = PrefixG1; PrefixG1 = PrefixG2; PrefixG2 = t; - } - - //if HT is active then it is a jump instruction check and adjust for the HT,and HNT prefix. - - if(HT) - { - if (SegOverride === Mnemonics[0x2E]) - { - PrefixG1 = "HNT"; - } - else if (SegOverride === Mnemonics[0x3E]) - { - PrefixG1 = "HT"; - } - } - - //else if Prefix is REPNE switch it to BND if operation is a MPX instruction. - - if(PrefixG1 === Mnemonics[0xF2] && BND) - { - PrefixG1 = "BND"; - } - - //Before the Instruction is put together check the length of the instruction if it is longer than 15 bytes the instruction is undefined. - - if ( InstructionHex.length > 30 ) - { - //Calculate how many bytes over. - - var Dif32 = ( ( InstructionHex.length - 30 ) >> 1 ); - - //Limit the instruction hex output to 15 bytes. - - InstructionHex = InstructionHex.substring( 0, 30 ); - - //Calculate the Difference between the Disassembler current position. - - Dif32 = Pos32 - Dif32; - - //Convert Dif to unsignified numbers. - - if( Dif32 < 0 ) { Dif32 += 0x100000000; } - - //Convert to strings. - - for (var S32 = Dif32.toString(16) ; S32.length < 8; S32 = "0" + S32); - for (var S64 = Pos64.toString(16) ; S64.length < 8; S64 = "0" + S64); - - //Go to the Calculated address right after the Instruction UD. - - GotoPosition( S64 + S32 ); - - //Set prefixes, and operands to empty strings, and set Instruction to UD. - - PrefixG1 = "";PrefixG2 = ""; Instruction = "???"; InsOperands = ""; - } - - //Put the Instruction sequence together. - - out = PrefixG1 + " " + PrefixG2 + " " + Instruction + " " + InsOperands; - - //Remove any trailing spaces because of unused prefixes. - - out = out.replace(/^[ ]+|[ ]+$/g,''); - - //Add error suppression if used. - - if( Opcode >= 0x700 || RoundMode !== 0 ) - { - out += RoundModes[ RoundMode ]; - } - - //Return the instruction. - } - - return( out ); + return out; } /*------------------------------------------------------------------------------------------------------------------------- This function Resets the Decoder in case of error, or an full instruction has been decoded. -------------------------------------------------------------------------------------------------------------------------*/ -function Reset() -{ - //Reset Opcode, and Size attribute selector. +function Reset() { + //Reset Opcode, and Size attribute selector. - Opcode = 0; SizeAttrSelect = 1; - - //Reset Operands and instruction. - - Instruction = ""; InsOperands = ""; + Opcode = 0; + SizeAttrSelect = 1; - //Reset ModR/M. + //Reset Operands and instruction. - RexActive = 0; RegExtend = 0; BaseExtend = 0; IndexExtend = 0; - SegOverride = "["; AddressOverride = false; FarPointer = 0; + Instruction = ""; + InsOperands = ""; - //Reset Vector extensions controls. + //Reset ModR/M. - Extension = 0; SIMD = 0; Vect = false; ConversionMode = 0; WidthBit = false; - VectorRegister = 0; MaskRegister = 0; HInt_ZeroMerg = false; RoundMode = 0x00; + RexActive = 0; + RegExtend = 0; + BaseExtend = 0; + IndexExtend = 0; + SegOverride = "["; + AddressOverride = false; + FarPointer = 0; - //Reset vector format settings. + //Reset Vector extensions controls. - IgnoresWidthbit = false; VSIB = false; RoundingSetting = 0; - Swizzle = false; Up = false; Float = false; VectS = 0x00; + Extension = 0; + SIMD = 0; + Vect = false; + ConversionMode = 0; + WidthBit = false; + VectorRegister = 0; + MaskRegister = 0; + HInt_ZeroMerg = false; + RoundMode = 0x00; - //Reset IMMValue used for Imm register encoding, and Condition codes. + //Reset vector format settings. - IMMValue = 0; + IgnoresWidthbit = false; + VSIB = false; + RoundingSetting = 0; + Swizzle = false; + Up = false; + Float = false; + VectS = 0x00; - //Reset instruction Prefixes. + //Reset IMMValue used for Imm register encoding, and Condition codes. - PrefixG1 = "", PrefixG2 = ""; - XRelease = false; XAcquire = false; HLEFlipG1G2 = false; - HT = false; - BND = false; + IMMValue = 0; - //Reset Invalid operation code. + //Reset instruction Prefixes. - InvalidOp = false; + (PrefixG1 = ""), (PrefixG2 = ""); + XRelease = false; + XAcquire = false; + HLEFlipG1G2 = false; + HT = false; + BND = false; - //Reset instruction hex because it is used to check if the instruction is longer than 15 bytes which is impossible for the X86 Decoder Circuit. + //Reset Invalid operation code. - InstructionHex = ""; + InvalidOp = false; - //Deactivate all operands along the X86Decoder. + //Reset instruction hex because it is used to check if the instruction is longer than 15 bytes which is impossible for the X86 Decoder Circuit. - for( var i = 0; i < X86Decoder.length; X86Decoder[i++].Deactivate() ); + InstructionHex = ""; + + //Deactivate all operands along the X86Decoder. + + for (var i = 0; i < X86Decoder.length; X86Decoder[i++].Deactivate()); } /*------------------------------------------------------------------------------------------------------------------------- do an linear disassemble. -------------------------------------------------------------------------------------------------------------------------*/ -export function LDisassemble() -{ - var Instruction = ""; //Stores the Decoded instruction. - var Out = ""; //The Disassemble output +export function LDisassemble() { + var Instruction = ""; //Stores the Decoded instruction. + var Out = ""; //The Disassemble output - //Disassemble binary code using an linear pass. + //Disassemble binary code using an linear pass. - var len = BinCode.length; + var len = BinCode.length; - //Backup the base address. + //Backup the base address. - var BPos64 = Pos64, BPos32 = Pos32; + var BPos64 = Pos64, + BPos32 = Pos32; - while( CodePos < len ) - { - Instruction = DecodeInstruction(); + while (CodePos < len) { + Instruction = DecodeInstruction(); - //Add the 64 bit address of the output if ShowInstructionPos decoding is active. + //Add the 64 bit address of the output if ShowInstructionPos decoding is active. - if( ShowInstructionPos ) - { - Out += InstructionPos + " "; + if (ShowInstructionPos) { + Out += InstructionPos + " "; + } + + //Show Each byte that was read to decode the instruction if ShowInstructionHex decoding is active. + + if (ShowInstructionHex) { + InstructionHex = InstructionHex.toUpperCase(); + for ( + ; + InstructionHex.length < 32; + InstructionHex = InstructionHex + " " + ); + Out += InstructionHex + ""; + } + + //Put the decoded instruction into the output and make a new line. + + Out += Instruction + "\r\n"; + + //Reset instruction Pos and Hex. + + InstructionPos = ""; + InstructionHex = ""; } - //Show Each byte that was read to decode the instruction if ShowInstructionHex decoding is active. + CodePos = 0; //Reset the Code position + Pos32 = BPos32; + Pos64 = BPos64; //Reset Base address. - if(ShowInstructionHex) - { - InstructionHex = InstructionHex.toUpperCase(); - for(; InstructionHex.length < 32; InstructionHex = InstructionHex + " " ); - Out += InstructionHex + ""; - } - - //Put the decoded instruction into the output and make a new line. - - Out += Instruction + "\r\n"; - - //Reset instruction Pos and Hex. - - InstructionPos = ""; InstructionHex = ""; - } - - CodePos = 0; //Reset the Code position - Pos32 = BPos32; Pos64 = BPos64; //Reset Base address. - - //return the decoded binary code - - return(Out); + //return the decoded binary code + return Out; } //////////////////////////////////////////////////////////////////////////////////////////////// @@ -5748,13 +12268,12 @@ export function LDisassemble() * The following code has been added to expose public methods for use in CyberChef */ -export function setBitMode (val) { - BitMode = val; -}; -export function setShowInstructionHex (val) { - ShowInstructionHex = val; -}; -export function setShowInstructionPos (val) { - ShowInstructionPos = val; -}; - +export function setBitMode(val) { + BitMode = val; +} +export function setShowInstructionHex(val) { + ShowInstructionHex = val; +} +export function setShowInstructionPos(val) { + ShowInstructionPos = val; +} diff --git a/src/core/vendor/gost/gostCipher.mjs b/src/core/vendor/gost/gostCipher.mjs index 8505fd34..83a34835 100644 --- a/src/core/vendor/gost/gostCipher.mjs +++ b/src/core/vendor/gost/gostCipher.mjs @@ -32,27 +32,27 @@ * */ -import GostRandom from './gostRandom.mjs'; +import GostRandom from "./gostRandom.mjs"; -import crypto from 'crypto' +import crypto from "crypto"; /* -* Initial parameters and common algortithms of GOST 28147-89 -* -* http://tools.ietf.org/html/rfc5830 -* -*/ // + * Initial parameters and common algortithms of GOST 28147-89 + * + * http://tools.ietf.org/html/rfc5830 + * + */ // var root = {}; var rootCrypto = crypto; var CryptoOperationData = ArrayBuffer; var SyntaxError = Error, - DataError = Error, - NotSupportedError = Error; + DataError = Error, + NotSupportedError = Error; /* -* Check supported -* This implementation support only Little Endian arhitecture -*/ + * Check supported + * This implementation support only Little Endian arhitecture + */ var littleEndian = (function () { var buffer = new CryptoOperationData(2); @@ -65,114 +65,134 @@ var defaultIV = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0]); // Predefined sBox collection var sBoxes = { - 'E-TEST': [ - 0x4, 0x2, 0xF, 0x5, 0x9, 0x1, 0x0, 0x8, 0xE, 0x3, 0xB, 0xC, 0xD, 0x7, 0xA, 0x6, - 0xC, 0x9, 0xF, 0xE, 0x8, 0x1, 0x3, 0xA, 0x2, 0x7, 0x4, 0xD, 0x6, 0x0, 0xB, 0x5, - 0xD, 0x8, 0xE, 0xC, 0x7, 0x3, 0x9, 0xA, 0x1, 0x5, 0x2, 0x4, 0x6, 0xF, 0x0, 0xB, - 0xE, 0x9, 0xB, 0x2, 0x5, 0xF, 0x7, 0x1, 0x0, 0xD, 0xC, 0x6, 0xA, 0x4, 0x3, 0x8, - 0x3, 0xE, 0x5, 0x9, 0x6, 0x8, 0x0, 0xD, 0xA, 0xB, 0x7, 0xC, 0x2, 0x1, 0xF, 0x4, - 0x8, 0xF, 0x6, 0xB, 0x1, 0x9, 0xC, 0x5, 0xD, 0x3, 0x7, 0xA, 0x0, 0xE, 0x2, 0x4, - 0x9, 0xB, 0xC, 0x0, 0x3, 0x6, 0x7, 0x5, 0x4, 0x8, 0xE, 0xF, 0x1, 0xA, 0x2, 0xD, - 0xC, 0x6, 0x5, 0x2, 0xB, 0x0, 0x9, 0xD, 0x3, 0xE, 0x7, 0xA, 0xF, 0x4, 0x1, 0x8 + "E-TEST": [ + 0x4, 0x2, 0xf, 0x5, 0x9, 0x1, 0x0, 0x8, 0xe, 0x3, 0xb, 0xc, 0xd, 0x7, + 0xa, 0x6, 0xc, 0x9, 0xf, 0xe, 0x8, 0x1, 0x3, 0xa, 0x2, 0x7, 0x4, 0xd, + 0x6, 0x0, 0xb, 0x5, 0xd, 0x8, 0xe, 0xc, 0x7, 0x3, 0x9, 0xa, 0x1, 0x5, + 0x2, 0x4, 0x6, 0xf, 0x0, 0xb, 0xe, 0x9, 0xb, 0x2, 0x5, 0xf, 0x7, 0x1, + 0x0, 0xd, 0xc, 0x6, 0xa, 0x4, 0x3, 0x8, 0x3, 0xe, 0x5, 0x9, 0x6, 0x8, + 0x0, 0xd, 0xa, 0xb, 0x7, 0xc, 0x2, 0x1, 0xf, 0x4, 0x8, 0xf, 0x6, 0xb, + 0x1, 0x9, 0xc, 0x5, 0xd, 0x3, 0x7, 0xa, 0x0, 0xe, 0x2, 0x4, 0x9, 0xb, + 0xc, 0x0, 0x3, 0x6, 0x7, 0x5, 0x4, 0x8, 0xe, 0xf, 0x1, 0xa, 0x2, 0xd, + 0xc, 0x6, 0x5, 0x2, 0xb, 0x0, 0x9, 0xd, 0x3, 0xe, 0x7, 0xa, 0xf, 0x4, + 0x1, 0x8, ], - 'E-A': [ - 0x9, 0x6, 0x3, 0x2, 0x8, 0xB, 0x1, 0x7, 0xA, 0x4, 0xE, 0xF, 0xC, 0x0, 0xD, 0x5, - 0x3, 0x7, 0xE, 0x9, 0x8, 0xA, 0xF, 0x0, 0x5, 0x2, 0x6, 0xC, 0xB, 0x4, 0xD, 0x1, - 0xE, 0x4, 0x6, 0x2, 0xB, 0x3, 0xD, 0x8, 0xC, 0xF, 0x5, 0xA, 0x0, 0x7, 0x1, 0x9, - 0xE, 0x7, 0xA, 0xC, 0xD, 0x1, 0x3, 0x9, 0x0, 0x2, 0xB, 0x4, 0xF, 0x8, 0x5, 0x6, - 0xB, 0x5, 0x1, 0x9, 0x8, 0xD, 0xF, 0x0, 0xE, 0x4, 0x2, 0x3, 0xC, 0x7, 0xA, 0x6, - 0x3, 0xA, 0xD, 0xC, 0x1, 0x2, 0x0, 0xB, 0x7, 0x5, 0x9, 0x4, 0x8, 0xF, 0xE, 0x6, - 0x1, 0xD, 0x2, 0x9, 0x7, 0xA, 0x6, 0x0, 0x8, 0xC, 0x4, 0x5, 0xF, 0x3, 0xB, 0xE, - 0xB, 0xA, 0xF, 0x5, 0x0, 0xC, 0xE, 0x8, 0x6, 0x2, 0x3, 0x9, 0x1, 0x7, 0xD, 0x4 + "E-A": [ + 0x9, 0x6, 0x3, 0x2, 0x8, 0xb, 0x1, 0x7, 0xa, 0x4, 0xe, 0xf, 0xc, 0x0, + 0xd, 0x5, 0x3, 0x7, 0xe, 0x9, 0x8, 0xa, 0xf, 0x0, 0x5, 0x2, 0x6, 0xc, + 0xb, 0x4, 0xd, 0x1, 0xe, 0x4, 0x6, 0x2, 0xb, 0x3, 0xd, 0x8, 0xc, 0xf, + 0x5, 0xa, 0x0, 0x7, 0x1, 0x9, 0xe, 0x7, 0xa, 0xc, 0xd, 0x1, 0x3, 0x9, + 0x0, 0x2, 0xb, 0x4, 0xf, 0x8, 0x5, 0x6, 0xb, 0x5, 0x1, 0x9, 0x8, 0xd, + 0xf, 0x0, 0xe, 0x4, 0x2, 0x3, 0xc, 0x7, 0xa, 0x6, 0x3, 0xa, 0xd, 0xc, + 0x1, 0x2, 0x0, 0xb, 0x7, 0x5, 0x9, 0x4, 0x8, 0xf, 0xe, 0x6, 0x1, 0xd, + 0x2, 0x9, 0x7, 0xa, 0x6, 0x0, 0x8, 0xc, 0x4, 0x5, 0xf, 0x3, 0xb, 0xe, + 0xb, 0xa, 0xf, 0x5, 0x0, 0xc, 0xe, 0x8, 0x6, 0x2, 0x3, 0x9, 0x1, 0x7, + 0xd, 0x4, ], - 'E-B': [ - 0x8, 0x4, 0xB, 0x1, 0x3, 0x5, 0x0, 0x9, 0x2, 0xE, 0xA, 0xC, 0xD, 0x6, 0x7, 0xF, - 0x0, 0x1, 0x2, 0xA, 0x4, 0xD, 0x5, 0xC, 0x9, 0x7, 0x3, 0xF, 0xB, 0x8, 0x6, 0xE, - 0xE, 0xC, 0x0, 0xA, 0x9, 0x2, 0xD, 0xB, 0x7, 0x5, 0x8, 0xF, 0x3, 0x6, 0x1, 0x4, - 0x7, 0x5, 0x0, 0xD, 0xB, 0x6, 0x1, 0x2, 0x3, 0xA, 0xC, 0xF, 0x4, 0xE, 0x9, 0x8, - 0x2, 0x7, 0xC, 0xF, 0x9, 0x5, 0xA, 0xB, 0x1, 0x4, 0x0, 0xD, 0x6, 0x8, 0xE, 0x3, - 0x8, 0x3, 0x2, 0x6, 0x4, 0xD, 0xE, 0xB, 0xC, 0x1, 0x7, 0xF, 0xA, 0x0, 0x9, 0x5, - 0x5, 0x2, 0xA, 0xB, 0x9, 0x1, 0xC, 0x3, 0x7, 0x4, 0xD, 0x0, 0x6, 0xF, 0x8, 0xE, - 0x0, 0x4, 0xB, 0xE, 0x8, 0x3, 0x7, 0x1, 0xA, 0x2, 0x9, 0x6, 0xF, 0xD, 0x5, 0xC + "E-B": [ + 0x8, 0x4, 0xb, 0x1, 0x3, 0x5, 0x0, 0x9, 0x2, 0xe, 0xa, 0xc, 0xd, 0x6, + 0x7, 0xf, 0x0, 0x1, 0x2, 0xa, 0x4, 0xd, 0x5, 0xc, 0x9, 0x7, 0x3, 0xf, + 0xb, 0x8, 0x6, 0xe, 0xe, 0xc, 0x0, 0xa, 0x9, 0x2, 0xd, 0xb, 0x7, 0x5, + 0x8, 0xf, 0x3, 0x6, 0x1, 0x4, 0x7, 0x5, 0x0, 0xd, 0xb, 0x6, 0x1, 0x2, + 0x3, 0xa, 0xc, 0xf, 0x4, 0xe, 0x9, 0x8, 0x2, 0x7, 0xc, 0xf, 0x9, 0x5, + 0xa, 0xb, 0x1, 0x4, 0x0, 0xd, 0x6, 0x8, 0xe, 0x3, 0x8, 0x3, 0x2, 0x6, + 0x4, 0xd, 0xe, 0xb, 0xc, 0x1, 0x7, 0xf, 0xa, 0x0, 0x9, 0x5, 0x5, 0x2, + 0xa, 0xb, 0x9, 0x1, 0xc, 0x3, 0x7, 0x4, 0xd, 0x0, 0x6, 0xf, 0x8, 0xe, + 0x0, 0x4, 0xb, 0xe, 0x8, 0x3, 0x7, 0x1, 0xa, 0x2, 0x9, 0x6, 0xf, 0xd, + 0x5, 0xc, ], - 'E-C': [ - 0x1, 0xB, 0xC, 0x2, 0x9, 0xD, 0x0, 0xF, 0x4, 0x5, 0x8, 0xE, 0xA, 0x7, 0x6, 0x3, - 0x0, 0x1, 0x7, 0xD, 0xB, 0x4, 0x5, 0x2, 0x8, 0xE, 0xF, 0xC, 0x9, 0xA, 0x6, 0x3, - 0x8, 0x2, 0x5, 0x0, 0x4, 0x9, 0xF, 0xA, 0x3, 0x7, 0xC, 0xD, 0x6, 0xE, 0x1, 0xB, - 0x3, 0x6, 0x0, 0x1, 0x5, 0xD, 0xA, 0x8, 0xB, 0x2, 0x9, 0x7, 0xE, 0xF, 0xC, 0x4, - 0x8, 0xD, 0xB, 0x0, 0x4, 0x5, 0x1, 0x2, 0x9, 0x3, 0xC, 0xE, 0x6, 0xF, 0xA, 0x7, - 0xC, 0x9, 0xB, 0x1, 0x8, 0xE, 0x2, 0x4, 0x7, 0x3, 0x6, 0x5, 0xA, 0x0, 0xF, 0xD, - 0xA, 0x9, 0x6, 0x8, 0xD, 0xE, 0x2, 0x0, 0xF, 0x3, 0x5, 0xB, 0x4, 0x1, 0xC, 0x7, - 0x7, 0x4, 0x0, 0x5, 0xA, 0x2, 0xF, 0xE, 0xC, 0x6, 0x1, 0xB, 0xD, 0x9, 0x3, 0x8 + "E-C": [ + 0x1, 0xb, 0xc, 0x2, 0x9, 0xd, 0x0, 0xf, 0x4, 0x5, 0x8, 0xe, 0xa, 0x7, + 0x6, 0x3, 0x0, 0x1, 0x7, 0xd, 0xb, 0x4, 0x5, 0x2, 0x8, 0xe, 0xf, 0xc, + 0x9, 0xa, 0x6, 0x3, 0x8, 0x2, 0x5, 0x0, 0x4, 0x9, 0xf, 0xa, 0x3, 0x7, + 0xc, 0xd, 0x6, 0xe, 0x1, 0xb, 0x3, 0x6, 0x0, 0x1, 0x5, 0xd, 0xa, 0x8, + 0xb, 0x2, 0x9, 0x7, 0xe, 0xf, 0xc, 0x4, 0x8, 0xd, 0xb, 0x0, 0x4, 0x5, + 0x1, 0x2, 0x9, 0x3, 0xc, 0xe, 0x6, 0xf, 0xa, 0x7, 0xc, 0x9, 0xb, 0x1, + 0x8, 0xe, 0x2, 0x4, 0x7, 0x3, 0x6, 0x5, 0xa, 0x0, 0xf, 0xd, 0xa, 0x9, + 0x6, 0x8, 0xd, 0xe, 0x2, 0x0, 0xf, 0x3, 0x5, 0xb, 0x4, 0x1, 0xc, 0x7, + 0x7, 0x4, 0x0, 0x5, 0xa, 0x2, 0xf, 0xe, 0xc, 0x6, 0x1, 0xb, 0xd, 0x9, + 0x3, 0x8, ], - 'E-D': [ - 0xF, 0xC, 0x2, 0xA, 0x6, 0x4, 0x5, 0x0, 0x7, 0x9, 0xE, 0xD, 0x1, 0xB, 0x8, 0x3, - 0xB, 0x6, 0x3, 0x4, 0xC, 0xF, 0xE, 0x2, 0x7, 0xD, 0x8, 0x0, 0x5, 0xA, 0x9, 0x1, - 0x1, 0xC, 0xB, 0x0, 0xF, 0xE, 0x6, 0x5, 0xA, 0xD, 0x4, 0x8, 0x9, 0x3, 0x7, 0x2, - 0x1, 0x5, 0xE, 0xC, 0xA, 0x7, 0x0, 0xD, 0x6, 0x2, 0xB, 0x4, 0x9, 0x3, 0xF, 0x8, - 0x0, 0xC, 0x8, 0x9, 0xD, 0x2, 0xA, 0xB, 0x7, 0x3, 0x6, 0x5, 0x4, 0xE, 0xF, 0x1, - 0x8, 0x0, 0xF, 0x3, 0x2, 0x5, 0xE, 0xB, 0x1, 0xA, 0x4, 0x7, 0xC, 0x9, 0xD, 0x6, - 0x3, 0x0, 0x6, 0xF, 0x1, 0xE, 0x9, 0x2, 0xD, 0x8, 0xC, 0x4, 0xB, 0xA, 0x5, 0x7, - 0x1, 0xA, 0x6, 0x8, 0xF, 0xB, 0x0, 0x4, 0xC, 0x3, 0x5, 0x9, 0x7, 0xD, 0x2, 0xE + "E-D": [ + 0xf, 0xc, 0x2, 0xa, 0x6, 0x4, 0x5, 0x0, 0x7, 0x9, 0xe, 0xd, 0x1, 0xb, + 0x8, 0x3, 0xb, 0x6, 0x3, 0x4, 0xc, 0xf, 0xe, 0x2, 0x7, 0xd, 0x8, 0x0, + 0x5, 0xa, 0x9, 0x1, 0x1, 0xc, 0xb, 0x0, 0xf, 0xe, 0x6, 0x5, 0xa, 0xd, + 0x4, 0x8, 0x9, 0x3, 0x7, 0x2, 0x1, 0x5, 0xe, 0xc, 0xa, 0x7, 0x0, 0xd, + 0x6, 0x2, 0xb, 0x4, 0x9, 0x3, 0xf, 0x8, 0x0, 0xc, 0x8, 0x9, 0xd, 0x2, + 0xa, 0xb, 0x7, 0x3, 0x6, 0x5, 0x4, 0xe, 0xf, 0x1, 0x8, 0x0, 0xf, 0x3, + 0x2, 0x5, 0xe, 0xb, 0x1, 0xa, 0x4, 0x7, 0xc, 0x9, 0xd, 0x6, 0x3, 0x0, + 0x6, 0xf, 0x1, 0xe, 0x9, 0x2, 0xd, 0x8, 0xc, 0x4, 0xb, 0xa, 0x5, 0x7, + 0x1, 0xa, 0x6, 0x8, 0xf, 0xb, 0x0, 0x4, 0xc, 0x3, 0x5, 0x9, 0x7, 0xd, + 0x2, 0xe, ], - 'E-SC': [ - 0x3, 0x6, 0x1, 0x0, 0x5, 0x7, 0xd, 0x9, 0x4, 0xb, 0x8, 0xc, 0xe, 0xf, 0x2, 0xa, - 0x7, 0x1, 0x5, 0x2, 0x8, 0xb, 0x9, 0xc, 0xd, 0x0, 0x3, 0xa, 0xf, 0xe, 0x4, 0x6, - 0xf, 0x1, 0x4, 0x6, 0xc, 0x8, 0x9, 0x2, 0xe, 0x3, 0x7, 0xa, 0xb, 0xd, 0x5, 0x0, - 0x3, 0x4, 0xf, 0xc, 0x5, 0x9, 0xe, 0x0, 0x6, 0x8, 0x7, 0xa, 0x1, 0xb, 0xd, 0x2, - 0x6, 0x9, 0x0, 0x7, 0xb, 0x8, 0x4, 0xc, 0x2, 0xe, 0xa, 0xf, 0x1, 0xd, 0x5, 0x3, - 0x6, 0x1, 0x2, 0xf, 0x0, 0xb, 0x9, 0xc, 0x7, 0xd, 0xa, 0x5, 0x8, 0x4, 0xe, 0x3, - 0x0, 0x2, 0xe, 0xc, 0x9, 0x1, 0x4, 0x7, 0x3, 0xf, 0x6, 0x8, 0xa, 0xd, 0xb, 0x5, - 0x5, 0x2, 0xb, 0x8, 0x4, 0xc, 0x7, 0x1, 0xa, 0x6, 0xe, 0x0, 0x9, 0x3, 0xd, 0xf + "E-SC": [ + 0x3, 0x6, 0x1, 0x0, 0x5, 0x7, 0xd, 0x9, 0x4, 0xb, 0x8, 0xc, 0xe, 0xf, + 0x2, 0xa, 0x7, 0x1, 0x5, 0x2, 0x8, 0xb, 0x9, 0xc, 0xd, 0x0, 0x3, 0xa, + 0xf, 0xe, 0x4, 0x6, 0xf, 0x1, 0x4, 0x6, 0xc, 0x8, 0x9, 0x2, 0xe, 0x3, + 0x7, 0xa, 0xb, 0xd, 0x5, 0x0, 0x3, 0x4, 0xf, 0xc, 0x5, 0x9, 0xe, 0x0, + 0x6, 0x8, 0x7, 0xa, 0x1, 0xb, 0xd, 0x2, 0x6, 0x9, 0x0, 0x7, 0xb, 0x8, + 0x4, 0xc, 0x2, 0xe, 0xa, 0xf, 0x1, 0xd, 0x5, 0x3, 0x6, 0x1, 0x2, 0xf, + 0x0, 0xb, 0x9, 0xc, 0x7, 0xd, 0xa, 0x5, 0x8, 0x4, 0xe, 0x3, 0x0, 0x2, + 0xe, 0xc, 0x9, 0x1, 0x4, 0x7, 0x3, 0xf, 0x6, 0x8, 0xa, 0xd, 0xb, 0x5, + 0x5, 0x2, 0xb, 0x8, 0x4, 0xc, 0x7, 0x1, 0xa, 0x6, 0xe, 0x0, 0x9, 0x3, + 0xd, 0xf, ], - 'E-Z': [// This is default S-box in according to draft of new standard - 0xc, 0x4, 0x6, 0x2, 0xa, 0x5, 0xb, 0x9, 0xe, 0x8, 0xd, 0x7, 0x0, 0x3, 0xf, 0x1, - 0x6, 0x8, 0x2, 0x3, 0x9, 0xa, 0x5, 0xc, 0x1, 0xe, 0x4, 0x7, 0xb, 0xd, 0x0, 0xf, - 0xb, 0x3, 0x5, 0x8, 0x2, 0xf, 0xa, 0xd, 0xe, 0x1, 0x7, 0x4, 0xc, 0x9, 0x6, 0x0, - 0xc, 0x8, 0x2, 0x1, 0xd, 0x4, 0xf, 0x6, 0x7, 0x0, 0xa, 0x5, 0x3, 0xe, 0x9, 0xb, - 0x7, 0xf, 0x5, 0xa, 0x8, 0x1, 0x6, 0xd, 0x0, 0x9, 0x3, 0xe, 0xb, 0x4, 0x2, 0xc, - 0x5, 0xd, 0xf, 0x6, 0x9, 0x2, 0xc, 0xa, 0xb, 0x7, 0x8, 0x1, 0x4, 0x3, 0xe, 0x0, - 0x8, 0xe, 0x2, 0x5, 0x6, 0x9, 0x1, 0xc, 0xf, 0x4, 0xb, 0x0, 0xd, 0xa, 0x3, 0x7, - 0x1, 0x7, 0xe, 0xd, 0x0, 0x5, 0x8, 0x3, 0x4, 0xf, 0xa, 0x6, 0x9, 0xc, 0xb, 0x2 + "E-Z": [ + // This is default S-box in according to draft of new standard + 0xc, 0x4, 0x6, 0x2, 0xa, 0x5, 0xb, 0x9, 0xe, 0x8, 0xd, 0x7, 0x0, 0x3, + 0xf, 0x1, 0x6, 0x8, 0x2, 0x3, 0x9, 0xa, 0x5, 0xc, 0x1, 0xe, 0x4, 0x7, + 0xb, 0xd, 0x0, 0xf, 0xb, 0x3, 0x5, 0x8, 0x2, 0xf, 0xa, 0xd, 0xe, 0x1, + 0x7, 0x4, 0xc, 0x9, 0x6, 0x0, 0xc, 0x8, 0x2, 0x1, 0xd, 0x4, 0xf, 0x6, + 0x7, 0x0, 0xa, 0x5, 0x3, 0xe, 0x9, 0xb, 0x7, 0xf, 0x5, 0xa, 0x8, 0x1, + 0x6, 0xd, 0x0, 0x9, 0x3, 0xe, 0xb, 0x4, 0x2, 0xc, 0x5, 0xd, 0xf, 0x6, + 0x9, 0x2, 0xc, 0xa, 0xb, 0x7, 0x8, 0x1, 0x4, 0x3, 0xe, 0x0, 0x8, 0xe, + 0x2, 0x5, 0x6, 0x9, 0x1, 0xc, 0xf, 0x4, 0xb, 0x0, 0xd, 0xa, 0x3, 0x7, + 0x1, 0x7, 0xe, 0xd, 0x0, 0x5, 0x8, 0x3, 0x4, 0xf, 0xa, 0x6, 0x9, 0xc, + 0xb, 0x2, ], //S-box for digest - 'D-TEST': [ - 0x4, 0xA, 0x9, 0x2, 0xD, 0x8, 0x0, 0xE, 0x6, 0xB, 0x1, 0xC, 0x7, 0xF, 0x5, 0x3, - 0xE, 0xB, 0x4, 0xC, 0x6, 0xD, 0xF, 0xA, 0x2, 0x3, 0x8, 0x1, 0x0, 0x7, 0x5, 0x9, - 0x5, 0x8, 0x1, 0xD, 0xA, 0x3, 0x4, 0x2, 0xE, 0xF, 0xC, 0x7, 0x6, 0x0, 0x9, 0xB, - 0x7, 0xD, 0xA, 0x1, 0x0, 0x8, 0x9, 0xF, 0xE, 0x4, 0x6, 0xC, 0xB, 0x2, 0x5, 0x3, - 0x6, 0xC, 0x7, 0x1, 0x5, 0xF, 0xD, 0x8, 0x4, 0xA, 0x9, 0xE, 0x0, 0x3, 0xB, 0x2, - 0x4, 0xB, 0xA, 0x0, 0x7, 0x2, 0x1, 0xD, 0x3, 0x6, 0x8, 0x5, 0x9, 0xC, 0xF, 0xE, - 0xD, 0xB, 0x4, 0x1, 0x3, 0xF, 0x5, 0x9, 0x0, 0xA, 0xE, 0x7, 0x6, 0x8, 0x2, 0xC, - 0x1, 0xF, 0xD, 0x0, 0x5, 0x7, 0xA, 0x4, 0x9, 0x2, 0x3, 0xE, 0x6, 0xB, 0x8, 0xC + "D-TEST": [ + 0x4, 0xa, 0x9, 0x2, 0xd, 0x8, 0x0, 0xe, 0x6, 0xb, 0x1, 0xc, 0x7, 0xf, + 0x5, 0x3, 0xe, 0xb, 0x4, 0xc, 0x6, 0xd, 0xf, 0xa, 0x2, 0x3, 0x8, 0x1, + 0x0, 0x7, 0x5, 0x9, 0x5, 0x8, 0x1, 0xd, 0xa, 0x3, 0x4, 0x2, 0xe, 0xf, + 0xc, 0x7, 0x6, 0x0, 0x9, 0xb, 0x7, 0xd, 0xa, 0x1, 0x0, 0x8, 0x9, 0xf, + 0xe, 0x4, 0x6, 0xc, 0xb, 0x2, 0x5, 0x3, 0x6, 0xc, 0x7, 0x1, 0x5, 0xf, + 0xd, 0x8, 0x4, 0xa, 0x9, 0xe, 0x0, 0x3, 0xb, 0x2, 0x4, 0xb, 0xa, 0x0, + 0x7, 0x2, 0x1, 0xd, 0x3, 0x6, 0x8, 0x5, 0x9, 0xc, 0xf, 0xe, 0xd, 0xb, + 0x4, 0x1, 0x3, 0xf, 0x5, 0x9, 0x0, 0xa, 0xe, 0x7, 0x6, 0x8, 0x2, 0xc, + 0x1, 0xf, 0xd, 0x0, 0x5, 0x7, 0xa, 0x4, 0x9, 0x2, 0x3, 0xe, 0x6, 0xb, + 0x8, 0xc, ], - 'D-A': [ - 0xA, 0x4, 0x5, 0x6, 0x8, 0x1, 0x3, 0x7, 0xD, 0xC, 0xE, 0x0, 0x9, 0x2, 0xB, 0xF, - 0x5, 0xF, 0x4, 0x0, 0x2, 0xD, 0xB, 0x9, 0x1, 0x7, 0x6, 0x3, 0xC, 0xE, 0xA, 0x8, - 0x7, 0xF, 0xC, 0xE, 0x9, 0x4, 0x1, 0x0, 0x3, 0xB, 0x5, 0x2, 0x6, 0xA, 0x8, 0xD, - 0x4, 0xA, 0x7, 0xC, 0x0, 0xF, 0x2, 0x8, 0xE, 0x1, 0x6, 0x5, 0xD, 0xB, 0x9, 0x3, - 0x7, 0x6, 0x4, 0xB, 0x9, 0xC, 0x2, 0xA, 0x1, 0x8, 0x0, 0xE, 0xF, 0xD, 0x3, 0x5, - 0x7, 0x6, 0x2, 0x4, 0xD, 0x9, 0xF, 0x0, 0xA, 0x1, 0x5, 0xB, 0x8, 0xE, 0xC, 0x3, - 0xD, 0xE, 0x4, 0x1, 0x7, 0x0, 0x5, 0xA, 0x3, 0xC, 0x8, 0xF, 0x6, 0x2, 0x9, 0xB, - 0x1, 0x3, 0xA, 0x9, 0x5, 0xB, 0x4, 0xF, 0x8, 0x6, 0x7, 0xE, 0xD, 0x0, 0x2, 0xC + "D-A": [ + 0xa, 0x4, 0x5, 0x6, 0x8, 0x1, 0x3, 0x7, 0xd, 0xc, 0xe, 0x0, 0x9, 0x2, + 0xb, 0xf, 0x5, 0xf, 0x4, 0x0, 0x2, 0xd, 0xb, 0x9, 0x1, 0x7, 0x6, 0x3, + 0xc, 0xe, 0xa, 0x8, 0x7, 0xf, 0xc, 0xe, 0x9, 0x4, 0x1, 0x0, 0x3, 0xb, + 0x5, 0x2, 0x6, 0xa, 0x8, 0xd, 0x4, 0xa, 0x7, 0xc, 0x0, 0xf, 0x2, 0x8, + 0xe, 0x1, 0x6, 0x5, 0xd, 0xb, 0x9, 0x3, 0x7, 0x6, 0x4, 0xb, 0x9, 0xc, + 0x2, 0xa, 0x1, 0x8, 0x0, 0xe, 0xf, 0xd, 0x3, 0x5, 0x7, 0x6, 0x2, 0x4, + 0xd, 0x9, 0xf, 0x0, 0xa, 0x1, 0x5, 0xb, 0x8, 0xe, 0xc, 0x3, 0xd, 0xe, + 0x4, 0x1, 0x7, 0x0, 0x5, 0xa, 0x3, 0xc, 0x8, 0xf, 0x6, 0x2, 0x9, 0xb, + 0x1, 0x3, 0xa, 0x9, 0x5, 0xb, 0x4, 0xf, 0x8, 0x6, 0x7, 0xe, 0xd, 0x0, + 0x2, 0xc, + ], + "D-SC": [ + 0xb, 0xd, 0x7, 0x0, 0x5, 0x4, 0x1, 0xf, 0x9, 0xe, 0x6, 0xa, 0x3, 0xc, + 0x8, 0x2, 0x1, 0x2, 0x7, 0x9, 0xd, 0xb, 0xf, 0x8, 0xe, 0xc, 0x4, 0x0, + 0x5, 0x6, 0xa, 0x3, 0x5, 0x1, 0xd, 0x3, 0xf, 0x6, 0xc, 0x7, 0x9, 0x8, + 0xb, 0x2, 0x4, 0xe, 0x0, 0xa, 0xd, 0x1, 0xb, 0x4, 0x9, 0xc, 0xe, 0x0, + 0x7, 0x5, 0x8, 0xf, 0x6, 0x2, 0xa, 0x3, 0x2, 0xd, 0xa, 0xf, 0x9, 0xb, + 0x3, 0x7, 0x8, 0xc, 0x5, 0xe, 0x6, 0x0, 0x1, 0x4, 0x0, 0x4, 0x6, 0xc, + 0x5, 0x3, 0x8, 0xd, 0xa, 0xb, 0xf, 0x2, 0x1, 0x9, 0x7, 0xe, 0x1, 0x3, + 0xc, 0x8, 0xa, 0x6, 0xb, 0x0, 0x2, 0xe, 0x7, 0x9, 0xf, 0x4, 0x5, 0xd, + 0xa, 0xb, 0x6, 0x0, 0x1, 0x3, 0x4, 0x7, 0xe, 0xd, 0x5, 0xf, 0x8, 0x2, + 0x9, 0xc, ], - 'D-SC': [ - 0xb, 0xd, 0x7, 0x0, 0x5, 0x4, 0x1, 0xf, 0x9, 0xe, 0x6, 0xa, 0x3, 0xc, 0x8, 0x2, - 0x1, 0x2, 0x7, 0x9, 0xd, 0xb, 0xf, 0x8, 0xe, 0xc, 0x4, 0x0, 0x5, 0x6, 0xa, 0x3, - 0x5, 0x1, 0xd, 0x3, 0xf, 0x6, 0xc, 0x7, 0x9, 0x8, 0xb, 0x2, 0x4, 0xe, 0x0, 0xa, - 0xd, 0x1, 0xb, 0x4, 0x9, 0xc, 0xe, 0x0, 0x7, 0x5, 0x8, 0xf, 0x6, 0x2, 0xa, 0x3, - 0x2, 0xd, 0xa, 0xf, 0x9, 0xb, 0x3, 0x7, 0x8, 0xc, 0x5, 0xe, 0x6, 0x0, 0x1, 0x4, - 0x0, 0x4, 0x6, 0xc, 0x5, 0x3, 0x8, 0xd, 0xa, 0xb, 0xf, 0x2, 0x1, 0x9, 0x7, 0xe, - 0x1, 0x3, 0xc, 0x8, 0xa, 0x6, 0xb, 0x0, 0x2, 0xe, 0x7, 0x9, 0xf, 0x4, 0x5, 0xd, - 0xa, 0xb, 0x6, 0x0, 0x1, 0x3, 0x4, 0x7, 0xe, 0xd, 0x5, 0xf, 0x8, 0x2, 0x9, 0xc - ] }; var C = new Uint8Array([ - 0x69, 0x00, 0x72, 0x22, 0x64, 0xC9, 0x04, 0x23, - 0x8D, 0x3A, 0xDB, 0x96, 0x46, 0xE9, 0x2A, 0xC4, - 0x18, 0xFE, 0xAC, 0x94, 0x00, 0xED, 0x07, 0x12, - 0xC0, 0x86, 0xDC, 0xC2, 0xEF, 0x4C, 0xA9, 0x2B + 0x69, 0x00, 0x72, 0x22, 0x64, 0xc9, 0x04, 0x23, 0x8d, 0x3a, 0xdb, 0x96, + 0x46, 0xe9, 0x2a, 0xc4, 0x18, 0xfe, 0xac, 0x94, 0x00, 0xed, 0x07, 0x12, + 0xc0, 0x86, 0xdc, 0xc2, 0xef, 0x4c, 0xa9, 0x2b, ]); function signed(x) { @@ -187,22 +207,22 @@ function unsigned(x) { // Random generator function randomSeed(e) { GostRandom = GostRandom || root.GostRandom; - var randomSource = GostRandom ? new (GostRandom || root.GostRandom) : rootCrypto; - if (randomSource.getRandomValues) - randomSource.getRandomValues(e); - else - throw new NotSupportedError('Random generator not found'); + var randomSource = GostRandom + ? new (GostRandom || root.GostRandom)() + : rootCrypto; + if (randomSource.getRandomValues) randomSource.getRandomValues(e); + else throw new NotSupportedError("Random generator not found"); } // Get buffer function buffer(d) { - if (d instanceof CryptoOperationData) - return d; + if (d instanceof CryptoOperationData) return d; else if (d && d?.buffer instanceof CryptoOperationData) - return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength ? - d.buffer : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; - else - throw new DataError('CryptoOperationData required'); + return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength + ? d.buffer + : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)) + .buffer; + else throw new DataError("CryptoOperationData required"); } // Get byte array @@ -215,7 +235,6 @@ function cloneArray(d) { return new Uint8Array(byteArray(d)); } - // Get int32 array function intArray(d) { return new Int32Array(buffer(d)); @@ -223,37 +242,40 @@ function intArray(d) { // Swap bytes for version 2015 function swap32(b) { - return ((b & 0xff) << 24) - | ((b & 0xff00) << 8) - | ((b >> 8) & 0xff00) - | ((b >> 24) & 0xff); + return ( + ((b & 0xff) << 24) | + ((b & 0xff00) << 8) | + ((b >> 8) & 0xff00) | + ((b >> 24) & 0xff) + ); } // /* - * Initial parameters and common algortithms of GOST R 34.12-15 - * Algorithm "Kuznechik" 128bit - * - */ // + * Initial parameters and common algortithms of GOST R 34.12-15 + * Algorithm "Kuznechik" 128bit + * + */ // // Default initial vector -var defaultIV128 = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); +var defaultIV128 = new Uint8Array([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +]); // Mult table for R function var multTable = (function () { - // Multiply two numbers in the GF(2^8) finite field defined // by the polynomial x^8 + x^7 + x^6 + x + 1 = 0 */ function gmul(a, b) { - var p = 0, counter, carry; + var p = 0, + counter, + carry; for (counter = 0; counter < 8; counter++) { - if (b & 1) - p ^= a; + if (b & 1) p ^= a; carry = a & 0x80; // detect if x^8 term is about to be generated a = (a << 1) & 0xff; - if (carry) - a ^= 0xc3; // replace x^8 with x^7 + x^6 + x + 1 + if (carry) a ^= 0xc3; // replace x^8 with x^7 + x^6 + x + 1 b >>= 1; } return p & 0xff; @@ -265,8 +287,7 @@ var multTable = (function () { var m = []; for (var i = 0; i < 8; i++) { m[i] = []; - for (var j = 0; j < 256; j++) - m[i][j] = gmul(x[i], j); + for (var j = 0; j < 256; j++) m[i][j] = gmul(x[i], j); } return m; })(); @@ -277,23 +298,19 @@ var kB = [4, 2, 3, 1, 6, 5, 0, 7, 0, 5, 6, 1, 3, 2, 4, 0]; // R - function function funcR(d) { var sum = 0; - for (var i = 0; i < 16; i++) - sum ^= multTable[kB[i]][d[i]]; + for (var i = 0; i < 16; i++) sum ^= multTable[kB[i]][d[i]]; - for (var i = 16; i > 0; --i) - d[i] = d[i - 1]; + for (var i = 16; i > 0; --i) d[i] = d[i - 1]; d[0] = sum; } function funcReverseR(d) { var tmp = d[0]; - for (var i = 0; i < 15; i++) - d[i] = d[i + 1]; + for (var i = 0; i < 15; i++) d[i] = d[i + 1]; d[15] = tmp; var sum = 0; - for (i = 0; i < 16; i++) - sum ^= multTable[kB[i]][d[i]]; + for (i = 0; i < 16; i++) sum ^= multTable[kB[i]][d[i]]; d[15] = sum; } @@ -301,52 +318,46 @@ function funcReverseR(d) { var kPi = [ 252, 238, 221, 17, 207, 110, 49, 22, 251, 196, 250, 218, 35, 197, 4, 77, 233, 119, 240, 219, 147, 46, 153, 186, 23, 54, 241, 187, 20, 205, 95, 193, - 249, 24, 101, 90, 226, 92, 239, 33, 129, 28, 60, 66, 139, 1, 142, 79, - 5, 132, 2, 174, 227, 106, 143, 160, 6, 11, 237, 152, 127, 212, 211, 31, - 235, 52, 44, 81, 234, 200, 72, 171, 242, 42, 104, 162, 253, 58, 206, 204, - 181, 112, 14, 86, 8, 12, 118, 18, 191, 114, 19, 71, 156, 183, 93, 135, - 21, 161, 150, 41, 16, 123, 154, 199, 243, 145, 120, 111, 157, 158, 178, 177, - 50, 117, 25, 61, 255, 53, 138, 126, 109, 84, 198, 128, 195, 189, 13, 87, - 223, 245, 36, 169, 62, 168, 67, 201, 215, 121, 214, 246, 124, 34, 185, 3, - 224, 15, 236, 222, 122, 148, 176, 188, 220, 232, 40, 80, 78, 51, 10, 74, - 167, 151, 96, 115, 30, 0, 98, 68, 26, 184, 56, 130, 100, 159, 38, 65, - 173, 69, 70, 146, 39, 94, 85, 47, 140, 163, 165, 125, 105, 213, 149, 59, - 7, 88, 179, 64, 134, 172, 29, 247, 48, 55, 107, 228, 136, 217, 231, 137, - 225, 27, 131, 73, 76, 63, 248, 254, 141, 83, 170, 144, 202, 216, 133, 97, - 32, 113, 103, 164, 45, 43, 9, 91, 203, 155, 37, 208, 190, 229, 108, 82, - 89, 166, 116, 210, 230, 244, 180, 192, 209, 102, 175, 194, 57, 75, 99, 182 + 249, 24, 101, 90, 226, 92, 239, 33, 129, 28, 60, 66, 139, 1, 142, 79, 5, + 132, 2, 174, 227, 106, 143, 160, 6, 11, 237, 152, 127, 212, 211, 31, 235, + 52, 44, 81, 234, 200, 72, 171, 242, 42, 104, 162, 253, 58, 206, 204, 181, + 112, 14, 86, 8, 12, 118, 18, 191, 114, 19, 71, 156, 183, 93, 135, 21, 161, + 150, 41, 16, 123, 154, 199, 243, 145, 120, 111, 157, 158, 178, 177, 50, 117, + 25, 61, 255, 53, 138, 126, 109, 84, 198, 128, 195, 189, 13, 87, 223, 245, + 36, 169, 62, 168, 67, 201, 215, 121, 214, 246, 124, 34, 185, 3, 224, 15, + 236, 222, 122, 148, 176, 188, 220, 232, 40, 80, 78, 51, 10, 74, 167, 151, + 96, 115, 30, 0, 98, 68, 26, 184, 56, 130, 100, 159, 38, 65, 173, 69, 70, + 146, 39, 94, 85, 47, 140, 163, 165, 125, 105, 213, 149, 59, 7, 88, 179, 64, + 134, 172, 29, 247, 48, 55, 107, 228, 136, 217, 231, 137, 225, 27, 131, 73, + 76, 63, 248, 254, 141, 83, 170, 144, 202, 216, 133, 97, 32, 113, 103, 164, + 45, 43, 9, 91, 203, 155, 37, 208, 190, 229, 108, 82, 89, 166, 116, 210, 230, + 244, 180, 192, 209, 102, 175, 194, 57, 75, 99, 182, ]; var kReversePi = (function () { var m = []; - for (var i = 0, n = kPi.length; i < n; i++) - m[kPi[i]] = i; + for (var i = 0, n = kPi.length; i < n; i++) m[kPi[i]] = i; return m; })(); function funcS(d) { - for (var i = 0; i < 16; ++i) - d[i] = kPi[d[i]]; + for (var i = 0; i < 16; ++i) d[i] = kPi[d[i]]; } function funcReverseS(d) { - for (var i = 0; i < 16; ++i) - d[i] = kReversePi[d[i]]; + for (var i = 0; i < 16; ++i) d[i] = kReversePi[d[i]]; } function funcX(a, b) { - for (var i = 0; i < 16; ++i) - a[i] ^= b[i]; + for (var i = 0; i < 16; ++i) a[i] ^= b[i]; } function funcL(d) { - for (var i = 0; i < 16; ++i) - funcR(d); + for (var i = 0; i < 16; ++i) funcR(d); } function funcReverseL(d) { - for (var i = 0; i < 16; ++i) - funcReverseR(d); + for (var i = 0; i < 16; ++i) funcReverseR(d); } function funcLSX(a, b) { @@ -369,8 +380,7 @@ function funcF(inputKey, inputKeySecond, iterationConst) { } function funcC(number, d) { - for (var i = 0; i < 15; i++) - d[i] = 0; + for (var i = 0; i < 15; i++) d[i] = 0; d[15] = number; funcL(d); } @@ -387,17 +397,22 @@ function funcC(number, d) { * @param {type} k * @returns {Uint8Array} */ -function keySchedule128(k) // -{ - var keys = new Uint8Array(160), c = new Uint8Array(16); +function keySchedule128(k) { + // + var keys = new Uint8Array(160), + c = new Uint8Array(16); keys.set(byteArray(k)); for (var j = 0; j < 4; j++) { - var j0 = 32 * j, j1 = 32 * (j + 1); + var j0 = 32 * j, + j1 = 32 * (j + 1); keys.set(new Uint8Array(keys.buffer, j0, 32), j1); for (var i = 1; i < 9; i++) { funcC(j * 8 + i, c); - funcF(new Uint8Array(keys.buffer, j1, 16), - new Uint8Array(keys.buffer, j1 + 16, 16), c); + funcF( + new Uint8Array(keys.buffer, j1, 16), + new Uint8Array(keys.buffer, j1 + 16, 16), + c, + ); } } return keys; @@ -415,8 +430,8 @@ function keySchedule128(k) // * @param {number} ofs Offsec * @param {number} e true - decrypt */ -function process128(k, d, ofs, e) // -{ +function process128(k, d, ofs, e) { + // ofs = ofs || d.byteOffset; var r = new Uint8Array(d.buffer, ofs, 16); if (e) { @@ -443,24 +458,23 @@ function process128(k, d, ofs, e) // * @param {Int32Array} m 2x32 bits cipher block * @param {Int32Array} k 32 bits key[i] */ -function round(S, m, k) // -{ +function round(S, m, k) { + // var cm = (m[0] + k) & 0xffffffff; - var om = S[ 0 + ((cm >> (0 * 4)) & 0xF)] << (0 * 4); - om |= S[ 16 + ((cm >> (1 * 4)) & 0xF)] << (1 * 4); - om |= S[ 32 + ((cm >> (2 * 4)) & 0xF)] << (2 * 4); - om |= S[ 48 + ((cm >> (3 * 4)) & 0xF)] << (3 * 4); - om |= S[ 64 + ((cm >> (4 * 4)) & 0xF)] << (4 * 4); - om |= S[ 80 + ((cm >> (5 * 4)) & 0xF)] << (5 * 4); - om |= S[ 96 + ((cm >> (6 * 4)) & 0xF)] << (6 * 4); - om |= S[112 + ((cm >> (7 * 4)) & 0xF)] << (7 * 4); - cm = om << 11 | om >>> (32 - 11); + var om = S[0 + ((cm >> (0 * 4)) & 0xf)] << (0 * 4); + om |= S[16 + ((cm >> (1 * 4)) & 0xf)] << (1 * 4); + om |= S[32 + ((cm >> (2 * 4)) & 0xf)] << (2 * 4); + om |= S[48 + ((cm >> (3 * 4)) & 0xf)] << (3 * 4); + om |= S[64 + ((cm >> (4 * 4)) & 0xf)] << (4 * 4); + om |= S[80 + ((cm >> (5 * 4)) & 0xf)] << (5 * 4); + om |= S[96 + ((cm >> (6 * 4)) & 0xf)] << (6 * 4); + om |= S[112 + ((cm >> (7 * 4)) & 0xf)] << (7 * 4); + cm = (om << 11) | (om >>> (32 - 11)); cm ^= m[1]; m[1] = m[0]; m[0] = cm; - } // /** @@ -474,14 +488,13 @@ function round(S, m, k) // * @param d {Int32Array} 8x8 bits cipher block * @param ofs {number} offset */ -function process89(k, d, ofs) // -{ +function process89(k, d, ofs) { + // ofs = ofs || d.byteOffset; var s = this.sBox, - m = new Int32Array(d.buffer, ofs, 2); + m = new Int32Array(d.buffer, ofs, 2); - for (var i = 0; i < 32; i++) - round(s, m, k[i]); + for (var i = 0; i < 32; i++) round(s, m, k[i]); var r = m[0]; m[0] = m[1]; @@ -499,17 +512,16 @@ function process89(k, d, ofs) // * @param d {Int32Array} 8x8 bits cipher block * @param ofs {number} offset */ -function process15(k, d, ofs) // -{ +function process15(k, d, ofs) { + // ofs = ofs || d.byteOffset; var s = this.sBox, - m = new Int32Array(d.buffer, ofs, 2), - r = swap32(m[0]); + m = new Int32Array(d.buffer, ofs, 2), + r = swap32(m[0]); m[0] = swap32(m[1]); m[1] = r; - for (var i = 0; i < 32; i++) - round(s, m, k[i]); + for (var i = 0; i < 32; i++) round(s, m, k[i]); m[0] = swap32(m[0]); m[1] = swap32(m[1]); @@ -526,30 +538,24 @@ function process15(k, d, ofs) // * @param e {boolean} true - decrypt * @returns {Int32Array} keyScheduled 32-bit key */ -function keySchedule89(k, e) // -{ +function keySchedule89(k, e) { + // var sch = new Int32Array(32), - key = new Int32Array(buffer(k)); + key = new Int32Array(buffer(k)); - for (var i = 0; i < 8; i++) - sch[i] = key[i]; + for (var i = 0; i < 8; i++) sch[i] = key[i]; if (e) { - for (var i = 0; i < 8; i++) - sch[i + 8] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 8] = sch[7 - i]; - for (var i = 0; i < 8; i++) - sch[i + 16] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 16] = sch[7 - i]; } else { - for (var i = 0; i < 8; i++) - sch[i + 8] = sch[i]; + for (var i = 0; i < 8; i++) sch[i + 8] = sch[i]; - for (var i = 0; i < 8; i++) - sch[i + 16] = sch[i]; + for (var i = 0; i < 8; i++) sch[i + 16] = sch[i]; } - for (var i = 0; i < 8; i++) - sch[i + 24] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 24] = sch[7 - i]; return sch; } // @@ -565,30 +571,24 @@ function keySchedule89(k, e) // * @param e {boolean} true - decrypt * @returns {Int32Array} keyScheduled 32-bit key */ -function keySchedule15(k, e) // -{ +function keySchedule15(k, e) { + // var sch = new Int32Array(32), - key = new Int32Array(buffer(k)); + key = new Int32Array(buffer(k)); - for (var i = 0; i < 8; i++) - sch[i] = swap32(key[i]); + for (var i = 0; i < 8; i++) sch[i] = swap32(key[i]); if (e) { - for (var i = 0; i < 8; i++) - sch[i + 8] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 8] = sch[7 - i]; - for (var i = 0; i < 8; i++) - sch[i + 16] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 16] = sch[7 - i]; } else { - for (var i = 0; i < 8; i++) - sch[i + 8] = sch[i]; + for (var i = 0; i < 8; i++) sch[i + 8] = sch[i]; - for (var i = 0; i < 8; i++) - sch[i + 16] = sch[i]; + for (var i = 0; i < 8; i++) sch[i + 16] = sch[i]; } - for (var i = 0; i < 8; i++) - sch[i + 24] = sch[7 - i]; + for (var i = 0; i < 8; i++) sch[i + 24] = sch[7 - i]; return sch; } // @@ -605,39 +605,44 @@ function keySchedule15(k, e) // * @param {Uint8Array} k * @returns {Uint16Array} */ -var keyScheduleRC2 = (function () // -{ +var keyScheduleRC2 = (function () { + // // an array of "random" bytes based on the digits of PI = 3.14159... var PITABLE = new Uint8Array([ - 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, - 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, - 0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32, - 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0x0b, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82, - 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, - 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, - 0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57, 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x03, - 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7, - 0x08, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, - 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x04, 0x18, 0xa4, 0xec, - 0xc2, 0xe0, 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, - 0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, - 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x05, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9, - 0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, 0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9, - 0x0d, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, - 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0x0a, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad + 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, + 0x4a, 0xa0, 0xd8, 0x9d, 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, + 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, 0x17, 0x9a, 0x59, 0xf5, + 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32, + 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0x0b, 0xf0, 0x95, 0x21, 0x22, + 0x5c, 0x6b, 0x4e, 0x82, 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, + 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, 0x12, 0x75, 0xca, 0x1f, + 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, + 0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57, 0x27, 0xf2, 0x1d, 0x9b, + 0xbc, 0x94, 0x43, 0x03, 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, + 0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7, 0x08, 0xe8, 0xea, 0xde, + 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, + 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, + 0x04, 0x18, 0xa4, 0xec, 0xc2, 0xe0, 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc, + 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, 0x99, 0x7c, 0x3a, 0x85, + 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, + 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x05, 0xdf, 0x29, 0x10, + 0x67, 0x6c, 0xba, 0xc9, 0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, + 0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9, 0x0d, 0x38, 0x34, 0x1b, + 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, + 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0x0a, 0xa6, 0x20, 0x68, + 0xfe, 0x7f, 0xc1, 0xad, ]); - return function (k) - { + return function (k) { var key = new Uint8Array(buffer(k)), - T = Math.min(key.length, 128), - T1 = this.effectiveLength, - T8 = Math.floor((T1 + 7) / 8), - TM = 0xff % Math.pow(2, 8 + T1 - 8 * T8); + T = Math.min(key.length, 128), + T1 = this.effectiveLength, + T8 = Math.floor((T1 + 7) / 8), + TM = 0xff % Math.pow(2, 8 + T1 - 8 * T8); - var L = new Uint8Array(128), K = new Uint16Array(L.buffer); - for (var i = 0; i < T; i++) - L[i] = key[i]; + var L = new Uint8Array(128), + K = new Uint16Array(L.buffer); + for (var i = 0; i < T; i++) L[i] = key[i]; for (var i = T; i < 128; i++) L[i] = PITABLE[(L[i - 1] + L[i - T]) % 256]; L[128 - T8] = PITABLE[L[128 - T8] & TM]; @@ -645,8 +650,7 @@ var keyScheduleRC2 = (function () // L[i] = PITABLE[L[i + 1] ^ L[i + T8]]; return K; }; -} // -)(); +})(); // /** * RC2 encrypt/decrypt process @@ -662,26 +666,37 @@ var keyScheduleRC2 = (function () // * @param {number} ofs Offsec * @param {number} e true - decrypt */ -var processRC2 = (function () // -{ - var K, j, R = new Uint16Array(4), - s = new Uint16Array([1, 2, 3, 5]), reverse; +var processRC2 = (function () { + // + var K, + j, + R = new Uint16Array(4), + s = new Uint16Array([1, 2, 3, 5]), + reverse; function rol(R, s) { - return (R << s | R >>> (16 - s)) & 0xffff; + return ((R << s) | (R >>> (16 - s))) & 0xffff; } function ror(R, s) { - return (R >>> s | R << (16 - s)) & 0xffff; + return ((R >>> s) | (R << (16 - s))) & 0xffff; } function mix(i) { if (reverse) { R[i] = ror(R[i], s[i]); - R[i] = R[i] - K[j] - (R[(i + 3) % 4] & R[(i + 2) % 4]) - ((~R[(i + 3) % 4]) & R[(i + 1) % 4]); + R[i] = + R[i] - + K[j] - + (R[(i + 3) % 4] & R[(i + 2) % 4]) - + (~R[(i + 3) % 4] & R[(i + 1) % 4]); j = j - 1; } else { - R[i] = R[i] + K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) + ((~R[(i + 3) % 4]) & R[(i + 1) % 4]); + R[i] = + R[i] + + K[j] + + (R[(i + 3) % 4] & R[(i + 2) % 4]) + + (~R[(i + 3) % 4] & R[(i + 1) % 4]); j = j + 1; R[i] = rol(R[i], s[i]); } @@ -699,11 +714,9 @@ var processRC2 = (function () // count = count || 1; for (var j = 0; j < count; j++) { if (reverse) { - for (var i = 3; i >= 0; --i) - method(i); + for (var i = 3; i >= 0; --i) method(i); } else { - for (var i = 0; i < 4; i++) - method(i); + for (var i = 0; i < 4; i++) method(i); } } } @@ -729,8 +742,7 @@ var processRC2 = (function () // // 8. Perform five mixing rounds. perform(mix, 5); }; -} // -)(); +})(); // /** * Algorithm name GOST 28147-ECB

    @@ -744,15 +756,14 @@ var processRC2 = (function () // * @param d {CryptoOperationData} 8 bits message * @return {CryptoOperationData} result */ -function encryptECB(k, d) // -{ +function encryptECB(k, d) { + // var p = this.pad(byteArray(d)), - n = this.blockSize, - b = p.byteLength / n, - key = this.keySchedule(k); + n = this.blockSize, + b = p.byteLength / n, + key = this.keySchedule(k); - for (var i = 0; i < b; i++) - this.process(key, p, n * i); + for (var i = 0; i < b; i++) this.process(key, p, n * i); return p.buffer; } // @@ -770,15 +781,14 @@ function encryptECB(k, d) // * @param d {CryptoOperationData} 8 bits message * @return {CryptoOperationData} result */ -function decryptECB(k, d) // -{ +function decryptECB(k, d) { + // var p = cloneArray(d), - n = this.blockSize, - b = p.byteLength / n, - key = this.keySchedule(k, 1); + n = this.blockSize, + b = p.byteLength / n, + key = this.keySchedule(k, 1); - for (var i = 0; i < b; i++) - this.process(key, p, n * i, 1); + for (var i = 0; i < b; i++) this.process(key, p, n * i, 1); return this.unpad(p).buffer; } // @@ -798,31 +808,28 @@ function decryptECB(k, d) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function encryptCFB(k, d, iv) // -{ +function encryptCFB(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - c = cloneArray(d), - m = s.length, - t = new Uint8Array(m), - b = this.shiftBits >> 3, - cb = c.length, r = cb % b, q = (cb - r) / b, - key = this.keySchedule(k); + c = cloneArray(d), + m = s.length, + t = new Uint8Array(m), + b = this.shiftBits >> 3, + cb = c.length, + r = cb % b, + q = (cb - r) / b, + key = this.keySchedule(k); for (var i = 0; i < q; i++) { - - for (var j = 0; j < m; j++) - t[j] = s[j]; + for (var j = 0; j < m; j++) t[j] = s[j]; this.process(key, s); - for (var j = 0; j < b; j++) - c[i * b + j] ^= s[j]; + for (var j = 0; j < b; j++) c[i * b + j] ^= s[j]; - for (var j = 0; j < m - b; j++) - s[j] = t[b + j]; + for (var j = 0; j < m - b; j++) s[j] = t[b + j]; - for (var j = 0; j < b; j++) - s[m - b + j] = c[i * b + j]; + for (var j = 0; j < b; j++) s[m - b + j] = c[i * b + j]; k = this.keyMeshing(k, s, i, key); } @@ -830,8 +837,7 @@ function encryptCFB(k, d, iv) // if (r > 0) { this.process(key, s); - for (var i = 0; i < r; i++) - c[q * b + i] ^= s[i]; + for (var i = 0; i < r; i++) c[q * b + i] ^= s[i]; } return c.buffer; } // @@ -851,20 +857,20 @@ function encryptCFB(k, d, iv) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function decryptCFB(k, d, iv) // -{ +function decryptCFB(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - c = cloneArray(d), - m = s.length, - t = new Uint8Array(m), - b = this.shiftBits >> 3, - cb = c.length, r = cb % b, q = (cb - r) / b, - key = this.keySchedule(k); + c = cloneArray(d), + m = s.length, + t = new Uint8Array(m), + b = this.shiftBits >> 3, + cb = c.length, + r = cb % b, + q = (cb - r) / b, + key = this.keySchedule(k); for (var i = 0; i < q; i++) { - - for (var j = 0; j < m; j++) - t[j] = s[j]; + for (var j = 0; j < m; j++) t[j] = s[j]; this.process(key, s); @@ -873,11 +879,9 @@ function decryptCFB(k, d, iv) // c[i * b + j] ^= s[j]; } - for (var j = 0; j < m - b; j++) - s[j] = t[b + j]; + for (var j = 0; j < m - b; j++) s[j] = t[b + j]; - for (var j = 0; j < b; j++) - s[m - b + j] = t[j]; + for (var j = 0; j < b; j++) s[m - b + j] = t[j]; k = this.keyMeshing(k, s, i, key); } @@ -885,8 +889,7 @@ function decryptCFB(k, d, iv) // if (r > 0) { this.process(key, s); - for (var i = 0; i < r; i++) - c[q * b + i] ^= s[i]; + for (var i = 0; i < r; i++) c[q * b + i] ^= s[i]; } return c.buffer; } // @@ -921,35 +924,31 @@ function decryptCFB(k, d, iv) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function processOFB(k, d, iv) // -{ +function processOFB(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - c = cloneArray(d), - m = s.length, - t = new Uint8Array(m), - b = this.shiftBits >> 3, - p = new Uint8Array(b), - cb = c.length, r = cb % b, q = (cb - r) / b, - key = this.keySchedule(k); + c = cloneArray(d), + m = s.length, + t = new Uint8Array(m), + b = this.shiftBits >> 3, + p = new Uint8Array(b), + cb = c.length, + r = cb % b, + q = (cb - r) / b, + key = this.keySchedule(k); for (var i = 0; i < q; i++) { - - for (var j = 0; j < m; j++) - t[j] = s[j]; + for (var j = 0; j < m; j++) t[j] = s[j]; this.process(key, s); - for (var j = 0; j < b; j++) - p[j] = s[j]; + for (var j = 0; j < b; j++) p[j] = s[j]; - for (var j = 0; j < b; j++) - c[i * b + j] ^= s[j]; + for (var j = 0; j < b; j++) c[i * b + j] ^= s[j]; - for (var j = 0; j < m - b; j++) - s[j] = t[b + j]; + for (var j = 0; j < m - b; j++) s[j] = t[b + j]; - for (var j = 0; j < b; j++) - s[m - b + j] = p[j]; + for (var j = 0; j < b; j++) s[m - b + j] = p[j]; k = this.keyMeshing(k, s, i, key); } @@ -957,8 +956,7 @@ function processOFB(k, d, iv) // if (r > 0) { this.process(key, s); - for (var i = 0; i < r; i++) - c[q * b + i] ^= s[i]; + for (var i = 0; i < r; i++) c[q * b + i] ^= s[i]; } return c.buffer; } // @@ -991,15 +989,17 @@ function processOFB(k, d, iv) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function processCTR89(k, d, iv) // -{ +function processCTR89(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - c = cloneArray(d), - b = this.blockSize, - t = new Int8Array(b), - cb = c.length, r = cb % b, q = (cb - r) / b, - key = this.keySchedule(k), - syn = new Int32Array(s.buffer); + c = cloneArray(d), + b = this.blockSize, + t = new Int8Array(b), + cb = c.length, + r = cb % b, + q = (cb - r) / b, + key = this.keySchedule(k), + syn = new Int32Array(s.buffer); this.process(key, s); @@ -1009,16 +1009,13 @@ function processCTR89(k, d, iv) // var tmp = unsigned(syn[1]) + 0x1010104; // Special thanks to Ilya Matveychikov syn[1] = signed(tmp < 0x100000000 ? tmp : tmp - 0xffffffff); - for (var j = 0; j < b; j++) - t[j] = s[j]; + for (var j = 0; j < b; j++) t[j] = s[j]; this.process(key, syn); - for (var j = 0; j < b; j++) - c[i * b + j] ^= s[j]; + for (var j = 0; j < b; j++) c[i * b + j] ^= s[j]; - for (var j = 0; j < b; j++) - s[j] = t[j]; + for (var j = 0; j < b; j++) s[j] = t[j]; k = this.keyMeshing(k, s, i, key); } @@ -1030,35 +1027,32 @@ function processCTR89(k, d, iv) // this.process(key, syn); - for (var i = 0; i < r; i++) - c[q * b + i] ^= s[i]; + for (var i = 0; i < r; i++) c[q * b + i] ^= s[i]; } return c.buffer; } // -function processCTR15(k, d, iv) // -{ +function processCTR15(k, d, iv) { + // var c = cloneArray(d), - n = this.blockSize, - b = this.shiftBits >> 3, - cb = c.length, r = cb % b, q = (cb - r) / b, - s = new Uint8Array(n), - t = new Int32Array(n), - key = this.keySchedule(k); + n = this.blockSize, + b = this.shiftBits >> 3, + cb = c.length, + r = cb % b, + q = (cb - r) / b, + s = new Uint8Array(n), + t = new Int32Array(n), + key = this.keySchedule(k); s.set(iv || this.iv); for (var i = 0; i < q; i++) { - - for (var j = 0; j < n; j++) - t[j] = s[j]; + for (var j = 0; j < n; j++) t[j] = s[j]; this.process(key, s); - for (var j = 0; j < b; j++) - c[b * i + j] ^= s[j]; + for (var j = 0; j < b; j++) c[b * i + j] ^= s[j]; - for (var j = 0; j < n; j++) - s[j] = t[j]; + for (var j = 0; j < n; j++) s[j] = t[j]; for (var j = n - 1; i >= 0; --i) { if (s[j] > 0xfe) { @@ -1072,8 +1066,7 @@ function processCTR15(k, d, iv) // if (r > 0) { this.process(key, s); - for (var j = 0; j < r; j++) - c[b * q + j] ^= s[j]; + for (var j = 0; j < r; j++) c[b * q + j] ^= s[j]; } return c.buffer; @@ -1094,30 +1087,25 @@ function processCTR15(k, d, iv) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function encryptCBC(k, d, iv) // -{ +function encryptCBC(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - n = this.blockSize, - m = s.length, - c = this.pad(byteArray(d)), - key = this.keySchedule(k); + n = this.blockSize, + m = s.length, + c = this.pad(byteArray(d)), + key = this.keySchedule(k); for (var i = 0, b = c.length / n; i < b; i++) { - - for (var j = 0; j < n; j++) - s[j] ^= c[i * n + j]; + for (var j = 0; j < n; j++) s[j] ^= c[i * n + j]; this.process(key, s); - for (var j = 0; j < n; j++) - c[i * n + j] = s[j]; + for (var j = 0; j < n; j++) c[i * n + j] = s[j]; if (m !== n) { - for (var j = 0; j < m - n; j++) - s[j] = s[n + j]; + for (var j = 0; j < m - n; j++) s[j] = s[n + j]; - for (var j = 0; j < n; j++) - s[j + m - n] = c[i * n + j]; + for (var j = 0; j < n; j++) s[j + m - n] = c[i * n + j]; } k = this.keyMeshing(k, s, i, key); @@ -1141,32 +1129,27 @@ function encryptCBC(k, d, iv) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function decryptCBC(k, d, iv) // -{ +function decryptCBC(k, d, iv) { + // var s = new Uint8Array(iv || this.iv), - n = this.blockSize, - m = s.length, - c = cloneArray(d), - next = new Uint8Array(n), - key = this.keySchedule(k, 1); + n = this.blockSize, + m = s.length, + c = cloneArray(d), + next = new Uint8Array(n), + key = this.keySchedule(k, 1); for (var i = 0, b = c.length / n; i < b; i++) { - - for (var j = 0; j < n; j++) - next[j] = c[i * n + j]; + for (var j = 0; j < n; j++) next[j] = c[i * n + j]; this.process(key, c, i * n, 1); - for (var j = 0; j < n; j++) - c[i * n + j] ^= s[j]; + for (var j = 0; j < n; j++) c[i * n + j] ^= s[j]; if (m !== n) { - for (var j = 0; j < m - n; j++) - s[j] = s[n + j]; + for (var j = 0; j < m - n; j++) s[j] = s[n + j]; } - for (var j = 0; j < n; j++) - s[j + m - n] = next[j]; + for (var j = 0; j < n; j++) s[j + m - n] = next[j]; k = this.keyMeshing(k, s, i, key, 1); } @@ -1183,15 +1166,14 @@ function decryptCBC(k, d, iv) // * @return {CryptoOperationData} result */ -function generateKey() // -{ +function generateKey() { + // // Simple generate 256 bit random seed var k = new Uint8Array(this.keySize); randomSeed(k); return k.buffer; } // - /** * makeIMIT (K, D) is the 32-bit result of the GOST 28147/GOST R 34.13 in * "imitovstavka" (MAC) mode, used with D as plaintext, K as key and IV @@ -1207,45 +1189,47 @@ function generateKey() // * @param {Uint8Array} d 8 bits array with data * @return {Uint8Array} result */ -function processMAC89(key, s, d) // -{ +function processMAC89(key, s, d) { + // var c = zeroPad.call(this, byteArray(d)), - n = this.blockSize, - q = c.length / n, - sBox = this.sBox, - sum = new Int32Array(s.buffer); + n = this.blockSize, + q = c.length / n, + sBox = this.sBox, + sum = new Int32Array(s.buffer); for (var i = 0; i < q; i++) { + for (var j = 0; j < n; j++) s[j] ^= c[i * n + j]; - for (var j = 0; j < n; j++) - s[j] ^= c[i * n + j]; - - for (var j = 0; j < 16; j++) // 1-16 steps + for ( + var j = 0; + j < 16; + j++ // 1-16 steps + ) round(sBox, sum, key[j]); } } // -function processKeyMAC15(s) // -{ - var t = 0, n = s.length; +function processKeyMAC15(s) { + // + var t = 0, + n = s.length; for (var i = n - 1; i >= 0; --i) { var t1 = s[i] >>> 7; - s[i] = (s[i] << 1) & 0xff | t; + s[i] = ((s[i] << 1) & 0xff) | t; t = t1; } if (t !== 0) { - if (n === 16) - s[15] ^= 0x87; - else - s[7] ^= 0x1b; + if (n === 16) s[15] ^= 0x87; + else s[7] ^= 0x1b; } } // -function processMAC15(key, s, d) // -{ +function processMAC15(key, s, d) { + // var n = this.blockSize, - sBox = this.sBox, c = byteArray(d), - r = new Uint8Array(n); + sBox = this.sBox, + c = byteArray(d), + r = new Uint8Array(n); // R this.process(key, r); // K1 @@ -1257,13 +1241,11 @@ function processMAC15(key, s, d) // } for (var i = 0, q = c.length / n; i < q; i++) { + for (var j = 0; j < n; j++) s[j] ^= c[i * n + j]; - for (var j = 0; j < n; j++) - s[j] ^= c[i * n + j]; - - if (i === q - 1) {// Last block - for (var j = 0; j < n; j++) - s[j] ^= r[j]; + if (i === q - 1) { + // Last block + for (var j = 0; j < n; j++) s[j] ^= r[j]; } this.process(key, s); @@ -1284,11 +1266,11 @@ function processMAC15(key, s, d) // * @param {CryptoOperationData} iv initial vector * @return {CryptoOperationData} result */ -function signMAC(k, d, iv) // -{ +function signMAC(k, d, iv) { + // var key = this.keySchedule(k), - s = new Uint8Array(iv || this.iv), - m = Math.ceil(this.macLength >> 3) || this.blockSize >> 1; + s = new Uint8Array(iv || this.iv), + m = Math.ceil(this.macLength >> 3) || this.blockSize >> 1; this.processMAC(key, s, d); @@ -1312,15 +1294,13 @@ function signMAC(k, d, iv) // * @param {CryptoOperationData} iv 8x8 optional bits initial vector * @return {boolen} MAC verified = true */ -function verifyMAC(k, m, d, iv) // -{ +function verifyMAC(k, m, d, iv) { + // var mac = new Uint8Array(signMAC.call(this, k, d, iv)), - test = byteArray(m); - if (mac.length !== test.length) - return false; + test = byteArray(m); + if (mac.length !== test.length) return false; for (var i = 0, n = mac.length; i < n; i++) - if (mac[i] !== test[i]) - return false; + if (mac[i] !== test[i]) return false; return true; } // @@ -1341,14 +1321,15 @@ function verifyMAC(k, m, d, iv) // * @param {CryptoOperationData} cek Content encryption key * @returns {CryptoOperationData} Encrypted cek */ -function wrapKeyGOST(kek, cek) // -{ - var n = this.blockSize, k = this.keySize, len = k + (n >> 1); +function wrapKeyGOST(kek, cek) { + // + var n = this.blockSize, + k = this.keySize, + len = k + (n >> 1); // 1) For a unique symmetric KEK, generate 8 octets at random and call // the result UKM. For a KEK, produced by VKO GOST R 34.10-2001, use // the UKM that was used for key derivation. - if (!this.ukm) - throw new DataError('UKM must be defined'); + if (!this.ukm) throw new DataError("UKM must be defined"); var ukm = new Uint8Array(this.ukm); // 2) Compute a 4-byte checksum value, GOST 28147IMIT (UKM, KEK, CEK). // Call the result CEK_MAC. @@ -1375,28 +1356,28 @@ function wrapKeyGOST(kek, cek) // * @param {type} data Content encryption key * @return {CryptoOperationData} result */ -function unwrapKeyGOST(kek, data) // -{ - var n = this.blockSize, k = this.keySize, len = k + (n >> 1); +function unwrapKeyGOST(kek, data) { + // + var n = this.blockSize, + k = this.keySize, + len = k + (n >> 1); // 1) If the wrapped content-encryption key is not 44 octets, then error. var d = buffer(data); if (d.byteLength !== len) - throw new DataError('Wrapping key size must be ' + len + ' bytes'); + throw new DataError("Wrapping key size must be " + len + " bytes"); // 2) Decompose the wrapped content-encryption key into UKM, CEK_ENC, and CEK_MAC. // UKM is the most significant (first) 8 octets. CEK_ENC is next 32 octets, // and CEK_MAC is the least significant (last) 4 octets. - if (!this.ukm) - throw new DataError('UKM must be defined'); + if (!this.ukm) throw new DataError("UKM must be defined"); var ukm = new Uint8Array(this.ukm), - enc = new Uint8Array(d, 0, k), - mac = new Uint8Array(d, k, n >> 1); + enc = new Uint8Array(d, 0, k), + mac = new Uint8Array(d, k, n >> 1); // 3) Decrypt CEK_ENC in ECB mode using the KEK. Call the output CEK. var cek = decryptECB.call(this, kek, enc); // 4) Compute a 4-byte checksum value, GOST 28147IMIT (UKM, KEK, CEK), // compare the result with CEK_MAC. If they are not equal, then error. var check = verifyMAC.call(this, kek, mac, cek, ukm); - if (!check) - throw new DataError('Error verify MAC of wrapping key'); + if (!check) throw new DataError("Error verify MAC of wrapping key"); return cek; } // @@ -1415,8 +1396,8 @@ function unwrapKeyGOST(kek, data) // * @param {CryptoOperationData} ukm Random generated value * @returns {CryptoOperationData} Diversified kek */ -function diversifyKEK(kek, ukm) // -{ +function diversifyKEK(kek, ukm) { + // var n = this.blockSize; // 1) Let K[0] = K; @@ -1441,10 +1422,8 @@ function diversifyKEK(kek, ukm) // // (((~a[i,0])*k[i,0] + ... + (~a[i,7])*k[i,7]) mod 2^32); var s = new Int32Array(2); for (var j = 0; j < 8; j++) { - if (a[i][j]) - s[0] = (s[0] + k[j]) & 0xffffffff; - else - s[1] = (s[1] + k[j]) & 0xffffffff; + if (a[i][j]) s[0] = (s[0] + k[j]) & 0xffffffff; + else s[1] = (s[1] + k[j]) & 0xffffffff; } // C) K[i+1] = encryptCFB (S[i], K[i], K[i]) var iv = new Uint8Array(s.buffer); @@ -1470,15 +1449,16 @@ function diversifyKEK(kek, ukm) // * @param {CryptoOperationData} cek Content encryption key * @returns {CryptoOperationData} Encrypted cek */ -function wrapKeyCP(kek, cek) // -{ - var n = this.blockSize, k = this.keySize, len = k + (n >> 1); +function wrapKeyCP(kek, cek) { + // + var n = this.blockSize, + k = this.keySize, + len = k + (n >> 1); // 1) For a unique symmetric KEK or a KEK produced by VKO GOST R // 34.10-94, generate 8 octets at random. Call the result UKM. For // a KEK, produced by VKO GOST R 34.10-2001, use the UKM that was // used for key derivation. - if (!this.ukm) - throw new DataError('UKM must be defined'); + if (!this.ukm) throw new DataError("UKM must be defined"); var ukm = new Uint8Array(this.ukm); // 2) Diversify KEK, using the CryptoPro KEK Diversification Algorithm, // described in Section 6.5. Call the result KEK(UKM). @@ -1509,22 +1489,23 @@ function wrapKeyCP(kek, cek) // * @param {CryptoOperationData} data Encrypted content encryption keu * @return {CryptoOperationData} result Decrypted content encryption keu */ -function unwrapKeyCP(kek, data) // -{ - var n = this.blockSize, k = this.keySize, len = k + (n >> 1); +function unwrapKeyCP(kek, data) { + // + var n = this.blockSize, + k = this.keySize, + len = k + (n >> 1); // 1) If the wrapped content-encryption key is not 44 octets, then error. var d = buffer(data); if (d.byteLength !== len) - throw new DataError('Wrapping key size must be ' + len + ' bytes'); + throw new DataError("Wrapping key size must be " + len + " bytes"); // 2) Decompose the wrapped content-encryption key into UKM, CEK_ENC, // and CEK_MAC. UKM is the most significant (first) 8 octets. // CEK_ENC is next 32 octets, and CEK_MAC is the least significant // (last) 4 octets. - if (!this.ukm) - throw new DataError('UKM must be defined'); + if (!this.ukm) throw new DataError("UKM must be defined"); var ukm = new Uint8Array(this.ukm), - enc = new Uint8Array(d, 0, k), - mac = new Uint8Array(d, k, n >> 1); + enc = new Uint8Array(d, 0, k), + mac = new Uint8Array(d, k, n >> 1); // 3) Diversify KEK using the CryptoPro KEK Diversification Algorithm, // described in section 6.5. Call the result KEK(UKM). var dek = diversifyKEK.call(this, kek, ukm); @@ -1534,8 +1515,7 @@ function unwrapKeyCP(kek, data) // // CEK), compare the result with CEK_MAC. If they are not equal, // then it is an error. var check = verifyMAC.call(this, dek, mac, cek, ukm); - if (!check) - throw new DataError('Error verify MAC of wrapping key'); + if (!check) throw new DataError("Error verify MAC of wrapping key"); return cek; } // @@ -1566,13 +1546,16 @@ function unwrapKeyCP(kek, data) // * @param {CryptoOperationData} ukm - random vector for packing - 32 bytes * (count of masks - 1) * @returns {CryptoOperationData} packed master key - concatination of mk.db3 + masks.db3 */ -function packKeySC(unpacked, ukm) // -{ - var m = this.blockSize >> 1, k = this.keySize; +function packKeySC(unpacked, ukm) { + // + var m = this.blockSize >> 1, + k = this.keySize; var mcount = 8; var key = new Uint8Array(buffer(unpacked)); if (key.byteLength !== k) - throw new DataError('Wrong cleartext size ' + key.byteLength + ' bytes'); + throw new DataError( + "Wrong cleartext size " + key.byteLength + " bytes", + ); // Check or generate UKM ukm = ukm || this.ukm; if (ukm) { @@ -1580,11 +1563,11 @@ function packKeySC(unpacked, ukm) // if (ukm.byteLength > 0 && ukm.byteLength % k === 0) mcount = ukm.byteLength / k + 1; else - throw new DataError('Wrong rand size ' + ukm.byteLength + ' bytes'); - } else - randomSeed(ukm = new Uint8Array((mcount - 1) * k)); + throw new DataError("Wrong rand size " + ukm.byteLength + " bytes"); + } else randomSeed((ukm = new Uint8Array((mcount - 1) * k))); // Output array - var d = new Uint8Array(mcount * k + m + 2), b = d.buffer; + var d = new Uint8Array(mcount * k + m + 2), + b = d.buffer; // Calculate MAC var zero32 = new Uint8Array(k); var mac = signMAC.call(this, key, zero32); @@ -1594,8 +1577,7 @@ function packKeySC(unpacked, ukm) // d.set(ukm, k + m + 2); for (var i = 1; i < mcount; i++) { var mask = new Uint8Array(b, 2 + m + k * i); - for (var j = 0; j < k; j++) - key[j] ^= mask[j]; + for (var j = 0; j < k; j++) key[j] ^= mask[j]; } d.set(key, m + 2); return d.buffer; @@ -1613,38 +1595,35 @@ function packKeySC(unpacked, ukm) // * @param {CryptoOperationData} packed - concatination of mk.db3 + masks.db3 * @returns {CryptoOperationData} unpacked master key */ -function unpackKeySC(packed) // -{ - var m = this.blockSize >> 1, k = this.keySize; +function unpackKeySC(packed) { + // + var m = this.blockSize >> 1, + k = this.keySize; var b = buffer(packed); // Unpack master key var magic = new Uint8Array(b, 0, 1)[0]; - if (magic !== 0x22) - throw new DataError('Invalid magic number'); + if (magic !== 0x22) throw new DataError("Invalid magic number"); var mcount = new Uint8Array(b, 1, 1)[0]; var mac = new Uint8Array(b, 2, m); // MAC for summarized mask // Compute packKey xor summing for all masks var key = new Uint8Array(k); for (var i = 0; i < mcount; i++) { var mask = new Uint8Array(b, 2 + m + k * i, k); - for (var j = 0; j < k; j++) - key[j] ^= mask[j]; + for (var j = 0; j < k; j++) key[j] ^= mask[j]; } // Test MAC for packKey with default sBox on zero 32 bytes array var zero32 = new Uint8Array(k); var test = verifyMAC.call(this, key, mac, zero32); if (!test) { // Try to use different sBoxes - var names = ['E-A', 'E-B', 'E-C', 'E-D', 'E-SC']; + var names = ["E-A", "E-B", "E-C", "E-D", "E-SC"]; for (var i = 0, n = names.length; i < n; i++) { this.sBox = sBoxes[names[i]]; test = verifyMAC.call(this, key, mac, zero32); - if (test) - break; + if (test) break; } } - if (!test) - throw new DataError('Invalid main key MAC'); + if (!test) throw new DataError("Invalid main key MAC"); return key.buffer; } // @@ -1660,13 +1639,13 @@ function unpackKeySC(packed) // * @param {CryptoOperationData} cek - key for wrapping * @returns {CryptoOperationData} wrapped key - file kek.opq */ -function wrapKeySC(kek, cek) // -{ - var m = this.blockSize >> 1, n = this.keySize; +function wrapKeySC(kek, cek) { + // + var m = this.blockSize >> 1, + n = this.keySize; var k = buffer(kek); var c = buffer(cek); - if (k.byteLength !== n) - k = unpackKeySC.call(this, k); + if (k.byteLength !== n) k = unpackKeySC.call(this, k); var enc = encryptECB.call(this, k, c); var mac = signMAC.call(this, k, c); var d = new Uint8Array(m + n); @@ -1687,18 +1666,18 @@ function wrapKeySC(kek, cek) // * @param {CryptoOperationData} cek - wrapping key - file kek.opq * @return {CryptoOperationData} result */ -function unwrapKeySC(kek, cek) // -{ - var m = this.blockSize >> 1, n = this.keySize; +function unwrapKeySC(kek, cek) { + // + var m = this.blockSize >> 1, + n = this.keySize; var k = buffer(kek); var c = buffer(cek); - if (k.byteLength !== n) - k = unpackKeySC.call(this, k); + if (k.byteLength !== n) k = unpackKeySC.call(this, k); var enc = new Uint8Array(c, 0, n); // Encrypted kek var mac = new Uint8Array(c, n, m); // MAC for clear kek var d = decryptECB.call(this, k, enc); if (!verifyMAC.call(this, k, mac, d)) - throw new DataError('Invalid key MAC'); + throw new DataError("Invalid key MAC"); return d; } // @@ -1712,23 +1691,20 @@ function unwrapKeySC(kek, cek) // * @instance * @return {CryptoOperationData} result */ -function generateWrappingKeySC() // -{ +function generateWrappingKeySC() { + // return packKeySC.call(this, generateKey.call(this)); } // -function maskKey(mask, key, inverse, keySize) // -{ +function maskKey(mask, key, inverse, keySize) { + // var k = keySize / 4, - m32 = new Int32Array(buffer(mask)), - k32 = new Int32Array(buffer(key)), - r32 = new Int32Array(k); + m32 = new Int32Array(buffer(mask)), + k32 = new Int32Array(buffer(key)), + r32 = new Int32Array(k); if (inverse) - for (var i = 0; i < k; i++) - r32[i] = (k32[i] + m32[i]) & 0xffffffff; - else - for (var i = 0; i < k; i++) - r32[i] = (k32[i] - m32[i]) & 0xffffffff; + for (var i = 0; i < k; i++) r32[i] = (k32[i] + m32[i]) & 0xffffffff; + else for (var i = 0; i < k; i++) r32[i] = (k32[i] - m32[i]) & 0xffffffff; return r32.buffer; } // @@ -1744,9 +1720,9 @@ function maskKey(mask, key, inverse, keySize) // -{ - return maskKey(mask, key, this.procreator === 'VN', this.keySize); +function wrapKeyMask(mask, key) { + // + return maskKey(mask, key, this.procreator === "VN", this.keySize); } // /** @@ -1761,9 +1737,9 @@ function wrapKeyMask(mask, key) // * @param {CryptoOperationData} key The masked key * @return {CryptoOperationData} result The key */ -function unwrapKeyMask(mask, key) // -{ - return maskKey(mask, key, this.procreator !== 'VN', this.keySize); +function unwrapKeyMask(mask, key) { + // + return maskKey(mask, key, this.procreator !== "VN", this.keySize); } // /** @@ -1782,9 +1758,10 @@ function unwrapKeyMask(mask, key) // * @param {boolean} e true - decrypt * @returns CryptoOperationData next 8x8 bit key */ -function keyMeshingCP(k, s, i, key, e) // -{ - if ((i + 1) * this.blockSize % 1024 === 0) { // every 1024 octets +function keyMeshingCP(k, s, i, key, e) { + // + if (((i + 1) * this.blockSize) % 1024 === 0) { + // every 1024 octets // K[i+1] = decryptECB (K[i], C); k = decryptECB.call(this, k, C); // IV0[i+1] = encryptECB (K[i+1],IVn[i]) @@ -1804,8 +1781,8 @@ function keyMeshingCP(k, s, i, key, e) // * @private * @param {(Uint8Array|CryptoOperationData)} k 8x8 bit key */ -function noKeyMeshing(k) // -{ +function noKeyMeshing(k) { + // return k; } // @@ -1821,8 +1798,8 @@ function noKeyMeshing(k) // * @param {Uint8Array} d array with source data * @returns {Uint8Array} result */ -function noPad(d) // -{ +function noPad(d) { + // return new Uint8Array(d); } // @@ -1840,34 +1817,30 @@ function noPad(d) // * @param {Uint8Array} d array with source data * @returns {Uint8Array} result */ -function pkcs5Pad(d) // -{ +function pkcs5Pad(d) { + // var n = d.byteLength, - nb = this.blockSize, - q = nb - n % nb, - m = Math.ceil((n + 1) / nb) * nb, - r = new Uint8Array(m); + nb = this.blockSize, + q = nb - (n % nb), + m = Math.ceil((n + 1) / nb) * nb, + r = new Uint8Array(m); r.set(d); - for (var i = n; i < m; i++) - r[i] = q; + for (var i = n; i < m; i++) r[i] = q; return r; } // -function pkcs5Unpad(d) // -{ +function pkcs5Unpad(d) { + // var m = d.byteLength, - nb = this.blockSize, - q = d[m - 1], - n = m - q; - if (q > nb) - throw DataError('Invalid padding'); + nb = this.blockSize, + q = d[m - 1], + n = m - q; + if (q > nb) throw DataError("Invalid padding"); var r = new Uint8Array(n); - if (n > 0) - r.set(new Uint8Array(d.buffer, 0, n)); + if (n > 0) r.set(new Uint8Array(d.buffer, 0, n)); return r; } // - /** * Algorithm name GOST 28147-ZeroPadding

    * @@ -1880,19 +1853,17 @@ function pkcs5Unpad(d) // * @param {Uint8Array} d array with source data * @returns {Uint8Array} result */ -function zeroPad(d) // -{ +function zeroPad(d) { + // var n = d.byteLength, - nb = this.blockSize, - m = Math.ceil(n / nb) * nb, - r = new Uint8Array(m); + nb = this.blockSize, + m = Math.ceil(n / nb) * nb, + r = new Uint8Array(m); r.set(d); - for (var i = n; i < m; i++) - r[i] = 0; + for (var i = n; i < m; i++) r[i] = 0; return r; } // - /** * Algorithm name GOST 28147-BitPadding

    * @@ -1906,31 +1877,27 @@ function zeroPad(d) // * @param {Uint8Array} d array with source data * @returns {Uint8Array} result */ -function bitPad(d) // -{ +function bitPad(d) { + // var n = d.byteLength, - nb = this.blockSize, - m = Math.ceil((n + 1) / nb) * nb, - r = new Uint8Array(m); + nb = this.blockSize, + m = Math.ceil((n + 1) / nb) * nb, + r = new Uint8Array(m); r.set(d); r[n] = 1; - for (var i = n + 1; i < m; i++) - r[i] = 0; + for (var i = n + 1; i < m; i++) r[i] = 0; return r; } // -function bitUnpad(d) // -{ +function bitUnpad(d) { + // var m = d.byteLength, - n = m; - while (n > 1 && d[n - 1] === 0) - n--; - if (d[n - 1] !== 1) - throw DataError('Invalid padding'); + n = m; + while (n > 1 && d[n - 1] === 0) n--; + if (d[n - 1] !== 1) throw DataError("Invalid padding"); n--; var r = new Uint8Array(n); - if (n > 0) - r.set(new Uint8Array(d.buffer, 0, n)); + if (n > 0) r.set(new Uint8Array(d.buffer, 0, n)); return r; } // @@ -1947,13 +1914,14 @@ function bitUnpad(d) // * @param {Uint8Array} d array with source data * @returns {Uint8Array} result */ -function randomPad(d) // -{ +function randomPad(d) { + // var n = d.byteLength, - nb = this.blockSize, - q = nb - n % nb, - m = Math.ceil(n / nb) * nb, - r = new Uint8Array(m), e = new Uint8Array(r.buffer, n, q); + nb = this.blockSize, + q = nb - (n % nb), + m = Math.ceil(n / nb) * nb, + r = new Uint8Array(m), + e = new Uint8Array(r.buffer, n, q); r.set(d); randomSeed(e); return r; @@ -2057,31 +2025,57 @@ function randomPad(d) // * @class GostCipher * @param {AlgorithmIndentifier} algorithm WebCryptoAPI algorithm identifier */ -function GostCipher(algorithm) // -{ +function GostCipher(algorithm) { + // // Check little endian support if (!littleEndian) - throw new NotSupportedError('Big endian platform not supported'); + throw new NotSupportedError("Big endian platform not supported"); algorithm = algorithm || {}; this.keySize = 32; this.blockLength = algorithm.length || 64; this.blockSize = this.blockLength >> 3; - this.name = (algorithm.name || (algorithm.version === 1 ? 'RC2' : - algorithm.version === 1989 ? 'GOST 28147' : 'GOST R 34.12')) + - (algorithm.version > 4 ? '-' + ((algorithm.version || 1989) % 100) : '') + '-' + - (this.blockLength === 64 ? '' : this.blockLength + '-') + - ((algorithm.mode === 'MAC') ? 'MAC-' + (algorithm.macLength || this.blockLength >> 1) : - (algorithm.mode === 'KW' || algorithm.keyWrapping) ? - ((algorithm.keyWrapping || 'NO') !== 'NO' ? algorithm.keyWrapping : '') + 'KW' : - (algorithm.block || 'ECB') + ((algorithm.block === 'CFB' || algorithm.block === 'OFB' || - (algorithm.block === 'CTR' && algorithm.version === 2015)) && - algorithm?.shiftBits !== this.blockLength ? '-' + algorithm.shiftBits : '') + - (algorithm.padding ? '-' + (algorithm.padding || (algorithm.block === 'CTR' || - algorithm.block === 'CFB' || algorithm.block === 'OFB' ? 'NO' : 'ZERO')) + 'PADDING' : '') + - ((algorithm.keyMeshing || 'NO') !== 'NO' ? '-CPKEYMESHING' : '')) + - (algorithm.procreator ? '/' + algorithm.procreator : '') + - (typeof algorithm.sBox === 'string' ? '/' + algorithm.sBox : ''); + this.name = + (algorithm.name || + (algorithm.version === 1 + ? "RC2" + : algorithm.version === 1989 + ? "GOST 28147" + : "GOST R 34.12")) + + (algorithm.version > 4 + ? "-" + ((algorithm.version || 1989) % 100) + : "") + + "-" + + (this.blockLength === 64 ? "" : this.blockLength + "-") + + (algorithm.mode === "MAC" + ? "MAC-" + (algorithm.macLength || this.blockLength >> 1) + : algorithm.mode === "KW" || algorithm.keyWrapping + ? ((algorithm.keyWrapping || "NO") !== "NO" + ? algorithm.keyWrapping + : "") + "KW" + : (algorithm.block || "ECB") + + ((algorithm.block === "CFB" || + algorithm.block === "OFB" || + (algorithm.block === "CTR" && + algorithm.version === 2015)) && + algorithm?.shiftBits !== this.blockLength + ? "-" + algorithm.shiftBits + : "") + + (algorithm.padding + ? "-" + + (algorithm.padding || + (algorithm.block === "CTR" || + algorithm.block === "CFB" || + algorithm.block === "OFB" + ? "NO" + : "ZERO")) + + "PADDING" + : "") + + ((algorithm.keyMeshing || "NO") !== "NO" + ? "-CPKEYMESHING" + : "")) + + (algorithm.procreator ? "/" + algorithm.procreator : "") + + (typeof algorithm.sBox === "string" ? "/" + algorithm.sBox : ""); // Algorithm procreator this.procreator = algorithm.procreator; @@ -2103,8 +2097,7 @@ function GostCipher(algorithm) // } else if (this.blockLength === 128) { this.process = process128; this.keySchedule = keySchedule128; - } else - throw new DataError('Invalid block length'); + } else throw new DataError("Invalid block length"); this.processMAC = processMAC15; break; case 1989: @@ -2113,49 +2106,53 @@ function GostCipher(algorithm) // this.processMAC = processMAC89; this.keySchedule = keySchedule89; if (this.blockLength !== 64) - throw new DataError('Invalid block length'); + throw new DataError("Invalid block length"); break; default: - throw new NotSupportedError('Algorithm version ' + algorithm.version + ' not supported'); + throw new NotSupportedError( + "Algorithm version " + algorithm.version + " not supported", + ); } - switch (algorithm.mode || (algorithm.keyWrapping && 'KW') || 'ES') { - - case 'ES': - switch (algorithm.block || 'ECB') { - case 'ECB': + switch (algorithm.mode || (algorithm.keyWrapping && "KW") || "ES") { + case "ES": + switch (algorithm.block || "ECB") { + case "ECB": this.encrypt = encryptECB; this.decrypt = decryptECB; break; - case 'CTR': + case "CTR": if (this.version === 1989) { this.encrypt = processCTR89; this.decrypt = processCTR89; } else { this.encrypt = processCTR15; this.decrypt = processCTR15; - this.shiftBits = algorithm.shiftBits || this.blockLength; + this.shiftBits = + algorithm.shiftBits || this.blockLength; } - break - case 'CBC': + break; + case "CBC": this.encrypt = encryptCBC; this.decrypt = decryptCBC; - break - case 'CFB': + break; + case "CFB": this.encrypt = encryptCFB; this.decrypt = decryptCFB; this.shiftBits = algorithm.shiftBits || this.blockLength; break; - case 'OFB': + case "OFB": this.encrypt = processOFB; this.decrypt = processOFB; this.shiftBits = algorithm.shiftBits || this.blockLength; break; default: - throw new NotSupportedError('Block mode ' + algorithm.block + ' not supported'); + throw new NotSupportedError( + "Block mode " + algorithm.block + " not supported", + ); } switch (algorithm.keyMeshing) { - case 'CP': + case "CP": this.keyMeshing = keyMeshingCP; break; default: @@ -2163,15 +2160,15 @@ function GostCipher(algorithm) // } if (this.encrypt === encryptECB || this.encrypt === encryptCBC) { switch (algorithm.padding) { - case 'PKCS5P': + case "PKCS5P": this.pad = pkcs5Pad; this.unpad = pkcs5Unpad; break; - case 'RANDOM': + case "RANDOM": this.pad = randomPad; this.unpad = noPad; break; - case 'BIT': + case "BIT": this.pad = bitPad; this.unpad = bitUnpad; break; @@ -2185,27 +2182,27 @@ function GostCipher(algorithm) // } this.generateKey = generateKey; break; - case 'MAC': + case "MAC": this.sign = signMAC; this.verify = verifyMAC; this.generateKey = generateKey; - this.macLength = algorithm.macLength || (this.blockLength >> 1); + this.macLength = algorithm.macLength || this.blockLength >> 1; this.pad = noPad; this.unpad = noPad; this.keyMeshing = noKeyMeshing; break; - case 'KW': + case "KW": this.pad = noPad; this.unpad = noPad; this.keyMeshing = noKeyMeshing; switch (algorithm.keyWrapping) { - case 'CP': + case "CP": this.wrapKey = wrapKeyCP; this.unwrapKey = unwrapKeyCP; this.generateKey = generateKey; this.shiftBits = algorithm.shiftBits || this.blockLength; break; - case 'SC': + case "SC": this.wrapKey = wrapKeySC; this.unwrapKey = unwrapKeySC; this.generateKey = generateWrappingKeySC; @@ -2216,43 +2213,66 @@ function GostCipher(algorithm) // this.generateKey = generateKey; } break; - case 'MASK': + case "MASK": this.wrapKey = wrapKeyMask; this.unwrapKey = unwrapKeyMask; this.generateKey = generateKey; break; default: - throw new NotSupportedError('Mode ' + algorithm.mode + ' not supported'); + throw new NotSupportedError( + "Mode " + algorithm.mode + " not supported", + ); } // Define sBox parameter - var sBox = algorithm.sBox, sBoxName; + var sBox = algorithm.sBox, + sBoxName; if (!sBox) - sBox = this.version === 2015 ? sBoxes['E-Z'] : this.procreator === 'SC' ? sBoxes['E-SC'] : sBoxes['E-A']; - else if (typeof sBox === 'string') { + sBox = + this.version === 2015 + ? sBoxes["E-Z"] + : this.procreator === "SC" + ? sBoxes["E-SC"] + : sBoxes["E-A"]; + else if (typeof sBox === "string") { sBoxName = sBox.toUpperCase(); sBox = sBoxes[sBoxName]; if (!sBox) - throw new SyntaxError('Unknown sBox name: ' + algorithm.sBox); - } else if (!sBox.length || sBox.length !== sBoxes['E-Z'].length) - throw new SyntaxError('Length of sBox must be ' + sBoxes['E-Z'].length); + throw new SyntaxError("Unknown sBox name: " + algorithm.sBox); + } else if (!sBox.length || sBox.length !== sBoxes["E-Z"].length) + throw new SyntaxError("Length of sBox must be " + sBoxes["E-Z"].length); this.sBox = sBox; // Initial vector if (algorithm.iv) { this.iv = new Uint8Array(algorithm.iv); if (this.iv.byteLength !== this.blockSize && this.version === 1989) - throw new SyntaxError('Length of iv must be ' + this.blockLength + ' bits'); - else if (this.iv.byteLength !== this.blockSize >> 1 && this.encrypt === processCTR15) - throw new SyntaxError('Length of iv must be ' + this.blockLength >> 1 + ' bits'); - else if (this.iv.byteLength % this.blockSize !== 0 && this.encrypt !== processCTR15) - throw new SyntaxError('Length of iv must be a multiple of ' + this.blockLength + ' bits'); - } else - this.iv = this.blockLength === 128 ? defaultIV128 : defaultIV; + throw new SyntaxError( + "Length of iv must be " + this.blockLength + " bits", + ); + else if ( + this.iv.byteLength !== this.blockSize >> 1 && + this.encrypt === processCTR15 + ) + throw new SyntaxError( + ("Length of iv must be " + this.blockLength) >> (1 + " bits"), + ); + else if ( + this.iv.byteLength % this.blockSize !== 0 && + this.encrypt !== processCTR15 + ) + throw new SyntaxError( + "Length of iv must be a multiple of " + + this.blockLength + + " bits", + ); + } else this.iv = this.blockLength === 128 ? defaultIV128 : defaultIV; // User key material if (algorithm.ukm) { this.ukm = new Uint8Array(algorithm.ukm); if (this.ukm.byteLength * 8 !== this.blockLength) - throw new SyntaxError('Length of ukm must be ' + this.blockLength + ' bits'); + throw new SyntaxError( + "Length of ukm must be " + this.blockLength + " bits", + ); } } // diff --git a/src/core/vendor/gost/gostCoding.mjs b/src/core/vendor/gost/gostCoding.mjs index ed42b3cc..19828f0d 100644 --- a/src/core/vendor/gost/gostCoding.mjs +++ b/src/core/vendor/gost/gostCoding.mjs @@ -32,7 +32,7 @@ * */ -import gostCrypto from './gostCrypto.mjs'; +import gostCrypto from "./gostCrypto.mjs"; /** * The Coding interface provides string converting methods: Base64, Hex, @@ -46,24 +46,24 @@ var CryptoOperationData = ArrayBuffer; var Date = Date; function buffer(d) { - if (d instanceof CryptoOperationData) - return d; + if (d instanceof CryptoOperationData) return d; else if (d && d?.buffer instanceof CryptoOperationData) - return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength ? - d.buffer : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; - else - throw new DataError('CryptoOperationData required'); + return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength + ? d.buffer + : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)) + .buffer; + else throw new DataError("CryptoOperationData required"); } // -function GostCoding() { -} +function GostCoding() {} /** * BASE64 conversion * * @class GostCoding.Base64 */ -var Base64 = {// +var Base64 = { + // /** * Base64.decode convert BASE64 string s to CryptoOperationData * @@ -72,28 +72,34 @@ var Base64 = {// * @returns {CryptoOperationData} Binary decoded data */ decode: function (s) { - s = s.replace(/[^A-Za-z0-9\+\/]/g, ''); + s = s.replace(/[^A-Za-z0-9\+\/]/g, ""); var n = s.length, - k = n * 3 + 1 >> 2, r = new Uint8Array(k); + k = (n * 3 + 1) >> 2, + r = new Uint8Array(k); for (var m3, m4, u24 = 0, j = 0, i = 0; i < n; i++) { m4 = i & 3; var c = s.charCodeAt(i); - c = c > 64 && c < 91 ? - c - 65 : c > 96 && c < 123 ? - c - 71 : c > 47 && c < 58 ? - c + 4 : c === 43 ? - 62 : c === 47 ? - 63 : 0; + c = + c > 64 && c < 91 + ? c - 65 + : c > 96 && c < 123 + ? c - 71 + : c > 47 && c < 58 + ? c + 4 + : c === 43 + ? 62 + : c === 47 + ? 63 + : 0; - u24 |= c << 18 - 6 * m4; + u24 |= c << (18 - 6 * m4); if (m4 === 3 || n - i === 1) { for (m3 = 0; m3 < 3 && j < k; m3++, j++) { - r[j] = u24 >>> (16 >>> m3 & 24) & 255; + r[j] = (u24 >>> ((16 >>> m3) & 24)) & 255; } u24 = 0; - } } return r.buffer; @@ -106,25 +112,39 @@ var Base64 = {// * @returns {String} BASE64 encoded data */ encode: function (data) { - var slen = 8, d = new Uint8Array(buffer(data)); - var m3 = 2, s = ''; + var slen = 8, + d = new Uint8Array(buffer(data)); + var m3 = 2, + s = ""; for (var n = d.length, u24 = 0, i = 0; i < n; i++) { m3 = i % 3; - if (i > 0 && (i * 4 / 3) % (12 * slen) === 0) - s += '\r\n'; - u24 |= d[i] << (16 >>> m3 & 24); + if (i > 0 && ((i * 4) / 3) % (12 * slen) === 0) s += "\r\n"; + u24 |= d[i] << ((16 >>> m3) & 24); if (m3 === 2 || n - i === 1) { for (var j = 18; j >= 0; j -= 6) { - var c = u24 >>> j & 63; - c = c < 26 ? c + 65 : c < 52 ? c + 71 : c < 62 ? c - 4 : - c === 62 ? 43 : c === 63 ? 47 : 65; + var c = (u24 >>> j) & 63; + c = + c < 26 + ? c + 65 + : c < 52 + ? c + 71 + : c < 62 + ? c - 4 + : c === 62 + ? 43 + : c === 63 + ? 47 + : 65; s += String.fromCharCode(c); } u24 = 0; } } - return s.substr(0, s.length - 2 + m3) + (m3 === 2 ? '' : m3 === 1 ? '=' : '=='); - } // + return ( + s.substr(0, s.length - 2 + m3) + + (m3 === 2 ? "" : m3 === 1 ? "=" : "==") + ); + }, // }; /** @@ -142,17 +162,73 @@ GostCoding.prototype.Base64 = Base64; * * @class GostCoding.Chars */ -var Chars = (function () { // +var Chars = (function () { + // var _win1251_ = { - 0x402: 0x80, 0x403: 0x81, 0x201A: 0x82, 0x453: 0x83, 0x201E: 0x84, 0x2026: 0x85, 0x2020: 0x86, 0x2021: 0x87, - 0x20AC: 0x88, 0x2030: 0x89, 0x409: 0x8A, 0x2039: 0x8B, 0x40A: 0x8C, 0x40C: 0x8D, 0x40B: 0x8E, 0x40f: 0x8f, - 0x452: 0x90, 0x2018: 0x91, 0x2019: 0x92, 0x201C: 0x93, 0x201D: 0x94, 0x2022: 0x95, 0x2013: 0x96, 0x2014: 0x97, - 0x2122: 0x99, 0x459: 0x9A, 0x203A: 0x9B, 0x45A: 0x9C, 0x45C: 0x9D, 0x45B: 0x9E, 0x45f: 0x9f, - 0xA0: 0xA0, 0x40E: 0xA1, 0x45E: 0xA2, 0x408: 0xA3, 0xA4: 0xA4, 0x490: 0xA5, 0xA6: 0xA6, 0xA7: 0xA7, - 0x401: 0xA8, 0xA9: 0xA9, 0x404: 0xAA, 0xAB: 0xAB, 0xAC: 0xAC, 0xAD: 0xAD, 0xAE: 0xAE, 0x407: 0xAf, - 0xB0: 0xB0, 0xB1: 0xB1, 0x406: 0xB2, 0x456: 0xB3, 0x491: 0xB4, 0xB5: 0xB5, 0xB6: 0xB6, 0xB7: 0xB7, - 0x451: 0xB8, 0x2116: 0xB9, 0x454: 0xBA, 0xBB: 0xBB, 0x458: 0xBC, 0x405: 0xBD, 0x455: 0xBE, 0x457: 0xBf + 0x402: 0x80, + 0x403: 0x81, + 0x201a: 0x82, + 0x453: 0x83, + 0x201e: 0x84, + 0x2026: 0x85, + 0x2020: 0x86, + 0x2021: 0x87, + 0x20ac: 0x88, + 0x2030: 0x89, + 0x409: 0x8a, + 0x2039: 0x8b, + 0x40a: 0x8c, + 0x40c: 0x8d, + 0x40b: 0x8e, + 0x40f: 0x8f, + 0x452: 0x90, + 0x2018: 0x91, + 0x2019: 0x92, + 0x201c: 0x93, + 0x201d: 0x94, + 0x2022: 0x95, + 0x2013: 0x96, + 0x2014: 0x97, + 0x2122: 0x99, + 0x459: 0x9a, + 0x203a: 0x9b, + 0x45a: 0x9c, + 0x45c: 0x9d, + 0x45b: 0x9e, + 0x45f: 0x9f, + 0xa0: 0xa0, + 0x40e: 0xa1, + 0x45e: 0xa2, + 0x408: 0xa3, + 0xa4: 0xa4, + 0x490: 0xa5, + 0xa6: 0xa6, + 0xa7: 0xa7, + 0x401: 0xa8, + 0xa9: 0xa9, + 0x404: 0xaa, + 0xab: 0xab, + 0xac: 0xac, + 0xad: 0xad, + 0xae: 0xae, + 0x407: 0xaf, + 0xb0: 0xb0, + 0xb1: 0xb1, + 0x406: 0xb2, + 0x456: 0xb3, + 0x491: 0xb4, + 0xb5: 0xb5, + 0xb6: 0xb6, + 0xb7: 0xb7, + 0x451: 0xb8, + 0x2116: 0xb9, + 0x454: 0xba, + 0xbb: 0xbb, + 0x458: 0xbc, + 0x405: 0xbd, + 0x455: 0xbe, + 0x457: 0xbf, }; var _win1251back_ = {}; for (var from in _win1251_) { @@ -170,11 +246,11 @@ var Chars = (function () { // * @returns {CryptoOperationData} Decoded binary data */ decode: function (s, charset) { - charset = (charset || 'win1251').toLowerCase().replace('-', ''); + charset = (charset || "win1251").toLowerCase().replace("-", ""); var r = []; for (var i = 0, j = s.length; i < j; i++) { var c = s.charCodeAt(i); - if (charset === 'utf8') { + if (charset === "utf8") { if (c < 0x80) { r.push(c); } else if (c < 0x800) { @@ -182,55 +258,58 @@ var Chars = (function () { // r.push(0x80 + (c & 63)); } else if (c < 0x10000) { r.push(0xe0 + (c >>> 12)); - r.push(0x80 + (c >>> 6 & 63)); + r.push(0x80 + ((c >>> 6) & 63)); r.push(0x80 + (c & 63)); } else if (c < 0x200000) { r.push(0xf0 + (c >>> 18)); - r.push(0x80 + (c >>> 12 & 63)); - r.push(0x80 + (c >>> 6 & 63)); + r.push(0x80 + ((c >>> 12) & 63)); + r.push(0x80 + ((c >>> 6) & 63)); r.push(0x80 + (c & 63)); } else if (c < 0x4000000) { r.push(0xf8 + (c >>> 24)); - r.push(0x80 + (c >>> 18 & 63)); - r.push(0x80 + (c >>> 12 & 63)); - r.push(0x80 + (c >>> 6 & 63)); + r.push(0x80 + ((c >>> 18) & 63)); + r.push(0x80 + ((c >>> 12) & 63)); + r.push(0x80 + ((c >>> 6) & 63)); r.push(0x80 + (c & 63)); } else { r.push(0xfc + (c >>> 30)); - r.push(0x80 + (c >>> 24 & 63)); - r.push(0x80 + (c >>> 18 & 63)); - r.push(0x80 + (c >>> 12 & 63)); - r.push(0x80 + (c >>> 6 & 63)); + r.push(0x80 + ((c >>> 24) & 63)); + r.push(0x80 + ((c >>> 18) & 63)); + r.push(0x80 + ((c >>> 12) & 63)); + r.push(0x80 + ((c >>> 6) & 63)); r.push(0x80 + (c & 63)); } - } else if (charset === 'unicode' || charset === 'ucs2' || charset === 'utf16') { - if (c < 0xD800 || (c >= 0xE000 && c <= 0x10000)) { + } else if ( + charset === "unicode" || + charset === "ucs2" || + charset === "utf16" + ) { + if (c < 0xd800 || (c >= 0xe000 && c <= 0x10000)) { r.push(c >>> 8); r.push(c & 0xff); } else if (c >= 0x10000 && c < 0x110000) { c -= 0x10000; - var first = ((0xffc00 & c) >> 10) + 0xD800; - var second = (0x3ff & c) + 0xDC00; + var first = ((0xffc00 & c) >> 10) + 0xd800; + var second = (0x3ff & c) + 0xdc00; r.push(first >>> 8); r.push(first & 0xff); r.push(second >>> 8); r.push(second & 0xff); } - } else if (charset === 'utf32' || charset === 'ucs4') { - r.push(c >>> 24 & 0xff); - r.push(c >>> 16 & 0xff); - r.push(c >>> 8 & 0xff); + } else if (charset === "utf32" || charset === "ucs4") { + r.push((c >>> 24) & 0xff); + r.push((c >>> 16) & 0xff); + r.push((c >>> 8) & 0xff); r.push(c & 0xff); - } else if (charset === 'win1251') { + } else if (charset === "win1251") { if (c >= 0x80) { - if (c >= 0x410 && c < 0x450) // А..Яа..я + if (c >= 0x410 && c < 0x450) + // А..Яа..я c -= 0x350; - else - c = _win1251_[c] || 0; + else c = _win1251_[c] || 0; } r.push(c); - } else - r.push(c & 0xff); + } else r.push(c & 0xff); } return new Uint8Array(r).buffer; }, @@ -243,47 +322,74 @@ var Chars = (function () { // * @returns {string} Encoded javascript string */ encode: function (data, charset) { - charset = (charset || 'win1251').toLowerCase().replace('-', ''); - var r = [], d = new Uint8Array(buffer(data)); + charset = (charset || "win1251").toLowerCase().replace("-", ""); + var r = [], + d = new Uint8Array(buffer(data)); for (var i = 0, n = d.length; i < n; i++) { var c = d[i]; - if (charset === 'utf8') { - c = c >= 0xfc && c < 0xfe && i + 5 < n ? // six bytes - (c - 0xfc) * 1073741824 + (d[++i] - 0x80 << 24) + (d[++i] - 0x80 << 18) + (d[++i] - 0x80 << 12) + (d[++i] - 0x80 << 6) + d[++i] - 0x80 - : c >> 0xf8 && c < 0xfc && i + 4 < n ? // five bytes - (c - 0xf8 << 24) + (d[++i] - 0x80 << 18) + (d[++i] - 0x80 << 12) + (d[++i] - 0x80 << 6) + d[++i] - 0x80 - : c >> 0xf0 && c < 0xf8 && i + 3 < n ? // four bytes - (c - 0xf0 << 18) + (d[++i] - 0x80 << 12) + (d[++i] - 0x80 << 6) + d[++i] - 0x80 - : c >= 0xe0 && c < 0xf0 && i + 2 < n ? // three bytes - (c - 0xe0 << 12) + (d[++i] - 0x80 << 6) + d[++i] - 0x80 - : c >= 0xc0 && c < 0xe0 && i + 1 < n ? // two bytes - (c - 0xc0 << 6) + d[++i] - 0x80 - : c; // one byte - } else if (charset === 'unicode' || charset === 'ucs2' || charset === 'utf16') { + if (charset === "utf8") { + c = + c >= 0xfc && c < 0xfe && i + 5 < n + ? // six bytes + (c - 0xfc) * 1073741824 + + ((d[++i] - 0x80) << 24) + + ((d[++i] - 0x80) << 18) + + ((d[++i] - 0x80) << 12) + + ((d[++i] - 0x80) << 6) + + d[++i] - + 0x80 + : c >> 0xf8 && c < 0xfc && i + 4 < n + ? // five bytes + ((c - 0xf8) << 24) + + ((d[++i] - 0x80) << 18) + + ((d[++i] - 0x80) << 12) + + ((d[++i] - 0x80) << 6) + + d[++i] - + 0x80 + : c >> 0xf0 && c < 0xf8 && i + 3 < n + ? // four bytes + ((c - 0xf0) << 18) + + ((d[++i] - 0x80) << 12) + + ((d[++i] - 0x80) << 6) + + d[++i] - + 0x80 + : c >= 0xe0 && c < 0xf0 && i + 2 < n + ? // three bytes + ((c - 0xe0) << 12) + + ((d[++i] - 0x80) << 6) + + d[++i] - + 0x80 + : c >= 0xc0 && c < 0xe0 && i + 1 < n + ? // two bytes + ((c - 0xc0) << 6) + d[++i] - 0x80 + : c; // one byte + } else if ( + charset === "unicode" || + charset === "ucs2" || + charset === "utf16" + ) { c = (c << 8) + d[++i]; - if (c >= 0xD800 && c < 0xE000) { - var first = (c - 0xD800) << 10; + if (c >= 0xd800 && c < 0xe000) { + var first = (c - 0xd800) << 10; c = d[++i]; c = (c << 8) + d[++i]; - var second = c - 0xDC00; + var second = c - 0xdc00; c = first + second + 0x10000; } - } else if (charset === 'utf32' || charset === 'ucs4') { + } else if (charset === "utf32" || charset === "ucs4") { c = (c << 8) + d[++i]; c = (c << 8) + d[++i]; c = (c << 8) + d[++i]; - } else if (charset === 'win1251') { + } else if (charset === "win1251") { if (c >= 0x80) { - if (c >= 0xC0 && c < 0x100) - c += 0x350; // А..Яа..я - else - c = _win1251back_[c] || 0; + if (c >= 0xc0 && c < 0x100) c += 0x350; // А..Яа..я + else c = _win1251back_[c] || 0; } } r.push(String.fromCharCode(c)); } - return r.join(''); - } + return r.join(""); + }, }; // })(); @@ -301,7 +407,8 @@ GostCoding.prototype.Chars = Chars; * * @class GostCoding.Hex */ -var Hex = {// +var Hex = { + // /** * Hex.decode(s, endean) convert HEX string s to CryptoOperationData in endean mode * @@ -311,16 +418,19 @@ var Hex = {// * @returns {CryptoOperationData} Decoded binary data */ decode: function (s, endean) { - s = s.replace(/[^A-Fa-f0-9]/g, ''); - var n = Math.ceil(s.length / 2), r = new Uint8Array(n); - s = (s.length % 2 > 0 ? '0' : '') + s; - if (endean && ((typeof endean !== 'string') || - (endean.toLowerCase().indexOf('little') < 0))) + s = s.replace(/[^A-Fa-f0-9]/g, ""); + var n = Math.ceil(s.length / 2), + r = new Uint8Array(n); + s = (s.length % 2 > 0 ? "0" : "") + s; + if ( + endean && + (typeof endean !== "string" || + endean.toLowerCase().indexOf("little") < 0) + ) for (var i = 0; i < n; i++) r[i] = parseInt(s.substr((n - i - 1) * 2, 2), 16); else - for (var i = 0; i < n; i++) - r[i] = parseInt(s.substr(i * 2, 2), 16); + for (var i = 0; i < n; i++) r[i] = parseInt(s.substr(i * 2, 2), 16); return r.buffer; }, /** @@ -332,20 +442,27 @@ var Hex = {// * @returns {string} Hex decoded string */ encode: function (data, endean) { - var s = [], d = new Uint8Array(buffer(data)), n = d.length; - if (endean && ((typeof endean !== 'string') || - (endean.toLowerCase().indexOf('little') < 0))) + var s = [], + d = new Uint8Array(buffer(data)), + n = d.length; + if ( + endean && + (typeof endean !== "string" || + endean.toLowerCase().indexOf("little") < 0) + ) for (var i = 0; i < n; i++) { var j = n - i - 1; - s[j] = (j > 0 && j % 32 === 0 ? '\r\n' : '') + - ('00' + d[i].toString(16)).slice(-2); + s[j] = + (j > 0 && j % 32 === 0 ? "\r\n" : "") + + ("00" + d[i].toString(16)).slice(-2); } else for (var i = 0; i < n; i++) - s[i] = (i > 0 && i % 32 === 0 ? '\r\n' : '') + - ('00' + d[i].toString(16)).slice(-2); - return s.join(''); - } // + s[i] = + (i > 0 && i % 32 === 0 ? "\r\n" : "") + + ("00" + d[i].toString(16)).slice(-2); + return s.join(""); + }, // }; /** @@ -361,7 +478,8 @@ GostCoding.prototype.Hex = Hex; * * @class GostCoding.Int16 */ -var Int16 = {// +var Int16 = { + // /** * Int16.decode(s) convert hex big insteger s to CryptoOperationData * @@ -370,30 +488,29 @@ var Int16 = {// * @returns {CryptoOperationData} Decoded binary data */ decode: function (s) { - s = (s || '').replace(/[^\-A-Fa-f0-9]/g, ''); - if (s.length === 0) - s = '0'; + s = (s || "").replace(/[^\-A-Fa-f0-9]/g, ""); + if (s.length === 0) s = "0"; // Signature var neg = false; - if (s.charAt(0) === '-') { + if (s.charAt(0) === "-") { neg = true; s = s.substring(1); } // Align 2 chars - while (s.charAt(0) === '0' && s.length > 1) - s = s.substring(1); - s = (s.length % 2 > 0 ? '0' : '') + s; + while (s.charAt(0) === "0" && s.length > 1) s = s.substring(1); + s = (s.length % 2 > 0 ? "0" : "") + s; // Padding for singanuture // '800000' - 'ffffff' - for positive // '800001' - 'ffffff' - for negative - if ((!neg && !/^[0-7]/.test(s)) || - (neg && !/^[0-7]|8[0]+$/.test(s))) - s = '00' + s; + if ((!neg && !/^[0-7]/.test(s)) || (neg && !/^[0-7]|8[0]+$/.test(s))) + s = "00" + s; // Convert hex - var n = s.length / 2, r = new Uint8Array(n), t = 0; + var n = s.length / 2, + r = new Uint8Array(n), + t = 0; for (var i = n - 1; i >= 0; --i) { var c = parseInt(s.substr(i * 2, 2), 16); - if (neg && (c + t > 0)) { + if (neg && c + t > 0) { c = 256 - c - t; t = 1; } @@ -409,23 +526,24 @@ var Int16 = {// * @returns {string} Int16 encoded string */ encode: function (data) { - var d = new Uint8Array(buffer(data)), n = d.length; - if (d.length === 0) - return '0x00'; - var s = [], neg = d[0] > 0x7f, t = 0; + var d = new Uint8Array(buffer(data)), + n = d.length; + if (d.length === 0) return "0x00"; + var s = [], + neg = d[0] > 0x7f, + t = 0; for (var i = n - 1; i >= 0; --i) { var v = d[i]; - if (neg && (v + t > 0)) { + if (neg && v + t > 0) { v = 256 - v - t; t = 1; } - s[i] = ('00' + v.toString(16)).slice(-2); + s[i] = ("00" + v.toString(16)).slice(-2); } - s = s.join(''); - while (s.charAt(0) === '0') - s = s.substring(1); - return (neg ? '-' : '') + '0x' + s; - } // + s = s.join(""); + while (s.charAt(0) === "0") s = s.substring(1); + return (neg ? "-" : "") + "0x" + s; + }, // }; /** @@ -441,85 +559,109 @@ GostCoding.prototype.Int16 = Int16; * * @class GostCoding.BER */ -var BER = (function () { // +var BER = (function () { + // // Predefenition block function encodeBER(source, format, onlyContent) { // Correct primitive type var object = source.object; - if (object === undefined) - object = source; + if (object === undefined) object = source; // Determinate tagClass - var tagClass = source.tagClass = source.tagClass || 0; // Universial default + var tagClass = (source.tagClass = source.tagClass || 0); // Universial default // Determinate tagNumber. Use only for Universal class if (tagClass === 0) { var tagNumber = source.tagNumber; - if (typeof tagNumber === 'undefined') { - if (typeof object === 'string') { - if (object === '') // NULL + if (typeof tagNumber === "undefined") { + if (typeof object === "string") { + if (object === "") + // NULL tagNumber = 0x05; - else if (/^\-?0x[0-9a-fA-F]+$/.test(object)) // INTEGER + else if (/^\-?0x[0-9a-fA-F]+$/.test(object)) + // INTEGER tagNumber = 0x02; - else if (/^(\d+\.)+\d+$/.test(object)) // OID + else if (/^(\d+\.)+\d+$/.test(object)) + // OID tagNumber = 0x06; - else if (/^[01]+$/.test(object)) // BIT STRING + else if (/^[01]+$/.test(object)) + // BIT STRING tagNumber = 0x03; - else if (/^(true|false)$/.test(object)) // BOOLEAN + else if (/^(true|false)$/.test(object)) + // BOOLEAN tagNumber = 0x01; - else if (/^[0-9a-fA-F]+$/.test(object)) // OCTET STRING + else if (/^[0-9a-fA-F]+$/.test(object)) + // OCTET STRING tagNumber = 0x04; - else - tagNumber = 0x13; // Printable string (later can be changed to UTF8String) - } else if (typeof object === 'number') { // INTEGER + else tagNumber = 0x13; // Printable string (later can be changed to UTF8String) + } else if (typeof object === "number") { + // INTEGER tagNumber = 0x02; - } else if (typeof object === 'boolean') { // BOOLEAN + } else if (typeof object === "boolean") { + // BOOLEAN tagNumber = 0x01; - } else if (object instanceof Array) { // SEQUENCE + } else if (object instanceof Array) { + // SEQUENCE tagNumber = 0x10; - } else if (object instanceof Date) { // GeneralizedTime + } else if (object instanceof Date) { + // GeneralizedTime tagNumber = 0x18; - } else if (object instanceof CryptoOperationData || (object && object.buffer instanceof CryptoOperationData)) { + } else if ( + object instanceof CryptoOperationData || + (object && object.buffer instanceof CryptoOperationData) + ) { tagNumber = 0x04; - } else - throw new DataError('Unrecognized type for ' + object); + } else throw new DataError("Unrecognized type for " + object); } } // Determinate constructed var tagConstructed = source.tagConstructed; - if (typeof tagConstructed === 'undefined') + if (typeof tagConstructed === "undefined") tagConstructed = source.tagConstructed = object instanceof Array; // Create content var content; - if (object instanceof CryptoOperationData || (object && object.buffer instanceof CryptoOperationData)) { // Direct + if ( + object instanceof CryptoOperationData || + (object && object.buffer instanceof CryptoOperationData) + ) { + // Direct content = new Uint8Array(buffer(object)); - if (tagNumber === 0x03) { // BITSTRING + if (tagNumber === 0x03) { + // BITSTRING // Set unused bits var a = new Uint8Array(buffer(content)); content = new Uint8Array(a.length + 1); content[0] = 0; // No unused bits content.set(a, 1); } - } else if (tagConstructed) { // Sub items coding + } else if (tagConstructed) { + // Sub items coding if (object instanceof Array) { - var bytelen = 0, ba = [], offset = 0; + var bytelen = 0, + ba = [], + offset = 0; for (var i = 0, n = object.length; i < n; i++) { ba[i] = encodeBER(object[i], format); bytelen += ba[i].length; } if (tagNumber === 0x11) - ba.sort(function (a, b) { // Sort order for SET components - for (var i = 0, n = Math.min(a.length, b.length); i < n; i++) { + ba.sort(function (a, b) { + // Sort order for SET components + for ( + var i = 0, n = Math.min(a.length, b.length); + i < n; + i++ + ) { var r = a[i] - b[i]; - if (r !== 0) - return r; + if (r !== 0) return r; } return a.length - b.length; }); - if (format === 'CER') { // final for CER 00 00 + if (format === "CER") { + // final for CER 00 00 ba[n] = new Uint8Array(2); bytelen += 2; } @@ -528,8 +670,7 @@ var BER = (function () { // content.set(ba[i], offset); offset = offset + ba[i].length; } - } else - throw new DataError('Constracted block can\'t be primitive'); + } else throw new DataError("Constracted block can't be primitive"); } else { switch (tagNumber) { // 0x00: // EOC @@ -540,11 +681,14 @@ var BER = (function () { // case 0x02: // INTEGER case 0x0a: // ENUMIRATED content = Int16.decode( - typeof object === 'number' ? object.toString(16) : object); + typeof object === "number" + ? object.toString(16) + : object, + ); break; case 0x03: // BIT STRING - if (typeof object === 'string') { - var unusedBits = 7 - (object.length + 7) % 8; + if (typeof object === "string") { + var unusedBits = 7 - ((object.length + 7) % 8); var n = Math.ceil(object.length / 8); content = new Uint8Array(n + 1); content[0] = unusedBits; @@ -552,7 +696,13 @@ var BER = (function () { // var c = 0; for (var j = 0; j < 8; j++) { var k = i * 8 + j; - c = (c << 1) + (k < object.length ? (object.charAt(k) === '1' ? 1 : 0) : 0); + c = + (c << 1) + + (k < object.length + ? object.charAt(k) === "1" + ? 1 + : 0 + : 0); } content[i + 1] = c; } @@ -560,17 +710,21 @@ var BER = (function () { // break; case 0x04: content = Hex.decode( - typeof object === 'number' ? object.toString(16) : object); + typeof object === "number" + ? object.toString(16) + : object, + ); break; - // case 0x05: // NULL + // case 0x05: // NULL case 0x06: // OBJECT IDENTIFIER - var a = object.match(/\d+/g), r = []; + var a = object.match(/\d+/g), + r = []; for (var i = 1; i < a.length; i++) { - var n = +a[i], r1 = []; - if (i === 1) - n = n + a[0] * 40; + var n = +a[i], + r1 = []; + if (i === 1) n = n + a[0] * 40; do { - r1.push(n & 0x7F); + r1.push(n & 0x7f); n = n >>> 7; } while (n); // reverse order @@ -579,96 +733,114 @@ var BER = (function () { // } content = new Uint8Array(r); break; - // case 0x07: // ObjectDescriptor - // case 0x08: // EXTERNAL - // case 0x09: // REAL - // case 0x0A: // ENUMERATED - // case 0x0B: // EMBEDDED PDV - case 0x0C: // UTF8String - content = Chars.decode(object, 'utf8'); + // case 0x07: // ObjectDescriptor + // case 0x08: // EXTERNAL + // case 0x09: // REAL + // case 0x0A: // ENUMERATED + // case 0x0B: // EMBEDDED PDV + case 0x0c: // UTF8String + content = Chars.decode(object, "utf8"); break; - // case 0x10: // SEQUENCE - // case 0x11: // SET + // case 0x10: // SEQUENCE + // case 0x11: // SET case 0x12: // NumericString case 0x16: // IA5String // ASCII case 0x13: // PrintableString // ASCII subset case 0x14: // TeletexString // aka T61String case 0x15: // VideotexString case 0x19: // GraphicString - case 0x1A: // VisibleString // ASCII subset - case 0x1B: // GeneralString + case 0x1a: // VisibleString // ASCII subset + case 0x1b: // GeneralString // Reflect on character encoding for (var i = 0, n = object.length; i < n; i++) - if (object.charCodeAt(i) > 255) - tagNumber = 0x0C; - if (tagNumber === 0x0C) - content = Chars.decode(object, 'utf8'); - else - content = Chars.decode(object, 'ascii'); + if (object.charCodeAt(i) > 255) tagNumber = 0x0c; + if (tagNumber === 0x0c) + content = Chars.decode(object, "utf8"); + else content = Chars.decode(object, "ascii"); break; case 0x17: // UTCTime case 0x18: // GeneralizedTime var result = object.original; if (!result) { var date = new Date(object); - date.setMinutes(date.getMinutes() + date.getTimezoneOffset()); // to UTC - var ms = tagNumber === 0x18 ? date.getMilliseconds().toString() : ''; // Milliseconds, remove trailing zeros - while (ms.length > 0 && ms.charAt(ms.length - 1) === '0') + date.setMinutes( + date.getMinutes() + date.getTimezoneOffset(), + ); // to UTC + var ms = + tagNumber === 0x18 + ? date.getMilliseconds().toString() + : ""; // Milliseconds, remove trailing zeros + while ( + ms.length > 0 && + ms.charAt(ms.length - 1) === "0" + ) ms = ms.substring(0, ms.length - 1); - if (ms.length > 0) - ms = '.' + ms; - result = (tagNumber === 0x17 ? date.getYear().toString().slice(-2) : date.getFullYear().toString()) + - ('00' + (date.getMonth() + 1)).slice(-2) + - ('00' + date.getDate()).slice(-2) + - ('00' + date.getHours()).slice(-2) + - ('00' + date.getMinutes()).slice(-2) + - ('00' + date.getSeconds()).slice(-2) + ms + 'Z'; + if (ms.length > 0) ms = "." + ms; + result = + (tagNumber === 0x17 + ? date.getYear().toString().slice(-2) + : date.getFullYear().toString()) + + ("00" + (date.getMonth() + 1)).slice(-2) + + ("00" + date.getDate()).slice(-2) + + ("00" + date.getHours()).slice(-2) + + ("00" + date.getMinutes()).slice(-2) + + ("00" + date.getSeconds()).slice(-2) + + ms + + "Z"; } - content = Chars.decode(result, 'ascii'); + content = Chars.decode(result, "ascii"); break; - case 0x1C: // UniversalString - content = Chars.decode(object, 'utf32'); + case 0x1c: // UniversalString + content = Chars.decode(object, "utf32"); break; - case 0x1E: // BMPString - content = Chars.decode(object, 'utf16'); + case 0x1e: // BMPString + content = Chars.decode(object, "utf16"); break; } } - if (!content) - content = new Uint8Array(0); + if (!content) content = new Uint8Array(0); if (content instanceof CryptoOperationData) content = new Uint8Array(content); - if (!tagConstructed && format === 'CER') { + if (!tagConstructed && format === "CER") { // Encoding CER-form for string types var k; switch (tagNumber) { case 0x03: // BIT_STRING k = 1; // ingnore unused bit for bit string case 0x04: // OCTET_STRING - case 0x0C: // UTF8String + case 0x0c: // UTF8String case 0x12: // NumericString case 0x13: // PrintableString case 0x14: // TeletexString case 0x15: // VideotexString case 0x16: // IA5String case 0x19: // GraphicString - case 0x1A: // VisibleString - case 0x1B: // GeneralString - case 0x1C: // UniversalString - case 0x1E: // BMPString + case 0x1a: // VisibleString + case 0x1b: // GeneralString + case 0x1c: // UniversalString + case 0x1e: // BMPString k = k || 0; // Split content on 1000 octet len parts var size = 1000; - var bytelen = 0, ba = [], offset = 0; + var bytelen = 0, + ba = [], + offset = 0; for (var i = k, n = content.length; i < n; i += size - k) { - ba[i] = encodeBER({ - object: new Unit8Array(content.buffer, i, Math.min(size - k, n - i)), - tagNumber: tagNumber, - tagClass: 0, - tagConstructed: false - }, format); + ba[i] = encodeBER( + { + object: new Unit8Array( + content.buffer, + i, + Math.min(size - k, n - i), + ), + tagNumber: tagNumber, + tagClass: 0, + tagConstructed: false, + }, + format, + ); bytelen += ba[i].length; } ba[n] = new Uint8Array(2); // final for CER 00 00 @@ -682,56 +854,60 @@ var BER = (function () { // } // Restore tagNumber for all classes - if (tagClass === 0) - source.tagNumber = tagNumber; - else - source.tagNumber = tagNumber = source.tagNumber || 0; + if (tagClass === 0) source.tagNumber = tagNumber; + else source.tagNumber = tagNumber = source.tagNumber || 0; source.content = content; - if (onlyContent) - return content; + if (onlyContent) return content; // Create header // tagNumber - var ha = [], first = tagClass === 3 ? 0xC0 : tagClass === 2 ? 0x80 : - tagClass === 1 ? 0x40 : 0x00; - if (tagConstructed) - first |= 0x20; - if (tagNumber < 0x1F) { - first |= tagNumber & 0x1F; + var ha = [], + first = + tagClass === 3 + ? 0xc0 + : tagClass === 2 + ? 0x80 + : tagClass === 1 + ? 0x40 + : 0x00; + if (tagConstructed) first |= 0x20; + if (tagNumber < 0x1f) { + first |= tagNumber & 0x1f; ha.push(first); } else { - first |= 0x1F; + first |= 0x1f; ha.push(first); - var n = tagNumber, ha1 = []; + var n = tagNumber, + ha1 = []; do { - ha1.push(n & 0x7F); + ha1.push(n & 0x7f); n = n >>> 7; - } while (n) + } while (n); // reverse order for (var j = ha1.length - 1; j >= 0; --j) ha.push(ha1[j] + (j === 0 ? 0x00 : 0x80)); } // Length - if (tagConstructed && format === 'CER') { + if (tagConstructed && format === "CER") { ha.push(0x80); } else { var len = content.length; - if (len > 0x7F) { - var l2 = len, ha2 = []; + if (len > 0x7f) { + var l2 = len, + ha2 = []; do { ha2.push(l2 & 0xff); l2 = l2 >>> 8; } while (l2); ha.push(ha2.length + 0x80); // reverse order - for (var j = ha2.length - 1; j >= 0; --j) - ha.push(ha2[j]); + for (var j = ha2.length - 1; j >= 0; --j) ha.push(ha2[j]); } else { // simple len ha.push(len); } } - var header = source.header = new Uint8Array(ha); + var header = (source.header = new Uint8Array(ha)); // Result - complete buffer var block = new Uint8Array(header.length + content.length); @@ -741,11 +917,17 @@ var BER = (function () { // } function decodeBER(source, offset) { - // start pos - var pos = offset || 0, start = pos; - var tagNumber, tagClass, tagConstructed, - content, header, buffer, sub, len; + var pos = offset || 0, + start = pos; + var tagNumber, + tagClass, + tagConstructed, + content, + header, + buffer, + sub, + len; if (source.object) { // Ready from source @@ -754,10 +936,12 @@ var BER = (function () { // tagConstructed = source.tagConstructed; content = source.content; header = source.header; - buffer = source.object instanceof CryptoOperationData ? - new Uint8Array(source.object) : null; + buffer = + source.object instanceof CryptoOperationData + ? new Uint8Array(source.object) + : null; sub = source.object instanceof Array ? source.object : null; - len = buffer && buffer.length || null; + len = (buffer && buffer.length) || null; } else { // Decode header var d = source; @@ -767,11 +951,15 @@ var BER = (function () { // tagNumber = buf & 0x1f; tagClass = buf >> 6; tagConstructed = (buf & 0x20) !== 0; - if (tagNumber === 0x1f) { // long tag + if (tagNumber === 0x1f) { + // long tag tagNumber = 0; do { if (tagNumber > 0x1fffffffffff80) - throw new DataError('Convertor not supported tag number more then (2^53 - 1) at position ' + offset); + throw new DataError( + "Convertor not supported tag number more then (2^53 - 1) at position " + + offset, + ); buf = d[pos++]; tagNumber = (tagNumber << 7) + (buf & 0x7f); } while (buf & 0x80); @@ -781,14 +969,16 @@ var BER = (function () { // buf = d[pos++]; len = buf & 0x7f; if (len !== buf) { - if (len > 6) // no reason to use Int10, as it would be a huge buffer anyways - throw new DataError('Length over 48 bits not supported at position ' + offset); - if (len === 0) - len = null; // undefined + if (len > 6) + // no reason to use Int10, as it would be a huge buffer anyways + throw new DataError( + "Length over 48 bits not supported at position " + + offset, + ); + if (len === 0) len = null; // undefined else { buf = 0; - for (var i = 0; i < len; ++i) - buf = (buf << 8) + d[pos++]; + for (var i = 0; i < len; ++i) buf = (buf << 8) + d[pos++]; len = buf; } } @@ -808,11 +998,14 @@ var BER = (function () { // pos += s.header.length + s.content.length; } if (pos !== end) - throw new DataError('Content size is not correct for container starting at offset ' + start); + throw new DataError( + "Content size is not correct for container starting at offset " + + start, + ); } else { // undefined length try { - for (; ; ) { + for (;;) { var s = decodeBER(d, pos); pos += s.header.length + s.content.length; if (s.tagClass === 0x00 && s.tagNumber === 0x00) @@ -821,7 +1014,12 @@ var BER = (function () { // } len = pos - start; } catch (e) { - throw new DataError('Exception ' + e + ' while decoding undefined length content at offset ' + start); + throw new DataError( + "Exception " + + e + + " while decoding undefined length content at offset " + + start, + ); } } } @@ -839,35 +1037,43 @@ var BER = (function () { // case 0x03: // BIT_STRING k = 1; // ingnore unused bit for bit string case 0x04: // OCTET_STRING - case 0x0C: // UTF8String + case 0x0c: // UTF8String case 0x12: // NumericString case 0x13: // PrintableString case 0x14: // TeletexString case 0x15: // VideotexString case 0x16: // IA5String case 0x19: // GraphicString - case 0x1A: // VisibleString - case 0x1B: // GeneralString - case 0x1C: // UniversalString - case 0x1E: // BMPString + case 0x1a: // VisibleString + case 0x1b: // GeneralString + case 0x1c: // UniversalString + case 0x1e: // BMPString k = k || 0; // Concatination if (sub.length === 0) - throw new DataError('No constructed encoding content of string type at offset ' + start); + throw new DataError( + "No constructed encoding content of string type at offset " + + start, + ); len = k; for (var i = 0, n = sub.length; i < n; i++) { var s = sub[i]; - if (s.tagClass !== tagClass || s.tagNumber !== tagNumber || s.tagConstructed) - throw new DataError('Invalid constructed encoding of string type at offset ' + start); + if ( + s.tagClass !== tagClass || + s.tagNumber !== tagNumber || + s.tagConstructed + ) + throw new DataError( + "Invalid constructed encoding of string type at offset " + + start, + ); len += s.content.length - k; } buffer = new Uint8Array(len); for (var i = 0, n = sub.length, j = k; i < n; i++) { var s = sub[i]; - if (k > 0) - buffer.set(s.content.subarray(1), j); - else - buffer.set(s.content, j); + if (k > 0) buffer.set(s.content.subarray(1), j); + else buffer.set(s.content, j); j += s.content.length - k; } tagConstructed = false; // follow not required @@ -876,10 +1082,12 @@ var BER = (function () { // } } // Primitive types - var object = ''; + var object = ""; if (sub === null) { if (len === null) - throw new DataError('Invalid tag with undefined length at offset ' + start); + throw new DataError( + "Invalid tag with undefined length at offset " + start, + ); if (tagClass === 0) { switch (tagNumber) { @@ -892,65 +1100,69 @@ var BER = (function () { // object = Int16.encode(buffer); } else { var v = buffer[0]; - if (buffer[0] > 0x7f) - v = v - 256; + if (buffer[0] > 0x7f) v = v - 256; for (var i = 1; i < len; i++) v = v * 256 + buffer[i]; object = v; } break; case 0x03: // BIT_STRING - if (len > 5) { // Content buffer + if (len > 5) { + // Content buffer object = new Uint8Array(buffer.subarray(1)).buffer; - } else { // Max bit mask only for 32 bit + } else { + // Max bit mask only for 32 bit var unusedBit = buffer[0], - skip = unusedBit, s = []; + skip = unusedBit, + s = []; for (var i = len - 1; i >= 1; --i) { var b = buffer[i]; for (var j = skip; j < 8; ++j) - s.push((b >> j) & 1 ? '1' : '0'); + s.push((b >> j) & 1 ? "1" : "0"); skip = 0; } - object = s.reverse().join(''); + object = s.reverse().join(""); } break; case 0x04: // OCTET_STRING object = new Uint8Array(buffer).buffer; break; - // case 0x05: // NULL + // case 0x05: // NULL case 0x06: // OBJECT_IDENTIFIER - var s = '', - n = 0, - bits = 0; + var s = "", + n = 0, + bits = 0; for (var i = 0; i < len; ++i) { var v = buffer[i]; - n = (n << 7) + (v & 0x7F); + n = (n << 7) + (v & 0x7f); bits += 7; - if (!(v & 0x80)) { // finished - if (s === '') { - var m = n < 80 ? n < 40 ? 0 : 1 : 2; + if (!(v & 0x80)) { + // finished + if (s === "") { + var m = n < 80 ? (n < 40 ? 0 : 1) : 2; s = m + "." + (n - m * 40); - } else - s += "." + n.toString(); + } else s += "." + n.toString(); n = 0; bits = 0; } } if (bits > 0) - throw new DataError('Incompleted OID at offset ' + start); + throw new DataError( + "Incompleted OID at offset " + start, + ); object = s; break; - //case 0x07: // ObjectDescriptor - //case 0x08: // EXTERNAL - //case 0x09: // REAL - //case 0x0A: // ENUMERATED - //case 0x0B: // EMBEDDED_PDV + //case 0x07: // ObjectDescriptor + //case 0x08: // EXTERNAL + //case 0x09: // REAL + //case 0x0A: // ENUMERATED + //case 0x0B: // EMBEDDED_PDV case 0x10: // SEQUENCE case 0x11: // SET object = []; break; - case 0x0C: // UTF8String - object = Chars.encode(buffer, 'utf8'); + case 0x0c: // UTF8String + object = Chars.encode(buffer, "utf8"); break; case 0x12: // NumericString case 0x13: // PrintableString @@ -958,35 +1170,50 @@ var BER = (function () { // case 0x15: // VideotexString case 0x16: // IA5String case 0x19: // GraphicString - case 0x1A: // VisibleString - case 0x1B: // GeneralString - object = Chars.encode(buffer, 'ascii'); + case 0x1a: // VisibleString + case 0x1b: // GeneralString + object = Chars.encode(buffer, "ascii"); break; - case 0x1C: // UniversalString - object = Chars.encode(buffer, 'utf32'); + case 0x1c: // UniversalString + object = Chars.encode(buffer, "utf32"); break; - case 0x1E: // BMPString - object = Chars.encode(buffer, 'utf16'); + case 0x1e: // BMPString + object = Chars.encode(buffer, "utf16"); break; case 0x17: // UTCTime case 0x18: // GeneralizedTime var shortYear = tagNumber === 0x17; - var s = Chars.encode(buffer, 'ascii'), - m = (shortYear ? - /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/ : - /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/).exec(s); + var s = Chars.encode(buffer, "ascii"), + m = ( + shortYear + ? /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/ + : /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/ + ).exec(s); if (!m) - throw new DataError('Unrecognized time format "' + s + '" at offset ' + start); + throw new DataError( + 'Unrecognized time format "' + + s + + '" at offset ' + + start, + ); if (shortYear) { // Where YY is greater than or equal to 50, the year SHALL be interpreted as 19YY; and // Where YY is less than 50, the year SHALL be interpreted as 20YY m[1] = +m[1]; - m[1] += (m[1] < 50) ? 2000 : 1900; + m[1] += m[1] < 50 ? 2000 : 1900; } - var dt = new Date(m[1], +m[2] - 1, +m[3], +(m[4] || '0'), +(m[5] || '0'), +(m[6] || '0'), +(m[7] || '0')), - tz = dt.getTimezoneOffset(); + var dt = new Date( + m[1], + +m[2] - 1, + +m[3], + +(m[4] || "0"), + +(m[5] || "0"), + +(m[6] || "0"), + +(m[7] || "0"), + ), + tz = dt.getTimezoneOffset(); if (m[8] || tagNumber === 0x17) { - if (m[8].toUpperCase() !== 'Z' && m[9]) { + if (m[8].toUpperCase() !== "Z" && m[9]) { tz = tz + parseInt(m[9]); } dt.setMinutes(dt.getMinutes() - tz); @@ -995,10 +1222,9 @@ var BER = (function () { // object = dt; break; } - } else // OCTET_STRING - object = new Uint8Array(buffer).buffer; - } else - object = sub; + } // OCTET_STRING + else object = new Uint8Array(buffer).buffer; + } else object = sub; // result return { @@ -1007,7 +1233,7 @@ var BER = (function () { // tagNumber: tagNumber, header: header, content: content, - object: object + object: object, }; } @@ -1067,8 +1293,11 @@ var BER = (function () { // * @returns {Object} Javascript object with result of decoding */ decode: function (data) { - return decodeBER(data.object ? data : new Uint8Array(buffer(data)), 0); - } + return decodeBER( + data.object ? data : new Uint8Array(buffer(data)), + 0, + ); + }, }; // })(); @@ -1084,7 +1313,8 @@ GostCoding.prototype.BER = BER; * PEM conversion * @class GostCoding.PEM */ -var PEM = {// +var PEM = { + // /** * PEM.encode(data, name) encode CryptoOperationData to PEM format with name label * @@ -1094,9 +1324,13 @@ var PEM = {// * @returns {string} Encoded object */ encode: function (data, name) { - return (name ? '-----BEGIN ' + name.toUpperCase() + '-----\r\n' : '') + - Base64.encode(data instanceof CryptoOperationData ? data : BER.encode(data)) + - (name ? '\r\n-----END ' + name.toUpperCase() + '-----' : ''); + return ( + (name ? "-----BEGIN " + name.toUpperCase() + "-----\r\n" : "") + + Base64.encode( + data instanceof CryptoOperationData ? data : BER.encode(data), + ) + + (name ? "\r\n-----END " + name.toUpperCase() + "-----" : "") + ); }, /** * PEM.decode(s, name, deep) decode PEM format s labeled name to CryptoOperationData or javascript object in according to deep parameter @@ -1111,33 +1345,36 @@ var PEM = {// decode: function (s, name, deep, index) { // Try clear base64 var re1 = /([A-Za-z0-9\+\/\s\=]+)/g, - valid = re1.exec(s); - if (valid[1].length !== s.length) - valid = false; + valid = re1.exec(s); + if (valid[1].length !== s.length) valid = false; if (!valid && name) { // Try with the name var re2 = new RegExp( - '-----\\s?BEGIN ' + name.toUpperCase() + - '-----([A-Za-z0-9\\+\\/\\s\\=]+)-----\\s?END ' + - name.toUpperCase() + '-----', 'g'); + "-----\\s?BEGIN " + + name.toUpperCase() + + "-----([A-Za-z0-9\\+\\/\\s\\=]+)-----\\s?END " + + name.toUpperCase() + + "-----", + "g", + ); valid = re2.exec(s); } if (!valid) { // Try with some name var re3 = new RegExp( - '-----\\s?BEGIN [A-Z0-9\\s]+' + - '-----([A-Za-z0-9\\+\\/\\s\\=]+)-----\\s?END ' + - '[A-Z0-9\\s]+-----', 'g'); + "-----\\s?BEGIN [A-Z0-9\\s]+" + + "-----([A-Za-z0-9\\+\\/\\s\\=]+)-----\\s?END " + + "[A-Z0-9\\s]+-----", + "g", + ); valid = re3.exec(s); } var r = valid && valid[1 + (index || 0)]; - if (!r) - throw new DataError('Not valid PEM format'); + if (!r) throw new DataError("Not valid PEM format"); var out = Base64.decode(r); - if (deep) - out = BER.decode(out); + if (deep) out = BER.decode(out); return out; - } // + }, // }; /** diff --git a/src/core/vendor/gost/gostCrypto.mjs b/src/core/vendor/gost/gostCrypto.mjs index 77132f6c..c0aef419 100644 --- a/src/core/vendor/gost/gostCrypto.mjs +++ b/src/core/vendor/gost/gostCrypto.mjs @@ -32,326 +32,474 @@ * */ -import GostRandom from './gostRandom.mjs'; -import gostEngine from './gostEngine.mjs'; +import GostRandom from "./gostRandom.mjs"; +import gostEngine from "./gostEngine.mjs"; -import crypto from 'crypto' +import crypto from "crypto"; /* -* Algorithm normalization -* -*/ // + * Algorithm normalization + * + */ // var root = {}; root.gostEngine = gostEngine; -var rootCrypto = crypto +var rootCrypto = crypto; var SyntaxError = Error, - DataError = Error, - NotSupportedError = Error, - OperationError = Error, - InvalidStateError = Error, - InvalidAccessError = Error; + DataError = Error, + NotSupportedError = Error, + OperationError = Error, + InvalidStateError = Error, + InvalidAccessError = Error; // Normalize algorithm function normalize(algorithm, method) { - if (typeof algorithm === 'string' || algorithm instanceof String) - algorithm = {name: algorithm}; + if (typeof algorithm === "string" || algorithm instanceof String) + algorithm = { name: algorithm }; var name = algorithm.name; - if (!name) - throw new SyntaxError('Algorithm name not defined'); + if (!name) throw new SyntaxError("Algorithm name not defined"); // Extract algorithm modes from name - var modes = name.split('/'), modes = modes[0].split('-').concat(modes.slice(1)); + var modes = name.split("/"), + modes = modes[0].split("-").concat(modes.slice(1)); // Normalize the name with default modes var na = {}; - name = modes[0].replace(/[\.\s]/g, ''); + name = modes[0].replace(/[\.\s]/g, ""); modes = modes.slice(1); - if (name.indexOf('28147') >= 0) { + if (name.indexOf("28147") >= 0) { na = { - name: 'GOST 28147', + name: "GOST 28147", version: 1989, - mode: (algorithm.mode || (// ES, MAC, KW - (method === 'sign' || method === 'verify') ? 'MAC' : - (method === 'wrapKey' || method === 'unwrapKey') ? 'KW' : 'ES')).toUpperCase(), - length: algorithm.length || 64 + mode: ( + algorithm.mode || // ES, MAC, KW + (method === "sign" || method === "verify" + ? "MAC" + : method === "wrapKey" || method === "unwrapKey" + ? "KW" + : "ES") + ).toUpperCase(), + length: algorithm.length || 64, }; - } else if (name.indexOf('3412') >= 0) { + } else if (name.indexOf("3412") >= 0) { na = { - name: 'GOST R 34.12', + name: "GOST R 34.12", version: 2015, - mode: (algorithm.mode || (// ES, MAC, KW - (method === 'sign' || method === 'verify') ? 'MAC' : - (method === 'wrapKey' || method === 'unwrapKey') ? 'KW' : 'ES')).toUpperCase(), - length: algorithm.length || 64 // 128 + mode: ( + algorithm.mode || // ES, MAC, KW + (method === "sign" || method === "verify" + ? "MAC" + : method === "wrapKey" || method === "unwrapKey" + ? "KW" + : "ES") + ).toUpperCase(), + length: algorithm.length || 64, // 128 }; - } else if (name.indexOf('3411') >= 0) { + } else if (name.indexOf("3411") >= 0) { na = { - name: 'GOST R 34.11', + name: "GOST R 34.11", version: 2012, // 1994 - mode: (algorithm.mode || (// HASH, KDF, HMAC, PBKDF2, PFXKDF, CPKDF - (method === 'deriveKey' || method === 'deriveBits') ? 'KDF' : - (method === 'sign' || method === 'verify') ? 'HMAC' : 'HASH')).toUpperCase(), - length: algorithm.length || 256 // 512 + mode: ( + algorithm.mode || // HASH, KDF, HMAC, PBKDF2, PFXKDF, CPKDF + (method === "deriveKey" || method === "deriveBits" + ? "KDF" + : method === "sign" || method === "verify" + ? "HMAC" + : "HASH") + ).toUpperCase(), + length: algorithm.length || 256, // 512 }; - } else if (name.indexOf('3410') >= 0) { + } else if (name.indexOf("3410") >= 0) { na = { - name: 'GOST R 34.10', + name: "GOST R 34.10", version: 2012, // 1994, 2001 - mode: (algorithm.mode || (// SIGN, DH, MASK - (method === 'deriveKey' || method === 'deriveBits') ? 'DH' : 'SIGN')).toUpperCase(), - length: algorithm.length || 256 // 512 + mode: ( + algorithm.mode || // SIGN, DH, MASK + (method === "deriveKey" || method === "deriveBits" + ? "DH" + : "SIGN") + ).toUpperCase(), + length: algorithm.length || 256, // 512 }; - } else if (name.indexOf('SHA') >= 0) { + } else if (name.indexOf("SHA") >= 0) { na = { - name: 'SHA', + name: "SHA", version: (algorithm.length || 160) === 160 ? 1 : 2, // 1, 2 - mode: (algorithm.mode || (// HASH, KDF, HMAC, PBKDF2, PFXKDF - (method === 'deriveKey' || method === 'deriveBits') ? 'KDF' : - (method === 'sign' || method === 'verify') ? 'HMAC' : 'HASH')).toUpperCase(), - length: algorithm.length || 160 + mode: ( + algorithm.mode || // HASH, KDF, HMAC, PBKDF2, PFXKDF + (method === "deriveKey" || method === "deriveBits" + ? "KDF" + : method === "sign" || method === "verify" + ? "HMAC" + : "HASH") + ).toUpperCase(), + length: algorithm.length || 160, }; - } else if (name.indexOf('RC2') >= 0) { + } else if (name.indexOf("RC2") >= 0) { na = { - name: 'RC2', + name: "RC2", version: 1, - mode: (algorithm.mode || (// ES, MAC, KW - (method === 'sign' || method === 'verify') ? 'MAC' : - (method === 'wrapKey' || method === 'unwrapKey') ? 'KW' : 'ES')).toUpperCase(), - length: algorithm.length || 32 // 1 - 1024 + mode: ( + algorithm.mode || // ES, MAC, KW + (method === "sign" || method === "verify" + ? "MAC" + : method === "wrapKey" || method === "unwrapKey" + ? "KW" + : "ES") + ).toUpperCase(), + length: algorithm.length || 32, // 1 - 1024 }; - } else if (name.indexOf('PBKDF2') >= 0) { - na = normalize(algorithm.hash, 'digest'); - na.mode = 'PBKDF2'; - } else if (name.indexOf('PFXKDF') >= 0) { - na = normalize(algorithm.hash, 'digest'); - na.mode = 'PFXKDF'; - } else if (name.indexOf('CPKDF') >= 0) { - na = normalize(algorithm.hash, 'digest'); - na.mode = 'CPKDF'; - } else if (name.indexOf('HMAC') >= 0) { - na = normalize(algorithm.hash, 'digest'); - na.mode = 'HMAC'; - } else - throw new NotSupportedError('Algorithm not supported'); + } else if (name.indexOf("PBKDF2") >= 0) { + na = normalize(algorithm.hash, "digest"); + na.mode = "PBKDF2"; + } else if (name.indexOf("PFXKDF") >= 0) { + na = normalize(algorithm.hash, "digest"); + na.mode = "PFXKDF"; + } else if (name.indexOf("CPKDF") >= 0) { + na = normalize(algorithm.hash, "digest"); + na.mode = "CPKDF"; + } else if (name.indexOf("HMAC") >= 0) { + na = normalize(algorithm.hash, "digest"); + na.mode = "HMAC"; + } else throw new NotSupportedError("Algorithm not supported"); // Compile modes modes.forEach(function (mode) { mode = mode.toUpperCase(); if (/^[0-9]+$/.test(mode)) { - if ((['8', '16', '32'].indexOf(mode) >= 0) || (na.length === '128' && mode === '64')) { // Shift bits - if (na.mode === 'ES') - na.shiftBits = parseInt(mode); - else if (na.mode === 'MAC') - na.macLength = parseInt(mode); + if ( + ["8", "16", "32"].indexOf(mode) >= 0 || + (na.length === "128" && mode === "64") + ) { + // Shift bits + if (na.mode === "ES") na.shiftBits = parseInt(mode); + else if (na.mode === "MAC") na.macLength = parseInt(mode); else - throw new NotSupportedError('Algorithm ' + na.name + ' mode ' + mode + ' not supported'); - } else if (['89', '94', '01', '12', '15', '1989', '1994', '2001', '2012', '2015'].indexOf(mode) >= 0) { // GOST Year + throw new NotSupportedError( + "Algorithm " + + na.name + + " mode " + + mode + + " not supported", + ); + } else if ( + [ + "89", + "94", + "01", + "12", + "15", + "1989", + "1994", + "2001", + "2012", + "2015", + ].indexOf(mode) >= 0 + ) { + // GOST Year var version = parseInt(mode); - version = version < 1900 ? (version < 80 ? 2000 + version : 1900 + version) : version; + version = + version < 1900 + ? version < 80 + ? 2000 + version + : 1900 + version + : version; na.version = version; - } else if (['1'].indexOf(mode) >= 0 && na.name === 'SHA') { // SHA-1 + } else if (["1"].indexOf(mode) >= 0 && na.name === "SHA") { + // SHA-1 na.version = 1; na.length = 160; - } else if (['256', '384', '512'].indexOf(mode) >= 0 && na.name === 'SHA') { // SHA-2 + } else if ( + ["256", "384", "512"].indexOf(mode) >= 0 && + na.name === "SHA" + ) { + // SHA-2 na.version = 2; na.length = parseInt(mode); - } else if (['40', '128'].indexOf(mode) >= 0 && na.name === 'RC2') { // RC2 + } else if (["40", "128"].indexOf(mode) >= 0 && na.name === "RC2") { + // RC2 na.version = 1; na.length = parseInt(mode); // key size - } else if (['64', '128', '256', '512'].indexOf(mode) >= 0) // block size + } else if (["64", "128", "256", "512"].indexOf(mode) >= 0) + // block size na.length = parseInt(mode); - else if (['1000', '2000'].indexOf(mode) >= 0) // Iterations + else if (["1000", "2000"].indexOf(mode) >= 0) + // Iterations na.iterations = parseInt(mode); // Named Paramsets - } else if (['E-TEST', 'E-A', 'E-B', 'E-C', 'E-D', 'E-SC', 'E-Z', 'D-TEST', 'D-A', 'D-SC'].indexOf(mode) >= 0) { + } else if ( + [ + "E-TEST", + "E-A", + "E-B", + "E-C", + "E-D", + "E-SC", + "E-Z", + "D-TEST", + "D-A", + "D-SC", + ].indexOf(mode) >= 0 + ) { na.sBox = mode; - } else if (['S-TEST', 'S-A', 'S-B', 'S-C', 'S-D', 'X-A', 'X-B', 'X-C'].indexOf(mode) >= 0) { + } else if ( + ["S-TEST", "S-A", "S-B", "S-C", "S-D", "X-A", "X-B", "X-C"].indexOf( + mode, + ) >= 0 + ) { na.namedParam = mode; - } else if (['S-256-TEST', 'S-256-A', 'S-256-B', 'S-256-C', 'P-256', 'T-512-TEST', 'T-512-A', - 'T-512-B', 'X-256-A', 'X-256-B', 'T-256-TEST', 'T-256-A', 'T-256-B', 'S-256-B', 'T-256-C', 'S-256-C'].indexOf(mode) >= 0) { + } else if ( + [ + "S-256-TEST", + "S-256-A", + "S-256-B", + "S-256-C", + "P-256", + "T-512-TEST", + "T-512-A", + "T-512-B", + "X-256-A", + "X-256-B", + "T-256-TEST", + "T-256-A", + "T-256-B", + "S-256-B", + "T-256-C", + "S-256-C", + ].indexOf(mode) >= 0 + ) { na.namedCurve = mode; - } else if (['SC', 'CP', 'VN'].indexOf(mode) >= 0) { + } else if (["SC", "CP", "VN"].indexOf(mode) >= 0) { na.procreator = mode; // Encription GOST 28147 or GOST R 34.12 - } else if (na.name === 'GOST 28147' || na.name === 'GOST R 34.12' || na.name === 'RC2') { - if (['ES', 'MAC', 'KW', 'MASK'].indexOf(mode) >= 0) { + } else if ( + na.name === "GOST 28147" || + na.name === "GOST R 34.12" || + na.name === "RC2" + ) { + if (["ES", "MAC", "KW", "MASK"].indexOf(mode) >= 0) { na.mode = mode; - } else if (['ECB', 'CFB', 'OFB', 'CTR', 'CBC'].indexOf(mode) >= 0) { - na.mode = 'ES'; + } else if (["ECB", "CFB", "OFB", "CTR", "CBC"].indexOf(mode) >= 0) { + na.mode = "ES"; na.block = mode; - } else if (['CPKW', 'NOKW', 'SCKW'].indexOf(mode) >= 0) { - na.mode = 'KW'; - na.keyWrapping = mode.replace('KW', ''); - } else if (['ZEROPADDING', 'PKCS5PADDING', 'NOPADDING', 'RANDOMPADDING', 'BITPADDING'].indexOf(mode) >= 0) { - na.padding = mode.replace('PADDING', ''); - } else if (['NOKM', 'CPKM'].indexOf(mode) >= 0) { - na.keyMeshing = mode.replace('KM', ''); + } else if (["CPKW", "NOKW", "SCKW"].indexOf(mode) >= 0) { + na.mode = "KW"; + na.keyWrapping = mode.replace("KW", ""); + } else if ( + [ + "ZEROPADDING", + "PKCS5PADDING", + "NOPADDING", + "RANDOMPADDING", + "BITPADDING", + ].indexOf(mode) >= 0 + ) { + na.padding = mode.replace("PADDING", ""); + } else if (["NOKM", "CPKM"].indexOf(mode) >= 0) { + na.keyMeshing = mode.replace("KM", ""); } else - throw new NotSupportedError('Algorithm ' + na.name + ' mode ' + mode + ' not supported'); + throw new NotSupportedError( + "Algorithm " + na.name + " mode " + mode + " not supported", + ); // Digesting GOST 34.11 - } else if (na.name === 'GOST R 34.11' || na.name === 'SHA') { - if (['HASH', 'KDF', 'HMAC', 'PBKDF2', 'PFXKDF', 'CPKDF'].indexOf(mode) >= 0) + } else if (na.name === "GOST R 34.11" || na.name === "SHA") { + if ( + ["HASH", "KDF", "HMAC", "PBKDF2", "PFXKDF", "CPKDF"].indexOf( + mode, + ) >= 0 + ) na.mode = mode; else - throw new NotSupportedError('Algorithm ' + na.name + ' mode ' + mode + ' not supported'); + throw new NotSupportedError( + "Algorithm " + na.name + " mode " + mode + " not supported", + ); // Signing GOST 34.10 - } else if (na.name === 'GOST R 34.10') { - var hash = mode.replace(/[\.\s]/g, ''); - if (hash.indexOf('GOST') >= 0 && hash.indexOf('3411') >= 0) + } else if (na.name === "GOST R 34.10") { + var hash = mode.replace(/[\.\s]/g, ""); + if (hash.indexOf("GOST") >= 0 && hash.indexOf("3411") >= 0) na.hash = mode; - else if (['SIGN', 'DH', 'MASK'].indexOf(mode)) - na.mode = mode; + else if (["SIGN", "DH", "MASK"].indexOf(mode)) na.mode = mode; else - throw new NotSupportedError('Algorithm ' + na.name + ' mode ' + mode + ' not supported'); + throw new NotSupportedError( + "Algorithm " + na.name + " mode " + mode + " not supported", + ); } }); // Procreator - na.procreator = algorithm.procreator || na.procreator || 'CP'; + na.procreator = algorithm.procreator || na.procreator || "CP"; // Key size switch (na.name) { - case 'GOST R 34.10': + case "GOST R 34.10": na.keySize = na.length / (na.version === 1994 ? 4 : 8); break; - case 'GOST R 34.11': + case "GOST R 34.11": na.keySize = 32; break; - case 'GOST 28147': - case 'GOST R 34.12': + case "GOST 28147": + case "GOST R 34.12": na.keySize = 32; break; - case 'RC2': + case "RC2": na.keySize = Math.ceil(na.length / 8); break; - case 'SHA': + case "SHA": na.keySize = na.length / 8; break; } // Encrypt additional modes - if (na.mode === 'ES') { - if (algorithm.block) - na.block = algorithm.block; // ECB, CFB, OFB, CTR, CBC - if (na.block) - na.block = na.block.toUpperCase(); - if (algorithm.padding) - na.padding = algorithm.padding; // NO, ZERO, PKCS5, RANDOM, BIT - if (na.padding) - na.padding = na.padding.toUpperCase(); - if (algorithm.shiftBits) - na.shiftBits = algorithm.shiftBits; // 8, 16, 32, 64 - if (algorithm.keyMeshing) - na.keyMeshing = algorithm.keyMeshing; // NO, CP - if (na.keyMeshing) - na.keyMeshing = na.keyMeshing.toUpperCase(); + if (na.mode === "ES") { + if (algorithm.block) na.block = algorithm.block; // ECB, CFB, OFB, CTR, CBC + if (na.block) na.block = na.block.toUpperCase(); + if (algorithm.padding) na.padding = algorithm.padding; // NO, ZERO, PKCS5, RANDOM, BIT + if (na.padding) na.padding = na.padding.toUpperCase(); + if (algorithm.shiftBits) na.shiftBits = algorithm.shiftBits; // 8, 16, 32, 64 + if (algorithm.keyMeshing) na.keyMeshing = algorithm.keyMeshing; // NO, CP + if (na.keyMeshing) na.keyMeshing = na.keyMeshing.toUpperCase(); // Default values - if (method !== 'importKey' && method !== 'generateKey') { - na.block = na.block || 'ECB'; - na.padding = na.padding || (na.block === 'CBC' || na.block === 'ECB' ? 'ZERO' : 'NO'); - if (na.block === 'CFB' || na.block === 'OFB') + if (method !== "importKey" && method !== "generateKey") { + na.block = na.block || "ECB"; + na.padding = + na.padding || + (na.block === "CBC" || na.block === "ECB" ? "ZERO" : "NO"); + if (na.block === "CFB" || na.block === "OFB") na.shiftBits = na.shiftBits || na.length; - na.keyMeshing = na.keyMeshing || 'NO'; + na.keyMeshing = na.keyMeshing || "NO"; } } - if (na.mode === 'KW') { - if (algorithm.keyWrapping) - na.keyWrapping = algorithm.keyWrapping; // NO, CP, SC - if (na.keyWrapping) - na.keyWrapping = na.keyWrapping.toUpperCase(); - if (method !== 'importKey' && method !== 'generateKey') - na.keyWrapping = na.keyWrapping || 'NO'; + if (na.mode === "KW") { + if (algorithm.keyWrapping) na.keyWrapping = algorithm.keyWrapping; // NO, CP, SC + if (na.keyWrapping) na.keyWrapping = na.keyWrapping.toUpperCase(); + if (method !== "importKey" && method !== "generateKey") + na.keyWrapping = na.keyWrapping || "NO"; } // Paramsets - ['sBox', 'namedParam', 'namedCurve', 'curve', 'param', 'modulusLength'].forEach(function (name) { + [ + "sBox", + "namedParam", + "namedCurve", + "curve", + "param", + "modulusLength", + ].forEach(function (name) { algorithm[name] && (na[name] = algorithm[name]); }); // Default values - if (method !== 'importKey' && method !== 'generateKey') { - if (na.name === 'GOST 28147') { - na.sBox = na.sBox || (na.procreator === 'SC' ? 'E-SC' : 'E-A'); // 'E-A', 'E-B', 'E-C', 'E-D', 'E-SC' - } else if (na.name === 'GOST R 34.12' && na.length === 64) { - na.sBox = 'E-Z'; - } else if (na.name === 'GOST R 34.11' && na.version === 1994) { - na.sBox = na.sBox || (na.procreator === 'SC' ? 'D-SC' : 'D-A'); // 'D-SC' - } else if (na.name === 'GOST R 34.10' && na.version === 1994) { - na.namedParam = na.namedParam || (na.mode === 'DH' ? 'X-A' : 'S-A'); // 'S-B', 'S-C', 'S-D', 'X-B', 'X-C' - } else if (na.name === 'GOST R 34.10' && na.version === 2001) { - na.namedCurve = na.namedCurve || (na.length === 256 ? - na.procreator === 'SC' ? 'P-256' : (na.mode === 'DH' ? 'X-256-A' : 'S-256-A') : // 'S-256-B', 'S-256-C', 'X-256-B', 'T-256-A', 'T-256-B', 'T-256-C', 'P-256' - na.mode === 'T-512-A'); // 'T-512-B', 'T-512-C' - } else if (na.name === 'GOST R 34.10' && na.version === 2012) { - na.namedCurve = na.namedCurve || (na.length === 256 ? - na.procreator === 'SC' ? 'P-256' : (na.mode === 'DH' ? 'X-256-A' : 'S-256-A') : // 'S-256-B', 'S-256-C', 'X-256-B', 'T-256-A', 'T-256-B', 'T-256-C', 'P-256' - na.mode === 'T-512-A'); // 'T-512-B', 'T-512-C' + if (method !== "importKey" && method !== "generateKey") { + if (na.name === "GOST 28147") { + na.sBox = na.sBox || (na.procreator === "SC" ? "E-SC" : "E-A"); // 'E-A', 'E-B', 'E-C', 'E-D', 'E-SC' + } else if (na.name === "GOST R 34.12" && na.length === 64) { + na.sBox = "E-Z"; + } else if (na.name === "GOST R 34.11" && na.version === 1994) { + na.sBox = na.sBox || (na.procreator === "SC" ? "D-SC" : "D-A"); // 'D-SC' + } else if (na.name === "GOST R 34.10" && na.version === 1994) { + na.namedParam = na.namedParam || (na.mode === "DH" ? "X-A" : "S-A"); // 'S-B', 'S-C', 'S-D', 'X-B', 'X-C' + } else if (na.name === "GOST R 34.10" && na.version === 2001) { + na.namedCurve = + na.namedCurve || + (na.length === 256 + ? na.procreator === "SC" + ? "P-256" + : na.mode === "DH" + ? "X-256-A" + : "S-256-A" + : // 'S-256-B', 'S-256-C', 'X-256-B', 'T-256-A', 'T-256-B', 'T-256-C', 'P-256' + na.mode === "T-512-A"); // 'T-512-B', 'T-512-C' + } else if (na.name === "GOST R 34.10" && na.version === 2012) { + na.namedCurve = + na.namedCurve || + (na.length === 256 + ? na.procreator === "SC" + ? "P-256" + : na.mode === "DH" + ? "X-256-A" + : "S-256-A" + : // 'S-256-B', 'S-256-C', 'X-256-B', 'T-256-A', 'T-256-B', 'T-256-C', 'P-256' + na.mode === "T-512-A"); // 'T-512-B', 'T-512-C' } } // Vectors switch (na.mode) { - case 'DH': + case "DH": algorithm.ukm && (na.ukm = algorithm.ukm); - algorithm['public'] && (na['public'] = algorithm['public']); + algorithm["public"] && (na["public"] = algorithm["public"]); break; - case 'SIGN': - case 'KW': + case "SIGN": + case "KW": algorithm.ukm && (na.ukm = algorithm.ukm); break; - case 'ES': - case 'MAC': + case "ES": + case "MAC": algorithm.iv && (na.iv = algorithm.iv); break; - case 'KDF': + case "KDF": algorithm.label && (na.label = algorithm.label); algorithm.contex && (na.context = algorithm.contex); break; - case 'PBKDF2': + case "PBKDF2": algorithm.salt && (na.salt = algorithm.salt); algorithm.iterations && (na.iterations = algorithm.iterations); algorithm.diversifier && (na.diversifier = algorithm.diversifier); break; - case 'PFXKDF': + case "PFXKDF": algorithm.salt && (na.salt = algorithm.salt); algorithm.iterations && (na.iterations = algorithm.iterations); algorithm.diversifier && (na.diversifier = algorithm.diversifier); break; - case 'CPKDF': + case "CPKDF": algorithm.salt && (na.salt = algorithm.salt); algorithm.iterations && (na.iterations = algorithm.iterations); break; } // Verification method and modes - if (method && ( - ((na.mode !== 'ES' && na.mode !== 'SIGN' && na.mode !== 'MAC' && - na.mode !== 'HMAC' && na.mode !== 'KW' && na.mode !== 'DH' - && na.mode !== 'MASK') && - (method === 'generateKey')) || - ((na.mode !== 'ES') && - (method === 'encrypt' || method === 'decrypt')) || - ((na.mode !== 'SIGN' && na.mode !== 'MAC' && na.mode !== 'HMAC') && - (method === 'sign' || method === 'verify')) || - ((na.mode !== 'HASH') && - (method === 'digest')) || - ((na.mode !== 'KW' && na.mode !== 'MASK') && - (method === 'wrapKey' || method === 'unwrapKey')) || - ((na.mode !== 'DH' && na.mode !== 'PBKDF2' && na.mode !== 'PFXKDF' && - na.mode !== 'CPKDF' && na.mode !== 'KDF') && - (method === 'deriveKey' || method === 'deriveBits')))) - throw new NotSupportedError('Algorithm mode ' + na.mode + ' not valid for method ' + method); + if ( + method && + ((na.mode !== "ES" && + na.mode !== "SIGN" && + na.mode !== "MAC" && + na.mode !== "HMAC" && + na.mode !== "KW" && + na.mode !== "DH" && + na.mode !== "MASK" && + method === "generateKey") || + (na.mode !== "ES" && + (method === "encrypt" || method === "decrypt")) || + (na.mode !== "SIGN" && + na.mode !== "MAC" && + na.mode !== "HMAC" && + (method === "sign" || method === "verify")) || + (na.mode !== "HASH" && method === "digest") || + (na.mode !== "KW" && + na.mode !== "MASK" && + (method === "wrapKey" || method === "unwrapKey")) || + (na.mode !== "DH" && + na.mode !== "PBKDF2" && + na.mode !== "PFXKDF" && + na.mode !== "CPKDF" && + na.mode !== "KDF" && + (method === "deriveKey" || method === "deriveBits"))) + ) + throw new NotSupportedError( + "Algorithm mode " + na.mode + " not valid for method " + method, + ); // Normalize hash algorithm algorithm.hash && (na.hash = algorithm.hash); if (na.hash) { - if ((typeof na.hash === 'string' || na.hash instanceof String) - && na.procreator) - na.hash = na.hash + '/' + na.procreator; - na.hash = normalize(na.hash, 'digest'); + if ( + (typeof na.hash === "string" || na.hash instanceof String) && + na.procreator + ) + na.hash = na.hash + "/" + na.procreator; + na.hash = normalize(na.hash, "digest"); } // Algorithm object identirifer @@ -362,77 +510,97 @@ function normalize(algorithm, method) { // Check for possibility use native crypto.subtle function checkNative(algorithm) { - if (!rootCrypto || !rootCrypto.subtle || !algorithm) - return false; + if (!rootCrypto || !rootCrypto.subtle || !algorithm) return false; // Prepare name - var name = (typeof algorithm === 'string' || algorithm instanceof String) ? - name = algorithm : algorithm.name; - if (!name) - return false; + var name = + typeof algorithm === "string" || algorithm instanceof String + ? (name = algorithm) + : algorithm.name; + if (!name) return false; name = name.toUpperCase(); // Digest algorithm for key derivation - if ((name.indexOf('KDF') >= 0 || name.indexOf('HMAC') >= 0) && algorithm.hash) + if ( + (name.indexOf("KDF") >= 0 || name.indexOf("HMAC") >= 0) && + algorithm.hash + ) return checkNative(algorithm.hash); // True if no supported names - return name.indexOf('GOST') === -1 && - name.indexOf('SHA-1') === -1 && - name.indexOf('RC2') === -1 && - name.indexOf('?DES') === -1; + return ( + name.indexOf("GOST") === -1 && + name.indexOf("SHA-1") === -1 && + name.indexOf("RC2") === -1 && + name.indexOf("?DES") === -1 + ); } // /* - * Key conversion methods - * - */ // + * Key conversion methods + * + */ // // Check key parameter function checkKey(key, method) { - if (!key.algorithm) - throw new SyntaxError('Key algorithm not defined'); + if (!key.algorithm) throw new SyntaxError("Key algorithm not defined"); if (!key.algorithm.name) - throw new SyntaxError('Key algorithm name not defined'); + throw new SyntaxError("Key algorithm name not defined"); var name = key.algorithm.name, - gostCipher = name === 'GOST 28147' || name === 'GOST R 34.12' || name === 'RC2', - gostDigest = name === 'GOST R 34.11' || name === 'SHA', - gostSign = name === 'GOST R 34.10'; + gostCipher = + name === "GOST 28147" || name === "GOST R 34.12" || name === "RC2", + gostDigest = name === "GOST R 34.11" || name === "SHA", + gostSign = name === "GOST R 34.10"; if (!gostCipher && !gostSign && !gostDigest) - throw new NotSupportedError('Key algorithm ' + name + ' is unsupproted'); + throw new NotSupportedError( + "Key algorithm " + name + " is unsupproted", + ); - if (!key.type) - throw new SyntaxError('Key type not defined'); + if (!key.type) throw new SyntaxError("Key type not defined"); - if (((gostCipher || gostDigest) && key.type !== 'secret') || - (gostSign && !(key.type === 'public' || key.type === 'private'))) - throw new DataError('Key type ' + key.type + ' is not valid for algorithm ' + name); + if ( + ((gostCipher || gostDigest) && key.type !== "secret") || + (gostSign && !(key.type === "public" || key.type === "private")) + ) + throw new DataError( + "Key type " + key.type + " is not valid for algorithm " + name, + ); if (!key.usages || !key.usages.indexOf) - throw new SyntaxError('Key usages not defined'); + throw new SyntaxError("Key usages not defined"); for (var i = 0, n = key.usages.length; i < n; i++) { var md = key.usages[i]; - if (((md === 'encrypt' || md === 'decrypt') && key.type !== 'secret') || - (md === 'sign' && key.type === 'public') || - (md === 'verify' && key.type === 'private')) - throw new InvalidStateError('Key type ' + key.type + ' is not valid for ' + md); + if ( + ((md === "encrypt" || md === "decrypt") && key.type !== "secret") || + (md === "sign" && key.type === "public") || + (md === "verify" && key.type === "private") + ) + throw new InvalidStateError( + "Key type " + key.type + " is not valid for " + md, + ); } if (method) if (key.usages.indexOf(method) === -1) - throw new InvalidAccessError('Key usages is not contain method ' + method); + throw new InvalidAccessError( + "Key usages is not contain method " + method, + ); - if (!key.buffer) - throw new SyntaxError('Key buffer is not defined'); + if (!key.buffer) throw new SyntaxError("Key buffer is not defined"); - var size = key.buffer.byteLength * 8, keySize = 8 * key.algorithm.keySize; - if ((key.type === 'secret' && size !== (keySize || 256) && - (key.usages.indexOf('encrypt') >= 0 || key.usages.indexOf('decrypt') >= 0)) || - (key.type === 'private' && !(size === 256 || size === 512)) || - (key.type === 'public' && !(size === 512 || size === 1024))) - throw new SyntaxError('Key buffer has wrong size ' + size + ' bit'); + var size = key.buffer.byteLength * 8, + keySize = 8 * key.algorithm.keySize; + if ( + (key.type === "secret" && + size !== (keySize || 256) && + (key.usages.indexOf("encrypt") >= 0 || + key.usages.indexOf("decrypt") >= 0)) || + (key.type === "private" && !(size === 256 || size === 512)) || + (key.type === "public" && !(size === 512 || size === 1024)) + ) + throw new SyntaxError("Key buffer has wrong size " + size + " bit"); } // Extract key and enrich cipher algorithm @@ -441,32 +609,47 @@ function extractKey(method, algorithm, key) { if (algorithm) { var params; switch (algorithm.mode) { - case 'ES': - params = ['sBox', 'keyMeshing', 'padding', 'block']; + case "ES": + params = ["sBox", "keyMeshing", "padding", "block"]; break; - case 'SIGN': - params = ['namedCurve', 'namedParam', 'sBox', 'curve', 'param', 'modulusLength']; + case "SIGN": + params = [ + "namedCurve", + "namedParam", + "sBox", + "curve", + "param", + "modulusLength", + ]; break; - case 'MAC': - params = ['sBox']; + case "MAC": + params = ["sBox"]; break; - case 'KW': - params = ['keyWrapping', 'ukm']; + case "KW": + params = ["keyWrapping", "ukm"]; break; - case 'DH': - params = ['namedCurve', 'namedParam', 'sBox', 'ukm', 'curve', 'param', 'modulusLength']; + case "DH": + params = [ + "namedCurve", + "namedParam", + "sBox", + "ukm", + "curve", + "param", + "modulusLength", + ]; break; - case 'KDF': - params = ['context', 'label']; + case "KDF": + params = ["context", "label"]; break; - case 'PBKDF2': - params = ['sBox', 'iterations', 'salt']; + case "PBKDF2": + params = ["sBox", "iterations", "salt"]; break; - case 'PFXKDF': - params = ['sBox', 'iterations', 'salt', 'diversifier']; + case "PFXKDF": + params = ["sBox", "iterations", "salt", "diversifier"]; break; - case 'CPKDF': - params = ['sBox', 'salt']; + case "CPKDF": + params = ["sBox", "salt"]; break; } if (params) @@ -480,41 +663,59 @@ function extractKey(method, algorithm, key) { // Make key definition function convertKey(algorithm, extractable, keyUsages, keyData, keyType) { var key = { - type: keyType || (algorithm.name === 'GOST R 34.10' ? 'private' : 'secret'), - extractable: extractable || 'false', + type: + keyType || + (algorithm.name === "GOST R 34.10" ? "private" : "secret"), + extractable: extractable || "false", algorithm: algorithm, usages: keyUsages || [], - buffer: keyData + buffer: keyData, }; checkKey(key); return key; } -function convertKeyPair(publicAlgorithm, privateAlgorithm, extractable, keyUsages, publicBuffer, privateBuffer) { - +function convertKeyPair( + publicAlgorithm, + privateAlgorithm, + extractable, + keyUsages, + publicBuffer, + privateBuffer, +) { if (!keyUsages || !keyUsages.indexOf) - throw new SyntaxError('Key usages not defined'); + throw new SyntaxError("Key usages not defined"); var publicUsages = keyUsages.filter(function (value) { - return value !== 'sign'; + return value !== "sign"; }); var privateUsages = keyUsages.filter(function (value) { - return value !== 'verify'; + return value !== "verify"; }); return { - publicKey: convertKey(publicAlgorithm, extractable, publicUsages, publicBuffer, 'public'), - privateKey: convertKey(privateAlgorithm, extractable, privateUsages, privateBuffer, 'private') + publicKey: convertKey( + publicAlgorithm, + extractable, + publicUsages, + publicBuffer, + "public", + ), + privateKey: convertKey( + privateAlgorithm, + extractable, + privateUsages, + privateBuffer, + "private", + ), }; } // Swap bytes in buffer function swapBytes(src) { - if (src instanceof CryptoOperationData) - src = new Uint8Array(src); + if (src instanceof CryptoOperationData) src = new Uint8Array(src); var dst = new Uint8Array(src.length); - for (var i = 0, n = src.length; i < n; i++) - dst[n - i - 1] = src[i]; + for (var i = 0, n = src.length; i < n; i++) dst[n - i - 1] = src[i]; return dst.buffer; } // @@ -537,9 +738,7 @@ function swapBytes(src) { * We can call these functions, once our operation is completed. */ // if (!Promise) { - root.Promise = (function () { - function mswrap(value) { if (value && value.oncomplete === null && value.onerror === null) { return new Promise(function (resolve, reject) { @@ -550,39 +749,41 @@ if (!Promise) { reject(new OperationError(value.toString())); }; }); - } else - return value; + } else return value; } function Promise(executor) { - - var state = 'pending', result, - resolveQueue = [], rejectQueue = []; + var state = "pending", + result, + resolveQueue = [], + rejectQueue = []; function call(callback) { try { callback(); - } catch (e) { - } + } catch (e) {} } try { - executor(function (value) { - if (state === 'pending') { - state = 'fulfilled'; - result = value; - resolveQueue.forEach(call); - } - }, function (reason) { - if (state === 'pending') { - state = 'rejected'; - result = reason; - rejectQueue.forEach(call); - } - }); + executor( + function (value) { + if (state === "pending") { + state = "fulfilled"; + result = value; + resolveQueue.forEach(call); + } + }, + function (reason) { + if (state === "pending") { + state = "rejected"; + result = reason; + rejectQueue.forEach(call); + } + }, + ); } catch (error) { - if (state === 'pending') { - state = 'rejected'; + if (state === "pending") { + state = "rejected"; result = error; rejectQueue.forEach(call); } @@ -599,9 +800,7 @@ if (!Promise) { * @returns {Promise} */ this.then = function (onFulfilled, onRejected) { - return new Promise(function (resolve, reject) { - function asyncOnFulfilled() { var value; try { @@ -634,17 +833,15 @@ if (!Promise) { } } - if (state === 'fulfilled') { + if (state === "fulfilled") { asyncOnFulfilled(); - } else if (state === 'rejected') { + } else if (state === "rejected") { asyncOnRejected(); } else { resolveQueue.push(asyncOnFulfilled); rejectQueue.push(asyncOnRejected); } - }); - }; /** * The catch() method returns a Promise and deals with rejected cases only. @@ -656,7 +853,7 @@ if (!Promise) { * @param {function} onRejected A Function called when the Promise is rejected. This function has one argument, the rejection reason. * @returns {Promise} */ - this['catch'] = function (onRejected) { + this["catch"] = function (onRejected) { return this.then(undefined, onRejected); }; } @@ -679,20 +876,19 @@ if (!Promise) { */ Promise.all = function (promises) { return new Promise(function (resolve, reject) { - var result = [], count = 0; + var result = [], + count = 0; function asyncResolve(k) { count++; return function (data) { result[k] = data; count--; - if (count === 0) - resolve(result); + if (count === 0) resolve(result); }; } function asyncReject(reason) { - if (count > 0) - reject(reason); + if (count > 0) reject(reason); count = 0; } @@ -700,12 +896,10 @@ if (!Promise) { var data = promises[i]; if (data?.then?.call) data.then(asyncResolve(i), asyncReject); - else - result[i] = data; + else result[i] = data; } - if (count === 0) - resolve(result); + if (count === 0) resolve(result); }); }; @@ -714,18 +908,19 @@ if (!Promise) { } // /* - * Worker executor - * - */ // + * Worker executor + * + */ // -var baseUrl = '', nameSuffix = ''; +var baseUrl = "", + nameSuffix = ""; // Try to define from DOM model -if (typeof document !== 'undefined') { +if (typeof document !== "undefined") { (function () { var regs = /^(.*)gostCrypto(.*)\.js$/i; - var list = document.querySelectorAll('script'); + var list = document.querySelectorAll("script"); for (var i = 0, n = list.length; i < n; i++) { - var value = list[i].getAttribute('src'); + var value = list[i].getAttribute("src"); var test = regs.exec(value); if (test) { baseUrl = test[1]; @@ -738,41 +933,40 @@ if (typeof document !== 'undefined') { // Local importScripts procedure for include dependens function importScripts() { for (var i = 0, n = arguments.length; i < n; i++) { - var name = arguments[i].split('.'), - src = baseUrl + name[0] + nameSuffix + '.' + name[1]; + var name = arguments[i].split("."), + src = baseUrl + name[0] + nameSuffix + "." + name[1]; var el = document.querySelector('script[src="' + src + '"]'); if (!el) { - el = document.createElement('script'); - el.setAttribute('src', src); + el = document.createElement("script"); + el.setAttribute("src", src); document.head.appendChild(el); } } } // Create Worker -var worker = false, tasks = [], sequence = 0; +var worker = false, + tasks = [], + sequence = 0; // Worker will create only for first child process and // Gost implementation libraries not yet loaded if (!root.importScripts && !root.gostEngine) { - try { - worker = new Worker(baseUrl + 'gostEngine' + nameSuffix + '.js'); + worker = new Worker(baseUrl + "gostEngine" + nameSuffix + ".js"); // Result of opertion worker.onmessage = function (event) { // Find task var id = event.data.id; for (var i = 0, n = tasks.length; i < n; i++) - if (tasks[i].id === id) - break; + if (tasks[i].id === id) break; if (i < n) { var task = tasks[i]; tasks.splice(i, 1); // Reject if error or resolve with result if (event.data.error) task.reject(new OperationError(event.data.error)); - else - task.resolve(event.data.result); + else task.resolve(event.data.result); } }; @@ -782,7 +976,6 @@ if (!root.importScripts && !root.gostEngine) { tasks[i].reject(event.error); tasks = []; }; - } catch (e) { // Worker is't supported worker = false; @@ -792,14 +985,13 @@ if (!root.importScripts && !root.gostEngine) { if (!root.importScripts) { // This procedure emulate load dependents as in Worker root.importScripts = importScripts; - } if (!worker) { // Import main module // Reason: we are already in worker process or Worker interface is not // yet supported - root.gostEngine || require('./gostEngine'); + root.gostEngine || require("./gostEngine"); } // Executor for any method @@ -811,17 +1003,18 @@ function execute(algorithm, method, args) { tasks.push({ id: id, resolve: resolve, - reject: reject + reject: reject, }); worker.postMessage({ - id: id, algorithm: algorithm, - method: method, args: args + id: id, + algorithm: algorithm, + method: method, + args: args, }); } else { if (root.gostEngine) resolve(root.gostEngine.execute(algorithm, method, args)); - else - reject(new OperationError('Module gostEngine not found')); + else reject(new OperationError("Module gostEngine not found")); } } catch (error) { reject(error); @@ -833,16 +1026,15 @@ function execute(algorithm, method, args) { function call(callback) { try { callback(); - } catch (e) { - } + } catch (e) {} } // /* - * WebCrypto common class references - * - */ // + * WebCrypto common class references + * + */ // /** * The Algorithm object is a dictionary object [WebIDL] which is used to * specify an algorithm and any additional parameters required to fully @@ -995,8 +1187,7 @@ var gostCrypto = {}; * * @class SubtleCrypto */ // -function SubtleCrypto() { -} +function SubtleCrypto() {} /** * The encrypt method returns a new Promise object that will encrypt data @@ -1026,15 +1217,17 @@ function SubtleCrypto() { * @param {CryptoOperationData} data Operation data * @returns {Promise} Promise that resolves with {@link CryptoOperationData} */ -SubtleCrypto.prototype.encrypt = function (algorithm, key, data) // -{ +SubtleCrypto.prototype.encrypt = function (algorithm, key, data) { + // return new Promise(call).then(function () { if (checkNative(algorithm)) return rootCrypto.subtle.encrypt(algorithm, key, data); - algorithm = normalize(algorithm, 'encrypt'); - return execute(algorithm, 'encrypt', - [extractKey('encrypt', algorithm, key), data]); + algorithm = normalize(algorithm, "encrypt"); + return execute(algorithm, "encrypt", [ + extractKey("encrypt", algorithm, key), + data, + ]); }); }; // @@ -1066,15 +1259,17 @@ SubtleCrypto.prototype.encrypt = function (algorithm, key, data) // -{ +SubtleCrypto.prototype.decrypt = function (algorithm, key, data) { + // return new Promise(call).then(function () { if (checkNative(algorithm)) return rootCrypto.subtle.decrypt(algorithm, key, data); - algorithm = normalize(algorithm, 'decrypt'); - return execute(algorithm, 'decrypt', - [extractKey('decrypt', algorithm, key), data]); + algorithm = normalize(algorithm, "decrypt"); + return execute(algorithm, "decrypt", [ + extractKey("decrypt", algorithm, key), + data, + ]); }); }; // @@ -1105,16 +1300,18 @@ SubtleCrypto.prototype.decrypt = function (algorithm, key, data) // -{ +SubtleCrypto.prototype.sign = function (algorithm, key, data) { + // return new Promise(call).then(function () { if (checkNative(algorithm)) return rootCrypto.subtle.sign(algorithm, key, data); - algorithm = normalize(algorithm, 'sign'); - var value = execute(algorithm, 'sign', - [extractKey('sign', algorithm, key), data]).then(function (data) { - if (algorithm.procreator === 'SC' && algorithm.mode === 'SIGN') { + algorithm = normalize(algorithm, "sign"); + var value = execute(algorithm, "sign", [ + extractKey("sign", algorithm, key), + data, + ]).then(function (data) { + if (algorithm.procreator === "SC" && algorithm.mode === "SIGN") { data = gostCrypto.asn1.GostSignature.encode(data); } return data; @@ -1151,19 +1348,22 @@ SubtleCrypto.prototype.sign = function (algorithm, key, data) // -{ +SubtleCrypto.prototype.verify = function (algorithm, key, signature, data) { + // return new Promise(call).then(function () { if (checkNative(algorithm)) return rootCrypto.subtle.verify(algorithm, key, signature, data); - algorithm = normalize(algorithm, 'verify'); - if (algorithm.procreator === 'SC' && algorithm.mode === 'SIGN') { + algorithm = normalize(algorithm, "verify"); + if (algorithm.procreator === "SC" && algorithm.mode === "SIGN") { var obj = gostCrypto.asn1.GostSignature.decode(signature); - signature = {r: obj.r, s: obj.s}; + signature = { r: obj.r, s: obj.s }; } - return execute(algorithm, 'verify', - [extractKey('verify', algorithm, key), signature, data]); + return execute(algorithm, "verify", [ + extractKey("verify", algorithm, key), + signature, + data, + ]); }); }; // @@ -1187,14 +1387,14 @@ SubtleCrypto.prototype.verify = function (algorithm, key, signature, data) // -{ +SubtleCrypto.prototype.digest = function (algorithm, data) { + // return new Promise(call).then(function () { if (checkNative(algorithm)) return rootCrypto.subtle.digest(algorithm, data); - algorithm = normalize(algorithm, 'digest'); - return execute(algorithm, 'digest', [data]); + algorithm = normalize(algorithm, "digest"); + return execute(algorithm, "digest", [data]); }); }; // @@ -1225,28 +1425,40 @@ SubtleCrypto.prototype.digest = function (algorithm, data) // -{ +SubtleCrypto.prototype.generateKey = function ( + algorithm, + extractable, + keyUsages, +) { + // return new Promise(call).then(function () { if (checkNative(algorithm)) - return rootCrypto.subtle.generateKey(algorithm, extractable, keyUsages); + return rootCrypto.subtle.generateKey( + algorithm, + extractable, + keyUsages, + ); var privateAlgorithm = algorithm.privateKey, - publicAlgorithm = algorithm.publicKey; - algorithm = normalize(algorithm, 'generateKey'); + publicAlgorithm = algorithm.publicKey; + algorithm = normalize(algorithm, "generateKey"); if (privateAlgorithm) - privateAlgorithm = normalize(privateAlgorithm, 'generateKey'); - else - privateAlgorithm = algorithm; + privateAlgorithm = normalize(privateAlgorithm, "generateKey"); + else privateAlgorithm = algorithm; if (publicAlgorithm) - publicAlgorithm = normalize(publicAlgorithm, 'generateKey'); - else - publicAlgorithm = algorithm; - return execute(algorithm, 'generateKey', []).then(function (data) { + publicAlgorithm = normalize(publicAlgorithm, "generateKey"); + else publicAlgorithm = algorithm; + return execute(algorithm, "generateKey", []).then(function (data) { if (data.publicKey && data.privateKey) - return convertKeyPair(publicAlgorithm, privateAlgorithm, extractable, keyUsages, data.publicKey, data.privateKey); - else - return convertKey(algorithm, extractable, keyUsages, data); + return convertKeyPair( + publicAlgorithm, + privateAlgorithm, + extractable, + keyUsages, + data.publicKey, + data.privateKey, + ); + else return convertKey(algorithm, extractable, keyUsages, data); }); }); }; // @@ -1280,22 +1492,40 @@ SubtleCrypto.prototype.generateKey = function (algorithm, extractable, keyUsages * @param {KeyUsages} keyUsages Key usage array: type of operation that may be performed using a key * @returns {Promise} Promise that resolves with {@link Key} */ -SubtleCrypto.prototype.deriveKey = function (algorithm, baseKey, - derivedKeyType, extractable, keyUsages) // -{ +SubtleCrypto.prototype.deriveKey = function ( + algorithm, + baseKey, + derivedKeyType, + extractable, + keyUsages, +) { + // return new Promise(call).then(function () { if (checkNative(algorithm)) - return rootCrypto.subtle.deriveKey(algorithm, baseKey, - derivedKeyType, extractable, keyUsages); + return rootCrypto.subtle.deriveKey( + algorithm, + baseKey, + derivedKeyType, + extractable, + keyUsages, + ); - algorithm = normalize(algorithm, 'deriveKey'); - derivedKeyType = normalize(derivedKeyType, 'generateKey'); + algorithm = normalize(algorithm, "deriveKey"); + derivedKeyType = normalize(derivedKeyType, "generateKey"); algorithm.keySize = derivedKeyType.keySize; - if (algorithm['public']) { - algorithm['public'].algorithm = normalize(algorithm['public'].algorithm); - algorithm['public'] = extractKey('deriveKey', algorithm, algorithm['public']); + if (algorithm["public"]) { + algorithm["public"].algorithm = normalize( + algorithm["public"].algorithm, + ); + algorithm["public"] = extractKey( + "deriveKey", + algorithm, + algorithm["public"], + ); } - return execute(algorithm, 'deriveKey', [extractKey('deriveKey', algorithm, baseKey)]).then(function (data) { + return execute(algorithm, "deriveKey", [ + extractKey("deriveKey", algorithm, baseKey), + ]).then(function (data) { return convertKey(derivedKeyType, extractable, keyUsages, data); }); }); @@ -1326,16 +1556,23 @@ SubtleCrypto.prototype.deriveKey = function (algorithm, baseKey, * @param {number} length Length bits * @returns {Promise} Promise that resolves with {@link CryptoOperationData} */ -SubtleCrypto.prototype.deriveBits = function (algorithm, baseKey, length) // -{ +SubtleCrypto.prototype.deriveBits = function (algorithm, baseKey, length) { + // return new Promise(call).then(function () { if (checkNative(algorithm)) return rootCrypto.subtle.deriveBits(algorithm, baseKey, length); - algorithm = normalize(algorithm, 'deriveBits'); - if (algorithm['public']) - algorithm['public'] = extractKey('deriveBits', algorithm, algorithm['public']); - return execute(algorithm, 'deriveBits', [extractKey('deriveBits', algorithm, baseKey), length]); + algorithm = normalize(algorithm, "deriveBits"); + if (algorithm["public"]) + algorithm["public"] = extractKey( + "deriveBits", + algorithm, + algorithm["public"], + ); + return execute(algorithm, "deriveBits", [ + extractKey("deriveBits", algorithm, baseKey), + length, + ]); }); }; // @@ -1375,74 +1612,105 @@ SubtleCrypto.prototype.deriveBits = function (algorithm, baseKey, length) // -{ +SubtleCrypto.prototype.importKey = function ( + format, + keyData, + algorithm, + extractable, + keyUsages, +) { + // var type; - return new Promise(call).then(function () { - if (checkNative(algorithm)) - return rootCrypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages); + return new Promise(call) + .then(function () { + if (checkNative(algorithm)) + return rootCrypto.subtle.importKey( + format, + keyData, + algorithm, + extractable, + keyUsages, + ); - if (format === 'raw') { - algorithm = normalize(algorithm, 'importKey'); - if (keyUsages && keyUsages.indexOf) { - var name = algorithm.name.toUpperCase().replace(/[\.\s]/g, ''); - if (name.indexOf('3410') >= 0 && keyUsages.indexOf('sign') >= 0) - type = 'private'; - else if (name.indexOf('3410') >= 0 && keyUsages.indexOf('verify') >= 0) - type = 'public'; - } - return keyData; - } else { - var key; - if (format === 'pkcs8') - key = gostCrypto.asn1.GostPrivateKeyInfo.decode(keyData).object; - else if (format === 'spki') - key = gostCrypto.asn1.GostSubjectPublicKeyInfo.decode(keyData).object; - else - throw new NotSupportedError('Key format not supported'); + if (format === "raw") { + algorithm = normalize(algorithm, "importKey"); + if (keyUsages && keyUsages.indexOf) { + var name = algorithm.name + .toUpperCase() + .replace(/[\.\s]/g, ""); + if ( + name.indexOf("3410") >= 0 && + keyUsages.indexOf("sign") >= 0 + ) + type = "private"; + else if ( + name.indexOf("3410") >= 0 && + keyUsages.indexOf("verify") >= 0 + ) + type = "public"; + } + return keyData; + } else { + var key; + if (format === "pkcs8") + key = + gostCrypto.asn1.GostPrivateKeyInfo.decode( + keyData, + ).object; + else if (format === "spki") + key = + gostCrypto.asn1.GostSubjectPublicKeyInfo.decode( + keyData, + ).object; + else throw new NotSupportedError("Key format not supported"); - algorithm = normalize(key.algorithm, 'importKey'); - type = key.type; - if (extractable !== false) - extractable = extractable || key.extractable; - if (keyUsages) { - for (var i = 0; i < keyUsages.length; i++) { - if (key.usages.indexOf(keyUsages[i]) < 0) - throw DataError('Key usage not valid for this key'); + algorithm = normalize(key.algorithm, "importKey"); + type = key.type; + if (extractable !== false) + extractable = extractable || key.extractable; + if (keyUsages) { + for (var i = 0; i < keyUsages.length; i++) { + if (key.usages.indexOf(keyUsages[i]) < 0) + throw DataError("Key usage not valid for this key"); + } + } else keyUsages = key.usages; + var data = key.buffer, + keySize = algorithm.keySize, + dataLen = data.byteLength; + if (type === "public" || keySize === dataLen) return data; + else { + // Remove private key masks + if (dataLen % keySize > 0) + throw new DataError("Invalid key size"); + algorithm.mode = "MASK"; + algorithm.procreator = "VN"; + var chain = []; + for (var i = keySize; i < dataLen; i += keySize) { + chain.push( + (function (mask) { + return function (data) { + return execute(algorithm, "unwrapKey", [ + mask, + data, + ]).then(function (data) { + var next = chain.pop(); + if (next) return next(data); + else { + delete algorithm.mode; + return data; + } + }); + }; + })(new Uint8Array(data, i, keySize)), + ); + } + return chain.pop()(new Uint8Array(data, 0, keySize)); } - } else - keyUsages = key.usages; - var data = key.buffer, keySize = algorithm.keySize, dataLen = data.byteLength; - if (type === 'public' || keySize === dataLen) - return data; - else { - // Remove private key masks - if (dataLen % keySize > 0) - throw new DataError('Invalid key size'); - algorithm.mode = 'MASK'; - algorithm.procreator = 'VN'; - var chain = []; - for (var i = keySize; i < dataLen; i += keySize) { - chain.push((function (mask) { - return function (data) { - return execute(algorithm, 'unwrapKey', [mask, data]).then(function (data) { - var next = chain.pop(); - if (next) - return next(data); - else { - delete algorithm.mode; - return data; - } - }); - }; - })(new Uint8Array(data, i, keySize))); - } - return chain.pop()(new Uint8Array(data, 0, keySize)); } - } - }).then(function (data) { - return convertKey(algorithm, extractable, keyUsages, data, type); - }); + }) + .then(function (data) { + return convertKey(algorithm, extractable, keyUsages, data, type); + }); }; // /** @@ -1480,44 +1748,52 @@ SubtleCrypto.prototype.importKey = function (format, keyData, algorithm, extract * @param {Key} key Key object * @returns {Promise} Promise that resolves with {@link CryptoOperationData} */ -SubtleCrypto.prototype.exportKey = function (format, key) // -{ +SubtleCrypto.prototype.exportKey = function (format, key) { + // return new Promise(call).then(function () { if (key && checkNative(key.algorithm)) return rootCrypto.subtle.exportKey(format, key); if (!key.extractable) - throw new InvalidAccessError('Key not extractable'); + throw new InvalidAccessError("Key not extractable"); var raw = extractKey(null, null, key); - if (format === 'raw') - return raw; - else if (format === 'pkcs8' && key?.algorithm?.id) { - if (key.algorithm.procreator === 'VN') { + if (format === "raw") return raw; + else if (format === "pkcs8" && key?.algorithm?.id) { + if (key.algorithm.procreator === "VN") { // Add masks for ViPNet - var algorithm = key.algorithm, mask; - algorithm.mode = 'MASK'; - return execute(algorithm, 'generateKey').then(function (data) { - mask = data; - return execute(algorithm, 'wrapKey', [mask, key.buffer]); - }).then(function (data) { - delete algorithm.mode; - var d = new Uint8Array(data.byteLength + mask.byteLength); - d.set(new Uint8Array(data, 0, data.byteLength)); - d.set(new Uint8Array(mask, 0, mask.byteLength), data.byteLength); - var buffer = d.buffer; - buffer.enclosed = true; - return gostCrypto.asn1.GostPrivateKeyInfo.encode({ - algorithm: algorithm, - buffer: buffer + var algorithm = key.algorithm, + mask; + algorithm.mode = "MASK"; + return execute(algorithm, "generateKey") + .then(function (data) { + mask = data; + return execute(algorithm, "wrapKey", [ + mask, + key.buffer, + ]); + }) + .then(function (data) { + delete algorithm.mode; + var d = new Uint8Array( + data.byteLength + mask.byteLength, + ); + d.set(new Uint8Array(data, 0, data.byteLength)); + d.set( + new Uint8Array(mask, 0, mask.byteLength), + data.byteLength, + ); + var buffer = d.buffer; + buffer.enclosed = true; + return gostCrypto.asn1.GostPrivateKeyInfo.encode({ + algorithm: algorithm, + buffer: buffer, + }); }); - }); - } else - return gostCrypto.asn1.GostPrivateKeyInfo.encode(key); - } else if (format === 'spki' && key?.algorithm?.id) + } else return gostCrypto.asn1.GostPrivateKeyInfo.encode(key); + } else if (format === "spki" && key?.algorithm?.id) return gostCrypto.asn1.GostSubjectPublicKeyInfo.encode(key); - else - throw new NotSupportedError('Key format not supported'); + else throw new NotSupportedError("Key format not supported"); }); }; // @@ -1544,22 +1820,32 @@ SubtleCrypto.prototype.exportKey = function (format, key) // -{ +SubtleCrypto.prototype.wrapKey = function ( + format, + key, + wrappingKey, + wrapAlgorithm, +) { + // return new Promise(call).then(function () { if (checkNative(wrapAlgorithm)) - return rootCrypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm); + return rootCrypto.subtle.wrapKey( + format, + key, + wrappingKey, + wrapAlgorithm, + ); - wrapAlgorithm = normalize(wrapAlgorithm, 'wrapKey'); + wrapAlgorithm = normalize(wrapAlgorithm, "wrapKey"); var keyData = extractKey(null, null, key); - if (wrapAlgorithm.procreator === 'SC' && key.type === 'private') + if (wrapAlgorithm.procreator === "SC" && key.type === "private") keyData = swapBytes(keyData); - return execute(wrapAlgorithm, 'wrapKey', - [extractKey('wrapKey', wrapAlgorithm, wrappingKey), keyData]).then(function (data) { - if (format === 'raw') - return data; - else - throw new NotSupportedError('Key format not supported'); + return execute(wrapAlgorithm, "wrapKey", [ + extractKey("wrapKey", wrapAlgorithm, wrappingKey), + keyData, + ]).then(function (data) { + if (format === "raw") return data; + else throw new NotSupportedError("Key format not supported"); }); }); }; // @@ -1590,31 +1876,59 @@ SubtleCrypto.prototype.wrapKey = function (format, key, wrappingKey, wrapAlgorit * @param {KeyUsages} keyUsages Key usage array: type of operation that may be performed using a key * @returns {Promise} Promise that resolves with {@link Key} */ -SubtleCrypto.prototype.unwrapKey = function (format, wrappedKey, unwrappingKey, - unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages) // -{ +SubtleCrypto.prototype.unwrapKey = function ( + format, + wrappedKey, + unwrappingKey, + unwrapAlgorithm, + unwrappedKeyAlgorithm, + extractable, + keyUsages, +) { + // return new Promise(call).then(function () { if (checkNative(unwrapAlgorithm)) - return rootCrypto.subtle.unwrapKey(format, wrappedKey, unwrappingKey, - unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages); + return rootCrypto.subtle.unwrapKey( + format, + wrappedKey, + unwrappingKey, + unwrapAlgorithm, + unwrappedKeyAlgorithm, + extractable, + keyUsages, + ); - unwrapAlgorithm = normalize(unwrapAlgorithm, 'unwrapKey'); - unwrappedKeyAlgorithm = normalize(unwrappedKeyAlgorithm, 'importKey'); - if (format !== 'raw') - throw new NotSupportedError('Key format not supported'); + unwrapAlgorithm = normalize(unwrapAlgorithm, "unwrapKey"); + unwrappedKeyAlgorithm = normalize(unwrappedKeyAlgorithm, "importKey"); + if (format !== "raw") + throw new NotSupportedError("Key format not supported"); - return execute(unwrapAlgorithm, 'unwrapKey', [extractKey('unwrapKey', unwrapAlgorithm, unwrappingKey), wrappedKey]).then(function (data) { + return execute(unwrapAlgorithm, "unwrapKey", [ + extractKey("unwrapKey", unwrapAlgorithm, unwrappingKey), + wrappedKey, + ]).then(function (data) { var type; if (unwrappedKeyAlgorithm && unwrappedKeyAlgorithm.name) { - var name = unwrappedKeyAlgorithm.name.toUpperCase().replace(/[\.\s]/g, ''); - if (name.indexOf('3410') >= 0 && keyUsages.indexOf('sign') >= 0) - type = 'private'; - else if (name.indexOf('3410') >= 0 && keyUsages.indexOf('verify') >= 0) - type = 'public'; + var name = unwrappedKeyAlgorithm.name + .toUpperCase() + .replace(/[\.\s]/g, ""); + if (name.indexOf("3410") >= 0 && keyUsages.indexOf("sign") >= 0) + type = "private"; + else if ( + name.indexOf("3410") >= 0 && + keyUsages.indexOf("verify") >= 0 + ) + type = "public"; } - if (unwrapAlgorithm.procreator === 'SC' && type === 'private') + if (unwrapAlgorithm.procreator === "SC" && type === "private") data = swapBytes(data); - return convertKey(unwrappedKeyAlgorithm, extractable, keyUsages, data, type); + return convertKey( + unwrappedKeyAlgorithm, + extractable, + keyUsages, + data, + type, + ); }); }); }; // @@ -1638,15 +1952,13 @@ gostCrypto.subtle = new SubtleCrypto(); * @memberOf gostCrypto * @param {(CryptoOperationData)} array Destination buffer for random data */ -gostCrypto.getRandomValues = function (array) // -{ +gostCrypto.getRandomValues = function (array) { + // // Execute randomizer GostRandom = GostRandom || root.GostRandom; var randomSource = GostRandom ? new GostRandom() : rootCrypto; - if (randomSource.getRandomValues) - randomSource.getRandomValues(array); - else - throw new NotSupportedError('Random generator not found'); + if (randomSource.getRandomValues) randomSource.getRandomValues(array); + else throw new NotSupportedError("Random generator not found"); }; // // diff --git a/src/core/vendor/gost/gostDigest.mjs b/src/core/vendor/gost/gostDigest.mjs index 4d5a04e1..a128444b 100644 --- a/src/core/vendor/gost/gostDigest.mjs +++ b/src/core/vendor/gost/gostDigest.mjs @@ -36,34 +36,32 @@ * */ - import GostRandom from './gostRandom.mjs'; - import GostCipher from './gostCipher.mjs'; - import crypto from 'crypto'; +import GostRandom from "./gostRandom.mjs"; +import GostCipher from "./gostCipher.mjs"; +import crypto from "crypto"; /* - * GOST R 34.11 - * Common methods - * - */ // + * GOST R 34.11 + * Common methods + * + */ // var root = {}; -var rootCrypto = crypto +var rootCrypto = crypto; var DataError = Error, - NotSupportedError = Error; + NotSupportedError = Error; // Copy len values from s[sOfs] to d[dOfs] function arraycopy(s, sOfs, d, dOfs, len) { - for (var i = 0; i < len; i++) - d[dOfs + i] = s[sOfs + i]; + for (var i = 0; i < len; i++) d[dOfs + i] = s[sOfs + i]; } // Swap bytes in buffer function swap(s) { var src = new Uint8Array(s), - dst = new Uint8Array(src.length); - for (var i = 0, n = src.length; i < n; i++) - dst[n - i - 1] = src[i]; + dst = new Uint8Array(src.length); + for (var i = 0, n = src.length; i < n; i++) dst[n - i - 1] = src[i]; return dst.buffer; } @@ -72,26 +70,32 @@ function swap(s) { function b64decode(s) { // s = s.replace(/[^A-Za-z0-9\+\/]/g, ''); var n = s.length, - k = n * 3 + 1 >> 2, r = new Uint8Array(k); + k = (n * 3 + 1) >> 2, + r = new Uint8Array(k); for (var m3, m4, u24 = 0, j = 0, i = 0; i < n; i++) { m4 = i & 3; var c = s.charCodeAt(i); - c = c > 64 && c < 91 ? - c - 65 : c > 96 && c < 123 ? - c - 71 : c > 47 && c < 58 ? - c + 4 : c === 43 ? - 62 : c === 47 ? - 63 : 0; + c = + c > 64 && c < 91 + ? c - 65 + : c > 96 && c < 123 + ? c - 71 + : c > 47 && c < 58 + ? c + 4 + : c === 43 + ? 62 + : c === 47 + ? 63 + : 0; - u24 |= c << 18 - 6 * m4; + u24 |= c << (18 - 6 * m4); if (m4 === 3 || n - i === 1) { for (m3 = 0; m3 < 3 && j < k; m3++, j++) { - r[j] = u24 >>> (16 >>> m3 & 24) & 255; + r[j] = (u24 >>> ((16 >>> m3) & 24)) & 255; } u24 = 0; - } } return r.buffer; @@ -100,24 +104,25 @@ function b64decode(s) { // Random seed function getSeed(length) { GostRandom = GostRandom || root.GostRandom; - var randomSource = GostRandom ? new (GostRandom || root.GostRandom) : rootCrypto; + var randomSource = GostRandom + ? new (GostRandom || root.GostRandom)() + : rootCrypto; if (randomSource.getRandomValues) { var d = new Uint8Array(Math.ceil(length / 8)); randomSource.getRandomValues(d); return d; - } else - throw new NotSupportedError('Random generator not found'); + } else throw new NotSupportedError("Random generator not found"); } // Check buffer function buffer(d) { - if (d instanceof ArrayBuffer) - return d; + if (d instanceof ArrayBuffer) return d; else if (d && d?.buffer instanceof ArrayBuffer) - return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength ? - d.buffer : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; - else - throw new DataError('ArrayBuffer or ArrayBufferView required'); + return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength + ? d.buffer + : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)) + .buffer; + else throw new DataError("ArrayBuffer or ArrayBufferView required"); } // /** @@ -138,8 +143,8 @@ function buffer(d) { * @param {(ArrayBuffer|TypedArray)} data Data * @returns {ArrayBuffer} Digest of data */ -var digest2012 = (function () // -{ +var digest2012 = (function () { + // // Constants var buffer0 = new Int32Array(16); // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; @@ -149,54 +154,56 @@ var digest2012 = (function () // // Constant C var C = (function (s) { var h = new Int32Array(b64decode(s)), - r = new Array(12); + r = new Array(12); for (var i = 0; i < 12; i++) r[i] = new Int32Array(h.buffer, i * 64, 16); return r; })( - 'B0Wm8lllgN0jTXTMNnR2BRXTYKQIKkKiAWlnkpHgfEv8xIV1jbhOcRbQRS5DdmovH3xlwIEvy+vp2soe2lsIsbebsSFwBHnmVs3L1xui3VXKpwrbwmG1XFiZ1hJrF7WaMQG1Fg9e1WGYKyMKcur+89e1cA9GneNPGi+dqYq1o2+yCroK9ZYemTHbeoZD9LbCCdtiYDc6ycGxnjWQ5A/i03t7KbEUderyix+cUl9e8QY1hD1qKPw5Cscvzius3HT1LtHjhLy+DCLxN+iToepTNL4DUpMzE7fYddYD7YIs16k/NV5orRxynX08XDN+hY5I3eRxXaDhSPnSZhXos98f71f+bHz9WBdg9WPqqX6iVnoWGicjtwD/36P1OiVHF82/vf8PgNc1njVKEIYWHxwVf2MjqWwMQT+amUdHraxr6ktufWRGekBo+jVPkDZyxXG/tsa+wmYf8gq0t5oct6b6z8aO8Jq0mn8YbKRCUfnEZi3AOTB6O8Okb9nTOh2urk+uk9QUOk1WhojzSjyiTEUXNQQFSiiDaUcGNyyCLcWrkgnJk3oZMz5H08mHv+bHxp45VAkkv/6GrFHsxaruFg7H9B7nAr/UDX+k' + - '2ahRWTXCrDYvxKXRK43RaZAGm5LLK4n0msTbTTtEtIke3jaccfi3TkFBbgwCqucDp8mTTUJbH5vbWiODUURhcmAqH8uS3DgOVJwHppqKK3uxzrLbC0QKgIQJDeC3Vdk8JEKJJRs6fTreXxbs2JpMlJsiMRZUWo837ZxFmPvHtHTDtjsV0fqYNvRSdjswbB56SzNprwJn558DYTMbiuH/H9t4iv8c50GJ8/PkskjlKjhSbwWApt6+qxst84HNpMprXdhvwEpZot6Ybkd9Hc2678q5SOrvcR2KeWaEFCGAASBhB6vru2v62JT+WmPNxgIw+4nI79CezXsg1xvxSpK8SJkbstnVF/T6UijhiKqkHeeGzJEYne+AXZufITDUEiD4dx3fvDI8pM16sUkEsIAT0roxFvFn5443'); + "B0Wm8lllgN0jTXTMNnR2BRXTYKQIKkKiAWlnkpHgfEv8xIV1jbhOcRbQRS5DdmovH3xlwIEvy+vp2soe2lsIsbebsSFwBHnmVs3L1xui3VXKpwrbwmG1XFiZ1hJrF7WaMQG1Fg9e1WGYKyMKcur+89e1cA9GneNPGi+dqYq1o2+yCroK9ZYemTHbeoZD9LbCCdtiYDc6ycGxnjWQ5A/i03t7KbEUderyix+cUl9e8QY1hD1qKPw5Cscvzius3HT1LtHjhLy+DCLxN+iToepTNL4DUpMzE7fYddYD7YIs16k/NV5orRxynX08XDN+hY5I3eRxXaDhSPnSZhXos98f71f+bHz9WBdg9WPqqX6iVnoWGicjtwD/36P1OiVHF82/vf8PgNc1njVKEIYWHxwVf2MjqWwMQT+amUdHraxr6ktufWRGekBo+jVPkDZyxXG/tsa+wmYf8gq0t5oct6b6z8aO8Jq0mn8YbKRCUfnEZi3AOTB6O8Okb9nTOh2urk+uk9QUOk1WhojzSjyiTEUXNQQFSiiDaUcGNyyCLcWrkgnJk3oZMz5H08mHv+bHxp45VAkkv/6GrFHsxaruFg7H9B7nAr/UDX+k" + + "2ahRWTXCrDYvxKXRK43RaZAGm5LLK4n0msTbTTtEtIke3jaccfi3TkFBbgwCqucDp8mTTUJbH5vbWiODUURhcmAqH8uS3DgOVJwHppqKK3uxzrLbC0QKgIQJDeC3Vdk8JEKJJRs6fTreXxbs2JpMlJsiMRZUWo837ZxFmPvHtHTDtjsV0fqYNvRSdjswbB56SzNprwJn558DYTMbiuH/H9t4iv8c50GJ8/PkskjlKjhSbwWApt6+qxst84HNpMprXdhvwEpZot6Ybkd9Hc2678q5SOrvcR2KeWaEFCGAASBhB6vru2v62JT+WmPNxgIw+4nI79CezXsg1xvxSpK8SJkbstnVF/T6UijhiKqkHeeGzJEYne+AXZufITDUEiD4dx3fvDI8pM16sUkEsIAT0roxFvFn5443", + ); // Precalc Ax var Ax = (function (s) { return new Int32Array(b64decode(s)); })( - '5vh+XFtxH9Alg3eACST6FshJ4H6FLqSoW0aGoY8GwWoLMumi13tBbqvaN6RngVxm9heWqBpoZnb13AtwY5GVS0hi84235kvx/1ximmi9hcXLgn2m/NdXlWbTba9pufCJNWyfdEg9g7B8vOyxI4yZoTanAqwxxHCNnrao0C+839aLGfpR5bOuN5zPtUCKEn0LvAx4tQggj1rlM+OEIojs7c7Cx9N3wV/S7HgXtlBdD165TMLAgzaHHYwgXbTLCwStdjyFWyigiS9YjRt59v8yVz/s9p5DEZM+D8DTn4A6GMnuAQom9fOtgxDv6PRBGXmmXc2hDH3pOhBKG+4dEkjpLFO/8tshhHM5tPUMz6aiPQlftLyc2EeYzeiKLYsHHFb5f3dxaVp1apzF8C5xoLoevKZj+atCFeZyLrGeIt5fu3gNuc4PJZS6FIJSDmOXZk2ELwMeagII6phcfyFEob5r8Ho3yxzRY2Lbg+COK0sxHGTPcEebq5YOMoVrqYa53ucetUeMh3r1bOm4/kKIX2HW/RvdAVaWYjjIYiFXkj74qS78l/9CEUR2+J19NQhWRSzrTJDJsOCnElYjCFAt+8sBbC16A/qnpkhF' + - '9G6LOL/GxKu9vvj91HfeujqsTOvIB5t58JyxBeiHnQwn+moQrIpYy4lg58FAHQzqGm+BHko1aSiQxPsHc9GW/0NQGi9gnQqf96UW4MY/N5Yc5KazuNqSUhMkdSw44IqbpahkczvsFU8r8SRXVUmzP9dm2xVEDcXHp9F5455Ct5La3xUaYZl/04agNF7AJxQjONVRe22pOaRlGPB3EEADtAJ5HZClrqLdiNJniZxKXQqTD2bfCihlwk7p1CBFCbCLMlU4kWaFKSpBKQe/xTOoQrJ+K2JUTcZzbFMERWKV4Ada9AbpU1GQih8vO2vBI2Fvw3sJ3FJV5cY5Z9Ezsf5oRCmIOcfw5xHiQJuH9xlk+aLpOK3D20sHGQwLTkf5w+v0VTTVdtNriENGEKBa64sC2CDDzfWCMvJRbeGEDb7Cseeg6N4GsPodCHuFS1QNNDM7QuKaZ7zKW3/YpgiKxDfdDsY7s6nZQ+2BIXFNvV5lo7FnYe3nte6haSQx98jVc6v21R/GheGjZxpeBjzUBBDJLSg6uY8ssEACj+vAbLLy95AX1k8Rb6HTPOBzWfGpnuSqeE7WjHTNwAZuKhnVxztC2ocStBYccEXD' + - 'NxWC5O2TIW2s45BBSTn2/H7F8SGGIjt8wLCUBCusFvv510U3mlJ+v3N8Py6jtoFoM+e42brSeMqpoyo0wi/+u+SBY8z+370NjllAJG6lpnBRxu9LhCrR5CK60GUnnFCM2RSIwhhgjO4xnqVJH3zaF9OU4SgTTJxgCUv0MnLV47Ob9hKlpKrXkcy72kPSb/0PNN4fPJRq0lBPW1RomV7ha9+fr2/qj3eUJkjqWHDdCSu/x+Vtcdl8Z93msv9PIdVJPCdrRjroYAORdntPr4bHH2ihPng11LmgtowRXwMMn9QUHdLJFlggAZg9j33dUySsZKpwP8wXUlTCyYmUjgK0Jj5edtafRsLeUHRvA1h9gARF2z2CknLx5WBYSgKbVgvz+65Ypz/83GKhWl5ObK1M6EupblXOH7jMCPl0eq6CslPBAhRM9/tHG58EKJjz6442BosnrfLv+3rtypf+jApevneOBRP099jPMCwlAcMri/eNkt38F1xVTfhlxX9GBS9f6vMwG6Ky9CSqaLfsu9YNhpmPDzUBBHVMAAAAAAAAAADxLjFNNNDM7HEFIr4GGCO1rygNmTDABcGX/VziXWk8ZRmkHMYzzJoV' + - 'lYRBcvjHnrjcVDK3k3aEqZQ2wTokkM9YgCsT8zLI71nEQq45fO1PXPoc2O/jq42C8uWslU0pP9Fq2CPokHobfU0iSfg88EO2A8ud2Hn58z3eLS8nNtgmdCpDpB+JHuLfb5iZnRtsEzrUrUbNPfQ2+rs131AmmCXAlk/cqoE+bYXrQbBTfuWlxAVAunWLFghHpBrkO+e7RK/juMQp0GcXl4GZk7vun765rpqN0eyXVCHzVyzdkX5uMWOT19rir/jOR6IgEjfcUzijI0PeyQPuNXn8VsSompHmAbKASNxXUeASlvVk5Lfbe3X3GINRWXoS222VUr3OLjMenbsjHXQwj1INcpP90yLZ4gpEYQwwRnf+7uLStOrUJcow/e4ggAZ1YerKSkcBWhPnSv4UhyZOMCzIg7J78RmlFmTPWbP2gtyoEap8HnivWx1WJvtkjcOytz6RF99bzjTQX3zwarVvXf0lfwrNEycYV03I5nbFKp4HOaflLriqmlSGVT4PPNmjVv9IrqqSe36+dWUlrY4th30ObPn/28hBOx7MoxRQyplpE74w6YPoQK1REAmVbqccsbW2ui20NU5Eab3KTiWgBRWvUoHKD3Hh' + - 'dEWYy40OK/JZP5sxKqhjt++zim4ppPxja2qjoEwtSp09lesO5r8x46KRw5YVVL/VGBacju+by/URXWi8nU4oRrqHXxj6z3Qg0e38uLbiPr2wBzby8eNkroTZKc5libb+cLei9tpPclUOclPXXG1JKQTyOj1XQVmnCoBp6gssEI5J0HPFa7EaEYqrehk55P/XzQlaCw44rO/J+2A2WXn1SJK95pfWfzQix4kz4QUUvGHhwdm5dcm1StImYWDPG82AmkSS7Xj9hnGzzKsqiBqXk3LOv2Z/4dCI1tRbXZhalCfIEagFjD9V3mX1tDGWtQYZ90+WsdZwbkOFnR6Ly0PTNlqrioXM+j2E+ce/mcKV/P2iH9Wh3ktjD82z73Y7i0VtgD9Z+Hz3w4WyfHO+XzGRPJjjrGYzsEghv2FnTCa4+BgP+8mVxMEwyKqghiAQdhqYYFfzQiEBFqr2PHYMBlTMNS3bRcxmfZBCvPRalkvUA4Jo6KDD7zxvPae9ktJp/3O8KQriAgHtIoe33jTN6IWBj9kB7qfdYQWb1vonMhmgNVPVbxrodMzOyeoxJFwug/VUcDRVXaB75JnOJtKsVue+9/0WGFelBU44' + - 'ag59pFJ0NtFb2Go4HN6f8sr3dWIxdwwysJqu2eJ5yNBd7xCRxgZ02xEQRqJRXlBFI1Ns5HKYAvzFDLz39bY8+nOhaIfNFx8DfSlBr9nyjb0/Xj60Wk87nYTu/jYbZ3FAPbjj0+cHYnEaOij58g/SSH68fHW0nnYndOXyk8frVlwY3PWeT0eLpAxu9E+prctSxpmBLZjax2B4iwbcbkadDvxl+Op1IexOMKX3IZ6OC1Ur7D9lvKV7a93QSWm68bdemZBM2+OU6lcUsgHR5upA9ruwwIJBKErdUPIEY7+PHf/o1/k7k8usuE2Mto5HfIbowd0bOZImjj98WqESCdYvyy89mKvbNcmuZxNpViv9X/UVweFsNs7igB1+su3485sX2pTTfbAN/gGHe8PsdguK2suEld/hU65EBaJHc7e0ELMShXt4PDKr3463cNBoElE7U2c5udLj5mVYTVficbJkaNeJx4/JhJclqTW7+n0a4QKLFTej36ZBiNDNXZvDeN56Ssgsmk2Az7dCd38bg722IHLSiDodM711XnotS6tqj0H02qtruxyV2ZBc/+f9jTG2g6pkIhGbOB/ArvuEQgIsSaD5CMZjAzrj' + - 'pCivCASTiCat5Bw0GopTx65xIe535qhdxH9cSiWSnoy1OOmqVc3YYwY3eqna2OspoYroe7MnmJVu39pqNeSEFGt9nRmCUJSn1Bz6VaTobL/lyu3J6kLFnKNsNRwOb8F5UYHk3m+rv4n/8MUwGE0X1J1B6xWEBFiSHA1SUCjXOWHxeOwYDKiFapoFcQGO+BHNQJGifD7178wZrxUjn2Mp0jR0UO/5HrmQ4RtKB43Sd1m5Vh3l/GATMZEvH1otqZPAFlTctluiGRo+Ld4JimuZ64pm1x4PguP+jFGtt9VaCNdFM+UPiUH/fwLm3We9SFns4Giqul321S/CSCbj/0p1pWw5Bw2IrN34ZIZUjEaRpG/Rvr0mE1x8DLMPkwOPFTNKgtmEn8G/mmmcMguoVCD65PpSgkOv+QdnntTWz+loowi4Jf1YLESxR5t2kbxe3LO7x+phkEj+ZRYQY6YfgXryM0fVOGg0CaaTY8LOmExt7TAqn9/YbIHZHXseOwYDKmaUZmCJ6/vZ/YMKWY7mc3UgewdEmhQK/ElfLKilcbZZMjQfmG+KRbvC+zgapKBQs3LCVCOjrdgfrzoXJzwLi4a7bP6DJY3IabWi' + - 'KHkCv9HJgPH1qUvWazg3r4iACnmyyroSVVBDEAg7DUzfNpQOB7nusgTRp85nkLLFYSQT//EltNwm8SuXxSwST4YII1GmLyis75NjL5k35ec1B7BSKTob5ucsMK5XCpxw01hgQa4UJeDeRXSz151MxJK6IoBAxWha8AsMpdyMJxy+Eofx9pxabvOeMX+x4NyGSV0RQCDsNC1pm0B+PxjNS9yjqdRq1RUoDR0U8nmJaSQAAAAAAAAAAFk+t1+hlsYeLk54FgsRa9htSuewWIh/juZf0BOHLj4Gem3bu9MOxOKsl/yJyq7xsQnMszweGdvhifPqxGLuGGR3cM9JqoetxlbFfsplV/bWA5U92m1s+5o2ko2IRFbgfB7rjzeVn2CNMdYXnE6qqSNvrDrX5cAmYkMEn6ZTmRRWq9NmncBSuO6vAsFTp8IKKzzLA243I8AHk8nCPZDhyizDO8ZeL27X00z/VjOXWCSeselOZDJdaqY34W01lHJCCnn45mG+Yj94UhTZBALHRBNILvH98MiWWxP2m8XsFgmpDogpKBTlkr5OGYtUKhB9cszAD8vrr+cbG0nIRCIrcD4lZBZNqEDp1SDGUT4f9Plm' + - 'usMgP5EM6Kvy7dHCYcR+8IFMuUWs02Hzlf64lEo5IQVcnPAsFiLWrZcYZfP3cXjpvYe6K5vwofREQAWyWWVdCe11vkgkf7wLdZYSLhfP9Cq0SwkXhel6FZZrhU4nVdqf7uCDkkkTR5EyQypGI8ZSuahGW0etPkN0+LRfJBKxXoskF/bweGRLo/shYv5/3aURS7vMJ52kbcEBc+C90CSidiIgjFmivKCKj8SQbbg2803kuQ10OmZn6nFHteBwX0bvJ4LLKhUIsDnsBl719FsefSG1sYPP0FsQ2+czwGApXHefpzZyOUwBfs9VMhGGwxyB2HIOGg1Fp+07j5l6Pd+JWDr8ecft+ysu6aQZhkPvDs5fCc32e04tN09qa+n6NN8Etq3UcDihI/mNIk0KBX6qocliSLhcG/eo4/2XYDCaLrULKm5bo1GCDetCxOH+p1cilI1YKZodg3N/z5zIZLrUUaVbT7XUtypQCL9Tgc49eZdGptjV5C0E5dIrgPx+MIeWV7aed7VzVKA5aUQdgJfQtDMwyvvz4vDP4o533eC+jMNisS4lnElPRqbOcm+529HKQeJCwe7RTbp2Ay/0eqMPsEWyaKk6zeTM' + - 'r38L6IRUnQgEg1SzwUaCY5JUNcLIDv7S7k438n/f+6cWejOSDGDxTfsSO1LqA+WESgyrU/27kAed6vY4D3iKGctI7FWPDLMqtZ3Estb+9+Dc28oi9PPsthHfWBNUmpxA4z/e31aKztOgwcgSQyLpwwela4FY+m0NdyeVebHh893ZsYt0QirABLjsLZ//q8KU9Kz4qC11kU97v2mx7ytoeMT2L69Iesfhds6AnMZ+XQxnEdiPkuTBTGJ7mdkkPe3+I0qlw9+2i1GQmx8VJi2/bU9m6gVLYry1GuLPWlKqaui+oFP70M4BSO1oCMDmYxTJQ/4WzRWoJxDNBJIxoGlw9ue8imyXzEywM3zoNfyzucBl3vJYfMeA81IhTt5BMrtQlfFeQ5D0k9+HCDliXdLg8UExPBr7i2avkXIK8FGyEbxHfUJ+1O6lcy47TO72474lgmJ4NOsLzEOcA+PdeOckyCh3MorZhn35FLUZReJDsPJXSw+I9+uX4oi2+piapJQ6GcTwaMsWhYZQ7mQJrxH6733zF9XATqukelZ8VJi0xqm2u/uAT0IYjjzCK887xc0L0EM26qo5dxPwL6wb7DMTLCUG26fw00iN' + - '1+Zda/LDGh5eubIWH/gg9YQuBlDEbg+fcWvrHZ6EMAGpM3WMqzFe1D/kFP2ieSJlJ8nxcB7wCTJzpMHKcKdxvpQYS6bnaz0OQNgp/4wUyH4PvsP6x3Z0yzYWqWNKapVyjxORGcJe+Tf1Re1NWuo/nugCSZZQujh7ZDfnvQtYLiLmVZ+J4FPiYYCtUuMFKI38bcVaI+NLmTXeFOD1GtCtCcY5BXimWYZeltdhcQlIfLHi1ss6IRVgAgHpFeV3n67RrbAhP2p33LeYgLduuaGmq12fjSSGRM+b/V5FNsVmJljxxrn+m6y9/erNY0G+mXnE76ciFwhAVXZRB3Hs2I5UPsK6UctnHwQ9CtSCrHGvWHn+eHoEXNrJNrI4rzOOBJrtvYZsyUly7iZhXabrvYECkDKV/dCLLBcR+DQEYHO/CurzCZMpdY/8QhyusT59z6k0uiMHSBGIgysk785Ch0zmXA5X1h+w6doas9G61vmbNDzAdXsciTxFgitRDbhAOpKXXHaYwfHbYUo+DQEY1eaMtNYPSI6FXLTPrpYeDfPLM9k6jlWrFKAO10IXAyhiN4nBg4tt0ZyUYpKJX+997Ts668/LuOZOSjFJ' + - 'Bkx+ZC9lw9w9Kz4qTFpj2lvT80CpIQxHtHTRV6FhWTGsWTTaHehyZm7jZRF693ZbyG7TZxawXESbpohcIB1JxbkFOHqINGxFExByxLq53f+/SUYep1GvmdUpd7wc4FuhsPeF5GAn21JUbTC6bld4jDBa1wdlD1auyYfGgmEv8pWlq4lE9fvFcX7VKOdZ8kTKjdy7zix9uIiqFUq+Mo2xuh5hm+mT7OiLCfK9nugTtxd0AapLKF0csyGFjxQxlcruSMOBhBOY0bj8t1DTsvmIiTmoapmNHOG5H4iODORzRlp4mVaDdpeHFgLPKtfuI0G/hccTtbPxoU7/kW/hK0Vn53waAjC30QV1DJj8yF7Km6Wj5/cg2p4GrWpgMaK7sfQ4lz50lH7X0mAs9GY5GMD/ml9Qp/NoZ44kNNmDtKRJ1M1orxt1VZK1h388PQIubeobq/xfW0USH2sNcektKVU1dN/99RBtTwPYCBuoe5+MGcbbfqGjrAmBu7vKEq1mFy36eXBDZgEIKccXkyZ3e/9fnAAAAAAAAAAA6yR2pMkG1xVyTdQvBzjfb7dS7mU43bZfN/+8hj31O6OO+oT8tcFX5unrXHMnJZaq' + - 'GwvavyU1xDmG4SyHKk1OIJlpoovOPgh6+vsut52cS1UFakFWttksslo65qXevqKWIqOwJqgpJYBTyFs7Nq0VgbEekAEXuHWDxR86Sj/laTDgGeHtzzYhveyBHSWR/LoYRFt9TE1SSh2o2mBp3K7wBVj1zHIwneMp1MBiWWt/9XDOIq0DOdWfmFkc2ZdHAk34i5DFqgMYe1T2Y9J/w1bQ8NhYnpE1tW7VNTCWUdPWehwS+WchzSZzLtKMHD1EGjasSSqUYWQHf2ktHXPcb19RS28KcPQNaNiKYLSzDsoerEHTZQnYM4WYfQs9l0kGMPaonszJCpbEZXeiDuLFrQGofOSatV4OcKPepEKcoYJka6Dal7RG25Yvaszth9TX9t4nKrgYXTelPEafJdzv4VvLpsGcbvn+o+tTp2SjkxvYhM4v0lkLgXwQ9FaiGm2AdDkz5XOgu3nvDQ8VXAygldweI2wsT8aU1DfkEDZN9iMFMpHdMt/Hg2xCZwMmPzKZvO9uZvjNauV7b52MNa4rW+IWWTGzwuISkPh/k70gJ7+RUANpRg6QIg0bVimeJ2+uGdMoY5KMPFOiQy9wgv746Rue0LxveSw+7UD3' + - 'TEDVN9LeU9t16L+uX8KyYk2pwNKlQf0KTo//4Dz9EmQmIOSVaW+n4+Hw9Ai4qY9s0aojD92m2cLH0BCd0cYoj4p50E90h9WFRpRXm6NxC6I4QX98+oNPaB1HpNsKUAflIGya8UYKZD+hKN33NL1HEoFERwZytyMt8uCGzAIQUpMYLeWNvIkrV8qh+bD4kx37a4kkR8wuWun53RGFBCCkO0vlvraKJD7WVYQlXxnI1l07Z0BOYz+gBqaNtnZsRyof94rHmrTJfiHDU0QuEICq7JpPnblXgucUBbp7yCybMiAxpUZl+LZeT7G2Ufd1R/TUi/oNhXukZoKFqWxaoWqYu5kPrvkI63nJoV43okf0pi12hX3NXSd0HvjFC4AKGCC8vmXcsgH3orRmbRuYb5Qm50zJIb9TxOZIlUEKD5PZykIgzcyqZHuk70KaQGCJChhxDE6k9psys4vM2jYt3jVM05bcI7x8Wy+pwwm7aKqFGrPSYTGnNkjgEwIdxSlB/E2yzVrat3BL5IqneWXZhO1x5jI4b9YXNLuk6C1t1TirckVcIUfqYXe0sV2hq3DPCRzorJB/znK4vf9XyF39lyJ4qKTkTGprb5QN' + - 'OFGZW08f3+RiV4zK7XG8ntmIK7DAHSwKkXudXRE8UDuiwx4RqHZDxuRjySOjmcHO9xaGxX6odtyHtKlz4JbVCa8NVn2dOlgUtAwqP1ncxvQ2AviEldEh3dPh3T2YNkhK+UXnGqRmiOV1GFR+sqWR9ZNmWHRQwB2JnqgQGGWMBltPVAgMvEYDoy0DhMZRN7893DJQeOyGHirqMKj8eVc/9yFNIDDKBQy2ZfAyK4AWwwxpvpbdGyRwh9uV7pmB4WG40fwYFNnKBfiCDtK7zA3nKWPXYFBDDxTHO8yw6KCdOg+OQHZNVz9UojnRdcHhYXe9EvWjfHNPH0urN8EvH9/CbVZIsWc5XNDxbATtFTe/QqftlxYdFDBAZX1sZ9qrcrgH7Bf6h7pO6Dzfr3nLAwT7wXM/BgVxvEY+eNYcEofpiifQfPSOd7StobnCYlNskN0m4kSbWGCAFgWPwJrX+UH8+/rYzqlL5G0Oo0PyiwYI65+bEmvQSRc0e5qSh0rnaZwiGwF8QsTmnuA6TFxyDuOSVktun14+o5naa6NT9FrYPTXn/uCQTBskJSLQCYMlh+ldhCmAwA8UMOLGs8Cghh4okwh0M6QZ1yny' + - 'NB89rdQtbG/uCj+u+7Kljkruc8SQ3TGDqrcttbGhajSpKgQGXiOP33tLNaFoa2/MaiO/bvSmlWwZHLlrhRrTUlXVmNTW3jUayWBN5fKufvMcpsKjqYHhct4vlVGtelOYMCWq/1bI9hYVUh2dHihg2VBv4xz6RQc6GJxV8StkewsBgOyarn6oWXzsi0AFDBBeI1DlGYv5QQTvitM0VcwN1wenvuFtZ3+S5eMluQ3naZdaBhWRom5jerYR7xYYIItGCfTfPrepgaseuweK6H2swLeRA4y2XiMfD9ONRXSwVmBn7fcCweqOvrpfS+CDEjjN48R3ws7+vlwNzkhsNUwb0oxds2QWwxkQJuqe0adicyQDnSmz74Ll658o/ILL8q4CqKronPBdJ4ZDGqz6J3SwKM9HH54xt6k4WBvQuOOSLsi8eBmbQAvvBpD7cce/QvhiHzvrEEYDBJloPnpHtVrY3piPQmOmldGQ2AjHKm5jhFMGJ1J7wxnXy+uwRGbXKZeu5n4MCuJljHwU0vEHsFbIgHEiwywwQAuMinrhH9Xaztug3ts46YoOdK0Qk1TcxhWmC+kaF/ZVzBmN3V/+uL2xSb/lMCiviQrt' + - '1lum9bStemp5VvCIKZcifhDoZlUys1L5DlNh39rO/jnOx/MEn8kBYf9itWFnf18ul1zPJtIlh/BR7w+GVDuvYy8eQe8Qy/KPUnImNbu5SoiujbrnM0TwTUEHadNmiP2as6uU3jS7uWaAExeSjfGqm6VkoPDFETxU8THUvr2xoRd/caLz6o71tUCHhUnI9lXDfvFOaUTwXezURmPc9VE32PKs/Q1SM0T8AAAAAAAAAABfvG5ZjvVRWhbPNC7xqoUysDa9bds5XI0TdU/m3TG3Ervfp3otbJCUiefIrDpYKzA8aw4JzfpFncSuBYnH4mUhSXNad39f1GjK/WRWHSybGNoVAgMvn8nhiGckNpQmg2k3ghQeO6+JhJy11TEkcEvp19tKbxrT0jOm+YlDKpPZv501OauKDuOwU/LKrxXH4tFuGSg8dkMPFT3r4pNjhO3EXjyCwyCL+QMzuINMuUoT/WRw3rEuaGtVNZ/RN3pTxDZhyqV5AvNZdQQ6l1KC5Zp5/X9wSCaDEpzFLukTaZzNeCi5/w59rI0dVFV0TnignUPLfYjMs1IzQUS9EhtKE8+6TUnNJf26ThE+dssgjAYILz/2J7oieKB2' + - 'wolX8gT7supFPf6B5G1n45TB5pU9p2IbLINoXP9JF2TzLBGX/E3spSsk1r2SLmj2sit4RJrFET9I87bt0SF8MS6erXW+tVrWF0/YtF/ULWtO1OSWEjir+pLmtO7+vrXQRqDXMgvvgghHIDuopZEqUST3W/jmnj6W8LE4JBPPCU7+4ln7yQH3dydqcksJHNt9vfj1Ae51R19ZmzwiTeyGkW2EAY+Zwer+dJi45BzbOazgWV5xIXxbtyqkOic8UMCv9QtD7D9UO26Djj4hYnNPcMCUkttFB/9Ycr/qn9/C7mcRaIrPnM36oBqBkNhqmDa5esvZO8YVx5XHMyw6KGCAyoY0RelO6H1Q9pZqX9DW3oXprYFPltXaHHCiL7aePqPVCmn2jVgrZEC4Qo7Jwu51f2BKSeOsjfEsW4b5CwwQyyPh2bLrjwLz7ik5E5TT0iVEyOChf1zQ1qq1jMal96JurYGT+wgjjwLC1caPRlsvn4H8/5zSiP26xXcFkVfzWdxHHSYuOQf/SSv7WCIz5ZrFV92yvOJC+LZzJXe3Ykjgls9vmcSm2D2nTMEUfkHreVcB9IuvdpEqkzc+8p0kmywKGenhYyK2+GIv' + - 'VTaZQEd1f3qfTVbVpHsLM4IlZ0ZqoRdMuPUFfesIL7LMSMEL9EdfUzcwiNQnXew6lo9DJRgK7RAXPSMs9wFhUa5O0J+Ub8wT/UtHQcRTmHMbWz8N2ZM3ZS/8sJZ7ZEBS4CN20gqJhAyjrjpwMpsY10GcvSM13oUm+v6/EVt8MZkDlwdPhaqbDcWK1PtINrlwvsYL4/xBBKge/zbcS3CHchMf3DPthFO2CETjPjQXZNMP8RtuqzjNOWQ1Hwp3YbhaO1aU9QnPug4whXCEuHJF0Eevs70il6488rpcL29rVUp0vcR2H09w4c/fxkRx7cRe5hB4TB3ArxZ6yinWPBE/KC3tQRd2qFmvrF8hHpmj1e7UhPlJqH7zOzzjbKWW4BPk0SDwmDqdQyxrxARk3Fl1Y2nV9eXRlWyemulfBDaYuyTJ7MjaZqTvRNaVCMilsurGxAwiNcBQO4A4wZO6jGUhAxzux11GvJ6P0zEBGTdRWtHY4uVohuylD7E3EI1XecmRcJ87aQXKQgZP61CDFoDK7+xFavMkG9I4WNZzr+GBq74kL1Tnytm/jAIR8YENzBn9kLxNuw9DxgqVGERqnaB2HaG/y/E/VwEq' + - 'K95PiWHhcrUnuFOoT3MkgbCx5kPfH0thGMw4Qlw5rGjSt/fXvzfYITEDhkowFMcgFKokY3Kr+lxuYA21TrrFdDlHZXQEA6PzCcIV8Lxx5iMqWLlH6YfwRXtM3xi0d73Ylwm165Bsb+BzCDwmgGDZC/7cQA5B+QN+KElIxuRL6bhyjsroCAZb+wYzDp4XSSsaWVCFYWnnKU665PT85sQ2T8p7z5XjDnRJfX/RhqM+lsJSg2EQ2FrWkE36oQIbTNMSkTq7dYclRPrdRuy5FA8VGD1lmmsehpEUwj8sq9cZEJrXE/4GLdRoNtCmBlay+8HcIhxaed2QlJbv0m28obFJNQ537aAjXk/Jy/05W2to9rkN4OrvpvTUxAQi/x8ahTLn+Wm4Xt7WqpR/biAHrvKPPzrQYjuBqTj+ZiTui3qtoae2gujdyFZge6eMxW8oHiowx5slekX6oI1bQXTgZCsws19ji/9+rgJUS8mvnAwF+AjOWTCK+YtGro/FjanMVcOIgDSWx2dtDrHzPKrh5w3XurtiAjJuorS/1QIPhyAYccudXKdUqbcSzoQWadh96DxWimGEeF62c59CC7pssHQeK/EtW2Dqwc5H' + - 'dqw19xKDaRwsa7fZ/s7bX/zNsY9MNRqDH3nAEsMWBYLwq62uYqdMt+GlgByC7wb8Z6IYRfLLI1dRFGZfXfBNnb9A/S10J4ZYoDk9P7cxg9oFpAnRkuOwF6n7KM8LQGX5JamiKUK/PXzbdeInA0Y+ArMm4QxatdBs55aOgpWmLea5c/OzY26tQt9XHTgZwwzl7lSbcinXy8USmSr9ZeLRRvjvTpBWsChktwQeE0Aw4ovALt0q2tUJZ5MrSvSK6V0Hb+b7e8bcR4Qjmqy3VfYWZkAaS+29uAfWSF6o04mvYwWkG8IgrbSxPXU7MriXKfIRmX5YS7MyICkdaDGTztocf/9atsDJn4GOFrvV4n9n46GlnTTuJdIzzZj4roU7VKLZbfcK+ssQXnl5XS6ZubukJY5De2dEM0F4AYb2zohmgvDr8JKjuzR70rzX+mLxjR1VrdnX0BHFVx4L0+Rxsb3/3qpsL4CO6v70XuV9MfbIgKT1D6R/8ET8oBrdycNR9bWV6nZkbTNS+SIAAAAAAAAAAIWQnxb1jr6mRilFc6rxLMwKVRK/Odt9Lnjb2Fcx3SbVKc++CGwta0ghi102WDoPmxUs0q36zXis' + - 'g6ORiOLHlbzDudplX3+Sap7LoBssHYnDB7X4UJ8vqep+6NbJJpQNzza2fhqvO27KhgeYWXAkJav7eEnf0xqzaUx8V8yTKlHi2WQTpg6KJ/8mPqVmxxWmcWxx/DRDdtyJSk9ZUoRjevja8xTpiyC88lcnaMFKuWaHEIjbfGguyLuIcHX5U3pqYi56RljzAsKiYZEW2+WCCE2ofd4BgybnCdzAGnecaZfo7cOcPax9UMimCjOhoHiowMGoK+RSs4uXP3Rr6hNKiOmiKMy+uv2aJ6vq2U4GjHwE9IlSsXgiflBc9Iyw+wSZWWAX4BVt5Iq9RDi08qc9NTGMUormSf9YhbUV75JN/Pt2DGYcIS6SVjS0kxlcxZp5hpzaUZoh0ZA+MpSBBbW+XC0ZSs6M1F8umEONTKI4Epzbm2+pyr7+OdSBsmAJ7wuMQd7R6/aRpY4VTm2mTZ7mSB9UsG+OzxP9iknYXh0ByeH1r8gmURwJTuP2mKMwde5nrVrHgi7sTbJDjdR8KMGZ2nWJ9oM32xzoks3ON8V8Id2jUwWX3lA8VGBqQvKqVD/3k11yen5zYhup4jKHUwdFnfFWoZ4Pwt/kd8Yd07TNnCJ9' + - '5Yd/A5hqNBuUnrKkFcb07WIGEZRgKJNAY4DnWuhOEbCL53K21tDxb1CSkJHVls9t6GeV7D6e4N98+SdIK1gUMshqPhTuwm20cRnNp42swPbkAYnNEAy265KtvDoCj9/3sqAXwtLTUpwgDav40FyNazSnj5ui93c347RxnY8jHwFFvkI8L1u3wfceVf79iOVdaFMDK1nz7m5ls+nE/wc6qncqwzma5evsh4Ful/hCp1sRDi2y4EhKSzMSd8s92N7dvVEMrHnrn6U1IXlVKpH1x4qwqWhG4GptQ8foC0vwszoIybNUaxYe5TnxwjXrqZC+wb7yN2YGx7IsIJIzYUVpqusBUjtvwyialGlTq5Nazt0nKDj2PhM0DosEVeyhK6BSd6GyxJeP+KKlUSLKE+VAhiJ2E1hi0/HN243f3gi3bP5dHhLInkoXig5WgWsDlphn7l95lTMD7Vmv7XSLq3jXHW2Sny35PlPu9dio+Lp5jCr2GbFpjjnPa5Xdry90kQTi7CqcgOCIZCfOXI/YgluV6sTg2Zk6xgJxRpnDpRcwdvk9GxUfUKKfQp7VBeorx1lGNGZaz9x/S5hhsftTKSNC98chwAgOhkEw' + - 'hpPNFpb9e3SHJzGScTaxS9NEbIpjoXIbZpo16KZoDkrKtljyOVCaFqTl3k70Loq5N6dDXug/CNkTTmI54mx/loJ5Gjwt9nSIP27wCoMpFjyOWn5C/etlkVyq7kx5gd21GfI0eFrx6A0lXd3j7Zi9cFCJijKpnMysKMpFGdpOZlauWYgPTLMdIg2XmPo31tsmMvlo8LT/zRqgDwlkTyWFRfo61RdeJN5y9GxUfF2yRhVxPoD7/w9+IHhDzytz0qr6vRfqNq7fYrT9ERus0W+Sz0q6p9vHLWfgs0FrXa1J+tO8oxaySRSoixXRUAaK7PkU4nwd6+Me/EBP5Ix1m+2iI37c/RQbUix4TlBw8XwmaBzmlsrBWBXzvDXSpks7tIGngAz/Kf59/fYe2frD1bqksGwmY6ke9ZnRA8EZkTRAQ0H3rU3tafIFVM2dlkm2G9aryMO95+rbE2jRMYmfsCr7ZR0Y41Lh+ufx2jkjWu98psGhu/XgqO5PepE3eAXPmgseMThxYYC/jlvZ+DrL2zzlgAJ15RXTi4l+Ry0/IfD7vMYtlG63ho6jlbo8JI0hlC4J5yI2Rb/eOYP/ZP65AuQbscl3QWMNENlX' + - 'w8sXIrWNTsyieuxxnK4MO5n+y1GkjBX7FGWsgm0nMyvhvQR6116/AXn3M6+UGWDFZy7JbEGjxHXCf+umUkaE82Tv0P1144c07Z5gBAdDrhj7jimTue8UTThFPrEMYlqBaXhIB0I1XBJIz0LOFKbunhysH9YGMS3Oe4LWukeS6budFBx7H4caB1YWuA3BHEouuEnBmPIfp3d8qRgByNmlBrE0jkh+wnOtQbINHph7OkR0YKtVo8+744TmKANFdvIKG4fRbYl6YXMP4n3v5F1SWIPN5rjKPb63DCNkftAdERl6Nio+oFkjhLYfQPPxiT8QddRX0UQEcdxFWNo0I3A1uNymEWWH/CBDjZtn08mrJtArC1yI7g4lF2/nejgqtdqQJpzEctnY/jFjxB5G+qjLibervHcWQvUvfR3khS8SbzmoxrowJDOboGAFB9fO6IjIj+6Cxhogr65XokSJJteAEfyl5yg2pFjwByvOu49LTL1Je75K820koTyv6Zu3aVV9EvqevQWntanowEuqW4Nr20JzFI+sO3kFkIOEgShRwSHlV9NQbFWw/XL/mWrLTz1hPtoMjmTi3APwhoNW5rlJ6QTq1yq7Cw/8' + - 'F6S1E1lncGrjyOFvBNU2f/hPMAKNr1cMGEbI/L06IjJbgSD39sqRCNRvojHs6j6mM02UdFM0ByVYQDlmworSSb7W86eanyH1aMy0g6X+li3QhXUbV+ExWv7QAj3lL9GOSw5bXyDmrd8aMy3pbrGrTKPOEPV7ZcYEEI97qNYsPNerB6OhEHPY4WsNrRKRvtVs8vNmQzUywJcuVXcmss7g1AAAAAAAAAAAywKkdt6bUCnk4y/Ui556wnNLZe4shPdeblOGvM1+EK8BtPyE58vKP8/oc1xlkF/VNhO/2g/0wuYRO4csMef26C/hi6JVBSrr6XS3LrxIoeQKvFZBuJ2Xm7RqpeYiArZuROwmsMS7/4emkDtbJ6UDx39oAZD8meZHl6hKOqcajZzdEu3hYDfqfMVUJR3dDchOiMVMfZVr4xNNkWlgSGYrXbCAcsyZCbmStd5ZYsXJfFGBuAOtGbY3ybL1l9lKgjDsCwiqxV9WXaTxMn/SAXKD1q2YkZ54815jarlRlnZ1H1Mk6SFnClN3T7n9PRwV1G1IkvZhlPvaSF9aNdxzEQFbN97T9HBUd6k9wAoOs4HNDY27iNgJxl/kNhYQSZe+rLpV' + - 'IbcKyVaTsoxZ9MXiJUEYdtXbXrULIfSZVdehnPVcCW+pcka0w/hRn4VS1IeivTg1VGNdGBKXw1Ajwu/chRg78p9h+W7MDJN5U0iTo53cj+1e3wtZqgpUy6wsbRqfOJRc1667oNiqfecqv6AMCcXvKNhMxk889y+/IAP2TbFYeLOnJMffwG7J+AafMj9ogIaCzClqzVHQHJQFXiuuXMDFw2Jw4sIdYwG2O4QnIDgiGcDS8JAOhGq4JFL8byd6F0XSxpU8jOlNiw/gCfj+MJV1PmVbLHmSKE0LmEo31UNH38Tqta6/iAjipZo/0sCQzFa6nKDg//hM0DhMJZXkr63hYt9nCPSzvGMCv2IPI31U68qTQp0QHBGCYAl9T9CM3dTajC+bVy5g7O9winx/GMS0Hzow26Tf6dP/QAbxmn+w8Htfa/fdTcGe9B9tBkcycW6P+fvMhmpknTMwjI3lZ3REZIlxsPlyoCks1hpHJD9ht9jv64UR1MgnZpYctr5A0UejqrNfJfe4Et52FU5AcEQynVE9drZOVwaT80eax9L5Cqibiy5EdwechSl+uZ09haxpfjfmLfx9QMN3byWk7pOeW+BFyFDdj7Wt' + - 'hu1bpxH/GVLpHQvZz2FrNTfgqyVuQI/7lgf2wDECWnoLAvXhFtI8nfPYSGv7UGUMYhz/J8QIdfV9QMtx+l/TSm2qZhbaopBin181SSPshOLshHw9xQfDswJaNmgEPOIFqL+ebE2sCxn6gIvi6b67lLW5nFJ3x0+jeNm8lfA5e8zjMuUM260mJMdPzhKTMnl+Fyns6y6nCavC1rn2mVTR+F2JjL+6uFUahZp2+xfditsb6FiGNi9/tfZBP4/xNs2K0xEPpbu341wKL+7VFMxNEegwEO3Nfxq5oedd5V9C1YHu3kpVwTshtvL1U1/5ThSADMG0bRiIdh684V/bZSmROy0l6JdacYHCcYF/HOLXpVQuUsXLXFMSS/n3pr7vnCgdnnIufSHy9W7OFw2bgdyn5g6bggUctJQbHnEvYjxJ1zMh5Fz6Qvn33MuOen+Lug9gjpiDGgEPtkZHTM8NjolbI6mShVhPsnqVjMK1cgUzVENC1bjphO/zpQEtGzQCHnGMV6Ziaq50GAv/GfwG49gTEjW6nU1qfG3+ydRMF4+G7WVQZSPmoC5SiAN3LVwGIpOJiwH0/gtpHsD42r2K7YJZkUxOOuyYW2e+' + - 'sQ3wgn+/lqlqaSea1Pja4eeGidzT1f8ugS4aKx+lU9H7rZDW66DKGBrFQ7I0MQ45FgT33yy5eCemJBxpURifAnU1E8zqr3xeZPKln8hMTvokfSseSJ9fWttk1xirR0xIefSnofInCkAVc9qDKpvrrjSXhnloYhxyUUg40qIwIwTwr2U3/XL2hR0GAj46a0S6Z4WIw85u3XNmqJP3zHCs/9TSTim17anfOFYyFHDqamwHw0GMDlpKgyvLsi9WNbrNBLRs0Ah42QoG7lq4DEQ7DzshH0h2yPnlCVjDiRLu3pjRSznNv4sBWTl7KSBy9Bvgh8BAkxPhaN6tJumIR8qjn04UDIScZ4W71f9VHbfz2FOgykbRXVykDc1gIMeH/jRvhLdtzxXD+1fe/aD8oSHkzkuNe2CWAS09msZCrSmKLGQIddi9EPCvFLNXxup7g3SsTWMh2JpFFjLtqWcJxxmyP/dsJLvzKLwGxmLVJpEsCPI84l7EeJKzZrl4KD9vTzm9wIyPnp1oM/1PORewnnn0N1k94G+ywIwQ1oh4QbHRS9oZsm7uMhOdsLSUh2Z12T4vglk3dxmHwFiQ6ax4PUZhdfGCfgP/bIcJ' + - 'lF3AqDU+uH9FFvllirW5Jj+Vc5h+sCDvuFUzC21RSDEq5qkbVCvLQWMx5BPGFgR5QI+OgYDTEaDv81FhwyVQOtBmIvm9lXDViHbZog1LjUmlUzE1VzoMi+Fo02TfkcQh9BsJ5/UKL48SsJsPJMGhLdpJzCypWT3EH1w0Vj5Xpr9U0U82qFaLgq983+BD9kGa6momhclD+Lzl3L+01+kdK7J63d55nQUga0Q8rtbmq217rpHJ9hvoRT64aKx8rlFjEce2UyLjMqTSPBSRuamS0I+1mC4DEcfKcKxkKODJ1NiJW8KWD1X8xXZCPpDsje/Xb/BQft6ecmc9z0XweozC6kqgYFSUH1yxWBD7W7De/Zxe/qHjvJrGk27dS0rcgAPrdBgI+OixDdIUXsG3KIWaIii8n3NQFylEJwoGQk69zNOXKu30Mxwr9gWZd+QKZqiGJVAwKkqBLtbdio2gpwN3R8UV+HqXDpt7MCPqqWAaxXi346o6c/utpg+2mTEequWXAAAAAAAAAAAxDvGdYgS09CKTcaZE22RVDeyvWRqWB5JcpJeLuKYklhwrGQo4dTU2QaKVtYLNYCwyedzBZCYnfcGhlKqfdkJx' + - 'E52AOybf0KGuUcTUQegwFtgT+kStZd/BrAvyvEXU0hMjvmqSRsUV2UnXTQiSPc84nQUDISfQZucvf97/Xk1jx6R+KgFVJH0HmbFv8S+ov+1GYdQ5jJcqr9/Qu8ijP5VC3KeWlKUdBsuwIOu2faHnJboPBWNpbao05PGkgNX3bKfEOONOlRDq95OegSQ7ZPL8je+uRgctJc8sCPOjWG/wTtelY3WzzzpWIMlHzkDnhlBD+KPdhvGCKVaLeV6sammHgAMBHx27Il31NhLT9xReAxifddowDew8lXDbnDcgyfO7Ih5Xa3PbuHL2UkDk9TbdRDviUYiryKriH/442bNXqP1Dym7n5PEXyqNhS4mkfuz+NOcy4cZinoN0LEMbmbHUzzoWr4PC1mqq5agESZDpHCYnHXZMo71fkcS3TD9YEPl8bdBF+EGixn8a/Rn+YzFPyPlXI42YnOmnCQddUwbujlX8VAKqSPoOSPpWPJAjvrRl376rylI/dmyHfSLYvOHuzE0784XgReO+u2mzYRVzPhDqrWcg/UMots6xDnHl3Cq9zETvZzfgt1I/FY6kErCNmJx0xS22zmGb61mZK5Rd6Ios78oJd29M' + - 'o71rjVt+N4TrRz2xy12JMMP7osKbSqB0nCgYFSXOF2toMxHy0MQ45F/Tute+hLcf/G7RWuX6gJs2zbARbF7+dymRhEdSCVjIopBwuVlgRghTEg66pgzBAToMBHx01ohpaR4KxtLaSWhz20l05utHUXqDiv30BZnJWkrNM7TiH5lgRslPwDSX8OarkujRy46iM1TH9WY4VvHZPuFwr3uuTWFr0nvCKuZ8krOaEDl6g3CryLMwS46YkL+WcodjCwKyW2fWB7b8bhXQMcOXzlU/5ha6WwGwBrUlqJut5ilucMhqH1Jdd9NDW24QNXBXPfoLZg77Khf8lat2Mnqel2NL9kutnWRiRYv18YMMrtvD90jFyPVCZpEx/5UEShzcSLDLiSli3zz4uGawueII6TDBNaFPs/BhGnZ8jSYF8hwWATbWtxki/sxUnjcIlDilkH2LC12jjlgD1JxaW8yc6m88vO2uJG07c//l0rh+D94i7c5eVKuxyoGF7B3n+I/oBWG5rV4ahwE1oIwvKtvWZc7MdleAtaeC9YNYPtyKLu3kez/J2Vw1Br7nD4O+ER1sTgXupgO5CVk2dBAQPIG0gJ/eXSxptgJ9DHdK' + - 'OZCA19XIeVMJ1B4WSHQGtM3WOxgmUF5f+Z3C9JsCmOic0FQKlDy2f7yoS3+JHxfFcj0ds7eN8qZ4qm5x5ztPLhQz5pmgcWcNhPIb5FRiB4KY3zMntNIPL/BJ3OLTdp5c22xgGZZW63pkh0ayB4tHgzLNI1mNy63PHqSVW/DH2oXpoUNAG51Gtf2Spdm77CG4yBOMeQ4Ljhsu4AuabXulYvhXEriTt/H86yj+2AvqlJ1WSmXrikDqTGyZiOhHSigjRTWJixIdjy2r2MAyMazL9Loukcq5hny9eWC+Pe+OJjoMEal3YC/W8MtQ4a0WyTUn6uIulANf/YkoZtEvXeLOGv8bGEGrm/OQn5M53oz+DUOWRyfIxIoL91JFAsaqrlMcm5xe86wQtBNPovpJQqsypT8WWmLlURIrx0FI2nbm49eSSEDl5GSyp9NyrkPWl4TaIztyoQXhGoakigSRSUGmOLS2hSXJ3nhl3eq6rKbPgAIKl3PCULa9iMKE/7tevTOTi6DfRyyPak4q72y3TZUcMkJ5g3IqMY1Bc/fN/784m7IHTAr5OCwCbIpqDwskOgNab9rlPF+Ikx/Gi5iWflOKw0T/WccaqOY5' + - '4vzgzkOekimiDN4kedjNQBnon6LI69jp9Ea7z/OYJwxDs1M+IoTkVdgvDc2OlFBGUQZvErJs6CDnOVeva8VCbQgezlpAwW+gOxk9T8W/q3t/5mSI3xdNQg6YFO9wWATYgTeshXw518axczJE4YWoIWlcP4lvEfhn9s8GV+Pv9SQaq/J20Clj1S2jZk51uR5eAom9mBB30iiQwf199BNgjzxVN7b9k6kXqhIQfjkZouAGhtq1MJlreNqmsFWe44Juw04v91YIWodtU1ikT/9BN/xYdZWzWUisfKUJXMfV9n77FH9si3VKwL/rJquR3az5aJbvxWekkXPKmjHhHnxcM7vkQYaxMxWpDdt5O2iav+RwtKArp/ogjuR6OntzB/lRjOzVvhSjaCLu7Um5I7FE2Rdwi024s9wxYIghnydl/tOz+o/c8fJ6CZELLTH8pgmbD1LEo3jtbcxQzL9eutmBNGvVghF/ZipPlM6aUNT92d8rJbz7RSB1JmfEK2YfSfy/SSQg/HIyWd0DQ23UGMK7PB9uRRf4crORoIVjvGmvH2jUPqS67ruGtgHK0EwItWkUrJTKywmAyZhUw9hzmjc4ZCb+xcAtusrC' + - '3qnXeL4NOz4ED2ctIO65UOWw6jd7spBF8wqxNsu0JWBiAZwHNxIs++hrkwwTKC+hzBzrVC7lN0tTj9KKohs6CBthIjrYnArBNsJEdK0lFJ96I9Pp90ydBr4h9ueZaMXtz1+GgDYnjHf3BdYb61qcME0rR9FS3OCNX557/cI07Pgkd3hYPc0Y6oZ7pnxEFdWqTOGXnVppiZkAAAAAAAAAAOxk9CEzxpbxtXxVacFrEXHBx5JvRn+Ir2VNlv4PPi6XFfk21ajEDhm4pyxSqfGulalRfaoh2xncWNJxBPoY7pRZGKFI8q2HgFzdFina9lfEgnTBUWT7bPrR+xPbxuBW8n1v2RDPYJ9qtj84vdmpqk09n+f69SbAA3S7xwaHFJne32MHNLa4Uio60+0DzQrCb/reryCDwCPUwA1CI07K4buFOMuoXNdulsQCJQ5uJFjrR7w0EwJqXQWv16cfEUJypJeN94TMP2LjuW38HqFEx4Ehss85FZbIrjGOTo2VCRbzzpVWzD6S5WM4WlCb3X0QRzWBKaC156+j5vOH42NwK3ngdV1WU+lAAXvpA6X/+fQSErU8LJDoDHUzB/MVhX7E24+vuGoMYdMe' + - '2eXdgYYhOVJ3+KrSn9Yi4iW9qBQ1eHH+dXEXSo+h8MoTf+xgmF1lYTBEnsGdvH/npUDU3UH0zyzcIGrgrnrpFluRHNDi2lWosjBfkPlHEx00S/nsvVLGt10XxmXSQz7QGCJP7sBesf2eWemShEtkV5pWjr+kpd0Ho8YOaHFtpFR+LLTE16IkVoexdjBMoLy+QTrupjLzNn2ZFeNrvGdmO0DwPuo6Rl9pHC0ow+CwCK1OaCoFSh5bsQXFt2EoW9BE4b+NGltcKRXywGF6wwFMdLf16PHRHMNZY8tMSz+nRe+dGoRGnInfa+M2MIJLK/s91fR09uYO76L1jGuD+y1OGEZ25F8K3zQRIHgfdR0jobq9Ypszgap+0a4dd1MZ9xuw/tHIDaMumoRVCQg/koJRcCmsAWNVV6cOp8lpRVGDHQSOZWgmBNS6ChH2UfiIKrdJ133JbvZ5PYrvJ5n1KwQtzUju8LB6hzDJIvGi7Q1Uc5JhQvHTL9CXx0pnTShq8OLhgP18yXSMvtJxfnBnr09JmpOCkKns0duziOOykzRN0XInNBWMJQ+j1g'); //== + "5vh+XFtxH9Alg3eACST6FshJ4H6FLqSoW0aGoY8GwWoLMumi13tBbqvaN6RngVxm9heWqBpoZnb13AtwY5GVS0hi84235kvx/1ximmi9hcXLgn2m/NdXlWbTba9pufCJNWyfdEg9g7B8vOyxI4yZoTanAqwxxHCNnrao0C+839aLGfpR5bOuN5zPtUCKEn0LvAx4tQggj1rlM+OEIojs7c7Cx9N3wV/S7HgXtlBdD165TMLAgzaHHYwgXbTLCwStdjyFWyigiS9YjRt59v8yVz/s9p5DEZM+D8DTn4A6GMnuAQom9fOtgxDv6PRBGXmmXc2hDH3pOhBKG+4dEkjpLFO/8tshhHM5tPUMz6aiPQlftLyc2EeYzeiKLYsHHFb5f3dxaVp1apzF8C5xoLoevKZj+atCFeZyLrGeIt5fu3gNuc4PJZS6FIJSDmOXZk2ELwMeagII6phcfyFEob5r8Ho3yxzRY2Lbg+COK0sxHGTPcEebq5YOMoVrqYa53ucetUeMh3r1bOm4/kKIX2HW/RvdAVaWYjjIYiFXkj74qS78l/9CEUR2+J19NQhWRSzrTJDJsOCnElYjCFAt+8sBbC16A/qnpkhF" + + "9G6LOL/GxKu9vvj91HfeujqsTOvIB5t58JyxBeiHnQwn+moQrIpYy4lg58FAHQzqGm+BHko1aSiQxPsHc9GW/0NQGi9gnQqf96UW4MY/N5Yc5KazuNqSUhMkdSw44IqbpahkczvsFU8r8SRXVUmzP9dm2xVEDcXHp9F5455Ct5La3xUaYZl/04agNF7AJxQjONVRe22pOaRlGPB3EEADtAJ5HZClrqLdiNJniZxKXQqTD2bfCihlwk7p1CBFCbCLMlU4kWaFKSpBKQe/xTOoQrJ+K2JUTcZzbFMERWKV4Ada9AbpU1GQih8vO2vBI2Fvw3sJ3FJV5cY5Z9Ezsf5oRCmIOcfw5xHiQJuH9xlk+aLpOK3D20sHGQwLTkf5w+v0VTTVdtNriENGEKBa64sC2CDDzfWCMvJRbeGEDb7Cseeg6N4GsPodCHuFS1QNNDM7QuKaZ7zKW3/YpgiKxDfdDsY7s6nZQ+2BIXFNvV5lo7FnYe3nte6haSQx98jVc6v21R/GheGjZxpeBjzUBBDJLSg6uY8ssEACj+vAbLLy95AX1k8Rb6HTPOBzWfGpnuSqeE7WjHTNwAZuKhnVxztC2ocStBYccEXD" + + "NxWC5O2TIW2s45BBSTn2/H7F8SGGIjt8wLCUBCusFvv510U3mlJ+v3N8Py6jtoFoM+e42brSeMqpoyo0wi/+u+SBY8z+370NjllAJG6lpnBRxu9LhCrR5CK60GUnnFCM2RSIwhhgjO4xnqVJH3zaF9OU4SgTTJxgCUv0MnLV47Ob9hKlpKrXkcy72kPSb/0PNN4fPJRq0lBPW1RomV7ha9+fr2/qj3eUJkjqWHDdCSu/x+Vtcdl8Z93msv9PIdVJPCdrRjroYAORdntPr4bHH2ihPng11LmgtowRXwMMn9QUHdLJFlggAZg9j33dUySsZKpwP8wXUlTCyYmUjgK0Jj5edtafRsLeUHRvA1h9gARF2z2CknLx5WBYSgKbVgvz+65Ypz/83GKhWl5ObK1M6EupblXOH7jMCPl0eq6CslPBAhRM9/tHG58EKJjz6442BosnrfLv+3rtypf+jApevneOBRP099jPMCwlAcMri/eNkt38F1xVTfhlxX9GBS9f6vMwG6Ky9CSqaLfsu9YNhpmPDzUBBHVMAAAAAAAAAADxLjFNNNDM7HEFIr4GGCO1rygNmTDABcGX/VziXWk8ZRmkHMYzzJoV" + + "lYRBcvjHnrjcVDK3k3aEqZQ2wTokkM9YgCsT8zLI71nEQq45fO1PXPoc2O/jq42C8uWslU0pP9Fq2CPokHobfU0iSfg88EO2A8ud2Hn58z3eLS8nNtgmdCpDpB+JHuLfb5iZnRtsEzrUrUbNPfQ2+rs131AmmCXAlk/cqoE+bYXrQbBTfuWlxAVAunWLFghHpBrkO+e7RK/juMQp0GcXl4GZk7vun765rpqN0eyXVCHzVyzdkX5uMWOT19rir/jOR6IgEjfcUzijI0PeyQPuNXn8VsSompHmAbKASNxXUeASlvVk5Lfbe3X3GINRWXoS222VUr3OLjMenbsjHXQwj1INcpP90yLZ4gpEYQwwRnf+7uLStOrUJcow/e4ggAZ1YerKSkcBWhPnSv4UhyZOMCzIg7J78RmlFmTPWbP2gtyoEap8HnivWx1WJvtkjcOytz6RF99bzjTQX3zwarVvXf0lfwrNEycYV03I5nbFKp4HOaflLriqmlSGVT4PPNmjVv9IrqqSe36+dWUlrY4th30ObPn/28hBOx7MoxRQyplpE74w6YPoQK1REAmVbqccsbW2ui20NU5Eab3KTiWgBRWvUoHKD3Hh" + + "dEWYy40OK/JZP5sxKqhjt++zim4ppPxja2qjoEwtSp09lesO5r8x46KRw5YVVL/VGBacju+by/URXWi8nU4oRrqHXxj6z3Qg0e38uLbiPr2wBzby8eNkroTZKc5libb+cLei9tpPclUOclPXXG1JKQTyOj1XQVmnCoBp6gssEI5J0HPFa7EaEYqrehk55P/XzQlaCw44rO/J+2A2WXn1SJK95pfWfzQix4kz4QUUvGHhwdm5dcm1StImYWDPG82AmkSS7Xj9hnGzzKsqiBqXk3LOv2Z/4dCI1tRbXZhalCfIEagFjD9V3mX1tDGWtQYZ90+WsdZwbkOFnR6Ly0PTNlqrioXM+j2E+ce/mcKV/P2iH9Wh3ktjD82z73Y7i0VtgD9Z+Hz3w4WyfHO+XzGRPJjjrGYzsEghv2FnTCa4+BgP+8mVxMEwyKqghiAQdhqYYFfzQiEBFqr2PHYMBlTMNS3bRcxmfZBCvPRalkvUA4Jo6KDD7zxvPae9ktJp/3O8KQriAgHtIoe33jTN6IWBj9kB7qfdYQWb1vonMhmgNVPVbxrodMzOyeoxJFwug/VUcDRVXaB75JnOJtKsVue+9/0WGFelBU44" + + "ag59pFJ0NtFb2Go4HN6f8sr3dWIxdwwysJqu2eJ5yNBd7xCRxgZ02xEQRqJRXlBFI1Ns5HKYAvzFDLz39bY8+nOhaIfNFx8DfSlBr9nyjb0/Xj60Wk87nYTu/jYbZ3FAPbjj0+cHYnEaOij58g/SSH68fHW0nnYndOXyk8frVlwY3PWeT0eLpAxu9E+prctSxpmBLZjax2B4iwbcbkadDvxl+Op1IexOMKX3IZ6OC1Ur7D9lvKV7a93QSWm68bdemZBM2+OU6lcUsgHR5upA9ruwwIJBKErdUPIEY7+PHf/o1/k7k8usuE2Mto5HfIbowd0bOZImjj98WqESCdYvyy89mKvbNcmuZxNpViv9X/UVweFsNs7igB1+su3485sX2pTTfbAN/gGHe8PsdguK2suEld/hU65EBaJHc7e0ELMShXt4PDKr3463cNBoElE7U2c5udLj5mVYTVficbJkaNeJx4/JhJclqTW7+n0a4QKLFTej36ZBiNDNXZvDeN56Ssgsmk2Az7dCd38bg722IHLSiDodM711XnotS6tqj0H02qtruxyV2ZBc/+f9jTG2g6pkIhGbOB/ArvuEQgIsSaD5CMZjAzrj" + + "pCivCASTiCat5Bw0GopTx65xIe535qhdxH9cSiWSnoy1OOmqVc3YYwY3eqna2OspoYroe7MnmJVu39pqNeSEFGt9nRmCUJSn1Bz6VaTobL/lyu3J6kLFnKNsNRwOb8F5UYHk3m+rv4n/8MUwGE0X1J1B6xWEBFiSHA1SUCjXOWHxeOwYDKiFapoFcQGO+BHNQJGifD7178wZrxUjn2Mp0jR0UO/5HrmQ4RtKB43Sd1m5Vh3l/GATMZEvH1otqZPAFlTctluiGRo+Ld4JimuZ64pm1x4PguP+jFGtt9VaCNdFM+UPiUH/fwLm3We9SFns4Giqul321S/CSCbj/0p1pWw5Bw2IrN34ZIZUjEaRpG/Rvr0mE1x8DLMPkwOPFTNKgtmEn8G/mmmcMguoVCD65PpSgkOv+QdnntTWz+loowi4Jf1YLESxR5t2kbxe3LO7x+phkEj+ZRYQY6YfgXryM0fVOGg0CaaTY8LOmExt7TAqn9/YbIHZHXseOwYDKmaUZmCJ6/vZ/YMKWY7mc3UgewdEmhQK/ElfLKilcbZZMjQfmG+KRbvC+zgapKBQs3LCVCOjrdgfrzoXJzwLi4a7bP6DJY3IabWi" + + "KHkCv9HJgPH1qUvWazg3r4iACnmyyroSVVBDEAg7DUzfNpQOB7nusgTRp85nkLLFYSQT//EltNwm8SuXxSwST4YII1GmLyis75NjL5k35ec1B7BSKTob5ucsMK5XCpxw01hgQa4UJeDeRXSz151MxJK6IoBAxWha8AsMpdyMJxy+Eofx9pxabvOeMX+x4NyGSV0RQCDsNC1pm0B+PxjNS9yjqdRq1RUoDR0U8nmJaSQAAAAAAAAAAFk+t1+hlsYeLk54FgsRa9htSuewWIh/juZf0BOHLj4Gem3bu9MOxOKsl/yJyq7xsQnMszweGdvhifPqxGLuGGR3cM9JqoetxlbFfsplV/bWA5U92m1s+5o2ko2IRFbgfB7rjzeVn2CNMdYXnE6qqSNvrDrX5cAmYkMEn6ZTmRRWq9NmncBSuO6vAsFTp8IKKzzLA243I8AHk8nCPZDhyizDO8ZeL27X00z/VjOXWCSeselOZDJdaqY34W01lHJCCnn45mG+Yj94UhTZBALHRBNILvH98MiWWxP2m8XsFgmpDogpKBTlkr5OGYtUKhB9cszAD8vrr+cbG0nIRCIrcD4lZBZNqEDp1SDGUT4f9Plm" + + "usMgP5EM6Kvy7dHCYcR+8IFMuUWs02Hzlf64lEo5IQVcnPAsFiLWrZcYZfP3cXjpvYe6K5vwofREQAWyWWVdCe11vkgkf7wLdZYSLhfP9Cq0SwkXhel6FZZrhU4nVdqf7uCDkkkTR5EyQypGI8ZSuahGW0etPkN0+LRfJBKxXoskF/bweGRLo/shYv5/3aURS7vMJ52kbcEBc+C90CSidiIgjFmivKCKj8SQbbg2803kuQ10OmZn6nFHteBwX0bvJ4LLKhUIsDnsBl719FsefSG1sYPP0FsQ2+czwGApXHefpzZyOUwBfs9VMhGGwxyB2HIOGg1Fp+07j5l6Pd+JWDr8ecft+ysu6aQZhkPvDs5fCc32e04tN09qa+n6NN8Etq3UcDihI/mNIk0KBX6qocliSLhcG/eo4/2XYDCaLrULKm5bo1GCDetCxOH+p1cilI1YKZodg3N/z5zIZLrUUaVbT7XUtypQCL9Tgc49eZdGptjV5C0E5dIrgPx+MIeWV7aed7VzVKA5aUQdgJfQtDMwyvvz4vDP4o533eC+jMNisS4lnElPRqbOcm+529HKQeJCwe7RTbp2Ay/0eqMPsEWyaKk6zeTM" + + "r38L6IRUnQgEg1SzwUaCY5JUNcLIDv7S7k438n/f+6cWejOSDGDxTfsSO1LqA+WESgyrU/27kAed6vY4D3iKGctI7FWPDLMqtZ3Estb+9+Dc28oi9PPsthHfWBNUmpxA4z/e31aKztOgwcgSQyLpwwela4FY+m0NdyeVebHh893ZsYt0QirABLjsLZ//q8KU9Kz4qC11kU97v2mx7ytoeMT2L69Iesfhds6AnMZ+XQxnEdiPkuTBTGJ7mdkkPe3+I0qlw9+2i1GQmx8VJi2/bU9m6gVLYry1GuLPWlKqaui+oFP70M4BSO1oCMDmYxTJQ/4WzRWoJxDNBJIxoGlw9ue8imyXzEywM3zoNfyzucBl3vJYfMeA81IhTt5BMrtQlfFeQ5D0k9+HCDliXdLg8UExPBr7i2avkXIK8FGyEbxHfUJ+1O6lcy47TO72474lgmJ4NOsLzEOcA+PdeOckyCh3MorZhn35FLUZReJDsPJXSw+I9+uX4oi2+piapJQ6GcTwaMsWhYZQ7mQJrxH6733zF9XATqukelZ8VJi0xqm2u/uAT0IYjjzCK887xc0L0EM26qo5dxPwL6wb7DMTLCUG26fw00iN" + + "1+Zda/LDGh5eubIWH/gg9YQuBlDEbg+fcWvrHZ6EMAGpM3WMqzFe1D/kFP2ieSJlJ8nxcB7wCTJzpMHKcKdxvpQYS6bnaz0OQNgp/4wUyH4PvsP6x3Z0yzYWqWNKapVyjxORGcJe+Tf1Re1NWuo/nugCSZZQujh7ZDfnvQtYLiLmVZ+J4FPiYYCtUuMFKI38bcVaI+NLmTXeFOD1GtCtCcY5BXimWYZeltdhcQlIfLHi1ss6IRVgAgHpFeV3n67RrbAhP2p33LeYgLduuaGmq12fjSSGRM+b/V5FNsVmJljxxrn+m6y9/erNY0G+mXnE76ciFwhAVXZRB3Hs2I5UPsK6UctnHwQ9CtSCrHGvWHn+eHoEXNrJNrI4rzOOBJrtvYZsyUly7iZhXabrvYECkDKV/dCLLBcR+DQEYHO/CurzCZMpdY/8QhyusT59z6k0uiMHSBGIgysk785Ch0zmXA5X1h+w6doas9G61vmbNDzAdXsciTxFgitRDbhAOpKXXHaYwfHbYUo+DQEY1eaMtNYPSI6FXLTPrpYeDfPLM9k6jlWrFKAO10IXAyhiN4nBg4tt0ZyUYpKJX+997Ts668/LuOZOSjFJ" + + "Bkx+ZC9lw9w9Kz4qTFpj2lvT80CpIQxHtHTRV6FhWTGsWTTaHehyZm7jZRF693ZbyG7TZxawXESbpohcIB1JxbkFOHqINGxFExByxLq53f+/SUYep1GvmdUpd7wc4FuhsPeF5GAn21JUbTC6bld4jDBa1wdlD1auyYfGgmEv8pWlq4lE9fvFcX7VKOdZ8kTKjdy7zix9uIiqFUq+Mo2xuh5hm+mT7OiLCfK9nugTtxd0AapLKF0csyGFjxQxlcruSMOBhBOY0bj8t1DTsvmIiTmoapmNHOG5H4iODORzRlp4mVaDdpeHFgLPKtfuI0G/hccTtbPxoU7/kW/hK0Vn53waAjC30QV1DJj8yF7Km6Wj5/cg2p4GrWpgMaK7sfQ4lz50lH7X0mAs9GY5GMD/ml9Qp/NoZ44kNNmDtKRJ1M1orxt1VZK1h388PQIubeobq/xfW0USH2sNcektKVU1dN/99RBtTwPYCBuoe5+MGcbbfqGjrAmBu7vKEq1mFy36eXBDZgEIKccXkyZ3e/9fnAAAAAAAAAAA6yR2pMkG1xVyTdQvBzjfb7dS7mU43bZfN/+8hj31O6OO+oT8tcFX5unrXHMnJZaq" + + "GwvavyU1xDmG4SyHKk1OIJlpoovOPgh6+vsut52cS1UFakFWttksslo65qXevqKWIqOwJqgpJYBTyFs7Nq0VgbEekAEXuHWDxR86Sj/laTDgGeHtzzYhveyBHSWR/LoYRFt9TE1SSh2o2mBp3K7wBVj1zHIwneMp1MBiWWt/9XDOIq0DOdWfmFkc2ZdHAk34i5DFqgMYe1T2Y9J/w1bQ8NhYnpE1tW7VNTCWUdPWehwS+WchzSZzLtKMHD1EGjasSSqUYWQHf2ktHXPcb19RS28KcPQNaNiKYLSzDsoerEHTZQnYM4WYfQs9l0kGMPaonszJCpbEZXeiDuLFrQGofOSatV4OcKPepEKcoYJka6Dal7RG25Yvaszth9TX9t4nKrgYXTelPEafJdzv4VvLpsGcbvn+o+tTp2SjkxvYhM4v0lkLgXwQ9FaiGm2AdDkz5XOgu3nvDQ8VXAygldweI2wsT8aU1DfkEDZN9iMFMpHdMt/Hg2xCZwMmPzKZvO9uZvjNauV7b52MNa4rW+IWWTGzwuISkPh/k70gJ7+RUANpRg6QIg0bVimeJ2+uGdMoY5KMPFOiQy9wgv746Rue0LxveSw+7UD3" + + "TEDVN9LeU9t16L+uX8KyYk2pwNKlQf0KTo//4Dz9EmQmIOSVaW+n4+Hw9Ai4qY9s0aojD92m2cLH0BCd0cYoj4p50E90h9WFRpRXm6NxC6I4QX98+oNPaB1HpNsKUAflIGya8UYKZD+hKN33NL1HEoFERwZytyMt8uCGzAIQUpMYLeWNvIkrV8qh+bD4kx37a4kkR8wuWun53RGFBCCkO0vlvraKJD7WVYQlXxnI1l07Z0BOYz+gBqaNtnZsRyof94rHmrTJfiHDU0QuEICq7JpPnblXgucUBbp7yCybMiAxpUZl+LZeT7G2Ufd1R/TUi/oNhXukZoKFqWxaoWqYu5kPrvkI63nJoV43okf0pi12hX3NXSd0HvjFC4AKGCC8vmXcsgH3orRmbRuYb5Qm50zJIb9TxOZIlUEKD5PZykIgzcyqZHuk70KaQGCJChhxDE6k9psys4vM2jYt3jVM05bcI7x8Wy+pwwm7aKqFGrPSYTGnNkjgEwIdxSlB/E2yzVrat3BL5IqneWXZhO1x5jI4b9YXNLuk6C1t1TirckVcIUfqYXe0sV2hq3DPCRzorJB/znK4vf9XyF39lyJ4qKTkTGprb5QN" + + "OFGZW08f3+RiV4zK7XG8ntmIK7DAHSwKkXudXRE8UDuiwx4RqHZDxuRjySOjmcHO9xaGxX6odtyHtKlz4JbVCa8NVn2dOlgUtAwqP1ncxvQ2AviEldEh3dPh3T2YNkhK+UXnGqRmiOV1GFR+sqWR9ZNmWHRQwB2JnqgQGGWMBltPVAgMvEYDoy0DhMZRN7893DJQeOyGHirqMKj8eVc/9yFNIDDKBQy2ZfAyK4AWwwxpvpbdGyRwh9uV7pmB4WG40fwYFNnKBfiCDtK7zA3nKWPXYFBDDxTHO8yw6KCdOg+OQHZNVz9UojnRdcHhYXe9EvWjfHNPH0urN8EvH9/CbVZIsWc5XNDxbATtFTe/QqftlxYdFDBAZX1sZ9qrcrgH7Bf6h7pO6Dzfr3nLAwT7wXM/BgVxvEY+eNYcEofpiifQfPSOd7StobnCYlNskN0m4kSbWGCAFgWPwJrX+UH8+/rYzqlL5G0Oo0PyiwYI65+bEmvQSRc0e5qSh0rnaZwiGwF8QsTmnuA6TFxyDuOSVktun14+o5naa6NT9FrYPTXn/uCQTBskJSLQCYMlh+ldhCmAwA8UMOLGs8Cghh4okwh0M6QZ1yny" + + "NB89rdQtbG/uCj+u+7Kljkruc8SQ3TGDqrcttbGhajSpKgQGXiOP33tLNaFoa2/MaiO/bvSmlWwZHLlrhRrTUlXVmNTW3jUayWBN5fKufvMcpsKjqYHhct4vlVGtelOYMCWq/1bI9hYVUh2dHihg2VBv4xz6RQc6GJxV8StkewsBgOyarn6oWXzsi0AFDBBeI1DlGYv5QQTvitM0VcwN1wenvuFtZ3+S5eMluQ3naZdaBhWRom5jerYR7xYYIItGCfTfPrepgaseuweK6H2swLeRA4y2XiMfD9ONRXSwVmBn7fcCweqOvrpfS+CDEjjN48R3ws7+vlwNzkhsNUwb0oxds2QWwxkQJuqe0adicyQDnSmz74Ll658o/ILL8q4CqKronPBdJ4ZDGqz6J3SwKM9HH54xt6k4WBvQuOOSLsi8eBmbQAvvBpD7cce/QvhiHzvrEEYDBJloPnpHtVrY3piPQmOmldGQ2AjHKm5jhFMGJ1J7wxnXy+uwRGbXKZeu5n4MCuJljHwU0vEHsFbIgHEiwywwQAuMinrhH9Xaztug3ts46YoOdK0Qk1TcxhWmC+kaF/ZVzBmN3V/+uL2xSb/lMCiviQrt" + + "1lum9bStemp5VvCIKZcifhDoZlUys1L5DlNh39rO/jnOx/MEn8kBYf9itWFnf18ul1zPJtIlh/BR7w+GVDuvYy8eQe8Qy/KPUnImNbu5SoiujbrnM0TwTUEHadNmiP2as6uU3jS7uWaAExeSjfGqm6VkoPDFETxU8THUvr2xoRd/caLz6o71tUCHhUnI9lXDfvFOaUTwXezURmPc9VE32PKs/Q1SM0T8AAAAAAAAAABfvG5ZjvVRWhbPNC7xqoUysDa9bds5XI0TdU/m3TG3Ervfp3otbJCUiefIrDpYKzA8aw4JzfpFncSuBYnH4mUhSXNad39f1GjK/WRWHSybGNoVAgMvn8nhiGckNpQmg2k3ghQeO6+JhJy11TEkcEvp19tKbxrT0jOm+YlDKpPZv501OauKDuOwU/LKrxXH4tFuGSg8dkMPFT3r4pNjhO3EXjyCwyCL+QMzuINMuUoT/WRw3rEuaGtVNZ/RN3pTxDZhyqV5AvNZdQQ6l1KC5Zp5/X9wSCaDEpzFLukTaZzNeCi5/w59rI0dVFV0TnignUPLfYjMs1IzQUS9EhtKE8+6TUnNJf26ThE+dssgjAYILz/2J7oieKB2" + + "wolX8gT7supFPf6B5G1n45TB5pU9p2IbLINoXP9JF2TzLBGX/E3spSsk1r2SLmj2sit4RJrFET9I87bt0SF8MS6erXW+tVrWF0/YtF/ULWtO1OSWEjir+pLmtO7+vrXQRqDXMgvvgghHIDuopZEqUST3W/jmnj6W8LE4JBPPCU7+4ln7yQH3dydqcksJHNt9vfj1Ae51R19ZmzwiTeyGkW2EAY+Zwer+dJi45BzbOazgWV5xIXxbtyqkOic8UMCv9QtD7D9UO26Djj4hYnNPcMCUkttFB/9Ycr/qn9/C7mcRaIrPnM36oBqBkNhqmDa5esvZO8YVx5XHMyw6KGCAyoY0RelO6H1Q9pZqX9DW3oXprYFPltXaHHCiL7aePqPVCmn2jVgrZEC4Qo7Jwu51f2BKSeOsjfEsW4b5CwwQyyPh2bLrjwLz7ik5E5TT0iVEyOChf1zQ1qq1jMal96JurYGT+wgjjwLC1caPRlsvn4H8/5zSiP26xXcFkVfzWdxHHSYuOQf/SSv7WCIz5ZrFV92yvOJC+LZzJXe3Ykjgls9vmcSm2D2nTMEUfkHreVcB9IuvdpEqkzc+8p0kmywKGenhYyK2+GIv" + + "VTaZQEd1f3qfTVbVpHsLM4IlZ0ZqoRdMuPUFfesIL7LMSMEL9EdfUzcwiNQnXew6lo9DJRgK7RAXPSMs9wFhUa5O0J+Ub8wT/UtHQcRTmHMbWz8N2ZM3ZS/8sJZ7ZEBS4CN20gqJhAyjrjpwMpsY10GcvSM13oUm+v6/EVt8MZkDlwdPhaqbDcWK1PtINrlwvsYL4/xBBKge/zbcS3CHchMf3DPthFO2CETjPjQXZNMP8RtuqzjNOWQ1Hwp3YbhaO1aU9QnPug4whXCEuHJF0Eevs70il6488rpcL29rVUp0vcR2H09w4c/fxkRx7cRe5hB4TB3ArxZ6yinWPBE/KC3tQRd2qFmvrF8hHpmj1e7UhPlJqH7zOzzjbKWW4BPk0SDwmDqdQyxrxARk3Fl1Y2nV9eXRlWyemulfBDaYuyTJ7MjaZqTvRNaVCMilsurGxAwiNcBQO4A4wZO6jGUhAxzux11GvJ6P0zEBGTdRWtHY4uVohuylD7E3EI1XecmRcJ87aQXKQgZP61CDFoDK7+xFavMkG9I4WNZzr+GBq74kL1Tnytm/jAIR8YENzBn9kLxNuw9DxgqVGERqnaB2HaG/y/E/VwEq" + + "K95PiWHhcrUnuFOoT3MkgbCx5kPfH0thGMw4Qlw5rGjSt/fXvzfYITEDhkowFMcgFKokY3Kr+lxuYA21TrrFdDlHZXQEA6PzCcIV8Lxx5iMqWLlH6YfwRXtM3xi0d73Ylwm165Bsb+BzCDwmgGDZC/7cQA5B+QN+KElIxuRL6bhyjsroCAZb+wYzDp4XSSsaWVCFYWnnKU665PT85sQ2T8p7z5XjDnRJfX/RhqM+lsJSg2EQ2FrWkE36oQIbTNMSkTq7dYclRPrdRuy5FA8VGD1lmmsehpEUwj8sq9cZEJrXE/4GLdRoNtCmBlay+8HcIhxaed2QlJbv0m28obFJNQ537aAjXk/Jy/05W2to9rkN4OrvpvTUxAQi/x8ahTLn+Wm4Xt7WqpR/biAHrvKPPzrQYjuBqTj+ZiTui3qtoae2gujdyFZge6eMxW8oHiowx5slekX6oI1bQXTgZCsws19ji/9+rgJUS8mvnAwF+AjOWTCK+YtGro/FjanMVcOIgDSWx2dtDrHzPKrh5w3XurtiAjJuorS/1QIPhyAYccudXKdUqbcSzoQWadh96DxWimGEeF62c59CC7pssHQeK/EtW2Dqwc5H" + + "dqw19xKDaRwsa7fZ/s7bX/zNsY9MNRqDH3nAEsMWBYLwq62uYqdMt+GlgByC7wb8Z6IYRfLLI1dRFGZfXfBNnb9A/S10J4ZYoDk9P7cxg9oFpAnRkuOwF6n7KM8LQGX5JamiKUK/PXzbdeInA0Y+ArMm4QxatdBs55aOgpWmLea5c/OzY26tQt9XHTgZwwzl7lSbcinXy8USmSr9ZeLRRvjvTpBWsChktwQeE0Aw4ovALt0q2tUJZ5MrSvSK6V0Hb+b7e8bcR4Qjmqy3VfYWZkAaS+29uAfWSF6o04mvYwWkG8IgrbSxPXU7MriXKfIRmX5YS7MyICkdaDGTztocf/9atsDJn4GOFrvV4n9n46GlnTTuJdIzzZj4roU7VKLZbfcK+ssQXnl5XS6ZubukJY5De2dEM0F4AYb2zohmgvDr8JKjuzR70rzX+mLxjR1VrdnX0BHFVx4L0+Rxsb3/3qpsL4CO6v70XuV9MfbIgKT1D6R/8ET8oBrdycNR9bWV6nZkbTNS+SIAAAAAAAAAAIWQnxb1jr6mRilFc6rxLMwKVRK/Odt9Lnjb2Fcx3SbVKc++CGwta0ghi102WDoPmxUs0q36zXis" + + "g6ORiOLHlbzDudplX3+Sap7LoBssHYnDB7X4UJ8vqep+6NbJJpQNzza2fhqvO27KhgeYWXAkJav7eEnf0xqzaUx8V8yTKlHi2WQTpg6KJ/8mPqVmxxWmcWxx/DRDdtyJSk9ZUoRjevja8xTpiyC88lcnaMFKuWaHEIjbfGguyLuIcHX5U3pqYi56RljzAsKiYZEW2+WCCE2ofd4BgybnCdzAGnecaZfo7cOcPax9UMimCjOhoHiowMGoK+RSs4uXP3Rr6hNKiOmiKMy+uv2aJ6vq2U4GjHwE9IlSsXgiflBc9Iyw+wSZWWAX4BVt5Iq9RDi08qc9NTGMUormSf9YhbUV75JN/Pt2DGYcIS6SVjS0kxlcxZp5hpzaUZoh0ZA+MpSBBbW+XC0ZSs6M1F8umEONTKI4Epzbm2+pyr7+OdSBsmAJ7wuMQd7R6/aRpY4VTm2mTZ7mSB9UsG+OzxP9iknYXh0ByeH1r8gmURwJTuP2mKMwde5nrVrHgi7sTbJDjdR8KMGZ2nWJ9oM32xzoks3ON8V8Id2jUwWX3lA8VGBqQvKqVD/3k11yen5zYhup4jKHUwdFnfFWoZ4Pwt/kd8Yd07TNnCJ9" + + "5Yd/A5hqNBuUnrKkFcb07WIGEZRgKJNAY4DnWuhOEbCL53K21tDxb1CSkJHVls9t6GeV7D6e4N98+SdIK1gUMshqPhTuwm20cRnNp42swPbkAYnNEAy265KtvDoCj9/3sqAXwtLTUpwgDav40FyNazSnj5ui93c347RxnY8jHwFFvkI8L1u3wfceVf79iOVdaFMDK1nz7m5ls+nE/wc6qncqwzma5evsh4Ful/hCp1sRDi2y4EhKSzMSd8s92N7dvVEMrHnrn6U1IXlVKpH1x4qwqWhG4GptQ8foC0vwszoIybNUaxYe5TnxwjXrqZC+wb7yN2YGx7IsIJIzYUVpqusBUjtvwyialGlTq5Nazt0nKDj2PhM0DosEVeyhK6BSd6GyxJeP+KKlUSLKE+VAhiJ2E1hi0/HN243f3gi3bP5dHhLInkoXig5WgWsDlphn7l95lTMD7Vmv7XSLq3jXHW2Sny35PlPu9dio+Lp5jCr2GbFpjjnPa5Xdry90kQTi7CqcgOCIZCfOXI/YgluV6sTg2Zk6xgJxRpnDpRcwdvk9GxUfUKKfQp7VBeorx1lGNGZaz9x/S5hhsftTKSNC98chwAgOhkEw" + + "hpPNFpb9e3SHJzGScTaxS9NEbIpjoXIbZpo16KZoDkrKtljyOVCaFqTl3k70Loq5N6dDXug/CNkTTmI54mx/loJ5Gjwt9nSIP27wCoMpFjyOWn5C/etlkVyq7kx5gd21GfI0eFrx6A0lXd3j7Zi9cFCJijKpnMysKMpFGdpOZlauWYgPTLMdIg2XmPo31tsmMvlo8LT/zRqgDwlkTyWFRfo61RdeJN5y9GxUfF2yRhVxPoD7/w9+IHhDzytz0qr6vRfqNq7fYrT9ERus0W+Sz0q6p9vHLWfgs0FrXa1J+tO8oxaySRSoixXRUAaK7PkU4nwd6+Me/EBP5Ix1m+2iI37c/RQbUix4TlBw8XwmaBzmlsrBWBXzvDXSpks7tIGngAz/Kf59/fYe2frD1bqksGwmY6ke9ZnRA8EZkTRAQ0H3rU3tafIFVM2dlkm2G9aryMO95+rbE2jRMYmfsCr7ZR0Y41Lh+ufx2jkjWu98psGhu/XgqO5PepE3eAXPmgseMThxYYC/jlvZ+DrL2zzlgAJ15RXTi4l+Ry0/IfD7vMYtlG63ho6jlbo8JI0hlC4J5yI2Rb/eOYP/ZP65AuQbscl3QWMNENlX" + + "w8sXIrWNTsyieuxxnK4MO5n+y1GkjBX7FGWsgm0nMyvhvQR6116/AXn3M6+UGWDFZy7JbEGjxHXCf+umUkaE82Tv0P1144c07Z5gBAdDrhj7jimTue8UTThFPrEMYlqBaXhIB0I1XBJIz0LOFKbunhysH9YGMS3Oe4LWukeS6budFBx7H4caB1YWuA3BHEouuEnBmPIfp3d8qRgByNmlBrE0jkh+wnOtQbINHph7OkR0YKtVo8+744TmKANFdvIKG4fRbYl6YXMP4n3v5F1SWIPN5rjKPb63DCNkftAdERl6Nio+oFkjhLYfQPPxiT8QddRX0UQEcdxFWNo0I3A1uNymEWWH/CBDjZtn08mrJtArC1yI7g4lF2/nejgqtdqQJpzEctnY/jFjxB5G+qjLibervHcWQvUvfR3khS8SbzmoxrowJDOboGAFB9fO6IjIj+6Cxhogr65XokSJJteAEfyl5yg2pFjwByvOu49LTL1Je75K820koTyv6Zu3aVV9EvqevQWntanowEuqW4Nr20JzFI+sO3kFkIOEgShRwSHlV9NQbFWw/XL/mWrLTz1hPtoMjmTi3APwhoNW5rlJ6QTq1yq7Cw/8" + + "F6S1E1lncGrjyOFvBNU2f/hPMAKNr1cMGEbI/L06IjJbgSD39sqRCNRvojHs6j6mM02UdFM0ByVYQDlmworSSb7W86eanyH1aMy0g6X+li3QhXUbV+ExWv7QAj3lL9GOSw5bXyDmrd8aMy3pbrGrTKPOEPV7ZcYEEI97qNYsPNerB6OhEHPY4WsNrRKRvtVs8vNmQzUywJcuVXcmss7g1AAAAAAAAAAAywKkdt6bUCnk4y/Ui556wnNLZe4shPdeblOGvM1+EK8BtPyE58vKP8/oc1xlkF/VNhO/2g/0wuYRO4csMef26C/hi6JVBSrr6XS3LrxIoeQKvFZBuJ2Xm7RqpeYiArZuROwmsMS7/4emkDtbJ6UDx39oAZD8meZHl6hKOqcajZzdEu3hYDfqfMVUJR3dDchOiMVMfZVr4xNNkWlgSGYrXbCAcsyZCbmStd5ZYsXJfFGBuAOtGbY3ybL1l9lKgjDsCwiqxV9WXaTxMn/SAXKD1q2YkZ54815jarlRlnZ1H1Mk6SFnClN3T7n9PRwV1G1IkvZhlPvaSF9aNdxzEQFbN97T9HBUd6k9wAoOs4HNDY27iNgJxl/kNhYQSZe+rLpV" + + "IbcKyVaTsoxZ9MXiJUEYdtXbXrULIfSZVdehnPVcCW+pcka0w/hRn4VS1IeivTg1VGNdGBKXw1Ajwu/chRg78p9h+W7MDJN5U0iTo53cj+1e3wtZqgpUy6wsbRqfOJRc1667oNiqfecqv6AMCcXvKNhMxk889y+/IAP2TbFYeLOnJMffwG7J+AafMj9ogIaCzClqzVHQHJQFXiuuXMDFw2Jw4sIdYwG2O4QnIDgiGcDS8JAOhGq4JFL8byd6F0XSxpU8jOlNiw/gCfj+MJV1PmVbLHmSKE0LmEo31UNH38Tqta6/iAjipZo/0sCQzFa6nKDg//hM0DhMJZXkr63hYt9nCPSzvGMCv2IPI31U68qTQp0QHBGCYAl9T9CM3dTajC+bVy5g7O9winx/GMS0Hzow26Tf6dP/QAbxmn+w8Htfa/fdTcGe9B9tBkcycW6P+fvMhmpknTMwjI3lZ3REZIlxsPlyoCks1hpHJD9ht9jv64UR1MgnZpYctr5A0UejqrNfJfe4Et52FU5AcEQynVE9drZOVwaT80eax9L5Cqibiy5EdwechSl+uZ09haxpfjfmLfx9QMN3byWk7pOeW+BFyFDdj7Wt" + + "hu1bpxH/GVLpHQvZz2FrNTfgqyVuQI/7lgf2wDECWnoLAvXhFtI8nfPYSGv7UGUMYhz/J8QIdfV9QMtx+l/TSm2qZhbaopBin181SSPshOLshHw9xQfDswJaNmgEPOIFqL+ebE2sCxn6gIvi6b67lLW5nFJ3x0+jeNm8lfA5e8zjMuUM260mJMdPzhKTMnl+Fyns6y6nCavC1rn2mVTR+F2JjL+6uFUahZp2+xfditsb6FiGNi9/tfZBP4/xNs2K0xEPpbu341wKL+7VFMxNEegwEO3Nfxq5oedd5V9C1YHu3kpVwTshtvL1U1/5ThSADMG0bRiIdh684V/bZSmROy0l6JdacYHCcYF/HOLXpVQuUsXLXFMSS/n3pr7vnCgdnnIufSHy9W7OFw2bgdyn5g6bggUctJQbHnEvYjxJ1zMh5Fz6Qvn33MuOen+Lug9gjpiDGgEPtkZHTM8NjolbI6mShVhPsnqVjMK1cgUzVENC1bjphO/zpQEtGzQCHnGMV6Ziaq50GAv/GfwG49gTEjW6nU1qfG3+ydRMF4+G7WVQZSPmoC5SiAN3LVwGIpOJiwH0/gtpHsD42r2K7YJZkUxOOuyYW2e+" + + "sQ3wgn+/lqlqaSea1Pja4eeGidzT1f8ugS4aKx+lU9H7rZDW66DKGBrFQ7I0MQ45FgT33yy5eCemJBxpURifAnU1E8zqr3xeZPKln8hMTvokfSseSJ9fWttk1xirR0xIefSnofInCkAVc9qDKpvrrjSXhnloYhxyUUg40qIwIwTwr2U3/XL2hR0GAj46a0S6Z4WIw85u3XNmqJP3zHCs/9TSTim17anfOFYyFHDqamwHw0GMDlpKgyvLsi9WNbrNBLRs0Ah42QoG7lq4DEQ7DzshH0h2yPnlCVjDiRLu3pjRSznNv4sBWTl7KSBy9Bvgh8BAkxPhaN6tJumIR8qjn04UDIScZ4W71f9VHbfz2FOgykbRXVykDc1gIMeH/jRvhLdtzxXD+1fe/aD8oSHkzkuNe2CWAS09msZCrSmKLGQIddi9EPCvFLNXxup7g3SsTWMh2JpFFjLtqWcJxxmyP/dsJLvzKLwGxmLVJpEsCPI84l7EeJKzZrl4KD9vTzm9wIyPnp1oM/1PORewnnn0N1k94G+ywIwQ1oh4QbHRS9oZsm7uMhOdsLSUh2Z12T4vglk3dxmHwFiQ6ax4PUZhdfGCfgP/bIcJ" + + "lF3AqDU+uH9FFvllirW5Jj+Vc5h+sCDvuFUzC21RSDEq5qkbVCvLQWMx5BPGFgR5QI+OgYDTEaDv81FhwyVQOtBmIvm9lXDViHbZog1LjUmlUzE1VzoMi+Fo02TfkcQh9BsJ5/UKL48SsJsPJMGhLdpJzCypWT3EH1w0Vj5Xpr9U0U82qFaLgq983+BD9kGa6momhclD+Lzl3L+01+kdK7J63d55nQUga0Q8rtbmq217rpHJ9hvoRT64aKx8rlFjEce2UyLjMqTSPBSRuamS0I+1mC4DEcfKcKxkKODJ1NiJW8KWD1X8xXZCPpDsje/Xb/BQft6ecmc9z0XweozC6kqgYFSUH1yxWBD7W7De/Zxe/qHjvJrGk27dS0rcgAPrdBgI+OixDdIUXsG3KIWaIii8n3NQFylEJwoGQk69zNOXKu30Mxwr9gWZd+QKZqiGJVAwKkqBLtbdio2gpwN3R8UV+HqXDpt7MCPqqWAaxXi346o6c/utpg+2mTEequWXAAAAAAAAAAAxDvGdYgS09CKTcaZE22RVDeyvWRqWB5JcpJeLuKYklhwrGQo4dTU2QaKVtYLNYCwyedzBZCYnfcGhlKqfdkJx" + + "E52AOybf0KGuUcTUQegwFtgT+kStZd/BrAvyvEXU0hMjvmqSRsUV2UnXTQiSPc84nQUDISfQZucvf97/Xk1jx6R+KgFVJH0HmbFv8S+ov+1GYdQ5jJcqr9/Qu8ijP5VC3KeWlKUdBsuwIOu2faHnJboPBWNpbao05PGkgNX3bKfEOONOlRDq95OegSQ7ZPL8je+uRgctJc8sCPOjWG/wTtelY3WzzzpWIMlHzkDnhlBD+KPdhvGCKVaLeV6sammHgAMBHx27Il31NhLT9xReAxifddowDew8lXDbnDcgyfO7Ih5Xa3PbuHL2UkDk9TbdRDviUYiryKriH/442bNXqP1Dym7n5PEXyqNhS4mkfuz+NOcy4cZinoN0LEMbmbHUzzoWr4PC1mqq5agESZDpHCYnHXZMo71fkcS3TD9YEPl8bdBF+EGixn8a/Rn+YzFPyPlXI42YnOmnCQddUwbujlX8VAKqSPoOSPpWPJAjvrRl376rylI/dmyHfSLYvOHuzE0784XgReO+u2mzYRVzPhDqrWcg/UMots6xDnHl3Cq9zETvZzfgt1I/FY6kErCNmJx0xS22zmGb61mZK5Rd6Ios78oJd29M" + + "o71rjVt+N4TrRz2xy12JMMP7osKbSqB0nCgYFSXOF2toMxHy0MQ45F/Tute+hLcf/G7RWuX6gJs2zbARbF7+dymRhEdSCVjIopBwuVlgRghTEg66pgzBAToMBHx01ohpaR4KxtLaSWhz20l05utHUXqDiv30BZnJWkrNM7TiH5lgRslPwDSX8OarkujRy46iM1TH9WY4VvHZPuFwr3uuTWFr0nvCKuZ8krOaEDl6g3CryLMwS46YkL+WcodjCwKyW2fWB7b8bhXQMcOXzlU/5ha6WwGwBrUlqJut5ilucMhqH1Jdd9NDW24QNXBXPfoLZg77Khf8lat2Mnqel2NL9kutnWRiRYv18YMMrtvD90jFyPVCZpEx/5UEShzcSLDLiSli3zz4uGawueII6TDBNaFPs/BhGnZ8jSYF8hwWATbWtxki/sxUnjcIlDilkH2LC12jjlgD1JxaW8yc6m88vO2uJG07c//l0rh+D94i7c5eVKuxyoGF7B3n+I/oBWG5rV4ahwE1oIwvKtvWZc7MdleAtaeC9YNYPtyKLu3kez/J2Vw1Br7nD4O+ER1sTgXupgO5CVk2dBAQPIG0gJ/eXSxptgJ9DHdK" + + "OZCA19XIeVMJ1B4WSHQGtM3WOxgmUF5f+Z3C9JsCmOic0FQKlDy2f7yoS3+JHxfFcj0ds7eN8qZ4qm5x5ztPLhQz5pmgcWcNhPIb5FRiB4KY3zMntNIPL/BJ3OLTdp5c22xgGZZW63pkh0ayB4tHgzLNI1mNy63PHqSVW/DH2oXpoUNAG51Gtf2Spdm77CG4yBOMeQ4Ljhsu4AuabXulYvhXEriTt/H86yj+2AvqlJ1WSmXrikDqTGyZiOhHSigjRTWJixIdjy2r2MAyMazL9Loukcq5hny9eWC+Pe+OJjoMEal3YC/W8MtQ4a0WyTUn6uIulANf/YkoZtEvXeLOGv8bGEGrm/OQn5M53oz+DUOWRyfIxIoL91JFAsaqrlMcm5xe86wQtBNPovpJQqsypT8WWmLlURIrx0FI2nbm49eSSEDl5GSyp9NyrkPWl4TaIztyoQXhGoakigSRSUGmOLS2hSXJ3nhl3eq6rKbPgAIKl3PCULa9iMKE/7tevTOTi6DfRyyPak4q72y3TZUcMkJ5g3IqMY1Bc/fN/784m7IHTAr5OCwCbIpqDwskOgNab9rlPF+Ikx/Gi5iWflOKw0T/WccaqOY5" + + "4vzgzkOekimiDN4kedjNQBnon6LI69jp9Ea7z/OYJwxDs1M+IoTkVdgvDc2OlFBGUQZvErJs6CDnOVeva8VCbQgezlpAwW+gOxk9T8W/q3t/5mSI3xdNQg6YFO9wWATYgTeshXw518axczJE4YWoIWlcP4lvEfhn9s8GV+Pv9SQaq/J20Clj1S2jZk51uR5eAom9mBB30iiQwf199BNgjzxVN7b9k6kXqhIQfjkZouAGhtq1MJlreNqmsFWe44Juw04v91YIWodtU1ikT/9BN/xYdZWzWUisfKUJXMfV9n77FH9si3VKwL/rJquR3az5aJbvxWekkXPKmjHhHnxcM7vkQYaxMxWpDdt5O2iav+RwtKArp/ogjuR6OntzB/lRjOzVvhSjaCLu7Um5I7FE2Rdwi024s9wxYIghnydl/tOz+o/c8fJ6CZELLTH8pgmbD1LEo3jtbcxQzL9eutmBNGvVghF/ZipPlM6aUNT92d8rJbz7RSB1JmfEK2YfSfy/SSQg/HIyWd0DQ23UGMK7PB9uRRf4crORoIVjvGmvH2jUPqS67ruGtgHK0EwItWkUrJTKywmAyZhUw9hzmjc4ZCb+xcAtusrC" + + "3qnXeL4NOz4ED2ctIO65UOWw6jd7spBF8wqxNsu0JWBiAZwHNxIs++hrkwwTKC+hzBzrVC7lN0tTj9KKohs6CBthIjrYnArBNsJEdK0lFJ96I9Pp90ydBr4h9ueZaMXtz1+GgDYnjHf3BdYb61qcME0rR9FS3OCNX557/cI07Pgkd3hYPc0Y6oZ7pnxEFdWqTOGXnVppiZkAAAAAAAAAAOxk9CEzxpbxtXxVacFrEXHBx5JvRn+Ir2VNlv4PPi6XFfk21ajEDhm4pyxSqfGulalRfaoh2xncWNJxBPoY7pRZGKFI8q2HgFzdFina9lfEgnTBUWT7bPrR+xPbxuBW8n1v2RDPYJ9qtj84vdmpqk09n+f69SbAA3S7xwaHFJne32MHNLa4Uio60+0DzQrCb/reryCDwCPUwA1CI07K4buFOMuoXNdulsQCJQ5uJFjrR7w0EwJqXQWv16cfEUJypJeN94TMP2LjuW38HqFEx4Ehss85FZbIrjGOTo2VCRbzzpVWzD6S5WM4WlCb3X0QRzWBKaC156+j5vOH42NwK3ngdV1WU+lAAXvpA6X/+fQSErU8LJDoDHUzB/MVhX7E24+vuGoMYdMe" + + "2eXdgYYhOVJ3+KrSn9Yi4iW9qBQ1eHH+dXEXSo+h8MoTf+xgmF1lYTBEnsGdvH/npUDU3UH0zyzcIGrgrnrpFluRHNDi2lWosjBfkPlHEx00S/nsvVLGt10XxmXSQz7QGCJP7sBesf2eWemShEtkV5pWjr+kpd0Ho8YOaHFtpFR+LLTE16IkVoexdjBMoLy+QTrupjLzNn2ZFeNrvGdmO0DwPuo6Rl9pHC0ow+CwCK1OaCoFSh5bsQXFt2EoW9BE4b+NGltcKRXywGF6wwFMdLf16PHRHMNZY8tMSz+nRe+dGoRGnInfa+M2MIJLK/s91fR09uYO76L1jGuD+y1OGEZ25F8K3zQRIHgfdR0jobq9Ypszgap+0a4dd1MZ9xuw/tHIDaMumoRVCQg/koJRcCmsAWNVV6cOp8lpRVGDHQSOZWgmBNS6ChH2UfiIKrdJ133JbvZ5PYrvJ5n1KwQtzUju8LB6hzDJIvGi7Q1Uc5JhQvHTL9CXx0pnTShq8OLhgP18yXSMvtJxfnBnr09JmpOCkKns0duziOOykzRN0XInNBWMJQ+j1g", + ); //== // Variables var sigma, N, h; @@ -208,12 +215,14 @@ var digest2012 = (function () // // 512bit tools function add512(x, y) { - var CF = 0, w0, w1; + var CF = 0, + w0, + w1; for (var i = 0; i < 16; i++) { w0 = (x[i] & 0xffff) + (y[i] & 0xffff) + (CF || 0); w1 = (x[i] >>> 16) + (y[i] >>> 16) + (w0 >>> 16); x[i] = (w0 & 0xffff) | (w1 << 16); - CF = (w1 >>> 16); + CF = w1 >>> 16; } } @@ -221,10 +230,8 @@ var digest2012 = (function () // return new Int32Array(d.buffer, d.byteOffset, 16); } - function copy512(r, d) { - for (var i = 0; i < 16; i++) - r[i] = d[i]; + for (var i = 0; i < 16; i++) r[i] = d[i]; } function new512() { @@ -233,17 +240,17 @@ var digest2012 = (function () // // Core private algorithms function xor512(x, y) { - for (var i = 0; i < 16; i++) - x[i] = x[i] ^ y[i]; + for (var i = 0; i < 16; i++) x[i] = x[i] ^ y[i]; } - var r = new512(); function XLPS(x, y) { copy512(r, x); xor512(r, y); for (var i = 0; i < 8; i++) { - var z0, z1, k = get8(r, i) << 1; + var z0, + z1, + k = get8(r, i) << 1; z0 = Ax[k]; z1 = Ax[k + 1]; for (var j = 1; j < 8; j++) { @@ -256,9 +263,9 @@ var digest2012 = (function () // } } - var data = new512(), Ki = new512(); - function g(h, N, m) - { + var data = new512(), + Ki = new512(); + function g(h, N, m) { var i; copy512(data, h); @@ -292,18 +299,17 @@ var digest2012 = (function () // function stage3(d) { var n = d.length; - if (n > 63) - return; + if (n > 63) return; var b0 = new Int32Array(16); b0[0] = n << 3; var b = new Uint8Array(64); - for (var i = 0; i < n; i++) - b[i] = d[i]; + for (var i = 0; i < n; i++) b[i] = d[i]; b[n] = 0x01; - var m = get512(b), m0 = get512(b0); + var m = get512(b), + m0 = get512(b0); g(h, N, m); add512(N, m0); @@ -314,7 +320,6 @@ var digest2012 = (function () // } return function (data) { - // Cleanup sigma = new512(); N = new512(); @@ -322,14 +327,14 @@ var digest2012 = (function () // // Initial vector h = new512(); for (var i = 0; i < 16; i++) - if (this.bitLength === 256) - h[i] = 0x01010101; + if (this.bitLength === 256) h[i] = 0x01010101; // Make data var d = new Uint8Array(buffer(data)); var n = d.length; - var r = n % 64, q = (n - r) / 64; + var r = n % 64, + q = (n - r) / 64; for (var i = 0; i < q; i++) stage2.call(this, new Uint8Array(d.buffer, i * 64, 64)); @@ -339,21 +344,17 @@ var digest2012 = (function () // var digest; if (this.bitLength === 256) { digest = new Int32Array(8); - for (var i = 0; i < 8; i++) - digest[i] = h[8 + i]; + for (var i = 0; i < 8; i++) digest[i] = h[8 + i]; } else { digest = new Int32Array(16); - for (var i = 0; i < 16; i++) - digest[i] = h[i]; + for (var i = 0; i < 16; i++) digest[i] = h[i]; } // Swap hash for SignalCom - if (this.procreator === 'SC' || this.procreator === 'VN') + if (this.procreator === "SC" || this.procreator === "VN") return swap(digest.buffer); - else - return digest.buffer; + else return digest.buffer; }; -} // -)(); +})(); // /** * Algorithm name GOST R 34.11-94

    @@ -367,8 +368,8 @@ var digest2012 = (function () // * @param {(ArrayBuffer|TypedArray)} data Data * @returns {ArrayBuffer} Digest of data */ -var digest94 = (function () // -{ +var digest94 = (function () { + // var C, H, M, Sum; // (i + 1 + 4(k - 1)) = 8i + k i = 0-3, k = 1-8 @@ -377,7 +378,7 @@ var digest94 = (function () // for (var k = 0; k < 8; k++) { K[4 * k] = d[k]; - K[1 + 4 * k] = d[ 8 + k]; + K[1 + 4 * k] = d[8 + k]; K[2 + 4 * k] = d[16 + k]; K[3 + 4 * k] = d[24 + k]; } @@ -386,13 +387,11 @@ var digest94 = (function () // } //A (x) = (x0 ^ x1) || x3 || x2 || x1 - function A(d) - { + function A(d) { var a = new Uint8Array(8); - for (var j = 0; j < 8; j++) - { - a[j] = (d[j] ^ d[j + 8]); + for (var j = 0; j < 8; j++) { + a[j] = d[j] ^ d[j + 8]; } arraycopy(d, 8, d, 0, 24); @@ -419,8 +418,10 @@ var digest94 = (function () // // block processing function process(d, dOff) { - var S = new Uint8Array(32), U = new Uint8Array(32), - V = new Uint8Array(32), W = new Uint8Array(32); + var S = new Uint8Array(32), + U = new Uint8Array(32), + V = new Uint8Array(32), + W = new Uint8Array(32); arraycopy(d, dOff, M, 0, 32); @@ -430,9 +431,8 @@ var digest94 = (function () // // S = s3 || s2 || s1 || s0 arraycopy(H, 0, U, 0, 32); arraycopy(M, 0, V, 0, 32); - for (var j = 0; j < 32; j++) - { - W[j] = (U[j] ^ V[j]); + for (var j = 0; j < 32; j++) { + W[j] = U[j] ^ V[j]; } // Encrypt GOST 28147-ECB encrypt.call(this, P(W), S, 0, H, 0); // s0 = EK0 [h0] @@ -441,11 +441,11 @@ var digest94 = (function () // for (var i = 1; i < 4; i++) { var tmpA = A(U); for (var j = 0; j < 32; j++) { - U[j] = (tmpA[j] ^ C[i][j]); + U[j] = tmpA[j] ^ C[i][j]; } V = A(A(V)); for (var j = 0; j < 32; j++) { - W[j] = (U[j] ^ V[j]); + W[j] = U[j] ^ V[j]; } // Encrypt GOST 28147-ECB encrypt.call(this, P(W), S, i * 8, H, i * 8); // si = EKi [hi] @@ -456,13 +456,13 @@ var digest94 = (function () // fw(S); } for (var n = 0; n < 32; n++) { - S[n] = (S[n] ^ M[n]); + S[n] = S[n] ^ M[n]; } fw(S); for (var n = 0; n < 32; n++) { - S[n] = (H[n] ^ S[n]); + S[n] = H[n] ^ S[n]; } for (var n = 0; n < 61; n++) { fw(S); @@ -470,13 +470,10 @@ var digest94 = (function () // arraycopy(S, 0, H, 0, H.length); } - // 256 bitsblock modul -> (Sum + a mod (2^256)) - function summing(d) - { + function summing(d) { var carry = 0; - for (var i = 0; i < Sum.length; i++) - { + for (var i = 0; i < Sum.length; i++) { var sum = (Sum[i] & 0xff) + (d[i] & 0xff) + carry; Sum[i] = sum; @@ -487,14 +484,12 @@ var digest94 = (function () // // reset the chaining variables to the IV values. var C2 = new Uint8Array([ - 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, - 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, - 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, + 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, ]); return function (data) { - // Reset buffers H = new Uint8Array(32); M = new Uint8Array(32); @@ -502,15 +497,15 @@ var digest94 = (function () // // Reset IV value C = new Array(4); - for (var i = 0; i < 4; i++) - C[i] = new Uint8Array(32); + for (var i = 0; i < 4; i++) C[i] = new Uint8Array(32); arraycopy(C2, 0, C[2], 0, C2.length); // Make data var d = new Uint8Array(buffer(data)); var n = d.length; - var r = n % 32, q = (n - r) / 32; + var r = n % 32, + q = (n - r) / 32; // Proccess full blocks for (var i = 0; i < q; i++) { @@ -523,15 +518,16 @@ var digest94 = (function () // // load d the remadder with padding zero; if (r > 0) { var b = new Uint8Array(d.buffer, q * 32), - c = new Uint8Array(32); + c = new Uint8Array(32); arraycopy(b, 0, c, 0, r); summing.call(this, c); // calc sum M process.call(this, c, 0); - } // get length into L (byteCount * 8 = bitCount) in little endian. - var L = new Uint8Array(32), n8 = n * 8, k = 0; + var L = new Uint8Array(32), + n8 = n * 8, + k = 0; while (n8 > 0) { L[k++] = n8 & 0xff; n8 = Math.floor(n8 / 256); @@ -542,14 +538,11 @@ var digest94 = (function () // var h = H.buffer; // Swap hash for SignalCom - if (this.procreator === 'SC') - h = swap(h); + if (this.procreator === "SC") h = swap(h); return h; }; - -} // -)(); +})(); // /** * Algorithm name SHA-1

    @@ -564,49 +557,47 @@ var digest94 = (function () // * @param {(ArrayBuffer|TypedArray)} data Data * @returns {ArrayBuffer} Digest of data */ -var digestSHA1 = (function () // -{ - +var digestSHA1 = (function () { + // // Create a buffer for each 80 word block. - var state, block = new Uint32Array(80); + var state, + block = new Uint32Array(80); function common(a, e, w, k, f) { return (f + e + w + k + ((a << 5) | (a >>> 27))) >>> 0; } function f1(a, b, c, d, e, w) { - return common(a, e, w, 0x5A827999, d ^ (b & (c ^ d))); + return common(a, e, w, 0x5a827999, d ^ (b & (c ^ d))); } function f2(a, b, c, d, e, w) { - return common(a, e, w, 0x6ED9EBA1, b ^ c ^ d); + return common(a, e, w, 0x6ed9eba1, b ^ c ^ d); } function f3(a, b, c, d, e, w) { - return common(a, e, w, 0x8F1BBCDC, (b & c) | (d & (b | c))); + return common(a, e, w, 0x8f1bbcdc, (b & c) | (d & (b | c))); } function f4(a, b, c, d, e, w) { - return common(a, e, w, 0xCA62C1D6, b ^ c ^ d); + return common(a, e, w, 0xca62c1d6, b ^ c ^ d); } function cycle(state, block) { var a = state[0], - b = state[1], - c = state[2], - d = state[3], - e = state[4]; + b = state[1], + c = state[2], + d = state[3], + e = state[4]; // Partially unroll loops so we don't have to shift variables. var fn = f1; for (var i = 0; i < 80; i += 5) { if (i === 20) { fn = f2; - } - else if (i === 40) { + } else if (i === 40) { fn = f3; - } - else if (i === 60) { + } else if (i === 60) { fn = f4; } e = fn(a, b, c, d, e, block[i]); @@ -629,15 +620,18 @@ var digestSHA1 = (function () // // Swap bytes for 32bits word function swap32(b) { - return ((b & 0xff) << 24) - | ((b & 0xff00) << 8) - | ((b >> 8) & 0xff00) - | ((b >> 24) & 0xff); + return ( + ((b & 0xff) << 24) | + ((b & 0xff00) << 8) | + ((b >> 8) & 0xff00) | + ((b >> 24) & 0xff) + ); } // input is a Uint8Array bitstream of the data return function (data) { - var d = new Uint8Array(buffer(data)), dlen = d.length; + var d = new Uint8Array(buffer(data)), + dlen = d.length; // Pad the input string length. var len = dlen + 9; @@ -653,52 +647,45 @@ var digestSHA1 = (function () // state[4] = 0xc3d2e1f0; for (var ofs = 0; ofs < len; ofs += 64) { - // Copy input to block and write padding as needed for (var i = 0; i < 64; i++) { var b = 0, - o = ofs + i; + o = ofs + i; if (o < dlen) { b = d[o]; - } - else if (o === dlen) { + } else if (o === dlen) { b = 0x80; - } - else { + } else { // Write original bit length as a 64bit big-endian integer to the end. var x = len - o - 1; if (x >= 0 && x < 4) { - b = (dlen << 3 >>> (x * 8)) & 0xff; + b = ((dlen << 3) >>> (x * 8)) & 0xff; } } // Interpret the input bytes as big-endian per the spec if (i % 4 === 0) { block[i >> 2] = b << 24; - } - else { + } else { block[i >> 2] |= b << ((3 - (i % 4)) * 8); } } // Extend the block for (var i = 16; i < 80; i++) { - var w = block[i - 3] ^ block[i - 8] ^ block[i - 14] ^ block[i - 16]; + var w = + block[i - 3] ^ block[i - 8] ^ block[i - 14] ^ block[i - 16]; block[i] = (w << 1) | (w >>> 31); } cycle(state, block); - } // Swap the bytes around since they are big endian internally - for (var i = 0; i < 5; i++) - state[i] = swap32(state[i]); + for (var i = 0; i < 5; i++) state[i] = swap32(state[i]); return state.buffer; }; - -} // -)(); +})(); // /** * Algorithm name GOST R 34.11-HMAC

    @@ -710,17 +697,17 @@ var digestSHA1 = (function () // * @param {ArrayBuffer} key The key for HMAC. * @param {Hash} data Data */ -function signHMAC(key, data) // -{ +function signHMAC(key, data) { + // // GOST R 34.11-94 - B=32b, L=32b // GOST R 34.11-256 - B=64b, L=32b // GOST R 34.11-512 - B=64b, L=64b - var b = (this.digest === digest94) ? 32 : 64, - l = this.bitLength / 8, - k = buffer(key), - d = buffer(data), k0; - if (k.byteLength === b) - k0 = new Uint8Array(k); + var b = this.digest === digest94 ? 32 : 64, + l = this.bitLength / 8, + k = buffer(key), + d = buffer(data), + k0; + if (k.byteLength === b) k0 = new Uint8Array(k); else { var k0 = new Uint8Array(b); if (k.byteLength > b) { @@ -730,10 +717,10 @@ function signHMAC(key, data) // } } var s0 = new Uint8Array(b + d.byteLength), - s1 = new Uint8Array(b + l); + s1 = new Uint8Array(b + l); for (var i = 0; i < b; i++) { s0[i] = k0[i] ^ 0x36; - s1[i] = k0[i] ^ 0x5C; + s1[i] = k0[i] ^ 0x5c; } s0.set(new Uint8Array(d), b); s1.set(new Uint8Array(this.digest(s0)), b); @@ -753,19 +740,16 @@ function signHMAC(key, data) // * @param {(ArrayBuffer|TypedArray)} data Data * @returns {boolean} HMAC verified = true */ -function verifyHMAC(key, signature, data) // -{ +function verifyHMAC(key, signature, data) { + // var hmac = new Uint8Array(this.sign(key, data)), - test = new Uint8Array(signature); - if (hmac.length !== test.length) - return false; + test = new Uint8Array(signature); + if (hmac.length !== test.length) return false; for (var i = 0, n = hmac.length; i < n; i++) - if (hmac[i] !== test[i]) - return false; + if (hmac[i] !== test[i]) return false; return true; } // - /** * Algorithm name GOST R 34.11-KDF

    * @@ -776,8 +760,8 @@ function verifyHMAC(key, signature, data) // -{ +function generateKey() { + // return getSeed(this.bitLength).buffer; } // @@ -796,33 +780,36 @@ function generateKey() // * @param {number} length output bit-length * @returns {ArrayBuffer} result */ -function deriveBitsPFXKDF(baseKey, length) // -{ - if (length % 8 > 0) - throw new DataError('Length must multiple of 8'); - var u = this.bitLength / 8, v = (this.digest === digest94) ? 32 : 64, - n = length / 8, r = this.iterations; +function deriveBitsPFXKDF(baseKey, length) { + // + if (length % 8 > 0) throw new DataError("Length must multiple of 8"); + var u = this.bitLength / 8, + v = this.digest === digest94 ? 32 : 64, + n = length / 8, + r = this.iterations; // 1. Construct a string, D (the "diversifier"), by concatenating v/8 // copies of ID. - var ID = this.diversifier, D = new Uint8Array(v); - for (var i = 0; i < v; i++) - D[i] = ID; + var ID = this.diversifier, + D = new Uint8Array(v); + for (var i = 0; i < v; i++) D[i] = ID; // 2. Concatenate copies of the salt together to create a string S of // length v(ceiling(s/v)) bits (the final copy of the salt may be // truncated to create S). Note that if the salt is the empty // string, then so is S. - var S0 = new Uint8Array(buffer(this.salt)), s = S0.length, - slen = v * Math.ceil(s / v), S = new Uint8Array(slen); - for (var i = 0; i < slen; i++) - S[i] = S0[i % s]; + var S0 = new Uint8Array(buffer(this.salt)), + s = S0.length, + slen = v * Math.ceil(s / v), + S = new Uint8Array(slen); + for (var i = 0; i < slen; i++) S[i] = S0[i % s]; // 3. Concatenate copies of the password together to create a string P // of length v(ceiling(p/v)) bits (the final copy of the password // may be truncated to create P). Note that if the password is the // empty string, then so is P. - var P0 = new Uint8Array(buffer(baseKey)), p = P0.length, - plen = v * Math.ceil(p / v), P = new Uint8Array(plen); - for (var i = 0; i < plen; i++) - P[i] = P0[i % p]; + var P0 = new Uint8Array(buffer(baseKey)), + p = P0.length, + plen = v * Math.ceil(p / v), + P = new Uint8Array(plen); + for (var i = 0; i < plen; i++) P[i] = P0[i % p]; // 4. Set I=S||P to be the concatenation of S and P. var I = new Uint8Array(slen + plen); arraycopy(S, 0, I, 0, slen); @@ -837,20 +824,19 @@ function deriveBitsPFXKDF(baseKey, length) // -{ - if (length % 8 > 0) - throw new DataError('Length must be multiple of 8'); - var rlen = length / 8, label, context = new Uint8Array(buffer(this.context)), - blen = this.bitLength / 8, n = Math.ceil(rlen / blen); - if (this.label) - label = new Uint8Array(buffer(this.label)); - else - label = new Uint8Array([0x26, 0xBD, 0xB8, 0x78]); +function deriveBitsKDF(baseKey, length) { + // + if (length % 8 > 0) throw new DataError("Length must be multiple of 8"); + var rlen = length / 8, + label, + context = new Uint8Array(buffer(this.context)), + blen = this.bitLength / 8, + n = Math.ceil(rlen / blen); + if (this.label) label = new Uint8Array(buffer(this.label)); + else label = new Uint8Array([0x26, 0xbd, 0xb8, 0x78]); var result = new Uint8Array(rlen); for (var i = 0; i < n; i++) { var data = new Uint8Array(label.length + context.length + 4); @@ -899,8 +885,14 @@ function deriveBitsKDF(baseKey, length) // >> 8; data[data.length - 1] = length & 0xff; - result.set(new Uint8Array(signHMAC.call(this, baseKey, data), 0, - i < n - 1 ? blen : rlen - i * blen), i * blen); + result.set( + new Uint8Array( + signHMAC.call(this, baseKey, data), + 0, + i < n - 1 ? blen : rlen - i * blen, + ), + i * blen, + ); } return result.buffer; } // @@ -920,23 +912,27 @@ function deriveBitsKDF(baseKey, length) // -{ +function deriveBitsPBKDF1(baseKey, length) { + // if (length < this.bitLength / 2 || length % 8 > 0) - throw new DataError('Length must be more than ' + this.bitLength / 2 + ' bits and multiple of 8'); - var hLen = this.bitLength / 8, dkLen = length / 8, - c = this.iterations, - P = new Uint8Array(buffer(baseKey)), - S = new Uint8Array(buffer(this.salt)), - slen = S.length, plen = P.length, - T = new Uint8Array(plen + slen), - DK = new Uint8Array(dkLen); - if (dkLen > hLen) - throw new DataError('Invalid parameters: Length value'); + throw new DataError( + "Length must be more than " + + this.bitLength / 2 + + " bits and multiple of 8", + ); + var hLen = this.bitLength / 8, + dkLen = length / 8, + c = this.iterations, + P = new Uint8Array(buffer(baseKey)), + S = new Uint8Array(buffer(this.salt)), + slen = S.length, + plen = P.length, + T = new Uint8Array(plen + slen), + DK = new Uint8Array(dkLen); + if (dkLen > hLen) throw new DataError("Invalid parameters: Length value"); arraycopy(P, 0, T, 0, plen); arraycopy(S, 0, T, plen, slen); - for (var i = 0; i < c; i++) - T = new Uint8Array(this.digest(T)); + for (var i = 0; i < c; i++) T = new Uint8Array(this.digest(T)); arraycopy(T, 0, DK, 0, dkLen); return DK.buffer; } // @@ -956,45 +952,50 @@ function deriveBitsPBKDF1(baseKey, length) // -{ +function deriveBitsPBKDF2(baseKey, length) { + // var diversifier = this.diversifier || 1; // For PKCS12 MAC required 3*length length = length * diversifier; if (length < this.bitLength / 2 || length % 8 > 0) - throw new DataError('Length must be more than ' + this.bitLength / 2 + ' bits and multiple of 8'); - var hLen = this.bitLength / 8, dkLen = length / 8, - c = this.iterations, - P = new Uint8Array(buffer(baseKey)), - S = new Uint8Array(buffer(this.salt)); + throw new DataError( + "Length must be more than " + + this.bitLength / 2 + + " bits and multiple of 8", + ); + var hLen = this.bitLength / 8, + dkLen = length / 8, + c = this.iterations, + P = new Uint8Array(buffer(baseKey)), + S = new Uint8Array(buffer(this.salt)); var slen = S.byteLength, - data = new Uint8Array(slen + 4); + data = new Uint8Array(slen + 4); arraycopy(S, 0, data, 0, slen); if (dkLen > (0xffffffff - 1) * 32) - throw new DataError('Invalid parameters: Length value'); + throw new DataError("Invalid parameters: Length value"); var n = Math.ceil(dkLen / hLen), - DK = new Uint8Array(dkLen); + DK = new Uint8Array(dkLen); for (var i = 1; i <= n; i++) { - data[slen] = i >>> 24 & 0xff; - data[slen + 1] = i >>> 16 & 0xff; - data[slen + 2] = i >>> 8 & 0xff; + data[slen] = (i >>> 24) & 0xff; + data[slen + 1] = (i >>> 16) & 0xff; + data[slen + 2] = (i >>> 8) & 0xff; data[slen + 3] = i & 0xff; - var U = new Uint8Array(signHMAC.call(this, P, data)), Z = U; + var U = new Uint8Array(signHMAC.call(this, P, data)), + Z = U; for (var j = 1; j < c; j++) { U = new Uint8Array(signHMAC.call(this, P, U)); - for (var k = 0; k < hLen; k++) - Z[k] = U[k] ^ Z[k]; + for (var k = 0; k < hLen; k++) Z[k] = U[k] ^ Z[k]; } var ofs = (i - 1) * hLen; arraycopy(Z, 0, DK, ofs, Math.min(hLen, dkLen - ofs)); } if (diversifier > 1) { - var rLen = dkLen / diversifier, R = new Uint8Array(rLen); + var rLen = dkLen / diversifier, + R = new Uint8Array(rLen); arraycopy(DK, dkLen - rLen, R, 0, rLen); return R.buffer; - } else - return DK.buffer; + } else return DK.buffer; } // /** @@ -1014,35 +1015,40 @@ function deriveBitsPBKDF2(baseKey, length) // 0 ? new Uint8Array(buffer(baseKey)) : false, - plen = p ? p.length : 0, - iterations = this.iterations, - salt = new Uint8Array(buffer(this.salt)), - slen = salt.length, - d = new Uint8Array(slen + plen); + var b = this.digest === digest94 ? 32 : 64, + l = this.bitLength / 8, + p = + baseKey && baseKey.byteLength > 0 + ? new Uint8Array(buffer(baseKey)) + : false, + plen = p ? p.length : 0, + iterations = this.iterations, + salt = new Uint8Array(buffer(this.salt)), + slen = salt.length, + d = new Uint8Array(slen + plen); arraycopy(salt, 0, d, 0, slen); - if (p) - arraycopy(p, 0, d, slen, plen); + if (p) arraycopy(p, 0, d, slen, plen); var h = new Uint8Array(this.digest(d)), - k = new Uint8Array(b), - s0 = new Uint8Array(b), - s1 = new Uint8Array(b); - var c = 'DENEFH028.760246785.IUEFHWUIO.EF'; - for (var i = 0; i < c.length; i++) - k[i] = c.charCodeAt(i); + k = new Uint8Array(b), + s0 = new Uint8Array(b), + s1 = new Uint8Array(b); + var c = "DENEFH028.760246785.IUEFHWUIO.EF"; + for (var i = 0; i < c.length; i++) k[i] = c.charCodeAt(i); d = new Uint8Array(2 * (b + l)); for (var j = 0; j < iterations; j++) { for (var i = 0; i < b; i++) { s0[i] = k[i] ^ 0x36; - s1[i] = k[i] ^ 0x5C; + s1[i] = k[i] ^ 0x5c; k[i] = 0; } arraycopy(s0, 0, d, 0, b); @@ -1053,20 +1059,19 @@ function deriveBitsCP(baseKey, length) { } for (var i = 0; i < l; i++) { s0[i] = k[i] ^ 0x36; - s1[i] = k[i] ^ 0x5C; + s1[i] = k[i] ^ 0x5c; k[i] = 0; } d = new Uint8Array(2 * l + slen + plen); arraycopy(s0, 0, d, 0, l); arraycopy(salt, 0, d, l, slen); arraycopy(s1, 0, d, l + slen, l); - if (p) - arraycopy(p, 0, d, l + slen + l, plen); + if (p) arraycopy(p, 0, d, l + slen + l, plen); h = this.digest(this.digest(d)); - if (length === this.bitLength) - return h; + if (length === this.bitLength) return h; else { - var rlen = length / 8, r = new Uint8Array(rlen); + var rlen = length / 8, + r = new Uint8Array(rlen); arraycopy(h, 0, r, 0, rlen); return r.buffer; } @@ -1083,8 +1088,8 @@ function deriveBitsCP(baseKey, length) { * @param {ArrayBuffer} baseKey * @returns {ArrayBuffer} */ -function deriveKey(baseKey) // -{ +function deriveKey(baseKey) { + // return this.deriveBits(baseKey, this.keySize * 8); } // @@ -1165,16 +1170,20 @@ function deriveKey(baseKey) // * @class GostDigest * @param {AlgorithmIdentifier} algorithm WebCryptoAPI algorithm identifier */ -function GostDigest(algorithm) // -{ - +function GostDigest(algorithm) { + // algorithm = algorithm || {}; - this.name = (algorithm.name || 'GOST R 34.10') + '-' + ((algorithm.version || 2012) % 100) + - ((algorithm.version || 2012) > 1 ? '-' + (algorithm.length || 256) : '') + - (((algorithm.mode || 'HASH') !== 'HASH') ? '-' + algorithm.mode : '') + - (algorithm.procreator ? '/' + algorithm.procreator : '') + - (typeof algorithm.sBox === 'string' ? '/' + algorithm.sBox : ''); + this.name = + (algorithm.name || "GOST R 34.10") + + "-" + + ((algorithm.version || 2012) % 100) + + ((algorithm.version || 2012) > 1 + ? "-" + (algorithm.length || 256) + : "") + + ((algorithm.mode || "HASH") !== "HASH" ? "-" + algorithm.mode : "") + + (algorithm.procreator ? "/" + algorithm.procreator : "") + + (typeof algorithm.sBox === "string" ? "/" + algorithm.sBox : ""); // Algorithm procreator this.procreator = algorithm.procreator; @@ -1190,18 +1199,21 @@ function GostDigest(algorithm) // case 1994: this.digest = digest94; // Define chiper algorithm - this.sBox = (algorithm.sBox || (algorithm.procreator === 'SC' ? 'D-SC' : 'D-A')).toUpperCase(); + this.sBox = ( + algorithm.sBox || + (algorithm.procreator === "SC" ? "D-SC" : "D-A") + ).toUpperCase(); //if (!GostCipher) // GostCipher = root.GostCipher; if (!GostCipher) - throw new NotSupportedError('Object GostCipher not found'); + throw new NotSupportedError("Object GostCipher not found"); this.cipher = new GostCipher({ - name: 'GOST 28147', - block: 'ECB', + name: "GOST 28147", + block: "ECB", sBox: this.sBox, - procreator: this.procreator + procreator: this.procreator, }); break; @@ -1209,27 +1221,30 @@ function GostDigest(algorithm) // this.digest = digest2012; break; default: - throw new NotSupportedError('Algorithm version ' + algorithm.version + ' not supported'); + throw new NotSupportedError( + "Algorithm version " + algorithm.version + " not supported", + ); } // Key size - this.keySize = algorithm.keySize || (algorithm.version <= 2 ? this.bitLength / 8 : 32); + this.keySize = + algorithm.keySize || (algorithm.version <= 2 ? this.bitLength / 8 : 32); - switch (algorithm.mode || 'HASH') { - case 'HASH': + switch (algorithm.mode || "HASH") { + case "HASH": break; - case 'HMAC': + case "HMAC": this.sign = signHMAC; this.verify = verifyHMAC; this.generateKey = generateKey; break; - case 'KDF': + case "KDF": this.deriveKey = deriveKey; this.deriveBits = deriveBitsKDF; this.label = algorithm.label; this.context = algorithm.context; break; - case 'PBKDF2': + case "PBKDF2": this.deriveKey = deriveKey; this.deriveBits = deriveBitsPBKDF2; this.generateKey = generateKey; @@ -1237,7 +1252,7 @@ function GostDigest(algorithm) // this.iterations = algorithm.iterations || 2000; this.diversifier = algorithm.diversifier || 1; break; - case 'PFXKDF': + case "PFXKDF": this.deriveKey = deriveKey; this.deriveBits = deriveBitsPFXKDF; this.generateKey = generateKey; @@ -1245,7 +1260,7 @@ function GostDigest(algorithm) // this.iterations = algorithm.iterations || 2000; this.diversifier = algorithm.diversifier || 1; break; - case 'CPKDF': + case "CPKDF": this.deriveKey = deriveKey; this.deriveBits = deriveBitsCP; this.generateKey = generateKey; @@ -1253,7 +1268,9 @@ function GostDigest(algorithm) // this.iterations = algorithm.iterations || 2000; break; default: - throw new NotSupportedError('Algorithm mode ' + algorithm.mode + ' not supported'); + throw new NotSupportedError( + "Algorithm mode " + algorithm.mode + " not supported", + ); } } // diff --git a/src/core/vendor/gost/gostEngine.mjs b/src/core/vendor/gost/gostEngine.mjs index b54819c6..3067d357 100755 --- a/src/core/vendor/gost/gostEngine.mjs +++ b/src/core/vendor/gost/gostEngine.mjs @@ -16,7 +16,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -27,55 +27,78 @@ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * */ -import GostRandom from './gostRandom.mjs'; -import GostCipher from './gostCipher.mjs'; -import GostDigest from './gostDigest.mjs'; -import GostSign from './gostSign.mjs'; +import GostRandom from "./gostRandom.mjs"; +import GostCipher from "./gostCipher.mjs"; +import GostDigest from "./gostDigest.mjs"; +import GostSign from "./gostSign.mjs"; /* - * Engine definition base on normalized algorithm identifier - * - */ // + * Engine definition base on normalized algorithm identifier + * + */ // var root = {}; // Define engine function defineEngine(method, algorithm) { if (!algorithm) - throw new (root.SyntaxError || Error)('Algorithm not defined'); + throw new (root.SyntaxError || Error)("Algorithm not defined"); if (!algorithm.name) - throw new (root.SyntaxError || Error)('Algorithm name not defined'); + throw new (root.SyntaxError || Error)("Algorithm name not defined"); - var name = algorithm.name, mode = algorithm.mode; - if ((name === 'GOST 28147' || name === 'GOST R 34.12' || name === 'RC2') && (method === 'generateKey' || - (mode === 'MAC' && (method === 'sign' || method === 'verify')) || - ((mode === 'KW' || mode === 'MASK') && (method === 'wrapKey' || method === 'unwrapKey')) || - ((!mode || mode === 'ES') && (method === 'encrypt' || method === 'decrypt')))) { - return 'GostCipher'; - - } else if ((name === 'GOST R 34.11' || name === 'SHA') && (method === 'digest' || - (mode === 'HMAC' && (method === 'sign' || method === 'verify' || method === 'generateKey')) || - ((mode === 'KDF' || mode === 'PBKDF2' || mode === 'PFXKDF' || mode === 'CPKDF') && - (method === 'deriveKey' || method === 'deriveBits' || method === 'generateKey')))) { - return 'GostDigest'; - - } else if (name === 'GOST R 34.10' && (method === 'generateKey' || - ((!mode || mode === 'SIGN') && (method === 'sign' || method === 'verify')) || - (mode === 'MASK' && (method === 'wrapKey' || method === 'unwrapKey')) || - (mode === 'DH' && (method === 'deriveKey' || method === 'deriveBits')))) { - return 'GostSign'; + var name = algorithm.name, + mode = algorithm.mode; + if ( + (name === "GOST 28147" || name === "GOST R 34.12" || name === "RC2") && + (method === "generateKey" || + (mode === "MAC" && (method === "sign" || method === "verify")) || + ((mode === "KW" || mode === "MASK") && + (method === "wrapKey" || method === "unwrapKey")) || + ((!mode || mode === "ES") && + (method === "encrypt" || method === "decrypt"))) + ) { + return "GostCipher"; + } else if ( + (name === "GOST R 34.11" || name === "SHA") && + (method === "digest" || + (mode === "HMAC" && + (method === "sign" || + method === "verify" || + method === "generateKey")) || + ((mode === "KDF" || + mode === "PBKDF2" || + mode === "PFXKDF" || + mode === "CPKDF") && + (method === "deriveKey" || + method === "deriveBits" || + method === "generateKey"))) + ) { + return "GostDigest"; + } else if ( + name === "GOST R 34.10" && + (method === "generateKey" || + ((!mode || mode === "SIGN") && + (method === "sign" || method === "verify")) || + (mode === "MASK" && + (method === "wrapKey" || method === "unwrapKey")) || + (mode === "DH" && + (method === "deriveKey" || method === "deriveBits"))) + ) { + return "GostSign"; } else - throw new (root.NotSupportedError || Error)('Algorithm ' + name + '-' + mode + ' is not valid for ' + method); + throw new (root.NotSupportedError || Error)( + "Algorithm " + name + "-" + mode + " is not valid for " + method, + ); } // /** - * Object implements dedicated Web Workers and provide a simple way to create - * and run GOST cryptographic algorithms in background thread. - * + * Object implements dedicated Web Workers and provide a simple way to create + * and run GOST cryptographic algorithms in background thread. + * * Object provide interface to GOST low-level cryptogric classes: *
      *
    • GostCipher - implementation of GOST 28147, GOST R 34.12, GOST R 34.13 Encryption algorithms. Reference {@link http://tools.ietf.org/html/rfc5830}
    • @@ -86,39 +109,39 @@ function defineEngine(method, algorithm) { */ var gostEngine = { /** - * gostEngine.execute(algorithm, method, args) Entry point to execution + * gostEngine.execute(algorithm, method, args) Entry point to execution * all low-level GOST cryptographic methods - * + * *
        *
      • Determine the appropriate engine for a given execution method
      • *
      • Create cipher object for determineted engine
      • *
      • Execute method of cipher with given args
      • *
      - * + * * @memberOf gostEngine * @param {AlgorithmIndentifier} algorithm Algorithm identifier * @param {string} method Crypto method for execution * @param {Array} args Method arguments (keys, data, additional parameters) * @returns {(CryptoOperationData|Key|KeyPair|boolean)} Result of method execution */ - execute: function (algorithm, method, args) // - { + execute: function (algorithm, method, args) { + // // Define engine for GOST algorithms var engine = defineEngine(method, algorithm); - // Create cipher - var cipher = this['get' + engine](algorithm); + // Create cipher + var cipher = this["get" + engine](algorithm); // Execute method return cipher[method].apply(cipher, args); }, // /** * gostEngine.getGostCipher(algorithm) returns GOST 28147 / GOST R 34.12 cipher instance

      - * - * GOST 28147-89 / GOST R 34.12-15 Encryption Algorithm

      - * When keys and initialization vectors are converted to/from byte arrays, + * + * GOST 28147-89 / GOST R 34.12-15 Encryption Algorithm

      + * When keys and initialization vectors are converted to/from byte arrays, * little-endian byte order is assumed.

      - * + * * Normalized algorithm identifier common parameters: - * + * *
        *
      • name Algorithm name 'GOST 28147' or 'GOST R 34.12'
      • *
      • version Algorithm version, number @@ -143,9 +166,9 @@ var gostEngine = { *
      • *
      • sBox Paramset sBox for GOST 28147-89, string. Used only if version = 1989
      • *
      - * + * * Supported algorithms, modes and parameters: - * + * *
        *
      • Encript/Decrypt mode (ES) *
          @@ -169,9 +192,9 @@ var gostEngine = { * *
        • Wrap/Unwrap key mode (MASK)
        • *
        - * + * * Supported paramters values: - * + * *
          *
        • Block modes (parameter 'block') *
            @@ -203,20 +226,20 @@ var gostEngine = { *
          *
        • *
        - * + * * @memberOf gostEngine * @param {AlgorithmIndentifier} algorithm Algorithm identifier * @returns {GostCipher} Instance of GostCipher */ - getGostCipher: function (algorithm) // - { + getGostCipher: function (algorithm) { + // return new (GostCipher || (GostCipher = root.GostCipher))(algorithm); }, // /** * gostEngine.getGostDigest(algorithm) returns GOST R 34.11 cipher instance

        - * + * * Normalized algorithm identifier common parameters: - * + * *
          *
        • name Algorithm name 'GOST R 34.11'
        • *
        • version Algorithm version @@ -243,9 +266,9 @@ var gostEngine = { *
        • *
        • sBox Paramset sBox for GOST 28147-89. Used only if version = 1994
        • *
        - * + * * Supported algorithms, modes and parameters: - * + * *
          *
        • Digest HASH mode (default)
        • *
        • Sign/Verify HMAC modes parameters depends on version and length @@ -271,7 +294,7 @@ var gostEngine = { *
            *
          • salt {@link CryptoOperationData} Random salt as input for HMAC algorithm
          • *
          • iterations Iteration count. GOST recomended value 1000 (default) or 2000
          • - *
          • diversifier Deversifier, ID=1 - key material for performing encryption or decryption, + *
          • diversifier Deversifier, ID=1 - key material for performing encryption or decryption, * ID=2 - IV (Initial Value) for encryption or decryption, ID=3 - integrity key for MACing
          • *
          *
        • @@ -282,20 +305,20 @@ var gostEngine = { *
        *
      • *
      - * + * * @memberOf gostEngine * @param {AlgorithmIndentifier} algorithm Algorithm identifier * @returns {GostDigest} Instance of GostDigest */ - getGostDigest: function (algorithm) // - { + getGostDigest: function (algorithm) { + // return new (GostDigest || (GostDigest = root.GostDigest))(algorithm); }, // /** * gostEngine.getGostSign(algorithm) returns GOST R 34.10 cipher instance

      - * + * * Normalized algorithm identifier common parameters: - * + * *
        *
      • name Algorithm name 'GOST R 34.10'
      • *
      • version Algorithm version @@ -320,9 +343,9 @@ var gostEngine = { *
      • *
      • sBox Paramset sBox for GOST 34.11-94. Used only if version = 1994 or 2001
      • *
      - * + * * Supported algorithms, modes and parameters: - * + * *
        *
      • Sign/Verify mode (SIGN)
      • *
      • Wrap/Unwrap mode (MASK)
      • @@ -359,32 +382,31 @@ var gostEngine = { *
      * *
    - * + * * @memberOf gostEngine * @param {AlgorithmIndentifier} algorithm Algorithm identifier * @returns {GostSign} Instance of GostSign */ - getGostSign: function (algorithm) // - { + getGostSign: function (algorithm) { + // return new (GostSign || (GostSign = root.GostSign))(algorithm); - } // + }, // }; /* - * Worker method execution - * - */ // + * Worker method execution + * + */ // // Worker for gostCripto method execution if (root.importScripts) { - /** - * Method called when {@link SubtleCrypto} calls its own postMessage() + * Method called when {@link SubtleCrypto} calls its own postMessage() * method with data parameter: algorithm, method and arg.
    - * Call method execute and postMessage() results to onmessage event handler + * Call method execute and postMessage() results to onmessage event handler * in the main process.
    * If error occurred onerror event handler executed in main process. - * + * * @memberOf gostEngine * @name onmessage * @param {MessageEvent} event Message event with data {algorithm, method, args} @@ -393,26 +415,30 @@ if (root.importScripts) { try { postMessage({ id: event.data.id, - result: gostEngine.execute(event.data.algorithm, - event.data.method, event.data.args)}); + result: gostEngine.execute( + event.data.algorithm, + event.data.method, + event.data.args, + ), + }); } catch (e) { postMessage({ id: event.data.id, - error: e.message + error: e.message, }); } }; } else { - // Load dependens - var baseUrl = '', nameSuffix = ''; + var baseUrl = "", + nameSuffix = ""; // Try to define from DOM model - if (typeof document !== 'undefined') { + if (typeof document !== "undefined") { (function () { var regs = /^(.*)gostCrypto(.*)\.js$/i; - var list = document.querySelectorAll('script'); + var list = document.querySelectorAll("script"); for (var i = 0, n = list.length; i < n; i++) { - var value = list[i].getAttribute('src'); + var value = list[i].getAttribute("src"); var test = regs.exec(value); if (test) { baseUrl = test[1]; @@ -425,27 +451,22 @@ if (root.importScripts) { // Local importScripts procedure for include dependens var importScripts = function () { for (var i = 0, n = arguments.length; i < n; i++) { - var name = arguments[i].split('.'), - src = baseUrl + name[0] + nameSuffix + '.' + name[1]; + var name = arguments[i].split("."), + src = baseUrl + name[0] + nameSuffix + "." + name[1]; var el = document.querySelector('script[src="' + src + '"]'); if (!el) { - el = document.createElement('script'); - el.setAttribute('src', src); + el = document.createElement("script"); + el.setAttribute("src", src); document.head.appendChild(el); } } }; // Import engines - if (!GostRandom) - importScripts('gostRandom.js'); - if (!GostCipher) - importScripts('gostCipher.js'); - if (!GostDigest) - importScripts('gostDigest.js'); - if (!GostSign) - importScripts('gostSign.js'); + if (!GostRandom) importScripts("gostRandom.js"); + if (!GostCipher) importScripts("gostCipher.js"); + if (!GostDigest) importScripts("gostDigest.js"); + if (!GostSign) importScripts("gostSign.js"); } //
    export default gostEngine; - diff --git a/src/core/vendor/gost/gostRandom.mjs b/src/core/vendor/gost/gostRandom.mjs index f9a38380..13623250 100644 --- a/src/core/vendor/gost/gostRandom.mjs +++ b/src/core/vendor/gost/gostRandom.mjs @@ -1,8 +1,8 @@ -/** +/** * Implementation Web Crypto random generatore for GOST algorithms * 1.76 * 2014-2016, Rudolf Nickolaev. All rights reserved. - * + * * Exported for CyberChef by mshwed [m@ttshwed.com] */ @@ -18,7 +18,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -29,18 +29,17 @@ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * */ -import crypto from 'crypto'; - +import crypto from "crypto"; /** * The gostCrypto provide general purpose cryptographic functionality for - * GOST standards including a cryptographically strong pseudo-random number + * GOST standards including a cryptographically strong pseudo-random number * generator seeded with truly random values. - * + * * @Class GostRandom - * + * */ // var root = {}; @@ -49,65 +48,72 @@ var rootCrypto = crypto; var TypeMismatchError = Error; var QuotaExceededError = Error; -// Initialize mouse and time counters for random generator +// Initialize mouse and time counters for random generator var randomRing = { seed: new Uint8Array(1024), getIndex: 0, setIndex: 0, set: function (x) { - if (this.setIndex >= 1024) - this.setIndex = 0; + if (this.setIndex >= 1024) this.setIndex = 0; this.seed[this.setIndex++] = x; }, get: function () { - if (this.getIndex >= 1024) - this.getIndex = 0; + if (this.getIndex >= 1024) this.getIndex = 0; return this.seed[this.getIndex++]; - } + }, }; -if (typeof document !== 'undefined') { +if (typeof document !== "undefined") { try { // Mouse move event to fill random array - document.addEventListener('mousemove', function (e) { - randomRing.set((Date.now() & 255) ^ - ((e.clientX || e.pageX) & 255) ^ - ((e.clientY || e.pageY) & 255)); - }, false); - } catch (e) { - } + document.addEventListener( + "mousemove", + function (e) { + randomRing.set( + (Date.now() & 255) ^ + ((e.clientX || e.pageX) & 255) ^ + ((e.clientY || e.pageY) & 255), + ); + }, + false, + ); + } catch (e) {} try { // Keypress event to fill random array - document.addEventListener('keydown', function (e) { - randomRing.set((Date.now() & 255) ^ - (e.keyCode & 255)); - }, false); - } catch (e) { - } + document.addEventListener( + "keydown", + function (e) { + randomRing.set((Date.now() & 255) ^ (e.keyCode & 255)); + }, + false, + ); + } catch (e) {} } // -function GostRandom() { -} +function GostRandom() {} /** * The getRandomValues method generates cryptographically random values.

    - * - * Random generator based on JavaScript Web Crypto random genereator - * (if it is possible) or Math.random mixed with time and parameters of + * + * Random generator based on JavaScript Web Crypto random genereator + * (if it is possible) or Math.random mixed with time and parameters of * mouse and keyboard events - * + * * @memberOf GostRandom * @param {(ArrayBuffer|ArrayBufferView)} array Destination buffer for random data */ -GostRandom.prototype.getRandomValues = function (array) // -{ - +GostRandom.prototype.getRandomValues = function (array) { + // if (!array.byteLength) - throw new TypeMismatchError('Array is not of an integer type (Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, or Uint32Array)'); + throw new TypeMismatchError( + "Array is not of an integer type (Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, or Uint32Array)", + ); if (array.byteLength > 65536) - throw new QuotaExceededError('Byte length of array can\'t be greate then 65536'); + throw new QuotaExceededError( + "Byte length of array can't be greate then 65536", + ); var u8 = new Uint8Array(array.buffer, array.byteOffset, array.byteLength); if (rootCrypto && rootCrypto.getRandomValues) { @@ -120,8 +126,7 @@ GostRandom.prototype.getRandomValues = function (array) // diff --git a/src/core/vendor/gost/gostSign.mjs b/src/core/vendor/gost/gostSign.mjs index 36a87f63..16aa2eb1 100755 --- a/src/core/vendor/gost/gostSign.mjs +++ b/src/core/vendor/gost/gostSign.mjs @@ -33,166 +33,170 @@ * */ - import GostRandom from './gostRandom.mjs'; - import GostDigest from './gostDigest.mjs'; +import GostRandom from "./gostRandom.mjs"; +import GostDigest from "./gostDigest.mjs"; - import crypto from 'crypto'; +import crypto from "crypto"; - /* - * Predefined curves and params collection - * - * http://tools.ietf.org/html/rfc5832 - * http://tools.ietf.org/html/rfc7091 - * http://tools.ietf.org/html/rfc4357 - * - */ // +/* + * Predefined curves and params collection + * + * http://tools.ietf.org/html/rfc5832 + * http://tools.ietf.org/html/rfc7091 + * http://tools.ietf.org/html/rfc4357 + * + */ // var root = {}; var rootCrypto = crypto; var CryptoOperationData = ArrayBuffer; var OperationError = Error, - DataError = Error, - NotSupportedError = Error; + DataError = Error, + NotSupportedError = Error; // Predefined named curve collection var ECGostParams = { - 'S-256-TEST': { + "S-256-TEST": { a: 7, - b: '0x5FBFF498AA938CE739B8E022FBAFEF40563F6E6A3472FC2A514C0CE9DAE23B7E', - p: '0x8000000000000000000000000000000000000000000000000000000000000431', - q: '0x8000000000000000000000000000000150FE8A1892976154C59CFC193ACCF5B3', + b: "0x5FBFF498AA938CE739B8E022FBAFEF40563F6E6A3472FC2A514C0CE9DAE23B7E", + p: "0x8000000000000000000000000000000000000000000000000000000000000431", + q: "0x8000000000000000000000000000000150FE8A1892976154C59CFC193ACCF5B3", x: 2, - y: '0x8E2A8A0E65147D4BD6316030E16D19C85C97F0A9CA267122B96ABBCEA7E8FC8' + y: "0x8E2A8A0E65147D4BD6316030E16D19C85C97F0A9CA267122B96ABBCEA7E8FC8", }, - 'S-256-A': { - a: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD94', + "S-256-A": { + a: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD94", b: 166, - p: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD97', - q: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C611070995AD10045841B09B761B893', + p: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD97", + q: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C611070995AD10045841B09B761B893", x: 1, - y: '0x8D91E471E0989CDA27DF505A453F2B7635294F2DDF23E3B122ACC99C9E9F1E14' + y: "0x8D91E471E0989CDA27DF505A453F2B7635294F2DDF23E3B122ACC99C9E9F1E14", }, - 'S-256-B': { - a: '0x8000000000000000000000000000000000000000000000000000000000000C96', - b: '0x3E1AF419A269A5F866A7D3C25C3DF80AE979259373FF2B182F49D4CE7E1BBC8B', - p: '0x8000000000000000000000000000000000000000000000000000000000000C99', - q: '0x800000000000000000000000000000015F700CFFF1A624E5E497161BCC8A198F', + "S-256-B": { + a: "0x8000000000000000000000000000000000000000000000000000000000000C96", + b: "0x3E1AF419A269A5F866A7D3C25C3DF80AE979259373FF2B182F49D4CE7E1BBC8B", + p: "0x8000000000000000000000000000000000000000000000000000000000000C99", + q: "0x800000000000000000000000000000015F700CFFF1A624E5E497161BCC8A198F", x: 1, - y: '0x3FA8124359F96680B83D1C3EB2C070E5C545C9858D03ECFB744BF8D717717EFC' + y: "0x3FA8124359F96680B83D1C3EB2C070E5C545C9858D03ECFB744BF8D717717EFC", }, - 'S-256-C': { - a: '0x9B9F605F5A858107AB1EC85E6B41C8AACF846E86789051D37998F7B9022D7598', + "S-256-C": { + a: "0x9B9F605F5A858107AB1EC85E6B41C8AACF846E86789051D37998F7B9022D7598", b: 32858, - p: '0x9B9F605F5A858107AB1EC85E6B41C8AACF846E86789051D37998F7B9022D759B', - q: '0x9B9F605F5A858107AB1EC85E6B41C8AA582CA3511EDDFB74F02F3A6598980BB9', + p: "0x9B9F605F5A858107AB1EC85E6B41C8AACF846E86789051D37998F7B9022D759B", + q: "0x9B9F605F5A858107AB1EC85E6B41C8AA582CA3511EDDFB74F02F3A6598980BB9", x: 0, - y: '0x41ECE55743711A8C3CBF3783CD08C0EE4D4DC440D4641A8F366E550DFDB3BB67' + y: "0x41ECE55743711A8C3CBF3783CD08C0EE4D4DC440D4641A8F366E550DFDB3BB67", }, - 'P-256': { - p: '0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF', - a: '0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC', - b: '0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B', - x: '0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296', - y: '0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5', - q: '0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551' + "P-256": { + p: "0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", + a: "0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", + b: "0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", + x: "0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", + y: "0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", + q: "0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", }, - 'T-512-TEST': { + "T-512-TEST": { a: 7, - b: '0x1CFF0806A31116DA29D8CFA54E57EB748BC5F377E49400FDD788B649ECA1AC4361834013B2AD7322480A89CA58E0CF74BC9E540C2ADD6897FAD0A3084F302ADC', - p: '0x4531ACD1FE0023C7550D267B6B2FEE80922B14B2FFB90F04D4EB7C09B5D2D15DF1D852741AF4704A0458047E80E4546D35B8336FAC224DD81664BBF528BE6373', - q: '0x4531ACD1FE0023C7550D267B6B2FEE80922B14B2FFB90F04D4EB7C09B5D2D15DA82F2D7ECB1DBAC719905C5EECC423F1D86E25EDBE23C595D644AAF187E6E6DF', - x: '0x24D19CC64572EE30F396BF6EBBFD7A6C5213B3B3D7057CC825F91093A68CD762FD60611262CD838DC6B60AA7EEE804E28BC849977FAC33B4B530F1B120248A9A', - y: '0x2BB312A43BD2CE6E0D020613C857ACDDCFBF061E91E5F2C3F32447C259F39B2C83AB156D77F1496BF7EB3351E1EE4E43DC1A18B91B24640B6DBB92CB1ADD371E' + b: "0x1CFF0806A31116DA29D8CFA54E57EB748BC5F377E49400FDD788B649ECA1AC4361834013B2AD7322480A89CA58E0CF74BC9E540C2ADD6897FAD0A3084F302ADC", + p: "0x4531ACD1FE0023C7550D267B6B2FEE80922B14B2FFB90F04D4EB7C09B5D2D15DF1D852741AF4704A0458047E80E4546D35B8336FAC224DD81664BBF528BE6373", + q: "0x4531ACD1FE0023C7550D267B6B2FEE80922B14B2FFB90F04D4EB7C09B5D2D15DA82F2D7ECB1DBAC719905C5EECC423F1D86E25EDBE23C595D644AAF187E6E6DF", + x: "0x24D19CC64572EE30F396BF6EBBFD7A6C5213B3B3D7057CC825F91093A68CD762FD60611262CD838DC6B60AA7EEE804E28BC849977FAC33B4B530F1B120248A9A", + y: "0x2BB312A43BD2CE6E0D020613C857ACDDCFBF061E91E5F2C3F32447C259F39B2C83AB156D77F1496BF7EB3351E1EE4E43DC1A18B91B24640B6DBB92CB1ADD371E", }, - 'T-512-A': { - p: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC7', - a: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC4', - b: '0xE8C2505DEDFC86DDC1BD0B2B6667F1DA34B82574761CB0E879BD081CFD0B6265EE3CB090F30D27614CB4574010DA90DD862EF9D4EBEE4761503190785A71C760', - q: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27E69532F48D89116FF22B8D4E0560609B4B38ABFAD2B85DCACDB1411F10B275', + "T-512-A": { + p: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC7", + a: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC4", + b: "0xE8C2505DEDFC86DDC1BD0B2B6667F1DA34B82574761CB0E879BD081CFD0B6265EE3CB090F30D27614CB4574010DA90DD862EF9D4EBEE4761503190785A71C760", + q: "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27E69532F48D89116FF22B8D4E0560609B4B38ABFAD2B85DCACDB1411F10B275", x: 3, - y: '0x7503CFE87A836AE3A61B8816E25450E6CE5E1C93ACF1ABC1778064FDCBEFA921DF1626BE4FD036E93D75E6A50E3A41E98028FE5FC235F5B889A589CB5215F2A4' + y: "0x7503CFE87A836AE3A61B8816E25450E6CE5E1C93ACF1ABC1778064FDCBEFA921DF1626BE4FD036E93D75E6A50E3A41E98028FE5FC235F5B889A589CB5215F2A4", }, - 'T-512-B': { - p: '0x8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F', - a: '0x8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C', - b: '0x687D1B459DC841457E3E06CF6F5E2517B97C7D614AF138BCBF85DC806C4B289F3E965D2DB1416D217F8B276FAD1AB69C50F78BEE1FA3106EFB8CCBC7C5140116', - q: '0x800000000000000000000000000000000000000000000000000000000000000149A1EC142565A545ACFDB77BD9D40CFA8B996712101BEA0EC6346C54374F25BD', + "T-512-B": { + p: "0x8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F", + a: "0x8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C", + b: "0x687D1B459DC841457E3E06CF6F5E2517B97C7D614AF138BCBF85DC806C4B289F3E965D2DB1416D217F8B276FAD1AB69C50F78BEE1FA3106EFB8CCBC7C5140116", + q: "0x800000000000000000000000000000000000000000000000000000000000000149A1EC142565A545ACFDB77BD9D40CFA8B996712101BEA0EC6346C54374F25BD", x: 2, - y: '0x1A8F7EDA389B094C2C071E3647A8940F3C123B697578C213BE6DD9E6C8EC7335DCB228FD1EDF4A39152CBCAAF8C0398828041055F94CEEEC7E21340780FE41BD' - } + y: "0x1A8F7EDA389B094C2C071E3647A8940F3C123B697578C213BE6DD9E6C8EC7335DCB228FD1EDF4A39152CBCAAF8C0398828041055F94CEEEC7E21340780FE41BD", + }, }; -ECGostParams['X-256-A'] = ECGostParams['S-256-A']; -ECGostParams['X-256-B'] = ECGostParams['S-256-C']; -ECGostParams['T-256-TEST'] = ECGostParams['S-256-TEST']; -ECGostParams['T-256-A'] = ECGostParams['S-256-A']; -ECGostParams['T-256-B'] = ECGostParams['S-256-B']; -ECGostParams['T-256-C'] = ECGostParams['S-256-C']; - +ECGostParams["X-256-A"] = ECGostParams["S-256-A"]; +ECGostParams["X-256-B"] = ECGostParams["S-256-C"]; +ECGostParams["T-256-TEST"] = ECGostParams["S-256-TEST"]; +ECGostParams["T-256-A"] = ECGostParams["S-256-A"]; +ECGostParams["T-256-B"] = ECGostParams["S-256-B"]; +ECGostParams["T-256-C"] = ECGostParams["S-256-C"]; var GostParams = { - 'S-TEST': { + "S-TEST": { modulusLength: 512, // bit length of p (512 or 1024 bits) - p: '0xEE8172AE8996608FB69359B89EB82A69854510E2977A4D63BC97322CE5DC3386EA0A12B343E9190F23177539845839786BB0C345D165976EF2195EC9B1C379E3', - q: '0x98915E7EC8265EDFCDA31E88F24809DDB064BDC7285DD50D7289F0AC6F49DD2D', - a: '0x9e96031500c8774a869582d4afde2127afad2538b4b6270a6f7c8837b50d50f206755984a49e509304d648be2ab5aab18ebe2cd46ac3d8495b142aa6ce23e21c' + p: "0xEE8172AE8996608FB69359B89EB82A69854510E2977A4D63BC97322CE5DC3386EA0A12B343E9190F23177539845839786BB0C345D165976EF2195EC9B1C379E3", + q: "0x98915E7EC8265EDFCDA31E88F24809DDB064BDC7285DD50D7289F0AC6F49DD2D", + a: "0x9e96031500c8774a869582d4afde2127afad2538b4b6270a6f7c8837b50d50f206755984a49e509304d648be2ab5aab18ebe2cd46ac3d8495b142aa6ce23e21c", }, - 'S-A': { + "S-A": { modulusLength: 1024, - p: '0xB4E25EFB018E3C8B87505E2A67553C5EDC56C2914B7E4F89D23F03F03377E70A2903489DD60E78418D3D851EDB5317C4871E40B04228C3B7902963C4B7D85D52B9AA88F2AFDBEB28DA8869D6DF846A1D98924E925561BD69300B9DDD05D247B5922D967CBB02671881C57D10E5EF72D3E6DAD4223DC82AA1F7D0294651A480DF', - q: '0x972432A437178B30BD96195B773789AB2FFF15594B176DD175B63256EE5AF2CF', - a: '0x8FD36731237654BBE41F5F1F8453E71CA414FFC22C25D915309E5D2E62A2A26C7111F3FC79568DAFA028042FE1A52A0489805C0DE9A1A469C844C7CABBEE625C3078888C1D85EEA883F1AD5BC4E6776E8E1A0750912DF64F79956499F1E182475B0B60E2632ADCD8CF94E9C54FD1F3B109D81F00BF2AB8CB862ADF7D40B9369A' + p: "0xB4E25EFB018E3C8B87505E2A67553C5EDC56C2914B7E4F89D23F03F03377E70A2903489DD60E78418D3D851EDB5317C4871E40B04228C3B7902963C4B7D85D52B9AA88F2AFDBEB28DA8869D6DF846A1D98924E925561BD69300B9DDD05D247B5922D967CBB02671881C57D10E5EF72D3E6DAD4223DC82AA1F7D0294651A480DF", + q: "0x972432A437178B30BD96195B773789AB2FFF15594B176DD175B63256EE5AF2CF", + a: "0x8FD36731237654BBE41F5F1F8453E71CA414FFC22C25D915309E5D2E62A2A26C7111F3FC79568DAFA028042FE1A52A0489805C0DE9A1A469C844C7CABBEE625C3078888C1D85EEA883F1AD5BC4E6776E8E1A0750912DF64F79956499F1E182475B0B60E2632ADCD8CF94E9C54FD1F3B109D81F00BF2AB8CB862ADF7D40B9369A", }, - 'S-B': { + "S-B": { modulusLength: 1024, - p: '0xC6971FC57524B30C9018C5E621DE15499736854F56A6F8AEE65A7A404632B1BCF0349FFCAFCB0A103177971FC1612ADCDB8C8CC938C70225C8FD12AFF01B1D064E0AD6FDE6AB9159166CB9F2FC171D92F0CC7B6A6B2CD7FA342ACBE2C9315A42D576B1ECCE77A963157F3D0BD96A8EB0B0F3502AD238101B05116334F1E5B7AB', - q: '0xB09D634C10899CD7D4C3A7657403E05810B07C61A688BAB2C37F475E308B0607', - a: '0x3D26B467D94A3FFC9D71BF8DB8934084137264F3C2E9EB16DCA214B8BC7C872485336744934FD2EF5943F9ED0B745B90AA3EC8D70CDC91682478B664A2E1F8FB56CEF2972FEE7EDB084AF746419B854FAD02CC3E3646FF2E1A18DD4BEB3C44F7F2745588029649674546CC9187C207FB8F2CECE8E2293F68395C4704AF04BAB5' + p: "0xC6971FC57524B30C9018C5E621DE15499736854F56A6F8AEE65A7A404632B1BCF0349FFCAFCB0A103177971FC1612ADCDB8C8CC938C70225C8FD12AFF01B1D064E0AD6FDE6AB9159166CB9F2FC171D92F0CC7B6A6B2CD7FA342ACBE2C9315A42D576B1ECCE77A963157F3D0BD96A8EB0B0F3502AD238101B05116334F1E5B7AB", + q: "0xB09D634C10899CD7D4C3A7657403E05810B07C61A688BAB2C37F475E308B0607", + a: "0x3D26B467D94A3FFC9D71BF8DB8934084137264F3C2E9EB16DCA214B8BC7C872485336744934FD2EF5943F9ED0B745B90AA3EC8D70CDC91682478B664A2E1F8FB56CEF2972FEE7EDB084AF746419B854FAD02CC3E3646FF2E1A18DD4BEB3C44F7F2745588029649674546CC9187C207FB8F2CECE8E2293F68395C4704AF04BAB5", }, - 'S-C': { + "S-C": { modulusLength: 1024, - p: '0x9D88E6D7FE3313BD2E745C7CDD2AB9EE4AF3C8899E847DE74A33783EA68BC30588BA1F738C6AAF8AB350531F1854C3837CC3C860FFD7E2E106C3F63B3D8A4C034CE73942A6C3D585B599CF695ED7A3C4A93B2B947B7157BB1A1C043AB41EC8566C6145E938A611906DE0D32E562494569D7E999A0DDA5C879BDD91FE124DF1E9', - q: '0xFADD197ABD19A1B4653EECF7ECA4D6A22B1F7F893B641F901641FBB555354FAF', - a: '0x7447ED7156310599070B12609947A5C8C8A8625CF1CF252B407B331F93D639DDD1BA392656DECA992DD035354329A1E95A6E32D6F47882D960B8F10ACAFF796D13CD9611F853DAB6D2623483E46788708493937A1A29442598AEC2E0742022563440FE9C18740ECE6765AC05FAF024A64B026E7E408840819E962E7E5F401AE3' + p: "0x9D88E6D7FE3313BD2E745C7CDD2AB9EE4AF3C8899E847DE74A33783EA68BC30588BA1F738C6AAF8AB350531F1854C3837CC3C860FFD7E2E106C3F63B3D8A4C034CE73942A6C3D585B599CF695ED7A3C4A93B2B947B7157BB1A1C043AB41EC8566C6145E938A611906DE0D32E562494569D7E999A0DDA5C879BDD91FE124DF1E9", + q: "0xFADD197ABD19A1B4653EECF7ECA4D6A22B1F7F893B641F901641FBB555354FAF", + a: "0x7447ED7156310599070B12609947A5C8C8A8625CF1CF252B407B331F93D639DDD1BA392656DECA992DD035354329A1E95A6E32D6F47882D960B8F10ACAFF796D13CD9611F853DAB6D2623483E46788708493937A1A29442598AEC2E0742022563440FE9C18740ECE6765AC05FAF024A64B026E7E408840819E962E7E5F401AE3", }, - 'S-D': { + "S-D": { modulusLength: 1024, - p: '0x80F102D32B0FD167D069C27A307ADAD2C466091904DBAA55D5B8CC7026F2F7A1919B890CB652C40E054E1E9306735B43D7B279EDDF9102001CD9E1A831FE8A163EED89AB07CF2ABE8242AC9DEDDDBF98D62CDDD1EA4F5F15D3A42A6677BDD293B24260C0F27C0F1D15948614D567B66FA902BAA11A69AE3BCEADBB83E399C9B5', - q: '0xF0F544C418AAC234F683F033511B65C21651A6078BDA2D69BB9F732867502149', - a: '0x6BCC0B4FADB3889C1E06ADD23CC09B8AB6ECDEDF73F04632595EE4250005D6AF5F5ADE44CB1E26E6263C672347CFA26F9E9393681E6B759733784CDE5DBD9A14A39369DFD99FA85CC0D10241C4010343F34A91393A706CF12677CBFA1F578D6B6CFBE8A1242CFCC94B3B653A476E145E3862C18CC3FED8257CFEF74CDB205BF1' + p: "0x80F102D32B0FD167D069C27A307ADAD2C466091904DBAA55D5B8CC7026F2F7A1919B890CB652C40E054E1E9306735B43D7B279EDDF9102001CD9E1A831FE8A163EED89AB07CF2ABE8242AC9DEDDDBF98D62CDDD1EA4F5F15D3A42A6677BDD293B24260C0F27C0F1D15948614D567B66FA902BAA11A69AE3BCEADBB83E399C9B5", + q: "0xF0F544C418AAC234F683F033511B65C21651A6078BDA2D69BB9F732867502149", + a: "0x6BCC0B4FADB3889C1E06ADD23CC09B8AB6ECDEDF73F04632595EE4250005D6AF5F5ADE44CB1E26E6263C672347CFA26F9E9393681E6B759733784CDE5DBD9A14A39369DFD99FA85CC0D10241C4010343F34A91393A706CF12677CBFA1F578D6B6CFBE8A1242CFCC94B3B653A476E145E3862C18CC3FED8257CFEF74CDB205BF1", }, - 'X-A': { + "X-A": { modulusLength: 1024, - p: '0xCA3B3F2EEE9FD46317D49595A9E7518E6C63D8F4EB4D22D10D28AF0B8839F079F8289E603B03530784B9BB5A1E76859E4850C670C7B71C0DF84CA3E0D6C177FE9F78A9D8433230A883CD82A2B2B5C7A3306980278570CDB79BF01074A69C9623348824B0C53791D53C6A78CAB69E1CFB28368611A397F50F541E16DB348DBE5F', - q: '0xCAE4D85F80C147704B0CA48E85FB00A9057AA4ACC44668E17F1996D7152690D9', - a: '0xBE27D652F2F1E339DA734211B85B06AE4DE236AA8FBEEB3F1ADCC52CD43853777E834A6A518138678A8ADBD3A55C70A7EAB1BA7A0719548677AAF4E609FFB47F6B9D7E45B0D06D83D7ADC53310ABD85783E7317F7EC73268B6A9C08D260B85D8485696CA39C17B17F044D1E050489036ABD381C5E6BF82BA352A1AFF136601AF' + p: "0xCA3B3F2EEE9FD46317D49595A9E7518E6C63D8F4EB4D22D10D28AF0B8839F079F8289E603B03530784B9BB5A1E76859E4850C670C7B71C0DF84CA3E0D6C177FE9F78A9D8433230A883CD82A2B2B5C7A3306980278570CDB79BF01074A69C9623348824B0C53791D53C6A78CAB69E1CFB28368611A397F50F541E16DB348DBE5F", + q: "0xCAE4D85F80C147704B0CA48E85FB00A9057AA4ACC44668E17F1996D7152690D9", + a: "0xBE27D652F2F1E339DA734211B85B06AE4DE236AA8FBEEB3F1ADCC52CD43853777E834A6A518138678A8ADBD3A55C70A7EAB1BA7A0719548677AAF4E609FFB47F6B9D7E45B0D06D83D7ADC53310ABD85783E7317F7EC73268B6A9C08D260B85D8485696CA39C17B17F044D1E050489036ABD381C5E6BF82BA352A1AFF136601AF", }, - 'X-B': { + "X-B": { modulusLength: 1024, - p: '0x9286DBDA91ECCFC3060AA5598318E2A639F5BA90A4CA656157B2673FB191CD0589EE05F4CEF1BD13508408271458C30851CE7A4EF534742BFB11F4743C8F787B11193BA304C0E6BCA25701BF88AF1CB9B8FD4711D89F88E32B37D95316541BF1E5DBB4989B3DF13659B88C0F97A3C1087B9F2D5317D557DCD4AFC6D0A754E279', - q: '0xC966E9B3B8B7CDD82FF0F83AF87036C38F42238EC50A876CD390E43D67B6013F', - a: '0x7E9C3096676F51E3B2F9884CF0AC2156779496F410E049CED7E53D8B7B5B366B1A6008E5196605A55E89C3190DABF80B9F1163C979FCD18328DAE5E9048811B370107BB7715F82091BB9DE0E33EE2FED6255474F8769FCE5EAFAEEF1CB5A32E0D5C6C2F0FC0B3447072947F5B4C387666993A333FC06568E534AD56D2338D729' + p: "0x9286DBDA91ECCFC3060AA5598318E2A639F5BA90A4CA656157B2673FB191CD0589EE05F4CEF1BD13508408271458C30851CE7A4EF534742BFB11F4743C8F787B11193BA304C0E6BCA25701BF88AF1CB9B8FD4711D89F88E32B37D95316541BF1E5DBB4989B3DF13659B88C0F97A3C1087B9F2D5317D557DCD4AFC6D0A754E279", + q: "0xC966E9B3B8B7CDD82FF0F83AF87036C38F42238EC50A876CD390E43D67B6013F", + a: "0x7E9C3096676F51E3B2F9884CF0AC2156779496F410E049CED7E53D8B7B5B366B1A6008E5196605A55E89C3190DABF80B9F1163C979FCD18328DAE5E9048811B370107BB7715F82091BB9DE0E33EE2FED6255474F8769FCE5EAFAEEF1CB5A32E0D5C6C2F0FC0B3447072947F5B4C387666993A333FC06568E534AD56D2338D729", }, - 'X-C': { + "X-C": { modulusLength: 1024, - p: '0xB194036ACE14139D36D64295AE6C50FC4B7D65D8B340711366CA93F383653908EE637BE428051D86612670AD7B402C09B820FA77D9DA29C8111A8496DA6C261A53ED252E4D8A69A20376E6ADDB3BDCD331749A491A184B8FDA6D84C31CF05F9119B5ED35246EA4562D85928BA1136A8D0E5A7E5C764BA8902029A1336C631A1D', - q: '0x96120477DF0F3896628E6F4A88D83C93204C210FF262BCCB7DAE450355125259', - a: '0x3F1817052BAA7598FE3E4F4FC5C5F616E122CFF9EBD89EF81DC7CE8BF56CC64B43586C80F1C4F56DD5718FDD76300BE336784259CA25AADE5A483F64C02A20CF4A10F9C189C433DEFE31D263E6C9764660A731ECCAECB74C8279303731E8CF69205BC73E5A70BDF93E5BB681DAB4EEB9C733CAAB2F673C475E0ECA921D29782E' - } + p: "0xB194036ACE14139D36D64295AE6C50FC4B7D65D8B340711366CA93F383653908EE637BE428051D86612670AD7B402C09B820FA77D9DA29C8111A8496DA6C261A53ED252E4D8A69A20376E6ADDB3BDCD331749A491A184B8FDA6D84C31CF05F9119B5ED35246EA4562D85928BA1136A8D0E5A7E5C764BA8902029A1336C631A1D", + q: "0x96120477DF0F3896628E6F4A88D83C93204C210FF262BCCB7DAE450355125259", + a: "0x3F1817052BAA7598FE3E4F4FC5C5F616E122CFF9EBD89EF81DC7CE8BF56CC64B43586C80F1C4F56DD5718FDD76300BE336784259CA25AADE5A483F64C02A20CF4A10F9C189C433DEFE31D263E6C9764660A731ECCAECB74C8279303731E8CF69205BC73E5A70BDF93E5BB681DAB4EEB9C733CAAB2F673C475E0ECA921D29782E", + }, }; // /* - * BigInteger arithmetic tools - * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js - * - */ // + * BigInteger arithmetic tools + * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js + * + */ // // Bits per one element -var DB = 28, DM = (1 << DB) - 1, DV = 1 << DB, - FV = Math.pow(2, 52), F1 = 52 - DB, F2 = 2 * DB - 52; +var DB = 28, + DM = (1 << DB) - 1, + DV = 1 << DB, + FV = Math.pow(2, 52), + F1 = 52 - DB, + F2 = 2 * DB - 52; function am(y, i, x, w, j, c, n) { - var xl = x & 0x3fff, xh = x >> 14; + var xl = x & 0x3fff, + xh = x >> 14; while (--n >= 0) { var l = y[i] & 0x3fff; var h = y[i++] >> 14; @@ -212,8 +216,7 @@ function nbi(words) { } function copyTo(x, r) { - for (var i = x.t - 1; i >= 0; --i) - r[i] = x[i]; + for (var i = x.t - 1; i >= 0; --i) r[i] = x[i]; r.t = x.t; r.s = x.s; return r; @@ -225,13 +228,10 @@ function copy(x) { function setInt(x, i) { x.t = 1; - x.s = (i < 0) ? -1 : 0; - if (i > 0) - x[0] = i; - else if (i < -1) - x[0] = i + DV; - else - x.t = 0; + x.s = i < 0 ? -1 : 0; + if (i > 0) x[0] = i; + else if (i < -1) x[0] = i + DV; + else x.t = 0; return x; } @@ -241,17 +241,20 @@ function nbv(i) { return r; } -var ZERO = nbv(0), ONE = nbv(1), THREE = nbv(3); +var ZERO = nbv(0), + ONE = nbv(1), + THREE = nbv(3); function clamp(x) { var c = x.s & DM; - while (x.t > 0 && x[x.t - 1] === c) - --x.t; + while (x.t > 0 && x[x.t - 1] === c) --x.t; return x; } function subTo(x, a, r) { - var i = 0, c = 0, m = Math.min(a.t, x.t); + var i = 0, + c = 0, + m = Math.min(a.t, x.t); while (i < m) { c += x[i] - a[i]; r[i++] = c & DM; @@ -265,8 +268,7 @@ function subTo(x, a, r) { c >>= DB; } c += x.s; - } - else { + } else { c += x.s; while (i < a.t) { c -= a[i]; @@ -275,11 +277,9 @@ function subTo(x, a, r) { } c -= a.s; } - r.s = (c < 0) ? -1 : 0; - if (c < -1) - r[i++] = DV + c; - else if (c > 0) - r[i++] = c; + r.s = c < 0 ? -1 : 0; + if (c < -1) r[i++] = DV + c; + else if (c > 0) r[i++] = c; r.t = i; return clamp(r); } @@ -289,7 +289,9 @@ function sub(x, y) { } function addTo(x, a, r) { - var i = 0, c = 0, m = Math.min(a.t, x.t); + var i = 0, + c = 0, + m = Math.min(a.t, x.t); while (i < m) { c += x[i] + a[i]; r[i++] = c & DM; @@ -303,8 +305,7 @@ function addTo(x, a, r) { c >>= DB; } c += x.s; - } - else { + } else { c += x.s; while (i < a.t) { c += a[i]; @@ -313,11 +314,9 @@ function addTo(x, a, r) { } c += a.s; } - r.s = (c < 0) ? -1 : 0; - if (c > 0) - r[i++] = c; - else if (c < -1) - r[i++] = DV + c; + r.s = c < 0 ? -1 : 0; + if (c > 0) r[i++] = c; + else if (c < -1) r[i++] = DV + c; r.t = i; return clamp(r); } @@ -335,41 +334,38 @@ function neg(x) { } function absTo(x, r) { - return (x.s < 0) ? negTo(r) : copyTo(r); + return x.s < 0 ? negTo(r) : copyTo(r); } function abs(x) { - return (x.s < 0) ? neg(x) : x; + return x.s < 0 ? neg(x) : x; } function compare(x, a) { var r = x.s - a.s; - if (r !== 0) - return r; + if (r !== 0) return r; var i = x.t; r = i - a.t; - if (r !== 0) - return (x.s < 0) ? -r : r; - while (--i >= 0) - if ((r = x[i] - a[i]) !== 0) - return r; + if (r !== 0) return x.s < 0 ? -r : r; + while (--i >= 0) if ((r = x[i] - a[i]) !== 0) return r; return 0; } function equals(x, y) { - return(compare(x, y) === 0); + return compare(x, y) === 0; } function min(x, y) { - return(compare(x, y) < 0) ? x : y; + return compare(x, y) < 0 ? x : y; } function max(x, y) { - return(compare(x, y) > 0) ? x : y; + return compare(x, y) > 0 ? x : y; } function nbits(x) { - var r = 1, t; + var r = 1, + t; if ((t = x >>> 16) !== 0) { x = t; r += 16; @@ -395,17 +391,14 @@ function nbits(x) { function dshlTo(x, n, r) { var i; - for (i = x.t - 1; i >= 0; --i) - r[i + n] = x[i]; - for (i = n - 1; i >= 0; --i) - r[i] = 0; + for (i = x.t - 1; i >= 0; --i) r[i + n] = x[i]; + for (i = n - 1; i >= 0; --i) r[i] = 0; r.t = x.t + n; r.s = x.s; return r; } function dshrTo(x, n, r) { - for (var i = n; i < x.t; ++i) - r[i - n] = x[i]; + for (var i = n; i < x.t; ++i) r[i - n] = x[i]; r.t = Math.max(x.t - n, 0); r.s = x.s; return r; @@ -415,13 +408,14 @@ function shlTo(x, n, r) { var bs = n % DB; var cbs = DB - bs; var bm = (1 << cbs) - 1; - var ds = Math.floor(n / DB), c = (x.s << bs) & DM, i; + var ds = Math.floor(n / DB), + c = (x.s << bs) & DM, + i; for (i = x.t - 1; i >= 0; --i) { r[i + ds + 1] = (x[i] >> cbs) | c; c = (x[i] & bm) << bs; } - for (i = ds - 1; i >= 0; --i) - r[i] = 0; + for (i = ds - 1; i >= 0; --i) r[i] = 0; r[ds] = c; r.t = x.t + ds + 1; r.s = x.s; @@ -443,47 +437,39 @@ function shrTo(x, n, r) { r[i - ds - 1] |= (x[i] & bm) << cbs; r[i - ds] = x[i] >> bs; } - if (bs > 0) - r[x.t - ds - 1] |= (x.s & bm) << cbs; + if (bs > 0) r[x.t - ds - 1] |= (x.s & bm) << cbs; r.t = x.t - ds; return clamp(r); } function shl(x, n) { var r = nbi(x.t); - if (n < 0) - shrTo(x, -n, r); - else - shlTo(x, n, r); + if (n < 0) shrTo(x, -n, r); + else shlTo(x, n, r); return r; } function shr(x, n) { var r = nbi(x.t); - if (n < 0) - shlTo(x, -n, r); - else - shrTo(x, n, r); + if (n < 0) shlTo(x, -n, r); + else shrTo(x, n, r); return r; } function bitLength(x) { - if (x.t <= 0) - return 0; + if (x.t <= 0) return 0; return DB * (x.t - 1) + nbits(x[x.t - 1] ^ (x.s & DM)); } function mulTo(b, a, r) { - var x = abs(b), y = abs(a); + var x = abs(b), + y = abs(a); var i = x.t; r.t = i + y.t; - while (--i >= 0) - r[i] = 0; - for (i = 0; i < y.t; ++i) - r[i + x.t] = am(x, 0, y[i], r, i, 0, x.t); + while (--i >= 0) r[i] = 0; + for (i = 0; i < y.t; ++i) r[i + x.t] = am(x, 0, y[i], r, i, 0, x.t); r.s = 0; - if (b.s !== a.s) - subTo(ZERO, r, r); + if (b.s !== a.s) subTo(ZERO, r, r); return clamp(r); } @@ -493,18 +479,26 @@ function mul(x, y) { function sqrTo(a, r) { var x = abs(a); - var i = r.t = 2 * x.t; - while (--i >= 0) - r[i] = 0; + var i = (r.t = 2 * x.t); + while (--i >= 0) r[i] = 0; for (i = 0; i < x.t - 1; ++i) { var c = am(x, i, x[i], r, 2 * i, 0, 1); - if ((r[i + x.t] += am(x, i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { + if ( + (r[i + x.t] += am( + x, + i + 1, + 2 * x[i], + r, + 2 * i + 1, + c, + x.t - i - 1, + )) >= x.DV + ) { r[i + x.t] -= x.DV; r[i + x.t + 1] = 1; } } - if (r.t > 0) - r[r.t - 1] += am(x, i, x[i], r, 2 * i, 0, 1); + if (r.t > 0) r[r.t - 1] += am(x, i, x[i], r, 2 * i, 0, 1); r.s = 0; return clamp(r); } @@ -515,35 +509,35 @@ function sqr(a) { function divRemTo(n, m, q, r) { var pm = abs(m); - if (pm.t <= 0) - throw new OperationError('Division by zero'); + if (pm.t <= 0) throw new OperationError("Division by zero"); var pt = abs(n); if (pt.t < pm.t) { - if (q) - setInt(q, 0); - if (r) - copyTo(n, r); + if (q) setInt(q, 0); + if (r) copyTo(n, r); return q; } - if (!r) - r = nbi(m.t); - var y = nbi(m.t), ts = n.s, ms = m.s; + if (!r) r = nbi(m.t); + var y = nbi(m.t), + ts = n.s, + ms = m.s; var nsh = DB - nbits(pm[pm.t - 1]); if (nsh > 0) { shlTo(pm, nsh, y); shlTo(pt, nsh, r); - } - else { + } else { copyTo(pm, y); copyTo(pt, r); } var ys = y.t; var y0 = y[ys - 1]; - if (y0 === 0) - return q; - var yt = y0 * (1 << F1) + ((ys > 1) ? y[ys - 2] >> F2 : 0); - var d1 = FV / yt, d2 = (1 << F1) / yt, e = 1 << F2; - var i = r.t, j = i - ys, t = !q ? nbi(Math.max(n.t - m.t, 1)) : q; + if (y0 === 0) return q; + var yt = y0 * (1 << F1) + (ys > 1 ? y[ys - 2] >> F2 : 0); + var d1 = FV / yt, + d2 = (1 << F1) / yt, + e = 1 << F2; + var i = r.t, + j = i - ys, + t = !q ? nbi(Math.max(n.t - m.t, 1)) : q; dshlTo(y, j, t); if (compare(r, t) >= 0) { r[r.t++] = 1; @@ -551,35 +545,30 @@ function divRemTo(n, m, q, r) { } dshlTo(ONE, ys, t); subTo(t, y, y); - while (y.t < ys) - y[y.t++] = 0; + while (y.t < ys) y[y.t++] = 0; while (--j >= 0) { - var qd = (r[--i] === y0) ? DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); + var qd = + r[--i] === y0 ? DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); if ((r[i] += am(y, 0, qd, r, j, 0, ys)) < qd) { dshlTo(y, j, t); subTo(r, t, r); - while (r[i] < --qd) - subTo(r, t, r); + while (r[i] < --qd) subTo(r, t, r); } } if (q) { dshrTo(r, ys, q); - if (ts !== ms) - subTo(ZERO, q, q); + if (ts !== ms) subTo(ZERO, q, q); } r.t = ys; clamp(r); - if (nsh > 0) - shrTo(r, nsh, r); - if (ts < 0) - subTo(ZERO, r, r); + if (nsh > 0) shrTo(r, nsh, r); + if (ts < 0) subTo(ZERO, r, r); return q; } function modTo(b, a, r) { divRemTo(abs(b), a, null, r); - if (b.s < 0 && compare(r, ZERO) > 0) - subTo(a, r, r); + if (b.s < 0 && compare(r, ZERO) > 0) subTo(a, r, r); return r; } @@ -592,8 +581,7 @@ function div(b, a) { } function isEven(x) { - - return ((x.t > 0) ? (x[0] & 1) : x.s) === 0; + return (x.t > 0 ? x[0] & 1 : x.s) === 0; } function isZero(x) { @@ -601,20 +589,20 @@ function isZero(x) { } function sig(x) { - if (x.s < 0) - return -1; - else if (x.t <= 0 || (x.t === 1 && x[0] <= 0)) - return 0; - else - return 1; + if (x.s < 0) return -1; + else if (x.t <= 0 || (x.t === 1 && x[0] <= 0)) return 0; + else return 1; } function invMod(x, m) { var ac = isEven(m); - if ((isEven(x) && ac) || sig(m) === 0) - return ZERO; - var u = copy(m), v = copy(x); - var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1); + if ((isEven(x) && ac) || sig(m) === 0) return ZERO; + var u = copy(m), + v = copy(x); + var a = nbv(1), + b = nbv(0), + c = nbv(0), + d = nbv(1); while (sig(u) !== 0) { while (isEven(u)) { shrTo(u, 1, u); @@ -624,9 +612,7 @@ function invMod(x, m) { subTo(b, m, b); } shrTo(a, 1, a); - } - else if (!isEven(b)) - subTo(b, m, b); + } else if (!isEven(b)) subTo(b, m, b); shrTo(b, 1, b); } while (isEven(v)) { @@ -637,43 +623,31 @@ function invMod(x, m) { subTo(d, m, d); } shrTo(c, 1, c); - } - else if (!isEven(d)) - subTo(d, m, d); + } else if (!isEven(d)) subTo(d, m, d); shrTo(d, 1, d); } if (compare(u, v) >= 0) { subTo(u, v, u); - if (ac) - subTo(a, c, a); + if (ac) subTo(a, c, a); subTo(b, d, b); - } - else { + } else { subTo(v, u, v); - if (ac) - subTo(c, a, c); + if (ac) subTo(c, a, c); subTo(d, b, d); } } - if (compare(v, ONE) !== 0) - return ZERO; - if (compare(d, m) >= 0) - return subtract(d, m); - if (sig(d) < 0) - addTo(d, m, d); - else - return d; - if (sig(d) < 0) - return add(d, m); - else - return d; + if (compare(v, ONE) !== 0) return ZERO; + if (compare(d, m) >= 0) return subtract(d, m); + if (sig(d) < 0) addTo(d, m, d); + else return d; + if (sig(d) < 0) return add(d, m); + else return d; } function testBit(x, n) { var j = Math.floor(n / DB); - if (j >= x.t) - return (x.s !== 0); - return ((x[j] & (1 << (n % DB))) !== 0); + if (j >= x.t) return x.s !== 0; + return (x[j] & (1 << (n % DB))) !== 0; } function nothing(x) { @@ -681,15 +655,14 @@ function nothing(x) { } function extend(c, o) { - for (var i in o) - c.prototype[i] = o[i]; + for (var i in o) c.prototype[i] = o[i]; } // /* - * Classic, Barret, Mongomery reductions, optimized ExpMod algorithms - * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js - * - */ // + * Classic, Barret, Mongomery reductions, optimized ExpMod algorithms + * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js + * + */ // // Classic reduction var Classic = function (m) { @@ -698,10 +671,8 @@ var Classic = function (m) { extend(Classic, { convert: function (x) { - if (x.s < 0 || compare(x, this.m) >= 0) - return mod(x, this.m); - else - return x; + if (x.s < 0 || compare(x, this.m) >= 0) return mod(x, this.m); + else return x; }, revert: nothing, reduce: function (x) { @@ -714,21 +685,19 @@ extend(Classic, { mulTo: function (x, y, r) { mulTo(x, y, r); this.reduce(r); - } + }, }); function invDig(a) { - if (a.t < 1) - return 0; + if (a.t < 1) return 0; var x = a[0]; - if ((x & 1) === 0) - return 0; + if ((x & 1) === 0) return 0; var y = x & 3; y = (y * (2 - (x & 0xf) * y)) & 0xf; y = (y * (2 - (x & 0xff) * y)) & 0xff; y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; - y = (y * (2 - x * y % DV)) % DV; - return (y > 0) ? DV - y : -y; + y = (y * (2 - ((x * y) % DV))) % DV; + return y > 0 ? DV - y : -y; } // Montgomery reduction @@ -747,8 +716,7 @@ extend(Montgomery, { var r = nbi(x.t); dshlTo(abs(x), this.m.t, r); divRemTo(r, this.m, null, r); - if (x.s < 0 && compare(r, ZERO) > 0) - subTo(this.m, r, r); + if (x.s < 0 && compare(r, ZERO) > 0) subTo(this.m, r, r); return r; }, // x/R mod m @@ -760,11 +728,14 @@ extend(Montgomery, { }, // x = x/R mod m (HAC 14.32) reduce: function (x) { - while (x.t <= this.mt2) - x[x.t++] = 0; + while (x.t <= this.mt2) x[x.t++] = 0; for (var i = 0; i < this.m.t; ++i) { var j = x[i] & 0x7fff; - var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & DM; + var u0 = + (j * this.mpl + + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << + 15)) & + DM; j = i + this.m.t; x[j] += am(this.m, 0, u0, x, i, 0, this.m.t); while (x[j] >= DV) { @@ -774,8 +745,7 @@ extend(Montgomery, { } clamp(x); dshrTo(x, this.m.t, x); - if (compare(x, this.m) >= 0) - subTo(x, this.m, x); + if (compare(x, this.m) >= 0) subTo(x, this.m, x); }, // r = "x^2/R mod m"; x != r sqrTo: function (x, r) { @@ -786,19 +756,16 @@ extend(Montgomery, { mulTo: function (x, y, r) { mulTo(x, y, r); this.reduce(r); - } + }, }); function dAddOffset(x, n, w) { - if (n === 0) - return; - while (x.t <= w) - x[x.t++] = 0; + if (n === 0) return; + while (x.t <= w) x[x.t++] = 0; x[w] += n; while (x[w] >= DV) { x[w] -= DV; - if (++w >= x.t) - x[x.t++] = 0; + if (++w >= x.t) x[x.t++] = 0; ++x[w]; } } @@ -807,22 +774,18 @@ function mulLowerTo(x, a, n, r) { var i = Math.min(x.t + a.t, n); r.s = 0; // assumes a,x >= 0 r.t = i; - while (i > 0) - r[--i] = 0; + while (i > 0) r[--i] = 0; var j; - for (j = r.t - x.t; i < j; ++i) - r[i + x.t] = am(x, 0, a[i], r, i, 0, x.t); - for (j = Math.min(a.t, n); i < j; ++i) - am(x, 0, a[i], r, i, 0, n - i); + for (j = r.t - x.t; i < j; ++i) r[i + x.t] = am(x, 0, a[i], r, i, 0, x.t); + for (j = Math.min(a.t, n); i < j; ++i) am(x, 0, a[i], r, i, 0, n - i); return clamp(r); } function mulUpperTo(x, a, n, r) { --n; - var i = r.t = x.t + a.t - n; + var i = (r.t = x.t + a.t - n); r.s = 0; // assumes a,x >= 0 - while (--i >= 0) - r[i] = 0; + while (--i >= 0) r[i] = 0; for (i = Math.max(n - x.t, 0); i < a.t; ++i) r[x.t + i - n] = am(x, n - i, a[i], r, 0, 0, x.t + i - n); clamp(r); @@ -841,10 +804,8 @@ function Barrett(m) { extend(Barrett, { convert: function (x) { - if (x.s < 0 || x.t > 2 * this.m.t) - return mod(x, this.m); - else if (compare(x, this.m) < 0) - return x; + if (x.s < 0 || x.t > 2 * this.m.t) return mod(x, this.m); + else if (compare(x, this.m) < 0) return x; else { var r = nbi(x.t); copyTo(x, r); @@ -864,11 +825,9 @@ extend(Barrett, { } mulUpperTo(this.mu, this.r2, this.m.t + 1, this.q3); mulLowerTo(this.m, this.q3, this.m.t + 1, this.r2); - while (compare(x, this.r2) < 0) - dAddOffset(x, 1, this.m.t + 1); + while (compare(x, this.r2) < 0) dAddOffset(x, 1, this.m.t + 1); subTo(x, this.r2, x); - while (compare(x, this.m) >= 0) - subTo(x, this.m, x); + while (compare(x, this.m) >= 0) subTo(x, this.m, x); }, // r = x^2 mod m; x != r sqrTo: function (x, r) { @@ -879,34 +838,30 @@ extend(Barrett, { mulTo: function (x, y, r) { mulTo(x, y, r); this.reduce(r); - } - + }, }); // x^e % m (HAC 14.85) function expMod(x, e, m) { - var i = bitLength(e), k, r = nbv(1), z; - if (i <= 0) - return r; - else if (i < 18) - k = 1; - else if (i < 48) - k = 3; - else if (i < 144) - k = 4; - else if (i < 768) - k = 5; - else - k = 6; - if (i < 8) - z = new Classic(m); - else if (isEven(m)) - z = new Barrett(m); - else - z = new Montgomery(m); + var i = bitLength(e), + k, + r = nbv(1), + z; + if (i <= 0) return r; + else if (i < 18) k = 1; + else if (i < 48) k = 3; + else if (i < 144) k = 4; + else if (i < 768) k = 5; + else k = 6; + if (i < 8) z = new Classic(m); + else if (isEven(m)) z = new Barrett(m); + else z = new Montgomery(m); // precomputation - var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1; + var g = new Array(), + n = 3, + k1 = k - 1, + km = (1 << k) - 1; g[1] = z.convert(x); if (k > 1) { var g2 = nbi(m.t * 2); @@ -918,15 +873,17 @@ function expMod(x, e, m) { } } - var j = e.t - 1, w, is1 = true, r2 = nbi(m.t * 2), t; + var j = e.t - 1, + w, + is1 = true, + r2 = nbi(m.t * 2), + t; i = nbits(e[j]) - 1; while (j >= 0) { - if (i >= k1) - w = (e[j] >> (i - k1)) & km; + if (i >= k1) w = (e[j] >> (i - k1)) & km; else { w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); - if (j > 0) - w |= e[j - 1] >> (DB + i - k1); + if (j > 0) w |= e[j - 1] >> (DB + i - k1); } n = k; @@ -938,18 +895,17 @@ function expMod(x, e, m) { i += DB; --j; } - if (is1) { // ret == 1, don't bother squaring or multiplying it + if (is1) { + // ret == 1, don't bother squaring or multiplying it copyTo(g[w], r); is1 = false; - } - else { + } else { while (n > 1) { z.sqrTo(r, r2); z.sqrTo(r2, r); n -= 2; } - if (n > 0) - z.sqrTo(r, r2); + if (n > 0) z.sqrTo(r, r2); else { t = r; r = r2; @@ -972,10 +928,10 @@ function expMod(x, e, m) { } // /* - * EC Field Elements, Points, Curves - * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/ec.js - * - */ // + * EC Field Elements, Points, Curves + * optimized release of http://www-cs-students.stanford.edu/~tjw/jsbn/ec.js + * + */ // // EC Field Elemets function newFE(a, x) { @@ -997,15 +953,13 @@ function negFE(a) { function addFE(a, b) { var r = add(a, b); - if (compare(r, a.q) > 0) - subTo(r, a.q, r); + if (compare(r, a.q) > 0) subTo(r, a.q, r); return copyFE(a, r); } function subFE(a, b) { var r = sub(a, b); - if (r.s < 0) - addTo(a.q, r, r); + if (r.s < 0) addTo(a.q, r, r); return copyFE(a, r); } @@ -1031,25 +985,22 @@ function newEC(curve, x, y, z) { curve: curve, x: x, y: y, - z: z || newFE(curve, ONE) + z: z || newFE(curve, ONE), }; } function getX(point) { - if (!point.zinv) - point.zinv = invFE(point.z); + if (!point.zinv) point.zinv = invFE(point.z); return mulFE(point.x, point.zinv); } function getY(point) { - if (!point.zinv) - point.zinv = invFE(point.z); + if (!point.zinv) point.zinv = invFE(point.z); return mulFE(point.y, point.zinv); } function isInfinity(a) { - if ((!a.x) && (!a.y)) - return true; + if (!a.x && !a.y) return true; return isZero(a.z) && !isZero(a.y); } @@ -1058,17 +1009,13 @@ function getInfinity(a) { } function equalsEC(a, b) { - if (a === b) - return true; - if (isInfinity(a)) - return isInfinity(b); - if (isInfinity(b)) - return isInfinity(a); + if (a === b) return true; + if (isInfinity(a)) return isInfinity(b); + if (isInfinity(b)) return isInfinity(a); var u, v; // u = Y2 * Z1 - Y1 * Z2 u = subFE(mulFE(b.y, a.z), mulFE(a.y, b.z)); - if (!isZero(u)) - return false; + if (!isZero(u)) return false; // v = X2 * Z1 - X1 * Z2 v = subFE(mulFE(b.x, a.z), mulFE(a.x, b.z)); return isZero(v); @@ -1079,10 +1026,8 @@ function negEC(a) { } function addEC(a, b) { - if (isInfinity(a)) - return b; - if (isInfinity(b)) - return a; + if (isInfinity(a)) return b; + if (isInfinity(b)) return a; // u = Y2 * Z1 - Y1 * Z2 var u = subFE(mulFE(b.y, a.z), mulFE(a.y, b.z)); @@ -1107,7 +1052,16 @@ function addEC(a, b) { // x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3) var x3 = mulFE(subFE(mulFE(subFE(zu2, shlFE(x1v2, 1)), b.z), v3), v); // y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3 - var y3 = addFE(mulFE(subFE(subFE(mulFE(mulFE(x1v2, THREE), u), mulFE(y1, v3)), mulFE(zu2, u)), b.z), mulFE(u, v3)); + var y3 = addFE( + mulFE( + subFE( + subFE(mulFE(mulFE(x1v2, THREE), u), mulFE(y1, v3)), + mulFE(zu2, u), + ), + b.z, + ), + mulFE(u, v3), + ); // z3 = v^3 * z1 * z2 var z3 = mulFE(mulFE(v3, a.z), b.z); @@ -1115,10 +1069,8 @@ function addEC(a, b) { } function twiceEC(b) { - if (isInfinity(b)) - return b; - if (sig(b.y) === 0) - return getInfinity(b); + if (isInfinity(b)) return b; + if (sig(b.y) === 0) return getInfinity(b); var x1 = b.x; var y1 = b.y; @@ -1134,9 +1086,18 @@ function twiceEC(b) { } // x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1) - var x3 = mulFE(shlFE(subFE(sqrFE(w), mulFE(shlFE(x1, 3), y1sqz1)), 1), y1z1); + var x3 = mulFE( + shlFE(subFE(sqrFE(w), mulFE(shlFE(x1, 3), y1sqz1)), 1), + y1z1, + ); // y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3 - var y3 = subFE(mulFE(shlFE(subFE(mulFE(mulFE(w, THREE), x1), shlFE(y1sqz1, 1)), 2), y1sqz1), mulFE(sqrFE(w), w)); + var y3 = subFE( + mulFE( + shlFE(subFE(mulFE(mulFE(w, THREE), x1), shlFE(y1sqz1, 1)), 2), + y1sqz1, + ), + mulFE(sqrFE(w), w), + ); // z3 = 8 * (y1 * z1)^3 var z3 = shlFE(mulFE(sqrFE(y1z1), y1z1), 3); @@ -1145,10 +1106,8 @@ function twiceEC(b) { // Simple NAF (Non-Adjacent Form) multiplication algorithm function mulEC(a, k) { - if (isInfinity(a)) - return a; - if (sig(k) === 0) - return getInfinity(a); + if (isInfinity(a)) return a; + if (sig(k) === 0) return getInfinity(a); var e = k; var h = mul(e, THREE); @@ -1174,17 +1133,15 @@ function mulEC(a, k) { function mul2AndAddEC(a, k) { var nbits = bitLength(k); var R = a, - Q = getInfinity(a); + Q = getInfinity(a); for (var i = 0; i < nbits - 1; i++) { - if (testBit(k, i) === 1) - Q = addEC(Q, R); + if (testBit(k, i) === 1) Q = addEC(Q, R); R = twiceEC(R); } - if (testBit(k, nbits - 1) === 1) - Q = addEC(Q, R); + if (testBit(k, nbits - 1) === 1) Q = addEC(Q, R); return Q; } @@ -1192,10 +1149,8 @@ function mul2AndAddEC(a, k) { // Compute a*j + x*k (simultaneous multiplication) function mulTwoEC(a, j, x, k) { var i; - if (bitLength(j) > bitLength(k)) - i = bitLength(j) - 1; - else - i = bitLength(k) - 1; + if (bitLength(j) > bitLength(k)) i = bitLength(j) - 1; + else i = bitLength(k) - 1; var R = getInfinity(a); var both = addEC(a, x); @@ -1204,12 +1159,10 @@ function mulTwoEC(a, j, x, k) { if (testBit(j, i)) { if (testBit(k, i)) { R = addEC(R, both); - } - else { + } else { R = addEC(R, a); } - } - else { + } else { if (testBit(k, i)) { R = addEC(R, x); } @@ -1232,38 +1185,38 @@ function newCurve(q, a, b) { } // /* - * Converion tools (hex, binary) - * - */ // + * Converion tools (hex, binary) + * + */ // function atobi(d) { var k = 8; var a = new Uint8Array(d); - var r = nbi(a.length * 8 / DB); + var r = nbi((a.length * 8) / DB); r.t = 0; r.s = 0; var sh = 0; for (var i = 0, n = a.length; i < n; i++) { var x = a[i]; - if (sh === 0) - r[r.t++] = x; + if (sh === 0) r[r.t++] = x; else if (sh + k > DB) { r[r.t - 1] |= (x & ((1 << (DB - sh)) - 1)) << sh; - r[r.t++] = (x >> (DB - sh)); - } - else - r[r.t - 1] |= x << sh; + r[r.t++] = x >> (DB - sh); + } else r[r.t - 1] |= x << sh; sh += k; - if (sh >= DB) - sh -= DB; + if (sh >= DB) sh -= DB; } return clamp(r); } function bitoa(s, bitLength) { var k = 8; - var km = (1 << k) - 1, d, m = false, r = [], i = s.t; - var p = DB - (i * DB) % k; + var km = (1 << k) - 1, + d, + m = false, + r = [], + i = s.t; + var p = DB - ((i * DB) % k); if (i-- > 0) { if (p < DB && (d = s[i] >> p) > 0) { m = true; @@ -1273,67 +1226,60 @@ function bitoa(s, bitLength) { if (p < k) { d = (s[i] & ((1 << p) - 1)) << (k - p); d |= s[--i] >> (p += DB - k); - } - else { + } else { d = (s[i] >> (p -= k)) & km; if (p <= 0) { p += DB; --i; } } - if (d > 0) - m = true; - if (m) - r.push(d); + if (d > 0) m = true; + if (m) r.push(d); } } var r8 = new Uint8Array(bitLength ? bitLength / 8 : r.length); - if (m) - r8.set(r.reverse()); + if (m) r8.set(r.reverse()); return r8.buffer; } - function htobi(s) { - if (typeof s === 'number' || s instanceof Number) - return nbv(s); - s = s.replace(/[^\-A-Fa-f0-9]/g, ''); - if (!s) - s = '0'; + if (typeof s === "number" || s instanceof Number) return nbv(s); + s = s.replace(/[^\-A-Fa-f0-9]/g, ""); + if (!s) s = "0"; var k = 4; var r = nbi(s.length / 7); - var i = s.length, mi = false, sh = 0; + var i = s.length, + mi = false, + sh = 0; while (--i >= 0) { var c = s.charAt(i); - if (c === '-') { + if (c === "-") { mi = true; continue; } var x = parseInt(s.charAt(i), 16); mi = false; - if (sh === 0) - r[r.t++] = x; + if (sh === 0) r[r.t++] = x; else if (sh + k > DB) { r[r.t - 1] |= (x & ((1 << (DB - sh)) - 1)) << sh; - r[r.t++] = (x >> (DB - sh)); - } - else - r[r.t - 1] |= x << sh; + r[r.t++] = x >> (DB - sh); + } else r[r.t - 1] |= x << sh; sh += k; - if (sh >= DB) - sh -= DB; + if (sh >= DB) sh -= DB; } - if (mi) - subTo(ZERO, r, r); + if (mi) subTo(ZERO, r, r); return clamp(r); } function bitoh(x) { - if (x.s < 0) - return "-" + bitoh(negTo(x, nbi(x.t))); + if (x.s < 0) return "-" + bitoh(negTo(x, nbi(x.t))); var k = 4; - var km = (1 << k) - 1, d, m = false, r = "", i = x.t; - var p = DB - (i * DB) % k; + var km = (1 << k) - 1, + d, + m = false, + r = "", + i = x.t; + var p = DB - ((i * DB) % k); if (i-- > 0) { if (p < DB && (d = x[i] >> p) > 0) { m = true; @@ -1343,18 +1289,15 @@ function bitoh(x) { if (p < k) { d = (x[i] & ((1 << p) - 1)) << (k - p); d |= x[--i] >> (p += DB - k); - } - else { + } else { d = (x[i] >> (p -= k)) & km; if (p <= 0) { p += DB; --i; } } - if (d > 0) - m = true; - if (m) - r += d.toString(16); + if (d > 0) m = true; + if (m) r += d.toString(16); } } return "0x" + (m ? r : "0"); @@ -1362,9 +1305,12 @@ function bitoh(x) { // biginteger to big-endian integer bytearray function bitoi(s) { - var i = s.t, r = []; + var i = s.t, + r = []; r[0] = s.s; - var p = DB - (i * DB) % 8, d, k = 0; + var p = DB - ((i * DB) % 8), + d, + k = 0; if (i-- > 0) { if (p < DB && (d = s[i] >> p) !== (s.s & DM) >> p) r[k++] = d | (s.s << (DB - p)); @@ -1372,20 +1318,16 @@ function bitoi(s) { if (p < 8) { d = (s[i] & ((1 << p) - 1)) << (8 - p); d |= s[--i] >> (p += DB - 8); - } - else { + } else { d = (s[i] >> (p -= 8)) & 0xff; if (p <= 0) { p += DB; --i; } } - if ((d & 0x80) !== 0) - d |= -256; - if (k === 0 && (s.s & 0x80) !== (d & 0x80)) - ++k; - if (k > 0 || d !== s.s) - r[k++] = d; + if ((d & 0x80) !== 0) d |= -256; + if (k === 0 && (s.s & 0x80) !== (d & 0x80)) ++k; + if (k > 0 || d !== s.s) r[k++] = d; } } return new Uint8Array(r).buffer; @@ -1393,78 +1335,76 @@ function bitoi(s) { // big-endian integer bytearray to biginteger function itobi(d) { - var k = 8, s = new Uint8Array(d), - r = nbi(s.length / 7); + var k = 8, + s = new Uint8Array(d), + r = nbi(s.length / 7); r.t = 0; r.s = 0; - var i = s.length, sh = 0; + var i = s.length, + sh = 0; while (--i >= 0) { var x = s[i] & 0xff; - if (sh === 0) - r[r.t++] = x; + if (sh === 0) r[r.t++] = x; else if (sh + k > DB) { r[r.t - 1] |= (x & ((1 << (DB - sh)) - 1)) << sh; - r[r.t++] = (x >> (DB - sh)); - } - else - r[r.t - 1] |= x << sh; + r[r.t++] = x >> (DB - sh); + } else r[r.t - 1] |= x << sh; sh += k; - if (sh >= DB) - sh -= DB; + if (sh >= DB) sh -= DB; } if ((s[0] & 0x80) !== 0) { r.s = -1; - if (sh > 0) - r[r.t - 1] |= ((1 << (DB - sh)) - 1) << sh; + if (sh > 0) r[r.t - 1] |= ((1 << (DB - sh)) - 1) << sh; } return clamp(r); } - // Swap bytes in buffer function swap(s) { var src = new Uint8Array(s), - dst = new Uint8Array(src.length); - for (var i = 0, n = src.length; i < n; i++) - dst[n - i - 1] = src[i]; + dst = new Uint8Array(src.length); + for (var i = 0, n = src.length; i < n; i++) dst[n - i - 1] = src[i]; return dst.buffer; } // Calculate hash of data function hash(d) { - if (this.hash) - d = this.hash.digest(d); + if (this.hash) d = this.hash.digest(d); // Swap hash for SignalCom - if (this.procreator === 'SC' || - (this.procreator === 'VN' && this.hash.version === 2012)) + if ( + this.procreator === "SC" || + (this.procreator === "VN" && this.hash.version === 2012) + ) d = swap(d); return d; } // Check buffer function buffer(d) { - if (d instanceof CryptoOperationData) - return d; + if (d instanceof CryptoOperationData) return d; else if (d && d?.buffer instanceof CryptoOperationData) - return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength ? - d.buffer : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)).buffer; + return d.byteOffset === 0 && d.byteLength === d.buffer.byteLength + ? d.buffer + : new Uint8Array(new Uint8Array(d, d.byteOffset, d.byteLength)) + .buffer; else - throw new DataError('CryptoOperationData or CryptoOperationDataView required'); + throw new DataError( + "CryptoOperationData or CryptoOperationDataView required", + ); } // Check double buffer function to2(d) { var b = buffer(d); - if (b.byteLength % 2 > 0) - throw new DataError('Buffer length must be even'); + if (b.byteLength % 2 > 0) throw new DataError("Buffer length must be even"); var n = b.byteLength / 2; return [atobi(new Uint8Array(b, 0, n)), atobi(new Uint8Array(b, n, n))]; } function from2(x, y, bitLength) { var a = bitoa(x, bitLength), - b = bitoa(y, bitLength), - d = new Uint8Array(a.byteLength + b.byteLength); + b = bitoa(y, bitLength), + d = new Uint8Array(a.byteLength + b.byteLength); d.set(new Uint8Array(a)); d.set(new Uint8Array(b), a.byteLength); return d.buffer; @@ -1472,13 +1412,14 @@ function from2(x, y, bitLength) { function getSeed(length) { GostRandom = GostRandom || root.GostRandom; - var randomSource = GostRandom ? new (GostRandom || root.GostRandom) : rootCrypto; + var randomSource = GostRandom + ? new (GostRandom || root.GostRandom)() + : rootCrypto; if (randomSource.getRandomValues) { var d = new Uint8Array(Math.ceil(length / 8)); randomSource.getRandomValues(d); return d; - } else - throw new NotSupportedError('Random generator not found'); + } else throw new NotSupportedError("Random generator not found"); } // /** @@ -1493,9 +1434,8 @@ function getSeed(length) { * @param {(CryptoOperationData|TypedArray)} data Data * @returns {CryptoOperationData} Signature */ -function sign(privateKey, data) // -{ - +function sign(privateKey, data) { + // // Stage 1 var b = buffer(data); var alpha = atobi(hash.call(this, b)); @@ -1505,17 +1445,14 @@ function sign(privateKey, data) // // Stage 2 var e = mod(alpha, q); - if (isZero(e)) - e = ONE; + if (isZero(e)) e = ONE; var s = ZERO; while (isZero(s)) { var r = ZERO; while (isZero(r)) { - // Stage 3 - var k = mod(atobi(this.ukm || - getSeed(this.bitLength)), q); // pseudo random 0 < k < q + var k = mod(atobi(this.ukm || getSeed(this.bitLength)), q); // pseudo random 0 < k < q // Stage 4 if (this.curve) { // Gost R 34.10-2001 || Gost R 34.10-2012 @@ -1524,7 +1461,8 @@ function sign(privateKey, data) // r = mod(getX(C), q); } else { // Gost R 34.10-94 - var p = this.p, a = this.a; + var p = this.p, + a = this.a; r = mod(expMod(a, k, p), q); } } @@ -1536,15 +1474,15 @@ function sign(privateKey, data) // // console.log('r', bitoh(r)); var zetta; // Integer structure for SignalCom algorithm - if (this.procreator === 'SC') { + if (this.procreator === "SC") { zetta = { r: bitoh(r), - s: bitoh(s) + s: bitoh(s), }; } else { zetta = from2(r, s, this.bitLength); // Swap bytes for CryptoPro algorithm - if (this.procreator === 'CP' || this.procreator === 'VN') + if (this.procreator === "CP" || this.procreator === "VN") zetta = swap(zetta); } return zetta; @@ -1563,33 +1501,30 @@ function sign(privateKey, data) // * @param {(CryptoOperationData|TypedArray)} data Data * @returns {boolean} Signature verified = true */ -function verify(publicKey, signature, data) // -{ - +function verify(publicKey, signature, data) { + // // Stage 1 var q = this.q; var r, s; // Ready int for SignalCom algorithm - if (this.procreator === 'SC') { + if (this.procreator === "SC") { r = htobi(signature.r); s = htobi(signature.s); } else { - if (this.procreator === 'CP' || this.procreator === 'VN') + if (this.procreator === "CP" || this.procreator === "VN") signature = swap(signature); var zetta = to2(signature); // Swap bytes for CryptoPro algorithm s = zetta[1]; // first 32 octets contain the big-endian representation of s r = zetta[0]; // and second 32 octets contain the big-endian representation of r } - if (compare(r, q) >= 0 || compare(s, q) >= 0) - return false; + if (compare(r, q) >= 0 || compare(s, q) >= 0) return false; // Stage 2 var b = buffer(data); var alpha = atobi(hash.call(this, b)); // Stage 3 var e = mod(alpha, q); - if (isZero(e) === 0) - e = ONE; + if (isZero(e) === 0) e = ONE; // Stage 4 var v = invMod(e, q); // Stage 5 @@ -1599,21 +1534,22 @@ function verify(publicKey, signature, data) // -{ +function generateKey() { + // var curve = this.curve; if (curve) { - var Q = curve.infinity; while (isInfinity(Q)) { - // Generate random private key var d = ZERO; if (this.ukm) { @@ -1646,7 +1580,8 @@ function generateKey() // // Calculate public key Q = mulEC(this.P, d); - var x = getX(Q), y = getY(Q); + var x = getX(Q), + y = getY(Q); // console.log('d', bitoh(d)); // console.log('x', bitoh(x)); // console.log('y', bitoh(y)); @@ -1655,11 +1590,12 @@ function generateKey() // // Return result return { privateKey: bitoa(d, this.bitLength), - publicKey: from2(x, y, this.bitLength) // This corresponds to the binary representation of (256||256) + publicKey: from2(x, y, this.bitLength), // This corresponds to the binary representation of (256||256) }; - } else - throw new NotSupportedError('Key generation for GOST R 34.10-94 not supported'); + throw new NotSupportedError( + "Key generation for GOST R 34.10-94 not supported", + ); } // /** @@ -1672,19 +1608,20 @@ function generateKey() // * @instance * @returns {Object} Object with two CryptoOperationData members: privateKey and publicKey */ -function generateMaskKey() // -{ +function generateMaskKey() { + // var curve = this.curve; if (curve) { // Generate random private key var d = ZERO; - while (isZero(d)) - d = mod(atobi(getSeed(this.bitLength)), this.q); // 0 < d < q + while (isZero(d)) d = mod(atobi(getSeed(this.bitLength)), this.q); // 0 < d < q // Return result return bitoa(d, this.bitLength); } else - throw new NotSupportedError('Key generation for GOST R 34.10-94 not supported'); + throw new NotSupportedError( + "Key generation for GOST R 34.10-94 not supported", + ); } // /** @@ -1699,17 +1636,22 @@ function generateMaskKey() // * @param {(CryptoOperationData|TypedArray)} data Wrapped key * @returns {Object} CryptoOperationData unwrapped privateKey */ -function unwrapKey(baseKey, data) // -{ +function unwrapKey(baseKey, data) { + // var curve = this.curve; if (curve) { var q = this.q; var x = mod(atobi(buffer(data)), q); var y = mod(atobi(buffer(baseKey)), q); - var z = this.procreator === 'VN' ? mod(mul(x, y), q) : mod(mul(x, invMod(y, q)), q); + var z = + this.procreator === "VN" + ? mod(mul(x, y), q) + : mod(mul(x, invMod(y, q)), q); return bitoa(z); } else - throw new NotSupportedError('Key wrapping GOST R 34.10-94 not supported'); + throw new NotSupportedError( + "Key wrapping GOST R 34.10-94 not supported", + ); } // /** @@ -1724,17 +1666,22 @@ function unwrapKey(baseKey, data) // * @param {(CryptoOperationData|TypedArray)} data Key * @returns {Object} CryptoOperationData unwrapped privateKey */ -function wrapKey(baseKey, data) // -{ +function wrapKey(baseKey, data) { + // var curve = this.curve; if (curve) { var q = this.q; var x = mod(atobi(buffer(data)), q); var y = mod(atobi(buffer(baseKey)), q); - var z = this.procreator === 'VN' ? mod(mul(x, invMod(y, q)), q) : mod(mul(x, y), q); + var z = + this.procreator === "VN" + ? mod(mul(x, invMod(y, q)), q) + : mod(mul(x, y), q); return bitoa(z); } else - throw new NotSupportedError('Key wrapping GOST R 34.10-94 not supported'); + throw new NotSupportedError( + "Key wrapping GOST R 34.10-94 not supported", + ); } // /** @@ -1747,10 +1694,10 @@ function wrapKey(baseKey, data) // * @param {CryptoOperationData} baseKey Key for deriviation * @returns {CryptoOperationData} */ -function derive(baseKey) // -{ - - var k, ukm = atobi(this.ukm); +function derive(baseKey) { + // + var k, + ukm = atobi(this.ukm); var q = this.q; var x = mod(atobi(buffer(baseKey)), q); @@ -1765,14 +1712,18 @@ function derive(baseKey) // // UKM*x - x multiplied by UKM as integers // x.P - a multiple point var K = mulEC(this.peer_Q, mod(mul(ukm, x), q)); - k = from2(getX(K), getY(K), // This corresponds to the binary representation of (256||256) - this.bitLength); + k = from2( + getX(K), + getY(K), // This corresponds to the binary representation of (256||256) + this.bitLength, + ); } else { // 1) Let K(x,y) = a^(x*y) (mod p), where // x - sender’s private key, a^x - sender’s public key // y - recipient’s private key, a^y - recipient’s public key // a, p - parameters - var p = this.p, a = this.a; + var p = this.p, + a = this.a; k = bitoa(expMod(this.peer_y, x, p)); } // 2) Calculate a 256-bit hash of K(x,y,UKM): @@ -1792,13 +1743,17 @@ function derive(baseKey) // * @param {number} length output bit-length * @returns {CryptoOperationData} result */ -function deriveBits(baseKey, length) // -{ +function deriveBits(baseKey, length) { + // if (length < 8 || length > this.bitLength || length % 8 > 0) - throw new DataError('Length must be no more than ' + this.bitLength + ' bits and multiple of 8'); + throw new DataError( + "Length must be no more than " + + this.bitLength + + " bits and multiple of 8", + ); var n = length / 8, - b = derive.call(this, baseKey), - r = new Uint8Array(n); + b = derive.call(this, baseKey), + r = new Uint8Array(n); r.set(new Uint8Array(b, 0, n)); return r.buffer; @@ -1819,16 +1774,15 @@ function deriveBits(baseKey, length) // * @param {(CryptoOperationData|TypedArray)} baseKey Key for deriviation * @returns {CryptoOperationData} result */ -function deriveKey(baseKey) // -{ +function deriveKey(baseKey) { + // var b = derive.call(this, baseKey), - r = new Uint8Array(32); + r = new Uint8Array(32); r.set(new Uint8Array(b, 0, 32)); return r.buffer; } // - /** * Gost R 34.10 universal object

    * @@ -1901,31 +1855,39 @@ function deriveKey(baseKey) // * @class GostSign * @param {AlgorithmIndentifier} algorithm */ -function GostSign(algorithm) // -{ +function GostSign(algorithm) { + // algorithm = algorithm || {}; - this.name = (algorithm.name || 'GOST R 34.10') + '-' + - ((algorithm.version || 2012) % 100) + '-' + (algorithm.length || 256) + - (((algorithm.mode || 'SIGN') !== 'SIGN') ? '-' + algorithm.mode : '') + - (typeof algorithm.namedParam === 'string' ? '/' + algorithm.namedParam : '') + - (typeof algorithm.namedCurve === 'string' ? '/' + algorithm.namedCurve : '') + - (typeof algorithm.sBox === 'string' ? '/' + algorithm.sBox : ''); + this.name = + (algorithm.name || "GOST R 34.10") + + "-" + + ((algorithm.version || 2012) % 100) + + "-" + + (algorithm.length || 256) + + ((algorithm.mode || "SIGN") !== "SIGN" ? "-" + algorithm.mode : "") + + (typeof algorithm.namedParam === "string" + ? "/" + algorithm.namedParam + : "") + + (typeof algorithm.namedCurve === "string" + ? "/" + algorithm.namedCurve + : "") + + (typeof algorithm.sBox === "string" ? "/" + algorithm.sBox : ""); var version = algorithm.version || 2012; // Functions - switch (algorithm.mode || 'SIGN') { - case 'SIGN': + switch (algorithm.mode || "SIGN") { + case "SIGN": this.sign = sign; this.verify = verify; this.generateKey = generateKey; break; - case 'DH': + case "DH": this.deriveBits = deriveBits; this.deriveKey = deriveKey; this.generateKey = generateKey; break; - case 'MASK': + case "MASK": this.wrapKey = wrapKey; this.unwrapKey = unwrapKey; this.generateKey = generateMaskKey; @@ -1937,30 +1899,48 @@ function GostSign(algorithm) // // Named or parameters algorithm var param = algorithm.param; if (!param) - param = GostParams[this.namedParam = (algorithm.namedParam || 'S-A').toUpperCase()]; - this.modulusLength = algorithm.modulusLength || param.modulusLength || 1024; + param = + GostParams[ + (this.namedParam = ( + algorithm.namedParam || "S-A" + ).toUpperCase()) + ]; + this.modulusLength = + algorithm.modulusLength || param.modulusLength || 1024; this.p = htobi(param.p); this.q = htobi(param.q); this.a = htobi(param.a); // Public key for derive - if (algorithm['public']) - this.peer_y = atobi(algorithm['public']); + if (algorithm["public"]) this.peer_y = atobi(algorithm["public"]); } else { // Named or parameters algorithm var param = algorithm.curve; if (!param) - param = ECGostParams[this.namedCurve = (algorithm.namedCurve || 'S-256-A').toUpperCase()]; - var curve = this.curve = newCurve(htobi(param.p), htobi(param.a), htobi(param.b)); - this.P = newEC(curve, - newFE(curve, htobi(param.x)), - newFE(curve, htobi(param.y))); + param = + ECGostParams[ + (this.namedCurve = ( + algorithm.namedCurve || "S-256-A" + ).toUpperCase()) + ]; + var curve = (this.curve = newCurve( + htobi(param.p), + htobi(param.a), + htobi(param.b), + )); + this.P = newEC( + curve, + newFE(curve, htobi(param.x)), + newFE(curve, htobi(param.y)), + ); this.q = htobi(param.q); // Public key for derive - if (algorithm['public']) { - var k2 = to2(algorithm['public']); - this.peer_Q = new newEC(this.curve, // This corresponds to the binary representation of (256||256) - newFE(this.curve, k2[0]), // first 32 octets contain the little-endian representation of x - newFE(this.curve, k2[1])); // and second 32 octets contain the little-endian representation of y. + if (algorithm["public"]) { + var k2 = to2(algorithm["public"]); + this.peer_Q = new newEC( + this.curve, // This corresponds to the binary representation of (256||256) + newFE(this.curve, k2[0]), // first 32 octets contain the little-endian representation of x + newFE(this.curve, k2[1]), + ); // and second 32 octets contain the little-endian representation of y. } } @@ -1968,21 +1948,21 @@ function GostSign(algorithm) // var hashLen, keyLen; if (this.curve) { keyLen = algorithm.length || bitLength(this.q); - if (keyLen > 508 && keyLen <= 512) - keyLen = 512; - else if (keyLen > 254 && keyLen <= 256) - keyLen = 256; + if (keyLen > 508 && keyLen <= 512) keyLen = 512; + else if (keyLen > 254 && keyLen <= 256) keyLen = 256; else - throw new NotSupportedError('Support keys only 256 or 512 bits length'); + throw new NotSupportedError( + "Support keys only 256 or 512 bits length", + ); hashLen = keyLen; } else { keyLen = algorithm.modulusLength || bitLength(this.p); - if (keyLen > 1016 && keyLen <= 1024) - keyLen = 1024; - else if (keyLen > 508 && keyLen <= 512) - keyLen = 512; + if (keyLen > 1016 && keyLen <= 1024) keyLen = 1024; + else if (keyLen > 508 && keyLen <= 512) keyLen = 512; else - throw new NotSupportedError('Support keys only 512 or 1024 bits length'); + throw new NotSupportedError( + "Support keys only 512 or 1024 bits length", + ); hashLen = 256; } this.bitLength = hashLen; @@ -1994,8 +1974,8 @@ function GostSign(algorithm) // // Hash function definition var hash = algorithm.hash; if (hash) { - if (typeof hash === 'string' || hash instanceof String) - hash = {name: hash}; + if (typeof hash === "string" || hash instanceof String) + hash = { name: hash }; if (algorithm.version === 1994 || algorithm.version === 2001) { hash.version = 1994; hash.length = 256; @@ -2006,18 +1986,17 @@ function GostSign(algorithm) // } hash.procreator = hash.procreator || algorithm.procreator; + if (!GostDigest) GostDigest = root.GostDigest; if (!GostDigest) - GostDigest = root.GostDigest; - if (!GostDigest) - throw new NotSupportedError('Object GostDigest not found'); + throw new NotSupportedError("Object GostDigest not found"); this.hash = new GostDigest(hash); } // Pregenerated seed for key exchange algorithms - if (algorithm.ukm) // Now don't check size + if (algorithm.ukm) + // Now don't check size this.ukm = algorithm.ukm; - } // export default GostSign; diff --git a/src/core/vendor/remove-exif.mjs b/src/core/vendor/remove-exif.mjs index 6c5c9e53..9431f002 100644 --- a/src/core/vendor/remove-exif.mjs +++ b/src/core/vendor/remove-exif.mjs @@ -22,130 +22,139 @@ import Utils from "../Utils.mjs"; // Param jpeg should be a binaryArray export function removeEXIF(jpeg) { - // Convert binaryArray to char string - jpeg = Utils.byteArrayToChars(jpeg); - if (jpeg.slice(0, 2) != "\xff\xd8") { - throw ("Given data is not jpeg."); - } + // Convert binaryArray to char string + jpeg = Utils.byteArrayToChars(jpeg); + if (jpeg.slice(0, 2) != "\xff\xd8") { + throw "Given data is not jpeg."; + } - var segments = splitIntoSegments(jpeg); - if (segments[1].slice(0, 2) == "\xff\xe1" && - segments[1].slice(4, 10) == "Exif\x00\x00") { - segments = [segments[0]].concat(segments.slice(2)); - } else if (segments[2].slice(0, 2) == "\xff\xe1" && - segments[2].slice(4, 10) == "Exif\x00\x00") { - segments = segments.slice(0, 2).concat(segments.slice(3)); - } else { - throw ("Exif not found."); - } + var segments = splitIntoSegments(jpeg); + if ( + segments[1].slice(0, 2) == "\xff\xe1" && + segments[1].slice(4, 10) == "Exif\x00\x00" + ) { + segments = [segments[0]].concat(segments.slice(2)); + } else if ( + segments[2].slice(0, 2) == "\xff\xe1" && + segments[2].slice(4, 10) == "Exif\x00\x00" + ) { + segments = segments.slice(0, 2).concat(segments.slice(3)); + } else { + throw "Exif not found."; + } - var new_data = segments.join(""); + var new_data = segments.join(""); - // Convert back to binaryArray - new_data = Utils.strToCharcode(new_data); + // Convert back to binaryArray + new_data = Utils.strToCharcode(new_data); - return new_data; -}; + return new_data; +} function splitIntoSegments(data) { - if (data.slice(0, 2) != "\xff\xd8") { - throw ("Given data isn't JPEG."); - } - - var head = 2; - var segments = ["\xff\xd8"]; - while (true) { - if (data.slice(head, head + 2) == "\xff\xda") { - segments.push(data.slice(head)); - break; - } else { - var length = unpack(">H", data.slice(head + 2, head + 4))[0]; - var endPoint = head + length + 2; - segments.push(data.slice(head, endPoint)); - head = endPoint; + if (data.slice(0, 2) != "\xff\xd8") { + throw "Given data isn't JPEG."; } - if (head >= data.length) { - throw ("Wrong JPEG data."); + var head = 2; + var segments = ["\xff\xd8"]; + while (true) { + if (data.slice(head, head + 2) == "\xff\xda") { + segments.push(data.slice(head)); + break; + } else { + var length = unpack(">H", data.slice(head + 2, head + 4))[0]; + var endPoint = head + length + 2; + segments.push(data.slice(head, endPoint)); + head = endPoint; + } + + if (head >= data.length) { + throw "Wrong JPEG data."; + } } - } - return segments; + return segments; } function unpack(mark, str) { - if (typeof(str) != "string") { - throw ("'unpack' error. Got invalid type argument."); - } - var l = 0; - for (var markPointer = 1; markPointer < mark.length; markPointer++) { - if (mark[markPointer].toLowerCase() == "b") { - l += 1; - } else if (mark[markPointer].toLowerCase() == "h") { - l += 2; - } else if (mark[markPointer].toLowerCase() == "l") { - l += 4; - } else { - throw ("'unpack' error. Got invalid mark."); + if (typeof str != "string") { + throw "'unpack' error. Got invalid type argument."; } - } - - if (l != str.length) { - throw ("'unpack' error. Mismatch between symbol and string length. " + l + ":" + str.length); - } - - var littleEndian; - if (mark[0] == "<") { - littleEndian = true; - } else if (mark[0] == ">") { - littleEndian = false; - } else { - throw ("'unpack' error."); - } - var unpacked = []; - var strPointer = 0; - var p = 1; - var val = null; - var c = null; - var length = null; - var sliced = ""; - - while (c = mark[p]) { - if (c.toLowerCase() == "b") { - length = 1; - sliced = str.slice(strPointer, strPointer + length); - val = sliced.charCodeAt(0); - if ((c == "b") && (val >= 0x80)) { - val -= 0x100; - } - } else if (c == "H") { - length = 2; - sliced = str.slice(strPointer, strPointer + length); - if (littleEndian) { - sliced = sliced.split("").reverse().join(""); - } - val = sliced.charCodeAt(0) * 0x100 + - sliced.charCodeAt(1); - } else if (c.toLowerCase() == "l") { - length = 4; - sliced = str.slice(strPointer, strPointer + length); - if (littleEndian) { - sliced = sliced.split("").reverse().join(""); - } - val = sliced.charCodeAt(0) * 0x1000000 + - sliced.charCodeAt(1) * 0x10000 + - sliced.charCodeAt(2) * 0x100 + - sliced.charCodeAt(3); - if ((c == "l") && (val >= 0x80000000)) { - val -= 0x100000000; - } - } else { - throw ("'unpack' error. " + c); + var l = 0; + for (var markPointer = 1; markPointer < mark.length; markPointer++) { + if (mark[markPointer].toLowerCase() == "b") { + l += 1; + } else if (mark[markPointer].toLowerCase() == "h") { + l += 2; + } else if (mark[markPointer].toLowerCase() == "l") { + l += 4; + } else { + throw "'unpack' error. Got invalid mark."; + } } - unpacked.push(val); - strPointer += length; - p += 1; - } + if (l != str.length) { + throw ( + "'unpack' error. Mismatch between symbol and string length. " + + l + + ":" + + str.length + ); + } - return unpacked; + var littleEndian; + if (mark[0] == "<") { + littleEndian = true; + } else if (mark[0] == ">") { + littleEndian = false; + } else { + throw "'unpack' error."; + } + var unpacked = []; + var strPointer = 0; + var p = 1; + var val = null; + var c = null; + var length = null; + var sliced = ""; + + while ((c = mark[p])) { + if (c.toLowerCase() == "b") { + length = 1; + sliced = str.slice(strPointer, strPointer + length); + val = sliced.charCodeAt(0); + if (c == "b" && val >= 0x80) { + val -= 0x100; + } + } else if (c == "H") { + length = 2; + sliced = str.slice(strPointer, strPointer + length); + if (littleEndian) { + sliced = sliced.split("").reverse().join(""); + } + val = sliced.charCodeAt(0) * 0x100 + sliced.charCodeAt(1); + } else if (c.toLowerCase() == "l") { + length = 4; + sliced = str.slice(strPointer, strPointer + length); + if (littleEndian) { + sliced = sliced.split("").reverse().join(""); + } + val = + sliced.charCodeAt(0) * 0x1000000 + + sliced.charCodeAt(1) * 0x10000 + + sliced.charCodeAt(2) * 0x100 + + sliced.charCodeAt(3); + if (c == "l" && val >= 0x80000000) { + val -= 0x100000000; + } + } else { + throw "'unpack' error. " + c; + } + + unpacked.push(val); + strPointer += length; + p += 1; + } + + return unpacked; } diff --git a/src/node/File.mjs b/src/node/File.mjs index 7a38ba16..f4b2a50e 100644 --- a/src/node/File.mjs +++ b/src/node/File.mjs @@ -6,7 +6,6 @@ import { detectFileType } from "../core/lib/FileType.mjs"; - /** * FileShim * @@ -16,7 +15,6 @@ import { detectFileType } from "../core/lib/FileType.mjs"; * File doesn't write to disk, but it would be easy to do so with e.gfs.writeFile. */ class File { - /** * Constructor * @@ -26,8 +24,7 @@ class File { * @param {String} name (optional) - file name * @param {Object} stats (optional) - file stats e.g. lastModified */ - constructor(data, name="", stats={}) { - + constructor(data, name = "", stats = {}) { if (!Array.isArray(data)) { data = [data]; } @@ -70,7 +67,6 @@ class File { get lastModifiedDate() { return new Date(this.lastModified); } - } export default File; diff --git a/src/node/NodeDish.mjs b/src/node/NodeDish.mjs index ef9fd11a..dcfc8e7d 100644 --- a/src/node/NodeDish.mjs +++ b/src/node/NodeDish.mjs @@ -13,14 +13,12 @@ import Dish from "../core/Dish.mjs"; * Adds some helper functions and improves coercion for Node.js logging. */ class NodeDish extends Dish { - /** - * Create a Dish - * @param {any} inputOrDish - The dish input - * @param {String|Number} - The dish type, as enum or string - */ - constructor(inputOrDish=null, type=null) { - + * Create a Dish + * @param {any} inputOrDish - The dish input + * @param {String|Number} - The dish type, as enum or string + */ + constructor(inputOrDish = null, type = null) { // Allow `fs` file input: // Any node fs Buffers transformed to array buffer // Use Array.from as Uint8Array doesnt pass instanceof Array test @@ -38,7 +36,7 @@ class NodeDish extends Dish { * @param {*} args - any arguments for the operation * @returns {Dish} a new dish with the result of the operation. */ - apply(operation, args=null) { + apply(operation, args = null) { return operation(this, args); } @@ -78,7 +76,6 @@ class NodeDish extends Dish { valueOf() { return this.presentAs(Dish.typeEnum("number")); } - } export default NodeDish; diff --git a/src/node/NodeRecipe.mjs b/src/node/NodeRecipe.mjs index bad8fc27..55f7bf35 100644 --- a/src/node/NodeRecipe.mjs +++ b/src/node/NodeRecipe.mjs @@ -4,7 +4,7 @@ * @license Apache-2.0 */ -import {operations} from "./index.mjs"; +import { operations } from "./index.mjs"; import { sanitise } from "./apiUtils.mjs"; /** @@ -13,7 +13,6 @@ import { sanitise } from "./apiUtils.mjs"; * environment. */ class NodeRecipe { - /** * Recipe constructor * @param recipeConfig @@ -22,7 +21,6 @@ class NodeRecipe { this._parseConfig(recipeConfig); } - /** * Validate an ingredient & coerce to operation if necessary. * @param {String | Function | Object} ing @@ -40,12 +38,16 @@ class NodeRecipe { // Need to validate against case 2 return this._validateIngredient(op); } else { - throw new TypeError(`Couldn't find an operation with name '${ing}'.`); + throw new TypeError( + `Couldn't find an operation with name '${ing}'.`, + ); } - // CASE operation given. Check its a chef operation and check its not flowcontrol + // CASE operation given. Check its a chef operation and check its not flowcontrol } else if (typeof ing === "function") { if (ing.flowControl) { - throw new TypeError(`flowControl operations like ${ing.opName} are not currently allowed in recipes for chef.bake in the Node API`); + throw new TypeError( + `flowControl operations like ${ing.opName} are not currently allowed in recipes for chef.bake in the Node API`, + ); } if (operations.includes(ing)) { @@ -53,19 +55,20 @@ class NodeRecipe { } else { throw new TypeError("Inputted function not a Chef operation."); } - // CASE: op, maybe with configuration + // CASE: op, maybe with configuration } else if (ing.op) { const sanitisedOp = this._validateIngredient(ing.op); if (ing.args) { - return {op: sanitisedOp, args: ing.args}; + return { op: sanitisedOp, args: ing.args }; } return sanitisedOp; } else { - throw new TypeError("Recipe can only contain function names or functions"); + throw new TypeError( + "Recipe can only contain function names or functions", + ); } } - /** * Parse an opList from a recipeConfig and assign it to the recipe's opList. * @param {String | Function | String[] | Function[] | [String | Function]} recipeConfig @@ -91,8 +94,10 @@ class NodeRecipe { execute(dish) { return this.opList.reduce((prev, curr) => { // CASE where opList item is op and args - if (Object.prototype.hasOwnProperty.call(curr, "op") && - Object.prototype.hasOwnProperty.call(curr, "args")) { + if ( + Object.prototype.hasOwnProperty.call(curr, "op") && + Object.prototype.hasOwnProperty.call(curr, "args") + ) { return curr.op(prev, curr.args); } // CASE opList item is just op. diff --git a/src/node/api.mjs b/src/node/api.mjs index 0c9dd8a7..1b0e824a 100644 --- a/src/node/api.mjs +++ b/src/node/api.mjs @@ -10,11 +10,16 @@ import NodeDish from "./NodeDish.mjs"; import NodeRecipe from "./NodeRecipe.mjs"; -import OperationConfig from "../core/config/OperationConfig.json" assert {type: "json"}; -import { sanitise, removeSubheadingsFromArray, sentenceToCamelCase } from "./apiUtils.mjs"; +import OperationConfig from "../core/config/OperationConfig.json" assert { + type: "json", +}; +import { + sanitise, + removeSubheadingsFromArray, + sentenceToCamelCase, +} from "./apiUtils.mjs"; import ExcludedOperationError from "../core/errors/ExcludedOperationError.mjs"; - /** * transformArgs * @@ -29,7 +34,6 @@ import ExcludedOperationError from "../core/errors/ExcludedOperationError.mjs"; * @param {Object} newArgs - any inputted args */ function transformArgs(opArgsList, newArgs) { - if (newArgs && Array.isArray(newArgs)) { return newArgs; } @@ -47,8 +51,10 @@ function transformArgs(opArgsList, newArgs) { if (newArgs) { Object.keys(newArgs).map((key) => { const index = opArgs.findIndex((arg) => { - return arg.name.toLowerCase().replace(/ /g, "") === - key.toLowerCase().replace(/ /g, ""); + return ( + arg.name.toLowerCase().replace(/ /g, "") === + key.toLowerCase().replace(/ /g, "") + ); }); if (index > -1) { @@ -62,7 +68,10 @@ function transformArgs(opArgsList, newArgs) { } } else if (argument.type === "editableOption") { // takes key: "option", key: {name, val: "string"}, key: {name, val: [...]} - argument.value = typeof newArgs[key] === "string" ? newArgs[key]: newArgs[key].value; + argument.value = + typeof newArgs[key] === "string" + ? newArgs[key] + : newArgs[key].value; } else { argument.value = newArgs[key]; } @@ -78,7 +87,9 @@ function transformArgs(opArgsList, newArgs) { } if (arg.type === "editableOption") { - return typeof arg.value === "string" ? arg.value : arg.value[0].value; + return typeof arg.value === "string" + ? arg.value + : arg.value[0].value; } if (arg.type === "toggleString") { @@ -92,7 +103,6 @@ function transformArgs(opArgsList, newArgs) { }); } - /** * Ensure an input is a SyncDish object. * @param input @@ -109,7 +119,6 @@ function ensureIsDish(input) { } } - /** * prepareOp: transform args, make input the right type. * Also convert any Buffers to ArrayBuffers. @@ -122,10 +131,9 @@ function prepareOp(opInstance, input, args) { // Transform object-style args to original args array const transformedArgs = transformArgs(opInstance.args, args); const transformedInput = dish.get(opInstance.inputType); - return {transformedInput, transformedArgs}; + return { transformedInput, transformedArgs }; } - /** * createArgInfo * @@ -135,14 +143,14 @@ function prepareOp(opInstance, input, args) { * * @param {Operation} op - the operation to extract args from * @returns {{}} - arrays of options for args. -*/ + */ function createArgInfo(op) { const result = {}; op.args.forEach((a) => { if (a.type === "option" || a.type === "editableOption") { result[sentenceToCamelCase(a.name)] = { type: a.type, - options: removeSubheadingsFromArray(a.value) + options: removeSubheadingsFromArray(a.value), }; } else if (a.type === "toggleString") { result[sentenceToCamelCase(a.name)] = { @@ -161,7 +169,6 @@ function createArgInfo(op) { return result; } - /** * Wrap an operation to be consumed by node API. * Checks to see if run function is async or not. @@ -173,7 +180,6 @@ function createArgInfo(op) { * some type conversion logic */ export function _wrap(OpClass) { - // Check to see if class's run function is async. const opInstance = new OpClass(); const isAsync = opInstance.run.constructor.name === "AsyncFunction"; @@ -190,8 +196,12 @@ export function _wrap(OpClass) { * @returns {Promise} operation's output, on a Dish. * @throws {OperationError} if the operation throws one. */ - wrapped = async (input, args=null) => { - const {transformedInput, transformedArgs} = prepareOp(opInstance, input, args); + wrapped = async (input, args = null) => { + const { transformedInput, transformedArgs } = prepareOp( + opInstance, + input, + args, + ); // SPECIAL CASE for Magic. Other flowControl operations will // not work because the opList is not passed in. @@ -212,7 +222,10 @@ export function _wrap(OpClass) { }); } - const result = await opInstance.run(transformedInput, transformedArgs); + const result = await opInstance.run( + transformedInput, + transformedArgs, + ); return new NodeDish({ value: result, @@ -227,8 +240,12 @@ export function _wrap(OpClass) { * @returns {SyncDish} operation's output, on a Dish. * @throws {OperationError} if the operation throws one. */ - wrapped = (input, args=null) => { - const {transformedInput, transformedArgs} = prepareOp(opInstance, input, args); + wrapped = (input, args = null) => { + const { transformedInput, transformedArgs } = prepareOp( + opInstance, + input, + args, + ); const result = opInstance.run(transformedInput, transformedArgs); return new NodeDish({ value: result, @@ -246,7 +263,6 @@ export function _wrap(OpClass) { return wrapped; } - /** * help: Give information about operations matching the given search term, * or inputted operation. @@ -279,14 +295,20 @@ export function help(input) { // flag up an exact name match. Only first exact match counts. if (!exactMatchExists) { - exactMatchExists = sanitise(hydrated.name) === sanitise(searchTerm); + exactMatchExists = + sanitise(hydrated.name) === sanitise(searchTerm); } // Return hydrated along with what type of match it was return { hydrated, - nameExactMatch: sanitise(hydrated.name) === sanitise(searchTerm), - nameMatch: sanitise(hydrated.name).includes(sanitise(searchTerm)), - descMatch: sanitise(hydrated.description).includes(sanitise(searchTerm)) + nameExactMatch: + sanitise(hydrated.name) === sanitise(searchTerm), + nameMatch: sanitise(hydrated.name).includes( + sanitise(searchTerm), + ), + descMatch: sanitise(hydrated.description).includes( + sanitise(searchTerm), + ), }; }) // Filter out non-matches. If exact match exists, filter out all others. @@ -299,11 +321,11 @@ export function help(input) { // sort results with name match first .sort((a, b) => { const aInt = a.nameMatch ? 1 : 0; - const bInt = b.nameMatch ? 1 : 0; + const bInt = b.nameMatch ? 1 : 0; return bInt - aInt; }) // extract just the hydrated config - .map(result => result.hydrated); + .map((result) => result.hydrated); if (matches && matches.length) { // console.log(`${matches.length} result${matches.length > 1 ? "s" : ""} found.`); @@ -314,7 +336,6 @@ export function help(input) { return null; } - /** * bake * @@ -325,12 +346,11 @@ export function help(input) { * @throws {TypeError} if invalid recipe given. */ export function bake(input, recipeConfig) { - const recipe = new NodeRecipe(recipeConfig); + const recipe = new NodeRecipe(recipeConfig); const dish = ensureIsDish(input); return recipe.execute(dish); } - /** * explainExcludedFunction * @@ -340,9 +360,11 @@ export function bake(input, recipeConfig) { export function _explainExcludedFunction(name) { /** * Throw new error type with useful message. - */ + */ const func = () => { - throw new ExcludedOperationError(`Sorry, the ${name} operation is not available in the Node.js version of CyberChef.`); + throw new ExcludedOperationError( + `Sorry, the ${name} operation is not available in the Node.js version of CyberChef.`, + ); }; // Add opName prop so NodeRecipe can handle it, just like wrap does. func.opName = name; diff --git a/src/node/apiUtils.mjs b/src/node/apiUtils.mjs index 64688073..ac8b139d 100644 --- a/src/node/apiUtils.mjs +++ b/src/node/apiUtils.mjs @@ -6,7 +6,6 @@ * @license Apache-2.0 */ - /** * someName => Somename * @@ -26,7 +25,6 @@ const capitalise = function capitalise(str) { return `${str.charAt(0).toUpperCase()}${str.substr(1).toLowerCase()}`; }; - /** * SomeName => someName * @param {String} name - string to be altered @@ -45,10 +43,9 @@ export function decapitalise(str) { return `${str.charAt(0).toLowerCase()}${str.substr(1)}`; } - /** * Remove strings surrounded with [] from the given array. -*/ + */ export function removeSubheadingsFromArray(array) { if (Array.isArray(array)) { return array.filter((i) => { @@ -60,7 +57,6 @@ export function removeSubheadingsFromArray(array) { } } - /** * Remove spaces, make lower case. * @param str @@ -69,13 +65,13 @@ export function sanitise(str) { return str.replace(/ /g, "").toLowerCase(); } - /** * something like this => somethingLikeThis * ABC a sentence => ABCASentence -*/ + */ export function sentenceToCamelCase(str) { - return str.split(" ") + return str + .split(" ") .map((s, index) => { if (index === 0) { return decapitalise(s); diff --git a/src/node/config/excludedOperations.mjs b/src/node/config/excludedOperations.mjs index 9359475d..23a1f48a 100644 --- a/src/node/config/excludedOperations.mjs +++ b/src/node/config/excludedOperations.mjs @@ -5,7 +5,7 @@ * @copyright Crown Copyright 2018 * @license Apache-2.0 */ -export default [ +export default [ // This functionality can be done more easily using JavaScript "Fork", "Merge", diff --git a/src/node/config/scripts/generateNodeIndex.mjs b/src/node/config/scripts/generateNodeIndex.mjs index 4e16fbeb..f1be194d 100644 --- a/src/node/config/scripts/generateNodeIndex.mjs +++ b/src/node/config/scripts/generateNodeIndex.mjs @@ -17,13 +17,19 @@ import * as operations from "../../../core/operations/index.mjs"; import { decapitalise } from "../../apiUtils.mjs"; import excludedOperations from "../excludedOperations.mjs"; -const includedOperations = Object.keys(operations).filter((op => excludedOperations.indexOf(op) === -1)); +const includedOperations = Object.keys(operations).filter( + (op) => excludedOperations.indexOf(op) === -1, +); const dir = path.join(`${process.cwd()}/src/node`); if (!fs.existsSync(dir)) { console.log("\nCWD: " + process.cwd()); - console.log("Error: generateNodeIndex.mjs should be run from the project root"); - console.log("Example> node --experimental-modules src/core/config/scripts/generateNodeIndex.mjs"); + console.log( + "Error: generateNodeIndex.mjs should be run from the project root", + ); + console.log( + "Example> node --experimental-modules src/core/config/scripts/generateNodeIndex.mjs", + ); process.exit(1); } @@ -51,7 +57,7 @@ includedOperations.forEach((op) => { code += ` ${op} as core_${op},\n`; }); -code +=` +code += ` } from "../core/operations/index.mjs"; global.File = File; @@ -70,7 +76,9 @@ includedOperations.forEach((op) => { }); excludedOperations.forEach((op) => { - code += ` "${decapitalise(op)}": _explainExcludedFunction("${op}"),\n`; + code += ` "${decapitalise( + op, + )}": _explainExcludedFunction("${op}"),\n`; }); code += ` }; @@ -89,7 +97,7 @@ Object.keys(operations).forEach((op) => { code += `const ${decapitalise(op)} = chef.${decapitalise(op)};\n`; }); -code +=` +code += ` // Define array of all operations to create register for bake. const operations = [\n`; @@ -120,8 +128,4 @@ code += " ExcludedOperationError,\n"; code += " DishError,\n"; code += "};\n"; - -fs.writeFileSync( - path.join(dir, "./index.mjs"), - code -); +fs.writeFileSync(path.join(dir, "./index.mjs"), code); diff --git a/src/node/repl.mjs b/src/node/repl.mjs index 9846ff31..62c5c135 100644 --- a/src/node/repl.mjs +++ b/src/node/repl.mjs @@ -10,7 +10,6 @@ import chef from "./index.mjs"; import repl from "repl"; - /* eslint no-console: ["off"] */ console.log(` @@ -33,4 +32,3 @@ Object.keys(chef).forEach((key) => { replServer.context[key] = chef[key]; } }); - diff --git a/src/web/App.mjs b/src/web/App.mjs index cce91b1e..52a26cd0 100755 --- a/src/web/App.mjs +++ b/src/web/App.mjs @@ -5,7 +5,7 @@ */ import Utils, { debounce } from "../core/Utils.mjs"; -import {fromBase64} from "../core/lib/Base64.mjs"; +import { fromBase64 } from "../core/lib/Base64.mjs"; import Manager from "./Manager.mjs"; import HTMLCategory from "./HTMLCategory.mjs"; import HTMLOperation from "./HTMLOperation.mjs"; @@ -13,13 +13,11 @@ import Split from "split.js"; import moment from "moment-timezone"; import cptable from "codepage"; - /** * HTML view for CyberChef responsible for building the web page and dealing with all user * interactions. */ class App { - /** * App constructor. * @@ -29,26 +27,25 @@ class App { * @param {Object} options - Default setting for app options. */ constructor(categories, operations, defaultFavourites, defaultOptions) { - this.categories = categories; - this.operations = operations; - this.dfavourites = defaultFavourites; - this.doptions = defaultOptions; - this.options = Object.assign({}, defaultOptions); + this.categories = categories; + this.operations = operations; + this.dfavourites = defaultFavourites; + this.doptions = defaultOptions; + this.options = Object.assign({}, defaultOptions); - this.manager = new Manager(this); + this.manager = new Manager(this); - this.baking = false; - this.autoBake_ = false; + this.baking = false; + this.autoBake_ = false; this.autoBakePause = false; - this.progress = 0; - this.ingId = 0; + this.progress = 0; + this.ingId = 0; - this.appLoaded = false; - this.workerLoaded = false; + this.appLoaded = false; + this.workerLoaded = false; this.waitersLoaded = false; } - /** * This function sets up the stage and creates listeners for all events. * @@ -71,7 +68,6 @@ class App { this.loaded(); } - /** * Fires once all setup activities have completed. * @@ -80,8 +76,13 @@ class App { loaded() { // Check that both the app and the worker have loaded successfully, and that // we haven't already loaded before attempting to remove the loading screen. - if (!this.workerLoaded || !this.appLoaded || !this.waitersLoaded || - !document.getElementById("loader-wrapper")) return; + if ( + !this.workerLoaded || + !this.appLoaded || + !this.waitersLoaded || + !document.getElementById("loader-wrapper") + ) + return; // Load state from URI this.loadURIParams(this.uriParams); @@ -91,13 +92,16 @@ class App { // Wait for animations to complete then remove the preloader and loaded style // so that the animations for existing elements don't play again. - setTimeout(function() { - document.getElementById("loader-wrapper").remove(); - document.body.classList.remove("loaded"); + setTimeout( + function () { + document.getElementById("loader-wrapper").remove(); + document.body.classList.remove("loaded"); - // Bake initial input - this.manager.input.bakeAll(); - }.bind(this), 1000); + // Bake initial input + this.manager.input.bakeAll(); + }.bind(this), + 1000, + ); // Clear the loading message interval clearInterval(window.loadingMsgsInt); @@ -111,7 +115,6 @@ class App { this.manager.output.calcMaxTabs(); } - /** * An error handler for displaying the error to the user. * @@ -121,17 +124,20 @@ class App { handleError(err, logToConsole) { if (logToConsole) log.error(err); const msg = err.displayStr || err.toString(); - this.alert(Utils.escapeHtml(msg), this.options.errorTimeout, !this.options.showErrors); + this.alert( + Utils.escapeHtml(msg), + this.options.errorTimeout, + !this.options.showErrors, + ); } - /** * Asks the ChefWorker to bake the current input using the current recipe. * * @param {boolean} [step] - Set to true if we should only execute one operation instead of the * whole recipe. */ - bake(step=false) { + bake(step = false) { if (this.baking) return; // Reset attemptHighlight flag @@ -142,13 +148,12 @@ class App { this.manager.worker.bake( this.getRecipeConfig(), // The configuration of the recipe - this.options, // Options set by the user - this.progress, // The current position in the recipe - step // Whether or not to take one step or execute the whole recipe + this.options, // Options set by the user + this.progress, // The current position in the recipe + step, // Whether or not to take one step or execute the whole recipe ); } - /** * Runs Auto Bake if it is set. */ @@ -162,14 +167,13 @@ class App { log.debug("Auto-baking"); this.manager.worker.bakeInputs({ nums: [this.manager.tabs.getActiveTab("input")], - step: false + step: false, }); } else { this.manager.controls.showStaleIndicator(); } } - /** * Executes the next step of the recipe. */ @@ -192,12 +196,11 @@ class App { action: "step", data: { activeTab: activeTab, - progress: progress + 1 - } + progress: progress + 1, + }, }); } - /** * Runs a silent bake, forcing the browser to load and cache all the relevant JavaScript code needed * to do a real bake. @@ -217,7 +220,6 @@ class App { this.manager.worker.silentBake(recipeConfig); } - /** * Sets the user's input data. * @@ -234,12 +236,11 @@ class App { action: "setInput", data: { inputNum: inputNum, - silent: true - } + silent: true, + }, }); } - /** * Populates the operations accordion list with the categories and operations specified in the * view constructor. @@ -265,7 +266,12 @@ class App { continue; } - const op = new HTMLOperation(opName, this.operations[opName], this, this.manager); + const op = new HTMLOperation( + opName, + this.operations[opName], + this, + this.manager, + ); cat.addOperation(op); } @@ -284,21 +290,23 @@ class App { const favCat = document.querySelector("#categories a"); favCat.appendChild(document.getElementById("edit-favourites")); favCat.setAttribute("data-help-title", "Favourite operations"); - favCat.setAttribute("data-help", `

    This category displays your favourite operations.

    + favCat.setAttribute( + "data-help", + `

    This category displays your favourite operations.

    • To add: drag an operation over the Favourites category
    • To reorder: Click on the 'Edit favourites' button and drag operations up and down in the list provided
    • To remove: Click on the 'Edit favourites' button and hit the delete button next to the operation you want to remove
    • -
    `); + `, + ); } - /** * Sets up the adjustable splitter to allow the user to resize areas of the page. * * @param {boolean} [minimise=false] - Set this flag if attempting to minimise frames to 0 width */ - initialiseSplitter(minimise=false) { + initialiseSplitter(minimise = false) { if (this.columnSplitter) this.columnSplitter.destroy(); if (this.ioSplitter) this.ioSplitter.destroy(); @@ -307,21 +315,26 @@ class App { minSize: minimise ? [0, 0, 0] : [240, 310, 450], gutterSize: 4, expandToMin: true, - onDrag: debounce(function() { - this.adjustComponentSizes(); - }, 50, "dragSplitter", this, []) + onDrag: debounce( + function () { + this.adjustComponentSizes(); + }, + 50, + "dragSplitter", + this, + [], + ), }); this.ioSplitter = Split(["#input", "#output"], { direction: "vertical", gutterSize: 4, - minSize: minimise ? [0, 0] : [100, 100] + minSize: minimise ? [0, 0] : [100, 100], }); this.adjustComponentSizes(); } - /** * Loads the information previously saved to the HTML5 local storage object so that user options * and favourites can be restored. @@ -329,7 +342,10 @@ class App { loadLocalStorage() { // Load options let lOptions; - if (this.isLocalStorageAvailable() && localStorage.options !== undefined) { + if ( + this.isLocalStorageAvailable() && + localStorage.options !== undefined + ) { lOptions = JSON.parse(localStorage.options); } this.manager.options.load(lOptions); @@ -338,7 +354,6 @@ class App { this.loadFavourites(); } - /** * Loads the user's favourite operations from the HTML5 local storage object and populates the * Favourites category with them. @@ -348,16 +363,17 @@ class App { let favourites; if (this.isLocalStorageAvailable()) { - favourites = localStorage?.favourites?.length > 2 ? - JSON.parse(localStorage.favourites) : - this.dfavourites; + favourites = + localStorage?.favourites?.length > 2 + ? JSON.parse(localStorage.favourites) + : this.dfavourites; favourites = this.validFavourites(favourites); this.saveFavourites(favourites); } else { favourites = this.dfavourites; } - const favCat = this.categories.filter(function(c) { + const favCat = this.categories.filter(function (c) { return c.name === "Favourites"; })[0]; @@ -366,12 +382,11 @@ class App { } else { this.categories.unshift({ name: "Favourites", - ops: favourites + ops: favourites, }); } } - /** * Filters the list of favourite operations that the user had stored and removes any that are no * longer available. The user is notified if this is the case. @@ -385,14 +400,17 @@ class App { if (favourites[i] in this.operations) { validFavs.push(favourites[i]); } else { - this.alert(`The operation "${Utils.escapeHtml(favourites[i])}" is no longer available. ` + - "It has been removed from your favourites."); + this.alert( + `The operation "${Utils.escapeHtml( + favourites[i], + )}" is no longer available. ` + + "It has been removed from your favourites.", + ); } } return validFavs; } - /** * Saves a list of favourite operations to the HTML5 local storage object. * @@ -402,15 +420,17 @@ class App { if (!this.isLocalStorageAvailable()) { this.alert( "Your security settings do not allow access to local storage so your favourites cannot be saved.", - 5000 + 5000, ); return false; } - localStorage.setItem("favourites", JSON.stringify(this.validFavourites(favourites))); + localStorage.setItem( + "favourites", + JSON.stringify(this.validFavourites(favourites)), + ); } - /** * Resets favourite operations back to the default as specified in the view constructor and * refreshes the operation list. @@ -422,7 +442,6 @@ class App { this.manager.recipe.initialiseOperationDragNDrop(); } - /** * Adds an operation to the user's favourites. * @@ -453,7 +472,8 @@ class App { // We prefer getting the hash by splitting the href rather than referencing // location.hash as some browsers (Firefox) automatically URL decode it, // which cause issues. - const params = window.location.search || + const params = + window.location.search || window.location.href.split("#")[1] || window.location.hash; const parsedParams = Utils.parseURIParams(params); @@ -470,14 +490,16 @@ class App { * @param {Object} params * @fires Manager#statechange */ - loadURIParams(params=this.getURIParams()) { + loadURIParams(params = this.getURIParams()) { this.autoBakePause = true; this.uriParams = params; // Read in recipe from URI params if (this.uriParams.recipe) { try { - const recipeConfig = Utils.parseRecipeConfig(this.uriParams.recipe); + const recipeConfig = Utils.parseRecipeConfig( + this.uriParams.recipe, + ); this.setRecipeConfig(recipeConfig); } catch (err) {} } else if (this.uriParams.op) { @@ -485,7 +507,10 @@ class App { this.manager.recipe.clearRecipe(); // Search for nearest match and add it - const matchedOps = this.manager.ops.filterOperations(this.uriParams.op, false); + const matchedOps = this.manager.ops.filterOperations( + this.uriParams.op, + false, + ); if (matchedOps.length) { this.manager.recipe.addOperation(matchedOps[0].name); } @@ -523,7 +548,11 @@ class App { try { let inputVal; const inputChrEnc = this.manager.input.getChrEnc(); - const inputData = fromBase64(this.uriParams.input, null, "byteArray"); + const inputData = fromBase64( + this.uriParams.input, + null, + "byteArray", + ); if (inputChrEnc > 0) { inputVal = cptable.utils.decode(inputChrEnc, inputData); } else { @@ -535,14 +564,15 @@ class App { // Read in theme from URI params if (this.uriParams.theme) { - this.manager.options.changeTheme(Utils.escapeHtml(this.uriParams.theme)); + this.manager.options.changeTheme( + Utils.escapeHtml(this.uriParams.theme), + ); } this.autoBakePause = false; window.dispatchEvent(this.manager.statechange); } - /** * Returns the next ingredient ID and increments it for next time. * @@ -552,7 +582,6 @@ class App { return this.ingId++; } - /** * Gets the current recipe configuration. * @@ -562,7 +591,6 @@ class App { return this.manager.recipe.getConfig(); } - /** * Given a recipe configuration, sets the recipe to that configuration. * @@ -590,8 +618,11 @@ class App { } else if (args[j].classList.contains("toggle-string")) { // toggleString args[j].value = recipeConfig[i].args[j].string; - args[j].parentNode.parentNode.querySelector("button").innerHTML = - Utils.escapeHtml(recipeConfig[i].args[j].option); + args[j].parentNode.parentNode.querySelector( + "button", + ).innerHTML = Utils.escapeHtml( + recipeConfig[i].args[j].option, + ); } else { // all others args[j].value = recipeConfig[i].args[j]; @@ -615,7 +646,6 @@ class App { this.autoBakePause = false; } - /** * Resets the splitter positions to default. */ @@ -635,7 +665,6 @@ class App { this.manager.controls.calcControlsHeight(); } - /** * Sets the compile message. */ @@ -643,10 +672,12 @@ class App { // Display time since last build and compile message const now = new Date(), msSinceCompile = now.getTime() - window.compileTime, - timeSinceCompile = moment.duration(msSinceCompile, "milliseconds").humanize(); + timeSinceCompile = moment + .duration(msSinceCompile, "milliseconds") + .humanize(); // Calculate previous version to compare to - const prev = PKG_VERSION.split(".").map(n => { + const prev = PKG_VERSION.split(".").map((n) => { return parseInt(n, 10); }); if (prev[2] > 0) prev[2]--; @@ -655,7 +686,10 @@ class App { // const compareURL = `https://github.com/gchq/CyberChef/compare/v${prev.join(".")}...v${PKG_VERSION}`; - let compileInfo = `Last build: ${timeSinceCompile.substr(0, 1).toUpperCase() + timeSinceCompile.substr(1)} ago`; + let compileInfo = `Last build: ${ + timeSinceCompile.substr(0, 1).toUpperCase() + + timeSinceCompile.substr(1) + } ago`; if (window.compileMessage !== "") { compileInfo += " - " + window.compileMessage; @@ -663,12 +697,17 @@ class App { const notice = document.getElementById("notice"); notice.innerHTML = compileInfo; - notice.setAttribute("title", Utils.stripHtmlTags(window.compileMessage)); + notice.setAttribute( + "title", + Utils.stripHtmlTags(window.compileMessage), + ); notice.setAttribute("data-help-title", "Last build"); - notice.setAttribute("data-help", "This live version of CyberChef is updated whenever new commits are added to the master branch of the CyberChef repository. It represents the latest, most up-to-date build of CyberChef."); + notice.setAttribute( + "data-help", + "This live version of CyberChef is updated whenever new commits are added to the master branch of the CyberChef repository. It represents the latest, most up-to-date build of CyberChef.", + ); } - /** * Determines whether the browser supports Local Storage and if it is accessible. * @@ -684,7 +723,6 @@ class App { } } - /** * Pops up a message to the user and writes it to the console log. * @@ -702,7 +740,7 @@ class App { * // Pops up a box with the message "Happy Christmas!" that will disappear after 5 seconds. * this.alert("Happy Christmas!", 5000); */ - alert(str, timeout=0, silent=false) { + alert(str, timeout = 0, silent = false) { const time = new Date(); log.info("[" + time.toLocaleString() + "] " + str); @@ -714,11 +752,10 @@ class App { htmlAllowed: true, onClose: () => { this.currentSnackbar.remove(); - } + }, }); } - /** * Pops up a box asking the user a question and sending the answer to a specified callback function. * @@ -743,28 +780,42 @@ class App { document.getElementById("confirm-modal").style.display = "block"; this.confirmClosed = false; - $("#confirm-modal").modal() - .one("show.bs.modal", function(e) { - this.confirmClosed = false; - }.bind(this)) - .one("click", "#confirm-yes", function() { - this.confirmClosed = true; - callback.bind(scope)(true); - $("#confirm-modal").modal("hide"); - }.bind(this)) - .one("click", "#confirm-no", function() { - this.confirmClosed = true; - callback.bind(scope)(false); - }.bind(this)) - .one("hide.bs.modal", function(e) { - if (!this.confirmClosed) { - callback.bind(scope)(undefined); - } - this.confirmClosed = true; - }.bind(this)); + $("#confirm-modal") + .modal() + .one( + "show.bs.modal", + function (e) { + this.confirmClosed = false; + }.bind(this), + ) + .one( + "click", + "#confirm-yes", + function () { + this.confirmClosed = true; + callback.bind(scope)(true); + $("#confirm-modal").modal("hide"); + }.bind(this), + ) + .one( + "click", + "#confirm-no", + function () { + this.confirmClosed = true; + callback.bind(scope)(false); + }.bind(this), + ) + .one( + "hide.bs.modal", + function (e) { + if (!this.confirmClosed) { + callback.bind(scope)(undefined); + } + this.confirmClosed = true; + }.bind(this), + ); } - /** * Handler for CyerChef statechange events. * Fires whenever the input or recipe changes in any way. @@ -773,14 +824,19 @@ class App { * @param {event} e */ stateChange(e) { - debounce(function() { - this.progress = 0; - this.autoBake(); - this.updateURL(true, null, true); - }, 20, "stateChange", this, [])(); + debounce( + function () { + this.progress = 0; + this.autoBake(); + this.updateURL(true, null, true); + }, + 20, + "stateChange", + this, + [], + )(); } - /** * Update the page title and URL to contain the new recipe * @@ -788,7 +844,7 @@ class App { * @param {string} [input=null] * @param {boolean} [changeUrl=true] */ - updateURL(includeInput, input=null, changeUrl=true) { + updateURL(includeInput, input = null, changeUrl = true) { // Set title const recipeConfig = this.getRecipeConfig(); let title = "CyberChef"; @@ -796,24 +852,30 @@ class App { title = `${recipeConfig[0].op} - ${title}`; } else if (recipeConfig.length > 1) { // See how long the full recipe is - const ops = recipeConfig.map(op => op.op).join(", "); + const ops = recipeConfig.map((op) => op.op).join(", "); if (ops.length < 45) { title = `${ops} - ${title}`; } else { // If it's too long, just use the first one and say how many more there are - title = `${recipeConfig[0].op}, ${recipeConfig.length - 1} more - ${title}`; + title = `${recipeConfig[0].op}, ${ + recipeConfig.length - 1 + } more - ${title}`; } } document.title = title; // Update the current history state (not creating a new one) if (this.options.updateUrl && changeUrl) { - this.lastStateUrl = this.manager.controls.generateStateUrl(true, includeInput, input, recipeConfig); + this.lastStateUrl = this.manager.controls.generateStateUrl( + true, + includeInput, + input, + recipeConfig, + ); window.history.replaceState({}, title, this.lastStateUrl); } } - /** * Handler for the history popstate event. * Reloads parameters from the URL. @@ -823,7 +885,6 @@ class App { popState(e) { this.loadURIParams(); } - } export default App; diff --git a/src/web/HTMLCategory.mjs b/src/web/HTMLCategory.mjs index 0414fd71..77219d18 100755 --- a/src/web/HTMLCategory.mjs +++ b/src/web/HTMLCategory.mjs @@ -8,7 +8,6 @@ * Object to handle the creation of operation categories. */ class HTMLCategory { - /** * HTMLCategory constructor. * @@ -21,7 +20,6 @@ class HTMLCategory { this.opList = []; } - /** * Adds an operation to this category. * @@ -31,7 +29,6 @@ class HTMLCategory { this.opList.push(operation); } - /** * Renders the category and all operations within it in HTML. * @@ -43,7 +40,9 @@ class HTMLCategory { ${this.name} -
    +
      `; for (let i = 0; i < this.opList.length; i++) { @@ -53,7 +52,6 @@ class HTMLCategory { html += "
    "; return html; } - } export default HTMLCategory; diff --git a/src/web/HTMLIngredient.mjs b/src/web/HTMLIngredient.mjs index 7eddb32c..2cfbba17 100755 --- a/src/web/HTMLIngredient.mjs +++ b/src/web/HTMLIngredient.mjs @@ -10,7 +10,6 @@ import Utils from "../core/Utils.mjs"; * Object to handle the creation of operation ingredients. */ class HTMLIngredient { - /** * HTMLIngredient constructor. * @@ -35,12 +34,11 @@ class HTMLIngredient { this.ingId = this.app.nextIngId(); this.id = "ing-" + this.ingId; this.tabIndex = this.ingId + 2; // Input = 1, Search = 2 - this.min = (typeof config.min === "number") ? config.min : ""; - this.max = (typeof config.max === "number") ? config.max : ""; + this.min = typeof config.min === "number" ? config.min : ""; + this.max = typeof config.max === "number" ? config.max : ""; this.step = config.step || 1; } - /** * Renders the ingredient in HTML. * @@ -48,7 +46,9 @@ class HTMLIngredient { */ toHtml() { let html = "", - i, m, eventFn; + i, + m, + eventFn; switch (this.type) { case "string": @@ -56,7 +56,11 @@ class HTMLIngredient { case "byteArray": html += `
    + ${ + this.hint + ? `data-toggle="tooltip" title="${this.hint}"` + : "" + } + class="bmd-label-floating toggle-string">${ + this.name + } + ${ + this.maxLength + ? `maxlength="${this.maxLength}"` + : "" + }>
    - +