@zip.js/zip.js 2.8.7 → 2.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,6 +42,8 @@ const PROPERTY_NAME_CREATION_DATE = "creationDate";
42
42
  const PROPERTY_NAME_RAW_CREATION_DATE = "rawCreationDate";
43
43
  const PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES = "internalFileAttributes";
44
44
  const PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES = "externalFileAttributes";
45
+ const PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW = "msdosAttributesRaw";
46
+ const PROPERTY_NAME_MSDOS_ATTRIBUTES = "msdosAttributes";
45
47
  const PROPERTY_NAME_MS_DOS_COMPATIBLE = "msDosCompatible";
46
48
  const PROPERTY_NAME_ZIP64 = "zip64";
47
49
  const PROPERTY_NAME_ENCRYPTED = "encrypted";
@@ -53,17 +55,73 @@ const PROPERTY_NAME_EXECUTABLE = "executable";
53
55
  const PROPERTY_NAME_COMPRESSION_METHOD = "compressionMethod";
54
56
  const PROPERTY_NAME_SIGNATURE = "signature";
55
57
  const PROPERTY_NAME_EXTRA_FIELD = "extraField";
58
+ const PROPERTY_NAME_EXTRA_FIELD_INFOZIP = "extraFieldInfoZip";
59
+ const PROPERTY_NAME_EXTRA_FIELD_UNIX = "extraFieldUnix";
60
+ const PROPERTY_NAME_UID = "uid";
61
+ const PROPERTY_NAME_GID = "gid";
62
+ const PROPERTY_NAME_UNIX_MODE = "unixMode";
63
+ const PROPERTY_NAME_SETUID = "setuid";
64
+ const PROPERTY_NAME_SETGID = "setgid";
65
+ const PROPERTY_NAME_STICKY = "sticky";
66
+ const PROPERTY_NAME_BITFLAG = "bitFlag";
67
+ const PROPERTY_NAME_FILENAME_UTF8 = "filenameUTF8";
68
+ const PROPERTY_NAME_COMMENT_UTF8 = "commentUTF8";
69
+ const PROPERTY_NAME_RAW_EXTRA_FIELD = "rawExtraField";
70
+ const PROPERTY_NAME_EXTRA_FIELD_ZIP64 = "extraFieldZip64";
71
+ const PROPERTY_NAME_EXTRA_FIELD_UNICODE_PATH = "extraFieldUnicodePath";
72
+ const PROPERTY_NAME_EXTRA_FIELD_UNICODE_COMMENT = "extraFieldUnicodeComment";
73
+ const PROPERTY_NAME_EXTRA_FIELD_AES = "extraFieldAES";
74
+ const PROPERTY_NAME_EXTRA_FIELD_NTFS = "extraFieldNTFS";
75
+ const PROPERTY_NAME_EXTRA_FIELD_EXTENDED_TIMESTAMP = "extraFieldExtendedTimestamp";
56
76
 
57
77
  const PROPERTY_NAMES = [
58
- PROPERTY_NAME_FILENAME, PROPERTY_NAME_RAW_FILENAME, PROPERTY_NAME_COMPRESSED_SIZE, PROPERTY_NAME_UNCOMPRESSED_SIZE,
59
- PROPERTY_NAME_LAST_MODIFICATION_DATE, PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE, PROPERTY_NAME_COMMENT, PROPERTY_NAME_RAW_COMMENT,
60
- PROPERTY_NAME_LAST_ACCESS_DATE, PROPERTY_NAME_CREATION_DATE, PROPERTY_NAME_OFFSET, PROPERTY_NAME_DISK_NUMBER_START,
61
- PROPERTY_NAME_DISK_NUMBER_START, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES,
62
- PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES, PROPERTY_NAME_MS_DOS_COMPATIBLE, PROPERTY_NAME_ZIP64,
63
- PROPERTY_NAME_ENCRYPTED, PROPERTY_NAME_VERSION, PROPERTY_NAME_VERSION_MADE_BY, PROPERTY_NAME_ZIPCRYPTO, PROPERTY_NAME_DIRECTORY,
64
- PROPERTY_NAME_EXECUTABLE, PROPERTY_NAME_COMPRESSION_METHOD, PROPERTY_NAME_SIGNATURE, PROPERTY_NAME_EXTRA_FIELD,
65
- "bitFlag", "filenameUTF8", "commentUTF8", "rawExtraField", "extraFieldZip64", "extraFieldUnicodePath", "extraFieldUnicodeComment",
66
- "extraFieldAES", "extraFieldNTFS", "extraFieldExtendedTimestamp"];
78
+ PROPERTY_NAME_FILENAME,
79
+ PROPERTY_NAME_RAW_FILENAME,
80
+ PROPERTY_NAME_UNCOMPRESSED_SIZE,
81
+ PROPERTY_NAME_COMPRESSED_SIZE,
82
+ PROPERTY_NAME_LAST_MODIFICATION_DATE,
83
+ PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE,
84
+ PROPERTY_NAME_COMMENT,
85
+ PROPERTY_NAME_RAW_COMMENT,
86
+ PROPERTY_NAME_LAST_ACCESS_DATE,
87
+ PROPERTY_NAME_CREATION_DATE,
88
+ PROPERTY_NAME_RAW_CREATION_DATE,
89
+ PROPERTY_NAME_OFFSET,
90
+ PROPERTY_NAME_DISK_NUMBER_START,
91
+ PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES,
92
+ PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES,
93
+ PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW,
94
+ PROPERTY_NAME_MSDOS_ATTRIBUTES,
95
+ PROPERTY_NAME_MS_DOS_COMPATIBLE,
96
+ PROPERTY_NAME_ZIP64,
97
+ PROPERTY_NAME_ENCRYPTED,
98
+ PROPERTY_NAME_VERSION,
99
+ PROPERTY_NAME_VERSION_MADE_BY,
100
+ PROPERTY_NAME_ZIPCRYPTO,
101
+ PROPERTY_NAME_DIRECTORY,
102
+ PROPERTY_NAME_EXECUTABLE,
103
+ PROPERTY_NAME_COMPRESSION_METHOD,
104
+ PROPERTY_NAME_SIGNATURE,
105
+ PROPERTY_NAME_EXTRA_FIELD,
106
+ PROPERTY_NAME_EXTRA_FIELD_UNIX,
107
+ PROPERTY_NAME_EXTRA_FIELD_INFOZIP,
108
+ PROPERTY_NAME_UID,
109
+ PROPERTY_NAME_GID,
110
+ PROPERTY_NAME_UNIX_MODE,
111
+ PROPERTY_NAME_SETUID,
112
+ PROPERTY_NAME_SETGID,
113
+ PROPERTY_NAME_STICKY,
114
+ PROPERTY_NAME_BITFLAG,
115
+ PROPERTY_NAME_FILENAME_UTF8,
116
+ PROPERTY_NAME_COMMENT_UTF8,
117
+ PROPERTY_NAME_RAW_EXTRA_FIELD,
118
+ PROPERTY_NAME_EXTRA_FIELD_ZIP64,
119
+ PROPERTY_NAME_EXTRA_FIELD_UNICODE_PATH,
120
+ PROPERTY_NAME_EXTRA_FIELD_UNICODE_COMMENT,
121
+ PROPERTY_NAME_EXTRA_FIELD_AES,
122
+ PROPERTY_NAME_EXTRA_FIELD_NTFS,
123
+ PROPERTY_NAME_EXTRA_FIELD_EXTENDED_TIMESTAMP
124
+ ];
67
125
 
68
126
  class Entry {
69
127
 
@@ -90,6 +148,8 @@ export {
90
148
  PROPERTY_NAME_RAW_CREATION_DATE,
91
149
  PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES,
92
150
  PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES,
151
+ PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW,
152
+ PROPERTY_NAME_MSDOS_ATTRIBUTES,
93
153
  PROPERTY_NAME_MS_DOS_COMPATIBLE,
94
154
  PROPERTY_NAME_ZIP64,
95
155
  PROPERTY_NAME_ENCRYPTED,
@@ -101,5 +161,11 @@ export {
101
161
  PROPERTY_NAME_COMPRESSION_METHOD,
102
162
  PROPERTY_NAME_SIGNATURE,
103
163
  PROPERTY_NAME_EXTRA_FIELD,
164
+ PROPERTY_NAME_GID,
165
+ PROPERTY_NAME_UID,
166
+ PROPERTY_NAME_UNIX_MODE,
167
+ PROPERTY_NAME_SETUID,
168
+ PROPERTY_NAME_SETGID,
169
+ PROPERTY_NAME_STICKY,
104
170
  Entry
105
171
  };
@@ -32,6 +32,7 @@
32
32
  import {
33
33
  MAX_32_BITS,
34
34
  MAX_16_BITS,
35
+ MAX_8_BITS,
35
36
  COMPRESSION_METHOD_DEFLATE,
36
37
  COMPRESSION_METHOD_STORE,
37
38
  COMPRESSION_METHOD_AES,
@@ -52,6 +53,8 @@ import {
52
53
  EXTRAFIELD_TYPE_NTFS,
53
54
  EXTRAFIELD_TYPE_NTFS_TAG1,
54
55
  EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
56
+ EXTRAFIELD_TYPE_INFOZIP,
57
+ EXTRAFIELD_TYPE_UNIX,
55
58
  EXTRAFIELD_TYPE_USDZ,
56
59
  END_OF_CENTRAL_DIR_LENGTH,
57
60
  ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH,
@@ -61,16 +64,24 @@ import {
61
64
  BITFLAG_DATA_DESCRIPTOR,
62
65
  BITFLAG_LANG_ENCODING_FLAG,
63
66
  FILE_ATTR_MSDOS_DIR_MASK,
67
+ FILE_ATTR_MSDOS_READONLY_MASK,
68
+ FILE_ATTR_MSDOS_HIDDEN_MASK,
69
+ FILE_ATTR_MSDOS_SYSTEM_MASK,
70
+ FILE_ATTR_MSDOS_ARCHIVE_MASK,
64
71
  FILE_ATTR_UNIX_TYPE_MASK,
65
72
  FILE_ATTR_UNIX_TYPE_DIR,
66
73
  FILE_ATTR_UNIX_EXECUTABLE_MASK,
74
+ FILE_ATTR_UNIX_DEFAULT_MASK,
67
75
  DIRECTORY_SIGNATURE,
68
76
  HEADER_SIZE,
69
77
  HEADER_OFFSET_SIGNATURE,
70
78
  HEADER_OFFSET_COMPRESSED_SIZE,
71
79
  HEADER_OFFSET_UNCOMPRESSED_SIZE,
72
80
  UNDEFINED_VALUE,
73
- COMPRESSION_METHOD_DEFLATE_64
81
+ COMPRESSION_METHOD_DEFLATE_64,
82
+ FILE_ATTR_UNIX_SETUID_MASK,
83
+ FILE_ATTR_UNIX_SETGID_MASK,
84
+ FILE_ATTR_UNIX_STICKY_MASK
74
85
  } from "./constants.js";
75
86
  import {
76
87
  getConfiguration,
@@ -142,6 +153,7 @@ const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
142
153
  const ERR_SPLIT_ZIP_FILE = "Split zip file";
143
154
  const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
144
155
  const CHARSET_UTF8 = "utf-8";
156
+ const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
145
157
  const CHARSET_CP437 = "cp437";
146
158
  const ZIP64_PROPERTIES = [
147
159
  [PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
@@ -297,51 +309,71 @@ class ZipReader {
297
309
  const filenameUTF8 = languageEncodingFlag;
298
310
  const commentUTF8 = languageEncodingFlag;
299
311
  const externalFileAttributes = getUint32(directoryView, offset + 38);
300
- const directory =
301
- (msDosCompatible && ((getUint8(directoryView, offset + 38) & FILE_ATTR_MSDOS_DIR_MASK) == FILE_ATTR_MSDOS_DIR_MASK)) ||
302
- (unixCompatible && (((externalFileAttributes >> 16) & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR)) ||
303
- (rawFilename.length && rawFilename.at(-1) == DIRECTORY_SIGNATURE.charCodeAt(0));
304
- const executable = (unixCompatible && (((externalFileAttributes >> 16) & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0));
312
+ const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
313
+ const msdosAttributes = {
314
+ readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
315
+ hidden: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_HIDDEN_MASK),
316
+ system: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_SYSTEM_MASK),
317
+ directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
318
+ archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
319
+ };
305
320
  const offsetFileEntry = getUint32(directoryView, offset + 42) + prependedDataLength;
321
+ const decode = getOptionValue(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
322
+ const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
323
+ const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
324
+ let filename = decode(rawFilename, rawFilenameEncoding);
325
+ if (filename === UNDEFINED_VALUE) {
326
+ filename = decodeText(rawFilename, rawFilenameEncoding);
327
+ }
328
+ let comment = decode(rawComment, rawCommentEncoding);
329
+ if (comment === UNDEFINED_VALUE) {
330
+ comment = decodeText(rawComment, rawCommentEncoding);
331
+ }
306
332
  Object.assign(fileEntry, {
307
333
  versionMadeBy,
308
334
  msDosCompatible,
309
335
  compressedSize: 0,
310
336
  uncompressedSize: 0,
311
337
  commentLength,
312
- directory,
313
338
  offset: offsetFileEntry,
314
339
  diskNumberStart: getUint16(directoryView, offset + 34),
315
340
  internalFileAttributes: getUint16(directoryView, offset + 36),
316
341
  externalFileAttributes,
342
+ msdosAttributesRaw,
343
+ msdosAttributes,
317
344
  rawFilename,
318
345
  filenameUTF8,
319
346
  commentUTF8,
320
347
  rawExtraField: directoryArray.subarray(extraFieldOffset, commentOffset),
321
- executable
322
- });
323
- fileEntry.internalFileAttribute = fileEntry.internalFileAttributes;
324
- fileEntry.externalFileAttribute = fileEntry.externalFileAttributes;
325
- const decode = getOptionValue(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
326
- const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
327
- const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
328
- let filename = decode(rawFilename, rawFilenameEncoding);
329
- if (filename === UNDEFINED_VALUE) {
330
- filename = decodeText(rawFilename, rawFilenameEncoding);
331
- }
332
- let comment = decode(rawComment, rawCommentEncoding);
333
- if (comment === UNDEFINED_VALUE) {
334
- comment = decodeText(rawComment, rawCommentEncoding);
335
- }
336
- Object.assign(fileEntry, {
337
348
  rawComment,
338
349
  filename,
339
- comment,
340
- directory: directory || filename.endsWith(DIRECTORY_SIGNATURE)
350
+ comment
341
351
  });
342
352
  startOffset = Math.max(offsetFileEntry, startOffset);
343
353
  readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
344
- fileEntry.zipCrypto = fileEntry.encrypted && !fileEntry.extraFieldAES;
354
+ const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
355
+ if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
356
+ fileEntry.unixMode = unixExternalUpper;
357
+ }
358
+ const setuid = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_SETUID_MASK);
359
+ const setgid = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_SETGID_MASK);
360
+ const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
361
+ const executable = (fileEntry.unixMode !== UNDEFINED_VALUE)
362
+ ? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
363
+ : (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0));
364
+ const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
365
+ const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
366
+ Object.assign(fileEntry, {
367
+ setuid,
368
+ setgid,
369
+ sticky,
370
+ unixExternalUpper,
371
+ internalFileAttribute: fileEntry.internalFileAttributes,
372
+ externalFileAttribute: fileEntry.externalFileAttributes,
373
+ executable,
374
+ directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
375
+ zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
376
+ });
345
377
  const entry = new Entry(fileEntry);
346
378
  entry.getData = (writer, options) => fileEntry.getData(writer, entry, zipReader.readRanges, options);
347
379
  entry.arrayBuffer = async options => {
@@ -534,7 +566,7 @@ class ZipEntry {
534
566
  zipCrypto,
535
567
  encryptionStrength: extraFieldAES && extraFieldAES.strength,
536
568
  signed: getOptionValue(zipEntry, options, OPTION_CHECK_SIGNATURE) && !passThrough,
537
- passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & 0xFF) : ((signature >>> 24) & 0xFF)),
569
+ passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((signature >>> 24) & MAX_8_BITS)),
538
570
  outputSize: passThrough ? compressedSize : uncompressedSize,
539
571
  signature,
540
572
  compressed: compressionMethod != 0 && !passThrough,
@@ -665,6 +697,17 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
665
697
  readExtraFieldNTFS(extraFieldNTFS, directory);
666
698
  directory.extraFieldNTFS = extraFieldNTFS;
667
699
  }
700
+ const extraFieldUnix = extraField.get(EXTRAFIELD_TYPE_UNIX);
701
+ if (extraFieldUnix) {
702
+ readExtraFieldUnix(extraFieldUnix, directory, false);
703
+ directory.extraFieldUnix = extraFieldUnix;
704
+ } else {
705
+ const extraFieldInfoZip = extraField.get(EXTRAFIELD_TYPE_INFOZIP);
706
+ if (extraFieldInfoZip) {
707
+ readExtraFieldUnix(extraFieldInfoZip, directory, true);
708
+ directory.extraFieldInfoZip = extraFieldInfoZip;
709
+ }
710
+ }
668
711
  const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
669
712
  if (extraFieldExtendedTimestamp) {
670
713
  readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
@@ -706,7 +749,7 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
706
749
  });
707
750
  if (extraFieldUnicode.valid) {
708
751
  directory[propertyName] = extraFieldUnicode[propertyName];
709
- directory[propertyName + "UTF8"] = true;
752
+ directory[propertyName + PROPERTY_NAME_UTF8_SUFFIX] = true;
710
753
  }
711
754
  }
712
755
 
@@ -762,6 +805,47 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
762
805
  }
763
806
  }
764
807
 
808
+ function readExtraFieldUnix(extraField, directory, isInfoZip) {
809
+ try {
810
+ const view = getDataView(new Uint8Array(extraField.data));
811
+ let offset = 0;
812
+ const version = getUint8(view, offset++);
813
+ const uidSize = getUint8(view, offset++);
814
+ const uidBytes = extraField.data.subarray(offset, offset + uidSize);
815
+ offset += uidSize;
816
+ const uid = unpackUnixId(uidBytes);
817
+ const gidSize = getUint8(view, offset++);
818
+ const gidBytes = extraField.data.subarray(offset, offset + gidSize);
819
+ offset += gidSize;
820
+ const gid = unpackUnixId(gidBytes);
821
+ let unixMode = UNDEFINED_VALUE;
822
+ if (!isInfoZip && offset + 2 <= extraField.data.length) {
823
+ const base = extraField.data;
824
+ const modeView = new DataView(base.buffer, base.byteOffset + offset, 2);
825
+ unixMode = modeView.getUint16(0, true);
826
+ }
827
+ Object.assign(extraField, { version, uid, gid, unixMode });
828
+ if (uid !== UNDEFINED_VALUE) {
829
+ directory.uid = uid;
830
+ }
831
+ if (gid !== UNDEFINED_VALUE) {
832
+ directory.gid = gid;
833
+ }
834
+ if (unixMode !== UNDEFINED_VALUE) {
835
+ directory.unixMode = unixMode;
836
+ }
837
+ } catch {
838
+ // ignored
839
+ }
840
+ }
841
+
842
+ function unpackUnixId(bytes) {
843
+ const buffer = new Uint8Array(4);
844
+ buffer.set(bytes, 0);
845
+ const view = new DataView(buffer.buffer, buffer.byteOffset, 4);
846
+ return view.getUint32(0, true);
847
+ }
848
+
765
849
  function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory) {
766
850
  const extraFieldView = getDataView(extraFieldExtendedTimestamp.data);
767
851
  const flags = getUint8(extraFieldView, 0);
@@ -888,7 +972,7 @@ function getOptionValue(zipReader, options, name) {
888
972
  }
889
973
 
890
974
  function getDate(timeRaw) {
891
- const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & 0x0000ffff;
975
+ const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
892
976
  try {
893
977
  return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
894
978
  } catch {