System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 850e1d59813cc2610ca58fa55b0b905b203243ed:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 20 2a 20 41 44  *********.. * AD
0040: 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50  O.NET 2.0 Data P
0050: 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69  rovider for SQLi
0060: 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0d 0a  te Version 3.X..
0070: 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52 6f   * Written by Ro
0080: 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 6f  bert Simpson (ro
0090: 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c 65  bert@blackcastle
00a0: 73 6f 66 74 2e 63 6f 6d 29 0d 0a 20 2a 20 0d 0a  soft.com).. * ..
00b0: 20 2a 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74   * Released to t
00c0: 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e  he public domain
00d0: 2c 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77  , use at your ow
00e0: 6e 20 72 69 73 6b 21 0d 0a 20 2a 2a 2a 2a 2a 2a  n risk!.. ******
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2a 2a 2f 0d 0a 0d 0a 75 73 69 6e 67 20 53 79 73  **/....using Sys
0130: 74 65 6d 2e 43 6f 6c 6c 65 63 74 69 6f 6e 73 2e  tem.Collections.
0140: 47 65 6e 65 72 69 63 3b 0d 0a 75 73 69 6e 67 20  Generic;..using 
0150: 53 79 73 74 65 6d 2e 54 65 78 74 3b 0d 0a 75 73  System.Text;..us
0160: 69 6e 67 20 53 79 73 74 65 6d 2e 43 6f 6c 6c 65  ing System.Colle
0170: 63 74 69 6f 6e 73 2e 4f 62 6a 65 63 74 4d 6f 64  ctions.ObjectMod
0180: 65 6c 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74 65  el;..using Syste
0190: 6d 2e 43 6f 6c 6c 65 63 74 69 6f 6e 73 3b 0d 0a  m.Collections;..
01a0: 0d 0a 23 69 66 20 4e 45 54 5f 34 30 20 7c 7c 20  ..#if NET_40 || 
01b0: 4e 45 54 5f 34 35 20 7c 7c 20 4e 45 54 5f 34 35  NET_45 || NET_45
01c0: 31 20 7c 7c 20 4e 45 54 5f 34 35 32 20 7c 7c 20  1 || NET_452 || 
01d0: 4e 45 54 5f 34 36 20 7c 7c 20 4e 45 54 5f 34 36  NET_46 || NET_46
01e0: 31 20 7c 7c 20 4e 45 54 5f 34 36 32 20 7c 7c 20  1 || NET_462 || 
01f0: 4e 45 54 5f 34 37 20 7c 7c 20 4e 45 54 5f 34 37  NET_47 || NET_47
0200: 31 0d 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 2e  1..using System.
0210: 52 75 6e 74 69 6d 65 3b 0d 0a 23 65 6e 64 69 66  Runtime;..#endif
0220: 0d 0a 0d 0a 23 69 66 20 55 53 45 5f 45 4e 54 49  ....#if USE_ENTI
0230: 54 59 5f 46 52 41 4d 45 57 4f 52 4b 5f 36 0d 0a  TY_FRAMEWORK_6..
0240: 6e 61 6d 65 73 70 61 63 65 20 53 79 73 74 65 6d  namespace System
0250: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36  .Data.SQLite.EF6
0260: 0d 0a 23 65 6c 73 65 0d 0a 6e 61 6d 65 73 70 61  ..#else..namespa
0270: 63 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ce System.Data.S
0280: 51 4c 69 74 65 2e 4c 69 6e 71 0d 0a 23 65 6e 64  QLite.Linq..#end
0290: 69 66 0d 0a 7b 0d 0a 09 69 6e 74 65 72 6e 61 6c  if..{...internal
02a0: 20 73 65 61 6c 65 64 20 63 6c 61 73 73 20 4b 65   sealed class Ke
02b0: 79 54 6f 4c 69 73 74 4d 61 70 3c 54 4b 65 79 2c  yToListMap<TKey,
02c0: 20 54 56 61 6c 75 65 3e 20 3a 20 49 6e 74 65 72   TValue> : Inter
02d0: 6e 61 6c 42 61 73 65 0d 0a 09 7b 0d 0a 09 09 2f  nalBase...{..../
02e0: 2f 20 46 69 65 6c 64 73 0d 0a 09 09 70 72 69 76  / Fields....priv
02f0: 61 74 65 20 44 69 63 74 69 6f 6e 61 72 79 3c 54  ate Dictionary<T
0300: 4b 65 79 2c 20 4c 69 73 74 3c 54 56 61 6c 75 65  Key, List<TValue
0310: 3e 3e 20 6d 5f 6d 61 70 3b 0d 0a 0d 0a 09 09 2f  >> m_map;....../
0320: 2f 20 4d 65 74 68 6f 64 73 0d 0a 09 09 69 6e 74  / Methods....int
0330: 65 72 6e 61 6c 20 4b 65 79 54 6f 4c 69 73 74 4d  ernal KeyToListM
0340: 61 70 28 49 45 71 75 61 6c 69 74 79 43 6f 6d 70  ap(IEqualityComp
0350: 61 72 65 72 3c 54 4b 65 79 3e 20 63 6f 6d 70 61  arer<TKey> compa
0360: 72 65 72 29 0d 0a 09 09 7b 0d 0a 09 09 09 74 68  rer)....{.....th
0370: 69 73 2e 6d 5f 6d 61 70 20 3d 20 6e 65 77 20 44  is.m_map = new D
0380: 69 63 74 69 6f 6e 61 72 79 3c 54 4b 65 79 2c 20  ictionary<TKey, 
0390: 4c 69 73 74 3c 54 56 61 6c 75 65 3e 3e 28 63 6f  List<TValue>>(co
03a0: 6d 70 61 72 65 72 29 3b 0d 0a 09 09 7d 0d 0a 0d  mparer);....}...
03b0: 0a 09 09 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64  ...internal void
03c0: 20 41 64 64 28 54 4b 65 79 20 6b 65 79 2c 20 54   Add(TKey key, T
03d0: 56 61 6c 75 65 20 76 61 6c 75 65 29 0d 0a 09 09  Value value)....
03e0: 7b 0d 0a 09 09 09 4c 69 73 74 3c 54 56 61 6c 75  {.....List<TValu
03f0: 65 3e 20 6c 69 73 74 3b 0d 0a 09 09 09 69 66 20  e> list;.....if 
0400: 28 21 74 68 69 73 2e 6d 5f 6d 61 70 2e 54 72 79  (!this.m_map.Try
0410: 47 65 74 56 61 6c 75 65 28 6b 65 79 2c 20 6f 75  GetValue(key, ou
0420: 74 20 6c 69 73 74 29 29 0d 0a 09 09 09 7b 0d 0a  t list)).....{..
0430: 09 09 09 09 6c 69 73 74 20 3d 20 6e 65 77 20 4c  ....list = new L
0440: 69 73 74 3c 54 56 61 6c 75 65 3e 28 29 3b 0d 0a  ist<TValue>();..
0450: 09 09 09 09 74 68 69 73 2e 6d 5f 6d 61 70 5b 6b  ....this.m_map[k
0460: 65 79 5d 20 3d 20 6c 69 73 74 3b 0d 0a 09 09 09  ey] = list;.....
0470: 7d 0d 0a 09 09 09 6c 69 73 74 2e 41 64 64 28 76  }.....list.Add(v
0480: 61 6c 75 65 29 3b 0d 0a 09 09 7d 0d 0a 0d 0a 09  alue);....}.....
0490: 09 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 41  .internal void A
04a0: 64 64 52 61 6e 67 65 28 54 4b 65 79 20 6b 65 79  ddRange(TKey key
04b0: 2c 20 49 45 6e 75 6d 65 72 61 62 6c 65 3c 54 56  , IEnumerable<TV
04c0: 61 6c 75 65 3e 20 76 61 6c 75 65 73 29 0d 0a 09  alue> values)...
04d0: 09 7b 0d 0a 09 09 09 66 6f 72 65 61 63 68 20 28  .{.....foreach (
04e0: 54 56 61 6c 75 65 20 6c 6f 63 61 6c 20 69 6e 20  TValue local in 
04f0: 76 61 6c 75 65 73 29 0d 0a 09 09 09 7b 0d 0a 09  values).....{...
0500: 09 09 09 74 68 69 73 2e 41 64 64 28 6b 65 79 2c  ...this.Add(key,
0510: 20 6c 6f 63 61 6c 29 3b 0d 0a 09 09 09 7d 0d 0a   local);.....}..
0520: 09 09 7d 0d 0a 0d 0a 09 09 69 6e 74 65 72 6e 61  ..}......interna
0530: 6c 20 62 6f 6f 6c 20 43 6f 6e 74 61 69 6e 73 4b  l bool ContainsK
0540: 65 79 28 54 4b 65 79 20 6b 65 79 29 0d 0a 09 09  ey(TKey key)....
0550: 7b 0d 0a 09 09 09 72 65 74 75 72 6e 20 74 68 69  {.....return thi
0560: 73 2e 6d 5f 6d 61 70 2e 43 6f 6e 74 61 69 6e 73  s.m_map.Contains
0570: 4b 65 79 28 6b 65 79 29 3b 0d 0a 09 09 7d 0d 0a  Key(key);....}..
0580: 0d 0a 09 09 69 6e 74 65 72 6e 61 6c 20 49 45 6e  ....internal IEn
0590: 75 6d 65 72 61 62 6c 65 3c 54 56 61 6c 75 65 3e  umerable<TValue>
05a0: 20 45 6e 75 6d 65 72 61 74 65 56 61 6c 75 65 73   EnumerateValues
05b0: 28 54 4b 65 79 20 6b 65 79 29 0d 0a 09 09 7b 0d  (TKey key)....{.
05c0: 0a 09 09 09 4c 69 73 74 3c 54 56 61 6c 75 65 3e  ....List<TValue>
05d0: 20 76 61 6c 75 65 73 3b 0d 0a 09 09 09 69 66 20   values;.....if 
05e0: 28 6d 5f 6d 61 70 2e 54 72 79 47 65 74 56 61 6c  (m_map.TryGetVal
05f0: 75 65 28 6b 65 79 2c 20 6f 75 74 20 76 61 6c 75  ue(key, out valu
0600: 65 73 29 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09  es)).....{......
0610: 66 6f 72 65 61 63 68 20 28 54 56 61 6c 75 65 20  foreach (TValue 
0620: 76 61 6c 75 65 20 69 6e 20 76 61 6c 75 65 73 29  value in values)
0630: 20 7b 20 79 69 65 6c 64 20 72 65 74 75 72 6e 20   { yield return 
0640: 76 61 6c 75 65 3b 20 7d 0d 0a 09 09 09 7d 0d 0a  value; }.....}..
0650: 09 09 7d 0d 0a 0d 0a 09 09 69 6e 74 65 72 6e 61  ..}......interna
0660: 6c 20 52 65 61 64 4f 6e 6c 79 43 6f 6c 6c 65 63  l ReadOnlyCollec
0670: 74 69 6f 6e 3c 54 56 61 6c 75 65 3e 20 4c 69 73  tion<TValue> Lis
0680: 74 46 6f 72 4b 65 79 28 54 4b 65 79 20 6b 65 79  tForKey(TKey key
0690: 29 0d 0a 09 09 7b 0d 0a 09 09 09 72 65 74 75 72  )....{.....retur
06a0: 6e 20 6e 65 77 20 52 65 61 64 4f 6e 6c 79 43 6f  n new ReadOnlyCo
06b0: 6c 6c 65 63 74 69 6f 6e 3c 54 56 61 6c 75 65 3e  llection<TValue>
06c0: 28 74 68 69 73 2e 6d 5f 6d 61 70 5b 6b 65 79 5d  (this.m_map[key]
06d0: 29 3b 0d 0a 09 09 7d 0d 0a 0d 0a 09 09 69 6e 74  );....}......int
06e0: 65 72 6e 61 6c 20 62 6f 6f 6c 20 52 65 6d 6f 76  ernal bool Remov
06f0: 65 4b 65 79 28 54 4b 65 79 20 6b 65 79 29 0d 0a  eKey(TKey key)..
0700: 09 09 7b 0d 0a 09 09 09 72 65 74 75 72 6e 20 74  ..{.....return t
0710: 68 69 73 2e 6d 5f 6d 61 70 2e 52 65 6d 6f 76 65  his.m_map.Remove
0720: 28 6b 65 79 29 3b 0d 0a 09 09 7d 0d 0a 0d 0a 09  (key);....}.....
0730: 09 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69  .internal overri
0740: 64 65 20 76 6f 69 64 20 54 6f 43 6f 6d 70 61 63  de void ToCompac
0750: 74 53 74 72 69 6e 67 28 53 74 72 69 6e 67 42 75  tString(StringBu
0760: 69 6c 64 65 72 20 62 75 69 6c 64 65 72 29 0d 0a  ilder builder)..
0770: 09 09 7b 0d 0a 09 09 09 66 6f 72 65 61 63 68 20  ..{.....foreach 
0780: 28 54 4b 65 79 20 6c 6f 63 61 6c 20 69 6e 20 74  (TKey local in t
0790: 68 69 73 2e 4b 65 79 73 29 0d 0a 09 09 09 7b 0d  his.Keys).....{.
07a0: 0a 09 09 09 09 53 74 72 69 6e 67 55 74 69 6c 2e  .....StringUtil.
07b0: 46 6f 72 6d 61 74 53 74 72 69 6e 67 42 75 69 6c  FormatStringBuil
07c0: 64 65 72 28 62 75 69 6c 64 65 72 2c 20 22 7b 30  der(builder, "{0
07d0: 7d 22 2c 20 6e 65 77 20 6f 62 6a 65 63 74 5b 5d  }", new object[]
07e0: 20 7b 20 6c 6f 63 61 6c 20 7d 29 3b 0d 0a 09 09   { local });....
07f0: 09 09 62 75 69 6c 64 65 72 2e 41 70 70 65 6e 64  ..builder.Append
0800: 28 22 3a 20 22 29 3b 0d 0a 09 09 09 09 49 45 6e  (": ");......IEn
0810: 75 6d 65 72 61 62 6c 65 3c 54 56 61 6c 75 65 3e  umerable<TValue>
0820: 20 6c 69 73 74 20 3d 20 74 68 69 73 2e 4c 69 73   list = this.Lis
0830: 74 46 6f 72 4b 65 79 28 6c 6f 63 61 6c 29 3b 0d  tForKey(local);.
0840: 0a 09 09 09 09 53 74 72 69 6e 67 55 74 69 6c 2e  .....StringUtil.
0850: 54 6f 53 65 70 61 72 61 74 65 64 53 74 72 69 6e  ToSeparatedStrin
0860: 67 28 62 75 69 6c 64 65 72 2c 20 6c 69 73 74 2c  g(builder, list,
0870: 20 22 2c 22 2c 20 22 6e 75 6c 6c 22 29 3b 0d 0a   ",", "null");..
0880: 09 09 09 09 62 75 69 6c 64 65 72 2e 41 70 70 65  ....builder.Appe
0890: 6e 64 28 22 3b 20 22 29 3b 0d 0a 09 09 09 7d 0d  nd("; ");.....}.
08a0: 0a 09 09 7d 0d 0a 0d 0a 09 09 69 6e 74 65 72 6e  ...}......intern
08b0: 61 6c 20 62 6f 6f 6c 20 54 72 79 47 65 74 4c 69  al bool TryGetLi
08c0: 73 74 46 6f 72 4b 65 79 28 54 4b 65 79 20 6b 65  stForKey(TKey ke
08d0: 79 2c 20 6f 75 74 20 52 65 61 64 4f 6e 6c 79 43  y, out ReadOnlyC
08e0: 6f 6c 6c 65 63 74 69 6f 6e 3c 54 56 61 6c 75 65  ollection<TValue
08f0: 3e 20 76 61 6c 75 65 43 6f 6c 6c 65 63 74 69 6f  > valueCollectio
0900: 6e 29 0d 0a 09 09 7b 0d 0a 09 09 09 4c 69 73 74  n)....{.....List
0910: 3c 54 56 61 6c 75 65 3e 20 6c 69 73 74 3b 0d 0a  <TValue> list;..
0920: 09 09 09 76 61 6c 75 65 43 6f 6c 6c 65 63 74 69  ...valueCollecti
0930: 6f 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 09 09 09 69  on = null;.....i
0940: 66 20 28 74 68 69 73 2e 6d 5f 6d 61 70 2e 54 72  f (this.m_map.Tr
0950: 79 47 65 74 56 61 6c 75 65 28 6b 65 79 2c 20 6f  yGetValue(key, o
0960: 75 74 20 6c 69 73 74 29 29 0d 0a 09 09 09 7b 0d  ut list)).....{.
0970: 0a 09 09 09 09 76 61 6c 75 65 43 6f 6c 6c 65 63  .....valueCollec
0980: 74 69 6f 6e 20 3d 20 6e 65 77 20 52 65 61 64 4f  tion = new ReadO
0990: 6e 6c 79 43 6f 6c 6c 65 63 74 69 6f 6e 3c 54 56  nlyCollection<TV
09a0: 61 6c 75 65 3e 28 6c 69 73 74 29 3b 0d 0a 09 09  alue>(list);....
09b0: 09 09 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a  ..return true;..
09c0: 09 09 09 7d 0d 0a 09 09 09 72 65 74 75 72 6e 20  ...}.....return 
09d0: 66 61 6c 73 65 3b 0d 0a 09 09 7d 0d 0a 0d 0a 09  false;....}.....
09e0: 09 2f 2f 20 50 72 6f 70 65 72 74 69 65 73 0d 0a  .// Properties..
09f0: 09 09 69 6e 74 65 72 6e 61 6c 20 49 45 6e 75 6d  ..internal IEnum
0a00: 65 72 61 62 6c 65 3c 54 56 61 6c 75 65 3e 20 41  erable<TValue> A
0a10: 6c 6c 56 61 6c 75 65 73 0d 0a 09 09 7b 0d 0a 09  llValues....{...
0a20: 09 09 67 65 74 0d 0a 09 09 09 7b 0d 0a 09 09 09  ..get.....{.....
0a30: 09 66 6f 72 65 61 63 68 20 28 54 4b 65 79 20 6b  .foreach (TKey k
0a40: 65 79 20 69 6e 20 4b 65 79 73 29 0d 0a 09 09 09  ey in Keys).....
0a50: 09 7b 0d 0a 09 09 09 09 09 66 6f 72 65 61 63 68  .{.......foreach
0a60: 20 28 54 56 61 6c 75 65 20 76 61 6c 75 65 20 69   (TValue value i
0a70: 6e 20 4c 69 73 74 46 6f 72 4b 65 79 28 6b 65 79  n ListForKey(key
0a80: 29 29 0d 0a 09 09 09 09 09 7b 0d 0a 09 09 09 09  )).......{......
0a90: 09 09 79 69 65 6c 64 20 72 65 74 75 72 6e 20 76  ..yield return v
0aa0: 61 6c 75 65 3b 0d 0a 09 09 09 09 09 7d 0d 0a 09  alue;.......}...
0ab0: 09 09 09 7d 0d 0a 09 09 09 7d 0d 0a 09 09 7d 0d  ...}.....}....}.
0ac0: 0a 0d 0a 09 09 69 6e 74 65 72 6e 61 6c 20 49 45  .....internal IE
0ad0: 6e 75 6d 65 72 61 62 6c 65 3c 54 4b 65 79 3e 20  numerable<TKey> 
0ae0: 4b 65 79 73 0d 0a 09 09 7b 0d 0a 09 09 09 67 65  Keys....{.....ge
0af0: 74 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 72 65 74  t.....{......ret
0b00: 75 72 6e 20 74 68 69 73 2e 6d 5f 6d 61 70 2e 4b  urn this.m_map.K
0b10: 65 79 73 3b 0d 0a 09 09 09 7d 0d 0a 09 09 7d 0d  eys;.....}....}.
0b20: 0a 0d 0a 09 09 69 6e 74 65 72 6e 61 6c 20 49 45  .....internal IE
0b30: 6e 75 6d 65 72 61 62 6c 65 3c 4b 65 79 56 61 6c  numerable<KeyVal
0b40: 75 65 50 61 69 72 3c 54 4b 65 79 2c 20 4c 69 73  uePair<TKey, Lis
0b50: 74 3c 54 56 61 6c 75 65 3e 3e 3e 20 4b 65 79 56  t<TValue>>> KeyV
0b60: 61 6c 75 65 50 61 69 72 73 0d 0a 09 09 7b 0d 0a  aluePairs....{..
0b70: 23 69 66 20 4e 45 54 5f 34 30 20 7c 7c 20 4e 45  #if NET_40 || NE
0b80: 54 5f 34 35 20 7c 7c 20 4e 45 54 5f 34 35 31 20  T_45 || NET_451 
0b90: 7c 7c 20 4e 45 54 5f 34 35 32 20 7c 7c 20 4e 45  || NET_452 || NE
0ba0: 54 5f 34 36 20 7c 7c 20 4e 45 54 5f 34 36 31 20  T_46 || NET_461 
0bb0: 7c 7c 20 4e 45 54 5f 34 36 32 20 7c 7c 20 4e 45  || NET_462 || NE
0bc0: 54 5f 34 37 20 7c 7c 20 4e 45 54 5f 34 37 31 0d  T_47 || NET_471.
0bd0: 0a 09 09 09 5b 54 61 72 67 65 74 65 64 50 61 74  ....[TargetedPat
0be0: 63 68 69 6e 67 4f 70 74 4f 75 74 28 22 50 65 72  chingOptOut("Per
0bf0: 66 6f 72 6d 61 6e 63 65 20 63 72 69 74 69 63 61  formance critica
0c00: 6c 20 74 6f 20 69 6e 6c 69 6e 65 20 74 68 69 73  l to inline this
0c10: 20 74 79 70 65 20 6f 66 20 6d 65 74 68 6f 64 20   type of method 
0c20: 61 63 72 6f 73 73 20 4e 47 65 6e 20 69 6d 61 67  across NGen imag
0c30: 65 20 62 6f 75 6e 64 61 72 69 65 73 22 29 5d 0d  e boundaries")].
0c40: 0a 23 65 6e 64 69 66 0d 0a 09 09 09 67 65 74 0d  .#endif.....get.
0c50: 0a 09 09 09 7b 0d 0a 09 09 09 09 72 65 74 75 72  ....{......retur
0c60: 6e 20 74 68 69 73 2e 6d 5f 6d 61 70 3b 0d 0a 09  n this.m_map;...
0c70: 09 09 7d 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 7d 0d  ..}....}...}..}.
0c80: 0a                                               .