docs: function parse_TypedPropertyValue(blob, type, _opts) {
  	var t = blob.read_shift(2), ret, opts = _opts||{};
  	blob.l += 2;
  	if(type !== VT_VARIANT)
  	if(t !== type && VT_CUSTOM.indexOf(type)===-1) throw new Error('Expected type ' + type + ' saw ' + t);
  	switch(type === VT_VARIANT ? t : type) {
  		case 0x02 /*VT_I2*/: ret = blob.read_shift(2, 'i'); if(!opts.raw) blob.l += 2; return ret;
  		case 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret;
  		case 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0;
  		case 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret;
  		case 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,'');
  		case 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob);
  		case 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob);
  		case 0x41 /*VT_BLOB*/: return parse_BLOB(blob);
  		case 0x47 /*VT_CF*/: return parse_ClipboardData(blob);
  		case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw && 4).replace(chr0,'');
  		case 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,'');
  		case 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPair(blob);
  		case 0x101E /*VT_LPSTR*/: return parse_VtVecUnalignedLpstr(blob);
  		default: throw new Error("TypedPropertyValue unrecognized type " + type + " " + t);
  	}
  }