From 9fe0a2fa8dbd83359722e077f761a01e37901bb8 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 21 Jul 2004 17:36:26 -0700 Subject: First step of implementation of WL#1518 "make bundled zlib usable for unix builds": zlib 1.2.1 imported BitKeeper/deleted/.del-Make_vms.com~95dd9cc7505c3153: Delete: zlib/Make_vms.com BitKeeper/deleted/.del-Makefile.riscos~f85c6493d3e51733: Delete: zlib/Makefile.riscos BitKeeper/deleted/.del-Makefile.pup~b0e9ed99224cc5f4: Delete: zlib/amiga/Makefile.pup BitKeeper/deleted/.del-Makefile.sas~be103e936c85b66a: Delete: zlib/amiga/Makefile.sas BitKeeper/deleted/.del-README.contrib~2924ba28ef1f9fab: Delete: zlib/contrib/README.contrib BitKeeper/deleted/.del-gvmat32.asm~edf721a2de30e964: Delete: zlib/contrib/asm386/gvmat32.asm BitKeeper/deleted/.del-visual-basic.txt~859fcbcb668ffbb3: Delete: zlib/contrib/visual-basic.txt BitKeeper/deleted/.del-gvmat32c.c~2e97d7d65dd59113: Delete: zlib/contrib/asm386/gvmat32c.c BitKeeper/deleted/.del-mkgvmt32.bat~5a92cf0febe3dc81: Delete: zlib/contrib/asm386/mkgvmt32.bat BitKeeper/deleted/.del-zlibvc.def~67961fa7815b9267: Delete: zlib/contrib/asm386/zlibvc.def BitKeeper/deleted/.del-zlibvc.dsp~a3323c77bcd12995: Delete: zlib/contrib/asm386/zlibvc.dsp BitKeeper/deleted/.del-match.s~51b8fef5136642ed: Delete: zlib/contrib/asm586/match.s BitKeeper/deleted/.del-readme.586~cb1bb7136b0803bb: Delete: zlib/contrib/asm586/readme.586 BitKeeper/deleted/.del-zlibvc.dsw~e3dca9d8f342e64e: Delete: zlib/contrib/asm386/zlibvc.dsw BitKeeper/deleted/.del-match.s~e4bbe1fa486d1c6c: Delete: zlib/contrib/asm686/match.s BitKeeper/deleted/.del-readme.686~98a220c13809fce5: Delete: zlib/contrib/asm686/readme.686 BitKeeper/deleted/.del-zlib.mak~70f7c5f6947fd807: Delete: zlib/contrib/delphi/zlib.mak BitKeeper/deleted/.del-d_zlib.bpr~cefb1beee520d6e8: Delete: zlib/contrib/delphi2/d_zlib.bpr BitKeeper/deleted/.del-d_zlib.cpp~62dff1931881afa6: Delete: zlib/contrib/delphi2/d_zlib.cpp BitKeeper/deleted/.del-zlibdef.pas~780244c8d12b6c53: Delete: zlib/contrib/delphi/zlibdef.pas BitKeeper/deleted/.del-readme.txt~8222e54ca00f2729: Delete: zlib/contrib/delphi2/readme.txt BitKeeper/deleted/.del-zlib.bpg~fbd9308275ad8e3: Delete: zlib/contrib/delphi2/zlib.bpg BitKeeper/deleted/.del-zlib.bpr~fe8bf5d1c4a2ce5a: Delete: zlib/contrib/delphi2/zlib.bpr BitKeeper/deleted/.del-zlib.cpp~bb0c3df062410f5c: Delete: zlib/contrib/delphi2/zlib.cpp BitKeeper/deleted/.del-zlib.pas~1d5285e2449b50a3: Delete: zlib/contrib/delphi2/zlib.pas BitKeeper/deleted/.del-zlib32.bpr~c2a9f0aa47a1d9ad: Delete: zlib/contrib/delphi2/zlib32.bpr BitKeeper/deleted/.del-test.cpp~4480297b204dc360: Delete: zlib/contrib/iostream/test.cpp BitKeeper/deleted/.del-zfstream.cpp~943ecbd558e86dde: Delete: zlib/contrib/iostream/zfstream.cpp BitKeeper/deleted/.del-zlib32.cpp~bbb4a200d2fe6497: Delete: zlib/contrib/delphi2/zlib32.cpp BitKeeper/deleted/.del-ChangeLogUnzip~a3ae0ba899cadd: Delete: zlib/contrib/minizip/ChangeLogUnzip BitKeeper/deleted/.del-zfstream.h~71ee057bdc6366ac: Delete: zlib/contrib/iostream/zfstream.h BitKeeper/deleted/.del-zstream.h~a6f6be5634962c81: Delete: zlib/contrib/iostream2/zstream.h BitKeeper/deleted/.del-zstream_test.cpp~e471b51e7fb553ec: Delete: zlib/contrib/iostream2/zstream_test.cpp BitKeeper/deleted/.del-miniunz.c~9da181975b3a48: Delete: zlib/contrib/minizip/miniunz.c BitKeeper/deleted/.del-minizip.c~4a49a0addb97272b: Delete: zlib/contrib/minizip/minizip.c BitKeeper/deleted/.del-readme.txt~174eb00680149f6b: Delete: zlib/contrib/minizip/readme.txt BitKeeper/deleted/.del-unzip.c~662c5ba4edbb3a19: Delete: zlib/contrib/minizip/unzip.c BitKeeper/deleted/.del-unzip.def~8a0ad6f745ee5cd4: Delete: zlib/contrib/minizip/unzip.def BitKeeper/deleted/.del-unzip.h~d5e800088a368c32: Delete: zlib/contrib/minizip/unzip.h BitKeeper/deleted/.del-zip.c~9750c19a123f3057: Delete: zlib/contrib/minizip/zip.c BitKeeper/deleted/.del-zip.def~4ffe888e9fd7b5aa: Delete: zlib/contrib/minizip/zip.def BitKeeper/deleted/.del-zip.h~4c72b8fcc492f055: Delete: zlib/contrib/minizip/zip.h BitKeeper/deleted/.del-zlibvc.def~dd272b3ed71647ba: Delete: zlib/contrib/minizip/zlibvc.def BitKeeper/deleted/.del-zlibvc.dsp~ad83fb048811e2d2: Delete: zlib/contrib/minizip/zlibvc.dsp BitKeeper/deleted/.del-zlibvc.dsw~c66b33a2d52f37c5: Delete: zlib/contrib/minizip/zlibvc.dsw BitKeeper/deleted/.del-makefile.w32~6507530fa1b017c: Delete: zlib/contrib/untgz/makefile.w32 BitKeeper/deleted/.del-untgz.c~4e8f1a3a2c145373: Delete: zlib/contrib/untgz/untgz.c BitKeeper/deleted/.del-Makefile.os2~8ab058477b24d1ff: Delete: zlib/os2/Makefile.os2 BitKeeper/deleted/.del-zlib.def~385b56ed82784ff3: Delete: zlib/os2/zlib.def BitKeeper/deleted/.del-Makefile.b32~10ffaac6cc41847a: Delete: zlib/msdos/Makefile.b32 BitKeeper/deleted/.del-Makefile.bor~121b2bc837b6367: Delete: zlib/msdos/Makefile.bor BitKeeper/deleted/.del-Makefile.dj2~a069623cad6ce7f4: Delete: zlib/msdos/Makefile.dj2 BitKeeper/deleted/.del-Makefile.emx~11a9e6c8a719ba60: Delete: zlib/msdos/Makefile.emx BitKeeper/deleted/.del-Makefile.msc~ba5ad7709ff22aab: Delete: zlib/msdos/Makefile.msc BitKeeper/deleted/.del-Makefile.tc~d1398368648e8836: Delete: zlib/msdos/Makefile.tc BitKeeper/deleted/.del-Makefile.w32~921a473e873d94d1: Delete: zlib/msdos/Makefile.w32 BitKeeper/deleted/.del-Makefile.wat~b2b51cbc2c2bc2f4: Delete: zlib/msdos/Makefile.wat BitKeeper/deleted/.del-zlib.def~189fba701e5e4b9c: Delete: zlib/msdos/zlib.def BitKeeper/deleted/.del-zlib.rc~e5ce22c7c915ec00: Delete: zlib/msdos/zlib.rc BitKeeper/deleted/.del-Makefile.emx~b5fa0633cbe6fe01: Delete: zlib/nt/Makefile.emx BitKeeper/deleted/.del-Makefile.gcc~7fcd3dd326341fa0: Delete: zlib/nt/Makefile.gcc BitKeeper/deleted/.del-Makefile.nt~9910c98f5da056de: Delete: zlib/nt/Makefile.nt BitKeeper/deleted/.del-zlib.dnt~8160c636eb3eeed7: Delete: zlib/nt/zlib.dnt BitKeeper/deleted/.del-zlib.dsp~a8abac2fb721276e: Delete: zlib/zlib.dsp BitKeeper/deleted/.del-zlib.html~2e74efd497dcd4d0: Delete: zlib/zlib.html BitKeeper/deleted/.del-minigzip.c~1f21a5863f457cb0: Delete: zlib/minigzip.c BitKeeper/deleted/.del-example.c~5ea43c929ccd2a4f: Delete: zlib/example.c BitKeeper/deleted/.del-descrip.mms~51cd5d1792d76b9c: Delete: zlib/descrip.mms BitKeeper/deleted/.del-infblock.h~7d4f40c3a1d4cdf8: Delete: zlib/infblock.h BitKeeper/deleted/.del-infblock.c~3c866934e0f44c43: Delete: zlib/infblock.c BitKeeper/deleted/.del-infutil.c~43d2340436244b52: Delete: zlib/infutil.c BitKeeper/deleted/.del-infutil.h~a6bd0dcbbdc187ac: Delete: zlib/infutil.h BitKeeper/deleted/.del-infcodes.h~c9f64a612c2cc56a: Delete: zlib/infcodes.h BitKeeper/deleted/.del-infcodes.c~7ed73df8a54d6d55: Delete: zlib/infcodes.c BitKeeper/deleted/.del-maketree.c~846b8b96ac6872d8: Delete: zlib/maketree.c VC++Files/zlib/zlib.dsp: Modified to suit zlib upgrade. mysys/my_crc32.c: Modified to suit zlib upgrade. zlib/ChangeLog: zlib 1.2.1 imported zlib/FAQ: zlib 1.2.1 imported zlib/INDEX: zlib 1.2.1 imported zlib/README: zlib 1.2.1 imported zlib/adler32.c: zlib 1.2.1 imported zlib/algorithm.txt: zlib 1.2.1 imported zlib/compress.c: zlib 1.2.1 imported zlib/crc32.c: zlib 1.2.1 imported zlib/deflate.c: zlib 1.2.1 imported zlib/deflate.h: zlib 1.2.1 imported zlib/gzio.c: zlib 1.2.1 imported zlib/inffast.c: zlib 1.2.1 imported zlib/inffast.h: zlib 1.2.1 imported zlib/inffixed.h: zlib 1.2.1 imported zlib/inflate.c: zlib 1.2.1 imported zlib/inftrees.c: zlib 1.2.1 imported zlib/inftrees.h: zlib 1.2.1 imported zlib/trees.c: zlib 1.2.1 imported zlib/uncompr.c: zlib 1.2.1 imported zlib/zconf.h: zlib 1.2.1 imported zlib/zlib.3: zlib 1.2.1 imported zlib/zlib.h: zlib 1.2.1 imported zlib/zutil.c: zlib 1.2.1 imported zlib/zutil.h: zlib 1.2.1 imported --- zlib/infblock.c | 403 -------------------------------------------------------- 1 file changed, 403 deletions(-) delete mode 100644 zlib/infblock.c (limited to 'zlib/infblock.c') diff --git a/zlib/infblock.c b/zlib/infblock.c deleted file mode 100644 index dd7a6d40a8d..00000000000 --- a/zlib/infblock.c +++ /dev/null @@ -1,403 +0,0 @@ -/* infblock.c -- interpret and process block types to last block - * Copyright (C) 1995-2002 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "infblock.h" -#include "inftrees.h" -#include "infcodes.h" -#include "infutil.h" - -struct inflate_codes_state {int dummy;}; /* for buggy compilers */ - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - -/* Table for deflate from PKZIP's appnote.txt. */ -local const uInt border[] = { /* Order of the bit length code lengths */ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - -/* - Notes beyond the 1.93a appnote.txt: - - 1. Distance pointers never point before the beginning of the output - stream. - 2. Distance pointers can point back across blocks, up to 32k away. - 3. There is an implied maximum of 7 bits for the bit length table and - 15 bits for the actual data. - 4. If only one code exists, then it is encoded using one bit. (Zero - would be more efficient, but perhaps a little confusing.) If two - codes exist, they are coded using one bit each (0 and 1). - 5. There is no way of sending zero distance codes--a dummy must be - sent if there are none. (History: a pre 2.0 version of PKZIP would - store blocks with no distance codes, but this was discovered to be - too harsh a criterion.) Valid only for 1.93a. 2.04c does allow - zero distance codes, which is sent as one code of zero bits in - length. - 6. There are up to 286 literal/length codes. Code 256 represents the - end-of-block. Note however that the static length tree defines - 288 codes just to fill out the Huffman codes. Codes 286 and 287 - cannot be used though, since there is no length base or extra bits - defined for them. Similarily, there are up to 30 distance codes. - However, static trees define 32 codes (all 5 bits) to fill out the - Huffman codes, but the last two had better not show up in the data. - 7. Unzip can check dynamic Huffman blocks for complete code sets. - The exception is that a single code would not be complete (see #4). - 8. The five bits following the block type is really the number of - literal codes sent minus 257. - 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits - (1+6+6). Therefore, to output three times the length, you output - three codes (1+1+1), whereas to output four times the same length, - you only need two codes (1+3). Hmm. - 10. In the tree reconstruction algorithm, Code = Code + Increment - only if BitLength(i) is not zero. (Pretty obvious.) - 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) - 12. Note: length code 284 can represent 227-258, but length code 285 - really is 258. The last length deserves its own, short code - since it gets used a lot in very redundant files. The length - 258 is special since 258 - 3 (the min match length) is 255. - 13. The literal/length and distance code bit lengths are read as a - single stream of lengths. It is possible (and advantageous) for - a repeat code (16, 17, or 18) to go across the boundary between - the two sets of lengths. - */ - - -void inflate_blocks_reset(s, z, c) -inflate_blocks_statef *s; -z_streamp z; -uLongf *c; -{ - if (c != Z_NULL) - *c = s->check; - if (s->mode == BTREE || s->mode == DTREE) - ZFREE(z, s->sub.trees.blens); - if (s->mode == CODES) - inflate_codes_free(s->sub.decode.codes, z); - s->mode = TYPE; - s->bitk = 0; - s->bitb = 0; - s->read = s->write = s->window; - if (s->checkfn != Z_NULL) - z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0); - Tracev((stderr, "inflate: blocks reset\n")); -} - - -inflate_blocks_statef *inflate_blocks_new(z, c, w) -z_streamp z; -check_func c; -uInt w; -{ - inflate_blocks_statef *s; - - if ((s = (inflate_blocks_statef *)ZALLOC - (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) - return s; - if ((s->hufts = - (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL) - { - ZFREE(z, s); - return Z_NULL; - } - if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) - { - ZFREE(z, s->hufts); - ZFREE(z, s); - return Z_NULL; - } - s->end = s->window + w; - s->checkfn = c; - s->mode = TYPE; - Tracev((stderr, "inflate: blocks allocated\n")); - inflate_blocks_reset(s, z, Z_NULL); - return s; -} - - -int inflate_blocks(s, z, r) -inflate_blocks_statef *s; -z_streamp z; -int r; -{ - uInt t; /* temporary storage */ - uLong b; /* bit buffer */ - uInt k; /* bits in bit buffer */ - Bytef *p; /* input data pointer */ - uInt n; /* bytes available there */ - Bytef *q; /* output window write pointer */ - uInt m; /* bytes to end of window or read pointer */ - - /* copy input/output information to locals (UPDATE macro restores) */ - LOAD - - /* process input based on current state */ - while (1) switch (s->mode) - { - case TYPE: - NEEDBITS(3) - t = (uInt)b & 7; - s->last = t & 1; - switch (t >> 1) - { - case 0: /* stored */ - Tracev((stderr, "inflate: stored block%s\n", - s->last ? " (last)" : "")); - DUMPBITS(3) - t = k & 7; /* go to byte boundary */ - DUMPBITS(t) - s->mode = LENS; /* get length of stored block */ - break; - case 1: /* fixed */ - Tracev((stderr, "inflate: fixed codes block%s\n", - s->last ? " (last)" : "")); - { - uInt bl, bd; - inflate_huft *tl, *td; - - inflate_trees_fixed(&bl, &bd, &tl, &td, z); - s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); - if (s->sub.decode.codes == Z_NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - } - DUMPBITS(3) - s->mode = CODES; - break; - case 2: /* dynamic */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - s->last ? " (last)" : "")); - DUMPBITS(3) - s->mode = TABLE; - break; - case 3: /* illegal */ - DUMPBITS(3) - s->mode = BAD; - z->msg = (char*)"invalid block type"; - r = Z_DATA_ERROR; - LEAVE - } - break; - case LENS: - NEEDBITS(32) - if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) - { - s->mode = BAD; - z->msg = (char*)"invalid stored block lengths"; - r = Z_DATA_ERROR; - LEAVE - } - s->sub.left = (uInt)b & 0xffff; - b = k = 0; /* dump bits */ - Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); - s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); - break; - case STORED: - if (n == 0) - LEAVE - NEEDOUT - t = s->sub.left; - if (t > n) t = n; - if (t > m) t = m; - zmemcpy(q, p, t); - p += t; n -= t; - q += t; m -= t; - if ((s->sub.left -= t) != 0) - break; - Tracev((stderr, "inflate: stored end, %lu total out\n", - z->total_out + (q >= s->read ? q - s->read : - (s->end - s->read) + (q - s->window)))); - s->mode = s->last ? DRY : TYPE; - break; - case TABLE: - NEEDBITS(14) - s->sub.trees.table = t = (uInt)b & 0x3fff; -#ifndef PKZIP_BUG_WORKAROUND - if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) - { - s->mode = BAD; - z->msg = (char*)"too many length or distance symbols"; - r = Z_DATA_ERROR; - LEAVE - } -#endif - t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); - if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - DUMPBITS(14) - s->sub.trees.index = 0; - Tracev((stderr, "inflate: table sizes ok\n")); - s->mode = BTREE; - case BTREE: - while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) - { - NEEDBITS(3) - s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; - DUMPBITS(3) - } - while (s->sub.trees.index < 19) - s->sub.trees.blens[border[s->sub.trees.index++]] = 0; - s->sub.trees.bb = 7; - t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, - &s->sub.trees.tb, s->hufts, z); - if (t != Z_OK) - { - r = t; - if (r == Z_DATA_ERROR) - { - ZFREE(z, s->sub.trees.blens); - s->mode = BAD; - } - LEAVE - } - s->sub.trees.index = 0; - Tracev((stderr, "inflate: bits tree ok\n")); - s->mode = DTREE; - case DTREE: - while (t = s->sub.trees.table, - s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) - { - inflate_huft *h; - uInt i, j, c; - - t = s->sub.trees.bb; - NEEDBITS(t) - h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); - t = h->bits; - c = h->base; - if (c < 16) - { - DUMPBITS(t) - s->sub.trees.blens[s->sub.trees.index++] = c; - } - else /* c == 16..18 */ - { - i = c == 18 ? 7 : c - 14; - j = c == 18 ? 11 : 3; - NEEDBITS(t + i) - DUMPBITS(t) - j += (uInt)b & inflate_mask[i]; - DUMPBITS(i) - i = s->sub.trees.index; - t = s->sub.trees.table; - if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || - (c == 16 && i < 1)) - { - ZFREE(z, s->sub.trees.blens); - s->mode = BAD; - z->msg = (char*)"invalid bit length repeat"; - r = Z_DATA_ERROR; - LEAVE - } - c = c == 16 ? s->sub.trees.blens[i - 1] : 0; - do { - s->sub.trees.blens[i++] = c; - } while (--j); - s->sub.trees.index = i; - } - } - s->sub.trees.tb = Z_NULL; - { - uInt bl, bd; - inflate_huft *tl, *td; - inflate_codes_statef *c; - - bl = 9; /* must be <= 9 for lookahead assumptions */ - bd = 6; /* must be <= 9 for lookahead assumptions */ - t = s->sub.trees.table; - t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), - s->sub.trees.blens, &bl, &bd, &tl, &td, - s->hufts, z); - if (t != Z_OK) - { - if (t == (uInt)Z_DATA_ERROR) - { - ZFREE(z, s->sub.trees.blens); - s->mode = BAD; - } - r = t; - LEAVE - } - Tracev((stderr, "inflate: trees ok\n")); - if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - s->sub.decode.codes = c; - } - ZFREE(z, s->sub.trees.blens); - s->mode = CODES; - case CODES: - UPDATE - if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) - return inflate_flush(s, z, r); - r = Z_OK; - inflate_codes_free(s->sub.decode.codes, z); - LOAD - Tracev((stderr, "inflate: codes end, %lu total out\n", - z->total_out + (q >= s->read ? q - s->read : - (s->end - s->read) + (q - s->window)))); - if (!s->last) - { - s->mode = TYPE; - break; - } - s->mode = DRY; - case DRY: - FLUSH - if (s->read != s->write) - LEAVE - s->mode = DONE; - case DONE: - r = Z_STREAM_END; - LEAVE - case BAD: - r = Z_DATA_ERROR; - LEAVE - default: - r = Z_STREAM_ERROR; - LEAVE - } -} - - -int inflate_blocks_free(s, z) -inflate_blocks_statef *s; -z_streamp z; -{ - inflate_blocks_reset(s, z, Z_NULL); - ZFREE(z, s->window); - ZFREE(z, s->hufts); - ZFREE(z, s); - Tracev((stderr, "inflate: blocks freed\n")); - return Z_OK; -} - - -void inflate_set_dictionary(s, d, n) -inflate_blocks_statef *s; -const Bytef *d; -uInt n; -{ - zmemcpy(s->window, d, n); - s->read = s->write = s->window + n; -} - - -/* Returns true if inflate is currently at the end of a block generated - * by Z_SYNC_FLUSH or Z_FULL_FLUSH. - * IN assertion: s != Z_NULL - */ -int inflate_blocks_sync_point(s) -inflate_blocks_statef *s; -{ - return s->mode == LENS; -} -- cgit v1.2.1