Forward Error Correction Identification

Discussion in 'Wireless & RF Design' started by mossman, Nov 12, 2012.

  1. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    I have an RF module that is sending four bits of FEC per one byte of data (FEC is interleaved) and am having difficulty identifying what type of FEC it is using. I was hoping someone could steer me in the right direction so I can narrow down the possibilities. Are there any particular encoding schemes that come to mind that use four FEC bits per data byte? As an example:

    0x4B is input to the module's microcontroller, and 0x87F is output to RF circuitry for transmission. Apparently 0x4B is being Xor'd with 0xAA then reversed (LSB-to-MSB) to get 0x87 (or reversed first then Xor'd with 0x55), but I can't figure out how the 0xF (FEC) is being computed.
     
  2. WBahn

    Moderator

    Mar 31, 2012
    17,715
    4,788
    About all that can be said for sure is that you have a 2/3 rate code - meaning that two data bits are conveyed for each three bits transmitted.

    I doubt that the codeword generation is done as you describe since it would provide no error correction capability. You can test this by simply checking a few other input-output pairs.

    There are numerous FEC coding schemes. In some of them the data bits are kept intact and the additional parity check bits are used for correction. In others, the bits in the codeword are each a function of many (or even all) of the bits in the data word.
     
  3. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    I should emphasize that the 8-bit data byte is transmitted followed by four FEC bits, followed by the next 8-bit data byte and FEC, etc., as follows:

    Example:
    Data Stream (hex) = 86 86 86 86
    FEC (hex) = C

    Transmitted Information: 86C 86C 86C 86C

    Any idea as to which FEC schemes I should look at first given this example?
     
  4. WBahn

    Moderator

    Mar 31, 2012
    17,715
    4,788
    Unfortunately, all this really emphasizes is that neither description you've given can be correct. You've given two examples:

    4B -> 87F
    86 -> 86C

    The first time you said that the data is XORed with something and then reversed (or possibly the other way around) to get the first two nibbles and the second time you said that the data is transmitted without modification as the first two nibbles. Well, neither of these are consistent with both examples.

    Instead of trying to get someone to guess at something that has literally countless possible answers, why don't you tell us what RF module it is that you are using? It is far more likely that someone will be able to track down some documentation -- or give you a good suggestion on how to track it down yourself -- that will tell you what FEC protocol is being used.

    Are you sure this is even FEC as opposed to a checksum or some other error detection scheme? I don't know if you can get 1 bit of FEC in a 12/8 code. You need it so that any of the 12 possible bit errors affects a unique set of the parity bits. This looks possible in theory, since there are 15 such sets, but I don't know if you can also meet the requirement that the 12-bit codeword must have a Hamming distance of at least three from any of the other 255 codewords.
     
  5. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    Sorry, I was giving the over-data in my last example. The reversing and Xor-ing has already been applied. I am at work and fired off my last message quickly. I cannot reveal what the module is. Here are some more examples:

    Baseband Data (hex): 01 01 01 01
    Over-Air Data (hex): D5B D5B D5B D5B

    Baseband Data (hex): 4B 4B 4B 4B
    Over-Air Data (hex): 87F 87F 87F 87F

    Baseband Data (hex): 5F 5F 5F 5F
    Over-Air Data (hex): AFE AFE AFE AFE

    Baseband Data (hex): DA DA DA DA
    Over-Air Data (hex): 0E9 0E9 0E9 0E9
     
    Last edited: Nov 13, 2012
  6. WBahn

    Moderator

    Mar 31, 2012
    17,715
    4,788
    It's unlikely we will be able to help you. About the only shot we would have would be an exhaustive examination (or something approaching it). Fortunately, since there are only 256 codewords in a space of 4096 vectors, this is quite feasible. But you would have to enumerate all 256 codewords (again, not too difficult).

    I could then analyze them to see if the thing is actually an FEC at all. If it is, I could map out which bits affect which parity bits and, from that, derive some kind of algorithm to perform the error correction. Whether or not I can back out of all it the actual matrices used (assuming it is a linear code) I don't know.

    But be aware I would only be willing to make the attempt because the problem interests me. In general, expecting someone to do that much work for free is unreasonable.
     
  7. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    Fair enough. I'm basically trying to figure it out out of curiosity as well and didn't expect anyone to spend too much effort on it. I was hoping for a simple answer but now understand that it isn't so simple. I have a datasheet, but all it says is that the module uses an "FEC mechanism" to enhance communication reliability. It is worth noting that the module also has acknowledge functionality, so perhaps it is really just has error detection with acknowledge (why would you need to acknowledge the transmission if you have error correction?). It is a cheap Taiwanese module and the spec sheet could very well be overstated to make the module more appealing.
     
  8. WBahn

    Moderator

    Mar 31, 2012
    17,715
    4,788
    There are a few reasons why it might support acknowledgement capability. FIrst, the other end of the link might require it. Second, if you don't try to correct errors, then you can detect at least twice as many bit errors.

    If you can provide the 256 codewords, I would be happy to play with it at least a little.
     
  9. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    Unfortunately, I don't have all 256 codewords, I only have seven. I no longer have the module, but can see if I can get it back. I'll let you know one way or the other. And if I didn't make this clear, it doesn't make a difference if I send one byte or 10, the error correction/detection nibble does not change for a given byte. I arbitrarily chose four bytes for my example. This is what I have at this point:

    Raw Data (hex): 01 01 01 01
    Encoded Data (hex): D5B D5B D5B D5B
    Raw Data (hex): 4B 4B 4B 4B
    Encoded Data(hex): 87F 87F 87F 87F
    Raw Data (hex): 5F 5F 5F 5F
    Encoded Data (hex): AFE AFE AFE AFE
    Raw Data (hex): DA DA DA DA
    Encoded Data (hex): 0E9 0E9 0E9 0E9
    Raw Data (hex): 04 04 04 04
    Encoded Data (hex): 75F 75F 75F 75F
    Raw Data (hex): CB CB CB CB
    Encoded Data (hex): 86C 86C 86C 86C
    Raw Data (hex): D7 D7 D7 D7
    Encoded Data (hex): BE8 BE8 BE8 BE8
     
  10. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    Forgot, I have one more at this time:

    Raw Data (hex): 55 55 55 55
    Encoded Data (hex): FFC FFC FFC FFC

    I will be getting the module back this Friday and will get all 256 code words for you (may take me a couple days). Thanks!
     
    Last edited: Nov 14, 2012
  11. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    Put another way, the data is input LSB-to-MSB (serial 8N1 format) and either Xor'd with 0xAA and reversed MSB-to-LSB prior to transmission, or reversed MSB-to-LSB first then Xor'd with 0x55 prior to transmission.

    Does it make more sense for a modem's microcontroller to reverse the bits MSB-to-LSB first then perform the FEC calculation or do the calculation first then reverse the bits?

    The "Raw Data" I listed in prior posts is actually listed LSB-to-MSB (e.g. 0x01 should actually be 0x80). In order of transmission (left-to-right), this is an example of what I have:

    Firmware data: 0x80
    8N1 interface data: 0 0 0 0 0 0 0 0 1 1 (start bit = 0, stop bit = 1)
    Over-air data (encoded byte + FEC nibble): 0xD5B

    Sorry for the confusion.
     
    Last edited: Nov 14, 2012
  12. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    Here is some more data (55 codewords total). I will try to get the remaining code words to you by Friday or Monday.

    Code ( (Unknown Language)):
    1.  
    2. 00    55C
    3. 02    573
    4. 0B    5EB
    5. 0E    5B4
    6. 1B    4EE
    7. 20    75F
    8. 22    779
    9. 27    726
    10. 28    7D4
    11. 2E    7BE
    12. 36    630
    13. 3B    6E4
    14. 3C    69D
    15. 3F    6A8
    16. 4C    195
    17. 4E    1B3
    18. 52    071
    19. 54    01B
    20. 55    008
    21. 58    0DC
    22. 5B    0E9
    23. 5C    090
    24. 63    36D
    25. 66    332
    26. 6F    3AA
    27. 71    24E
    28. 80    D5B
    29. 89    DC3
    30. 8B    DE5
    31. 8F    DA9
    32. 90 C5E
    33. 9A    CF3
    34. 9E    CBF
    35. 9F    CAC
    36. A6    F3B
    37. A8    FDA
    38. AA    FFC
    39. AC    F96
    40. B1    E47
    41. B7    E2D
    42. BF    EA6
    43. C1    94F
    44. C3    969
    45. CA    9F1
    46. D2    87F
    47. D3    86C
    48. DD    88D
    49. DE    8B8
    50. E7    B2F
    51. E9    BCE
    52. EB    BE8
    53. F0    A53
    54. F4    A1F
    55. F7    A2A
    56. FA    AFE
    57.  
     
    Last edited by a moderator: Nov 19, 2012
  13. WBahn

    Moderator

    Mar 31, 2012
    17,715
    4,788
    Sometime after you have posted all the data/codeword combinations (preferably all in increasing data order) I will start analyzing it. I don't know when I will be able to get to it, but if I can get the data by this weekend, then I can probably find time to play with it over the Thanksgiving holiday.
     
  14. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    I just got the device back about an hour ago and have a little over half of the code words. I can provide those to you this evening if it helps. Otherwise, it will have to be Monday morning. Is that too late?
     
  15. WBahn

    Moderator

    Mar 31, 2012
    17,715
    4,788
    Nah, Monday will be fine. There's no point in me starting on them until I have them all.

    Hopefully you aren't running them all as four-byte groups of identical data values. Instead, just use a single string of 256 data words that ramp from 0x00 to 0xFF. Or, use data runs of, say, 16 data values per run. Each run has a constant upper nibble and the lower nibble is ramped from 0x0 through 0xF. Then make 16 runs, each one with a different upper nibble.
     
  16. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    Not running four byte groups, I just used that as an example to show that it repeats and that the FEC is interleaved between each byte. I ran eight of the 16 groups today (00-7F) and will run the remainder on Monday morning, at which time I will post the results.
     
  17. WBahn

    Moderator

    Mar 31, 2012
    17,715
    4,788
    Here are your list of codes. These all match the partial list that you posted except for 00, which you give as 55C and which I suspect is really 555.

    If the codes below that are not in your partial list match your codes onces you fill in the gaps, it will be almost certain that 00 is supposed to be 555. Please measure it specifically and let me know what you see.

    If this all works, then I can go into the encoding, decoding, and error correction algorithms that apply. I can also go into how I determined the correct value for 00 and tested it.

    Code ( (Unknown Language)):
    1.  
    2. 00 555
    3. 01 546
    4. 02 573
    5. 03 560
    6. 04 519
    7. 05 50A
    8. 06 53F
    9. 07 52C
    10. 08 5DE
    11. 09 5CD
    12. 0A 5F8
    13. 0B 5EB
    14. 0C 592
    15. 0D 581
    16. 0E 5B4
    17. 0F 5A7
    18. 10 450
    19. 11 443
    20. 12 476
    21. 13 465
    22. 14 41C
    23. 15 40F
    24. 16 43A
    25. 17 429
    26. 18 4DB
    27. 19 4C8
    28. 1A 4FD
    29. 1B 4EE
    30. 1C 497
    31. 1D 484
    32. 1E 4B1
    33. 1F 4A2
    34. 20 75F
    35. 21 74C
    36. 22 779
    37. 23 76A
    38. 24 713
    39. 25 700
    40. 26 735
    41. 27 726
    42. 28 7D4
    43. 29 7C7
    44. 2A 7F2
    45. 2B 7E1
    46. 2C 798
    47. 2D 78B
    48. 2E 7BE
    49. 2F 7AD
    50. 30 65A
    51. 31 649
    52. 32 67C
    53. 33 66F
    54. 34 616
    55. 35 605
    56. 36 630
    57. 37 623
    58. 38 6D1
    59. 39 6C2
    60. 3A 6F7
    61. 3B 6E4
    62. 3C 69D
    63. 3D 68E
    64. 3E 6BB
    65. 3F 6A8
    66. 40 152
    67. 41 141
    68. 42 174
    69. 43 167
    70. 44 11E
    71. 45 10D
    72. 46 138
    73. 47 12B
    74. 48 1D9
    75. 49 1CA
    76. 4A 1FF
    77. 4B 1EC
    78. 4C 195
    79. 4D 186
    80. 4E 1B3
    81. 4F 1A0
    82. 50 057
    83. 51 044
    84. 52 071
    85. 53 062
    86. 54 01B
    87. 55 008
    88. 56 03D
    89. 57 02E
    90. 58 0DC
    91. 59 0CF
    92. 5A 0FA
    93. 5B 0E9
    94. 5C 090
    95. 5D 083
    96. 5E 0B6
    97. 5F 0A5
    98. 60 358
    99. 61 34B
    100. 62 37E
    101. 63 36D
    102. 64 314
    103. 65 307
    104. 66 332
    105. 67 321
    106. 68 3D3
    107. 69 3C0
    108. 6A 3F5
    109. 6B 3E6
    110. 6C 39F
    111. 6D 38C
    112. 6E 3B9
    113. 6F 3AA
    114. 70 25D
    115. 71 24E
    116. 72 27B
    117. 73 268
    118. 74 211
    119. 75 202
    120. 76 237
    121. 77 224
    122. 78 2D6
    123. 79 2C5
    124. 7A 2F0
    125. 7B 2E3
    126. 7C 29A
    127. 7D 289
    128. 7E 2BC
    129. 7F 2AF
    130. 80 D5B
    131. 81 D48
    132. 82 D7D
    133. 83 D6E
    134. 84 D17
    135. 85 D04
    136. 86 D31
    137. 87 D22
    138. 88 DD0
    139. 89 DC3
    140. 8A DF6
    141. 8B DE5
    142. 8C D9C
    143. 8D D8F
    144. 8E DBA
    145. 8F DA9
    146. 90 C5E
    147. 91 C4D
    148. 92 C78
    149. 93 C6B
    150. 94 C12
    151. 95 C01
    152. 96 C34
    153. 97 C27
    154. 98 CD5
    155. 99 CC6
    156. 9A CF3
    157. 9B CE0
    158. 9C C99
    159. 9D C8A
    160. 9E CBF
    161. 9F CAC
    162. A0 F51
    163. A1 F42
    164. A2 F77
    165. A3 F64
    166. A4 F1D
    167. A5 F0E
    168. A6 F3B
    169. A7 F28
    170. A8 FDA
    171. A9 FC9
    172. AA FFC
    173. AB FEF
    174. AC F96
    175. AD F85
    176. AE FB0
    177. AF FA3
    178. B0 E54
    179. B1 E47
    180. B2 E72
    181. B3 E61
    182. B4 E18
    183. B5 E0B
    184. B6 E3E
    185. B7 E2D
    186. B8 EDF
    187. B9 ECC
    188. BA EF9
    189. BB EEA
    190. BC E93
    191. BD E80
    192. BE EB5
    193. BF EA6
    194. C0 95C
    195. C1 94F
    196. C2 97A
    197. C3 969
    198. C4 910
    199. C5 903
    200. C6 936
    201. C7 925
    202. C8 9D7
    203. C9 9C4
    204. CA 9F1
    205. CB 9E2
    206. CC 99B
    207. CD 988
    208. CE 9BD
    209. CF 9AE
    210. D0 859
    211. D1 84A
    212. D2 87F
    213. D3 86C
    214. D4 815
    215. D5 806
    216. D6 833
    217. D7 820
    218. D8 8D2
    219. D9 8C1
    220. DA 8F4
    221. DB 8E7
    222. DC 89E
    223. DD 88D
    224. DE 8B8
    225. DF 8AB
    226. E0 B56
    227. E1 B45
    228. E2 B70
    229. E3 B63
    230. E4 B1A
    231. E5 B09
    232. E6 B3C
    233. E7 B2F
    234. E8 BDD
    235. E9 BCE
    236. EA BFB
    237. EB BE8
    238. EC B91
    239. ED B82
    240. EE BB7
    241. EF BA4
    242. F0 A53
    243. F1 A40
    244. F2 A75
    245. F3 A66
    246. F4 A1F
    247. F5 A0C
    248. F6 A39
    249. F7 A2A
    250. F8 AD8
    251. F9 ACB
    252. FA AFE
    253. FB AED
    254. FC A94
    255. FD A87
    256. FE AB2
    257. FF AA1
    258.  
     
    Last edited by a moderator: Nov 19, 2012
  18. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    55C was a typo. It is in fact 555. Here is the full list:

    Code ( (Unknown Language)):
    1.  
    2. 00    55    5
    3. 01    54    6
    4. 02    57    3
    5. 03    56    0
    6. 04    51    9
    7. 05    50    A
    8. 06    53    F
    9. 07    52    C
    10. 08    5D    E
    11. 09    5C    D
    12. 0A    5F    8
    13. 0B    5E    B
    14. 0C    59    2
    15. 0D    58    1
    16. 0E    5B    4
    17. 0F    5A    7
    18. 10    45    0
    19. 11    44    3
    20. 12    47    6
    21. 13    46    5
    22. 14    41    C
    23. 15    40    F
    24. 16    43    A
    25. 17    42    9
    26. 18    4D    B
    27. 19    4C    8
    28. 1A    4F    D
    29. 1B    4E    E
    30. 1C    49    7
    31. 1D    48    4
    32. 1E    4B    1
    33. 1F    4A    2
    34. 20    75    F
    35. 21    74    C
    36. 22    77    9
    37. 23    76    A
    38. 24    71    3
    39. 25    70    0
    40. 26    73    5
    41. 27    72    6
    42. 28    7D    4
    43. 29    7C    7
    44. 2A    7F    2
    45. 2B    7E    1
    46. 2C    79    8
    47. 2D    78    B
    48. 2E    7B    E
    49. 2F    7A    D
    50. 30    65    A
    51. 31    64    9
    52. 32    67    C
    53. 33    66    F
    54. 34    61    6
    55. 35    60    5
    56. 36    63    0
    57. 37    62    3
    58. 38    6D    1
    59. 39    6C    2
    60. 3A    6F    7
    61. 3B    6E    4
    62. 3C    69    D
    63. 3D    68    E
    64. 3E    6B    B
    65. 3F    6A    8
    66. 40    15    2
    67. 41    14    1
    68. 42    17    4
    69. 43    16    7
    70. 44    11    E
    71. 45    10    D
    72. 46    13    8
    73. 47    12    B
    74. 48    1D    9
    75. 49    1C    A
    76. 4A    1F    F
    77. 4B    1E    C
    78. 4C    19    5
    79. 4D    18    6
    80. 4E    1B    3
    81. 4F    1A    0
    82. 50    05    7
    83. 51    04    4
    84. 52    07    1
    85. 53    06    2
    86. 54    01    B
    87. 55    00    8
    88. 56    03    D
    89. 57    02    E
    90. 58    0D    C
    91. 59    0C    F
    92. 5A    0F    A
    93. 5B    0E    9
    94. 5C    09    0
    95. 5D    08    3
    96. 5E    0B    6
    97. 5F    0A    5
    98. 60    35    8
    99. 61    34    B
    100. 62    37    E
    101. 63    36    D
    102. 64    31    4
    103. 65    30    7
    104. 66    33    2
    105. 67    32    1
    106. 68    3D    3
    107. 69    3C    0
    108. 6A    3F    5
    109. 6B    3E    6
    110. 6C    39    F
    111. 6D    38    C
    112. 6E    3B    9
    113. 6F    3A    A
    114. 70    25    D
    115. 71    24    E
    116. 72    27    B
    117. 73    26    8
    118. 74    21    1
    119. 75    20    2
    120. 76    23    7
    121. 77    22    4
    122. 78    2D    6
    123. 79    2C    5
    124. 7A    2F    0
    125. 7B    2E    3
    126. 7C    29    A
    127. 7D    28    9
    128. 7E    2B    C
    129. 7F    2A    F
    130. 80    D5    B
    131. 81    D4    8
    132. 82    D7    D
    133. 83    D6    E
    134. 84    D1    7
    135. 85    D0    4
    136. 86    D3    1
    137. 87    D2    2
    138. 88    DD    0
    139. 89    DC    3
    140. 8A    DF    6
    141. 8B    DE    5
    142. 8C    D9    C
    143. 8D    D8    F
    144. 8E    DB    A
    145. 8F    DA    9
    146. 90    C5    E
    147. 91    C4    D
    148. 92    C7    8
    149. 93    C6    B
    150. 94    C1    2
    151. 95    C0    1
    152. 96    C3    4
    153. 97    C2    7
    154. 98    CD    5
    155. 99    CC    6
    156. 9A    CF    3
    157. 9B    CE    0
    158. 9C    C9    9
    159. 9D    C8    A
    160. 9E    CB    F
    161. 9F    CA    C
    162. A0    F5    1
    163. A1    F4    2
    164. A2    F7    7
    165. A3    F6    4
    166. A4    F1    D
    167. A5    F0    E
    168. A6    F3    B
    169. A7    F2    8
    170. A8    FD    A
    171. A9    FC    9
    172. AA    FF    C
    173. AB    FE    F
    174. AC    F9    6
    175. AD    F8    5
    176. AE    FB    0
    177. AF    FA    3
    178. B0    E5    4
    179. B1    E4    7
    180. B2    E7    2
    181. B3    E6    1
    182. B4    E1    8
    183. B5    E0    B
    184. B6    E3    E
    185. B7    E2    D
    186. B8    ED    F
    187. B9    EC    C
    188. BA    EF    9
    189. BB    EE    A
    190. BC    E9    3
    191. BD    E8    0
    192. BE    EB    5
    193. BF    EA    6
    194. C0    95    C
    195. C1    94    F
    196. C2    97    A
    197. C3    96    9
    198. C4    91    0
    199. C5    90    3
    200. C6    93    6
    201. C7    92    5
    202. C8    9D    7
    203. C9    9C    4
    204. CA    9F    1
    205. CB    9E    2
    206. CC    99    B
    207. CD    98    8
    208. CE    9B    D
    209. CF    9A    E
    210. D0    85    9
    211. D1    84    A
    212. D2    87    F
    213. D3    86    C
    214. D4    81    5
    215. D5    80    6
    216. D6    83    3
    217. D7    82    0
    218. D8    8D    2
    219. D9    8C    1
    220. DA    8F    4
    221. DB    8E    7
    222. DC    89    E
    223. DD    88    D
    224. DE    8B    8
    225. DF    8A    B
    226. E0    B5    6
    227. E1    B4    5
    228. E2    B7    0
    229. E3    B6    3
    230. E4    B1    A
    231. E5    B0    9
    232. E6    B3    C
    233. E7    B2    F
    234. E8    BD    0
    235. E9    BC    E
    236. EA    BF    B
    237. EB    BE    8
    238. EC    B9    1
    239. ED    B8    2
    240. EE    BB    7
    241. EF    BA    4
    242. F0    A5    3
    243. F1    A4    0
    244. F2    A7    5
    245. F3    A6    6
    246. F4    A1    F
    247. F5    A0    C
    248. F6    A3    9
    249. F7    A2    A
    250. F8    AD    8
    251. F9    AC    B
    252. FA    AF    E
    253. FB    AE    D
    254. FC    A9    4
    255. FD    A8    7
    256. FE    AB    2
    257. FF    AA    1
    258.  
     
    Last edited by a moderator: Nov 19, 2012
  19. WBahn

    Moderator

    Mar 31, 2012
    17,715
    4,788
    Aaarrrgghhh!!

    Why did you change the format of your data? I wrote my analyzer to read your prior format and now you went and changed it so I had to update my analyzer so that it can read the new one.

    Please check your value for data E8. You have BD0 and I have BDD. Other than that, all of your codes agree with the ones I generated.

    Glad to hear that 00 was a typo and is really 555.

    When I have some time (which should happen over the Thanksgiving break), I'll walk through how I analyzed the data. Perhaps it might even make a good blog post.
     
  20. mossman

    Thread Starter Member

    Aug 26, 2010
    131
    3
    Yes, it should be BDD. Sorry. Do you need me to re-post the data in the original format? Can you give me a hint as to how you got your list? The suspense is killing me. The other piece to the puzzle is the length period which comes immediately before the data field. Seven bytes transmitted: Length period = 450, Eight bytes: 5DE, Nine bytes: 7D4. I can get more if needed.
     
    Last edited: Nov 19, 2012
Loading...