@swf2es/format 0.0.0-stage → 0.1.0

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.
Files changed (98) hide show
  1. package/LICENSE +202 -0
  2. package/LICENSE.third-party +35 -0
  3. package/README.md +22 -2
  4. package/dist/abc-names.d.ts +3 -0
  5. package/dist/abc-names.d.ts.map +1 -0
  6. package/dist/abc-names.js +127 -0
  7. package/dist/abc-names.js.map +1 -0
  8. package/dist/actions.d.ts +106 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +223 -0
  11. package/dist/actions.js.map +1 -0
  12. package/dist/air-descriptor.d.ts +11 -0
  13. package/dist/air-descriptor.d.ts.map +1 -0
  14. package/dist/air-descriptor.js +64 -0
  15. package/dist/air-descriptor.js.map +1 -0
  16. package/dist/api-versions.d.ts +12 -0
  17. package/dist/api-versions.d.ts.map +1 -0
  18. package/dist/api-versions.js +23 -0
  19. package/dist/api-versions.js.map +1 -0
  20. package/dist/bitmap.d.ts +34 -0
  21. package/dist/bitmap.d.ts.map +1 -0
  22. package/dist/bitmap.js +200 -0
  23. package/dist/bitmap.js.map +1 -0
  24. package/dist/button.d.ts +39 -0
  25. package/dist/button.d.ts.map +1 -0
  26. package/dist/button.js +61 -0
  27. package/dist/button.js.map +1 -0
  28. package/dist/compression.d.ts +47 -0
  29. package/dist/compression.d.ts.map +1 -0
  30. package/dist/compression.js +201 -0
  31. package/dist/compression.js.map +1 -0
  32. package/dist/display.d.ts +106 -0
  33. package/dist/display.d.ts.map +1 -0
  34. package/dist/display.js +306 -0
  35. package/dist/display.js.map +1 -0
  36. package/dist/filters.d.ts +66 -0
  37. package/dist/filters.d.ts.map +1 -0
  38. package/dist/filters.js +137 -0
  39. package/dist/filters.js.map +1 -0
  40. package/dist/font.d.ts +60 -0
  41. package/dist/font.d.ts.map +1 -0
  42. package/dist/font.js +169 -0
  43. package/dist/font.js.map +1 -0
  44. package/dist/index.d.ts +27 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +27 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/lzma.d.ts +33 -0
  49. package/dist/lzma.d.ts.map +1 -0
  50. package/dist/lzma.js +279 -0
  51. package/dist/lzma.js.map +1 -0
  52. package/dist/pbj.d.ts +178 -0
  53. package/dist/pbj.d.ts.map +1 -0
  54. package/dist/pbj.js +485 -0
  55. package/dist/pbj.js.map +1 -0
  56. package/dist/shape.d.ts +152 -0
  57. package/dist/shape.d.ts.map +1 -0
  58. package/dist/shape.js +412 -0
  59. package/dist/shape.js.map +1 -0
  60. package/dist/sound.d.ts +71 -0
  61. package/dist/sound.d.ts.map +1 -0
  62. package/dist/sound.js +92 -0
  63. package/dist/sound.js.map +1 -0
  64. package/dist/swf.d.ts +77 -0
  65. package/dist/swf.d.ts.map +1 -0
  66. package/dist/swf.js +164 -0
  67. package/dist/swf.js.map +1 -0
  68. package/dist/tags.d.ts +57 -0
  69. package/dist/tags.d.ts.map +1 -0
  70. package/dist/tags.js +59 -0
  71. package/dist/tags.js.map +1 -0
  72. package/dist/text.d.ts +75 -0
  73. package/dist/text.d.ts.map +1 -0
  74. package/dist/text.js +136 -0
  75. package/dist/text.js.map +1 -0
  76. package/dist/zip.d.ts +17 -0
  77. package/dist/zip.d.ts.map +1 -0
  78. package/dist/zip.js +92 -0
  79. package/dist/zip.js.map +1 -0
  80. package/package.json +33 -3
  81. package/src/abc-names.ts +138 -0
  82. package/src/actions.ts +319 -0
  83. package/src/air-descriptor.ts +84 -0
  84. package/src/api-versions.ts +27 -0
  85. package/src/bitmap.ts +259 -0
  86. package/src/button.ts +99 -0
  87. package/src/compression.ts +243 -0
  88. package/src/display.ts +419 -0
  89. package/src/filters.ts +206 -0
  90. package/src/font.ts +238 -0
  91. package/src/index.ts +151 -0
  92. package/src/pbj.ts +651 -0
  93. package/src/shape.ts +618 -0
  94. package/src/sound.ts +173 -0
  95. package/src/swf.ts +234 -0
  96. package/src/tags.ts +58 -0
  97. package/src/text.ts +213 -0
  98. package/src/zip.ts +135 -0
package/dist/text.js ADDED
@@ -0,0 +1,136 @@
1
+ // The text characters a SWF places on its timeline: editable text
2
+ // (DefineEditText) and static text (DefineText, DefineText2).
3
+ import { readString, utf8 } from "./display.js";
4
+ import { readMatrix } from "./shape.js";
5
+ import { SwfReader } from "./swf.js";
6
+ import { DefineText2 } from "./tags.js";
7
+ /** DefineEditText (tag 37), including every conditional field before its variable and text. */
8
+ export function readEditText(bytes, tag) {
9
+ const r = new SwfReader(bytes, tag.offset, tag.offset + tag.length);
10
+ const id = r.u16();
11
+ const bounds = r.rect();
12
+ const flags = r.u8();
13
+ const flags2 = r.u8();
14
+ const hasText = (flags & 0x80) !== 0;
15
+ const hasFont = (flags & 0x01) !== 0;
16
+ const hasFontClass = (flags2 & 0x80) !== 0;
17
+ const fontId = hasFont ? r.u16() : null;
18
+ const fontClass = hasFontClass ? readString(r) : null;
19
+ const fontHeight = hasFont || hasFontClass ? r.u16() : null;
20
+ const color = flags & 0x04 ? r.u32() : null;
21
+ const maxLength = flags & 0x02 ? r.u16() : null;
22
+ let align = 0;
23
+ let leftMargin = 0;
24
+ let rightMargin = 0;
25
+ let indent = 0;
26
+ let leading = 0;
27
+ if (flags2 & 0x20) {
28
+ align = r.u8();
29
+ leftMargin = r.u16();
30
+ rightMargin = r.u16();
31
+ // Signed, as Flash reads it, though the specification says UI16: a hanging indent is negative.
32
+ indent = r.s16();
33
+ leading = r.s16();
34
+ }
35
+ return {
36
+ id,
37
+ bounds,
38
+ variable: readString(r),
39
+ text: hasText ? readString(r) : "",
40
+ color,
41
+ fontId,
42
+ fontClass,
43
+ fontHeight,
44
+ align,
45
+ leftMargin,
46
+ rightMargin,
47
+ indent,
48
+ leading,
49
+ maxLength,
50
+ wordWrap: (flags & 0x40) !== 0,
51
+ multiline: (flags & 0x20) !== 0,
52
+ password: (flags & 0x10) !== 0,
53
+ readOnly: (flags & 0x08) !== 0,
54
+ autoSize: (flags2 & 0x40) !== 0,
55
+ selectable: (flags2 & 0x10) === 0,
56
+ border: (flags2 & 0x08) !== 0,
57
+ html: (flags2 & 0x02) !== 0,
58
+ useOutlines: (flags2 & 0x01) !== 0,
59
+ };
60
+ }
61
+ /** DefineFont2 (48) or DefineFont3 (75): the id, flags, language, then the name, a length-prefixed string. */
62
+ export function readFontName(bytes, tag) {
63
+ const r = new SwfReader(bytes, tag.offset, tag.offset + tag.length);
64
+ const id = r.u16();
65
+ const flags = r.u8();
66
+ r.u8();
67
+ const length = r.u8();
68
+ const start = r.pos;
69
+ let end = Math.min(start + length, r.end);
70
+ // A trailing NUL, which some tools write, is no part of the name.
71
+ while (end > start && bytes[end - 1] === 0) {
72
+ end--;
73
+ }
74
+ const name = utf8(bytes.subarray(start, end));
75
+ return { id, name, bold: (flags & 0x01) !== 0, italic: (flags & 0x02) !== 0 };
76
+ }
77
+ /** DefineText (11) or DefineText2 (33, whose colours have alpha), up to its end record or the tag's end. */
78
+ export function readStaticText(bytes, tag) {
79
+ const r = new SwfReader(bytes, tag.offset, tag.offset + tag.length);
80
+ const alpha = tag.code === DefineText2;
81
+ const id = r.u16();
82
+ const bounds = r.rect();
83
+ const matrix = readMatrix(r);
84
+ const glyphBits = r.u8();
85
+ const advanceBits = r.u8();
86
+ const records = [];
87
+ for (;;) {
88
+ const flags = r.u8();
89
+ if (flags === 0 || r.overrun) {
90
+ break;
91
+ }
92
+ const font = flags & 0x08 ? r.u16() : null;
93
+ let color = null;
94
+ if (flags & 0x04) {
95
+ const red = r.u8();
96
+ const green = r.u8();
97
+ const blue = r.u8();
98
+ const a = alpha ? r.u8() : 255;
99
+ color = ((a << 24) | (red << 16) | (green << 8) | blue) >>> 0;
100
+ }
101
+ const x = flags & 0x01 ? r.s16() : null;
102
+ const y = flags & 0x02 ? r.s16() : null;
103
+ const height = font !== null ? r.u16() : null;
104
+ const count = r.u8();
105
+ const glyphs = [];
106
+ for (let i = 0; i < count && !r.overrun; i++) {
107
+ glyphs.push({ index: r.ub(glyphBits), advance: r.sb(advanceBits) });
108
+ }
109
+ // A record the tag's end cuts off is left out, not read as zeros.
110
+ if (r.overrun) {
111
+ break;
112
+ }
113
+ r.align();
114
+ records.push({ font, color, x, y, height, glyphs });
115
+ }
116
+ return { id, bounds, matrix, records };
117
+ }
118
+ export function readCsmTextSettings(bytes, tag) {
119
+ const r = new SwfReader(bytes, tag.offset, tag.offset + tag.length);
120
+ const id = r.u16();
121
+ const flags = r.u8();
122
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
123
+ const float = () => {
124
+ const at = r.pos;
125
+ r.pos += 4;
126
+ return at + 4 <= r.end ? view.getFloat32(at, true) : 0;
127
+ };
128
+ return {
129
+ id,
130
+ useFlashType: flags >> 6 === 1,
131
+ gridFit: (flags >> 3) & 7,
132
+ thickness: float(),
133
+ sharpness: float(),
134
+ };
135
+ }
136
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"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"}
package/dist/zip.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ export declare class ZipError extends Error {
2
+ name: string;
3
+ }
4
+ /** One file of an archive; a directory's name ends in "/". */
5
+ export interface ZipEntry {
6
+ /** Its path in the archive, "/"-separated. */
7
+ name: string;
8
+ /** Its uncompressed size in bytes. */
9
+ size: number;
10
+ /** When it was last changed, in ms since 1970, read as local time as DOS's fields are. */
11
+ modified: number;
12
+ /** Its bytes, inflated on each call. */
13
+ bytes(): Uint8Array;
14
+ }
15
+ /** The files of the archive `zip`, in its central directory's order. */
16
+ export declare function readZip(zip: Uint8Array): ZipEntry[];
17
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../src/zip.ts"],"names":[],"mappings":"AAgBA,qBAAa,QAAS,SAAQ,KAAK;IACxB,IAAI,SAAc;CAC5B;AAED,8DAA8D;AAC9D,MAAM,WAAW,QAAQ;IACvB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,KAAK,IAAI,UAAU,CAAC;CACrB;AAED,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,QAAQ,EAAE,CA2CnD"}
package/dist/zip.js ADDED
@@ -0,0 +1,92 @@
1
+ // A ZIP archive's files, as an AIR package (`.air`) and any zip of an
2
+ // application's folder hold them: the central directory read from the
3
+ // archive's end, each file stored or deflated. Enough for what packagers
4
+ // write; ZIP64, encryption and the other methods are refused.
5
+ import { zlibUncompress } from "./compression.js";
6
+ import { utf8 } from "./display.js";
7
+ const END_SIGNATURE = 0x06054b50;
8
+ const CENTRAL_SIGNATURE = 0x02014b50;
9
+ const LOCAL_SIGNATURE = 0x04034b50;
10
+ /** The end record's size without its comment, and the most its comment may add. */
11
+ const END_SIZE = 22;
12
+ const MAX_COMMENT = 0xffff;
13
+ const STORED = 0;
14
+ const DEFLATED = 8;
15
+ export class ZipError extends Error {
16
+ name = "ZipError";
17
+ }
18
+ /** The files of the archive `zip`, in its central directory's order. */
19
+ export function readZip(zip) {
20
+ const view = new DataView(zip.buffer, zip.byteOffset, zip.byteLength);
21
+ const end = findEnd(zip, view);
22
+ const count = view.getUint16(end + 10, true);
23
+ let at = view.getUint32(end + 16, true);
24
+ const entries = [];
25
+ for (let i = 0; i < count; i++) {
26
+ if (at + 46 > zip.length || view.getUint32(at, true) !== CENTRAL_SIGNATURE) {
27
+ throw new ZipError("the central directory is cut short");
28
+ }
29
+ const method = view.getUint16(at + 10, true);
30
+ const time = view.getUint16(at + 12, true);
31
+ const date = view.getUint16(at + 14, true);
32
+ const compressed = view.getUint32(at + 20, true);
33
+ const size = view.getUint32(at + 24, true);
34
+ const nameLength = view.getUint16(at + 28, true);
35
+ const extraLength = view.getUint16(at + 30, true);
36
+ const commentLength = view.getUint16(at + 32, true);
37
+ const local = view.getUint32(at + 42, true);
38
+ const name = utf8(zip.subarray(at + 46, at + 46 + nameLength));
39
+ if (compressed === 0xffffffff || size === 0xffffffff || local === 0xffffffff) {
40
+ throw new ZipError(`${name}: ZIP64 archives are not read`);
41
+ }
42
+ if ((view.getUint16(at + 8, true) & 1) !== 0) {
43
+ throw new ZipError(`${name}: encrypted`);
44
+ }
45
+ if (method !== STORED && method !== DEFLATED) {
46
+ throw new ZipError(`${name}: compression method ${method} is not read`);
47
+ }
48
+ entries.push({
49
+ name,
50
+ size,
51
+ modified: dosTime(date, time),
52
+ bytes: () => entryBytes(zip, view, name, local, method, compressed, size),
53
+ });
54
+ at += 46 + nameLength + extraLength + commentLength;
55
+ }
56
+ return entries;
57
+ }
58
+ /**
59
+ * Where the end of central directory record starts: the last signature
60
+ * whose comment the archive holds, as some tools leave bytes after it.
61
+ */
62
+ function findEnd(zip, view) {
63
+ const last = zip.length - END_SIZE;
64
+ for (let at = last; at >= 0 && at >= last - MAX_COMMENT; at--) {
65
+ if (view.getUint32(at, true) === END_SIGNATURE &&
66
+ at + END_SIZE + view.getUint16(at + 20, true) <= zip.length) {
67
+ return at;
68
+ }
69
+ }
70
+ throw new ZipError("not a ZIP archive: no end of central directory");
71
+ }
72
+ function entryBytes(zip, view, name, local, method, compressed, size) {
73
+ if (local + 30 > zip.length || view.getUint32(local, true) !== LOCAL_SIGNATURE) {
74
+ throw new ZipError(`${name}: no local header where the directory says`);
75
+ }
76
+ // The local header's own name and extra lengths, which may differ from the directory's.
77
+ const start = local + 30 + view.getUint16(local + 26, true) + view.getUint16(local + 28, true);
78
+ if (start + compressed > zip.length) {
79
+ throw new ZipError(`${name}: cut short`);
80
+ }
81
+ const data = zip.subarray(start, start + compressed);
82
+ const bytes = method === STORED ? data.slice() : zlibUncompress(data, true);
83
+ if (bytes.length !== size) {
84
+ throw new ZipError(`${name}: ${bytes.length} bytes where the directory says ${size}`);
85
+ }
86
+ return bytes;
87
+ }
88
+ /** A DOS date and time (2-second steps) as ms since 1970, read as local time. */
89
+ function dosTime(date, time) {
90
+ return new Date(1980 + (date >> 9), ((date >> 5) & 15) - 1, date & 31, time >> 11, (time >> 5) & 63, (time & 31) * 2).getTime();
91
+ }
92
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../src/zip.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,36 @@
1
1
  {
2
2
  "name": "@swf2es/format",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "SWF, ABC and AVM1 action parsers shared by the compiler and the player",
5
+ "keywords": [
6
+ "swf",
7
+ "flash",
8
+ "abc",
9
+ "avm1",
10
+ "parser"
11
+ ],
12
+ "homepage": "https://swf2es.github.io/swf2es/",
13
+ "bugs": "https://github.com/swf2es/swf2es/issues",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/swf2es/swf2es.git",
17
+ "directory": "packages/format"
18
+ },
19
+ "license": "Apache-2.0 AND (Apache-2.0 OR MIT)",
20
+ "type": "module",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "!dist/**/.tsbuildinfo",
30
+ "src",
31
+ "LICENSE.third-party"
32
+ ],
33
+ "dependencies": {
34
+ "@swf2es/native": "0.1.0"
35
+ }
6
36
  }
@@ -0,0 +1,138 @@
1
+ // The names an ABC refers to, read from its constant pool alone: each
2
+ // qualified name, "package::Name" as avmplus writes a definition's (a
3
+ // top-level one bare), from the pool's QNames in a package's namespace,
4
+ // and from each Multiname, once for every package namespace in its set,
5
+ // as a lookup that names the class unqualified finds it in one of them.
6
+ // What it may name is enough to tell which libraries a SWF expects, as the
7
+ // web element tells an AIR application's SWF from one for the browser.
8
+ import { utf8 } from "./display.js";
9
+
10
+ const CONSTANT_Namespace = 0x08;
11
+ const CONSTANT_PackageNamespace = 0x16;
12
+ const CONSTANT_QName = 0x07;
13
+ const CONSTANT_QNameA = 0x0d;
14
+ const CONSTANT_RTQName = 0x0f;
15
+ const CONSTANT_RTQNameA = 0x10;
16
+ const CONSTANT_RTQNameL = 0x11;
17
+ const CONSTANT_RTQNameLA = 0x12;
18
+ const CONSTANT_Multiname = 0x09;
19
+ const CONSTANT_MultinameA = 0x0e;
20
+ const CONSTANT_MultinameL = 0x1b;
21
+ const CONSTANT_MultinameLA = 0x1c;
22
+ const CONSTANT_TypeName = 0x1d;
23
+
24
+ /** The qualified names `abc` may refer to; what it cannot read stops the reading, keeping what came before. */
25
+ export function abcReferences(abc: Uint8Array): Set<string> {
26
+ const names = new Set<string>();
27
+ let at = 4;
28
+ const u30 = (): number => {
29
+ let value = 0;
30
+ for (let shift = 0; shift < 35; shift += 7) {
31
+ if (at >= abc.length) {
32
+ throw new RangeError("ABC cut short");
33
+ }
34
+
35
+ const b = abc[at++];
36
+ value += (b & 0x7f) * 2 ** shift;
37
+ if ((b & 0x80) === 0) {
38
+ break;
39
+ }
40
+ }
41
+
42
+ return value;
43
+ };
44
+ const skipU30s = (count: number) => {
45
+ for (let i = 1; i < count; i++) {
46
+ u30();
47
+ }
48
+ };
49
+
50
+ try {
51
+ skipU30s(u30()); // ints
52
+ skipU30s(u30()); // uints
53
+ const doubles = u30();
54
+ at += Math.max(0, doubles - 1) * 8;
55
+ // From 47.16 AIR's ABCs have a pool of 4-byte floats next (codegen's parse.ts).
56
+ const minor = abc[0] | (abc[1] << 8);
57
+ const major = abc[2] | (abc[3] << 8);
58
+ if (major === 47 && minor >= 16) {
59
+ const floats = u30();
60
+ at += Math.max(0, floats - 1) * 4;
61
+ }
62
+ const strings: string[] = [""];
63
+ for (let i = 1, n = u30(); i < n; i++) {
64
+ const length = u30();
65
+ strings.push(utf8(abc.subarray(at, at + length)));
66
+ at += length;
67
+ }
68
+
69
+ // A package's namespace by its URI; null for any other kind.
70
+ const namespaces: (string | null)[] = [null];
71
+ for (let i = 1, n = u30(); i < n; i++) {
72
+ const kind = abc[at++];
73
+ const name = strings[u30()] ?? "";
74
+ namespaces.push(
75
+ kind === CONSTANT_PackageNamespace || kind === CONSTANT_Namespace ? name : null,
76
+ );
77
+ }
78
+
79
+ const sets: number[][] = [[]];
80
+ for (let i = 1, n = u30(); i < n; i++) {
81
+ const set: number[] = [];
82
+ for (let j = 0, count = u30(); j < count; j++) {
83
+ set.push(u30());
84
+ }
85
+
86
+ sets.push(set);
87
+ }
88
+
89
+ const add = (ns: string | null | undefined, name: string | undefined) => {
90
+ if (ns !== null && ns !== undefined && name) {
91
+ names.add(ns === "" ? name : `${ns}::${name}`);
92
+ }
93
+ };
94
+ for (let i = 1, n = u30(); i < n; i++) {
95
+ const kind = abc[at++];
96
+ switch (kind) {
97
+ case CONSTANT_QName:
98
+ case CONSTANT_QNameA: {
99
+ const ns = u30();
100
+ add(namespaces[ns], strings[u30()]);
101
+ break;
102
+ }
103
+ case CONSTANT_RTQName:
104
+ case CONSTANT_RTQNameA:
105
+ u30();
106
+ break;
107
+ case CONSTANT_RTQNameL:
108
+ case CONSTANT_RTQNameLA:
109
+ break;
110
+ case CONSTANT_Multiname:
111
+ case CONSTANT_MultinameA: {
112
+ const name = strings[u30()];
113
+ for (const ns of sets[u30()] ?? []) {
114
+ add(namespaces[ns], name);
115
+ }
116
+
117
+ break;
118
+ }
119
+ case CONSTANT_MultinameL:
120
+ case CONSTANT_MultinameLA:
121
+ u30();
122
+ break;
123
+ case CONSTANT_TypeName: {
124
+ u30();
125
+ skipU30s(u30() + 1);
126
+ break;
127
+ }
128
+ default:
129
+ // A kind no ABC has: what follows cannot be read.
130
+ return names;
131
+ }
132
+ }
133
+ } catch {
134
+ // Cut short: what was read is what it names.
135
+ }
136
+
137
+ return names;
138
+ }