You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

terser.d.ts 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. /// <reference lib="es2015" />
  2. import { RawSourceMap } from 'source-map';
  3. export type ECMA = 5 | 6 | 7 | 8 | 9;
  4. export interface ParseOptions {
  5. bare_returns?: boolean;
  6. ecma?: ECMA;
  7. html5_comments?: boolean;
  8. shebang?: boolean;
  9. }
  10. export interface CompressOptions {
  11. arguments?: boolean;
  12. arrows?: boolean;
  13. booleans?: boolean;
  14. collapse_vars?: boolean;
  15. comparisons?: boolean;
  16. computed_props?: boolean;
  17. conditionals?: boolean;
  18. dead_code?: boolean;
  19. defaults?: boolean;
  20. directives?: boolean;
  21. drop_console?: boolean;
  22. drop_debugger?: boolean;
  23. ecma?: ECMA;
  24. evaluate?: boolean;
  25. expression?: boolean;
  26. global_defs?: object;
  27. hoist_funs?: boolean;
  28. hoist_props?: boolean;
  29. hoist_vars?: boolean;
  30. if_return?: boolean;
  31. inline?: boolean | InlineFunctions;
  32. join_vars?: boolean;
  33. keep_classnames?: boolean | RegExp;
  34. keep_fargs?: boolean;
  35. keep_fnames?: boolean | RegExp;
  36. keep_infinity?: boolean;
  37. loops?: boolean;
  38. module?: boolean;
  39. negate_iife?: boolean;
  40. passes?: number;
  41. properties?: boolean;
  42. pure_funcs?: string[];
  43. pure_getters?: boolean | 'strict';
  44. reduce_funcs?: boolean;
  45. reduce_vars?: boolean;
  46. sequences?: boolean | number;
  47. side_effects?: boolean;
  48. switches?: boolean;
  49. toplevel?: boolean;
  50. top_retain?: null | string | string[] | RegExp;
  51. typeofs?: boolean;
  52. unsafe?: boolean;
  53. unsafe_arrows?: boolean;
  54. unsafe_comps?: boolean;
  55. unsafe_Function?: boolean;
  56. unsafe_math?: boolean;
  57. unsafe_methods?: boolean;
  58. unsafe_proto?: boolean;
  59. unsafe_regexp?: boolean;
  60. unsafe_undefined?: boolean;
  61. unused?: boolean;
  62. warnings?: boolean;
  63. }
  64. export enum InlineFunctions {
  65. Disabled = 0,
  66. SimpleFunctions = 1,
  67. WithArguments = 2,
  68. WithArgumentsAndVariables = 3
  69. }
  70. export interface MangleOptions {
  71. eval?: boolean;
  72. keep_classnames?: boolean | RegExp;
  73. keep_fnames?: boolean | RegExp;
  74. module?: boolean;
  75. properties?: boolean | ManglePropertiesOptions;
  76. reserved?: string[];
  77. safari10?: boolean;
  78. toplevel?: boolean;
  79. }
  80. export interface ManglePropertiesOptions {
  81. builtins?: boolean;
  82. debug?: boolean;
  83. keep_quoted?: boolean;
  84. regex?: RegExp | string;
  85. reserved?: string[];
  86. }
  87. export interface OutputOptions {
  88. ascii_only?: boolean;
  89. beautify?: boolean;
  90. braces?: boolean;
  91. comments?: boolean | 'all' | 'some' | RegExp | Function;
  92. ecma?: ECMA;
  93. indent_level?: number;
  94. indent_start?: boolean;
  95. inline_script?: boolean;
  96. ie8?: boolean;
  97. keep_quoted_props?: boolean;
  98. max_line_len?: boolean;
  99. preamble?: string;
  100. quote_keys?: boolean;
  101. quote_style?: OutputQuoteStyle;
  102. safari10?: boolean;
  103. semicolons?: boolean;
  104. shebang?: boolean;
  105. shorthand?: boolean;
  106. source_map?: SourceMapOptions;
  107. webkit?: boolean;
  108. width?: number;
  109. wrap_iife?: boolean;
  110. }
  111. export enum OutputQuoteStyle {
  112. PreferDouble = 0,
  113. AlwaysSingle = 1,
  114. AlwaysDouble = 2,
  115. AlwaysOriginal = 3
  116. }
  117. export interface MinifyOptions {
  118. compress?: boolean | CompressOptions;
  119. ecma?: ECMA;
  120. ie8?: boolean;
  121. keep_classnames?: boolean | RegExp;
  122. keep_fnames?: boolean | RegExp;
  123. mangle?: boolean | MangleOptions;
  124. module?: boolean;
  125. nameCache?: object;
  126. output?: OutputOptions;
  127. parse?: ParseOptions;
  128. safari10?: boolean;
  129. sourceMap?: boolean | SourceMapOptions;
  130. toplevel?: boolean;
  131. warnings?: boolean | 'verbose';
  132. }
  133. export interface MinifyOutput {
  134. ast?: AST_Node;
  135. code?: string;
  136. error?: Error;
  137. map?: RawSourceMap | string;
  138. warnings?: string[];
  139. }
  140. export interface SourceMapOptions {
  141. content?: RawSourceMap;
  142. includeSources?: boolean;
  143. filename?: string;
  144. root?: string;
  145. url?: string | 'inline';
  146. }
  147. declare function parse(text: string, options?: ParseOptions): AST_Node;
  148. export class TreeWalker {
  149. constructor(callback: (node: AST_Node, descend?: (node: AST_Node) => void) => boolean | undefined);
  150. directives: object;
  151. find_parent(type: AST_Node): AST_Node | undefined;
  152. has_directive(type: string): boolean;
  153. loopcontrol_target(node: AST_Node): AST_Node | undefined;
  154. parent(n: number): AST_Node | undefined;
  155. pop(): void;
  156. push(node: AST_Node): void;
  157. self(): AST_Node | undefined;
  158. stack: AST_Node[];
  159. visit: (node: AST_Node, descend: boolean) => any;
  160. }
  161. export class TreeTransformer extends TreeWalker {
  162. constructor(
  163. before: (node: AST_Node, descend?: (node: AST_Node, tw: TreeWalker) => void, in_list?: boolean) => AST_Node | undefined,
  164. after?: (node: AST_Node, in_list?: boolean) => AST_Node | undefined
  165. );
  166. before: (node: AST_Node) => AST_Node;
  167. after?: (node: AST_Node) => AST_Node;
  168. }
  169. export function push_uniq<T>(array: T[], el: T): void;
  170. export function minify(files: string | string[] | { [file: string]: string } | AST_Node, options?: MinifyOptions): MinifyOutput;
  171. export class AST_Node {
  172. constructor(props?: object);
  173. static BASE?: AST_Node;
  174. static PROPS: string[];
  175. static SELF_PROPS: string[];
  176. static SUBCLASSES: AST_Node[];
  177. static documentation: string;
  178. static propdoc?: Record<string, string>;
  179. static expressions?: AST_Node[];
  180. static warn?: (text: string, props: any) => void;
  181. static from_mozilla_ast?: (node: AST_Node) => any;
  182. walk: (visitor: TreeWalker) => void;
  183. print_to_string: (options?: OutputOptions) => string;
  184. transform: (tt: TreeTransformer, in_list?: boolean) => AST_Node;
  185. TYPE: string;
  186. CTOR: typeof AST_Node;
  187. }
  188. declare class SymbolDef {
  189. constructor(scope?: AST_Scope, orig?: object, init?: object);
  190. name: string;
  191. orig: AST_SymbolRef[];
  192. init: AST_SymbolRef;
  193. eliminated: number;
  194. scope: AST_Scope;
  195. references: AST_SymbolRef[];
  196. replaced: number;
  197. global: boolean;
  198. export: boolean;
  199. mangled_name: null | string;
  200. undeclared: boolean;
  201. id: number;
  202. }
  203. type ArgType = AST_SymbolFunarg | AST_DefaultAssign | AST_Destructuring | AST_Expansion;
  204. declare class AST_Statement extends AST_Node {
  205. constructor(props?: object);
  206. }
  207. declare class AST_Debugger extends AST_Statement {
  208. constructor(props?: object);
  209. }
  210. declare class AST_Directive extends AST_Statement {
  211. constructor(props?: object);
  212. value: string;
  213. quote: string;
  214. }
  215. declare class AST_SimpleStatement extends AST_Statement {
  216. constructor(props?: object);
  217. body: AST_Node[];
  218. }
  219. declare class AST_Block extends AST_Statement {
  220. constructor(props?: object);
  221. body: AST_Node[];
  222. block_scope: AST_Scope | null;
  223. }
  224. declare class AST_BlockStatement extends AST_Block {
  225. constructor(props?: object);
  226. }
  227. declare class AST_Scope extends AST_Block {
  228. constructor(props?: object);
  229. variables: any;
  230. functions: any;
  231. uses_with: boolean;
  232. uses_eval: boolean;
  233. parent_scope: AST_Scope | null;
  234. enclosed: any;
  235. cname: any;
  236. }
  237. declare class AST_Toplevel extends AST_Scope {
  238. constructor(props?: object);
  239. globals: any;
  240. }
  241. declare class AST_Lambda extends AST_Scope {
  242. constructor(props?: object);
  243. name: AST_SymbolDeclaration | null;
  244. argnames: ArgType[];
  245. uses_arguments: boolean;
  246. is_generator: boolean;
  247. async: boolean;
  248. }
  249. declare class AST_Accessor extends AST_Lambda {
  250. constructor(props?: object);
  251. }
  252. declare class AST_Function extends AST_Lambda {
  253. constructor(props?: object);
  254. inlined: boolean;
  255. }
  256. declare class AST_Arrow extends AST_Lambda {
  257. constructor(props?: object);
  258. inlined: boolean;
  259. }
  260. declare class AST_Defun extends AST_Lambda {
  261. constructor(props?: object);
  262. inlined: boolean;
  263. }
  264. declare class AST_Class extends AST_Scope {
  265. constructor(props?: object);
  266. name: AST_SymbolClass | AST_SymbolDefClass | null;
  267. extends: AST_Node | null;
  268. properties: AST_ObjectProperty[];
  269. inlined: boolean;
  270. }
  271. declare class AST_DefClass extends AST_Class {
  272. constructor(props?: object);
  273. }
  274. declare class AST_ClassExpression extends AST_Class {
  275. constructor(props?: object);
  276. }
  277. declare class AST_Switch extends AST_Block {
  278. constructor(props?: object);
  279. expression: AST_Node;
  280. }
  281. declare class AST_SwitchBranch extends AST_Block {
  282. constructor(props?: object);
  283. }
  284. declare class AST_Default extends AST_SwitchBranch {
  285. constructor(props?: object);
  286. }
  287. declare class AST_Case extends AST_SwitchBranch {
  288. constructor(props?: object);
  289. expression: AST_Node;
  290. }
  291. declare class AST_Try extends AST_Block {
  292. constructor(props?: object);
  293. bcatch: AST_Catch;
  294. bfinally: null | AST_Finally;
  295. }
  296. declare class AST_Catch extends AST_Block {
  297. constructor(props?: object);
  298. argname: ArgType;
  299. }
  300. declare class AST_Finally extends AST_Block {
  301. constructor(props?: object);
  302. }
  303. declare class AST_EmptyStatement extends AST_Statement {
  304. constructor(props?: object);
  305. }
  306. declare class AST_StatementWithBody extends AST_Statement {
  307. constructor(props?: object);
  308. body: AST_Node[];
  309. }
  310. declare class AST_LabeledStatement extends AST_StatementWithBody {
  311. constructor(props?: object);
  312. label: AST_Label;
  313. }
  314. declare class AST_IterationStatement extends AST_StatementWithBody {
  315. constructor(props?: object);
  316. block_scope: AST_Scope | null;
  317. }
  318. declare class AST_DWLoop extends AST_IterationStatement {
  319. constructor(props?: object);
  320. condition: AST_Node;
  321. }
  322. declare class AST_Do extends AST_DWLoop {
  323. constructor(props?: object);
  324. }
  325. declare class AST_While extends AST_DWLoop {
  326. constructor(props?: object);
  327. }
  328. declare class AST_For extends AST_IterationStatement {
  329. constructor(props?: object);
  330. init: AST_Node | null;
  331. condition: AST_Node | null;
  332. step: AST_Node | null;
  333. }
  334. declare class AST_ForIn extends AST_IterationStatement {
  335. constructor(props?: object);
  336. init: AST_Node | null;
  337. object: AST_Node;
  338. }
  339. declare class AST_ForOf extends AST_ForIn {
  340. constructor(props?: object);
  341. await: boolean;
  342. }
  343. declare class AST_With extends AST_StatementWithBody {
  344. constructor(props?: object);
  345. expression: AST_Node;
  346. }
  347. declare class AST_If extends AST_StatementWithBody {
  348. constructor(props?: object);
  349. condition: AST_Node;
  350. alternative: AST_Node | null;
  351. }
  352. declare class AST_Jump extends AST_Statement {
  353. constructor(props?: object);
  354. }
  355. declare class AST_Exit extends AST_Jump {
  356. constructor(props?: object);
  357. value: AST_Node | null;
  358. }
  359. declare class AST_Return extends AST_Exit {
  360. constructor(props?: object);
  361. }
  362. declare class AST_Throw extends AST_Exit {
  363. constructor(props?: object);
  364. }
  365. declare class AST_LoopControl extends AST_Jump {
  366. constructor(props?: object);
  367. label: null | AST_LabelRef;
  368. }
  369. declare class AST_Break extends AST_LoopControl {
  370. constructor(props?: object);
  371. }
  372. declare class AST_Continue extends AST_LoopControl {
  373. constructor(props?: object);
  374. }
  375. declare class AST_Definitions extends AST_Statement {
  376. constructor(props?: object);
  377. definitions: AST_VarDef[];
  378. }
  379. declare class AST_Var extends AST_Definitions {
  380. constructor(props?: object);
  381. }
  382. declare class AST_Let extends AST_Definitions {
  383. constructor(props?: object);
  384. }
  385. declare class AST_Const extends AST_Definitions {
  386. constructor(props?: object);
  387. }
  388. declare class AST_Export extends AST_Statement {
  389. constructor(props?: object);
  390. exported_definition: AST_Definitions | AST_Lambda | AST_DefClass | null;
  391. exported_value: AST_Node | null;
  392. is_default: boolean;
  393. exported_names: AST_NameMapping[];
  394. module_name: AST_String;
  395. }
  396. declare class AST_Expansion extends AST_Node {
  397. constructor(props?: object);
  398. expression: AST_Node;
  399. }
  400. declare class AST_Destructuring extends AST_Node {
  401. constructor(props?: object);
  402. names: AST_Node[];
  403. is_array: boolean;
  404. }
  405. declare class AST_PrefixedTemplateString extends AST_Node {
  406. constructor(props?: object);
  407. template_string: AST_TemplateString;
  408. prefix: AST_Node;
  409. }
  410. declare class AST_TemplateString extends AST_Node {
  411. constructor(props?: object);
  412. segments: AST_Node[];
  413. }
  414. declare class AST_TemplateSegment extends AST_Node {
  415. constructor(props?: object);
  416. value: string;
  417. raw: string;
  418. }
  419. declare class AST_NameMapping extends AST_Node {
  420. constructor(props?: object);
  421. foreign_name: AST_Symbol;
  422. name: AST_SymbolExport | AST_SymbolImport;
  423. }
  424. declare class AST_Import extends AST_Node {
  425. constructor(props?: object);
  426. imported_name: null | AST_SymbolImport;
  427. imported_names: AST_NameMapping[];
  428. module_name: AST_String;
  429. }
  430. declare class AST_VarDef extends AST_Node {
  431. constructor(props?: object);
  432. name: AST_Destructuring | AST_SymbolConst | AST_SymbolLet | AST_SymbolVar;
  433. value: AST_Node | null;
  434. }
  435. declare class AST_Call extends AST_Node {
  436. constructor(props?: object);
  437. expression: AST_Node;
  438. args: AST_Node[];
  439. }
  440. declare class AST_New extends AST_Call {
  441. constructor(props?: object);
  442. }
  443. declare class AST_Sequence extends AST_Node {
  444. constructor(props?: object);
  445. expressions: AST_Node[];
  446. }
  447. declare class AST_PropAccess extends AST_Node {
  448. constructor(props?: object);
  449. expression: AST_Node;
  450. property: AST_Node | string;
  451. }
  452. declare class AST_Dot extends AST_PropAccess {
  453. constructor(props?: object);
  454. }
  455. declare class AST_Sub extends AST_PropAccess {
  456. constructor(props?: object);
  457. }
  458. declare class AST_Unary extends AST_Node {
  459. constructor(props?: object);
  460. operator: string;
  461. expression: AST_Node;
  462. }
  463. declare class AST_UnaryPrefix extends AST_Unary {
  464. constructor(props?: object);
  465. }
  466. declare class AST_UnaryPostfix extends AST_Unary {
  467. constructor(props?: object);
  468. }
  469. declare class AST_Binary extends AST_Node {
  470. constructor(props?: object);
  471. operator: string;
  472. left: AST_Node;
  473. right: AST_Node;
  474. }
  475. declare class AST_Assign extends AST_Binary {
  476. constructor(props?: object);
  477. }
  478. declare class AST_DefaultAssign extends AST_Binary {
  479. constructor(props?: object);
  480. }
  481. declare class AST_Conditional extends AST_Node {
  482. constructor(props?: object);
  483. condition: AST_Node;
  484. consequent: AST_Node;
  485. alternative: AST_Node;
  486. }
  487. declare class AST_Array extends AST_Node {
  488. constructor(props?: object);
  489. elements: AST_Node[];
  490. }
  491. declare class AST_Object extends AST_Node {
  492. constructor(props?: object);
  493. properties: AST_ObjectProperty[];
  494. }
  495. declare class AST_ObjectProperty extends AST_Node {
  496. constructor(props?: object);
  497. key: string | number | AST_Node;
  498. value: AST_Node;
  499. }
  500. declare class AST_ObjectKeyVal extends AST_ObjectProperty {
  501. constructor(props?: object);
  502. quote: string;
  503. }
  504. declare class AST_ObjectSetter extends AST_ObjectProperty {
  505. constructor(props?: object);
  506. quote: string;
  507. static: boolean;
  508. }
  509. declare class AST_ObjectGetter extends AST_ObjectProperty {
  510. constructor(props?: object);
  511. quote: string;
  512. static: boolean;
  513. }
  514. declare class AST_ConciseMethod extends AST_ObjectProperty {
  515. constructor(props?: object);
  516. quote: string;
  517. static: boolean;
  518. is_generator: boolean;
  519. async: boolean;
  520. }
  521. declare class AST_Symbol extends AST_Node {
  522. constructor(props?: object);
  523. scope: AST_Scope;
  524. name: string;
  525. thedef: SymbolDef;
  526. }
  527. declare class AST_SymbolDeclaration extends AST_Symbol {
  528. constructor(props?: object);
  529. init: AST_Node | null;
  530. }
  531. declare class AST_SymbolVar extends AST_SymbolDeclaration {
  532. constructor(props?: object);
  533. }
  534. declare class AST_SymbolFunarg extends AST_SymbolVar {
  535. constructor(props?: object);
  536. }
  537. declare class AST_SymbolBlockDeclaration extends AST_SymbolDeclaration {
  538. constructor(props?: object);
  539. }
  540. declare class AST_SymbolConst extends AST_SymbolBlockDeclaration {
  541. constructor(props?: object);
  542. }
  543. declare class AST_SymbolLet extends AST_SymbolBlockDeclaration {
  544. constructor(props?: object);
  545. }
  546. declare class AST_SymbolDefClass extends AST_SymbolBlockDeclaration {
  547. constructor(props?: object);
  548. }
  549. declare class AST_SymbolCatch extends AST_SymbolBlockDeclaration {
  550. constructor(props?: object);
  551. }
  552. declare class AST_SymbolImport extends AST_SymbolBlockDeclaration {
  553. constructor(props?: object);
  554. }
  555. declare class AST_SymbolDefun extends AST_SymbolDeclaration {
  556. constructor(props?: object);
  557. }
  558. declare class AST_SymbolLambda extends AST_SymbolDeclaration {
  559. constructor(props?: object);
  560. }
  561. declare class AST_SymbolClass extends AST_SymbolDeclaration {
  562. constructor(props?: object);
  563. }
  564. declare class AST_SymbolMethod extends AST_Symbol {
  565. constructor(props?: object);
  566. }
  567. declare class AST_SymbolImportForeign extends AST_Symbol {
  568. constructor(props?: object);
  569. }
  570. declare class AST_Label extends AST_Symbol {
  571. constructor(props?: object);
  572. references: AST_LoopControl | null;
  573. }
  574. declare class AST_SymbolRef extends AST_Symbol {
  575. constructor(props?: object);
  576. }
  577. declare class AST_SymbolExport extends AST_SymbolRef {
  578. constructor(props?: object);
  579. }
  580. declare class AST_SymbolExportForeign extends AST_Symbol {
  581. constructor(props?: object);
  582. }
  583. declare class AST_LabelRef extends AST_Symbol {
  584. constructor(props?: object);
  585. }
  586. declare class AST_This extends AST_Symbol {
  587. constructor(props?: object);
  588. }
  589. declare class AST_Super extends AST_This {
  590. constructor(props?: object);
  591. }
  592. declare class AST_NewTarget extends AST_Node {
  593. constructor(props?: object);
  594. }
  595. declare class AST_Constant extends AST_Node {
  596. constructor(props?: object);
  597. }
  598. declare class AST_String extends AST_Constant {
  599. constructor(props?: object);
  600. value: string;
  601. quote: string;
  602. }
  603. declare class AST_Number extends AST_Constant {
  604. constructor(props?: object);
  605. value: number;
  606. literal: string;
  607. }
  608. declare class AST_RegExp extends AST_Constant {
  609. constructor(props?: object);
  610. value: RegExp;
  611. }
  612. declare class AST_Atom extends AST_Constant {
  613. constructor(props?: object);
  614. }
  615. declare class AST_Null extends AST_Atom {
  616. constructor(props?: object);
  617. }
  618. declare class AST_NaN extends AST_Atom {
  619. constructor(props?: object);
  620. }
  621. declare class AST_Undefined extends AST_Atom {
  622. constructor(props?: object);
  623. }
  624. declare class AST_Hole extends AST_Atom {
  625. constructor(props?: object);
  626. }
  627. declare class AST_Infinity extends AST_Atom {
  628. constructor(props?: object);
  629. }
  630. declare class AST_Boolean extends AST_Atom {
  631. constructor(props?: object);
  632. }
  633. declare class AST_False extends AST_Boolean {
  634. constructor(props?: object);
  635. }
  636. declare class AST_True extends AST_Boolean {
  637. constructor(props?: object);
  638. }
  639. declare class AST_Await extends AST_Node {
  640. constructor(props?: object);
  641. expression: AST_Node;
  642. }
  643. declare class AST_Yield extends AST_Node {
  644. constructor(props?: object);
  645. expression: AST_Node;
  646. is_star: boolean;
  647. }