From c32cf6705b2519b670c22bb0d6378b3dbca9f508 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Tue, 4 May 2021 22:46:47 +0200 Subject: upgrade bootstrap, remove unused stuff --- common/header.j2.inc | 6 +- dist/bootstrap@4.6.0/bootstrap.bundle.min.js | 7 + dist/bootstrap@4.6.0/bootstrap.bundle.min.js.map | 1 + dist/bootstrap@4.6.0/bootstrap.min.css | 7 + dist/bootstrap@4.6.0/bootstrap.min.css.map | 1 + dist/bootstrap@4.6.0/jquery-3.5.1.slim.min.js | 2 + dist/css/bootstrap-grid.css | 3719 -- dist/css/bootstrap-grid.css.map | 1 - dist/css/bootstrap-grid.min.css | 7 - dist/css/bootstrap-grid.min.css.map | 1 - dist/css/bootstrap-reboot.css | 331 - dist/css/bootstrap-reboot.css.map | 1 - dist/css/bootstrap-reboot.min.css | 8 - dist/css/bootstrap-reboot.min.css.map | 1 - dist/css/bootstrap.css | 10038 ----- dist/css/bootstrap.css.map | 1 - dist/css/bootstrap.min.css | 7 - dist/css/bootstrap.min.css.map | 1 - dist/fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes dist/fonts/glyphicons-halflings-regular.svg | 288 - dist/fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes dist/fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes dist/js/bootstrap.bundle.js | 7013 ---- dist/js/bootstrap.bundle.js.map | 1 - dist/js/bootstrap.bundle.min.js | 7 - dist/js/bootstrap.bundle.min.js.map | 1 - dist/js/bootstrap.js | 4435 --- dist/js/bootstrap.js.map | 1 - dist/js/bootstrap.min.js | 7 - dist/js/bootstrap.min.js.map | 1 - dist/js/jquery-1.11.1.min.js | 4 - dist/js/npm.js | 13 - dist/js/pdf-view-tech.js | 108 - dist/js/pdf-view.js | 108 - dist/js/pdf.js | 11515 ------ dist/js/pdf.min.js | 8 - dist/js/pdf.worker.js | 43506 --------------------- dist/js/pdf.worker.min.js | 28 - locale/messages.pot | 2 +- 39 files changed, 22 insertions(+), 81164 deletions(-) create mode 100644 dist/bootstrap@4.6.0/bootstrap.bundle.min.js create mode 100644 dist/bootstrap@4.6.0/bootstrap.bundle.min.js.map create mode 100644 dist/bootstrap@4.6.0/bootstrap.min.css create mode 100644 dist/bootstrap@4.6.0/bootstrap.min.css.map create mode 100644 dist/bootstrap@4.6.0/jquery-3.5.1.slim.min.js delete mode 100644 dist/css/bootstrap-grid.css delete mode 100644 dist/css/bootstrap-grid.css.map delete mode 100644 dist/css/bootstrap-grid.min.css delete mode 100644 dist/css/bootstrap-grid.min.css.map delete mode 100644 dist/css/bootstrap-reboot.css delete mode 100644 dist/css/bootstrap-reboot.css.map delete mode 100644 dist/css/bootstrap-reboot.min.css delete mode 100644 dist/css/bootstrap-reboot.min.css.map delete mode 100644 dist/css/bootstrap.css delete mode 100644 dist/css/bootstrap.css.map delete mode 100644 dist/css/bootstrap.min.css delete mode 100644 dist/css/bootstrap.min.css.map delete mode 100644 dist/fonts/glyphicons-halflings-regular.eot delete mode 100644 dist/fonts/glyphicons-halflings-regular.svg delete mode 100644 dist/fonts/glyphicons-halflings-regular.ttf delete mode 100644 dist/fonts/glyphicons-halflings-regular.woff delete mode 100644 dist/js/bootstrap.bundle.js delete mode 100644 dist/js/bootstrap.bundle.js.map delete mode 100644 dist/js/bootstrap.bundle.min.js delete mode 100644 dist/js/bootstrap.bundle.min.js.map delete mode 100644 dist/js/bootstrap.js delete mode 100644 dist/js/bootstrap.js.map delete mode 100644 dist/js/bootstrap.min.js delete mode 100644 dist/js/bootstrap.min.js.map delete mode 100644 dist/js/jquery-1.11.1.min.js delete mode 100644 dist/js/npm.js delete mode 100644 dist/js/pdf-view-tech.js delete mode 100644 dist/js/pdf-view.js delete mode 100644 dist/js/pdf.js delete mode 100644 dist/js/pdf.min.js delete mode 100644 dist/js/pdf.worker.js delete mode 100644 dist/js/pdf.worker.min.js diff --git a/common/header.j2.inc b/common/header.j2.inc index b0fb8093..1e2f5c82 100644 --- a/common/header.j2.inc +++ b/common/header.j2.inc @@ -48,12 +48,12 @@ - + - - + + AG in the spec - var A = src[srcOffset] * scale; - var AG = Math.pow(A, cs.G); - - // Computes L as per spec. ( = cs.YW * AG ) - // Except if other than default BlackPoint values are used. - var L = cs.YW * AG; - // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4. - // Convert values to rgb range [0, 255]. - var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0; - dest[destOffset] = val; - dest[destOffset + 1] = val; - dest[destOffset + 2] = val; - } - - CalGrayCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(this, src, srcOffset, dest, destOffset, 1); - }, - getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - - for (var i = 0; i < count; ++i) { - convertToRgb(this, src, srcOffset, dest, destOffset, scale); - srcOffset += 1; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) { - return inputLength * (3 + alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return CalGrayCS; -})(); - -// -// CalRGBCS: Based on "PDF Reference, Sixth Ed", p.247 -// -var CalRGBCS = (function CalRGBCSClosure() { - - // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these - // matrices. - var BRADFORD_SCALE_MATRIX = new Float32Array([ - 0.8951, 0.2664, -0.1614, - -0.7502, 1.7135, 0.0367, - 0.0389, -0.0685, 1.0296]); - - var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([ - 0.9869929, -0.1470543, 0.1599627, - 0.4323053, 0.5183603, 0.0492912, - -0.0085287, 0.0400428, 0.9684867]); - - // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html. - var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([ - 3.2404542, -1.5371385, -0.4985314, - -0.9692660, 1.8760108, 0.0415560, - 0.0556434, -0.2040259, 1.0572252]); - - var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); - - var tempNormalizeMatrix = new Float32Array(3); - var tempConvertMatrix1 = new Float32Array(3); - var tempConvertMatrix2 = new Float32Array(3); - - var DECODE_L_CONSTANT = Math.pow(((8 + 16) / 116), 3) / 8.0; - - function CalRGBCS(whitePoint, blackPoint, gamma, matrix) { - this.name = 'CalRGB'; - this.numComps = 3; - this.defaultColor = new Float32Array(3); - - if (!whitePoint) { - error('WhitePoint missing - required for color space CalRGB'); - } - blackPoint = blackPoint || new Float32Array(3); - gamma = gamma || new Float32Array([1, 1, 1]); - matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); - - // Translate arguments to spec variables. - var XW = whitePoint[0]; - var YW = whitePoint[1]; - var ZW = whitePoint[2]; - this.whitePoint = whitePoint; - - var XB = blackPoint[0]; - var YB = blackPoint[1]; - var ZB = blackPoint[2]; - this.blackPoint = blackPoint; - - this.GR = gamma[0]; - this.GG = gamma[1]; - this.GB = gamma[2]; - - this.MXA = matrix[0]; - this.MYA = matrix[1]; - this.MZA = matrix[2]; - this.MXB = matrix[3]; - this.MYB = matrix[4]; - this.MZB = matrix[5]; - this.MXC = matrix[6]; - this.MYC = matrix[7]; - this.MZC = matrix[8]; - - // Validate variables as per spec. - if (XW < 0 || ZW < 0 || YW !== 1) { - error('Invalid WhitePoint components for ' + this.name + - ', no fallback available'); - } - - if (XB < 0 || YB < 0 || ZB < 0) { - info('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB + - ', ' + ZB + '], falling back to default'); - this.blackPoint = new Float32Array(3); - } - - if (this.GR < 0 || this.GG < 0 || this.GB < 0) { - info('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB + - '] for ' + this.name + ', falling back to default'); - this.GR = this.GG = this.GB = 1; - } - - if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 || - this.MXB < 0 || this.MYB < 0 || this.MZB < 0 || - this.MXC < 0 || this.MYC < 0 || this.MZC < 0) { - info('Invalid Matrix for ' + this.name + ' [' + - this.MXA + ', ' + this.MYA + ', ' + this.MZA + - this.MXB + ', ' + this.MYB + ', ' + this.MZB + - this.MXC + ', ' + this.MYC + ', ' + this.MZC + - '], falling back to default'); - this.MXA = this.MYB = this.MZC = 1; - this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0; - } - } - - function matrixProduct(a, b, result) { - result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; - result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; - } - - function convertToFlat(sourceWhitePoint, LMS, result) { - result[0] = LMS[0] * 1 / sourceWhitePoint[0]; - result[1] = LMS[1] * 1 / sourceWhitePoint[1]; - result[2] = LMS[2] * 1 / sourceWhitePoint[2]; - } - - function convertToD65(sourceWhitePoint, LMS, result) { - var D65X = 0.95047; - var D65Y = 1; - var D65Z = 1.08883; - - result[0] = LMS[0] * D65X / sourceWhitePoint[0]; - result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; - result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; - } - - function sRGBTransferFunction(color) { - // See http://en.wikipedia.org/wiki/SRGB. - if (color <= 0.0031308){ - return adjustToRange(0, 1, 12.92 * color); - } - - return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055); - } - - function adjustToRange(min, max, value) { - return Math.max(min, Math.min(max, value)); - } - - function decodeL(L) { - if (L < 0) { - return -decodeL(-L); - } - - if (L > 8.0) { - return Math.pow(((L + 16) / 116), 3); - } - - return L * DECODE_L_CONSTANT; - } - - function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { - - // In case the blackPoint is already the default blackPoint then there is - // no need to do compensation. - if (sourceBlackPoint[0] === 0 && - sourceBlackPoint[1] === 0 && - sourceBlackPoint[2] === 0) { - result[0] = XYZ_Flat[0]; - result[1] = XYZ_Flat[1]; - result[2] = XYZ_Flat[2]; - return; - } - - // For the blackPoint calculation details, please see - // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ - // AdobeBPC.pdf. - // The destination blackPoint is the default blackPoint [0, 0, 0]. - var zeroDecodeL = decodeL(0); - - var X_DST = zeroDecodeL; - var X_SRC = decodeL(sourceBlackPoint[0]); - - var Y_DST = zeroDecodeL; - var Y_SRC = decodeL(sourceBlackPoint[1]); - - var Z_DST = zeroDecodeL; - var Z_SRC = decodeL(sourceBlackPoint[2]); - - var X_Scale = (1 - X_DST) / (1 - X_SRC); - var X_Offset = 1 - X_Scale; - - var Y_Scale = (1 - Y_DST) / (1 - Y_SRC); - var Y_Offset = 1 - Y_Scale; - - var Z_Scale = (1 - Z_DST) / (1 - Z_SRC); - var Z_Offset = 1 - Z_Scale; - - result[0] = XYZ_Flat[0] * X_Scale + X_Offset; - result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; - result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; - } - - function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { - - // In case the whitePoint is already flat then there is no need to do - // normalization. - if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { - result[0] = XYZ_In[0]; - result[1] = XYZ_In[1]; - result[2] = XYZ_In[2]; - return; - } - - var LMS = result; - matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - - var LMS_Flat = tempNormalizeMatrix; - convertToFlat(sourceWhitePoint, LMS, LMS_Flat); - - matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); - } - - function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { - - var LMS = result; - matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - - var LMS_D65 = tempNormalizeMatrix; - convertToD65(sourceWhitePoint, LMS, LMS_D65); - - matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); - } - - function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { - // A, B and C represent a red, green and blue components of a calibrated - // rgb space. - var A = adjustToRange(0, 1, src[srcOffset] * scale); - var B = adjustToRange(0, 1, src[srcOffset + 1] * scale); - var C = adjustToRange(0, 1, src[srcOffset + 2] * scale); - - // A <---> AGR in the spec - // B <---> BGG in the spec - // C <---> CGB in the spec - var AGR = Math.pow(A, cs.GR); - var BGG = Math.pow(B, cs.GG); - var CGB = Math.pow(C, cs.GB); - - // Computes intermediate variables L, M, N as per spec. - // To decode X, Y, Z values map L, M, N directly to them. - var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB; - var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB; - var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB; - - // The following calculations are based on this document: - // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ - // AdobeBPC.pdf. - var XYZ = tempConvertMatrix1; - XYZ[0] = X; - XYZ[1] = Y; - XYZ[2] = Z; - var XYZ_Flat = tempConvertMatrix2; - - normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat); - - var XYZ_Black = tempConvertMatrix1; - compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black); - - var XYZ_D65 = tempConvertMatrix2; - normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); - - var SRGB = tempConvertMatrix1; - matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); - - var sR = sRGBTransferFunction(SRGB[0]); - var sG = sRGBTransferFunction(SRGB[1]); - var sB = sRGBTransferFunction(SRGB[2]); - - // Convert the values to rgb range [0, 255]. - dest[destOffset] = Math.round(sR * 255); - dest[destOffset + 1] = Math.round(sG * 255); - dest[destOffset + 2] = Math.round(sB * 255); - } - - CalRGBCS.prototype = { - getRgb: function CalRGBCS_getRgb(src, srcOffset) { - var rgb = new Uint8Array(3); - this.getRgbItem(src, srcOffset, rgb, 0); - return rgb; - }, - getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(this, src, srcOffset, dest, destOffset, 1); - }, - getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - - for (var i = 0; i < count; ++i) { - convertToRgb(this, src, srcOffset, dest, destOffset, scale); - srcOffset += 3; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return CalRGBCS; -})(); - -// -// LabCS: Based on "PDF Reference, Sixth Ed", p.250 -// -var LabCS = (function LabCSClosure() { - function LabCS(whitePoint, blackPoint, range) { - this.name = 'Lab'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); - - if (!whitePoint) { - error('WhitePoint missing - required for color space Lab'); - } - blackPoint = blackPoint || [0, 0, 0]; - range = range || [-100, 100, -100, 100]; - - // Translate args to spec variables - this.XW = whitePoint[0]; - this.YW = whitePoint[1]; - this.ZW = whitePoint[2]; - this.amin = range[0]; - this.amax = range[1]; - this.bmin = range[2]; - this.bmax = range[3]; - - // These are here just for completeness - the spec doesn't offer any - // formulas that use BlackPoint in Lab - this.XB = blackPoint[0]; - this.YB = blackPoint[1]; - this.ZB = blackPoint[2]; - - // Validate vars as per spec - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - error('Invalid WhitePoint components, no fallback available'); - } - - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info('Invalid BlackPoint, falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - - if (this.amin > this.amax || this.bmin > this.bmax) { - info('Invalid Range, falling back to defaults'); - this.amin = -100; - this.amax = 100; - this.bmin = -100; - this.bmax = 100; - } - } - - // Function g(x) from spec - function fn_g(x) { - if (x >= 6 / 29) { - return x * x * x; - } else { - return (108 / 841) * (x - 4 / 29); - } - } - - function decode(value, high1, low2, high2) { - return low2 + (value) * (high2 - low2) / (high1); - } - - // If decoding is needed maxVal should be 2^bits per component - 1. - function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) { - // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax] - // not the usual [0, 1]. If a command like setFillColor is used the src - // values will already be within the correct range. However, if we are - // converting an image we have to map the values to the correct range given - // above. - // Ls,as,bs <---> L*,a*,b* in the spec - var Ls = src[srcOffset]; - var as = src[srcOffset + 1]; - var bs = src[srcOffset + 2]; - if (maxVal !== false) { - Ls = decode(Ls, maxVal, 0, 100); - as = decode(as, maxVal, cs.amin, cs.amax); - bs = decode(bs, maxVal, cs.bmin, cs.bmax); - } - - // Adjust limits of 'as' and 'bs' - as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as; - bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs; - - // Computes intermediate variables X,Y,Z as per spec - var M = (Ls + 16) / 116; - var L = M + (as / 500); - var N = M - (bs / 200); - - var X = cs.XW * fn_g(L); - var Y = cs.YW * fn_g(M); - var Z = cs.ZW * fn_g(N); - - var r, g, b; - // Using different conversions for D50 and D65 white points, - // per http://www.color.org/srgb.pdf - if (cs.ZW < 1) { - // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249) - r = X * 3.1339 + Y * -1.6170 + Z * -0.4906; - g = X * -0.9785 + Y * 1.9160 + Z * 0.0333; - b = X * 0.0720 + Y * -0.2290 + Z * 1.4057; - } else { - // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888) - r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; - g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; - b = X * 0.0557 + Y * -0.2040 + Z * 1.0570; - } - // clamp color values to [0,1] range then convert to [0,255] range. - dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0; - dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0; - dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0; - } - - LabCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) { - convertToRgb(this, src, srcOffset, false, dest, destOffset); - }, - getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var maxVal = (1 << bits) - 1; - for (var i = 0; i < count; i++) { - convertToRgb(this, src, srcOffset, maxVal, dest, destOffset); - srcOffset += 3; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) { - // XXX: Decoding is handled with the lab conversion because of the strange - // ranges that are used. - return true; - }, - usesZeroToOneRange: false - }; - return LabCS; -})(); - -exports.ColorSpace = ColorSpace; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreImage = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreColorSpace, root.pdfjsCoreStream, - root.pdfjsCoreJpx); - } -}(this, function (exports, sharedUtil, corePrimitives, coreColorSpace, - coreStream, coreJpx) { - -var ImageKind = sharedUtil.ImageKind; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var warn = sharedUtil.warn; -var Name = corePrimitives.Name; -var isStream = corePrimitives.isStream; -var ColorSpace = coreColorSpace.ColorSpace; -var DecodeStream = coreStream.DecodeStream; -var JpegStream = coreStream.JpegStream; -var JpxImage = coreJpx.JpxImage; - -var PDFImage = (function PDFImageClosure() { - /** - * Decodes the image using native decoder if possible. Resolves the promise - * when the image data is ready. - */ - function handleImageData(image, nativeDecoder) { - if (nativeDecoder && nativeDecoder.canDecode(image)) { - return nativeDecoder.decode(image); - } else { - return Promise.resolve(image); - } - } - - /** - * Decode and clamp a value. The formula is different from the spec because we - * don't decode to float range [0,1], we decode it in the [0,max] range. - */ - function decodeAndClamp(value, addend, coefficient, max) { - value = addend + value * coefficient; - // Clamp the value to the range - return (value < 0 ? 0 : (value > max ? max : value)); - } - - /** - * Resizes an image mask with 1 component. - * @param {TypedArray} src - The source buffer. - * @param {Number} bpc - Number of bits per component. - * @param {Number} w1 - Original width. - * @param {Number} h1 - Original height. - * @param {Number} w2 - New width. - * @param {Number} h2 - New height. - * @returns {TypedArray} The resized image mask buffer. - */ - function resizeImageMask(src, bpc, w1, h1, w2, h2) { - var length = w2 * h2; - var dest = (bpc <= 8 ? new Uint8Array(length) : - (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); - var xRatio = w1 / w2; - var yRatio = h1 / h2; - var i, j, py, newIndex = 0, oldIndex; - var xScaled = new Uint16Array(w2); - var w1Scanline = w1; - - for (i = 0; i < w2; i++) { - xScaled[i] = Math.floor(i * xRatio); - } - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - dest[newIndex++] = src[oldIndex]; - } - } - return dest; - } - - function PDFImage(xref, res, image, inline, smask, mask, isMask) { - this.image = image; - var dict = image.dict; - if (dict.has('Filter')) { - var filter = dict.get('Filter').name; - if (filter === 'JPXDecode') { - var jpxImage = new JpxImage(); - jpxImage.parseImageProperties(image.stream); - image.stream.reset(); - image.bitsPerComponent = jpxImage.bitsPerComponent; - image.numComps = jpxImage.componentsCount; - } else if (filter === 'JBIG2Decode') { - image.bitsPerComponent = 1; - image.numComps = 1; - } - } - // TODO cache rendered images? - - this.width = dict.get('Width', 'W'); - this.height = dict.get('Height', 'H'); - - if (this.width < 1 || this.height < 1) { - error('Invalid image width: ' + this.width + ' or height: ' + - this.height); - } - - this.interpolate = dict.get('Interpolate', 'I') || false; - this.imageMask = dict.get('ImageMask', 'IM') || false; - this.matte = dict.get('Matte') || false; - - var bitsPerComponent = image.bitsPerComponent; - if (!bitsPerComponent) { - bitsPerComponent = dict.get('BitsPerComponent', 'BPC'); - if (!bitsPerComponent) { - if (this.imageMask) { - bitsPerComponent = 1; - } else { - error('Bits per component missing in image: ' + this.imageMask); - } - } - } - this.bpc = bitsPerComponent; - - if (!this.imageMask) { - var colorSpace = dict.get('ColorSpace', 'CS'); - if (!colorSpace) { - info('JPX images (which do not require color spaces)'); - switch (image.numComps) { - case 1: - colorSpace = Name.get('DeviceGray'); - break; - case 3: - colorSpace = Name.get('DeviceRGB'); - break; - case 4: - colorSpace = Name.get('DeviceCMYK'); - break; - default: - error('JPX images with ' + this.numComps + - ' color components not supported.'); - } - } - this.colorSpace = ColorSpace.parse(colorSpace, xref, res); - this.numComps = this.colorSpace.numComps; - } - - this.decode = dict.getArray('Decode', 'D'); - this.needsDecode = false; - if (this.decode && - ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) || - (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) { - this.needsDecode = true; - // Do some preprocessing to avoid more math. - var max = (1 << bitsPerComponent) - 1; - this.decodeCoefficients = []; - this.decodeAddends = []; - for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) { - var dmin = this.decode[i]; - var dmax = this.decode[i + 1]; - this.decodeCoefficients[j] = dmax - dmin; - this.decodeAddends[j] = max * dmin; - } - } - - if (smask) { - this.smask = new PDFImage(xref, res, smask, false); - } else if (mask) { - if (isStream(mask)) { - var maskDict = mask.dict, imageMask = maskDict.get('ImageMask', 'IM'); - if (!imageMask) { - warn('Ignoring /Mask in image without /ImageMask.'); - } else { - this.mask = new PDFImage(xref, res, mask, false, null, null, true); - } - } else { - // Color key mask (just an array). - this.mask = mask; - } - } - } - /** - * Handles processing of image data and returns the Promise that is resolved - * with a PDFImage when the image is ready to be used. - */ - PDFImage.buildImage = function PDFImage_buildImage(handler, xref, - res, image, inline, - nativeDecoder) { - var imagePromise = handleImageData(image, nativeDecoder); - var smaskPromise; - var maskPromise; - - var smask = image.dict.get('SMask'); - var mask = image.dict.get('Mask'); - - if (smask) { - smaskPromise = handleImageData(smask, nativeDecoder); - maskPromise = Promise.resolve(null); - } else { - smaskPromise = Promise.resolve(null); - if (mask) { - if (isStream(mask)) { - maskPromise = handleImageData(mask, nativeDecoder); - } else if (isArray(mask)) { - maskPromise = Promise.resolve(mask); - } else { - warn('Unsupported mask format.'); - maskPromise = Promise.resolve(null); - } - } else { - maskPromise = Promise.resolve(null); - } - } - return Promise.all([imagePromise, smaskPromise, maskPromise]).then( - function(results) { - var imageData = results[0]; - var smaskData = results[1]; - var maskData = results[2]; - return new PDFImage(xref, res, imageData, inline, smaskData, maskData); - }); - }; - - PDFImage.createMask = - function PDFImage_createMask(imgArray, width, height, - imageIsFromDecodeStream, inverseDecode) { - - // |imgArray| might not contain full data for every pixel of the mask, so - // we need to distinguish between |computedLength| and |actualLength|. - // In particular, if inverseDecode is true, then the array we return must - // have a length of |computedLength|. - - var computedLength = ((width + 7) >> 3) * height; - var actualLength = imgArray.byteLength; - var haveFullData = computedLength === actualLength; - var data, i; - - if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { - // imgArray came from a DecodeStream and its data is in an appropriate - // form, so we can just transfer it. - data = imgArray; - } else if (!inverseDecode) { - data = new Uint8Array(actualLength); - data.set(imgArray); - } else { - data = new Uint8Array(computedLength); - data.set(imgArray); - for (i = actualLength; i < computedLength; i++) { - data[i] = 0xff; - } - } - - // If necessary, invert the original mask data (but not any extra we might - // have added above). It's safe to modify the array -- whether it's the - // original or a copy, we're about to transfer it anyway, so nothing else - // in this thread can be relying on its contents. - if (inverseDecode) { - for (i = 0; i < actualLength; i++) { - data[i] = ~data[i]; - } - } - - return {data: data, width: width, height: height}; - }; - - PDFImage.prototype = { - get drawWidth() { - return Math.max(this.width, - this.smask && this.smask.width || 0, - this.mask && this.mask.width || 0); - }, - - get drawHeight() { - return Math.max(this.height, - this.smask && this.smask.height || 0, - this.mask && this.mask.height || 0); - }, - - decodeBuffer: function PDFImage_decodeBuffer(buffer) { - var bpc = this.bpc; - var numComps = this.numComps; - - var decodeAddends = this.decodeAddends; - var decodeCoefficients = this.decodeCoefficients; - var max = (1 << bpc) - 1; - var i, ii; - - if (bpc === 1) { - // If the buffer needed decode that means it just needs to be inverted. - for (i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = +!(buffer[i]); - } - return; - } - var index = 0; - for (i = 0, ii = this.width * this.height; i < ii; i++) { - for (var j = 0; j < numComps; j++) { - buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], - decodeCoefficients[j], max); - index++; - } - } - }, - - getComponents: function PDFImage_getComponents(buffer) { - var bpc = this.bpc; - - // This image doesn't require any extra work. - if (bpc === 8) { - return buffer; - } - - var width = this.width; - var height = this.height; - var numComps = this.numComps; - - var length = width * height * numComps; - var bufferPos = 0; - var output = (bpc <= 8 ? new Uint8Array(length) : - (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); - var rowComps = width * numComps; - - var max = (1 << bpc) - 1; - var i = 0, ii, buf; - - if (bpc === 1) { - // Optimization for reading 1 bpc images. - var mask, loop1End, loop2End; - for (var j = 0; j < height; j++) { - loop1End = i + (rowComps & ~7); - loop2End = i + rowComps; - - // unroll loop for all full bytes - while (i < loop1End) { - buf = buffer[bufferPos++]; - output[i] = (buf >> 7) & 1; - output[i + 1] = (buf >> 6) & 1; - output[i + 2] = (buf >> 5) & 1; - output[i + 3] = (buf >> 4) & 1; - output[i + 4] = (buf >> 3) & 1; - output[i + 5] = (buf >> 2) & 1; - output[i + 6] = (buf >> 1) & 1; - output[i + 7] = buf & 1; - i += 8; - } - - // handle remaining bits - if (i < loop2End) { - buf = buffer[bufferPos++]; - mask = 128; - while (i < loop2End) { - output[i++] = +!!(buf & mask); - mask >>= 1; - } - } - } - } else { - // The general case that handles all other bpc values. - var bits = 0; - buf = 0; - for (i = 0, ii = length; i < ii; ++i) { - if (i % rowComps === 0) { - buf = 0; - bits = 0; - } - - while (bits < bpc) { - buf = (buf << 8) | buffer[bufferPos++]; - bits += 8; - } - - var remainingBits = bits - bpc; - var value = buf >> remainingBits; - output[i] = (value < 0 ? 0 : (value > max ? max : value)); - buf = buf & ((1 << remainingBits) - 1); - bits = remainingBits; - } - } - return output; - }, - - fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height, - actualHeight, image) { - var smask = this.smask; - var mask = this.mask; - var alphaBuf, sw, sh, i, ii, j; - - if (smask) { - sw = smask.width; - sh = smask.height; - alphaBuf = new Uint8Array(sw * sh); - smask.fillGrayBuffer(alphaBuf); - if (sw !== width || sh !== height) { - alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, - width, height); - } - } else if (mask) { - if (mask instanceof PDFImage) { - sw = mask.width; - sh = mask.height; - alphaBuf = new Uint8Array(sw * sh); - mask.numComps = 1; - mask.fillGrayBuffer(alphaBuf); - - // Need to invert values in rgbaBuf - for (i = 0, ii = sw * sh; i < ii; ++i) { - alphaBuf[i] = 255 - alphaBuf[i]; - } - - if (sw !== width || sh !== height) { - alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, - width, height); - } - } else if (isArray(mask)) { - // Color key mask: if any of the components are outside the range - // then they should be painted. - alphaBuf = new Uint8Array(width * height); - var numComps = this.numComps; - for (i = 0, ii = width * height; i < ii; ++i) { - var opacity = 0; - var imageOffset = i * numComps; - for (j = 0; j < numComps; ++j) { - var color = image[imageOffset + j]; - var maskOffset = j * 2; - if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { - opacity = 255; - break; - } - } - alphaBuf[i] = opacity; - } - } else { - error('Unknown mask format.'); - } - } - - if (alphaBuf) { - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = alphaBuf[i]; - } - } else { - // No mask. - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = 255; - } - } - }, - - undoPreblend: function PDFImage_undoPreblend(buffer, width, height) { - var matte = this.smask && this.smask.matte; - if (!matte) { - return; - } - var matteRgb = this.colorSpace.getRgb(matte, 0); - var matteR = matteRgb[0]; - var matteG = matteRgb[1]; - var matteB = matteRgb[2]; - var length = width * height * 4; - var r, g, b; - for (var i = 0; i < length; i += 4) { - var alpha = buffer[i + 3]; - if (alpha === 0) { - // according formula we have to get Infinity in all components - // making it white (typical paper color) should be okay - buffer[i] = 255; - buffer[i + 1] = 255; - buffer[i + 2] = 255; - continue; - } - var k = 255 / alpha; - r = (buffer[i] - matteR) * k + matteR; - g = (buffer[i + 1] - matteG) * k + matteG; - b = (buffer[i + 2] - matteB) * k + matteB; - buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0; - buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0; - buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0; - } - }, - - createImageData: function PDFImage_createImageData(forceRGBA) { - var drawWidth = this.drawWidth; - var drawHeight = this.drawHeight; - var imgData = { // other fields are filled in below - width: drawWidth, - height: drawHeight - }; - - var numComps = this.numComps; - var originalWidth = this.width; - var originalHeight = this.height; - var bpc = this.bpc; - - // Rows start at byte boundary. - var rowBytes = (originalWidth * numComps * bpc + 7) >> 3; - var imgArray; - - if (!forceRGBA) { - // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image - // without any complications, we pass a same-sized copy to the main - // thread rather than expanding by 32x to RGBA form. This saves *lots* - // of memory for many scanned documents. It's also much faster. - // - // Similarly, if it is a 24-bit-per pixel RGB image without any - // complications, we avoid expanding by 1.333x to RGBA form. - var kind; - if (this.colorSpace.name === 'DeviceGray' && bpc === 1) { - kind = ImageKind.GRAYSCALE_1BPP; - } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && - !this.needsDecode) { - kind = ImageKind.RGB_24BPP; - } - if (kind && !this.smask && !this.mask && - drawWidth === originalWidth && drawHeight === originalHeight) { - imgData.kind = kind; - - imgArray = this.getImageBytes(originalHeight * rowBytes); - // If imgArray came from a DecodeStream, we're safe to transfer it - // (and thus detach its underlying buffer) because it will constitute - // the entire DecodeStream's data. But if it came from a Stream, we - // need to copy it because it'll only be a portion of the Stream's - // data, and the rest will be read later on. - if (this.image instanceof DecodeStream) { - imgData.data = imgArray; - } else { - var newArray = new Uint8Array(imgArray.length); - newArray.set(imgArray); - imgData.data = newArray; - } - if (this.needsDecode) { - // Invert the buffer (which must be grayscale if we reached here). - assert(kind === ImageKind.GRAYSCALE_1BPP); - var buffer = imgData.data; - for (var i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] ^= 0xff; - } - } - return imgData; - } - if (this.image instanceof JpegStream && !this.smask && !this.mask && - (this.colorSpace.name === 'DeviceGray' || - this.colorSpace.name === 'DeviceRGB' || - this.colorSpace.name === 'DeviceCMYK')) { - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = this.getImageBytes(originalHeight * rowBytes, - drawWidth, drawHeight, true); - return imgData; - } - } - - imgArray = this.getImageBytes(originalHeight * rowBytes); - // imgArray can be incomplete (e.g. after CCITT fax encoding). - var actualHeight = 0 | (imgArray.length / rowBytes * - drawHeight / originalHeight); - - var comps = this.getComponents(imgArray); - - // If opacity data is present, use RGBA_32BPP form. Otherwise, use the - // more compact RGB_24BPP form if allowable. - var alpha01, maybeUndoPreblend; - if (!forceRGBA && !this.smask && !this.mask) { - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = new Uint8Array(drawWidth * drawHeight * 3); - alpha01 = 0; - maybeUndoPreblend = false; - } else { - imgData.kind = ImageKind.RGBA_32BPP; - imgData.data = new Uint8Array(drawWidth * drawHeight * 4); - alpha01 = 1; - maybeUndoPreblend = true; - - // Color key masking (opacity) must be performed before decoding. - this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, - comps); - } - - if (this.needsDecode) { - this.decodeBuffer(comps); - } - this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, - drawWidth, drawHeight, actualHeight, bpc, comps, - alpha01); - if (maybeUndoPreblend) { - this.undoPreblend(imgData.data, drawWidth, actualHeight); - } - - return imgData; - }, - - fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) { - var numComps = this.numComps; - if (numComps !== 1) { - error('Reading gray scale from a color image: ' + numComps); - } - - var width = this.width; - var height = this.height; - var bpc = this.bpc; - - // rows start at byte boundary - var rowBytes = (width * numComps * bpc + 7) >> 3; - var imgArray = this.getImageBytes(height * rowBytes); - - var comps = this.getComponents(imgArray); - var i, length; - - if (bpc === 1) { - // inline decoding (= inversion) for 1 bpc images - length = width * height; - if (this.needsDecode) { - // invert and scale to {0, 255} - for (i = 0; i < length; ++i) { - buffer[i] = (comps[i] - 1) & 255; - } - } else { - // scale to {0, 255} - for (i = 0; i < length; ++i) { - buffer[i] = (-comps[i]) & 255; - } - } - return; - } - - if (this.needsDecode) { - this.decodeBuffer(comps); - } - length = width * height; - // we aren't using a colorspace so we need to scale the value - var scale = 255 / ((1 << bpc) - 1); - for (i = 0; i < length; ++i) { - buffer[i] = (scale * comps[i]) | 0; - } - }, - - getImageBytes: function PDFImage_getImageBytes(length, - drawWidth, drawHeight, - forceRGB) { - this.image.reset(); - this.image.drawWidth = drawWidth || this.width; - this.image.drawHeight = drawHeight || this.height; - this.image.forceRGB = !!forceRGB; - return this.image.getBytes(length); - } - }; - return PDFImage; -})(); - -exports.PDFImage = PDFImage; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreObj = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreCrypto, root.pdfjsCoreParser, - root.pdfjsCoreChunkedStream, root.pdfjsCoreColorSpace); - } -}(this, function (exports, sharedUtil, corePrimitives, coreCrypto, coreParser, - coreChunkedStream, coreColorSpace) { - -var InvalidPDFException = sharedUtil.InvalidPDFException; -var MissingDataException = sharedUtil.MissingDataException; -var XRefParseException = sharedUtil.XRefParseException; -var assert = sharedUtil.assert; -var bytesToString = sharedUtil.bytesToString; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isInt = sharedUtil.isInt; -var isString = sharedUtil.isString; -var shadow = sharedUtil.shadow; -var stringToPDFString = sharedUtil.stringToPDFString; -var stringToUTF8String = sharedUtil.stringToUTF8String; -var warn = sharedUtil.warn; -var isValidUrl = sharedUtil.isValidUrl; -var Util = sharedUtil.Util; -var Ref = corePrimitives.Ref; -var RefSet = corePrimitives.RefSet; -var RefSetCache = corePrimitives.RefSetCache; -var isName = corePrimitives.isName; -var isCmd = corePrimitives.isCmd; -var isDict = corePrimitives.isDict; -var isRef = corePrimitives.isRef; -var isRefsEqual = corePrimitives.isRefsEqual; -var isStream = corePrimitives.isStream; -var CipherTransformFactory = coreCrypto.CipherTransformFactory; -var Lexer = coreParser.Lexer; -var Parser = coreParser.Parser; -var ChunkedStream = coreChunkedStream.ChunkedStream; -var ColorSpace = coreColorSpace.ColorSpace; - -var Catalog = (function CatalogClosure() { - function Catalog(pdfManager, xref, pageFactory) { - this.pdfManager = pdfManager; - this.xref = xref; - this.catDict = xref.getCatalogObj(); - this.fontCache = new RefSetCache(); - assert(isDict(this.catDict), - 'catalog object is not a dictionary'); - - // TODO refactor to move getPage() to the PDFDocument. - this.pageFactory = pageFactory; - this.pagePromises = []; - } - - Catalog.prototype = { - get metadata() { - var streamRef = this.catDict.getRaw('Metadata'); - if (!isRef(streamRef)) { - return shadow(this, 'metadata', null); - } - - var encryptMetadata = (!this.xref.encrypt ? false : - this.xref.encrypt.encryptMetadata); - - var stream = this.xref.fetch(streamRef, !encryptMetadata); - var metadata; - if (stream && isDict(stream.dict)) { - var type = stream.dict.get('Type'); - var subtype = stream.dict.get('Subtype'); - - if (isName(type, 'Metadata') && isName(subtype, 'XML')) { - // XXX: This should examine the charset the XML document defines, - // however since there are currently no real means to decode - // arbitrary charsets, let's just hope that the author of the PDF - // was reasonable enough to stick with the XML default charset, - // which is UTF-8. - try { - metadata = stringToUTF8String(bytesToString(stream.getBytes())); - } catch (e) { - info('Skipping invalid metadata.'); - } - } - } - - return shadow(this, 'metadata', metadata); - }, - get toplevelPagesDict() { - var pagesObj = this.catDict.get('Pages'); - assert(isDict(pagesObj), 'invalid top-level pages dictionary'); - // shadow the prototype getter - return shadow(this, 'toplevelPagesDict', pagesObj); - }, - get documentOutline() { - var obj = null; - try { - obj = this.readDocumentOutline(); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn('Unable to read document outline'); - } - return shadow(this, 'documentOutline', obj); - }, - readDocumentOutline: function Catalog_readDocumentOutline() { - var obj = this.catDict.get('Outlines'); - if (!isDict(obj)) { - return null; - } - obj = obj.getRaw('First'); - if (!isRef(obj)) { - return null; - } - var root = { items: [] }; - var queue = [{obj: obj, parent: root}]; - // To avoid recursion, keep track of the already processed items. - var processed = new RefSet(); - processed.put(obj); - var xref = this.xref, blackColor = new Uint8Array(3); - - while (queue.length > 0) { - var i = queue.shift(); - var outlineDict = xref.fetchIfRef(i.obj); - if (outlineDict === null) { - continue; - } - assert(outlineDict.has('Title'), 'Invalid outline item'); - - var actionDict = outlineDict.get('A'), dest = null, url = null; - if (actionDict) { - var destEntry = actionDict.get('D'); - if (destEntry) { - dest = destEntry; - } else { - var uriEntry = actionDict.get('URI'); - if (isString(uriEntry) && isValidUrl(uriEntry, false)) { - url = uriEntry; - } - } - } else if (outlineDict.has('Dest')) { - dest = outlineDict.getRaw('Dest'); - if (isName(dest)) { - dest = dest.name; - } - } - var title = outlineDict.get('Title'); - var flags = outlineDict.get('F') || 0; - - var color = outlineDict.getArray('C'), rgbColor = blackColor; - // We only need to parse the color when it's valid, and non-default. - if (isArray(color) && color.length === 3 && - (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { - rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0); - } - var outlineItem = { - dest: dest, - url: url, - title: stringToPDFString(title), - color: rgbColor, - count: outlineDict.get('Count'), - bold: !!(flags & 2), - italic: !!(flags & 1), - items: [] - }; - i.parent.items.push(outlineItem); - obj = outlineDict.getRaw('First'); - if (isRef(obj) && !processed.has(obj)) { - queue.push({obj: obj, parent: outlineItem}); - processed.put(obj); - } - obj = outlineDict.getRaw('Next'); - if (isRef(obj) && !processed.has(obj)) { - queue.push({obj: obj, parent: i.parent}); - processed.put(obj); - } - } - return (root.items.length > 0 ? root.items : null); - }, - get numPages() { - var obj = this.toplevelPagesDict.get('Count'); - assert( - isInt(obj), - 'page count in top level pages object is not an integer' - ); - // shadow the prototype getter - return shadow(this, 'num', obj); - }, - get destinations() { - function fetchDestination(dest) { - return isDict(dest) ? dest.get('D') : dest; - } - - var xref = this.xref; - var dests = {}, nameTreeRef, nameDictionaryRef; - var obj = this.catDict.get('Names'); - if (obj && obj.has('Dests')) { - nameTreeRef = obj.getRaw('Dests'); - } else if (this.catDict.has('Dests')) { - nameDictionaryRef = this.catDict.get('Dests'); - } - - if (nameDictionaryRef) { - // reading simple destination dictionary - obj = nameDictionaryRef; - obj.forEach(function catalogForEach(key, value) { - if (!value) { - return; - } - dests[key] = fetchDestination(value); - }); - } - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - var names = nameTree.getAll(); - for (var name in names) { - dests[name] = fetchDestination(names[name]); - } - } - return shadow(this, 'destinations', dests); - }, - getDestination: function Catalog_getDestination(destinationId) { - function fetchDestination(dest) { - return isDict(dest) ? dest.get('D') : dest; - } - - var xref = this.xref; - var dest = null, nameTreeRef, nameDictionaryRef; - var obj = this.catDict.get('Names'); - if (obj && obj.has('Dests')) { - nameTreeRef = obj.getRaw('Dests'); - } else if (this.catDict.has('Dests')) { - nameDictionaryRef = this.catDict.get('Dests'); - } - - if (nameDictionaryRef) { // Simple destination dictionary. - var value = nameDictionaryRef.get(destinationId); - if (value) { - dest = fetchDestination(value); - } - } - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - dest = fetchDestination(nameTree.get(destinationId)); - } - return dest; - }, - - get pageLabels() { - var obj = null; - try { - obj = this.readPageLabels(); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn('Unable to read page labels.'); - } - return shadow(this, 'pageLabels', obj); - }, - readPageLabels: function Catalog_readPageLabels() { - var obj = this.catDict.getRaw('PageLabels'); - if (!obj) { - return null; - } - var pageLabels = new Array(this.numPages); - var style = null; - var prefix = ''; - var start = 1; - - var numberTree = new NumberTree(obj, this.xref); - var nums = numberTree.getAll(); - var currentLabel = '', currentIndex = 1; - - for (var i = 0, ii = this.numPages; i < ii; i++) { - if (i in nums) { - var labelDict = nums[i]; - assert(isDict(labelDict), 'The PageLabel is not a dictionary.'); - - var type = labelDict.get('Type'); - assert(!type || isName(type, 'PageLabel'), - 'Invalid type in PageLabel dictionary.'); - - var s = labelDict.get('S'); - assert(!s || isName(s), 'Invalid style in PageLabel dictionary.'); - style = (s ? s.name : null); - - prefix = labelDict.get('P') || ''; - assert(isString(prefix), 'Invalid prefix in PageLabel dictionary.'); - - start = labelDict.get('St') || 1; - assert(isInt(start), 'Invalid start in PageLabel dictionary.'); - currentIndex = start; - } - - switch (style) { - case 'D': - currentLabel = currentIndex; - break; - case 'R': - case 'r': - currentLabel = Util.toRoman(currentIndex, style === 'r'); - break; - case 'A': - case 'a': - var LIMIT = 26; // Use only the characters A--Z, or a--z. - var A_UPPER_CASE = 0x41, A_LOWER_CASE = 0x61; - - var baseCharCode = (style === 'a' ? A_LOWER_CASE : A_UPPER_CASE); - var letterIndex = currentIndex - 1; - var character = String.fromCharCode(baseCharCode + - (letterIndex % LIMIT)); - var charBuf = []; - for (var j = 0, jj = (letterIndex / LIMIT) | 0; j <= jj; j++) { - charBuf.push(character); - } - currentLabel = charBuf.join(''); - break; - default: - assert(!style, - 'Invalid style "' + style + '" in PageLabel dictionary.'); - } - pageLabels[i] = prefix + currentLabel; - - currentLabel = ''; - currentIndex++; - } - return pageLabels; - }, - - get attachments() { - var xref = this.xref; - var attachments = null, nameTreeRef; - var obj = this.catDict.get('Names'); - if (obj) { - nameTreeRef = obj.getRaw('EmbeddedFiles'); - } - - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - var names = nameTree.getAll(); - for (var name in names) { - var fs = new FileSpec(names[name], xref); - if (!attachments) { - attachments = Object.create(null); - } - attachments[stringToPDFString(name)] = fs.serializable; - } - } - return shadow(this, 'attachments', attachments); - }, - get javaScript() { - var xref = this.xref; - var obj = this.catDict.get('Names'); - - var javaScript = []; - function appendIfJavaScriptDict(jsDict) { - var type = jsDict.get('S'); - if (!isName(type, 'JavaScript')) { - return; - } - var js = jsDict.get('JS'); - if (isStream(js)) { - js = bytesToString(js.getBytes()); - } else if (!isString(js)) { - return; - } - javaScript.push(stringToPDFString(js)); - } - if (obj && obj.has('JavaScript')) { - var nameTree = new NameTree(obj.getRaw('JavaScript'), xref); - var names = nameTree.getAll(); - for (var name in names) { - // We don't really use the JavaScript right now. This code is - // defensive so we don't cause errors on document load. - var jsDict = names[name]; - if (isDict(jsDict)) { - appendIfJavaScriptDict(jsDict); - } - } - } - - // Append OpenAction actions to javaScript array - var openactionDict = this.catDict.get('OpenAction'); - if (isDict(openactionDict, 'Action')) { - var actionType = openactionDict.get('S'); - if (isName(actionType, 'Named')) { - // The named Print action is not a part of the PDF 1.7 specification, - // but is supported by many PDF readers/writers (including Adobe's). - var action = openactionDict.get('N'); - if (isName(action, 'Print')) { - javaScript.push('print({});'); - } - } else { - appendIfJavaScriptDict(openactionDict); - } - } - - return shadow(this, 'javaScript', javaScript); - }, - - cleanup: function Catalog_cleanup() { - var promises = []; - this.fontCache.forEach(function (promise) { - promises.push(promise); - }); - return Promise.all(promises).then(function (translatedFonts) { - for (var i = 0, ii = translatedFonts.length; i < ii; i++) { - var font = translatedFonts[i].dict; - delete font.translated; - } - this.fontCache.clear(); - }.bind(this)); - }, - - getPage: function Catalog_getPage(pageIndex) { - if (!(pageIndex in this.pagePromises)) { - this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then( - function (a) { - var dict = a[0]; - var ref = a[1]; - return this.pageFactory.createPage(pageIndex, dict, ref, - this.fontCache); - }.bind(this) - ); - } - return this.pagePromises[pageIndex]; - }, - - getPageDict: function Catalog_getPageDict(pageIndex) { - var capability = createPromiseCapability(); - var nodesToVisit = [this.catDict.getRaw('Pages')]; - var currentPageIndex = 0; - var xref = this.xref; - var checkAllKids = false; - - function next() { - while (nodesToVisit.length) { - var currentNode = nodesToVisit.pop(); - - if (isRef(currentNode)) { - xref.fetchAsync(currentNode).then(function (obj) { - if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) { - if (pageIndex === currentPageIndex) { - capability.resolve([obj, currentNode]); - } else { - currentPageIndex++; - next(); - } - return; - } - nodesToVisit.push(obj); - next(); - }, capability.reject); - return; - } - - // Must be a child page dictionary. - assert( - isDict(currentNode), - 'page dictionary kid reference points to wrong type of object' - ); - var count = currentNode.get('Count'); - // If the current node doesn't have any children, avoid getting stuck - // in an empty node further down in the tree (see issue5644.pdf). - if (count === 0) { - checkAllKids = true; - } - // Skip nodes where the page can't be. - if (currentPageIndex + count <= pageIndex) { - currentPageIndex += count; - continue; - } - - var kids = currentNode.get('Kids'); - assert(isArray(kids), 'page dictionary kids object is not an array'); - if (!checkAllKids && count === kids.length) { - // Nodes that don't have the page have been skipped and this is the - // bottom of the tree which means the page requested must be a - // descendant of this pages node. Ideally we would just resolve the - // promise with the page ref here, but there is the case where more - // pages nodes could link to single a page (see issue 3666 pdf). To - // handle this push it back on the queue so if it is a pages node it - // will be descended into. - nodesToVisit = [kids[pageIndex - currentPageIndex]]; - currentPageIndex = pageIndex; - continue; - } else { - for (var last = kids.length - 1; last >= 0; last--) { - nodesToVisit.push(kids[last]); - } - } - } - capability.reject('Page index ' + pageIndex + ' not found.'); - } - next(); - return capability.promise; - }, - - getPageIndex: function Catalog_getPageIndex(pageRef) { - // The page tree nodes have the count of all the leaves below them. To get - // how many pages are before we just have to walk up the tree and keep - // adding the count of siblings to the left of the node. - var xref = this.xref; - function pagesBeforeRef(kidRef) { - var total = 0; - var parentRef; - return xref.fetchAsync(kidRef).then(function (node) { - if (isRefsEqual(kidRef, pageRef) && !isDict(node, 'Page') && - !(isDict(node) && !node.has('Type') && node.has('Contents'))) { - throw new Error('The reference does not point to a /Page Dict.'); - } - if (!node) { - return null; - } - assert(isDict(node), 'node must be a Dict.'); - parentRef = node.getRaw('Parent'); - return node.getAsync('Parent'); - }).then(function (parent) { - if (!parent) { - return null; - } - assert(isDict(parent), 'parent must be a Dict.'); - return parent.getAsync('Kids'); - }).then(function (kids) { - if (!kids) { - return null; - } - var kidPromises = []; - var found = false; - for (var i = 0; i < kids.length; i++) { - var kid = kids[i]; - assert(isRef(kid), 'kid must be a Ref.'); - if (kid.num === kidRef.num) { - found = true; - break; - } - kidPromises.push(xref.fetchAsync(kid).then(function (kid) { - if (kid.has('Count')) { - var count = kid.get('Count'); - total += count; - } else { // page leaf node - total++; - } - })); - } - if (!found) { - error('kid ref not found in parents kids'); - } - return Promise.all(kidPromises).then(function () { - return [total, parentRef]; - }); - }); - } - - var total = 0; - function next(ref) { - return pagesBeforeRef(ref).then(function (args) { - if (!args) { - return total; - } - var count = args[0]; - var parentRef = args[1]; - total += count; - return next(parentRef); - }); - } - - return next(pageRef); - } - }; - - return Catalog; -})(); - -var XRef = (function XRefClosure() { - function XRef(stream, password) { - this.stream = stream; - this.entries = []; - this.xrefstms = Object.create(null); - // prepare the XRef cache - this.cache = []; - this.password = password; - this.stats = { - streamTypes: [], - fontTypes: [] - }; - } - - XRef.prototype = { - setStartXRef: function XRef_setStartXRef(startXRef) { - // Store the starting positions of xref tables as we process them - // so we can recover from missing data errors - this.startXRefQueue = [startXRef]; - }, - - parse: function XRef_parse(recoveryMode) { - var trailerDict; - if (!recoveryMode) { - trailerDict = this.readXRef(); - } else { - warn('Indexing all PDF objects'); - trailerDict = this.indexObjects(); - } - trailerDict.assignXref(this); - this.trailer = trailerDict; - var encrypt = trailerDict.get('Encrypt'); - if (encrypt) { - var ids = trailerDict.get('ID'); - var fileId = (ids && ids.length) ? ids[0] : ''; - this.encrypt = new CipherTransformFactory(encrypt, fileId, - this.password); - } - - // get the root dictionary (catalog) object - if (!(this.root = trailerDict.get('Root'))) { - error('Invalid root reference'); - } - }, - - processXRefTable: function XRef_processXRefTable(parser) { - if (!('tableState' in this)) { - // Stores state of the table as we process it so we can resume - // from middle of table in case of missing data error - this.tableState = { - entryNum: 0, - streamPos: parser.lexer.stream.pos, - parserBuf1: parser.buf1, - parserBuf2: parser.buf2 - }; - } - - var obj = this.readXRefTable(parser); - - // Sanity check - if (!isCmd(obj, 'trailer')) { - error('Invalid XRef table: could not find trailer dictionary'); - } - // Read trailer dictionary, e.g. - // trailer - // << /Size 22 - // /Root 20R - // /Info 10R - // /ID [ <81b14aafa313db63dbd6f981e49f94f4> ] - // >> - // The parser goes through the entire stream << ... >> and provides - // a getter interface for the key-value table - var dict = parser.getObj(); - - // The pdflib PDF generator can generate a nested trailer dictionary - if (!isDict(dict) && dict.dict) { - dict = dict.dict; - } - if (!isDict(dict)) { - error('Invalid XRef table: could not parse trailer dictionary'); - } - delete this.tableState; - - return dict; - }, - - readXRefTable: function XRef_readXRefTable(parser) { - // Example of cross-reference table: - // xref - // 0 1 <-- subsection header (first obj #, obj count) - // 0000000000 65535 f <-- actual object (offset, generation #, f/n) - // 23 2 <-- subsection header ... and so on ... - // 0000025518 00002 n - // 0000025635 00000 n - // trailer - // ... - - var stream = parser.lexer.stream; - var tableState = this.tableState; - stream.pos = tableState.streamPos; - parser.buf1 = tableState.parserBuf1; - parser.buf2 = tableState.parserBuf2; - - // Outer loop is over subsection headers - var obj; - - while (true) { - if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) { - if (isCmd(obj = parser.getObj(), 'trailer')) { - break; - } - tableState.firstEntryNum = obj; - tableState.entryCount = parser.getObj(); - } - - var first = tableState.firstEntryNum; - var count = tableState.entryCount; - if (!isInt(first) || !isInt(count)) { - error('Invalid XRef table: wrong types in subsection header'); - } - // Inner loop is over objects themselves - for (var i = tableState.entryNum; i < count; i++) { - tableState.streamPos = stream.pos; - tableState.entryNum = i; - tableState.parserBuf1 = parser.buf1; - tableState.parserBuf2 = parser.buf2; - - var entry = {}; - entry.offset = parser.getObj(); - entry.gen = parser.getObj(); - var type = parser.getObj(); - - if (isCmd(type, 'f')) { - entry.free = true; - } else if (isCmd(type, 'n')) { - entry.uncompressed = true; - } - - // Validate entry obj - if (!isInt(entry.offset) || !isInt(entry.gen) || - !(entry.free || entry.uncompressed)) { - error('Invalid entry in XRef subsection: ' + first + ', ' + count); - } - - // The first xref table entry, i.e. obj 0, should be free. Attempting - // to adjust an incorrect first obj # (fixes issue 3248 and 7229). - if (i === 0 && entry.free && first === 1) { - first = 0; - } - - if (!this.entries[i + first]) { - this.entries[i + first] = entry; - } - } - - tableState.entryNum = 0; - tableState.streamPos = stream.pos; - tableState.parserBuf1 = parser.buf1; - tableState.parserBuf2 = parser.buf2; - delete tableState.firstEntryNum; - delete tableState.entryCount; - } - - // Sanity check: as per spec, first object must be free - if (this.entries[0] && !this.entries[0].free) { - error('Invalid XRef table: unexpected first object'); - } - return obj; - }, - - processXRefStream: function XRef_processXRefStream(stream) { - if (!('streamState' in this)) { - // Stores state of the stream as we process it so we can resume - // from middle of stream in case of missing data error - var streamParameters = stream.dict; - var byteWidths = streamParameters.get('W'); - var range = streamParameters.get('Index'); - if (!range) { - range = [0, streamParameters.get('Size')]; - } - - this.streamState = { - entryRanges: range, - byteWidths: byteWidths, - entryNum: 0, - streamPos: stream.pos - }; - } - this.readXRefStream(stream); - delete this.streamState; - - return stream.dict; - }, - - readXRefStream: function XRef_readXRefStream(stream) { - var i, j; - var streamState = this.streamState; - stream.pos = streamState.streamPos; - - var byteWidths = streamState.byteWidths; - var typeFieldWidth = byteWidths[0]; - var offsetFieldWidth = byteWidths[1]; - var generationFieldWidth = byteWidths[2]; - - var entryRanges = streamState.entryRanges; - while (entryRanges.length > 0) { - var first = entryRanges[0]; - var n = entryRanges[1]; - - if (!isInt(first) || !isInt(n)) { - error('Invalid XRef range fields: ' + first + ', ' + n); - } - if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) || - !isInt(generationFieldWidth)) { - error('Invalid XRef entry fields length: ' + first + ', ' + n); - } - for (i = streamState.entryNum; i < n; ++i) { - streamState.entryNum = i; - streamState.streamPos = stream.pos; - - var type = 0, offset = 0, generation = 0; - for (j = 0; j < typeFieldWidth; ++j) { - type = (type << 8) | stream.getByte(); - } - // if type field is absent, its default value is 1 - if (typeFieldWidth === 0) { - type = 1; - } - for (j = 0; j < offsetFieldWidth; ++j) { - offset = (offset << 8) | stream.getByte(); - } - for (j = 0; j < generationFieldWidth; ++j) { - generation = (generation << 8) | stream.getByte(); - } - var entry = {}; - entry.offset = offset; - entry.gen = generation; - switch (type) { - case 0: - entry.free = true; - break; - case 1: - entry.uncompressed = true; - break; - case 2: - break; - default: - error('Invalid XRef entry type: ' + type); - } - if (!this.entries[first + i]) { - this.entries[first + i] = entry; - } - } - - streamState.entryNum = 0; - streamState.streamPos = stream.pos; - entryRanges.splice(0, 2); - } - }, - - indexObjects: function XRef_indexObjects() { - // Simple scan through the PDF content to find objects, - // trailers and XRef streams. - var TAB = 0x9, LF = 0xA, CR = 0xD, SPACE = 0x20; - var PERCENT = 0x25, LT = 0x3C; - - function readToken(data, offset) { - var token = '', ch = data[offset]; - while (ch !== LF && ch !== CR && ch !== LT) { - if (++offset >= data.length) { - break; - } - token += String.fromCharCode(ch); - ch = data[offset]; - } - return token; - } - function skipUntil(data, offset, what) { - var length = what.length, dataLength = data.length; - var skipped = 0; - // finding byte sequence - while (offset < dataLength) { - var i = 0; - while (i < length && data[offset + i] === what[i]) { - ++i; - } - if (i >= length) { - break; // sequence found - } - offset++; - skipped++; - } - return skipped; - } - var objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; - var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]); - var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, - 101, 102]); - var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]); - var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); - - // Clear out any existing entries, since they may be bogus. - this.entries.length = 0; - - var stream = this.stream; - stream.pos = 0; - var buffer = stream.getBytes(); - var position = stream.start, length = buffer.length; - var trailers = [], xrefStms = []; - while (position < length) { - var ch = buffer[position]; - if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { - ++position; - continue; - } - if (ch === PERCENT) { // %-comment - do { - ++position; - if (position >= length) { - break; - } - ch = buffer[position]; - } while (ch !== LF && ch !== CR); - continue; - } - var token = readToken(buffer, position); - var m; - if (token.indexOf('xref') === 0 && - (token.length === 4 || /\s/.test(token[4]))) { - position += skipUntil(buffer, position, trailerBytes); - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else if ((m = objRegExp.exec(token))) { - if (typeof this.entries[m[1]] === 'undefined') { - this.entries[m[1]] = { - offset: position - stream.start, - gen: m[2] | 0, - uncompressed: true - }; - } - var contentLength = skipUntil(buffer, position, endobjBytes) + 7; - var content = buffer.subarray(position, position + contentLength); - - // checking XRef stream suspect - // (it shall have '/XRef' and next char is not a letter) - var xrefTagOffset = skipUntil(content, 0, xrefBytes); - if (xrefTagOffset < contentLength && - content[xrefTagOffset + 5] < 64) { - xrefStms.push(position - stream.start); - this.xrefstms[position - stream.start] = 1; // Avoid recursion - } - - position += contentLength; - } else if (token.indexOf('trailer') === 0 && - (token.length === 7 || /\s/.test(token[7]))) { - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else { - position += token.length + 1; - } - } - // reading XRef streams - var i, ii; - for (i = 0, ii = xrefStms.length; i < ii; ++i) { - this.startXRefQueue.push(xrefStms[i]); - this.readXRef(/* recoveryMode */ true); - } - // finding main trailer - var dict; - for (i = 0, ii = trailers.length; i < ii; ++i) { - stream.pos = trailers[i]; - var parser = new Parser(new Lexer(stream), /* allowStreams = */ true, - /* xref = */ this, /* recoveryMode = */ true); - var obj = parser.getObj(); - if (!isCmd(obj, 'trailer')) { - continue; - } - // read the trailer dictionary - dict = parser.getObj(); - if (!isDict(dict)) { - continue; - } - // taking the first one with 'ID' - if (dict.has('ID')) { - return dict; - } - } - // no tailer with 'ID', taking last one (if exists) - if (dict) { - return dict; - } - // nothing helps - // calling error() would reject worker with an UnknownErrorException. - throw new InvalidPDFException('Invalid PDF structure'); - }, - - readXRef: function XRef_readXRef(recoveryMode) { - var stream = this.stream; - - try { - while (this.startXRefQueue.length) { - var startXRef = this.startXRefQueue[0]; - - stream.pos = startXRef + stream.start; - - var parser = new Parser(new Lexer(stream), true, this); - var obj = parser.getObj(); - var dict; - - // Get dictionary - if (isCmd(obj, 'xref')) { - // Parse end-of-file XRef - dict = this.processXRefTable(parser); - if (!this.topDict) { - this.topDict = dict; - } - - // Recursively get other XRefs 'XRefStm', if any - obj = dict.get('XRefStm'); - if (isInt(obj)) { - var pos = obj; - // ignore previously loaded xref streams - // (possible infinite recursion) - if (!(pos in this.xrefstms)) { - this.xrefstms[pos] = 1; - this.startXRefQueue.push(pos); - } - } - } else if (isInt(obj)) { - // Parse in-stream XRef - if (!isInt(parser.getObj()) || - !isCmd(parser.getObj(), 'obj') || - !isStream(obj = parser.getObj())) { - error('Invalid XRef stream'); - } - dict = this.processXRefStream(obj); - if (!this.topDict) { - this.topDict = dict; - } - if (!dict) { - error('Failed to read XRef stream'); - } - } else { - error('Invalid XRef stream header'); - } - - // Recursively get previous dictionary, if any - obj = dict.get('Prev'); - if (isInt(obj)) { - this.startXRefQueue.push(obj); - } else if (isRef(obj)) { - // The spec says Prev must not be a reference, i.e. "/Prev NNN" - // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R" - this.startXRefQueue.push(obj.num); - } - - this.startXRefQueue.shift(); - } - - return this.topDict; - } catch (e) { - if (e instanceof MissingDataException) { - throw e; - } - info('(while reading XRef): ' + e); - } - - if (recoveryMode) { - return; - } - throw new XRefParseException(); - }, - - getEntry: function XRef_getEntry(i) { - var xrefEntry = this.entries[i]; - if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { - return xrefEntry; - } - return null; - }, - - fetchIfRef: function XRef_fetchIfRef(obj) { - if (!isRef(obj)) { - return obj; - } - return this.fetch(obj); - }, - - fetch: function XRef_fetch(ref, suppressEncryption) { - assert(isRef(ref), 'ref object is not a reference'); - var num = ref.num; - if (num in this.cache) { - var cacheEntry = this.cache[num]; - return cacheEntry; - } - - var xrefEntry = this.getEntry(num); - - // the referenced entry can be free - if (xrefEntry === null) { - return (this.cache[num] = null); - } - - if (xrefEntry.uncompressed) { - xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption); - } else { - xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption); - } - if (isDict(xrefEntry)){ - xrefEntry.objId = ref.toString(); - } else if (isStream(xrefEntry)) { - xrefEntry.dict.objId = ref.toString(); - } - return xrefEntry; - }, - - fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry, - suppressEncryption) { - var gen = ref.gen; - var num = ref.num; - if (xrefEntry.gen !== gen) { - error('inconsistent generation in XRef'); - } - var stream = this.stream.makeSubStream(xrefEntry.offset + - this.stream.start); - var parser = new Parser(new Lexer(stream), true, this); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - if (!isInt(obj1) || parseInt(obj1, 10) !== num || - !isInt(obj2) || parseInt(obj2, 10) !== gen || - !isCmd(obj3)) { - error('bad XRef entry'); - } - if (!isCmd(obj3, 'obj')) { - // some bad PDFs use "obj1234" and really mean 1234 - if (obj3.cmd.indexOf('obj') === 0) { - num = parseInt(obj3.cmd.substring(3), 10); - if (!isNaN(num)) { - return num; - } - } - error('bad XRef entry'); - } - if (this.encrypt && !suppressEncryption) { - xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen)); - } else { - xrefEntry = parser.getObj(); - } - if (!isStream(xrefEntry)) { - this.cache[num] = xrefEntry; - } - return xrefEntry; - }, - - fetchCompressed: function XRef_fetchCompressed(xrefEntry, - suppressEncryption) { - var tableOffset = xrefEntry.offset; - var stream = this.fetch(new Ref(tableOffset, 0)); - if (!isStream(stream)) { - error('bad ObjStm stream'); - } - var first = stream.dict.get('First'); - var n = stream.dict.get('N'); - if (!isInt(first) || !isInt(n)) { - error('invalid first and n parameters for ObjStm stream'); - } - var parser = new Parser(new Lexer(stream), false, this); - parser.allowStreams = true; - var i, entries = [], num, nums = []; - // read the object numbers to populate cache - for (i = 0; i < n; ++i) { - num = parser.getObj(); - if (!isInt(num)) { - error('invalid object number in the ObjStm stream: ' + num); - } - nums.push(num); - var offset = parser.getObj(); - if (!isInt(offset)) { - error('invalid object offset in the ObjStm stream: ' + offset); - } - } - // read stream objects for cache - for (i = 0; i < n; ++i) { - entries.push(parser.getObj()); - // The ObjStm should not contain 'endobj'. If it's present, skip over it - // to support corrupt PDFs (fixes issue 5241, bug 898610, bug 1037816). - if (isCmd(parser.buf1, 'endobj')) { - parser.shift(); - } - num = nums[i]; - var entry = this.entries[num]; - if (entry && entry.offset === tableOffset && entry.gen === i) { - this.cache[num] = entries[i]; - } - } - xrefEntry = entries[xrefEntry.gen]; - if (xrefEntry === undefined) { - error('bad XRef entry for compressed object'); - } - return xrefEntry; - }, - - fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) { - if (!isRef(obj)) { - return Promise.resolve(obj); - } - return this.fetchAsync(obj); - }, - - fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) { - var streamManager = this.stream.manager; - var xref = this; - return new Promise(function tryFetch(resolve, reject) { - try { - resolve(xref.fetch(ref, suppressEncryption)); - } catch (e) { - if (e instanceof MissingDataException) { - streamManager.requestRange(e.begin, e.end).then(function () { - tryFetch(resolve, reject); - }, reject); - return; - } - reject(e); - } - }); - }, - - getCatalogObj: function XRef_getCatalogObj() { - return this.root; - } - }; - - return XRef; -})(); - -/** - * A NameTree/NumberTree is like a Dict but has some advantageous properties, - * see the specification (7.9.6 and 7.9.7) for additional details. - * TODO: implement all the Dict functions and make this more efficient. - */ -var NameOrNumberTree = (function NameOrNumberTreeClosure() { - function NameOrNumberTree(root, xref) { - throw new Error('Cannot initialize NameOrNumberTree.'); - } - - NameOrNumberTree.prototype = { - getAll: function NameOrNumberTree_getAll() { - var dict = Object.create(null); - if (!this.root) { - return dict; - } - var xref = this.xref; - // Reading Name/Number tree. - var processed = new RefSet(); - processed.put(this.root); - var queue = [this.root]; - while (queue.length > 0) { - var i, n; - var obj = xref.fetchIfRef(queue.shift()); - if (!isDict(obj)) { - continue; - } - if (obj.has('Kids')) { - var kids = obj.get('Kids'); - for (i = 0, n = kids.length; i < n; i++) { - var kid = kids[i]; - assert(!processed.has(kid), - 'Duplicate entry in "' + this._type + '" tree.'); - queue.push(kid); - processed.put(kid); - } - continue; - } - var entries = obj.get(this._type); - if (isArray(entries)) { - for (i = 0, n = entries.length; i < n; i += 2) { - dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]); - } - } - } - return dict; - }, - - get: function NameOrNumberTree_get(key) { - if (!this.root) { - return null; - } - - var xref = this.xref; - var kidsOrEntries = xref.fetchIfRef(this.root); - var loopCount = 0; - var MAX_LEVELS = 10; - var l, r, m; - - // Perform a binary search to quickly find the entry that - // contains the key we are looking for. - while (kidsOrEntries.has('Kids')) { - if (++loopCount > MAX_LEVELS) { - warn('Search depth limit reached for "' + this._type + '" tree.'); - return null; - } - - var kids = kidsOrEntries.get('Kids'); - if (!isArray(kids)) { - return null; - } - - l = 0; - r = kids.length - 1; - while (l <= r) { - m = (l + r) >> 1; - var kid = xref.fetchIfRef(kids[m]); - var limits = kid.get('Limits'); - - if (key < xref.fetchIfRef(limits[0])) { - r = m - 1; - } else if (key > xref.fetchIfRef(limits[1])) { - l = m + 1; - } else { - kidsOrEntries = xref.fetchIfRef(kids[m]); - break; - } - } - if (l > r) { - return null; - } - } - - // If we get here, then we have found the right entry. Now go through the - // entries in the dictionary until we find the key we're looking for. - var entries = kidsOrEntries.get(this._type); - if (isArray(entries)) { - // Perform a binary search to reduce the lookup time. - l = 0; - r = entries.length - 2; - while (l <= r) { - // Check only even indices (0, 2, 4, ...) because the - // odd indices contain the actual data. - m = (l + r) & ~1; - var currentKey = xref.fetchIfRef(entries[m]); - if (key < currentKey) { - r = m - 2; - } else if (key > currentKey) { - l = m + 2; - } else { - return xref.fetchIfRef(entries[m + 1]); - } - } - } - return null; - } - }; - return NameOrNumberTree; -})(); - -var NameTree = (function NameTreeClosure() { - function NameTree(root, xref) { - this.root = root; - this.xref = xref; - this._type = 'Names'; - } - - Util.inherit(NameTree, NameOrNumberTree, {}); - - return NameTree; -})(); - -var NumberTree = (function NumberTreeClosure() { - function NumberTree(root, xref) { - this.root = root; - this.xref = xref; - this._type = 'Nums'; - } - - Util.inherit(NumberTree, NameOrNumberTree, {}); - - return NumberTree; -})(); - -/** - * "A PDF file can refer to the contents of another file by using a File - * Specification (PDF 1.1)", see the spec (7.11) for more details. - * NOTE: Only embedded files are supported (as part of the attachments support) - * TODO: support the 'URL' file system (with caching if !/V), portable - * collections attributes and related files (/RF) - */ -var FileSpec = (function FileSpecClosure() { - function FileSpec(root, xref) { - if (!root || !isDict(root)) { - return; - } - this.xref = xref; - this.root = root; - if (root.has('FS')) { - this.fs = root.get('FS'); - } - this.description = root.has('Desc') ? - stringToPDFString(root.get('Desc')) : - ''; - if (root.has('RF')) { - warn('Related file specifications are not supported'); - } - this.contentAvailable = true; - if (!root.has('EF')) { - this.contentAvailable = false; - warn('Non-embedded file specifications are not supported'); - } - } - - function pickPlatformItem(dict) { - // Look for the filename in this order: - // UF, F, Unix, Mac, DOS - if (dict.has('UF')) { - return dict.get('UF'); - } else if (dict.has('F')) { - return dict.get('F'); - } else if (dict.has('Unix')) { - return dict.get('Unix'); - } else if (dict.has('Mac')) { - return dict.get('Mac'); - } else if (dict.has('DOS')) { - return dict.get('DOS'); - } else { - return null; - } - } - - FileSpec.prototype = { - get filename() { - if (!this._filename && this.root) { - var filename = pickPlatformItem(this.root) || 'unnamed'; - this._filename = stringToPDFString(filename). - replace(/\\\\/g, '\\'). - replace(/\\\//g, '/'). - replace(/\\/g, '/'); - } - return this._filename; - }, - get content() { - if (!this.contentAvailable) { - return null; - } - if (!this.contentRef && this.root) { - this.contentRef = pickPlatformItem(this.root.get('EF')); - } - var content = null; - if (this.contentRef) { - var xref = this.xref; - var fileObj = xref.fetchIfRef(this.contentRef); - if (fileObj && isStream(fileObj)) { - content = fileObj.getBytes(); - } else { - warn('Embedded file specification points to non-existing/invalid ' + - 'content'); - } - } else { - warn('Embedded file specification does not have a content'); - } - return content; - }, - get serializable() { - return { - filename: this.filename, - content: this.content - }; - } - }; - return FileSpec; -})(); - -/** - * A helper for loading missing data in object graphs. It traverses the graph - * depth first and queues up any objects that have missing data. Once it has - * has traversed as many objects that are available it attempts to bundle the - * missing data requests and then resume from the nodes that weren't ready. - * - * NOTE: It provides protection from circular references by keeping track of - * of loaded references. However, you must be careful not to load any graphs - * that have references to the catalog or other pages since that will cause the - * entire PDF document object graph to be traversed. - */ -var ObjectLoader = (function() { - function mayHaveChildren(value) { - return isRef(value) || isDict(value) || isArray(value) || isStream(value); - } - - function addChildren(node, nodesToVisit) { - var value; - if (isDict(node) || isStream(node)) { - var map; - if (isDict(node)) { - map = node.map; - } else { - map = node.dict.map; - } - for (var key in map) { - value = map[key]; - if (mayHaveChildren(value)) { - nodesToVisit.push(value); - } - } - } else if (isArray(node)) { - for (var i = 0, ii = node.length; i < ii; i++) { - value = node[i]; - if (mayHaveChildren(value)) { - nodesToVisit.push(value); - } - } - } - } - - function ObjectLoader(obj, keys, xref) { - this.obj = obj; - this.keys = keys; - this.xref = xref; - this.refSet = null; - this.capability = null; - } - - ObjectLoader.prototype = { - load: function ObjectLoader_load() { - var keys = this.keys; - this.capability = createPromiseCapability(); - // Don't walk the graph if all the data is already loaded. - if (!(this.xref.stream instanceof ChunkedStream) || - this.xref.stream.getMissingChunks().length === 0) { - this.capability.resolve(); - return this.capability.promise; - } - - this.refSet = new RefSet(); - // Setup the initial nodes to visit. - var nodesToVisit = []; - for (var i = 0; i < keys.length; i++) { - nodesToVisit.push(this.obj[keys[i]]); - } - - this._walk(nodesToVisit); - return this.capability.promise; - }, - - _walk: function ObjectLoader_walk(nodesToVisit) { - var nodesToRevisit = []; - var pendingRequests = []; - // DFS walk of the object graph. - while (nodesToVisit.length) { - var currentNode = nodesToVisit.pop(); - - // Only references or chunked streams can cause missing data exceptions. - if (isRef(currentNode)) { - // Skip nodes that have already been visited. - if (this.refSet.has(currentNode)) { - continue; - } - try { - var ref = currentNode; - this.refSet.put(ref); - currentNode = this.xref.fetch(currentNode); - } catch (e) { - if (!(e instanceof MissingDataException)) { - throw e; - } - nodesToRevisit.push(currentNode); - pendingRequests.push({ begin: e.begin, end: e.end }); - } - } - if (currentNode && currentNode.getBaseStreams) { - var baseStreams = currentNode.getBaseStreams(); - var foundMissingData = false; - for (var i = 0; i < baseStreams.length; i++) { - var stream = baseStreams[i]; - if (stream.getMissingChunks && stream.getMissingChunks().length) { - foundMissingData = true; - pendingRequests.push({ - begin: stream.start, - end: stream.end - }); - } - } - if (foundMissingData) { - nodesToRevisit.push(currentNode); - } - } - - addChildren(currentNode, nodesToVisit); - } - - if (pendingRequests.length) { - this.xref.stream.manager.requestRanges(pendingRequests).then( - function pendingRequestCallback() { - nodesToVisit = nodesToRevisit; - for (var i = 0; i < nodesToRevisit.length; i++) { - var node = nodesToRevisit[i]; - // Remove any reference nodes from the currrent refset so they - // aren't skipped when we revist them. - if (isRef(node)) { - this.refSet.remove(node); - } - } - this._walk(nodesToVisit); - }.bind(this), this.capability.reject); - return; - } - // Everything is loaded. - this.refSet = null; - this.capability.resolve(); - } - }; - - return ObjectLoader; -})(); - -exports.Catalog = Catalog; -exports.ObjectLoader = ObjectLoader; -exports.XRef = XRef; -exports.FileSpec = FileSpec; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCorePattern = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreFunction, - root.pdfjsCoreColorSpace); - } -}(this, function (exports, sharedUtil, corePrimitives, coreFunction, - coreColorSpace) { - -var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; -var MissingDataException = sharedUtil.MissingDataException; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var warn = sharedUtil.warn; -var isStream = corePrimitives.isStream; -var PDFFunction = coreFunction.PDFFunction; -var ColorSpace = coreColorSpace.ColorSpace; - -var ShadingType = { - FUNCTION_BASED: 1, - AXIAL: 2, - RADIAL: 3, - FREE_FORM_MESH: 4, - LATTICE_FORM_MESH: 5, - COONS_PATCH_MESH: 6, - TENSOR_PATCH_MESH: 7 -}; - -var Pattern = (function PatternClosure() { - // Constructor should define this.getPattern - function Pattern() { - error('should not call Pattern constructor'); - } - - Pattern.prototype = { - // Input: current Canvas context - // Output: the appropriate fillStyle or strokeStyle - getPattern: function Pattern_getPattern(ctx) { - error('Should not call Pattern.getStyle: ' + ctx); - } - }; - - Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, - res, handler) { - - var dict = isStream(shading) ? shading.dict : shading; - var type = dict.get('ShadingType'); - - try { - switch (type) { - case ShadingType.AXIAL: - case ShadingType.RADIAL: - // Both radial and axial shadings are handled by RadialAxial shading. - return new Shadings.RadialAxial(dict, matrix, xref, res); - case ShadingType.FREE_FORM_MESH: - case ShadingType.LATTICE_FORM_MESH: - case ShadingType.COONS_PATCH_MESH: - case ShadingType.TENSOR_PATCH_MESH: - return new Shadings.Mesh(shading, matrix, xref, res); - default: - throw new Error('Unsupported ShadingType: ' + type); - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.shadingPattern}); - warn(ex); - return new Shadings.Dummy(); - } - }; - return Pattern; -})(); - -var Shadings = {}; - -// A small number to offset the first/last color stops so we can insert ones to -// support extend. Number.MIN_VALUE is too small and breaks the extend. -Shadings.SMALL_NUMBER = 1e-6; - -// Radial and axial shading have very similar implementations -// If needed, the implementations can be broken into two classes -Shadings.RadialAxial = (function RadialAxialClosure() { - function RadialAxial(dict, matrix, xref, res) { - this.matrix = matrix; - this.coordsArr = dict.getArray('Coords'); - this.shadingType = dict.get('ShadingType'); - this.type = 'Pattern'; - var cs = dict.get('ColorSpace', 'CS'); - cs = ColorSpace.parse(cs, xref, res); - this.cs = cs; - - var t0 = 0.0, t1 = 1.0; - if (dict.has('Domain')) { - var domainArr = dict.getArray('Domain'); - t0 = domainArr[0]; - t1 = domainArr[1]; - } - - var extendStart = false, extendEnd = false; - if (dict.has('Extend')) { - var extendArr = dict.getArray('Extend'); - extendStart = extendArr[0]; - extendEnd = extendArr[1]; - } - - if (this.shadingType === ShadingType.RADIAL && - (!extendStart || !extendEnd)) { - // Radial gradient only currently works if either circle is fully within - // the other circle. - var x1 = this.coordsArr[0]; - var y1 = this.coordsArr[1]; - var r1 = this.coordsArr[2]; - var x2 = this.coordsArr[3]; - var y2 = this.coordsArr[4]; - var r2 = this.coordsArr[5]; - var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); - if (r1 <= r2 + distance && - r2 <= r1 + distance) { - warn('Unsupported radial gradient.'); - } - } - - this.extendStart = extendStart; - this.extendEnd = extendEnd; - - var fnObj = dict.get('Function'); - var fn = PDFFunction.parseArray(xref, fnObj); - - // 10 samples seems good enough for now, but probably won't work - // if there are sharp color changes. Ideally, we would implement - // the spec faithfully and add lossless optimizations. - var diff = t1 - t0; - var step = diff / 10; - - var colorStops = this.colorStops = []; - - // Protect against bad domains so we don't end up in an infinte loop below. - if (t0 >= t1 || step <= 0) { - // Acrobat doesn't seem to handle these cases so we'll ignore for - // now. - info('Bad shading domain.'); - return; - } - - var color = new Float32Array(cs.numComps), ratio = new Float32Array(1); - var rgbColor; - for (var i = t0; i <= t1; i += step) { - ratio[0] = i; - fn(ratio, 0, color, 0); - rgbColor = cs.getRgb(color, 0); - var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - colorStops.push([(i - t0) / diff, cssColor]); - } - - var background = 'transparent'; - if (dict.has('Background')) { - rgbColor = cs.getRgb(dict.get('Background'), 0); - background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - } - - if (!extendStart) { - // Insert a color stop at the front and offset the first real color stop - // so it doesn't conflict with the one we insert. - colorStops.unshift([0, background]); - colorStops[1][0] += Shadings.SMALL_NUMBER; - } - if (!extendEnd) { - // Same idea as above in extendStart but for the end. - colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER; - colorStops.push([1, background]); - } - - this.colorStops = colorStops; - } - - RadialAxial.prototype = { - getIR: function RadialAxial_getIR() { - var coordsArr = this.coordsArr; - var shadingType = this.shadingType; - var type, p0, p1, r0, r1; - if (shadingType === ShadingType.AXIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[2], coordsArr[3]]; - r0 = null; - r1 = null; - type = 'axial'; - } else if (shadingType === ShadingType.RADIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[3], coordsArr[4]]; - r0 = coordsArr[2]; - r1 = coordsArr[5]; - type = 'radial'; - } else { - error('getPattern type unknown: ' + shadingType); - } - - var matrix = this.matrix; - if (matrix) { - p0 = Util.applyTransform(p0, matrix); - p1 = Util.applyTransform(p1, matrix); - if (shadingType === ShadingType.RADIAL) { - var scale = Util.singularValueDecompose2dScale(matrix); - r0 *= scale[0]; - r1 *= scale[1]; - } - } - - return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1]; - } - }; - - return RadialAxial; -})(); - -// All mesh shading. For now, they will be presented as set of the triangles -// to be drawn on the canvas and rgb color for each vertex. -Shadings.Mesh = (function MeshClosure() { - function MeshStreamReader(stream, context) { - this.stream = stream; - this.context = context; - this.buffer = 0; - this.bufferLength = 0; - - var numComps = context.numComps; - this.tmpCompsBuf = new Float32Array(numComps); - var csNumComps = context.colorSpace.numComps; - this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : - this.tmpCompsBuf; - } - MeshStreamReader.prototype = { - get hasData() { - if (this.stream.end) { - return this.stream.pos < this.stream.end; - } - if (this.bufferLength > 0) { - return true; - } - var nextByte = this.stream.getByte(); - if (nextByte < 0) { - return false; - } - this.buffer = nextByte; - this.bufferLength = 8; - return true; - }, - readBits: function MeshStreamReader_readBits(n) { - var buffer = this.buffer; - var bufferLength = this.bufferLength; - if (n === 32) { - if (bufferLength === 0) { - return ((this.stream.getByte() << 24) | - (this.stream.getByte() << 16) | (this.stream.getByte() << 8) | - this.stream.getByte()) >>> 0; - } - buffer = (buffer << 24) | (this.stream.getByte() << 16) | - (this.stream.getByte() << 8) | this.stream.getByte(); - var nextByte = this.stream.getByte(); - this.buffer = nextByte & ((1 << bufferLength) - 1); - return ((buffer << (8 - bufferLength)) | - ((nextByte & 0xFF) >> bufferLength)) >>> 0; - } - if (n === 8 && bufferLength === 0) { - return this.stream.getByte(); - } - while (bufferLength < n) { - buffer = (buffer << 8) | this.stream.getByte(); - bufferLength += 8; - } - bufferLength -= n; - this.bufferLength = bufferLength; - this.buffer = buffer & ((1 << bufferLength) - 1); - return buffer >> bufferLength; - }, - align: function MeshStreamReader_align() { - this.buffer = 0; - this.bufferLength = 0; - }, - readFlag: function MeshStreamReader_readFlag() { - return this.readBits(this.context.bitsPerFlag); - }, - readCoordinate: function MeshStreamReader_readCoordinate() { - var bitsPerCoordinate = this.context.bitsPerCoordinate; - var xi = this.readBits(bitsPerCoordinate); - var yi = this.readBits(bitsPerCoordinate); - var decode = this.context.decode; - var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : - 2.3283064365386963e-10; // 2 ^ -32 - return [ - xi * scale * (decode[1] - decode[0]) + decode[0], - yi * scale * (decode[3] - decode[2]) + decode[2] - ]; - }, - readComponents: function MeshStreamReader_readComponents() { - var numComps = this.context.numComps; - var bitsPerComponent = this.context.bitsPerComponent; - var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : - 2.3283064365386963e-10; // 2 ^ -32 - var decode = this.context.decode; - var components = this.tmpCompsBuf; - for (var i = 0, j = 4; i < numComps; i++, j += 2) { - var ci = this.readBits(bitsPerComponent); - components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; - } - var color = this.tmpCsCompsBuf; - if (this.context.colorFn) { - this.context.colorFn(components, 0, color, 0); - } - return this.context.colorSpace.getRgb(color, 0); - } - }; - - function decodeType4Shading(mesh, reader) { - var coords = mesh.coords; - var colors = mesh.colors; - var operators = []; - var ps = []; // not maintaining cs since that will match ps - var verticesLeft = 0; // assuming we have all data to start a new triangle - while (reader.hasData) { - var f = reader.readFlag(); - var coord = reader.readCoordinate(); - var color = reader.readComponents(); - if (verticesLeft === 0) { // ignoring flags if we started a triangle - assert(0 <= f && f <= 2, 'Unknown type4 flag'); - switch (f) { - case 0: - verticesLeft = 3; - break; - case 1: - ps.push(ps[ps.length - 2], ps[ps.length - 1]); - verticesLeft = 1; - break; - case 2: - ps.push(ps[ps.length - 3], ps[ps.length - 1]); - verticesLeft = 1; - break; - } - operators.push(f); - } - ps.push(coords.length); - coords.push(coord); - colors.push(color); - verticesLeft--; - - reader.align(); - } - mesh.figures.push({ - type: 'triangles', - coords: new Int32Array(ps), - colors: new Int32Array(ps), - }); - } - - function decodeType5Shading(mesh, reader, verticesPerRow) { - var coords = mesh.coords; - var colors = mesh.colors; - var ps = []; // not maintaining cs since that will match ps - while (reader.hasData) { - var coord = reader.readCoordinate(); - var color = reader.readComponents(); - ps.push(coords.length); - coords.push(coord); - colors.push(color); - } - mesh.figures.push({ - type: 'lattice', - coords: new Int32Array(ps), - colors: new Int32Array(ps), - verticesPerRow: verticesPerRow - }); - } - - var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; - var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; - - var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds - - var getB = (function getBClosure() { - function buildB(count) { - var lut = []; - for (var i = 0; i <= count; i++) { - var t = i / count, t_ = 1 - t; - lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, - 3 * t * t * t_, t * t * t])); - } - return lut; - } - var cache = []; - return function getB(count) { - if (!cache[count]) { - cache[count] = buildB(count); - } - return cache[count]; - }; - })(); - - function buildFigureFromPatch(mesh, index) { - var figure = mesh.figures[index]; - assert(figure.type === 'patch', 'Unexpected patch mesh figure'); - - var coords = mesh.coords, colors = mesh.colors; - var pi = figure.coords; - var ci = figure.colors; - - var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], - coords[pi[12]][0], coords[pi[15]][0]); - var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], - coords[pi[12]][1], coords[pi[15]][1]); - var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], - coords[pi[12]][0], coords[pi[15]][0]); - var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], - coords[pi[12]][1], coords[pi[15]][1]); - var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / - (mesh.bounds[2] - mesh.bounds[0])); - splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); - var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / - (mesh.bounds[3] - mesh.bounds[1])); - splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); - - var verticesPerRow = splitXBy + 1; - var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); - var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); - var k = 0; - var cl = new Uint8Array(3), cr = new Uint8Array(3); - var c0 = colors[ci[0]], c1 = colors[ci[1]], - c2 = colors[ci[2]], c3 = colors[ci[3]]; - var bRow = getB(splitYBy), bCol = getB(splitXBy); - for (var row = 0; row <= splitYBy; row++) { - cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0; - cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0; - cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0; - - cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0; - cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0; - cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0; - - for (var col = 0; col <= splitXBy; col++, k++) { - if ((row === 0 || row === splitYBy) && - (col === 0 || col === splitXBy)) { - continue; - } - var x = 0, y = 0; - var q = 0; - for (var i = 0; i <= 3; i++) { - for (var j = 0; j <= 3; j++, q++) { - var m = bRow[row][i] * bCol[col][j]; - x += coords[pi[q]][0] * m; - y += coords[pi[q]][1] * m; - } - } - figureCoords[k] = coords.length; - coords.push([x, y]); - figureColors[k] = colors.length; - var newColor = new Uint8Array(3); - newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0; - newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0; - newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0; - colors.push(newColor); - } - } - figureCoords[0] = pi[0]; - figureColors[0] = ci[0]; - figureCoords[splitXBy] = pi[3]; - figureColors[splitXBy] = ci[1]; - figureCoords[verticesPerRow * splitYBy] = pi[12]; - figureColors[verticesPerRow * splitYBy] = ci[2]; - figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; - figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; - - mesh.figures[index] = { - type: 'lattice', - coords: figureCoords, - colors: figureColors, - verticesPerRow: verticesPerRow - }; - } - - function decodeType6Shading(mesh, reader) { - // A special case of Type 7. The p11, p12, p21, p22 automatically filled - var coords = mesh.coords; - var colors = mesh.colors; - var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 - var cs = new Int32Array(4); // c00, c30, c03, c33 - while (reader.hasData) { - var f = reader.readFlag(); - assert(0 <= f && f <= 3, 'Unknown type6 flag'); - var i, ii; - var pi = coords.length; - for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) { - coords.push(reader.readCoordinate()); - } - var ci = colors.length; - for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { - colors.push(reader.readComponents()); - } - var tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; - ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 7; - ps[ 4] = pi + 1; /* calculated below */ ps[ 7] = pi + 8; - ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; - cs[2] = ci + 1; cs[3] = ci + 2; - cs[0] = ci; cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = tmp3; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = tmp2; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[7]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[1]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = ps[2]; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = ci; - cs[0] = cs[1]; cs[1] = ci + 1; - break; - } - // set p11, p12, p21, p22 - ps[5] = coords.length; - coords.push([ - (-4 * coords[ps[0]][0] - coords[ps[15]][0] + - 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + - 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, - (-4 * coords[ps[0]][1] - coords[ps[15]][1] + - 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + - 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9 - ]); - ps[6] = coords.length; - coords.push([ - (-4 * coords[ps[3]][0] - coords[ps[12]][0] + - 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + - 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, - (-4 * coords[ps[3]][1] - coords[ps[12]][1] + - 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + - 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9 - ]); - ps[9] = coords.length; - coords.push([ - (-4 * coords[ps[12]][0] - coords[ps[3]][0] + - 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + - 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, - (-4 * coords[ps[12]][1] - coords[ps[3]][1] + - 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + - 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9 - ]); - ps[10] = coords.length; - coords.push([ - (-4 * coords[ps[15]][0] - coords[ps[0]][0] + - 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + - 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, - (-4 * coords[ps[15]][1] - coords[ps[0]][1] + - 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + - 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9 - ]); - mesh.figures.push({ - type: 'patch', - coords: new Int32Array(ps), // making copies of ps and cs - colors: new Int32Array(cs) - }); - } - } - - function decodeType7Shading(mesh, reader) { - var coords = mesh.coords; - var colors = mesh.colors; - var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 - var cs = new Int32Array(4); // c00, c30, c03, c33 - while (reader.hasData) { - var f = reader.readFlag(); - assert(0 <= f && f <= 3, 'Unknown type7 flag'); - var i, ii; - var pi = coords.length; - for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) { - coords.push(reader.readCoordinate()); - } - var ci = colors.length; - for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { - colors.push(reader.readComponents()); - } - var tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; - ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7; - ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8; - ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; - cs[2] = ci + 1; cs[3] = ci + 2; - cs[0] = ci; cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = tmp3; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = tmp2; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[7]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[1]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = ps[2]; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = ci; - cs[0] = cs[1]; cs[1] = ci + 1; - break; - } - mesh.figures.push({ - type: 'patch', - coords: new Int32Array(ps), // making copies of ps and cs - colors: new Int32Array(cs) - }); - } - } - - function updateBounds(mesh) { - var minX = mesh.coords[0][0], minY = mesh.coords[0][1], - maxX = minX, maxY = minY; - for (var i = 1, ii = mesh.coords.length; i < ii; i++) { - var x = mesh.coords[i][0], y = mesh.coords[i][1]; - minX = minX > x ? x : minX; - minY = minY > y ? y : minY; - maxX = maxX < x ? x : maxX; - maxY = maxY < y ? y : maxY; - } - mesh.bounds = [minX, minY, maxX, maxY]; - } - - function packData(mesh) { - var i, ii, j, jj; - - var coords = mesh.coords; - var coordsPacked = new Float32Array(coords.length * 2); - for (i = 0, j = 0, ii = coords.length; i < ii; i++) { - var xy = coords[i]; - coordsPacked[j++] = xy[0]; - coordsPacked[j++] = xy[1]; - } - mesh.coords = coordsPacked; - - var colors = mesh.colors; - var colorsPacked = new Uint8Array(colors.length * 3); - for (i = 0, j = 0, ii = colors.length; i < ii; i++) { - var c = colors[i]; - colorsPacked[j++] = c[0]; - colorsPacked[j++] = c[1]; - colorsPacked[j++] = c[2]; - } - mesh.colors = colorsPacked; - - var figures = mesh.figures; - for (i = 0, ii = figures.length; i < ii; i++) { - var figure = figures[i], ps = figure.coords, cs = figure.colors; - for (j = 0, jj = ps.length; j < jj; j++) { - ps[j] *= 2; - cs[j] *= 3; - } - } - } - - function Mesh(stream, matrix, xref, res) { - assert(isStream(stream), 'Mesh data is not a stream'); - var dict = stream.dict; - this.matrix = matrix; - this.shadingType = dict.get('ShadingType'); - this.type = 'Pattern'; - this.bbox = dict.getArray('BBox'); - var cs = dict.get('ColorSpace', 'CS'); - cs = ColorSpace.parse(cs, xref, res); - this.cs = cs; - this.background = dict.has('Background') ? - cs.getRgb(dict.get('Background'), 0) : null; - - var fnObj = dict.get('Function'); - var fn = fnObj ? PDFFunction.parseArray(xref, fnObj) : null; - - this.coords = []; - this.colors = []; - this.figures = []; - - var decodeContext = { - bitsPerCoordinate: dict.get('BitsPerCoordinate'), - bitsPerComponent: dict.get('BitsPerComponent'), - bitsPerFlag: dict.get('BitsPerFlag'), - decode: dict.getArray('Decode'), - colorFn: fn, - colorSpace: cs, - numComps: fn ? 1 : cs.numComps - }; - var reader = new MeshStreamReader(stream, decodeContext); - - var patchMesh = false; - switch (this.shadingType) { - case ShadingType.FREE_FORM_MESH: - decodeType4Shading(this, reader); - break; - case ShadingType.LATTICE_FORM_MESH: - var verticesPerRow = dict.get('VerticesPerRow') | 0; - assert(verticesPerRow >= 2, 'Invalid VerticesPerRow'); - decodeType5Shading(this, reader, verticesPerRow); - break; - case ShadingType.COONS_PATCH_MESH: - decodeType6Shading(this, reader); - patchMesh = true; - break; - case ShadingType.TENSOR_PATCH_MESH: - decodeType7Shading(this, reader); - patchMesh = true; - break; - default: - error('Unsupported mesh type.'); - break; - } - - if (patchMesh) { - // dirty bounds calculation for determining, how dense shall be triangles - updateBounds(this); - for (var i = 0, ii = this.figures.length; i < ii; i++) { - buildFigureFromPatch(this, i); - } - } - // calculate bounds - updateBounds(this); - - packData(this); - } - - Mesh.prototype = { - getIR: function Mesh_getIR() { - return ['Mesh', this.shadingType, this.coords, this.colors, this.figures, - this.bounds, this.matrix, this.bbox, this.background]; - } - }; - - return Mesh; -})(); - -Shadings.Dummy = (function DummyClosure() { - function Dummy() { - this.type = 'Pattern'; - } - - Dummy.prototype = { - getIR: function Dummy_getIR() { - return ['Dummy']; - } - }; - return Dummy; -})(); - -function getTilingPatternIR(operatorList, dict, args) { - var matrix = dict.getArray('Matrix'); - var bbox = dict.getArray('BBox'); - var xstep = dict.get('XStep'); - var ystep = dict.get('YStep'); - var paintType = dict.get('PaintType'); - var tilingType = dict.get('TilingType'); - - return [ - 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, - paintType, tilingType - ]; -} - -exports.Pattern = Pattern; -exports.getTilingPatternIR = getTilingPatternIR; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreEvaluator = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser, - root.pdfjsCoreImage, root.pdfjsCoreColorSpace, root.pdfjsCoreMurmurHash3, - root.pdfjsCoreFonts, root.pdfjsCoreFunction, root.pdfjsCorePattern, - root.pdfjsCoreCMap, root.pdfjsCoreMetrics, root.pdfjsCoreBidi, - root.pdfjsCoreEncodings, root.pdfjsCoreStandardFonts, - root.pdfjsCoreUnicode, root.pdfjsCoreGlyphList); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser, - coreImage, coreColorSpace, coreMurmurHash3, coreFonts, - coreFunction, corePattern, coreCMap, coreMetrics, coreBidi, - coreEncodings, coreStandardFonts, coreUnicode, - coreGlyphList) { - -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; -var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; -var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; -var ImageKind = sharedUtil.ImageKind; -var OPS = sharedUtil.OPS; -var TextRenderingMode = sharedUtil.TextRenderingMode; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isNum = sharedUtil.isNum; -var isString = sharedUtil.isString; -var getLookupTableFactory = sharedUtil.getLookupTableFactory; -var warn = sharedUtil.warn; -var Dict = corePrimitives.Dict; -var Name = corePrimitives.Name; -var isCmd = corePrimitives.isCmd; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var isRef = corePrimitives.isRef; -var isStream = corePrimitives.isStream; -var DecodeStream = coreStream.DecodeStream; -var JpegStream = coreStream.JpegStream; -var Stream = coreStream.Stream; -var Lexer = coreParser.Lexer; -var Parser = coreParser.Parser; -var isEOF = coreParser.isEOF; -var PDFImage = coreImage.PDFImage; -var ColorSpace = coreColorSpace.ColorSpace; -var MurmurHash3_64 = coreMurmurHash3.MurmurHash3_64; -var ErrorFont = coreFonts.ErrorFont; -var FontFlags = coreFonts.FontFlags; -var Font = coreFonts.Font; -var IdentityToUnicodeMap = coreFonts.IdentityToUnicodeMap; -var ToUnicodeMap = coreFonts.ToUnicodeMap; -var getFontType = coreFonts.getFontType; -var isPDFFunction = coreFunction.isPDFFunction; -var PDFFunction = coreFunction.PDFFunction; -var Pattern = corePattern.Pattern; -var getTilingPatternIR = corePattern.getTilingPatternIR; -var CMapFactory = coreCMap.CMapFactory; -var IdentityCMap = coreCMap.IdentityCMap; -var getMetrics = coreMetrics.getMetrics; -var bidi = coreBidi.bidi; -var WinAnsiEncoding = coreEncodings.WinAnsiEncoding; -var StandardEncoding = coreEncodings.StandardEncoding; -var MacRomanEncoding = coreEncodings.MacRomanEncoding; -var SymbolSetEncoding = coreEncodings.SymbolSetEncoding; -var ZapfDingbatsEncoding = coreEncodings.ZapfDingbatsEncoding; -var getEncoding = coreEncodings.getEncoding; -var getStdFontMap = coreStandardFonts.getStdFontMap; -var getSerifFonts = coreStandardFonts.getSerifFonts; -var getSymbolsFonts = coreStandardFonts.getSymbolsFonts; -var getNormalizedUnicodes = coreUnicode.getNormalizedUnicodes; -var reverseIfRtl = coreUnicode.reverseIfRtl; -var getUnicodeForGlyph = coreUnicode.getUnicodeForGlyph; -var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; - -var PartialEvaluator = (function PartialEvaluatorClosure() { - var DefaultPartialEvaluatorOptions = { - forceDataSchema: false, - maxImageSize: -1, - disableFontFace: false, - cMapOptions: { url: null, packed: false } - }; - - function NativeImageDecoder(xref, resources, handler, forceDataSchema) { - this.xref = xref; - this.resources = resources; - this.handler = handler; - this.forceDataSchema = forceDataSchema; - } - NativeImageDecoder.prototype = { - canDecode: function (image) { - return image instanceof JpegStream && - NativeImageDecoder.isDecodable(image, this.xref, this.resources); - }, - decode: function (image) { - // For natively supported JPEGs send them to the main thread for decoding. - var dict = image.dict; - var colorSpace = dict.get('ColorSpace', 'CS'); - colorSpace = ColorSpace.parse(colorSpace, this.xref, this.resources); - var numComps = colorSpace.numComps; - var decodePromise = this.handler.sendWithPromise('JpegDecode', - [image.getIR(this.forceDataSchema), numComps]); - return decodePromise.then(function (message) { - var data = message.data; - return new Stream(data, 0, data.length, image.dict); - }); - } - }; - /** - * Checks if the image can be decoded and displayed by the browser without any - * further processing such as color space conversions. - */ - NativeImageDecoder.isSupported = - function NativeImageDecoder_isSupported(image, xref, res) { - var dict = image.dict; - if (dict.has('DecodeParms') || dict.has('DP')) { - return false; - } - var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res); - return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && - cs.isDefaultDecode(dict.getArray('Decode', 'D')); - }; - /** - * Checks if the image can be decoded by the browser. - */ - NativeImageDecoder.isDecodable = - function NativeImageDecoder_isDecodable(image, xref, res) { - var dict = image.dict; - if (dict.has('DecodeParms') || dict.has('DP')) { - return false; - } - var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res); - return (cs.numComps === 1 || cs.numComps === 3) && - cs.isDefaultDecode(dict.getArray('Decode', 'D')); - }; - - function PartialEvaluator(pdfManager, xref, handler, pageIndex, - uniquePrefix, idCounters, fontCache, options) { - this.pdfManager = pdfManager; - this.xref = xref; - this.handler = handler; - this.pageIndex = pageIndex; - this.uniquePrefix = uniquePrefix; - this.idCounters = idCounters; - this.fontCache = fontCache; - this.options = options || DefaultPartialEvaluatorOptions; - } - - // Trying to minimize Date.now() usage and check every 100 time - var TIME_SLOT_DURATION_MS = 20; - var CHECK_TIME_EVERY = 100; - function TimeSlotManager() { - this.reset(); - } - TimeSlotManager.prototype = { - check: function TimeSlotManager_check() { - if (++this.checked < CHECK_TIME_EVERY) { - return false; - } - this.checked = 0; - return this.endTime <= Date.now(); - }, - reset: function TimeSlotManager_reset() { - this.endTime = Date.now() + TIME_SLOT_DURATION_MS; - this.checked = 0; - } - }; - - var deferred = Promise.resolve(); - - var TILING_PATTERN = 1, SHADING_PATTERN = 2; - - PartialEvaluator.prototype = { - hasBlendModes: function PartialEvaluator_hasBlendModes(resources) { - if (!isDict(resources)) { - return false; - } - - var processed = Object.create(null); - if (resources.objId) { - processed[resources.objId] = true; - } - - var nodes = [resources], xref = this.xref; - while (nodes.length) { - var key, i, ii; - var node = nodes.shift(); - // First check the current resources for blend modes. - var graphicStates = node.get('ExtGState'); - if (isDict(graphicStates)) { - var graphicStatesKeys = graphicStates.getKeys(); - for (i = 0, ii = graphicStatesKeys.length; i < ii; i++) { - key = graphicStatesKeys[i]; - - var graphicState = graphicStates.get(key); - var bm = graphicState.get('BM'); - if (isName(bm) && bm.name !== 'Normal') { - return true; - } - } - } - // Descend into the XObjects to look for more resources and blend modes. - var xObjects = node.get('XObject'); - if (!isDict(xObjects)) { - continue; - } - var xObjectsKeys = xObjects.getKeys(); - for (i = 0, ii = xObjectsKeys.length; i < ii; i++) { - key = xObjectsKeys[i]; - - var xObject = xObjects.getRaw(key); - if (isRef(xObject)) { - if (processed[xObject.toString()]) { - // The XObject has already been processed, and by avoiding a - // redundant `xref.fetch` we can *significantly* reduce the load - // time for badly generated PDF files (fixes issue6961.pdf). - continue; - } - xObject = xref.fetch(xObject); - } - if (!isStream(xObject)) { - continue; - } - if (xObject.dict.objId) { - if (processed[xObject.dict.objId]) { - // stream has objId and is processed already - continue; - } - processed[xObject.dict.objId] = true; - } - var xResources = xObject.dict.get('Resources'); - // Checking objId to detect an infinite loop. - if (isDict(xResources) && - (!xResources.objId || !processed[xResources.objId])) { - nodes.push(xResources); - if (xResources.objId) { - processed[xResources.objId] = true; - } - } - } - } - return false; - }, - - buildFormXObject: function PartialEvaluator_buildFormXObject(resources, - xobj, smask, - operatorList, - task, - initialState) { - var matrix = xobj.dict.getArray('Matrix'); - var bbox = xobj.dict.getArray('BBox'); - var group = xobj.dict.get('Group'); - if (group) { - var groupOptions = { - matrix: matrix, - bbox: bbox, - smask: smask, - isolated: false, - knockout: false - }; - - var groupSubtype = group.get('S'); - var colorSpace; - if (isName(groupSubtype, 'Transparency')) { - groupOptions.isolated = (group.get('I') || false); - groupOptions.knockout = (group.get('K') || false); - colorSpace = (group.has('CS') ? - ColorSpace.parse(group.get('CS'), this.xref, resources) : null); - } - - if (smask && smask.backdrop) { - colorSpace = colorSpace || ColorSpace.singletons.rgb; - smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); - } - - operatorList.addOp(OPS.beginGroup, [groupOptions]); - } - - operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]); - - return this.getOperatorList(xobj, task, - (xobj.dict.get('Resources') || resources), operatorList, initialState). - then(function () { - operatorList.addOp(OPS.paintFormXObjectEnd, []); - - if (group) { - operatorList.addOp(OPS.endGroup, [groupOptions]); - } - }); - }, - - buildPaintImageXObject: - function PartialEvaluator_buildPaintImageXObject(resources, image, - inline, operatorList, - cacheKey, imageCache) { - var self = this; - var dict = image.dict; - var w = dict.get('Width', 'W'); - var h = dict.get('Height', 'H'); - - if (!(w && isNum(w)) || !(h && isNum(h))) { - warn('Image dimensions are missing, or not numbers.'); - return; - } - var maxImageSize = this.options.maxImageSize; - if (maxImageSize !== -1 && w * h > maxImageSize) { - warn('Image exceeded maximum allowed size and was removed.'); - return; - } - - var imageMask = (dict.get('ImageMask', 'IM') || false); - var imgData, args; - if (imageMask) { - // This depends on a tmpCanvas being filled with the - // current fillStyle, such that processing the pixel - // data can't be done here. Instead of creating a - // complete PDFImage, only read the information needed - // for later. - - var width = dict.get('Width', 'W'); - var height = dict.get('Height', 'H'); - var bitStrideLength = (width + 7) >> 3; - var imgArray = image.getBytes(bitStrideLength * height); - var decode = dict.getArray('Decode', 'D'); - var inverseDecode = (!!decode && decode[0] > 0); - - imgData = PDFImage.createMask(imgArray, width, height, - image instanceof DecodeStream, - inverseDecode); - imgData.cached = true; - args = [imgData]; - operatorList.addOp(OPS.paintImageMaskXObject, args); - if (cacheKey) { - imageCache[cacheKey] = { - fn: OPS.paintImageMaskXObject, - args: args - }; - } - return; - } - - var softMask = (dict.get('SMask', 'SM') || false); - var mask = (dict.get('Mask') || false); - - var SMALL_IMAGE_DIMENSIONS = 200; - // Inlining small images into the queue as RGB data - if (inline && !softMask && !mask && !(image instanceof JpegStream) && - (w + h) < SMALL_IMAGE_DIMENSIONS) { - var imageObj = new PDFImage(this.xref, resources, image, - inline, null, null); - // We force the use of RGBA_32BPP images here, because we can't handle - // any other kind. - imgData = imageObj.createImageData(/* forceRGBA = */ true); - operatorList.addOp(OPS.paintInlineImageXObject, [imgData]); - return; - } - - // If there is no imageMask, create the PDFImage and a lot - // of image processing can be done here. - var uniquePrefix = (this.uniquePrefix || ''); - var objId = 'img_' + uniquePrefix + (++this.idCounters.obj); - operatorList.addDependency(objId); - args = [objId, w, h]; - - if (!softMask && !mask && image instanceof JpegStream && - NativeImageDecoder.isSupported(image, this.xref, resources)) { - // These JPEGs don't need any more processing so we can just send it. - operatorList.addOp(OPS.paintJpegXObject, args); - this.handler.send('obj', - [objId, this.pageIndex, 'JpegStream', - image.getIR(this.options.forceDataSchema)]); - return; - } - - // Creates native image decoder only if a JPEG image or mask is present. - var nativeImageDecoder = null; - if (image instanceof JpegStream || mask instanceof JpegStream || - softMask instanceof JpegStream) { - nativeImageDecoder = new NativeImageDecoder(self.xref, resources, - self.handler, self.options.forceDataSchema); - } - - PDFImage.buildImage(self.handler, self.xref, resources, image, inline, - nativeImageDecoder). - then(function(imageObj) { - var imgData = imageObj.createImageData(/* forceRGBA = */ false); - self.handler.send('obj', [objId, self.pageIndex, 'Image', imgData], - [imgData.data.buffer]); - }).then(undefined, function (reason) { - warn('Unable to decode image: ' + reason); - self.handler.send('obj', [objId, self.pageIndex, 'Image', null]); - }); - - operatorList.addOp(OPS.paintImageXObject, args); - if (cacheKey) { - imageCache[cacheKey] = { - fn: OPS.paintImageXObject, - args: args - }; - } - }, - - handleSMask: function PartialEvaluator_handleSmask(smask, resources, - operatorList, task, - stateManager) { - var smaskContent = smask.get('G'); - var smaskOptions = { - subtype: smask.get('S').name, - backdrop: smask.get('BC') - }; - - // The SMask might have a alpha/luminosity value transfer function -- - // we will build a map of integer values in range 0..255 to be fast. - var transferObj = smask.get('TR'); - if (isPDFFunction(transferObj)) { - var transferFn = PDFFunction.parse(this.xref, transferObj); - var transferMap = new Uint8Array(256); - var tmp = new Float32Array(1); - for (var i = 0; i < 256; i++) { - tmp[0] = i / 255; - transferFn(tmp, 0, tmp, 0); - transferMap[i] = (tmp[0] * 255) | 0; - } - smaskOptions.transferMap = transferMap; - } - - return this.buildFormXObject(resources, smaskContent, smaskOptions, - operatorList, task, stateManager.state.clone()); - }, - - handleTilingType: - function PartialEvaluator_handleTilingType(fn, args, resources, - pattern, patternDict, - operatorList, task) { - // Create an IR of the pattern code. - var tilingOpList = new OperatorList(); - // Merge the available resources, to prevent issues when the patternDict - // is missing some /Resources entries (fixes issue6541.pdf). - var resourcesArray = [patternDict.get('Resources'), resources]; - var patternResources = Dict.merge(this.xref, resourcesArray); - - return this.getOperatorList(pattern, task, patternResources, - tilingOpList).then(function () { - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - operatorList.addDependencies(tilingOpList.dependencies); - operatorList.addOp(fn, getTilingPatternIR({ - fnArray: tilingOpList.fnArray, - argsArray: tilingOpList.argsArray - }, patternDict, args)); - }); - }, - - handleSetFont: - function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, - operatorList, task, state) { - // TODO(mack): Not needed? - var fontName; - if (fontArgs) { - fontArgs = fontArgs.slice(); - fontName = fontArgs[0].name; - } - - var self = this; - return this.loadFont(fontName, fontRef, this.xref, resources).then( - function (translated) { - if (!translated.font.isType3Font) { - return translated; - } - return translated.loadType3Data(self, resources, operatorList, task). - then(function () { - return translated; - }, function (reason) { - // Error in the font data -- sending unsupported feature notification. - self.handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.font}); - return new TranslatedFont('g_font_error', - new ErrorFont('Type3 font load error: ' + reason), translated.font); - }); - }).then(function (translated) { - state.font = translated.font; - translated.send(self.handler); - return translated.loadedName; - }); - }, - - handleText: function PartialEvaluator_handleText(chars, state) { - var font = state.font; - var glyphs = font.charsToGlyphs(chars); - var isAddToPathSet = !!(state.textRenderingMode & - TextRenderingMode.ADD_TO_PATH_FLAG); - if (font.data && (isAddToPathSet || this.options.disableFontFace)) { - var buildPath = function (fontChar) { - if (!font.renderer.hasBuiltPath(fontChar)) { - var path = font.renderer.getPathJs(fontChar); - this.handler.send('commonobj', [ - font.loadedName + '_path_' + fontChar, - 'FontPath', - path - ]); - } - }.bind(this); - - for (var i = 0, ii = glyphs.length; i < ii; i++) { - var glyph = glyphs[i]; - buildPath(glyph.fontChar); - - // If the glyph has an accent we need to build a path for its - // fontChar too, otherwise CanvasGraphics_paintChar will fail. - var accent = glyph.accent; - if (accent && accent.fontChar) { - buildPath(accent.fontChar); - } - } - } - - return glyphs; - }, - - setGState: function PartialEvaluator_setGState(resources, gState, - operatorList, task, - xref, stateManager) { - // This array holds the converted/processed state data. - var gStateObj = []; - var gStateKeys = gState.getKeys(); - var self = this; - var promise = Promise.resolve(); - for (var i = 0, ii = gStateKeys.length; i < ii; i++) { - var key = gStateKeys[i]; - var value = gState.get(key); - switch (key) { - case 'Type': - break; - case 'LW': - case 'LC': - case 'LJ': - case 'ML': - case 'D': - case 'RI': - case 'FL': - case 'CA': - case 'ca': - gStateObj.push([key, value]); - break; - case 'Font': - promise = promise.then(function () { - return self.handleSetFont(resources, null, value[0], operatorList, - task, stateManager.state). - then(function (loadedName) { - operatorList.addDependency(loadedName); - gStateObj.push([key, [loadedName, value[1]]]); - }); - }); - break; - case 'BM': - gStateObj.push([key, value]); - break; - case 'SMask': - if (isName(value, 'None')) { - gStateObj.push([key, false]); - break; - } - if (isDict(value)) { - promise = promise.then(function (dict) { - return self.handleSMask(dict, resources, operatorList, - task, stateManager); - }.bind(this, value)); - gStateObj.push([key, true]); - } else { - warn('Unsupported SMask type'); - } - - break; - // Only generate info log messages for the following since - // they are unlikely to have a big impact on the rendering. - case 'OP': - case 'op': - case 'OPM': - case 'BG': - case 'BG2': - case 'UCR': - case 'UCR2': - case 'TR': - case 'TR2': - case 'HT': - case 'SM': - case 'SA': - case 'AIS': - case 'TK': - // TODO implement these operators. - info('graphic state operator ' + key); - break; - default: - info('Unknown graphic state operator ' + key); - break; - } - } - return promise.then(function () { - if (gStateObj.length > 0) { - operatorList.addOp(OPS.setGState, [gStateObj]); - } - }); - }, - - loadFont: function PartialEvaluator_loadFont(fontName, font, xref, - resources) { - - function errorFont() { - return Promise.resolve(new TranslatedFont('g_font_error', - new ErrorFont('Font ' + fontName + ' is not available'), font)); - } - var fontRef; - if (font) { // Loading by ref. - assert(isRef(font)); - fontRef = font; - } else { // Loading by name. - var fontRes = resources.get('Font'); - if (fontRes) { - fontRef = fontRes.getRaw(fontName); - } else { - warn('fontRes not available'); - return errorFont(); - } - } - if (!fontRef) { - warn('fontRef not available'); - return errorFont(); - } - - if (this.fontCache.has(fontRef)) { - return this.fontCache.get(fontRef); - } - - font = xref.fetchIfRef(fontRef); - if (!isDict(font)) { - return errorFont(); - } - - // We are holding `font.translated` references just for `fontRef`s that - // are not actually `Ref`s, but rather `Dict`s. See explanation below. - if (font.translated) { - return font.translated; - } - - var fontCapability = createPromiseCapability(); - - var preEvaluatedFont = this.preEvaluateFont(font, xref); - var descriptor = preEvaluatedFont.descriptor; - - var fontRefIsRef = isRef(fontRef), fontID; - if (fontRefIsRef) { - fontID = fontRef.toString(); - } - - if (isDict(descriptor)) { - if (!descriptor.fontAliases) { - descriptor.fontAliases = Object.create(null); - } - - var fontAliases = descriptor.fontAliases; - var hash = preEvaluatedFont.hash; - if (fontAliases[hash]) { - var aliasFontRef = fontAliases[hash].aliasRef; - if (fontRefIsRef && aliasFontRef && - this.fontCache.has(aliasFontRef)) { - this.fontCache.putAlias(fontRef, aliasFontRef); - return this.fontCache.get(fontRef); - } - } else { - fontAliases[hash] = { - fontID: Font.getFontID() - }; - } - - if (fontRefIsRef) { - fontAliases[hash].aliasRef = fontRef; - } - fontID = fontAliases[hash].fontID; - } - - // Workaround for bad PDF generators that reference fonts incorrectly, - // where `fontRef` is a `Dict` rather than a `Ref` (fixes bug946506.pdf). - // In this case we should not put the font into `this.fontCache` (which is - // a `RefSetCache`), since it's not meaningful to use a `Dict` as a key. - // - // However, if we don't cache the font it's not possible to remove it - // when `cleanup` is triggered from the API, which causes issues on - // subsequent rendering operations (see issue7403.pdf). - // A simple workaround would be to just not hold `font.translated` - // references in this case, but this would force us to unnecessarily load - // the same fonts over and over. - // - // Instead, we cheat a bit by attempting to use a modified `fontID` as a - // key in `this.fontCache`, to allow the font to be cached. - // NOTE: This works because `RefSetCache` calls `toString()` on provided - // keys. Also, since `fontRef` is used when getting cached fonts, - // we'll not accidentally match fonts cached with the `fontID`. - if (fontRefIsRef) { - this.fontCache.put(fontRef, fontCapability.promise); - } else { - if (!fontID) { - fontID = (this.uniquePrefix || 'F_') + (++this.idCounters.obj); - } - this.fontCache.put('id_' + fontID, fontCapability.promise); - } - assert(fontID, 'The "fontID" must be defined.'); - - // Keep track of each font we translated so the caller can - // load them asynchronously before calling display on a page. - font.loadedName = 'g_' + this.pdfManager.docId + '_f' + fontID; - - font.translated = fontCapability.promise; - - // TODO move promises into translate font - var translatedPromise; - try { - translatedPromise = this.translateFont(preEvaluatedFont, xref); - } catch (e) { - translatedPromise = Promise.reject(e); - } - - var self = this; - translatedPromise.then(function (translatedFont) { - if (translatedFont.fontType !== undefined) { - var xrefFontStats = xref.stats.fontTypes; - xrefFontStats[translatedFont.fontType] = true; - } - - fontCapability.resolve(new TranslatedFont(font.loadedName, - translatedFont, font)); - }, function (reason) { - // TODO fontCapability.reject? - // Error in the font data -- sending unsupported feature notification. - self.handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.font}); - - try { - // error, but it's still nice to have font type reported - var descriptor = preEvaluatedFont.descriptor; - var fontFile3 = descriptor && descriptor.get('FontFile3'); - var subtype = fontFile3 && fontFile3.get('Subtype'); - var fontType = getFontType(preEvaluatedFont.type, - subtype && subtype.name); - var xrefFontStats = xref.stats.fontTypes; - xrefFontStats[fontType] = true; - } catch (ex) { } - - fontCapability.resolve(new TranslatedFont(font.loadedName, - new ErrorFont(reason instanceof Error ? reason.message : reason), - font)); - }); - return fontCapability.promise; - }, - - buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { - var lastIndex = operatorList.length - 1; - if (!args) { - args = []; - } - if (lastIndex < 0 || - operatorList.fnArray[lastIndex] !== OPS.constructPath) { - operatorList.addOp(OPS.constructPath, [[fn], args]); - } else { - var opArgs = operatorList.argsArray[lastIndex]; - opArgs[0].push(fn); - Array.prototype.push.apply(opArgs[1], args); - } - }, - - handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, - cs, patterns, resources, task, xref) { - // compile tiling patterns - var patternName = args[args.length - 1]; - // SCN/scn applies patterns along with normal colors - var pattern; - if (isName(patternName) && - (pattern = patterns.get(patternName.name))) { - var dict = (isStream(pattern) ? pattern.dict : pattern); - var typeNum = dict.get('PatternType'); - - if (typeNum === TILING_PATTERN) { - var color = cs.base ? cs.base.getRgb(args, 0) : null; - return this.handleTilingType(fn, color, resources, pattern, - dict, operatorList, task); - } else if (typeNum === SHADING_PATTERN) { - var shading = dict.get('Shading'); - var matrix = dict.getArray('Matrix'); - pattern = Pattern.parseShading(shading, matrix, xref, resources, - this.handler); - operatorList.addOp(fn, pattern.getIR()); - return Promise.resolve(); - } else { - return Promise.reject('Unknown PatternType: ' + typeNum); - } - } - // TODO shall we fail here? - operatorList.addOp(fn, args); - return Promise.resolve(); - }, - - getOperatorList: function PartialEvaluator_getOperatorList(stream, - task, - resources, - operatorList, - initialState) { - - var self = this; - var xref = this.xref; - var imageCache = Object.create(null); - - assert(operatorList); - - resources = (resources || Dict.empty); - var xobjs = (resources.get('XObject') || Dict.empty); - var patterns = (resources.get('Pattern') || Dict.empty); - var stateManager = new StateManager(initialState || new EvalState()); - var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - var timeSlotManager = new TimeSlotManager(); - - return new Promise(function promiseBody(resolve, reject) { - var next = function (promise) { - promise.then(function () { - try { - promiseBody(resolve, reject); - } catch (ex) { - reject(ex); - } - }, reject); - }; - task.ensureNotTerminated(); - timeSlotManager.reset(); - var stop, operation = {}, i, ii, cs; - while (!(stop = timeSlotManager.check())) { - // The arguments parsed by read() are used beyond this loop, so we - // cannot reuse the same array on each iteration. Therefore we pass - // in |null| as the initial value (see the comment on - // EvaluatorPreprocessor_read() for why). - operation.args = null; - if (!(preprocessor.read(operation))) { - break; - } - var args = operation.args; - var fn = operation.fn; - - switch (fn | 0) { - case OPS.paintXObject: - if (args[0].code) { - break; - } - // eagerly compile XForm objects - var name = args[0].name; - if (!name) { - warn('XObject must be referred to by name.'); - continue; - } - if (imageCache[name] !== undefined) { - operatorList.addOp(imageCache[name].fn, imageCache[name].args); - args = null; - continue; - } - - var xobj = xobjs.get(name); - if (xobj) { - assert(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assert(isName(type), 'XObject should have a Name subtype'); - - if (type.name === 'Form') { - stateManager.save(); - next(self.buildFormXObject(resources, xobj, null, - operatorList, task, - stateManager.state.clone()). - then(function () { - stateManager.restore(); - })); - return; - } else if (type.name === 'Image') { - self.buildPaintImageXObject(resources, xobj, false, - operatorList, name, imageCache); - args = null; - continue; - } else if (type.name === 'PS') { - // PostScript XObjects are unused when viewing documents. - // See section 4.7.1 of Adobe's PDF reference. - info('Ignored XObject subtype PS'); - continue; - } else { - error('Unhandled XObject subtype ' + type.name); - } - } - break; - case OPS.setFont: - var fontSize = args[1]; - // eagerly collect all fonts - next(self.handleSetFont(resources, args, null, operatorList, - task, stateManager.state). - then(function (loadedName) { - operatorList.addDependency(loadedName); - operatorList.addOp(OPS.setFont, [loadedName, fontSize]); - })); - return; - case OPS.endInlineImage: - var cacheKey = args[0].cacheKey; - if (cacheKey) { - var cacheEntry = imageCache[cacheKey]; - if (cacheEntry !== undefined) { - operatorList.addOp(cacheEntry.fn, cacheEntry.args); - args = null; - continue; - } - } - self.buildPaintImageXObject(resources, args[0], true, - operatorList, cacheKey, imageCache); - args = null; - continue; - case OPS.showText: - args[0] = self.handleText(args[0], stateManager.state); - break; - case OPS.showSpacedText: - var arr = args[0]; - var combinedGlyphs = []; - var arrLength = arr.length; - var state = stateManager.state; - for (i = 0; i < arrLength; ++i) { - var arrItem = arr[i]; - if (isString(arrItem)) { - Array.prototype.push.apply(combinedGlyphs, - self.handleText(arrItem, state)); - } else if (isNum(arrItem)) { - combinedGlyphs.push(arrItem); - } - } - args[0] = combinedGlyphs; - fn = OPS.showText; - break; - case OPS.nextLineShowText: - operatorList.addOp(OPS.nextLine); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.nextLineSetSpacingShowText: - operatorList.addOp(OPS.nextLine); - operatorList.addOp(OPS.setWordSpacing, [args.shift()]); - operatorList.addOp(OPS.setCharSpacing, [args.shift()]); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.setTextRenderingMode: - stateManager.state.textRenderingMode = args[0]; - break; - - case OPS.setFillColorSpace: - stateManager.state.fillColorSpace = - ColorSpace.parse(args[0], xref, resources); - continue; - case OPS.setStrokeColorSpace: - stateManager.state.strokeColorSpace = - ColorSpace.parse(args[0], xref, resources); - continue; - case OPS.setFillColor: - cs = stateManager.state.fillColorSpace; - args = cs.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColor: - cs = stateManager.state.strokeColorSpace; - args = cs.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillGray: - stateManager.state.fillColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeGray: - stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillCMYKColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeCMYKColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillRGBColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); - break; - case OPS.setStrokeRGBColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); - break; - case OPS.setFillColorN: - cs = stateManager.state.fillColorSpace; - if (cs.name === 'Pattern') { - next(self.handleColorN(operatorList, OPS.setFillColorN, args, - cs, patterns, resources, task, xref)); - return; - } - args = cs.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColorN: - cs = stateManager.state.strokeColorSpace; - if (cs.name === 'Pattern') { - next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, - cs, patterns, resources, task, xref)); - return; - } - args = cs.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - - case OPS.shadingFill: - var shadingRes = resources.get('Shading'); - if (!shadingRes) { - error('No shading resource found'); - } - - var shading = shadingRes.get(args[0].name); - if (!shading) { - error('No shading object found'); - } - - var shadingFill = Pattern.parseShading(shading, null, xref, - resources, self.handler); - var patternIR = shadingFill.getIR(); - args = [patternIR]; - fn = OPS.shadingFill; - break; - case OPS.setGState: - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !extGState.has(dictName.name)) { - break; - } - - var gState = extGState.get(dictName.name); - next(self.setGState(resources, gState, operatorList, task, xref, - stateManager)); - return; - case OPS.moveTo: - case OPS.lineTo: - case OPS.curveTo: - case OPS.curveTo2: - case OPS.curveTo3: - case OPS.closePath: - self.buildPath(operatorList, fn, args); - continue; - case OPS.rectangle: - self.buildPath(operatorList, fn, args); - continue; - case OPS.markPoint: - case OPS.markPointProps: - case OPS.beginMarkedContent: - case OPS.beginMarkedContentProps: - case OPS.endMarkedContent: - case OPS.beginCompat: - case OPS.endCompat: - // Ignore operators where the corresponding handlers are known to - // be no-op in CanvasGraphics (display/canvas.js). This prevents - // serialization errors and is also a bit more efficient. - // We could also try to serialize all objects in a general way, - // e.g. as done in https://github.com/mozilla/pdf.js/pull/6266, - // but doing so is meaningless without knowing the semantics. - continue; - default: - // Note: Ignore the operator if it has `Dict` arguments, since - // those are non-serializable, otherwise postMessage will throw - // "An object could not be cloned.". - if (args !== null) { - for (i = 0, ii = args.length; i < ii; i++) { - if (args[i] instanceof Dict) { - break; - } - } - if (i < ii) { - warn('getOperatorList - ignoring operator: ' + fn); - continue; - } - } - } - operatorList.addOp(fn, args); - } - if (stop) { - next(deferred); - return; - } - // Some PDFs don't close all restores inside object/form. - // Closing those for them. - for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { - operatorList.addOp(OPS.restore, []); - } - resolve(); - }); - }, - - getTextContent: - function PartialEvaluator_getTextContent(stream, task, resources, - stateManager, - normalizeWhitespace, - combineTextItems) { - - stateManager = (stateManager || new StateManager(new TextState())); - - var WhitespaceRegexp = /\s/g; - - var textContent = { - items: [], - styles: Object.create(null) - }; - var textContentItem = { - initialized: false, - str: [], - width: 0, - height: 0, - vertical: false, - lastAdvanceWidth: 0, - lastAdvanceHeight: 0, - textAdvanceScale: 0, - spaceWidth: 0, - fakeSpaceMin: Infinity, - fakeMultiSpaceMin: Infinity, - fakeMultiSpaceMax: -0, - textRunBreakAllowed: false, - transform: null, - fontName: null - }; - var SPACE_FACTOR = 0.3; - var MULTI_SPACE_FACTOR = 1.5; - var MULTI_SPACE_FACTOR_MAX = 4; - - var self = this; - var xref = this.xref; - - resources = (xref.fetchIfRef(resources) || Dict.empty); - - // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd. - var xobjs = null; - var xobjsCache = Object.create(null); - - var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - - var textState; - - function ensureTextContentItem() { - if (textContentItem.initialized) { - return textContentItem; - } - var font = textState.font; - if (!(font.loadedName in textContent.styles)) { - textContent.styles[font.loadedName] = { - fontFamily: font.fallbackName, - ascent: font.ascent, - descent: font.descent, - vertical: font.vertical - }; - } - textContentItem.fontName = font.loadedName; - - // 9.4.4 Text Space Details - var tsm = [textState.fontSize * textState.textHScale, 0, - 0, textState.fontSize, - 0, textState.textRise]; - - if (font.isType3Font && - textState.fontMatrix !== FONT_IDENTITY_MATRIX && - textState.fontSize === 1) { - var glyphHeight = font.bbox[3] - font.bbox[1]; - if (glyphHeight > 0) { - glyphHeight = glyphHeight * textState.fontMatrix[3]; - tsm[3] *= glyphHeight; - } - } - - var trm = Util.transform(textState.ctm, - Util.transform(textState.textMatrix, tsm)); - textContentItem.transform = trm; - if (!font.vertical) { - textContentItem.width = 0; - textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]); - textContentItem.vertical = false; - } else { - textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]); - textContentItem.height = 0; - textContentItem.vertical = true; - } - - var a = textState.textLineMatrix[0]; - var b = textState.textLineMatrix[1]; - var scaleLineX = Math.sqrt(a * a + b * b); - a = textState.ctm[0]; - b = textState.ctm[1]; - var scaleCtmX = Math.sqrt(a * a + b * b); - textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; - textContentItem.lastAdvanceWidth = 0; - textContentItem.lastAdvanceHeight = 0; - - var spaceWidth = font.spaceWidth / 1000 * textState.fontSize; - if (spaceWidth) { - textContentItem.spaceWidth = spaceWidth; - textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR; - textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR; - textContentItem.fakeMultiSpaceMax = - spaceWidth * MULTI_SPACE_FACTOR_MAX; - // It's okay for monospace fonts to fake as much space as needed. - textContentItem.textRunBreakAllowed = !font.isMonospace; - } else { - textContentItem.spaceWidth = 0; - textContentItem.fakeSpaceMin = Infinity; - textContentItem.fakeMultiSpaceMin = Infinity; - textContentItem.fakeMultiSpaceMax = 0; - textContentItem.textRunBreakAllowed = false; - } - - - textContentItem.initialized = true; - return textContentItem; - } - - function replaceWhitespace(str) { - // Replaces all whitespaces with standard spaces (0x20), to avoid - // alignment issues between the textLayer and the canvas if the text - // contains e.g. tabs (fixes issue6612.pdf). - var i = 0, ii = str.length, code; - while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) { - i++; - } - return (i < ii ? str.replace(WhitespaceRegexp, ' ') : str); - } - - function runBidiTransform(textChunk) { - var str = textChunk.str.join(''); - var bidiResult = bidi(str, -1, textChunk.vertical); - return { - str: (normalizeWhitespace ? replaceWhitespace(bidiResult.str) : - bidiResult.str), - dir: bidiResult.dir, - width: textChunk.width, - height: textChunk.height, - transform: textChunk.transform, - fontName: textChunk.fontName - }; - } - - function handleSetFont(fontName, fontRef) { - return self.loadFont(fontName, fontRef, xref, resources). - then(function (translated) { - textState.font = translated.font; - textState.fontMatrix = translated.font.fontMatrix || - FONT_IDENTITY_MATRIX; - }); - } - - function buildTextContentItem(chars) { - var font = textState.font; - var textChunk = ensureTextContentItem(); - var width = 0; - var height = 0; - var glyphs = font.charsToGlyphs(chars); - var defaultVMetrics = font.defaultVMetrics; - for (var i = 0; i < glyphs.length; i++) { - var glyph = glyphs[i]; - var vMetricX = null; - var vMetricY = null; - var glyphWidth = null; - if (font.vertical) { - if (glyph.vmetric) { - glyphWidth = glyph.vmetric[0]; - vMetricX = glyph.vmetric[1]; - vMetricY = glyph.vmetric[2]; - } else { - glyphWidth = glyph.width; - vMetricX = glyph.width * 0.5; - vMetricY = defaultVMetrics[2]; - } - } else { - glyphWidth = glyph.width; - } - - var glyphUnicode = glyph.unicode; - var NormalizedUnicodes = getNormalizedUnicodes(); - if (NormalizedUnicodes[glyphUnicode] !== undefined) { - glyphUnicode = NormalizedUnicodes[glyphUnicode]; - } - glyphUnicode = reverseIfRtl(glyphUnicode); - - // The following will calculate the x and y of the individual glyphs. - // if (font.vertical) { - // tsm[4] -= vMetricX * Math.abs(textState.fontSize) * - // textState.fontMatrix[0]; - // tsm[5] -= vMetricY * textState.fontSize * - // textState.fontMatrix[0]; - // } - // var trm = Util.transform(textState.textMatrix, tsm); - // var pt = Util.applyTransform([trm[4], trm[5]], textState.ctm); - // var x = pt[0]; - // var y = pt[1]; - - var charSpacing = textState.charSpacing; - if (glyph.isSpace) { - var wordSpacing = textState.wordSpacing; - charSpacing += wordSpacing; - if (wordSpacing > 0) { - addFakeSpaces(wordSpacing, textChunk.str); - } - } - - var tx = 0; - var ty = 0; - if (!font.vertical) { - var w0 = glyphWidth * textState.fontMatrix[0]; - tx = (w0 * textState.fontSize + charSpacing) * - textState.textHScale; - width += tx; - } else { - var w1 = glyphWidth * textState.fontMatrix[0]; - ty = w1 * textState.fontSize + charSpacing; - height += ty; - } - textState.translateTextMatrix(tx, ty); - - textChunk.str.push(glyphUnicode); - } - - if (!font.vertical) { - textChunk.lastAdvanceWidth = width; - textChunk.width += width * textChunk.textAdvanceScale; - } else { - textChunk.lastAdvanceHeight = height; - textChunk.height += Math.abs(height * textChunk.textAdvanceScale); - } - - return textChunk; - } - - function addFakeSpaces(width, strBuf) { - if (width < textContentItem.fakeSpaceMin) { - return; - } - if (width < textContentItem.fakeMultiSpaceMin) { - strBuf.push(' '); - return; - } - var fakeSpaces = Math.round(width / textContentItem.spaceWidth); - while (fakeSpaces-- > 0) { - strBuf.push(' '); - } - } - - function flushTextContentItem() { - if (!textContentItem.initialized) { - return; - } - textContent.items.push(runBidiTransform(textContentItem)); - - textContentItem.initialized = false; - textContentItem.str.length = 0; - } - - var timeSlotManager = new TimeSlotManager(); - - return new Promise(function promiseBody(resolve, reject) { - var next = function (promise) { - promise.then(function () { - try { - promiseBody(resolve, reject); - } catch (ex) { - reject(ex); - } - }, reject); - }; - task.ensureNotTerminated(); - timeSlotManager.reset(); - var stop, operation = {}, args = []; - while (!(stop = timeSlotManager.check())) { - // The arguments parsed by read() are not used beyond this loop, so - // we can reuse the same array on every iteration, thus avoiding - // unnecessary allocations. - args.length = 0; - operation.args = args; - if (!(preprocessor.read(operation))) { - break; - } - textState = stateManager.state; - var fn = operation.fn; - args = operation.args; - var advance, diff; - - switch (fn | 0) { - case OPS.setFont: - // Optimization to ignore multiple identical Tf commands. - var fontNameArg = args[0].name, fontSizeArg = args[1]; - if (textState.font && fontNameArg === textState.fontName && - fontSizeArg === textState.fontSize) { - break; - } - - flushTextContentItem(); - textState.fontName = fontNameArg; - textState.fontSize = fontSizeArg; - next(handleSetFont(fontNameArg, null)); - return; - case OPS.setTextRise: - flushTextContentItem(); - textState.textRise = args[0]; - break; - case OPS.setHScale: - flushTextContentItem(); - textState.textHScale = args[0] / 100; - break; - case OPS.setLeading: - flushTextContentItem(); - textState.leading = args[0]; - break; - case OPS.moveText: - // Optimization to treat same line movement as advance - var isSameTextLine = !textState.font ? false : - ((textState.font.vertical ? args[0] : args[1]) === 0); - advance = args[0] - args[1]; - if (combineTextItems && - isSameTextLine && textContentItem.initialized && - advance > 0 && - advance <= textContentItem.fakeMultiSpaceMax) { - textState.translateTextLineMatrix(args[0], args[1]); - textContentItem.width += - (args[0] - textContentItem.lastAdvanceWidth); - textContentItem.height += - (args[1] - textContentItem.lastAdvanceHeight); - diff = (args[0] - textContentItem.lastAdvanceWidth) - - (args[1] - textContentItem.lastAdvanceHeight); - addFakeSpaces(diff, textContentItem.str); - break; - } - - flushTextContentItem(); - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.setLeadingMoveText: - flushTextContentItem(); - textState.leading = -args[1]; - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.nextLine: - flushTextContentItem(); - textState.carriageReturn(); - break; - case OPS.setTextMatrix: - // Optimization to treat same line movement as advance. - advance = textState.calcTextLineMatrixAdvance( - args[0], args[1], args[2], args[3], args[4], args[5]); - if (combineTextItems && - advance !== null && textContentItem.initialized && - advance.value > 0 && - advance.value <= textContentItem.fakeMultiSpaceMax) { - textState.translateTextLineMatrix(advance.width, - advance.height); - textContentItem.width += - (advance.width - textContentItem.lastAdvanceWidth); - textContentItem.height += - (advance.height - textContentItem.lastAdvanceHeight); - diff = (advance.width - textContentItem.lastAdvanceWidth) - - (advance.height - textContentItem.lastAdvanceHeight); - addFakeSpaces(diff, textContentItem.str); - break; - } - - flushTextContentItem(); - textState.setTextMatrix(args[0], args[1], args[2], args[3], - args[4], args[5]); - textState.setTextLineMatrix(args[0], args[1], args[2], args[3], - args[4], args[5]); - break; - case OPS.setCharSpacing: - textState.charSpacing = args[0]; - break; - case OPS.setWordSpacing: - textState.wordSpacing = args[0]; - break; - case OPS.beginText: - flushTextContentItem(); - textState.textMatrix = IDENTITY_MATRIX.slice(); - textState.textLineMatrix = IDENTITY_MATRIX.slice(); - break; - case OPS.showSpacedText: - var items = args[0]; - var offset; - for (var j = 0, jj = items.length; j < jj; j++) { - if (typeof items[j] === 'string') { - buildTextContentItem(items[j]); - } else { - ensureTextContentItem(); - - // PDF Specification 5.3.2 states: - // The number is expressed in thousandths of a unit of text - // space. - // This amount is subtracted from the current horizontal or - // vertical coordinate, depending on the writing mode. - // In the default coordinate system, a positive adjustment - // has the effect of moving the next glyph painted either to - // the left or down by the given amount. - advance = items[j] * textState.fontSize / 1000; - var breakTextRun = false; - if (textState.font.vertical) { - offset = advance * - (textState.textHScale * textState.textMatrix[2] + - textState.textMatrix[3]); - textState.translateTextMatrix(0, advance); - breakTextRun = textContentItem.textRunBreakAllowed && - advance > textContentItem.fakeMultiSpaceMax; - if (!breakTextRun) { - // Value needs to be added to height to paint down. - textContentItem.height += offset; - } - } else { - advance = -advance; - offset = advance * ( - textState.textHScale * textState.textMatrix[0] + - textState.textMatrix[1]); - textState.translateTextMatrix(advance, 0); - breakTextRun = textContentItem.textRunBreakAllowed && - advance > textContentItem.fakeMultiSpaceMax; - if (!breakTextRun) { - // Value needs to be subtracted from width to paint left. - textContentItem.width += offset; - } - } - if (breakTextRun) { - flushTextContentItem(); - } else if (advance > 0) { - addFakeSpaces(advance, textContentItem.str); - } - } - } - break; - case OPS.showText: - buildTextContentItem(args[0]); - break; - case OPS.nextLineShowText: - flushTextContentItem(); - textState.carriageReturn(); - buildTextContentItem(args[0]); - break; - case OPS.nextLineSetSpacingShowText: - flushTextContentItem(); - textState.wordSpacing = args[0]; - textState.charSpacing = args[1]; - textState.carriageReturn(); - buildTextContentItem(args[2]); - break; - case OPS.paintXObject: - flushTextContentItem(); - if (args[0].code) { - break; - } - - if (!xobjs) { - xobjs = (resources.get('XObject') || Dict.empty); - } - - var name = args[0].name; - if (xobjsCache.key === name) { - if (xobjsCache.texts) { - Util.appendToArray(textContent.items, xobjsCache.texts.items); - Util.extendObj(textContent.styles, xobjsCache.texts.styles); - } - break; - } - - var xobj = xobjs.get(name); - if (!xobj) { - break; - } - assert(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assert(isName(type), 'XObject should have a Name subtype'); - - if ('Form' !== type.name) { - xobjsCache.key = name; - xobjsCache.texts = null; - break; - } - - stateManager.save(); - var matrix = xobj.dict.getArray('Matrix'); - if (isArray(matrix) && matrix.length === 6) { - stateManager.transform(matrix); - } - - next(self.getTextContent(xobj, task, - xobj.dict.get('Resources') || resources, stateManager, - normalizeWhitespace, combineTextItems).then( - function (formTextContent) { - Util.appendToArray(textContent.items, formTextContent.items); - Util.extendObj(textContent.styles, formTextContent.styles); - stateManager.restore(); - - xobjsCache.key = name; - xobjsCache.texts = formTextContent; - })); - return; - case OPS.setGState: - flushTextContentItem(); - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !isName(dictName)) { - break; - } - var gState = extGState.get(dictName.name); - if (!isDict(gState)) { - break; - } - var gStateFont = gState.get('Font'); - if (gStateFont) { - textState.fontName = null; - textState.fontSize = gStateFont[1]; - next(handleSetFont(null, gStateFont[0])); - return; - } - break; - } // switch - } // while - if (stop) { - next(deferred); - return; - } - flushTextContentItem(); - resolve(textContent); - }); - }, - - extractDataStructures: - function PartialEvaluator_extractDataStructures(dict, baseDict, - xref, properties) { - // 9.10.2 - var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode')); - var toUnicodePromise = toUnicode ? - this.readToUnicode(toUnicode) : Promise.resolve(undefined); - - if (properties.composite) { - // CIDSystemInfo helps to match CID to glyphs - var cidSystemInfo = dict.get('CIDSystemInfo'); - if (isDict(cidSystemInfo)) { - properties.cidSystemInfo = { - registry: cidSystemInfo.get('Registry'), - ordering: cidSystemInfo.get('Ordering'), - supplement: cidSystemInfo.get('Supplement') - }; - } - - var cidToGidMap = dict.get('CIDToGIDMap'); - if (isStream(cidToGidMap)) { - properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); - } - } - - // Based on 9.6.6 of the spec the encoding can come from multiple places - // and depends on the font type. The base encoding and differences are - // read here, but the encoding that is actually used is chosen during - // glyph mapping in the font. - // TODO: Loading the built in encoding in the font would allow the - // differences to be merged in here not require us to hold on to it. - var differences = []; - var baseEncodingName = null; - var encoding; - if (dict.has('Encoding')) { - encoding = dict.get('Encoding'); - if (isDict(encoding)) { - baseEncodingName = encoding.get('BaseEncoding'); - baseEncodingName = (isName(baseEncodingName) ? - baseEncodingName.name : null); - // Load the differences between the base and original - if (encoding.has('Differences')) { - var diffEncoding = encoding.get('Differences'); - var index = 0; - for (var j = 0, jj = diffEncoding.length; j < jj; j++) { - var data = xref.fetchIfRef(diffEncoding[j]); - if (isNum(data)) { - index = data; - } else if (isName(data)) { - differences[index++] = data.name; - } else { - error('Invalid entry in \'Differences\' array: ' + data); - } - } - } - } else if (isName(encoding)) { - baseEncodingName = encoding.name; - } else { - error('Encoding is not a Name nor a Dict'); - } - // According to table 114 if the encoding is a named encoding it must be - // one of these predefined encodings. - if ((baseEncodingName !== 'MacRomanEncoding' && - baseEncodingName !== 'MacExpertEncoding' && - baseEncodingName !== 'WinAnsiEncoding')) { - baseEncodingName = null; - } - } - - if (baseEncodingName) { - properties.defaultEncoding = getEncoding(baseEncodingName).slice(); - } else { - encoding = (properties.type === 'TrueType' ? - WinAnsiEncoding : StandardEncoding); - // The Symbolic attribute can be misused for regular fonts - // Heuristic: we have to check if the font is a standard one also - if (!!(properties.flags & FontFlags.Symbolic)) { - encoding = MacRomanEncoding; - if (!properties.file) { - if (/Symbol/i.test(properties.name)) { - encoding = SymbolSetEncoding; - } else if (/Dingbats/i.test(properties.name)) { - encoding = ZapfDingbatsEncoding; - } - } - } - properties.defaultEncoding = encoding; - } - - properties.differences = differences; - properties.baseEncodingName = baseEncodingName; - properties.hasEncoding = !!baseEncodingName || differences.length > 0; - properties.dict = dict; - return toUnicodePromise.then(function(toUnicode) { - properties.toUnicode = toUnicode; - return this.buildToUnicode(properties); - }.bind(this)).then(function (toUnicode) { - properties.toUnicode = toUnicode; - return properties; - }); - }, - - /** - * Builds a char code to unicode map based on section 9.10 of the spec. - * @param {Object} properties Font properties object. - * @return {Promise} A Promise that is resolved with a - * {ToUnicodeMap|IdentityToUnicodeMap} object. - */ - buildToUnicode: function PartialEvaluator_buildToUnicode(properties) { - properties.hasIncludedToUnicodeMap = - !!properties.toUnicode && properties.toUnicode.length > 0; - // Section 9.10.2 Mapping Character Codes to Unicode Values - if (properties.hasIncludedToUnicodeMap) { - return Promise.resolve(properties.toUnicode); - } - // According to the spec if the font is a simple font we should only map - // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or - // the differences array only contains adobe standard or symbol set names, - // in pratice it seems better to always try to create a toUnicode - // map based of the default encoding. - var toUnicode, charcode, glyphName; - if (!properties.composite /* is simple font */) { - toUnicode = []; - var encoding = properties.defaultEncoding.slice(); - var baseEncodingName = properties.baseEncodingName; - // Merge in the differences array. - var differences = properties.differences; - for (charcode in differences) { - glyphName = differences[charcode]; - if (glyphName === '.notdef') { - // Skip .notdef to prevent rendering errors, e.g. boxes appearing - // where there should be spaces (fixes issue5256.pdf). - continue; - } - encoding[charcode] = glyphName; - } - var glyphsUnicodeMap = getGlyphsUnicode(); - for (charcode in encoding) { - // a) Map the character code to a character name. - glyphName = encoding[charcode]; - // b) Look up the character name in the Adobe Glyph List (see the - // Bibliography) to obtain the corresponding Unicode value. - if (glyphName === '') { - continue; - } else if (glyphsUnicodeMap[glyphName] === undefined) { - // (undocumented) c) Few heuristics to recognize unknown glyphs - // NOTE: Adobe Reader does not do this step, but OSX Preview does - var code = 0; - switch (glyphName[0]) { - case 'G': // Gxx glyph - if (glyphName.length === 3) { - code = parseInt(glyphName.substr(1), 16); - } - break; - case 'g': // g00xx glyph - if (glyphName.length === 5) { - code = parseInt(glyphName.substr(1), 16); - } - break; - case 'C': // Cddd glyph - case 'c': // cddd glyph - if (glyphName.length >= 3) { - code = +glyphName.substr(1); - } - break; - default: - // 'uniXXXX'/'uXXXX{XX}' glyphs - var unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); - if (unicode !== -1) { - code = unicode; - } - } - if (code) { - // If |baseEncodingName| is one the predefined encodings, - // and |code| equals |charcode|, using the glyph defined in the - // baseEncoding seems to yield a better |toUnicode| mapping - // (fixes issue 5070). - if (baseEncodingName && code === +charcode) { - var baseEncoding = getEncoding(baseEncodingName); - if (baseEncoding && (glyphName = baseEncoding[charcode])) { - toUnicode[charcode] = - String.fromCharCode(glyphsUnicodeMap[glyphName]); - continue; - } - } - toUnicode[charcode] = String.fromCharCode(code); - } - continue; - } - toUnicode[charcode] = - String.fromCharCode(glyphsUnicodeMap[glyphName]); - } - return Promise.resolve(new ToUnicodeMap(toUnicode)); - } - // If the font is a composite font that uses one of the predefined CMaps - // listed in Table 118 (except Identity–H and Identity–V) or whose - // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or - // Adobe-Korea1 character collection: - if (properties.composite && ( - (properties.cMap.builtInCMap && - !(properties.cMap instanceof IdentityCMap)) || - (properties.cidSystemInfo.registry === 'Adobe' && - (properties.cidSystemInfo.ordering === 'GB1' || - properties.cidSystemInfo.ordering === 'CNS1' || - properties.cidSystemInfo.ordering === 'Japan1' || - properties.cidSystemInfo.ordering === 'Korea1')))) { - // Then: - // a) Map the character code to a character identifier (CID) according - // to the font’s CMap. - // b) Obtain the registry and ordering of the character collection used - // by the font’s CMap (for example, Adobe and Japan1) from its - // CIDSystemInfo dictionary. - var registry = properties.cidSystemInfo.registry; - var ordering = properties.cidSystemInfo.ordering; - // c) Construct a second CMap name by concatenating the registry and - // ordering obtained in step (b) in the format registry–ordering–UCS2 - // (for example, Adobe–Japan1–UCS2). - var ucs2CMapName = Name.get(registry + '-' + ordering + '-UCS2'); - // d) Obtain the CMap with the name constructed in step (c) (available - // from the ASN Web site; see the Bibliography). - return CMapFactory.create(ucs2CMapName, this.options.cMapOptions, - null).then( - function (ucs2CMap) { - var cMap = properties.cMap; - toUnicode = []; - cMap.forEach(function(charcode, cid) { - assert(cid <= 0xffff, 'Max size of CID is 65,535'); - // e) Map the CID obtained in step (a) according to the CMap - // obtained in step (d), producing a Unicode value. - var ucs2 = ucs2CMap.lookup(cid); - if (ucs2) { - toUnicode[charcode] = - String.fromCharCode((ucs2.charCodeAt(0) << 8) + - ucs2.charCodeAt(1)); - } - }); - return new ToUnicodeMap(toUnicode); - }); - } - - // The viewer's choice, just use an identity map. - return Promise.resolve(new IdentityToUnicodeMap(properties.firstChar, - properties.lastChar)); - }, - - readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) { - var cmapObj = toUnicode; - if (isName(cmapObj)) { - return CMapFactory.create(cmapObj, this.options.cMapOptions, null).then( - function (cmap) { - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xFFFF); - } - return new ToUnicodeMap(cmap.getMap()); - }); - } else if (isStream(cmapObj)) { - return CMapFactory.create(cmapObj, this.options.cMapOptions, null).then( - function (cmap) { - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xFFFF); - } - var map = new Array(cmap.length); - // Convert UTF-16BE - // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) - // to iterate over all keys. - cmap.forEach(function(charCode, token) { - var str = []; - for (var k = 0; k < token.length; k += 2) { - var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF - str.push(w1); - continue; - } - k += 2; - var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); - } - map[charCode] = String.fromCharCode.apply(String, str); - }); - return new ToUnicodeMap(map); - }); - } - return Promise.resolve(null); - }, - - readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { - // Extract the encoding from the CIDToGIDMap - var glyphsData = cidToGidStream.getBytes(); - - // Set encoding 0 to later verify the font has an encoding - var result = []; - for (var j = 0, jj = glyphsData.length; j < jj; j++) { - var glyphID = (glyphsData[j++] << 8) | glyphsData[j]; - if (glyphID === 0) { - continue; - } - var code = j >> 1; - result[code] = glyphID; - } - return result; - }, - - extractWidths: function PartialEvaluator_extractWidths(dict, xref, - descriptor, - properties) { - var glyphsWidths = []; - var defaultWidth = 0; - var glyphsVMetrics = []; - var defaultVMetrics; - var i, ii, j, jj, start, code, widths; - if (properties.composite) { - defaultWidth = dict.get('DW') || 1000; - - widths = dict.get('W'); - if (widths) { - for (i = 0, ii = widths.length; i < ii; i++) { - start = widths[i++]; - code = xref.fetchIfRef(widths[i]); - if (isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsWidths[start++] = code[j]; - } - } else { - var width = widths[++i]; - for (j = start; j <= code; j++) { - glyphsWidths[j] = width; - } - } - } - } - - if (properties.vertical) { - var vmetrics = (dict.get('DW2') || [880, -1000]); - defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; - vmetrics = dict.get('W2'); - if (vmetrics) { - for (i = 0, ii = vmetrics.length; i < ii; i++) { - start = vmetrics[i++]; - code = xref.fetchIfRef(vmetrics[i]); - if (isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsVMetrics[start++] = [code[j++], code[j++], code[j]]; - } - } else { - var vmetric = [vmetrics[++i], vmetrics[++i], vmetrics[++i]]; - for (j = start; j <= code; j++) { - glyphsVMetrics[j] = vmetric; - } - } - } - } - } - } else { - var firstChar = properties.firstChar; - widths = dict.get('Widths'); - if (widths) { - j = firstChar; - for (i = 0, ii = widths.length; i < ii; i++) { - glyphsWidths[j++] = widths[i]; - } - defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0); - } else { - // Trying get the BaseFont metrics (see comment above). - var baseFontName = dict.get('BaseFont'); - if (isName(baseFontName)) { - var metrics = this.getBaseFontMetrics(baseFontName.name); - - glyphsWidths = this.buildCharCodeToWidth(metrics.widths, - properties); - defaultWidth = metrics.defaultWidth; - } - } - } - - // Heuristic: detection of monospace font by checking all non-zero widths - var isMonospace = true; - var firstWidth = defaultWidth; - for (var glyph in glyphsWidths) { - var glyphWidth = glyphsWidths[glyph]; - if (!glyphWidth) { - continue; - } - if (!firstWidth) { - firstWidth = glyphWidth; - continue; - } - if (firstWidth !== glyphWidth) { - isMonospace = false; - break; - } - } - if (isMonospace) { - properties.flags |= FontFlags.FixedPitch; - } - - properties.defaultWidth = defaultWidth; - properties.widths = glyphsWidths; - properties.defaultVMetrics = defaultVMetrics; - properties.vmetrics = glyphsVMetrics; - }, - - isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) { - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - return (fontNameWoStyle in getSerifFonts()) || - (fontNameWoStyle.search(/serif/gi) !== -1); - }, - - getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) { - var defaultWidth = 0; - var widths = []; - var monospace = false; - var stdFontMap = getStdFontMap(); - var lookupName = (stdFontMap[name] || name); - var Metrics = getMetrics(); - - if (!(lookupName in Metrics)) { - // Use default fonts for looking up font metrics if the passed - // font is not a base font - if (this.isSerifFont(name)) { - lookupName = 'Times-Roman'; - } else { - lookupName = 'Helvetica'; - } - } - var glyphWidths = Metrics[lookupName]; - - if (isNum(glyphWidths)) { - defaultWidth = glyphWidths; - monospace = true; - } else { - widths = glyphWidths(); // expand lazy widths array - } - - return { - defaultWidth: defaultWidth, - monospace: monospace, - widths: widths - }; - }, - - buildCharCodeToWidth: - function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, - properties) { - var widths = Object.create(null); - var differences = properties.differences; - var encoding = properties.defaultEncoding; - for (var charCode = 0; charCode < 256; charCode++) { - if (charCode in differences && - widthsByGlyphName[differences[charCode]]) { - widths[charCode] = widthsByGlyphName[differences[charCode]]; - continue; - } - if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { - widths[charCode] = widthsByGlyphName[encoding[charCode]]; - continue; - } - } - return widths; - }, - - preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) { - var baseDict = dict; - var type = dict.get('Subtype'); - assert(isName(type), 'invalid font Subtype'); - - var composite = false; - var uint8array; - if (type.name === 'Type0') { - // If font is a composite - // - get the descendant font - // - set the type according to the descendant font - // - get the FontDescriptor from the descendant font - var df = dict.get('DescendantFonts'); - if (!df) { - error('Descendant fonts are not specified'); - } - dict = (isArray(df) ? xref.fetchIfRef(df[0]) : df); - - type = dict.get('Subtype'); - assert(isName(type), 'invalid font Subtype'); - composite = true; - } - - var descriptor = dict.get('FontDescriptor'); - if (descriptor) { - var hash = new MurmurHash3_64(); - var encoding = baseDict.getRaw('Encoding'); - if (isName(encoding)) { - hash.update(encoding.name); - } else if (isRef(encoding)) { - hash.update(encoding.toString()); - } else if (isDict(encoding)) { - var keys = encoding.getKeys(); - for (var i = 0, ii = keys.length; i < ii; i++) { - var entry = encoding.getRaw(keys[i]); - if (isName(entry)) { - hash.update(entry.name); - } else if (isRef(entry)) { - hash.update(entry.toString()); - } else if (isArray(entry)) { // 'Differences' entry. - // Ideally we should check the contents of the array, but to avoid - // parsing it here and then again in |extractDataStructures|, - // we only use the array length for now (fixes bug1157493.pdf). - hash.update(entry.length.toString()); - } - } - } - - var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); - if (isStream(toUnicode)) { - var stream = toUnicode.str || toUnicode; - uint8array = stream.buffer ? - new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : - new Uint8Array(stream.bytes.buffer, - stream.start, stream.end - stream.start); - hash.update(uint8array); - - } else if (isName(toUnicode)) { - hash.update(toUnicode.name); - } - - var widths = dict.get('Widths') || baseDict.get('Widths'); - if (widths) { - uint8array = new Uint8Array(new Uint32Array(widths).buffer); - hash.update(uint8array); - } - } - - return { - descriptor: descriptor, - dict: dict, - baseDict: baseDict, - composite: composite, - type: type.name, - hash: hash ? hash.hexdigest() : '' - }; - }, - - translateFont: function PartialEvaluator_translateFont(preEvaluatedFont, - xref) { - var baseDict = preEvaluatedFont.baseDict; - var dict = preEvaluatedFont.dict; - var composite = preEvaluatedFont.composite; - var descriptor = preEvaluatedFont.descriptor; - var type = preEvaluatedFont.type; - var maxCharIndex = (composite ? 0xFFFF : 0xFF); - var cMapOptions = this.options.cMapOptions; - var properties; - - if (!descriptor) { - if (type === 'Type3') { - // FontDescriptor is only required for Type3 fonts when the document - // is a tagged pdf. Create a barbebones one to get by. - descriptor = new Dict(null); - descriptor.set('FontName', Name.get(type)); - descriptor.set('FontBBox', dict.getArray('FontBBox')); - } else { - // Before PDF 1.5 if the font was one of the base 14 fonts, having a - // FontDescriptor was not required. - // This case is here for compatibility. - var baseFontName = dict.get('BaseFont'); - if (!isName(baseFontName)) { - error('Base font is not specified'); - } - - // Using base font name as a font name. - baseFontName = baseFontName.name.replace(/[,_]/g, '-'); - var metrics = this.getBaseFontMetrics(baseFontName); - - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - var flags = - (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | - (metrics.monospace ? FontFlags.FixedPitch : 0) | - (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : - FontFlags.Nonsymbolic); - - properties = { - type: type, - name: baseFontName, - widths: metrics.widths, - defaultWidth: metrics.defaultWidth, - flags: flags, - firstChar: 0, - lastChar: maxCharIndex - }; - return this.extractDataStructures(dict, dict, xref, properties).then( - function (properties) { - properties.widths = this.buildCharCodeToWidth(metrics.widths, - properties); - return new Font(baseFontName, null, properties); - }.bind(this)); - } - } - - // According to the spec if 'FontDescriptor' is declared, 'FirstChar', - // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem - // to ignore this rule when a variant of a standard font is used. - // TODO Fill the width array depending on which of the base font this is - // a variant. - var firstChar = (dict.get('FirstChar') || 0); - var lastChar = (dict.get('LastChar') || maxCharIndex); - - var fontName = descriptor.get('FontName'); - var baseFont = dict.get('BaseFont'); - // Some bad PDFs have a string as the font name. - if (isString(fontName)) { - fontName = Name.get(fontName); - } - if (isString(baseFont)) { - baseFont = Name.get(baseFont); - } - - if (type !== 'Type3') { - var fontNameStr = fontName && fontName.name; - var baseFontStr = baseFont && baseFont.name; - if (fontNameStr !== baseFontStr) { - info('The FontDescriptor\'s FontName is "' + fontNameStr + - '" but should be the same as the Font\'s BaseFont "' + - baseFontStr + '"'); - // Workaround for cases where e.g. fontNameStr = 'Arial' and - // baseFontStr = 'Arial,Bold' (needed when no font file is embedded). - if (fontNameStr && baseFontStr && - baseFontStr.indexOf(fontNameStr) === 0) { - fontName = baseFont; - } - } - } - fontName = (fontName || baseFont); - - assert(isName(fontName), 'invalid font name'); - - var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3'); - if (fontFile) { - if (fontFile.dict) { - var subtype = fontFile.dict.get('Subtype'); - if (subtype) { - subtype = subtype.name; - } - var length1 = fontFile.dict.get('Length1'); - var length2 = fontFile.dict.get('Length2'); - var length3 = fontFile.dict.get('Length3'); - } - } - - properties = { - type: type, - name: fontName.name, - subtype: subtype, - file: fontFile, - length1: length1, - length2: length2, - length3: length3, - loadedName: baseDict.loadedName, - composite: composite, - wideChars: composite, - fixedPitch: false, - fontMatrix: (dict.getArray('FontMatrix') || FONT_IDENTITY_MATRIX), - firstChar: firstChar || 0, - lastChar: (lastChar || maxCharIndex), - bbox: descriptor.getArray('FontBBox'), - ascent: descriptor.get('Ascent'), - descent: descriptor.get('Descent'), - xHeight: descriptor.get('XHeight'), - capHeight: descriptor.get('CapHeight'), - flags: descriptor.get('Flags'), - italicAngle: descriptor.get('ItalicAngle'), - coded: false - }; - - var cMapPromise; - if (composite) { - var cidEncoding = baseDict.get('Encoding'); - if (isName(cidEncoding)) { - properties.cidEncoding = cidEncoding.name; - } - cMapPromise = CMapFactory.create(cidEncoding, cMapOptions, null).then( - function (cMap) { - properties.cMap = cMap; - properties.vertical = properties.cMap.vertical; - }); - } else { - cMapPromise = Promise.resolve(undefined); - } - - return cMapPromise.then(function () { - return this.extractDataStructures(dict, baseDict, xref, properties); - }.bind(this)).then(function (properties) { - this.extractWidths(dict, xref, descriptor, properties); - - if (type === 'Type3') { - properties.isType3Font = true; - } - - return new Font(fontName.name, fontFile, properties); - }.bind(this)); - } - }; - - return PartialEvaluator; -})(); - -var TranslatedFont = (function TranslatedFontClosure() { - function TranslatedFont(loadedName, font, dict) { - this.loadedName = loadedName; - this.font = font; - this.dict = dict; - this.type3Loaded = null; - this.sent = false; - } - TranslatedFont.prototype = { - send: function (handler) { - if (this.sent) { - return; - } - var fontData = this.font.exportData(); - handler.send('commonobj', [ - this.loadedName, - 'Font', - fontData - ]); - this.sent = true; - }, - loadType3Data: function (evaluator, resources, parentOperatorList, task) { - assert(this.font.isType3Font); - - if (this.type3Loaded) { - return this.type3Loaded; - } - - var translatedFont = this.font; - var loadCharProcsPromise = Promise.resolve(); - var charProcs = this.dict.get('CharProcs'); - var fontResources = this.dict.get('Resources') || resources; - var charProcKeys = charProcs.getKeys(); - var charProcOperatorList = Object.create(null); - for (var i = 0, n = charProcKeys.length; i < n; ++i) { - loadCharProcsPromise = loadCharProcsPromise.then(function (key) { - var glyphStream = charProcs.get(key); - var operatorList = new OperatorList(); - return evaluator.getOperatorList(glyphStream, task, fontResources, - operatorList).then(function () { - charProcOperatorList[key] = operatorList.getIR(); - - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - parentOperatorList.addDependencies(operatorList.dependencies); - }, function (reason) { - warn('Type3 font resource \"' + key + '\" is not available'); - var operatorList = new OperatorList(); - charProcOperatorList[key] = operatorList.getIR(); - }); - }.bind(this, charProcKeys[i])); - } - this.type3Loaded = loadCharProcsPromise.then(function () { - translatedFont.charProcOperatorList = charProcOperatorList; - }); - return this.type3Loaded; - } - }; - return TranslatedFont; -})(); - -var OperatorList = (function OperatorListClosure() { - var CHUNK_SIZE = 1000; - var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size - - function getTransfers(queue) { - var transfers = []; - var fnArray = queue.fnArray, argsArray = queue.argsArray; - for (var i = 0, ii = queue.length; i < ii; i++) { - switch (fnArray[i]) { - case OPS.paintInlineImageXObject: - case OPS.paintInlineImageXObjectGroup: - case OPS.paintImageMaskXObject: - var arg = argsArray[i][0]; // first param in imgData - if (!arg.cached) { - transfers.push(arg.data.buffer); - } - break; - } - } - return transfers; - } - - function OperatorList(intent, messageHandler, pageIndex) { - this.messageHandler = messageHandler; - this.fnArray = []; - this.argsArray = []; - this.dependencies = Object.create(null); - this._totalLength = 0; - this.pageIndex = pageIndex; - this.intent = intent; - } - - OperatorList.prototype = { - get length() { - return this.argsArray.length; - }, - - /** - * @returns {number} The total length of the entire operator list, - * since `this.length === 0` after flushing. - */ - get totalLength() { - return (this._totalLength + this.length); - }, - - addOp: function(fn, args) { - this.fnArray.push(fn); - this.argsArray.push(args); - if (this.messageHandler) { - if (this.fnArray.length >= CHUNK_SIZE) { - this.flush(); - } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT && - (fn === OPS.restore || fn === OPS.endText)) { - // heuristic to flush on boundary of restore or endText - this.flush(); - } - } - }, - - addDependency: function(dependency) { - if (dependency in this.dependencies) { - return; - } - this.dependencies[dependency] = true; - this.addOp(OPS.dependency, [dependency]); - }, - - addDependencies: function(dependencies) { - for (var key in dependencies) { - this.addDependency(key); - } - }, - - addOpList: function(opList) { - Util.extendObj(this.dependencies, opList.dependencies); - for (var i = 0, ii = opList.length; i < ii; i++) { - this.addOp(opList.fnArray[i], opList.argsArray[i]); - } - }, - - getIR: function() { - return { - fnArray: this.fnArray, - argsArray: this.argsArray, - length: this.length - }; - }, - - flush: function(lastChunk) { - if (this.intent !== 'oplist') { - new QueueOptimizer().optimize(this); - } - var transfers = getTransfers(this); - var length = this.length; - this._totalLength += length; - - this.messageHandler.send('RenderPageChunk', { - operatorList: { - fnArray: this.fnArray, - argsArray: this.argsArray, - lastChunk: lastChunk, - length: length - }, - pageIndex: this.pageIndex, - intent: this.intent - }, transfers); - this.dependencies = Object.create(null); - this.fnArray.length = 0; - this.argsArray.length = 0; - } - }; - - return OperatorList; -})(); - -var StateManager = (function StateManagerClosure() { - function StateManager(initialState) { - this.state = initialState; - this.stateStack = []; - } - StateManager.prototype = { - save: function () { - var old = this.state; - this.stateStack.push(this.state); - this.state = old.clone(); - }, - restore: function () { - var prev = this.stateStack.pop(); - if (prev) { - this.state = prev; - } - }, - transform: function (args) { - this.state.ctm = Util.transform(this.state.ctm, args); - } - }; - return StateManager; -})(); - -var TextState = (function TextStateClosure() { - function TextState() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.fontName = null; - this.fontSize = 0; - this.font = null; - this.fontMatrix = FONT_IDENTITY_MATRIX; - this.textMatrix = IDENTITY_MATRIX.slice(); - this.textLineMatrix = IDENTITY_MATRIX.slice(); - this.charSpacing = 0; - this.wordSpacing = 0; - this.leading = 0; - this.textHScale = 1; - this.textRise = 0; - } - - TextState.prototype = { - setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { - var m = this.textMatrix; - m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; - }, - setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { - var m = this.textLineMatrix; - m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; - }, - translateTextMatrix: function TextState_translateTextMatrix(x, y) { - var m = this.textMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - }, - translateTextLineMatrix: function TextState_translateTextMatrix(x, y) { - var m = this.textLineMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - }, - calcTextLineMatrixAdvance: - function TextState_calcTextLineMatrixAdvance(a, b, c, d, e, f) { - var font = this.font; - if (!font) { - return null; - } - var m = this.textLineMatrix; - if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) { - return null; - } - var txDiff = e - m[4], tyDiff = f - m[5]; - if ((font.vertical && txDiff !== 0) || (!font.vertical && tyDiff !== 0)) { - return null; - } - var tx, ty, denominator = a * d - b * c; - if (font.vertical) { - tx = -tyDiff * c / denominator; - ty = tyDiff * a / denominator; - } else { - tx = txDiff * d / denominator; - ty = -txDiff * b / denominator; - } - return { width: tx, height: ty, value: (font.vertical ? ty : tx), }; - }, - calcRenderMatrix: function TextState_calcRendeMatrix(ctm) { - // 9.4.4 Text Space Details - var tsm = [this.fontSize * this.textHScale, 0, - 0, this.fontSize, - 0, this.textRise]; - return Util.transform(ctm, Util.transform(this.textMatrix, tsm)); - }, - carriageReturn: function TextState_carriageReturn() { - this.translateTextLineMatrix(0, -this.leading); - this.textMatrix = this.textLineMatrix.slice(); - }, - clone: function TextState_clone() { - var clone = Object.create(this); - clone.textMatrix = this.textMatrix.slice(); - clone.textLineMatrix = this.textLineMatrix.slice(); - clone.fontMatrix = this.fontMatrix.slice(); - return clone; - } - }; - return TextState; -})(); - -var EvalState = (function EvalStateClosure() { - function EvalState() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.font = null; - this.textRenderingMode = TextRenderingMode.FILL; - this.fillColorSpace = ColorSpace.singletons.gray; - this.strokeColorSpace = ColorSpace.singletons.gray; - } - EvalState.prototype = { - clone: function CanvasExtraState_clone() { - return Object.create(this); - }, - }; - return EvalState; -})(); - -var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() { - // Specifies properties for each command - // - // If variableArgs === true: [0, `numArgs`] expected - // If variableArgs === false: exactly `numArgs` expected - var getOPMap = getLookupTableFactory(function (t) { - // Graphic state - t['w'] = { id: OPS.setLineWidth, numArgs: 1, variableArgs: false }; - t['J'] = { id: OPS.setLineCap, numArgs: 1, variableArgs: false }; - t['j'] = { id: OPS.setLineJoin, numArgs: 1, variableArgs: false }; - t['M'] = { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false }; - t['d'] = { id: OPS.setDash, numArgs: 2, variableArgs: false }; - t['ri'] = { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false }; - t['i'] = { id: OPS.setFlatness, numArgs: 1, variableArgs: false }; - t['gs'] = { id: OPS.setGState, numArgs: 1, variableArgs: false }; - t['q'] = { id: OPS.save, numArgs: 0, variableArgs: false }; - t['Q'] = { id: OPS.restore, numArgs: 0, variableArgs: false }; - t['cm'] = { id: OPS.transform, numArgs: 6, variableArgs: false }; - - // Path - t['m'] = { id: OPS.moveTo, numArgs: 2, variableArgs: false }; - t['l'] = { id: OPS.lineTo, numArgs: 2, variableArgs: false }; - t['c'] = { id: OPS.curveTo, numArgs: 6, variableArgs: false }; - t['v'] = { id: OPS.curveTo2, numArgs: 4, variableArgs: false }; - t['y'] = { id: OPS.curveTo3, numArgs: 4, variableArgs: false }; - t['h'] = { id: OPS.closePath, numArgs: 0, variableArgs: false }; - t['re'] = { id: OPS.rectangle, numArgs: 4, variableArgs: false }; - t['S'] = { id: OPS.stroke, numArgs: 0, variableArgs: false }; - t['s'] = { id: OPS.closeStroke, numArgs: 0, variableArgs: false }; - t['f'] = { id: OPS.fill, numArgs: 0, variableArgs: false }; - t['F'] = { id: OPS.fill, numArgs: 0, variableArgs: false }; - t['f*'] = { id: OPS.eoFill, numArgs: 0, variableArgs: false }; - t['B'] = { id: OPS.fillStroke, numArgs: 0, variableArgs: false }; - t['B*'] = { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false }; - t['b'] = { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false }; - t['b*'] = { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false }; - t['n'] = { id: OPS.endPath, numArgs: 0, variableArgs: false }; - - // Clipping - t['W'] = { id: OPS.clip, numArgs: 0, variableArgs: false }; - t['W*'] = { id: OPS.eoClip, numArgs: 0, variableArgs: false }; - - // Text - t['BT'] = { id: OPS.beginText, numArgs: 0, variableArgs: false }; - t['ET'] = { id: OPS.endText, numArgs: 0, variableArgs: false }; - t['Tc'] = { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false }; - t['Tw'] = { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false }; - t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false }; - t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false }; - t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false }; - t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false }; - t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false }; - t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false }; - t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false }; - t['Tm'] = { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false }; - t['T*'] = { id: OPS.nextLine, numArgs: 0, variableArgs: false }; - t['Tj'] = { id: OPS.showText, numArgs: 1, variableArgs: false }; - t['TJ'] = { id: OPS.showSpacedText, numArgs: 1, variableArgs: false }; - t['\''] = { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false }; - t['"'] = { id: OPS.nextLineSetSpacingShowText, numArgs: 3, - variableArgs: false }; - - // Type3 fonts - t['d0'] = { id: OPS.setCharWidth, numArgs: 2, variableArgs: false }; - t['d1'] = { id: OPS.setCharWidthAndBounds, numArgs: 6, - variableArgs: false }; - - // Color - t['CS'] = { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false }; - t['cs'] = { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false }; - t['SC'] = { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true }; - t['SCN'] = { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true }; - t['sc'] = { id: OPS.setFillColor, numArgs: 4, variableArgs: true }; - t['scn'] = { id: OPS.setFillColorN, numArgs: 33, variableArgs: true }; - t['G'] = { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false }; - t['g'] = { id: OPS.setFillGray, numArgs: 1, variableArgs: false }; - t['RG'] = { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false }; - t['rg'] = { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false }; - t['K'] = { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false }; - t['k'] = { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false }; - - // Shading - t['sh'] = { id: OPS.shadingFill, numArgs: 1, variableArgs: false }; - - // Images - t['BI'] = { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false }; - t['ID'] = { id: OPS.beginImageData, numArgs: 0, variableArgs: false }; - t['EI'] = { id: OPS.endInlineImage, numArgs: 1, variableArgs: false }; - - // XObjects - t['Do'] = { id: OPS.paintXObject, numArgs: 1, variableArgs: false }; - t['MP'] = { id: OPS.markPoint, numArgs: 1, variableArgs: false }; - t['DP'] = { id: OPS.markPointProps, numArgs: 2, variableArgs: false }; - t['BMC'] = { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false }; - t['BDC'] = { id: OPS.beginMarkedContentProps, numArgs: 2, - variableArgs: false }; - t['EMC'] = { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false }; - - // Compatibility - t['BX'] = { id: OPS.beginCompat, numArgs: 0, variableArgs: false }; - t['EX'] = { id: OPS.endCompat, numArgs: 0, variableArgs: false }; - - // (reserved partial commands for the lexer) - t['BM'] = null; - t['BD'] = null; - t['true'] = null; - t['fa'] = null; - t['fal'] = null; - t['fals'] = null; - t['false'] = null; - t['nu'] = null; - t['nul'] = null; - t['null'] = null; - }); - - function EvaluatorPreprocessor(stream, xref, stateManager) { - this.opMap = getOPMap(); - // TODO(mduan): pass array of knownCommands rather than this.opMap - // dictionary - this.parser = new Parser(new Lexer(stream, this.opMap), false, xref); - this.stateManager = stateManager; - this.nonProcessedArgs = []; - } - - EvaluatorPreprocessor.prototype = { - get savedStatesDepth() { - return this.stateManager.stateStack.length; - }, - - // |operation| is an object with two fields: - // - // - |fn| is an out param. - // - // - |args| is an inout param. On entry, it should have one of two values. - // - // - An empty array. This indicates that the caller is providing the - // array in which the args will be stored in. The caller should use - // this value if it can reuse a single array for each call to read(). - // - // - |null|. This indicates that the caller needs this function to create - // the array in which any args are stored in. If there are zero args, - // this function will leave |operation.args| as |null| (thus avoiding - // allocations that would occur if we used an empty array to represent - // zero arguments). Otherwise, it will replace |null| with a new array - // containing the arguments. The caller should use this value if it - // cannot reuse an array for each call to read(). - // - // These two modes are present because this function is very hot and so - // avoiding allocations where possible is worthwhile. - // - read: function EvaluatorPreprocessor_read(operation) { - var args = operation.args; - while (true) { - var obj = this.parser.getObj(); - if (isCmd(obj)) { - var cmd = obj.cmd; - // Check that the command is valid - var opSpec = this.opMap[cmd]; - if (!opSpec) { - warn('Unknown command "' + cmd + '"'); - continue; - } - - var fn = opSpec.id; - var numArgs = opSpec.numArgs; - var argsLength = args !== null ? args.length : 0; - - if (!opSpec.variableArgs) { - // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf - if (argsLength !== numArgs) { - var nonProcessedArgs = this.nonProcessedArgs; - while (argsLength > numArgs) { - nonProcessedArgs.push(args.shift()); - argsLength--; - } - while (argsLength < numArgs && nonProcessedArgs.length !== 0) { - if (!args) { - args = []; - } - args.unshift(nonProcessedArgs.pop()); - argsLength++; - } - } - - if (argsLength < numArgs) { - // If we receive too few args, it's not possible to possible - // to execute the command, so skip the command - info('Command ' + fn + ': because expected ' + - numArgs + ' args, but received ' + argsLength + - ' args; skipping'); - args = null; - continue; - } - } else if (argsLength > numArgs) { - info('Command ' + fn + ': expected [0,' + numArgs + - '] args, but received ' + argsLength + ' args'); - } - - // TODO figure out how to type-check vararg functions - this.preprocessCommand(fn, args); - - operation.fn = fn; - operation.args = args; - return true; - } else { - if (isEOF(obj)) { - return false; // no more commands - } - // argument - if (obj !== null) { - if (!args) { - args = []; - } - args.push(obj); - assert(args.length <= 33, 'Too many arguments'); - } - } - } - }, - - preprocessCommand: - function EvaluatorPreprocessor_preprocessCommand(fn, args) { - switch (fn | 0) { - case OPS.save: - this.stateManager.save(); - break; - case OPS.restore: - this.stateManager.restore(); - break; - case OPS.transform: - this.stateManager.transform(args); - break; - } - } - }; - return EvaluatorPreprocessor; -})(); - -var QueueOptimizer = (function QueueOptimizerClosure() { - function addState(parentState, pattern, fn) { - var state = parentState; - for (var i = 0, ii = pattern.length - 1; i < ii; i++) { - var item = pattern[i]; - state = (state[item] || (state[item] = [])); - } - state[pattern[pattern.length - 1]] = fn; - } - - function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, - argsArray) { - // Handles special case of mainly LaTeX documents which use image masks to - // draw lines with the current fill style. - // 'count' groups of (save, transform, paintImageMaskXObject, restore)+ - // have been found at iFirstSave. - var iFirstPIMXO = iFirstSave + 2; - for (var i = 0; i < count; i++) { - var arg = argsArray[iFirstPIMXO + 4 * i]; - var imageMask = arg.length === 1 && arg[0]; - if (imageMask && imageMask.width === 1 && imageMask.height === 1 && - (!imageMask.data.length || - (imageMask.data.length === 1 && imageMask.data[0] === 0))) { - fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask; - continue; - } - break; - } - return count - i; - } - - var InitialState = []; - - // This replaces (save, transform, paintInlineImageXObject, restore)+ - // sequences with one |paintInlineImageXObjectGroup| operation. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], - function foundInlineImageGroup(context) { - var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; - var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; - var MAX_WIDTH = 1000; - var IMAGE_PADDING = 1; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIIXO = curr - 1; - - // Look for the quartets. - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintInlineImageXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = Math.min((i - iFirstSave) / 4, - MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); - if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { - return i; - } - - // assuming that heights of those image is too small (~1 pixel) - // packing as much as possible by lines - var maxX = 0; - var map = [], maxLineHeight = 0; - var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING; - var q; - for (q = 0; q < count; q++) { - var transform = argsArray[iFirstTransform + (q << 2)]; - var img = argsArray[iFirstPIIXO + (q << 2)][0]; - if (currentX + img.width > MAX_WIDTH) { - // starting new line - maxX = Math.max(maxX, currentX); - currentY += maxLineHeight + 2 * IMAGE_PADDING; - currentX = 0; - maxLineHeight = 0; - } - map.push({ - transform: transform, - x: currentX, y: currentY, - w: img.width, h: img.height - }); - currentX += img.width + 2 * IMAGE_PADDING; - maxLineHeight = Math.max(maxLineHeight, img.height); - } - var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; - var imgHeight = currentY + maxLineHeight + IMAGE_PADDING; - var imgData = new Uint8Array(imgWidth * imgHeight * 4); - var imgRowSize = imgWidth << 2; - for (q = 0; q < count; q++) { - var data = argsArray[iFirstPIIXO + (q << 2)][0].data; - // Copy image by lines and extends pixels into padding. - var rowSize = map[q].w << 2; - var dataOffset = 0; - var offset = (map[q].x + map[q].y * imgWidth) << 2; - imgData.set(data.subarray(0, rowSize), offset - imgRowSize); - for (var k = 0, kk = map[q].h; k < kk; k++) { - imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); - dataOffset += rowSize; - offset += imgRowSize; - } - imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); - while (offset >= 0) { - data[offset - 4] = data[offset]; - data[offset - 3] = data[offset + 1]; - data[offset - 2] = data[offset + 2]; - data[offset - 1] = data[offset + 3]; - data[offset + rowSize] = data[offset + rowSize - 4]; - data[offset + rowSize + 1] = data[offset + rowSize - 3]; - data[offset + rowSize + 2] = data[offset + rowSize - 2]; - data[offset + rowSize + 3] = data[offset + rowSize - 1]; - offset -= imgRowSize; - } - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); - argsArray.splice(iFirstSave, count * 4, - [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP, - data: imgData }, map]); - - return iFirstSave + 1; - }); - - // This replaces (save, transform, paintImageMaskXObject, restore)+ - // sequences with one |paintImageMaskXObjectGroup| or one - // |paintImageMaskXObjectRepeat| operation. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], - function foundImageMaskGroup(context) { - var MIN_IMAGES_IN_MASKS_BLOCK = 10; - var MAX_IMAGES_IN_MASKS_BLOCK = 100; - var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIMXO = curr - 1; - - // Look for the quartets. - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintImageMaskXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = (i - iFirstSave) / 4; - count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, - argsArray); - if (count < MIN_IMAGES_IN_MASKS_BLOCK) { - return i; - } - - var q; - var isSameImage = false; - var iTransform, transformArgs; - var firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; - if (argsArray[iFirstTransform][1] === 0 && - argsArray[iFirstTransform][2] === 0) { - isSameImage = true; - var firstTransformArg0 = argsArray[iFirstTransform][0]; - var firstTransformArg3 = argsArray[iFirstTransform][3]; - iTransform = iFirstTransform + 4; - var iPIMXO = iFirstPIMXO + 4; - for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { - transformArgs = argsArray[iTransform]; - if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || - transformArgs[0] !== firstTransformArg0 || - transformArgs[1] !== 0 || - transformArgs[2] !== 0 || - transformArgs[3] !== firstTransformArg3) { - if (q < MIN_IMAGES_IN_MASKS_BLOCK) { - isSameImage = false; - } else { - count = q; - } - break; // different image or transform - } - } - } - - if (isSameImage) { - count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); - var positions = new Float32Array(count * 2); - iTransform = iFirstTransform; - for (q = 0; q < count; q++, iTransform += 4) { - transformArgs = argsArray[iTransform]; - positions[(q << 1)] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, - [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]); - } else { - count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); - var images = []; - for (q = 0; q < count; q++) { - transformArgs = argsArray[iFirstTransform + (q << 2)]; - var maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; - images.push({ data: maskParams.data, width: maskParams.width, - height: maskParams.height, - transform: transformArgs }); - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); - argsArray.splice(iFirstSave, count * 4, [images]); - } - - return iFirstSave + 1; - }); - - // This replaces (save, transform, paintImageXObject, restore)+ sequences - // with one paintImageXObjectRepeat operation, if the |transform| and - // |paintImageXObjectRepeat| ops are appropriate. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], - function (context) { - var MIN_IMAGES_IN_BLOCK = 3; - var MAX_IMAGES_IN_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIXO = curr - 1; - var iFirstRestore = curr; - - if (argsArray[iFirstTransform][1] !== 0 || - argsArray[iFirstTransform][2] !== 0) { - return iFirstRestore + 1; // transform has the wrong form - } - - // Look for the quartets. - var firstPIXOArg0 = argsArray[iFirstPIXO][0]; - var firstTransformArg0 = argsArray[iFirstTransform][0]; - var firstTransformArg3 = argsArray[iFirstTransform][3]; - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintImageXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - if (argsArray[i + 1][0] !== firstTransformArg0 || - argsArray[i + 1][1] !== 0 || - argsArray[i + 1][2] !== 0 || - argsArray[i + 1][3] !== firstTransformArg3) { - break; // transforms don't match - } - if (argsArray[i + 2][0] !== firstPIXOArg0) { - break; // images don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK); - if (count < MIN_IMAGES_IN_BLOCK) { - return i; - } - - // Extract the (x,y) positions from all of the matching transforms. - var positions = new Float32Array(count * 2); - var iTransform = iFirstTransform; - for (var q = 0; q < count; q++, iTransform += 4) { - var transformArgs = argsArray[iTransform]; - positions[(q << 1)] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - - // Replace queue items. - var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, - positions]; - fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, args); - - return iFirstSave + 1; - }); - - // This replaces (beginText, setFont, setTextMatrix, showText, endText)+ - // sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+ - // sequences, if the font for each one is the same. - addState(InitialState, - [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], - function (context) { - var MIN_CHARS_IN_BLOCK = 3; - var MAX_CHARS_IN_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstBeginText = curr - 4; - var iFirstSetFont = curr - 3; - var iFirstSetTextMatrix = curr - 2; - var iFirstShowText = curr - 1; - var iFirstEndText = curr; - - // Look for the quintets. - var firstSetFontArg0 = argsArray[iFirstSetFont][0]; - var firstSetFontArg1 = argsArray[iFirstSetFont][1]; - var i = iFirstBeginText + 5; - var ii = fnArray.length; - while (i + 4 < ii) { - if (fnArray[i] !== OPS.beginText || - fnArray[i + 1] !== OPS.setFont || - fnArray[i + 2] !== OPS.setTextMatrix || - fnArray[i + 3] !== OPS.showText || - fnArray[i + 4] !== OPS.endText) { - break; // ops don't match - } - if (argsArray[i + 1][0] !== firstSetFontArg0 || - argsArray[i + 1][1] !== firstSetFontArg1) { - break; // fonts don't match - } - i += 5; - } - - // At this point, i is the index of the first op past the last valid - // quintet. - var count = Math.min(((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); - if (count < MIN_CHARS_IN_BLOCK) { - return i; - } - - // If the preceding quintet is (, setFont, setTextMatrix, - // showText, endText), include that as well. (E.g. might be - // |dependency|.) - var iFirst = iFirstBeginText; - if (iFirstBeginText >= 4 && - fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && - fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && - fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && - fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && - argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && - argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { - count++; - iFirst -= 5; - } - - // Remove (endText, beginText, setFont) trios. - var iEndText = iFirst + 4; - for (var q = 1; q < count; q++) { - fnArray.splice(iEndText, 3); - argsArray.splice(iEndText, 3); - iEndText += 2; - } - - return iEndText + 1; - }); - - function QueueOptimizer() {} - - QueueOptimizer.prototype = { - optimize: function QueueOptimizer_optimize(queue) { - var fnArray = queue.fnArray, argsArray = queue.argsArray; - var context = { - iCurr: 0, - fnArray: fnArray, - argsArray: argsArray - }; - var state; - var i = 0, ii = fnArray.length; - while (i < ii) { - state = (state || InitialState)[fnArray[i]]; - if (typeof state === 'function') { // we found some handler - context.iCurr = i; - // state() returns the index of the first non-matching op (if we - // didn't match) or the first op past the modified ops (if we did - // match and replace). - i = state(context); - state = undefined; // reset the state machine - ii = context.fnArray.length; - } else { - i++; - } - } - } - }; - return QueueOptimizer; -})(); - -exports.OperatorList = OperatorList; -exports.PartialEvaluator = PartialEvaluator; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreAnnotation = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreColorSpace, - root.pdfjsCoreObj, root.pdfjsCoreEvaluator); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, - coreColorSpace, coreObj, coreEvaluator) { - -var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType; -var AnnotationFieldFlag = sharedUtil.AnnotationFieldFlag; -var AnnotationFlag = sharedUtil.AnnotationFlag; -var AnnotationType = sharedUtil.AnnotationType; -var OPS = sharedUtil.OPS; -var Util = sharedUtil.Util; -var isBool = sharedUtil.isBool; -var isString = sharedUtil.isString; -var isArray = sharedUtil.isArray; -var isInt = sharedUtil.isInt; -var isValidUrl = sharedUtil.isValidUrl; -var stringToBytes = sharedUtil.stringToBytes; -var stringToPDFString = sharedUtil.stringToPDFString; -var stringToUTF8String = sharedUtil.stringToUTF8String; -var warn = sharedUtil.warn; -var Dict = corePrimitives.Dict; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var isRef = corePrimitives.isRef; -var Stream = coreStream.Stream; -var ColorSpace = coreColorSpace.ColorSpace; -var ObjectLoader = coreObj.ObjectLoader; -var FileSpec = coreObj.FileSpec; -var OperatorList = coreEvaluator.OperatorList; - -/** - * @class - * @alias AnnotationFactory - */ -function AnnotationFactory() {} -AnnotationFactory.prototype = /** @lends AnnotationFactory.prototype */ { - /** - * @param {XRef} xref - * @param {Object} ref - * @param {string} uniquePrefix - * @param {Object} idCounters - * @returns {Annotation} - */ - create: function AnnotationFactory_create(xref, ref, - uniquePrefix, idCounters) { - var dict = xref.fetchIfRef(ref); - if (!isDict(dict)) { - return; - } - var id = isRef(ref) ? ref.toString() : - 'annot_' + (uniquePrefix || '') + (++idCounters.obj); - - // Determine the annotation's subtype. - var subtype = dict.get('Subtype'); - subtype = isName(subtype) ? subtype.name : null; - - // Return the right annotation object based on the subtype and field type. - var parameters = { - xref: xref, - dict: dict, - ref: isRef(ref) ? ref : null, - subtype: subtype, - id: id, - }; - - switch (subtype) { - case 'Link': - return new LinkAnnotation(parameters); - - case 'Text': - return new TextAnnotation(parameters); - - case 'Widget': - var fieldType = Util.getInheritableProperty(dict, 'FT'); - fieldType = isName(fieldType) ? fieldType.name : null; - - switch (fieldType) { - case 'Tx': - return new TextWidgetAnnotation(parameters); - } - warn('Unimplemented widget field type "' + fieldType + '", ' + - 'falling back to base field type.'); - return new WidgetAnnotation(parameters); - - case 'Popup': - return new PopupAnnotation(parameters); - - case 'Highlight': - return new HighlightAnnotation(parameters); - - case 'Underline': - return new UnderlineAnnotation(parameters); - - case 'Squiggly': - return new SquigglyAnnotation(parameters); - - case 'StrikeOut': - return new StrikeOutAnnotation(parameters); - - case 'FileAttachment': - return new FileAttachmentAnnotation(parameters); - - default: - if (!subtype) { - warn('Annotation is missing the required /Subtype.'); - } else { - warn('Unimplemented annotation type "' + subtype + '", ' + - 'falling back to base annotation.'); - } - return new Annotation(parameters); - } - } -}; - -var Annotation = (function AnnotationClosure() { - // 12.5.5: Algorithm: Appearance streams - function getTransformMatrix(rect, bbox, matrix) { - var bounds = Util.getAxialAlignedBoundingBox(bbox, matrix); - var minX = bounds[0]; - var minY = bounds[1]; - var maxX = bounds[2]; - var maxY = bounds[3]; - - if (minX === maxX || minY === maxY) { - // From real-life file, bbox was [0, 0, 0, 0]. In this case, - // just apply the transform for rect - return [1, 0, 0, 1, rect[0], rect[1]]; - } - - var xRatio = (rect[2] - rect[0]) / (maxX - minX); - var yRatio = (rect[3] - rect[1]) / (maxY - minY); - return [ - xRatio, - 0, - 0, - yRatio, - rect[0] - minX * xRatio, - rect[1] - minY * yRatio - ]; - } - - function getDefaultAppearance(dict) { - var appearanceState = dict.get('AP'); - if (!isDict(appearanceState)) { - return; - } - - var appearance; - var appearances = appearanceState.get('N'); - if (isDict(appearances)) { - var as = dict.get('AS'); - if (as && appearances.has(as.name)) { - appearance = appearances.get(as.name); - } - } else { - appearance = appearances; - } - return appearance; - } - - function Annotation(params) { - var dict = params.dict; - - this.setFlags(dict.get('F')); - this.setRectangle(dict.getArray('Rect')); - this.setColor(dict.getArray('C')); - this.setBorderStyle(dict); - this.appearance = getDefaultAppearance(dict); - - // Expose public properties using a data object. - this.data = {}; - this.data.id = params.id; - this.data.subtype = params.subtype; - this.data.annotationFlags = this.flags; - this.data.rect = this.rectangle; - this.data.color = this.color; - this.data.borderStyle = this.borderStyle; - this.data.hasAppearance = !!this.appearance; - } - - Annotation.prototype = { - /** - * @private - */ - _hasFlag: function Annotation_hasFlag(flags, flag) { - return !!(flags & flag); - }, - - /** - * @private - */ - _isViewable: function Annotation_isViewable(flags) { - return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && - !this._hasFlag(flags, AnnotationFlag.HIDDEN) && - !this._hasFlag(flags, AnnotationFlag.NOVIEW); - }, - - /** - * @private - */ - _isPrintable: function AnnotationFlag_isPrintable(flags) { - return this._hasFlag(flags, AnnotationFlag.PRINT) && - !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && - !this._hasFlag(flags, AnnotationFlag.HIDDEN); - }, - - /** - * @return {boolean} - */ - get viewable() { - if (this.flags === 0) { - return true; - } - return this._isViewable(this.flags); - }, - - /** - * @return {boolean} - */ - get printable() { - if (this.flags === 0) { - return false; - } - return this._isPrintable(this.flags); - }, - - /** - * Set the flags. - * - * @public - * @memberof Annotation - * @param {number} flags - Unsigned 32-bit integer specifying annotation - * characteristics - * @see {@link shared/util.js} - */ - setFlags: function Annotation_setFlags(flags) { - this.flags = (isInt(flags) && flags > 0) ? flags : 0; - }, - - /** - * Check if a provided flag is set. - * - * @public - * @memberof Annotation - * @param {number} flag - Hexadecimal representation for an annotation - * characteristic - * @return {boolean} - * @see {@link shared/util.js} - */ - hasFlag: function Annotation_hasFlag(flag) { - return this._hasFlag(this.flags, flag); - }, - - /** - * Set the rectangle. - * - * @public - * @memberof Annotation - * @param {Array} rectangle - The rectangle array with exactly four entries - */ - setRectangle: function Annotation_setRectangle(rectangle) { - if (isArray(rectangle) && rectangle.length === 4) { - this.rectangle = Util.normalizeRect(rectangle); - } else { - this.rectangle = [0, 0, 0, 0]; - } - }, - - /** - * Set the color and take care of color space conversion. - * - * @public - * @memberof Annotation - * @param {Array} color - The color array containing either 0 - * (transparent), 1 (grayscale), 3 (RGB) or - * 4 (CMYK) elements - */ - setColor: function Annotation_setColor(color) { - var rgbColor = new Uint8Array(3); // Black in RGB color space (default) - if (!isArray(color)) { - this.color = rgbColor; - return; - } - - switch (color.length) { - case 0: // Transparent, which we indicate with a null value - this.color = null; - break; - - case 1: // Convert grayscale to RGB - ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - case 3: // Convert RGB percentages to RGB - ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - case 4: // Convert CMYK to RGB - ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - default: - this.color = rgbColor; - break; - } - }, - - /** - * Set the border style (as AnnotationBorderStyle object). - * - * @public - * @memberof Annotation - * @param {Dict} borderStyle - The border style dictionary - */ - setBorderStyle: function Annotation_setBorderStyle(borderStyle) { - this.borderStyle = new AnnotationBorderStyle(); - if (!isDict(borderStyle)) { - return; - } - if (borderStyle.has('BS')) { - var dict = borderStyle.get('BS'); - var dictType = dict.get('Type'); - - if (!dictType || isName(dictType, 'Border')) { - this.borderStyle.setWidth(dict.get('W')); - this.borderStyle.setStyle(dict.get('S')); - this.borderStyle.setDashArray(dict.getArray('D')); - } - } else if (borderStyle.has('Border')) { - var array = borderStyle.getArray('Border'); - if (isArray(array) && array.length >= 3) { - this.borderStyle.setHorizontalCornerRadius(array[0]); - this.borderStyle.setVerticalCornerRadius(array[1]); - this.borderStyle.setWidth(array[2]); - - if (array.length === 4) { // Dash array available - this.borderStyle.setDashArray(array[3]); - } - } - } else { - // There are no border entries in the dictionary. According to the - // specification, we should draw a solid border of width 1 in that - // case, but Adobe Reader did not implement that part of the - // specification and instead draws no border at all, so we do the same. - // See also https://github.com/mozilla/pdf.js/issues/6179. - this.borderStyle.setWidth(0); - } - }, - - /** - * Prepare the annotation for working with a popup in the display layer. - * - * @private - * @memberof Annotation - * @param {Dict} dict - The annotation's data dictionary - */ - _preparePopup: function Annotation_preparePopup(dict) { - if (!dict.has('C')) { - // Fall back to the default background color. - this.data.color = null; - } - - this.data.hasPopup = dict.has('Popup'); - this.data.title = stringToPDFString(dict.get('T') || ''); - this.data.contents = stringToPDFString(dict.get('Contents') || ''); - }, - - loadResources: function Annotation_loadResources(keys) { - return new Promise(function (resolve, reject) { - this.appearance.dict.getAsync('Resources').then(function (resources) { - if (!resources) { - resolve(); - return; - } - var objectLoader = new ObjectLoader(resources.map, - keys, - resources.xref); - objectLoader.load().then(function() { - resolve(resources); - }, reject); - }, reject); - }.bind(this)); - }, - - getOperatorList: function Annotation_getOperatorList(evaluator, task, - renderForms) { - if (!this.appearance) { - return Promise.resolve(new OperatorList()); - } - - var data = this.data; - var appearanceDict = this.appearance.dict; - var resourcesPromise = this.loadResources([ - 'ExtGState', - 'ColorSpace', - 'Pattern', - 'Shading', - 'XObject', - 'Font' - // ProcSet - // Properties - ]); - var bbox = appearanceDict.getArray('BBox') || [0, 0, 1, 1]; - var matrix = appearanceDict.getArray('Matrix') || [1, 0, 0, 1, 0 ,0]; - var transform = getTransformMatrix(data.rect, bbox, matrix); - var self = this; - - return resourcesPromise.then(function(resources) { - var opList = new OperatorList(); - opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]); - return evaluator.getOperatorList(self.appearance, task, - resources, opList). - then(function () { - opList.addOp(OPS.endAnnotation, []); - self.appearance.reset(); - return opList; - }); - }); - } - }; - - Annotation.appendToOperatorList = function Annotation_appendToOperatorList( - annotations, opList, partialEvaluator, task, intent, renderForms) { - var annotationPromises = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if ((intent === 'display' && annotations[i].viewable) || - (intent === 'print' && annotations[i].printable)) { - annotationPromises.push( - annotations[i].getOperatorList(partialEvaluator, task, renderForms)); - } - } - return Promise.all(annotationPromises).then(function(operatorLists) { - opList.addOp(OPS.beginAnnotations, []); - for (var i = 0, n = operatorLists.length; i < n; ++i) { - opList.addOpList(operatorLists[i]); - } - opList.addOp(OPS.endAnnotations, []); - }); - }; - - return Annotation; -})(); - -/** - * Contains all data regarding an annotation's border style. - * - * @class - */ -var AnnotationBorderStyle = (function AnnotationBorderStyleClosure() { - /** - * @constructor - * @private - */ - function AnnotationBorderStyle() { - this.width = 1; - this.style = AnnotationBorderStyleType.SOLID; - this.dashArray = [3]; - this.horizontalCornerRadius = 0; - this.verticalCornerRadius = 0; - } - - AnnotationBorderStyle.prototype = { - /** - * Set the width. - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} width - The width - */ - setWidth: function AnnotationBorderStyle_setWidth(width) { - if (width === (width | 0)) { - this.width = width; - } - }, - - /** - * Set the style. - * - * @public - * @memberof AnnotationBorderStyle - * @param {Object} style - The style object - * @see {@link shared/util.js} - */ - setStyle: function AnnotationBorderStyle_setStyle(style) { - if (!style) { - return; - } - switch (style.name) { - case 'S': - this.style = AnnotationBorderStyleType.SOLID; - break; - - case 'D': - this.style = AnnotationBorderStyleType.DASHED; - break; - - case 'B': - this.style = AnnotationBorderStyleType.BEVELED; - break; - - case 'I': - this.style = AnnotationBorderStyleType.INSET; - break; - - case 'U': - this.style = AnnotationBorderStyleType.UNDERLINE; - break; - - default: - break; - } - }, - - /** - * Set the dash array. - * - * @public - * @memberof AnnotationBorderStyle - * @param {Array} dashArray - The dash array with at least one element - */ - setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) { - // We validate the dash array, but we do not use it because CSS does not - // allow us to change spacing of dashes. For more information, visit - // http://www.w3.org/TR/css3-background/#the-border-style. - if (isArray(dashArray) && dashArray.length > 0) { - // According to the PDF specification: the elements in a dashArray - // shall be numbers that are nonnegative and not all equal to zero. - var isValid = true; - var allZeros = true; - for (var i = 0, len = dashArray.length; i < len; i++) { - var element = dashArray[i]; - var validNumber = (+element >= 0); - if (!validNumber) { - isValid = false; - break; - } else if (element > 0) { - allZeros = false; - } - } - if (isValid && !allZeros) { - this.dashArray = dashArray; - } else { - this.width = 0; // Adobe behavior when the array is invalid. - } - } else if (dashArray) { - this.width = 0; // Adobe behavior when the array is invalid. - } - }, - - /** - * Set the horizontal corner radius (from a Border dictionary). - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} radius - The horizontal corner radius - */ - setHorizontalCornerRadius: - function AnnotationBorderStyle_setHorizontalCornerRadius(radius) { - if (radius === (radius | 0)) { - this.horizontalCornerRadius = radius; - } - }, - - /** - * Set the vertical corner radius (from a Border dictionary). - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} radius - The vertical corner radius - */ - setVerticalCornerRadius: - function AnnotationBorderStyle_setVerticalCornerRadius(radius) { - if (radius === (radius | 0)) { - this.verticalCornerRadius = radius; - } - } - }; - - return AnnotationBorderStyle; -})(); - -var WidgetAnnotation = (function WidgetAnnotationClosure() { - function WidgetAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - - data.annotationType = AnnotationType.WIDGET; - data.fieldValue = stringToPDFString( - Util.getInheritableProperty(dict, 'V') || ''); - data.alternativeText = stringToPDFString(dict.get('TU') || ''); - data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || ''; - var fieldType = Util.getInheritableProperty(dict, 'FT'); - data.fieldType = isName(fieldType) ? fieldType.name : null; - this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty; - - data.fieldFlags = Util.getInheritableProperty(dict, 'Ff'); - if (!isInt(data.fieldFlags) || data.fieldFlags < 0) { - data.fieldFlags = 0; - } - - // Hide signatures because we cannot validate them. - if (data.fieldType === 'Sig') { - this.setFlags(AnnotationFlag.HIDDEN); - } - - // Building the full field name by collecting the field and - // its ancestors 'T' data and joining them using '.'. - var fieldName = []; - var namedItem = dict; - var ref = params.ref; - while (namedItem) { - var parent = namedItem.get('Parent'); - var parentRef = namedItem.getRaw('Parent'); - var name = namedItem.get('T'); - if (name) { - fieldName.unshift(stringToPDFString(name)); - } else if (parent && ref) { - // The field name is absent, that means more than one field - // with the same name may exist. Replacing the empty name - // with the '`' plus index in the parent's 'Kids' array. - // This is not in the PDF spec but necessary to id the - // the input controls. - var kids = parent.get('Kids'); - var j, jj; - for (j = 0, jj = kids.length; j < jj; j++) { - var kidRef = kids[j]; - if (kidRef.num === ref.num && kidRef.gen === ref.gen) { - break; - } - } - fieldName.unshift('`' + j); - } - namedItem = parent; - ref = parentRef; - } - data.fullName = fieldName.join('.'); - } - - Util.inherit(WidgetAnnotation, Annotation, { - /** - * Check if a provided field flag is set. - * - * @public - * @memberof WidgetAnnotation - * @param {number} flag - Hexadecimal representation for an annotation - * field characteristic - * @return {boolean} - * @see {@link shared/util.js} - */ - hasFieldFlag: function WidgetAnnotation_hasFieldFlag(flag) { - return !!(this.data.fieldFlags & flag); - }, - }); - - return WidgetAnnotation; -})(); - -var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() { - function TextWidgetAnnotation(params) { - WidgetAnnotation.call(this, params); - - // Determine the alignment of text in the field. - var alignment = Util.getInheritableProperty(params.dict, 'Q'); - if (!isInt(alignment) || alignment < 0 || alignment > 2) { - alignment = null; - } - this.data.textAlignment = alignment; - - // Determine the maximum length of text in the field. - var maximumLength = Util.getInheritableProperty(params.dict, 'MaxLen'); - if (!isInt(maximumLength) || maximumLength < 0) { - maximumLength = null; - } - this.data.maxLen = maximumLength; - - // Process field flags for the display layer. - this.data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY); - this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE); - this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && - !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) && - !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) && - !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && - this.data.maxLen !== null; - } - - Util.inherit(TextWidgetAnnotation, WidgetAnnotation, { - getOperatorList: - function TextWidgetAnnotation_getOperatorList(evaluator, task, - renderForms) { - var operatorList = new OperatorList(); - - // Do not render form elements on the canvas when interactive forms are - // enabled. The display layer is responsible for rendering them instead. - if (renderForms) { - return Promise.resolve(operatorList); - } - - if (this.appearance) { - return Annotation.prototype.getOperatorList.call(this, evaluator, task, - renderForms); - } - - // Even if there is an appearance stream, ignore it. This is the - // behaviour used by Adobe Reader. - if (!this.data.defaultAppearance) { - return Promise.resolve(operatorList); - } - - var stream = new Stream(stringToBytes(this.data.defaultAppearance)); - return evaluator.getOperatorList(stream, task, this.fieldResources, - operatorList). - then(function () { - return operatorList; - }); - } - }); - - return TextWidgetAnnotation; -})(); - -var TextAnnotation = (function TextAnnotationClosure() { - var DEFAULT_ICON_SIZE = 22; // px - - function TextAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.TEXT; - - if (this.data.hasAppearance) { - this.data.name = 'NoIcon'; - } else { - this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE; - this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE; - this.data.name = parameters.dict.has('Name') ? - parameters.dict.get('Name').name : 'Note'; - } - this._preparePopup(parameters.dict); - } - - Util.inherit(TextAnnotation, Annotation, {}); - - return TextAnnotation; -})(); - -var LinkAnnotation = (function LinkAnnotationClosure() { - function LinkAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - data.annotationType = AnnotationType.LINK; - - var action = dict.get('A'), url, dest; - if (action && isDict(action)) { - var linkType = action.get('S').name; - switch (linkType) { - case 'URI': - url = action.get('URI'); - if (isName(url)) { - // Some bad PDFs do not put parentheses around relative URLs. - url = '/' + url.name; - } else if (url) { - url = addDefaultProtocolToUrl(url); - } - // TODO: pdf spec mentions urls can be relative to a Base - // entry in the dictionary. - break; - - case 'GoTo': - dest = action.get('D'); - break; - - case 'GoToR': - var urlDict = action.get('F'); - if (isDict(urlDict)) { - // We assume that we found a FileSpec dictionary - // and fetch the URL without checking any further. - url = urlDict.get('F') || null; - } else if (isString(urlDict)) { - url = urlDict; - } - - // NOTE: the destination is relative to the *remote* document. - var remoteDest = action.get('D'); - if (remoteDest) { - if (isName(remoteDest)) { - remoteDest = remoteDest.name; - } - if (isString(url)) { - var baseUrl = url.split('#')[0]; - if (isString(remoteDest)) { - // In practice, a named destination may contain only a number. - // If that happens, use the '#nameddest=' form to avoid the link - // redirecting to a page, instead of the correct destination. - url = baseUrl + '#' + - (/^\d+$/.test(remoteDest) ? 'nameddest=' : '') + remoteDest; - } else if (isArray(remoteDest)) { - url = baseUrl + '#' + JSON.stringify(remoteDest); - } - } - } - // The 'NewWindow' property, equal to `LinkTarget.BLANK`. - var newWindow = action.get('NewWindow'); - if (isBool(newWindow)) { - data.newWindow = newWindow; - } - break; - - case 'Named': - data.action = action.get('N').name; - break; - - default: - warn('unrecognized link type: ' + linkType); - } - } else if (dict.has('Dest')) { // Simple destination link. - dest = dict.get('Dest'); - } - - if (url) { - if (isValidUrl(url, /* allowRelative = */ false)) { - data.url = tryConvertUrlEncoding(url); - } - } - if (dest) { - data.dest = isName(dest) ? dest.name : dest; - } - } - - // Lets URLs beginning with 'www.' default to using the 'http://' protocol. - function addDefaultProtocolToUrl(url) { - if (isString(url) && url.indexOf('www.') === 0) { - return ('http://' + url); - } - return url; - } - - function tryConvertUrlEncoding(url) { - // According to ISO 32000-1:2008, section 12.6.4.7, URIs should be encoded - // in 7-bit ASCII. Some bad PDFs use UTF-8 encoding, see Bugzilla 1122280. - try { - return stringToUTF8String(url); - } catch (e) { - return url; - } - } - - Util.inherit(LinkAnnotation, Annotation, {}); - - return LinkAnnotation; -})(); - -var PopupAnnotation = (function PopupAnnotationClosure() { - function PopupAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.POPUP; - - var dict = parameters.dict; - var parentItem = dict.get('Parent'); - if (!parentItem) { - warn('Popup annotation has a missing or invalid parent annotation.'); - return; - } - - this.data.parentId = dict.getRaw('Parent').toString(); - this.data.title = stringToPDFString(parentItem.get('T') || ''); - this.data.contents = stringToPDFString(parentItem.get('Contents') || ''); - - if (!parentItem.has('C')) { - // Fall back to the default background color. - this.data.color = null; - } else { - this.setColor(parentItem.getArray('C')); - this.data.color = this.color; - } - - // If the Popup annotation is not viewable, but the parent annotation is, - // that is most likely a bug. Fallback to inherit the flags from the parent - // annotation (this is consistent with the behaviour in Adobe Reader). - if (!this.viewable) { - var parentFlags = parentItem.get('F'); - if (this._isViewable(parentFlags)) { - this.setFlags(parentFlags); - } - } - } - - Util.inherit(PopupAnnotation, Annotation, {}); - - return PopupAnnotation; -})(); - -var HighlightAnnotation = (function HighlightAnnotationClosure() { - function HighlightAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.HIGHLIGHT; - this._preparePopup(parameters.dict); - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(HighlightAnnotation, Annotation, {}); - - return HighlightAnnotation; -})(); - -var UnderlineAnnotation = (function UnderlineAnnotationClosure() { - function UnderlineAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.UNDERLINE; - this._preparePopup(parameters.dict); - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(UnderlineAnnotation, Annotation, {}); - - return UnderlineAnnotation; -})(); - -var SquigglyAnnotation = (function SquigglyAnnotationClosure() { - function SquigglyAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.SQUIGGLY; - this._preparePopup(parameters.dict); - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(SquigglyAnnotation, Annotation, {}); - - return SquigglyAnnotation; -})(); - -var StrikeOutAnnotation = (function StrikeOutAnnotationClosure() { - function StrikeOutAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.STRIKEOUT; - this._preparePopup(parameters.dict); - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(StrikeOutAnnotation, Annotation, {}); - - return StrikeOutAnnotation; -})(); - -var FileAttachmentAnnotation = (function FileAttachmentAnnotationClosure() { - function FileAttachmentAnnotation(parameters) { - Annotation.call(this, parameters); - - var file = new FileSpec(parameters.dict.get('FS'), parameters.xref); - - this.data.annotationType = AnnotationType.FILEATTACHMENT; - this.data.file = file.serializable; - this._preparePopup(parameters.dict); - } - - Util.inherit(FileAttachmentAnnotation, Annotation, {}); - - return FileAttachmentAnnotation; -})(); - -exports.Annotation = Annotation; -exports.AnnotationBorderStyle = AnnotationBorderStyle; -exports.AnnotationFactory = AnnotationFactory; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreDocument = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, - root.pdfjsCoreObj, root.pdfjsCoreParser, root.pdfjsCoreCrypto, - root.pdfjsCoreEvaluator, root.pdfjsCoreAnnotation); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, coreObj, - coreParser, coreCrypto, coreEvaluator, coreAnnotation) { - -var MissingDataException = sharedUtil.MissingDataException; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isArrayBuffer = sharedUtil.isArrayBuffer; -var isString = sharedUtil.isString; -var shadow = sharedUtil.shadow; -var stringToBytes = sharedUtil.stringToBytes; -var stringToPDFString = sharedUtil.stringToPDFString; -var warn = sharedUtil.warn; -var isSpace = sharedUtil.isSpace; -var Dict = corePrimitives.Dict; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var isStream = corePrimitives.isStream; -var NullStream = coreStream.NullStream; -var Stream = coreStream.Stream; -var StreamsSequenceStream = coreStream.StreamsSequenceStream; -var Catalog = coreObj.Catalog; -var ObjectLoader = coreObj.ObjectLoader; -var XRef = coreObj.XRef; -var Linearization = coreParser.Linearization; -var calculateMD5 = coreCrypto.calculateMD5; -var OperatorList = coreEvaluator.OperatorList; -var PartialEvaluator = coreEvaluator.PartialEvaluator; -var Annotation = coreAnnotation.Annotation; -var AnnotationFactory = coreAnnotation.AnnotationFactory; - -var Page = (function PageClosure() { - - var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; - - function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) { - this.pdfManager = pdfManager; - this.pageIndex = pageIndex; - this.pageDict = pageDict; - this.xref = xref; - this.ref = ref; - this.fontCache = fontCache; - this.uniquePrefix = 'p' + this.pageIndex + '_'; - this.idCounters = { - obj: 0 - }; - this.evaluatorOptions = pdfManager.evaluatorOptions; - this.resourcesPromise = null; - } - - Page.prototype = { - getPageProp: function Page_getPageProp(key) { - return this.pageDict.get(key); - }, - - getInheritedPageProp: function Page_getInheritedPageProp(key) { - var dict = this.pageDict, valueArray = null, loopCount = 0; - var MAX_LOOP_COUNT = 100; - // Always walk up the entire parent chain, to be able to find - // e.g. \Resources placed on multiple levels of the tree. - while (dict) { - var value = dict.get(key); - if (value) { - if (!valueArray) { - valueArray = []; - } - valueArray.push(value); - } - if (++loopCount > MAX_LOOP_COUNT) { - warn('Page_getInheritedPageProp: maximum loop count exceeded.'); - break; - } - dict = dict.get('Parent'); - } - if (!valueArray) { - return Dict.empty; - } - if (valueArray.length === 1 || !isDict(valueArray[0]) || - loopCount > MAX_LOOP_COUNT) { - return valueArray[0]; - } - return Dict.merge(this.xref, valueArray); - }, - - get content() { - return this.getPageProp('Contents'); - }, - - get resources() { - // For robustness: The spec states that a \Resources entry has to be - // present, but can be empty. Some document omit it still, in this case - // we return an empty dictionary. - return shadow(this, 'resources', this.getInheritedPageProp('Resources')); - }, - - get mediaBox() { - var obj = this.getInheritedPageProp('MediaBox'); - // Reset invalid media box to letter size. - if (!isArray(obj) || obj.length !== 4) { - obj = LETTER_SIZE_MEDIABOX; - } - return shadow(this, 'mediaBox', obj); - }, - - get view() { - var mediaBox = this.mediaBox; - var cropBox = this.getInheritedPageProp('CropBox'); - if (!isArray(cropBox) || cropBox.length !== 4) { - return shadow(this, 'view', mediaBox); - } - - // From the spec, 6th ed., p.963: - // "The crop, bleed, trim, and art boxes should not ordinarily - // extend beyond the boundaries of the media box. If they do, they are - // effectively reduced to their intersection with the media box." - cropBox = Util.intersect(cropBox, mediaBox); - if (!cropBox) { - return shadow(this, 'view', mediaBox); - } - return shadow(this, 'view', cropBox); - }, - - get rotate() { - var rotate = this.getInheritedPageProp('Rotate') || 0; - // Normalize rotation so it's a multiple of 90 and between 0 and 270 - if (rotate % 90 !== 0) { - rotate = 0; - } else if (rotate >= 360) { - rotate = rotate % 360; - } else if (rotate < 0) { - // The spec doesn't cover negatives, assume its counterclockwise - // rotation. The following is the other implementation of modulo. - rotate = ((rotate % 360) + 360) % 360; - } - return shadow(this, 'rotate', rotate); - }, - - getContentStream: function Page_getContentStream() { - var content = this.content; - var stream; - if (isArray(content)) { - // fetching items - var xref = this.xref; - var i, n = content.length; - var streams = []; - for (i = 0; i < n; ++i) { - streams.push(xref.fetchIfRef(content[i])); - } - stream = new StreamsSequenceStream(streams); - } else if (isStream(content)) { - stream = content; - } else { - // replacing non-existent page content with empty one - stream = new NullStream(); - } - return stream; - }, - - loadResources: function Page_loadResources(keys) { - if (!this.resourcesPromise) { - // TODO: add async getInheritedPageProp and remove this. - this.resourcesPromise = this.pdfManager.ensure(this, 'resources'); - } - return this.resourcesPromise.then(function resourceSuccess() { - var objectLoader = new ObjectLoader(this.resources.map, - keys, - this.xref); - return objectLoader.load(); - }.bind(this)); - }, - - getOperatorList: function Page_getOperatorList(handler, task, intent, - renderInteractiveForms) { - var self = this; - - var pdfManager = this.pdfManager; - var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', - []); - var resourcesPromise = this.loadResources([ - 'ExtGState', - 'ColorSpace', - 'Pattern', - 'Shading', - 'XObject', - 'Font' - // ProcSet - // Properties - ]); - - var partialEvaluator = new PartialEvaluator(pdfManager, this.xref, - handler, this.pageIndex, - this.uniquePrefix, - this.idCounters, - this.fontCache, - this.evaluatorOptions); - - var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); - var pageListPromise = dataPromises.then(function(data) { - var contentStream = data[0]; - var opList = new OperatorList(intent, handler, self.pageIndex); - - handler.send('StartRenderPage', { - transparency: partialEvaluator.hasBlendModes(self.resources), - pageIndex: self.pageIndex, - intent: intent - }); - return partialEvaluator.getOperatorList(contentStream, task, - self.resources, opList).then(function () { - return opList; - }); - }); - - var annotationsPromise = pdfManager.ensure(this, 'annotations'); - return Promise.all([pageListPromise, annotationsPromise]).then( - function(datas) { - var pageOpList = datas[0]; - var annotations = datas[1]; - - if (annotations.length === 0) { - pageOpList.flush(true); - return pageOpList; - } - - var annotationsReadyPromise = Annotation.appendToOperatorList( - annotations, pageOpList, partialEvaluator, task, intent, - renderInteractiveForms); - return annotationsReadyPromise.then(function () { - pageOpList.flush(true); - return pageOpList; - }); - }); - }, - - extractTextContent: function Page_extractTextContent(task, - normalizeWhitespace, - combineTextItems) { - var handler = { - on: function nullHandlerOn() {}, - send: function nullHandlerSend() {} - }; - - var self = this; - - var pdfManager = this.pdfManager; - var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', - []); - - var resourcesPromise = this.loadResources([ - 'ExtGState', - 'XObject', - 'Font' - ]); - - var dataPromises = Promise.all([contentStreamPromise, - resourcesPromise]); - return dataPromises.then(function(data) { - var contentStream = data[0]; - var partialEvaluator = new PartialEvaluator(pdfManager, self.xref, - handler, self.pageIndex, - self.uniquePrefix, - self.idCounters, - self.fontCache, - self.evaluatorOptions); - - return partialEvaluator.getTextContent(contentStream, - task, - self.resources, - /* stateManager = */ null, - normalizeWhitespace, - combineTextItems); - }); - }, - - getAnnotationsData: function Page_getAnnotationsData(intent) { - var annotations = this.annotations; - var annotationsData = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if (intent) { - if (!(intent === 'display' && annotations[i].viewable) && - !(intent === 'print' && annotations[i].printable)) { - continue; - } - } - annotationsData.push(annotations[i].data); - } - return annotationsData; - }, - - get annotations() { - var annotations = []; - var annotationRefs = this.getInheritedPageProp('Annots') || []; - var annotationFactory = new AnnotationFactory(); - for (var i = 0, n = annotationRefs.length; i < n; ++i) { - var annotationRef = annotationRefs[i]; - var annotation = annotationFactory.create(this.xref, annotationRef, - this.uniquePrefix, - this.idCounters); - if (annotation) { - annotations.push(annotation); - } - } - return shadow(this, 'annotations', annotations); - } - }; - - return Page; -})(); - -/** - * The `PDFDocument` holds all the data of the PDF file. Compared to the - * `PDFDoc`, this one doesn't have any job management code. - * Right now there exists one PDFDocument on the main thread + one object - * for each worker. If there is no worker support enabled, there are two - * `PDFDocument` objects on the main thread created. - */ -var PDFDocument = (function PDFDocumentClosure() { - var FINGERPRINT_FIRST_BYTES = 1024; - var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' + - '\x00\x00\x00\x00\x00\x00\x00\x00\x00'; - - function PDFDocument(pdfManager, arg, password) { - if (isStream(arg)) { - init.call(this, pdfManager, arg, password); - } else if (isArrayBuffer(arg)) { - init.call(this, pdfManager, new Stream(arg), password); - } else { - error('PDFDocument: Unknown argument type'); - } - } - - function init(pdfManager, stream, password) { - assert(stream.length > 0, 'stream must have data'); - this.pdfManager = pdfManager; - this.stream = stream; - var xref = new XRef(this.stream, password, pdfManager); - this.xref = xref; - } - - function find(stream, needle, limit, backwards) { - var pos = stream.pos; - var end = stream.end; - var strBuf = []; - if (pos + limit > end) { - limit = end - pos; - } - for (var n = 0; n < limit; ++n) { - strBuf.push(String.fromCharCode(stream.getByte())); - } - var str = strBuf.join(''); - stream.pos = pos; - var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle); - if (index === -1) { - return false; /* not found */ - } - stream.pos += index; - return true; /* found */ - } - - var DocumentInfoValidators = { - get entries() { - // Lazily build this since all the validation functions below are not - // defined until after this file loads. - return shadow(this, 'entries', { - Title: isString, - Author: isString, - Subject: isString, - Keywords: isString, - Creator: isString, - Producer: isString, - CreationDate: isString, - ModDate: isString, - Trapped: isName - }); - } - }; - - PDFDocument.prototype = { - parse: function PDFDocument_parse(recoveryMode) { - this.setup(recoveryMode); - var version = this.catalog.catDict.get('Version'); - if (isName(version)) { - this.pdfFormatVersion = version.name; - } - try { - // checking if AcroForm is present - this.acroForm = this.catalog.catDict.get('AcroForm'); - if (this.acroForm) { - this.xfa = this.acroForm.get('XFA'); - var fields = this.acroForm.get('Fields'); - if ((!fields || !isArray(fields) || fields.length === 0) && - !this.xfa) { - // no fields and no XFA -- not a form (?) - this.acroForm = null; - } - } - } catch (ex) { - info('Something wrong with AcroForm entry'); - this.acroForm = null; - } - }, - - get linearization() { - var linearization = null; - if (this.stream.length) { - try { - linearization = Linearization.create(this.stream); - } catch (err) { - if (err instanceof MissingDataException) { - throw err; - } - info(err); - } - } - // shadow the prototype getter with a data property - return shadow(this, 'linearization', linearization); - }, - get startXRef() { - var stream = this.stream; - var startXRef = 0; - var linearization = this.linearization; - if (linearization) { - // Find end of first obj. - stream.reset(); - if (find(stream, 'endobj', 1024)) { - startXRef = stream.pos + 6; - } - } else { - // Find startxref by jumping backward from the end of the file. - var step = 1024; - var found = false, pos = stream.end; - while (!found && pos > 0) { - pos -= step - 'startxref'.length; - if (pos < 0) { - pos = 0; - } - stream.pos = pos; - found = find(stream, 'startxref', step, true); - } - if (found) { - stream.skip(9); - var ch; - do { - ch = stream.getByte(); - } while (isSpace(ch)); - var str = ''; - while (ch >= 0x20 && ch <= 0x39) { // < '9' - str += String.fromCharCode(ch); - ch = stream.getByte(); - } - startXRef = parseInt(str, 10); - if (isNaN(startXRef)) { - startXRef = 0; - } - } - } - // shadow the prototype getter with a data property - return shadow(this, 'startXRef', startXRef); - }, - get mainXRefEntriesOffset() { - var mainXRefEntriesOffset = 0; - var linearization = this.linearization; - if (linearization) { - mainXRefEntriesOffset = linearization.mainXRefEntriesOffset; - } - // shadow the prototype getter with a data property - return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset); - }, - // Find the header, remove leading garbage and setup the stream - // starting from the header. - checkHeader: function PDFDocument_checkHeader() { - var stream = this.stream; - stream.reset(); - if (find(stream, '%PDF-', 1024)) { - // Found the header, trim off any garbage before it. - stream.moveStart(); - // Reading file format version - var MAX_VERSION_LENGTH = 12; - var version = '', ch; - while ((ch = stream.getByte()) > 0x20) { // SPACE - if (version.length >= MAX_VERSION_LENGTH) { - break; - } - version += String.fromCharCode(ch); - } - if (!this.pdfFormatVersion) { - // removing "%PDF-"-prefix - this.pdfFormatVersion = version.substring(5); - } - return; - } - // May not be a PDF file, continue anyway. - }, - parseStartXRef: function PDFDocument_parseStartXRef() { - var startXRef = this.startXRef; - this.xref.setStartXRef(startXRef); - }, - setup: function PDFDocument_setup(recoveryMode) { - this.xref.parse(recoveryMode); - var self = this; - var pageFactory = { - createPage: function (pageIndex, dict, ref, fontCache) { - return new Page(self.pdfManager, self.xref, pageIndex, dict, ref, - fontCache); - } - }; - this.catalog = new Catalog(this.pdfManager, this.xref, pageFactory); - }, - get numPages() { - var linearization = this.linearization; - var num = linearization ? linearization.numPages : this.catalog.numPages; - // shadow the prototype getter - return shadow(this, 'numPages', num); - }, - get documentInfo() { - var docInfo = { - PDFFormatVersion: this.pdfFormatVersion, - IsAcroFormPresent: !!this.acroForm, - IsXFAPresent: !!this.xfa - }; - var infoDict; - try { - infoDict = this.xref.trailer.get('Info'); - } catch (err) { - info('The document information dictionary is invalid.'); - } - if (infoDict) { - var validEntries = DocumentInfoValidators.entries; - // Only fill the document info with valid entries from the spec. - for (var key in validEntries) { - if (infoDict.has(key)) { - var value = infoDict.get(key); - // Make sure the value conforms to the spec. - if (validEntries[key](value)) { - docInfo[key] = (typeof value !== 'string' ? - value : stringToPDFString(value)); - } else { - info('Bad value in document info for "' + key + '"'); - } - } - } - } - return shadow(this, 'documentInfo', docInfo); - }, - get fingerprint() { - var xref = this.xref, hash, fileID = ''; - var idArray = xref.trailer.get('ID'); - - if (idArray && isArray(idArray) && idArray[0] && isString(idArray[0]) && - idArray[0] !== EMPTY_FINGERPRINT) { - hash = stringToBytes(idArray[0]); - } else { - if (this.stream.ensureRange) { - this.stream.ensureRange(0, - Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end)); - } - hash = calculateMD5(this.stream.bytes.subarray(0, - FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); - } - - for (var i = 0, n = hash.length; i < n; i++) { - var hex = hash[i].toString(16); - fileID += hex.length === 1 ? '0' + hex : hex; - } - - return shadow(this, 'fingerprint', fileID); - }, - - getPage: function PDFDocument_getPage(pageIndex) { - return this.catalog.getPage(pageIndex); - }, - - cleanup: function PDFDocument_cleanup() { - return this.catalog.cleanup(); - } - }; - - return PDFDocument; -})(); - -exports.Page = Page; -exports.PDFDocument = PDFDocument; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCorePdfManager = {}), root.pdfjsSharedUtil, - root.pdfjsCoreStream, root.pdfjsCoreChunkedStream, - root.pdfjsCoreDocument); - } -}(this, function (exports, sharedUtil, coreStream, coreChunkedStream, - coreDocument) { - -var NotImplementedException = sharedUtil.NotImplementedException; -var MissingDataException = sharedUtil.MissingDataException; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var Util = sharedUtil.Util; -var Stream = coreStream.Stream; -var ChunkedStreamManager = coreChunkedStream.ChunkedStreamManager; -var PDFDocument = coreDocument.PDFDocument; - -var BasePdfManager = (function BasePdfManagerClosure() { - function BasePdfManager() { - throw new Error('Cannot initialize BaseManagerManager'); - } - - BasePdfManager.prototype = { - get docId() { - return this._docId; - }, - - onLoadedStream: function BasePdfManager_onLoadedStream() { - throw new NotImplementedException(); - }, - - ensureDoc: function BasePdfManager_ensureDoc(prop, args) { - return this.ensure(this.pdfDocument, prop, args); - }, - - ensureXRef: function BasePdfManager_ensureXRef(prop, args) { - return this.ensure(this.pdfDocument.xref, prop, args); - }, - - ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) { - return this.ensure(this.pdfDocument.catalog, prop, args); - }, - - getPage: function BasePdfManager_getPage(pageIndex) { - return this.pdfDocument.getPage(pageIndex); - }, - - cleanup: function BasePdfManager_cleanup() { - return this.pdfDocument.cleanup(); - }, - - ensure: function BasePdfManager_ensure(obj, prop, args) { - return new NotImplementedException(); - }, - - requestRange: function BasePdfManager_requestRange(begin, end) { - return new NotImplementedException(); - }, - - requestLoadedStream: function BasePdfManager_requestLoadedStream() { - return new NotImplementedException(); - }, - - sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) { - return new NotImplementedException(); - }, - - updatePassword: function BasePdfManager_updatePassword(password) { - this.pdfDocument.xref.password = this.password = password; - if (this._passwordChangedCapability) { - this._passwordChangedCapability.resolve(); - } - }, - - passwordChanged: function BasePdfManager_passwordChanged() { - this._passwordChangedCapability = createPromiseCapability(); - return this._passwordChangedCapability.promise; - }, - - terminate: function BasePdfManager_terminate() { - return new NotImplementedException(); - } - }; - - return BasePdfManager; -})(); - -var LocalPdfManager = (function LocalPdfManagerClosure() { - function LocalPdfManager(docId, data, password, evaluatorOptions) { - this._docId = docId; - this.evaluatorOptions = evaluatorOptions; - var stream = new Stream(data); - this.pdfDocument = new PDFDocument(this, stream, password); - this._loadedStreamCapability = createPromiseCapability(); - this._loadedStreamCapability.resolve(stream); - } - - Util.inherit(LocalPdfManager, BasePdfManager, { - ensure: function LocalPdfManager_ensure(obj, prop, args) { - return new Promise(function (resolve, reject) { - try { - var value = obj[prop]; - var result; - if (typeof value === 'function') { - result = value.apply(obj, args); - } else { - result = value; - } - resolve(result); - } catch (e) { - reject(e); - } - }); - }, - - requestRange: function LocalPdfManager_requestRange(begin, end) { - return Promise.resolve(); - }, - - requestLoadedStream: function LocalPdfManager_requestLoadedStream() { - return; - }, - - onLoadedStream: function LocalPdfManager_onLoadedStream() { - return this._loadedStreamCapability.promise; - }, - - terminate: function LocalPdfManager_terminate() { - return; - } - }); - - return LocalPdfManager; -})(); - -var NetworkPdfManager = (function NetworkPdfManagerClosure() { - function NetworkPdfManager(docId, pdfNetworkStream, args, evaluatorOptions) { - this._docId = docId; - this.msgHandler = args.msgHandler; - this.evaluatorOptions = evaluatorOptions; - - var params = { - msgHandler: args.msgHandler, - url: args.url, - length: args.length, - disableAutoFetch: args.disableAutoFetch, - rangeChunkSize: args.rangeChunkSize - }; - this.streamManager = new ChunkedStreamManager(pdfNetworkStream, params); - this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(), - args.password); - } - - Util.inherit(NetworkPdfManager, BasePdfManager, { - ensure: function NetworkPdfManager_ensure(obj, prop, args) { - var pdfManager = this; - - return new Promise(function (resolve, reject) { - function ensureHelper() { - try { - var result; - var value = obj[prop]; - if (typeof value === 'function') { - result = value.apply(obj, args); - } else { - result = value; - } - resolve(result); - } catch(e) { - if (!(e instanceof MissingDataException)) { - reject(e); - return; - } - pdfManager.streamManager.requestRange(e.begin, e.end). - then(ensureHelper, reject); - } - } - - ensureHelper(); - }); - }, - - requestRange: function NetworkPdfManager_requestRange(begin, end) { - return this.streamManager.requestRange(begin, end); - }, - - requestLoadedStream: function NetworkPdfManager_requestLoadedStream() { - this.streamManager.requestAllChunks(); - }, - - sendProgressiveData: - function NetworkPdfManager_sendProgressiveData(chunk) { - this.streamManager.onReceiveData({ chunk: chunk }); - }, - - onLoadedStream: function NetworkPdfManager_onLoadedStream() { - return this.streamManager.onLoadedStream(); - }, - - terminate: function NetworkPdfManager_terminate() { - this.streamManager.abort(); - } - }); - - return NetworkPdfManager; -})(); - -exports.LocalPdfManager = LocalPdfManager; -exports.NetworkPdfManager = NetworkPdfManager; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreWorker = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCorePdfManager); - } -}(this, function (exports, sharedUtil, corePrimitives, corePdfManager) { - -var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; -var InvalidPDFException = sharedUtil.InvalidPDFException; -var MessageHandler = sharedUtil.MessageHandler; -var MissingPDFException = sharedUtil.MissingPDFException; -var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; -var PasswordException = sharedUtil.PasswordException; -var PasswordResponses = sharedUtil.PasswordResponses; -var UnknownErrorException = sharedUtil.UnknownErrorException; -var XRefParseException = sharedUtil.XRefParseException; -var arrayByteLength = sharedUtil.arrayByteLength; -var arraysToBytes = sharedUtil.arraysToBytes; -var assert = sharedUtil.assert; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var error = sharedUtil.error; -var info = sharedUtil.info; -var warn = sharedUtil.warn; -var setVerbosityLevel = sharedUtil.setVerbosityLevel; -var Ref = corePrimitives.Ref; -var LocalPdfManager = corePdfManager.LocalPdfManager; -var NetworkPdfManager = corePdfManager.NetworkPdfManager; -var globalScope = sharedUtil.globalScope; - -var WorkerTask = (function WorkerTaskClosure() { - function WorkerTask(name) { - this.name = name; - this.terminated = false; - this._capability = createPromiseCapability(); - } - - WorkerTask.prototype = { - get finished() { - return this._capability.promise; - }, - - finish: function () { - this._capability.resolve(); - }, - - terminate: function () { - this.terminated = true; - }, - - ensureNotTerminated: function () { - if (this.terminated) { - throw new Error('Worker task was terminated'); - } - } - }; - - return WorkerTask; -})(); - - -/** @implements {IPDFStream} */ -var PDFWorkerStream = (function PDFWorkerStreamClosure() { - function PDFWorkerStream(params, msgHandler) { - this._queuedChunks = []; - var initialData = params.initialData; - if (initialData && initialData.length > 0) { - this._queuedChunks.push(initialData); - } - this._msgHandler = msgHandler; - - this._isRangeSupported = !(params.disableRange); - this._isStreamingSupported = !(params.disableStream); - this._contentLength = params.length; - - this._fullRequestReader = null; - this._rangeReaders = []; - - msgHandler.on('OnDataRange', this._onReceiveData.bind(this)); - msgHandler.on('OnDataProgress', this._onProgress.bind(this)); - } - PDFWorkerStream.prototype = { - _onReceiveData: function PDFWorkerStream_onReceiveData(args) { - if (args.begin === undefined) { - if (this._fullRequestReader) { - this._fullRequestReader._enqueue(args.chunk); - } else { - this._queuedChunks.push(args.chunk); - } - } else { - var found = this._rangeReaders.some(function (rangeReader) { - if (rangeReader._begin !== args.begin) { - return false; - } - rangeReader._enqueue(args.chunk); - return true; - }); - assert(found); - } - }, - - _onProgress: function PDFWorkerStream_onProgress(evt) { - if (this._rangeReaders.length > 0) { - // Reporting to first range reader. - var firstReader = this._rangeReaders[0]; - if (firstReader.onProgress) { - firstReader.onProgress({loaded: evt.loaded}); - } - } - }, - - _removeRangeReader: function PDFWorkerStream_removeRangeReader(reader) { - var i = this._rangeReaders.indexOf(reader); - if (i >= 0) { - this._rangeReaders.splice(i, 1); - } - }, - - getFullReader: function PDFWorkerStream_getFullReader() { - assert(!this._fullRequestReader); - var queuedChunks = this._queuedChunks; - this._queuedChunks = null; - return new PDFWorkerStreamReader(this, queuedChunks); - }, - - getRangeReader: function PDFWorkerStream_getRangeReader(begin, end) { - var reader = new PDFWorkerStreamRangeReader(this, begin, end); - this._msgHandler.send('RequestDataRange', { begin: begin, end: end }); - this._rangeReaders.push(reader); - return reader; - }, - - cancelAllRequests: function PDFWorkerStream_cancelAllRequests(reason) { - if (this._fullRequestReader) { - this._fullRequestReader.cancel(reason); - } - var readers = this._rangeReaders.slice(0); - readers.forEach(function (rangeReader) { - rangeReader.cancel(reason); - }); - } - }; - - /** @implements {IPDFStreamReader} */ - function PDFWorkerStreamReader(stream, queuedChunks) { - this._stream = stream; - this._done = false; - this._queuedChunks = queuedChunks || []; - this._requests = []; - this._headersReady = Promise.resolve(); - stream._fullRequestReader = this; - - this.onProgress = null; // not used - } - PDFWorkerStreamReader.prototype = { - _enqueue: function PDFWorkerStreamReader_enqueue(chunk) { - if (this._done) { - return; // ignore new data - } - if (this._requests.length > 0) { - var requestCapability = this._requests.shift(); - requestCapability.resolve({value: chunk, done: false}); - return; - } - this._queuedChunks.push(chunk); - }, - - get headersReady() { - return this._headersReady; - }, - - get isRangeSupported() { - return this._stream._isRangeSupported; - }, - - get isStreamingSupported() { - return this._stream._isStreamingSupported; - }, - - get contentLength() { - return this._stream._contentLength; - }, - - read: function PDFWorkerStreamReader_read() { - if (this._queuedChunks.length > 0) { - var chunk = this._queuedChunks.shift(); - return Promise.resolve({value: chunk, done: false}); - } - if (this._done) { - return Promise.resolve({value: undefined, done: true}); - } - var requestCapability = createPromiseCapability(); - this._requests.push(requestCapability); - return requestCapability.promise; - }, - - cancel: function PDFWorkerStreamReader_cancel(reason) { - this._done = true; - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - } - }; - - /** @implements {IPDFStreamRangeReader} */ - function PDFWorkerStreamRangeReader(stream, begin, end) { - this._stream = stream; - this._begin = begin; - this._end = end; - this._queuedChunk = null; - this._requests = []; - this._done = false; - - this.onProgress = null; - } - PDFWorkerStreamRangeReader.prototype = { - _enqueue: function PDFWorkerStreamRangeReader_enqueue(chunk) { - if (this._done) { - return; // ignore new data - } - if (this._requests.length === 0) { - this._queuedChunk = chunk; - } else { - var requestsCapability = this._requests.shift(); - requestsCapability.resolve({value: chunk, done: false}); - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - } - this._done = true; - this._stream._removeRangeReader(this); - }, - - get isStreamingSupported() { - return false; - }, - - read: function PDFWorkerStreamRangeReader_read() { - if (this._queuedChunk) { - return Promise.resolve({value: this._queuedChunk, done: false}); - } - if (this._done) { - return Promise.resolve({value: undefined, done: true}); - } - var requestCapability = createPromiseCapability(); - this._requests.push(requestCapability); - return requestCapability.promise; - }, - - cancel: function PDFWorkerStreamRangeReader_cancel(reason) { - this._done = true; - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - this._stream._removeRangeReader(this); - } - }; - - return PDFWorkerStream; -})(); - -/** @type IPDFStream */ -var PDFNetworkStream; - -/** - * Sets PDFNetworkStream class to be used as alternative PDF data transport. - * @param {IPDFStream} cls - the PDF data transport. - */ -function setPDFNetworkStreamClass(cls) { - PDFNetworkStream = cls; -} - -var WorkerMessageHandler = { - setup: function wphSetup(handler, port) { - var testMessageProcessed = false; - handler.on('test', function wphSetupTest(data) { - if (testMessageProcessed) { - return; // we already processed 'test' message once - } - testMessageProcessed = true; - - // check if Uint8Array can be sent to worker - if (!(data instanceof Uint8Array)) { - handler.send('test', 'main', false); - return; - } - // making sure postMessage transfers are working - var supportTransfers = data[0] === 255; - handler.postMessageTransfers = supportTransfers; - // check if the response property is supported by xhr - var xhr = new XMLHttpRequest(); - var responseExists = 'response' in xhr; - // check if the property is actually implemented - try { - var dummy = xhr.responseType; - } catch (e) { - responseExists = false; - } - if (!responseExists) { - handler.send('test', false); - return; - } - handler.send('test', { - supportTypedArray: true, - supportTransfers: supportTransfers - }); - }); - - handler.on('configure', function wphConfigure(data) { - setVerbosityLevel(data.verbosity); - }); - - handler.on('GetDocRequest', function wphSetupDoc(data) { - return WorkerMessageHandler.createDocumentHandler(data, port); - }); - }, - createDocumentHandler: function wphCreateDocumentHandler(docParams, port) { - // This context is actually holds references on pdfManager and handler, - // until the latter is destroyed. - var pdfManager; - var terminated = false; - var cancelXHRs = null; - var WorkerTasks = []; - - var docId = docParams.docId; - var workerHandlerName = docParams.docId + '_worker'; - var handler = new MessageHandler(workerHandlerName, docId, port); - - // Ensure that postMessage transfers are correctly enabled/disabled, - // to prevent "DataCloneError" in older versions of IE (see issue 6957). - handler.postMessageTransfers = docParams.postMessageTransfers; - - function ensureNotTerminated() { - if (terminated) { - throw new Error('Worker was terminated'); - } - } - - function startWorkerTask(task) { - WorkerTasks.push(task); - } - - function finishWorkerTask(task) { - task.finish(); - var i = WorkerTasks.indexOf(task); - WorkerTasks.splice(i, 1); - } - - function loadDocument(recoveryMode) { - var loadDocumentCapability = createPromiseCapability(); - - var parseSuccess = function parseSuccess() { - var numPagesPromise = pdfManager.ensureDoc('numPages'); - var fingerprintPromise = pdfManager.ensureDoc('fingerprint'); - var encryptedPromise = pdfManager.ensureXRef('encrypt'); - Promise.all([numPagesPromise, fingerprintPromise, - encryptedPromise]).then(function onDocReady(results) { - var doc = { - numPages: results[0], - fingerprint: results[1], - encrypted: !!results[2], - }; - loadDocumentCapability.resolve(doc); - }, - parseFailure); - }; - - var parseFailure = function parseFailure(e) { - loadDocumentCapability.reject(e); - }; - - pdfManager.ensureDoc('checkHeader', []).then(function() { - pdfManager.ensureDoc('parseStartXRef', []).then(function() { - pdfManager.ensureDoc('parse', [recoveryMode]).then( - parseSuccess, parseFailure); - }, parseFailure); - }, parseFailure); - - return loadDocumentCapability.promise; - } - - function getPdfManager(data, evaluatorOptions) { - var pdfManagerCapability = createPromiseCapability(); - var pdfManager; - - var source = data.source; - if (source.data) { - try { - pdfManager = new LocalPdfManager(docId, source.data, source.password, - evaluatorOptions); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - return pdfManagerCapability.promise; - } - - var pdfStream; - try { - if (source.chunkedViewerLoading) { - pdfStream = new PDFWorkerStream(source, handler); - } else { - assert(PDFNetworkStream, 'pdfjs/core/network module is not loaded'); - pdfStream = new PDFNetworkStream(data); - } - } catch (ex) { - pdfManagerCapability.reject(ex); - return pdfManagerCapability.promise; - } - - var fullRequest = pdfStream.getFullReader(); - fullRequest.headersReady.then(function () { - if (!fullRequest.isStreamingSupported || - !fullRequest.isRangeSupported) { - // If stream or range are disabled, it's our only way to report - // loading progress. - fullRequest.onProgress = function (evt) { - handler.send('DocProgress', { - loaded: evt.loaded, - total: evt.total - }); - }; - } - - if (!fullRequest.isRangeSupported) { - return; - } - - // We don't need auto-fetch when streaming is enabled. - var disableAutoFetch = source.disableAutoFetch || - fullRequest.isStreamingSupported; - pdfManager = new NetworkPdfManager(docId, pdfStream, { - msgHandler: handler, - url: source.url, - password: source.password, - length: fullRequest.contentLength, - disableAutoFetch: disableAutoFetch, - rangeChunkSize: source.rangeChunkSize - }, evaluatorOptions); - pdfManagerCapability.resolve(pdfManager); - cancelXHRs = null; - }).catch(function (reason) { - pdfManagerCapability.reject(reason); - cancelXHRs = null; - }); - - var cachedChunks = [], loaded = 0; - var flushChunks = function () { - var pdfFile = arraysToBytes(cachedChunks); - if (source.length && pdfFile.length !== source.length) { - warn('reported HTTP length is different from actual'); - } - // the data is array, instantiating directly from it - try { - pdfManager = new LocalPdfManager(docId, pdfFile, source.password, - evaluatorOptions); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - cachedChunks = []; - }; - var readPromise = new Promise(function (resolve, reject) { - var readChunk = function (chunk) { - try { - ensureNotTerminated(); - if (chunk.done) { - if (!pdfManager) { - flushChunks(); - } - cancelXHRs = null; - return; - } - - var data = chunk.value; - loaded += arrayByteLength(data); - if (!fullRequest.isStreamingSupported) { - handler.send('DocProgress', { - loaded: loaded, - total: Math.max(loaded, fullRequest.contentLength || 0) - }); - } - - if (pdfManager) { - pdfManager.sendProgressiveData(data); - } else { - cachedChunks.push(data); - } - - fullRequest.read().then(readChunk, reject); - } catch (e) { - reject(e); - } - }; - fullRequest.read().then(readChunk, reject); - }); - readPromise.catch(function (e) { - pdfManagerCapability.reject(e); - cancelXHRs = null; - }); - - cancelXHRs = function () { - pdfStream.cancelAllRequests('abort'); - }; - - return pdfManagerCapability.promise; - } - - var setupDoc = function(data) { - var onSuccess = function(doc) { - ensureNotTerminated(); - handler.send('GetDoc', { pdfInfo: doc }); - }; - - var onFailure = function(e) { - if (e instanceof PasswordException) { - if (e.code === PasswordResponses.NEED_PASSWORD) { - handler.send('NeedPassword', e); - } else if (e.code === PasswordResponses.INCORRECT_PASSWORD) { - handler.send('IncorrectPassword', e); - } - } else if (e instanceof InvalidPDFException) { - handler.send('InvalidPDF', e); - } else if (e instanceof MissingPDFException) { - handler.send('MissingPDF', e); - } else if (e instanceof UnexpectedResponseException) { - handler.send('UnexpectedResponse', e); - } else { - handler.send('UnknownError', - new UnknownErrorException(e.message, e.toString())); - } - }; - - ensureNotTerminated(); - - var cMapOptions = { - url: data.cMapUrl === undefined ? null : data.cMapUrl, - packed: data.cMapPacked === true - }; - var evaluatorOptions = { - forceDataSchema: data.disableCreateObjectURL, - maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize, - disableFontFace: data.disableFontFace, - cMapOptions: cMapOptions - }; - - getPdfManager(data, evaluatorOptions).then(function (newPdfManager) { - if (terminated) { - // We were in a process of setting up the manager, but it got - // terminated in the middle. - newPdfManager.terminate(); - throw new Error('Worker was terminated'); - } - - pdfManager = newPdfManager; - handler.send('PDFManagerReady', null); - pdfManager.onLoadedStream().then(function(stream) { - handler.send('DataLoaded', { length: stream.bytes.byteLength }); - }); - }).then(function pdfManagerReady() { - ensureNotTerminated(); - - loadDocument(false).then(onSuccess, function loadFailure(ex) { - ensureNotTerminated(); - - // Try again with recoveryMode == true - if (!(ex instanceof XRefParseException)) { - if (ex instanceof PasswordException) { - // after password exception prepare to receive a new password - // to repeat loading - pdfManager.passwordChanged().then(pdfManagerReady); - } - - onFailure(ex); - return; - } - - pdfManager.requestLoadedStream(); - pdfManager.onLoadedStream().then(function() { - ensureNotTerminated(); - - loadDocument(true).then(onSuccess, onFailure); - }); - }, onFailure); - }, onFailure); - }; - - handler.on('GetPage', function wphSetupGetPage(data) { - return pdfManager.getPage(data.pageIndex).then(function(page) { - var rotatePromise = pdfManager.ensure(page, 'rotate'); - var refPromise = pdfManager.ensure(page, 'ref'); - var viewPromise = pdfManager.ensure(page, 'view'); - - return Promise.all([rotatePromise, refPromise, viewPromise]).then( - function(results) { - return { - rotate: results[0], - ref: results[1], - view: results[2] - }; - }); - }); - }); - - handler.on('GetPageIndex', function wphSetupGetPageIndex(data) { - var ref = new Ref(data.ref.num, data.ref.gen); - var catalog = pdfManager.pdfDocument.catalog; - return catalog.getPageIndex(ref); - }); - - handler.on('GetDestinations', - function wphSetupGetDestinations(data) { - return pdfManager.ensureCatalog('destinations'); - } - ); - - handler.on('GetDestination', - function wphSetupGetDestination(data) { - return pdfManager.ensureCatalog('getDestination', [data.id]); - } - ); - - handler.on('GetPageLabels', - function wphSetupGetPageLabels(data) { - return pdfManager.ensureCatalog('pageLabels'); - } - ); - - handler.on('GetAttachments', - function wphSetupGetAttachments(data) { - return pdfManager.ensureCatalog('attachments'); - } - ); - - handler.on('GetJavaScript', - function wphSetupGetJavaScript(data) { - return pdfManager.ensureCatalog('javaScript'); - } - ); - - handler.on('GetOutline', - function wphSetupGetOutline(data) { - return pdfManager.ensureCatalog('documentOutline'); - } - ); - - handler.on('GetMetadata', - function wphSetupGetMetadata(data) { - return Promise.all([pdfManager.ensureDoc('documentInfo'), - pdfManager.ensureCatalog('metadata')]); - } - ); - - handler.on('GetData', function wphSetupGetData(data) { - pdfManager.requestLoadedStream(); - return pdfManager.onLoadedStream().then(function(stream) { - return stream.bytes; - }); - }); - - handler.on('GetStats', - function wphSetupGetStats(data) { - return pdfManager.pdfDocument.xref.stats; - } - ); - - handler.on('UpdatePassword', function wphSetupUpdatePassword(data) { - pdfManager.updatePassword(data); - }); - - handler.on('GetAnnotations', function wphSetupGetAnnotations(data) { - return pdfManager.getPage(data.pageIndex).then(function(page) { - return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]); - }); - }); - - handler.on('RenderPageRequest', function wphSetupRenderPage(data) { - var pageIndex = data.pageIndex; - pdfManager.getPage(pageIndex).then(function(page) { - var task = new WorkerTask('RenderPageRequest: page ' + pageIndex); - startWorkerTask(task); - - var pageNum = pageIndex + 1; - var start = Date.now(); - // Pre compile the pdf page and fetch the fonts/images. - page.getOperatorList(handler, task, data.intent, - data.renderInteractiveForms).then( - function(operatorList) { - finishWorkerTask(task); - - info('page=' + pageNum + ' - getOperatorList: time=' + - (Date.now() - start) + 'ms, len=' + operatorList.totalLength); - }, function(e) { - finishWorkerTask(task); - if (task.terminated) { - return; // ignoring errors from the terminated thread - } - - // For compatibility with older behavior, generating unknown - // unsupported feature notification on errors. - handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.unknown}); - - var minimumStackMessage = - 'worker.js: while trying to getPage() and getOperatorList()'; - - var wrappedException; - - // Turn the error into an obj that can be serialized - if (typeof e === 'string') { - wrappedException = { - message: e, - stack: minimumStackMessage - }; - } else if (typeof e === 'object') { - wrappedException = { - message: e.message || e.toString(), - stack: e.stack || minimumStackMessage - }; - } else { - wrappedException = { - message: 'Unknown exception type: ' + (typeof e), - stack: minimumStackMessage - }; - } - - handler.send('PageError', { - pageNum: pageNum, - error: wrappedException, - intent: data.intent - }); - }); - }); - }, this); - - handler.on('GetTextContent', function wphExtractText(data) { - var pageIndex = data.pageIndex; - var normalizeWhitespace = data.normalizeWhitespace; - var combineTextItems = data.combineTextItems; - return pdfManager.getPage(pageIndex).then(function(page) { - var task = new WorkerTask('GetTextContent: page ' + pageIndex); - startWorkerTask(task); - var pageNum = pageIndex + 1; - var start = Date.now(); - return page.extractTextContent(task, normalizeWhitespace, - combineTextItems).then( - function(textContent) { - finishWorkerTask(task); - info('text indexing: page=' + pageNum + ' - time=' + - (Date.now() - start) + 'ms'); - return textContent; - }, function (reason) { - finishWorkerTask(task); - if (task.terminated) { - return; // ignoring errors from the terminated thread - } - throw reason; - }); - }); - }); - - handler.on('Cleanup', function wphCleanup(data) { - return pdfManager.cleanup(); - }); - - handler.on('Terminate', function wphTerminate(data) { - terminated = true; - if (pdfManager) { - pdfManager.terminate(); - pdfManager = null; - } - if (cancelXHRs) { - cancelXHRs(); - } - - var waitOn = []; - WorkerTasks.forEach(function (task) { - waitOn.push(task.finished); - task.terminate(); - }); - - return Promise.all(waitOn).then(function () { - // Notice that even if we destroying handler, resolved response promise - // must be sent back. - handler.destroy(); - handler = null; - }); - }); - - handler.on('Ready', function wphReady(data) { - setupDoc(docParams); - docParams = null; // we don't need docParams anymore -- saving memory. - }); - return workerHandlerName; - } -}; - -function initializeWorker() { - if (!('console' in globalScope)) { - var consoleTimer = {}; - - var workerConsole = { - log: function log() { - var args = Array.prototype.slice.call(arguments); - globalScope.postMessage({ - targetName: 'main', - action: 'console_log', - data: args - }); - }, - - error: function error() { - var args = Array.prototype.slice.call(arguments); - globalScope.postMessage({ - targetName: 'main', - action: 'console_error', - data: args - }); - throw 'pdf.js execution error'; - }, - - time: function time(name) { - consoleTimer[name] = Date.now(); - }, - - timeEnd: function timeEnd(name) { - var time = consoleTimer[name]; - if (!time) { - error('Unknown timer name ' + name); - } - this.log('Timer:', name, Date.now() - time); - } - }; - - globalScope.console = workerConsole; - } - - var handler = new MessageHandler('worker', 'main', self); - WorkerMessageHandler.setup(handler, self); - handler.send('ready', null); -} - -// Worker thread (and not node.js)? -if (typeof window === 'undefined' && - !(typeof module !== 'undefined' && module.require)) { - initializeWorker(); -} - -exports.setPDFNetworkStreamClass = setPDFNetworkStreamClass; -exports.WorkerTask = WorkerTask; -exports.WorkerMessageHandler = WorkerMessageHandler; -})); - - - - -var NetworkManager = (function NetworkManagerClosure() { - - var OK_RESPONSE = 200; - var PARTIAL_CONTENT_RESPONSE = 206; - - function NetworkManager(url, args) { - this.url = url; - args = args || {}; - this.isHttp = /^https?:/i.test(url); - this.httpHeaders = (this.isHttp && args.httpHeaders) || {}; - this.withCredentials = args.withCredentials || false; - this.getXhr = args.getXhr || - function NetworkManager_getXhr() { - return new XMLHttpRequest(); - }; - - this.currXhrId = 0; - this.pendingRequests = Object.create(null); - this.loadedRequests = Object.create(null); - } - - function getArrayBuffer(xhr) { - var data = xhr.response; - if (typeof data !== 'string') { - return data; - } - var length = data.length; - var array = new Uint8Array(length); - for (var i = 0; i < length; i++) { - array[i] = data.charCodeAt(i) & 0xFF; - } - return array.buffer; - } - - var supportsMozChunked = (function supportsMozChunkedClosure() { - try { - var x = new XMLHttpRequest(); - // Firefox 37- required .open() to be called before setting responseType. - // https://bugzilla.mozilla.org/show_bug.cgi?id=707484 - // Even though the URL is not visited, .open() could fail if the URL is - // blocked, e.g. via the connect-src CSP directive or the NoScript addon. - // When this error occurs, this feature detection method will mistakenly - // report that moz-chunked-arraybuffer is not supported in Firefox 37-. - x.open('GET', 'https://example.com'); - x.responseType = 'moz-chunked-arraybuffer'; - return x.responseType === 'moz-chunked-arraybuffer'; - } catch (e) { - return false; - } - })(); - - NetworkManager.prototype = { - requestRange: function NetworkManager_requestRange(begin, end, listeners) { - var args = { - begin: begin, - end: end - }; - for (var prop in listeners) { - args[prop] = listeners[prop]; - } - return this.request(args); - }, - - requestFull: function NetworkManager_requestFull(listeners) { - return this.request(listeners); - }, - - request: function NetworkManager_request(args) { - var xhr = this.getXhr(); - var xhrId = this.currXhrId++; - var pendingRequest = this.pendingRequests[xhrId] = { - xhr: xhr - }; - - xhr.open('GET', this.url); - xhr.withCredentials = this.withCredentials; - for (var property in this.httpHeaders) { - var value = this.httpHeaders[property]; - if (typeof value === 'undefined') { - continue; - } - xhr.setRequestHeader(property, value); - } - if (this.isHttp && 'begin' in args && 'end' in args) { - var rangeStr = args.begin + '-' + (args.end - 1); - xhr.setRequestHeader('Range', 'bytes=' + rangeStr); - pendingRequest.expectedStatus = 206; - } else { - pendingRequest.expectedStatus = 200; - } - - var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData; - if (useMozChunkedLoading) { - xhr.responseType = 'moz-chunked-arraybuffer'; - pendingRequest.onProgressiveData = args.onProgressiveData; - pendingRequest.mozChunked = true; - } else { - xhr.responseType = 'arraybuffer'; - } - - if (args.onError) { - xhr.onerror = function(evt) { - args.onError(xhr.status); - }; - } - xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); - xhr.onprogress = this.onProgress.bind(this, xhrId); - - pendingRequest.onHeadersReceived = args.onHeadersReceived; - pendingRequest.onDone = args.onDone; - pendingRequest.onError = args.onError; - pendingRequest.onProgress = args.onProgress; - - xhr.send(null); - - return xhrId; - }, - - onProgress: function NetworkManager_onProgress(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - // Maybe abortRequest was called... - return; - } - - if (pendingRequest.mozChunked) { - var chunk = getArrayBuffer(pendingRequest.xhr); - pendingRequest.onProgressiveData(chunk); - } - - var onProgress = pendingRequest.onProgress; - if (onProgress) { - onProgress(evt); - } - }, - - onStateChange: function NetworkManager_onStateChange(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - // Maybe abortRequest was called... - return; - } - - var xhr = pendingRequest.xhr; - if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { - pendingRequest.onHeadersReceived(); - delete pendingRequest.onHeadersReceived; - } - - if (xhr.readyState !== 4) { - return; - } - - if (!(xhrId in this.pendingRequests)) { - // The XHR request might have been aborted in onHeadersReceived() - // callback, in which case we should abort request - return; - } - - delete this.pendingRequests[xhrId]; - - // success status == 0 can be on ftp, file and other protocols - if (xhr.status === 0 && this.isHttp) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - return; - } - var xhrStatus = xhr.status || OK_RESPONSE; - - // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2: - // "A server MAY ignore the Range header". This means it's possible to - // get a 200 rather than a 206 response from a range request. - var ok_response_on_range_request = - xhrStatus === OK_RESPONSE && - pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; - - if (!ok_response_on_range_request && - xhrStatus !== pendingRequest.expectedStatus) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - return; - } - - this.loadedRequests[xhrId] = true; - - var chunk = getArrayBuffer(xhr); - if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { - var rangeHeader = xhr.getResponseHeader('Content-Range'); - var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); - var begin = parseInt(matches[1], 10); - pendingRequest.onDone({ - begin: begin, - chunk: chunk - }); - } else if (pendingRequest.onProgressiveData) { - pendingRequest.onDone(null); - } else if (chunk) { - pendingRequest.onDone({ - begin: 0, - chunk: chunk - }); - } else if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - }, - - hasPendingRequests: function NetworkManager_hasPendingRequests() { - for (var xhrId in this.pendingRequests) { - return true; - } - return false; - }, - - getRequestXhr: function NetworkManager_getXhr(xhrId) { - return this.pendingRequests[xhrId].xhr; - }, - - isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) { - return !!(this.pendingRequests[xhrId].onProgressiveData); - }, - - isPendingRequest: function NetworkManager_isPendingRequest(xhrId) { - return xhrId in this.pendingRequests; - }, - - isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) { - return xhrId in this.loadedRequests; - }, - - abortAllRequests: function NetworkManager_abortAllRequests() { - for (var xhrId in this.pendingRequests) { - this.abortRequest(xhrId | 0); - } - }, - - abortRequest: function NetworkManager_abortRequest(xhrId) { - var xhr = this.pendingRequests[xhrId].xhr; - delete this.pendingRequests[xhrId]; - xhr.abort(); - } - }; - - return NetworkManager; -})(); - -(function (root, factory) { - { - factory((root.pdfjsCoreNetwork = {}), root.pdfjsSharedUtil, - root.pdfjsCoreWorker); - } -}(this, function (exports, sharedUtil, coreWorker) { - - var assert = sharedUtil.assert; - var createPromiseCapability = sharedUtil.createPromiseCapability; - var isInt = sharedUtil.isInt; - var MissingPDFException = sharedUtil.MissingPDFException; - var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; - - /** @implements {IPDFStream} */ - function PDFNetworkStream(options) { - this._options = options; - var source = options.source; - this._manager = new NetworkManager(source.url, { - httpHeaders: source.httpHeaders, - withCredentials: source.withCredentials - }); - this._rangeChunkSize = source.rangeChunkSize; - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } - - PDFNetworkStream.prototype = { - _onRangeRequestReaderClosed: - function PDFNetworkStream_onRangeRequestReaderClosed(reader) { - var i = this._rangeRequestReaders.indexOf(reader); - if (i >= 0) { - this._rangeRequestReaders.splice(i, 1); - } - }, - - getFullReader: function PDFNetworkStream_getFullReader() { - assert(!this._fullRequestReader); - this._fullRequestReader = - new PDFNetworkStreamFullRequestReader(this._manager, this._options); - return this._fullRequestReader; - }, - - getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) { - var reader = new PDFNetworkStreamRangeRequestReader(this._manager, - begin, end); - reader.onClosed = this._onRangeRequestReaderClosed.bind(this); - this._rangeRequestReaders.push(reader); - return reader; - }, - - cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) { - if (this._fullRequestReader) { - this._fullRequestReader.cancel(reason); - } - var readers = this._rangeRequestReaders.slice(0); - readers.forEach(function (reader) { - reader.cancel(reason); - }); - } - }; - - /** @implements {IPDFStreamReader} */ - function PDFNetworkStreamFullRequestReader(manager, options) { - this._manager = manager; - - var source = options.source; - var args = { - onHeadersReceived: this._onHeadersReceived.bind(this), - onProgressiveData: source.disableStream ? null : - this._onProgressiveData.bind(this), - onDone: this._onDone.bind(this), - onError: this._onError.bind(this), - onProgress: this._onProgress.bind(this) - }; - this._url = source.url; - this._fullRequestId = manager.requestFull(args); - this._headersReceivedCapability = createPromiseCapability(); - this._disableRange = options.disableRange || false; - this._contentLength = source.length; // optional - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - - this._isStreamingSupported = false; - this._isRangeSupported = false; - - this._cachedChunks = []; - this._requests = []; - this._done = false; - this._storedError = undefined; - - this.onProgress = null; - } - - PDFNetworkStreamFullRequestReader.prototype = { - _validateRangeRequestCapabilities: function - PDFNetworkStreamFullRequestReader_validateRangeRequestCapabilities() { - - if (this._disableRange) { - return false; - } - - var networkManager = this._manager; - var fullRequestXhrId = this._fullRequestId; - var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId); - if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') { - return false; - } - - var contentEncoding = - fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity'; - if (contentEncoding !== 'identity') { - return false; - } - - var length = fullRequestXhr.getResponseHeader('Content-Length'); - length = parseInt(length, 10); - if (!isInt(length)) { - return false; - } - - this._contentLength = length; // setting right content length - - if (length <= 2 * this._rangeChunkSize) { - // The file size is smaller than the size of two chunks, so it does - // not make any sense to abort the request and retry with a range - // request. - return false; - } - - return true; - }, - - _onHeadersReceived: - function PDFNetworkStreamFullRequestReader_onHeadersReceived() { - - if (this._validateRangeRequestCapabilities()) { - this._isRangeSupported = true; - } - - var networkManager = this._manager; - var fullRequestXhrId = this._fullRequestId; - if (networkManager.isStreamingRequest(fullRequestXhrId)) { - // We can continue fetching when progressive loading is enabled, - // and we don't need the autoFetch feature. - this._isStreamingSupported = true; - } else if (this._isRangeSupported) { - // NOTE: by cancelling the full request, and then issuing range - // requests, there will be an issue for sites where you can only - // request the pdf once. However, if this is the case, then the - // server should not be returning that it can support range - // requests. - networkManager.abortRequest(fullRequestXhrId); - } - - this._headersReceivedCapability.resolve(); - }, - - _onProgressiveData: - function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) { - if (this._requests.length > 0) { - var requestCapability = this._requests.shift(); - requestCapability.resolve({value: chunk, done: false}); - } else { - this._cachedChunks.push(chunk); - } - }, - - _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) { - if (args) { - this._onProgressiveData(args.chunk); - } - this._done = true; - if (this._cachedChunks.length > 0) { - return; - } - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - }, - - _onError: function PDFNetworkStreamFullRequestReader_onError(status) { - var url = this._url; - var exception; - if (status === 404 || status === 0 && /^file:/.test(url)) { - exception = new MissingPDFException('Missing PDF "' + url + '".'); - } else { - exception = new UnexpectedResponseException( - 'Unexpected server response (' + status + - ') while retrieving PDF "' + url + '".', status); - } - this._storedError = exception; - this._headersReceivedCapability.reject(exception); - this._requests.forEach(function (requestCapability) { - requestCapability.reject(exception); - }); - this._requests = []; - this._cachedChunks = []; - }, - - _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) { - if (this.onProgress) { - this.onProgress({ - loaded: data.loaded, - total: data.lengthComputable ? data.total : this._contentLength - }); - } - }, - - get isRangeSupported() { - return this._isRangeSupported; - }, - - get isStreamingSupported() { - return this._isStreamingSupported; - }, - - get contentLength() { - return this._contentLength; - }, - - get headersReady() { - return this._headersReceivedCapability.promise; - }, - - read: function PDFNetworkStreamFullRequestReader_read() { - if (this._storedError) { - return Promise.reject(this._storedError); - } - if (this._cachedChunks.length > 0) { - var chunk = this._cachedChunks.shift(); - return Promise.resolve(chunk); - } - if (this._done) { - return Promise.resolve({value: undefined, done: true}); - } - var requestCapability = createPromiseCapability(); - this._requests.push(requestCapability); - return requestCapability.promise; - }, - - cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) { - this._done = true; - this._headersReceivedCapability.reject(reason); - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - if (this._manager.isPendingRequest(this._fullRequestId)) { - this._manager.abortRequest(this._fullRequestId); - } - this._fullRequestReader = null; - } - }; - - /** @implements {IPDFStreamRangeReader} */ - function PDFNetworkStreamRangeRequestReader(manager, begin, end) { - this._manager = manager; - var args = { - onDone: this._onDone.bind(this), - onProgress: this._onProgress.bind(this) - }; - this._requestId = manager.requestRange(begin, end, args); - this._requests = []; - this._queuedChunk = null; - this._done = false; - - this.onProgress = null; - this.onClosed = null; - } - - PDFNetworkStreamRangeRequestReader.prototype = { - _close: function PDFNetworkStreamRangeRequestReader_close() { - if (this.onClosed) { - this.onClosed(this); - } - }, - - _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) { - var chunk = data.chunk; - if (this._requests.length > 0) { - var requestCapability = this._requests.shift(); - requestCapability.resolve({value: chunk, done: false}); - } else { - this._queuedChunk = chunk; - } - this._done = true; - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - this._close(); - }, - - _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) { - if (!this.isStreamingSupported && this.onProgress) { - this.onProgress({ - loaded: evt.loaded - }); - } - }, - - get isStreamingSupported() { - return false; // TODO allow progressive range bytes loading - }, - - read: function PDFNetworkStreamRangeRequestReader_read() { - if (this._queuedChunk !== null) { - var chunk = this._queuedChunk; - this._queuedChunk = null; - return Promise.resolve({value: chunk, done: false}); - } - if (this._done) { - return Promise.resolve({value: undefined, done: true}); - } - var requestCapability = createPromiseCapability(); - this._requests.push(requestCapability); - return requestCapability.promise; - }, - - cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) { - this._done = true; - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - if (this._manager.isPendingRequest(this._requestId)) { - this._manager.abortRequest(this._requestId); - } - this._close(); - } - }; - - coreWorker.setPDFNetworkStreamClass(PDFNetworkStream); - - exports.PDFNetworkStream = PDFNetworkStream; - exports.NetworkManager = NetworkManager; -})); - }).call(pdfjsLibs); - - exports.WorkerMessageHandler = pdfjsLibs.pdfjsCoreWorker.WorkerMessageHandler; -})); - diff --git a/dist/js/pdf.worker.min.js b/dist/js/pdf.worker.min.js deleted file mode 100644 index 7ac3468a..00000000 --- a/dist/js/pdf.worker.min.js +++ /dev/null @@ -1,28 +0,0 @@ -(function(root,factory){"use strict";if(typeof define==="function"&&define.amd){define("pdfjs-dist/build/pdf.worker",["exports"],factory)}else if(typeof exports!=="undefined"){factory(exports)}else{factory(root.pdfjsDistBuildPdfWorker={})}})(this,function(exports){"use strict";var pdfjsVersion="1.6.210";var pdfjsBuild="4ce2356";var pdfjsFilePath=typeof document!=="undefined"&&document.currentScript?document.currentScript.src:null;var pdfjsLibs={};(function pdfjsWrapper(){(function(root,factory){{factory(root.pdfjsCoreArithmeticDecoder={})}})(this,function(exports){var ArithmeticDecoder=function ArithmeticDecoderClosure(){var QeTable=[{qe:22017,nmps:1,nlps:1,switchFlag:1},{qe:13313,nmps:2,nlps:6,switchFlag:0},{qe:6145,nmps:3,nlps:9,switchFlag:0},{qe:2753,nmps:4,nlps:12,switchFlag:0},{qe:1313,nmps:5,nlps:29,switchFlag:0},{qe:545,nmps:38,nlps:33,switchFlag:0},{qe:22017,nmps:7,nlps:6,switchFlag:1},{qe:21505,nmps:8,nlps:14,switchFlag:0},{qe:18433,nmps:9,nlps:14,switchFlag:0},{qe:14337,nmps:10,nlps:14,switchFlag:0},{qe:12289,nmps:11,nlps:17,switchFlag:0},{qe:9217,nmps:12,nlps:18,switchFlag:0},{qe:7169,nmps:13,nlps:20,switchFlag:0},{qe:5633,nmps:29,nlps:21,switchFlag:0},{qe:22017,nmps:15,nlps:14,switchFlag:1},{qe:21505,nmps:16,nlps:14,switchFlag:0},{qe:20737,nmps:17,nlps:15,switchFlag:0},{qe:18433,nmps:18,nlps:16,switchFlag:0},{qe:14337,nmps:19,nlps:17,switchFlag:0},{qe:13313,nmps:20,nlps:18,switchFlag:0},{qe:12289,nmps:21,nlps:19,switchFlag:0},{qe:10241,nmps:22,nlps:19,switchFlag:0},{qe:9217,nmps:23,nlps:20,switchFlag:0},{qe:8705,nmps:24,nlps:21,switchFlag:0},{qe:7169,nmps:25,nlps:22,switchFlag:0},{qe:6145,nmps:26,nlps:23,switchFlag:0},{qe:5633,nmps:27,nlps:24,switchFlag:0},{qe:5121,nmps:28,nlps:25,switchFlag:0},{qe:4609,nmps:29,nlps:26,switchFlag:0},{qe:4353,nmps:30,nlps:27,switchFlag:0},{qe:2753,nmps:31,nlps:28,switchFlag:0},{qe:2497,nmps:32,nlps:29,switchFlag:0},{qe:2209,nmps:33,nlps:30,switchFlag:0},{qe:1313,nmps:34,nlps:31,switchFlag:0},{qe:1089,nmps:35,nlps:32,switchFlag:0},{qe:673,nmps:36,nlps:33,switchFlag:0},{qe:545,nmps:37,nlps:34,switchFlag:0},{qe:321,nmps:38,nlps:35,switchFlag:0},{qe:273,nmps:39,nlps:36,switchFlag:0},{qe:133,nmps:40,nlps:37,switchFlag:0},{qe:73,nmps:41,nlps:38,switchFlag:0},{qe:37,nmps:42,nlps:39,switchFlag:0},{qe:21,nmps:43,nlps:40,switchFlag:0},{qe:9,nmps:44,nlps:41,switchFlag:0},{qe:5,nmps:45,nlps:42,switchFlag:0},{qe:1,nmps:45,nlps:43,switchFlag:0},{qe:22017,nmps:46,nlps:46,switchFlag:0}];function ArithmeticDecoder(data,start,end){this.data=data;this.bp=start;this.dataEnd=end;this.chigh=data[start];this.clow=0;this.byteIn();this.chigh=this.chigh<<7&65535|this.clow>>9&127;this.clow=this.clow<<7&65535;this.ct-=7;this.a=32768}ArithmeticDecoder.prototype={byteIn:function ArithmeticDecoder_byteIn(){var data=this.data;var bp=this.bp;if(data[bp]===255){var b1=data[bp+1];if(b1>143){this.clow+=65280;this.ct=8}else{bp++;this.clow+=data[bp]<<9;this.ct=7;this.bp=bp}}else{bp++;this.clow+=bp65535){this.chigh+=this.clow>>16;this.clow&=65535}},readBit:function ArithmeticDecoder_readBit(contexts,pos){var cx_index=contexts[pos]>>1,cx_mps=contexts[pos]&1;var qeTableIcx=QeTable[cx_index];var qeIcx=qeTableIcx.qe;var d;var a=this.a-qeIcx;if(this.chigh>15&1;this.clow=this.clow<<1&65535;this.ct--}while((a&32768)===0);this.a=a;contexts[pos]=cx_index<<1|cx_mps;return d}};return ArithmeticDecoder}();exports.ArithmeticDecoder=ArithmeticDecoder});(function(root,factory){{factory(root.pdfjsCoreBidi={})}})(this,function(exports){var baseTypes=["BN","BN","BN","BN","BN","BN","BN","BN","BN","S","B","S","WS","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","B","B","B","S","WS","ON","ON","ET","ET","ET","ON","ON","ON","ON","ON","ON","CS","ON","CS","ON","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","ON","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","BN","BN","BN","BN","BN","BN","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","CS","ON","ET","ET","ET","ET","ON","ON","ON","ON","L","ON","ON","ON","ON","ON","ET","ET","EN","EN","ON","L","ON","ON","ON","EN","L","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L"];var arabicTypes=["AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","CS","AL","ON","ON","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","AL","AL","AL","AL","AL","AN","AN","AN","AN","AN","AN","AN","AN","AN","AN","ET","AN","AN","AL","AL","AL","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","ON","NSM","NSM","NSM","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL"];function isOdd(i){return(i&1)!==0}function isEven(i){return(i&1)===0}function findUnequal(arr,start,value){for(var j=start,jj=arr.length;j=0;--j){if(types[j]!=="ET"){break}types[j]="EN"}for(j=i+1;j0){before=types[i-1]}var after=eor;if(end+1level&&isOdd(level)){lowestOddLevel=level}}for(level=highestLevel;level>=lowestOddLevel;--level){var start=-1;for(i=0,ii=levels.length;i=0){reverseValues(chars,start,i);start=-1}}else if(start<0){start=i}}if(start>=0){reverseValues(chars,start,levels.length)}}for(i=0,ii=chars.length;i"){chars[i]=""}}return createBidiText(chars.join(""),isLTR)}exports.bidi=bidi});(function(root,factory){{factory(root.pdfjsCoreCharsets={})}})(this,function(exports){var ISOAdobeCharset=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron"];var ExpertCharset=[".notdef","space","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"];var ExpertSubsetCharset=[".notdef","space","dollaroldstyle","dollarsuperior","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","hyphensuperior","colonmonetary","onefitted","rupiah","centoldstyle","figuredash","hypheninferior","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior"];exports.ISOAdobeCharset=ISOAdobeCharset;exports.ExpertCharset=ExpertCharset;exports.ExpertSubsetCharset=ExpertSubsetCharset});(function(root,factory){{factory(root.pdfjsCoreEncodings={})}})(this,function(exports){var ExpertEncoding=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","","asuperior","bsuperior","centsuperior","dsuperior","esuperior","","","isuperior","","","lsuperior","msuperior","nsuperior","osuperior","","","rsuperior","ssuperior","tsuperior","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdownsmall","centoldstyle","Lslashsmall","","","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","","Dotaccentsmall","","","Macronsmall","","","figuredash","hypheninferior","","","Ogoneksmall","Ringsmall","Cedillasmall","","","","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"];var MacExpertEncoding=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","centoldstyle","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","","threequartersemdash","","questionsmall","","","","","Ethsmall","","","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","","","","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hypheninferior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","asuperior","centsuperior","","","","","Aacutesmall","Agravesmall","Acircumflexsmall","Adieresissmall","Atildesmall","Aringsmall","Ccedillasmall","Eacutesmall","Egravesmall","Ecircumflexsmall","Edieresissmall","Iacutesmall","Igravesmall","Icircumflexsmall","Idieresissmall","Ntildesmall","Oacutesmall","Ogravesmall","Ocircumflexsmall","Odieresissmall","Otildesmall","Uacutesmall","Ugravesmall","Ucircumflexsmall","Udieresissmall","","eightsuperior","fourinferior","threeinferior","sixinferior","eightinferior","seveninferior","Scaronsmall","","centinferior","twoinferior","","Dieresissmall","","Caronsmall","osuperior","fiveinferior","","commainferior","periodinferior","Yacutesmall","","dollarinferior","","Thornsmall","","nineinferior","zeroinferior","Zcaronsmall","AEsmall","Oslashsmall","questiondownsmall","oneinferior","Lslashsmall","","","","","","","Cedillasmall","","","","","","OEsmall","figuredash","hyphensuperior","","","","","exclamdownsmall","","Ydieresissmall","","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","ninesuperior","zerosuperior","","esuperior","rsuperior","tsuperior","","","isuperior","ssuperior","dsuperior","","","","","","lsuperior","Ogoneksmall","Brevesmall","Macronsmall","bsuperior","nsuperior","msuperior","commasuperior","periodsuperior","Dotaccentsmall","Ringsmall"];var MacRomanEncoding=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","space","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron"];var StandardEncoding=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","","endash","dagger","daggerdbl","periodcentered","","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","","questiondown","","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","","ring","cedilla","","hungarumlaut","ogonek","caron","emdash","","","","","","","","","","","","","","","","","AE","","ordfeminine","","","","","Lslash","Oslash","OE","ordmasculine","","","","","","ae","","","","dotlessi","","","lslash","oslash","oe","germandbls"];var WinAnsiEncoding=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","bullet","Euro","bullet","quotesinglbase","florin","quotedblbase","ellipsis","dagger","daggerdbl","circumflex","perthousand","Scaron","guilsinglleft","OE","bullet","Zcaron","bullet","bullet","quoteleft","quoteright","quotedblleft","quotedblright","bullet","endash","emdash","tilde","trademark","scaron","guilsinglright","oe","bullet","zcaron","Ydieresis","space","exclamdown","cent","sterling","currency","yen","brokenbar","section","dieresis","copyright","ordfeminine","guillemotleft","logicalnot","hyphen","registered","macron","degree","plusminus","twosuperior","threesuperior","acute","mu","paragraph","periodcentered","cedilla","onesuperior","ordmasculine","guillemotright","onequarter","onehalf","threequarters","questiondown","Agrave","Aacute","Acircumflex","Atilde","Adieresis","Aring","AE","Ccedilla","Egrave","Eacute","Ecircumflex","Edieresis","Igrave","Iacute","Icircumflex","Idieresis","Eth","Ntilde","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","multiply","Oslash","Ugrave","Uacute","Ucircumflex","Udieresis","Yacute","Thorn","germandbls","agrave","aacute","acircumflex","atilde","adieresis","aring","ae","ccedilla","egrave","eacute","ecircumflex","edieresis","igrave","iacute","icircumflex","idieresis","eth","ntilde","ograve","oacute","ocircumflex","otilde","odieresis","divide","oslash","ugrave","uacute","ucircumflex","udieresis","yacute","thorn","ydieresis"];var SymbolSetEncoding=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","universal","numbersign","existential","percent","ampersand","suchthat","parenleft","parenright","asteriskmath","plus","comma","minus","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","congruent","Alpha","Beta","Chi","Delta","Epsilon","Phi","Gamma","Eta","Iota","theta1","Kappa","Lambda","Mu","Nu","Omicron","Pi","Theta","Rho","Sigma","Tau","Upsilon","sigma1","Omega","Xi","Psi","Zeta","bracketleft","therefore","bracketright","perpendicular","underscore","radicalex","alpha","beta","chi","delta","epsilon","phi","gamma","eta","iota","phi1","kappa","lambda","mu","nu","omicron","pi","theta","rho","sigma","tau","upsilon","omega1","omega","xi","psi","zeta","braceleft","bar","braceright","similar","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Euro","Upsilon1","minute","lessequal","fraction","infinity","florin","club","diamond","heart","spade","arrowboth","arrowleft","arrowup","arrowright","arrowdown","degree","plusminus","second","greaterequal","multiply","proportional","partialdiff","bullet","divide","notequal","equivalence","approxequal","ellipsis","arrowvertex","arrowhorizex","carriagereturn","aleph","Ifraktur","Rfraktur","weierstrass","circlemultiply","circleplus","emptyset","intersection","union","propersuperset","reflexsuperset","notsubset","propersubset","reflexsubset","element","notelement","angle","gradient","registerserif","copyrightserif","trademarkserif","product","radical","dotmath","logicalnot","logicaland","logicalor","arrowdblboth","arrowdblleft","arrowdblup","arrowdblright","arrowdbldown","lozenge","angleleft","registersans","copyrightsans","trademarksans","summation","parenlefttp","parenleftex","parenleftbt","bracketlefttp","bracketleftex","bracketleftbt","bracelefttp","braceleftmid","braceleftbt","braceex","","angleright","integral","integraltp","integralex","integralbt","parenrighttp","parenrightex","parenrightbt","bracketrighttp","bracketrightex","bracketrightbt","bracerighttp","bracerightmid","bracerightbt"];var ZapfDingbatsEncoding=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","a1","a2","a202","a3","a4","a5","a119","a118","a117","a11","a12","a13","a14","a15","a16","a105","a17","a18","a19","a20","a21","a22","a23","a24","a25","a26","a27","a28","a6","a7","a8","a9","a10","a29","a30","a31","a32","a33","a34","a35","a36","a37","a38","a39","a40","a41","a42","a43","a44","a45","a46","a47","a48","a49","a50","a51","a52","a53","a54","a55","a56","a57","a58","a59","a60","a61","a62","a63","a64","a65","a66","a67","a68","a69","a70","a71","a72","a73","a74","a203","a75","a204","a76","a77","a78","a79","a81","a82","a83","a84","a97","a98","a99","a100","","a89","a90","a93","a94","a91","a92","a205","a85","a206","a86","a87","a88","a95","a96","","","","","","","","","","","","","","","","","","","","a101","a102","a103","a104","a106","a107","a108","a112","a111","a110","a109","a120","a121","a122","a123","a124","a125","a126","a127","a128","a129","a130","a131","a132","a133","a134","a135","a136","a137","a138","a139","a140","a141","a142","a143","a144","a145","a146","a147","a148","a149","a150","a151","a152","a153","a154","a155","a156","a157","a158","a159","a160","a161","a163","a164","a196","a165","a192","a166","a167","a168","a169","a170","a171","a172","a173","a162","a174","a175","a176","a177","a178","a179","a193","a180","a199","a181","a200","a182","","a201","a183","a184","a197","a185","a194","a198","a186","a195","a187","a188","a189","a190","a191"];function getEncoding(encodingName){switch(encodingName){case"WinAnsiEncoding":return WinAnsiEncoding;case"StandardEncoding":return StandardEncoding;case"MacRomanEncoding":return MacRomanEncoding;case"SymbolSetEncoding":return SymbolSetEncoding;case"ZapfDingbatsEncoding":return ZapfDingbatsEncoding;case"ExpertEncoding":return ExpertEncoding;case"MacExpertEncoding":return MacExpertEncoding;default:return null}}exports.WinAnsiEncoding=WinAnsiEncoding;exports.StandardEncoding=StandardEncoding;exports.MacRomanEncoding=MacRomanEncoding;exports.SymbolSetEncoding=SymbolSetEncoding;exports.ZapfDingbatsEncoding=ZapfDingbatsEncoding;exports.ExpertEncoding=ExpertEncoding;exports.getEncoding=getEncoding});(function(root,factory){{factory(root.pdfjsSharedUtil={})}})(this,function(exports){var globalScope=typeof window!=="undefined"?window:typeof global!=="undefined"?global:typeof self!=="undefined"?self:this;var FONT_IDENTITY_MATRIX=[.001,0,0,.001,0,0];var TextRenderingMode={FILL:0,STROKE:1,FILL_STROKE:2,INVISIBLE:3,FILL_ADD_TO_PATH:4,STROKE_ADD_TO_PATH:5,FILL_STROKE_ADD_TO_PATH:6,ADD_TO_PATH:7,FILL_STROKE_MASK:3,ADD_TO_PATH_FLAG:4};var ImageKind={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3};var AnnotationType={TEXT:1,LINK:2,FREETEXT:3,LINE:4,SQUARE:5,CIRCLE:6,POLYGON:7,POLYLINE:8,HIGHLIGHT:9,UNDERLINE:10,SQUIGGLY:11,STRIKEOUT:12,STAMP:13,CARET:14,INK:15,POPUP:16,FILEATTACHMENT:17,SOUND:18,MOVIE:19,WIDGET:20,SCREEN:21,PRINTERMARK:22,TRAPNET:23,WATERMARK:24,THREED:25,REDACT:26};var AnnotationFlag={INVISIBLE:1,HIDDEN:2,PRINT:4,NOZOOM:8,NOROTATE:16,NOVIEW:32,READONLY:64,LOCKED:128,TOGGLENOVIEW:256,LOCKEDCONTENTS:512};var AnnotationFieldFlag={READONLY:1,REQUIRED:2,NOEXPORT:4,MULTILINE:4096,PASSWORD:8192,NOTOGGLETOOFF:16384,RADIO:32768,PUSHBUTTON:65536,COMBO:131072,EDIT:262144,SORT:524288,FILESELECT:1048576,MULTISELECT:2097152,DONOTSPELLCHECK:4194304,DONOTSCROLL:8388608,COMB:16777216,RICHTEXT:33554432,RADIOSINUNISON:33554432,COMMITONSELCHANGE:67108864}; -var AnnotationBorderStyleType={SOLID:1,DASHED:2,BEVELED:3,INSET:4,UNDERLINE:5};var StreamType={UNKNOWN:0,FLATE:1,LZW:2,DCT:3,JPX:4,JBIG:5,A85:6,AHX:7,CCF:8,RL:9};var FontType={UNKNOWN:0,TYPE1:1,TYPE1C:2,CIDFONTTYPE0:3,CIDFONTTYPE0C:4,TRUETYPE:5,CIDFONTTYPE2:6,TYPE3:7,OPENTYPE:8,TYPE0:9,MMTYPE1:10};var VERBOSITY_LEVELS={errors:0,warnings:1,infos:5};var OPS={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91};var verbosity=VERBOSITY_LEVELS.warnings;function setVerbosityLevel(level){verbosity=level}function getVerbosityLevel(){return verbosity}function info(msg){if(verbosity>=VERBOSITY_LEVELS.infos){console.log("Info: "+msg)}}function warn(msg){if(verbosity>=VERBOSITY_LEVELS.warnings){console.log("Warning: "+msg)}}function deprecated(details){console.log("Deprecated API usage: "+details)}function error(msg){if(verbosity>=VERBOSITY_LEVELS.errors){console.log("Error: "+msg);console.log(backtrace())}throw new Error(msg)}function backtrace(){try{throw new Error}catch(e){return e.stack?e.stack.split("\n").slice(2).join("\n"):""}}function assert(cond,msg){if(!cond){error(msg)}}var UNSUPPORTED_FEATURES={unknown:"unknown",forms:"forms",javaScript:"javaScript",smask:"smask",shadingPattern:"shadingPattern",font:"font"};function isSameOrigin(baseUrl,otherUrl){try{var base=new URL(baseUrl);if(!base.origin||base.origin==="null"){return false}}catch(e){return false}var other=new URL(otherUrl,base);return base.origin===other.origin}function isValidUrl(url,allowRelative){if(!url||typeof url!=="string"){return false}var protocol=/^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);if(!protocol){return allowRelative}protocol=protocol[0].toLowerCase();switch(protocol){case"http":case"https":case"ftp":case"mailto":case"tel":return true;default:return false}}function shadow(obj,prop,value){Object.defineProperty(obj,prop,{value:value,enumerable:true,configurable:true,writable:false});return value}function getLookupTableFactory(initializer){var lookup;return function(){if(initializer){lookup=Object.create(null);initializer(lookup);initializer=null}return lookup}}var PasswordResponses={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};var PasswordException=function PasswordExceptionClosure(){function PasswordException(msg,code){this.name="PasswordException";this.message=msg;this.code=code}PasswordException.prototype=new Error;PasswordException.constructor=PasswordException;return PasswordException}();var UnknownErrorException=function UnknownErrorExceptionClosure(){function UnknownErrorException(msg,details){this.name="UnknownErrorException";this.message=msg;this.details=details}UnknownErrorException.prototype=new Error;UnknownErrorException.constructor=UnknownErrorException;return UnknownErrorException}();var InvalidPDFException=function InvalidPDFExceptionClosure(){function InvalidPDFException(msg){this.name="InvalidPDFException";this.message=msg}InvalidPDFException.prototype=new Error;InvalidPDFException.constructor=InvalidPDFException;return InvalidPDFException}();var MissingPDFException=function MissingPDFExceptionClosure(){function MissingPDFException(msg){this.name="MissingPDFException";this.message=msg}MissingPDFException.prototype=new Error;MissingPDFException.constructor=MissingPDFException;return MissingPDFException}();var UnexpectedResponseException=function UnexpectedResponseExceptionClosure(){function UnexpectedResponseException(msg,status){this.name="UnexpectedResponseException";this.message=msg;this.status=status}UnexpectedResponseException.prototype=new Error;UnexpectedResponseException.constructor=UnexpectedResponseException;return UnexpectedResponseException}();var NotImplementedException=function NotImplementedExceptionClosure(){function NotImplementedException(msg){this.message=msg}NotImplementedException.prototype=new Error;NotImplementedException.prototype.name="NotImplementedException";NotImplementedException.constructor=NotImplementedException;return NotImplementedException}();var MissingDataException=function MissingDataExceptionClosure(){function MissingDataException(begin,end){this.begin=begin;this.end=end;this.message="Missing data ["+begin+", "+end+")"}MissingDataException.prototype=new Error;MissingDataException.prototype.name="MissingDataException";MissingDataException.constructor=MissingDataException;return MissingDataException}();var XRefParseException=function XRefParseExceptionClosure(){function XRefParseException(msg){this.message=msg}XRefParseException.prototype=new Error;XRefParseException.prototype.name="XRefParseException";XRefParseException.constructor=XRefParseException;return XRefParseException}();var NullCharactersRegExp=/\x00/g;function removeNullCharacters(str){if(typeof str!=="string"){warn("The argument for removeNullCharacters must be a string.");return str}return str.replace(NullCharactersRegExp,"")}function bytesToString(bytes){assert(bytes!==null&&typeof bytes==="object"&&bytes.length!==undefined,"Invalid argument for bytesToString");var length=bytes.length;var MAX_ARGUMENT_COUNT=8192;if(length>24&255,value>>16&255,value>>8&255,value&255)}function log2(x){var n=1,i=0;while(x>n){n<<=1;i++}return i}function readInt8(data,start){return data[start]<<24>>24}function readUint16(data,offset){return data[offset]<<8|data[offset+1]}function readUint32(data,offset){return(data[offset]<<24|data[offset+1]<<16|data[offset+2]<<8|data[offset+3])>>>0}function isLittleEndian(){var buffer8=new Uint8Array(2);buffer8[0]=1;var buffer16=new Uint16Array(buffer8.buffer);return buffer16[0]===1}function isEvalSupported(){try{new Function("");return true}catch(e){return false}}var Uint32ArrayView=function Uint32ArrayViewClosure(){function Uint32ArrayView(buffer,length){this.buffer=buffer;this.byteLength=buffer.length;this.length=length===undefined?this.byteLength>>2:length;ensureUint32ArrayViewProps(this.length)}Uint32ArrayView.prototype=Object.create(null);var uint32ArrayViewSetters=0;function createUint32ArrayProp(index){return{get:function(){var buffer=this.buffer,offset=index<<2;return(buffer[offset]|buffer[offset+1]<<8|buffer[offset+2]<<16|buffer[offset+3]<<24)>>>0},set:function(value){var buffer=this.buffer,offset=index<<2;buffer[offset]=value&255;buffer[offset+1]=value>>8&255;buffer[offset+2]=value>>16&255;buffer[offset+3]=value>>>24&255}}}function ensureUint32ArrayViewProps(length){while(uint32ArrayViewSettersrect[2]){r[0]=rect[2];r[2]=rect[0]}if(rect[1]>rect[3]){r[1]=rect[3];r[3]=rect[1]}return r};Util.intersect=function Util_intersect(rect1,rect2){function compare(a,b){return a-b}var orderedX=[rect1[0],rect1[2],rect2[0],rect2[2]].sort(compare),orderedY=[rect1[1],rect1[3],rect2[1],rect2[3]].sort(compare),result=[];rect1=Util.normalizeRect(rect1);rect2=Util.normalizeRect(rect2);if(orderedX[0]===rect1[0]&&orderedX[1]===rect2[0]||orderedX[0]===rect2[0]&&orderedX[1]===rect1[0]){result[0]=orderedX[1];result[2]=orderedX[2]}else{return false}if(orderedY[0]===rect1[1]&&orderedY[1]===rect2[1]||orderedY[0]===rect2[1]&&orderedY[1]===rect1[1]){result[1]=orderedY[1];result[3]=orderedY[2]}else{return false}return result};Util.sign=function Util_sign(num){return num<0?-1:1};var ROMAN_NUMBER_MAP=["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM","","X","XX","XXX","XL","L","LX","LXX","LXXX","XC","","I","II","III","IV","V","VI","VII","VIII","IX"];Util.toRoman=function Util_toRoman(number,lowerCase){assert(isInt(number)&&number>0,"The number should be a positive integer.");var pos,romanBuf=[];while(number>=1e3){number-=1e3;romanBuf.push("M")}pos=number/100|0;number%=100;romanBuf.push(ROMAN_NUMBER_MAP[pos]);pos=number/10|0;number%=10;romanBuf.push(ROMAN_NUMBER_MAP[10+pos]);romanBuf.push(ROMAN_NUMBER_MAP[20+number]);var romanStr=romanBuf.join("");return lowerCase?romanStr.toLowerCase():romanStr};Util.appendToArray=function Util_appendToArray(arr1,arr2){Array.prototype.push.apply(arr1,arr2)};Util.prependToArray=function Util_prependToArray(arr1,arr2){Array.prototype.unshift.apply(arr1,arr2)};Util.extendObj=function extendObj(obj1,obj2){for(var key in obj2){obj1[key]=obj2[key]}};Util.getInheritableProperty=function Util_getInheritableProperty(dict,name){while(dict&&!dict.has(name)){dict=dict.get("Parent")}if(!dict){return null}return dict.get(name)};Util.inherit=function Util_inherit(sub,base,prototype){sub.prototype=Object.create(base.prototype);sub.prototype.constructor=sub;for(var prop in prototype){sub.prototype[prop]=prototype[prop]}};Util.loadScript=function Util_loadScript(src,callback){var script=document.createElement("script");var loaded=false;script.setAttribute("src",src);if(callback){script.onload=function(){if(!loaded){callback()}loaded=true}}document.getElementsByTagName("head")[0].appendChild(script)};return Util}();var PageViewport=function PageViewportClosure(){function PageViewport(viewBox,scale,rotation,offsetX,offsetY,dontFlip){this.viewBox=viewBox;this.scale=scale;this.rotation=rotation;this.offsetX=offsetX;this.offsetY=offsetY;var centerX=(viewBox[2]+viewBox[0])/2;var centerY=(viewBox[3]+viewBox[1])/2;var rotateA,rotateB,rotateC,rotateD;rotation=rotation%360;rotation=rotation<0?rotation+360:rotation;switch(rotation){case 180:rotateA=-1;rotateB=0;rotateC=0;rotateD=1;break;case 90:rotateA=0;rotateB=1;rotateC=1;rotateD=0;break;case 270:rotateA=0;rotateB=-1;rotateC=-1;rotateD=0;break;default:rotateA=1;rotateB=0;rotateC=0;rotateD=-1;break}if(dontFlip){rotateC=-rotateC;rotateD=-rotateD}var offsetCanvasX,offsetCanvasY;var width,height;if(rotateA===0){offsetCanvasX=Math.abs(centerY-viewBox[1])*scale+offsetX;offsetCanvasY=Math.abs(centerX-viewBox[0])*scale+offsetY;width=Math.abs(viewBox[3]-viewBox[1])*scale;height=Math.abs(viewBox[2]-viewBox[0])*scale}else{offsetCanvasX=Math.abs(centerX-viewBox[0])*scale+offsetX;offsetCanvasY=Math.abs(centerY-viewBox[1])*scale+offsetY;width=Math.abs(viewBox[2]-viewBox[0])*scale;height=Math.abs(viewBox[3]-viewBox[1])*scale}this.transform=[rotateA*scale,rotateB*scale,rotateC*scale,rotateD*scale,offsetCanvasX-rotateA*scale*centerX-rotateC*scale*centerY,offsetCanvasY-rotateB*scale*centerX-rotateD*scale*centerY];this.width=width;this.height=height;this.fontScale=scale}PageViewport.prototype={clone:function PageViewPort_clone(args){args=args||{};var scale="scale"in args?args.scale:this.scale;var rotation="rotation"in args?args.rotation:this.rotation;return new PageViewport(this.viewBox.slice(),scale,rotation,this.offsetX,this.offsetY,args.dontFlip)},convertToViewportPoint:function PageViewport_convertToViewportPoint(x,y){return Util.applyTransform([x,y],this.transform)},convertToViewportRectangle:function PageViewport_convertToViewportRectangle(rect){var tl=Util.applyTransform([rect[0],rect[1]],this.transform);var br=Util.applyTransform([rect[2],rect[3]],this.transform);return[tl[0],tl[1],br[0],br[1]]},convertToPdfPoint:function PageViewport_convertToPdfPoint(x,y){return Util.applyInverseTransform([x,y],this.transform)}};return PageViewport}();var PDFStringTranslateTable=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364];function stringToPDFString(str){var i,n=str.length,strBuf=[];if(str[0]==="þ"&&str[1]==="ÿ"){for(i=2;i0){var handler=this.handlers.shift();var nextStatus=handler.thisPromise._status;var nextValue=handler.thisPromise._value;try{if(nextStatus===STATUS_RESOLVED){if(typeof handler.onResolve==="function"){nextValue=handler.onResolve(nextValue)}}else if(typeof handler.onReject==="function"){nextValue=handler.onReject(nextValue);nextStatus=STATUS_RESOLVED;if(handler.thisPromise._unhandledRejection){this.removeUnhandeledRejection(handler.thisPromise)}}}catch(ex){nextStatus=STATUS_REJECTED;nextValue=ex}handler.nextPromise._updateStatus(nextStatus,nextValue);if(Date.now()>=timeoutAt){break}}if(this.handlers.length>0){setTimeout(this.runHandlers.bind(this),0);return}this.running=false},addUnhandledRejection:function addUnhandledRejection(promise){this.unhandledRejections.push({promise:promise,time:Date.now()});this.scheduleRejectionCheck()},removeUnhandeledRejection:function removeUnhandeledRejection(promise){promise._unhandledRejection=false;for(var i=0;iREJECTION_TIMEOUT){var unhandled=this.unhandledRejections[i].promise._value;var msg="Unhandled rejection: "+unhandled;if(unhandled.stack){msg+="\n"+unhandled.stack}warn(msg);this.unhandledRejections.splice(i);i--}}if(this.unhandledRejections.length){this.scheduleRejectionCheck()}}.bind(this),REJECTION_TIMEOUT)}};function Promise(resolver){this._status=STATUS_PENDING;this._handlers=[];try{resolver.call(this,this._resolve.bind(this),this._reject.bind(this))}catch(e){this._reject(e)}}Promise.all=function Promise_all(promises){var resolveAll,rejectAll;var deferred=new Promise(function(resolve,reject){resolveAll=resolve;rejectAll=reject});var unresolved=promises.length;var results=[];if(unresolved===0){resolveAll(results);return deferred}function reject(reason){if(deferred._status===STATUS_REJECTED){return}results=[];rejectAll(reason)}for(var i=0,ii=promises.length;ilongest){longest=name.length}}for(i=0,ii=times.length;i>2,d2=(b1&3)<<4|b2>>4;var d3=i+1>6:64;var d4=i+232&&unicode<127&&[34,35,60,62,63,96].indexOf(unicode)===-1){return c}return encodeURIComponent(c)}function percentEscapeQuery(c){var unicode=c.charCodeAt(0);if(unicode>32&&unicode<127&&[34,35,60,62,96].indexOf(unicode)===-1){return c}return encodeURIComponent(c)}var EOF,ALPHA=/[a-zA-Z]/,ALPHANUMERIC=/[a-zA-Z0-9\+\-\.]/;function parse(input,stateOverride,base){function err(message){errors.push(message)}var state=stateOverride||"scheme start",cursor=0,buffer="",seenAt=false,seenBracket=false,errors=[];loop:while((input[cursor-1]!==EOF||cursor===0)&&!this._isInvalid){var c=input[cursor];switch(state){case"scheme start":if(c&&ALPHA.test(c)){buffer+=c.toLowerCase();state="scheme"}else if(!stateOverride){buffer="";state="no scheme";continue}else{err("Invalid scheme.");break loop}break;case"scheme":if(c&&ALPHANUMERIC.test(c)){buffer+=c.toLowerCase()}else if(":"===c){this._scheme=buffer;buffer="";if(stateOverride){break loop}if(isRelativeScheme(this._scheme)){this._isRelative=true}if("file"===this._scheme){state="relative"}else if(this._isRelative&&base&&base._scheme===this._scheme){state="relative or authority"}else if(this._isRelative){state="authority first slash"}else{state="scheme data"}}else if(!stateOverride){buffer="";cursor=0;state="no scheme";continue}else if(EOF===c){break loop}else{err("Code point not allowed in scheme: "+c);break loop}break;case"scheme data":if("?"===c){this._query="?";state="query"}else if("#"===c){this._fragment="#";state="fragment"}else{if(EOF!==c&&" "!==c&&"\n"!==c&&"\r"!==c){this._schemeData+=percentEscape(c)}}break;case"no scheme":if(!base||!isRelativeScheme(base._scheme)){err("Missing scheme.");invalid.call(this)}else{state="relative";continue}break;case"relative or authority":if("/"===c&&"/"===input[cursor+1]){state="authority ignore slashes"}else{err("Expected /, got: "+c);state="relative";continue}break;case"relative":this._isRelative=true;if("file"!==this._scheme){this._scheme=base._scheme}if(EOF===c){this._host=base._host;this._port=base._port;this._path=base._path.slice();this._query=base._query;this._username=base._username;this._password=base._password;break loop}else if("/"===c||"\\"===c){if("\\"===c){err("\\ is an invalid code point.")}state="relative slash"}else if("?"===c){this._host=base._host;this._port=base._port;this._path=base._path.slice();this._query="?";this._username=base._username;this._password=base._password;state="query"}else if("#"===c){this._host=base._host;this._port=base._port;this._path=base._path.slice();this._query=base._query;this._fragment="#";this._username=base._username;this._password=base._password;state="fragment"}else{var nextC=input[cursor+1];var nextNextC=input[cursor+2];if("file"!==this._scheme||!ALPHA.test(c)||nextC!==":"&&nextC!=="|"||EOF!==nextNextC&&"/"!==nextNextC&&"\\"!==nextNextC&&"?"!==nextNextC&&"#"!==nextNextC){this._host=base._host;this._port=base._port;this._username=base._username;this._password=base._password;this._path=base._path.slice();this._path.pop()}state="relative path";continue}break;case"relative slash":if("/"===c||"\\"===c){if("\\"===c){err("\\ is an invalid code point.") -}if("file"===this._scheme){state="file host"}else{state="authority ignore slashes"}}else{if("file"!==this._scheme){this._host=base._host;this._port=base._port;this._username=base._username;this._password=base._password}state="relative path";continue}break;case"authority first slash":if("/"===c){state="authority second slash"}else{err("Expected '/', got: "+c);state="authority ignore slashes";continue}break;case"authority second slash":state="authority ignore slashes";if("/"!==c){err("Expected '/', got: "+c);continue}break;case"authority ignore slashes":if("/"!==c&&"\\"!==c){state="authority";continue}else{err("Expected authority, got: "+c)}break;case"authority":if("@"===c){if(seenAt){err("@ already seen.");buffer+="%40"}seenAt=true;for(var i=0;i=bytesLength){error("Invalid CFF header")}else if(offset!==0){info("cff data is shifted");bytes=bytes.subarray(offset);this.bytes=bytes}var major=bytes[0];var minor=bytes[1];var hdrSize=bytes[2];var offSize=bytes[3];var header=new CFFHeader(major,minor,hdrSize,offSize);return{obj:header,endPos:hdrSize}},parseDict:function CFFParser_parseDict(dict){var pos=0;function parseOperand(){var value=dict[pos++];if(value===30){return parseFloatOperand()}else if(value===28){value=dict[pos++];value=(value<<24|dict[pos++]<<16)>>16;return value}else if(value===29){value=dict[pos++];value=value<<8|dict[pos++];value=value<<8|dict[pos++];value=value<<8|dict[pos++];return value}else if(value>=32&&value<=246){return value-139}else if(value>=247&&value<=250){return(value-247)*256+dict[pos++]+108}else if(value>=251&&value<=254){return-((value-251)*256)-dict[pos++]-108}else{error("255 is not a valid DICT command")}return-1}function parseFloatOperand(){var str="";var eof=15;var lookup=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"];var length=dict.length;while(pos>4;var b2=b&15;if(b1===eof){break}str+=lookup[b1];if(b2===eof){break}str+=lookup[b2]}return parseFloat(str)}var operands=[];var entries=[];pos=0;var end=dict.length;while(pos126||c===91||c===93||c===40||c===41||c===123||c===125||c===60||c===62||c===47||c===37||c===35){data[j]=95;continue}data[j]=c}names.push(bytesToString(data))}return names},parseStringIndex:function CFFParser_parseStringIndex(index){var strings=new CFFStrings;for(var i=0,ii=index.count;iMAX_SUBR_NESTING){return false}var stackSize=state.stackSize;var stack=state.stack;var length=data.length;for(var j=0;j>16;j+=2;stackSize++}else if(value===14){if(stackSize>=4){stackSize-=4;if(this.seacAnalysisEnabled){state.seac=stack.slice(stackSize,stackSize+4);return false}}validationCommand=CharstringValidationData[value]}else if(value>=32&&value<=246){stack[stackSize]=value-139;stackSize++}else if(value>=247&&value<=254){stack[stackSize]=value<251?(value-247<<8)+data[j]+108:-(value-251<<8)-data[j]-108;j++;stackSize++}else if(value===255){stack[stackSize]=(data[j]<<24|data[j+1]<<16|data[j+2]<<8|data[j+3])/65536;j+=4;stackSize++}else if(value===19||value===20){state.hints+=stackSize>>1;j+=state.hints+7>>3;stackSize%=2;validationCommand=CharstringValidationData[value]}else if(value===10||value===29){var subrsIndex;if(value===10){subrsIndex=localSubrIndex}else{subrsIndex=globalSubrIndex}if(!subrsIndex){validationCommand=CharstringValidationData[value];warn("Missing subrsIndex for "+validationCommand.id);return false}var bias=32768;if(subrsIndex.count<1240){bias=107}else if(subrsIndex.count<33900){bias=1131}var subrNumber=stack[--stackSize]+bias;if(subrNumber<0||subrNumber>=subrsIndex.count){validationCommand=CharstringValidationData[value];warn("Out of bounds subrIndex for "+validationCommand.id);return false}state.stackSize=stackSize;state.callDepth++;var valid=this.parseCharString(state,subrsIndex.get(subrNumber),localSubrIndex,globalSubrIndex);if(!valid){return false}state.callDepth--;stackSize=state.stackSize;continue}else if(value===11){state.stackSize=stackSize;return true}else{validationCommand=CharstringValidationData[value]}if(validationCommand){if(validationCommand.stem){state.hints+=stackSize>>1}if("min"in validationCommand){if(!state.undefStack&&stackSize=2&&validationCommand.stem){stackSize%=2}else if(stackSize>1){warn("Found too many parameters for stack-clearing command")}if(stackSize>0&&stack[stackSize-1]>=0){state.width=stack[stackSize-1]}}if("stackDelta"in validationCommand){if("stackFn"in validationCommand){validationCommand.stackFn(stack,stackSize)}stackSize+=validationCommand.stackDelta}else if(validationCommand.stackClearing){stackSize=0}else if(validationCommand.resetStack){stackSize=0;state.undefStack=false}else if(validationCommand.undefStack){stackSize=0;state.undefStack=true;state.firstStackClearing=false}}}state.stackSize=stackSize;return true},parseCharStrings:function CFFParser_parseCharStrings(charStrings,localSubrIndex,globalSubrIndex,fdSelect,fdArray){var seacs=[];var widths=[];var count=charStrings.count;for(var i=0;i=fdArray.length){warn("Invalid fd index for glyph index.");valid=false}if(valid){localSubrToUse=fdArray[fdIndex].privateDict.subrsIndex}}else if(localSubrIndex){localSubrToUse=localSubrIndex}if(valid){valid=this.parseCharString(state,charstring,localSubrToUse,globalSubrIndex)}if(state.width!==null){widths[i]=state.width}if(state.seac!==null){seacs[i]=state.seac}if(!valid){charStrings.set(i,new Uint8Array([14]))}}return{charStrings:charStrings,seacs:seacs,widths:widths}},emptyPrivateDictionary:function CFFParser_emptyPrivateDictionary(parentDict){var privateDict=this.createDict(CFFPrivateDict,[],parentDict.strings);parentDict.setByKey(18,[0,0]);parentDict.privateDict=privateDict},parsePrivateDict:function CFFParser_parsePrivateDict(parentDict){if(!parentDict.hasName("Private")){this.emptyPrivateDictionary(parentDict);return}var privateOffset=parentDict.getByName("Private");if(!isArray(privateOffset)||privateOffset.length!==2){parentDict.removeByName("Private");return}var size=privateOffset[0];var offset=privateOffset[1];if(size===0||offset>=this.bytes.length){this.emptyPrivateDictionary(parentDict);return}var privateDictEnd=offset+size;var dictData=this.bytes.subarray(offset,privateDictEnd);var dict=this.parseDict(dictData);var privateDict=this.createDict(CFFPrivateDict,dict,parentDict.strings);parentDict.privateDict=privateDict;if(!privateDict.getByName("Subrs")){return}var subrsOffset=privateDict.getByName("Subrs");var relativeOffset=offset+subrsOffset;if(subrsOffset===0||relativeOffset>=this.bytes.length){this.emptyPrivateDictionary(parentDict);return}var subrsIndex=this.parseIndex(relativeOffset);privateDict.subrsIndex=subrsIndex.obj},parseCharsets:function CFFParser_parseCharsets(pos,length,strings,cid){if(pos===0){return new CFFCharset(true,CFFCharsetPredefinedTypes.ISO_ADOBE,ISOAdobeCharset)}else if(pos===1){return new CFFCharset(true,CFFCharsetPredefinedTypes.EXPERT,ExpertCharset)}else if(pos===2){return new CFFCharset(true,CFFCharsetPredefinedTypes.EXPERT_SUBSET,ExpertSubsetCharset)}var bytes=this.bytes;var start=pos;var format=bytes[pos++];var charset=[".notdef"];var id,count,i;length-=1;switch(format){case 0:for(i=0;i=0&&index<=390){return CFFStandardStrings[index]}if(index-391<=this.strings.length){return this.strings[index-391]}return CFFStandardStrings[0]},add:function CFFStrings_add(value){this.strings.push(value)},get count(){return this.strings.length}};return CFFStrings}();var CFFIndex=function CFFIndexClosure(){function CFFIndex(){this.objects=[];this.length=0}CFFIndex.prototype={add:function CFFIndex_add(data){this.length+=data.length;this.objects.push(data)},set:function CFFIndex_set(index,data){this.length+=data.length-this.objects[index].length;this.objects[index]=data},get:function CFFIndex_get(index){return this.objects[index]},get count(){return this.objects.length}};return CFFIndex}();var CFFDict=function CFFDictClosure(){function CFFDict(tables,strings){this.keyToNameMap=tables.keyToNameMap;this.nameToKeyMap=tables.nameToKeyMap;this.defaults=tables.defaults;this.types=tables.types;this.opcodes=tables.opcodes;this.order=tables.order;this.strings=strings;this.values=Object.create(null)}CFFDict.prototype={setByKey:function CFFDict_setByKey(key,value){if(!(key in this.keyToNameMap)){return false}if(value.length===0){return true}var type=this.types[key];if(type==="num"||type==="sid"||type==="offset"){value=value[0];if(isNaN(value)){warn("Invalid CFFDict value: "+value+", for key: "+key+".");return true}}this.values[key]=value;return true},setByName:function CFFDict_setByName(name,value){if(!(name in this.nameToKeyMap)){error('Invalid dictionary name "'+name+'"')}this.values[this.nameToKeyMap[name]]=value},hasName:function CFFDict_hasName(name){return this.nameToKeyMap[name]in this.values},getByName:function CFFDict_getByName(name){if(!(name in this.nameToKeyMap)){error('Invalid dictionary name "'+name+'"')}var key=this.nameToKeyMap[name];if(!(key in this.values)){return this.defaults[key] -}return this.values[key]},removeByName:function CFFDict_removeByName(name){delete this.values[this.nameToKeyMap[name]]}};CFFDict.createTables=function CFFDict_createTables(layout){var tables={keyToNameMap:{},nameToKeyMap:{},defaults:{},types:{},opcodes:{},order:[]};for(var i=0,ii=layout.length;i=this.fdSelect.length){return-1}return this.fdSelect[glyphIndex]}};return CFFFDSelect}();var CFFOffsetTracker=function CFFOffsetTrackerClosure(){function CFFOffsetTracker(){this.offsets=Object.create(null)}CFFOffsetTracker.prototype={isTracking:function CFFOffsetTracker_isTracking(key){return key in this.offsets},track:function CFFOffsetTracker_track(key,location){if(key in this.offsets){error("Already tracking location of "+key)}this.offsets[key]=location},offset:function CFFOffsetTracker_offset(value){for(var key in this.offsets){this.offsets[key]+=value}},setEntryLocation:function CFFOffsetTracker_setEntryLocation(key,values,output){if(!(key in this.offsets)){error("Not tracking location of "+key)}var data=output.data;var dataOffset=this.offsets[key];var size=5;for(var i=0,ii=values.length;i>24&255;data[offset2]=value>>16&255;data[offset3]=value>>8&255;data[offset4]=value&255}}};return CFFOffsetTracker}();var CFFCompiler=function CFFCompilerClosure(){function CFFCompiler(cff){this.cff=cff}CFFCompiler.prototype={compile:function CFFCompiler_compile(){var cff=this.cff;var output={data:[],length:0,add:function CFFCompiler_add(data){this.data=this.data.concat(data);this.length=this.data.length}};var header=this.compileHeader(cff.header);output.add(header);var nameIndex=this.compileNameIndex(cff.names);output.add(nameIndex);if(cff.isCIDFont){if(cff.topDict.hasName("FontMatrix")){var base=cff.topDict.getByName("FontMatrix");cff.topDict.removeByName("FontMatrix");for(var i=0,ii=cff.fdArray.length;i=-107&&value<=107){code=[value+139]}else if(value>=108&&value<=1131){value=value-108;code=[(value>>8)+247,value&255]}else if(value>=-1131&&value<=-108){value=-value-108;code=[(value>>8)+251,value&255]}else if(value>=-32768&&value<=32767){code=[28,value>>8&255,value&255]}else{code=[29,value>>24&255,value>>16&255,value>>8&255,value&255]}return code},compileHeader:function CFFCompiler_compileHeader(header){return[header.major,header.minor,header.hdrSize,header.offSize]},compileNameIndex:function CFFCompiler_compileNameIndex(names){var nameIndex=new CFFIndex;for(var i=0,ii=names.length;i>8&255,count&255];var lastOffset=1,i;for(i=0;i>8&255,relativeOffset&255)}else if(offsetSize===3){data.push(relativeOffset>>16&255,relativeOffset>>8&255,relativeOffset&255)}else{data.push(relativeOffset>>>24&255,relativeOffset>>16&255,relativeOffset>>8&255,relativeOffset&255)}if(objects[i]){relativeOffset+=objects[i].length}}for(i=0;i=this.end?this.numChunks:Math.floor(position/this.chunkSize);var curChunk;for(curChunk=beginChunk;curChunk=end){return}if(end<=this.progressiveDataLength){return}var chunkSize=this.chunkSize;var beginChunk=Math.floor(begin/chunkSize);var endChunk=Math.floor((end-1)/chunkSize)+1;for(var chunk=beginChunk;chunk=this.end){return-1}this.ensureByte(pos);return this.bytes[this.pos++]},getUint16:function ChunkedStream_getUint16(){var b0=this.getByte();var b1=this.getByte();if(b0===-1||b1===-1){return-1}return(b0<<8)+b1},getInt32:function ChunkedStream_getInt32(){var b0=this.getByte();var b1=this.getByte();var b2=this.getByte();var b3=this.getByte();return(b0<<24)+(b1<<16)+(b2<<8)+b3},getBytes:function ChunkedStream_getBytes(length){var bytes=this.bytes;var pos=this.pos;var strEnd=this.end;if(!length){this.ensureRange(pos,strEnd);return bytes.subarray(pos,strEnd)}var end=pos+length;if(end>strEnd){end=strEnd}this.ensureRange(pos,end);this.pos=end;return bytes.subarray(pos,end)},peekByte:function ChunkedStream_peekByte(){var peekedByte=this.getByte();this.pos--;return peekedByte},peekBytes:function ChunkedStream_peekBytes(length){var bytes=this.getBytes(length);this.pos-=bytes.length;return bytes},getByteRange:function ChunkedStream_getBytes(begin,end){this.ensureRange(begin,end);return this.bytes.subarray(begin,end)},skip:function ChunkedStream_skip(n){if(!n){n=1}this.pos+=n},reset:function ChunkedStream_reset(){this.pos=this.start},moveStart:function ChunkedStream_moveStart(){this.start=this.pos},makeSubStream:function ChunkedStream_makeSubStream(start,length,dict){this.ensureRange(start,start+length);function ChunkedStreamSubstream(){}ChunkedStreamSubstream.prototype=Object.create(this);ChunkedStreamSubstream.prototype.getMissingChunks=function(){var chunkSize=this.chunkSize;var beginChunk=Math.floor(this.start/chunkSize);var endChunk=Math.floor((this.end-1)/chunkSize)+1;var missingChunks=[];for(var chunk=beginChunk;chunk=0&&prevChunk+1!==chunk){groupedChunks.push({beginChunk:beginChunk,endChunk:prevChunk+1});beginChunk=chunk}if(i+1===chunks.length){groupedChunks.push({beginChunk:beginChunk,endChunk:chunk+1})}prevChunk=chunk}return groupedChunks},onProgress:function ChunkedStreamManager_onProgress(args){var bytesLoaded=this.stream.numChunksLoaded*this.chunkSize+args.loaded;this.msgHandler.send("DocProgress",{loaded:bytesLoaded,total:this.length})},onReceiveData:function ChunkedStreamManager_onReceiveData(args){var chunk=args.chunk;var isProgressive=args.begin===undefined;var begin=isProgressive?this.progressiveDataLength:args.begin;var end=begin+chunk.byteLength;var beginChunk=Math.floor(begin/this.chunkSize);var endChunk=end>>0}var sign=readBits(1);var value=readBits(1)?readBits(1)?readBits(1)?readBits(1)?readBits(1)?readBits(32)+4436:readBits(12)+340:readBits(8)+84:readBits(6)+20:readBits(4)+4:readBits(2);return sign===0?value:value>0?-value:null}function decodeIAID(contextCache,decoder,codeLength){var contexts=contextCache.getContexts("IAID");var prev=1;for(var i=0;i=sbb_left&&j=sbb_top){contextLabel=contextLabel<<1&reuseMask;for(k=0;k=0&&j0=0){bit=bitmap[i0][j0];if(bit){contextLabel|=bit<=width){contextLabel<<=1}else{contextLabel=contextLabel<<1|bitmap[i0][j0]}}for(k=0;k=referenceHeight||j0<0||j0>=referenceWidth){contextLabel<<=1}else{contextLabel=contextLabel<<1|referenceBitmap[i0][j0]}}var pixel=decoder.readBit(contexts,contextLabel);row[j]=pixel}}return bitmap}function decodeSymbolDictionary(huffman,refinement,symbols,numberOfNewSymbols,numberOfExportedSymbols,huffmanTables,templateIndex,at,refinementTemplateIndex,refinementAt,decodingContext){if(huffman){error("JBIG2 error: huffman is not supported")}var newSymbols=[];var currentHeight=0;var symbolCodeLength=log2(symbols.length+numberOfNewSymbols);var decoder=decodingContext.decoder;var contextCache=decodingContext.contextCache;while(newSymbols.length1){bitmap=decodeTextRegion(huffman,refinement,currentWidth,currentHeight,0,numberOfInstances,1,symbols.concat(newSymbols),symbolCodeLength,0,0,1,0,huffmanTables,refinementTemplateIndex,refinementAt,decodingContext)}else{var symbolId=decodeIAID(contextCache,decoder,symbolCodeLength);var rdx=decodeInteger(contextCache,"IARDX",decoder);var rdy=decodeInteger(contextCache,"IARDY",decoder);var symbol=symbolId>1)+rdx,(rdh>>1)+rdy,false,refinementAt,decodingContext)}var offsetT=t-(referenceCorner&1?0:symbolHeight);var offsetS=currentS-(referenceCorner&2?symbolWidth:0);var s2,t2,symbolRow;if(transposed){for(s2=0;s2>5&7;var retainBits=[referredFlags&31];var position=start+6;if(referredFlags===7){referredToCount=readUint32(data,position-1)&536870911;position+=3;var bytes=referredToCount+7>>3;retainBits[0]=data[position++];while(--bytes>0){retainBits.push(data[position++])}}else if(referredFlags===5||referredFlags===6){error("JBIG2 error: invalid referred-to flags")}segmentHeader.retainBits=retainBits;var referredToSegmentNumberSize=segmentHeader.number<=256?1:segmentHeader.number<=65536?2:4;var referredTo=[];var i,ii;for(i=0;i>>24&255;searchPattern[3]=genericRegionInfo.height>>16&255;searchPattern[4]=genericRegionInfo.height>>8&255;searchPattern[5]=genericRegionInfo.height&255;for(i=position,ii=data.length;i>2&3;dictionary.huffmanDWSelector=dictionaryFlags>>4&3;dictionary.bitmapSizeSelector=dictionaryFlags>>6&1;dictionary.aggregationInstancesSelector=dictionaryFlags>>7&1;dictionary.bitmapCodingContextUsed=!!(dictionaryFlags&256);dictionary.bitmapCodingContextRetained=!!(dictionaryFlags&512);dictionary.template=dictionaryFlags>>10&3;dictionary.refinementTemplate=dictionaryFlags>>12&1;position+=2;if(!dictionary.huffman){atLength=dictionary.template===0?4:1;at=[];for(i=0;i>2&3);textRegion.referenceCorner=textRegionSegmentFlags>>4&3;textRegion.transposed=!!(textRegionSegmentFlags&64);textRegion.combinationOperator=textRegionSegmentFlags>>7&3;textRegion.defaultPixelValue=textRegionSegmentFlags>>9&1;textRegion.dsOffset=textRegionSegmentFlags<<17>>27;textRegion.refinementTemplate=textRegionSegmentFlags>>15&1;if(textRegion.huffman){var textRegionHuffmanFlags=readUint16(data,position);position+=2;textRegion.huffmanFS=textRegionHuffmanFlags&3;textRegion.huffmanDS=textRegionHuffmanFlags>>2&3;textRegion.huffmanDT=textRegionHuffmanFlags>>4&3;textRegion.huffmanRefinementDW=textRegionHuffmanFlags>>6&3;textRegion.huffmanRefinementDH=textRegionHuffmanFlags>>8&3;textRegion.huffmanRefinementDX=textRegionHuffmanFlags>>10&3;textRegion.huffmanRefinementDY=textRegionHuffmanFlags>>12&3;textRegion.huffmanRefinementSizeSelector=!!(textRegionHuffmanFlags&14)}if(textRegion.refinement&&!textRegion.refinementTemplate){at=[];for(i=0;i<2;i++){at.push({x:readInt8(data,position),y:readInt8(data,position+1)});position+=2}textRegion.refinementAt=at}textRegion.numberOfSymbolInstances=readUint32(data,position);position+=4;if(textRegion.huffman){error("JBIG2 error: huffman is not supported")}args=[textRegion,header.referredTo,data,position,end];break;case 38:case 39:var genericRegion={};genericRegion.info=readRegionSegmentInformation(data,position);position+=RegionSegmentInformationFieldLength;var genericRegionSegmentFlags=data[position++];genericRegion.mmr=!!(genericRegionSegmentFlags&1);genericRegion.template=genericRegionSegmentFlags>>1&3;genericRegion.prediction=!!(genericRegionSegmentFlags&8);if(!genericRegion.mmr){atLength=genericRegion.template===0?4:1;at=[];for(i=0;i>2&1;pageInfo.combinationOperator=pageSegmentFlags>>3&3;pageInfo.requiresBuffer=!!(pageSegmentFlags&32);pageInfo.combinationOperatorOverride=!!(pageSegmentFlags&64);args=[pageInfo];break;case 49:break;case 50:break;case 51:break;case 62:break;default:error("JBIG2 error: segment type "+header.typeName+"("+header.type+") is not implemented")}var callbackName="on"+header.typeName;if(callbackName in visitor){visitor[callbackName].apply(visitor,args)}}function processSegments(segments,visitor){for(var i=0,ii=segments.length;i>3;var buffer=new Uint8Array(rowSize*info.height);if(info.defaultPixelValue){for(var i=0,ii=buffer.length;i>3;var combinationOperator=pageInfo.combinationOperatorOverride?regionInfo.combinationOperator:pageInfo.combinationOperator;var buffer=this.buffer;var mask0=128>>(regionInfo.x&7);var offset0=regionInfo.y*rowSize+(regionInfo.x>>3);var i,j,mask,offset;switch(combinationOperator){case 0:for(i=0;i>=1;if(!mask){mask=128;offset++}}offset0+=rowSize}break;case 2:for(i=0;i>=1;if(!mask){mask=128;offset++}}offset0+=rowSize}break;default:error("JBIG2 error: operator "+combinationOperator+" is not supported")}},onImmediateGenericRegion:function SimpleSegmentVisitor_onImmediateGenericRegion(region,data,start,end){var regionInfo=region.info;var decodingContext=new DecodingContext(data,start,end);var bitmap=decodeBitmap(region.mmr,regionInfo.width,regionInfo.height,region.template,region.prediction,null,region.at,decodingContext);this.drawBitmap(regionInfo,bitmap)},onImmediateLosslessGenericRegion:function SimpleSegmentVisitor_onImmediateLosslessGenericRegion(){this.onImmediateGenericRegion.apply(this,arguments)},onSymbolDictionary:function SimpleSegmentVisitor_onSymbolDictionary(dictionary,currentSegment,referredSegments,data,start,end){var huffmanTables;if(dictionary.huffman){error("JBIG2 error: huffman is not supported")}var symbols=this.symbols;if(!symbols){this.symbols=symbols={}}var inputSymbols=[];for(var i=0,ii=referredSegments.length;i0&&!codeLengths[length-1]){length--}code.push({children:[],index:0});var p=code[0],q;for(i=0;i0){p=code.pop()}p.index++;code.push(p);while(code.length<=i){code.push(q={children:[],index:0});p.children[p.index]=q.children;p=q}k++}if(i+10){bitsCount--;return bitsData>>bitsCount&1}bitsData=data[offset++];if(bitsData===255){var nextByte=data[offset++];if(nextByte){error("JPEG error: unexpected marker "+(bitsData<<8|nextByte).toString(16))}}bitsCount=7;return bitsData>>>7}function decodeHuffman(tree){var node=tree;while(true){node=node[readBit()];if(typeof node==="number"){return node}if(typeof node!=="object"){error("JPEG error: invalid huffman sequence")}}}function receive(length){var n=0;while(length>0){n=n<<1|readBit();length--}return n}function receiveAndExtend(length){if(length===1){return readBit()===1?1:-1}var n=receive(length);if(n>=1<>4;if(s===0){if(r<15){break}k+=16;continue}k+=r;var z=dctZigZag[k];component.blockData[offset+z]=receiveAndExtend(s);k++}}function decodeDCFirst(component,offset){var t=decodeHuffman(component.huffmanTableDC);var diff=t===0?0:receiveAndExtend(t)<0){eobrun--;return}var k=spectralStart,e=spectralEnd;while(k<=e){var rs=decodeHuffman(component.huffmanTableAC);var s=rs&15,r=rs>>4;if(s===0){if(r<15){eobrun=receive(r)+(1<>4;if(s===0){if(r<15){eobrun=receive(r)+(1<=65488&&marker<=65495){offset+=2}else{break}}return offset-startOffset}function quantizeAndInverse(component,blockBufferOffset,p){var qt=component.quantizationTable,blockData=component.blockData;var v0,v1,v2,v3,v4,v5,v6,v7;var p0,p1,p2,p3,p4,p5,p6,p7;var t;if(!qt){error("JPEG error: missing required Quantization Table.")}for(var row=0;row<64;row+=8){p0=blockData[blockBufferOffset+row];p1=blockData[blockBufferOffset+row+1];p2=blockData[blockBufferOffset+row+2];p3=blockData[blockBufferOffset+row+3];p4=blockData[blockBufferOffset+row+4];p5=blockData[blockBufferOffset+row+5];p6=blockData[blockBufferOffset+row+6];p7=blockData[blockBufferOffset+row+7];p0*=qt[row];if((p1|p2|p3|p4|p5|p6|p7)===0){t=dctSqrt2*p0+512>>10;p[row]=t;p[row+1]=t;p[row+2]=t;p[row+3]=t;p[row+4]=t;p[row+5]=t;p[row+6]=t;p[row+7]=t;continue}p1*=qt[row+1];p2*=qt[row+2];p3*=qt[row+3];p4*=qt[row+4];p5*=qt[row+5];p6*=qt[row+6];p7*=qt[row+7];v0=dctSqrt2*p0+128>>8;v1=dctSqrt2*p4+128>>8;v2=p2;v3=p6;v4=dctSqrt1d2*(p1-p7)+128>>8;v7=dctSqrt1d2*(p1+p7)+128>>8;v5=p3<<4;v6=p5<<4;v0=v0+v1+1>>1;v1=v0-v1;t=v2*dctSin6+v3*dctCos6+128>>8;v2=v2*dctCos6-v3*dctSin6+128>>8;v3=t;v4=v4+v6+1>>1;v6=v4-v6;v7=v7+v5+1>>1;v5=v7-v5;v0=v0+v3+1>>1;v3=v0-v3;v1=v1+v2+1>>1;v2=v1-v2;t=v4*dctSin3+v7*dctCos3+2048>>12;v4=v4*dctCos3-v7*dctSin3+2048>>12;v7=t;t=v5*dctSin1+v6*dctCos1+2048>>12;v5=v5*dctCos1-v6*dctSin1+2048>>12;v6=t;p[row]=v0+v7;p[row+7]=v0-v7;p[row+1]=v1+v6;p[row+6]=v1-v6;p[row+2]=v2+v5;p[row+5]=v2-v5;p[row+3]=v3+v4;p[row+4]=v3-v4}for(var col=0;col<8;++col){p0=p[col];p1=p[col+8];p2=p[col+16];p3=p[col+24];p4=p[col+32];p5=p[col+40];p6=p[col+48];p7=p[col+56];if((p1|p2|p3|p4|p5|p6|p7)===0){t=dctSqrt2*p0+8192>>14;t=t<-2040?0:t>=2024?255:t+2056>>4;blockData[blockBufferOffset+col]=t;blockData[blockBufferOffset+col+8]=t;blockData[blockBufferOffset+col+16]=t;blockData[blockBufferOffset+col+24]=t;blockData[blockBufferOffset+col+32]=t;blockData[blockBufferOffset+col+40]=t;blockData[blockBufferOffset+col+48]=t;blockData[blockBufferOffset+col+56]=t;continue}v0=dctSqrt2*p0+2048>>12;v1=dctSqrt2*p4+2048>>12;v2=p2;v3=p6;v4=dctSqrt1d2*(p1-p7)+2048>>12;v7=dctSqrt1d2*(p1+p7)+2048>>12;v5=p3;v6=p5;v0=(v0+v1+1>>1)+4112;v1=v0-v1;t=v2*dctSin6+v3*dctCos6+2048>>12;v2=v2*dctCos6-v3*dctSin6+2048>>12;v3=t;v4=v4+v6+1>>1;v6=v4-v6;v7=v7+v5+1>>1;v5=v7-v5;v0=v0+v3+1>>1;v3=v0-v3;v1=v1+v2+1>>1;v2=v1-v2;t=v4*dctSin3+v7*dctCos3+2048>>12;v4=v4*dctCos3-v7*dctSin3+2048>>12;v7=t;t=v5*dctSin1+v6*dctCos1+2048>>12;v5=v5*dctCos1-v6*dctSin1+2048>>12;v6=t;p0=v0+v7;p7=v0-v7;p1=v1+v6;p6=v1-v6;p2=v2+v5;p5=v2-v5;p3=v3+v4;p4=v3-v4;p0=p0<16?0:p0>=4080?255:p0>>4;p1=p1<16?0:p1>=4080?255:p1>>4;p2=p2<16?0:p2>=4080?255:p2>>4;p3=p3<16?0:p3>=4080?255:p3>>4;p4=p4<16?0:p4>=4080?255:p4>>4;p5=p5<16?0:p5>=4080?255:p5>>4;p6=p6<16?0:p6>=4080?255:p6>>4;p7=p7<16?0:p7>=4080?255:p7>>4;blockData[blockBufferOffset+col]=p0;blockData[blockBufferOffset+col+8]=p1;blockData[blockBufferOffset+col+16]=p2;blockData[blockBufferOffset+col+24]=p3;blockData[blockBufferOffset+col+32]=p4;blockData[blockBufferOffset+col+40]=p5;blockData[blockBufferOffset+col+48]=p6;blockData[blockBufferOffset+col+56]=p7}}function buildComponentData(frame,component){var blocksPerLine=component.blocksPerLine;var blocksPerColumn=component.blocksPerColumn;var computationBuffer=new Int16Array(64);for(var blockRow=0;blockRow=255?255:a}JpegImage.prototype={parse:function parse(data){function readUint16(){var value=data[offset]<<8|data[offset+1];offset+=2;return value}function readDataBlock(){var length=readUint16();var array=data.subarray(offset,offset+length-2);offset+=array.length;return array}function prepareComponents(frame){var mcusPerLine=Math.ceil(frame.samplesPerLine/8/frame.maxH);var mcusPerColumn=Math.ceil(frame.scanLines/8/frame.maxV);for(var i=0;i>4===0){for(j=0;j<64;j++){z=dctZigZag[j];tableData[z]=data[offset++]}}else if(quantizationTableSpec>>4===1){for(j=0;j<64;j++){z=dctZigZag[j];tableData[z]=readUint16()}}else{error("JPEG error: DQT - invalid table spec")}quantizationTables[quantizationTableSpec&15]=tableData}break;case 65472:case 65473:case 65474:if(frame){error("JPEG error: Only single frame JPEGs supported")}readUint16();frame={};frame.extended=fileMarker===65473;frame.progressive=fileMarker===65474;frame.precision=data[offset++];frame.scanLines=readUint16();frame.samplesPerLine=readUint16();frame.components=[];frame.componentIds={};var componentsCount=data[offset++],componentId;var maxH=0,maxV=0;for(i=0;i>4;var v=data[offset+1]&15;if(maxH>4===0?huffmanTablesDC:huffmanTablesAC)[huffmanTableSpec&15]=buildHuffmanTable(codeLengths,huffmanValues)}break;case 65501:readUint16();resetInterval=readUint16();break;case 65498:var scanLength=readUint16();var selectorsCount=data[offset++];var components=[],component;for(i=0;i>4];component.huffmanTableAC=huffmanTablesAC[tableSpec&15];components.push(component)}var spectralStart=data[offset++];var spectralEnd=data[offset++];var successiveApproximation=data[offset++];var processed=decodeScan(data,offset,frame,components,resetInterval,spectralStart,spectralEnd,successiveApproximation>>4,successiveApproximation&15);offset+=processed;break;case 65535:if(data[offset]!==255){offset--}break;default:if(data[offset-3]===255&&data[offset-2]>=192&&data[offset-2]<=254){offset-=3;break}error("JPEG error: unknown marker "+fileMarker.toString(16))}fileMarker=readUint16()}this.width=frame.samplesPerLine;this.height=frame.scanLines;this.jfif=jfif;this.adobe=adobe;this.components=[];for(i=0;i>8)+transform[k+1]}}}return data},_isColorConversionNeeded:function isColorConversionNeeded(){if(this.adobe&&this.adobe.transformCode){return true}else if(this.numComponents===3){if(!this.adobe&&this.colorTransform===0){return false}return true}else{if(!this.adobe&&this.colorTransform===1){return true}return false}},_convertYccToRgb:function convertYccToRgb(data){var Y,Cb,Cr;for(var i=0,length=data.length;i=0?255:r<=min?0:255+r*scale|0;data[offset++]=g>=0?255:g<=min?0:255+g*scale|0;data[offset++]=b>=0?255:b<=min?0:255+b*scale|0}return data},getData:function getData(width,height,forceRGBoutput){if(this.numComponents>4){error("JPEG error: Unsupported color mode")}var data=this._getLinearizedBlockData(width,height);if(this.numComponents===1&&forceRGBoutput){var dataLength=data.length;var rgbData=new Uint8Array(dataLength*3);var offset=0;for(var i=0;i>24&255,tbox>>16&255,tbox>>8&255,tbox&255);warn("Unsupported header type "+tbox+" ("+headerType+")");break}if(jumpDataLength){position+=dataLength}}},parseImageProperties:function JpxImage_parseImageProperties(stream){var newByte=stream.getByte();while(newByte>=0){var oldByte=newByte;newByte=stream.getByte();var code=oldByte<<8|newByte;if(code===65361){stream.skip(4);var Xsiz=stream.getInt32()>>>0;var Ysiz=stream.getInt32()>>>0;var XOsiz=stream.getInt32()>>>0;var YOsiz=stream.getInt32()>>>0;stream.skip(16);var Csiz=stream.getUint16();this.width=Xsiz-XOsiz;this.height=Ysiz-YOsiz;this.componentsCount=Csiz;this.bitsPerComponent=8;return}}error("JPX Error: No size marker found in JPX stream")},parseCodestream:function JpxImage_parseCodestream(data,start,end){var context={};var doNotRecover=false;try{var position=start;while(position+1>5;spqcds=[];while(j>3;spqcd.mu=0}else{spqcd.epsilon=data[j]>>3;spqcd.mu=(data[j]&7)<<8|data[j+1];j+=2}spqcds.push(spqcd)}qcd.SPqcds=spqcds;if(context.mainHeader){context.QCD=qcd}else{context.currentTile.QCD=qcd;context.currentTile.QCC=[]}break;case 65373:length=readUint16(data,position);var qcc={};j=position+2;var cqcc;if(context.SIZ.Csiz<257){cqcc=data[j++]}else{cqcc=readUint16(data,j);j+=2}sqcd=data[j++];switch(sqcd&31){case 0:spqcdSize=8;scalarExpounded=true;break;case 1:spqcdSize=16;scalarExpounded=false;break;case 2:spqcdSize=16;scalarExpounded=true;break;default:throw new Error("Invalid SQcd value "+sqcd)}qcc.noQuantization=spqcdSize===8;qcc.scalarExpounded=scalarExpounded;qcc.guardBits=sqcd>>5;spqcds=[];while(j>3;spqcd.mu=0}else{spqcd.epsilon=data[j]>>3;spqcd.mu=(data[j]&7)<<8|data[j+1];j+=2}spqcds.push(spqcd)}qcc.SPqcds=spqcds;if(context.mainHeader){context.QCC[cqcc]=qcc}else{context.currentTile.QCC[cqcc]=qcc}break;case 65362:length=readUint16(data,position);var cod={};j=position+2;var scod=data[j++];cod.entropyCoderWithCustomPrecincts=!!(scod&1);cod.sopMarkerUsed=!!(scod&2);cod.ephMarkerUsed=!!(scod&4);cod.progressionOrder=data[j++];cod.layersCount=readUint16(data,j);j+=2;cod.multipleComponentTransform=data[j++];cod.decompositionLevelsCount=data[j++];cod.xcb=(data[j++]&15)+2;cod.ycb=(data[j++]&15)+2;var blockStyle=data[j++];cod.selectiveArithmeticCodingBypass=!!(blockStyle&1);cod.resetContextProbabilities=!!(blockStyle&2);cod.terminationOnEachCodingPass=!!(blockStyle&4);cod.verticalyStripe=!!(blockStyle&8);cod.predictableTermination=!!(blockStyle&16);cod.segmentationSymbolUsed=!!(blockStyle&32);cod.reversibleTransformation=data[j++];if(cod.entropyCoderWithCustomPrecincts){var precinctsSizes=[];while(j>4})}cod.precinctsSizes=precinctsSizes}var unsupported=[];if(cod.selectiveArithmeticCodingBypass){unsupported.push("selectiveArithmeticCodingBypass")}if(cod.resetContextProbabilities){unsupported.push("resetContextProbabilities")}if(cod.terminationOnEachCodingPass){unsupported.push("terminationOnEachCodingPass")}if(cod.verticalyStripe){unsupported.push("verticalyStripe")}if(cod.predictableTermination){unsupported.push("predictableTermination")}if(unsupported.length>0){doNotRecover=true;throw new Error("Unsupported COD options ("+unsupported.join(", ")+")")}if(context.mainHeader){context.COD=cod}else{context.currentTile.COD=cod;context.currentTile.COC=[]}break;case 65424:length=readUint16(data,position);tile={};tile.index=readUint16(data,position+2);tile.length=readUint32(data,position+4);tile.dataEnd=tile.length+position-2;tile.partIndex=data[position+8];tile.partsCount=data[position+9];context.mainHeader=false;if(tile.partIndex===0){tile.COD=context.COD;tile.COC=context.COC.slice(0);tile.QCD=context.QCD;tile.QCC=context.QCC.slice(0)}context.currentTile=tile;break;case 65427:tile=context.currentTile;if(tile.partIndex===0){initializeTile(context,tile.index);buildPackets(context)}length=tile.dataEnd-position;parseTilePackets(context,data,position,length);break;case 65365:case 65367:case 65368:case 65380:length=readUint16(data,position);break;case 65363:throw new Error("Codestream code 0xFF53 (COC) is "+"not implemented");default:throw new Error("Unknown codestream code: "+code.toString(16))}position+=length}}catch(e){if(doNotRecover||this.failOnCorruptedImage){error("JPX Error: "+e.message)}else{warn("JPX: Trying to recover from: "+e.message)}}this.tiles=transformComponents(context);this.width=context.SIZ.Xsiz-context.SIZ.XOsiz;this.height=context.SIZ.Ysiz-context.SIZ.YOsiz;this.componentsCount=context.SIZ.Csiz}};function calculateComponentDimensions(component,siz){component.x0=Math.ceil(siz.XOsiz/component.XRsiz);component.x1=Math.ceil(siz.Xsiz/component.XRsiz);component.y0=Math.ceil(siz.YOsiz/component.YRsiz);component.y1=Math.ceil(siz.Ysiz/component.YRsiz);component.width=component.x1-component.x0;component.height=component.y1-component.y0}function calculateTileGrids(context,components){var siz=context.SIZ;var tile,tiles=[];var numXtiles=Math.ceil((siz.Xsiz-siz.XTOsiz)/siz.XTsiz);var numYtiles=Math.ceil((siz.Ysiz-siz.YTOsiz)/siz.YTsiz);for(var q=0;q0?Math.min(codOrCoc.xcb,result.PPx-1):Math.min(codOrCoc.xcb,result.PPx);result.ycb_=r>0?Math.min(codOrCoc.ycb,result.PPy-1):Math.min(codOrCoc.ycb,result.PPy);return result}function buildPrecincts(context,resolution,dimensions){var precinctWidth=1<resolution.trx0?Math.ceil(resolution.trx1/precinctWidth)-Math.floor(resolution.trx0/precinctWidth):0;var numprecinctshigh=resolution.try1>resolution.try0?Math.ceil(resolution.try1/precinctHeight)-Math.floor(resolution.try0/precinctHeight):0;var numprecincts=numprecinctswide*numprecinctshigh;resolution.precinctParameters={precinctWidth:precinctWidth,precinctHeight:precinctHeight,numprecinctswide:numprecinctswide,numprecinctshigh:numprecinctshigh,numprecincts:numprecincts,precinctWidthInSubband:precinctWidthInSubband,precinctHeightInSubband:precinctHeightInSubband}}function buildCodeblocks(context,subband,dimensions){var xcb_=dimensions.xcb_;var ycb_=dimensions.ycb_;var codeblockWidth=1<>xcb_;var cby0=subband.tby0>>ycb_;var cbx1=subband.tbx1+codeblockWidth-1>>xcb_;var cby1=subband.tby1+codeblockHeight-1>>ycb_;var precinctParameters=subband.resolution.precinctParameters;var codeblocks=[];var precincts=[];var i,j,codeblock,precinctNumber;for(j=cby0;jprecinct.cbxMax){precinct.cbxMax=i}if(jprecinct.cbyMax){precinct.cbyMax=j}}else{precincts[precinctNumber]=precinct={cbxMin:i,cbyMin:j,cbxMax:i,cbyMax:j}}codeblock.precinct=precinct}}subband.codeblockParameters={codeblockWidth:xcb_,codeblockHeight:ycb_,numcodeblockwide:cbx1-cbx0+1,numcodeblockhigh:cby1-cby0+1};subband.codeblocks=codeblocks;subband.precincts=precincts}function createPacket(resolution,precinctNumber,layerNumber){var precinctCodeblocks=[];var subbands=resolution.subbands;for(var i=0,ii=subbands.length;icomponent.codingStyleParameters.decompositionLevelsCount){continue}var resolution=component.resolutions[r];var numprecincts=resolution.precinctParameters.numprecincts;for(;kcomponent.codingStyleParameters.decompositionLevelsCount){continue}var resolution=component.resolutions[r];var numprecincts=resolution.precinctParameters.numprecincts;for(;kcomponent.codingStyleParameters.decompositionLevelsCount){continue}var resolution=component.resolutions[r];var numprecincts=resolution.precinctParameters.numprecincts;if(p>=numprecincts){continue}for(;l=0;--r){var resolution=component.resolutions[r];var widthCurrentResolution=scale*resolution.precinctParameters.precinctWidth;var heightCurrentResolution=scale*resolution.precinctParameters.precinctHeight;minWidthCurrentComponent=Math.min(minWidthCurrentComponent,widthCurrentResolution);minHeightCurrentComponent=Math.min(minHeightCurrentComponent,heightCurrentResolution);maxNumWideCurrentComponent=Math.max(maxNumWideCurrentComponent,resolution.precinctParameters.numprecinctswide);maxNumHighCurrentComponent=Math.max(maxNumHighCurrentComponent,resolution.precinctParameters.numprecinctshigh);sizePerResolution[r]={width:widthCurrentResolution,height:heightCurrentResolution};scale<<=1}minWidth=Math.min(minWidth,minWidthCurrentComponent);minHeight=Math.min(minHeight,minHeightCurrentComponent);maxNumWide=Math.max(maxNumWide,maxNumWideCurrentComponent);maxNumHigh=Math.max(maxNumHigh,maxNumHighCurrentComponent);sizePerComponent[c]={resolutions:sizePerResolution,minWidth:minWidthCurrentComponent,minHeight:minHeightCurrentComponent,maxNumWide:maxNumWideCurrentComponent,maxNumHigh:maxNumHighCurrentComponent}}return{components:sizePerComponent,minWidth:minWidth,minHeight:minHeight,maxNumWide:maxNumWide,maxNumHigh:maxNumHigh}}function buildPackets(context){var siz=context.SIZ;var tileIndex=context.currentTile.index;var tile=context.tiles[tileIndex];var componentsCount=siz.Csiz;for(var c=0;c>>bufferSize&(1<0){var packetItem=queue.shift();codeblock=packetItem.codeblock;if(codeblock["data"]===undefined){codeblock.data=[]}codeblock.data.push({data:data,start:offset+position,end:offset+position+packetItem.dataLength,codingpasses:packetItem.codingpasses});position+=packetItem.dataLength}}return position}function copyCoefficients(coefficients,levelWidth,levelHeight,subband,delta,mb,reversible,segmentationSymbolUsed){var x0=subband.tbx0;var y0=subband.tby0;var width=subband.tbx1-subband.tbx0;var codeblocks=subband.codeblocks;var right=subband.type.charAt(0)==="H"?1:0;var bottom=subband.type.charAt(1)==="H"?levelWidth:0;for(var i=0,ii=codeblocks.length;i=mb){coefficients[pos]=n}else{coefficients[pos]=n*(1<0?1-i:0)}else{mu=spqcds[b].mu;epsilon=spqcds[b].epsilon;b++}var subband=resolution.subbands[j];var gainLog2=SubbandsGainLog2[subband.type];var delta=reversible?1:Math.pow(2,precision+gainLog2-epsilon)*(1+mu/2048);var mb=guardBits+epsilon-1;copyCoefficients(coefficients,width,height,subband,delta,mb,reversible,segmentationSymbolUsed)}subbandCoefficients.push({width:width,height:height,items:coefficients})}var result=transform.calculate(subbandCoefficients,component.tcx0,component.tcy0);return{left:component.tcx0,top:component.tcy0,width:result.width,height:result.height,items:result.items}}function transformComponents(context){var siz=context.SIZ;var components=context.components;var componentsCount=siz.Csiz;var resultImages=[];for(var i=0,ii=context.tiles.length;i=max?255:r>>shift;out[pos++]=g<=0?0:g>=max?255:g>>shift;out[pos++]=b<=0?0:b>=max?255:b>>shift}}else{for(j=0;j>2);r=g+y2;b=g+y1;out[pos++]=r<=0?0:r>=max?255:r>>shift;out[pos++]=g<=0?0:g>=max?255:g>>shift;out[pos++]=b<=0?0:b>=max?255:b>>shift}}if(fourComponents){for(j=0,pos=3;j=maxK?255:k+offset>>shift}}}else{for(c=0;c=max?255:val+offset>>shift;pos+=componentsCount}}}resultImages.push(result)}return resultImages}function initializeTile(context,tileIndex){var siz=context.SIZ;var componentsCount=siz.Csiz;var tile=context.tiles[tileIndex];for(var c=0;c>=1;j>>=1;currentLevel++}currentLevel--;level=this.levels[currentLevel];level.items[level.index]=value;this.currentLevel=currentLevel;delete this.value},incrementValue:function TagTree_incrementValue(){var level=this.levels[this.currentLevel];level.items[level.index]++},nextLevel:function TagTree_nextLevel(){var currentLevel=this.currentLevel;var level=this.levels[currentLevel];var value=level.items[level.index];currentLevel--;if(currentLevel<0){this.value=value;return false}this.currentLevel=currentLevel;level=this.levels[currentLevel];level.items[level.index]=value;return true}};return TagTree}();var InclusionTree=function InclusionTreeClosure(){function InclusionTree(width,height,defaultValue){var levelsLength=log2(Math.max(width,height))+1;this.levels=[];for(var i=0;istopValue){this.currentLevel=currentLevel;this.propagateValues();return false}i>>=1;j>>=1;currentLevel++}this.currentLevel=currentLevel-1;return true},incrementValue:function InclusionTree_incrementValue(stopValue){var level=this.levels[this.currentLevel];level.items[level.index]=stopValue+1;this.propagateValues()},propagateValues:function InclusionTree_propagateValues(){var levelIndex=this.currentLevel;var level=this.levels[levelIndex];var currentValue=level.items[level.index];while(--levelIndex>=0){level=this.levels[levelIndex];level.items[level.index]=currentValue}},nextLevel:function InclusionTree_nextLevel(){var currentLevel=this.currentLevel;var level=this.levels[currentLevel];var value=level.items[level.index];level.items[level.index]=255;currentLevel--;if(currentLevel<0){return false}this.currentLevel=currentLevel;level=this.levels[currentLevel];level.items[level.index]=value;return true}};return InclusionTree}();var BitModel=function BitModelClosure(){var UNIFORM_CONTEXT=17;var RUNLENGTH_CONTEXT=18;var LLAndLHContextsLabel=new Uint8Array([0,5,8,0,3,7,8,0,4,7,8,0,0,0,0,0,1,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8]);var HLContextLabel=new Uint8Array([0,3,4,0,5,7,7,0,8,8,8,0,0,0,0,0,1,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8]);var HHContextLabel=new Uint8Array([0,1,2,0,1,2,2,0,2,2,2,0,0,0,0,0,3,4,5,0,4,5,5,0,5,5,5,0,0,0,0,0,6,7,7,0,7,7,7,0,7,7,7,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8]);function BitModel(width,height,subband,zeroBitPlanes,mb){this.width=width;this.height=height;this.contextLabelTable=subband==="HH"?HHContextLabel:subband==="HL"?HLContextLabel:LLAndLHContextsLabel;var coefficientCount=width*height;this.neighborsSignificance=new Uint8Array(coefficientCount);this.coefficentsSign=new Uint8Array(coefficientCount);this.coefficentsMagnitude=mb>14?new Uint32Array(coefficientCount):mb>6?new Uint16Array(coefficientCount):new Uint8Array(coefficientCount);this.processingFlags=new Uint8Array(coefficientCount);var bitsDecoded=new Uint8Array(coefficientCount);if(zeroBitPlanes!==0){for(var i=0;i0;var right=column+10){i=index-width;if(left){neighborsSignificance[i-1]+=16}if(right){neighborsSignificance[i+1]+=16}neighborsSignificance[i]+=4}if(row+1=height){break}processingFlags[index]&=processedInverseMask;if(coefficentsMagnitude[index]||!neighborsSignificance[index]){continue}var contextLabel=labels[neighborsSignificance[index]];var decision=decoder.readBit(contexts,contextLabel);if(decision){var sign=this.decodeSignBit(i,j,index);coefficentsSign[index]=sign;coefficentsMagnitude[index]=1;this.setNeighborsSignificance(i,j,index);processingFlags[index]|=firstMagnitudeBitMask}bitsDecoded[index]++;processingFlags[index]|=processedMask}}}},decodeSignBit:function BitModel_decodeSignBit(row,column,index){var width=this.width,height=this.height;var coefficentsMagnitude=this.coefficentsMagnitude;var coefficentsSign=this.coefficentsSign;var contribution,sign0,sign1,significance1;var contextLabel,decoded;significance1=column>0&&coefficentsMagnitude[index-1]!==0;if(column+10&&coefficentsMagnitude[index-width]!==0;if(row+1=0){contextLabel=9+contribution;decoded=this.decoder.readBit(this.contexts,contextLabel)}else{contextLabel=9-contribution;decoded=this.decoder.readBit(this.contexts,contextLabel)^1}return decoded},runMagnitudeRefinementPass:function BitModel_runMagnitudeRefinementPass(){var decoder=this.decoder;var width=this.width,height=this.height;var coefficentsMagnitude=this.coefficentsMagnitude;var neighborsSignificance=this.neighborsSignificance;var contexts=this.contexts;var bitsDecoded=this.bitsDecoded;var processingFlags=this.processingFlags;var processedMask=1;var firstMagnitudeBitMask=2;var length=width*height;var width4=width*4;for(var index0=0,indexNext;index0>1;offset=offset|0;var j,n,current,next;var alpha=-1.586134342059924;var beta=-.052980118572961;var gamma=.882911075530934;var delta=.443506852043971;var K=1.230174104914001;var K_=1/K;j=offset-3;for(n=len+4;n--;j+=2){x[j]*=K_}j=offset-2;current=delta*x[j-1];for(n=len+3;n--;j+=2){next=delta*x[j+1];x[j]=K*x[j]-current-next;if(n--){j+=2;current=delta*x[j+1];x[j]=K*x[j]-current-next}else{break}}j=offset-1;current=gamma*x[j-1];for(n=len+2;n--;j+=2){next=gamma*x[j+1];x[j]-=current+next;if(n--){j+=2;current=gamma*x[j+1];x[j]-=current+next}else{break}}j=offset;current=beta*x[j-1];for(n=len+1;n--;j+=2){next=beta*x[j+1];x[j]-=current+next;if(n--){j+=2;current=beta*x[j+1];x[j]-=current+next}else{break}}if(len!==0){j=offset+1;current=alpha*x[j-1];for(n=len;n--;j+=2){next=alpha*x[j+1];x[j]-=current+next;if(n--){j+=2;current=alpha*x[j+1];x[j]-=current+next}else{break}}}};return IrreversibleTransform}();var ReversibleTransform=function ReversibleTransformClosure(){function ReversibleTransform(){Transform.call(this)}ReversibleTransform.prototype=Object.create(Transform.prototype);ReversibleTransform.prototype.filter=function reversibleTransformFilter(x,offset,length){var len=length>>1;offset=offset|0;var j,n;for(j=offset,n=len+1;n--;j+=2){x[j]-=x[j-1]+x[j+1]+2>>2}for(j=offset+1,n=len;n--;j+=2){x[j]+=x[j-1]+x[j+1]>>1}};return ReversibleTransform}();return JpxImage}();exports.JpxImage=JpxImage});(function(root,factory){{factory(root.pdfjsCoreMetrics={},root.pdfjsSharedUtil)}})(this,function(exports,sharedUtil){var getLookupTableFactory=sharedUtil.getLookupTableFactory;var getMetrics=getLookupTableFactory(function(t){t["Courier"]=600;t["Courier-Bold"]=600;t["Courier-BoldOblique"]=600;t["Courier-Oblique"]=600;t["Helvetica"]=getLookupTableFactory(function(t){t["space"]=278;t["exclam"]=278;t["quotedbl"]=355;t["numbersign"]=556;t["dollar"]=556;t["percent"]=889;t["ampersand"]=667;t["quoteright"]=222;t["parenleft"]=333;t["parenright"]=333;t["asterisk"]=389;t["plus"]=584;t["comma"]=278;t["hyphen"]=333;t["period"]=278;t["slash"]=278;t["zero"]=556;t["one"]=556;t["two"]=556;t["three"]=556;t["four"]=556;t["five"]=556;t["six"]=556;t["seven"]=556;t["eight"]=556;t["nine"]=556;t["colon"]=278;t["semicolon"]=278;t["less"]=584;t["equal"]=584;t["greater"]=584;t["question"]=556;t["at"]=1015;t["A"]=667;t["B"]=667;t["C"]=722;t["D"]=722;t["E"]=667;t["F"]=611;t["G"]=778;t["H"]=722;t["I"]=278;t["J"]=500;t["K"]=667;t["L"]=556;t["M"]=833;t["N"]=722;t["O"]=778;t["P"]=667;t["Q"]=778;t["R"]=722;t["S"]=667;t["T"]=611;t["U"]=722;t["V"]=667;t["W"]=944;t["X"]=667;t["Y"]=667;t["Z"]=611;t["bracketleft"]=278;t["backslash"]=278;t["bracketright"]=278;t["asciicircum"]=469;t["underscore"]=556;t["quoteleft"]=222;t["a"]=556;t["b"]=556;t["c"]=500;t["d"]=556;t["e"]=556;t["f"]=278;t["g"]=556;t["h"]=556;t["i"]=222;t["j"]=222;t["k"]=500;t["l"]=222;t["m"]=833;t["n"]=556;t["o"]=556;t["p"]=556;t["q"]=556;t["r"]=333;t["s"]=500;t["t"]=278;t["u"]=556;t["v"]=500;t["w"]=722;t["x"]=500;t["y"]=500;t["z"]=500;t["braceleft"]=334;t["bar"]=260;t["braceright"]=334;t["asciitilde"]=584;t["exclamdown"]=333;t["cent"]=556;t["sterling"]=556;t["fraction"]=167;t["yen"]=556;t["florin"]=556;t["section"]=556;t["currency"]=556;t["quotesingle"]=191;t["quotedblleft"]=333;t["guillemotleft"]=556;t["guilsinglleft"]=333;t["guilsinglright"]=333;t["fi"]=500;t["fl"]=500;t["endash"]=556;t["dagger"]=556;t["daggerdbl"]=556;t["periodcentered"]=278;t["paragraph"]=537;t["bullet"]=350;t["quotesinglbase"]=222;t["quotedblbase"]=333;t["quotedblright"]=333;t["guillemotright"]=556;t["ellipsis"]=1e3;t["perthousand"]=1e3;t["questiondown"]=611;t["grave"]=333;t["acute"]=333;t["circumflex"]=333;t["tilde"]=333;t["macron"]=333;t["breve"]=333;t["dotaccent"]=333;t["dieresis"]=333;t["ring"]=333;t["cedilla"]=333;t["hungarumlaut"]=333;t["ogonek"]=333;t["caron"]=333;t["emdash"]=1e3;t["AE"]=1e3;t["ordfeminine"]=370;t["Lslash"]=556;t["Oslash"]=778;t["OE"]=1e3;t["ordmasculine"]=365;t["ae"]=889;t["dotlessi"]=278;t["lslash"]=222;t["oslash"]=611;t["oe"]=944;t["germandbls"]=611;t["Idieresis"]=278;t["eacute"]=556;t["abreve"]=556;t["uhungarumlaut"]=556;t["ecaron"]=556;t["Ydieresis"]=667;t["divide"]=584;t["Yacute"]=667;t["Acircumflex"]=667;t["aacute"]=556;t["Ucircumflex"]=722;t["yacute"]=500;t["scommaaccent"]=500;t["ecircumflex"]=556;t["Uring"]=722;t["Udieresis"]=722;t["aogonek"]=556;t["Uacute"]=722;t["uogonek"]=556;t["Edieresis"]=667;t["Dcroat"]=722;t["commaaccent"]=250;t["copyright"]=737;t["Emacron"]=667;t["ccaron"]=500;t["aring"]=556;t["Ncommaaccent"]=722;t["lacute"]=222;t["agrave"]=556;t["Tcommaaccent"]=611;t["Cacute"]=722;t["atilde"]=556;t["Edotaccent"]=667;t["scaron"]=500;t["scedilla"]=500;t["iacute"]=278;t["lozenge"]=471;t["Rcaron"]=722;t["Gcommaaccent"]=778;t["ucircumflex"]=556;t["acircumflex"]=556;t["Amacron"]=667;t["rcaron"]=333;t["ccedilla"]=500;t["Zdotaccent"]=611;t["Thorn"]=667;t["Omacron"]=778;t["Racute"]=722;t["Sacute"]=667;t["dcaron"]=643;t["Umacron"]=722;t["uring"]=556;t["threesuperior"]=333;t["Ograve"]=778;t["Agrave"]=667;t["Abreve"]=667;t["multiply"]=584;t["uacute"]=556;t["Tcaron"]=611;t["partialdiff"]=476;t["ydieresis"]=500;t["Nacute"]=722;t["icircumflex"]=278;t["Ecircumflex"]=667;t["adieresis"]=556;t["edieresis"]=556;t["cacute"]=500;t["nacute"]=556;t["umacron"]=556;t["Ncaron"]=722;t["Iacute"]=278;t["plusminus"]=584;t["brokenbar"]=260;t["registered"]=737;t["Gbreve"]=778;t["Idotaccent"]=278;t["summation"]=600;t["Egrave"]=667;t["racute"]=333;t["omacron"]=556;t["Zacute"]=611;t["Zcaron"]=611;t["greaterequal"]=549;t["Eth"]=722;t["Ccedilla"]=722;t["lcommaaccent"]=222;t["tcaron"]=317;t["eogonek"]=556;t["Uogonek"]=722;t["Aacute"]=667;t["Adieresis"]=667;t["egrave"]=556;t["zacute"]=500;t["iogonek"]=222;t["Oacute"]=778;t["oacute"]=556;t["amacron"]=556;t["sacute"]=500;t["idieresis"]=278;t["Ocircumflex"]=778;t["Ugrave"]=722;t["Delta"]=612;t["thorn"]=556;t["twosuperior"]=333;t["Odieresis"]=778;t["mu"]=556;t["igrave"]=278;t["ohungarumlaut"]=556;t["Eogonek"]=667;t["dcroat"]=556;t["threequarters"]=834;t["Scedilla"]=667;t["lcaron"]=299;t["Kcommaaccent"]=667;t["Lacute"]=556;t["trademark"]=1e3;t["edotaccent"]=556;t["Igrave"]=278;t["Imacron"]=278;t["Lcaron"]=556;t["onehalf"]=834;t["lessequal"]=549;t["ocircumflex"]=556;t["ntilde"]=556;t["Uhungarumlaut"]=722;t["Eacute"]=667;t["emacron"]=556;t["gbreve"]=556;t["onequarter"]=834;t["Scaron"]=667;t["Scommaaccent"]=667;t["Ohungarumlaut"]=778;t["degree"]=400;t["ograve"]=556;t["Ccaron"]=722;t["ugrave"]=556;t["radical"]=453;t["Dcaron"]=722;t["rcommaaccent"]=333;t["Ntilde"]=722;t["otilde"]=556;t["Rcommaaccent"]=722;t["Lcommaaccent"]=556;t["Atilde"]=667;t["Aogonek"]=667;t["Aring"]=667;t["Otilde"]=778;t["zdotaccent"]=500;t["Ecaron"]=667;t["Iogonek"]=278;t["kcommaaccent"]=500;t["minus"]=584;t["Icircumflex"]=278;t["ncaron"]=556;t["tcommaaccent"]=278;t["logicalnot"]=584;t["odieresis"]=556;t["udieresis"]=556;t["notequal"]=549;t["gcommaaccent"]=556;t["eth"]=556;t["zcaron"]=500;t["ncommaaccent"]=556;t["onesuperior"]=333;t["imacron"]=278;t["Euro"]=556});t["Helvetica-Bold"]=getLookupTableFactory(function(t){t["space"]=278;t["exclam"]=333;t["quotedbl"]=474;t["numbersign"]=556;t["dollar"]=556;t["percent"]=889;t["ampersand"]=722;t["quoteright"]=278;t["parenleft"]=333;t["parenright"]=333;t["asterisk"]=389;t["plus"]=584;t["comma"]=278;t["hyphen"]=333; -t["period"]=278;t["slash"]=278;t["zero"]=556;t["one"]=556;t["two"]=556;t["three"]=556;t["four"]=556;t["five"]=556;t["six"]=556;t["seven"]=556;t["eight"]=556;t["nine"]=556;t["colon"]=333;t["semicolon"]=333;t["less"]=584;t["equal"]=584;t["greater"]=584;t["question"]=611;t["at"]=975;t["A"]=722;t["B"]=722;t["C"]=722;t["D"]=722;t["E"]=667;t["F"]=611;t["G"]=778;t["H"]=722;t["I"]=278;t["J"]=556;t["K"]=722;t["L"]=611;t["M"]=833;t["N"]=722;t["O"]=778;t["P"]=667;t["Q"]=778;t["R"]=722;t["S"]=667;t["T"]=611;t["U"]=722;t["V"]=667;t["W"]=944;t["X"]=667;t["Y"]=667;t["Z"]=611;t["bracketleft"]=333;t["backslash"]=278;t["bracketright"]=333;t["asciicircum"]=584;t["underscore"]=556;t["quoteleft"]=278;t["a"]=556;t["b"]=611;t["c"]=556;t["d"]=611;t["e"]=556;t["f"]=333;t["g"]=611;t["h"]=611;t["i"]=278;t["j"]=278;t["k"]=556;t["l"]=278;t["m"]=889;t["n"]=611;t["o"]=611;t["p"]=611;t["q"]=611;t["r"]=389;t["s"]=556;t["t"]=333;t["u"]=611;t["v"]=556;t["w"]=778;t["x"]=556;t["y"]=556;t["z"]=500;t["braceleft"]=389;t["bar"]=280;t["braceright"]=389;t["asciitilde"]=584;t["exclamdown"]=333;t["cent"]=556;t["sterling"]=556;t["fraction"]=167;t["yen"]=556;t["florin"]=556;t["section"]=556;t["currency"]=556;t["quotesingle"]=238;t["quotedblleft"]=500;t["guillemotleft"]=556;t["guilsinglleft"]=333;t["guilsinglright"]=333;t["fi"]=611;t["fl"]=611;t["endash"]=556;t["dagger"]=556;t["daggerdbl"]=556;t["periodcentered"]=278;t["paragraph"]=556;t["bullet"]=350;t["quotesinglbase"]=278;t["quotedblbase"]=500;t["quotedblright"]=500;t["guillemotright"]=556;t["ellipsis"]=1e3;t["perthousand"]=1e3;t["questiondown"]=611;t["grave"]=333;t["acute"]=333;t["circumflex"]=333;t["tilde"]=333;t["macron"]=333;t["breve"]=333;t["dotaccent"]=333;t["dieresis"]=333;t["ring"]=333;t["cedilla"]=333;t["hungarumlaut"]=333;t["ogonek"]=333;t["caron"]=333;t["emdash"]=1e3;t["AE"]=1e3;t["ordfeminine"]=370;t["Lslash"]=611;t["Oslash"]=778;t["OE"]=1e3;t["ordmasculine"]=365;t["ae"]=889;t["dotlessi"]=278;t["lslash"]=278;t["oslash"]=611;t["oe"]=944;t["germandbls"]=611;t["Idieresis"]=278;t["eacute"]=556;t["abreve"]=556;t["uhungarumlaut"]=611;t["ecaron"]=556;t["Ydieresis"]=667;t["divide"]=584;t["Yacute"]=667;t["Acircumflex"]=722;t["aacute"]=556;t["Ucircumflex"]=722;t["yacute"]=556;t["scommaaccent"]=556;t["ecircumflex"]=556;t["Uring"]=722;t["Udieresis"]=722;t["aogonek"]=556;t["Uacute"]=722;t["uogonek"]=611;t["Edieresis"]=667;t["Dcroat"]=722;t["commaaccent"]=250;t["copyright"]=737;t["Emacron"]=667;t["ccaron"]=556;t["aring"]=556;t["Ncommaaccent"]=722;t["lacute"]=278;t["agrave"]=556;t["Tcommaaccent"]=611;t["Cacute"]=722;t["atilde"]=556;t["Edotaccent"]=667;t["scaron"]=556;t["scedilla"]=556;t["iacute"]=278;t["lozenge"]=494;t["Rcaron"]=722;t["Gcommaaccent"]=778;t["ucircumflex"]=611;t["acircumflex"]=556;t["Amacron"]=722;t["rcaron"]=389;t["ccedilla"]=556;t["Zdotaccent"]=611;t["Thorn"]=667;t["Omacron"]=778;t["Racute"]=722;t["Sacute"]=667;t["dcaron"]=743;t["Umacron"]=722;t["uring"]=611;t["threesuperior"]=333;t["Ograve"]=778;t["Agrave"]=722;t["Abreve"]=722;t["multiply"]=584;t["uacute"]=611;t["Tcaron"]=611;t["partialdiff"]=494;t["ydieresis"]=556;t["Nacute"]=722;t["icircumflex"]=278;t["Ecircumflex"]=667;t["adieresis"]=556;t["edieresis"]=556;t["cacute"]=556;t["nacute"]=611;t["umacron"]=611;t["Ncaron"]=722;t["Iacute"]=278;t["plusminus"]=584;t["brokenbar"]=280;t["registered"]=737;t["Gbreve"]=778;t["Idotaccent"]=278;t["summation"]=600;t["Egrave"]=667;t["racute"]=389;t["omacron"]=611;t["Zacute"]=611;t["Zcaron"]=611;t["greaterequal"]=549;t["Eth"]=722;t["Ccedilla"]=722;t["lcommaaccent"]=278;t["tcaron"]=389;t["eogonek"]=556;t["Uogonek"]=722;t["Aacute"]=722;t["Adieresis"]=722;t["egrave"]=556;t["zacute"]=500;t["iogonek"]=278;t["Oacute"]=778;t["oacute"]=611;t["amacron"]=556;t["sacute"]=556;t["idieresis"]=278;t["Ocircumflex"]=778;t["Ugrave"]=722;t["Delta"]=612;t["thorn"]=611;t["twosuperior"]=333;t["Odieresis"]=778;t["mu"]=611;t["igrave"]=278;t["ohungarumlaut"]=611;t["Eogonek"]=667;t["dcroat"]=611;t["threequarters"]=834;t["Scedilla"]=667;t["lcaron"]=400;t["Kcommaaccent"]=722;t["Lacute"]=611;t["trademark"]=1e3;t["edotaccent"]=556;t["Igrave"]=278;t["Imacron"]=278;t["Lcaron"]=611;t["onehalf"]=834;t["lessequal"]=549;t["ocircumflex"]=611;t["ntilde"]=611;t["Uhungarumlaut"]=722;t["Eacute"]=667;t["emacron"]=556;t["gbreve"]=611;t["onequarter"]=834;t["Scaron"]=667;t["Scommaaccent"]=667;t["Ohungarumlaut"]=778;t["degree"]=400;t["ograve"]=611;t["Ccaron"]=722;t["ugrave"]=611;t["radical"]=549;t["Dcaron"]=722;t["rcommaaccent"]=389;t["Ntilde"]=722;t["otilde"]=611;t["Rcommaaccent"]=722;t["Lcommaaccent"]=611;t["Atilde"]=722;t["Aogonek"]=722;t["Aring"]=722;t["Otilde"]=778;t["zdotaccent"]=500;t["Ecaron"]=667;t["Iogonek"]=278;t["kcommaaccent"]=556;t["minus"]=584;t["Icircumflex"]=278;t["ncaron"]=611;t["tcommaaccent"]=333;t["logicalnot"]=584;t["odieresis"]=611;t["udieresis"]=611;t["notequal"]=549;t["gcommaaccent"]=611;t["eth"]=611;t["zcaron"]=500;t["ncommaaccent"]=611;t["onesuperior"]=333;t["imacron"]=278;t["Euro"]=556});t["Helvetica-BoldOblique"]=getLookupTableFactory(function(t){t["space"]=278;t["exclam"]=333;t["quotedbl"]=474;t["numbersign"]=556;t["dollar"]=556;t["percent"]=889;t["ampersand"]=722;t["quoteright"]=278;t["parenleft"]=333;t["parenright"]=333;t["asterisk"]=389;t["plus"]=584;t["comma"]=278;t["hyphen"]=333;t["period"]=278;t["slash"]=278;t["zero"]=556;t["one"]=556;t["two"]=556;t["three"]=556;t["four"]=556;t["five"]=556;t["six"]=556;t["seven"]=556;t["eight"]=556;t["nine"]=556;t["colon"]=333;t["semicolon"]=333;t["less"]=584;t["equal"]=584;t["greater"]=584;t["question"]=611;t["at"]=975;t["A"]=722;t["B"]=722;t["C"]=722;t["D"]=722;t["E"]=667;t["F"]=611;t["G"]=778;t["H"]=722;t["I"]=278;t["J"]=556;t["K"]=722;t["L"]=611;t["M"]=833;t["N"]=722;t["O"]=778;t["P"]=667;t["Q"]=778;t["R"]=722;t["S"]=667;t["T"]=611;t["U"]=722;t["V"]=667;t["W"]=944;t["X"]=667;t["Y"]=667;t["Z"]=611;t["bracketleft"]=333;t["backslash"]=278;t["bracketright"]=333;t["asciicircum"]=584;t["underscore"]=556;t["quoteleft"]=278;t["a"]=556;t["b"]=611;t["c"]=556;t["d"]=611;t["e"]=556;t["f"]=333;t["g"]=611;t["h"]=611;t["i"]=278;t["j"]=278;t["k"]=556;t["l"]=278;t["m"]=889;t["n"]=611;t["o"]=611;t["p"]=611;t["q"]=611;t["r"]=389;t["s"]=556;t["t"]=333;t["u"]=611;t["v"]=556;t["w"]=778;t["x"]=556;t["y"]=556;t["z"]=500;t["braceleft"]=389;t["bar"]=280;t["braceright"]=389;t["asciitilde"]=584;t["exclamdown"]=333;t["cent"]=556;t["sterling"]=556;t["fraction"]=167;t["yen"]=556;t["florin"]=556;t["section"]=556;t["currency"]=556;t["quotesingle"]=238;t["quotedblleft"]=500;t["guillemotleft"]=556;t["guilsinglleft"]=333;t["guilsinglright"]=333;t["fi"]=611;t["fl"]=611;t["endash"]=556;t["dagger"]=556;t["daggerdbl"]=556;t["periodcentered"]=278;t["paragraph"]=556;t["bullet"]=350;t["quotesinglbase"]=278;t["quotedblbase"]=500;t["quotedblright"]=500;t["guillemotright"]=556;t["ellipsis"]=1e3;t["perthousand"]=1e3;t["questiondown"]=611;t["grave"]=333;t["acute"]=333;t["circumflex"]=333;t["tilde"]=333;t["macron"]=333;t["breve"]=333;t["dotaccent"]=333;t["dieresis"]=333;t["ring"]=333;t["cedilla"]=333;t["hungarumlaut"]=333;t["ogonek"]=333;t["caron"]=333;t["emdash"]=1e3;t["AE"]=1e3;t["ordfeminine"]=370;t["Lslash"]=611;t["Oslash"]=778;t["OE"]=1e3;t["ordmasculine"]=365;t["ae"]=889;t["dotlessi"]=278;t["lslash"]=278;t["oslash"]=611;t["oe"]=944;t["germandbls"]=611;t["Idieresis"]=278;t["eacute"]=556;t["abreve"]=556;t["uhungarumlaut"]=611;t["ecaron"]=556;t["Ydieresis"]=667;t["divide"]=584;t["Yacute"]=667;t["Acircumflex"]=722;t["aacute"]=556;t["Ucircumflex"]=722;t["yacute"]=556;t["scommaaccent"]=556;t["ecircumflex"]=556;t["Uring"]=722;t["Udieresis"]=722;t["aogonek"]=556;t["Uacute"]=722;t["uogonek"]=611;t["Edieresis"]=667;t["Dcroat"]=722;t["commaaccent"]=250;t["copyright"]=737;t["Emacron"]=667;t["ccaron"]=556;t["aring"]=556;t["Ncommaaccent"]=722;t["lacute"]=278;t["agrave"]=556;t["Tcommaaccent"]=611;t["Cacute"]=722;t["atilde"]=556;t["Edotaccent"]=667;t["scaron"]=556;t["scedilla"]=556;t["iacute"]=278;t["lozenge"]=494;t["Rcaron"]=722;t["Gcommaaccent"]=778;t["ucircumflex"]=611;t["acircumflex"]=556;t["Amacron"]=722;t["rcaron"]=389;t["ccedilla"]=556;t["Zdotaccent"]=611;t["Thorn"]=667;t["Omacron"]=778;t["Racute"]=722;t["Sacute"]=667;t["dcaron"]=743;t["Umacron"]=722;t["uring"]=611;t["threesuperior"]=333;t["Ograve"]=778;t["Agrave"]=722;t["Abreve"]=722;t["multiply"]=584;t["uacute"]=611;t["Tcaron"]=611;t["partialdiff"]=494;t["ydieresis"]=556;t["Nacute"]=722;t["icircumflex"]=278;t["Ecircumflex"]=667;t["adieresis"]=556;t["edieresis"]=556;t["cacute"]=556;t["nacute"]=611;t["umacron"]=611;t["Ncaron"]=722;t["Iacute"]=278;t["plusminus"]=584;t["brokenbar"]=280;t["registered"]=737;t["Gbreve"]=778;t["Idotaccent"]=278;t["summation"]=600;t["Egrave"]=667;t["racute"]=389;t["omacron"]=611;t["Zacute"]=611;t["Zcaron"]=611;t["greaterequal"]=549;t["Eth"]=722;t["Ccedilla"]=722;t["lcommaaccent"]=278;t["tcaron"]=389;t["eogonek"]=556;t["Uogonek"]=722;t["Aacute"]=722;t["Adieresis"]=722;t["egrave"]=556;t["zacute"]=500;t["iogonek"]=278;t["Oacute"]=778;t["oacute"]=611;t["amacron"]=556;t["sacute"]=556;t["idieresis"]=278;t["Ocircumflex"]=778;t["Ugrave"]=722;t["Delta"]=612;t["thorn"]=611;t["twosuperior"]=333;t["Odieresis"]=778;t["mu"]=611;t["igrave"]=278;t["ohungarumlaut"]=611;t["Eogonek"]=667;t["dcroat"]=611;t["threequarters"]=834;t["Scedilla"]=667;t["lcaron"]=400;t["Kcommaaccent"]=722;t["Lacute"]=611;t["trademark"]=1e3;t["edotaccent"]=556;t["Igrave"]=278;t["Imacron"]=278;t["Lcaron"]=611;t["onehalf"]=834;t["lessequal"]=549;t["ocircumflex"]=611;t["ntilde"]=611;t["Uhungarumlaut"]=722;t["Eacute"]=667;t["emacron"]=556;t["gbreve"]=611;t["onequarter"]=834;t["Scaron"]=667;t["Scommaaccent"]=667;t["Ohungarumlaut"]=778;t["degree"]=400;t["ograve"]=611;t["Ccaron"]=722;t["ugrave"]=611;t["radical"]=549;t["Dcaron"]=722;t["rcommaaccent"]=389;t["Ntilde"]=722;t["otilde"]=611;t["Rcommaaccent"]=722;t["Lcommaaccent"]=611;t["Atilde"]=722;t["Aogonek"]=722;t["Aring"]=722;t["Otilde"]=778;t["zdotaccent"]=500;t["Ecaron"]=667;t["Iogonek"]=278;t["kcommaaccent"]=556;t["minus"]=584;t["Icircumflex"]=278;t["ncaron"]=611;t["tcommaaccent"]=333;t["logicalnot"]=584;t["odieresis"]=611;t["udieresis"]=611;t["notequal"]=549;t["gcommaaccent"]=611;t["eth"]=611;t["zcaron"]=500;t["ncommaaccent"]=611;t["onesuperior"]=333;t["imacron"]=278;t["Euro"]=556});t["Helvetica-Oblique"]=getLookupTableFactory(function(t){t["space"]=278;t["exclam"]=278;t["quotedbl"]=355;t["numbersign"]=556;t["dollar"]=556;t["percent"]=889;t["ampersand"]=667;t["quoteright"]=222;t["parenleft"]=333;t["parenright"]=333;t["asterisk"]=389;t["plus"]=584;t["comma"]=278;t["hyphen"]=333;t["period"]=278;t["slash"]=278;t["zero"]=556;t["one"]=556;t["two"]=556;t["three"]=556;t["four"]=556;t["five"]=556;t["six"]=556;t["seven"]=556;t["eight"]=556;t["nine"]=556;t["colon"]=278;t["semicolon"]=278;t["less"]=584;t["equal"]=584;t["greater"]=584;t["question"]=556;t["at"]=1015;t["A"]=667;t["B"]=667;t["C"]=722;t["D"]=722;t["E"]=667;t["F"]=611;t["G"]=778;t["H"]=722;t["I"]=278;t["J"]=500;t["K"]=667;t["L"]=556;t["M"]=833;t["N"]=722;t["O"]=778;t["P"]=667;t["Q"]=778;t["R"]=722;t["S"]=667;t["T"]=611;t["U"]=722;t["V"]=667;t["W"]=944;t["X"]=667;t["Y"]=667;t["Z"]=611;t["bracketleft"]=278;t["backslash"]=278;t["bracketright"]=278;t["asciicircum"]=469;t["underscore"]=556;t["quoteleft"]=222;t["a"]=556;t["b"]=556;t["c"]=500;t["d"]=556;t["e"]=556;t["f"]=278;t["g"]=556;t["h"]=556;t["i"]=222;t["j"]=222;t["k"]=500;t["l"]=222;t["m"]=833;t["n"]=556;t["o"]=556;t["p"]=556;t["q"]=556;t["r"]=333;t["s"]=500;t["t"]=278;t["u"]=556;t["v"]=500;t["w"]=722;t["x"]=500;t["y"]=500;t["z"]=500;t["braceleft"]=334;t["bar"]=260;t["braceright"]=334;t["asciitilde"]=584;t["exclamdown"]=333;t["cent"]=556;t["sterling"]=556;t["fraction"]=167;t["yen"]=556;t["florin"]=556;t["section"]=556;t["currency"]=556;t["quotesingle"]=191;t["quotedblleft"]=333;t["guillemotleft"]=556;t["guilsinglleft"]=333;t["guilsinglright"]=333;t["fi"]=500;t["fl"]=500;t["endash"]=556;t["dagger"]=556;t["daggerdbl"]=556;t["periodcentered"]=278;t["paragraph"]=537;t["bullet"]=350;t["quotesinglbase"]=222;t["quotedblbase"]=333;t["quotedblright"]=333;t["guillemotright"]=556;t["ellipsis"]=1e3;t["perthousand"]=1e3;t["questiondown"]=611;t["grave"]=333;t["acute"]=333;t["circumflex"]=333;t["tilde"]=333;t["macron"]=333;t["breve"]=333;t["dotaccent"]=333;t["dieresis"]=333;t["ring"]=333;t["cedilla"]=333;t["hungarumlaut"]=333;t["ogonek"]=333;t["caron"]=333;t["emdash"]=1e3;t["AE"]=1e3;t["ordfeminine"]=370;t["Lslash"]=556;t["Oslash"]=778;t["OE"]=1e3;t["ordmasculine"]=365;t["ae"]=889;t["dotlessi"]=278;t["lslash"]=222;t["oslash"]=611;t["oe"]=944;t["germandbls"]=611;t["Idieresis"]=278;t["eacute"]=556;t["abreve"]=556;t["uhungarumlaut"]=556;t["ecaron"]=556;t["Ydieresis"]=667;t["divide"]=584;t["Yacute"]=667;t["Acircumflex"]=667;t["aacute"]=556;t["Ucircumflex"]=722;t["yacute"]=500;t["scommaaccent"]=500;t["ecircumflex"]=556;t["Uring"]=722;t["Udieresis"]=722;t["aogonek"]=556;t["Uacute"]=722;t["uogonek"]=556;t["Edieresis"]=667;t["Dcroat"]=722;t["commaaccent"]=250;t["copyright"]=737;t["Emacron"]=667;t["ccaron"]=500;t["aring"]=556;t["Ncommaaccent"]=722;t["lacute"]=222;t["agrave"]=556;t["Tcommaaccent"]=611;t["Cacute"]=722;t["atilde"]=556;t["Edotaccent"]=667;t["scaron"]=500;t["scedilla"]=500;t["iacute"]=278;t["lozenge"]=471;t["Rcaron"]=722;t["Gcommaaccent"]=778;t["ucircumflex"]=556;t["acircumflex"]=556;t["Amacron"]=667;t["rcaron"]=333;t["ccedilla"]=500;t["Zdotaccent"]=611;t["Thorn"]=667;t["Omacron"]=778;t["Racute"]=722;t["Sacute"]=667;t["dcaron"]=643;t["Umacron"]=722;t["uring"]=556;t["threesuperior"]=333;t["Ograve"]=778;t["Agrave"]=667;t["Abreve"]=667;t["multiply"]=584;t["uacute"]=556;t["Tcaron"]=611;t["partialdiff"]=476;t["ydieresis"]=500;t["Nacute"]=722;t["icircumflex"]=278;t["Ecircumflex"]=667;t["adieresis"]=556;t["edieresis"]=556;t["cacute"]=500;t["nacute"]=556;t["umacron"]=556;t["Ncaron"]=722;t["Iacute"]=278;t["plusminus"]=584;t["brokenbar"]=260;t["registered"]=737;t["Gbreve"]=778;t["Idotaccent"]=278;t["summation"]=600;t["Egrave"]=667;t["racute"]=333;t["omacron"]=556;t["Zacute"]=611;t["Zcaron"]=611;t["greaterequal"]=549;t["Eth"]=722;t["Ccedilla"]=722;t["lcommaaccent"]=222;t["tcaron"]=317;t["eogonek"]=556;t["Uogonek"]=722;t["Aacute"]=667;t["Adieresis"]=667;t["egrave"]=556;t["zacute"]=500;t["iogonek"]=222;t["Oacute"]=778;t["oacute"]=556;t["amacron"]=556;t["sacute"]=500;t["idieresis"]=278;t["Ocircumflex"]=778;t["Ugrave"]=722;t["Delta"]=612;t["thorn"]=556;t["twosuperior"]=333;t["Odieresis"]=778;t["mu"]=556;t["igrave"]=278;t["ohungarumlaut"]=556;t["Eogonek"]=667;t["dcroat"]=556;t["threequarters"]=834;t["Scedilla"]=667;t["lcaron"]=299;t["Kcommaaccent"]=667;t["Lacute"]=556;t["trademark"]=1e3;t["edotaccent"]=556;t["Igrave"]=278;t["Imacron"]=278;t["Lcaron"]=556;t["onehalf"]=834;t["lessequal"]=549;t["ocircumflex"]=556;t["ntilde"]=556;t["Uhungarumlaut"]=722;t["Eacute"]=667;t["emacron"]=556;t["gbreve"]=556;t["onequarter"]=834;t["Scaron"]=667;t["Scommaaccent"]=667;t["Ohungarumlaut"]=778;t["degree"]=400;t["ograve"]=556;t["Ccaron"]=722;t["ugrave"]=556;t["radical"]=453;t["Dcaron"]=722;t["rcommaaccent"]=333;t["Ntilde"]=722;t["otilde"]=556;t["Rcommaaccent"]=722;t["Lcommaaccent"]=556;t["Atilde"]=667;t["Aogonek"]=667;t["Aring"]=667;t["Otilde"]=778;t["zdotaccent"]=500;t["Ecaron"]=667;t["Iogonek"]=278;t["kcommaaccent"]=500;t["minus"]=584;t["Icircumflex"]=278;t["ncaron"]=556;t["tcommaaccent"]=278;t["logicalnot"]=584;t["odieresis"]=556;t["udieresis"]=556;t["notequal"]=549;t["gcommaaccent"]=556;t["eth"]=556;t["zcaron"]=500;t["ncommaaccent"]=556;t["onesuperior"]=333;t["imacron"]=278;t["Euro"]=556});t["Symbol"]=getLookupTableFactory(function(t){t["space"]=250;t["exclam"]=333;t["universal"]=713;t["numbersign"]=500;t["existential"]=549;t["percent"]=833;t["ampersand"]=778;t["suchthat"]=439;t["parenleft"]=333;t["parenright"]=333;t["asteriskmath"]=500;t["plus"]=549;t["comma"]=250;t["minus"]=549;t["period"]=250;t["slash"]=278;t["zero"]=500;t["one"]=500;t["two"]=500;t["three"]=500;t["four"]=500;t["five"]=500;t["six"]=500;t["seven"]=500;t["eight"]=500;t["nine"]=500;t["colon"]=278;t["semicolon"]=278;t["less"]=549;t["equal"]=549;t["greater"]=549;t["question"]=444;t["congruent"]=549;t["Alpha"]=722;t["Beta"]=667;t["Chi"]=722;t["Delta"]=612;t["Epsilon"]=611;t["Phi"]=763;t["Gamma"]=603;t["Eta"]=722;t["Iota"]=333;t["theta1"]=631;t["Kappa"]=722;t["Lambda"]=686;t["Mu"]=889;t["Nu"]=722;t["Omicron"]=722;t["Pi"]=768;t["Theta"]=741;t["Rho"]=556;t["Sigma"]=592;t["Tau"]=611;t["Upsilon"]=690;t["sigma1"]=439;t["Omega"]=768;t["Xi"]=645;t["Psi"]=795;t["Zeta"]=611;t["bracketleft"]=333;t["therefore"]=863;t["bracketright"]=333;t["perpendicular"]=658;t["underscore"]=500;t["radicalex"]=500;t["alpha"]=631;t["beta"]=549;t["chi"]=549;t["delta"]=494;t["epsilon"]=439;t["phi"]=521;t["gamma"]=411;t["eta"]=603;t["iota"]=329;t["phi1"]=603;t["kappa"]=549;t["lambda"]=549;t["mu"]=576;t["nu"]=521;t["omicron"]=549;t["pi"]=549;t["theta"]=521;t["rho"]=549;t["sigma"]=603;t["tau"]=439;t["upsilon"]=576;t["omega1"]=713;t["omega"]=686;t["xi"]=493;t["psi"]=686;t["zeta"]=494;t["braceleft"]=480;t["bar"]=200;t["braceright"]=480;t["similar"]=549;t["Euro"]=750;t["Upsilon1"]=620;t["minute"]=247;t["lessequal"]=549;t["fraction"]=167;t["infinity"]=713;t["florin"]=500;t["club"]=753;t["diamond"]=753;t["heart"]=753;t["spade"]=753;t["arrowboth"]=1042;t["arrowleft"]=987;t["arrowup"]=603;t["arrowright"]=987;t["arrowdown"]=603;t["degree"]=400;t["plusminus"]=549;t["second"]=411;t["greaterequal"]=549;t["multiply"]=549;t["proportional"]=713;t["partialdiff"]=494;t["bullet"]=460;t["divide"]=549;t["notequal"]=549;t["equivalence"]=549;t["approxequal"]=549;t["ellipsis"]=1e3;t["arrowvertex"]=603;t["arrowhorizex"]=1e3;t["carriagereturn"]=658;t["aleph"]=823;t["Ifraktur"]=686;t["Rfraktur"]=795;t["weierstrass"]=987;t["circlemultiply"]=768;t["circleplus"]=768;t["emptyset"]=823;t["intersection"]=768;t["union"]=768;t["propersuperset"]=713;t["reflexsuperset"]=713;t["notsubset"]=713;t["propersubset"]=713;t["reflexsubset"]=713;t["element"]=713;t["notelement"]=713;t["angle"]=768;t["gradient"]=713;t["registerserif"]=790;t["copyrightserif"]=790;t["trademarkserif"]=890;t["product"]=823;t["radical"]=549;t["dotmath"]=250;t["logicalnot"]=713;t["logicaland"]=603;t["logicalor"]=603;t["arrowdblboth"]=1042;t["arrowdblleft"]=987;t["arrowdblup"]=603;t["arrowdblright"]=987;t["arrowdbldown"]=603;t["lozenge"]=494;t["angleleft"]=329;t["registersans"]=790;t["copyrightsans"]=790;t["trademarksans"]=786;t["summation"]=713;t["parenlefttp"]=384;t["parenleftex"]=384;t["parenleftbt"]=384;t["bracketlefttp"]=384;t["bracketleftex"]=384;t["bracketleftbt"]=384;t["bracelefttp"]=494;t["braceleftmid"]=494;t["braceleftbt"]=494;t["braceex"]=494;t["angleright"]=329;t["integral"]=274;t["integraltp"]=686;t["integralex"]=686;t["integralbt"]=686;t["parenrighttp"]=384;t["parenrightex"]=384;t["parenrightbt"]=384;t["bracketrighttp"]=384;t["bracketrightex"]=384;t["bracketrightbt"]=384;t["bracerighttp"]=494;t["bracerightmid"]=494;t["bracerightbt"]=494;t["apple"]=790});t["Times-Roman"]=getLookupTableFactory(function(t){t["space"]=250;t["exclam"]=333;t["quotedbl"]=408;t["numbersign"]=500;t["dollar"]=500;t["percent"]=833;t["ampersand"]=778;t["quoteright"]=333;t["parenleft"]=333;t["parenright"]=333;t["asterisk"]=500;t["plus"]=564;t["comma"]=250;t["hyphen"]=333;t["period"]=250;t["slash"]=278;t["zero"]=500;t["one"]=500;t["two"]=500;t["three"]=500;t["four"]=500;t["five"]=500;t["six"]=500;t["seven"]=500;t["eight"]=500;t["nine"]=500;t["colon"]=278;t["semicolon"]=278;t["less"]=564;t["equal"]=564;t["greater"]=564;t["question"]=444;t["at"]=921;t["A"]=722;t["B"]=667;t["C"]=667;t["D"]=722;t["E"]=611;t["F"]=556;t["G"]=722;t["H"]=722;t["I"]=333;t["J"]=389;t["K"]=722;t["L"]=611;t["M"]=889;t["N"]=722;t["O"]=722;t["P"]=556;t["Q"]=722;t["R"]=667;t["S"]=556;t["T"]=611;t["U"]=722;t["V"]=722;t["W"]=944;t["X"]=722;t["Y"]=722;t["Z"]=611;t["bracketleft"]=333;t["backslash"]=278;t["bracketright"]=333;t["asciicircum"]=469;t["underscore"]=500;t["quoteleft"]=333;t["a"]=444;t["b"]=500;t["c"]=444;t["d"]=500;t["e"]=444;t["f"]=333;t["g"]=500;t["h"]=500;t["i"]=278;t["j"]=278;t["k"]=500;t["l"]=278;t["m"]=778;t["n"]=500;t["o"]=500;t["p"]=500;t["q"]=500;t["r"]=333;t["s"]=389;t["t"]=278;t["u"]=500;t["v"]=500;t["w"]=722;t["x"]=500;t["y"]=500;t["z"]=444;t["braceleft"]=480;t["bar"]=200;t["braceright"]=480;t["asciitilde"]=541;t["exclamdown"]=333;t["cent"]=500;t["sterling"]=500;t["fraction"]=167;t["yen"]=500;t["florin"]=500;t["section"]=500;t["currency"]=500;t["quotesingle"]=180;t["quotedblleft"]=444;t["guillemotleft"]=500;t["guilsinglleft"]=333;t["guilsinglright"]=333;t["fi"]=556;t["fl"]=556;t["endash"]=500;t["dagger"]=500;t["daggerdbl"]=500;t["periodcentered"]=250;t["paragraph"]=453;t["bullet"]=350;t["quotesinglbase"]=333;t["quotedblbase"]=444;t["quotedblright"]=444;t["guillemotright"]=500;t["ellipsis"]=1e3;t["perthousand"]=1e3;t["questiondown"]=444;t["grave"]=333;t["acute"]=333;t["circumflex"]=333;t["tilde"]=333;t["macron"]=333;t["breve"]=333;t["dotaccent"]=333;t["dieresis"]=333;t["ring"]=333;t["cedilla"]=333;t["hungarumlaut"]=333;t["ogonek"]=333;t["caron"]=333;t["emdash"]=1e3;t["AE"]=889;t["ordfeminine"]=276;t["Lslash"]=611;t["Oslash"]=722;t["OE"]=889;t["ordmasculine"]=310;t["ae"]=667;t["dotlessi"]=278;t["lslash"]=278;t["oslash"]=500;t["oe"]=722;t["germandbls"]=500;t["Idieresis"]=333;t["eacute"]=444;t["abreve"]=444;t["uhungarumlaut"]=500;t["ecaron"]=444;t["Ydieresis"]=722;t["divide"]=564;t["Yacute"]=722;t["Acircumflex"]=722;t["aacute"]=444;t["Ucircumflex"]=722;t["yacute"]=500;t["scommaaccent"]=389;t["ecircumflex"]=444;t["Uring"]=722;t["Udieresis"]=722;t["aogonek"]=444;t["Uacute"]=722;t["uogonek"]=500;t["Edieresis"]=611;t["Dcroat"]=722;t["commaaccent"]=250;t["copyright"]=760;t["Emacron"]=611;t["ccaron"]=444;t["aring"]=444;t["Ncommaaccent"]=722;t["lacute"]=278;t["agrave"]=444;t["Tcommaaccent"]=611;t["Cacute"]=667;t["atilde"]=444;t["Edotaccent"]=611;t["scaron"]=389;t["scedilla"]=389;t["iacute"]=278;t["lozenge"]=471;t["Rcaron"]=667;t["Gcommaaccent"]=722;t["ucircumflex"]=500;t["acircumflex"]=444;t["Amacron"]=722;t["rcaron"]=333;t["ccedilla"]=444;t["Zdotaccent"]=611;t["Thorn"]=556;t["Omacron"]=722;t["Racute"]=667;t["Sacute"]=556;t["dcaron"]=588;t["Umacron"]=722;t["uring"]=500;t["threesuperior"]=300;t["Ograve"]=722;t["Agrave"]=722;t["Abreve"]=722;t["multiply"]=564;t["uacute"]=500;t["Tcaron"]=611;t["partialdiff"]=476;t["ydieresis"]=500;t["Nacute"]=722;t["icircumflex"]=278;t["Ecircumflex"]=611;t["adieresis"]=444;t["edieresis"]=444;t["cacute"]=444;t["nacute"]=500;t["umacron"]=500;t["Ncaron"]=722;t["Iacute"]=333;t["plusminus"]=564;t["brokenbar"]=200;t["registered"]=760;t["Gbreve"]=722;t["Idotaccent"]=333;t["summation"]=600;t["Egrave"]=611;t["racute"]=333;t["omacron"]=500;t["Zacute"]=611;t["Zcaron"]=611;t["greaterequal"]=549;t["Eth"]=722;t["Ccedilla"]=667;t["lcommaaccent"]=278;t["tcaron"]=326;t["eogonek"]=444;t["Uogonek"]=722;t["Aacute"]=722;t["Adieresis"]=722;t["egrave"]=444;t["zacute"]=444;t["iogonek"]=278;t["Oacute"]=722;t["oacute"]=500;t["amacron"]=444;t["sacute"]=389;t["idieresis"]=278;t["Ocircumflex"]=722;t["Ugrave"]=722;t["Delta"]=612;t["thorn"]=500;t["twosuperior"]=300;t["Odieresis"]=722;t["mu"]=500;t["igrave"]=278;t["ohungarumlaut"]=500;t["Eogonek"]=611;t["dcroat"]=500;t["threequarters"]=750;t["Scedilla"]=556;t["lcaron"]=344;t["Kcommaaccent"]=722;t["Lacute"]=611;t["trademark"]=980;t["edotaccent"]=444;t["Igrave"]=333;t["Imacron"]=333;t["Lcaron"]=611;t["onehalf"]=750;t["lessequal"]=549;t["ocircumflex"]=500;t["ntilde"]=500;t["Uhungarumlaut"]=722;t["Eacute"]=611;t["emacron"]=444;t["gbreve"]=500;t["onequarter"]=750;t["Scaron"]=556;t["Scommaaccent"]=556;t["Ohungarumlaut"]=722;t["degree"]=400;t["ograve"]=500;t["Ccaron"]=667;t["ugrave"]=500;t["radical"]=453;t["Dcaron"]=722;t["rcommaaccent"]=333;t["Ntilde"]=722;t["otilde"]=500;t["Rcommaaccent"]=667;t["Lcommaaccent"]=611;t["Atilde"]=722;t["Aogonek"]=722;t["Aring"]=722;t["Otilde"]=722;t["zdotaccent"]=444;t["Ecaron"]=611;t["Iogonek"]=333;t["kcommaaccent"]=500;t["minus"]=564;t["Icircumflex"]=333;t["ncaron"]=500;t["tcommaaccent"]=278;t["logicalnot"]=564;t["odieresis"]=500;t["udieresis"]=500;t["notequal"]=549;t["gcommaaccent"]=500;t["eth"]=500;t["zcaron"]=444;t["ncommaaccent"]=500;t["onesuperior"]=300;t["imacron"]=278;t["Euro"]=500});t["Times-Bold"]=getLookupTableFactory(function(t){t["space"]=250;t["exclam"]=333;t["quotedbl"]=555;t["numbersign"]=500;t["dollar"]=500;t["percent"]=1e3;t["ampersand"]=833;t["quoteright"]=333;t["parenleft"]=333;t["parenright"]=333;t["asterisk"]=500;t["plus"]=570;t["comma"]=250;t["hyphen"]=333;t["period"]=250;t["slash"]=278;t["zero"]=500;t["one"]=500;t["two"]=500;t["three"]=500;t["four"]=500;t["five"]=500;t["six"]=500;t["seven"]=500;t["eight"]=500;t["nine"]=500;t["colon"]=333;t["semicolon"]=333;t["less"]=570;t["equal"]=570;t["greater"]=570;t["question"]=500;t["at"]=930;t["A"]=722;t["B"]=667;t["C"]=722;t["D"]=722;t["E"]=667;t["F"]=611;t["G"]=778;t["H"]=778;t["I"]=389;t["J"]=500;t["K"]=778;t["L"]=667;t["M"]=944;t["N"]=722;t["O"]=778;t["P"]=611;t["Q"]=778;t["R"]=722;t["S"]=556;t["T"]=667;t["U"]=722;t["V"]=722;t["W"]=1e3;t["X"]=722;t["Y"]=722;t["Z"]=667;t["bracketleft"]=333;t["backslash"]=278;t["bracketright"]=333;t["asciicircum"]=581;t["underscore"]=500;t["quoteleft"]=333;t["a"]=500;t["b"]=556;t["c"]=444;t["d"]=556;t["e"]=444;t["f"]=333;t["g"]=500;t["h"]=556;t["i"]=278;t["j"]=333;t["k"]=556;t["l"]=278;t["m"]=833;t["n"]=556;t["o"]=500;t["p"]=556;t["q"]=556;t["r"]=444;t["s"]=389;t["t"]=333;t["u"]=556;t["v"]=500;t["w"]=722;t["x"]=500;t["y"]=500;t["z"]=444;t["braceleft"]=394;t["bar"]=220;t["braceright"]=394;t["asciitilde"]=520;t["exclamdown"]=333;t["cent"]=500;t["sterling"]=500;t["fraction"]=167;t["yen"]=500;t["florin"]=500;t["section"]=500;t["currency"]=500;t["quotesingle"]=278;t["quotedblleft"]=500;t["guillemotleft"]=500;t["guilsinglleft"]=333;t["guilsinglright"]=333;t["fi"]=556;t["fl"]=556;t["endash"]=500;t["dagger"]=500;t["daggerdbl"]=500;t["periodcentered"]=250;t["paragraph"]=540;t["bullet"]=350;t["quotesinglbase"]=333;t["quotedblbase"]=500;t["quotedblright"]=500;t["guillemotright"]=500;t["ellipsis"]=1e3;t["perthousand"]=1e3;t["questiondown"]=500;t["grave"]=333;t["acute"]=333;t["circumflex"]=333;t["tilde"]=333;t["macron"]=333;t["breve"]=333;t["dotaccent"]=333;t["dieresis"]=333;t["ring"]=333;t["cedilla"]=333;t["hungarumlaut"]=333;t["ogonek"]=333;t["caron"]=333;t["emdash"]=1e3;t["AE"]=1e3;t["ordfeminine"]=300;t["Lslash"]=667;t["Oslash"]=778;t["OE"]=1e3;t["ordmasculine"]=330;t["ae"]=722;t["dotlessi"]=278;t["lslash"]=278;t["oslash"]=500;t["oe"]=722;t["germandbls"]=556;t["Idieresis"]=389;t["eacute"]=444;t["abreve"]=500;t["uhungarumlaut"]=556;t["ecaron"]=444;t["Ydieresis"]=722;t["divide"]=570;t["Yacute"]=722;t["Acircumflex"]=722;t["aacute"]=500;t["Ucircumflex"]=722;t["yacute"]=500;t["scommaaccent"]=389;t["ecircumflex"]=444;t["Uring"]=722;t["Udieresis"]=722;t["aogonek"]=500;t["Uacute"]=722;t["uogonek"]=556;t["Edieresis"]=667;t["Dcroat"]=722;t["commaaccent"]=250;t["copyright"]=747;t["Emacron"]=667;t["ccaron"]=444;t["aring"]=500;t["Ncommaaccent"]=722;t["lacute"]=278;t["agrave"]=500;t["Tcommaaccent"]=667;t["Cacute"]=722;t["atilde"]=500;t["Edotaccent"]=667;t["scaron"]=389;t["scedilla"]=389;t["iacute"]=278;t["lozenge"]=494;t["Rcaron"]=722;t["Gcommaaccent"]=778;t["ucircumflex"]=556;t["acircumflex"]=500;t["Amacron"]=722;t["rcaron"]=444;t["ccedilla"]=444;t["Zdotaccent"]=667;t["Thorn"]=611;t["Omacron"]=778;t["Racute"]=722;t["Sacute"]=556;t["dcaron"]=672;t["Umacron"]=722;t["uring"]=556;t["threesuperior"]=300;t["Ograve"]=778;t["Agrave"]=722;t["Abreve"]=722;t["multiply"]=570;t["uacute"]=556;t["Tcaron"]=667;t["partialdiff"]=494;t["ydieresis"]=500;t["Nacute"]=722;t["icircumflex"]=278;t["Ecircumflex"]=667;t["adieresis"]=500;t["edieresis"]=444;t["cacute"]=444;t["nacute"]=556;t["umacron"]=556;t["Ncaron"]=722;t["Iacute"]=389;t["plusminus"]=570;t["brokenbar"]=220;t["registered"]=747;t["Gbreve"]=778;t["Idotaccent"]=389;t["summation"]=600;t["Egrave"]=667;t["racute"]=444;t["omacron"]=500;t["Zacute"]=667;t["Zcaron"]=667;t["greaterequal"]=549;t["Eth"]=722;t["Ccedilla"]=722;t["lcommaaccent"]=278;t["tcaron"]=416;t["eogonek"]=444;t["Uogonek"]=722;t["Aacute"]=722;t["Adieresis"]=722;t["egrave"]=444;t["zacute"]=444;t["iogonek"]=278;t["Oacute"]=778;t["oacute"]=500;t["amacron"]=500;t["sacute"]=389;t["idieresis"]=278;t["Ocircumflex"]=778;t["Ugrave"]=722;t["Delta"]=612;t["thorn"]=556;t["twosuperior"]=300;t["Odieresis"]=778;t["mu"]=556;t["igrave"]=278;t["ohungarumlaut"]=500;t["Eogonek"]=667;t["dcroat"]=556;t["threequarters"]=750;t["Scedilla"]=556;t["lcaron"]=394;t["Kcommaaccent"]=778;t["Lacute"]=667;t["trademark"]=1e3;t["edotaccent"]=444;t["Igrave"]=389;t["Imacron"]=389;t["Lcaron"]=667;t["onehalf"]=750;t["lessequal"]=549;t["ocircumflex"]=500;t["ntilde"]=556;t["Uhungarumlaut"]=722;t["Eacute"]=667;t["emacron"]=444;t["gbreve"]=500;t["onequarter"]=750;t["Scaron"]=556;t["Scommaaccent"]=556;t["Ohungarumlaut"]=778;t["degree"]=400;t["ograve"]=500;t["Ccaron"]=722;t["ugrave"]=556;t["radical"]=549;t["Dcaron"]=722;t["rcommaaccent"]=444;t["Ntilde"]=722;t["otilde"]=500;t["Rcommaaccent"]=722;t["Lcommaaccent"]=667;t["Atilde"]=722;t["Aogonek"]=722;t["Aring"]=722;t["Otilde"]=778;t["zdotaccent"]=444;t["Ecaron"]=667;t["Iogonek"]=389;t["kcommaaccent"]=556;t["minus"]=570;t["Icircumflex"]=389;t["ncaron"]=556;t["tcommaaccent"]=333;t["logicalnot"]=570;t["odieresis"]=500;t["udieresis"]=556;t["notequal"]=549;t["gcommaaccent"]=500;t["eth"]=500;t["zcaron"]=444;t["ncommaaccent"]=556;t["onesuperior"]=300;t["imacron"]=278;t["Euro"]=500});t["Times-BoldItalic"]=getLookupTableFactory(function(t){t["space"]=250;t["exclam"]=389;t["quotedbl"]=555;t["numbersign"]=500;t["dollar"]=500;t["percent"]=833;t["ampersand"]=778;t["quoteright"]=333;t["parenleft"]=333;t["parenright"]=333;t["asterisk"]=500;t["plus"]=570;t["comma"]=250;t["hyphen"]=333;t["period"]=250;t["slash"]=278;t["zero"]=500;t["one"]=500;t["two"]=500;t["three"]=500;t["four"]=500;t["five"]=500;t["six"]=500;t["seven"]=500;t["eight"]=500;t["nine"]=500;t["colon"]=333;t["semicolon"]=333;t["less"]=570;t["equal"]=570;t["greater"]=570;t["question"]=500;t["at"]=832;t["A"]=667;t["B"]=667;t["C"]=667;t["D"]=722;t["E"]=667;t["F"]=667;t["G"]=722;t["H"]=778;t["I"]=389;t["J"]=500;t["K"]=667;t["L"]=611;t["M"]=889;t["N"]=722;t["O"]=722;t["P"]=611;t["Q"]=722;t["R"]=667;t["S"]=556;t["T"]=611;t["U"]=722;t["V"]=667;t["W"]=889;t["X"]=667;t["Y"]=611;t["Z"]=611;t["bracketleft"]=333;t["backslash"]=278;t["bracketright"]=333;t["asciicircum"]=570;t["underscore"]=500;t["quoteleft"]=333;t["a"]=500;t["b"]=500;t["c"]=444;t["d"]=500;t["e"]=444;t["f"]=333;t["g"]=500;t["h"]=556;t["i"]=278;t["j"]=278;t["k"]=500;t["l"]=278;t["m"]=778;t["n"]=556;t["o"]=500;t["p"]=500;t["q"]=500;t["r"]=389;t["s"]=389;t["t"]=278;t["u"]=556;t["v"]=444;t["w"]=667;t["x"]=500;t["y"]=444;t["z"]=389;t["braceleft"]=348;t["bar"]=220;t["braceright"]=348;t["asciitilde"]=570;t["exclamdown"]=389;t["cent"]=500;t["sterling"]=500;t["fraction"]=167;t["yen"]=500;t["florin"]=500;t["section"]=500;t["currency"]=500;t["quotesingle"]=278;t["quotedblleft"]=500;t["guillemotleft"]=500;t["guilsinglleft"]=333;t["guilsinglright"]=333;t["fi"]=556;t["fl"]=556;t["endash"]=500;t["dagger"]=500;t["daggerdbl"]=500;t["periodcentered"]=250;t["paragraph"]=500;t["bullet"]=350;t["quotesinglbase"]=333;t["quotedblbase"]=500;t["quotedblright"]=500;t["guillemotright"]=500;t["ellipsis"]=1e3;t["perthousand"]=1e3;t["questiondown"]=500;t["grave"]=333;t["acute"]=333;t["circumflex"]=333;t["tilde"]=333;t["macron"]=333;t["breve"]=333;t["dotaccent"]=333;t["dieresis"]=333;t["ring"]=333;t["cedilla"]=333;t["hungarumlaut"]=333;t["ogonek"]=333;t["caron"]=333;t["emdash"]=1e3;t["AE"]=944;t["ordfeminine"]=266;t["Lslash"]=611;t["Oslash"]=722;t["OE"]=944;t["ordmasculine"]=300;t["ae"]=722;t["dotlessi"]=278;t["lslash"]=278;t["oslash"]=500;t["oe"]=722;t["germandbls"]=500;t["Idieresis"]=389;t["eacute"]=444;t["abreve"]=500;t["uhungarumlaut"]=556;t["ecaron"]=444;t["Ydieresis"]=611;t["divide"]=570;t["Yacute"]=611;t["Acircumflex"]=667;t["aacute"]=500;t["Ucircumflex"]=722;t["yacute"]=444;t["scommaaccent"]=389;t["ecircumflex"]=444;t["Uring"]=722; -t["Udieresis"]=722;t["aogonek"]=500;t["Uacute"]=722;t["uogonek"]=556;t["Edieresis"]=667;t["Dcroat"]=722;t["commaaccent"]=250;t["copyright"]=747;t["Emacron"]=667;t["ccaron"]=444;t["aring"]=500;t["Ncommaaccent"]=722;t["lacute"]=278;t["agrave"]=500;t["Tcommaaccent"]=611;t["Cacute"]=667;t["atilde"]=500;t["Edotaccent"]=667;t["scaron"]=389;t["scedilla"]=389;t["iacute"]=278;t["lozenge"]=494;t["Rcaron"]=667;t["Gcommaaccent"]=722;t["ucircumflex"]=556;t["acircumflex"]=500;t["Amacron"]=667;t["rcaron"]=389;t["ccedilla"]=444;t["Zdotaccent"]=611;t["Thorn"]=611;t["Omacron"]=722;t["Racute"]=667;t["Sacute"]=556;t["dcaron"]=608;t["Umacron"]=722;t["uring"]=556;t["threesuperior"]=300;t["Ograve"]=722;t["Agrave"]=667;t["Abreve"]=667;t["multiply"]=570;t["uacute"]=556;t["Tcaron"]=611;t["partialdiff"]=494;t["ydieresis"]=444;t["Nacute"]=722;t["icircumflex"]=278;t["Ecircumflex"]=667;t["adieresis"]=500;t["edieresis"]=444;t["cacute"]=444;t["nacute"]=556;t["umacron"]=556;t["Ncaron"]=722;t["Iacute"]=389;t["plusminus"]=570;t["brokenbar"]=220;t["registered"]=747;t["Gbreve"]=722;t["Idotaccent"]=389;t["summation"]=600;t["Egrave"]=667;t["racute"]=389;t["omacron"]=500;t["Zacute"]=611;t["Zcaron"]=611;t["greaterequal"]=549;t["Eth"]=722;t["Ccedilla"]=667;t["lcommaaccent"]=278;t["tcaron"]=366;t["eogonek"]=444;t["Uogonek"]=722;t["Aacute"]=667;t["Adieresis"]=667;t["egrave"]=444;t["zacute"]=389;t["iogonek"]=278;t["Oacute"]=722;t["oacute"]=500;t["amacron"]=500;t["sacute"]=389;t["idieresis"]=278;t["Ocircumflex"]=722;t["Ugrave"]=722;t["Delta"]=612;t["thorn"]=500;t["twosuperior"]=300;t["Odieresis"]=722;t["mu"]=576;t["igrave"]=278;t["ohungarumlaut"]=500;t["Eogonek"]=667;t["dcroat"]=500;t["threequarters"]=750;t["Scedilla"]=556;t["lcaron"]=382;t["Kcommaaccent"]=667;t["Lacute"]=611;t["trademark"]=1e3;t["edotaccent"]=444;t["Igrave"]=389;t["Imacron"]=389;t["Lcaron"]=611;t["onehalf"]=750;t["lessequal"]=549;t["ocircumflex"]=500;t["ntilde"]=556;t["Uhungarumlaut"]=722;t["Eacute"]=667;t["emacron"]=444;t["gbreve"]=500;t["onequarter"]=750;t["Scaron"]=556;t["Scommaaccent"]=556;t["Ohungarumlaut"]=722;t["degree"]=400;t["ograve"]=500;t["Ccaron"]=667;t["ugrave"]=556;t["radical"]=549;t["Dcaron"]=722;t["rcommaaccent"]=389;t["Ntilde"]=722;t["otilde"]=500;t["Rcommaaccent"]=667;t["Lcommaaccent"]=611;t["Atilde"]=667;t["Aogonek"]=667;t["Aring"]=667;t["Otilde"]=722;t["zdotaccent"]=389;t["Ecaron"]=667;t["Iogonek"]=389;t["kcommaaccent"]=500;t["minus"]=606;t["Icircumflex"]=389;t["ncaron"]=556;t["tcommaaccent"]=278;t["logicalnot"]=606;t["odieresis"]=500;t["udieresis"]=556;t["notequal"]=549;t["gcommaaccent"]=500;t["eth"]=500;t["zcaron"]=389;t["ncommaaccent"]=556;t["onesuperior"]=300;t["imacron"]=278;t["Euro"]=500});t["Times-Italic"]=getLookupTableFactory(function(t){t["space"]=250;t["exclam"]=333;t["quotedbl"]=420;t["numbersign"]=500;t["dollar"]=500;t["percent"]=833;t["ampersand"]=778;t["quoteright"]=333;t["parenleft"]=333;t["parenright"]=333;t["asterisk"]=500;t["plus"]=675;t["comma"]=250;t["hyphen"]=333;t["period"]=250;t["slash"]=278;t["zero"]=500;t["one"]=500;t["two"]=500;t["three"]=500;t["four"]=500;t["five"]=500;t["six"]=500;t["seven"]=500;t["eight"]=500;t["nine"]=500;t["colon"]=333;t["semicolon"]=333;t["less"]=675;t["equal"]=675;t["greater"]=675;t["question"]=500;t["at"]=920;t["A"]=611;t["B"]=611;t["C"]=667;t["D"]=722;t["E"]=611;t["F"]=611;t["G"]=722;t["H"]=722;t["I"]=333;t["J"]=444;t["K"]=667;t["L"]=556;t["M"]=833;t["N"]=667;t["O"]=722;t["P"]=611;t["Q"]=722;t["R"]=611;t["S"]=500;t["T"]=556;t["U"]=722;t["V"]=611;t["W"]=833;t["X"]=611;t["Y"]=556;t["Z"]=556;t["bracketleft"]=389;t["backslash"]=278;t["bracketright"]=389;t["asciicircum"]=422;t["underscore"]=500;t["quoteleft"]=333;t["a"]=500;t["b"]=500;t["c"]=444;t["d"]=500;t["e"]=444;t["f"]=278;t["g"]=500;t["h"]=500;t["i"]=278;t["j"]=278;t["k"]=444;t["l"]=278;t["m"]=722;t["n"]=500;t["o"]=500;t["p"]=500;t["q"]=500;t["r"]=389;t["s"]=389;t["t"]=278;t["u"]=500;t["v"]=444;t["w"]=667;t["x"]=444;t["y"]=444;t["z"]=389;t["braceleft"]=400;t["bar"]=275;t["braceright"]=400;t["asciitilde"]=541;t["exclamdown"]=389;t["cent"]=500;t["sterling"]=500;t["fraction"]=167;t["yen"]=500;t["florin"]=500;t["section"]=500;t["currency"]=500;t["quotesingle"]=214;t["quotedblleft"]=556;t["guillemotleft"]=500;t["guilsinglleft"]=333;t["guilsinglright"]=333;t["fi"]=500;t["fl"]=500;t["endash"]=500;t["dagger"]=500;t["daggerdbl"]=500;t["periodcentered"]=250;t["paragraph"]=523;t["bullet"]=350;t["quotesinglbase"]=333;t["quotedblbase"]=556;t["quotedblright"]=556;t["guillemotright"]=500;t["ellipsis"]=889;t["perthousand"]=1e3;t["questiondown"]=500;t["grave"]=333;t["acute"]=333;t["circumflex"]=333;t["tilde"]=333;t["macron"]=333;t["breve"]=333;t["dotaccent"]=333;t["dieresis"]=333;t["ring"]=333;t["cedilla"]=333;t["hungarumlaut"]=333;t["ogonek"]=333;t["caron"]=333;t["emdash"]=889;t["AE"]=889;t["ordfeminine"]=276;t["Lslash"]=556;t["Oslash"]=722;t["OE"]=944;t["ordmasculine"]=310;t["ae"]=667;t["dotlessi"]=278;t["lslash"]=278;t["oslash"]=500;t["oe"]=667;t["germandbls"]=500;t["Idieresis"]=333;t["eacute"]=444;t["abreve"]=500;t["uhungarumlaut"]=500;t["ecaron"]=444;t["Ydieresis"]=556;t["divide"]=675;t["Yacute"]=556;t["Acircumflex"]=611;t["aacute"]=500;t["Ucircumflex"]=722;t["yacute"]=444;t["scommaaccent"]=389;t["ecircumflex"]=444;t["Uring"]=722;t["Udieresis"]=722;t["aogonek"]=500;t["Uacute"]=722;t["uogonek"]=500;t["Edieresis"]=611;t["Dcroat"]=722;t["commaaccent"]=250;t["copyright"]=760;t["Emacron"]=611;t["ccaron"]=444;t["aring"]=500;t["Ncommaaccent"]=667;t["lacute"]=278;t["agrave"]=500;t["Tcommaaccent"]=556;t["Cacute"]=667;t["atilde"]=500;t["Edotaccent"]=611;t["scaron"]=389;t["scedilla"]=389;t["iacute"]=278;t["lozenge"]=471;t["Rcaron"]=611;t["Gcommaaccent"]=722;t["ucircumflex"]=500;t["acircumflex"]=500;t["Amacron"]=611;t["rcaron"]=389;t["ccedilla"]=444;t["Zdotaccent"]=556;t["Thorn"]=611;t["Omacron"]=722;t["Racute"]=611;t["Sacute"]=500;t["dcaron"]=544;t["Umacron"]=722;t["uring"]=500;t["threesuperior"]=300;t["Ograve"]=722;t["Agrave"]=611;t["Abreve"]=611;t["multiply"]=675;t["uacute"]=500;t["Tcaron"]=556;t["partialdiff"]=476;t["ydieresis"]=444;t["Nacute"]=667;t["icircumflex"]=278;t["Ecircumflex"]=611;t["adieresis"]=500;t["edieresis"]=444;t["cacute"]=444;t["nacute"]=500;t["umacron"]=500;t["Ncaron"]=667;t["Iacute"]=333;t["plusminus"]=675;t["brokenbar"]=275;t["registered"]=760;t["Gbreve"]=722;t["Idotaccent"]=333;t["summation"]=600;t["Egrave"]=611;t["racute"]=389;t["omacron"]=500;t["Zacute"]=556;t["Zcaron"]=556;t["greaterequal"]=549;t["Eth"]=722;t["Ccedilla"]=667;t["lcommaaccent"]=278;t["tcaron"]=300;t["eogonek"]=444;t["Uogonek"]=722;t["Aacute"]=611;t["Adieresis"]=611;t["egrave"]=444;t["zacute"]=389;t["iogonek"]=278;t["Oacute"]=722;t["oacute"]=500;t["amacron"]=500;t["sacute"]=389;t["idieresis"]=278;t["Ocircumflex"]=722;t["Ugrave"]=722;t["Delta"]=612;t["thorn"]=500;t["twosuperior"]=300;t["Odieresis"]=722;t["mu"]=500;t["igrave"]=278;t["ohungarumlaut"]=500;t["Eogonek"]=611;t["dcroat"]=500;t["threequarters"]=750;t["Scedilla"]=500;t["lcaron"]=300;t["Kcommaaccent"]=667;t["Lacute"]=556;t["trademark"]=980;t["edotaccent"]=444;t["Igrave"]=333;t["Imacron"]=333;t["Lcaron"]=611;t["onehalf"]=750;t["lessequal"]=549;t["ocircumflex"]=500;t["ntilde"]=500;t["Uhungarumlaut"]=722;t["Eacute"]=611;t["emacron"]=444;t["gbreve"]=500;t["onequarter"]=750;t["Scaron"]=500;t["Scommaaccent"]=500;t["Ohungarumlaut"]=722;t["degree"]=400;t["ograve"]=500;t["Ccaron"]=667;t["ugrave"]=500;t["radical"]=453;t["Dcaron"]=722;t["rcommaaccent"]=389;t["Ntilde"]=667;t["otilde"]=500;t["Rcommaaccent"]=611;t["Lcommaaccent"]=556;t["Atilde"]=611;t["Aogonek"]=611;t["Aring"]=611;t["Otilde"]=722;t["zdotaccent"]=389;t["Ecaron"]=611;t["Iogonek"]=333;t["kcommaaccent"]=444;t["minus"]=675;t["Icircumflex"]=333;t["ncaron"]=500;t["tcommaaccent"]=278;t["logicalnot"]=675;t["odieresis"]=500;t["udieresis"]=500;t["notequal"]=549;t["gcommaaccent"]=500;t["eth"]=500;t["zcaron"]=389;t["ncommaaccent"]=500;t["onesuperior"]=300;t["imacron"]=278;t["Euro"]=500});t["ZapfDingbats"]=getLookupTableFactory(function(t){t["space"]=278;t["a1"]=974;t["a2"]=961;t["a202"]=974;t["a3"]=980;t["a4"]=719;t["a5"]=789;t["a119"]=790;t["a118"]=791;t["a117"]=690;t["a11"]=960;t["a12"]=939;t["a13"]=549;t["a14"]=855;t["a15"]=911;t["a16"]=933;t["a105"]=911;t["a17"]=945;t["a18"]=974;t["a19"]=755;t["a20"]=846;t["a21"]=762;t["a22"]=761;t["a23"]=571;t["a24"]=677;t["a25"]=763;t["a26"]=760;t["a27"]=759;t["a28"]=754;t["a6"]=494;t["a7"]=552;t["a8"]=537;t["a9"]=577;t["a10"]=692;t["a29"]=786;t["a30"]=788;t["a31"]=788;t["a32"]=790;t["a33"]=793;t["a34"]=794;t["a35"]=816;t["a36"]=823;t["a37"]=789;t["a38"]=841;t["a39"]=823;t["a40"]=833;t["a41"]=816;t["a42"]=831;t["a43"]=923;t["a44"]=744;t["a45"]=723;t["a46"]=749;t["a47"]=790;t["a48"]=792;t["a49"]=695;t["a50"]=776;t["a51"]=768;t["a52"]=792;t["a53"]=759;t["a54"]=707;t["a55"]=708;t["a56"]=682;t["a57"]=701;t["a58"]=826;t["a59"]=815;t["a60"]=789;t["a61"]=789;t["a62"]=707;t["a63"]=687;t["a64"]=696;t["a65"]=689;t["a66"]=786;t["a67"]=787;t["a68"]=713;t["a69"]=791;t["a70"]=785;t["a71"]=791;t["a72"]=873;t["a73"]=761;t["a74"]=762;t["a203"]=762;t["a75"]=759;t["a204"]=759;t["a76"]=892;t["a77"]=892;t["a78"]=788;t["a79"]=784;t["a81"]=438;t["a82"]=138;t["a83"]=277;t["a84"]=415;t["a97"]=392;t["a98"]=392;t["a99"]=668;t["a100"]=668;t["a89"]=390;t["a90"]=390;t["a93"]=317;t["a94"]=317;t["a91"]=276;t["a92"]=276;t["a205"]=509;t["a85"]=509;t["a206"]=410;t["a86"]=410;t["a87"]=234;t["a88"]=234;t["a95"]=334;t["a96"]=334;t["a101"]=732;t["a102"]=544;t["a103"]=544;t["a104"]=910;t["a106"]=667;t["a107"]=760;t["a108"]=760;t["a112"]=776;t["a111"]=595;t["a110"]=694;t["a109"]=626;t["a120"]=788;t["a121"]=788;t["a122"]=788;t["a123"]=788;t["a124"]=788;t["a125"]=788;t["a126"]=788;t["a127"]=788;t["a128"]=788;t["a129"]=788;t["a130"]=788;t["a131"]=788;t["a132"]=788;t["a133"]=788;t["a134"]=788;t["a135"]=788;t["a136"]=788;t["a137"]=788;t["a138"]=788;t["a139"]=788;t["a140"]=788;t["a141"]=788;t["a142"]=788;t["a143"]=788;t["a144"]=788;t["a145"]=788;t["a146"]=788;t["a147"]=788;t["a148"]=788;t["a149"]=788;t["a150"]=788;t["a151"]=788;t["a152"]=788;t["a153"]=788;t["a154"]=788;t["a155"]=788;t["a156"]=788;t["a157"]=788;t["a158"]=788;t["a159"]=788;t["a160"]=894;t["a161"]=838;t["a163"]=1016;t["a164"]=458;t["a196"]=748;t["a165"]=924;t["a192"]=748;t["a166"]=918;t["a167"]=927;t["a168"]=928;t["a169"]=928;t["a170"]=834;t["a171"]=873;t["a172"]=828;t["a173"]=924;t["a162"]=924;t["a174"]=917;t["a175"]=930;t["a176"]=931;t["a177"]=463;t["a178"]=883;t["a179"]=836;t["a193"]=836;t["a180"]=867;t["a199"]=867;t["a181"]=696;t["a200"]=696;t["a182"]=874;t["a201"]=874;t["a183"]=760;t["a184"]=946;t["a197"]=771;t["a185"]=865;t["a194"]=771;t["a198"]=888;t["a186"]=967;t["a195"]=888;t["a187"]=831;t["a188"]=873;t["a189"]=927;t["a190"]=970;t["a191"]=918})});exports.getMetrics=getMetrics});(function(root,factory){{factory(root.pdfjsCoreMurmurHash3={},root.pdfjsSharedUtil)}})(this,function(exports,sharedUtil){var Uint32ArrayView=sharedUtil.Uint32ArrayView;var MurmurHash3_64=function MurmurHash3_64Closure(seed){var MASK_HIGH=4294901760;var MASK_LOW=65535;function MurmurHash3_64(seed){var SEED=3285377520;this.h1=seed?seed&4294967295:SEED;this.h2=seed?seed&4294967295:SEED}var alwaysUseUint32ArrayView=false;try{new Uint32Array(new Uint8Array(5).buffer,0,1)}catch(e){alwaysUseUint32ArrayView=true}MurmurHash3_64.prototype={update:function MurmurHash3_64_update(input){var useUint32ArrayView=alwaysUseUint32ArrayView;var i;if(typeof input==="string"){var data=new Uint8Array(input.length*2);var length=0;for(i=0;i>>8;data[length++]=code&255}}}else if(input instanceof Uint8Array){data=input;length=data.length}else if(typeof input==="object"&&"length"in input){data=input;length=data.length;useUint32ArrayView=true}else{throw new Error("Wrong data format in MurmurHash3_64_update. "+"Input must be a string or array.")}var blockCounts=length>>2;var tailLength=length-blockCounts*4;var dataUint32=useUint32ArrayView?new Uint32ArrayView(data,blockCounts):new Uint32Array(data.buffer,0,blockCounts);var k1=0;var k2=0;var h1=this.h1;var h2=this.h2;var C1=3432918353;var C2=461845907;var C1_LOW=C1&MASK_LOW;var C2_LOW=C2&MASK_LOW;for(i=0;i>>17;k1=k1*C2&MASK_HIGH|k1*C2_LOW&MASK_LOW;h1^=k1;h1=h1<<13|h1>>>19;h1=h1*5+3864292196}else{k2=dataUint32[i];k2=k2*C1&MASK_HIGH|k2*C1_LOW&MASK_LOW;k2=k2<<15|k2>>>17;k2=k2*C2&MASK_HIGH|k2*C2_LOW&MASK_LOW;h2^=k2;h2=h2<<13|h2>>>19;h2=h2*5+3864292196}}k1=0;switch(tailLength){case 3:k1^=data[blockCounts*4+2]<<16;case 2:k1^=data[blockCounts*4+1]<<8;case 1:k1^=data[blockCounts*4];k1=k1*C1&MASK_HIGH|k1*C1_LOW&MASK_LOW;k1=k1<<15|k1>>>17;k1=k1*C2&MASK_HIGH|k1*C2_LOW&MASK_LOW;if(blockCounts&1){h1^=k1}else{h2^=k1}}this.h1=h1;this.h2=h2;return this},hexdigest:function MurmurHash3_64_hexdigest(){var h1=this.h1;var h2=this.h2;h1^=h2>>>1;h1=h1*3981806797&MASK_HIGH|h1*36045&MASK_LOW;h2=h2*4283543511&MASK_HIGH|((h2<<16|h1>>>16)*2950163797&MASK_HIGH)>>>16;h1^=h2>>>1;h1=h1*444984403&MASK_HIGH|h1*60499&MASK_LOW;h2=h2*3301882366&MASK_HIGH|((h2<<16|h1>>>16)*3120437893&MASK_HIGH)>>>16;h1^=h2>>>1;for(var i=0,arr=[h1,h2],str="";i>>0).toString(16);while(hex.length<8){hex="0"+hex}str+=hex}return str}};return MurmurHash3_64}();exports.MurmurHash3_64=MurmurHash3_64});(function(root,factory){{factory(root.pdfjsCorePrimitives={},root.pdfjsSharedUtil)}})(this,function(exports,sharedUtil){var isArray=sharedUtil.isArray;var Name=function NameClosure(){function Name(name){this.name=name}Name.prototype={};var nameCache=Object.create(null);Name.get=function Name_get(name){var nameValue=nameCache[name];return nameValue?nameValue:nameCache[name]=new Name(name)};return Name}();var Cmd=function CmdClosure(){function Cmd(cmd){this.cmd=cmd}Cmd.prototype={};var cmdCache=Object.create(null);Cmd.get=function Cmd_get(cmd){var cmdValue=cmdCache[cmd];return cmdValue?cmdValue:cmdCache[cmd]=new Cmd(cmd)};return Cmd}();var Dict=function DictClosure(){var nonSerializable=function nonSerializableClosure(){return nonSerializable};function Dict(xref){this.map=Object.create(null);this.xref=xref;this.objId=null;this.__nonSerializable__=nonSerializable}Dict.prototype={assignXref:function Dict_assignXref(newXref){this.xref=newXref},get:function Dict_get(key1,key2,key3){var value;var xref=this.xref;if(typeof(value=this.map[key1])!=="undefined"||key1 in this.map||typeof key2==="undefined"){return xref?xref.fetchIfRef(value):value}if(typeof(value=this.map[key2])!=="undefined"||key2 in this.map||typeof key3==="undefined"){return xref?xref.fetchIfRef(value):value}value=this.map[key3]||null;return xref?xref.fetchIfRef(value):value},getAsync:function Dict_getAsync(key1,key2,key3){var value;var xref=this.xref;if(typeof(value=this.map[key1])!=="undefined"||key1 in this.map||typeof key2==="undefined"){if(xref){return xref.fetchIfRefAsync(value)}return Promise.resolve(value)}if(typeof(value=this.map[key2])!=="undefined"||key2 in this.map||typeof key3==="undefined"){if(xref){return xref.fetchIfRefAsync(value)}return Promise.resolve(value)}value=this.map[key3]||null;if(xref){return xref.fetchIfRefAsync(value)}return Promise.resolve(value)},getArray:function Dict_getArray(key1,key2,key3){var value=this.get(key1,key2,key3);var xref=this.xref;if(!isArray(value)||!xref){return value}value=value.slice();for(var i=0,ii=value.length;i=65520&&code<=65535){return 0}else if(code>=62976&&code<=63743){return getSpecialPUASymbols()[code]||code}return code}function getUnicodeForGlyph(name,glyphsUnicodeMap){var unicode=glyphsUnicodeMap[name];if(unicode!==undefined){return unicode}if(!name){return-1}if(name[0]==="u"){var nameLen=name.length,hexStr;if(nameLen===7&&name[1]==="n"&&name[2]==="i"){hexStr=name.substr(3)}else if(nameLen>=5&&nameLen<=7){hexStr=name.substr(1)}else{return-1}if(hexStr===hexStr.toUpperCase()){unicode=parseInt(hexStr,16);if(unicode>=0){return unicode}}}return-1}var UnicodeRanges=[{begin:0,end:127},{begin:128,end:255},{begin:256,end:383},{begin:384,end:591},{begin:592,end:687},{begin:688,end:767},{begin:768,end:879},{begin:880,end:1023},{begin:11392,end:11519},{begin:1024,end:1279},{begin:1328,end:1423},{begin:1424,end:1535},{begin:42240,end:42559},{begin:1536,end:1791},{begin:1984,end:2047},{begin:2304,end:2431},{begin:2432,end:2559},{begin:2560,end:2687},{begin:2688,end:2815},{begin:2816,end:2943},{begin:2944,end:3071},{begin:3072,end:3199},{begin:3200,end:3327},{begin:3328,end:3455},{begin:3584,end:3711},{begin:3712,end:3839},{begin:4256,end:4351},{begin:6912,end:7039},{begin:4352,end:4607},{begin:7680,end:7935},{begin:7936,end:8191},{begin:8192,end:8303},{begin:8304,end:8351},{begin:8352,end:8399},{begin:8400,end:8447},{begin:8448,end:8527},{begin:8528,end:8591},{begin:8592,end:8703},{begin:8704,end:8959},{begin:8960,end:9215},{begin:9216,end:9279},{begin:9280,end:9311},{begin:9312,end:9471},{begin:9472,end:9599},{begin:9600,end:9631},{begin:9632,end:9727},{begin:9728,end:9983},{begin:9984,end:10175},{begin:12288,end:12351},{begin:12352,end:12447},{begin:12448,end:12543},{begin:12544,end:12591},{begin:12592,end:12687},{begin:43072,end:43135},{begin:12800,end:13055},{begin:13056,end:13311},{begin:44032,end:55215},{begin:55296,end:57343},{begin:67840,end:67871},{begin:19968,end:40959},{begin:57344,end:63743},{begin:12736,end:12783},{begin:64256,end:64335},{begin:64336,end:65023},{begin:65056,end:65071},{begin:65040,end:65055},{begin:65104,end:65135},{begin:65136,end:65279},{begin:65280,end:65519},{begin:65520,end:65535},{begin:3840,end:4095},{begin:1792,end:1871},{begin:1920,end:1983},{begin:3456,end:3583},{begin:4096,end:4255},{begin:4608,end:4991},{begin:5024,end:5119},{begin:5120,end:5759},{begin:5760,end:5791},{begin:5792,end:5887},{begin:6016,end:6143},{begin:6144,end:6319},{begin:10240,end:10495},{begin:40960,end:42127},{begin:5888,end:5919},{begin:66304,end:66351},{begin:66352,end:66383},{begin:66560,end:66639},{begin:118784,end:119039},{begin:119808,end:120831},{begin:1044480,end:1048573},{begin:65024,end:65039},{begin:917504,end:917631},{begin:6400,end:6479},{begin:6480,end:6527},{begin:6528,end:6623},{begin:6656,end:6687},{begin:11264,end:11359},{begin:11568,end:11647},{begin:19904,end:19967},{begin:43008,end:43055},{begin:65536,end:65663},{begin:65856,end:65935},{begin:66432,end:66463},{begin:66464,end:66527},{begin:66640,end:66687},{begin:66688,end:66735},{begin:67584,end:67647},{begin:68096,end:68191},{begin:119552,end:119647},{begin:73728,end:74751},{begin:119648,end:119679},{begin:7040,end:7103},{begin:7168,end:7247},{begin:7248,end:7295},{begin:43136,end:43231},{begin:43264,end:43311},{begin:43312,end:43359},{begin:43520,end:43615},{begin:65936,end:65999},{begin:66e3,end:66047},{begin:66208,end:66271},{begin:127024,end:127135}]; -function getUnicodeRangeFor(value){for(var i=0,ii=UnicodeRanges.length;i=range.begin&&value=range.begin&&value=range.begin&&value=0;ii--){s+=chars[ii]}return s}exports.mapSpecialUnicodeValues=mapSpecialUnicodeValues;exports.reverseIfRtl=reverseIfRtl;exports.getUnicodeRangeFor=getUnicodeRangeFor;exports.getNormalizedUnicodes=getNormalizedUnicodes;exports.getUnicodeForGlyph=getUnicodeForGlyph});(function(root,factory){{factory(root.pdfjsCoreStream={},root.pdfjsSharedUtil,root.pdfjsCorePrimitives,root.pdfjsCoreJbig2,root.pdfjsCoreJpg,root.pdfjsCoreJpx)}})(this,function(exports,sharedUtil,corePrimitives,coreJbig2,coreJpg,coreJpx){var Util=sharedUtil.Util;var error=sharedUtil.error;var info=sharedUtil.info;var isInt=sharedUtil.isInt;var isArray=sharedUtil.isArray;var createObjectURL=sharedUtil.createObjectURL;var shadow=sharedUtil.shadow;var warn=sharedUtil.warn;var isSpace=sharedUtil.isSpace;var Dict=corePrimitives.Dict;var isDict=corePrimitives.isDict;var Jbig2Image=coreJbig2.Jbig2Image;var JpegImage=coreJpg.JpegImage;var JpxImage=coreJpx.JpxImage;var Stream=function StreamClosure(){function Stream(arrayBuffer,start,length,dict){this.bytes=arrayBuffer instanceof Uint8Array?arrayBuffer:new Uint8Array(arrayBuffer);this.start=start||0;this.pos=this.start;this.end=start+length||this.bytes.length;this.dict=dict}Stream.prototype={get length(){return this.end-this.start},get isEmpty(){return this.length===0},getByte:function Stream_getByte(){if(this.pos>=this.end){return-1}return this.bytes[this.pos++]},getUint16:function Stream_getUint16(){var b0=this.getByte();var b1=this.getByte();if(b0===-1||b1===-1){return-1}return(b0<<8)+b1},getInt32:function Stream_getInt32(){var b0=this.getByte();var b1=this.getByte();var b2=this.getByte();var b3=this.getByte();return(b0<<24)+(b1<<16)+(b2<<8)+b3},getBytes:function Stream_getBytes(length){var bytes=this.bytes;var pos=this.pos;var strEnd=this.end;if(!length){return bytes.subarray(pos,strEnd)}var end=pos+length;if(end>strEnd){end=strEnd}this.pos=end;return bytes.subarray(pos,end)},peekByte:function Stream_peekByte(){var peekedByte=this.getByte();this.pos--;return peekedByte},peekBytes:function Stream_peekBytes(length){var bytes=this.getBytes(length);this.pos-=bytes.length;return bytes},skip:function Stream_skip(n){if(!n){n=1}this.pos+=n},reset:function Stream_reset(){this.pos=this.start},moveStart:function Stream_moveStart(){this.start=this.pos},makeSubStream:function Stream_makeSubStream(start,length,dict){return new Stream(this.bytes.buffer,start,length,dict)},isStream:true};return Stream}();var StringStream=function StringStreamClosure(){function StringStream(str){var length=str.length;var bytes=new Uint8Array(length);for(var n=0;nbufEnd){end=bufEnd}}else{while(!this.eof){this.readBlock()}end=this.bufferLength}this.pos=end;return this.buffer.subarray(pos,end)},peekByte:function DecodeStream_peekByte(){var peekedByte=this.getByte();this.pos--;return peekedByte},peekBytes:function DecodeStream_peekBytes(length){var bytes=this.getBytes(length);this.pos-=bytes.length;return bytes},makeSubStream:function DecodeStream_makeSubStream(start,length,dict){var end=start+length;while(this.bufferLength<=end&&!this.eof){this.readBlock()}return new Stream(this.buffer,start,length,dict)},skip:function DecodeStream_skip(n){if(!n){n=1}this.pos+=n},reset:function DecodeStream_reset(){this.pos=0},getBaseStreams:function DecodeStream_getBaseStreams(){if(this.str&&this.str.getBaseStreams){return this.str.getBaseStreams()}return[]}};return DecodeStream}();var StreamsSequenceStream=function StreamsSequenceStreamClosure(){function StreamsSequenceStream(streams){this.streams=streams;DecodeStream.call(this,null)}StreamsSequenceStream.prototype=Object.create(DecodeStream.prototype);StreamsSequenceStream.prototype.readBlock=function streamSequenceStreamReadBlock(){var streams=this.streams;if(streams.length===0){this.eof=true;return}var stream=streams.shift();var chunk=stream.getBytes();var bufferLength=this.bufferLength;var newLength=bufferLength+chunk.length;var buffer=this.ensureBuffer(newLength);buffer.set(chunk,bufferLength);this.bufferLength=newLength};StreamsSequenceStream.prototype.getBaseStreams=function StreamsSequenceStream_getBaseStreams(){var baseStreams=[];for(var i=0,ii=this.streams.length;i>bits;this.codeSize=codeSize-=bits;return b};FlateStream.prototype.getCode=function FlateStream_getCode(table){var str=this.str;var codes=table[0];var maxLen=table[1];var codeSize=this.codeSize;var codeBuf=this.codeBuf;var b;while(codeSize>16;var codeVal=code&65535;if(codeLen<1||codeSize>codeLen;this.codeSize=codeSize-codeLen;return codeVal};FlateStream.prototype.generateHuffmanTable=function flateStreamGenerateHuffmanTable(lengths){var n=lengths.length;var maxLen=0;var i;for(i=0;imaxLen){maxLen=lengths[i]}}var size=1<>=1}for(i=code2;i>=1;if(hdr===0){var b;if((b=str.getByte())===-1){error("Bad block header in flate stream")}var blockLen=b;if((b=str.getByte())===-1){error("Bad block header in flate stream")}blockLen|=b<<8;if((b=str.getByte())===-1){error("Bad block header in flate stream")}var check=b;if((b=str.getByte())===-1){error("Bad block header in flate stream")}check|=b<<8;if(check!==(~blockLen&65535)&&(blockLen!==0||check!==0)){error("Bad uncompressed block length in flate stream")}this.codeBuf=0;this.codeSize=0;var bufferLength=this.bufferLength;buffer=this.ensureBuffer(bufferLength+blockLen);var end=bufferLength+blockLen;this.bufferLength=end;if(blockLen===0){if(str.peekByte()===-1){this.eof=true}}else{for(var n=bufferLength;n0){codeLengths[i++]=what}}litCodeTable=this.generateHuffmanTable(codeLengths.subarray(0,numLitCodes));distCodeTable=this.generateHuffmanTable(codeLengths.subarray(numLitCodes,codes))}else{error("Unknown block type in flate stream")}buffer=this.buffer;var limit=buffer?buffer.length:0;var pos=this.bufferLength;while(true){var code1=this.getCode(litCodeTable);if(code1<256){if(pos+1>=limit){buffer=this.ensureBuffer(pos+1);limit=buffer.length}buffer[pos++]=code1;continue}if(code1===256){this.bufferLength=pos;return}code1-=257;code1=lengthDecode[code1];var code2=code1>>16;if(code2>0){code2=this.getBits(code2)}len=(code1&65535)+code2;code1=this.getCode(distCodeTable);code1=distDecode[code1];code2=code1>>16;if(code2>0){code2=this.getBits(code2)}var dist=(code1&65535)+code2;if(pos+len>=limit){buffer=this.ensureBuffer(pos+len);limit=buffer.length}for(var k=0;k15)){error("Unsupported predictor: "+predictor)}if(predictor===2){this.readBlock=this.readBlockTiff}else{this.readBlock=this.readBlockPng}this.str=str;this.dict=str.dict;var colors=this.colors=params.get("Colors")||1;var bits=this.bits=params.get("BitsPerComponent")||8;var columns=this.columns=params.get("Columns")||1;this.pixBytes=colors*bits+7>>3;this.rowBytes=columns*colors*bits+7>>3;DecodeStream.call(this,maybeLength);return this}PredictorStream.prototype=Object.create(DecodeStream.prototype);PredictorStream.prototype.readBlockTiff=function predictorStreamReadBlockTiff(){var rowBytes=this.rowBytes;var bufferLength=this.bufferLength;var buffer=this.ensureBuffer(bufferLength+rowBytes);var bits=this.bits;var colors=this.colors;var rawBytes=this.str.getBytes(rowBytes);this.eof=!rawBytes.length;if(this.eof){return}var inbuf=0,outbuf=0;var inbits=0,outbits=0;var pos=bufferLength;var i;if(bits===1){for(i=0;i>colors)&255;inbuf&=65535}}else if(bits===8){for(i=0;i>inbits-bits)&bitMask;inbits-=bits;outbuf=outbuf<=8){buffer[k++]=outbuf>>outbits-8&255;outbits-=8}}}if(outbits>0){buffer[k++]=(outbuf<<8-outbits)+(inbuf&(1<<8-outbits)-1)}}this.bufferLength+=rowBytes};PredictorStream.prototype.readBlockPng=function predictorStreamReadBlockPng(){var rowBytes=this.rowBytes;var pixBytes=this.pixBytes;var predictor=this.str.getByte();var rawBytes=this.str.getBytes(rowBytes);this.eof=!rawBytes.length;if(this.eof){return}var bufferLength=this.bufferLength;var buffer=this.ensureBuffer(bufferLength+rowBytes);var prevRow=buffer.subarray(bufferLength-rowBytes,bufferLength);if(prevRow.length===0){prevRow=new Uint8Array(rowBytes)}var i,j=bufferLength,up,c;switch(predictor){case 0:for(i=0;i>1)+rawBytes[i]}for(;i>1)+rawBytes[i]&255;j++}break;case 4:for(i=0;i1){warn("JBIG2 - 'DecodeParms' array with multiple elements "+"not supported.")}decodeParams=decodeParams[0]}if(decodeParams&&decodeParams.has("JBIG2Globals")){var globalsStream=decodeParams.get("JBIG2Globals");var globals=globalsStream.getBytes();chunks.push({data:globals,start:0,end:globals.length})}chunks.push({data:this.bytes,start:0,end:this.bytes.length});var data=jbig2Image.parseChunks(chunks);var dataLength=data.length;for(var i=0;i0;var decrypt=this.decrypt;chunk=decrypt(chunk,!hasMoreData);var bufferLength=this.bufferLength;var i,n=chunk.length;var buffer=this.ensureBuffer(bufferLength+n);for(i=0;i=0;--i){buffer[bufferLength+i]=t&255;t>>=8}}};return Ascii85Stream}();var AsciiHexStream=function AsciiHexStreamClosure(){function AsciiHexStream(str,maybeLength){this.str=str;this.dict=str.dict;this.firstDigit=-1;if(maybeLength){maybeLength=.5*maybeLength}DecodeStream.call(this,maybeLength)}AsciiHexStream.prototype=Object.create(DecodeStream.prototype);AsciiHexStream.prototype.readBlock=function AsciiHexStream_readBlock(){var UPSTREAM_BLOCK_SIZE=8e3;var bytes=this.str.getBytes(UPSTREAM_BLOCK_SIZE);if(!bytes.length){this.eof=true;return}var maxDecodeLength=bytes.length+1>>1;var buffer=this.ensureBuffer(this.bufferLength+maxDecodeLength);var bufferLength=this.bufferLength;var firstDigit=this.firstDigit;for(var i=0,ii=bytes.length;i=48&&ch<=57){digit=ch&15}else if(ch>=65&&ch<=70||ch>=97&&ch<=102){digit=(ch&15)+9}else if(ch===62){this.eof=true;break}else{continue}if(firstDigit<0){firstDigit=digit}else{buffer[bufferLength++]=firstDigit<<4|digit;firstDigit=-1}}if(firstDigit>=0&&this.eof){buffer[bufferLength++]=firstDigit<<4;firstDigit=-1}this.firstDigit=firstDigit;this.bufferLength=bufferLength};return AsciiHexStream}();var RunLengthStream=function RunLengthStreamClosure(){function RunLengthStream(str,maybeLength){this.str=str;this.dict=str.dict;DecodeStream.call(this,maybeLength)}RunLengthStream.prototype=Object.create(DecodeStream.prototype);RunLengthStream.prototype.readBlock=function RunLengthStream_readBlock(){var repeatHeader=this.str.getBytes(2);if(!repeatHeader||repeatHeader.length<2||repeatHeader[0]===128){this.eof=true;return}var buffer;var bufferLength=this.bufferLength;var n=repeatHeader[0];if(n<128){buffer=this.ensureBuffer(bufferLength+n+1);buffer[bufferLength++]=repeatHeader[1];if(n>0){var source=this.str.getBytes(n);buffer.set(source,bufferLength);bufferLength+=n}}else{n=257-n;var b=repeatHeader[1];buffer=this.ensureBuffer(bufferLength+n+1);for(var i=0;i0){this.nextLine2D=!this.lookBits(1);this.eatBits(1)}DecodeStream.call(this,maybeLength)}CCITTFaxStream.prototype=Object.create(DecodeStream.prototype);CCITTFaxStream.prototype.readBlock=function CCITTFaxStream_readBlock(){while(!this.eof){var c=this.lookChar();this.ensureBuffer(this.bufferLength+1);this.buffer[this.bufferLength++]=c}};CCITTFaxStream.prototype.addPixels=function ccittFaxStreamAddPixels(a1,blackPixels){var codingLine=this.codingLine;var codingPos=this.codingPos;if(a1>codingLine[codingPos]){if(a1>this.columns){info("row is wrong length");this.err=true;a1=this.columns}if(codingPos&1^blackPixels){++codingPos}codingLine[codingPos]=a1}this.codingPos=codingPos};CCITTFaxStream.prototype.addPixelsNeg=function ccittFaxStreamAddPixelsNeg(a1,blackPixels){var codingLine=this.codingLine;var codingPos=this.codingPos;if(a1>codingLine[codingPos]){if(a1>this.columns){info("row is wrong length");this.err=true;a1=this.columns}if(codingPos&1^blackPixels){++codingPos}codingLine[codingPos]=a1}else if(a10&&a1=64);do{code2+=code3=this.getWhiteCode()}while(code3>=64)}else{do{code1+=code3=this.getWhiteCode()}while(code3>=64);do{code2+=code3=this.getBlackCode()}while(code3>=64)}this.addPixels(codingLine[this.codingPos]+code1,blackPixels);if(codingLine[this.codingPos]0){--refPos}else{++refPos}while(refLine[refPos]<=codingLine[this.codingPos]&&refLine[refPos]0){--refPos}else{++refPos}while(refLine[refPos]<=codingLine[this.codingPos]&&refLine[refPos]0){--refPos}else{++refPos}while(refLine[refPos]<=codingLine[this.codingPos]&&refLine[refPos]=64)}else{do{code1+=code3=this.getWhiteCode()}while(code3>=64)}this.addPixels(codingLine[this.codingPos]+code1,blackPixels);blackPixels^=1}}var gotEOL=false;if(this.byteAlign){this.inputBits&=~7}if(!this.eoblock&&this.row===this.rows-1){this.eof=true}else{code1=this.lookBits(12);if(this.eoline){while(code1!==ccittEOF&&code1!==1){this.eatBits(1);code1=this.lookBits(12)}}else{while(code1===0){this.eatBits(1);code1=this.lookBits(12)}}if(code1===1){this.eatBits(12);gotEOL=true}else if(code1===ccittEOF){this.eof=true}}if(!this.eof&&this.encoding>0){this.nextLine2D=!this.lookBits(1);this.eatBits(1)}if(this.eoblock&&gotEOL&&this.byteAlign){code1=this.lookBits(12);if(code1===1){this.eatBits(12);if(this.encoding>0){this.lookBits(1);this.eatBits(1)}if(this.encoding>=0){for(i=0;i<4;++i){code1=this.lookBits(12);if(code1!==1){info("bad rtc code: "+code1)}this.eatBits(12);if(this.encoding>0){this.lookBits(1);this.eatBits(1)}}}this.eof=true}}else if(this.err&&this.eoline){while(true){code1=this.lookBits(13);if(code1===ccittEOF){this.eof=true;return null}if(code1>>1===1){break}this.eatBits(1)}this.eatBits(12);if(this.encoding>0){this.eatBits(1);this.nextLine2D=!(code1&1)}}if(codingLine[0]>0){this.outputBits=codingLine[this.codingPos=0]}else{this.outputBits=codingLine[this.codingPos=1]}this.row++}var c;if(this.outputBits>=8){c=this.codingPos&1?0:255;this.outputBits-=8;if(this.outputBits===0&&codingLine[this.codingPos]bits){c<<=bits;if(!(this.codingPos&1)){c|=255>>8-bits}this.outputBits-=bits;bits=0}else{c<<=this.outputBits;if(!(this.codingPos&1)){c|=255>>8-this.outputBits}bits-=this.outputBits;this.outputBits=0;if(codingLine[this.codingPos]0){c<<=bits;bits=0}}}while(bits)}if(this.black){c^=255}return c};CCITTFaxStream.prototype.findTableCode=function ccittFaxStreamFindTableCode(start,end,table,limit){var limitValue=limit||0;for(var i=start;i<=end;++i){var code=this.lookBits(i);if(code===ccittEOF){return[true,1,false]}if(i=limitValue){var p=table[code-limitValue];if(p[0]===i){this.eatBits(i);return[true,p[1],true]}}}return[false,0,false]};CCITTFaxStream.prototype.getTwoDimCode=function ccittFaxStreamGetTwoDimCode(){var code=0;var p;if(this.eoblock){code=this.lookBits(7);p=twoDimTable[code];if(p&&p[0]>0){this.eatBits(p[0]);return p[1]}}else{var result=this.findTableCode(1,7,twoDimTable);if(result[0]&&result[2]){return result[1]}}info("Bad two dim code");return ccittEOF};CCITTFaxStream.prototype.getWhiteCode=function ccittFaxStreamGetWhiteCode(){var code=0;var p;if(this.eoblock){code=this.lookBits(12);if(code===ccittEOF){return 1}if(code>>5===0){p=whiteTable1[code]}else{p=whiteTable2[code>>3]}if(p[0]>0){this.eatBits(p[0]);return p[1]}}else{var result=this.findTableCode(1,9,whiteTable2);if(result[0]){return result[1]}result=this.findTableCode(11,12,whiteTable1);if(result[0]){return result[1]}}info("bad white code");this.eatBits(1);return 1};CCITTFaxStream.prototype.getBlackCode=function ccittFaxStreamGetBlackCode(){var code,p;if(this.eoblock){code=this.lookBits(13);if(code===ccittEOF){return 1}if(code>>7===0){p=blackTable1[code]}else if(code>>9===0&&code>>7!==0){p=blackTable2[(code>>1)-64]}else{p=blackTable3[code>>7]}if(p[0]>0){this.eatBits(p[0]);return p[1]}}else{var result=this.findTableCode(2,6,blackTable3);if(result[0]){return result[1]}result=this.findTableCode(7,12,blackTable2,64);if(result[0]){return result[1]}result=this.findTableCode(10,13,blackTable1);if(result[0]){return result[1]}}info("bad black code");this.eatBits(1);return 1};CCITTFaxStream.prototype.lookBits=function CCITTFaxStream_lookBits(n){var c;while(this.inputBits>16-n}this.inputBuf=this.inputBuf<<8|c;this.inputBits+=8}return this.inputBuf>>this.inputBits-n&65535>>16-n};CCITTFaxStream.prototype.eatBits=function CCITTFaxStream_eatBits(n){if((this.inputBits-=n)<0){this.inputBits=0}};return CCITTFaxStream}();var LZWStream=function LZWStreamClosure(){function LZWStream(str,maybeLength,earlyChange){this.str=str;this.dict=str.dict;this.cachedData=0;this.bitsCached=0;var maxLzwDictionarySize=4096;var lzwState={earlyChange:earlyChange,codeLength:9,nextCode:258,dictionaryValues:new Uint8Array(maxLzwDictionarySize),dictionaryLengths:new Uint16Array(maxLzwDictionarySize),dictionaryPrevCodes:new Uint16Array(maxLzwDictionarySize),currentSequence:new Uint8Array(maxLzwDictionarySize),currentSequenceLength:0};for(var i=0;i<256;++i){lzwState.dictionaryValues[i]=i;lzwState.dictionaryLengths[i]=1}this.lzwState=lzwState;DecodeStream.call(this,maybeLength)}LZWStream.prototype=Object.create(DecodeStream.prototype);LZWStream.prototype.readBits=function LZWStream_readBits(n){var bitsCached=this.bitsCached;var cachedData=this.cachedData;while(bitsCached>>bitsCached&(1<0;if(code<256){currentSequence[0]=code;currentSequenceLength=1}else if(code>=258){if(code=0;j--){currentSequence[j]=dictionaryValues[q];q=dictionaryPrevCodes[q]}}else{currentSequence[currentSequenceLength++]=currentSequence[0]}}else if(code===256){codeLength=9;nextCode=258;currentSequenceLength=0;continue}else{this.eof=true;delete this.lzwState;break}if(hasPrev){dictionaryPrevCodes[nextCode]=prevCode;dictionaryLengths[nextCode]=dictionaryLengths[prevCode]+1;dictionaryValues[nextCode]=currentSequence[0];nextCode++;codeLength=nextCode+earlyChange&nextCode+earlyChange-1?codeLength:Math.min(Math.log(nextCode+earlyChange)/.6931471805599453+1,12)|0}prevCode=code;decodedLength+=currentSequenceLength;if(estimatedDecodedSize>5&255;padded[i++]=length>>13&255;padded[i++]=length>>21&255;padded[i++]=length>>>29&255;padded[i++]=0;padded[i++]=0;padded[i++]=0;var w=new Int32Array(16);for(i=0;i>>32-rotate)|0;a=tmp}h0=h0+a|0;h1=h1+b|0;h2=h2+c|0;h3=h3+d|0}return new Uint8Array([h0&255,h0>>8&255,h0>>16&255,h0>>>24&255,h1&255,h1>>8&255,h1>>16&255,h1>>>24&255,h2&255,h2>>8&255,h2>>16&255,h2>>>24&255,h3&255,h3>>8&255,h3>>16&255,h3>>>24&255])}return hash}();var Word64=function Word64Closure(){function Word64(highInteger,lowInteger){this.high=highInteger|0;this.low=lowInteger|0}Word64.prototype={and:function Word64_and(word){this.high&=word.high;this.low&=word.low},xor:function Word64_xor(word){this.high^=word.high;this.low^=word.low},or:function Word64_or(word){this.high|=word.high;this.low|=word.low},shiftRight:function Word64_shiftRight(places){if(places>=32){this.low=this.high>>>places-32|0;this.high=0}else{this.low=this.low>>>places|this.high<<32-places;this.high=this.high>>>places|0}},shiftLeft:function Word64_shiftLeft(places){if(places>=32){this.high=this.low<>>32-places;this.low=this.low<>>places|high<<32-places;this.high=high>>>places|low<<32-places},not:function Word64_not(){this.high=~this.high;this.low=~this.low},add:function Word64_add(word){var lowAdd=(this.low>>>0)+(word.low>>>0);var highAdd=(this.high>>>0)+(word.high>>>0);if(lowAdd>4294967295){highAdd+=1}this.low=lowAdd|0;this.high=highAdd|0},copyTo:function Word64_copyTo(bytes,offset){bytes[offset]=this.high>>>24&255;bytes[offset+1]=this.high>>16&255;bytes[offset+2]=this.high>>8&255;bytes[offset+3]=this.high&255;bytes[offset+4]=this.low>>>24&255;bytes[offset+5]=this.low>>16&255;bytes[offset+6]=this.low>>8&255;bytes[offset+7]=this.low&255},assign:function Word64_assign(word){this.high=word.high;this.low=word.low}};return Word64}();var calculateSHA256=function calculateSHA256Closure(){function rotr(x,n){return x>>>n|x<<32-n}function ch(x,y,z){return x&y^~x&z}function maj(x,y,z){return x&y^x&z^y&z}function sigma(x){return rotr(x,2)^rotr(x,13)^rotr(x,22)}function sigmaPrime(x){return rotr(x,6)^rotr(x,11)^rotr(x,25)}function littleSigma(x){return rotr(x,7)^rotr(x,18)^x>>>3}function littleSigmaPrime(x){return rotr(x,17)^rotr(x,19)^x>>>10}var k=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function hash(data,offset,length){var h0=1779033703,h1=3144134277,h2=1013904242,h3=2773480762,h4=1359893119,h5=2600822924,h6=528734635,h7=1541459225;var paddedLength=Math.ceil((length+9)/64)*64;var padded=new Uint8Array(paddedLength);var i,j,n;for(i=0;i>>29&255;padded[i++]=length>>21&255;padded[i++]=length>>13&255;padded[i++]=length>>5&255;padded[i++]=length<<3&255;var w=new Uint32Array(64);for(i=0;i>24&255,h0>>16&255,h0>>8&255,h0&255,h1>>24&255,h1>>16&255,h1>>8&255,h1&255,h2>>24&255,h2>>16&255,h2>>8&255,h2&255,h3>>24&255,h3>>16&255,h3>>8&255,h3&255,h4>>24&255,h4>>16&255,h4>>8&255,h4&255,h5>>24&255,h5>>16&255,h5>>8&255,h5&255,h6>>24&255,h6>>16&255,h6>>8&255,h6&255,h7>>24&255,h7>>16&255,h7>>8&255,h7&255])}return hash}();var calculateSHA512=function calculateSHA512Closure(){function ch(result,x,y,z,tmp){result.assign(x);result.and(y);tmp.assign(x);tmp.not();tmp.and(z);result.xor(tmp)}function maj(result,x,y,z,tmp){result.assign(x);result.and(y);tmp.assign(x);tmp.and(z);result.xor(tmp);tmp.assign(y);tmp.and(z);result.xor(tmp)}function sigma(result,x,tmp){result.assign(x);result.rotateRight(28);tmp.assign(x);tmp.rotateRight(34);result.xor(tmp);tmp.assign(x);tmp.rotateRight(39);result.xor(tmp)}function sigmaPrime(result,x,tmp){result.assign(x);result.rotateRight(14);tmp.assign(x);tmp.rotateRight(18);result.xor(tmp);tmp.assign(x);tmp.rotateRight(41);result.xor(tmp)}function littleSigma(result,x,tmp){result.assign(x);result.rotateRight(1);tmp.assign(x);tmp.rotateRight(8);result.xor(tmp);tmp.assign(x);tmp.shiftRight(7);result.xor(tmp)}function littleSigmaPrime(result,x,tmp){result.assign(x);result.rotateRight(19);tmp.assign(x);tmp.rotateRight(61);result.xor(tmp);tmp.assign(x);tmp.shiftRight(6);result.xor(tmp)}var k=[new Word64(1116352408,3609767458),new Word64(1899447441,602891725),new Word64(3049323471,3964484399),new Word64(3921009573,2173295548),new Word64(961987163,4081628472),new Word64(1508970993,3053834265),new Word64(2453635748,2937671579),new Word64(2870763221,3664609560),new Word64(3624381080,2734883394),new Word64(310598401,1164996542),new Word64(607225278,1323610764),new Word64(1426881987,3590304994),new Word64(1925078388,4068182383),new Word64(2162078206,991336113),new Word64(2614888103,633803317),new Word64(3248222580,3479774868),new Word64(3835390401,2666613458),new Word64(4022224774,944711139),new Word64(264347078,2341262773),new Word64(604807628,2007800933),new Word64(770255983,1495990901),new Word64(1249150122,1856431235),new Word64(1555081692,3175218132),new Word64(1996064986,2198950837),new Word64(2554220882,3999719339),new Word64(2821834349,766784016),new Word64(2952996808,2566594879),new Word64(3210313671,3203337956),new Word64(3336571891,1034457026),new Word64(3584528711,2466948901),new Word64(113926993,3758326383),new Word64(338241895,168717936),new Word64(666307205,1188179964),new Word64(773529912,1546045734),new Word64(1294757372,1522805485),new Word64(1396182291,2643833823),new Word64(1695183700,2343527390),new Word64(1986661051,1014477480),new Word64(2177026350,1206759142),new Word64(2456956037,344077627),new Word64(2730485921,1290863460),new Word64(2820302411,3158454273),new Word64(3259730800,3505952657),new Word64(3345764771,106217008),new Word64(3516065817,3606008344),new Word64(3600352804,1432725776),new Word64(4094571909,1467031594),new Word64(275423344,851169720),new Word64(430227734,3100823752),new Word64(506948616,1363258195),new Word64(659060556,3750685593),new Word64(883997877,3785050280),new Word64(958139571,3318307427),new Word64(1322822218,3812723403),new Word64(1537002063,2003034995),new Word64(1747873779,3602036899),new Word64(1955562222,1575990012),new Word64(2024104815,1125592928),new Word64(2227730452,2716904306),new Word64(2361852424,442776044),new Word64(2428436474,593698344),new Word64(2756734187,3733110249),new Word64(3204031479,2999351573),new Word64(3329325298,3815920427),new Word64(3391569614,3928383900),new Word64(3515267271,566280711),new Word64(3940187606,3454069534),new Word64(4118630271,4000239992),new Word64(116418474,1914138554),new Word64(174292421,2731055270),new Word64(289380356,3203993006),new Word64(460393269,320620315),new Word64(685471733,587496836),new Word64(852142971,1086792851),new Word64(1017036298,365543100),new Word64(1126000580,2618297676),new Word64(1288033470,3409855158),new Word64(1501505948,4234509866),new Word64(1607167915,987167468),new Word64(1816402316,1246189591)];function hash(data,offset,length,mode384){mode384=!!mode384;var h0,h1,h2,h3,h4,h5,h6,h7;if(!mode384){h0=new Word64(1779033703,4089235720);h1=new Word64(3144134277,2227873595);h2=new Word64(1013904242,4271175723);h3=new Word64(2773480762,1595750129);h4=new Word64(1359893119,2917565137);h5=new Word64(2600822924,725511199);h6=new Word64(528734635,4215389547);h7=new Word64(1541459225,327033209)}else{h0=new Word64(3418070365,3238371032);h1=new Word64(1654270250,914150663);h2=new Word64(2438529370,812702999);h3=new Word64(355462360,4144912697);h4=new Word64(1731405415,4290775857);h5=new Word64(2394180231,1750603025);h6=new Word64(3675008525,1694076839);h7=new Word64(1203062813,3204075428)}var paddedLength=Math.ceil((length+17)/128)*128;var padded=new Uint8Array(paddedLength);var i,j,n;for(i=0;i>>29&255;padded[i++]=length>>21&255;padded[i++]=length>>13&255;padded[i++]=length>>5&255;padded[i++]=length<<3&255;var w=new Array(80);for(i=0;i<80;i++){w[i]=new Word64(0,0)}var a=new Word64(0,0),b=new Word64(0,0),c=new Word64(0,0);var d=new Word64(0,0),e=new Word64(0,0),f=new Word64(0,0);var g=new Word64(0,0),h=new Word64(0,0);var t1=new Word64(0,0),t2=new Word64(0,0);var tmp1=new Word64(0,0),tmp2=new Word64(0,0),tmp3;for(i=0;i=1;--i){t=state[13];state[13]=state[9];state[9]=state[5];state[5]=state[1];state[1]=t;t=state[14];u=state[10];state[14]=state[6];state[10]=state[2];state[6]=t;state[2]=u;t=state[15];u=state[11];v=state[7];state[15]=state[3];state[11]=t;state[7]=u;state[3]=v;for(j=0;j<16;++j){state[j]=inv_s[state[j]]}for(j=0,k=i*16;j<16;++j,++k){state[j]^=key[k]}for(j=0;j<16;j+=4){var s0=mix[state[j]],s1=mix[state[j+1]],s2=mix[state[j+2]],s3=mix[state[j+3]];t=s0^s1>>>8^s1<<24^s2>>>16^s2<<16^s3>>>24^s3<<8;state[j]=t>>>24&255;state[j+1]=t>>16&255;state[j+2]=t>>8&255;state[j+3]=t&255}}t=state[13];state[13]=state[9];state[9]=state[5];state[5]=state[1];state[1]=t;t=state[14];u=state[10];state[14]=state[6];state[10]=state[2];state[6]=t;state[2]=u;t=state[15];u=state[11];v=state[7];state[15]=state[3];state[11]=t;state[7]=u;state[3]=v;for(j=0;j<16;++j){state[j]=inv_s[state[j]];state[j]^=key[j]}return state}function encrypt128(input,key){var t,u,v,k;var state=new Uint8Array(16);state.set(input);for(j=0;j<16;++j){state[j]^=key[j]}for(i=1;i<10;i++){for(j=0;j<16;++j){state[j]=s[state[j]]}v=state[1];state[1]=state[5];state[5]=state[9];state[9]=state[13];state[13]=v;v=state[2];u=state[6];state[2]=state[10];state[6]=state[14];state[10]=v;state[14]=u;v=state[3];u=state[7];t=state[11];state[3]=state[15];state[7]=v;state[11]=u;state[15]=t;for(var j=0;j<16;j+=4){var s0=state[j+0],s1=state[j+1];var s2=state[j+2],s3=state[j+3];t=s0^s1^s2^s3;state[j+0]^=t^mixCol[s0^s1];state[j+1]^=t^mixCol[s1^s2];state[j+2]^=t^mixCol[s2^s3];state[j+3]^=t^mixCol[s3^s0]}for(j=0,k=i*16;j<16;++j,++k){state[j]^=key[k]}}for(j=0;j<16;++j){state[j]=s[state[j]]}v=state[1];state[1]=state[5];state[5]=state[9];state[9]=state[13];state[13]=v;v=state[2];u=state[6];state[2]=state[10];state[6]=state[14];state[10]=v;state[14]=u;v=state[3];u=state[7];t=state[11];state[3]=state[15];state[7]=v;state[11]=u;state[15]=t;for(j=0,k=160;j<16;++j,++k){state[j]^=key[k]}return state}function AES128Cipher(key){this.key=expandKey128(key);this.buffer=new Uint8Array(16);this.bufferPosition=0}function decryptBlock2(data,finalize){var i,j,ii,sourceLength=data.length,buffer=this.buffer,bufferLength=this.bufferPosition,result=[],iv=this.iv;for(i=0;i=ii;--i){if(lastBlock[i]!==psLen){psLen=0;break}}outputLength-=psLen;result[result.length-1]=lastBlock.subarray(0,16-psLen)}}var output=new Uint8Array(outputLength);for(i=0,j=0,ii=result.length;i=256){r=(r^27)&255}}for(var n=0;n<4;++n){result[j]=t1^=result[j-32];j++;result[j]=t2^=result[j-32];j++;result[j]=t3^=result[j-32];j++;result[j]=t4^=result[j-32];j++}}return result}function decrypt256(input,key){var state=new Uint8Array(16);state.set(input);var i,j,k;var t,u,v;for(j=0,k=224;j<16;++j,++k){state[j]^=key[k]}for(i=13;i>=1;--i){t=state[13];state[13]=state[9];state[9]=state[5];state[5]=state[1];state[1]=t;t=state[14];u=state[10];state[14]=state[6];state[10]=state[2];state[6]=t;state[2]=u;t=state[15];u=state[11];v=state[7];state[15]=state[3];state[11]=t;state[7]=u;state[3]=v;for(j=0;j<16;++j){state[j]=inv_s[state[j]]}for(j=0,k=i*16;j<16;++j,++k){state[j]^=key[k]}for(j=0;j<16;j+=4){var s0=mix[state[j]],s1=mix[state[j+1]],s2=mix[state[j+2]],s3=mix[state[j+3]];t=s0^s1>>>8^s1<<24^s2>>>16^s2<<16^s3>>>24^s3<<8;state[j]=t>>>24&255;state[j+1]=t>>16&255;state[j+2]=t>>8&255;state[j+3]=t&255}}t=state[13];state[13]=state[9];state[9]=state[5];state[5]=state[1];state[1]=t;t=state[14];u=state[10];state[14]=state[6];state[10]=state[2];state[6]=t;state[2]=u;t=state[15];u=state[11];v=state[7];state[15]=state[3];state[11]=t;state[7]=u;state[3]=v;for(j=0;j<16;++j){state[j]=inv_s[state[j]];state[j]^=key[j]}return state}function encrypt256(input,key){var t,u,v,k;var state=new Uint8Array(16);state.set(input);for(j=0;j<16;++j){state[j]^=key[j]}for(i=1;i<14;i++){for(j=0;j<16;++j){state[j]=s[state[j]]}v=state[1];state[1]=state[5];state[5]=state[9];state[9]=state[13];state[13]=v;v=state[2];u=state[6];state[2]=state[10];state[6]=state[14];state[10]=v;state[14]=u;v=state[3];u=state[7];t=state[11];state[3]=state[15];state[7]=v;state[11]=u;state[15]=t;for(var j=0;j<16;j+=4){var s0=state[j+0],s1=state[j+1];var s2=state[j+2],s3=state[j+3];t=s0^s1^s2^s3;state[j+0]^=t^mixCol[s0^s1];state[j+1]^=t^mixCol[s1^s2];state[j+2]^=t^mixCol[s2^s3];state[j+3]^=t^mixCol[s3^s0]}for(j=0,k=i*16;j<16;++j,++k){state[j]^=key[k]}}for(j=0;j<16;++j){state[j]=s[state[j]]}v=state[1];state[1]=state[5];state[5]=state[9];state[9]=state[13];state[13]=v;v=state[2];u=state[6];state[2]=state[10];state[6]=state[14];state[10]=v;state[14]=u;v=state[3];u=state[7];t=state[11];state[3]=state[15];state[7]=v;state[11]=u;state[15]=t;for(j=0,k=224;j<16;++j,++k){state[j]^=key[k]}return state}function AES256Cipher(key){this.key=expandKey256(key);this.buffer=new Uint8Array(16);this.bufferPosition=0}function decryptBlock2(data,finalize){var i,j,ii,sourceLength=data.length,buffer=this.buffer,bufferLength=this.bufferPosition,result=[],iv=this.iv;for(i=0;i=ii;--i){if(lastBlock[i]!==psLen){psLen=0;break}}outputLength-=psLen;result[result.length-1]=lastBlock.subarray(0,16-psLen)}}var output=new Uint8Array(outputLength);for(i=0,j=0,ii=result.length;ii-32){var arrayLength=password.length+k.length+userBytes.length;var k1=new Uint8Array(arrayLength*64);var array=concatArrays(password,k);array=concatArrays(array,userBytes);for(var j=0,pos=0;j<64;j++,pos+=arrayLength){k1.set(array,pos)}var cipher=new AES128Cipher(k.subarray(0,16));e=cipher.encrypt(k1,k.subarray(16,32));var remainder=0;for(var z=0;z<16;z++){remainder*=256%3;remainder%=3;remainder+=(e[z]>>>0)%3;remainder%=3}if(remainder===0){k=calculateSHA256(e,0,e.length)}else if(remainder===1){k=calculateSHA384(e,0,e.length)}else if(remainder===2){k=calculateSHA512(e,0,e.length)}i++}return k.subarray(0,32)}function PDF20(){}function compareByteArrays(array1,array2){if(array1.length!==array2.length){return false}for(var i=0;i>8&255;hashData[i++]=flags>>16&255;hashData[i++]=flags>>>24&255;for(j=0,n=fileId.length;j=4&&!encryptMetadata){hashData[i++]=255;hashData[i++]=255;hashData[i++]=255;hashData[i++]=255}var hash=calculateMD5(hashData,0,i);var keyLengthInBytes=keyLength>>3;if(revision>=3){for(j=0;j<50;++j){hash=calculateMD5(hash,0,keyLengthInBytes)}}var encryptionKey=hash.subarray(0,keyLengthInBytes);var cipher,checkData;if(revision>=3){for(i=0;i<32;++i){hashData[i]=defaultPasswordBytes[i]}for(j=0,n=fileId.length;j>3;if(revision>=3){for(j=0;j<50;++j){hash=calculateMD5(hash,0,hash.length)}}var cipher,userPassword;if(revision>=3){userPassword=ownerPassword;var derivedKey=new Uint8Array(keyLengthInBytes),k;for(j=19;j>=0;j--){for(k=0;k=4){this.cf=dict.get("CF");this.stmf=dict.get("StmF")||identityName;this.strf=dict.get("StrF")||identityName;this.eff=dict.get("EFF")||this.stmf}}function buildObjectKey(num,gen,encryptionKey,isAes){var key=new Uint8Array(encryptionKey.length+9),i,n;for(i=0,n=encryptionKey.length;i>8&255;key[i++]=num>>16&255;key[i++]=gen&255;key[i++]=gen>>8&255;if(isAes){key[i++]=115;key[i++]=65;key[i++]=108;key[i++]=84}var hash=calculateMD5(key,0,i);return hash.subarray(0,Math.min(encryptionKey.length+5,16))}function buildCipherConstructor(cf,name,num,gen,key){var cryptFilter=cf.get(name.name);var cfm;if(cryptFilter!==null&&cryptFilter!==undefined){cfm=cryptFilter.get("CFM")}if(!cfm||cfm.name==="None"){return function cipherTransformFactoryBuildCipherConstructorNone(){return new NullCipher}}if("V2"===cfm.name){return function cipherTransformFactoryBuildCipherConstructorV2(){return new ARCFourCipher(buildObjectKey(num,gen,key,false))}}if("AESV2"===cfm.name){return function cipherTransformFactoryBuildCipherConstructorAESV2(){return new AES128Cipher(buildObjectKey(num,gen,key,true))}}if("AESV3"===cfm.name){return function cipherTransformFactoryBuildCipherConstructorAESV3(){return new AES256Cipher(key)}}error("Unknown crypto method")}CipherTransformFactory.prototype={createCipherTransform:function CipherTransformFactory_createCipherTransform(num,gen){if(this.algorithm===4||this.algorithm===5){return new CipherTransform(buildCipherConstructor(this.cf,this.stmf,num,gen,this.encryptionKey),buildCipherConstructor(this.cf,this.strf,num,gen,this.encryptionKey))}var key=buildObjectKey(num,gen,this.encryptionKey,false);var cipherConstructor=function buildCipherCipherConstructor(){return new ARCFourCipher(key)};return new CipherTransform(cipherConstructor,cipherConstructor)}};return CipherTransformFactory}();exports.AES128Cipher=AES128Cipher;exports.AES256Cipher=AES256Cipher;exports.ARCFourCipher=ARCFourCipher;exports.CipherTransformFactory=CipherTransformFactory;exports.PDF17=PDF17;exports.PDF20=PDF20;exports.calculateMD5=calculateMD5;exports.calculateSHA256=calculateSHA256;exports.calculateSHA384=calculateSHA384;exports.calculateSHA512=calculateSHA512});(function(root,factory){{factory(root.pdfjsCoreFontRenderer={},root.pdfjsSharedUtil,root.pdfjsCoreStream,root.pdfjsCoreGlyphList,root.pdfjsCoreEncodings,root.pdfjsCoreCFFParser)}})(this,function(exports,sharedUtil,coreStream,coreGlyphList,coreEncodings,coreCFFParser){var Util=sharedUtil.Util;var bytesToString=sharedUtil.bytesToString;var error=sharedUtil.error;var Stream=coreStream.Stream;var getGlyphsUnicode=coreGlyphList.getGlyphsUnicode;var StandardEncoding=coreEncodings.StandardEncoding;var CFFParser=coreCFFParser.CFFParser;var FontRendererFactory=function FontRendererFactoryClosure(){function getLong(data,offset){return data[offset]<<24|data[offset+1]<<16|data[offset+2]<<8|data[offset+3]}function getUshort(data,offset){return data[offset]<<8|data[offset+1]}function parseCmap(data,start,end){var offset=getUshort(data,start+2)===1?getLong(data,start+8):getLong(data,start+16);var format=getUshort(data,start+offset);var length,ranges,p,i;if(format===4){length=getUshort(data,start+offset+2);var segCount=getUshort(data,start+offset+6)>>1;p=start+offset+14;ranges=[];for(i=0;i>1;if(code>16;var flags;var x=0,y=0;i+=10;if(numberOfContours<0){do{flags=code[i]<<8|code[i+1];var glyphIndex=code[i+2]<<8|code[i+3];i+=4;var arg1,arg2;if(flags&1){arg1=(code[i]<<24|code[i+1]<<16)>>16;arg2=(code[i+2]<<24|code[i+3]<<16)>>16;i+=4}else{arg1=code[i++];arg2=code[i++]}if(flags&2){x=arg1;y=arg2}else{x=0;y=0}var scaleX=1,scaleY=1,scale01=0,scale10=0;if(flags&8){scaleX=scaleY=(code[i]<<24|code[i+1]<<16)/1073741824;i+=2}else if(flags&64){scaleX=(code[i]<<24|code[i+1]<<16)/1073741824;scaleY=(code[i+2]<<24|code[i+3]<<16)/1073741824;i+=4}else if(flags&128){scaleX=(code[i]<<24|code[i+1]<<16)/1073741824;scale01=(code[i+2]<<24|code[i+3]<<16)/1073741824;scale10=(code[i+4]<<24|code[i+5]<<16)/1073741824;scaleY=(code[i+6]<<24|code[i+7]<<16)/1073741824;i+=8}var subglyph=font.glyphs[glyphIndex];if(subglyph){cmds.push({cmd:"save"});cmds.push({cmd:"transform",args:[scaleX,scale01,scale10,scaleY,x,y]});compileGlyf(subglyph,cmds,font);cmds.push({cmd:"restore"})}}while(flags&32)}else{var endPtsOfContours=[];var j,jj;for(j=0;j0){points.push({flags:flags})}}for(j=0;j>16;i+=2;break;case 2:x-=code[i++];break;case 18:x+=code[i++];break}points[j].x=x}for(j=0;j>16;i+=2;break;case 4:y-=code[i++];break;case 36:y+=code[i++];break}points[j].y=y}var startPoint=0;for(i=0;i>1;stackClean=true;break;case 3:stems+=stack.length>>1;stackClean=true;break;case 4:y+=stack.pop();moveTo(x,y);stackClean=true;break;case 5:while(stack.length>0){x+=stack.shift();y+=stack.shift();lineTo(x,y)}break;case 6:while(stack.length>0){x+=stack.shift();lineTo(x,y);if(stack.length===0){break}y+=stack.shift();lineTo(x,y)}break;case 7:while(stack.length>0){y+=stack.shift();lineTo(x,y);if(stack.length===0){break}x+=stack.shift();lineTo(x,y)}break;case 8:while(stack.length>0){xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y)}break;case 10:n=stack.pop()+font.subrsBias;subrCode=font.subrs[n];if(subrCode){parse(subrCode)}break;case 11:return;case 12:v=code[i++];switch(v){case 34:xa=x+stack.shift();xb=xa+stack.shift();y1=y+stack.shift();x=xb+stack.shift();bezierCurveTo(xa,y,xb,y1,x,y1);xa=x+stack.shift();xb=xa+stack.shift();x=xb+stack.shift();bezierCurveTo(xa,y1,xb,y,x,y);break;case 35:xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y);xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y);stack.pop();break;case 36:xa=x+stack.shift();y1=y+stack.shift();xb=xa+stack.shift();y2=y1+stack.shift();x=xb+stack.shift();bezierCurveTo(xa,y1,xb,y2,x,y2);xa=x+stack.shift();xb=xa+stack.shift();y3=y2+stack.shift();x=xb+stack.shift();bezierCurveTo(xa,y2,xb,y3,x,y);break;case 37:var x0=x,y0=y;xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y);xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb;y=yb;if(Math.abs(x-x0)>Math.abs(y-y0)){x+=stack.shift()}else{y+=stack.shift()}bezierCurveTo(xa,ya,xb,yb,x,y);break;default:error("unknown operator: 12 "+v)}break;case 14:if(stack.length>=4){var achar=stack.pop();var bchar=stack.pop();y=stack.pop();x=stack.pop();cmds.push({cmd:"save"});cmds.push({cmd:"translate",args:[x,y]});var cmap=lookupCmap(font.cmap,String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]]));compileCharString(font.glyphs[cmap.glyphId],cmds,font);cmds.push({cmd:"restore"});cmap=lookupCmap(font.cmap,String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]]));compileCharString(font.glyphs[cmap.glyphId],cmds,font)}return;case 18:stems+=stack.length>>1;stackClean=true;break;case 19:stems+=stack.length>>1;i+=stems+7>>3;stackClean=true;break;case 20:stems+=stack.length>>1;i+=stems+7>>3;stackClean=true;break;case 21:y+=stack.pop();x+=stack.pop();moveTo(x,y);stackClean=true;break;case 22:x+=stack.pop();moveTo(x,y);stackClean=true;break;case 23:stems+=stack.length>>1;stackClean=true;break;case 24:while(stack.length>2){xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y)}x+=stack.shift();y+=stack.shift();lineTo(x,y);break;case 25:while(stack.length>6){x+=stack.shift();y+=stack.shift();lineTo(x,y)}xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y);break;case 26:if(stack.length%2){x+=stack.shift()}while(stack.length>0){xa=x;ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb;y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y)}break;case 27:if(stack.length%2){y+=stack.shift()}while(stack.length>0){xa=x+stack.shift();ya=y;xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb;bezierCurveTo(xa,ya,xb,yb,x,y)}break;case 28:stack.push((code[i]<<24|code[i+1]<<16)>>16);i+=2;break;case 29:n=stack.pop()+font.gsubrsBias;subrCode=font.gsubrs[n];if(subrCode){parse(subrCode)}break;case 30:while(stack.length>0){xa=x;ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+(stack.length===1?stack.shift():0);bezierCurveTo(xa,ya,xb,yb,x,y);if(stack.length===0){break}xa=x+stack.shift();ya=y;xb=xa+stack.shift();yb=ya+stack.shift();y=yb+stack.shift();x=xb+(stack.length===1?stack.shift():0);bezierCurveTo(xa,ya,xb,yb,x,y)}break;case 31:while(stack.length>0){xa=x+stack.shift();ya=y;xb=xa+stack.shift();yb=ya+stack.shift();y=yb+stack.shift();x=xb+(stack.length===1?stack.shift():0);bezierCurveTo(xa,ya,xb,yb,x,y);if(stack.length===0){break}xa=x;ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+(stack.length===1?stack.shift():0);bezierCurveTo(xa,ya,xb,yb,x,y)}break;default:if(v<32){error("unknown operator: "+v)}if(v<247){stack.push(v-139)}else if(v<251){stack.push((v-247)*256+code[i++]+108)}else if(v<255){stack.push(-(v-251)*256-code[i++]-108)}else{stack.push((code[i]<<24|code[i+1]<<16|code[i+2]<<8|code[i+3])/65536);i+=4}break}if(stackClean){stack.length=0}}}parse(code)}var noop="";function CompiledFont(fontMatrix){this.compiledGlyphs=Object.create(null);this.compiledCharCodeToGlyphId=Object.create(null);this.fontMatrix=fontMatrix}CompiledFont.prototype={getPathJs:function(unicode){var cmap=lookupCmap(this.cmap,unicode);var fn=this.compiledGlyphs[cmap.glyphId];if(!fn){fn=this.compileGlyph(this.glyphs[cmap.glyphId]);this.compiledGlyphs[cmap.glyphId]=fn}if(this.compiledCharCodeToGlyphId[cmap.charCode]===undefined){this.compiledCharCodeToGlyphId[cmap.charCode]=cmap.glyphId}return fn},compileGlyph:function(code){if(!code||code.length===0||code[0]===14){return noop}var cmds=[];cmds.push({cmd:"save"});cmds.push({cmd:"transform",args:this.fontMatrix.slice()});cmds.push({cmd:"scale",args:["size","-size"]});this.compileGlyphImpl(code,cmds);cmds.push({cmd:"restore"});return cmds},compileGlyphImpl:function(){error("Children classes should implement this.")},hasBuiltPath:function(unicode){var cmap=lookupCmap(this.cmap,unicode);return this.compiledGlyphs[cmap.glyphId]!==undefined&&this.compiledCharCodeToGlyphId[cmap.charCode]!==undefined}};function TrueTypeCompiled(glyphs,cmap,fontMatrix){fontMatrix=fontMatrix||[488e-6,0,0,488e-6,0,0];CompiledFont.call(this,fontMatrix);this.glyphs=glyphs;this.cmap=cmap}Util.inherit(TrueTypeCompiled,CompiledFont,{compileGlyphImpl:function(code,cmds){compileGlyf(code,cmds,this)}});function Type2Compiled(cffInfo,cmap,fontMatrix,glyphNameMap){fontMatrix=fontMatrix||[.001,0,0,.001,0,0];CompiledFont.call(this,fontMatrix);this.glyphs=cffInfo.glyphs;this.gsubrs=cffInfo.gsubrs||[];this.subrs=cffInfo.subrs||[];this.cmap=cmap;this.glyphNameMap=glyphNameMap||getGlyphsUnicode();this.gsubrsBias=this.gsubrs.length<1240?107:this.gsubrs.length<33900?1131:32768;this.subrsBias=this.subrs.length<1240?107:this.subrs.length<33900?1131:32768}Util.inherit(Type2Compiled,CompiledFont,{compileGlyphImpl:function(code,cmds){compileCharString(code,cmds,this)}});return{create:function FontRendererFactory_create(font,seacAnalysisEnabled){var data=new Uint8Array(font.data);var cmap,glyf,loca,cff,indexToLocFormat,unitsPerEm;var numTables=getUshort(data,4);for(var i=0,p=12;i>")&&!isEOF(this.buf1)){if(!isName(this.buf1)){info("Malformed dictionary: key must be a name object");this.shift();continue}var key=this.buf1.name;this.shift();if(isEOF(this.buf1)){break}dict.set(key,this.getObj(cipherTransform))}if(isEOF(this.buf1)){if(!this.recoveryMode){error("End of file inside dictionary")}return dict}if(isCmd(this.buf2,"stream")){return this.allowStreams?this.makeStream(dict,cipherTransform):dict}this.shift();return dict;default:return buf1}}if(isInt(buf1)){var num=buf1;if(isInt(this.buf1)&&isCmd(this.buf2,"R")){var ref=new Ref(num,this.buf1);this.shift();this.shift();return ref}return num}if(isString(buf1)){var str=buf1;if(cipherTransform){str=cipherTransform.decryptString(str)}return str}return buf1},findDefaultInlineStreamEnd:function Parser_findDefaultInlineStreamEnd(stream){var E=69,I=73,SPACE=32,LF=10,CR=13;var startPos=stream.pos,state=0,ch,i,n,followingBytes;while((ch=stream.getByte())!==-1){if(state===0){state=ch===E?1:0}else if(state===1){state=ch===I?2:0}else{assert(state===2);if(ch===SPACE||ch===LF||ch===CR){n=5;followingBytes=stream.peekBytes(n);for(i=0;i127)){state=0;break}}if(state===2){break}}else{state=0}}}return stream.pos-4-startPos},findDCTDecodeInlineStreamEnd:function Parser_findDCTDecodeInlineStreamEnd(stream){var startPos=stream.pos,foundEOI=false,b,markerLength,length;while((b=stream.getByte())!==-1){if(b!==255){continue}switch(stream.getByte()){case 0:break;case 255:stream.skip(-1);break;case 217:foundEOI=true;break;case 192:case 193:case 194:case 195:case 197:case 198:case 199:case 201:case 202:case 203:case 205:case 206:case 207:case 196:case 204:case 218:case 219:case 220:case 221:case 222:case 223:case 224:case 225:case 226:case 227:case 228:case 229:case 230:case 231:case 232:case 233:case 234:case 235:case 236:case 237:case 238:case 239:case 254:markerLength=stream.getUint16();if(markerLength>2){stream.skip(markerLength-2)}else{stream.skip(-2)}break}if(foundEOI){break}}length=stream.pos-startPos;if(b===-1){warn("Inline DCTDecode image stream: "+"EOI marker not found, searching for /EI/ instead.");stream.skip(-length);return this.findDefaultInlineStreamEnd(stream)}this.inlineStreamSkipEI(stream);return length},findASCII85DecodeInlineStreamEnd:function Parser_findASCII85DecodeInlineStreamEnd(stream){var TILDE=126,GT=62;var startPos=stream.pos,ch,length;while((ch=stream.getByte())!==-1){if(ch===TILDE&&stream.peekByte()===GT){stream.skip();break}}length=stream.pos-startPos;if(ch===-1){warn("Inline ASCII85Decode image stream: "+"EOD marker not found, searching for /EI/ instead.");stream.skip(-length);return this.findDefaultInlineStreamEnd(stream)}this.inlineStreamSkipEI(stream);return length},findASCIIHexDecodeInlineStreamEnd:function Parser_findASCIIHexDecodeInlineStreamEnd(stream){var GT=62;var startPos=stream.pos,ch,length;while((ch=stream.getByte())!==-1){if(ch===GT){break}}length=stream.pos-startPos;if(ch===-1){warn("Inline ASCIIHexDecode image stream: "+"EOD marker not found, searching for /EI/ instead.");stream.skip(-length);return this.findDefaultInlineStreamEnd(stream)}this.inlineStreamSkipEI(stream);return length},inlineStreamSkipEI:function Parser_inlineStreamSkipEI(stream){var E=69,I=73;var state=0,ch;while((ch=stream.getByte())!==-1){if(state===0){state=ch===E?1:0}else if(state===1){state=ch===I?2:0}else if(state===2){break}}},makeInlineImage:function Parser_makeInlineImage(cipherTransform){var lexer=this.lexer;var stream=lexer.stream;var dict=new Dict(this.xref);while(!isCmd(this.buf1,"ID")&&!isEOF(this.buf1)){if(!isName(this.buf1)){error("Dictionary key must be a name object")}var key=this.buf1.name;this.shift();if(isEOF(this.buf1)){break}dict.set(key,this.getObj(cipherTransform))}var filter=dict.get("Filter","F"),filterName;if(isName(filter)){filterName=filter.name}else if(isArray(filter)&&isName(filter[0])){filterName=filter[0].name}var startPos=stream.pos,length,i,ii;if(filterName==="DCTDecode"||filterName==="DCT"){length=this.findDCTDecodeInlineStreamEnd(stream)}else if(filterName==="ASCII85Decide"||filterName==="A85"){length=this.findASCII85DecodeInlineStreamEnd(stream)}else if(filterName==="ASCIIHexDecode"||filterName==="AHx"){length=this.findASCIIHexDecodeInlineStreamEnd(stream)}else{length=this.findDefaultInlineStreamEnd(stream)}var imageStream=stream.makeSubStream(startPos,length,dict);var adler32;if(length=ENDSTREAM_SIGNATURE_LENGTH){found=true;break}i++}if(found){skipped+=i;stream.pos+=i;break}skipped+=scanLength;stream.pos+=scanLength}if(!found){error("Missing endstream")}length=skipped;lexer.nextChar();this.shift();this.shift()}this.shift();stream=stream.makeSubStream(pos,length,dict);if(cipherTransform){stream=cipherTransform.createStream(stream,length)}stream=this.filter(stream,dict,length);stream.dict=dict;return stream},filter:function Parser_filter(stream,dict,length){var filter=dict.get("Filter","F");var params=dict.get("DecodeParms","DP");if(isName(filter)){return this.makeFilter(stream,filter.name,length,params)}var maybeLength=length;if(isArray(filter)){var filterArray=filter;var paramsArray=params;for(var i=0,ii=filterArray.length;i=48&&ch<=57){return ch&15}if(ch>=65&&ch<=70||ch>=97&&ch<=102){return(ch&15)+9}return-1}Lexer.prototype={nextChar:function Lexer_nextChar(){return this.currentChar=this.stream.getByte()},peekChar:function Lexer_peekChar(){return this.stream.peekByte()},getNumber:function Lexer_getNumber(){var ch=this.currentChar;var eNotation=false;var divideBy=0;var sign=1;if(ch===45){sign=-1;ch=this.nextChar();if(ch===45){ch=this.nextChar()}}else if(ch===43){ch=this.nextChar()}if(ch===46){divideBy=10;ch=this.nextChar()}if(ch<48||ch>57){error("Invalid number: "+String.fromCharCode(ch));return 0}var baseValue=ch-48;var powerValue=0;var powerValueSign=1;while((ch=this.nextChar())>=0){if(48<=ch&&ch<=57){var currentDigit=ch-48;if(eNotation){powerValue=powerValue*10+currentDigit}else{if(divideBy!==0){divideBy*=10}baseValue=baseValue*10+currentDigit}}else if(ch===46){if(divideBy===0){divideBy=1}else{break}}else if(ch===45){warn("Badly formatted number")}else if(ch===69||ch===101){ch=this.peekChar();if(ch===43||ch===45){powerValueSign=ch===45?-1:1;this.nextChar()}else if(ch<48||ch>57){break}eNotation=true}else{break}}if(divideBy!==0){baseValue/=divideBy}if(eNotation){baseValue*=Math.pow(10,powerValueSign*powerValue)}return sign*baseValue},getString:function Lexer_getString(){var numParen=1;var done=false;var strBuf=this.strBuf;strBuf.length=0;var ch=this.nextChar();while(true){var charBuffered=false;switch(ch|0){case-1:warn("Unterminated string");done=true;break;case 40:++numParen;strBuf.push("(");break;case 41:if(--numParen===0){this.nextChar();done=true}else{strBuf.push(")")}break;case 92:ch=this.nextChar();switch(ch){case-1:warn("Unterminated string");done=true;break;case 110:strBuf.push("\n");break;case 114:strBuf.push("\r");break;case 116:strBuf.push(" ");break;case 98:strBuf.push("\b");break;case 102:strBuf.push("\f");break;case 92:case 40:case 41:strBuf.push(String.fromCharCode(ch));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:var x=ch&15;ch=this.nextChar();charBuffered=true;if(ch>=48&&ch<=55){x=(x<<3)+(ch&15);ch=this.nextChar();if(ch>=48&&ch<=55){charBuffered=false;x=(x<<3)+(ch&15)}}strBuf.push(String.fromCharCode(x));break;case 13:if(this.peekChar()===10){this.nextChar()}break;case 10:break;default:strBuf.push(String.fromCharCode(ch));break}break;default:strBuf.push(String.fromCharCode(ch));break}if(done){break}if(!charBuffered){ch=this.nextChar()}}return strBuf.join("")},getName:function Lexer_getName(){var ch,previousCh;var strBuf=this.strBuf;strBuf.length=0;while((ch=this.nextChar())>=0&&!specialChars[ch]){if(ch===35){ch=this.nextChar();if(specialChars[ch]){warn("Lexer_getName: "+"NUMBER SIGN (#) should be followed by a hexadecimal number.");strBuf.push("#");break}var x=toHexDigit(ch);if(x!==-1){previousCh=ch;ch=this.nextChar();var x2=toHexDigit(ch);if(x2===-1){warn("Lexer_getName: Illegal digit ("+String.fromCharCode(ch)+") in hexadecimal number.");strBuf.push("#",String.fromCharCode(previousCh));if(specialChars[ch]){break}strBuf.push(String.fromCharCode(ch));continue}strBuf.push(String.fromCharCode(x<<4|x2))}else{strBuf.push("#",String.fromCharCode(ch))}}else{strBuf.push(String.fromCharCode(ch))}}if(strBuf.length>127){warn("name token is longer than allowed by the spec: "+strBuf.length)}return Name.get(strBuf.join(""))},getHexString:function Lexer_getHexString(){var strBuf=this.strBuf;strBuf.length=0;var ch=this.currentChar;var isFirstHex=true;var firstDigit;var secondDigit;while(true){if(ch<0){warn("Unterminated hex string");break}else if(ch===62){this.nextChar();break}else if(specialChars[ch]===1){ch=this.nextChar();continue}else{if(isFirstHex){firstDigit=toHexDigit(ch);if(firstDigit===-1){warn('Ignoring invalid character "'+ch+'" in hex string');ch=this.nextChar();continue}}else{secondDigit=toHexDigit(ch);if(secondDigit===-1){warn('Ignoring invalid character "'+ch+'" in hex string');ch=this.nextChar();continue}strBuf.push(String.fromCharCode(firstDigit<<4|secondDigit))}isFirstHex=!isFirstHex;ch=this.nextChar()}}return strBuf.join("")},getObj:function Lexer_getObj(){var comment=false;var ch=this.currentChar;while(true){if(ch<0){return EOF}if(comment){if(ch===10||ch===13){comment=false}}else if(ch===37){comment=true}else if(specialChars[ch]!==1){break}ch=this.nextChar()}switch(ch|0){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return this.getNumber();case 40:return this.getString();case 47:return this.getName();case 91:this.nextChar();return Cmd.get("[");case 93:this.nextChar();return Cmd.get("]");case 60:ch=this.nextChar();if(ch===60){this.nextChar();return Cmd.get("<<")}return this.getHexString();case 62:ch=this.nextChar();if(ch===62){this.nextChar();return Cmd.get(">>")}return Cmd.get(">");case 123:this.nextChar();return Cmd.get("{");case 125:this.nextChar();return Cmd.get("}");case 41:error("Illegal character: "+ch);break}var str=String.fromCharCode(ch);var knownCommands=this.knownCommands;var knownCommandFound=knownCommands&&knownCommands[str]!==undefined;while((ch=this.nextChar())>=0&&!specialChars[ch]){var possibleCommand=str+String.fromCharCode(ch);if(knownCommandFound&&knownCommands[possibleCommand]===undefined){break}if(str.length===128){error("Command token too long: "+str.length)}str=possibleCommand;knownCommandFound=knownCommands&&knownCommands[str]!==undefined}if(str==="true"){return true}if(str==="false"){return false}if(str==="null"){return null}return Cmd.get(str)},skipToNextLine:function Lexer_skipToNextLine(){var ch=this.currentChar;while(ch>=0){if(ch===13){ch=this.nextChar();if(ch===10){this.nextChar()}break}else if(ch===10){this.nextChar();break}ch=this.nextChar()}}};return Lexer}();var Linearization={create:function LinearizationCreate(stream){function getInt(name,allowZeroValue){var obj=linDict.get(name);if(isInt(obj)&&(allowZeroValue?obj>=0:obj>0)){return obj}throw new Error('The "'+name+'" parameter in the linearization '+"dictionary is invalid.")}function getHints(){var hints=linDict.get("H"),hintsLength,item;if(isArray(hints)&&((hintsLength=hints.length)===2||hintsLength===4)){for(var index=0;index0)){throw new Error("Hint ("+index+") in the linearization dictionary is invalid.")}}return hints}throw new Error("Hint array in the linearization dictionary is invalid.")}var parser=new Parser(new Lexer(stream),false,null);var obj1=parser.getObj();var obj2=parser.getObj();var obj3=parser.getObj();var linDict=parser.getObj();var obj,length;if(!(isInt(obj1)&&isInt(obj2)&&isCmd(obj3,"obj")&&isDict(linDict)&&isNum(obj=linDict.get("Linearized"))&&obj>0)){return null}else if((length=getInt("L"))!==stream.length){throw new Error('The "L" parameter in the linearization dictionary '+"does not equal the stream length.")}return{length:length,hints:getHints(),objectNumberFirst:getInt("O"),endFirst:getInt("E"),numPages:getInt("N"),mainXRefEntriesOffset:getInt("T"),pageFirst:linDict.has("P")?getInt("P",true):0}}};exports.EOF=EOF;exports.Lexer=Lexer;exports.Linearization=Linearization;exports.Parser=Parser;exports.isEOF=isEOF});(function(root,factory){{factory(root.pdfjsCoreType1Parser={},root.pdfjsSharedUtil,root.pdfjsCoreStream,root.pdfjsCoreEncodings)}})(this,function(exports,sharedUtil,coreStream,coreEncodings){var warn=sharedUtil.warn;var isSpace=sharedUtil.isSpace;var Stream=coreStream.Stream;var getEncoding=coreEncodings.getEncoding;var HINTING_ENABLED=false;var Type1CharString=function Type1CharStringClosure(){var COMMAND_MAP={hstem:[1],vstem:[3],vmoveto:[4],rlineto:[5],hlineto:[6],vlineto:[7],rrcurveto:[8],callsubr:[10],flex:[12,35],drop:[12,18],endchar:[14],rmoveto:[21],hmoveto:[22],vhcurveto:[30],hvcurveto:[31]};function Type1CharString(){this.width=0;this.lsb=0;this.flexing=false;this.output=[];this.stack=[]}Type1CharString.prototype={convert:function Type1CharString_convert(encoded,subrs,seacAnalysisEnabled){var count=encoded.length;var error=false;var wx,sbx,subrNumber;for(var i=0;istackLength){return true}var start=stackLength-howManyArgs;for(var i=start;i>8&255,value&255)}else{value=65536*value|0;this.output.push(255,value>>24&255,value>>16&255,value>>8&255,value&255)}}this.output.push.apply(this.output,command);if(keepStack){this.stack.splice(start,howManyArgs)}else{this.stack.length=0}return false}};return Type1CharString}();var Type1Parser=function Type1ParserClosure(){var EEXEC_ENCRYPT_KEY=55665;var CHAR_STRS_ENCRYPT_KEY=4330;function isHexDigit(code){return code>=48&&code<=57||code>=65&&code<=70||code>=97&&code<=102}function decrypt(data,key,discardNumber){if(discardNumber>=data.length){return new Uint8Array(0)}var r=key|0,c1=52845,c2=22719,i,j;for(i=0;i>8;r=(value+r)*c1+c2&(1<<16)-1}return decrypted}function decryptAscii(data,key,discardNumber){var r=key|0,c1=52845,c2=22719;var count=data.length,maybeLength=count>>>1;var decrypted=new Uint8Array(maybeLength);var i,j;for(i=0,j=0;i>8;r=(value+r)*c1+c2&(1<<16)-1}}return Array.prototype.slice.call(decrypted,discardNumber,j)}function isSpecial(c){return c===47||c===91||c===93||c===123||c===125||c===40||c===41}function Type1Parser(stream,encrypted,seacAnalysisEnabled){if(encrypted){var data=stream.getBytes();var isBinary=!(isHexDigit(data[0])&&isHexDigit(data[1])&&isHexDigit(data[2])&&isHexDigit(data[3]));stream=new Stream(isBinary?decrypt(data,EEXEC_ENCRYPT_KEY,4):decryptAscii(data,EEXEC_ENCRYPT_KEY,4))}this.seacAnalysisEnabled=!!seacAnalysisEnabled;this.stream=stream;this.nextChar()}Type1Parser.prototype={readNumberArray:function Type1Parser_readNumberArray(){this.getToken();var array=[];while(true){var token=this.getToken();if(token===null||token==="]"||token==="}"){break}array.push(parseFloat(token||0))}return array},readNumber:function Type1Parser_readNumber(){var token=this.getToken();return parseFloat(token||0)},readInt:function Type1Parser_readInt(){var token=this.getToken();return parseInt(token||0,10)|0},readBoolean:function Type1Parser_readBoolean(){var token=this.getToken();return token==="true"?1:0},nextChar:function Type1_nextChar(){return this.currentChar=this.stream.getByte()},getToken:function Type1Parser_getToken(){var comment=false;var ch=this.currentChar;while(true){if(ch===-1){return null}if(comment){if(ch===10||ch===13){comment=false}}else if(ch===37){comment=true}else if(!isSpace(ch)){break}ch=this.nextChar()}if(isSpecial(ch)){this.nextChar();return String.fromCharCode(ch)}var token="";do{token+=String.fromCharCode(ch);ch=this.nextChar()}while(ch>=0&&!isSpace(ch)&&!isSpecial(ch));return token},extractFontProgram:function Type1Parser_extractFontProgram(){var stream=this.stream;var subrs=[],charstrings=[];var privateData=Object.create(null);privateData["lenIV"]=4;var program={subrs:[],charstrings:[],properties:{privateData:privateData}};var token,length,data,lenIV,encoded;while((token=this.getToken())!==null){if(token!=="/"){continue}token=this.getToken();switch(token){case"CharStrings":this.getToken();this.getToken();this.getToken();this.getToken();while(true){token=this.getToken();if(token===null||token==="end"){break}if(token!=="/"){continue}var glyph=this.getToken();length=this.readInt();this.getToken();data=stream.makeSubStream(stream.pos,length);lenIV=program.properties.privateData["lenIV"];encoded=decrypt(data.getBytes(),CHAR_STRS_ENCRYPT_KEY,lenIV);stream.skip(length);this.nextChar();token=this.getToken();if(token==="noaccess"){this.getToken()}charstrings.push({glyph:glyph,encoded:encoded})}break;case"Subrs":var num=this.readInt();this.getToken();while((token=this.getToken())==="dup"){var index=this.readInt();length=this.readInt();this.getToken();data=stream.makeSubStream(stream.pos,length);lenIV=program.properties.privateData["lenIV"];encoded=decrypt(data.getBytes(),CHAR_STRS_ENCRYPT_KEY,lenIV);stream.skip(length);this.nextChar();token=this.getToken();if(token==="noaccess"){this.getToken()}subrs[index]=encoded}break;case"BlueValues":case"OtherBlues":case"FamilyBlues":case"FamilyOtherBlues":var blueArray=this.readNumberArray();if(blueArray.length>0&&blueArray.length%2===0&&HINTING_ENABLED){program.properties.privateData[token]=blueArray}break;case"StemSnapH":case"StemSnapV":program.properties.privateData[token]=this.readNumberArray();break;case"StdHW":case"StdVW":program.properties.privateData[token]=this.readNumberArray()[0];break;case"BlueShift":case"lenIV":case"BlueFuzz":case"BlueScale":case"LanguageGroup":case"ExpansionFactor":program.properties.privateData[token]=this.readNumber();break;case"ForceBold":program.properties.privateData[token]=this.readBoolean();break}}for(var i=0;i>>0;var codespaceRange=codespaceRanges[n];for(var k=0,kk=codespaceRange.length;k=low&&c<=high){out.charcode=c;out.length=n+1;return}}}out.charcode=0;out.length=1},get length(){return this._map.length},get isIdentityCMap(){if(!(this.name==="Identity-H"||this.name==="Identity-V")){return false}if(this._map.length!==65536){return false}for(var i=0;i<65536;i++){if(this._map[i]!==i){return false}}return true}};return CMap}();var IdentityCMap=function IdentityCMapClosure(){function IdentityCMap(vertical,n){CMap.call(this);this.vertical=vertical;this.addCodespaceRange(n,0,65535)}Util.inherit(IdentityCMap,CMap,{});IdentityCMap.prototype={addCodespaceRange:CMap.prototype.addCodespaceRange,mapCidRange:function(low,high,dstLow){error("should not call mapCidRange")},mapBfRange:function(low,high,dstLow){error("should not call mapBfRange")},mapBfRangeToArray:function(low,high,array){error("should not call mapBfRangeToArray")},mapOne:function(src,dst){error("should not call mapCidOne")},lookup:function(code){return isInt(code)&&code<=65535?code:undefined},contains:function(code){return isInt(code)&&code<=65535},forEach:function(callback){for(var i=0;i<=65535;i++){callback(i,i)}},charCodeOf:function(value){return isInt(value)&&value<=65535?value:-1},getMap:function(){var map=new Array(65536);for(var i=0;i<=65535;i++){map[i]=i}return map},readCharCode:CMap.prototype.readCharCode,get length(){return 65536},get isIdentityCMap(){error("should not access .isIdentityCMap")}};return IdentityCMap}();var BinaryCMapReader=function BinaryCMapReaderClosure(){function fetchBinaryData(url){return new Promise(function(resolve,reject){var request=new XMLHttpRequest;request.open("GET",url,true);request.responseType="arraybuffer";request.onreadystatechange=function(){if(request.readyState===XMLHttpRequest.DONE){if(!request.response||request.status!==200&&request.status!==0){reject(new Error("Unable to get binary cMap at: "+url))}else{resolve(new Uint8Array(request.response))}}};request.send(null)})}function hexToInt(a,size){var n=0;for(var i=0;i<=size;i++){n=n<<8|a[i]}return n>>>0}function hexToStr(a,size){if(size===1){return String.fromCharCode(a[0],a[1])}if(size===3){return String.fromCharCode(a[0],a[1],a[2],a[3])}return String.fromCharCode.apply(null,a.subarray(0,size+1))}function addHex(a,b,size){var c=0;for(var i=size;i>=0;i--){c+=a[i]+b[i];a[i]=c&255;c>>=8}}function incHex(a,size){var c=1;for(var i=size;i>=0&&c>0;i--){c+=a[i];a[i]=c&255;c>>=8}}var MAX_NUM_SIZE=16;var MAX_ENCODED_NUM_SIZE=19;function BinaryCMapStream(data){this.buffer=data;this.pos=0;this.end=data.length;this.tmpBuf=new Uint8Array(MAX_ENCODED_NUM_SIZE)}BinaryCMapStream.prototype={readByte:function(){if(this.pos>=this.end){return-1}return this.buffer[this.pos++]},readNumber:function(){var n=0;var last;do{var b=this.readByte();if(b<0){error("unexpected EOF in bcmap")}last=!(b&128);n=n<<7|b&127}while(!last);return n},readSigned:function(){var n=this.readNumber();return n&1?~(n>>>1):n>>>1},readHex:function(num,size){num.set(this.buffer.subarray(this.pos,this.pos+size+1));this.pos+=size+1},readHexNumber:function(num,size){var last;var stack=this.tmpBuf,sp=0;do{var b=this.readByte();if(b<0){error("unexpected EOF in bcmap")}last=!(b&128);stack[sp++]=b&127}while(!last);var i=size,buffer=0,bufferSize=0;while(i>=0){while(bufferSize<8&&stack.length>0){buffer=stack[--sp]<>=8;bufferSize-=8}},readHexSigned:function(num,size){this.readHexNumber(num,size);var sign=num[size]&1?255:0;var c=0;for(var i=0;i<=size;i++){c=(c&1)<<8|num[i];num[i]=c>>1^sign}},readString:function(){var len=this.readNumber();var s="";for(var i=0;i=0){var type=b>>5;if(type===7){switch(b&31){case 0:stream.readString();break;case 1:useCMap=stream.readString();break}continue}var sequence=!!(b&16);var dataSize=b&15;assert(dataSize+1<=MAX_NUM_SIZE);var ucs2DataSize=1;var subitemsCount=stream.readNumber();var i;switch(type){case 0:stream.readHex(start,dataSize);stream.readHexNumber(end,dataSize);addHex(end,start,dataSize);cMap.addCodespaceRange(dataSize+1,hexToInt(start,dataSize),hexToInt(end,dataSize));for(i=1;i>>0}function expectString(obj){if(!isString(obj)){error("Malformed CMap: expected string.")}}function expectInt(obj){if(!isInt(obj)){error("Malformed CMap: expected int.")}}function parseBfChar(cMap,lexer){while(true){var obj=lexer.getObj();if(isEOF(obj)){break}if(isCmd(obj,"endbfchar")){return}expectString(obj);var src=strToInt(obj);obj=lexer.getObj();expectString(obj);var dst=obj;cMap.mapOne(src,dst)}}function parseBfRange(cMap,lexer){while(true){var obj=lexer.getObj();if(isEOF(obj)){break}if(isCmd(obj,"endbfrange")){return}expectString(obj);var low=strToInt(obj);obj=lexer.getObj();expectString(obj);var high=strToInt(obj);obj=lexer.getObj();if(isInt(obj)||isString(obj)){var dstLow=isInt(obj)?String.fromCharCode(obj):obj;cMap.mapBfRange(low,high,dstLow)}else if(isCmd(obj,"[")){obj=lexer.getObj();var array=[];while(!isCmd(obj,"]")&&!isEOF(obj)){array.push(obj);obj=lexer.getObj()}cMap.mapBfRangeToArray(low,high,array)}else{break}}error("Invalid bf range.")}function parseCidChar(cMap,lexer){while(true){var obj=lexer.getObj();if(isEOF(obj)){break}if(isCmd(obj,"endcidchar")){return}expectString(obj);var src=strToInt(obj);obj=lexer.getObj();expectInt(obj);var dst=obj;cMap.mapOne(src,dst)}}function parseCidRange(cMap,lexer){while(true){var obj=lexer.getObj();if(isEOF(obj)){break}if(isCmd(obj,"endcidrange")){return}expectString(obj);var low=strToInt(obj);obj=lexer.getObj();expectString(obj);var high=strToInt(obj);obj=lexer.getObj();expectInt(obj);var dstLow=obj;cMap.mapCidRange(low,high,dstLow)}}function parseCodespaceRange(cMap,lexer){while(true){var obj=lexer.getObj();if(isEOF(obj)){break}if(isCmd(obj,"endcodespacerange")){return}if(!isString(obj)){break}var low=strToInt(obj);obj=lexer.getObj();if(!isString(obj)){break}var high=strToInt(obj);cMap.addCodespaceRange(obj.length,low,high)}error("Invalid codespace range.")}function parseWMode(cMap,lexer){var obj=lexer.getObj();if(isInt(obj)){cMap.vertical=!!obj}}function parseCMapName(cMap,lexer){var obj=lexer.getObj();if(isName(obj)&&isString(obj.name)){cMap.name=obj.name}}function parseCMap(cMap,lexer,builtInCMapParams,useCMap){var previous;var embededUseCMap;objLoop:while(true){try{var obj=lexer.getObj();if(isEOF(obj)){break}else if(isName(obj)){if(obj.name==="WMode"){parseWMode(cMap,lexer)}else if(obj.name==="CMapName"){parseCMapName(cMap,lexer)}previous=obj}else if(isCmd(obj)){switch(obj.cmd){case"endcmap":break objLoop;case"usecmap":if(isName(previous)){embededUseCMap=previous.name}break;case"begincodespacerange":parseCodespaceRange(cMap,lexer);break;case"beginbfchar":parseBfChar(cMap,lexer);break;case"begincidchar":parseCidChar(cMap,lexer);break;case"beginbfrange":parseBfRange(cMap,lexer);break;case"begincidrange":parseCidRange(cMap,lexer);break}}}catch(ex){if(ex instanceof MissingDataException){throw ex}warn("Invalid cMap data: "+ex);continue}}if(!useCMap&&embededUseCMap){useCMap=embededUseCMap}if(useCMap){return extendCMap(cMap,builtInCMapParams,useCMap)}return Promise.resolve(cMap)}function extendCMap(cMap,builtInCMapParams,useCMap){return createBuiltInCMap(useCMap,builtInCMapParams).then(function(newCMap){cMap.useCMap=newCMap;if(cMap.numCodespaceRanges===0){var useCodespaceRanges=cMap.useCMap.codespaceRanges;for(var i=0;i=this.firstChar&&v<=this.lastChar?v:-1},amend:function(map){error("Should not call amend()")}};return IdentityToUnicodeMap}();var OpenTypeFileBuilder=function OpenTypeFileBuilderClosure(){function writeInt16(dest,offset,num){dest[offset]=num>>8&255;dest[offset+1]=num&255}function writeInt32(dest,offset,num){dest[offset]=num>>24&255;dest[offset+1]=num>>16&255;dest[offset+2]=num>>8&255;dest[offset+3]=num&255}function writeData(dest,offset,data){var i,ii;if(data instanceof Uint8Array){dest.set(data,offset)}else if(typeof data==="string"){for(i=0,ii=data.length;imaxPower2){maxPower2<<=1;log2++}var searchRange=maxPower2*entrySize;return{range:searchRange,entry:log2,rangeShift:entrySize*entriesCount-searchRange}};var OTF_HEADER_SIZE=12;var OTF_TABLE_ENTRY_SIZE=16;OpenTypeFileBuilder.prototype={toArray:function OpenTypeFileBuilder_toArray(){var sfnt=this.sfnt;var tables=this.tables;var tablesNames=Object.keys(tables);tablesNames.sort();var numTables=tablesNames.length;var i,j,jj,table,tableName;var offset=OTF_HEADER_SIZE+numTables*OTF_TABLE_ENTRY_SIZE;var tableOffsets=[offset];for(i=0;i>>0;offset+=paddedLength;tableOffsets.push(offset)}var file=new Uint8Array(offset);for(i=0;i>>0}writeInt32(file,offset+4,checksum);writeInt32(file,offset+8,tableOffsets[i]);writeInt32(file,offset+12,tables[tableName].length);offset+=OTF_TABLE_ENTRY_SIZE}return file},addTable:function OpenTypeFileBuilder_addTable(tag,data){if(tag in this.tables){throw new Error("Table "+tag+" already exists")}this.tables[tag]=data}};return OpenTypeFileBuilder}();var ProblematicCharRanges=new Int32Array([0,32,127,161,173,174,1536,1920,2208,4256,6016,6144,7168,7248,8192,8208,8209,8210,8232,8240,8287,8304,9676,9677,12288,12289,43616,43648,65520,65536]);var Font=function FontClosure(){function Font(name,file,properties){var charCode,glyphName,unicode;this.name=name;this.loadedName=properties.loadedName;this.isType3Font=properties.isType3Font;this.sizes=[];this.missingFile=false;this.glyphCache=Object.create(null);var names=name.split("+");names=names.length>1?names[1]:names[0];names=names.split(/[-,_]/g)[0];this.isSerifFont=!!(properties.flags&FontFlags.Serif);this.isSymbolicFont=!!(properties.flags&FontFlags.Symbolic);this.isMonospace=!!(properties.flags&FontFlags.FixedPitch);var type=properties.type;var subtype=properties.subtype;this.type=type;this.fallbackName=this.isMonospace?"monospace":this.isSerifFont?"serif":"sans-serif";this.differences=properties.differences;this.widths=properties.widths;this.defaultWidth=properties.defaultWidth;this.composite=properties.composite;this.wideChars=properties.wideChars;this.cMap=properties.cMap;this.ascent=properties.ascent/PDF_GLYPH_SPACE_UNITS;this.descent=properties.descent/PDF_GLYPH_SPACE_UNITS;this.fontMatrix=properties.fontMatrix;this.bbox=properties.bbox;this.toUnicode=properties.toUnicode;this.toFontChar=[];if(properties.type==="Type3"){for(charCode=0;charCode<256;charCode++){this.toFontChar[charCode]=this.differences[charCode]||properties.defaultEncoding[charCode]}this.fontType=FontType.TYPE3;return}this.cidEncoding=properties.cidEncoding;this.vertical=properties.vertical;if(this.vertical){this.vmetrics=properties.vmetrics;this.defaultVMetrics=properties.defaultVMetrics}var glyphsUnicodeMap;if(!file||file.isEmpty){if(file){warn('Font file is empty in "'+name+'" ('+this.loadedName+")")}this.missingFile=true;var fontName=name.replace(/[,_]/g,"-");var stdFontMap=getStdFontMap(),nonStdFontMap=getNonStdFontMap();var isStandardFont=!!stdFontMap[fontName]||!!(nonStdFontMap[fontName]&&stdFontMap[nonStdFontMap[fontName]]);fontName=stdFontMap[fontName]||nonStdFontMap[fontName]||fontName;this.bold=fontName.search(/bold/gi)!==-1;this.italic=fontName.search(/oblique/gi)!==-1||fontName.search(/italic/gi)!==-1;this.black=name.search(/Black/g)!==-1;this.remeasure=Object.keys(this.widths).length>0;if(isStandardFont&&type==="CIDFontType2"&&properties.cidEncoding.indexOf("Identity-")===0){var GlyphMapForStandardFonts=getGlyphMapForStandardFonts();var map=[];for(charCode in GlyphMapForStandardFonts){map[+charCode]=GlyphMapForStandardFonts[charCode]}if(/ArialBlack/i.test(name)){var SupplementalGlyphMapForArialBlack=getSupplementalGlyphMapForArialBlack();for(charCode in SupplementalGlyphMapForArialBlack){map[+charCode]=SupplementalGlyphMapForArialBlack[charCode]}}var isIdentityUnicode=this.toUnicode instanceof IdentityToUnicodeMap;if(!isIdentityUnicode){this.toUnicode.forEach(function(charCode,unicodeCharCode){map[+charCode]=unicodeCharCode})}this.toFontChar=map;this.toUnicode=new ToUnicodeMap(map)}else if(/Symbol/i.test(fontName)){this.toFontChar=buildToFontChar(SymbolSetEncoding,getGlyphsUnicode(),properties.differences)}else if(/Dingbats/i.test(fontName)){if(/Wingdings/i.test(name)){warn("Non-embedded Wingdings font, falling back to ZapfDingbats.")}this.toFontChar=buildToFontChar(ZapfDingbatsEncoding,getDingbatsGlyphsUnicode(),properties.differences)}else if(isStandardFont){this.toFontChar=buildToFontChar(properties.defaultEncoding,getGlyphsUnicode(),properties.differences)}else{glyphsUnicodeMap=getGlyphsUnicode();this.toUnicode.forEach(function(charCode,unicodeCharCode){if(!this.composite){glyphName=properties.differences[charCode]||properties.defaultEncoding[charCode];unicode=getUnicodeForGlyph(glyphName,glyphsUnicodeMap);if(unicode!==-1){unicodeCharCode=unicode}}this.toFontChar[charCode]=unicodeCharCode}.bind(this))}this.loadedName=fontName.split("-")[0];this.loading=false;this.fontType=getFontType(type,subtype);return}if(subtype==="Type1C"){if(type!=="Type1"&&type!=="MMType1"){if(isTrueTypeFile(file)){subtype="TrueType"}else{type="Type1"}}else if(isOpenTypeFile(file)){type=subtype="OpenType"}}if(subtype==="CIDFontType0C"&&type!=="CIDFontType0"){type="CIDFontType0"}if(subtype==="OpenType"){type="OpenType"}if(type==="CIDFontType0"){if(isType1File(file)){subtype="CIDFontType0"}else if(isOpenTypeFile(file)){type=subtype="OpenType"}else{subtype="CIDFontType0C"}}var data;switch(type){case"MMType1":info("MMType1 font ("+name+"), falling back to Type1.");case"Type1":case"CIDFontType0":this.mimetype="font/opentype";var cff=subtype==="Type1C"||subtype==="CIDFontType0C"?new CFFFont(file,properties):new Type1Font(name,file,properties);adjustWidths(properties);data=this.convert(name,cff,properties);break;case"OpenType":case"TrueType":case"CIDFontType2":this.mimetype="font/opentype";data=this.checkAndRepair(name,file,properties);if(this.isOpenType){adjustWidths(properties);type="OpenType"}break;default:error("Font "+type+" is not supported");break}this.data=data;this.fontType=getFontType(type,subtype);this.fontMatrix=properties.fontMatrix;this.widths=properties.widths;this.defaultWidth=properties.defaultWidth;this.toUnicode=properties.toUnicode;this.encoding=properties.baseEncoding;this.seacMap=properties.seacMap;this.loading=true}Font.getFontID=function(){var ID=1;return function Font_getFontID(){return String(ID++)}}();function int16(b0,b1){return(b0<<8)+b1}function signedInt16(b0,b1){var value=(b0<<8)+b1;return value&1<<15?value-65536:value}function int32(b0,b1,b2,b3){return(b0<<24)+(b1<<16)+(b2<<8)+b3}function string16(value){return String.fromCharCode(value>>8&255,value&255)}function safeString16(value){value=value>32767?32767:value<-32768?-32768:value;return String.fromCharCode(value>>8&255,value&255)}function isTrueTypeFile(file){var header=file.peekBytes(4);return readUint32(header,0)===65536}function isOpenTypeFile(file){var header=file.peekBytes(4);return bytesToString(header)==="OTTO"}function isType1File(file){var header=file.peekBytes(2);if(header[0]===37&&header[1]===33){return true}if(header[0]===128&&header[1]===1){return true}return false}function buildToFontChar(encoding,glyphsUnicodeMap,differences){var toFontChar=[],unicode;for(var i=0,ii=encoding.length;i>1;if(code=numGlyphs){continue}codes.push({fontCharCode:charCode|0,glyphId:glyphs[charCode]})}codes.sort(function fontGetRangesSort(a,b){return a.fontCharCode-b.fontCharCode});var ranges=[];var length=codes.length;for(var n=0;n65535?2:1;var cmap="\x00\x00"+string16(numTables)+"\x00"+"\x00"+string32(4+numTables*8);var i,ii,j,jj;for(i=ranges.length-1;i>=0;--i){if(ranges[i][0]<=65535){break}}var bmpLength=i+1;if(ranges[i][0]<65535&&ranges[i][1]===65535){ranges[i][1]=65534}var trailingRangesCount=ranges[i][1]<65535?1:0;var segCount=bmpLength+trailingRangesCount;var searchParams=OpenTypeFileBuilder.getSearchParams(segCount,2);var startCount="";var endCount="";var idDeltas="";var idRangeOffsets="";var glyphsIds="";var bias=0;var range,start,end,codes;for(i=0,ii=bmpLength;i0){endCount+="ÿÿ";startCount+="ÿÿ";idDeltas+="\x00";idRangeOffsets+="\x00\x00"}var format314="\x00\x00"+string16(2*segCount)+string16(searchParams.range)+string16(searchParams.entry)+string16(searchParams.rangeShift)+endCount+"\x00\x00"+startCount+idDeltas+idRangeOffsets+glyphsIds;var format31012="";var header31012="";if(numTables>1){cmap+="\x00"+"\x00\n"+string32(4+numTables*8+4+format314.length);format31012="";for(i=0,ii=ranges.length;ilastChar){return false}stream.getBytes(6);var usWinAscent=stream.getUint16();if(usWinAscent===0){return false}os2.data[8]=os2.data[9]=0;return true}function createOS2Table(properties,charstrings,override){override=override||{unitsPerEm:0,yMax:0,yMin:0,ascent:0,descent:0};var ulUnicodeRange1=0;var ulUnicodeRange2=0;var ulUnicodeRange3=0;var ulUnicodeRange4=0;var firstCharIndex=null;var lastCharIndex=0;if(charstrings){for(var code in charstrings){code|=0;if(firstCharIndex>code||!firstCharIndex){firstCharIndex=code}if(lastCharIndex 123 are reserved for internal usage")}}}else{firstCharIndex=0;lastCharIndex=255}var bbox=properties.bbox||[0,0,0,0];var unitsPerEm=override.unitsPerEm||1/(properties.fontMatrix||FONT_IDENTITY_MATRIX)[0];var scale=properties.ascentScaled?1:unitsPerEm/PDF_GLYPH_SPACE_UNITS;var typoAscent=override.ascent||Math.round(scale*(properties.ascent||bbox[3]));var typoDescent=override.descent||Math.round(scale*(properties.descent||bbox[1]));if(typoDescent>0&&properties.descent>0&&bbox[1]<0){typoDescent=-typoDescent}var winAscent=override.yMax||typoAscent;var winDescent=-override.yMin||-typoDescent;return"\x00"+"$"+"ô"+"\x00"+"\x00\x00"+"Š"+"»"+"\x00\x00"+"\x00Œ"+"Š"+"»"+"\x00\x00"+"ß"+"\x001"+""+"\x00\x00"+"\x00\x00"+String.fromCharCode(properties.fixedPitch?9:0)+"\x00\x00\x00\x00\x00\x00"+string32(ulUnicodeRange1)+string32(ulUnicodeRange2)+string32(ulUnicodeRange3)+string32(ulUnicodeRange4)+"*21*"+string16(properties.italicAngle?1:0)+string16(firstCharIndex||properties.firstChar)+string16(lastCharIndex||properties.lastChar)+string16(typoAscent)+string16(typoDescent)+"\x00d"+string16(winAscent)+string16(winDescent)+"\x00\x00\x00\x00"+"\x00\x00\x00\x00"+string16(properties.xHeight)+string16(properties.capHeight)+string16(0)+string16(firstCharIndex||properties.firstChar)+"\x00"}function createPostTable(properties){var angle=Math.floor(properties.italicAngle*Math.pow(2,16));return"\x00\x00\x00"+string32(angle)+"\x00\x00"+"\x00\x00"+string32(properties.fixedPitch)+"\x00\x00\x00\x00"+"\x00\x00\x00\x00"+"\x00\x00\x00\x00"+"\x00\x00\x00\x00"}function createNameTable(name,proto){if(!proto){proto=[[],[]]}var strings=[proto[0][0]||"Original licence",proto[0][1]||name,proto[0][2]||"Unknown",proto[0][3]||"uniqueID",proto[0][4]||name,proto[0][5]||"Version 0.11",proto[0][6]||"",proto[0][7]||"Unknown",proto[0][8]||"Unknown",proto[0][9]||"Unknown"];var stringsUnicode=[];var i,ii,j,jj,str;for(i=0,ii=strings.length;i>>0;var offset=file.getInt32()>>>0;var length=file.getInt32()>>>0;var previousPosition=file.pos;file.pos=file.start?file.start:0;file.skip(offset);var data=file.getBytes(length);file.pos=previousPosition;if(tag==="head"){data[8]=data[9]=data[10]=data[11]=0;data[17]|=32}return{tag:tag,checksum:checksum,length:length,offset:offset,data:data}}function readOpenTypeHeader(ttf){return{version:bytesToString(ttf.getBytes(4)),numTables:ttf.getUint16(),searchRange:ttf.getUint16(),entrySelector:ttf.getUint16(),rangeShift:ttf.getUint16()}}function readCmapTable(cmap,font,isSymbolicFont,hasEncoding){if(!cmap){warn("No cmap table available.");return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:false}}var segment;var start=(font.start?font.start:0)+cmap.offset;font.pos=start;var version=font.getUint16();var numTables=font.getUint16();var potentialTable;var canBreak=false;for(var i=0;i>>0;var useTable=false;if(platformId===0&&encodingId===0){useTable=true}else if(platformId===1&&encodingId===0){useTable=true}else if(platformId===3&&encodingId===1&&(!isSymbolicFont&&hasEncoding||!potentialTable)){useTable=true;if(!isSymbolicFont){canBreak=true}}else if(isSymbolicFont&&platformId===3&&encodingId===0){useTable=true;canBreak=true}if(useTable){potentialTable={platformId:platformId,encodingId:encodingId,offset:offset}}if(canBreak){break}}if(potentialTable){font.pos=start+potentialTable.offset}if(!potentialTable||font.peekByte()===-1){warn("Could not find a preferred cmap table.");return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:false}}var format=font.getUint16();var length=font.getUint16();var language=font.getUint16();var hasShortCmap=false;var mappings=[];var j,glyphId;if(format===0){for(j=0;j<256;j++){var index=font.getByte();if(!index){continue}mappings.push({charCode:j,glyphId:index})}hasShortCmap=true}else if(format===4){var segCount=font.getUint16()>>1;font.getBytes(6);var segIndex,segments=[];for(segIndex=0;segIndex>1)-(segCount-segIndex);segment.offsetIndex=offsetIndex;offsetsCount=Math.max(offsetsCount,offsetIndex+segment.end-segment.start+1)}var offsets=[];for(j=0;jnumGlyphs){info("The numOfMetrics ("+numOfMetrics+") should not be "+"greater than the numGlyphs ("+numGlyphs+")");numOfMetrics=numGlyphs;header.data[34]=(numOfMetrics&65280)>>8;header.data[35]=numOfMetrics&255}var numOfSidebearings=numGlyphs-numOfMetrics;var numMissing=numOfSidebearings-(metrics.length-numOfMetrics*4>>1);if(numMissing>0){var entries=new Uint8Array(metrics.length+numMissing*2);entries.set(metrics.data);metrics.data=entries}}function sanitizeGlyph(source,sourceStart,sourceEnd,dest,destStart,hintsValid){if(sourceEnd-sourceStart<=12){return 0}var glyf=source.subarray(sourceStart,sourceEnd);var contoursCount=glyf[0]<<8|glyf[1];if(contoursCount&32768){dest.set(glyf,destStart);return glyf.length}var i,j=10,flagsCount=0;for(i=0;iglyf.length){return 0}if(!hintsValid&&instructionsLength>0){dest.set(glyf.subarray(0,instructionsStart),destStart);dest.set([0,0],destStart+instructionsStart);dest.set(glyf.subarray(instructionsEnd,glyphDataLength),destStart+instructionsStart+2);glyphDataLength-=instructionsLength;if(glyf.length-glyphDataLength>3){glyphDataLength=glyphDataLength+3&~3}return glyphDataLength}if(glyf.length-glyphDataLength>3){glyphDataLength=glyphDataLength+3&~3;dest.set(glyf.subarray(0,glyphDataLength),destStart);return glyphDataLength}dest.set(glyf,destStart);return glyf.length}function sanitizeHead(head,numGlyphs,locaLength){var data=head.data;var version=int32(data[0],data[1],data[2],data[3]);if(version>>16!==1){info("Attempting to fix invalid version in head table: "+version);data[0]=0;data[1]=1;data[2]=0;data[3]=0}var indexToLocFormat=int16(data[50],data[51]);if(indexToLocFormat<0||indexToLocFormat>1){info("Attempting to fix invalid indexToLocFormat in head table: "+indexToLocFormat);var numGlyphsPlusOne=numGlyphs+1;if(locaLength===numGlyphsPlusOne<<1){data[50]=0;data[51]=0}else if(locaLength===numGlyphsPlusOne<<2){data[50]=0;data[51]=1}else{warn("Could not fix indexToLocFormat: "+indexToLocFormat)}}}function sanitizeGlyphLocations(loca,glyf,numGlyphs,isGlyphLocationsLong,hintsValid,dupFirstEntry){var itemSize,itemDecode,itemEncode;if(isGlyphLocationsLong){itemSize=4;itemDecode=function fontItemDecodeLong(data,offset){return data[offset]<<24|data[offset+1]<<16|data[offset+2]<<8|data[offset+3]};itemEncode=function fontItemEncodeLong(data,offset,value){data[offset]=value>>>24&255;data[offset+1]=value>>16&255;data[offset+2]=value>>8&255;data[offset+3]=value&255}}else{itemSize=2;itemDecode=function fontItemDecode(data,offset){return data[offset]<<9|data[offset+1]<<1};itemEncode=function fontItemEncode(data,offset,value){data[offset]=value>>9&255;data[offset+1]=value>>1&255}}var locaData=loca.data;var locaDataSize=itemSize*(1+numGlyphs);if(locaData.length!==locaDataSize){locaData=new Uint8Array(locaDataSize);locaData.set(loca.data.subarray(0,locaDataSize));loca.data=locaData}var oldGlyfData=glyf.data;var oldGlyfDataLength=oldGlyfData.length;var newGlyfData=new Uint8Array(oldGlyfDataLength);var startOffset=itemDecode(locaData,0);var writeOffset=0;var missingGlyphData=Object.create(null);itemEncode(locaData,0,writeOffset);var i,j;for(i=0,j=itemSize;ioldGlyfDataLength&&(oldGlyfDataLength+3&~3)===endOffset){endOffset=oldGlyfDataLength}if(endOffset>oldGlyfDataLength){itemEncode(locaData,j,writeOffset);startOffset=endOffset;continue}if(startOffset===endOffset){missingGlyphData[i]=true}var newLength=sanitizeGlyph(oldGlyfData,startOffset,endOffset,newGlyfData,writeOffset,hintsValid);writeOffset+=newLength;itemEncode(locaData,j,writeOffset);startOffset=endOffset}if(writeOffset===0){var simpleGlyph=new Uint8Array([0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,0]);for(i=0,j=itemSize;ifirstEntryLength+writeOffset){glyf.data=newGlyfData.subarray(0,firstEntryLength+writeOffset)}else{glyf.data=new Uint8Array(firstEntryLength+writeOffset);glyf.data.set(newGlyfData.subarray(0,writeOffset))}glyf.data.set(newGlyfData.subarray(0,firstEntryLength),writeOffset);itemEncode(loca.data,locaData.length-itemSize,writeOffset+firstEntryLength)}else{glyf.data=newGlyfData.subarray(0,writeOffset)}return missingGlyphData}function readPostScriptTable(post,properties,maxpNumGlyphs){var start=(font.start?font.start:0)+post.offset;font.pos=start;var length=post.length,end=start+length;var version=font.getInt32();font.getBytes(28);var glyphNames;var valid=true;var i;switch(version){case 65536:glyphNames=MacStandardGlyphOrdering;break;case 131072:var numGlyphs=font.getUint16();if(numGlyphs!==maxpNumGlyphs){valid=false;break}var glyphNameIndexes=[];for(i=0;i=32768){valid=false;break}glyphNameIndexes.push(index)}if(!valid){break}var customNames=[];var strBuf=[];while(font.posend){continue}font.pos=pos;var nameIndex=record.name;if(record.encoding){var str="";for(var j=0,jj=record.length;j0){i+=offset-1}}}if(!inFDEF&&!inELSE){var stackDelta=op<=142?TTOpsStackDeltas[op]:op>=192&&op<=223?-1:op>=224?-2:0;if(op>=113&&op<=117){n=stack.pop();if(n===n){stackDelta=-n*2}}while(stackDelta<0&&stack.length>0){stack.pop();stackDelta++}while(stackDelta>0){stack.push(NaN);stackDelta--}}}ttContext.tooComplexToFollowFunctions=tooComplexToFollowFunctions;var content=[data];if(i>data.length){content.push(new Uint8Array(i-data.length))}if(lastDeff>lastEndf){warn("TT: complementing a missing function tail");content.push(new Uint8Array([34,45]))}foldTTTable(table,content)}function checkInvalidFunctions(ttContext,maxFunctionDefs){if(ttContext.tooComplexToFollowFunctions){return}if(ttContext.functionsDefined.length>maxFunctionDefs){warn("TT: more functions defined than expected");ttContext.hintsValid=false;return}for(var j=0,jj=ttContext.functionsUsed.length;jmaxFunctionDefs){warn("TT: invalid function id: "+j);ttContext.hintsValid=false;return}if(ttContext.functionsUsed[j]&&!ttContext.functionsDefined[j]){warn("TT: undefined function: "+j);ttContext.hintsValid=false;return}}}function foldTTTable(table,content){if(content.length>1){var newLength=0;var j,jj;for(j=0,jj=content.length;j=65536&&tables["maxp"].length>=22){font.pos+=8;var maxZones=font.getUint16();if(maxZones>2){tables["maxp"].data[14]=0;tables["maxp"].data[15]=2}font.pos+=4;maxFunctionDefs=font.getUint16()}var dupFirstEntry=false;if(properties.type==="CIDFontType2"&&properties.toUnicode&&properties.toUnicode.get(0)>"\x00"){dupFirstEntry=true;numGlyphs++;tables["maxp"].data[4]=numGlyphs>>8;tables["maxp"].data[5]=numGlyphs&255}var hintsValid=sanitizeTTPrograms(tables["fpgm"],tables["prep"],tables["cvt "],maxFunctionDefs);if(!hintsValid){delete tables["fpgm"];delete tables["prep"];delete tables["cvt "]}sanitizeMetrics(font,tables["hhea"],tables["hmtx"],numGlyphs);if(!tables["head"]){error('Required "head" table is not found')}sanitizeHead(tables["head"],numGlyphs,isTrueType?tables["loca"].length:0);var missingGlyphs=Object.create(null);if(isTrueType){var isGlyphLocationsLong=int16(tables["head"].data[50],tables["head"].data[51]);missingGlyphs=sanitizeGlyphLocations(tables["loca"],tables["glyf"],numGlyphs,isGlyphLocationsLong,hintsValid,dupFirstEntry)}if(!tables["hhea"]){error('Required "hhea" table is not found')}if(tables["hhea"].data[10]===0&&tables["hhea"].data[11]===0){tables["hhea"].data[10]=255;tables["hhea"].data[11]=255}var metricsOverride={unitsPerEm:int16(tables["head"].data[18],tables["head"].data[19]),yMax:int16(tables["head"].data[42],tables["head"].data[43]),yMin:signedInt16(tables["head"].data[38],tables["head"].data[39]),ascent:int16(tables["hhea"].data[4],tables["hhea"].data[5]),descent:signedInt16(tables["hhea"].data[6],tables["hhea"].data[7])};this.ascent=metricsOverride.ascent/metricsOverride.unitsPerEm;this.descent=metricsOverride.descent/metricsOverride.unitsPerEm;if(tables["post"]){var valid=readPostScriptTable(tables["post"],properties,numGlyphs);if(!valid){tables["post"]=null}}var charCodeToGlyphId=[],charCode;var toUnicode=properties.toUnicode,widths=properties.widths;var skipToUnicode=toUnicode instanceof IdentityToUnicodeMap||toUnicode.length===65536;function hasGlyph(glyphId,charCode,widthCode){if(!missingGlyphs[glyphId]){return true}if(!skipToUnicode&&charCode>=0&&toUnicode.has(charCode)){return true}if(widths&&widthCode>=0&&isNum(widths[widthCode])){return true}return false}if(properties.type==="CIDFontType2"){var cidToGidMap=properties.cidToGidMap||[];var isCidToGidMapEmpty=cidToGidMap.length===0;properties.cMap.forEach(function(charCode,cid){assert(cid<=65535,"Max size of CID is 65,535");var glyphId=-1;if(isCidToGidMapEmpty){glyphId=cid}else if(cidToGidMap[cid]!==undefined){glyphId=cidToGidMap[cid]}if(glyphId>=0&&glyphId0&&hasGlyph(glyphId,-1,-1)){charCodeToGlyphId[charCode]=glyphId;found=true}}if(!found){charCodeToGlyphId[charCode]=0}}}else if(cmapPlatformId===0&&cmapEncodingId===0){for(i=0;i=0){charCodeToGlyphId[charCode]=glyphId}else{charCodeToGlyphId[charCode]=0}}}else if(!!(properties.flags&FontFlags.Symbolic)){for(charCode in builtInEncoding){charCodeToGlyphId[charCode]=builtInEncoding[charCode]}}else{baseEncoding=StandardEncoding;for(charCode=0;charCode=0){charCodeToGlyphId[charCode]=glyphId}else{charCodeToGlyphId[charCode]=0}}}var differences=properties.differences,glyphsUnicodeMap;if(differences){for(charCode in differences){var glyphName=differences[charCode];glyphId=glyphNames.indexOf(glyphName);if(glyphId===-1){if(!glyphsUnicodeMap){glyphsUnicodeMap=getGlyphsUnicode()}var standardGlyphName=recoverGlyphName(glyphName,glyphsUnicodeMap);if(standardGlyphName!==glyphName){glyphId=glyphNames.indexOf(standardGlyphName)}}if(glyphId>=0){charCodeToGlyphId[charCode]=glyphId}else{charCodeToGlyphId[charCode]=0}}}return charCodeToGlyphId}var Type1Font=function Type1FontClosure(){function findBlock(streamBytes,signature,startIndex){var streamBytesLength=streamBytes.length;var signatureLength=signature.length;var scanLength=streamBytesLength-signatureLength;var i=startIndex,j,found=false;while(i=signatureLength){i+=j;while(i=0){builtInEncoding[charCode]=glyphId}}}return type1FontGlyphMapping(properties,builtInEncoding,glyphNames)},getSeacs:function Type1Font_getSeacs(charstrings){var i,ii;var seacMap=[];for(i=0,ii=charstrings.length;i>8&255,index&255)}cff.charset=new CFFCharset(false,0,[],charsetArray);var charStringsIndex=new CFFIndex;charStringsIndex.add([139,14]);for(i=0;i0;j--){value[j]-=value[j-1]}}privateDict.setByName(field,value)}cff.topDict.privateDict=privateDict;var subrIndex=new CFFIndex;for(i=0,ii=subrs.length;i=0&&(ch>=65&&ch<=90||ch>=97&&ch<=122)){strBuf.push(String.fromCharCode(ch))}var str=strBuf.join("");switch(str.toLowerCase()){case"if":return PostScriptToken.IF;case"ifelse":return PostScriptToken.IFELSE;default:return PostScriptToken.getOperator(str)}},getNumber:function PostScriptLexer_getNumber(){var ch=this.currentChar;var strBuf=this.strBuf;strBuf.length=0;strBuf[0]=String.fromCharCode(ch);while((ch=this.nextChar())>=0){if(ch>=48&&ch<=57||ch===45||ch===46){strBuf.push(String.fromCharCode(ch))}else{break}}var value=parseFloat(strBuf.join(""));if(isNaN(value)){error("Invalid floating point number: "+value)}return value}};return PostScriptLexer}();exports.PostScriptLexer=PostScriptLexer;exports.PostScriptParser=PostScriptParser});(function(root,factory){{factory(root.pdfjsCoreFunction={},root.pdfjsSharedUtil,root.pdfjsCorePrimitives,root.pdfjsCorePsParser)}})(this,function(exports,sharedUtil,corePrimitives,corePsParser){var error=sharedUtil.error;var info=sharedUtil.info;var isArray=sharedUtil.isArray;var isBool=sharedUtil.isBool;var isDict=corePrimitives.isDict;var isStream=corePrimitives.isStream;var PostScriptLexer=corePsParser.PostScriptLexer;var PostScriptParser=corePsParser.PostScriptParser;var PDFFunction=function PDFFunctionClosure(){var CONSTRUCT_SAMPLED=0;var CONSTRUCT_INTERPOLATED=2;var CONSTRUCT_STICHED=3;var CONSTRUCT_POSTSCRIPT=4;return{getSampleArray:function PDFFunction_getSampleArray(size,outputSize,bps,str){var i,ii;var length=1;for(i=0,ii=size.length;i>codeSize)*sampleMul;codeBuf&=(1<max){v=max}else if(v0){dmin=bounds[i-1]}var dmax=domain[1];if(i>1;var numInputs=domain.length>>1;var evaluator=new PostScriptEvaluator(code);var cache=Object.create(null);var MAX_CACHE_SIZE=2048*4;var cache_available=MAX_CACHE_SIZE;var tmpBuf=new Float32Array(numInputs);return function constructPostScriptFromIRResult(src,srcOffset,dest,destOffset){var i,value;var key="";var input=tmpBuf;for(i=0;ibound){value=bound}}output[i]=value}if(cache_available>0){cache_available--;cache[key]=output}dest.set(output,destOffset)}}}}();function isPDFFunction(v){var fnDict;if(typeof v!=="object"){return false}else if(isDict(v)){fnDict=v}else if(isStream(v)){fnDict=v.dict}else{return false}return fnDict.has("FunctionType")}var PostScriptStack=function PostScriptStackClosure(){var MAX_STACK_SIZE=100;function PostScriptStack(initialStack){this.stack=!initialStack?[]:Array.prototype.slice.call(initialStack,0)}PostScriptStack.prototype={push:function PostScriptStack_push(value){if(this.stack.length>=MAX_STACK_SIZE){error("PostScript function stack overflow.")}this.stack.push(value)},pop:function PostScriptStack_pop(){if(this.stack.length<=0){error("PostScript function stack underflow.")}return this.stack.pop()},copy:function PostScriptStack_copy(n){if(this.stack.length+n>=MAX_STACK_SIZE){error("PostScript function stack overflow.")}var stack=this.stack;for(var i=stack.length-n,j=n-1;j>=0;j--,i++){stack.push(stack[i])}},index:function PostScriptStack_index(n){this.push(this.stack[this.stack.length-n-1])},roll:function PostScriptStack_roll(n,p){var stack=this.stack;var l=stack.length-n;var r=stack.length-1,c=l+(p-Math.floor(p/n)*n),i,j,t;for(i=l,j=r;i0){stack.push(a<>b)}break;case"ceiling":a=stack.pop();stack.push(Math.ceil(a));break;case"copy":a=stack.pop();stack.copy(a);break;case"cos":a=stack.pop();stack.push(Math.cos(a));break;case"cvi":a=stack.pop()|0;stack.push(a);break;case"cvr":break;case"div":b=stack.pop();a=stack.pop();stack.push(a/b);break;case"dup":stack.copy(1);break;case"eq":b=stack.pop();a=stack.pop();stack.push(a===b);break;case"exch":stack.roll(2,1);break;case"exp":b=stack.pop();a=stack.pop();stack.push(Math.pow(a,b));break;case"false":stack.push(false);break;case"floor":a=stack.pop();stack.push(Math.floor(a));break;case"ge":b=stack.pop();a=stack.pop();stack.push(a>=b);break;case"gt":b=stack.pop();a=stack.pop();stack.push(a>b);break;case"idiv":b=stack.pop();a=stack.pop();stack.push(a/b|0);break;case"index":a=stack.pop();stack.index(a);break;case"le":b=stack.pop();a=stack.pop();stack.push(a<=b);break;case"ln":a=stack.pop();stack.push(Math.log(a));break;case"log":a=stack.pop();stack.push(Math.log(a)/Math.LN10);break;case"lt":b=stack.pop();a=stack.pop();stack.push(a=max){return new AstLiteral(max)}else if(num1.max<=max){return num1}return new AstMin(num1,max)}function PostScriptCompiler(){}PostScriptCompiler.prototype={compile:function PostScriptCompiler_compile(code,domain,range){var stack=[];var i,ii;var instructions=[];var inputSize=domain.length>>1,outputSize=range.length>>1;var lastRegister=0;var n,j;var num1,num2,ast1,ast2,tmpVar,item;for(i=0;iexpr.min){out.unshift("Math.max(",min,", ");out.push(")")}if(maxnumComponentColors&&this.name!=="DeviceGray"&&this.name!=="DeviceRGB"){var allColors=bpc<=8?new Uint8Array(numComponentColors):new Uint16Array(numComponentColors);var key;for(i=0;i255?255:c;dest[destOffset]=dest[destOffset+1]=dest[destOffset+2]=c},getRgbBuffer:function DeviceGrayCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){var scale=255/((1<255?255:r;dest[destOffset+1]=g<0?0:g>255?255:g;dest[destOffset+2]=b<0?0:b>255?255:b},getRgbBuffer:function DeviceRgbCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){if(bits===8&&alpha01===0){dest.set(src.subarray(srcOffset,srcOffset+count*3),destOffset);return}var scale=255/((1<255?255:r<0?0:r;dest[destOffset+1]=g>255?255:g<0?0:g;dest[destOffset+2]=b>255?255:b<0?0:b}function DeviceCmykCS(){this.name="DeviceCMYK";this.numComps=4;this.defaultColor=new Float32Array([0,0,0,1])}DeviceCmykCS.prototype={getRgb:ColorSpace.prototype.getRgb,getRgbItem:function DeviceCmykCS_getRgbItem(src,srcOffset,dest,destOffset){convertToRgb(src,srcOffset,1,dest,destOffset)},getRgbBuffer:function DeviceCmykCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){var scale=1/((1<8){return Math.pow((L+16)/116,3)}return L*DECODE_L_CONSTANT}function compensateBlackPoint(sourceBlackPoint,XYZ_Flat,result){if(sourceBlackPoint[0]===0&&sourceBlackPoint[1]===0&&sourceBlackPoint[2]===0){result[0]=XYZ_Flat[0];result[1]=XYZ_Flat[1];result[2]=XYZ_Flat[2];return}var zeroDecodeL=decodeL(0);var X_DST=zeroDecodeL;var X_SRC=decodeL(sourceBlackPoint[0]);var Y_DST=zeroDecodeL;var Y_SRC=decodeL(sourceBlackPoint[1]);var Z_DST=zeroDecodeL;var Z_SRC=decodeL(sourceBlackPoint[2]);var X_Scale=(1-X_DST)/(1-X_SRC);var X_Offset=1-X_Scale;var Y_Scale=(1-Y_DST)/(1-Y_SRC);var Y_Offset=1-Y_Scale;var Z_Scale=(1-Z_DST)/(1-Z_SRC);var Z_Offset=1-Z_Scale;result[0]=XYZ_Flat[0]*X_Scale+X_Offset;result[1]=XYZ_Flat[1]*Y_Scale+Y_Offset;result[2]=XYZ_Flat[2]*Z_Scale+Z_Offset}function normalizeWhitePointToFlat(sourceWhitePoint,XYZ_In,result){if(sourceWhitePoint[0]===1&&sourceWhitePoint[2]===1){result[0]=XYZ_In[0];result[1]=XYZ_In[1];result[2]=XYZ_In[2];return}var LMS=result;matrixProduct(BRADFORD_SCALE_MATRIX,XYZ_In,LMS);var LMS_Flat=tempNormalizeMatrix;convertToFlat(sourceWhitePoint,LMS,LMS_Flat);matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX,LMS_Flat,result)}function normalizeWhitePointToD65(sourceWhitePoint,XYZ_In,result){var LMS=result;matrixProduct(BRADFORD_SCALE_MATRIX,XYZ_In,LMS);var LMS_D65=tempNormalizeMatrix;convertToD65(sourceWhitePoint,LMS,LMS_D65);matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX,LMS_D65,result)}function convertToRgb(cs,src,srcOffset,dest,destOffset,scale){var A=adjustToRange(0,1,src[srcOffset]*scale);var B=adjustToRange(0,1,src[srcOffset+1]*scale);var C=adjustToRange(0,1,src[srcOffset+2]*scale);var AGR=Math.pow(A,cs.GR);var BGG=Math.pow(B,cs.GG);var CGB=Math.pow(C,cs.GB);var X=cs.MXA*AGR+cs.MXB*BGG+cs.MXC*CGB;var Y=cs.MYA*AGR+cs.MYB*BGG+cs.MYC*CGB;var Z=cs.MZA*AGR+cs.MZB*BGG+cs.MZC*CGB;var XYZ=tempConvertMatrix1;XYZ[0]=X;XYZ[1]=Y;XYZ[2]=Z;var XYZ_Flat=tempConvertMatrix2;normalizeWhitePointToFlat(cs.whitePoint,XYZ,XYZ_Flat);var XYZ_Black=tempConvertMatrix1;compensateBlackPoint(cs.blackPoint,XYZ_Flat,XYZ_Black);var XYZ_D65=tempConvertMatrix2;normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX,XYZ_Black,XYZ_D65);var SRGB=tempConvertMatrix1;matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX,XYZ_D65,SRGB);var sR=sRGBTransferFunction(SRGB[0]);var sG=sRGBTransferFunction(SRGB[1]);var sB=sRGBTransferFunction(SRGB[2]);dest[destOffset]=Math.round(sR*255);dest[destOffset+1]=Math.round(sG*255);dest[destOffset+2]=Math.round(sB*255)}CalRGBCS.prototype={getRgb:function CalRGBCS_getRgb(src,srcOffset){var rgb=new Uint8Array(3);this.getRgbItem(src,srcOffset,rgb,0);return rgb},getRgbItem:function CalRGBCS_getRgbItem(src,srcOffset,dest,destOffset){convertToRgb(this,src,srcOffset,dest,destOffset,1)},getRgbBuffer:function CalRGBCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){var scale=1/((1<this.amax||this.bmin>this.bmax){info("Invalid Range, falling back to defaults");this.amin=-100;this.amax=100;this.bmin=-100;this.bmax=100}}function fn_g(x){if(x>=6/29){return x*x*x}else{return 108/841*(x-4/29)}}function decode(value,high1,low2,high2){return low2+value*(high2-low2)/high1}function convertToRgb(cs,src,srcOffset,maxVal,dest,destOffset){var Ls=src[srcOffset];var as=src[srcOffset+1];var bs=src[srcOffset+2];if(maxVal!==false){Ls=decode(Ls,maxVal,0,100);as=decode(as,maxVal,cs.amin,cs.amax);bs=decode(bs,maxVal,cs.bmin,cs.bmax)}as=as>cs.amax?cs.amax:ascs.bmax?cs.bmax:bs=1?255:Math.sqrt(r)*255|0;dest[destOffset+1]=g<=0?0:g>=1?255:Math.sqrt(g)*255|0;dest[destOffset+2]=b<=0?0:b>=1?255:Math.sqrt(b)*255|0}LabCS.prototype={getRgb:ColorSpace.prototype.getRgb,getRgbItem:function LabCS_getRgbItem(src,srcOffset,dest,destOffset){convertToRgb(this,src,srcOffset,false,dest,destOffset)},getRgbBuffer:function LabCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){var maxVal=(1<max?max:value}function resizeImageMask(src,bpc,w1,h1,w2,h2){var length=w2*h2;var dest=bpc<=8?new Uint8Array(length):bpc<=16?new Uint16Array(length):new Uint32Array(length);var xRatio=w1/w2;var yRatio=h1/h2;var i,j,py,newIndex=0,oldIndex;var xScaled=new Uint16Array(w2);var w1Scanline=w1;for(i=0;i>3)*height;var actualLength=imgArray.byteLength;var haveFullData=computedLength===actualLength;var data,i;if(imageIsFromDecodeStream&&(!inverseDecode||haveFullData)){data=imgArray}else if(!inverseDecode){data=new Uint8Array(actualLength);data.set(imgArray)}else{data=new Uint8Array(computedLength);data.set(imgArray);for(i=actualLength;i>7&1;output[i+1]=buf>>6&1;output[i+2]=buf>>5&1;output[i+3]=buf>>4&1;output[i+4]=buf>>3&1;output[i+5]=buf>>2&1;output[i+6]=buf>>1&1;output[i+7]=buf&1;i+=8}if(i>=1}}}}else{var bits=0;buf=0;for(i=0,ii=length;i>remainingBits;output[i]=value<0?0:value>max?max:value;buf=buf&(1<mask[maskOffset+1]){opacity=255;break}}alphaBuf[i]=opacity}}else{error("Unknown mask format.")}}if(alphaBuf){for(i=0,j=3,ii=width*actualHeight;i=255?255:r|0;buffer[i+1]=g<=0?0:g>=255?255:g|0;buffer[i+2]=b<=0?0:b>=255?255:b|0}},createImageData:function PDFImage_createImageData(forceRGBA){var drawWidth=this.drawWidth;var drawHeight=this.drawHeight;var imgData={width:drawWidth,height:drawHeight};var numComps=this.numComps;var originalWidth=this.width;var originalHeight=this.height;var bpc=this.bpc;var rowBytes=originalWidth*numComps*bpc+7>>3;var imgArray;if(!forceRGBA){var kind;if(this.colorSpace.name==="DeviceGray"&&bpc===1){kind=ImageKind.GRAYSCALE_1BPP}else if(this.colorSpace.name==="DeviceRGB"&&bpc===8&&!this.needsDecode){kind=ImageKind.RGB_24BPP}if(kind&&!this.smask&&!this.mask&&drawWidth===originalWidth&&drawHeight===originalHeight){imgData.kind=kind;imgArray=this.getImageBytes(originalHeight*rowBytes);if(this.image instanceof DecodeStream){imgData.data=imgArray}else{var newArray=new Uint8Array(imgArray.length);newArray.set(imgArray);imgData.data=newArray}if(this.needsDecode){assert(kind===ImageKind.GRAYSCALE_1BPP);var buffer=imgData.data;for(var i=0,ii=buffer.length;i>3;var imgArray=this.getImageBytes(height*rowBytes);var comps=this.getComponents(imgArray);var i,length;if(bpc===1){length=width*height;if(this.needsDecode){for(i=0;i0){var i=queue.shift();var outlineDict=xref.fetchIfRef(i.obj);if(outlineDict===null){continue}assert(outlineDict.has("Title"),"Invalid outline item");var actionDict=outlineDict.get("A"),dest=null,url=null;if(actionDict){var destEntry=actionDict.get("D");if(destEntry){dest=destEntry}else{var uriEntry=actionDict.get("URI");if(isString(uriEntry)&&isValidUrl(uriEntry,false)){url=uriEntry}}}else if(outlineDict.has("Dest")){dest=outlineDict.getRaw("Dest");if(isName(dest)){dest=dest.name}}var title=outlineDict.get("Title");var flags=outlineDict.get("F")||0;var color=outlineDict.getArray("C"),rgbColor=blackColor;if(isArray(color)&&color.length===3&&(color[0]!==0||color[1]!==0||color[2]!==0)){rgbColor=ColorSpace.singletons.rgb.getRgb(color,0)}var outlineItem={dest:dest,url:url,title:stringToPDFString(title),color:rgbColor,count:outlineDict.get("Count"),bold:!!(flags&2),italic:!!(flags&1),items:[]};i.parent.items.push(outlineItem);obj=outlineDict.getRaw("First");if(isRef(obj)&&!processed.has(obj)){queue.push({obj:obj,parent:outlineItem});processed.put(obj)}obj=outlineDict.getRaw("Next");if(isRef(obj)&&!processed.has(obj)){queue.push({obj:obj,parent:i.parent});processed.put(obj)}}return root.items.length>0?root.items:null},get numPages(){var obj=this.toplevelPagesDict.get("Count");assert(isInt(obj),"page count in top level pages object is not an integer");return shadow(this,"num",obj)},get destinations(){function fetchDestination(dest){return isDict(dest)?dest.get("D"):dest}var xref=this.xref;var dests={},nameTreeRef,nameDictionaryRef;var obj=this.catDict.get("Names");if(obj&&obj.has("Dests")){nameTreeRef=obj.getRaw("Dests")}else if(this.catDict.has("Dests")){nameDictionaryRef=this.catDict.get("Dests")}if(nameDictionaryRef){obj=nameDictionaryRef;obj.forEach(function catalogForEach(key,value){if(!value){return}dests[key]=fetchDestination(value)})}if(nameTreeRef){var nameTree=new NameTree(nameTreeRef,xref);var names=nameTree.getAll();for(var name in names){dests[name]=fetchDestination(names[name])}}return shadow(this,"destinations",dests)},getDestination:function Catalog_getDestination(destinationId){function fetchDestination(dest){return isDict(dest)?dest.get("D"):dest}var xref=this.xref;var dest=null,nameTreeRef,nameDictionaryRef;var obj=this.catDict.get("Names");if(obj&&obj.has("Dests")){nameTreeRef=obj.getRaw("Dests")}else if(this.catDict.has("Dests")){nameDictionaryRef=this.catDict.get("Dests")}if(nameDictionaryRef){var value=nameDictionaryRef.get(destinationId);if(value){dest=fetchDestination(value)}}if(nameTreeRef){var nameTree=new NameTree(nameTreeRef,xref);dest=fetchDestination(nameTree.get(destinationId))}return dest},get pageLabels(){var obj=null;try{obj=this.readPageLabels()}catch(ex){if(ex instanceof MissingDataException){throw ex}warn("Unable to read page labels.")}return shadow(this,"pageLabels",obj)},readPageLabels:function Catalog_readPageLabels(){var obj=this.catDict.getRaw("PageLabels");if(!obj){return null}var pageLabels=new Array(this.numPages);var style=null;var prefix="";var start=1;var numberTree=new NumberTree(obj,this.xref);var nums=numberTree.getAll();var currentLabel="",currentIndex=1;for(var i=0,ii=this.numPages;i=0;last--){nodesToVisit.push(kids[last])}}}capability.reject("Page index "+pageIndex+" not found.")}next();return capability.promise},getPageIndex:function Catalog_getPageIndex(pageRef){var xref=this.xref;function pagesBeforeRef(kidRef){var total=0;var parentRef;return xref.fetchAsync(kidRef).then(function(node){if(isRefsEqual(kidRef,pageRef)&&!isDict(node,"Page")&&!(isDict(node)&&!node.has("Type")&&node.has("Contents"))){throw new Error("The reference does not point to a /Page Dict.")}if(!node){return null}assert(isDict(node),"node must be a Dict.");parentRef=node.getRaw("Parent");return node.getAsync("Parent")}).then(function(parent){if(!parent){return null}assert(isDict(parent),"parent must be a Dict.");return parent.getAsync("Kids")}).then(function(kids){if(!kids){return null}var kidPromises=[];var found=false;for(var i=0;i0){var first=entryRanges[0];var n=entryRanges[1];if(!isInt(first)||!isInt(n)){error("Invalid XRef range fields: "+first+", "+n)}if(!isInt(typeFieldWidth)||!isInt(offsetFieldWidth)||!isInt(generationFieldWidth)){error("Invalid XRef entry fields length: "+first+", "+n)}for(i=streamState.entryNum;i=data.length){break}token+=String.fromCharCode(ch);ch=data[offset]}return token}function skipUntil(data,offset,what){var length=what.length,dataLength=data.length;var skipped=0;while(offset=length){break}offset++;skipped++}return skipped}var objRegExp=/^(\d+)\s+(\d+)\s+obj\b/;var trailerBytes=new Uint8Array([116,114,97,105,108,101,114]);var startxrefBytes=new Uint8Array([115,116,97,114,116,120,114,101,102]);var endobjBytes=new Uint8Array([101,110,100,111,98,106]);var xrefBytes=new Uint8Array([47,88,82,101,102]);this.entries.length=0;var stream=this.stream;stream.pos=0;var buffer=stream.getBytes();var position=stream.start,length=buffer.length;var trailers=[],xrefStms=[];while(position=length){break}ch=buffer[position]}while(ch!==LF&&ch!==CR);continue}var token=readToken(buffer,position);var m;if(token.indexOf("xref")===0&&(token.length===4||/\s/.test(token[4]))){position+=skipUntil(buffer,position,trailerBytes);trailers.push(position); -position+=skipUntil(buffer,position,startxrefBytes)}else if(m=objRegExp.exec(token)){if(typeof this.entries[m[1]]==="undefined"){this.entries[m[1]]={offset:position-stream.start,gen:m[2]|0,uncompressed:true}}var contentLength=skipUntil(buffer,position,endobjBytes)+7;var content=buffer.subarray(position,position+contentLength);var xrefTagOffset=skipUntil(content,0,xrefBytes);if(xrefTagOffset0){var i,n;var obj=xref.fetchIfRef(queue.shift());if(!isDict(obj)){continue}if(obj.has("Kids")){var kids=obj.get("Kids");for(i=0,n=kids.length;iMAX_LEVELS){warn('Search depth limit reached for "'+this._type+'" tree.');return null}var kids=kidsOrEntries.get("Kids");if(!isArray(kids)){return null}l=0;r=kids.length-1;while(l<=r){m=l+r>>1;var kid=xref.fetchIfRef(kids[m]);var limits=kid.get("Limits");if(keyxref.fetchIfRef(limits[1])){l=m+1}else{kidsOrEntries=xref.fetchIfRef(kids[m]);break}}if(l>r){return null}}var entries=kidsOrEntries.get(this._type);if(isArray(entries)){l=0;r=entries.length-2;while(l<=r){m=l+r&~1;var currentKey=xref.fetchIfRef(entries[m]);if(keycurrentKey){l=m+2}else{return xref.fetchIfRef(entries[m+1])}}}return null}};return NameOrNumberTree}();var NameTree=function NameTreeClosure(){function NameTree(root,xref){this.root=root;this.xref=xref;this._type="Names"}Util.inherit(NameTree,NameOrNumberTree,{});return NameTree}();var NumberTree=function NumberTreeClosure(){function NumberTree(root,xref){this.root=root;this.xref=xref;this._type="Nums"}Util.inherit(NumberTree,NameOrNumberTree,{});return NumberTree}();var FileSpec=function FileSpecClosure(){function FileSpec(root,xref){if(!root||!isDict(root)){return}this.xref=xref;this.root=root;if(root.has("FS")){this.fs=root.get("FS")}this.description=root.has("Desc")?stringToPDFString(root.get("Desc")):"";if(root.has("RF")){warn("Related file specifications are not supported")}this.contentAvailable=true;if(!root.has("EF")){this.contentAvailable=false;warn("Non-embedded file specifications are not supported")}}function pickPlatformItem(dict){if(dict.has("UF")){return dict.get("UF")}else if(dict.has("F")){return dict.get("F")}else if(dict.has("Unix")){return dict.get("Unix")}else if(dict.has("Mac")){return dict.get("Mac")}else if(dict.has("DOS")){return dict.get("DOS")}else{return null}}FileSpec.prototype={get filename(){if(!this._filename&&this.root){var filename=pickPlatformItem(this.root)||"unnamed";this._filename=stringToPDFString(filename).replace(/\\\\/g,"\\").replace(/\\\//g,"/").replace(/\\/g,"/")}return this._filename},get content(){if(!this.contentAvailable){return null}if(!this.contentRef&&this.root){this.contentRef=pickPlatformItem(this.root.get("EF"))}var content=null;if(this.contentRef){var xref=this.xref;var fileObj=xref.fetchIfRef(this.contentRef);if(fileObj&&isStream(fileObj)){content=fileObj.getBytes()}else{warn("Embedded file specification points to non-existing/invalid "+"content")}}else{warn("Embedded file specification does not have a content")}return content},get serializable(){return{filename:this.filename,content:this.content}}};return FileSpec}();var ObjectLoader=function(){function mayHaveChildren(value){return isRef(value)||isDict(value)||isArray(value)||isStream(value)}function addChildren(node,nodesToVisit){var value;if(isDict(node)||isStream(node)){var map;if(isDict(node)){map=node.map}else{map=node.dict.map}for(var key in map){value=map[key];if(mayHaveChildren(value)){nodesToVisit.push(value)}}}else if(isArray(node)){for(var i=0,ii=node.length;i=t1||step<=0){info("Bad shading domain.");return}var color=new Float32Array(cs.numComps),ratio=new Float32Array(1);var rgbColor;for(var i=t0;i<=t1;i+=step){ratio[0]=i;fn(ratio,0,color,0);rgbColor=cs.getRgb(color,0);var cssColor=Util.makeCssRgb(rgbColor[0],rgbColor[1],rgbColor[2]);colorStops.push([(i-t0)/diff,cssColor])}var background="transparent";if(dict.has("Background")){rgbColor=cs.getRgb(dict.get("Background"),0);background=Util.makeCssRgb(rgbColor[0],rgbColor[1],rgbColor[2])}if(!extendStart){colorStops.unshift([0,background]);colorStops[1][0]+=Shadings.SMALL_NUMBER}if(!extendEnd){colorStops[colorStops.length-1][0]-=Shadings.SMALL_NUMBER;colorStops.push([1,background])}this.colorStops=colorStops}RadialAxial.prototype={getIR:function RadialAxial_getIR(){var coordsArr=this.coordsArr;var shadingType=this.shadingType;var type,p0,p1,r0,r1;if(shadingType===ShadingType.AXIAL){p0=[coordsArr[0],coordsArr[1]];p1=[coordsArr[2],coordsArr[3]];r0=null;r1=null;type="axial"}else if(shadingType===ShadingType.RADIAL){p0=[coordsArr[0],coordsArr[1]];p1=[coordsArr[3],coordsArr[4]];r0=coordsArr[2];r1=coordsArr[5];type="radial"}else{error("getPattern type unknown: "+shadingType)}var matrix=this.matrix;if(matrix){p0=Util.applyTransform(p0,matrix);p1=Util.applyTransform(p1,matrix);if(shadingType===ShadingType.RADIAL){var scale=Util.singularValueDecompose2dScale(matrix);r0*=scale[0];r1*=scale[1]}}return["RadialAxial",type,this.colorStops,p0,p1,r0,r1]}};return RadialAxial}();Shadings.Mesh=function MeshClosure(){function MeshStreamReader(stream,context){this.stream=stream;this.context=context;this.buffer=0;this.bufferLength=0;var numComps=context.numComps;this.tmpCompsBuf=new Float32Array(numComps);var csNumComps=context.colorSpace.numComps;this.tmpCsCompsBuf=context.colorFn?new Float32Array(csNumComps):this.tmpCompsBuf}MeshStreamReader.prototype={get hasData(){if(this.stream.end){return this.stream.pos0){return true}var nextByte=this.stream.getByte();if(nextByte<0){return false}this.buffer=nextByte;this.bufferLength=8;return true},readBits:function MeshStreamReader_readBits(n){var buffer=this.buffer;var bufferLength=this.bufferLength;if(n===32){if(bufferLength===0){return(this.stream.getByte()<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte())>>>0}buffer=buffer<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte();var nextByte=this.stream.getByte();this.buffer=nextByte&(1<>bufferLength)>>>0}if(n===8&&bufferLength===0){return this.stream.getByte()}while(bufferLength>bufferLength},align:function MeshStreamReader_align(){this.buffer=0;this.bufferLength=0},readFlag:function MeshStreamReader_readFlag(){return this.readBits(this.context.bitsPerFlag)},readCoordinate:function MeshStreamReader_readCoordinate(){var bitsPerCoordinate=this.context.bitsPerCoordinate;var xi=this.readBits(bitsPerCoordinate);var yi=this.readBits(bitsPerCoordinate);var decode=this.context.decode;var scale=bitsPerCoordinate<32?1/((1<x?x:minX;minY=minY>y?y:minY;maxX=maxX=2,"Invalid VerticesPerRow");decodeType5Shading(this,reader,verticesPerRow);break;case ShadingType.COONS_PATCH_MESH:decodeType6Shading(this,reader);patchMesh=true;break;case ShadingType.TENSOR_PATCH_MESH:decodeType7Shading(this,reader);patchMesh=true;break;default:error("Unsupported mesh type.");break}if(patchMesh){updateBounds(this);for(var i=0,ii=this.figures.length;imaxImageSize){warn("Image exceeded maximum allowed size and was removed.");return}var imageMask=dict.get("ImageMask","IM")||false;var imgData,args;if(imageMask){var width=dict.get("Width","W");var height=dict.get("Height","H");var bitStrideLength=width+7>>3;var imgArray=image.getBytes(bitStrideLength*height);var decode=dict.getArray("Decode","D");var inverseDecode=!!decode&&decode[0]>0;imgData=PDFImage.createMask(imgArray,width,height,image instanceof DecodeStream,inverseDecode);imgData.cached=true;args=[imgData];operatorList.addOp(OPS.paintImageMaskXObject,args);if(cacheKey){imageCache[cacheKey]={fn:OPS.paintImageMaskXObject,args:args}}return}var softMask=dict.get("SMask","SM")||false;var mask=dict.get("Mask")||false;var SMALL_IMAGE_DIMENSIONS=200;if(inline&&!softMask&&!mask&&!(image instanceof JpegStream)&&w+h0){operatorList.addOp(OPS.setGState,[gStateObj])}})},loadFont:function PartialEvaluator_loadFont(fontName,font,xref,resources){function errorFont(){return Promise.resolve(new TranslatedFont("g_font_error",new ErrorFont("Font "+fontName+" is not available"),font))}var fontRef;if(font){assert(isRef(font));fontRef=font}else{var fontRes=resources.get("Font");if(fontRes){fontRef=fontRes.getRaw(fontName)}else{warn("fontRes not available");return errorFont()}}if(!fontRef){warn("fontRef not available");return errorFont()}if(this.fontCache.has(fontRef)){return this.fontCache.get(fontRef)}font=xref.fetchIfRef(fontRef);if(!isDict(font)){return errorFont()}if(font.translated){return font.translated}var fontCapability=createPromiseCapability();var preEvaluatedFont=this.preEvaluateFont(font,xref);var descriptor=preEvaluatedFont.descriptor;var fontRefIsRef=isRef(fontRef),fontID;if(fontRefIsRef){fontID=fontRef.toString()}if(isDict(descriptor)){if(!descriptor.fontAliases){descriptor.fontAliases=Object.create(null)}var fontAliases=descriptor.fontAliases;var hash=preEvaluatedFont.hash;if(fontAliases[hash]){var aliasFontRef=fontAliases[hash].aliasRef;if(fontRefIsRef&&aliasFontRef&&this.fontCache.has(aliasFontRef)){this.fontCache.putAlias(fontRef,aliasFontRef);return this.fontCache.get(fontRef)}}else{fontAliases[hash]={fontID:Font.getFontID()}}if(fontRefIsRef){fontAliases[hash].aliasRef=fontRef}fontID=fontAliases[hash].fontID}if(fontRefIsRef){this.fontCache.put(fontRef,fontCapability.promise)}else{if(!fontID){fontID=(this.uniquePrefix||"F_")+ ++this.idCounters.obj}this.fontCache.put("id_"+fontID,fontCapability.promise)}assert(fontID,'The "fontID" must be defined.');font.loadedName="g_"+this.pdfManager.docId+"_f"+fontID;font.translated=fontCapability.promise;var translatedPromise;try{translatedPromise=this.translateFont(preEvaluatedFont,xref)}catch(e){translatedPromise=Promise.reject(e)}var self=this;translatedPromise.then(function(translatedFont){if(translatedFont.fontType!==undefined){var xrefFontStats=xref.stats.fontTypes;xrefFontStats[translatedFont.fontType]=true}fontCapability.resolve(new TranslatedFont(font.loadedName,translatedFont,font))},function(reason){self.handler.send("UnsupportedFeature",{featureId:UNSUPPORTED_FEATURES.font});try{var descriptor=preEvaluatedFont.descriptor;var fontFile3=descriptor&&descriptor.get("FontFile3");var subtype=fontFile3&&fontFile3.get("Subtype");var fontType=getFontType(preEvaluatedFont.type,subtype&&subtype.name);var xrefFontStats=xref.stats.fontTypes;xrefFontStats[fontType]=true}catch(ex){}fontCapability.resolve(new TranslatedFont(font.loadedName,new ErrorFont(reason instanceof Error?reason.message:reason),font))});return fontCapability.promise},buildPath:function PartialEvaluator_buildPath(operatorList,fn,args){var lastIndex=operatorList.length-1;if(!args){args=[]}if(lastIndex<0||operatorList.fnArray[lastIndex]!==OPS.constructPath){operatorList.addOp(OPS.constructPath,[[fn],args])}else{var opArgs=operatorList.argsArray[lastIndex];opArgs[0].push(fn);Array.prototype.push.apply(opArgs[1],args)}},handleColorN:function PartialEvaluator_handleColorN(operatorList,fn,args,cs,patterns,resources,task,xref){var patternName=args[args.length-1];var pattern;if(isName(patternName)&&(pattern=patterns.get(patternName.name))){var dict=isStream(pattern)?pattern.dict:pattern;var typeNum=dict.get("PatternType");if(typeNum===TILING_PATTERN){var color=cs.base?cs.base.getRgb(args,0):null;return this.handleTilingType(fn,color,resources,pattern,dict,operatorList,task)}else if(typeNum===SHADING_PATTERN){var shading=dict.get("Shading");var matrix=dict.getArray("Matrix");pattern=Pattern.parseShading(shading,matrix,xref,resources,this.handler);operatorList.addOp(fn,pattern.getIR());return Promise.resolve()}else{return Promise.reject("Unknown PatternType: "+typeNum)}}operatorList.addOp(fn,args);return Promise.resolve()},getOperatorList:function PartialEvaluator_getOperatorList(stream,task,resources,operatorList,initialState){var self=this;var xref=this.xref;var imageCache=Object.create(null);assert(operatorList);resources=resources||Dict.empty;var xobjs=resources.get("XObject")||Dict.empty;var patterns=resources.get("Pattern")||Dict.empty;var stateManager=new StateManager(initialState||new EvalState);var preprocessor=new EvaluatorPreprocessor(stream,xref,stateManager);var timeSlotManager=new TimeSlotManager;return new Promise(function promiseBody(resolve,reject){var next=function(promise){promise.then(function(){try{promiseBody(resolve,reject)}catch(ex){reject(ex)}},reject)};task.ensureNotTerminated();timeSlotManager.reset();var stop,operation={},i,ii,cs;while(!(stop=timeSlotManager.check())){operation.args=null;if(!preprocessor.read(operation)){break}var args=operation.args;var fn=operation.fn;switch(fn|0){case OPS.paintXObject:if(args[0].code){break}var name=args[0].name;if(!name){warn("XObject must be referred to by name.");continue}if(imageCache[name]!==undefined){operatorList.addOp(imageCache[name].fn,imageCache[name].args);args=null;continue}var xobj=xobjs.get(name);if(xobj){assert(isStream(xobj),"XObject should be a stream");var type=xobj.dict.get("Subtype");assert(isName(type),"XObject should have a Name subtype");if(type.name==="Form"){stateManager.save();next(self.buildFormXObject(resources,xobj,null,operatorList,task,stateManager.state.clone()).then(function(){stateManager.restore()}));return}else if(type.name==="Image"){self.buildPaintImageXObject(resources,xobj,false,operatorList,name,imageCache);args=null;continue}else if(type.name==="PS"){info("Ignored XObject subtype PS");continue}else{error("Unhandled XObject subtype "+type.name)}}break;case OPS.setFont:var fontSize=args[1];next(self.handleSetFont(resources,args,null,operatorList,task,stateManager.state).then(function(loadedName){operatorList.addDependency(loadedName);operatorList.addOp(OPS.setFont,[loadedName,fontSize])}));return;case OPS.endInlineImage:var cacheKey=args[0].cacheKey;if(cacheKey){var cacheEntry=imageCache[cacheKey];if(cacheEntry!==undefined){operatorList.addOp(cacheEntry.fn,cacheEntry.args);args=null;continue}}self.buildPaintImageXObject(resources,args[0],true,operatorList,cacheKey,imageCache);args=null;continue;case OPS.showText:args[0]=self.handleText(args[0],stateManager.state);break;case OPS.showSpacedText:var arr=args[0];var combinedGlyphs=[];var arrLength=arr.length;var state=stateManager.state;for(i=0;i0){glyphHeight=glyphHeight*textState.fontMatrix[3];tsm[3]*=glyphHeight}}var trm=Util.transform(textState.ctm,Util.transform(textState.textMatrix,tsm));textContentItem.transform=trm;if(!font.vertical){textContentItem.width=0;textContentItem.height=Math.sqrt(trm[2]*trm[2]+trm[3]*trm[3]);textContentItem.vertical=false}else{textContentItem.width=Math.sqrt(trm[0]*trm[0]+trm[1]*trm[1]);textContentItem.height=0;textContentItem.vertical=true}var a=textState.textLineMatrix[0];var b=textState.textLineMatrix[1];var scaleLineX=Math.sqrt(a*a+b*b);a=textState.ctm[0];b=textState.ctm[1];var scaleCtmX=Math.sqrt(a*a+b*b);textContentItem.textAdvanceScale=scaleCtmX*scaleLineX;textContentItem.lastAdvanceWidth=0;textContentItem.lastAdvanceHeight=0;var spaceWidth=font.spaceWidth/1e3*textState.fontSize;if(spaceWidth){textContentItem.spaceWidth=spaceWidth;textContentItem.fakeSpaceMin=spaceWidth*SPACE_FACTOR;textContentItem.fakeMultiSpaceMin=spaceWidth*MULTI_SPACE_FACTOR;textContentItem.fakeMultiSpaceMax=spaceWidth*MULTI_SPACE_FACTOR_MAX;textContentItem.textRunBreakAllowed=!font.isMonospace}else{textContentItem.spaceWidth=0;textContentItem.fakeSpaceMin=Infinity;textContentItem.fakeMultiSpaceMin=Infinity;textContentItem.fakeMultiSpaceMax=0;textContentItem.textRunBreakAllowed=false}textContentItem.initialized=true;return textContentItem}function replaceWhitespace(str){var i=0,ii=str.length,code;while(i=32&&code<=127){i++}return i0){addFakeSpaces(wordSpacing,textChunk.str)}}var tx=0;var ty=0;if(!font.vertical){var w0=glyphWidth*textState.fontMatrix[0];tx=(w0*textState.fontSize+charSpacing)*textState.textHScale;width+=tx}else{var w1=glyphWidth*textState.fontMatrix[0];ty=w1*textState.fontSize+charSpacing;height+=ty}textState.translateTextMatrix(tx,ty);textChunk.str.push(glyphUnicode)}if(!font.vertical){textChunk.lastAdvanceWidth=width;textChunk.width+=width*textChunk.textAdvanceScale}else{textChunk.lastAdvanceHeight=height;textChunk.height+=Math.abs(height*textChunk.textAdvanceScale)}return textChunk}function addFakeSpaces(width,strBuf){if(width0){strBuf.push(" ")}}function flushTextContentItem(){if(!textContentItem.initialized){return}textContent.items.push(runBidiTransform(textContentItem));textContentItem.initialized=false;textContentItem.str.length=0}var timeSlotManager=new TimeSlotManager;return new Promise(function promiseBody(resolve,reject){var next=function(promise){promise.then(function(){try{promiseBody(resolve,reject)}catch(ex){reject(ex)}},reject)};task.ensureNotTerminated();timeSlotManager.reset();var stop,operation={},args=[];while(!(stop=timeSlotManager.check())){args.length=0;operation.args=args;if(!preprocessor.read(operation)){break}textState=stateManager.state;var fn=operation.fn;args=operation.args;var advance,diff;switch(fn|0){case OPS.setFont:var fontNameArg=args[0].name,fontSizeArg=args[1];if(textState.font&&fontNameArg===textState.fontName&&fontSizeArg===textState.fontSize){break}flushTextContentItem();textState.fontName=fontNameArg;textState.fontSize=fontSizeArg;next(handleSetFont(fontNameArg,null));return;case OPS.setTextRise:flushTextContentItem();textState.textRise=args[0];break;case OPS.setHScale:flushTextContentItem();textState.textHScale=args[0]/100;break;case OPS.setLeading:flushTextContentItem();textState.leading=args[0];break;case OPS.moveText:var isSameTextLine=!textState.font?false:(textState.font.vertical?args[0]:args[1])===0;advance=args[0]-args[1];if(combineTextItems&&isSameTextLine&&textContentItem.initialized&&advance>0&&advance<=textContentItem.fakeMultiSpaceMax){textState.translateTextLineMatrix(args[0],args[1]);textContentItem.width+=args[0]-textContentItem.lastAdvanceWidth;textContentItem.height+=args[1]-textContentItem.lastAdvanceHeight;diff=args[0]-textContentItem.lastAdvanceWidth-(args[1]-textContentItem.lastAdvanceHeight);addFakeSpaces(diff,textContentItem.str);break}flushTextContentItem();textState.translateTextLineMatrix(args[0],args[1]);textState.textMatrix=textState.textLineMatrix.slice();break;case OPS.setLeadingMoveText:flushTextContentItem();textState.leading=-args[1];textState.translateTextLineMatrix(args[0],args[1]);textState.textMatrix=textState.textLineMatrix.slice();break;case OPS.nextLine:flushTextContentItem();textState.carriageReturn();break;case OPS.setTextMatrix:advance=textState.calcTextLineMatrixAdvance(args[0],args[1],args[2],args[3],args[4],args[5]);if(combineTextItems&&advance!==null&&textContentItem.initialized&&advance.value>0&&advance.value<=textContentItem.fakeMultiSpaceMax){textState.translateTextLineMatrix(advance.width,advance.height);textContentItem.width+=advance.width-textContentItem.lastAdvanceWidth;textContentItem.height+=advance.height-textContentItem.lastAdvanceHeight;diff=advance.width-textContentItem.lastAdvanceWidth-(advance.height-textContentItem.lastAdvanceHeight);addFakeSpaces(diff,textContentItem.str);break}flushTextContentItem();textState.setTextMatrix(args[0],args[1],args[2],args[3],args[4],args[5]);textState.setTextLineMatrix(args[0],args[1],args[2],args[3],args[4],args[5]);break;case OPS.setCharSpacing:textState.charSpacing=args[0];break;case OPS.setWordSpacing:textState.wordSpacing=args[0];break;case OPS.beginText:flushTextContentItem();textState.textMatrix=IDENTITY_MATRIX.slice();textState.textLineMatrix=IDENTITY_MATRIX.slice();break;case OPS.showSpacedText:var items=args[0];var offset;for(var j=0,jj=items.length;jtextContentItem.fakeMultiSpaceMax;if(!breakTextRun){textContentItem.height+=offset}}else{advance=-advance;offset=advance*(textState.textHScale*textState.textMatrix[0]+textState.textMatrix[1]);textState.translateTextMatrix(advance,0);breakTextRun=textContentItem.textRunBreakAllowed&&advance>textContentItem.fakeMultiSpaceMax;if(!breakTextRun){textContentItem.width+=offset}}if(breakTextRun){flushTextContentItem()}else if(advance>0){addFakeSpaces(advance,textContentItem.str)}}}break;case OPS.showText:buildTextContentItem(args[0]);break;case OPS.nextLineShowText:flushTextContentItem();textState.carriageReturn();buildTextContentItem(args[0]);break;case OPS.nextLineSetSpacingShowText:flushTextContentItem();textState.wordSpacing=args[0];textState.charSpacing=args[1];textState.carriageReturn();buildTextContentItem(args[2]);break;case OPS.paintXObject:flushTextContentItem(); -if(args[0].code){break}if(!xobjs){xobjs=resources.get("XObject")||Dict.empty}var name=args[0].name;if(xobjsCache.key===name){if(xobjsCache.texts){Util.appendToArray(textContent.items,xobjsCache.texts.items);Util.extendObj(textContent.styles,xobjsCache.texts.styles)}break}var xobj=xobjs.get(name);if(!xobj){break}assert(isStream(xobj),"XObject should be a stream");var type=xobj.dict.get("Subtype");assert(isName(type),"XObject should have a Name subtype");if("Form"!==type.name){xobjsCache.key=name;xobjsCache.texts=null;break}stateManager.save();var matrix=xobj.dict.getArray("Matrix");if(isArray(matrix)&&matrix.length===6){stateManager.transform(matrix)}next(self.getTextContent(xobj,task,xobj.dict.get("Resources")||resources,stateManager,normalizeWhitespace,combineTextItems).then(function(formTextContent){Util.appendToArray(textContent.items,formTextContent.items);Util.extendObj(textContent.styles,formTextContent.styles);stateManager.restore();xobjsCache.key=name;xobjsCache.texts=formTextContent}));return;case OPS.setGState:flushTextContentItem();var dictName=args[0];var extGState=resources.get("ExtGState");if(!isDict(extGState)||!isName(dictName)){break}var gState=extGState.get(dictName.name);if(!isDict(gState)){break}var gStateFont=gState.get("Font");if(gStateFont){textState.fontName=null;textState.fontSize=gStateFont[1];next(handleSetFont(null,gStateFont[0]));return}break}}if(stop){next(deferred);return}flushTextContentItem();resolve(textContent)})},extractDataStructures:function PartialEvaluator_extractDataStructures(dict,baseDict,xref,properties){var toUnicode=dict.get("ToUnicode")||baseDict.get("ToUnicode");var toUnicodePromise=toUnicode?this.readToUnicode(toUnicode):Promise.resolve(undefined);if(properties.composite){var cidSystemInfo=dict.get("CIDSystemInfo");if(isDict(cidSystemInfo)){properties.cidSystemInfo={registry:cidSystemInfo.get("Registry"),ordering:cidSystemInfo.get("Ordering"),supplement:cidSystemInfo.get("Supplement")}}var cidToGidMap=dict.get("CIDToGIDMap");if(isStream(cidToGidMap)){properties.cidToGidMap=this.readCidToGidMap(cidToGidMap)}}var differences=[];var baseEncodingName=null;var encoding;if(dict.has("Encoding")){encoding=dict.get("Encoding");if(isDict(encoding)){baseEncodingName=encoding.get("BaseEncoding");baseEncodingName=isName(baseEncodingName)?baseEncodingName.name:null;if(encoding.has("Differences")){var diffEncoding=encoding.get("Differences");var index=0;for(var j=0,jj=diffEncoding.length;j0;properties.dict=dict;return toUnicodePromise.then(function(toUnicode){properties.toUnicode=toUnicode;return this.buildToUnicode(properties)}.bind(this)).then(function(toUnicode){properties.toUnicode=toUnicode;return properties})},buildToUnicode:function PartialEvaluator_buildToUnicode(properties){properties.hasIncludedToUnicodeMap=!!properties.toUnicode&&properties.toUnicode.length>0;if(properties.hasIncludedToUnicodeMap){return Promise.resolve(properties.toUnicode)}var toUnicode,charcode,glyphName;if(!properties.composite){toUnicode=[];var encoding=properties.defaultEncoding.slice();var baseEncodingName=properties.baseEncodingName;var differences=properties.differences;for(charcode in differences){glyphName=differences[charcode];if(glyphName===".notdef"){continue}encoding[charcode]=glyphName}var glyphsUnicodeMap=getGlyphsUnicode();for(charcode in encoding){glyphName=encoding[charcode];if(glyphName===""){continue}else if(glyphsUnicodeMap[glyphName]===undefined){var code=0;switch(glyphName[0]){case"G":if(glyphName.length===3){code=parseInt(glyphName.substr(1),16)}break;case"g":if(glyphName.length===5){code=parseInt(glyphName.substr(1),16)}break;case"C":case"c":if(glyphName.length>=3){code=+glyphName.substr(1)}break;default:var unicode=getUnicodeForGlyph(glyphName,glyphsUnicodeMap);if(unicode!==-1){code=unicode}}if(code){if(baseEncodingName&&code===+charcode){var baseEncoding=getEncoding(baseEncodingName);if(baseEncoding&&(glyphName=baseEncoding[charcode])){toUnicode[charcode]=String.fromCharCode(glyphsUnicodeMap[glyphName]);continue}}toUnicode[charcode]=String.fromCharCode(code)}continue}toUnicode[charcode]=String.fromCharCode(glyphsUnicodeMap[glyphName])}return Promise.resolve(new ToUnicodeMap(toUnicode))}if(properties.composite&&(properties.cMap.builtInCMap&&!(properties.cMap instanceof IdentityCMap)||properties.cidSystemInfo.registry==="Adobe"&&(properties.cidSystemInfo.ordering==="GB1"||properties.cidSystemInfo.ordering==="CNS1"||properties.cidSystemInfo.ordering==="Japan1"||properties.cidSystemInfo.ordering==="Korea1"))){var registry=properties.cidSystemInfo.registry;var ordering=properties.cidSystemInfo.ordering;var ucs2CMapName=Name.get(registry+"-"+ordering+"-UCS2");return CMapFactory.create(ucs2CMapName,this.options.cMapOptions,null).then(function(ucs2CMap){var cMap=properties.cMap;toUnicode=[];cMap.forEach(function(charcode,cid){assert(cid<=65535,"Max size of CID is 65,535");var ucs2=ucs2CMap.lookup(cid);if(ucs2){toUnicode[charcode]=String.fromCharCode((ucs2.charCodeAt(0)<<8)+ucs2.charCodeAt(1))}});return new ToUnicodeMap(toUnicode)})}return Promise.resolve(new IdentityToUnicodeMap(properties.firstChar,properties.lastChar))},readToUnicode:function PartialEvaluator_readToUnicode(toUnicode){var cmapObj=toUnicode;if(isName(cmapObj)){return CMapFactory.create(cmapObj,this.options.cMapOptions,null).then(function(cmap){if(cmap instanceof IdentityCMap){return new IdentityToUnicodeMap(0,65535)}return new ToUnicodeMap(cmap.getMap())})}else if(isStream(cmapObj)){return CMapFactory.create(cmapObj,this.options.cMapOptions,null).then(function(cmap){if(cmap instanceof IdentityCMap){return new IdentityToUnicodeMap(0,65535)}var map=new Array(cmap.length);cmap.forEach(function(charCode,token){var str=[];for(var k=0;k>1;result[code]=glyphID}return result},extractWidths:function PartialEvaluator_extractWidths(dict,xref,descriptor,properties){var glyphsWidths=[];var defaultWidth=0;var glyphsVMetrics=[];var defaultVMetrics;var i,ii,j,jj,start,code,widths;if(properties.composite){defaultWidth=dict.get("DW")||1e3;widths=dict.get("W");if(widths){for(i=0,ii=widths.length;i=CHUNK_SIZE){this.flush()}else if(this.fnArray.length>=CHUNK_SIZE_ABOUT&&(fn===OPS.restore||fn===OPS.endText)){this.flush()}}},addDependency:function(dependency){if(dependency in this.dependencies){return}this.dependencies[dependency]=true;this.addOp(OPS.dependency,[dependency])},addDependencies:function(dependencies){for(var key in dependencies){this.addDependency(key)}},addOpList:function(opList){Util.extendObj(this.dependencies,opList.dependencies);for(var i=0,ii=opList.length;inumArgs){nonProcessedArgs.push(args.shift());argsLength--}while(argsLengthnumArgs){info("Command "+fn+": expected [0,"+numArgs+"] args, but received "+argsLength+" args")}this.preprocessCommand(fn,args);operation.fn=fn;operation.args=args;return true}else{if(isEOF(obj)){return false}if(obj!==null){if(!args){args=[]}args.push(obj);assert(args.length<=33,"Too many arguments")}}}},preprocessCommand:function EvaluatorPreprocessor_preprocessCommand(fn,args){switch(fn|0){case OPS.save:this.stateManager.save();break;case OPS.restore:this.stateManager.restore();break;case OPS.transform:this.stateManager.transform(args);break}}};return EvaluatorPreprocessor}();var QueueOptimizer=function QueueOptimizerClosure(){function addState(parentState,pattern,fn){var state=parentState;for(var i=0,ii=pattern.length-1;iMAX_WIDTH){maxX=Math.max(maxX,currentX);currentY+=maxLineHeight+2*IMAGE_PADDING;currentX=0;maxLineHeight=0}map.push({transform:transform,x:currentX,y:currentY,w:img.width,h:img.height});currentX+=img.width+2*IMAGE_PADDING;maxLineHeight=Math.max(maxLineHeight,img.height)}var imgWidth=Math.max(maxX,currentX)+IMAGE_PADDING;var imgHeight=currentY+maxLineHeight+IMAGE_PADDING;var imgData=new Uint8Array(imgWidth*imgHeight*4);var imgRowSize=imgWidth<<2;for(q=0;q=0){data[offset-4]=data[offset];data[offset-3]=data[offset+1];data[offset-2]=data[offset+2];data[offset-1]=data[offset+3];data[offset+rowSize]=data[offset+rowSize-4];data[offset+rowSize+1]=data[offset+rowSize-3];data[offset+rowSize+2]=data[offset+rowSize-2];data[offset+rowSize+3]=data[offset+rowSize-1];offset-=imgRowSize}}fnArray.splice(iFirstSave,count*4,OPS.paintInlineImageXObjectGroup);argsArray.splice(iFirstSave,count*4,[{width:imgWidth,height:imgHeight,kind:ImageKind.RGBA_32BPP,data:imgData},map]);return iFirstSave+1});addState(InitialState,[OPS.save,OPS.transform,OPS.paintImageMaskXObject,OPS.restore],function foundImageMaskGroup(context){var MIN_IMAGES_IN_MASKS_BLOCK=10;var MAX_IMAGES_IN_MASKS_BLOCK=100;var MAX_SAME_IMAGES_IN_MASKS_BLOCK=1e3;var fnArray=context.fnArray,argsArray=context.argsArray;var curr=context.iCurr;var iFirstSave=curr-3;var iFirstTransform=curr-2;var iFirstPIMXO=curr-1;var i=iFirstSave+4;var ii=fnArray.length;while(i+3=4&&fnArray[iFirstBeginText-4]===fnArray[iFirstSetFont]&&fnArray[iFirstBeginText-3]===fnArray[iFirstSetTextMatrix]&&fnArray[iFirstBeginText-2]===fnArray[iFirstShowText]&&fnArray[iFirstBeginText-1]===fnArray[iFirstEndText]&&argsArray[iFirstBeginText-4][0]===firstSetFontArg0&&argsArray[iFirstBeginText-4][1]===firstSetFontArg1){count++;iFirst-=5}var iEndText=iFirst+4;for(var q=1;q0?flags:0},hasFlag:function Annotation_hasFlag(flag){return this._hasFlag(this.flags,flag)},setRectangle:function Annotation_setRectangle(rectangle){if(isArray(rectangle)&&rectangle.length===4){this.rectangle=Util.normalizeRect(rectangle)}else{this.rectangle=[0,0,0,0]}},setColor:function Annotation_setColor(color){var rgbColor=new Uint8Array(3);if(!isArray(color)){this.color=rgbColor;return}switch(color.length){case 0:this.color=null;break;case 1:ColorSpace.singletons.gray.getRgbItem(color,0,rgbColor,0);this.color=rgbColor;break;case 3:ColorSpace.singletons.rgb.getRgbItem(color,0,rgbColor,0);this.color=rgbColor;break;case 4:ColorSpace.singletons.cmyk.getRgbItem(color,0,rgbColor,0);this.color=rgbColor;break;default:this.color=rgbColor;break}},setBorderStyle:function Annotation_setBorderStyle(borderStyle){this.borderStyle=new AnnotationBorderStyle;if(!isDict(borderStyle)){return}if(borderStyle.has("BS")){var dict=borderStyle.get("BS");var dictType=dict.get("Type");if(!dictType||isName(dictType,"Border")){this.borderStyle.setWidth(dict.get("W"));this.borderStyle.setStyle(dict.get("S"));this.borderStyle.setDashArray(dict.getArray("D"))}}else if(borderStyle.has("Border")){var array=borderStyle.getArray("Border");if(isArray(array)&&array.length>=3){this.borderStyle.setHorizontalCornerRadius(array[0]);this.borderStyle.setVerticalCornerRadius(array[1]);this.borderStyle.setWidth(array[2]);if(array.length===4){this.borderStyle.setDashArray(array[3])}}}else{this.borderStyle.setWidth(0)}},_preparePopup:function Annotation_preparePopup(dict){if(!dict.has("C")){this.data.color=null}this.data.hasPopup=dict.has("Popup");this.data.title=stringToPDFString(dict.get("T")||"");this.data.contents=stringToPDFString(dict.get("Contents")||"")},loadResources:function Annotation_loadResources(keys){return new Promise(function(resolve,reject){this.appearance.dict.getAsync("Resources").then(function(resources){if(!resources){resolve();return}var objectLoader=new ObjectLoader(resources.map,keys,resources.xref);objectLoader.load().then(function(){resolve(resources)},reject)},reject)}.bind(this))},getOperatorList:function Annotation_getOperatorList(evaluator,task,renderForms){if(!this.appearance){return Promise.resolve(new OperatorList)}var data=this.data;var appearanceDict=this.appearance.dict;var resourcesPromise=this.loadResources(["ExtGState","ColorSpace","Pattern","Shading","XObject","Font"]);var bbox=appearanceDict.getArray("BBox")||[0,0,1,1];var matrix=appearanceDict.getArray("Matrix")||[1,0,0,1,0,0];var transform=getTransformMatrix(data.rect,bbox,matrix);var self=this;return resourcesPromise.then(function(resources){var opList=new OperatorList;opList.addOp(OPS.beginAnnotation,[data.rect,transform,matrix]);return evaluator.getOperatorList(self.appearance,task,resources,opList).then(function(){opList.addOp(OPS.endAnnotation,[]);self.appearance.reset();return opList})})}};Annotation.appendToOperatorList=function Annotation_appendToOperatorList(annotations,opList,partialEvaluator,task,intent,renderForms){var annotationPromises=[];for(var i=0,n=annotations.length;i0){var isValid=true;var allZeros=true;for(var i=0,len=dashArray.length;i=0;if(!validNumber){isValid=false;break}else if(element>0){allZeros=false}}if(isValid&&!allZeros){this.dashArray=dashArray}else{this.width=0}}else if(dashArray){this.width=0}},setHorizontalCornerRadius:function AnnotationBorderStyle_setHorizontalCornerRadius(radius){if(radius===(radius|0)){this.horizontalCornerRadius=radius}},setVerticalCornerRadius:function AnnotationBorderStyle_setVerticalCornerRadius(radius){if(radius===(radius|0)){this.verticalCornerRadius=radius}}};return AnnotationBorderStyle}();var WidgetAnnotation=function WidgetAnnotationClosure(){function WidgetAnnotation(params){Annotation.call(this,params);var dict=params.dict;var data=this.data;data.annotationType=AnnotationType.WIDGET;data.fieldValue=stringToPDFString(Util.getInheritableProperty(dict,"V")||"");data.alternativeText=stringToPDFString(dict.get("TU")||"");data.defaultAppearance=Util.getInheritableProperty(dict,"DA")||"";var fieldType=Util.getInheritableProperty(dict,"FT");data.fieldType=isName(fieldType)?fieldType.name:null;this.fieldResources=Util.getInheritableProperty(dict,"DR")||Dict.empty;data.fieldFlags=Util.getInheritableProperty(dict,"Ff");if(!isInt(data.fieldFlags)||data.fieldFlags<0){data.fieldFlags=0}if(data.fieldType==="Sig"){this.setFlags(AnnotationFlag.HIDDEN)}var fieldName=[];var namedItem=dict;var ref=params.ref;while(namedItem){var parent=namedItem.get("Parent");var parentRef=namedItem.getRaw("Parent");var name=namedItem.get("T");if(name){fieldName.unshift(stringToPDFString(name))}else if(parent&&ref){var kids=parent.get("Kids");var j,jj;for(j=0,jj=kids.length;j2){alignment=null}this.data.textAlignment=alignment;var maximumLength=Util.getInheritableProperty(params.dict,"MaxLen");if(!isInt(maximumLength)||maximumLength<0){maximumLength=null}this.data.maxLen=maximumLength;this.data.readOnly=this.hasFieldFlag(AnnotationFieldFlag.READONLY);this.data.multiLine=this.hasFieldFlag(AnnotationFieldFlag.MULTILINE);this.data.comb=this.hasFieldFlag(AnnotationFieldFlag.COMB)&&!this.hasFieldFlag(AnnotationFieldFlag.MULTILINE)&&!this.hasFieldFlag(AnnotationFieldFlag.PASSWORD)&&!this.hasFieldFlag(AnnotationFieldFlag.FILESELECT)&&this.data.maxLen!==null}Util.inherit(TextWidgetAnnotation,WidgetAnnotation,{getOperatorList:function TextWidgetAnnotation_getOperatorList(evaluator,task,renderForms){var operatorList=new OperatorList;if(renderForms){return Promise.resolve(operatorList)}if(this.appearance){return Annotation.prototype.getOperatorList.call(this,evaluator,task,renderForms)}if(!this.data.defaultAppearance){return Promise.resolve(operatorList)}var stream=new Stream(stringToBytes(this.data.defaultAppearance));return evaluator.getOperatorList(stream,task,this.fieldResources,operatorList).then(function(){return operatorList})}});return TextWidgetAnnotation}();var TextAnnotation=function TextAnnotationClosure(){var DEFAULT_ICON_SIZE=22;function TextAnnotation(parameters){Annotation.call(this,parameters);this.data.annotationType=AnnotationType.TEXT;if(this.data.hasAppearance){this.data.name="NoIcon"}else{this.data.rect[1]=this.data.rect[3]-DEFAULT_ICON_SIZE;this.data.rect[2]=this.data.rect[0]+DEFAULT_ICON_SIZE;this.data.name=parameters.dict.has("Name")?parameters.dict.get("Name").name:"Note"}this._preparePopup(parameters.dict)}Util.inherit(TextAnnotation,Annotation,{});return TextAnnotation}();var LinkAnnotation=function LinkAnnotationClosure(){function LinkAnnotation(params){Annotation.call(this,params);var dict=params.dict;var data=this.data;data.annotationType=AnnotationType.LINK;var action=dict.get("A"),url,dest;if(action&&isDict(action)){var linkType=action.get("S").name;switch(linkType){case"URI":url=action.get("URI");if(isName(url)){url="/"+url.name}else if(url){url=addDefaultProtocolToUrl(url)}break;case"GoTo":dest=action.get("D");break;case"GoToR":var urlDict=action.get("F");if(isDict(urlDict)){url=urlDict.get("F")||null}else if(isString(urlDict)){url=urlDict}var remoteDest=action.get("D");if(remoteDest){if(isName(remoteDest)){remoteDest=remoteDest.name}if(isString(url)){var baseUrl=url.split("#")[0];if(isString(remoteDest)){url=baseUrl+"#"+(/^\d+$/.test(remoteDest)?"nameddest=":"")+remoteDest}else if(isArray(remoteDest)){url=baseUrl+"#"+JSON.stringify(remoteDest)}}}var newWindow=action.get("NewWindow");if(isBool(newWindow)){data.newWindow=newWindow}break;case"Named":data.action=action.get("N").name;break;default:warn("unrecognized link type: "+linkType)}}else if(dict.has("Dest")){dest=dict.get("Dest")}if(url){if(isValidUrl(url,false)){data.url=tryConvertUrlEncoding(url)}}if(dest){data.dest=isName(dest)?dest.name:dest}}function addDefaultProtocolToUrl(url){if(isString(url)&&url.indexOf("www.")===0){return"http://"+url}return url}function tryConvertUrlEncoding(url){try{return stringToUTF8String(url)}catch(e){return url}}Util.inherit(LinkAnnotation,Annotation,{});return LinkAnnotation}();var PopupAnnotation=function PopupAnnotationClosure(){function PopupAnnotation(parameters){Annotation.call(this,parameters);this.data.annotationType=AnnotationType.POPUP;var dict=parameters.dict;var parentItem=dict.get("Parent");if(!parentItem){warn("Popup annotation has a missing or invalid parent annotation.");return}this.data.parentId=dict.getRaw("Parent").toString();this.data.title=stringToPDFString(parentItem.get("T")||"");this.data.contents=stringToPDFString(parentItem.get("Contents")||"");if(!parentItem.has("C")){this.data.color=null}else{this.setColor(parentItem.getArray("C"));this.data.color=this.color}if(!this.viewable){var parentFlags=parentItem.get("F");if(this._isViewable(parentFlags)){this.setFlags(parentFlags)}}}Util.inherit(PopupAnnotation,Annotation,{});return PopupAnnotation}();var HighlightAnnotation=function HighlightAnnotationClosure(){function HighlightAnnotation(parameters){Annotation.call(this,parameters);this.data.annotationType=AnnotationType.HIGHLIGHT;this._preparePopup(parameters.dict);this.data.borderStyle.setWidth(0)}Util.inherit(HighlightAnnotation,Annotation,{});return HighlightAnnotation}();var UnderlineAnnotation=function UnderlineAnnotationClosure(){function UnderlineAnnotation(parameters){Annotation.call(this,parameters);this.data.annotationType=AnnotationType.UNDERLINE;this._preparePopup(parameters.dict);this.data.borderStyle.setWidth(0)}Util.inherit(UnderlineAnnotation,Annotation,{});return UnderlineAnnotation}();var SquigglyAnnotation=function SquigglyAnnotationClosure(){function SquigglyAnnotation(parameters){Annotation.call(this,parameters);this.data.annotationType=AnnotationType.SQUIGGLY;this._preparePopup(parameters.dict);this.data.borderStyle.setWidth(0)}Util.inherit(SquigglyAnnotation,Annotation,{});return SquigglyAnnotation}();var StrikeOutAnnotation=function StrikeOutAnnotationClosure(){function StrikeOutAnnotation(parameters){Annotation.call(this,parameters);this.data.annotationType=AnnotationType.STRIKEOUT;this._preparePopup(parameters.dict);this.data.borderStyle.setWidth(0)}Util.inherit(StrikeOutAnnotation,Annotation,{});return StrikeOutAnnotation}();var FileAttachmentAnnotation=function FileAttachmentAnnotationClosure(){function FileAttachmentAnnotation(parameters){Annotation.call(this,parameters);var file=new FileSpec(parameters.dict.get("FS"),parameters.xref);this.data.annotationType=AnnotationType.FILEATTACHMENT;this.data.file=file.serializable;this._preparePopup(parameters.dict)}Util.inherit(FileAttachmentAnnotation,Annotation,{});return FileAttachmentAnnotation}();exports.Annotation=Annotation;exports.AnnotationBorderStyle=AnnotationBorderStyle;exports.AnnotationFactory=AnnotationFactory});(function(root,factory){{factory(root.pdfjsCoreDocument={},root.pdfjsSharedUtil,root.pdfjsCorePrimitives,root.pdfjsCoreStream,root.pdfjsCoreObj,root.pdfjsCoreParser,root.pdfjsCoreCrypto,root.pdfjsCoreEvaluator,root.pdfjsCoreAnnotation)}})(this,function(exports,sharedUtil,corePrimitives,coreStream,coreObj,coreParser,coreCrypto,coreEvaluator,coreAnnotation){var MissingDataException=sharedUtil.MissingDataException;var Util=sharedUtil.Util;var assert=sharedUtil.assert;var error=sharedUtil.error;var info=sharedUtil.info;var isArray=sharedUtil.isArray;var isArrayBuffer=sharedUtil.isArrayBuffer;var isString=sharedUtil.isString;var shadow=sharedUtil.shadow;var stringToBytes=sharedUtil.stringToBytes;var stringToPDFString=sharedUtil.stringToPDFString;var warn=sharedUtil.warn;var isSpace=sharedUtil.isSpace;var Dict=corePrimitives.Dict;var isDict=corePrimitives.isDict;var isName=corePrimitives.isName;var isStream=corePrimitives.isStream;var NullStream=coreStream.NullStream;var Stream=coreStream.Stream;var StreamsSequenceStream=coreStream.StreamsSequenceStream;var Catalog=coreObj.Catalog;var ObjectLoader=coreObj.ObjectLoader;var XRef=coreObj.XRef;var Linearization=coreParser.Linearization;var calculateMD5=coreCrypto.calculateMD5;var OperatorList=coreEvaluator.OperatorList;var PartialEvaluator=coreEvaluator.PartialEvaluator;var Annotation=coreAnnotation.Annotation;var AnnotationFactory=coreAnnotation.AnnotationFactory;var Page=function PageClosure(){var LETTER_SIZE_MEDIABOX=[0,0,612,792];function Page(pdfManager,xref,pageIndex,pageDict,ref,fontCache){this.pdfManager=pdfManager;this.pageIndex=pageIndex;this.pageDict=pageDict;this.xref=xref;this.ref=ref;this.fontCache=fontCache;this.uniquePrefix="p"+this.pageIndex+"_";this.idCounters={obj:0};this.evaluatorOptions=pdfManager.evaluatorOptions;this.resourcesPromise=null}Page.prototype={getPageProp:function Page_getPageProp(key){return this.pageDict.get(key)},getInheritedPageProp:function Page_getInheritedPageProp(key){var dict=this.pageDict,valueArray=null,loopCount=0;var MAX_LOOP_COUNT=100;while(dict){var value=dict.get(key);if(value){if(!valueArray){valueArray=[]}valueArray.push(value)}if(++loopCount>MAX_LOOP_COUNT){warn("Page_getInheritedPageProp: maximum loop count exceeded.");break}dict=dict.get("Parent")}if(!valueArray){return Dict.empty}if(valueArray.length===1||!isDict(valueArray[0])||loopCount>MAX_LOOP_COUNT){return valueArray[0]}return Dict.merge(this.xref,valueArray)},get content(){return this.getPageProp("Contents")},get resources(){return shadow(this,"resources",this.getInheritedPageProp("Resources"))},get mediaBox(){var obj=this.getInheritedPageProp("MediaBox");if(!isArray(obj)||obj.length!==4){obj=LETTER_SIZE_MEDIABOX}return shadow(this,"mediaBox",obj)},get view(){var mediaBox=this.mediaBox;var cropBox=this.getInheritedPageProp("CropBox");if(!isArray(cropBox)||cropBox.length!==4){return shadow(this,"view",mediaBox)}cropBox=Util.intersect(cropBox,mediaBox);if(!cropBox){return shadow(this,"view",mediaBox)}return shadow(this,"view",cropBox)},get rotate(){var rotate=this.getInheritedPageProp("Rotate")||0;if(rotate%90!==0){rotate=0}else if(rotate>=360){rotate=rotate%360}else if(rotate<0){rotate=(rotate%360+360)%360}return shadow(this,"rotate",rotate)},getContentStream:function Page_getContentStream(){var content=this.content;var stream;if(isArray(content)){var xref=this.xref;var i,n=content.length;var streams=[];for(i=0;i0,"stream must have data");this.pdfManager=pdfManager;this.stream=stream;var xref=new XRef(this.stream,password,pdfManager);this.xref=xref}function find(stream,needle,limit,backwards){var pos=stream.pos;var end=stream.end;var strBuf=[];if(pos+limit>end){limit=end-pos}for(var n=0;n0){pos-=step-"startxref".length;if(pos<0){pos=0}stream.pos=pos;found=find(stream,"startxref",step,true)}if(found){stream.skip(9);var ch;do{ch=stream.getByte()}while(isSpace(ch));var str="";while(ch>=32&&ch<=57){str+=String.fromCharCode(ch);ch=stream.getByte()}startXRef=parseInt(str,10);if(isNaN(startXRef)){startXRef=0}}}return shadow(this,"startXRef",startXRef)},get mainXRefEntriesOffset(){var mainXRefEntriesOffset=0;var linearization=this.linearization;if(linearization){mainXRefEntriesOffset=linearization.mainXRefEntriesOffset}return shadow(this,"mainXRefEntriesOffset",mainXRefEntriesOffset)},checkHeader:function PDFDocument_checkHeader(){var stream=this.stream;stream.reset();if(find(stream,"%PDF-",1024)){stream.moveStart();var MAX_VERSION_LENGTH=12;var version="",ch;while((ch=stream.getByte())>32){if(version.length>=MAX_VERSION_LENGTH){break}version+=String.fromCharCode(ch)}if(!this.pdfFormatVersion){this.pdfFormatVersion=version.substring(5)}return}},parseStartXRef:function PDFDocument_parseStartXRef(){var startXRef=this.startXRef; -this.xref.setStartXRef(startXRef)},setup:function PDFDocument_setup(recoveryMode){this.xref.parse(recoveryMode);var self=this;var pageFactory={createPage:function(pageIndex,dict,ref,fontCache){return new Page(self.pdfManager,self.xref,pageIndex,dict,ref,fontCache)}};this.catalog=new Catalog(this.pdfManager,this.xref,pageFactory)},get numPages(){var linearization=this.linearization;var num=linearization?linearization.numPages:this.catalog.numPages;return shadow(this,"numPages",num)},get documentInfo(){var docInfo={PDFFormatVersion:this.pdfFormatVersion,IsAcroFormPresent:!!this.acroForm,IsXFAPresent:!!this.xfa};var infoDict;try{infoDict=this.xref.trailer.get("Info")}catch(err){info("The document information dictionary is invalid.")}if(infoDict){var validEntries=DocumentInfoValidators.entries;for(var key in validEntries){if(infoDict.has(key)){var value=infoDict.get(key);if(validEntries[key](value)){docInfo[key]=typeof value!=="string"?value:stringToPDFString(value)}else{info('Bad value in document info for "'+key+'"')}}}}return shadow(this,"documentInfo",docInfo)},get fingerprint(){var xref=this.xref,hash,fileID="";var idArray=xref.trailer.get("ID");if(idArray&&isArray(idArray)&&idArray[0]&&isString(idArray[0])&&idArray[0]!==EMPTY_FINGERPRINT){hash=stringToBytes(idArray[0])}else{if(this.stream.ensureRange){this.stream.ensureRange(0,Math.min(FINGERPRINT_FIRST_BYTES,this.stream.end))}hash=calculateMD5(this.stream.bytes.subarray(0,FINGERPRINT_FIRST_BYTES),0,FINGERPRINT_FIRST_BYTES)}for(var i=0,n=hash.length;i0){this._queuedChunks.push(initialData)}this._msgHandler=msgHandler;this._isRangeSupported=!params.disableRange;this._isStreamingSupported=!params.disableStream;this._contentLength=params.length;this._fullRequestReader=null;this._rangeReaders=[];msgHandler.on("OnDataRange",this._onReceiveData.bind(this));msgHandler.on("OnDataProgress",this._onProgress.bind(this))}PDFWorkerStream.prototype={_onReceiveData:function PDFWorkerStream_onReceiveData(args){if(args.begin===undefined){if(this._fullRequestReader){this._fullRequestReader._enqueue(args.chunk)}else{this._queuedChunks.push(args.chunk)}}else{var found=this._rangeReaders.some(function(rangeReader){if(rangeReader._begin!==args.begin){return false}rangeReader._enqueue(args.chunk);return true});assert(found)}},_onProgress:function PDFWorkerStream_onProgress(evt){if(this._rangeReaders.length>0){var firstReader=this._rangeReaders[0];if(firstReader.onProgress){firstReader.onProgress({loaded:evt.loaded})}}},_removeRangeReader:function PDFWorkerStream_removeRangeReader(reader){var i=this._rangeReaders.indexOf(reader);if(i>=0){this._rangeReaders.splice(i,1)}},getFullReader:function PDFWorkerStream_getFullReader(){assert(!this._fullRequestReader);var queuedChunks=this._queuedChunks;this._queuedChunks=null;return new PDFWorkerStreamReader(this,queuedChunks)},getRangeReader:function PDFWorkerStream_getRangeReader(begin,end){var reader=new PDFWorkerStreamRangeReader(this,begin,end);this._msgHandler.send("RequestDataRange",{begin:begin,end:end});this._rangeReaders.push(reader);return reader},cancelAllRequests:function PDFWorkerStream_cancelAllRequests(reason){if(this._fullRequestReader){this._fullRequestReader.cancel(reason)}var readers=this._rangeReaders.slice(0);readers.forEach(function(rangeReader){rangeReader.cancel(reason)})}};function PDFWorkerStreamReader(stream,queuedChunks){this._stream=stream;this._done=false;this._queuedChunks=queuedChunks||[];this._requests=[];this._headersReady=Promise.resolve();stream._fullRequestReader=this;this.onProgress=null}PDFWorkerStreamReader.prototype={_enqueue:function PDFWorkerStreamReader_enqueue(chunk){if(this._done){return}if(this._requests.length>0){var requestCapability=this._requests.shift();requestCapability.resolve({value:chunk,done:false});return}this._queuedChunks.push(chunk)},get headersReady(){return this._headersReady},get isRangeSupported(){return this._stream._isRangeSupported},get isStreamingSupported(){return this._stream._isStreamingSupported},get contentLength(){return this._stream._contentLength},read:function PDFWorkerStreamReader_read(){if(this._queuedChunks.length>0){var chunk=this._queuedChunks.shift();return Promise.resolve({value:chunk,done:false})}if(this._done){return Promise.resolve({value:undefined,done:true})}var requestCapability=createPromiseCapability();this._requests.push(requestCapability);return requestCapability.promise},cancel:function PDFWorkerStreamReader_cancel(reason){this._done=true;this._requests.forEach(function(requestCapability){requestCapability.resolve({value:undefined,done:true})});this._requests=[]}};function PDFWorkerStreamRangeReader(stream,begin,end){this._stream=stream;this._begin=begin;this._end=end;this._queuedChunk=null;this._requests=[];this._done=false;this.onProgress=null}PDFWorkerStreamRangeReader.prototype={_enqueue:function PDFWorkerStreamRangeReader_enqueue(chunk){if(this._done){return}if(this._requests.length===0){this._queuedChunk=chunk}else{var requestsCapability=this._requests.shift();requestsCapability.resolve({value:chunk,done:false});this._requests.forEach(function(requestCapability){requestCapability.resolve({value:undefined,done:true})});this._requests=[]}this._done=true;this._stream._removeRangeReader(this)},get isStreamingSupported(){return false},read:function PDFWorkerStreamRangeReader_read(){if(this._queuedChunk){return Promise.resolve({value:this._queuedChunk,done:false})}if(this._done){return Promise.resolve({value:undefined,done:true})}var requestCapability=createPromiseCapability();this._requests.push(requestCapability);return requestCapability.promise},cancel:function PDFWorkerStreamRangeReader_cancel(reason){this._done=true;this._requests.forEach(function(requestCapability){requestCapability.resolve({value:undefined,done:true})});this._requests=[];this._stream._removeRangeReader(this)}};return PDFWorkerStream}();var PDFNetworkStream;function setPDFNetworkStreamClass(cls){PDFNetworkStream=cls}var WorkerMessageHandler={setup:function wphSetup(handler,port){var testMessageProcessed=false;handler.on("test",function wphSetupTest(data){if(testMessageProcessed){return}testMessageProcessed=true;if(!(data instanceof Uint8Array)){handler.send("test","main",false);return}var supportTransfers=data[0]===255;handler.postMessageTransfers=supportTransfers;var xhr=new XMLHttpRequest;var responseExists="response"in xhr;try{var dummy=xhr.responseType}catch(e){responseExists=false}if(!responseExists){handler.send("test",false);return}handler.send("test",{supportTypedArray:true,supportTransfers:supportTransfers})});handler.on("configure",function wphConfigure(data){setVerbosityLevel(data.verbosity)});handler.on("GetDocRequest",function wphSetupDoc(data){return WorkerMessageHandler.createDocumentHandler(data,port)})},createDocumentHandler:function wphCreateDocumentHandler(docParams,port){var pdfManager;var terminated=false;var cancelXHRs=null;var WorkerTasks=[];var docId=docParams.docId;var workerHandlerName=docParams.docId+"_worker";var handler=new MessageHandler(workerHandlerName,docId,port);handler.postMessageTransfers=docParams.postMessageTransfers;function ensureNotTerminated(){if(terminated){throw new Error("Worker was terminated")}}function startWorkerTask(task){WorkerTasks.push(task)}function finishWorkerTask(task){task.finish();var i=WorkerTasks.indexOf(task);WorkerTasks.splice(i,1)}function loadDocument(recoveryMode){var loadDocumentCapability=createPromiseCapability();var parseSuccess=function parseSuccess(){var numPagesPromise=pdfManager.ensureDoc("numPages");var fingerprintPromise=pdfManager.ensureDoc("fingerprint");var encryptedPromise=pdfManager.ensureXRef("encrypt");Promise.all([numPagesPromise,fingerprintPromise,encryptedPromise]).then(function onDocReady(results){var doc={numPages:results[0],fingerprint:results[1],encrypted:!!results[2]};loadDocumentCapability.resolve(doc)},parseFailure)};var parseFailure=function parseFailure(e){loadDocumentCapability.reject(e)};pdfManager.ensureDoc("checkHeader",[]).then(function(){pdfManager.ensureDoc("parseStartXRef",[]).then(function(){pdfManager.ensureDoc("parse",[recoveryMode]).then(parseSuccess,parseFailure)},parseFailure)},parseFailure);return loadDocumentCapability.promise}function getPdfManager(data,evaluatorOptions){var pdfManagerCapability=createPromiseCapability();var pdfManager;var source=data.source;if(source.data){try{pdfManager=new LocalPdfManager(docId,source.data,source.password,evaluatorOptions);pdfManagerCapability.resolve(pdfManager)}catch(ex){pdfManagerCapability.reject(ex)}return pdfManagerCapability.promise}var pdfStream;try{if(source.chunkedViewerLoading){pdfStream=new PDFWorkerStream(source,handler)}else{assert(PDFNetworkStream,"pdfjs/core/network module is not loaded");pdfStream=new PDFNetworkStream(data)}}catch(ex){pdfManagerCapability.reject(ex);return pdfManagerCapability.promise}var fullRequest=pdfStream.getFullReader();fullRequest.headersReady.then(function(){if(!fullRequest.isStreamingSupported||!fullRequest.isRangeSupported){fullRequest.onProgress=function(evt){handler.send("DocProgress",{loaded:evt.loaded,total:evt.total})}}if(!fullRequest.isRangeSupported){return}var disableAutoFetch=source.disableAutoFetch||fullRequest.isStreamingSupported;pdfManager=new NetworkPdfManager(docId,pdfStream,{msgHandler:handler,url:source.url,password:source.password,length:fullRequest.contentLength,disableAutoFetch:disableAutoFetch,rangeChunkSize:source.rangeChunkSize},evaluatorOptions);pdfManagerCapability.resolve(pdfManager);cancelXHRs=null}).catch(function(reason){pdfManagerCapability.reject(reason);cancelXHRs=null});var cachedChunks=[],loaded=0;var flushChunks=function(){var pdfFile=arraysToBytes(cachedChunks);if(source.length&&pdfFile.length!==source.length){warn("reported HTTP length is different from actual")}try{pdfManager=new LocalPdfManager(docId,pdfFile,source.password,evaluatorOptions);pdfManagerCapability.resolve(pdfManager)}catch(ex){pdfManagerCapability.reject(ex)}cachedChunks=[]};var readPromise=new Promise(function(resolve,reject){var readChunk=function(chunk){try{ensureNotTerminated();if(chunk.done){if(!pdfManager){flushChunks()}cancelXHRs=null;return}var data=chunk.value;loaded+=arrayByteLength(data);if(!fullRequest.isStreamingSupported){handler.send("DocProgress",{loaded:loaded,total:Math.max(loaded,fullRequest.contentLength||0)})}if(pdfManager){pdfManager.sendProgressiveData(data)}else{cachedChunks.push(data)}fullRequest.read().then(readChunk,reject)}catch(e){reject(e)}};fullRequest.read().then(readChunk,reject)});readPromise.catch(function(e){pdfManagerCapability.reject(e);cancelXHRs=null});cancelXHRs=function(){pdfStream.cancelAllRequests("abort")};return pdfManagerCapability.promise}var setupDoc=function(data){var onSuccess=function(doc){ensureNotTerminated();handler.send("GetDoc",{pdfInfo:doc})};var onFailure=function(e){if(e instanceof PasswordException){if(e.code===PasswordResponses.NEED_PASSWORD){handler.send("NeedPassword",e)}else if(e.code===PasswordResponses.INCORRECT_PASSWORD){handler.send("IncorrectPassword",e)}}else if(e instanceof InvalidPDFException){handler.send("InvalidPDF",e)}else if(e instanceof MissingPDFException){handler.send("MissingPDF",e)}else if(e instanceof UnexpectedResponseException){handler.send("UnexpectedResponse",e)}else{handler.send("UnknownError",new UnknownErrorException(e.message,e.toString()))}};ensureNotTerminated();var cMapOptions={url:data.cMapUrl===undefined?null:data.cMapUrl,packed:data.cMapPacked===true};var evaluatorOptions={forceDataSchema:data.disableCreateObjectURL,maxImageSize:data.maxImageSize===undefined?-1:data.maxImageSize,disableFontFace:data.disableFontFace,cMapOptions:cMapOptions};getPdfManager(data,evaluatorOptions).then(function(newPdfManager){if(terminated){newPdfManager.terminate();throw new Error("Worker was terminated")}pdfManager=newPdfManager;handler.send("PDFManagerReady",null);pdfManager.onLoadedStream().then(function(stream){handler.send("DataLoaded",{length:stream.bytes.byteLength})})}).then(function pdfManagerReady(){ensureNotTerminated();loadDocument(false).then(onSuccess,function loadFailure(ex){ensureNotTerminated();if(!(ex instanceof XRefParseException)){if(ex instanceof PasswordException){pdfManager.passwordChanged().then(pdfManagerReady)}onFailure(ex);return}pdfManager.requestLoadedStream();pdfManager.onLoadedStream().then(function(){ensureNotTerminated();loadDocument(true).then(onSuccess,onFailure)})},onFailure)},onFailure)};handler.on("GetPage",function wphSetupGetPage(data){return pdfManager.getPage(data.pageIndex).then(function(page){var rotatePromise=pdfManager.ensure(page,"rotate");var refPromise=pdfManager.ensure(page,"ref");var viewPromise=pdfManager.ensure(page,"view");return Promise.all([rotatePromise,refPromise,viewPromise]).then(function(results){return{rotate:results[0],ref:results[1],view:results[2]}})})});handler.on("GetPageIndex",function wphSetupGetPageIndex(data){var ref=new Ref(data.ref.num,data.ref.gen);var catalog=pdfManager.pdfDocument.catalog;return catalog.getPageIndex(ref)});handler.on("GetDestinations",function wphSetupGetDestinations(data){return pdfManager.ensureCatalog("destinations")});handler.on("GetDestination",function wphSetupGetDestination(data){return pdfManager.ensureCatalog("getDestination",[data.id])});handler.on("GetPageLabels",function wphSetupGetPageLabels(data){return pdfManager.ensureCatalog("pageLabels")});handler.on("GetAttachments",function wphSetupGetAttachments(data){return pdfManager.ensureCatalog("attachments")});handler.on("GetJavaScript",function wphSetupGetJavaScript(data){return pdfManager.ensureCatalog("javaScript")});handler.on("GetOutline",function wphSetupGetOutline(data){return pdfManager.ensureCatalog("documentOutline")});handler.on("GetMetadata",function wphSetupGetMetadata(data){return Promise.all([pdfManager.ensureDoc("documentInfo"),pdfManager.ensureCatalog("metadata")])});handler.on("GetData",function wphSetupGetData(data){pdfManager.requestLoadedStream();return pdfManager.onLoadedStream().then(function(stream){return stream.bytes})});handler.on("GetStats",function wphSetupGetStats(data){return pdfManager.pdfDocument.xref.stats});handler.on("UpdatePassword",function wphSetupUpdatePassword(data){pdfManager.updatePassword(data)});handler.on("GetAnnotations",function wphSetupGetAnnotations(data){return pdfManager.getPage(data.pageIndex).then(function(page){return pdfManager.ensure(page,"getAnnotationsData",[data.intent])})});handler.on("RenderPageRequest",function wphSetupRenderPage(data){var pageIndex=data.pageIndex;pdfManager.getPage(pageIndex).then(function(page){var task=new WorkerTask("RenderPageRequest: page "+pageIndex);startWorkerTask(task);var pageNum=pageIndex+1;var start=Date.now();page.getOperatorList(handler,task,data.intent,data.renderInteractiveForms).then(function(operatorList){finishWorkerTask(task);info("page="+pageNum+" - getOperatorList: time="+(Date.now()-start)+"ms, len="+operatorList.totalLength)},function(e){finishWorkerTask(task);if(task.terminated){return}handler.send("UnsupportedFeature",{featureId:UNSUPPORTED_FEATURES.unknown});var minimumStackMessage="worker.js: while trying to getPage() and getOperatorList()";var wrappedException;if(typeof e==="string"){wrappedException={message:e,stack:minimumStackMessage}}else if(typeof e==="object"){wrappedException={message:e.message||e.toString(),stack:e.stack||minimumStackMessage}}else{wrappedException={message:"Unknown exception type: "+typeof e,stack:minimumStackMessage}}handler.send("PageError",{pageNum:pageNum,error:wrappedException,intent:data.intent})})})},this);handler.on("GetTextContent",function wphExtractText(data){var pageIndex=data.pageIndex;var normalizeWhitespace=data.normalizeWhitespace;var combineTextItems=data.combineTextItems;return pdfManager.getPage(pageIndex).then(function(page){var task=new WorkerTask("GetTextContent: page "+pageIndex);startWorkerTask(task);var pageNum=pageIndex+1;var start=Date.now();return page.extractTextContent(task,normalizeWhitespace,combineTextItems).then(function(textContent){finishWorkerTask(task);info("text indexing: page="+pageNum+" - time="+(Date.now()-start)+"ms");return textContent},function(reason){finishWorkerTask(task);if(task.terminated){return}throw reason})})});handler.on("Cleanup",function wphCleanup(data){return pdfManager.cleanup()});handler.on("Terminate",function wphTerminate(data){terminated=true;if(pdfManager){pdfManager.terminate();pdfManager=null}if(cancelXHRs){cancelXHRs()}var waitOn=[];WorkerTasks.forEach(function(task){waitOn.push(task.finished);task.terminate()});return Promise.all(waitOn).then(function(){handler.destroy();handler=null})});handler.on("Ready",function wphReady(data){setupDoc(docParams);docParams=null});return workerHandlerName}};function initializeWorker(){if(!("console"in globalScope)){var consoleTimer={};var workerConsole={log:function log(){var args=Array.prototype.slice.call(arguments);globalScope.postMessage({targetName:"main",action:"console_log",data:args})},error:function error(){var args=Array.prototype.slice.call(arguments);globalScope.postMessage({targetName:"main",action:"console_error",data:args});throw"pdf.js execution error"},time:function time(name){consoleTimer[name]=Date.now()},timeEnd:function timeEnd(name){var time=consoleTimer[name];if(!time){error("Unknown timer name "+name)}this.log("Timer:",name,Date.now()-time)}};globalScope.console=workerConsole}var handler=new MessageHandler("worker","main",self);WorkerMessageHandler.setup(handler,self);handler.send("ready",null)}if(typeof window==="undefined"&&!(typeof module!=="undefined"&&module.require)){initializeWorker()}exports.setPDFNetworkStreamClass=setPDFNetworkStreamClass;exports.WorkerTask=WorkerTask;exports.WorkerMessageHandler=WorkerMessageHandler});var NetworkManager=function NetworkManagerClosure(){var OK_RESPONSE=200;var PARTIAL_CONTENT_RESPONSE=206;function NetworkManager(url,args){this.url=url;args=args||{};this.isHttp=/^https?:/i.test(url);this.httpHeaders=this.isHttp&&args.httpHeaders||{};this.withCredentials=args.withCredentials||false;this.getXhr=args.getXhr||function NetworkManager_getXhr(){return new XMLHttpRequest};this.currXhrId=0;this.pendingRequests=Object.create(null);this.loadedRequests=Object.create(null)}function getArrayBuffer(xhr){var data=xhr.response;if(typeof data!=="string"){return data}var length=data.length;var array=new Uint8Array(length);for(var i=0;i=2&&pendingRequest.onHeadersReceived){pendingRequest.onHeadersReceived();delete pendingRequest.onHeadersReceived}if(xhr.readyState!==4){return}if(!(xhrId in this.pendingRequests)){return}delete this.pendingRequests[xhrId];if(xhr.status===0&&this.isHttp){if(pendingRequest.onError){pendingRequest.onError(xhr.status)}return}var xhrStatus=xhr.status||OK_RESPONSE;var ok_response_on_range_request=xhrStatus===OK_RESPONSE&&pendingRequest.expectedStatus===PARTIAL_CONTENT_RESPONSE;if(!ok_response_on_range_request&&xhrStatus!==pendingRequest.expectedStatus){if(pendingRequest.onError){pendingRequest.onError(xhr.status)}return}this.loadedRequests[xhrId]=true;var chunk=getArrayBuffer(xhr);if(xhrStatus===PARTIAL_CONTENT_RESPONSE){var rangeHeader=xhr.getResponseHeader("Content-Range");var matches=/bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);var begin=parseInt(matches[1],10);pendingRequest.onDone({begin:begin,chunk:chunk})}else if(pendingRequest.onProgressiveData){pendingRequest.onDone(null)}else if(chunk){pendingRequest.onDone({begin:0,chunk:chunk})}else if(pendingRequest.onError){pendingRequest.onError(xhr.status)}},hasPendingRequests:function NetworkManager_hasPendingRequests(){for(var xhrId in this.pendingRequests){return true}return false},getRequestXhr:function NetworkManager_getXhr(xhrId){return this.pendingRequests[xhrId].xhr},isStreamingRequest:function NetworkManager_isStreamingRequest(xhrId){return!!this.pendingRequests[xhrId].onProgressiveData},isPendingRequest:function NetworkManager_isPendingRequest(xhrId){return xhrId in this.pendingRequests},isLoadedRequest:function NetworkManager_isLoadedRequest(xhrId){return xhrId in this.loadedRequests},abortAllRequests:function NetworkManager_abortAllRequests(){for(var xhrId in this.pendingRequests){this.abortRequest(xhrId|0)}},abortRequest:function NetworkManager_abortRequest(xhrId){var xhr=this.pendingRequests[xhrId].xhr;delete this.pendingRequests[xhrId];xhr.abort()}};return NetworkManager}();(function(root,factory){{factory(root.pdfjsCoreNetwork={},root.pdfjsSharedUtil,root.pdfjsCoreWorker)}})(this,function(exports,sharedUtil,coreWorker){var assert=sharedUtil.assert;var createPromiseCapability=sharedUtil.createPromiseCapability;var isInt=sharedUtil.isInt;var MissingPDFException=sharedUtil.MissingPDFException;var UnexpectedResponseException=sharedUtil.UnexpectedResponseException;function PDFNetworkStream(options){this._options=options;var source=options.source;this._manager=new NetworkManager(source.url,{httpHeaders:source.httpHeaders,withCredentials:source.withCredentials});this._rangeChunkSize=source.rangeChunkSize;this._fullRequestReader=null;this._rangeRequestReaders=[]}PDFNetworkStream.prototype={_onRangeRequestReaderClosed:function PDFNetworkStream_onRangeRequestReaderClosed(reader){var i=this._rangeRequestReaders.indexOf(reader);if(i>=0){this._rangeRequestReaders.splice(i,1)}},getFullReader:function PDFNetworkStream_getFullReader(){assert(!this._fullRequestReader);this._fullRequestReader=new PDFNetworkStreamFullRequestReader(this._manager,this._options);return this._fullRequestReader},getRangeReader:function PDFNetworkStream_getRangeReader(begin,end){var reader=new PDFNetworkStreamRangeRequestReader(this._manager,begin,end);reader.onClosed=this._onRangeRequestReaderClosed.bind(this);this._rangeRequestReaders.push(reader);return reader},cancelAllRequests:function PDFNetworkStream_cancelAllRequests(reason){if(this._fullRequestReader){this._fullRequestReader.cancel(reason)}var readers=this._rangeRequestReaders.slice(0);readers.forEach(function(reader){reader.cancel(reason)})}};function PDFNetworkStreamFullRequestReader(manager,options){this._manager=manager;var source=options.source;var args={onHeadersReceived:this._onHeadersReceived.bind(this),onProgressiveData:source.disableStream?null:this._onProgressiveData.bind(this),onDone:this._onDone.bind(this),onError:this._onError.bind(this),onProgress:this._onProgress.bind(this)};this._url=source.url;this._fullRequestId=manager.requestFull(args);this._headersReceivedCapability=createPromiseCapability();this._disableRange=options.disableRange||false;this._contentLength=source.length;this._rangeChunkSize=source.rangeChunkSize;if(!this._rangeChunkSize&&!this._disableRange){this._disableRange=true -}this._isStreamingSupported=false;this._isRangeSupported=false;this._cachedChunks=[];this._requests=[];this._done=false;this._storedError=undefined;this.onProgress=null}PDFNetworkStreamFullRequestReader.prototype={_validateRangeRequestCapabilities:function PDFNetworkStreamFullRequestReader_validateRangeRequestCapabilities(){if(this._disableRange){return false}var networkManager=this._manager;var fullRequestXhrId=this._fullRequestId;var fullRequestXhr=networkManager.getRequestXhr(fullRequestXhrId);if(fullRequestXhr.getResponseHeader("Accept-Ranges")!=="bytes"){return false}var contentEncoding=fullRequestXhr.getResponseHeader("Content-Encoding")||"identity";if(contentEncoding!=="identity"){return false}var length=fullRequestXhr.getResponseHeader("Content-Length");length=parseInt(length,10);if(!isInt(length)){return false}this._contentLength=length;if(length<=2*this._rangeChunkSize){return false}return true},_onHeadersReceived:function PDFNetworkStreamFullRequestReader_onHeadersReceived(){if(this._validateRangeRequestCapabilities()){this._isRangeSupported=true}var networkManager=this._manager;var fullRequestXhrId=this._fullRequestId;if(networkManager.isStreamingRequest(fullRequestXhrId)){this._isStreamingSupported=true}else if(this._isRangeSupported){networkManager.abortRequest(fullRequestXhrId)}this._headersReceivedCapability.resolve()},_onProgressiveData:function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk){if(this._requests.length>0){var requestCapability=this._requests.shift();requestCapability.resolve({value:chunk,done:false})}else{this._cachedChunks.push(chunk)}},_onDone:function PDFNetworkStreamFullRequestReader_onDone(args){if(args){this._onProgressiveData(args.chunk)}this._done=true;if(this._cachedChunks.length>0){return}this._requests.forEach(function(requestCapability){requestCapability.resolve({value:undefined,done:true})});this._requests=[]},_onError:function PDFNetworkStreamFullRequestReader_onError(status){var url=this._url;var exception;if(status===404||status===0&&/^file:/.test(url)){exception=new MissingPDFException('Missing PDF "'+url+'".')}else{exception=new UnexpectedResponseException("Unexpected server response ("+status+') while retrieving PDF "'+url+'".',status)}this._storedError=exception;this._headersReceivedCapability.reject(exception);this._requests.forEach(function(requestCapability){requestCapability.reject(exception)});this._requests=[];this._cachedChunks=[]},_onProgress:function PDFNetworkStreamFullRequestReader_onProgress(data){if(this.onProgress){this.onProgress({loaded:data.loaded,total:data.lengthComputable?data.total:this._contentLength})}},get isRangeSupported(){return this._isRangeSupported},get isStreamingSupported(){return this._isStreamingSupported},get contentLength(){return this._contentLength},get headersReady(){return this._headersReceivedCapability.promise},read:function PDFNetworkStreamFullRequestReader_read(){if(this._storedError){return Promise.reject(this._storedError)}if(this._cachedChunks.length>0){var chunk=this._cachedChunks.shift();return Promise.resolve(chunk)}if(this._done){return Promise.resolve({value:undefined,done:true})}var requestCapability=createPromiseCapability();this._requests.push(requestCapability);return requestCapability.promise},cancel:function PDFNetworkStreamFullRequestReader_cancel(reason){this._done=true;this._headersReceivedCapability.reject(reason);this._requests.forEach(function(requestCapability){requestCapability.resolve({value:undefined,done:true})});this._requests=[];if(this._manager.isPendingRequest(this._fullRequestId)){this._manager.abortRequest(this._fullRequestId)}this._fullRequestReader=null}};function PDFNetworkStreamRangeRequestReader(manager,begin,end){this._manager=manager;var args={onDone:this._onDone.bind(this),onProgress:this._onProgress.bind(this)};this._requestId=manager.requestRange(begin,end,args);this._requests=[];this._queuedChunk=null;this._done=false;this.onProgress=null;this.onClosed=null}PDFNetworkStreamRangeRequestReader.prototype={_close:function PDFNetworkStreamRangeRequestReader_close(){if(this.onClosed){this.onClosed(this)}},_onDone:function PDFNetworkStreamRangeRequestReader_onDone(data){var chunk=data.chunk;if(this._requests.length>0){var requestCapability=this._requests.shift();requestCapability.resolve({value:chunk,done:false})}else{this._queuedChunk=chunk}this._done=true;this._requests.forEach(function(requestCapability){requestCapability.resolve({value:undefined,done:true})});this._requests=[];this._close()},_onProgress:function PDFNetworkStreamRangeRequestReader_onProgress(evt){if(!this.isStreamingSupported&&this.onProgress){this.onProgress({loaded:evt.loaded})}},get isStreamingSupported(){return false},read:function PDFNetworkStreamRangeRequestReader_read(){if(this._queuedChunk!==null){var chunk=this._queuedChunk;this._queuedChunk=null;return Promise.resolve({value:chunk,done:false})}if(this._done){return Promise.resolve({value:undefined,done:true})}var requestCapability=createPromiseCapability();this._requests.push(requestCapability);return requestCapability.promise},cancel:function PDFNetworkStreamRangeRequestReader_cancel(reason){this._done=true;this._requests.forEach(function(requestCapability){requestCapability.resolve({value:undefined,done:true})});this._requests=[];if(this._manager.isPendingRequest(this._requestId)){this._manager.abortRequest(this._requestId)}this._close()}};coreWorker.setPDFNetworkStreamClass(PDFNetworkStream);exports.PDFNetworkStream=PDFNetworkStream;exports.NetworkManager=NetworkManager})}).call(pdfjsLibs);exports.WorkerMessageHandler=pdfjsLibs.pdfjsCoreWorker.WorkerMessageHandler}); \ No newline at end of file diff --git a/locale/messages.pot b/locale/messages.pot index 6ff60628..98b40b2d 100644 --- a/locale/messages.pot +++ b/locale/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-05-04 22:25+0200\n" +"POT-Creation-Date: 2021-05-04 22:45+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -- cgit v1.2.3