pax_global_header00006660000000000000000000000064133173652130014516gustar00rootroot0000000000000052 comment=bffda8cca9d47cc5567909f4ce7794aeaa81c4e1 princeprocessor-0.22/000077500000000000000000000000001331736521300146615ustar00rootroot00000000000000princeprocessor-0.22/.editorconfig000066400000000000000000000004331331736521300173360ustar00rootroot00000000000000# top-most EditorConfig file root = true # This repo is f@cked up with CRLF so this config will ensure your # editor keeps using the same format. [*] charset = utf-8 end_of_line = crlf insert_final_newline = true trim_trailing_whitespace = true indent_style = space indent_size = 2 princeprocessor-0.22/.gitignore000066400000000000000000000000361331736521300166500ustar00rootroot00000000000000src/*.bin src/*.exe src/*.app princeprocessor-0.22/CHANGES000066400000000000000000000040101331736521300156470ustar00rootroot00000000000000* v0.21 -> v0.22: - Correct spelling mistake - Cosmetic: 'oclHashcat' -> 'hashcat', 'hashcat' -> 'hashcat-legacy' - Fix signature of catch_int - Allow a negative --elem-cnt-max - Makefile cleanup: remove comments about hashcat-toolchain - Added .gitignore - Updated year in LICENSE file * v0.20 -> v0.21: - Exit if stdout is closed or has a error - Fix for "Bug --pw-min" issue - Print position when stopped - Allow wordlist as fileparameter - Load only NUM words from input wordlist or use 0 to disable * v0.19 -> v0.20: - Add dupe suppression - Add a fake-GMP header using uint128_t macros. This is to replace depency on GMP - Add --case-permute amplifier option, default is disabled - Fixed buffer overflow - Fixed accidental reverted changes - Fixed a bug where ee actually couldn't correctly support output longer than 31 but 32 is supported - More memory savings: Use only the actual space needed for each word * v0.18 -> v0.19: - Fixed missing free() in shutdown section - Fixed wrong version number in source - Fixed discrepancies with logic and error messages - Added validation check pw-max > elem-cnt-max - Untie IN_LEN_* from PW_* to allow --pw-max > 16 without recompilation - If out of memory, tell how much we tried to allocate - Allow hex input for --skip and --limit - Optimized output performance * v0.17 -> v0.18: - Fixed major bug where all candidates are of the same length till chain changes * v0.16 -> v0.17: - Fixed download url for binaries in README - Fixed copy paste bug in input verification - Fixed bug where pw_orders is not sorted - Fixed memory leak - Removed O_BINARY for stderr - Removed some unused code - Renamed variables so that they match the meaning from the presentation slides - Optimized seeking performance - Optimized output performance * v0.15 -> v0.16: - Open Source the project - License is MIT - Moved repository to github: https://github.com/jsteube/princeprocessor - Added CHANGES - Added LICENSE - Added README.md - Changed default value for --pw-max from 24 to 16 for faster startup time princeprocessor-0.22/LICENSE000066400000000000000000000026471331736521300156770ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015-2018 Jens Steube, Copyright (c) 2015-2018 magnum Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------ malloc_tiny() and the hashed dupe suppression are based on code from John the Ripper password cracker: Copyright (c) 1996-99,2002-2003,2005-2006,2010-2012 by Solar Designer Redistribution and use in source and binary forms, with or without modification, are permitted. There's ABSOLUTELY NO WARRANTY, express or implied. princeprocessor-0.22/README.md000066400000000000000000000033341331736521300161430ustar00rootroot00000000000000princeprocessor ============== Standalone password candidate generator using the PRINCE algorithm The name PRINCE is used as an acronym and stands for PRobability INfinite Chained Elements, which are the building blocks of the algorithm Brief description -------------- The princeprocessor is a password candidate generator and can be thought of as an advanced combinator attack. Rather than taking as input two different wordlists and then outputting all the possible two word combinations though, princeprocessor only has one input wordlist and builds "chains" of combined words. These chains can have 1 to N words from the input wordlist concatenated together. So for example if it is outputting guesses of length four, it could generate them using combinations from the input wordlist such as: - 4 letter word - 2 letter word + 2 letter word - 1 letter word + 3 letter word - 3 letter word + 1 letter word - 1 letter word + 1 letter word + 2 letter word - 1 letter word + 2 letter word + 1 letter word - 2 letter word + 1 letter word + 1 letter word - 1 letter word + 1 letter word + 1 letter word + 1 letter word Detailed description -------------- I'm going to write a detailed description in case I'm extremely bored. Till that, use the following resources: - My talk about princeprocessor on Passwords^14 conference in Trondheim, Norway. Slides: https://hashcat.net/events/p14-trondheim/prince-attack.pdf - Thanks to Matt Weir, he made a nice analysis of princeprocessor. You can find the post on his blog: http://reusablesec.blogspot.de/2014/12/tool-deep-dive-prince.html Compile -------------- Simply run make Binary distribution -------------- Binaries for Linux, Windows and OSX: https://github.com/jsteube/princeprocessor/releases princeprocessor-0.22/rules/000077500000000000000000000000001331736521300160135ustar00rootroot00000000000000princeprocessor-0.22/rules/prince_generated.rule000066400000000000000000001623011331736521300222050ustar00rootroot00000000000000## Name: prince.rule ## Version: 1.00 ## Compatibility: hashcat-legacy v0.48+, hashcat v2.00+ ## ## Description: ## ## automatically generated ruleset, optimized rule for use with princeprocessor ## This rule can be used as amplifier in case you're attacking a fast hash : [ [ [ [ [ [ [ [ [ { ] ] { ] } { { [ { { { { { { { { { { { { { { } } } } } } } } } } } } } } } -0 -0 ] -0 { { -0 } -0 +0 +0 } -0 -0 +0 +0 -0 -0 -0 +0 +0 +0 -0 -0 -0 -0 +0 +0 +0 +0 -0 *02 -0 *02 [ -0 *04 +0 *05 -0 *05 D0 +0 *08 -0 -1 } *01 *01 *01 [ *01 } +0 -1 +0 +1 *01 +1 -0 -1 -2 +0 +1 +2 -0 -1 -2 -3 +0 +1 +2 +3 -0 -1 -3 -2 +0 +1 +3 +2 *01 *41 *01 *51 *01 *51 t *01 *53 *01 *53 R6 *01 *65 *01 *65 R7 +0 *18 *01 *83 *01 f *01 L1 *01 L5 *01 R0 *01 R6 *01 R6 *53 *01 R7 *01 R7 *65 s1y s81 scx soi sx5 *01 t *01 t *51 *01 x42 *01 x61 -0 +2 [ *02 { *02 *02 *02 [ *02 *06 -0 -2 -1 -0 *21 +0 +2 +1 -0 -2 -1 -3 *02 *13 +0 +2 +1 +3 *02 *17 s0P -0 -2 -3 -1 +0 +2 +3 +1 *02 +5 *02 *57 sdl *02 +9 *02 *97 *02 D3 *02 k *02 k *13 *02 l *02 L3 *02 R4 s0P s0P s1q scl sdl sdl *02 T6 *02 T7 *02 x21 *02 x24 *02 x42 *02 x63 -0 +3 [ *03 { *03 *03 *03 [ +0 -3 +0 +3 *03 +0 *03 *05 *03 +0 l -0 *31 *03 +1 +0 *31 -0 -3 -1 -2 +0 +3 +1 +2 +0 *32 +0 *32 } -0 -3 -2 -1 +0 +3 +2 +1 *03 *36 *03 *41 *03 *47 -0 *34 C *03 '5 +0 *37 *03 *70 *03 D1 *03 l +0 *03 R3 sbe sjx sqt ssl *03 x34 *03 x43 *04 *04 [ *04 ] *04 { +0 +4 *04 *07 *04 *17 *04 +3 *04 +4 *04 +6 *04 *73 *04 '8 *04 +8 D0 *04 D0 *04 D1 *04 l slk smv son sry sry *04 T0 *04 T6 *04 u *04 x32 -0 -5 [ *05 { *05 *05 *05 [ +0 '5 *05 *06 R4 *05 -1 *05 *12 -0 *52 *05 *26 *05 +3 *05 *30 *05 -5 *05 -5 ] *05 '5 *05 ] -5 +0 *58 *05 c *05 D0 u +0 '5 k *05 K *05 l *05 r *05 R1 *05 R4 *05 R4 *06 saC *05 T1 *05 T6 *05 u D0 *05 x02 *05 x03 *05 x21 *05 x35 *05 x45 -0 +6 *06 +0 '6 +0 +6 *06 *15 -0 *63 -0 *64 *06 '5 *06 '6 *06 +6 *06 *67 *06 *87 *06 D2 *06 D3 sMf *06 l *06 R0 *06 R7 s7A sMf *06 t *06 T4 *06 T6 *06 u *06 x02 *06 x34 *06 x41 -0 -7 -0 '7 -0 +7 *07 +0 '7 *07 -0 *07 +0 *07 *18 *07 *24 *07 *24 T1 *07 *53 x31 *07 c *07 D2 *07 D6 *07 R7 *07 T1 *07 T1 *24 *07 x31 -0 +8 *08 *08 [ *08 *13 +0 *86 *08 D6 *08 T0 -0 '8 x41 *08 x45 [ *09 *09 *09 [ *09 '6 *09 *91 *09 *97 *09 [ l *09 l [ s86 *09 x03 *09 x34 -0 'A *0A *0A [ *0A LB x06 *0B +0 'B *0B x74 -0 c -0 C +0 C -0 C *34 -0 C T0 -0 D1 +0 D2 +0 D3 +0 D3 x25 +0 D4 +0 D5 -0 D7 +0 D8 -0 f +0 f -0 f *56 -0 k -0 K +0 k '5 -0 l +0 l +0 L4 +0 L5 t -0 L7 +0 L7 ss# -0 l x24 -0 r +0 R1 -0 R3 +0 R4 -0 R5 x12 +0 R6 s1q s1y s23 s4k s7S sao sc. sfT sfT spH spm ss# ss# ssW st2 -0 t { -0 t +0 t +0 T2 -0 x12 +0 x12 +0 x12 R8 -0 x13 +0 x13 -0 x23 -0 x24 +0 x24 -0 x24 l -0 x25 +0 x25 +0 x25 D3 -0 x26 -0 x41 +0 x42 -0 x51 -0 x52 +0 x52 sfT -0 x53 +0 x53 +0 x53 x73 +0 x56 +0 x72 +0 x82 -0 x84 +0 x92 +0 xA1 -1 -1 { -1 } [ -1 [ +1 ] -1 { +1 } -1 +1 +1 [ +1 { +1 } *10 { +1 *04 *10 *42 slk +1 *06 *10 -8 *10 c *10 { c *10 c { *10 D3 r *10 l *10 R1 *10 r D3 *10 t *10 t x81 *10 x81 *10 x81 t -1 -1 +1 +1 -1 -1 -1 +1 +1 +1 -1 -1 -1 -1 +1 +1 +1 +1 -1 *12 -1 *13 +1 *14 -1 -2 -1 +2 { *12 *12 *12 } +1 +2 -1 *20 *12 +1 -1 -2 -3 -1 *23 +1 +2 +3 -1 -2 -3 -4 +1 +2 +3 +4 -1 -2 -4 -3 +1 +2 +4 +3 *12 '5 *12 *68 -1 *27 -1 -2 C *12 f *12 f u *12 k *12 K *12 k l ss2 *12 l *12 L5 *12 l k *12 R3 s34 sma snp ss2 ss2 *12 u f *12 x51 ] ] *13 ] *13 ] *13 ] { *13 *13 +1 -3 +1 +3 *13 *04 -1 *31 r -1 -3 -2 +1 +3 +2 -1 -3 -2 -4 +1 +3 +2 +4 *13 *26 -1 -3 -4 -2 *13 *42 +1 +3 +4 +2 *13 *45 R1 *13 *65 *13 c *13 D1 *13 D9 *13 k *13 K x31 *13 R1 *13 R1 *45 s73 sau sc2 svr *13 u *13 x12 *13 x31 *13 x31 K +1 -3 x42 *13 x43 *13 x62 ] *14 } *14 *14 *14 ] *14 } +1 -4 *14 *10 *14 *10 C *14 -2 *14 *20 -1 -4 -2 -3 +1 +4 +2 +3 *14 ] *27 *14 *27 ] -1 *43 -1 -4 -3 -2 +1 +4 +3 +2 *14 *34 *14 c *14 C *14 C *10 *14 R2 *14 R3 svm *14 x02 -1 -5 -1 [ -5 [ *15 { *15 *15 *15 ] *15 } +1 -5 +1 '5 -1 } *50 +1 *50 *15 *10 -1 *52 *15 *23 -1 *52 K } -1 *53 *15 +3 *15 *41 *15 *41 *43 *15 *43 *15 D1 *15 f [ *15 K *15 r snp snp *15 T4 *15 u x01 *15 x01 *15 x01 u } *15 x12 *15 x13 *15 x34 *15 x42 -1 +6 { *16 *16 *16 ] *16 *05 *16 *05 *30 *16 *23 *16 *30 *16 *47 *16 *48 *16 '7 *16 D0 x04 *16 D1 *16 D5 *16 D5 u *16 r snp -1 +6 T5 *16 u D5 *16 x03 *16 x04 D0 *16 x43 -1 '7 { *17 *17 +1 '7 *17 '6 *17 +7 *17 *73 *17 -8 *17 r *17 x06 *17 x12 *17 x15 *17 x42 *17 x51 *18 +1 -8 *18 D7 *18 D8 *18 l *18 x03 *18 x62 *18 x75 *19 -1 *90 -1 *91 +1 *91 *19 x08 -4 *19 x41 -1 'A *1A 'A *1A x03 *1A xA1 +1 'B *1B x01 -1 c +1 c -1 C -1 C -2 srD -1 D0 +1 D4 +1 D4 -6 +1 D7 +1 D8 +1 D9 -1 f +1 f -1 k -1 K -1 K { -1 K *52 ssi -1 l +1 l -1 L0 +1 L2 +1 L7 -1 r -1 R0 +1 R0 +1 R1 -1 r *31 +1 R4 s0Q s9s sbq sel sfr skv skw skx slk slk sly smd srD srg ssi ssi szl -1 t +1 t -1 T2 +1 T2 -1 T5 -1 T5 +6 -1 u -1 x23 +1 x23 +1 x24 -1 x32 +1 x42 -3 +1 x45 +1 x52 +1 x62 +1 x63 -1 x73 +1 x82 +1 x84 +1 x92 -2 -2 { [ -2 [ +2 ] +2 +2 ] *20 { *20 *20 *20 } +2 +0 *20 -0 *20 *03 *20 *14 *20 *14 c *20 +2 +2 *02 scu *20 '4 *20 *43 -2 *05 *20 *50 *20 c *20 c *14 *20 D5 *20 r s29 s4q s52 s9! sri svt syt { *20 u *20 } u *20 u } *20 x23 *20 x32 *20 x41 *20 [ x41 *20 x41 [ *20 x71 *21 -2 *10 *21 *03 *21 *13 *21 *20 *21 *28 *21 -3 *21 *36 *21 +4 *21 +4 l *21 *56 *21 *72 *21 *78 *21 C *21 c x31 *21 D3 *42 *21 l +4 *21 R0 sdE suo *21 u *21 x24 *21 x25 *21 x31 c *21 x41 -2 -2 +2 +2 -2 -2 -2 +2 +2 +2 -2 -2 -2 -2 +2 +2 +2 +2 -2 *23 -2 *26 ] +2 *26 -2 -3 [ *23 *23 *23 } +2 +3 +2 *30 *23 *05 -2 *31 -2 *31 u +2 *32 *23 *31 -2 -3 -4 +2 +3 +4 -2 -3 -4 -5 +2 +3 +4 +5 -2 -3 -5 -4 +2 +3 +5 +4 *23 -6 *23 *86 *23 c *23 C *23 k *23 L4 spe *23 t *23 x03 *23 x42 *23 x51 { *24 } *24 *24 *24 ] +2 '4 *24 -0 *24 *15 *24 +2 -2 -4 -3 +2 +4 +3 *24 *30 -2 -4 -3 -5 +2 +4 +3 +5 *24 *37 *24 *37 c *24 -4 -2 -4 -5 -3 +2 +4 +5 +3 *24 ] *70 *24 *70 ] } *24 *74 *24 c *24 c *37 *24 D0 *24 D2 *24 f *24 K *24 R3 src *24 T1 *24 x03 -2 '5 [ *25 *25 *25 ] +2 +5 *25 *10 *25 *10 *24 *25 *13 *25 *13 c -2 *52 *25 +2 *25 *24 *25 *24 *10 *25 +3 *25 *30 -2 -5 -3 -4 +2 +5 +3 +4 [ +2 *54 *25 *40 *25 *42 R5 -2 -5 -4 -3 +2 +5 +4 +3 *25 '5 *25 +5 *25 *54 *25 '7 +2 *57 t *25 -7 x03 *25 *84 '7 *25 c *25 c *13 *25 D1 *25 D4 *25 l x32 *25 R5 *25 R5 *42 ssv *25 T0 *25 T5 *25 x13 *25 x32 *25 x32 l -2 -6 *26 *26 ] +2 *62 *26 ] *37 *26 *37 ] *26 *48 *26 '5 *26 D3 *26 D6 *26 r *26 T6 x15 *26 u *26 x62 -2 '7 -2 +7 { *27 *27 *27 ] -2 *75 +2 *75 -2 *75 c *27 *65 *27 *74 *27 *76 *27 D2 *27 k -2 +7 l *27 x01 *27 x12 *27 x15 f *27 x52 -2 -8 *28 *28 '7 *28 c *28 T1 *28 x05 *29 s4w *29 x03 *29 x04 *29 x13 s4w *29 x14 -2 'A *2B DA *2B x14 -2 c } -2 c +2 c -2 c *75 -2 D0 -2 D0 *54 -2 D1 +2 D1 +2 D3 +2 D5 +2 D5 *79 -2 f -2 f [ +2 f } -2 k -2 l +2 l -2 L0 -2 L1 +2 L1 -2 L2 +2 L2 -2 L3 +2 L5 +2 L6 u -2 l +7 -2 r -2 R0 -2 R1 -2 R4 -2 R6 s7i scu scu sCy sdy sgb sGq si5 sui swc swc +2 t -2 T4 +2 t *57 +2 T6 -2 u +2 u -2 u *31 +2 u L6 +2 x02 -2 x31 +2 x41 -2 x52 -2 x53 -2 x54 swc -3 -3 { [ -3 ] -3 { -3 } +3 +3 +3 { -3 -0 } *30 *30 *30 [ *30 { *30 -0 *30 *02 *30 -2 *30 +3 *30 { *35 *30 -4 *30 *43 *30 *64 *30 -9 *30 c *30 C } *30 D0 *30 D3 *30 f *30 [ f *30 R5 *30 R6 sdD *30 T1 *30 u *30 { u *30 u { *30 x23 *30 x26 *30 x32 *30 x41 *30 { x53 *30 x53 { -3 -1 -3 +1 [ *31 +3 -1 *31 -0 ] *31 ] -0 *31 +2 +3 *12 *31 *20 *31 *34 { *31 *51 -3 *16 *31 *74 *31 '8 *31 *91 *31 'A [ *31 c *31 D2 *31 D4 *31 f *31 k t *31 l *31 r sg' sns sns *31 t *31 T3 *31 T6 sns *31 t k *31 x02 *31 x24 *31 x32 -3 +2 { *32 *32 *32 { +3 -2 -3 *20 *32 *04 *32 *16 *43 *32 -2 *32 +2 *32 *25 +3 *23 *32 *34 +3 *23 k -3 *24 *32 *43 *16 *32 *45 *32 +5 *32 *67 *32 -8 *32 '9 *32 D0 *32 D6 *32 D7 *32 l *32 r *32 R5 s9* *32 T0 *32 T7 *32 x34 *32 x74 -3 -3 +3 +3 sr1 -3 -3 -3 +3 +3 +3 -3 -3 -3 -3 +3 +3 +3 +3 +3 *34 r -3 -4 -3 +4 { *34 *34 *34 } +3 +4 *34 +0 +3 *42 -3 *43 *34 +3 -3 -4 -5 -3 *45 *34 +5 +3 +4 +5 -3 -4 -5 -6 +3 +4 +5 +6 *34 *62 -3 -4 -6 -5 +3 +4 +6 +5 *34 *74 *34 c sd> *34 D7 *34 K } *34 l *34 r *34 r u sd> sdg sm_ stc *34 u r *34 x13 stc *34 x51 *34 x52 [ { *35 { *35 *35 +3 +5 *35 *04 *35 +1 *35 *24 *35 *31 -3 -5 -4 *35 +4 +3 +5 +4 *35 *41 -3 -5 -4 -6 +3 +5 +4 +6 } *35 '5 *35 +5 } *35 *50 *35 *50 +5 *35 *54 *35 *56 -3 -5 -6 -4 +3 +5 +6 +4 -3 *57 *35 D2 { *35 K *35 L2 *35 L3 *35 r *35 R4 *35 t *35 x12 *35 x23 *35 x43 -3 -6 -3 '6 -3 +6 *36 *36 [ *36 ] *36 { +3 -6 +3 +6 *36 -0 +5 *36 [ *05 *36 *13 *36 *13 x62 *36 *17 *36 *19 +3 *62 *36 *26 -3 *64 *36 +4 -3 -6 -4 -5 +3 +6 +4 +5 -3 *65 *36 *50 *36 +5 -0 -3 -6 -5 -4 +3 +6 +5 +4 *36 '6 *36 c *36 [ D3 *36 D3 [ *36 D3 R0 *36 D5 *36 R0 D3 *36 x32 ] *36 x43 *36 x62 *36 x62 *13 { *37 *37 *37 ] +3 '7 *37 *05 *37 *14 *37 *32 *37 *87 *37 c -3 '7 u *37 x12 *37 x13 *37 x25 -3 '8 *38 -3 *82 *38 'A *38 D0 *38 x23 *38 x26 *39 +3 '9 *39 +5 *39 +8 *39 'A *39 D3 -5 *39 x04 *39 x05 *39 x32 *3A '8 *3A x05 *3A x24 *3B '8 +3 c -3 D2 -3 D2 u +3 D5 -3 D6 +3 D6 -3 D7 -3 f x12 -3 k +3 k +3 K +3 { K +3 k *23 -3 l -3 L2 -3 r +3 r +3 r *34 +3 R5 sc6 s0b s1d s2+ s27 s27 sc6 sCg sfk sl0 smu snz soe spj sr1 sr1 ssp ssv sTB stg suf +3 t +3 T5 -3 T6 s27 -3 u } +3 u +3 u -3 u '7 -3 u D2 -3 x02 +3 x12 -3 x41 -3 x51 -3 x52 +3 x53 +3 x71 -3 x72 -4 -4 } ] -4 ] -4 } } -4 } +4 } +4 } +4 +4 [ +4 ] +4 { +4 } -4 -0 } *40 +4 +0 *40 *02 *40 *06 *40 *12 *40 *15 -4 *02 +4 *02 *40 *34 [ *40 *51 *40 *54 *40 *57 -4 -0 '7 *40 '9 *40 *96 *40 c *40 D3 *40 D4 *40 D6 x41 [ *40 k *40 t *40 u x34 *40 x24 *40 x34 *40 x34 u *40 x41 D6 *40 x42 *40 x42 x61 *40 x45 -4 -1 -4 -1 ] -4 ] -1 [ *41 { *41 *41 *41 ] *41 { *41 } } +4 +1 *41 -0 *41 *16 *41 *32 -4 *14 *41 *47 *41 *86 *41 ] c *41 c ] *41 D1 *41 f *41 k { *41 u *41 x21 *41 x32 *41 x34 *41 x37 *41 x47 -4 -2 -4 +2 *42 *42 } *42 *21 +4 *23 *42 *41 +4 *25 -4 *26 *42 +6 *42 *64 *42 r *42 R0 *42 R5 *42 R6 skL [ *42 t *42 t *42 T0 *42 x46 -4 +3 *43 *43 [ { *43 ] *43 { *43 { [ *43 -0 +4 *30 *43 *01 } *43 *12 *43 *16 *43 +2 *43 ] *20 *43 *20 ] *43 *35 K -4 *34 *43 *48 *43 -5 *43 *52 *43 -5 t *43 -6 *43 D2 *43 k *43 K *43 K *35 *43 R3 s25 skC suo *43 t *43 { t *43 t { *43 t -5 *43 T6 *43 x53 -4 -4 +4 +4 -4 *40 +4 *40 -4 *42 -4 *42 x42 -4 -4 -4 +4 +4 +4 -4 -4 -4 -4 +4 +4 +4 +4 -4 *45 -4 -5 *45 *45 { *45 } +4 +5 *45 *01 *45 *03 *45 -2 *45 { *25 *45 *35 -4 -5 -6 +4 +5 +6 *45 *62 -4 -5 -6 -7 +4 +5 +6 +7 *45 -7 *45 *71 -4 -5 -7 -6 +4 +5 +7 +6 *45 D0 *45 r *45 R1 *45 R4 s2_ sl8 so9 *45 T1 *45 u *45 x04 *45 x32 *45 } x52 *45 x52 } -4 '6 *46 *46 [ *46 ] *46 { +4 '6 *46 *16 *46 *23 *46 *25 *46 -4 *46 +4 +4 *64 -4 -6 -5 +4 +6 +5 -4 -6 -5 -7 +4 +6 +5 +7 *46 '6 *46 '6 } *46 } '6 *46 *60 *46 -7 -4 -6 -7 -5 +4 +6 +7 +5 *46 D1 *46 D4 *46 l *46 L7 s6b *46 T0 *46 T5 *46 ] x24 *46 x24 ] *47 -4 '7 -0 *47 *34 *47 *36 -4 -7 -5 -6 +4 +7 +5 +6 *47 *58 -4 -7 -6 -5 *47 *65 +4 +7 +6 +5 *47 *67 *47 *75 *47 *81 *47 -9 *47 C *47 D4 *47 T4 -4 -8 { *48 } *48 *48 *48 [ *48 *08 *48 +5 '6 +4 *86 *48 '6 +5 *48 *86 *48 C x43 *48 D1 *48 D1 t *48 l *48 T7 *48 t D1 *48 x43 *48 x43 C *49 +4 '9 *49 '9 *49 L4 swh *49 x14 *49 x24 *49 x53 *4A *4B x16 *4B x63 -4 c { -4 c +4 c +4 C -4 D2 +4 D3 -4 D5 +4 D5 -4 D5 L6 -4 D6 -4 D7 '4 f -4 k -4 l +4 l -4 L4 +4 L5 -4 L5 +5 +4 L7 +4 r s0M s2m s7 se. seg sK9 so5 srB s.z -4 t +4 t -4 T4 +4 T5 -4 u [ -4 u +4 u -4 x03 +4 x03 -4 x12 -4 x31 +4 x54 +4 x62 -4 x63 +4 x74 -4 x75 -4 x82 +4 x84 -5 -5 [ -5 { -5 } '5 [ -5 } ] -5 +5 +5 ] +5 { +5 } } *50 *50 { +5 -0 *50 +0 *50 *02 *50 +2 *50 +3 { *50 *31 *50 -4 *50 *41 *50 +5 *50 c K *50 K c *50 L5 } *50 r *50 R5 *50 t *50 u *50 x23 *50 x26 *50 x32 *50 x43 *50 x51 *50 x53 '5 -1 [ *51 *51 *51 [ *51 { *51 -0 *51 +1 *51 *14 *51 ] *25 *51 *25 ] -5 *13 '5 *13 *51 -3 *51 *31 *51 *37 '5 *14 [ *51 *40 '5 *14 *20 *51 *52 *51 *54 -5 *16 *51 { +6 { *51 C *51 C *51 D1 *12 *51 D2 *51 D5 *51 K *51 K R6 -5 +1 L0 *51 r *51 R1 -5 +1 R5 *51 R6 *51 R6 K *51 r K *51 T6 *51 x32 *51 x32 *30 *51 x35 -5 +2 *52 [ *52 ] +5 [ -2 '5 *20 *52 +0 '5 *20 *14 *52 +1 *52 *24 -5 *24 -5 *25 *52 *53 u -5 *25 l *52 '6 *52 +6 *52 *70 *52 ] c *52 c ] s3v *52 [ k *52 L0 s3v se0 shl srd srd *52 u *52 u *53 *52 x04 *52 x12 *52 x61 -5 +3 '5 -3 '5 +3 *53 *53 [ *53 ] *53 +0 } *53 -1 *53 *12 *53 *12 L5 *53 *20 *53 -4 *53 *46 *53 '5 +5 *35 *53 *50 saj *53 -7 *53 +8 *53 C *53 f *53 L5 *53 L5 *12 *53 L7 *53 L7 u -5 +3 R3 *53 R5 *53 R6 s5s saj sbm sbn smb sun sur *53 T4 *53 T5 *53 u *53 x13 *53 x31 *53 x41 *53 x52 *53 x52 T5 -5 +4 '5 +4 { *54 *54 *54 } +5 -4 *54 +0 [ *54 +2 -5 *43 *54 *35 t *54 -4 -5 *46 *54 +7 *54 *71 '5 *54 -8 *54 *86 *54 c *54 C *54 D2 *54 D7 *54 l *54 R3 sBN svN syn *54 t *54 t *35 sBN *54 x12 *54 x23 *54 x64 -5 -5 +5 +5 -5 *50 -5 *50 K +5 *54 -5 -5 -5 +5 +5 +5 -5 -5 -5 -5 +5 +5 +5 +5 -5 -6 -5 '6 ] { *56 *56 +5 -6 +5 '6 +5 +6 +5 *60 *56 *13 u -5 *62 '6 *56 *30 *56 -4 *56 +4 *56 +5 +5 *65 *56 -6 *56 } -6 -5 -6 -7 *56 '7 +5 +6 +7 *56 *76 -5 -6 -7 -8 +5 +6 +7 +8 -5 *68 *56 *81 x03 *56 *85 -5 -6 -8 -7 +5 +6 +8 +7 *56 'A *56 D0 *56 l *56 L0 L5 *56 L5 L0 *56 r *56 R4 s40 se2 sgo *56 u *56 u *13 *56 x03 *57 *57 ] *57 } +5 -7 +5 +7 *57 *06 *57 *25 *57 ] *36 *57 *36 ] -5 *74 *57 *46 -5 *75 -5 *75 *56 -5 -7 -6 +5 +7 +6 -5 -7 -6 -8 +5 +7 +6 +8 +5 *78 -5 -7 -8 -6 +5 +7 +8 +6 -5 *79 +5 *79 *57 c *57 c D6 *57 D3 *57 D6 *57 D6 c *57 D8 sdl *57 T5 D3 *57 x15 *57 x32 -5 +8 *58 *58 ] { *58 { ] +5 '8 -5 -8 -6 -7 +5 +8 +6 +7 -5 -8 -7 -6 *58 *76 +5 +8 +7 +6 *58 '8 *58 D4 *58 D5 s13 *58 D7 *58 l s13 *58 x91 -5 -9 -5 '9 *59 +5 '9 *59 D2 *59 x25 *59 x42 *5A *5A x43 *5A x73 -5 c +5 c -5 C '5 C -5 D1 +5 D1 -5 D2 -5 D3 sw7 -5 D4 +5 D4 -5 D6 +5 D6 '5 f +5 f -5 k +5 k -5 K -5 K *50 -5 l '5 l +5 l +5 L0 -5 L0 +1 -5 l *25 +5 L6 -5 r [ +5 r -5 R3 +3 -5 R5 +1 s1i s1N s36 s6a s6b s6v saj sb- sgm shH sjy sL7 slr smj sro suV sw7 -5 t '5 t +5 t -5 T0 -5 T2 -5 T3 +5 T3 +5 T4 +5 T7 '5 u +5 x01 -5 x02 -5 x03 +5 x04 +5 x62 -5 x63 +5 x63 -5 x81 -6 -6 [ -6 ] -6 } '6 { +6 } -6 } '6 +6 +6 [ +6 { -6 +0 ] *60 *60 *01 *60 *02 *60 *07 *60 -1 +6 *02 '6 *03 *60 -5 *60 *54 *60 -8 *60 c *60 C *60 D0 *60 D1 *60 } D4 *60 D4 } *60 D6 *60 k T5 *60 T5 k *60 u x34 *60 x03 *60 x34 u *60 x35 -6 -0 x51 *60 x51 *60 x54 -6 -1 '6 -1 '6 +1 } *61 +6 +1 *61 -1 *61 *21 *61 -4 +6 *14 *61 '5 *61 D6 *61 T0 *61 T2 *61 x03 k *61 x12 *61 x21 *61 x21 *13 *61 x52 *61 x54 *61 x61 +6 *62 } -6 *20 *62 -0 '6 *21 '6 *21 u *62 -2 *62 +2 '6 *23 *62 *46 -6 *24 D0 *62 *52 *62 *73 *62 D4 x43 *62 l *62 x01 r *62 x02 *62 x03 *62 x32 *62 x35 *62 x38 *62 x43 D4 *62 x45 *62 x46 *62 x51 -6 -3 '6 +3 } *63 *63 } *63 +1 +6 *32 +6 *32 l *63 '5 *63 +7 *63 D3 *63 D7 *63 K *63 L6 slp *63 T2 *63 u *63 x53 '6 +4 *64 +6 +4 *64 *20 +6 *43 *64 *34 *64 '5 *64 *65 [ '6 +4 c *64 D0 +1 *64 K *64 R3 *64 x53 *64 x61 *64 x72 *64 x73 '6 +5 { *65 *65 *65 [ { *65 { [ +6 -5 '6 *51 *65 *24 *65 +3 *65 *35 '6 *54 *65 -5 *65 *51 +6 *57 *65 *73 *65 *8A *65 '9 *65 D3 *65 R3 *65 R7 *65 x42 *65 x65 -6 -6 +6 +6 +6 *60 -6 *63 +6 *63 -6 -6 -6 +6 +6 +6 -6 -6 -6 -6 +6 +6 +6 +6 -6 *67 -6 -7 [ *67 *67 +6 -7 +6 +7 -6 *70 +6 *73 *67 -5 *67 *56 scu -6 -7 -8 +6 +7 +8 *67 *86 -6 -7 -8 -9 +6 +7 +8 +9 -6 -7 -9 -8 +6 +7 +9 +8 *67 c *67 D9 *67 k *67 K *67 r *67 R4 s- s1/ scu *67 T3 -6 -8 *68 *68 *20 +6 *83 D3 -6 *85 *68 -6 -6 -8 -7 +6 +8 +7 -6 -8 -7 -9 +6 +8 +7 +9 *68 *85 -6 -8 -9 -7 +6 +8 +9 +7 *68 D6 *68 x42 *68 { x52 *68 x52 { -6 -9 *69 +6 '9 -6 -9 -7 -8 +6 +9 +7 +8 *69 '8 -6 -9 -8 -7 +6 +9 +8 +7 *69 'A *69 x92 *6A +6 'A *6A D7 s70 *6A x34 s70 *6A x37 *6A x94 *6B x16 *6B x84 -6 c '6 c +6 c -6 C '6 c +4 -6 D0 '6 D1 '6 D2 +6 D2 +6 D3 -6 D4 +6 D4 +6 D7 +6 D8 '6 f x45 +6 k -6 l '6 l +6 l -6 L0 '6 L0 '6 L1 s61 -6 L2 '6 L2 -6 L2 u +6 l *32 -6 L5 '6 L5 -6 L6 '6 R2 +6 R2 sob -6 R4 '6 R5 +6 R5 -6 R6 -6 R6 u s0g s3* s57 s61 s87 sfs shb sjv skP slg slK snG sob sqg +6 t -6 T0 '6 T1 -6 T1 x51 -6 T2 -6 T7 +6 T7 -6 u '6 u +6 u '6 u *21 -6 u L2 +6 x02 -6 x03 -6 x04 +6 x12 -6 x13 +6 [ x21 +6 x21 [ -6 x23 -6 x31 +6 x31 +6 x32 +6 x42 -6 x51 +6 x51 -6 x51 -0 -6 x51 T1 -6 x72 +6 x73 -6 ] x74 -6 x74 ] +6 x74 -6 x82 -6 x84 -7 -7 [ -7 } '7 [ '7 } [ +7 { -7 { +7 } '7 +7 +7 [ +7 } [ *70 *70 *70 ] +7 +0 *70 *05 +7 +0 *13 '7 +0 +4 *70 *41 x52 *70 '5 -7 *06 -7 *06 u *70 +9 *70 L0 *70 L0 T1 *70 t *70 T1 L0 *70 x01 *70 x52 *70 x52 *41 *70 x53 *70 x64 *70 x72 *71 [ +7 -1 *71 *29 +7 *13 +0 '7 ] *14 '7 *14 ] *71 '5 *71 *62 *71 -7 *71 '7 *71 '9 *71 c *71 D2 r *71 D6 *71 l *71 x02 *71 x03 *71 x04 *71 x13 *71 x35 } [ *72 *72 *72 -2 *72 +3 *72 -4 *72 '6 *72 D7 s32 *72 x03 *72 x23 *72 x53 *72 x73 -7 -3 '7 -3 *73 *73 [ '7 *30 *73 *02 '7 *32 *73 *72 *73 *72 C *73 C *73 C *72 *73 D1 *73 L5 *73 r *73 x21 *73 x31 *73 x62 *73 x74 '7 -4 *74 '7 +4 +0 '7 [ *41 -7 *43 *74 -3 *74 +4 *74 +5 '7 *46 *74 c *74 D1 *74 k *74 L5 s6a sds *74 u *74 u x72 *74 x31 *74 x34 *74 x54 *74 x56 *74 x64 *74 x65 *74 x72 *74 x72 u '7 -5 '7 +5 *75 *75 [ *75 { +7 -5 +7 *56 [ +7 *57 *75 *76 u +7 *59 '7 -5 C *75 D1 } *75 D3 *75 D4 *75 D5 *75 D6 sGw *75 t *75 T5 *75 u *75 u *76 sGw '7 -6 '7 +6 *76 *76 ] *76 } +7 -6 *76 *31 *76 *34 *76 *36 *76 *47 -7 *65 *76 +5 *76 +6 *76 +6 x42 *76 +7 -7 *68 *76 '8 *76 +8 *76 -9 *76 'B *76 l s17 s51 scv sti sti *76 x21 *76 x41 *76 x42 *76 x52 *76 x74 -7 -7 +7 +7 -7 *70 -7 *73 { +7 *75 -7 *76 -7 -7 -7 +7 +7 +7 -7 -7 -7 -7 +7 +7 +7 +7 -7 -8 *78 +7 -8 +7 +8 *78 *31 *78 -6 *78 +6 *78 *62 -7 *87 -7 -8 -9 *78 '9 +7 +8 +9 *78 -A s71 *78 T3 *78 x31 +7 -8 x31 *78 x53 *78 x62 -7 -9 -7 +9 *79 +7 '9 -7 -9 -8 *79 -8 +7 *98 +7 +9 +8 *79 -9 *79 *95 *79 'A *79 x81 -7 'A *7A 'A *7A x53 *7A x62 *7A x92 *7B x64 -7 c '7 c +7 c '7 C '7 C -5 '7 c x01 '7 D1 +7 D1 +7 D2 +7 D2 x32 '7 D3 -7 D4 '7 D4 -7 D6 -7 D8 '7 f -7 l '7 l +7 l +7 L3 sul +7 r +7 r [ -7 R2 +7 R3 '7 R5 +7 R5 s0s +7 R6 s0s s1- s6/ s7r sat saZ scu sdr sfb sfn skD srv sul sul -7 t '7 T1 +7 T2 '7 T3 -7 T4 +7 T4 [ +7 T8 -7 u '7 u +7 u -7 u *06 '7 x01 '7 x01 c -7 x03 +7 x12 +7 x24 +7 x31 +7 x32 D2 +7 x41 +7 x43 '7 x51 +7 x82 -7 x94 +7 xA2 -8 -8 [ '8 '8 [ [ -8 { -8 +8 +8 } -8 -0 '8 +0 } } *80 '8 *02 *80 *38 *80 '6 *80 D3 *80 l x45 *80 x04 *80 x31 *80 x36 *80 x45 l '8 *12 *81 '7 *81 '7 t *81 '8 *81 +8 *81 t '7 -8 +2 '8 -2 +8 -2 *82 '6 *82 'A *82 l *82 T5 +8 -2 u *82 x06 *82 x45 *82 x72 *82 x81 -8 -3 '8 +3 [ *83 *83 '8 *32 *83 +3 *83 *47 *83 -7 *83 D5 s2+ *83 x04 *83 x54 *83 x64 *83 x64 -7 *83 x81 -8 +4 *84 '6 *84 '7 *84 D8 *84 u *84 x23 *84 x53 '8 -5 *85 *85 +1 D8 -8 *53 *85 +5 '8 *56 *85 '6 *85 *63 -8 *57 *85 '7 *85 D8 *85 D8 +1 *85 x23 *85 x42 -8 +6 '8 -6 '8 +6 *86 +8 -6 +8 +6 *86 *50 *86 +7 *86 *70 *86 -8 *86 '8 *86 *95 +8 +6 C *86 D3 *86 R0 sr5 *86 x14 *86 x34 *86 x41 *87 *87 { +8 -7 '8 *70 +8 *70 *87 *36 '8 *74 -8 *76 *87 +8 +8 *78 -8 *7B x62 *87 c s81 sti *87 { t *87 t { *87 t x26 *87 x26 t -8 -8 +8 +8 -8 -8 -8 +8 +8 +8 -8 -8 -8 -8 +8 +8 +8 +8 -8 *8A -8 -9 -8 +9 *89 *89 [ *89 } +8 -9 +8 '9 +8 +9 *89 -7 *89 +8 +8 *9A *89 D5 *89 x63 x04 *8A +8 +A *8A D8 *8A t *8A x54 -8 *BA ] *8B x63 *8B x64 -8 c '8 c +8 c +8 C +6 -8 c x12 -8 c x25 +8 D0 +8 D4 '8 D4 +6 -8 D6 -8 D7 -8 DA '8 K -8 l -8 [ l -8 l [ +8 l '8 L3 '8 [ L6 '8 R2 +8 R6 -8 R7 +8 R7 siz sjs spi -8 t '8 t +8 T2 -8 T4 +8 T6 '8 T7 [ '8 T7 '8 u +8 u +8 u -2 -8 x04 -8 x12 -8 x12 c -8 x16 +8 x17 +8 x21 -8 x24 -8 x25 -8 x25 c +8 x26 +8 x42 '8 x51 +8 x52 '8 x61 -8 x62 -8 x91 -9 -9 } '9 '9 [ [ +9 { +9 } -9 } } '9 +9 +9 [ -9 -0 -9 +0 '9 +0 +9 +0 -9 *01 '9 *08 *90 L0 *90 x26 } *91 *91 *91 *37 *91 R8 *91 x43 '9 -2 '9 +2 *92 '9 *92 x46 *92 x56 '9 -3 *93 *43 *93 '9 *93 c *93 x21 -9 +3 x71 -9 -4 '9 -4 *94 '8 *94 u *94 x34 *94 x61 *94 x73 *95 *27 '9 *53 -9 *56 *95 *87 *95 D8 *95 D8 u *95 u D8 '9 -6 *96 +9 +6 *96 D7 *96 x02 *96 x15 *96 x52 *97 +9 +7 *97 *21 *97 *32 x34 '9 *76 *97 c *97 D1 syi *97 u *97 x34 *97 x36 *98 +0 *98 +1 '9 *83 *98 *32 D9 '9 *85 *98 *85 *98 '9 *98 +9 *98 D9 *98 D9 *32 *98 x71 -9 -9 +9 +9 -9 *98 -9 -9 -9 +9 +9 +9 -9 -9 -9 -9 +9 +9 +9 +9 *9A +9 'A *9A *89 s1c *9A x73 *9B *68 *9B x62 +9 c -9 D0 +9 D0 +6 -9 D1 '9 D2 +9 D3 '9 D4 +9 D5 -9 D7 +9 D7 +9 D8 -9 l '9 l +9 l -9 L9 '9 r +9 R1 -9 R8 '9 R8 s09 s25 s91 s9e sah se2 sfg [ -9 T0 -9 T2 '9 T2 '9 T5 '9 T8 -9 t x02 -9 u '9 u +9 u -9 u x24 -9 x02 t +9 x15 +9 x23 -9 x24 -9 x24 u -9 x25 +9 x34 -9 x41 '9 x43 +9 x45 -9 x53 '9 x61 -9 x71 +3 +9 x72 -9 xA2 -A [ -A [ 'A } 'A +A *A0 { *A0 *5A x46 *A0 x56 'A +1 *A1 D1 *A1 RA *A1 x16 *A1 x83 'A +2 *A2 *A2 '8 'A +3 *A3 '7 *A3 x75 *A3 x93 *A4 -4 'A *A4 '9 *A4 'A -4 *A4 x86 *A5 '8 *A5 *B7 '8 *A5 x76 *A6 '7 *A6 *A9 *A6 x26 *A6 x42 'A +7 *A7 *A7 [ *A7 '8 *A8 [ +A *8A *A8 l s0x *A8 x35 -A +9 *A9 +A *9A s05 *A9 x52 -A *A8 *AB 'A c 'A C 'A D1 'A D3 +A D4 'A D7 +A DB 'A l 'A L1 -A LA 'A R9 +A R9 s97 +A t 'A T5 'A T8 -A x01 -A x35 'A x41 'A x42 +A x45 'A x52 +A x53 'A x61 +A x62 'A x62 +6 +A x82 +A x91 -B +B [ *B0 '8 *B1 x03 *B1 x45 'B *23 *B2 '7 *B2 '8 *B5 '8 *B5 xA1 *B7 '8 *B8 'A *B8 *A9 -B -9 *B9 'B *97 *B9 'A +B *9A s29 *B9 x65 -B -A -B +A 'B +A *BA *BA c *BA D9 *BA x02 *BA x83 'B D3 'B D4 -B D7 'B k -B l 'B l +B l 'B r 'B [ R1 soa +B x02 +B x62 'B x71 'B x72 +B x73 +B x92 c [ [ c [ [ [ c [ [ [ [ c ] c ] ] c ] c ] { c { { c { { { c { { { { c { { { c { { { c { { { c { { { c { { c { { { c { { { } c } } c } } } c } } } } c } } } c } } } c } } } c } } } c } } c } } } c } } } c { c } C [ C { C { [ C { C [ C [ C } c +0 c *05 c +0 *52 c *05 D7 C -1 C +1 c *14 K c *16 } c -2 c -2 C -2 C +2 c *21 c *24 c *24 T0 c *25 x13 c -3 [ c *31 c -3 '6 { c -4 C -4 c *40 t c *46 c -4 T4 c +4 T5 C -5 C +5 { C *51 C *52 c *52 +0 c *58 C [ +6 C +6 C *61 c '6 -3 c *65 c *68 C -7 C +7 c *70 C *71 c +7 L3 C '8 c *83 c *8A c -9 c '9 C -9 c '9 T3 C +9 x34 c +A c -B c +B T6 C D0 c D0 D8 s5P c D1 C D3 c D4 C D4 c D5 C D5 ] c D6 c D6 C D6 c D7 c D7 *05 c DA c f C f c K c [ K c K [ C k c K *14 c k *16 c L0 c L3 +7 c L5 C L5 c r C r C R0 C R1 c R2 [ c R3 c R3 C R5 c R6 c R7 s0# s04 s0I s1, s10 s2* s29 s2I s2m s49 s4b s4K s5P s62 s8! s87 s8M sa@ sa4 sa4 sa@ se3 se3 sa@ sa@ si1 si1 si! sa@ sa@ so0 so0 so0 sa@ sa@ sa@ saw sb1 sb8 sd1 se3 se3 sa@ sa@ se3 se3 si1 si1 si! se3 se3 so0 so0 so0 se3 se3 se3 se3 se3 se3 se3 se3 seu sex sg5 sg9 sgV si! si1 si1 sa@ sa@ si1 se3 se3 si1 so0 so0 si1 si1 si1 si1 si1 si1 si1 si2 si! sa@ si! se3 si! si! so0 so0 si! si! si! si! si! si! siu siU siZ sJw sl1 sl1 sl1 sl1 sl1 sl1 sl1 sl1 sl1 sl1 sl1 slt slz sMz snj so* so0 so0 so0 sa@ sa@ sa@ so0 se3 se3 se3 so0 so0 si1 si1 si! si! so0 so0 so0 so0 so0 so0 so0 so0 spv ss3 ss4 ss5 ss5 ss- ssN ssO st7 stC sti su[ su4 svz sy1 sy2 c T0 *24 c T1 C T1 c T1 f se3 si! si1 sl1 so0 c T1 T2 c T1 T2 T3 c T1 T2 T4 T5 c T1 T2 T5 T4 c T1 T3 c T1 T3 T2 c T1 T4 T2 T5 c T1 T4 T5 T2 c T1 T5 T2 T4 c T1 T5 T4 T2 c T2 c T2 f se3 si! si1 sl1 so0 c T2 T1 c T2 T1 T3 c T2 T1 T4 T5 c T2 T1 T5 T4 c T2 T3 c T2 T3 T1 c T2 T4 c T2 T4 T1 T5 c T2 T4 T5 c T2 T4 T5 T1 c T2 T4 T6 c T2 T4 T6 T8 c T2 T4 T8 T6 c T2 T5 T1 T4 c T2 T5 T4 c T2 T5 T4 T1 c T2 T6 c T2 T6 T4 c T2 T6 T4 T8 c T2 T6 T8 T4 c T2 T8 T4 T6 c T2 T8 T6 T4 C T3 c T3 '9 se3 si! si1 sJw so0 C T3 t c T3 T1 c T3 T1 T2 c T3 T2 c T3 T2 T1 C T3 x42 c T4 C T4 c t *40 c T4 -4 sa@ se3 si! si1 sl1 so0 c T4 T1 T2 T5 c T4 T1 T5 T2 c T4 T2 c T4 T2 T1 T5 c T4 T2 T5 c T4 T2 T5 T1 c T4 T2 T6 c T4 T2 T6 T8 c T4 T2 T8 T6 c T4 T5 T1 T2 c T4 T5 T2 c T4 T5 T2 T1 c T4 T6 T2 c T4 T6 T2 T8 c T4 T6 T8 T2 c T4 T8 T2 T6 c T4 T8 T6 T2 c T5 C T5 c T5 +4 sa@ se3 si! si1 sl1 so0 c T5 T1 T2 T4 c T5 T1 T4 T2 c T5 T2 T1 T4 c T5 T2 T4 c T5 T2 T4 T1 c T5 T4 T1 T2 c T5 T4 T2 c T5 T4 T2 T1 ] c T6 c T6 c T6 +B sa@ se3 si! si1 sl1 so0 c T6 T2 c T6 T2 T4 c T6 T2 T4 T8 c T6 T2 T8 T4 c T6 T4 T2 c T6 T4 T2 T8 c T6 T4 T8 T2 c T6 T8 T2 T4 c T6 T8 T4 T2 C T7 se3 si1 sl1 so0 c T8 c T8 T2 T4 T6 c T8 T2 T6 T4 c T8 T4 T2 T6 c T8 T4 T6 T2 c T8 T6 T2 T4 c T8 T6 T4 T2 c T9 C T9 c TA C TA c TB C t T3 c x01 C x01 C x01 -5 c x02 C x02 c x02 L1 c x03 c x12 C x12 C x14 C x15 { c x21 c x23 c x24 c x25 c x26 C x31 [ c x32 C x32 c x35 c x36 C x42 C x42 T3 c x43 C x43 s87 c x52 C x52 c x53 C x53 c x54 c x64 c x65 C x73 [ c x74 c x84 c x92 C x92 c xA2 D0 D0 } D0 *01 } D0 +1 D0 *14 D0 *30 D0 *30 t D0 } *54 D0 'B D0 c D0 c x91 D0 D1 D0 D1 k D0 D8 D0 k t D0 l D0 L4 D1 D0 R2 t D0 R4 s30 s4C s7b s9A se6 seh sfw skv smd spe D0 t *30 D0 t k ] D0 u D0 x13 D0 x14 D0 x43 D0 x71 D0 x91 D0 x91 c D1 [ D1 [ { D1 [ D1 { D1 +0 D1 *12 D1 *13 D1 *21 D1 -3 D1 +3 D1 -3 '6 D1 +5 D1 '6 -3 D1 '8 D1 'A D1 C D1 D2 D1 D4 D1 D5 ] D1 f D1 f D1 k D1 K D1 l D1 L0 D1 L1 D1 L3 D1 r { D1 R0 sD4 sds si6 sih sn_ { D1 t D1 t D1 T1 D1 T2 D1 T3 D1 u sD4 D1 x35 D1 x72 D1 x91 D2 D2 { D2 } D2 *02 D2 -1 D2 -1 x34 D2 +3 D2 *46 D2 -5 D2 *53 D2 -6 D2 '6 D2 '7 D2 'A D2 c D2 C D2 c L3 D2 D3 D2 l D2 L2 D2 L3 D2 L3 c D2 r D2 R1 D2 R4 D2 R6 s1` s3- sdy sdy sgc sgy sm1 snq soV suq D2 t D2 T0 D2 T3 D2 T4 D2 T5 D2 T6 sdy D2 u D2 x34 -1 D2 x41 D2 x45 D2 x53 D2 x73 D3 { D3 D3 [ D3 ] D3 } D3 -1 D3 +1 D3 -1 c D3 *34 D3 *42 D3 -5 D3 *51 D3 *56 D3 *56 k D3 -6 D3 +6 D3 +6 } D3 '7 D3 -8 D3 +A x64 D3 'B D3 c D3 c -1 sAl D3 C x32 D3 D8 D3 k D3 k *56 D3 l [ D3 R0 ] D3 R0 D3 R0 D3 R2 D3 R3 s3 s85 s9D sao sbz sck sea slW D3 t D3 T3 D3 T5 D3 x32 D3 x32 C D3 x47 D3 x54 D3 x65 D3 x71 D3 x72 D3 x75 D3 xA1 D4 D3 xA1 x54 D4 [ D4 } D4 D4 { D4 } D4 *14 D4 *15 D4 *21 T4 D4 *25 D4 +3 D4 '5 D4 +6 D4 *62 D4 -7 D4 '7 D4 *85 D4 *87 D4 *87 l D4 { D2 D4 D2 { D4 D7 D4 f D4 k D4 K D4 k L7 sah D4 l D4 L5 D4 L6 D4 L7 D4 L7 k D4 l *87 D4 r D4 R3 s3v sah sah sg sg- sj# skD ssx stG sxp D4 t D4 { t D4 t { D4 T0 D4 T1 D4 T4 D4 T4 *21 D4 T5 D4 T6 D4 x02 D4 { x21 D5 ] D5 D5 } D5 -1 D5 +1 sa4 D5 *24 D5 +2 K D5 *41 D5 *43 K D5 *45 D5 *46 D5 *57 D5 +6 D5 *65 D5 -8 D5 } D2 D5 D2 } D5 D7 D5 DA ] D5 K D5 K D5 K +2 D5 K *43 D5 l D5 L4 D5 L8 D5 R1 D5 R4 s0! s13 s2< s63 sa4 sKp spz sr sr suw D5 t D5 T0 D5 u D5 x04 D5 x12 D5 x13 D5 x54 sr D6 ] D6 D6 [ D6 { D6 } D6 *05 D6 *15 D6 +2 D6 *24 D6 +2 T6 D6 +4 D6 +6 D6 +7 D6 *9A D6 +A ] D6 c D6 l D6 L1 D6 L2 D6 L5 D6 L6 D6 l x91 D6 R1 D6 R4 D6 R6 sKk s2; s82 s9k s9k sbk sby seb sGM sKk sKk sn. sng D6 { T1 D6 T6 +2 D6 x03 D6 x31 D6 x41 D6 x72 D6 x91 D6 x91 l D6 x92 D7 D7 *05 D7 *05 L2 D7 *29 D7 +6 [ D7 *67 D7 +A D7 D0 D7 D3 D7 D6 D7 D7 D7 D8 D7 D9 D7 l D7 L0 D7 L2 D7 L2 *05 D7 l xA3 D7 R5 se2 skt D7 t D7 T5 D7 u D7 x12 D7 x23 se2 D7 xA3 l D8 } D8 D8 *02 D8 -4 D8 *56 D8 c D8 k D8 L0 s3 D8 u D8 u x91 D8 x23 D8 x24 D8 x91 D8 x91 u D9 D9 *08 D9 -5 D9 +6 x81 D9 -7 D9 +7 D9 -A D9 'A D9 c D9 D4 D9 D6 D9 l D9 L7 D9 T3 D9 x32 D9 x81 +6 DA DA *86 DA -A DA -B DA *BA DA D4 DA D5 DA l DA R7 x25 DA x31 DA x54 DA x63 x21 DB +A l DB D0 DB l +A s68 DB x13 DB x62 DB x64 DB x71 DB x91 f [ f ] f { f } f f [ { f ] f { f { [ f } f +0 f *06 x13 f +0 x16 f +0 x29 f *15 f *16 f -2 f +2 f *20 f *21 f *24 f ] *25 f *25 ] f -2 x3B f *31 f *36 f *37 f -4 f +4 f -5 f +5 f *50 f ] *51 f *51 ] f *53 f +6 f *60 f { *65 f *67 f *69 f +6 x7A f -7 f '7 f +7 f *71 f *75 f *78 f *79 s!g f '8 f *86 f '9 f +9 f *94 f *98 x27 f *9B f '9 x61 f 'A f *A5 '8 f 'B f c f C f c D0 f c x08 f D0 f D0 c f D1 f D1 x58 f D2 f D3 f D4 f D8 f DB f f f k f K f K L3 f k x3A f K x69 f l f L2 f L3 K f R4 f R6 f R8 s4k s!g sns ss0 sts f t f T0 f T0 x34 f T0 x5A f T4 f T4 D0 f T6 x75 f T9 x08 f t x65 f [ u f u [ f x02 f x03 f x04 f x05 f x06 f x08 c f x0A f x13 f x14 f x15 f x16 f x16 +0 f x17 f x17 *0A f x18 f { x18 f x18 { f x18 *50 f x19 f ] x19 f x19 ] f x1A f x1B f x23 f x24 f x25 f f x26 f x27 f x28 f x29 f x29 +0 f x2A f x2B f x31 *31 f x34 f x34 T0 f x36 *25 f x37 f x38 f x39 f x3A f x3A k f x3B -2 f x42 f x42 *40 f x43 f x45 f x46 f x47 f x48 f x48 D8 f x49 f x4A f x4A L5 f x4B ] f x51 f x51 f x52 f x53 f } x53 f x53 } f x54 f x56 f x57 f x58 D1 f x59 f [ x59 f x59 [ f x5A sts f x5A T0 f x5B f x61 f x63 f x64 f x64 L7 f x65 f x65 t f x67 f x68 f x69 f x69 K f x6A f x6B f ] x72 f x72 ] f x73 f x74 f x75 f [ x75 f x75 [ f x75 T6 f x76 f x78 f x7A f x7A +6 f x7B f x82 f x83 f x85 f x86 f x8A f x8B f x91 f x93 f x96 f xA5 f xA8 f xB4 k ] k { k } k k { k } K { K } K K [ K [ } K { K } K } } k -0 k +0 k *04 k *04 l k *07 K +1 k *13 K *13 k -1 *34 k *13 -5 K *14 [ K *15 K +1 *50 k *15 K K *16 k *17 k +1 f } k -2 k +2 K +2 k *20 K *25 K *25 *30 sir k +3 K *30 K *30 *25 K *32 k *34 -1 { K *35 K *35 k -3 t k +4 K *43 K *43 -5 K *45 t k *46 K *46 r k { *48 k +5 K -5 K *50 +1 k *51 k -5 *13 K *53 x41 K *54 K -5 *43 k *54 R3 k '6 k *63 k '6 l k -7 [ k '7 k '8 k '9 k C k { C k C { K c k D4 ] K D5 K f k K K k k K *15 k l *04 k L2 k l '6 k r k [ r k } r K r k R1 x41 k R2 k R3 K R3 k R3 *54 k R4 K r *46 [ k R5 K R6 k r R1 K r u s2c s2o s3H s52 s5b s8k saj sbd scr sd; sd3 se6 sej ser sex sfp sfp sgd si7 sir sjt smO snb srJ srp ss2 ssL ssy suz sy6 sy6 szs K t K T0 k t -3 K t *45 k T5 } k u k u K u r ] K x01 K x21 k x23 K x31 K x32 K x41 k x41 R1 K x42 k x51 k { x51 k x51 { k x62 k x71 sfp l l [ l { l } l +0 L0 } L0 L0 { L0 } L0 +1 L0 *13 L0 *13 T1 l { *02 L0 +2 l *03 L0 +4 L0 -5 L0 -7 L0 '7 L0 '7 l L0 c L0 l L0 L0 L0 L1 L0 L5 L0 l '7 s67 s6u sdu L0 T0 s67 L0 T2 L0 u L0 u x14 L0 x12 L0 x14 u L0 x26 L0 x31 L0 x41 L0 x51 L0 x53 l } -1 l +1 [ L1 [ L1 { L1 L1 [ L1 { L1 -0 L1 +1 L1 *15 L1 -4 L1 +4 l { *15 L1 '6 L1 *62 sw@ L1 -7 L1 +7 L1 *79 D6 L1 D5 L1 R0 L1 R5 s61 sa3 sw@ L1 t L1 T0 L1 T3 L1 x23 L1 x26 L1 x35 L1 x41 L1 x42 L1 x52 l +2 L2 L2 } l *20 L2 *05 L2 -1 L2 *20 L2 *3A x34 l *23 L4 spe l *24 -5 L2 +5 L2 D0 L2 D3 L2 L3 L2 L4 L2 L7 D0 L2 r L2 R4 s6u s?9 s9d sd_ sds L2 t L2 T1 L2 u L2 x02 L2 x34 L2 x62 l +3 L3 L3 { L3 } L3 +0 l *30 +4 L3 +0 '6 l *30 *64 L3 +1 L3 +3 L3 *32 L3 *35 L3 -4 L3 +4 l *35 L3 -5 L3 +5 l +3 -6 L3 -6 L3 '6 L3 '6 +0 l *37 l +3 '7 L3 D0 L3 l L3 L1 sb` slk slk L3 T0 slk L3 x02 L3 x52 L3 x62 l +4 L4 l *41 L4 *14 L4 -3 l +4 *30 L4 -5 L4 '5 L4 -5 T1 L4 -6 L4 '6 L4 D0 L4 D2 t L4 D3 L4 l L4 L4 L4 r L4 R0 L4 T1 -5 L4 t D2 L4 u L5 L5 { L5 *02 L5 -2 L5 *21 L5 ] *23 L5 *23 ] l -5 *24 L5 { *30 L5 *34 L5 -5 L5 '7 L5 c L5 D0 L5 l L5 L5 L5 R1 seo sgw st6 L5 t L5 u L5 x32 L5 x62 L6 [ L6 { L6 } L6 L6 [ l -6 +3 l *63 l *63 K L6 +4 l *64 *30 L6 ] *50 L6 *50 ] L6 +6 L6 +6 '9 l *68 L6 '9 L6 '9 +6 L6 c L6 D3 L6 D5 { L6 l L6 L7 L6 r L6 R3 s61 sm2 L6 t L6 x71 L6 x72 L6 x74 L7 } L7 L7 } L7 *03 L7 *03 *38 L7 -1 L7 *13 L7 *17 l '7 +3 L7 *38 l *74 L7 *47 l *75 L7 *63 L7 *67 L7 '8 l *79 L7 c L7 l sj= sj= L7 t L7 T1 t L7 t T1 L7 x15 L7 x31 L7 x52 l '8 L8 { L8 L8 *08 L8 *52 l *86 l *87 L8 { *78 L8 +8 L8 '9 s5s L8 x21 L8 x25 L8 x31 L8 x35 L9 L9 [ l *92 l *98 L9 l L9 x13 L9 x24 L9 x35 L9 x42 L9 x62 L9 x72 l -A l +A LA l +A x45 LA x82 l *B9 LB x53 l D3 L5 l D4 l D8 sns l f x1B l f x46 l K l K *63 l L1 l L2 l L4 *23 { l L6 l r l R0 l R1 l R3 l R6 l R8 s0? s0i s12 s1a s5d s6- s6p s70 s8p sdk sgc sgj shj slh smb smb smK sns so1 sp1 spe spe sr[ ss& ssd ssf ssi suy swn sys sz2 l T1 l T2 l T3 l T4 l T5 l T6 [ l T7 l T7 l T8 l T9 l x12 l x13 l x14 l x15 { l x21 l x23 l x24 l x26 l x27 l x32 l x35 -5 l x42 l x43 l x52 l x53 l x63 l x72 l x75 l x83 l x83 D9 l x92 r [ r [ r } ] r ] { r } r r [ r { r } r -0 r +0 R0 { R0 } R0 R0 } R0 *06 R0 *08 R0 *09 R0 *17 r *02 r *02 K R0 +3 R0 *37 R0 } *38 R0 +3 t r { *04 r *05 r *06 R0 -6 R0 '6 r *07 R0 -7 R0 '7 r *07 *64 r *09 r -0 c R0 c x12 [ R0 D3 ] R0 D3 R0 D3 R0 D5 R0 D6 R0 K R0 k *16 R0 l R0 L3 R0 r R0 R2 shd R0 T1 R0 T1 *17 R0 t +3 R0 x12 R0 x12 c R0 x13 R0 x24 R0 x35 r -1 R1 [ R1 R1 [ ] R1 ] R1 ] [ R1 } r *10 R1 *03 R1 *12 r *12 r *12 *60 R1 -3 r *14 R1 +4 r *14 D5 r *15 R1 -5 r *15 L2 r -1 *61 R1 -7 R1 '7 R1 c R1 C R1 D0 R1 D3 R1 D7 R1 f R1 } k R1 r R1 R0 { R1 R2 R1 R3 R1 R4 sed sed sfn shc R1 t R1 x23 R1 x35 sed R1 x41 R1 x42 R1 x53 r -2 R2 { R2 } R2 R2 } [ r *20 R2 +1 R2 *24 R2 +3 R2 *61 R2 *70 R2 f R2 l R2 L1 R2 L7 R2 r sob R2 u R2 x41 R2 x51 R2 x62 R3 { R3 [ R3 [ r [ *30 r *30 R3 +1 R3 +3 R3 *30 r *34 r *34 [ R3 -4 R3 *40 R3 *46 l R3 -4 t r *35 [ R3 -5 R3 +5 r *36 R3 '6 R3 +6 R3 -7 [ R3 c R3 D5 R3 K R3 l R3 L0 R3 L4 R3 l *46 s1j shf R3 t R3 t -4 R3 x21 R3 x54 R3 x73 R4 } R4 R4 [ R4 { r *40 r *40 t R4 *30 R4 +4 R4 *41 R4 *45 R4 r ] *45 r *45 r *45 ] R4 -5 R4 -5 +6 R4 *64 R4 +6 -5 R4 *87 [ R4 D0 R4 D1 R4 D2 R4 D2 T0 R4 f R4 r r +4 R0 R4 R2 R4 R4 R4 R5 s20 s9H smD ss) R4 t R4 T0 D2 R4 T5 R4 x02 R4 x04 R4 x21 R4 x53 R4 x63 r '5 r +5 R5 { R5 } r *50 R5 +1 r *52 R5 +2 r *53 R5 *34 r [ *54 R5 -4 R5 *53 r *56 R5 *64 R5 *64 x63 R5 *65 R5 *65 K R5 '8 R5 '9 R5 D4 [ R5 k R5 k R5 K R5 K *65 R5 l R5 R6 s1n s1z s2* s4a sd4 se7 st3 st9 R5 u R5 x31 R5 x63 r '6 r +6 R6 R6 [ r *60 *12 R6 *07 -4 R6 *23 R6 -3 R6 -4 R6 +4 r *64 *07 R6 -4 *07 R6 +5 r *65 x32 R6 *64 R6 *64 C R6 *65 R6 -7 r '6 C R6 C R6 C *64 R6 D1 R6 D2 R6 D5 R6 L2 R6 r R6 R0 R6 R2 R6 R7 s2r sc4 ss8 R6 t R6 u R6 x15 R6 { x21 R6 x21 { R6 x24 R6 x41 R6 x75 R7 [ R7 { R7 R7 [ R7 *02 R7 -0 x12 R7 -5 R7 *56 R7 -6 R7 *67 R7 '8 R7 +9 R7 *97 R7 [ D3 R7 D3 [ R7 l sgs syi R7 t R7 T4 R7 x12 -0 R7 x14 R7 x34 R7 x41 R7 x43 R7 x81 r +8 R8 { R8 R8 -5 R8 D1 R8 R7 R8 x04 R8 x16 R8 x31 R8 x32 R8 x34 R9 { R9 R9 [ R9 *25 R9 *36 R9 -9 R9 D7 R9 u R9 x02 R9 x14 R9 x24 r 'A RA [ RA +1 x82 RA x73 RA x82 +1 RB x02 r c r C r c -0 r C '6 r c K } r D0 r D2 r D3 r { D3 r D3 { r D4 r D5 r D5 *14 r D5 R8 r D9 r f r } f r f x3A r K r ] K r K *02 r K c r K x51 r L2 r L2 *15 r L5 r L5 L5 r L7 r L9 r R0 r R0 +4 r R2 r R3 r R4 } r R4 C r R6 s0- s0+ s0l s1 sa3 sb9 sbq sil sJ7 snw so% sra stE stk stp swg r t r T0 r T1 r t *40 r T7 r t x41 ] r u r x04 r x05 r x15 r x32 r x37 r x41 t r x42 r x51 r x51 K r x54 r x62 r x64 s!- s!. s0- s0` s0< s0 s0_ s0_ s0- s0, s0! s0? s0/ s0. s0) s0@ s0* s0\ s0& s0# s0+ s02 s03 s03 s04 s05 s05 s06 s0- s0* s06 s07 s07 s07 s08 s08 s09 s09 s0a s0a s0A s0a s0b s0B s0c s0+ s0C s0d s0D s0, s0, s0e s0E s0f s0F s0g s0g s0G s0G s0h s0i s0I s0j s0J s0j s0k s0K s0k s0l s0m s0M s0n s0o s0o s0p s0P s0q s0q s0r s0r s0s s0S s0s s0s s0U s0U s0v s0w s0x s0X s0% s0X s0x s0X s0y s0Y s0z s0Z s1` s1= s1 s1 s1_ s1- s1, s1; s1! s1? s1/ s1. s1@ s1& s1# s1+ s10 s12 s13 s13 s14 s15 s15 s15 s16 s16 s17 s18 s1# s18 s18 s18 s18 s19 s19 s1a s1A s1B s1B s1c s1c s1d s1d s1D s1* s1e s1E s1f s1F s1g s1g s1h s1i s1I s1k s1K s1K s1l s1L s1m s1n s1o s1p s1P s1p s1q s1q s1r s1s s1S s1t s1u s1U s1u s1v s1V s1v s1w s1W s1w s1w s1w s1x s1X s1y s1y s1z s2< s2 s2_ s2- s2, s2; s2? s2. s2@ s2* s2# s2+ s20 s2@ s21 s21 s21 s23 s24 s25 s26 s26 s27 s27 s28 s28 s29 s2a s2A s2b s2B s2B s2c s2c s2d s2e s2f s2F s2g s2G s2G s2G s2G s2h s2H s2i s2I s2K s2k s2l s2L s2l s2m s2o s2o s2p s2Q s2r s2* s2s s2t s2T s2u s2v s2v s2w s2W s2x s2* s2y s2y s2y s2y s2z s2Z s2z s3` s3 s3_ s3, s3! s3. s3" s3[ s3} s3@ s3* s3# s3% s30 s30 s31 s32 s3+ s34 s34 s35 s36 s36 s37 s37 s38 s38 s38 s38 s38 s39 s3a s3A s3A s3b s3c s3d s3e s3E s3e s3f s3f s3G s3g s3h s3H s3i s3j s3k s3K s3l s3L s3l s3m s3o s3q s3r s3s s3S s3t s3t s3u s3. s3V s3v s3W s3x s3X s3y s3Y s3z s4 s4_ s4- s4, s4. s4] s4* s4\ s4& s4+ s40 s41 s42 s43 s45 s45 s46 s47 s48 s49 s49 s4a s4A s4b s4+ s4C s4d s4d s4e s4f s4F s4G s4i s4I s4j s4j s4k s4K s4k s4n s4o s4O s4p s4q s4r s4R s4r s4s s4s s4t s4T s4* s4w s4w s4x s4X s4_ s4y s4y s4z s!5 s5= s5 s5_ s5, s5! s5/ s5* s50 s51 s52 s52 s53 s5% s53 s54 s54 s5% s56 s57 s58 s58 s59 s5a s5b s5b s5c s5d s5e s5e s5f s5g s5G s5g s5i s5k s5m s5n s5o s5o s5s s5t s5w s5x s5. s5% s5= s5Z s6- s6! s6! s6/ s6. s6@ s6* s6& s6% s60 s61 s62 s63 s63 s64 s64 s65 s67 s68 s68 s69 s69 s6a s6b s6B s6b s6c s6c s6d s6e s6f s6g s6J s6k s6K s6K s6% s6m s6n s6o s6p s6q s6r s6S s6S s6t s6V s6w s6W s6X s6y s6z s6z s7+ s!7 s7= s7 s7- s7/ s7. s7" s70 s70 s71 s7- s71 s72 s73 s74 s74 s74 s75 s76 s76 s76 s76 s76 s76 s78 s78 s79 s7a s7A s7b s7c s7C s7d s7D s7e s7f s7g s7i s7j s7K s7l s7L s7M s7n s7N s7P s7q s7r s7r s7s s7W s7x s7 s7Y s!8 s8- s8/ s8. s8* s8# s80 s8. s80 s8. s80 s81 s82 s84 s84 s84 s85 s86 s87 s87 s87 s89 s89 s8a s8a s8B s8B s8B s8c s8c s8c s8d s8D s8e s8F s8h s8H s8i s8j s8J s8k s8l s8l s8m s8M s8m s8n s8n s8o s8p s8P s8Q s8R s8S s8t s8t s8T s8u s8U s8u s8v s8W s8x s8y s8z s8z s9 s9_ s9- s9! s9. s9" s9@ s9* s9\ s9# s9% s90 s90 s91 s92 s92 s92 s93 s94 s94 s95 s97 s97 s97 s97 s98 s9a s9b s9b s9c s9d s9D s9d s9 s9. s9e s9E s9f s9i s9J s9k s9n s9o s9p s9q s9r s9_ s9S s9" s9T s9u s9u s9u s9w s9x s9 s9y s9z s9Z sa@ sa= sa sa- sa; sa? sa/ sa. sa' sa@ sa* sa0 sa0 sa0 sa1 sa@ sa2 sa2 sa3 sa4 sa4 sa4 sa5 sa6 sa7 sa7 sa8 sA8 sa9 saA saA sac sa@ saC sAC sad sad sae saE sae sae saE saf saF saF sag sah saH sai saj sak sak sa- sam sam sam san san sao saO sap sap saP sAP saq saQ sar sa! sar sas sa@ se3 se3 se3 sa@ sa@ si1 si1 si! si! sa@ sa@ so0 so0 so0 so0 saS sat sat sa@ sa@ sa@ sat sau sau sa@ saU sAu sau sau sav sav saw saW sax sa. sax say saY sAy saz saZ saZ sb sb- sb# sb0 sb0 sb0 sb1 sb2 sb3 sb4 sb5 sb5 sb6 sb7 sb7 sb7 sb8 sb8 sb9 sb9 sb9 sba sbB sbc sb sbC sbd sbd sbe sbf sbf sbg sbg sbH sBH sbi sbj sbJ sbk sbK sbk sbl sbL sbm sbM sBM sbM sbm sbm sbM sbM sbn sbN sbo sbp sbP sbq sbr sbR sbs sbs sbt sbt sbT sbu sbu sbu sbv sBv sbx sbX sby sby sby sby sbz sbz sc" sc@ sc/ sc2 sc3 sc4 sc5 sC6 sc7 sc8 sc9 scb scb scD sce scf scg scg sch scH sCh sch sci scj scj scj sck scK sck sck sck scl scL scm scn sCN sco scp scP scq scr scr scs scs scS sCS sct scu scv scw scx scy scz scZ scz sd- sd. sd0 sd1 sd1 sd3 sd3 sd5 sd6 sd7 sd7 sd9 sdb sdB sdb sdb sdc sdc sdD sdf sdF sDF sdf sdf sdg sdG sdg sdh sdi sdi sdj sdJ sdJ sdk sdK sdl sdL sDl sDL sdL sdm sdm sdn sdN sdn sdo sdp sdP sdp sdp sdp sdq sdr sds sds sDs sdt sdT sdv sdW sDw sdW sdX sdX sdy sdY sdY sdz sdZ sDz se se- se; se. se@ sE. se0 se1 se1 se2 se3 se3 se3 se3 se3 se3 sl1 se3 se3 se3 se3 se3 se3 se3 se3 se4 se5 se6 se7 se8 se9 sea seb sec seC sed sed seE sef seg seg seh sei sej seJ sEJ sej sej sek sem sem sem sem sen seN seo seO seO sep ser ser ser sEs ses set seu seU sEU sev sew seW sew sex sey sez sez sf[ sf1 sf2 sf5 sf6 sf7 sfa sfb sfB sfc sFC sfd sfd sfd sfF sfF sfg sfg sfh sfj sfJ sfk sfk sfK sFl sfm sfn sfn sfN sfo sfp sfq sfr sfr sfs ssB sft sfU sfv sfv sfw sfX sfz sg1 sg2 sg3 sg4 sg_ sg4 sg_ sg5 sg6 s!g sg8 sg9 sg9 sga sgb sgc sgC sgd sgD sge sgh sgh sgh sgi sgj sgJ sgj sgk sgK sgl sgl sgm sgm sgn sgn sgo sgo sgO sgo sgp sgq sgq sgr sgR sgs sgS sgt sg sgT sgT sGt sgv sgV sgw sGw sgw sGw sgx sgx sgy sgz sh0 sh1 sh2 sh2 sh2 sh2 sh4 sh6 sh7 sh7 sh9 sha shb shB shb shc shC shd she shf shf shf shg shG shi shj shk sh* shk shk shk shl shL sHL shm shM shm shn shp shq shr shr shs shS sht shT shu shU shv shW shx shx shX shy shY shy shz shz shz shz si si- si; si! si. si@ si* si1 si1 si1 se3 si1 si1 si1 si1 si1 si1 si1 si2 si3 si3 si5 si6 si7 si7 si7 si9 sia sib sib siC siC siC siC siC sid sie sIE siE sif sif sih sij sik sil si sim sin siN siN sio siO sio sio sip siq siq sir sir si! sit si! si! si! si! si! si! siu si! siU siv siw siW siw siy siy siz siZ siz sj= sj- sj. s!J sj1 sj6 sj6 sj7 sj8 sj9 sjb sjB sjd sj sjF sjF sjg sJg sjh sjk sjl sjl sjl sjm sjn sjn sjo sjo sjp sjP sjq sjq sjr sjs sjs sjt sjt sjt sjv sjW sjx sjx sjy sjY sjz sk_ sk- sk0 sk2 sk4 sk8 sk9 ska skA skb skB skb skc skc skC skd skD ske skf skg skG skg skh sKH ski skl skL skL skm skM skm skn sko skp skP skq skr sks skt skT sku skW skW skw skx sky sKy sky sky sky skz skz skZ sl sl; sl! sl] sl@ sl1 sl1 sl1 sl1 sl1 sl1 sl1 sl1 sl1 sl2 sl4 sl5 sl6 sl7 sL7 sl7 sl8 sl9 sla slA slb slB slb slc slc slc sld sld sl; sle slf slf slF slf slf slg slh slH slh sli slj slj slk slK sl@ slL slm slM slM sln sln slo slo slo slp slP slq slr slR slr sls slS slt slt slT slt slt slu sLU slv slw slW slx sl- sly sly sly slz slz slZ sm_ sm; sm. sm1 sm1 sm1 sm2 sm2 sm3 sm3 sm4 sm4 sm5 sm6 sm8 sm8 sm9 sma smb smb smB smB smc smd smD smd sme sme smf smg smg smG smg smH sMH smH smj smj smj smj smk smK sml sml sml smM smn smn smo smo smo smo smo smp smp smP smP smq smQ smr smR sms sms smt sm@ smu smu smu smv smw smw smW smw smy smz smZ sMz sn, sn. sn+ sn0 sn1 sn2 sn3 sn4 sn4 sn4 sn5 sn6 sn6 sn7 sn7 sn8 sn9 sn9 sna snb snB snb snc snc snd snD snd sne snf sng sng snG snG sng sng snh snh snh snj snk snl snl sn_ snl snL snm sNm snm snN snp snp snq snq snr sns snt snT sNt snt snu snu snv snw snw snw snx snX sny snz snz so so, so; so! so/ so. so] so@ so# so0 so0 so0 se3 se3 se3 so0 so0 si1 si1 si! si! so0 sl1 so0 so0 so0 so0 so0 so0 so0 so0 sO0 so1 so3 so3 so3 so3 so4 so5 so6 so8 so9 soa soa sob soB soc soc soC sod sod sod soe sof sog sog soh soi soi soI soK sol som som son soN soO sop soq soQ sor sor sos soS sot soT sou sou sov sow sOW so' soy soY soy soz sp` sp= sp. sp) sp[ sp/ sp1 sp2 sp6 sp9 spb spb spc spc spd spD spe spf spg spG sph spi spj spk spl spm spm spr spR sps spS spt spT spT spT spT spu spv spV spW spY spz spZ sq sq9 sqb sqc sqg sqg sqk sqm sQn sqt sr sr[ sr0 sr0 sr1 sr2 sr2 sr2 sr4 sr5 sr5 sr6 sr sr7 sr8 sra sra sra srb src src src src srd srd sre srf sRf srf srG srg srg srh srH sri srI srj srJ srj srj srk srk srl srm sRm srn srN sRN srn sro sro srR srs srS srs srt srt sru sr& sru srv srw srW srw srx sr srx srX sry sry srY srY srz srz ss? ss` ss_ ss- ss, ss. ss' ss* ss\ ss& ss# ss% ss+ ss0 ss1 ss1 ss2 ss2 ss2 ss3 ss3 ss4 ss4 ss5 ss5 ss5 ss5 ss6 ss6 ss7 ss8 ss9 ssa ssa ssb ssB sSB ssb ssB ssc ssC sS/ ssd ssd ssE ssf sSf ssF ssg ssg ssh ssH ssh ssH soB ssi ssj ssj ssk ssK ssk ssl ss\ ssL ss- ssm ssn ssn sSn sso ssO sso ssp ssp ssr ssS sst sst ssT ssu ssv ssv ssw ssW ssx ssy ssy ssy ssz ssZ ssz st st` st< st st, st st1 s#_ st1 st1 st1 st3 st4 st4 st5 st5 st6 st7 st7 st8 st9 stA stb stB stc stC sTC std stD ste ste stf stf stF stg stg stg sth sth sth sti sti stj stk stk stl stL stl stl stl stm stn stp stq str st* sts sts stS st@ stu stu stu stv stw stw stw stx sTX stx stx stx sty stz su_ su. su\ su0 su1 su3 su4 su8 su8 suA sub sub sub sub sub sue sue sUe suf sug suh sui suI sui sui suk sul sul sum suM sun sun suN sun sun suo suo suo sup sup sur sus sut suw suy suY suy sv_ sv3 sv6 sv7 sv9 svb svd svf svg svi svj svj svl svm svm svm svm svm svn svN svp svr svr svS svt svu svw svx svy svz sw2 sw2 sw4 sw6 sw8 sw9 swA swa skz swa swa swc swd sw; swe swe swf swf swg swh swh swj swk swL swm swn swn swp swr sw- swr sWt swz sx* sx0 sx1 sx3 sx4 sx5 sx6 sx6 sx7 sx8 sx8 sx9 sxa sxb sxc sxf sxh sxh sxh sxh sxk sxl sxm sxo sxp sxq sxr sxr sxs sxt sxv sxw sxy sy. sy1 sy1 sy3 sy5 sy6 sy7 syb syb syc syd sye sye sye syf syg syh syi syI syj syl syn syo syp syq sys syt syu syU syu syv syz sz; sz. sz2 sz6 sz7 sz8 sz9 sza szb szc szd sze szf szh sZJ szj szk szk szl szL szl szm szm szn szp szs szt sz szu szw szw szx s.z szy szZ t [ } t [ t } { t t ] { t { t } { t -0 T0 { T0 T0 { T0 *02 T0 *03 T0 *06 r T0 *07 x21 T0 *13 T0 -4 T0 *43 t *04 k t *05 T0 +5 t *05 R1 T0 '6 T0 +6 T0 +7 [ T0 -9 T0 '9 T0 *9A T0 D3 T0 D5 D8 T0 D6 T0 D8 D5 T0 D9 T0 L3 T0 L4 T0 L7 T0 r T0 r *06 T0 R5 s3! se4 sgK sM so spR sr@ st5 std stj T0 t T0 T2 T0 T3 T0 T5 T0 T9 T0 x12 T0 x63 T0 x74 T1 [ T1 { T1 T1 [ T1 +0 T1 +1 sAP T1 -3 t *14 T1 -4 T1 +4 t *15 t -1 -6 T1 +6 T1 +7 T1 '8 T1 '9 T1 f T1 k T1 K T1 L0 T1 r sAP sbN T1 t T1 T0 T1 T2 T1 T2 T3 T1 T2 T4 T1 T3 T1 T3 T2 T1 T3 T5 T1 T3 T5 T7 T1 T3 T7 T5 T1 T4 T1 T4 T2 T1 T5 T3 T1 T5 T3 T7 T1 T5 T7 T3 T1 T6 T1 T7 T1 T7 T3 T5 T1 T7 T5 T3 T1 x42 T1 x54 T2 { T2 } T2 t *20 T2 -0 T2 *03 t *21 T2 *57 T2 '7 T2 D7 T2 k T2 K sA8 T2 r s03 sA8 sA8 sx3 T2 t T2 T3 T2 T4 T2 T4 T5 T2 T4 T6 T2 T4 T6 T8 T2 T4 T8 T6 T2 T5 T2 T5 T4 T2 T6 T2 T6 T4 T2 T6 T4 T8 T2 T6 T8 T4 T2 T8 T4 T6 T2 T8 T6 T4 T2 x02 T2 x41 T2 x52 T2 x52 *52 T2 x57 T2 x62 t +3 T3 } T3 T3 } T3 +0 t *31 t *34 T3 -5 x63 t *37 T3 '9 T3 D0 T3 D6 T3 D7 T3 L0 T3 r s0@ si1 sr2 T3 t T3 T5 T3 T5 T7 T3 T5 T7 T9 T3 T5 T9 T7 T3 T6 T3 T7 T5 T3 T7 T5 T9 T3 T7 T9 T5 T3 T8 T3 T9 T5 T7 T3 T9 T7 T5 T3 x12 T3 x43 T3 x53 T3 x63 -5 T4 ] T4 T4 [ [ t *42 T4 +2 T4 +4 T4 -5 t *46 T4 -6 T4 '8 T4 'A T4 D5 T4 D7 T4 k T4 r T4 R4 T4 R6 T4 r t s2u s32 s3H sau sIs T4 T3 T4 T5 T4 T6 T4 T6 T8 T4 T8 T6 T4 t r T4 x02 T4 x54 t -5 T5 T5 [ T5 { T5 } T5 -0 t *51 T5 -3 t { *54 T5 *43 T5 *45 T5 *45 T1 T5 -6 T5 '6 T5 +6 T5 *67 T5 'B T5 D1 T5 D3 s85 T5 D4 T5 K s0+ s2b s85 shn T5 T1 *45 T5 T7 T5 x13 T5 x61 T5 x62 t '6 t +6 T6 ] T6 } [ T6 T6 [ t -6 -1 T6 *23 t *65 -7 T6 -7 T6 '7 T6 '9 T6 +B T6 D1 T6 D8 T6 R0 T6 T0 T6 T5 T6 T7 T6 x02 T6 x12 T6 x14 T6 x24 T3 T6 x71 T6 x72 t '7 T7 [ T7 t -7 *65 T7 +6 t t *78 [ T7 '8 T7 'A T7 L6 sg7 sgp T7 t T7 T0 T7 T2 T7 T3 T7 T4 T7 t +6 T7 T8 t -7 x03 T7 x24 t +8 T8 [ T8 } T8 T8 } [ T8 +7 T8 -7 D4 T8 D2 T8 D5 T8 D6 sdn T8 t T8 } T8 T8 x02 T8 x31 t '9 T9 T9 +B T9 x13 T9 x23 x51 t -A TA TA RA TA T0 TA x53 x41 { t D1 t D1 t D1 -3 sLA t D8 t D8 x24 t DA x72 t f x3B t f x4A t k t } k t L4 t L5 t r t R0 t R1 t R1 *05 t R3 t R4 t R7 t r D2 s0D s0e s0w s0Y s1n s2) s3e s4f s4U s52 s6b s9! sBZ sF9 sg7 sgX sJk skC sLA sLH sLN sMD sN8 sNs sS9 sTc sTk sUe sUR sVF sVG sXB t T1 t T4 t T5 t T6 t T9 ] t x02 t x04 t x12 t x14 t x23 t x24 t x27 t x32 t x32 [ t x34 t x36 t x42 t x45 t x52 t x54 t x61 t x62 t x64 t x72 t x74 t xA2 u [ { u [ u { { u } u u { u } u +0 u ] *04 u *04 ] u *05 -5 u +1 u +1 x21 u -2 u +2 { u *20 u *21 } u +3 u -3 ] u ] -3 u *32 u *32 +2 [ u -4 u +4 L1 u -5 u +5 u *51 u *52 u -5 '6 u *56 u '6 u '6 -5 u *67 u *68 u *75 D5 u *76 u +7 R7 u -8 ] u D0 u D0 u D0 +2 u D0 D7 u D3 u D3 T1 u D4 u D4 x43 u D6 u D7 D0 u D8 u D9 u f } u k u k x21 u K x21 u L0 u L1 +4 u L2 } u L7 ] u r u r u { r u R5 u R7 +7 sTz s0b s1c s2n s4T s5R s6& s6c s7t s9_ s94 s9D sBN sCK sCY sEs sG! sLH sMK sP= sPC sRN sTG sTz sVX sYM u T1 u T1 D3 u T2 u [ T2 u [ T3 u T5 [ u x01 u x03 u x13 u x15 u x21 +1 u x21 k u x21 K u x24 u x32 u x35 [ u x41 u x41 u x42 u x43 D4 u x47 u x53 u x56 u x75 u xA1 x01 ] x01 } x01 '9 sRu x01 f t ] x01 K x01 r sl. sry sta swf x01 t f x01 x54 x02 { x02 } x02 x02 { x02 *02 +3 x02 +1 x02 +2 x02 *20 x02 *23 x02 +3 x02 +3 *02 x02 *31 x02 -4 x02 *50 x02 *50 t x02 +6 x02 -7 x02 +8 x02 C x02 D3 x02 D5 x02 D6 x02 f x02 f +0 x02 k x02 K { x02 L5 x02 r x02 R5 x02 r k str syl ] x02 t x02 t x02 T5 x02 t *50 x02 x13 x02 x53 x02 x63 x03 { x03 x03 -0 x03 +0 x03 *12 x03 *12 *50 x03 +2 x03 *30 x03 *31 x03 *34 x03 *50 *12 x03 +6 x03 C x03 D4 x03 f x03 f ] x03 k x03 { K x03 L6 x03 R1 x03 R2 x03 R3 s2 sld x03 T6 x04 x04 *02 x04 *78 x04 l x04 L4 x04 L7 x04 R5 x05 x05 -4 x05 k x06 x12 [ x12 { x12 x12 } x12 -1 x12 +2 x12 *21 x12 *30 x31 x12 *34 x12 -4 x12 *41 x12 *41 *52 x12 *52 x12 *52 *41 x12 '8 x12 '8 u x12 c x12 D7 x12 K x12 K l x12 L1 x12 L3 x12 l K x12 r x12 R3 s2z s81 s9n sf4 sgo shs sna x12 } t x12 t } x12 T3 x12 u x12 u '8 x12 x23 x12 x32 x12 x91 x13 } x13 x13 *03 x13 *04 x13 -0 K x13 +1 r x13 -2 x13 *34 x13 C x13 D6 x13 D7 x13 f x13 K -0 x13 R2 x13 R5 s2f s9i sgP spw svz x13 T1 x13 T5 x13 x32 x13 x63 x14 } x14 x14 { x14 -1 x14 *50 x14 '8 s28 x14 D3 x14 f x14 f *10 x14 L2 x14 R0 s28 s28 sam x15 x15 { x15 +0 x15 +1 x15 +2 x15 +3 x15 c x15 D5 L2 x15 L2 D5 sza x15 T1 x16 -1 x16 +3 x21 [ x21 { x21 } x21 x21 { x21 -0 x21 +1 x21 +2 x21 *25 x21 *30 x21 *68 x21 '9 { x21 c x21 D7 x21 f x21 k R0 { x21 l x21 { l x21 l { x21 R5 D4 x21 R7 s5 scs scZ sm0 stl syu x21 x52 x23 [ x23 { x23 x23 { x23 +0 x23 *23 { x23 '6 x23 '7 x23 -8 x23 +9 x23 C x23 D3 x23 f x23 K x23 L4 x23 L5 x23 r x23 R3 siL x24 { x24 x24 ] x24 *13 x24 *13 t x24 +2 x24 -3 x24 *36 x24 +5 x24 '6 x24 '8 x24 f x24 L2 x24 L6 sa. sat sod sr4 x24 T1 x24 t *13 x24 t R1 [ x25 x25 *13 x25 -1 f x25 +2 x25 +2 x51 x25 -5 x25 D4 x25 R6 s5c x25 u x25 x51 +2 x26 x26 } x26 +1 x26 -5 x26 R0 skf ssa x27 x28 +3 x31 [ x31 x31 [ x31 } x31 -0 ssr x31 -2 x31 *24 x31 *26 x31 *28 x31 +4 x31 +4 L7 x31 ] *54 x31 *54 ] x31 '6 x31 *61 x31 *80 x31 c x31 f x31 L7 +4 x31 l R6 x31 r x31 R6 x31 R6 l s5X sar sar si' sl9 smf ssr ssr syT x31 T2 x31 x21 *45 x31 x42 x32 [ x32 } x32 x32 [ x32 } x32 +1 x32 +2 x32 -3 x32 *43 x32 -5 x32 +5 x32 '6 x32 +7 x32 '8 x32 D1 x32 k x32 l x32 L4 x32 R4 x32 R5 sg* sG6 sqc srl srs sts x32 T3 x32 x42 x32 x72 x34 [ x34 x34 +1 x34 *13 x34 -4 x34 -5 x34 +6 D2 x34 -7 x34 +8 x34 c x34 D6 x34 f u x34 l x34 L0 s4d seB skz som ssm ssp svj x34 [ t x34 t [ x34 u f x34 x52 x35 x35 +0 x35 -1 x35 *43 x35 -6 x35 k x35 l x35 R1 sr7 x35 x63 x36 x36 +3 x36 L3 sbt x36 T3 x41 x41 [ x41 -0 x41 +1 x41 +1 *30 x41 *30 +1 x41 *36 r x41 *40 x41 *53 x41 *56 C x41 *78 x41 C *56 x41 D1 x41 r *36 sh5 sjL sku snl x41 T3 [ x41 u x41 x61 x41 x82 x41 x83 x42 [ x42 x42 { x42 } x42 -0 x42 +3 x42 *34 x42 -4 x42 *52 x42 *52 t x42 *53 x42 -6 x42 '6 x42 -7 x42 -8 x42 +9 x42 c x42 D1 x42 D1 *21 x42 D8 sjb x42 L4 x42 L5 x42 L6 x42 r x42 R5 x42 R7 sa sdp sjb sjb slL srz x42 T5 x42 t *52 x42 { T6 x43 ] x43 } x43 x43 [ x43 *04 x43 *05 x43 +2 x43 +3 x43 +4 x43 *42 x43 *43 x43 +7 x43 '8 x43 C x43 D4 x43 D7 x43 f x43 L0 x43 L4 x43 R0 s2i s6n sbh sKi x43 t x43 u x45 [ x45 x45 { x45 -3 x45 -5 x45 c x45 l x45 R0 x45 R1 spb x46 -1 x46 -2 x46 +2 x46 l x47 -4 x47 c x51 [ x51 { x51 x51 { x51 *04 x51 -1 x51 -2 x51 *68 x51 -7 x51 '9 x51 K se6 x51 L1 L3 x51 L3 x51 L3 L1 x51 r x51 R1 r x51 R8 s9u se6 se6 sh2 sj4 sjm so so ssa ssS x51 T1 x51 T3 x51 x62 x52 x52 { x52 } x52 *02 x52 *05 x52 +2 x52 *31 x52 *32 x52 +3 +3 x52 *41 x52 +5 x52 -6 x52 *67 x52 'A x52 D7 x52 L4 x52 r x52 R2 x52 R3 x52 R4 x52 T5 x13 x52 u x52 x02 x53 [ x53 { x53 x53 *10 x53 -4 x53 -9 x53 +9 x53 *97 x53 D7 x53 L1 x53 R5 x53 R6 s2r x53 R7 s0. s1B s2r s2r sln x53 T0 x53 T1 x53 T4 x53 x41 x53 x62 x54 x54 -1 R0 x54 +2 -4 x54 -4 x54 -4 +2 x54 -5 x54 c x54 C x54 D3 x54 l x54 R0 -1 x54 R1 x54 R5 x54 R6 x54 R7 set x54 T5 x54 ] x21 x54 x21 ] x56 x56 +5 x56 -6 x56 +6 x57 R5 x61 { x61 x61 } -1 x61 -2 x61 *41 x61 *53 x61 +6 x61 *64 x61 *78 x61 } -9 sjx x61 L0 x61 r x61 R5 s8m sjx x61 t x61 T4 x61 x14 x61 x21 x62 x62 [ x62 +0 x62 +2 x62 +6 x62 *65 x62 +7 x62 -8 x62 '8 x62 c x62 D3 s0l x62 l x62 r s0l s0l s1i sbd x62 T3 x62 T6 x62 x02 x62 x23 x63 ] x63 x63 -0 x63 *34 x63 *62 x63 c x63 r x63 R1 x63 R6 x63 R7 scH x63 u x64 [ x64 x64 +1 ] x64 +6 x64 -6 x64 -7 x64 l skL x64 T0 x64 x32 x65 x65 +6 x65 *76 x65 l x65 R0 slb x71 { x71 x71 } x71 -0 c x71 +5 x71 *53 x71 *56 x71 *58 D5 x71 *64 x71 *64 k x71 } c x71 c } x71 c -0 x71 k *64 x71 L7 x71 r x71 R6 s2! s2x sh- x71 T7 x71 x21 x71 [ x41 x71 x41 [ sh- x72 } x72 x72 [ x72 +1 x72 *13 x72 +2 x72 +2 T6 x72 -5 x72 +8 x72 c x72 D1 x72 [ l x72 l [ x72 R7 sa1 x72 T2 x72 T6 +2 x72 x31 x72 x42 x73 [ x73 x73 D8 x73 l x73 L1 x73 R4 x73 R6 x73 R8 s23 x73 T6 x73 u x73 x51 x74 x74 +1 [ x74 c x74 c x74 D2 x74 l x74 T1 x75 x75 T0 x76 +7 x81 x81 -1 x81 *34 x81 -6 x81 -8 x81 -9 x81 *91 x81 -A x81 D1 x81 l x25 x81 r x81 R8 s21 seo sry x81 T3 x81 T4 x81 T5 x81 x12 x81 x25 x81 x25 l x81 x42 x82 x82 -0 x82 -1 x82 +1 x82 -3 x82 *86 x82 -9 x82 *94 '9 x82 *96 x82 *98 x82 'A x82 c x82 D5 x82 l x82 L1 x82 R7 s45 x82 T7 x82 u x82 x32 x83 x83 *57 x83 c x83 D9 x83 l x83 L8 x83 x12 x83 x42 x83 x51 x84 -7 x84 +7 x84 *78 x84 -8 x84 l x85 D0 x85 x43 x91 x91 +6 x91 R8 x91 R9 s92 x91 x24 x91 x51 x91 x51 'A x92 { x92 x92 +7 x92 -8 x92 -9 x92 *98 x92 +A x92 c x71 x92 D0 x92 u x92 x21 x92 x71 c x93 -7 x93 c x93 C x93 D6 x93 l x93 L9 x93 x41 x93 x62 xA1 +7 xA1 -9 xA1 +A xA1 D8 xA1 x04 xA1 x15 xA1 x21 xA2 [ xA2 *97 princeprocessor-0.22/rules/prince_optimized.rule000066400000000000000000000305721331736521300222570ustar00rootroot00000000000000## Name: prince.rule ## Version: 1.00 ## Compatibility: hashcat-legacy v0.48+, hashcat v2.00+ ## ## Description: ## ## Handwritten ruleset, documented, optimized rule for use with princeprocessor ## This rule can be used as amplifier in case you're attacking a fast hash : ## Global cases l u c C t E ## Reverse the entire word, Duplicate entire word, Duplicate word reversed r d f ## Duplicate every character, multiple times q qq qqq ## Swaps first two characters, Swaps last two characters, both k K kK ## Deletes character at position N, up to length 15 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE ## Truncate word at position N, positions 8 - 15 '9 'A 'B 'C 'D 'E ## Duplicates first character N times, up to 6 times z1 z2 z3 z4 z5 z6 ## Duplicates last character N times, up to 6 times Z1 Z2 Z3 Z4 Z5 Z6 ## Duplicates first N characters, up to 6 times y1 y2 y3 y4 y5 y6 ## Duplicates last N characters, up to 6 times Y1 Y2 Y3 Y4 Y5 Y6 ## Deletes first character, Deletes last character, both combined (remove mutations) [ [ [ [ [ [ ] ] ] ] ] ] [ ] [ ] [ ] [ ] [ ] [ ] ## Deletes first character, Deletes last character, both combined (remove mutations), Capitalize word [ c [ [ c [ [ [ c ] c ] ] c ] ] ] c [ ] c [ ] [ ] c [ ] [ ] [ ] c ## Deletes first character, Deletes last character, both combined (remove mutations), Uppercase word [ u [ [ u [ [ [ u ] u ] ] u ] ] ] u [ ] u [ ] [ ] u [ ] [ ] [ ] u ## Rotates the word left and right { { { { { { } } } } } } ## Rotates the word left and right, Capitalize word { c { { c { { { c } c } } c } } } c ## Rotates the word left and right, Uppercase word [ u [ [ u [ [ [ u ] u ] ] u ] ] ] u [ ] u [ ] [ ] u [ ] [ ] [ ] u ## Increment character @ N by 1 ascii value, one char, up to length 15 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E ## Increment character @ N by 1 ascii value, two chars, up to length 15 +0 +1 +0 +2 +0 +3 +0 +4 +0 +5 +0 +6 +0 +7 +0 +8 +0 +9 +0 +A +0 +B +0 +C +0 +D +0 +E +1 +2 +1 +3 +1 +4 +1 +5 +1 +6 +1 +7 +1 +8 +1 +9 +1 +A +1 +B +1 +C +1 +D +1 +E +2 +3 +2 +4 +2 +5 +2 +6 +2 +7 +2 +8 +2 +9 +2 +A +2 +B +2 +C +2 +D +2 +E +3 +4 +3 +5 +3 +6 +3 +7 +3 +8 +3 +9 +3 +A +3 +B +3 +C +3 +D +3 +E +4 +5 +4 +6 +4 +7 +4 +8 +4 +9 +4 +A +4 +B +4 +C +4 +D +4 +E +5 +6 +5 +7 +5 +8 +5 +9 +5 +A +5 +B +5 +C +5 +D +5 +E +6 +7 +6 +8 +6 +9 +6 +A +6 +B +6 +C +6 +D +6 +E +7 +8 +7 +9 +7 +A +7 +B +7 +C +7 +D +7 +E +8 +9 +8 +A +8 +B +8 +C +8 +D +8 +E +9 +A +9 +B +9 +C +9 +D +9 +E +A +B +A +C +A +D +A +E +B +C +B +D +B +E +C +D +C +E +D +E ## Decrement character @ N by 1 ascii value, one char, up to length 15 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E ## Decrement character @ N by 1 ascii value, two chars, up to length 15 -0 -1 -0 -2 -0 -3 -0 -4 -0 -5 -0 -6 -0 -7 -0 -8 -0 -9 -0 -A -0 -B -0 -C -0 -D -0 -E -1 -2 -1 -3 -1 -4 -1 -5 -1 -6 -1 -7 -1 -8 -1 -9 -1 -A -1 -B -1 -C -1 -D -1 -E -2 -3 -2 -4 -2 -5 -2 -6 -2 -7 -2 -8 -2 -9 -2 -A -2 -B -2 -C -2 -D -2 -E -3 -4 -3 -5 -3 -6 -3 -7 -3 -8 -3 -9 -3 -A -3 -B -3 -C -3 -D -3 -E -4 -5 -4 -6 -4 -7 -4 -8 -4 -9 -4 -A -4 -B -4 -C -4 -D -4 -E -5 -6 -5 -7 -5 -8 -5 -9 -5 -A -5 -B -5 -C -5 -D -5 -E -6 -7 -6 -8 -6 -9 -6 -A -6 -B -6 -C -6 -D -6 -E -7 -8 -7 -9 -7 -A -7 -B -7 -C -7 -D -7 -E -8 -9 -8 -A -8 -B -8 -C -8 -D -8 -E -9 -A -9 -B -9 -C -9 -D -9 -E -A -B -A -C -A -D -A -E -B -C -B -D -B -E -C -D -C -E -D -E ## Swaps character X with Y, one char, up to length 15 *01 *02 *03 *04 *05 *06 *07 *08 *09 *0A *0B *0C *0D *0E *12 *13 *14 *15 *16 *17 *18 *19 *1A *1B *1C *1D *1E *23 *24 *25 *26 *27 *28 *29 *2A *2B *2C *2D *2E *34 *35 *36 *37 *38 *39 *3A *3B *3C *3D *3E *45 *46 *47 *48 *49 *4A *4B *4C *4D *4E *56 *57 *58 *59 *5A *5B *5C *5D *5E *67 *68 *69 *6A *6B *6C *6D *6E *78 *79 *7A *7B *7C *7D *7E *89 *8A *8B *8C *8D *8E *9A *9B *9C *9D *9E *AB *AC *AD *AE *BC *BD *BE *CD *CE *DE ## Replace all instances of X with Y (most common leetspeak chars) se3 so0 si1 si! sa@ se3 so0 se3 si1 se3 si! se3 sa@ so0 si1 so0 si! so0 sa@ si1 sa@ si! sa@ se3 so0 si1 se3 so0 si! se3 so0 sa@ se3 si1 sa@ se3 si! sa@ so0 si1 sa@ so0 si! sa@ ## Replace all instances of X with Y (less common leetspeak chars) sl1 slk sa4 ss2 ss5 se6 sun ## Replace all instances of X with Y, toggle the case of characters at position N se3 T0 se3 T1 se3 T2 se3 T3 se3 T4 se3 T5 se3 T6 se3 T7 se3 T8 se3 T9 se3 TA se3 TB se3 TC se3 TD se3 TE so0 T0 so0 T1 so0 T2 so0 T3 so0 T4 so0 T5 so0 T6 so0 T7 so0 T8 so0 T9 so0 TA so0 TB so0 TC so0 TD so0 TE si1 T0 si1 T1 si1 T2 si1 T3 si1 T4 si1 T5 si1 T6 si1 T7 si1 T8 si1 T9 si1 TA si1 TB si1 TC si1 TD si1 TE si! T0 si! T1 si! T2 si! T3 si! T4 si! T5 si! T6 si! T7 si! T8 si! T9 si! TA si! TB si! TC si! TD si! TE sa@ T0 sa@ T1 sa@ T2 sa@ T3 sa@ T4 sa@ T5 sa@ T6 sa@ T7 sa@ T8 sa@ T9 sa@ TA sa@ TB sa@ TC sa@ TD sa@ TE se3 so0 T0 se3 so0 T1 se3 so0 T2 se3 so0 T3 se3 so0 T4 se3 so0 T5 se3 so0 T6 se3 so0 T7 se3 so0 T8 se3 so0 T9 se3 so0 TA se3 so0 TB se3 so0 TC se3 so0 TD se3 so0 TE se3 si1 T0 se3 si1 T1 se3 si1 T2 se3 si1 T3 se3 si1 T4 se3 si1 T5 se3 si1 T6 se3 si1 T7 se3 si1 T8 se3 si1 T9 se3 si1 TA se3 si1 TB se3 si1 TC se3 si1 TD se3 si1 TE se3 si! T0 se3 si! T1 se3 si! T2 se3 si! T3 se3 si! T4 se3 si! T5 se3 si! T6 se3 si! T7 se3 si! T8 se3 si! T9 se3 si! TA se3 si! TB se3 si! TC se3 si! TD se3 si! TE se3 sa@ T0 se3 sa@ T1 se3 sa@ T2 se3 sa@ T3 se3 sa@ T4 se3 sa@ T5 se3 sa@ T6 se3 sa@ T7 se3 sa@ T8 se3 sa@ T9 se3 sa@ TA se3 sa@ TB se3 sa@ TC se3 sa@ TD se3 sa@ TE so0 si1 T0 so0 si1 T1 so0 si1 T2 so0 si1 T3 so0 si1 T4 so0 si1 T5 so0 si1 T6 so0 si1 T7 so0 si1 T8 so0 si1 T9 so0 si1 TA so0 si1 TB so0 si1 TC so0 si1 TD so0 si1 TE so0 si! T0 so0 si! T1 so0 si! T2 so0 si! T3 so0 si! T4 so0 si! T5 so0 si! T6 so0 si! T7 so0 si! T8 so0 si! T9 so0 si! TA so0 si! TB so0 si! TC so0 si! TD so0 si! TE so0 sa@ T0 so0 sa@ T1 so0 sa@ T2 so0 sa@ T3 so0 sa@ T4 so0 sa@ T5 so0 sa@ T6 so0 sa@ T7 so0 sa@ T8 so0 sa@ T9 so0 sa@ TA so0 sa@ TB so0 sa@ TC so0 sa@ TD so0 sa@ TE si1 sa@ T0 si1 sa@ T1 si1 sa@ T2 si1 sa@ T3 si1 sa@ T4 si1 sa@ T5 si1 sa@ T6 si1 sa@ T7 si1 sa@ T8 si1 sa@ T9 si1 sa@ TA si1 sa@ TB si1 sa@ TC si1 sa@ TD si1 sa@ TE si! sa@ T0 si! sa@ T1 si! sa@ T2 si! sa@ T3 si! sa@ T4 si! sa@ T5 si! sa@ T6 si! sa@ T7 si! sa@ T8 si! sa@ T9 si! sa@ TA si! sa@ TB si! sa@ TC si! sa@ TD si! sa@ TE se3 so0 si1 T0 se3 so0 si1 T1 se3 so0 si1 T2 se3 so0 si1 T3 se3 so0 si1 T4 se3 so0 si1 T5 se3 so0 si1 T6 se3 so0 si1 T7 se3 so0 si1 T8 se3 so0 si1 T9 se3 so0 si1 TA se3 so0 si1 TB se3 so0 si1 TC se3 so0 si1 TD se3 so0 si1 TE se3 so0 si! T0 se3 so0 si! T1 se3 so0 si! T2 se3 so0 si! T3 se3 so0 si! T4 se3 so0 si! T5 se3 so0 si! T6 se3 so0 si! T7 se3 so0 si! T8 se3 so0 si! T9 se3 so0 si! TA se3 so0 si! TB se3 so0 si! TC se3 so0 si! TD se3 so0 si! TE se3 so0 sa@ T0 se3 so0 sa@ T1 se3 so0 sa@ T2 se3 so0 sa@ T3 se3 so0 sa@ T4 se3 so0 sa@ T5 se3 so0 sa@ T6 se3 so0 sa@ T7 se3 so0 sa@ T8 se3 so0 sa@ T9 se3 so0 sa@ TA se3 so0 sa@ TB se3 so0 sa@ TC se3 so0 sa@ TD se3 so0 sa@ TE se3 si1 sa@ T0 se3 si1 sa@ T1 se3 si1 sa@ T2 se3 si1 sa@ T3 se3 si1 sa@ T4 se3 si1 sa@ T5 se3 si1 sa@ T6 se3 si1 sa@ T7 se3 si1 sa@ T8 se3 si1 sa@ T9 se3 si1 sa@ TA se3 si1 sa@ TB se3 si1 sa@ TC se3 si1 sa@ TD se3 si1 sa@ TE se3 si! sa@ T0 se3 si! sa@ T1 se3 si! sa@ T2 se3 si! sa@ T3 se3 si! sa@ T4 se3 si! sa@ T5 se3 si! sa@ T6 se3 si! sa@ T7 se3 si! sa@ T8 se3 si! sa@ T9 se3 si! sa@ TA se3 si! sa@ TB se3 si! sa@ TC se3 si! sa@ TD se3 si! sa@ TE so0 si1 sa@ T0 so0 si1 sa@ T1 so0 si1 sa@ T2 so0 si1 sa@ T3 so0 si1 sa@ T4 so0 si1 sa@ T5 so0 si1 sa@ T6 so0 si1 sa@ T7 so0 si1 sa@ T8 so0 si1 sa@ T9 so0 si1 sa@ TA so0 si1 sa@ TB so0 si1 sa@ TC so0 si1 sa@ TD so0 si1 sa@ TE so0 si! sa@ T0 so0 si! sa@ T1 so0 si! sa@ T2 so0 si! sa@ T3 so0 si! sa@ T4 so0 si! sa@ T5 so0 si! sa@ T6 so0 si! sa@ T7 so0 si! sa@ T8 so0 si! sa@ T9 so0 si! sa@ TA so0 si! sa@ TB so0 si! sa@ TC so0 si! sa@ TD so0 si! sa@ TE ## Toggle the case of characters at position N, one char, up to position 15 T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 TA TB TC TD TE ## Toggle the case of characters at position N, two chars, up to position 15 T0 T1 T0 T2 T0 T3 T0 T4 T0 T5 T0 T6 T0 T7 T0 T8 T0 T9 T0 TA T0 TB T0 TC T0 TD T0 TE T1 T2 T1 T3 T1 T4 T1 T5 T1 T6 T1 T7 T1 T8 T1 T9 T1 TA T1 TB T1 TC T1 TD T1 TE T2 T3 T2 T4 T2 T5 T2 T6 T2 T7 T2 T8 T2 T9 T2 TA T2 TB T2 TC T2 TD T2 TE T3 T4 T3 T5 T3 T6 T3 T7 T3 T8 T3 T9 T3 TA T3 TB T3 TC T3 TD T3 TE T4 T5 T4 T6 T4 T7 T4 T8 T4 T9 T4 TA T4 TB T4 TC T4 TD T4 TE T5 T6 T5 T7 T5 T8 T5 T9 T5 TA T5 TB T5 TC T5 TD T5 TE T6 T7 T6 T8 T6 T9 T6 TA T6 TB T6 TC T6 TD T6 TE T7 T8 T7 T9 T7 TA T7 TB T7 TC T7 TD T7 TE T8 T9 T8 TA T8 TB T8 TC T8 TD T8 TE T9 TA T9 TB T9 TC T9 TD T9 TE TA TB TA TC TA TD TA TE TB TC TB TD TB TE TC TD TC TE TD TE ## Inserts character X at position N (passphrase maker), one char, up to length 15 i0 : i1 : i2 : i3 : i4 : i5 : i6 : i7 : i8 : i9 : iA : iB : iC : iD : iE : ## Inserts character X at position N (passphrase maker), two chars, up to length 15 i0 i1 : i0 i2 : i0 i3 : i0 i4 : i0 i5 : i0 i6 : i0 i7 : i0 i8 : i0 i9 : i0 iA : i0 iB : i0 iC : i0 iD : i0 iE : i1 i2 : i1 i3 : i1 i4 : i1 i5 : i1 i6 : i1 i7 : i1 i8 : i1 i9 : i1 iA : i1 iB : i1 iC : i1 iD : i1 iE : i2 i3 : i2 i4 : i2 i5 : i2 i6 : i2 i7 : i2 i8 : i2 i9 : i2 iA : i2 iB : i2 iC : i2 iD : i2 iE : i3 i4 : i3 i5 : i3 i6 : i3 i7 : i3 i8 : i3 i9 : i3 iA : i3 iB : i3 iC : i3 iD : i3 iE : i4 i5 : i4 i6 : i4 i7 : i4 i8 : i4 i9 : i4 iA : i4 iB : i4 iC : i4 iD : i4 iE : i5 i6 : i5 i7 : i5 i8 : i5 i9 : i5 iA : i5 iB : i5 iC : i5 iD : i5 iE : i6 i7 : i6 i8 : i6 i9 : i6 iA : i6 iB : i6 iC : i6 iD : i6 iE : i7 i8 : i7 i9 : i7 iA : i7 iB : i7 iC : i7 iD : i7 iE : i8 i9 : i8 iA : i8 iB : i8 iC : i8 iD : i8 iE : i9 iA : i9 iB : i9 iC : i9 iD : i9 iE : iA iB : iA iC : iA iD : iA iE : iB iC : iB iD : iB iE : iC iD : iC iE : iD iE : ## Inserts character X at position N (passphrase maker), one char, up to length 15 i0- : i1- : i2- : i3- : i4- : i5- : i6- : i7- : i8- : i9- : iA- : iB- : iC- : iD- : iE- : ## Inserts character X at position N (passphrase maker), two chars, up to length 15 i0- i1- : i0- i2- : i0- i3- : i0- i4- : i0- i5- : i0- i6- : i0- i7- : i0- i8- : i0- i9- : i0- iA- : i0- iB- : i0- iC- : i0- iD- : i0- iE- : i1- i2- : i1- i3- : i1- i4- : i1- i5- : i1- i6- : i1- i7- : i1- i8- : i1- i9- : i1- iA- : i1- iB- : i1- iC- : i1- iD- : i1- iE- : i2- i3- : i2- i4- : i2- i5- : i2- i6- : i2- i7- : i2- i8- : i2- i9- : i2- iA- : i2- iB- : i2- iC- : i2- iD- : i2- iE- : i3- i4- : i3- i5- : i3- i6- : i3- i7- : i3- i8- : i3- i9- : i3- iA- : i3- iB- : i3- iC- : i3- iD- : i3- iE- : i4- i5- : i4- i6- : i4- i7- : i4- i8- : i4- i9- : i4- iA- : i4- iB- : i4- iC- : i4- iD- : i4- iE- : i5- i6- : i5- i7- : i5- i8- : i5- i9- : i5- iA- : i5- iB- : i5- iC- : i5- iD- : i5- iE- : i6- i7- : i6- i8- : i6- i9- : i6- iA- : i6- iB- : i6- iC- : i6- iD- : i6- iE- : i7- i8- : i7- i9- : i7- iA- : i7- iB- : i7- iC- : i7- iD- : i7- iE- : i8- i9- : i8- iA- : i8- iB- : i8- iC- : i8- iD- : i8- iE- : i9- iA- : i9- iB- : i9- iC- : i9- iD- : i9- iE- : iA- iB- : iA- iC- : iA- iD- : iA- iE- : iB- iC- : iB- iD- : iB- iE- : iC- iD- : iC- iE- : iD- iE- : princeprocessor-0.22/src/000077500000000000000000000000001331736521300154505ustar00rootroot00000000000000princeprocessor-0.22/src/Makefile000066400000000000000000000022711331736521300171120ustar00rootroot00000000000000## ## Makefile for pp ## CFLAGS = -W -Wall -std=c99 -O2 -s #CFLAGS = -W -Wall -std=c99 -g CC_LINUX32 = gcc CC_LINUX64 = gcc CC_WINDOWS32 = /usr/bin/i686-w64-mingw32-gcc CC_WINDOWS64 = /usr/bin/x86_64-w64-mingw32-gcc CC_OSX32 = /usr/bin/i686-apple-darwin10-gcc CC_OSX64 = /usr/bin/i686-apple-darwin10-gcc CFLAGS_LINUX32 = $(CFLAGS) -m32 -DLINUX CFLAGS_LINUX64 = $(CFLAGS) -m64 -DLINUX CFLAGS_WINDOWS32 = $(CFLAGS) -m32 -DWINDOWS CFLAGS_WINDOWS64 = $(CFLAGS) -m64 -DWINDOWS CFLAGS_OSX32 = $(CFLAGS) -m32 -DOSX CFLAGS_OSX64 = $(CFLAGS) -m64 -DOSX all: pp64.bin pp32: pp32.bin pp32.exe pp32.app pp64: pp64.bin pp64.exe pp64.app clean: rm -f pp32.bin pp64.bin pp32.exe pp64.exe pp32.app pp64.app pp32.bin: pp.c mpz_int128.h $(CC_LINUX32) $(CFLAGS_LINUX32) -o $@ $^ pp64.bin: pp.c mpz_int128.h $(CC_LINUX64) $(CFLAGS_LINUX64) -o $@ $^ pp32.exe: pp.c mpz_int128.h $(CC_WINDOWS32) $(CFLAGS_WINDOWS32) -o $@ $^ pp64.exe: pp.c mpz_int128.h $(CC_WINDOWS64) $(CFLAGS_WINDOWS64) -o $@ $^ pp32.app: pp.c mpz_int128.h $(CC_OSX32) $(CFLAGS_OSX32) -o $@ $^ pp64.app: pp.c mpz_int128.h $(CC_OSX64) $(CFLAGS_OSX64) -o $@ $^ princeprocessor-0.22/src/mpz_int128.h000066400000000000000000000110631331736521300175350ustar00rootroot00000000000000/* * Mimic integer (mpz) part of GMP using int128 macros, for speed. * * This software is Copyright (c) 2015 magnum * and is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * WARNING: Currently only functions needed for princeprocessor are * implemented, and some behavior differs from GMP (eg. return of * mpz_fdiv_q_ui() should return remainder but that's not currently used * by princeprocessor). * * WARNING 2: These functions are saturating. mul, add and sub will not roll * over but stick to ceiling or floor. * * WARNING 3: This is a hack. If using this somewhere else without verifying * functionality against real GMP, you may get totally unexpected behavior. * You have been warned. */ #include #include #include #include #include #ifdef __SIZEOF_INT128__ typedef __int128 int128_t; typedef unsigned __int128 uint128_t; #else typedef __int128_t int128_t; typedef __uint128_t uint128_t; #endif #define UINT128_MAX ((uint128_t)-1) typedef uint128_t mpz_t; #define FAKE_GMP 128 #define mpz_init(x) x = 0 #define mpz_init_set(x, y) x = y #define mpz_init_set_ui mpz_init_set #define mpz_init_set_si mpz_init_set #define mpz_clear(x) x = 0 #define mpz_set(rop, op) rop = op #define mpz_set_ui(rop, op) rop = (op) #define mpz_set_si mpz_set_ui #define mpz_cmp(op1, op2) ((op1 > op2) ? 1 : (op1 < op2) ? -1 : 0) #define mpz_cmp_ui(op1, op2) ((op1 > (op2)) ? 1 : (op1 < (op2)) ? -1 : 0) #define mpz_cmp_si(op1, op2) (op1 - (op2)) #define mpz_add(rop, op1, op2) do { rop = op1 + op2; if (rop < op2) rop = UINT128_MAX; } while (0) #define mpz_add_ui(rop, op1, op2) do { rop = op1 + (op2); if (rop < (op2)) rop = UINT128_MAX; } while (0) #define mpz_sub(rop, op1, op2) do { mpz_t temp = op1; rop = op1 - op2; if (rop > temp) rop = 0; } while (0) #define mpz_sub_ui(rop, op1, op2) do { mpz_t temp = op1; rop = op1 - (op2); if (rop > temp) rop = 0; } while (0) #define mpz_mul(rop, op1, op2) do { rop = op1 * op2; if (rop < op2) rop = UINT128_MAX; } while (0) #define mpz_mul_ui(rop, op1, op2) do { rop = op1 * (op2); if (rop < (op2)) rop = UINT128_MAX; } while (0) #define mpz_mul_2exp(rop, op1, op2) rop = op1 << (op2) #define mpz_div_ui(q, n, d) q = (n) / (d) #define mpz_fdiv_ui(n, d) ((n) % (d)) #define mpz_fdiv_r_2exp(q, n, d) q = n & (((uint128_t)1 << (d)) - 1) #define mpz_fdiv_q_2exp(q, n, d) q = n >> (d) #define mpz_get_ui(op) op #if 1 #define mpz_fdiv_q_ui(q, n, d) q = (n) / (d) #else #define mpz_fdiv_q_ui(q, n, d) _mpz_fdiv_q_ui(&q, n, d) static inline int _mpz_fdiv_q_ui(mpz_t *q, mpz_t n, mpz_t d) { *q = n / d; return n % d; } #endif /* Fugly but short :-P and only supports base 10 right now */ #define mpz_get_str(ptr, base, op) \ do { \ if (!op) \ strcpy(ptr, "0"); \ else \ _int128tostr(op, base, ptr); \ } while (0) static inline int _int128tostr(uint128_t op, int base, char *ptr) { char *orig = ptr; if (op == 0) return 0; if (base != 10) { fprintf(stderr, "%s(): base %d not implemented\n", __FUNCTION__, base); exit (EXIT_FAILURE); } ptr += _int128tostr(op / base, base, ptr); *ptr++ = op % base + '0'; *ptr = 0; return ptr - orig; } #define mpz_set_str(rop, str, base) _mpz_set_str(&rop, str, base) static inline int _mpz_set_str(mpz_t *rop, char *str, int base) { int num; if (!strncasecmp(str, "0x", 2)) { if (base == 0) base = 16; if (base == 16) str += 2; } else if (base == 0 && str[0] != '0') base = 10; if (base != 10 && base != 16) { fprintf(stderr, "%s(): base %d not implemented\n", __FUNCTION__, base); exit (EXIT_FAILURE); } *rop = 0; while ((num = *str++)) { if (num == ' ' || num == '\t') continue; *rop *= base; num |= 0x20; if (base == 16 && (num >= 'a' && num <= 'f')) num -= 'a' - 10; else if (num >= '0' && num <= '9') num -= '0'; else return -1; *rop += num; } return 0; } /* This is slow and can't print '0'... but it's simple :-P */ static inline void print128(mpz_t op, FILE *stream) { if (op == 0) { return; } print128(op / 10, stream); fputc(op % 10 + '0', stream); } static inline size_t mpz_out_str(FILE *stream, int base, mpz_t op) { if (base != 10) { fprintf(stderr, "%s(): base %d not implemented\n", __FUNCTION__, base); exit (EXIT_FAILURE); } if (op == 0) fputc('0', stream); else print128(op, stream); /* The GMP function returns number of characters written */ return 1; } princeprocessor-0.22/src/pp.c000066400000000000000000001042271331736521300162410ustar00rootroot00000000000000#define _GNU_SOURCE #define _FILE_OFFSET_BITS 64 #define __USE_MINGW_ANSI_STDIO 1 #include #include #include #include #include #include #include #include #include #include #include "mpz_int128.h" /** * Name........: princeprocessor (pp) * Description.: Standalone password candidate generator using the PRINCE algorithm * Version.....: 0.22 * Authors.....: Jens Steube * Steve Thomas (Sc00bz) * magnum * License.....: MIT */ #define IN_LEN_MIN 1 #define IN_LEN_MAX 32 #define OUT_LEN_MAX 32 /* Limited by (u32)(1 << pw_len - 1) */ #define PW_MIN 1 #define PW_MAX 16 #define ELEM_CNT_MIN 1 #define ELEM_CNT_MAX 8 #define WL_DIST_LEN 0 #define WL_MAX 10000000 #define CASE_PERMUTE 0 #define DUPE_CHECK 1 #define SAVE_POS 1 #define SAVE_FILE "pp.save" #define VERSION_BIN 22 #define ALLOC_NEW_ELEMS 0x40000 #define ALLOC_NEW_CHAINS 0x10 #define ALLOC_NEW_DUPES 0x100000 #define ENTRY_END_HASH 0xFFFFFFFF #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; typedef uint64_t u64; typedef struct { int len; u64 cnt; } pw_order_t; typedef struct { u8 *buf; } elem_t; typedef struct { u8 *buf; int cnt; mpz_t ks_cnt; mpz_t ks_pos; } chain_t; typedef struct { u32 next; char *element; } uniq_data_t; typedef struct { u32 index; u32 alloc; u32 *hash; u32 hash_mask; uniq_data_t *data; } uniq_t; typedef struct { elem_t *elems_buf; u64 elems_cnt; u64 elems_alloc; chain_t *chains_buf; int chains_cnt; int chains_pos; int chains_alloc; u64 cur_chain_ks_poses[OUT_LEN_MAX]; uniq_t *uniq; } db_entry_t; typedef struct { FILE *fp; char buf[BUFSIZ]; int len; } out_t; /** * Default word-length distribution, calculated out of first 1,000,000 entries of rockyou.txt */ #define DEF_WORDLEN_DIST_CNT 25 static u64 DEF_WORDLEN_DIST[DEF_WORDLEN_DIST_CNT] = { 0, 15, 56, 350, 3315, 43721, 276252, 201748, 226412, 119885, 75075, 26323, 13373, 6353, 3540, 1877, 972, 311, 151, 81, 66, 21, 16, 13, 13 }; /* Losely based on rockyou-with-dupes */ static const u32 DEF_HASH_LOG_SIZE[33] = { 0, 8, 12, 16, 20, 24, 24, 24, 24, 24, 24, 23, 22, 21, 20, 19, 18, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; static const char *USAGE_MINI[] = { "Usage: %s [options] [<] wordlist", "", "Try --help for more help.", NULL }; static const char *USAGE_BIG[] = { "Usage: %s [options] [<] wordlist", "", "* Startup:", "", " -V, --version Print version", " -h, --help Print help", "", "* Misc:", "", " --keyspace Calculate number of combinations", "", "* Optimization:", "", " --pw-min=NUM Print candidate if length is greater than NUM", " --pw-max=NUM Print candidate if length is smaller than NUM", " --elem-cnt-min=NUM Minimum number of elements per chain", " --elem-cnt-max=NUM Maximum number of elements per chain", " --wl-dist-len Calculate output length distribution from wordlist", " --wl-max=NUM Load only NUM words from input wordlist or use 0 to disable", " -c, --dupe-check-disable Disable dupes check for faster initial load", " --save-pos-disable Save the position for later resume with -s", "", "* Resources:", "", " -s, --skip=NUM Skip NUM passwords from start (for distributed)", " -l, --limit=NUM Limit output to NUM passwords (for distributed)", "", "* Files:", "", " -o, --output-file=FILE Output-file", "", "* Amplifier:", "", " --case-permute For each word in the wordlist that begins with a letter", " generate a word with the opposite case of the first letter", "", NULL }; static void *mem_alloc (const size_t size) { void *res = malloc (size); if (res == NULL) { fprintf (stderr, "malloc: %s\n", strerror (ENOMEM)); exit (-1); } return res; } static void *malloc_tiny (const size_t size) { #ifdef DEBUG #define MEM_ALLOC_SIZE 0 /* It's hard to debug BOF with tiny alloc */ #else #define MEM_ALLOC_SIZE 0x10000 #endif if (size > MEM_ALLOC_SIZE) { // we can't handle it here return mem_alloc (size); } static char *buffer = NULL; static size_t bufree = 0; if (size > bufree) { buffer = mem_alloc (MEM_ALLOC_SIZE); bufree = MEM_ALLOC_SIZE; } char *p = buffer; buffer += size; bufree -= size; return p; } static void usage_mini_print (const char *progname) { int i; for (i = 0; USAGE_MINI[i] != NULL; i++) { printf (USAGE_MINI[i], progname); #ifdef OSX putchar ('\n'); #endif #ifdef LINUX putchar ('\n'); #endif #ifdef WINDOWS putchar ('\r'); putchar ('\n'); #endif } } static void usage_big_print (const char *progname) { int i; for (i = 0; USAGE_BIG[i] != NULL; i++) { printf (USAGE_BIG[i], progname); #ifdef OSX putchar ('\n'); #endif #ifdef LINUX putchar ('\n'); #endif #ifdef WINDOWS putchar ('\r'); putchar ('\n'); #endif } } static void check_realloc_elems (db_entry_t *db_entry) { if (db_entry->elems_cnt == db_entry->elems_alloc) { const u64 elems_alloc = db_entry->elems_alloc; const u64 elems_alloc_new = elems_alloc + ALLOC_NEW_ELEMS; db_entry->elems_buf = (elem_t *) realloc (db_entry->elems_buf, elems_alloc_new * sizeof (elem_t)); if (db_entry->elems_buf == NULL) { fprintf (stderr, "Out of memory trying to allocate %zu bytes\n", (size_t) elems_alloc_new * sizeof (elem_t)); exit (-1); } memset (&db_entry->elems_buf[elems_alloc], 0, ALLOC_NEW_ELEMS * sizeof (elem_t)); db_entry->elems_alloc = elems_alloc_new; } } static void check_realloc_chains (db_entry_t *db_entry) { if (db_entry->chains_cnt == db_entry->chains_alloc) { const u64 chains_alloc = db_entry->chains_alloc; const u64 chains_alloc_new = chains_alloc + ALLOC_NEW_CHAINS; db_entry->chains_buf = (chain_t *) realloc (db_entry->chains_buf, chains_alloc_new * sizeof (chain_t)); if (db_entry->chains_buf == NULL) { fprintf (stderr, "Out of memory trying to allocate %zu bytes\n", (size_t) chains_alloc_new * sizeof (chain_t)); exit (-1); } memset (&db_entry->chains_buf[chains_alloc], 0, ALLOC_NEW_CHAINS * sizeof (chain_t)); db_entry->chains_alloc = chains_alloc_new; } } static int in_superchop (char *buf) { int len = strlen (buf); while (len) { if (buf[len - 1] == '\n') { len--; continue; } if (buf[len - 1] == '\r') { len--; continue; } break; } buf[len] = 0; return len; } static void out_flush (out_t *out) { const size_t n = fwrite (out->buf, 1, out->len, out->fp); if (n != (size_t) out->len) { const int err = ferror (out->fp); if (err == EPIPE) { // out->fp is probably closed exit (0); } exit (-1); } out->len = 0; } static void out_push (out_t *out, const char *pw_buf, const int pw_len) { memcpy (out->buf + out->len, pw_buf, pw_len); out->len += pw_len; if (out->len >= BUFSIZ - 100) { out_flush (out); } } static int sort_by_cnt (const void *p1, const void *p2) { const pw_order_t *o1 = (const pw_order_t *) p1; const pw_order_t *o2 = (const pw_order_t *) p2; // Descending order if (o1->cnt > o2->cnt) return -1; if (o1->cnt < o2->cnt) return 1; return 0; } static int sort_by_ks (const void *p1, const void *p2) { const chain_t *f1 = (const chain_t *) p1; const chain_t *f2 = (const chain_t *) p2; return mpz_cmp (f1->ks_cnt, f2->ks_cnt); } static int chain_valid_with_db (const chain_t *chain_buf, const db_entry_t *db_entries) { const u8 *buf = chain_buf->buf; const int cnt = chain_buf->cnt; for (int idx = 0; idx < cnt; idx++) { const u8 db_key = buf[idx]; const db_entry_t *db_entry = &db_entries[db_key]; if (db_entry->elems_cnt == 0) return 0; } return 1; } static int chain_valid_with_cnt_min (const chain_t *chain_buf, const int elem_cnt_min) { const int cnt = chain_buf->cnt; if (cnt < elem_cnt_min) return 0; return 1; } static int chain_valid_with_cnt_max (const chain_t *chain_buf, const int elem_cnt_max) { const int cnt = chain_buf->cnt; if (cnt > elem_cnt_max) return 0; return 1; } static void chain_ks (const chain_t *chain_buf, const db_entry_t *db_entries, mpz_t *ks_cnt) { const u8 *buf = chain_buf->buf; const int cnt = chain_buf->cnt; mpz_set_si (*ks_cnt, 1); for (int idx = 0; idx < cnt; idx++) { const u8 db_key = buf[idx]; const db_entry_t *db_entry = &db_entries[db_key]; const u64 elems_cnt = db_entry->elems_cnt; mpz_mul_ui (*ks_cnt, *ks_cnt, elems_cnt); } } static void set_chain_ks_poses (const chain_t *chain_buf, const db_entry_t *db_entries, mpz_t *tmp, u64 cur_chain_ks_poses[OUT_LEN_MAX]) { const u8 *buf = chain_buf->buf; const int cnt = chain_buf->cnt; for (int idx = 0; idx < cnt; idx++) { const u8 db_key = buf[idx]; const db_entry_t *db_entry = &db_entries[db_key]; const u64 elems_cnt = db_entry->elems_cnt; cur_chain_ks_poses[idx] = mpz_fdiv_ui (*tmp, elems_cnt); mpz_div_ui (*tmp, *tmp, elems_cnt); } } static void chain_set_pwbuf_init (const chain_t *chain_buf, const db_entry_t *db_entries, const u64 cur_chain_ks_poses[OUT_LEN_MAX], char *pw_buf) { const u8 *buf = chain_buf->buf; const u32 cnt = chain_buf->cnt; for (u32 idx = 0; idx < cnt; idx++) { const u8 db_key = buf[idx]; const db_entry_t *db_entry = &db_entries[db_key]; const u64 elems_idx = cur_chain_ks_poses[idx]; memcpy (pw_buf, db_entry->elems_buf[elems_idx].buf, db_key); pw_buf += db_key; } } static void chain_set_pwbuf_increment (const chain_t *chain_buf, const db_entry_t *db_entries, u64 cur_chain_ks_poses[OUT_LEN_MAX], char *pw_buf) { const u8 *buf = chain_buf->buf; const int cnt = chain_buf->cnt; for (int idx = 0; idx < cnt; idx++) { const u8 db_key = buf[idx]; const db_entry_t *db_entry = &db_entries[db_key]; const u64 elems_cnt = db_entry->elems_cnt; cur_chain_ks_poses[idx]++; const u64 elems_idx = cur_chain_ks_poses[idx]; if (elems_idx < elems_cnt) { memcpy (pw_buf, db_entry->elems_buf[elems_idx].buf, db_key); break; } cur_chain_ks_poses[idx] = 0; memcpy (pw_buf, db_entry->elems_buf[0].buf, db_key); pw_buf += db_key; } } static void chain_gen_with_idx (chain_t *chain_buf, const int len1, const int chains_idx) { chain_buf->cnt = 0; u8 db_key = 1; for (int chains_shr = 0; chains_shr < len1; chains_shr++) { if ((chains_idx >> chains_shr) & 1) { chain_buf->buf[chain_buf->cnt] = db_key; chain_buf->cnt++; db_key = 1; } else { db_key++; } } chain_buf->buf[chain_buf->cnt] = db_key; chain_buf->cnt++; } static char *add_elem (db_entry_t *db_entry, char *input_buf, int input_len) { check_realloc_elems (db_entry); elem_t *elem_buf = &db_entry->elems_buf[db_entry->elems_cnt]; elem_buf->buf = malloc_tiny (input_len); memcpy (elem_buf->buf, input_buf, input_len); db_entry->elems_cnt++; return (char *) elem_buf->buf; } static u32 input_hash (char *input_buf, int input_len, const int hash_mask) { u32 h = 0; for (int i = 0; i < input_len; i++) { h = (h * 33) + input_buf[i]; } return h & hash_mask; } static void add_uniq (db_entry_t *db_entry, char *input_buf, int input_len) { uniq_t *uniq = db_entry->uniq; const u32 h = input_hash (input_buf, input_len, uniq->hash_mask); u32 cur = uniq->hash[h]; u32 prev = cur; while (cur != ENTRY_END_HASH) { if (memcmp (input_buf, uniq->data[cur].element, input_len) == 0) return; prev = cur; cur = uniq->data[cur].next; } const u32 index = uniq->index; if (prev == ENTRY_END_HASH) { uniq->hash[h] = index; } else { uniq->data[prev].next = index; } if (index == uniq->alloc) { uniq->alloc += ALLOC_NEW_DUPES; uniq->data = realloc (uniq->data, uniq->alloc * sizeof (uniq_data_t)); } uniq->data[index].element = add_elem (db_entry, input_buf, input_len); uniq->data[index].next = ENTRY_END_HASH; uniq->index++; } mpz_t save; static void catch_int (int signum) { FILE *fp = fopen (SAVE_FILE, "w"); if (fp == NULL) fp = stderr; mpz_out_str (fp, 10, save); fprintf (fp, "\n"); fclose (fp); exit (signum==0?0:signum); } int main (int argc, char *argv[]) { mpz_t pw_ks_pos[OUT_LEN_MAX + 1]; mpz_t pw_ks_cnt[OUT_LEN_MAX + 1]; mpz_t iter_max; mpz_init_set_si (iter_max, 0); mpz_t total_ks_cnt; mpz_init_set_si (total_ks_cnt, 0); mpz_t total_ks_pos; mpz_init_set_si (total_ks_pos, 0); mpz_t total_ks_left; mpz_init_set_si (total_ks_left, 0); mpz_t skip; mpz_init_set_si (skip, 0); mpz_t limit; mpz_init_set_si (limit, 0); mpz_t tmp; mpz_init_set_si (tmp, 0); int version = 0; int usage = 0; int keyspace = 0; int pw_min = PW_MIN; int pw_max = PW_MAX; int elem_cnt_min = ELEM_CNT_MIN; int elem_cnt_max = ELEM_CNT_MAX; int wl_dist_len = WL_DIST_LEN; int wl_max = WL_MAX; int case_permute = CASE_PERMUTE; int dupe_check = DUPE_CHECK; int save_pos = SAVE_POS; char *output_file = NULL; #define IDX_VERSION 'V' #define IDX_USAGE 'h' #define IDX_PW_MIN 0x1000 #define IDX_PW_MAX 0x2000 #define IDX_ELEM_CNT_MIN 0x3000 #define IDX_ELEM_CNT_MAX 0x4000 #define IDX_KEYSPACE 0x5000 #define IDX_WL_DIST_LEN 0x6000 #define IDX_WL_MAX 0x7000 #define IDX_CASE_PERMUTE 0x8000 #define IDX_SAVE_POS_DISABLE 0x9000 #define IDX_DUPE_CHECK_DISABLE 'c' #define IDX_SKIP 's' #define IDX_LIMIT 'l' #define IDX_OUTPUT_FILE 'o' struct option long_options[] = { {"version", no_argument, 0, IDX_VERSION}, {"help", no_argument, 0, IDX_USAGE}, {"keyspace", no_argument, 0, IDX_KEYSPACE}, {"pw-min", required_argument, 0, IDX_PW_MIN}, {"pw-max", required_argument, 0, IDX_PW_MAX}, {"elem-cnt-min", required_argument, 0, IDX_ELEM_CNT_MIN}, {"elem-cnt-max", required_argument, 0, IDX_ELEM_CNT_MAX}, {"wl-dist-len", no_argument, 0, IDX_WL_DIST_LEN}, {"wl-max", required_argument, 0, IDX_WL_MAX}, {"case-permute", no_argument, 0, IDX_CASE_PERMUTE}, {"dupe-check-disable", no_argument, 0, IDX_DUPE_CHECK_DISABLE}, {"save-pos-disable", no_argument, 0, IDX_SAVE_POS_DISABLE}, {"skip", required_argument, 0, IDX_SKIP}, {"limit", required_argument, 0, IDX_LIMIT}, {"output-file", required_argument, 0, IDX_OUTPUT_FILE}, {0, 0, 0, 0} }; int elem_cnt_max_chgd = 0; int option_index = 0; int c; while ((c = getopt_long (argc, argv, "Vhs:l:o:c", long_options, &option_index)) != -1) { switch (c) { case IDX_VERSION: version = 1; break; case IDX_USAGE: usage = 1; break; case IDX_KEYSPACE: keyspace = 1; break; case IDX_PW_MIN: pw_min = atoi (optarg); break; case IDX_PW_MAX: pw_max = atoi (optarg); break; case IDX_ELEM_CNT_MIN: elem_cnt_min = atoi (optarg); break; case IDX_ELEM_CNT_MAX: elem_cnt_max = atoi (optarg); elem_cnt_max_chgd = 1; break; case IDX_WL_DIST_LEN: wl_dist_len = 1; break; case IDX_WL_MAX: wl_max = atoi (optarg); break; case IDX_CASE_PERMUTE: case_permute = 1; break; case IDX_DUPE_CHECK_DISABLE: dupe_check = 0; break; case IDX_SAVE_POS_DISABLE: save_pos = 0; break; case IDX_SKIP: mpz_set_str (skip, optarg, 10); break; case IDX_LIMIT: mpz_set_str (limit, optarg, 10); break; case IDX_OUTPUT_FILE: output_file = optarg; break; default: return (-1); } } if (elem_cnt_max_chgd == 0) { elem_cnt_max = MIN (pw_max, ELEM_CNT_MAX); } if (usage) { usage_big_print (argv[0]); return (-1); } if (version) { printf ("v%4.02f\n", (double) VERSION_BIN / 100); return (-1); } if ((optind != argc) && (optind + 1 != argc)) { usage_mini_print (argv[0]); return (-1); } char *wordlist = NULL; if (optind + 1 == argc) { wordlist = argv[optind]; } if (pw_min <= 0) { fprintf (stderr, "Value of --pw-min (%d) must be greater than %d\n", pw_min, 0); return (-1); } if (pw_max <= 0) { fprintf (stderr, "Value of --pw-max (%d) must be greater than %d\n", pw_max, 0); return (-1); } if (elem_cnt_min <= 0) { fprintf (stderr, "Value of --elem-cnt-min (%d) must be greater than %d\n", elem_cnt_min, 0); return (-1); } if (elem_cnt_max < (1 - pw_max)) { fprintf (stderr, "Value of --elem-cnt-max (%d) must be greater than %d\n", elem_cnt_max, (0 - pw_max)); return (-1); } if (pw_min > pw_max) { fprintf (stderr, "Value of --pw-min (%d) must be smaller or equal than value of --pw-max (%d)\n", pw_min, pw_max); return (-1); } if (elem_cnt_max > 0 && elem_cnt_min > elem_cnt_max) { fprintf (stderr, "Value of --elem-cnt-min (%d) must be smaller or equal than value of --elem-cnt-max (%d)\n", elem_cnt_min, elem_cnt_max); return (-1); } if (pw_min < IN_LEN_MIN) { fprintf (stderr, "Value of --pw-min (%d) must be greater or equal than %d\n", pw_min, IN_LEN_MIN); return (-1); } if (pw_max > OUT_LEN_MAX) { fprintf (stderr, "Value of --pw-max (%d) must be smaller or equal than %d\n", pw_max, OUT_LEN_MAX); return (-1); } if (elem_cnt_max > pw_max) { fprintf (stderr, "Value of --elem-cnt-max (%d) must be smaller or equal than value of --pw-max (%d)\n", elem_cnt_max, pw_max); return (-1); } /** * OS specific settings */ #ifdef WINDOWS setmode (fileno (stdout), O_BINARY); #endif /** * alloc some space */ db_entry_t *db_entries = (db_entry_t *) calloc (pw_max + 1, sizeof (db_entry_t)); pw_order_t *pw_orders = (pw_order_t *) calloc (pw_max + 1, sizeof (pw_order_t)); u64 *wordlen_dist = (u64 *) calloc (pw_max + 1, sizeof (u64)); out_t *out = (out_t *) mem_alloc (sizeof (out_t)); out->fp = stdout; out->len = 0; if (dupe_check) { int in_max = MIN(IN_LEN_MAX, pw_max); for (int pw_len = IN_LEN_MIN; pw_len <= in_max; pw_len++) { db_entry_t *db_entry = &db_entries[pw_len]; const u32 hash_size = 1 << DEF_HASH_LOG_SIZE[pw_len]; const u32 hash_alloc = ALLOC_NEW_DUPES; uniq_t *uniq = mem_alloc (sizeof (uniq_t)); uniq->hash_mask = hash_size - 1; uniq->data = mem_alloc (hash_alloc * sizeof (uniq_data_t)); uniq->hash = mem_alloc (hash_size * sizeof (u32)); uniq->index = 0; uniq->alloc = hash_alloc; memset (uniq->hash, 0xff, hash_size * sizeof (u32)); db_entry->uniq = uniq; } } /** * files */ if (output_file) { out->fp = fopen (output_file, "ab"); if (out->fp == NULL) { fprintf (stderr, "%s: %s\n", output_file, strerror (errno)); return (-1); } } /* * catch signal user interrupt */ if (save_pos) { signal (SIGINT, catch_int); } /** * load elems from stdin */ FILE *read_fp = stdin; if (wordlist) { read_fp = fopen (wordlist, "rb"); if (read_fp == NULL) { fprintf (stderr, "%s: %s\n", wordlist, strerror (errno)); return (-1); } } int wl_cnt = 0; while (!feof (read_fp)) { char buf[BUFSIZ]; char *input_buf = fgets (buf, sizeof (buf), read_fp); if (input_buf == NULL) continue; const int input_len = in_superchop (input_buf); if (input_len < IN_LEN_MIN) continue; if (input_len > IN_LEN_MAX) continue; if (input_len > pw_max) continue; db_entry_t *db_entry = &db_entries[input_len]; if (!dupe_check) { add_elem (db_entry, input_buf, input_len); } else { add_uniq (db_entry, input_buf, input_len); } if (case_permute) { const char old_c = input_buf[0]; const char new_cu = toupper (old_c); const char new_cl = tolower (old_c); if (old_c != new_cu) { input_buf[0] = new_cu; if (!dupe_check) { add_elem (db_entry, input_buf, input_len); } else { add_uniq (db_entry, input_buf, input_len); } } if (old_c != new_cl) { input_buf[0] = new_cl; if (!dupe_check) { add_elem (db_entry, input_buf, input_len); } else { add_uniq (db_entry, input_buf, input_len); } } } wl_cnt++; if (wl_max > 0 && wl_cnt == wl_max) break; } if (wordlist) { fclose (read_fp); } if (dupe_check) { int in_max = MIN(IN_LEN_MAX, pw_max); for (int pw_len = IN_LEN_MIN; pw_len <= in_max; pw_len++) { db_entry_t *db_entry = &db_entries[pw_len]; uniq_t *uniq = db_entry->uniq; free (uniq->hash); free (uniq->data); free (uniq); } } /** * init chains */ for (int pw_len = pw_min; pw_len <= pw_max; pw_len++) { db_entry_t *db_entry = &db_entries[pw_len]; const int pw_len1 = pw_len - 1; const u32 chains_cnt = 1 << pw_len1; u8 buf[OUT_LEN_MAX]; chain_t chain_buf_new; chain_buf_new.buf = buf; for (u32 chains_idx = 0; chains_idx < chains_cnt; chains_idx++) { chain_gen_with_idx (&chain_buf_new, pw_len1, chains_idx); // make sure all the elements really exist int valid1 = chain_valid_with_db (&chain_buf_new, db_entries); if (valid1 == 0) continue; // boost by verify element count to be inside a specific range int valid2 = chain_valid_with_cnt_min (&chain_buf_new, elem_cnt_min); if (valid2 == 0) continue; int eff_elem_cnt_max; if (elem_cnt_max > 0) { eff_elem_cnt_max = elem_cnt_max; } else { eff_elem_cnt_max = pw_len + elem_cnt_max; if (eff_elem_cnt_max <= elem_cnt_min) continue; } int valid3 = chain_valid_with_cnt_max (&chain_buf_new, eff_elem_cnt_max); if (valid3 == 0) continue; // add chain to database check_realloc_chains (db_entry); chain_t *chain_buf = &db_entry->chains_buf[db_entry->chains_cnt]; memcpy (chain_buf, &chain_buf_new, sizeof (chain_t)); chain_buf->buf = malloc_tiny (pw_len); memcpy (chain_buf->buf, chain_buf_new.buf, pw_len); mpz_init_set_si (chain_buf->ks_cnt, 0); mpz_init_set_si (chain_buf->ks_pos, 0); db_entry->chains_cnt++; } memset (db_entry->cur_chain_ks_poses, 0, OUT_LEN_MAX * sizeof (u64)); } /** * calculate password candidate output length distribution */ if (wl_dist_len) { for (int pw_len = IN_LEN_MIN; pw_len <= pw_max; pw_len++) { if (pw_len <= IN_LEN_MAX) { db_entry_t *db_entry = &db_entries[pw_len]; wordlen_dist[pw_len] = db_entry->elems_cnt; } else { wordlen_dist[pw_len] = 1; } } } else { for (int pw_len = IN_LEN_MIN; pw_len <= pw_max; pw_len++) { if (pw_len < DEF_WORDLEN_DIST_CNT) { wordlen_dist[pw_len] = DEF_WORDLEN_DIST[pw_len]; } else { wordlen_dist[pw_len] = 1; } } } /** * Calculate keyspace stuff */ for (int pw_len = pw_min; pw_len <= pw_max; pw_len++) { db_entry_t *db_entry = &db_entries[pw_len]; int chains_cnt = db_entry->chains_cnt; chain_t *chains_buf = db_entry->chains_buf; mpz_set_si (tmp, 0); for (int chains_idx = 0; chains_idx < chains_cnt; chains_idx++) { chain_t *chain_buf = &chains_buf[chains_idx]; chain_ks (chain_buf, db_entries, &chain_buf->ks_cnt); mpz_add (tmp, tmp, chain_buf->ks_cnt); } mpz_add (total_ks_cnt, total_ks_cnt, tmp); if (mpz_cmp_si (skip, 0)) { mpz_init_set (pw_ks_cnt[pw_len], tmp); } } if (total_ks_cnt == UINT128_MAX) { fprintf (stderr, "Warning: %d-bit keyspace saturated\n", FAKE_GMP); } if (keyspace) { mpz_out_str (stdout, 10, total_ks_cnt); printf ("\n"); return 0; } /** * sort chains by ks */ for (int pw_len = pw_min; pw_len <= pw_max; pw_len++) { db_entry_t *db_entry = &db_entries[pw_len]; chain_t *chains_buf = db_entry->chains_buf; const int chains_cnt = db_entry->chains_cnt; qsort (chains_buf, chains_cnt, sizeof (chain_t), sort_by_ks); } /** * sort global order by password length counts */ for (int pw_len = pw_min, order_pos = 0; pw_len <= pw_max; pw_len++, order_pos++) { db_entry_t *db_entry = &db_entries[pw_len]; const u64 elems_cnt = db_entry->elems_cnt; pw_order_t *pw_order = &pw_orders[order_pos]; pw_order->len = pw_len; pw_order->cnt = elems_cnt; } const int order_cnt = pw_max + 1 - pw_min; qsort (pw_orders, order_cnt, sizeof (pw_order_t), sort_by_cnt); /** * seek to some starting point */ if (mpz_cmp_si (skip, 0)) { if (mpz_cmp (skip, total_ks_cnt) >= 0) { fprintf (stderr, "Value of --skip must be smaller than total keyspace\n"); return (-1); } } if (mpz_cmp_si (limit, 0)) { if (mpz_cmp (limit, total_ks_cnt) > 0) { fprintf (stderr, "Value of --limit cannot be larger than total keyspace\n"); return (-1); } mpz_add (tmp, skip, limit); if (mpz_cmp (tmp, total_ks_cnt) > 0) { fprintf (stderr, "Value of --skip + --limit cannot be larger than total keyspace\n"); return (-1); } mpz_set (total_ks_cnt, tmp); } mpz_init_set (save, skip); /** * skip to the first main loop that will output a password */ if (mpz_cmp_si (skip, 0)) { mpz_t skip_left; mpz_init_set (skip_left, skip); mpz_t main_loops; mpz_init (main_loops); u64 outs_per_main_loop = 0; for (int pw_len = pw_min; pw_len <= pw_max; pw_len++) { mpz_init_set_si (pw_ks_pos[pw_len], 0); outs_per_main_loop += wordlen_dist[pw_len]; } // find pw_ks_pos[] while (1) { mpz_fdiv_q_ui (main_loops, skip_left, outs_per_main_loop); if (mpz_cmp_si (main_loops, 0) == 0) { break; } // increment the main loop "main_loops" times for (int pw_len = pw_min; pw_len <= pw_max; pw_len++) { if (mpz_cmp (pw_ks_pos[pw_len], pw_ks_cnt[pw_len]) < 0) { mpz_mul_ui (tmp, main_loops, wordlen_dist[pw_len]); mpz_add (pw_ks_pos[pw_len], pw_ks_pos[pw_len], tmp); mpz_sub (skip_left, skip_left, tmp); if (mpz_cmp (pw_ks_pos[pw_len], pw_ks_cnt[pw_len]) > 0) { mpz_sub (tmp, pw_ks_pos[pw_len], pw_ks_cnt[pw_len]); mpz_add (skip_left, skip_left, tmp); } } } outs_per_main_loop = 0; for (int pw_len = pw_min; pw_len <= pw_max; pw_len++) { if (mpz_cmp (pw_ks_pos[pw_len], pw_ks_cnt[pw_len]) < 0) { outs_per_main_loop += wordlen_dist[pw_len]; } } } mpz_sub (total_ks_pos, skip, skip_left); // set db_entries to pw_ks_pos[] for (int pw_len = pw_min; pw_len <= pw_max; pw_len++) { db_entry_t *db_entry = &db_entries[pw_len]; int chains_cnt = db_entry->chains_cnt; chain_t *chains_buf = db_entry->chains_buf; mpz_set (tmp, pw_ks_pos[pw_len]); for (int chains_idx = 0; chains_idx < chains_cnt; chains_idx++) { chain_t *chain_buf = &chains_buf[chains_idx]; if (mpz_cmp (tmp, chain_buf->ks_cnt) < 0) { mpz_set (chain_buf->ks_pos, tmp); set_chain_ks_poses (chain_buf, db_entries, &tmp, db_entry->cur_chain_ks_poses); break; } mpz_sub (tmp, tmp, chain_buf->ks_cnt); db_entry->chains_pos++; } } // clean up for (int pw_len = pw_min; pw_len <= pw_max; pw_len++) { mpz_clear (pw_ks_cnt[pw_len]); mpz_clear (pw_ks_pos[pw_len]); } mpz_clear (skip_left); mpz_clear (main_loops); } /** * loop */ while (mpz_cmp (total_ks_pos, total_ks_cnt) < 0) { for (int order_pos = 0; order_pos < order_cnt; order_pos++) { pw_order_t *pw_order = &pw_orders[order_pos]; const int pw_len = pw_order->len; char pw_buf[BUFSIZ]; pw_buf[pw_len] = '\n'; db_entry_t *db_entry = &db_entries[pw_len]; const u64 outs_cnt = wordlen_dist[pw_len]; u64 outs_pos = 0; while (outs_pos < outs_cnt) { const int chains_cnt = db_entry->chains_cnt; const int chains_pos = db_entry->chains_pos; if (chains_pos == chains_cnt) break; chain_t *chains_buf = db_entry->chains_buf; chain_t *chain_buf = &chains_buf[chains_pos]; mpz_sub (total_ks_left, total_ks_cnt, total_ks_pos); mpz_sub (iter_max, chain_buf->ks_cnt, chain_buf->ks_pos); if (mpz_cmp (total_ks_left, iter_max) < 0) { mpz_set (iter_max, total_ks_left); } const u64 outs_left = outs_cnt - outs_pos; mpz_set_ui (tmp, outs_left); if (mpz_cmp (tmp, iter_max) < 0) { mpz_set (iter_max, tmp); } const u64 iter_max_u64 = mpz_get_ui (iter_max); mpz_add (tmp, total_ks_pos, iter_max); if (mpz_cmp (tmp, skip) > 0) { u64 iter_pos_u64 = 0; if (mpz_cmp (total_ks_pos, skip) < 0) { mpz_sub (tmp, skip, total_ks_pos); iter_pos_u64 = mpz_get_ui (tmp); mpz_add (tmp, chain_buf->ks_pos, tmp); set_chain_ks_poses (chain_buf, db_entries, &tmp, db_entry->cur_chain_ks_poses); } chain_set_pwbuf_init (chain_buf, db_entries, db_entry->cur_chain_ks_poses, pw_buf); const u64 iter_pos_save = iter_max_u64 - iter_pos_u64; while (iter_pos_u64 < iter_max_u64) { out_push (out, pw_buf, pw_len + 1); chain_set_pwbuf_increment (chain_buf, db_entries, db_entry->cur_chain_ks_poses, pw_buf); iter_pos_u64++; } mpz_add_ui (save, save, iter_pos_save); } else { mpz_add (tmp, chain_buf->ks_pos, iter_max); set_chain_ks_poses (chain_buf, db_entries, &tmp, db_entry->cur_chain_ks_poses); } outs_pos += iter_max_u64; mpz_add (total_ks_pos, total_ks_pos, iter_max); mpz_add (chain_buf->ks_pos, chain_buf->ks_pos, iter_max); if (mpz_cmp (chain_buf->ks_pos, chain_buf->ks_cnt) == 0) { db_entry->chains_pos++; memset (db_entry->cur_chain_ks_poses, 0, OUT_LEN_MAX * sizeof (u64)); } if (mpz_cmp (total_ks_pos, total_ks_cnt) == 0) break; } if (mpz_cmp (total_ks_pos, total_ks_cnt) == 0) break; } } out_flush (out); if (save_pos) { catch_int (0); } /** * cleanup */ mpz_clear (iter_max); mpz_clear (total_ks_cnt); mpz_clear (total_ks_pos); mpz_clear (total_ks_left); mpz_clear (skip); mpz_clear (limit); mpz_clear (tmp); mpz_clear (save); for (int pw_len = pw_min; pw_len <= pw_max; pw_len++) { db_entry_t *db_entry = &db_entries[pw_len]; if (db_entry->chains_buf) { int chains_cnt = db_entry->chains_cnt; chain_t *chains_buf = db_entry->chains_buf; for (int chains_idx = 0; chains_idx < chains_cnt; chains_idx++) { chain_t *chain_buf = &chains_buf[chains_idx]; mpz_clear (chain_buf->ks_cnt); mpz_clear (chain_buf->ks_pos); } free (db_entry->chains_buf); } if (db_entry->elems_buf) free (db_entry->elems_buf); } free (out); free (wordlen_dist); free (pw_orders); free (db_entries); return 0; }