From d96d9812e370fc4137bea11f3c120b03505e9e37 Mon Sep 17 00:00:00 2001 From: "Michael B. Klein" Date: Tue, 21 Apr 2026 20:19:08 -0500 Subject: [PATCH 1/6] Use ImageGeometry instead of Dimensions Use real tile sizes for info.json (if available) Add tile size probe for TIFF and JPEG 2000 --- CHANGELOG.md | 6 +- README.md | 70 ++++++++---- examples/tiny-iiif/iiif.ts | 20 ++-- examples/tiny-iiif/package.json | 2 +- examples/tiny-iiif/tsconfig.json | 2 +- package-lock.json | 11 +- package.json | 3 +- src/contracts.ts | 14 ++- src/geometry.ts | 107 ++++++++++++++++++ src/index.ts | 3 +- src/processor.ts | 98 +++++------------ src/tile-size.ts | 182 +++++++++++++++++++++++++++++++ src/types.ts | 11 +- src/v2/info.ts | 9 +- src/v3/info.ts | 14 +-- tests/fixtures/samvera.tif | Bin 68672 -> 28274 bytes tests/fixtures/samvera_128.tif | Bin 0 -> 51484 bytes tests/fixtures/samvera_256.tif | Bin 0 -> 68672 bytes tests/geometry.test.ts | 167 ++++++++++++++++++++++++++++ tests/v2/integration.test.ts | 42 ++++--- tests/v2/processor.test.ts | 152 ++++++++++++++++---------- tests/v3/integration.test.ts | 57 +++++++--- tests/v3/processor.test.ts | 132 ++++++++++++++-------- 23 files changed, 834 insertions(+), 268 deletions(-) create mode 100644 src/geometry.ts create mode 100644 src/tile-size.ts create mode 100644 tests/fixtures/samvera_128.tif create mode 100644 tests/fixtures/samvera_256.tif create mode 100644 tests/geometry.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 30b149e..edaf8bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,7 +39,7 @@ Only features and major fixes are listed. Everything else can be considered a mi ##### v3.2.0 - Major refactor to support multi-resolution source images -- Backward-compatible overhaul of `dimensionFunction` +- Backward-compatible overhaul of `geometryFunction` - Split `Calculator` out from `Operations` to make certain pre-transform information available with low overhead - Use `sharp.metadata()` instead of `probe-image-size` in default dimension function @@ -65,8 +65,8 @@ Only features and major fixes are listed. Everything else can be considered a mi streamResolver({ id }) { } // new streamResolver({ id }, callback) { } // new - dimensionFunction(id) { } // old - dimensionFunction({ id }) { } // new + geometryFunction(id) { } // old + geometryFunction({ id }) { } // new ``` See [issue #19](https://github.com/samvera/node-iiif/issues/19) for context on why this change was made. diff --git a/README.md b/README.md index 49171ca..4e46cd8 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ const processor = new Processor(url, streamResolver, opts); * `url` (string, required) - the URL of the IIIF resource to process * `streamResolver` (async function, required) – returns a Promise of a readable image stream for a given request ([see below](#stream-resolver)); the legacy two-argument callback form is deprecated * `opts`: - * `dimensionFunction` (function) – a callback function that returns the image dimensions for a given request ([see below](#dimension-function)) + * `geometryFunction` (function) – a callback function that returns the image geometry for a given request ([see below](#geometry-function)) * `max` (object) – optional maximum size constraints of an image that can be returned * `width` (integer) - the maximum pixel width of the returned image * `height` (integer) - the maximum pixel height of the returned image @@ -90,32 +90,58 @@ Note: The two-argument callback form is still supported but deprecated; prefer t promise-based resolver shown above. If you currently return a stream synchronously, wrap it with `Promise.resolve()` or mark your function `async`. -### Dimension Function +### Geometry Function -The calling function can also supply the processor with an optional Dimension callback that takes information about the request [(`id` and `baseUrl`)](#id--baseurl) and returns the dimensions of the source image. This allows for caching dimensions and avoiding an expensive image request. +The calling function can also supply the processor with an optional Geometry callback that takes information about the request [(`id` and `baseUrl`)](#id--baseurl) and returns information about the geometry of the source image. This allows for caching dimensions and other information, and avoiding an expensive image request. -The function should return either: +The function should return an object conforming to the `ImageGeometry` type, for example: + +```typescript +{ + width: 4096, + height: 3072, + pages: 6, + sizes: [ + {width: 4096, height: 3072}, + {width: 2048, height: 1536}, + {width: 1024, height: 768}, + {width: 512, height: 384}, + {width: 256, height: 192}, + {width: 128, height: 96} + ], + tileWidth: 128, + tileHeight: 128 +} +``` + +Any information not included will be calculated or probed for, if possible. For example: + +| Fields Provided | Fields Calculated | Fields Probed | +| -------------------------- | ----------------- | -------------------------- | +| none | `sizes` | `width`, `height`, `pages` | +| `width`, `height`, `sizes` | `pages` | | +| `width`, `height`, `pages` | `sizes` | | + +Tile size information is independent of dimension and page information. If either `tileWidth` or `tileHeight` is +left `undefined`, the image stream will be probed for them, which can be an expensive operation. If both are +provided – even if they are `null` – the given values will be used. `null` values will be replaced by a default +value of `256` when rendering the information document (`info.json`) for an image. -* a `{width: w, height: h}` object indicating the dimensions of the source image -* an array of `{width: w, height: h}` objects indicating the dimensions of all of the pages available within the source image, if it is a multi-resolution image (e.g., a pyramidal TIFF), e.g.: - ``` - [ - { width: 14499, height: 12069 }, - { width: 7249, height: 6034 }, - { width: 3624, height: 3017 }, - { width: 1812, height: 1508 }, - { width: 906, height: 754 }, - { width: 453, height: 377 }, - { width: 226, height: 188 } - ] - ``` -Providing the dimensions of all available pages allows the processor to choose the most efficient starting image for the size requested. +The following example shows a Geometry Function that looks up the width, height, and number of pages in the target +image in a database and returns them along with hardcoded tile sizes. The `sizes` array will be automatically +calculated by the processor. ```typescript -async function dimensionFunction({ id: string, baseUrl: string }): Promise { +async function geometryFunction({ id: string, baseUrl: string }): Promise { let dimensions = lookDimensionsUpInDatabase(id); - return { width: dimensions.width, height: dimensions.height }; + return { + width: dimensions.width, + height: dimensions.height, + pages: dimensions.pages, + tileWidth: 128, + tileHeight: 128 + }; } ``` @@ -142,7 +168,7 @@ In addition, certain error conditions may result in the throwing of an `IIIFErro import { Processor } from "iiif-processor"; let url = "http://iiif.example.com/iiif/2/abcdefgh/full/400,/0/default.jpg" -let processor = new Processor(url, streamResolver, { dimensionFunction }); +let processor = new Processor(url, streamResolver, { geometryFunction }); processor.execute() .then(result => handleResult(result)) .catch(err => handleError(err)); @@ -153,7 +179,7 @@ processor.execute() import { Processor } from "iiif-processor"; let url = "http://iiif.example.com/iiif/2/abcdefgh/full/400,/0/default.jpg" -let processor = new Processor(url, streamResolver, { dimensionFunction }); +let processor = new Processor(url, streamResolver, { geometryFunction }); try { return await processor.execute(); } catch (err) { diff --git a/examples/tiny-iiif/iiif.ts b/examples/tiny-iiif/iiif.ts index fc7ff56..73bfe61 100644 --- a/examples/tiny-iiif/iiif.ts +++ b/examples/tiny-iiif/iiif.ts @@ -1,12 +1,5 @@ import { App } from '@tinyhttp/app'; -import { - Processor, - IIIFError, - ContentResult, - ErrorResult, - ProcessorResult, - RedirectResult -} from 'iiif-processor'; +import { Processor, IIIFError, ProcessorResult } from 'iiif-processor'; import fs from 'fs'; import path from 'path'; import { iiifImagePath, iiifpathPrefix, fileTemplate } from './config'; @@ -54,12 +47,15 @@ const render = async (req: any, res: any) => { } }; -function createRouter (version: number) { +function createRouter(version: number) { const router = new App(); router.use((_req, res, next) => { res.set('Access-Control-Allow-Headers', '*'); - res.set('Access-Control-Allow-Methods', 'OPTIONS, HEAD, GET, POST, PUT, DELETE'); + res.set( + 'Access-Control-Allow-Methods', + 'OPTIONS, HEAD, GET, POST, PUT, DELETE' + ); res.set('Access-Control-Allow-Origin', '*'); next(); }); @@ -67,7 +63,9 @@ function createRouter (version: number) { router.options('*', (_req, res) => { res.status(204).send(''); }); - router.get('/', (_req, res) => res.status(200).send(`IIIF v${version}.x endpoint OK`)); + router.get('/', (_req, res) => + res.status(200).send(`IIIF v${version}.x endpoint OK`) + ); router.get('/:id', render); router.get('/:id/info.json', render); router.get('/:id/:region/:size/:rotation/:filename', render); diff --git a/examples/tiny-iiif/package.json b/examples/tiny-iiif/package.json index 68c0505..b27db88 100644 --- a/examples/tiny-iiif/package.json +++ b/examples/tiny-iiif/package.json @@ -8,7 +8,7 @@ "dev": "IIIF_IMAGE_PATH=${IIIF_IMAGE_PATH:-./tiff} nodemon", "lint": "eslint *.ts", "lint-fix": "eslint --fix *.ts", - "tiny-iiif": "IIIF_IMAGE_PATH=./tiff tsx index.ts", + "tiny-iiif": "IIIF_IMAGE_PATH=${IIIF_IMAGE_PATH:-./tiff} tsx index.ts", "dev:all": "concurrently -n build,server -c blue,green \"npm run --prefix ../.. build:watch\" \"npm run dev\"", "validator": "IIIF_IMAGE_PATH=../../validator/fixtures nodemon" }, diff --git a/examples/tiny-iiif/tsconfig.json b/examples/tiny-iiif/tsconfig.json index 4bac7c4..a001203 100644 --- a/examples/tiny-iiif/tsconfig.json +++ b/examples/tiny-iiif/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "module": "ESNext", + "module": "NodeNext", "moduleResolution": "NodeNext", "target": "ES2020", "types": ["node"], diff --git a/package-lock.json b/package-lock.json index 1ecc30b..1a71e04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5221,13 +5221,16 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.4.tgz", - "integrity": "sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw==", + "version": "2.10.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", + "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/bcrypt-pbkdf": { diff --git a/package.json b/package.json index 455e089..3a7d2db 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,8 @@ "src/**/*.{js,ts}" ], "coveragePathIgnorePatterns": [ - "/tsup.config.ts" + "/tsup.config.ts", + "src/tile-size.ts" ], "testPathIgnorePatterns": [ "[/\\\\](build|docs|node_modules|scripts)[/\\\\]" diff --git a/src/contracts.ts b/src/contracts.ts index c25f793..57a4c0c 100644 --- a/src/contracts.ts +++ b/src/contracts.ts @@ -1,4 +1,12 @@ -import type { BoundingBox, Dimensions, Format, IIIFSpec, MaxDimensions, Quality } from './types'; +import type { + BoundingBox, + Dimensions, + Format, + IIIFSpec, + ImageGeometry, + MaxDimensions, + Quality +} from './types'; export interface Calculated { region: BoundingBox; @@ -28,9 +36,7 @@ export type CalculatorCtor = { export interface InfoDocInput { id: string; - width: number; - height: number; - sizes: Dimensions[]; + geometry: ImageGeometry; max?: MaxDimensions; } diff --git a/src/geometry.ts b/src/geometry.ts new file mode 100644 index 0000000..7b151f1 --- /dev/null +++ b/src/geometry.ts @@ -0,0 +1,107 @@ +import Debug from 'debug'; +import type { ImageGeometry } from './types'; +import sharp from 'sharp'; +import { Readable } from 'stream'; +import { getTileSize } from './tile-size'; + +const debug = Debug('iiif:geometry'); + +type StreamCallback = (stream: Readable) => Promise; + +export async function readGeometry( + streamer: (callback: StreamCallback) => Promise, + geometry: ImageGeometry +): Promise { + let metadata = {}; + let tileSize = {}; + const result = { ...geometry }; + + debug('Initial geometry: %O', geometry); + + if ( + !geometry.width || + !geometry.height || + !(geometry.pages || geometry.sizes) + ) { + await streamer(async (metadataStream) => { + metadata = await readMetadata(metadataStream); + }); + debug('Read metadata: %O', metadata); + } + + if (geometry.tileWidth === undefined || geometry.tileHeight === undefined) { + await streamer(async (sizeStream) => { + const size = await getTileSize(sizeStream); + tileSize = { tileWidth: size.width, tileHeight: size.height }; + }); + debug('Read tile size: %O', tileSize); + } + + const final = { ...result, ...metadata, ...tileSize }; + debug('Final geometry: %O', final); + return final; +} + +export function calculateGeometry(geometry: ImageGeometry): ImageGeometry { + if (geometry.sizes) { + const result: ImageGeometry = { ...geometry }; + if (!geometry.pages) { + result.pages = geometry.sizes.length; + } + if (!geometry.width || !geometry.height) { + result.width = geometry.sizes[0].width; + result.height = geometry.sizes[0].height; + } + return result; + } + + if (geometry.width && geometry.height) { + if (geometry.pages) + if (geometry.pages === 1) { + return { + ...geometry, + sizes: [{ width: geometry.width, height: geometry.height }] + }; + } + if (geometry.pages > 1) { + return calculateSizesFromPages(geometry); + } + if (geometry.tileWidth && geometry.tileHeight) { + return calculateSizesFromTiles(geometry); + } + } + + return geometry; +} + +async function readMetadata(stream: Readable): Promise { + const target = sharp({ limitInputPixels: false, page: 0 }); + + stream.pipe(target); + const { autoOrient, ...metadata } = await target.metadata(); + const { width, height, pages } = { ...metadata, ...autoOrient }; + return { width, height, pages }; +} + +function calculateSizesFromTiles(geometry: ImageGeometry): ImageGeometry { + const pages = + Math.max( + Math.ceil(Math.log2(geometry.width! / geometry.tileWidth!)), + Math.ceil(Math.log2(geometry.height! / geometry.tileHeight!)) + ) + 1; + return calculateSizesFromPages({ ...geometry, pages }); +} + +function calculateSizesFromPages(geometry: ImageGeometry): ImageGeometry { + const result: ImageGeometry = { ...geometry }; + result.sizes = [{ width: geometry.width, height: geometry.height }]; + let page = 0; + for (page += 1; page < geometry.pages; page++) { + const scale = 1 / 2 ** page; + result.sizes.push({ + width: Math.floor(geometry.width * scale), + height: Math.floor(geometry.height * scale) + }); + } + return result; +} diff --git a/src/index.ts b/src/index.ts index 74cad5b..4ad0d1b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,13 @@ export { IIIFError } from './error'; export { - DimensionFunction, + GeometryFunction, StreamResolver, StreamResolverWithCallback, Processor, ProcessorOptions } from './processor'; export { + ImageGeometry, ContentResult, RedirectResult, ErrorResult, diff --git a/src/processor.ts b/src/processor.ts index abe2ed0..35d7105 100644 --- a/src/processor.ts +++ b/src/processor.ts @@ -2,14 +2,14 @@ import Debug from 'debug'; import mime from 'mime-types'; import path from 'path'; import sharp from 'sharp'; +import { calculateGeometry, readGeometry } from './geometry'; import { Operations } from './transform'; import { IIIFError } from './error'; import Versions from './versions'; import type { - Dimensions, MaxDimensions, + ImageGeometry, ProcessorResult, - ResolvedDimensions, ContentResult, ErrorResult, RedirectResult @@ -42,10 +42,10 @@ function getIiifVersion(url: string, template: string) { } } -export type DimensionFunction = (input: { +export type GeometryFunction = (input: { id: string; baseUrl: string; -}) => Promise; +}) => Promise; export type StreamResolver = (input: { id: string; baseUrl: string; @@ -55,7 +55,7 @@ export type StreamResolverWithCallback = ( callback: (stream: NodeJS.ReadableStream) => Promise ) => Promise; export type ProcessorOptions = { - dimensionFunction?: DimensionFunction; + geometryFunction?: GeometryFunction; max?: { width: number; height?: number; area?: number }; includeMetadata?: boolean; density?: number; @@ -70,7 +70,7 @@ export type ProcessorOptions = { export class Processor { private errorClass = IIIFError; private Implementation!: VersionModule; - private sizeInfo?: Dimensions[]; + private imageGeometry?: ImageGeometry; private sharpOptions?: Record; id!: string; @@ -89,7 +89,7 @@ export class Processor { format!: string; // options - dimensionFunction!: DimensionFunction; + geometryFunction!: GeometryFunction; max?: MaxDimensions; includeMetadata = false; density?: number | null; @@ -115,7 +115,7 @@ export class Processor { } const defaults = { - dimensionFunction: this.defaultDimensionFunction.bind(this), + geometryFunction: null, density: null }; @@ -129,7 +129,7 @@ export class Processor { } setOpts(opts) { - this.dimensionFunction = opts.dimensionFunction; + this.geometryFunction = opts.geometryFunction; this.max = { ...opts.max }; this.includeMetadata = !!opts.includeMetadata; this.density = opts.density; @@ -182,79 +182,35 @@ export class Processor { } } - async defaultDimensionFunction({ - id, - baseUrl - }: { - id: string; - baseUrl: string; - }): Promise { - const result: Dimensions[] = []; - let page = 0; - const target = sharp({ limitInputPixels: false, page }); - - return (await this.withStream({ id, baseUrl }, async (stream) => { - stream.pipe(target); - const { autoOrient, ...metadata } = await target.metadata(); - const { width, height, pages } = { ...metadata, ...autoOrient }; - if (!width || !height) return result; - result.push({ width, height }); - if (!isNaN(pages)) { - for (page += 1; page < pages; page++) { - const scale = 1 / 2 ** page; - result.push({ - width: Math.floor(width * scale), - height: Math.floor(height * scale) - }); - } - } - return result; - })) as Dimensions[]; - } - - async dimensions(): Promise { - const fallback = - this.dimensionFunction !== this.defaultDimensionFunction.bind(this); - - if (!this.sizeInfo) { + async geometry(): Promise { + if (!this.imageGeometry) { debug( - 'Attempting to use dimensionFunction to retrieve dimensions for %j', + 'Attempting to use geometryFunction to retrieve dimensions for %j', this.id ); const params = { id: this.id, baseUrl: this.baseUrl }; - let dims: ResolvedDimensions = await this.dimensionFunction(params); - if (fallback && !dims) { - const warning = - 'Unable to get dimensions for %s using custom function. Falling back to sharp.metadata().'; - debug(warning, this.id); - console.warn(warning, this.id); - dims = await this.defaultDimensionFunction(params); + let geometry: ImageGeometry = {}; + if (this.geometryFunction) { + geometry = await this.geometryFunction(params); } - if (!Array.isArray(dims)) dims = [dims]; - this.sizeInfo = dims as Dimensions[]; + geometry = await readGeometry( + (callback) => this.withStream(params, callback), + geometry + ); + this.imageGeometry = calculateGeometry(geometry); } - return this.sizeInfo; + return this.imageGeometry; } async infoJson() { - const [dim] = await this.dimensions(); - const sizes: Array<{ width: number; height: number }> = []; - for ( - let size = [dim.width, dim.height]; - size.every((x) => x >= 64); - size = size.map((x) => Math.floor(x / 2)) - ) { - sizes.push({ width: size[0], height: size[1] }); - } - + const geometry = await this.geometry(); const uri = new URL(this.baseUrl); // Node's URL has readonly pathname in types; construct via join on new URL uri.pathname = path.join(uri.pathname, this.id); const id = uri.toString(); const doc = this.Implementation.infoDoc({ id, - ...dim, - sizes, + geometry, max: this.max }); for (const prop in doc) { @@ -271,11 +227,11 @@ export class Processor { } as ContentResult; } - operations(dim: Dimensions[]) { + operations({ sizes }: ImageGeometry) { const sharpOpt = this.sharpOptions; const { max, pageThreshold } = this; debug('pageThreshold: %d', pageThreshold); - return new Operations(this.version, dim, { + return new Operations(this.version, sizes, { sharp: sharpOpt, max, pageThreshold @@ -317,8 +273,8 @@ export class Processor { async iiifImage() { debugv('Request %s', this.request); - const dim = await this.dimensions(); - const operations = this.operations(dim); + const geometry = await this.geometry(); + const operations = this.operations(geometry); debugv('Operations: %j', operations); const pipeline = await operations.pipeline(); diff --git a/src/tile-size.ts b/src/tile-size.ts new file mode 100644 index 0000000..05be48f --- /dev/null +++ b/src/tile-size.ts @@ -0,0 +1,182 @@ +import { Readable } from 'stream'; + +export interface TileSize { + width: number | undefined | null; + height: number | undefined | null; +} + +type ImageFormat = 'tiff-le' | 'tiff-be' | 'jp2' | 'unknown'; + +const CHUNK_SIZE = 5 * 1024; // 5KB + +/** + * Wraps a Readable stream in an async interface that accumulates chunks + * on demand. Call `ensure(n)` to buffer at least `n` bytes, then read + * from `buf` directly. + */ +class StreamBuffer { + private chunks: Buffer[] = []; + private _length = 0; + private done = false; + private iterator: AsyncIterableIterator; + + constructor(stream: Readable) { + stream.pause(); + this.iterator = stream[ + Symbol.asyncIterator + ]() as AsyncIterableIterator; + } + + get length() { + return this._length; + } + + get buf(): Buffer { + return Buffer.concat(this.chunks); + } + + /** Buffer at least `needed` bytes, or until stream is exhausted. */ + async ensure(needed: number): Promise { + while (this._length < needed && !this.done) { + const { value, done } = await this.iterator.next(); + if (done) { + this.done = true; + } else { + this.chunks.push(value); + this._length += value.length; + } + } + } + + /** Read `count` bytes starting at `offset`, fetching more chunks if needed. */ + async read(offset: number, count: number): Promise { + await this.ensure(offset + count); + return this.buf.subarray(offset, offset + count); + } +} + +const magicNumbers = [ + { type: 'tiff-le', magic: Buffer.from([0x49, 0x49, 0x2a, 0x00]) }, + { type: 'tiff-be', magic: Buffer.from([0x4d, 0x4d, 0x00, 0x2a]) }, + { type: 'jp2', magic: Buffer.from([0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50]) }, + { type: 'jp2', magic: Buffer.from([0xff, 0x4f]) } +]; + +function detectFormat(buf: Buffer): ImageFormat { + if (buf.length < 8) return 'unknown'; + for (const { type, magic } of magicNumbers) { + if (buf.subarray(0, magic.length).equals(magic)) return type as ImageFormat; + } + return 'unknown'; +} + +async function getTiffTileSize( + sb: StreamBuffer, + littleEndian: boolean +): Promise { + const readUInt16 = (buf: Buffer, offset: number) => + littleEndian ? buf.readUInt16LE(offset) : buf.readUInt16BE(offset); + const readUInt32 = (buf: Buffer, offset: number) => + littleEndian ? buf.readUInt32LE(offset) : buf.readUInt32BE(offset); + + // Bytes 4-7 contain the IFD offset + const header = await sb.read(0, 8); + const ifdOffset = readUInt32(header, 4); + + // First 2 bytes of the IFD are the entry count + const ifdHeader = await sb.read(ifdOffset, 2); + const entryCount = readUInt16(ifdHeader, 0); + + // Each IFD entry is 12 bytes + const ifdData = await sb.read(ifdOffset + 2, entryCount * 12); + + let width: number | undefined | null; + let height: number | undefined | null; + + for (let i = 0; i < entryCount; i++) { + const entryOffset = i * 12; + const tag = readUInt16(ifdData, entryOffset); + const value = readUInt32(ifdData, entryOffset + 8); + + if (tag === 322) width = value; // TileWidth + if (tag === 323) height = value; // TileLength + + if (width !== undefined && height !== undefined) break; + } + + return { width, height }; +} + +async function getJP2TileSize(sb: StreamBuffer): Promise { + const magic = await sb.read(0, 2); + const isRawCodestream = magic[0] === 0xff && magic[1] === 0x4f; + + let offset = 0; + + if (!isRawCodestream) { + // Walk JP2 boxes to find the jp2c (codestream) box + let foundCodestream = false; + while (true) { + const boxHeader = await sb.read(offset, 8); + if (boxHeader.length < 8) break; + + const boxLength = boxHeader.readUInt32BE(0); + const boxType = boxHeader.readUInt32BE(4); + + if (boxType === 0x6a703263) { + // 'jp2c' + offset += 8; // skip box header, now pointing at codestream + foundCodestream = true; + break; + } + + if (boxLength < 8) break; // malformed + offset += boxLength; + } + + if (!foundCodestream) return { width: null, height: null }; + } + + // Scan for SIZ marker (FF51), reading in chunks to avoid buffering the whole file + while (true) { + const chunk = await sb.read(offset, CHUNK_SIZE); + if (chunk.length < 2) break; + + for (let i = 0; i < chunk.length - 1; i++) { + if (chunk[i] === 0xff && chunk[i + 1] === 0x51) { + // SIZ layout from marker start: + // FF51 (2) + segment length (2) + Rsiz (2) + Xsiz (4) + Ysiz (4) + // + XOsiz (4) + YOsiz (4) = 22 bytes before XTsiz + const sizData = await sb.read(offset + i + 22, 8); + if (sizData.length < 8) return { width: null, height: null }; + return { + width: sizData.readUInt32BE(0), // XTsiz + height: sizData.readUInt32BE(4) // YTsiz + }; + } + } + + if (chunk.length < CHUNK_SIZE) break; // end of stream + offset += CHUNK_SIZE - 1; // overlap by 1 to avoid missing a marker at a chunk boundary + } + + return { width: null, height: null }; +} + +export async function getTileSize(stream: Readable): Promise { + const sb = new StreamBuffer(stream); + + // Read just enough to detect the format + await sb.ensure(8); + const format = detectFormat(sb.buf); + + if (format === 'tiff-le' || format === 'tiff-be') { + return getTiffTileSize(sb, format === 'tiff-le'); + } + + if (format === 'jp2') { + return getJP2TileSize(sb); + } + + return { width: null, height: null }; +} diff --git a/src/types.ts b/src/types.ts index 49aefaa..238b2bd 100644 --- a/src/types.ts +++ b/src/types.ts @@ -24,6 +24,15 @@ export type IIIFSpec = { density?: number; }; +export type ImageGeometry = { + width?: number; + height?: number; + pages?: number; + sizes?: Dimensions[]; + tileWidth?: number; + tileHeight?: number; +}; + export type MaxDimensions = { width?: number; height?: number; @@ -51,4 +60,4 @@ export type ErrorResult = { statusCode: number; }; -export type ProcessorResult = ContentResult | RedirectResult | ErrorResult; \ No newline at end of file +export type ProcessorResult = ContentResult | RedirectResult | ErrorResult; diff --git a/src/v2/info.ts b/src/v2/info.ts index 5f5f5d3..dc85ef3 100644 --- a/src/v2/info.ts +++ b/src/v2/info.ts @@ -32,13 +32,14 @@ const IIIFProfile = { ]) }; -export function infoDoc ({ id, width, height, sizes, max }: InfoDocInput): InfoDoc { +export function infoDoc({ id, geometry, max }: InfoDocInput): InfoDoc { const maxAttrs = { maxWidth: max?.width, maxHeight: max?.height, maxArea: max?.area }; + const { width, height, sizes } = geometry; return { '@context': 'http://iiif.io/api/image/2/context.json', '@id': id, @@ -47,7 +48,11 @@ export function infoDoc ({ id, width, height, sizes, max }: InfoDocInput): InfoD height, sizes, tiles: [ - { width: 512, height: 512, scaleFactors: sizes.map((_v: Dimensions, i: number) => 2 ** i) } + { + width: geometry.tileWidth, + height: geometry.tileHeight, + scaleFactors: sizes.map((_v: Dimensions, i: number) => 2 ** i) + } ], profile: [profileLink, { ...IIIFProfile, ...maxAttrs }] }; diff --git a/src/v3/info.ts b/src/v3/info.ts index 25e60b8..62c8755 100644 --- a/src/v3/info.ts +++ b/src/v3/info.ts @@ -6,6 +6,7 @@ import type { InfoDocInput, InfoDoc } from '../contracts'; export const profileLink = 'https://iiif.io/api/image/3/level2.json'; +const DEFAULT_TILE_SIZE = 512; const defaultFormats: Set = new Set(['jpg', 'png']); const defaultQualities: Set = new Set(['default']); const IIIFExtras = { @@ -23,19 +24,14 @@ const IIIFExtras = { extraQualities: new Set(Qualities.filter((q) => !defaultQualities.has(q))) }; -export function infoDoc({ - id, - width, - height, - sizes, - max -}: InfoDocInput): InfoDoc { +export function infoDoc({ id, geometry, max }: InfoDocInput): InfoDoc { const maxAttrs = { maxWidth: max?.width, maxHeight: max?.height, maxArea: max?.area }; + const { width, height, sizes } = geometry; return { '@context': 'http://iiif.io/api/image/3/context.json', id, @@ -47,8 +43,8 @@ export function infoDoc({ sizes, tiles: [ { - width: 512, - height: 512, + width: geometry.tileWidth || DEFAULT_TILE_SIZE, + height: geometry.tileHeight || DEFAULT_TILE_SIZE, scaleFactors: sizes.map((_v: Dimensions, i: number) => 2 ** i) } ], diff --git a/tests/fixtures/samvera.tif b/tests/fixtures/samvera.tif index 5d3977b634826bfd555a87345187a9c53e639fe6..b926a1ec8780db102a9df225eb09629b4d2de75c 100644 GIT binary patch literal 28274 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
    X zTPi}d@YIgBcd`1%f`_k->!%7ncHBz8gS!7BGIx@#z#E;BahQ$lw(s}rP`9FT`9cxr(H*@ zc;A;tjs-o7(GNgvsZ~!`Sw=tDJ1nqt>y{VTxVq*UF+63Qpo$dn8rkDRiwh6VrxW~v&|;2%C3-5^jFWYi~AA>dP(`UMiGB^ylgJR;FMqYgw^O$ zIK$~2uq&*CXTSS6NomN^wEoS!RLKID0^DYZ4}Yb|7TA6%B|k8aIe8Ea_p=$xYOfd z4Hx%$zxL?yr#(>Z#8Uk(HjXr)C?J1lQr!|Wis|QB)utLF4rA^u-UpIY#`yyJczWaF zMn_}k@apTL$byVro`I)J-s)KX$Wj23Fkx_Xj{>=I&2E$2vJdcu)o$;}8^x~ukWWH~ zyD`csO}lVBNul?uX@I0iUQ+PwkE}3^Qv&1+ zi{1FeXstA&xGKb{uVnJ`4sbu(TTAh-4Lt4DlJU!>yY={BJCSQk0S+{A<6$>Z;60VR z185alI&$)5OaG#`0Dk%h`1UM`E=bo3!6 zvk?C}hRwbw*q%csuWbswfaGiEx4u7rn`MkxL zN283s@NDQmMUgKU#EkeuW10^JxQOX{;Dr6O^ak}JBdu0XGtQh@r0ees`0W*VB%cS7 zG_{0(QknX3DtmiG3=-Daj9N-_*=UM;1w%$0+z9w2)XOvC$WWZMeKd)OkN)Nb%Xf=O z_4wbb_p;Odzk2%P|HcILKMXxm|1bX(@!)?9v~a79FH@c#I=zsjWX9L9wLw0`L&?-` z*#29YuBP*zP@b9!N=q9_fEeWK?A)@Hqq$$Vo!S!39yM3%N5T@_+HO(bC`Fdq3iT;N zA(ZHMl!9=bG)krD{ciCKcB?Hi$*tNqFlXBE%N7JGMU!Bbanw0DQqgTC9<=o)-zr0x z@zTs8!*;Ui+{D=<|00O2<%8fm~2}5^79+extg@sdt$^*0mzE5oE(vOX`;%4H)EG{dYT)=gMx-2?Sz?Dfg?4Jy31IOd!%S{2l!=L zREscnzXOc!k$*Sunyt(u6FAXOGOIw#>04)DjZje~v|SAA4PK>ouaAX%y>(5bkd|Xg zZz|2#7aF26uFqd#i)YO*Bzg+b1r{{ zV>+SdxrS$j27^vFQbgE@^S7tjs8Vo;2yqh!l6icoM`Bue;rZ;?TW+m3&>H?>t}B0u=?;)sE(RpLITgKOv8G&e4di+5_o74J zeEnDEVHV|6;avq`_=5^em*D*G`CYXGA9au45T^`pmgbT{4VON9Yi>tzmLM6rZ~gyH z-$Z5AFTcKA{)Ea@o#t4JT8SKZ@Zgx}c6*y|*AA?~m+LY}r=a3hu3@HvSc*!YTI*T6 z2&(;NKG$Yoz|L{YuV?$yhyK#Gi!+D9dnXJXBvI1u?%<90-RI}DeWyxXh3Q1QdR~1l zsZsR^2`rG!frb-(9)hi>GI+TQ`9Vxh99y^K+AiJHG5Hn?Es-Z!VTSwK3KRacf=^6|^5 z(EO}&FGVC9SBJKF>$FW^^It8UM?W;nq9$cJ**1TtlJz{UbbH|e*L>zqFKr%=;s4RucYrn3bn8Z`0#c+& z4OP1IE<{m4x`6bi0@4JecOoK11VTqZK6gvu96c?J`-j=3Q?fVd>Am=_NF+SZhS<1@SqhW2B>NDab;u>WVw@Ke$l2k5Hj% zZB`cZ%@WjiB0KcGqkhWi^uzj_!ci-W;nwjZOhTqFD9AY;GHsZJLE{cwEJi%hi=k5G#gX+fv@y#HLs&f8m z`5g}c7fEtkS)!QCnJb!>#x^Y$#9Ht@Qxyphl{kymL%sdgiSy+gY&{*h2{BC@7R6>p zh4GDH4Td){zn@XCCdYq6rMoobsTOZFI7lYm3|ug}i~4dPx^K?ffNAKM@j}hEpA0?Z zYfqS9uTkudM2xxZs~fze_3kfJDpy&#yA9KasGDQVQ$qq>^RUAsCbcPPTpvON#fwZh z5lU~Lw)a|FxV)7ujUG$>L;az+#Y8|P@3J&zvV{w)uauV4GQsZGqnhkO)t*S8qM|4f3LM0wzgfn9y6yqDV-)6-LNKhSDQb3QGMp>^j+u}trOy4A zN<@XMUlU1fx!Sh9rN|Y|bs2wWeT*ugtCRFo&gAWpd!`U3 zY`WZJf|2fApdX*r8e9E-q4(9D^Ft-*XuU-5nNgy6nCx@lvdL%Fx>=el%J@FU`C9^> zFBq=b(Xo~0Qapdop~})+`#o+!{___l?=sg@4gcpC{y{^mbk*K#c0p?0A|keA#Qc8v zMj6`>hCuF@MRPN1Zf=}y>r$Sdc#WA^^5TDP%akOofIm(R)7a@h705~hLaO6vbd^E> z)tg)N*YnprAhPsezY2Y%cbSCF4U|zv|5KqE-YKs;kp67!AxWB|aeaRwy=+lM;gBWs z7XxC3L@Jjw&1BWgmE>!4Jo~<<2wTpq2+MOd7bH({E9jH`Brp2AIi=b5ut^ zS@vhRTU!>~n6$AdIfff#)K@FpKK~g`)p>K4y_d|S0o+9ZJ{>o=9*R`+ydv8ktH0HE zY?XZ}d*n=`YdL-J?XPdclKMgkyS|}ge<_=zx%JIxEw6(pwDo7#2T* z#|2BLKxmFf=6#+(DELIpeP?26j<)?x4DOD@_dShdOq=a;w|y$p%4#nLA|p&VLgs>B z=zi^Upld8tE3UY}{~kFx^!@yG%TlG2gW%VIdmqb9ZbWy-d*GBWZjvF*$d>_{!?Y77fVjeiO+aJw6qqskcmdAL_E8_@i{uf_@HEPF!z8ncD%V1 zYo|P68*X8wQTx+3R<|Hhly&;(WXp{0MjNu3Op1Q0?`PJ1c@g6x-hAs6Y?@S|>ypK5 z=UY*ZRPD{iUL?c|sx81$I6T@mel2-HMVRxB$>-ICfb@&`@a53olbNQ0?C9kBI;otA z+tQzBCuR%>sj^R=d7sGARLM9PI21f+Wg!!^$%7?1JKq=PI@o1Pae(~1lM2a~JLuo; z>sXl8a@qKrBK862b*h}1-<(`+Hr-A`$=1<(hv1pQyS&!w`qtWnnRDU_w)nRg^^hdk zTPKR0T}95)3lFPM9sQ;AbK#R<%<*v1fv=Boa>4f~h}eW5xyhJUbk?dDpedXZQ=iKE z3At;f-GG?h-Lr{h(|+5y6l`1$4Na_T=o-5DWZO;@NA>}{VLs(2XP~FRY|HyfWY5w_ zb^7*5i_29}nPxEepZ&wGlL9j6q%?pDa5Ng>$@eAN)jz!i?0Z+M3-xBrS62fM$jWD_ z!P%?65@LO1RRg4VSEC~g_1_b3DtofZV1f%*ZX4_!GdvBuMQO%&H7BsCaHRwNWh85* zeo2Y-C^WH831%DTj5>VwQ#l=kN^W@EzXV3^XU!A2FBr1kDLJF-{bMbl*O_nVxc}|Y zfDito&f4kM;=Jr?nOeVRxXlPfAYX=V8I#R|(p19O@zxQ?)kCq%D-2m!8X>c5&vaI&N%?Nn6kW$4o+NFkQDM9u)X7a(=7a% z?dS6?1C^H*^wnSF@3FmPaC!fzAKd;wThuW)jf|$s=WK(Au7+FY6U^80yF>V$c@oJ>P zdFN46qGIVO1cNL@OCArq^*SPi!*W(#GY!|%^L{w`8TGVAmM?2aj2wl7XQkDC4svo3 z9|DWS4^}pH3W8sL|DL|*$J3auRv5SE$MtHbcPw$DuF1K)A+pJ&WIJqtyKA*OK3YXa z_Zk!!qJsuUSamB3RE`*=%dEc{+?F+N8vs`j5;fBHnUu% z&(%hB+HA;;jbWC?7O|x}MBUC8<>|YsU9y57OnZ7iBG=*kUIuM!vI9$9ne`3ov&6A% zk0JML`UmVzNGp9?M0SnDqQQgS9IP zjs>!p^+F3}ZMbeN@vNl@sAA=TQI-QC3y;AjoyjtYeTp2PZ9O8n@8Cnr3wz)EZN@SeV^)Y zBVT1_3r@xu1kF|y1u>rKJSGhV&PqB~y;RJ!Kt<(hn$vx<>pZhC%*B(`B(Rh;?eeVt z*ag%RB*Sn{(pk~FZ1;h_Cz#jl*1Ekjdo)7Us_8kUNXu&c`Q%uN;w|)0W?XIPqtU=P z5c}@YL`!MO*VYZkeAPR zCwHbx-@9gIgtcCl4)dfJD^Hy*B;wGR(`eWfp~v(Dp_+}yY4}Ut$x*1U##%0RA+!s8 zXs$s%Oxc9y?UH2$0+BXRkH&5Eh%avo)gH_sm``fd$o^#ZalO$^I)5)`G?OKP-pfW> zQOp}}Q>twD_ek@le8hAX@2CP1FfI2g-Y642D%ZXw7q#XXHLN-=Yhxe9&A@vl@6JmR;FZcbg&$`g)gIV?w_R zJoCdjc{8%TW|xvHLwwzif!PzBtc%4I1Qj9;lk*+^s4^tZd6z*3qA;f>i<5ekeO~7I8u?y!02sgV~yN$e%Zh* z8(vydQ`MF|0cY2fywjiBRjgb4v5>3?E2>NRYRL5A>3ni)ggfC3bcUh*6kaGv@nObx zvWphOY3|%0M*30kK^9k%&wSR0rTEaqY*X|#C?*$oKkFxKU-=r8laSNQSG16evT^#* zt*akAWV*dSsYOu<`1Xzw8UH)K-d+Dm1OQ!yMz&1*6=IFF@0mQlRdGl3dm05*Z^$D4 zmw+Dvn{sZ>!Rj0{jV>?dsCGC~sB{6(jnZ!eYo#%u4)%_+OO#0ZX5#!#tf zh{}MBbdWJh@+|izI~i>Txa)G$;P;}}T<$+@XFD|j^D3Mvbo*5$=Obp%Ra*_|BdTB) z*C4B=4KJp?Iu@nvleGpNHv!GHfEwoPvB^d!BQUyLk=)F_^VI*Ol3@+6#077VXYT&k z`Js742b5xFMwut(fjXI~RJzZ@JP!|%O&Xu}tKjg)As@pr9J}v?tZiFkbF%X;5*~T6sOn|nIA9M63AFv-&i1gR#GlTj$~5|v5p{u!7b;k7b(rytVcE+WEHK!PuaLI>o!J&7ZY4ba3geQo7QVVR{l=+xW_-44 z>%6sRpWZS-aJ6Q1@_`>Ek<8IO&1(?5`PE_<{O&yS0Fo3~qce|$U4tIoYzQPke=@`< zfA9~R?{}ydi|#@&B&ZP;na3*hU5XC*YqhosQ}9zjbjNL=NC6IBNciX_Dowv@+^7}l zJ={V>ekKUt3|tQIatrbj8d@FEa^ssj_~mYVo@gQ6;d;i417CyS->#e>y^OXkpOEwV zS~Z7?2xr-k(qFz%=$nFXwXWv*LUAn-#}&T!O7bqU!W{Ts&c;q$QPf13qQNtz@Nmd3 z>Kf!=)Jk5r1gSH!B7@FO;zrI+s0VVh1nC4SJh zE9FeU`cjPG##rOjdLtpIKd2SP3wdPkWg-kXcrtggM>6~+CbxzQ$K0&*4Ppz!9spnC z6>%mR(CUwdOBAP7n9UIw&HVDnha67>0iQSUiv#Oo=;NmF+G5e_IB&#VFC&!g} z>s$n|jc&rfl=gS2P8)h3D@G7VMt0;~F`QU+Yk6D{waGOfz3F%z(f8ros{G|wSb+!D zsK*P{N`3jv%QeiBxM9vxEjcgk^WhJwHJd9nYfD`x{01K?v)OM64#ujCv1Mv)w8s4{ zBaS_OwiGY58k!fEza2q$M!yBYI_cA!K7EwDRsZc8RN%G>-2_HF)a1*PxD>?({3vC)pfu6xEf} zc%jbp$eJp`uynVI+!ff3x7@!ONQL~lNaT3nC}$&8J&gYB_BQ_=erWuA*_E?N1q(>$ zBJt3QmWzed!k)az9Xz+jvADMnd%^p-ZG{%cUS0u%0X z0B|JmfmeE?Z1f5SRNC)C8dCvBonhgn_jhNY=o++~?FBg}H-#>y0C&zYIGpuHEm|r=%&*mP%;l;0 z+?(09%@X+=z=Ve&yz{vMO?stu)e+C54)Wd1Z~%_YR*EA+mBEGQ{FEYBmV0o zd*E0h;^gHuD1H{W?v(-1&0nakcq{SXLCAr;Bjkj_^@@QdNKBxR;F2=}fY10r*#pJ{ zG9t@gBm|@Zk>z^Bd){Gq#XOazl833gVC3}rICZC#d$pNTspP~ct_s0lI7J37W_{mK zZlDJfmwo%)?qgALZVm?8Ya!L4Ce$QvKNCF=fAW!OAVRUTG&tMz&_ZWLI(pw`(CD`@ z{8VUn5}e@zDfb)Uvm<$z`Zs`kXMqMwU1T-W?E!ZrE!=Crc%XY0OY}|lhR%kiUa1x3 z)##=r6H#c)ws5O{$Pa7;a`wyF58OAzvjk^wfj~060J8kp_ciZ)`h}r8%@+o1Jm8s! zr=ggY`QsXDff-#Ct?Q2Af}w)Pi7jwiaHqKT5$NVr=@zc;kZ1?E%A8mGSD|?TyIqyh zD6(0T2o1vnPK|UgOAims;VXA`qehJDNj9>$dnt7s)Y)3SN$yF5fRLxu4-L^CT==5(zR=%Hl{eRh+Wh$-S zuIeNS-lIJtkuhNQI7>HG4GL@>WJ;PyzYo7`g*R2LAnqcNpCVtpXSdCnj!E(6>&S@} z3o<){DvmDUvh%U8kiA`5!e314P-l#$8e^+3232i0Kv}W~O~&;%N4rEF_QDSyOSaUM zg#HlXAJOIF4YG4(ofG@^gveEsu4RpJYJpM`nT11^KSl zrRGm-2BoQ(Z7*wa7uH|TZ7z&#bnfmsArT+nZokE%jO9k2Ht5YsL|NskX2-!xmOzTh zLs4a0Dx3QQ=&G)v9v$l)1s;RS389n?jpl}*4GOFbc(BoL6?Vw={K6?;3KI(z`?xtX zH8SG4)TCn4S|7Hh3u{Tt5#WOgS&mlbx;zA#4TrVoY0Czl!`U`L*5|bt>=NxE4$PkbncSJ9RmTdd6S;D z{*8K7G|b~XOJF4_enmDW^VZ#8GR2-30+~t&0vg0zS?jN7;@SGF%>)A*{q)AxaXs%- zA8ZsJk5$1PJy51YCxxCgT0Y|H?W%Y@U(XE}I~u4imC!h#~ za>ld33>Z1Y(4!mXem-3YeR&*nkaqTeHk5X?*INXzK$I^xMHl4wLin)!kRptEng?UM zY5Jc`CG6xf#br`69bV{UpHqc{%~=&NRw{w^SnmblDvc{aew0*{Qt69Zqwo~7sv`wi zw&P!C-sdA5I!!4vC%0ZSMlY|#t5;{gb?ShtKj-%ljz9jcsrA5uRn2wm!mcxzW28yh zromLw+qo{P@x>Aq9%kOJz(zN4nq^akI0M(!-ap@V}`RzX`j%!87wS^F9us zB3f#$OnzOLi68%~Fr2W35?%_iL)|vgLJOysb_?>KQgGMmMT>PQo$QdhLSh3ZzQ1{1 zGCahLy==*1Oi!{c-b{yIzK26lpMW24E27B-#)f~(PRPb$9+>RGYfxA=+%G#| zSZ82BGx#&S%3~-H1V++=_QC|f_APU4|LLk7D482^FAtrfQ0P zsGp*S|5{|2@)(46LUg`r4jZosFy3i?HIv|7b*$QT4T_Sp3*WJ;9_5L;Ftz2aQt{#9 zI(1i2kh>CCQ=dThM$`#YJH{J3&>t%UwRsDz6E?Wq+b6j@X0JLS(g{%gR#+ROt-6Kj zdOD5Ag@oANKB~QV6ho{K8A%Cc{-f+J)3`UiIhNkhKZcAtv8tIz_1xZT#nd>1N%SQN7FMwL~eqrSE7(eko95_Q=U2uSe(wL+o8!Uu&XCM@sSii6{YAYf{r*;fB(o z;MYb~Sfiz%e1TJ*ycSpY64X>zca$BsgKz(q6cSUA+t7-6L%C|!wvTUfQ9?b}em zltXLNK*kbL#5BaMc>C8v1*R3(&o9KegsWRVn{g%g9YKz|&2e5x_b=|>o^tKdRaPA@ zF7*6le0~sj_h=YD&?>apteJbt z@oC5=lPeDRdy`ttUd#&unrC?v9T7qfrfR}kkR=wFt?XEf@SVa;-sLexJJhT=}+OwiOihQrKye8|wH0!p(I?tPvL&Hw*8Dke! zZs0zw^({*Tt^E=C$Mvew(Z=b`nM(o<8*6TCZpiamaCpm|KQ1ZAUX>4XJOGFU|tteo^Bcm81MRZnA3Yr$=Qq0CyTlq$2Co~qfd90}#S2G2x5tVz0R z`q7HC)@p{Ct}$~pV@9`;&~R1;%)PItlP4|>3D$vCPmR14R5dScM>fW&42AX}A!}x3rNYXKLQndN|}_1+LIRDbr-ijA4^|8IO4{$$MWeyWV!N zq#qs1`s7&uJ7sR_Rd>c%Vqf{fnC|nOoU)H!zGREf34F#xyg!1_3F4X69OgwRnn$gf zJlYlmz@*AF>ip`1>UqU2_CLi_8?f9(fNNT6m`VO_0+W3b zms`>D!mWc>ob>N!^$__+Cr>52TT733lnHcIA+=c%w;(EM&EDyn+TgAe{z+B;cL@ zQMNmFw1{o3m|Vk7Phz3VfWh(r!mm|ee}a-@8IVXzQC9r+B>_T$3h>N{8WGVoe7fev zt-IiY6bsj*P(QSIytEivVdvMEn*P=cX8(7;|SjON(nX!zY}t*nTz_HtGcJ9G$@s_+rA)yQ7KAhm6s#xe@(KnXM=@>pfeOP*zxCOAh^y)I(Lz_8 zLTMp_MpsK&*@WRoLa{*K96$~8`7h52_<9;d1p?i`1Kj|DK+ZP-@gG?gD7Xp8ctH7* z69|O&PdO2gC;Uey1Z1ik`2VVN0MxnjPx;@rX#bJ_9#8j={0@-m|Ea$Y)Mvaw@UQRv z4aiLY$WwsK{BP~>{v!ij1L*_u-}Z1o9kUxmAVr{1;tdEybCUq{w=ejB{5Oe<4*;LU z|FIqPskM#mYdd=fM-NXg zZy#Sj|IiO%;SrG^qY@I6l2cMYr={oQ=H(X@78RFN*VNY4H+*mW(b3t}-P8N4uYY88 zYjrS={rB|0)Qbwx>n1)v9zM}uy>8s} z0p562_yp{tgm)h461{Yz<`4@ZrcsLjR@HusQ(O;C`^x$tIhek;xfMFgYV~ z&LE-0NU`jvj+`*=3aT$OeTjt z%+ac!VWEGW3D|Sn+z(+bXz{EAm4RJJpX;iE@W0D%h;@8h`o+(98%&FI5KkJP@N^c_ zQTUN=$D=G_pJ-^MlwnQa_ZGHJe-H&utZiJpATW{}dx50@j zT3UHkNjoFboU)USy;+hZnq71=%912lRja81WTgz-cKvG6&b{JUw|h0^#GMFT-MSw8 zu6w}pt0u1jju$*GtFngWphE!N^OrFZ=yeA%9}RZc^^bP-!P56 zv05-AQqdp`q>M_YXG+kPpu7n zO(lP(u50?~4z(bJj8~KFxAVl5Qq}OfrrVL6{0V>C-^!Atp}#bi1JlY&HLIkgPk2N1 zaRTYNAn#CD%6w?1d%$_5x8P?pWHsC;ZKgJXQg5#?JM51B>i?W&yI3af>ex4G%CTL? zY<#gz_&v&ce=oy&O%jzK;M`WnwT)_MBOezk`b|a~g`-K=G}fNcvbmHDj9H_qJwI}l zF?$viEsp8g*M&Kn&?^=RU9MZ-3EY7Se#6UZD8m0NL^nsa>+H2})!XTA=I`H#QYP4O z>ge=Y>1KyX85L_s0Wiu5`?N(Cw#Liphd8u&-h2Fqu>bi=3_?MpW{RuKjG&HSy;0`x zH&}Y+3*#Ks1j(9ZG}caOZBFD7%ybl#gj5f3kl&!xvx}o`Aw0V+`Bl**zbA0`+(=-< zn{F-NP21GW{aM7D4?B|HKbu8G{HS9@>59;wH*-|f*q3X!lgD(gGlTL2=j7?lLr$wu zNw?5+V_E91O(rQR+KZ z)nqec&f}Byz0H7A{^^OUvA}lCzw(Lkj@x6t9c5N3nsFQ`o%R^Iiw}|OW>CegMmb6K zPq<;EYDNHo2Z?Q;+Km~%XHjwQqN=uSC*3W!hUL|d7xskZ&9c@_GdZ5)-H8?_v<072 zZs3jnOcJR|GdTW@!L9%1Dq@N)jpQnrs_(!R5TQCl48Yw$3LhfAQ{;%!N{$Y|)qkC)zf!^)#Qki1K1gF~u z=z(v~k+4g5+4Q72r9?aWB&T_K#S7eQSbJ&uk6Itnyp(+O^$82Wvs_#Y`KXTP9a)s= zR~m9v|9ij+C>Z!trCoKqsA<-dKPx!hT8G70&oIPYs;SA=YX12r=N=@#tG@e2{!_Ls zgCgoT*WU~rrVd-t?w=*@~ayY`!`tvfA3up?buMU zX9-HkDSKEcyeb`$scw)TkU3<$DSsQSq$~>|Rxoyc0l5r~hscx~J{dIV2g{Bmt_J^R zya$xpX2HgPySLVTkJ!9OY>N}KsTPgYBpu5zks=_}0ad|$`LXwh-tkZ{nI=-Z65NI+-co;x)OVrhAm=yNlCeH1!Y5(3Za|&h#9XTEhJ(Lf6On#buc|+7xll z%2GZ_Mv@Xq6h{DX04me-##TOf+<88;T1cCbIfapW71C#K-izyG@ipcC*<^;7k+!$1 z@@)7~7TLQih@IEYEzJ)udi2n?@m)E58!t?H8(x=X1;_zlo#kbRjSluAUsb>3 ze0k^}oE+5~f5riUe0?+>yJV}AaNDh$I=dJ;%>N^22j@Z4Js@OiTs}v4_-lNSVYGgZ<;~F(8+B3i8DLSQ* zrndB8G~^%yp!&ipmx(E)%N_5}T60x59a96`oozoWCU%&NdtWvBP1F;y98pkmnD)yU zvoNVBNkNT|{)82<7q#vbYR(Z3NxB(#&w||9*oHkE^P+vT8!{h*{q=2?Vuf>3OH3Z} zU&7DC4e;G2_ms=1;FB_TBUCL#(OAzB>O2D#+AP_w`g{Sl8IGhVu%8!ps;7Vli(rn*`Gt1R=a|#}(>YGT^mtzR z(@)K@6KcWM!pufdEg>R)2}{!j30pve?5)X^v9$V9@!#pN9BvT>u>IL89*xMhVJyNrJ)tC|OLzL0I#(XnE&3YYU z;B1htCmr%`sdV#E%2-#ej(QXd~9_yt=wr z#43HDr*ImUBDaeTx2By!ZuxLd$Crfa`k(gz>OkPvd%)iGNA-RC7u~}kw+;G@>x}Kw z64GmnhXltcD;1wSSo!`{sicy%`VcmWvVIUVr>0u%*goCi?s51Z<;nTqbmyB?%VF-c z4pQ1oZ|3QKNIBJCqLJ6=1fL%7Dnr{ytLU3>r5^w=*RAxmAL)SRfCcypUby>V4ullz zWE;qmODW^^5`{d7e}PN?Lt2836-IwC+}7DD&{&bcdCp=RF5$ez&joDtiFRnsNZ1|g zjr$bajX>5vD=nZ87!5mSKg$gEuF}&U$?w0ig=TPMc+lk>i(ixaTxke7_;uv8T-*Z~ zw@%X<@qk*nWf(mk+}{ck4l$sNG2qA6)-of~Q{V2iwYKE4^gEVP^bqkuo(a-GZ0oaI zQcya)_kd993<4mzF2QnTLb+=rVZgqdpk((}edEIi(iBh8I|tX(l3xrA=BzKa)-JZF ztu#yH1SEl>HdY?(2Rs+RskC>!)}hN(vMcC{8|TlQM_??He9e>N7kMngdbG zAuYa@RpzG`&nqyxg?mhkACtA;fh?*OM5DYW()kB?Ew{jlZKki&%k|sYV{W?5Sy1t5 z0aqIKJ`NSXW^8|aZw^T`Y+#@fx+6Rj(VzhmoQ32QGS#WFiaVzP{OSQ{Em#UHZt5a> zc5d)GP0Z`#ESIf2Gb-MXT3hbN(o$m#O`xd+G@Nqe6jL0wc z5Q+WbYVg`T24YiJTL9v38IIr+p8XgrxBc?h?umg7(Li;GvC-ht`VUY;em0ZLi+5_u zf7B@+q#H!(CiOg&j}fjbvE*ZUzBiI;W(>|B9Wsh5>H-_FzD+Fouyd~ULQp#B+l_=M^?`cWEy8~>SrVs=I2?wQm$#A+uN}@ zusGo$V`i_`mEFr<4wa`hNZm+jk|wraEtBw|GvQ!EY_pt@!mS$>T9fG*sdE{(Vj44# zNxj34+RZ8K7`ObJo2u|;8f(-uLWZZ@Q}qeD7WHCXJhHho#r*39{g`a*x!=s`FnO(N zy#;n{K-oRJLYamB=1PmH%pV#EENE?CaXPziZ3zZiO}XthF+m8l6Tc*2t7LE4ogd+& zD(4LspGt4&|5`9*c^OsS z?E`|yD%CD*(7}O-(vebwD#*I?OL6_~VvXhSQfeh6=iCpE&r2@E3;g0EjK`&NS2jqe z64sUp%NgUX0y&Yxz=RUU+(mIY@6C5`3<*ZBWqul zK6BvVY579qYptKU4eiN8(ogtq=tA`}qnhm zn4Q5AeYMN`*2IYo5U)3LJV5}#D-#;l9tT0Ojp=FiO!m>M(o8^wdunDU?d=UiZB@CA z&fT6q!qY{G?ItU_KVVGyy;wrJBx(2JNOJ@uZsA{TdK?_aGVkE8t*m-83xD%%FY!fF ze^e~WxEyC*M7v*#MCW-yNY+`%-HgLJRQ{^EA-GUyq+c8PV~5*O++-jt{=Y?-KFCf#Tp ziR2ZPT15|uBqsj34JEd>^G>AMJ}Y!$lxA#PXYu$c=y_Lj&Ep}+`!Cz`+PL59lvkRG`TgGw8@9i%xq*~9{CX^W*{#ptgW z`n~dX3!#D*x1yp$PM*up&t+!=bHB_Lm`3i46Zh=ufg>Q#gsYcYVip4joGB89unRoA z18Hr0bC5kDM4h~dUYz4uZO#~)LHcc}Q0apg;M43r!!CDVnW;Qqr<#X7Ox1h# zHG8~QtjZZWCetaJcCd(LS@UIUL*ZWSWHoLL`DqT6-EW%`|NI_6)gRoU`Rc>=!l$BT z3)#E(u(&QWaJ`1}cdsOAw55WGJNeVT**KIW1?T+w2J?HdT+3TYw@LiGQVorPN1*S9 z2D#TM{Ydc;)y`{h%okZ#HV__hw@=)@z-`Y|Ya5QNk&|XTrv8kU+La9!W?yRSK4j!UCQuG;XQD^;w>E?0jX%FDv6)GsBf zaq5tAk2M}UNh*iDiP{T3U*%Oe5<9F|APPbAGwp1W?5* zRDi*NqydOCCnQO@(N792GSx~(H_T@{lJyrX-9Els$EXbV2oHQD`66wSEo^v4|-jP*Pn(Xm$bt z#x90krsNb^UHg?$$nTjY0o|jYwMht)c190qygY56GfdtwpRN8~GCO1-9ws6bcGlNQ zV_n+S>FG|vl7&Gc*b27Cr!s+^O3Z(IZa7xe(C>j$&4F=isWnMUK90g2%sy@Pr+4HZ zo2R)Rk@ZRtp2x zi7kT!4+PX98`qhlKP^=MHtCG%ix1|My$j8FS{wjq-lX1m$Yq-3vFYQK5gNmguG7&{8< z0Xu7--T6V$E#A=3m$6WM1W{+~78yN30Zq&m-a4AlD!Kryp&(&(F;FPm;_}9~W)-T^ zgK;sLJy=~;HXxc?zK<>Sp;mIa-n=N?+h{;`3yU_&2Yaz|!FnRxWFzirxvE%~8{Gn$ zlpyJNlOf$4UY@9C;QR9%R%@wO&#K|;lTsyd&Q=Ivmi92w#P-&7O%1;YDaj9%%AgD` zXTw*qz);{iYAOR(B$;dNy426ZXh4252!4245>^~W`d|UtdCl({po_E@ zHR2c6Js^wfnri$y|Ha;ZZrjH#){lGj1ERU}cZvjP^tx(G>>)zpq}K%kIHU6~QI_~6cIB%ClcnLw+#k?j zbNG6UT4^|EsjC&;+eIkF07VlwPr4^J=Rh8A2K1;gs0fT8z$S6@mnC>Ekro0quCCY|_hddToplw1n+ckL+~sXJ4!aE9^FzdD*>r3%C8eA?Vw9k;SXVma4Qpv@HcF}lfXb;tr=uCEt7O#Aj5 zgQw~~^v^k|Q|SbJwPzz9^r1g&GbwRo1EMXdHhxYGF_f=`bLzU06NM6sO8Eet$K%xD z#B$?YyiZ6fbvjN-X?3kwfO+oAMM#?1t&Q5I$5|!TbD!m3Ibr_~7c_UUG~c>U-Y7)QC=O#>$v zeeBbaC^|v%M^yf;Wm6)exwc5$a|JQ#ACF0Y8pD0wZ1_EHcp4pGK#`%3>?_oTT{0xg z+yi>zGp8ETpSXz?2NQjXhx(9ZE=6ONAN_$69Nx;h(jI1!{IJIT!11RK!bom2})pTUC*qm`l3Rlm#v1r-vq;`U(I%!&1kiT9SUvAL5n08l+%Ya`#x0#7QFN zQ&>!P;3ws;znn0THmhV$$0N|hkyp6>U=;^Yu^F8mm3xDCim$uwQW{MclY69mY0>Cw zi3YT^t*BQQP#l7_>>jg_ma#5+?p|iJNP_i%)b5k<)RDr9v0{5vjljVQwE8^QajiSJ zY%p;;Y|efnjWr=as%KQ3;`V)Rar-$xEN-2(C%JoXz!1d((IfAwr|B$Mz&Zg5abF5B zUQr#{@*9k+>WpnynUKynL`EO~-bDi?Y-#Mtb-w?qLnjA4Xv_)?l(lQqCw!5eS6`Ph zz9#PzGAC#%tgTzfOX{ntApG_yPC@^ljc(aC1wmI?7Nl1;Sc`9`xInKbH4P_+zDwW| zUVjP@M6aA*Pg4wPhjTN<#VUDUR_Prf#xLHfZ%&>W9xDZQ7_}5{XY_nVzZQ-f5ECYg zy9bo1d{~>&t`M#Ig+AdsIxbfUyFzW(pMy@9H`;oSz*J;4ZEwdp%U7Dihw2i{3>}sY zw#=A7D-vhCx?J{%^{y1||O*B)NEK2<~)78Z7EVQ8ha69B%XQ%@1@2demMqE@BSyN5+vm&&mR>ZjtIj21s z-5@OZE;p2yZM*jX0up6O*Gw7AE5K*Fy`=B82sy_KnsD1XnV#$)Ww)~>wNq~QfCKv% zH;T(u2X90^RHWy{e}&?$`QdB#Ij%HV{xH&8Z0d%nVH<9h8HDPep|M?0oBQ?Z5wXG2 zC`|YxlW}=Q-#Y13+dyJ;LE4w9xhEplT5xVkPk-Ucn2KLcbWEe1@ZN_fv!N3CqM#s zJ?I429aTcbs%@OtDksCrZwnuRaH6||9Px5nttO?U-mBtqccVRdPZnr<%9*mHjZ2{F zq`R;^wOj+-5okuXqaW?MgVP}JaAC6lv7?pAl_^VU3Y|wzm^YS}Qsr-(3(UDfQvL628VrH&t0hRL? z|H==NBr2>JaQA(QKVeG=AEElzUwkyzL2kvYTPYuh?q|<0x=ure*+qF%AM6GES}P`P zQ?ZBw#&gp1va$~SxsR^Eg%sWxzwc(6`cD?MGs(Ls1jb5>+qLDP>Szn`5D`vG*e}ml z)Oi%z@s^BZ!OjLy$V#Nc(7gHYh6p#X77ZFFbG*ePY`bf-nwv0r=O!okNy^%rfyCE) zRU#@t{5{pyuJOb6dw>H&z^MS~xYa#?5aYUB^j4m_M#}d#ph{#P`xP>8((Li z@%@FeEM{kF$CHkuALjZJOgtJAGuP0neZnqPd+lX3G4k8a)_xK}Y~Lls!%l_)ze-`uAh&4M8vN z#pnV9Ap)CK$-1J>=;0mZfJpKoF3zOE(TR6^5El8`i33eLGGxevsG@MD>r~lvx-F2R znp14|VEX)a1ATVq zmN+q${D)+}_7n-`m#^Xbtl42z-?y9H?OxyFmv%#gCUfrrtzwRMiNDcAHYS(tY&J?q z9Qoi7me|}QoO=Kr<8k>GSY>TVhFO2CH;;mDC4%b2@F~>7m)qxJ>bySV(CPV%PBeFt zgA9lC$AHll*X24s%T-as;Fte|?#( zGhNFhTP_v?Q?5lejTCa2LDce(#>+GVW|ud56JM07Z45J#09 zllq&*_#v|Wwgmp}CQ{Bh^-hf1KuFqk>vZ>0(hPOf8Qg^?t*;Crta(YS8+Uhpfby4K zSF}wb=$^GV5B}TXIx9Z%aZ8A8TLsRU>^ng(mj#1L%b1iLnhCb4Ptr2e@OG;z)uiIx?;qahC+HYkWmNlWDs`>@OD}Jdl>tYp z{gDa_%Ij~@-pj|!k?)j9LHI%|;eq-ij&J4}qV?Pu7l;kHCWly5>&I$z?WM+QM;z(h zw_$~1U1mU2SB2-6 ztV6m~J15+2gqeIHLM}zGwGNHJv47@m9=jVZDxI1UL@q#e{=#G$Yr;+zeTD{9e4-tJPzNL2~c5 zE`U*>K*^<^ovJRCNG@Bp*9O~T-n6F(@5kv-_Q2S!DZ!rvUn~8g=~^u(u3xd~Z(b)90OUSc+mi7plD$*D{Ytt@wH;F4%77Z~kq_xjQEt#$4Fog0p2{pA z*!Nw~cyAY%8Ct|5Mn+giFHYlhByCTG+CuIDM0Dfb%Zg*n;H~Cw7Kwi9Ymq@}1c)wI z#AD$Mf#^rz7f0RXO0FWX$LZ8-+Q`J1#ss~~bC!IcDT_vy>1HpVXIeZ9%M>qhzCJz( z5&H@N?cxLFYRBG%>+_8{<2OFSq2TbTxMX3vvrQy&NAPpTENa+3k(A2p>a8{;v^D_N zKDSO(e$O4`#B+o`rBhHt5=OX*Kf~6SJLVYV=OBtad2{|}M?fSEZ?+-bzRV&$NQ22z z;OrsqiC;nC0^&NoJIm{(Pk8X_?Q25gQG!33>asWQ;=h<{drl+d)O9Ow7Du4teju=+ zdV|)pQ*D`^rx(?D1?Wdl9wHf<9BPnvkcY?NTJ`W-I{QPtCapmuDN*0%2RX-m!1rt_ z#T)y>Y4a=vfdvPJbq+#!h?rB^XE_(Gp*;K6`t zhijCxmC(_OD9C82Ph7?|oN!K-{f)%H^)IrIkZB?=Y#OSE_-?JZ$NEQMHCmy86Q3j7 z>(l&6zD=rKnodL|4?$?1Ep6TF4#-A_>I!~-tGI&q{}*qa2JjeAs*VlOKAKt+>`&r& zX)RWF5BSO_En{p={aum+@)ai3SntzR#1eNTY`J@&zg3pGpV|x^d4*Qrt~sSq($ItN zx-F~>FqE;miwa>_6fhBg>HvEh3;9eoH7LnXbd3hS>F1c+!g5obQU9EC(mq?yaRY?P zA@oQa>fn zn-09hQ^(CaXmVuft;{iBj@5;yzk|5-kr--ZbBHFJ$`AN#TCan^ z9sG5v$7&>f^AYDN(@yN!ai1R4XcrUHhq>Pa@P?XDrmNJIgKk;GnQK9odXUG?*P6U? z>SjmouC-B&_zD8Ev)4QYL1HY{LS0H^dAzlmu5?(Q@f<2QMRr7Ij7Z-3k0P2x9KYpa zyBC6`o)NBr`p=d8H3svl({;3F9)53pzmj>GL~$GGthq#tj1FM-DOA}Km_E{*k&*i$ zcvX9XbMpsJv_{8vIkM;6PSoFlqkz|rR!6AMdXdJk+wg^GO?vA$ zyG?@)uW5mMK!(w(CXzlAg?nDExpL>fh+5ElBT!xIrFOC4l-U=(skQu^_hAuuPa{6A zR&WsS$qwkx9a%h)>=rhrZD-L1Sl2T6Ne&VP(C^f5TN(k_x$j}Fl&$9U<7A? zb{Qew;qehoF8_WYA?RW!?H*7G#5w)zv+4D@7C-OSw>lp1vMn@EkKpa*8^*l`Om4eG z(|}5(Sbp%-d15=B`EK$$(oLJu%n9!|eZYd|pcvDQ;=6`HA&J`yy;{Lqf~-ZP37^vvrgPnX;-K&&)B)5d+JqQAj7#DYn`^r z7%Bf2_#Q{+`s312(dV8hpnh4ElGXJP6h%3X-r{zQJ%_rPO+XEI@PY(g24`{xt zBD@%X8Q@!@TvxZEe+_cIS}sIEL>q27ju{ZSL);KG!IL0c)j>jw1Dz$Bn zIe0_CHxU%HEi|l_8*k{Bxs9T$;pk>3OPQo>C98;~U~Y_&yQ;?}{B?wJ>gBRZQRu0T z&9c&8H>z2k4Uj^@I-03Vj5jdfIepS06Junb>rUf-3+gI?5vgdqQy3Svrlxy2yvPu8 zf$7?pdP^lE$(GhuP1@CR3oGE_c zYv%hd!hwQS-A(Xy!qzT)T7E&hTVI|KTO%=LuIGcyU}0Xef8j=~6Sih+OSn>v^_B?1 zgQ!vnw$oftfooyEj^#_ND^s95bfnBS*#iDsK5;s37j2mk)FIc}#8{DJFu`D7=7w=` zDxVS#;<*V;r8~{5>|&ky!cNN{gk7C?&1BdcQ~TZnM$Uxq0ae!X9&TccD9>Nu2$3=e zPA=*gSBD3&5G^;y?IQ!pQZP{K*rLQ9B9vT>vXs6tuNU}2jS5y5FUaEEy*8+EE|4kK z>T_J;@rHJarao9Dh~<#j2=KvWrx%C78pAN zvj})F(ZX*Iz(8G;Zi#e0c$n3av9~RHHRLlIwSV}h#S#8se9-Umswy4>cH%~6lFGu7KJNqw{{0ibC^RshUZ@C;Z zYSB$8Bwu76GOgg9a#8te)J$mT;$w|(T^`nqEQN6uTt@Gn@9M&fsBBIIS;x|~UD~Nz z1(Ayd-%AIT?K0I8pstU>AMP&C=oXc>q!Yl7vdG6RqT8W4wJGQ;vw4U8eyp_UR(T`i z$GCJ&IPaaKe_44KMBYkodR59YMQ-Wq%gEaq>_e1{#PcA`dAo^?V#$sLv!592zIkNd z19%{^f=t&b8~%w5dLy4|McJb$SY4#GMehhnCeY9JE}3<%5yNAIOVklj;sEY@K(wZk z<#AG{kU{t4Ia_(|!}!+>QW!uJoqArLqlS1`rT`Vcp_!sKHLW@)zopwhR#$j*PP<1%BQMaTo?o_Euw|+FT4hppdGIW3)sJaT zp1CG+uG}Ovo#vXXTRi3tls{JU9lpl8!rVcaEG;1_X;@zubhx-uA88iaO-bP-38A^m z5XZYq9hWAfEBy^l5af);F43`1OS(>|DHUAi`1XOeMQKH_{Q79MCN~Zf%}m7Y8}50J zy1-#PA9C37BcC{<9RXOsrZ5^}VWA5c)eMzpDMv7?N+KZ4zDEQ_{0d9@WmlDl;QJ45c_Qj#VnUNsQ8B9OB z9{H0UoZC=sTeRrk1MiTnx5?N+w!G~~Y0Yz~2$waA7Jpau@=FeK52aaVJ@tGy#h2{M z!_BUy4;Z4LQiC9`O;{S;gAB4mp*nb}hp8sHIkQ*tK)(4dw zdagC!>a@~u@YZvW28~QuV+cc=>EK%MKUlkulFZ2O0%FFpuSY^W~Ew8MTjtFG=v zKeN50vb!=@ZKV|7&b2(OI}=-(o;PLF(c3GE($<%w>pN^?ted73dkH2Gbs$wO+kIMj z!rN^ic5t@x`|PTRH}3edXB=#>qqSTmn>#pb=VD}f``(i-2T616Bm!EK&wRQUW7v7x zNgjD8>MT45ag;4tfnWj};=~u!bBT~z^MgeCRL#}>Q$F+HD>F;%BK6yO6 znVs>CA#~l_5lWdn_NdG69kZfiiF9~p&9q1?^H-tt`}s56mrBlQp64T@wS0Uj?%BFp z^M4&3+B^i}*`xhHI&Lk^4fCTNwTy_E3+JeoYiMWk66NtwaA0*_MWtTcsr*~Q6peH7 zQI8U;&E3lJ4L5-p^e3_J7|w8&4(~9kI_ArnP-v`q5fppB{MAN04?3(-^Kppi%)h7 ziLwFZ0_hk^5ng?&A9GT8GQE(YbauN3QXDVmWpk!FhybQY2mse0C5<(;QNy$JA;!;* zd~T-4HU!-e8d{+xQo>$sD4g`@E~z&cwjK(4by3Yg@^ClR7j{wTXD!vG!k3uT-N%4= zQuvsmHEYpp4e)VVQJ zu=Di7C#rKtDPNEYN=_GzB>wYs&DOPWx4)=FqQ2*YQw~aYe<}D_#3=ea$b)xN@kN$6Zvj z33z7teJdT@9B35?9b+;b3=t1N;3zp3hyW`Eo@rN%H42%uCS=M$gdt|q(4iI_Ti1w##4gf;cL zT&)%fC6MO5PLEk#N8;tin^t17{w?cY|Iy+9C~UEvB*>pzk!BxnIe6I4RIGU|p3JM6 z4y=~(eN2$W(0!dTxyN@X5#juf4{wq&A%~0zrQPuwt8(5XW0Hmhf#or3h)G%5V0Si$ z6%h&hx37RdBnZ}Wcv&|0KU4#}6Rwa}a;l6hP|u6}s*3!80SfYCn0n9c`G+X+P$x*z zv@Q8xDv+%=$B+5GO+$%K7p@NjXa@Szt}!&Bl>TbLb<-St_3^^w)3!j~i{tGO`c_cu z!WQUfMJCUyn@%7Mj+fM}^8gGr1l#|VHFnBg8-DLX^=iX)nN}2;aV{QWpQKg;@xv7f z4@~NtC_CZyhH=zyy;|ZEmxvZPkKhN4D_p=u5y-L zsuLuqrLUp-$x5pjhU0uE-K#KJLo$AWpbg?bs$*>{ESdQb+ub)VJVKhi>SvCfqRusK zk9EDu8rKF>t)CoK;}@W>KqG~`6aGcbl$|MG=8DfOjkS|>2r}LNMu_QVu0&9dQ-$I{CB2OQ*R@2#N`0Zm~6$ zo?AP#OO8Ie&cV7Z`JUa%uBQ;xIYf>n5(e)MU@7uAsP(_9$7v4V^RB(p)E45aBm0p9pEXhQ|C2ZSN1;(#es+ z1dgoM{)=k?VD3X??yIC&uM8zFknv~D$8q61;f!<6Og2C@(*3@`Puvdum<ea9QU3JocR z+C$8g6hFsQE&=|fU~Tz5LOz`{C{J+Om{)WrQ@XA@y9RDYs~RL5VADjC6fxPUj|OSb zhU^+3?cX%i1i9}rfTFuBn)OnN*e2XIFFejf_iym2+!-~*ZJ}!Nm=daL@XP;&+4*ON zaK08N8WlfbTESXsSsNy-(*EFh4-m;wyA1*jiV$Xre9;?hal5x4)f4Wmo)aRyIlQA}QC{t=c4;#DYajizfqdZKk*S%rjWY-Ntim5&M8U zYtux*IA0YItT-*~G&MZbA>Z2aM^naDrlpr?#NIms^Pn9bVSd`1j9pmSt;Y zMHnkfKPcHFgL&mCJ@ah<6rR&>1M>{BD~sfK*&3BBN_EoWudWZhVjjJ~ZKwT^MU?CQ z2|GCoKs)4Fm% z_r3?rsa-i*y4d34mwkWEzw`;PKHZ{~9d^U|L4qA*1|D}%sKwx`FaDUSzz6?AaJTA% z7Ws$RrCLj8igCJxbYjIOuNZ;5dY?`QT-g$>siZ|`;O@wp`jnESL!;Q!rrT1V=L0Vt zA$uF%oV8ijo?YZb4SUse(APB<&Al&jpUW`*kha-%Q+h5K!|AB&5 zX|Y`Bd4&$|2v{bwLXTj{5}4q|du^btq3#sF&3SNTo%A^ zx1}Qcg%XV0pS_XfYh$sQdyD7@13^EH8mvh+G)nv?P^WOY2i)20bgbH}6|=h~wj~v% z>r~{?SyTG~tNBts`*hQ(ZV~NfWd0&8!WbnDx(F+kNY?#?=+q*9K|wK$iPGr8kO1EQ z8zC*PzL6h8$2@32Uw*ubvgK{&ET}SjhY)Y1F+C@(lXRK-vsxl%^F!g9s-r~)B=vcu zX3XtIijcPcwRq_8`t?~E9&1^Va)GSNM40@51hb&RlHw|6Am0Q3ZQo)QviqryN=*9I-tt%r-=e16(LfJcw9s_yowN^+z!NRay)Ndzq8M{&J8 z&}SD_&p@v8Ka?6{WZi*ttyFzaItOxWO2d3|c^=*_sCkTL5`iDMKXkwFUoxRPvfJJQ z9+P3We1oyIdGAf%j%3TSY9Ac8jiIH5ORX!du7|eLU(3&b9@~g;031V!0#MW0zQpin z-cxx6z$TFg#v>Au(QxryJy>ME?#%(eCXQQ5P$o&$n;mn#Zq%)5NhV$axb>wLLk6>~ za%+Yz|EaR7(n4w3Lh&xVqt*TZm9tZf@y!Fa{%_c_;ocT%KsCAvW@@r6`7U5pM(%|( zS}U^V3s>7z4|g-O0T5N&oIbNkuq|8oQ@mFf;}% zhxIveGD>As%Kl`+sL&g8;~yV-8Oq;Aw355Bji>WlmpqjuQGfnlpYQ+aeS}1ji4&kN zuM|jSV=8m(P~zEK5<(@=i=aiT-^t{$^rxCjyjD@xSHd6LdJAUkR_sj1&&`ZZgLc91 z0Z$!BMeIq_LSXoJ&9&ntZtR*K;>b~Ps^Kb+DipL>HlaJq2fLnfo2W#l=hW;L0S!Wo zAaP`#P7k`G9+}wohF`AUxr@bS-z^&MWmB%Dni>~ar?{pMS#mC5wKbP;Q{G;xF9*I6 zS$n#!61QDq<-0Db2YHTeTQVrPKQ{{TZgv@YB?CVI0>-D-Gr7WRX@~aRjiG_c@ zhY>wUbCRd+L1IbYovTwUHOd$4SgLq*2#S@Q-UEU~^D(}j*41b>=9UH+JF0G-I-HQJ z^V+wJcmSB}&Ok$3ko|C8pzorm2&N88ZDme$4DqgTXvzTwC)Sti=`C3A!jA@uy4_n2 z!?sy84$fL64jDOXA_vE!U^E<^rw=084ooNaGp;l_NEuEow;o{{VNzfCMcuIovCi#CXe)IoCSz`9Qkthl^IQs-_YBrK04gDTuX^Pl>)JXl%Kqw#AjWyIj75-Cla=vZd}_ny8nU>V zMCG3fbhsA=>iqYeQUh^hxBylEv9?Nvf)-86{+`KePc+Fr>-VE(%5zT^}5H{^G z)G(`5R8gKNR~Lob{o);N&M4M570uFW>0#N$T8x3nr-zZCI#-id zCpEkHkZ*MrOK1mJM-tZqS!N;#3ol6z-1=Y4MeIQwH?K36!rS*S9yObBPf-Log(7eO^%m~Si-an`bLH(V zhzf>h9vIDMnI3w>)?*O1;~$=3J$ml-NVC`d5Q@XQdrnKRCtvU3@!R|)IST4A+kwVb zT6uqE9Z$@|Ae@p}2+RZbT%dQ|l4B0$7q$3UNpPO^yL!#%*d zk#Iz8a)XW)6XR!6yQ+kNTh@yD^Smyp5gdB<;8uU zAKzI)oQCI@4BwzA>Fii0dc-)JEDaEKuG;doX%@6u1&QedF4tQj-`; zxst)u=y)h4l<9g8n11=2EBIDOWIi!m4<5Ye&*Rrew69&yA>)=!|U#I85JJZVF2+iffOIp#CImFV%;%iQeC@Vd4 zv&aAtp$TXrPlK0qY(=wk_wb7B~4+2;ohL(m>7@*vns72HAJBHn@F9oHtz!p;r& zIn!omZ;OyhvheRZ{%1tUo-@<_N}bf_+dPOS<_d^%Ur9|xerboNgjA0|a*n5InfcFbM=3EI2_E+zG)wxVr{-8(fD0 zCb#q7clW-#d*6F^@2CCnHqSg=T~l;-Rm)VJI_LaqNl8eZ7TTdvEVy8m;0kfy0$p7M zpQgdCxrRh#7mkq5=KxaldMvDY^70h(m^G)9M#e`G`512wPenW}EhY4#6v}MO4I)cC z*-FIId(pj*DB%J!EHX^R9k7TP>nt5fOJz)Vl!S=)bnEcB33 z6`09jZ%3$@IlXZD%G|kHmG>8hd+3o2cFDX*nChOI|@V0CZof z%v|j_vorI_H;Tkud;5oIc(oa7+`a^4bSRN>ldK;JG>)*>yTL5KZV8l5tRm+9@EhM@ z!VQB34;gB?z`O$nf`80YEM9QAi(OOJN1NgI1{$ZzFbC%}5Oey|-(`QPI)3!gB9~f_ z(p!5;6@i#%)2X}kAY<}H!;)ZET1G?Iy{UyQL7rhezU$43S$hHTC`6aMv&+h=x^${8 zF+C_Uz8%~w1t`|C)EWF+$ro8pKyXJ-Ox zK~kZWG!OOOioGQog`wbTlW&lXjL`k8FQ&(}I-_|uZYHG4_HpT%R@Vl1tBqJE#JiK4 zcg7jJq!)9Sl?iw6T?F%cYS2k}b{cYQxpCx=6;a!p>|plE>KTWJOg>Rz1;6AwaX*n_ zD*$2_hE9ABkoFX@?X&lTxoS#Y<%yZcU{H~0UU(kd10|blfj4O`d`8ObA5tK>R<5Qw z?!(7F=P8%Ds%zVtUJ&r*m1c;%(lbU$k#ul*?rO zxFq@wir+yl`Wk%s;`2QC9EvYxKEBUTyLgpmk=|0`qPndgucn_9`$J@tg~eO!dlrl> z^k3%>{<;3ovt<8llmFRm@?RZ{me`wjr9AqexTl}?xR>YVt5V;{4M!YO-JaP))0|CA z#_(5G)8YEMQ1I&K9BpL8ikn-QROZmfJ9cKo)at3f9rbGnW5jRJ{zcL>8Y~#*C7_tfJy>vI=2fRYCxa1FSj2-%Q9H zr`{ScDX17mg*FTSIEf;fSJGxm^^grB9?-p&IWEgBkT$m~!pyLIKxX~!#h?%FkB@Oi zco%nhU#zcmW_S#KX8I`TveMr9C_3BjCa}APSH-=qknuj)?grx-44Mas!EuR_P_rHqruZxCq{ zhxj)drMi14k+uEV)1PPmg^FG|0Q559_tqR5H6uM1l6!pFTgr z-`%>=sC)c^j82%TlIFv`K5^RKDZmDfo`vO|wVEN$t?6;4()YW19kAa|9wZeiVa{eQ zGOskh18UBlGH0<6b&vdD^n8OrgW_{i`w+WYp|Y`ag)NMOR{umhY;^@(bwT#cg_mJ7 zE!rrXh31YuRlz8RtY2kJ$Fhrfo6pbsc;AJ$$EHy6-s&godq|5)q-G72?3T}!RUsBR z2^~=|y$?MZSKZa~^??pLUWi_{a!6ppiu3oh^{cZMZLZV|e=gDp_Ktizm+UUp?prob z&r45MQ})yyOP^(D9pIw^NhrHqWfI&nTd+kbTe6q}vrlT9v{&N+VEr$OJcx8ykjTiY z4i{qBNERP!&(-F&_6hw$NwZXd5W!KchXj0!)H7Dr(`>ji(NcsdV+&wNGGf-vLxWHx zwNn)`NPl=V9@uZ=hT za--8GY7=WhsOg!NiOFk*=HgYkNCyE18)d-!(xGM9+DYu3n$~xO)G}9~!ga+)@Q_ZcMuaSm^|6N7v{hW!_30HglzfMs>pfe z=rMZ8sgvueU^9NhZ25@DUA>WzYuE7!`L#|uZTe0j;KRJMU%#qzfQp3OcK>iSi=wt* zhZzY2Ri7?WWA!RD=j8dPm4-U|8K;T>k8UB}^~}!4{y8%oC&jX7RgKhU`~wEPrtu$d z@p_q%XaKVkE${YmLe!VycGdn$*`K}%biYA649)1B4T|s<%GL?_`}v*A8Zc-49Uwdmv!q5`}K4t8hA5>pD4Tb2jQ&lV76~>GytWU}<+w zlxLoTGEB})wZAp=Uh7fOrT(>N7qazoJ6zz|OI?1K*V+uCL?#KU8~1MQ%E`qvYF&p0 z*v_=K_RZxehuGyPl050PUi2}Y6JKZt=H`We)!i)&y!6r{`}kofIvK^na#D_gFa^|e zc8I01bXUA&A=ON+n^we$27&^~mn(}yAwscL?Z~X`Hn}3nggCh6d!OQw)^Ve zK(yOPlb;58a6S?+BwouWKGA>LzwO#sVQIdn0N0mfo|-p0dHSu8gxM-N`IP4q6)W(= z@FE|fBjrfw6+5DY+Z$VB;Z9X_FA;2ri|@jbSgN3vp45BJJ!u-8>)EnDSX*7!=#n_9 z#P>11;+r{AgDGMA05Zw1{2P->peDKPYrbB)Jz7j?Zydm&o{2X>VwWcs|ND$Gz{g=kS^z}_QSQGE>|Q<hGP;WvntaW@S` zd`9g9j%<464h}IU4s^CkQ0iCMc9S0HL&kPDonpVM&k&{uTx;40kYfZ%_53|X7LzM9k7IyRqGf^>^Hvo4f_6t7D?dPtK(f}mI4Y|X#Z#|lTM!L@vZ+YL&;y>>^Z8$Fvh;2ZWAs_q8 zRai1Eh~B#$0Wos+-7+ zgp=|?z@DM3N944ny%ECKe0Ik%WVbBIfzV$!8hhJX5t-ZYo%6Nb)VlEE$At*==yIQ9 z(GFr#ipZ9HW3;Svj3ntj$A^1@`uV~8EZ^O@LkT?C$RmP4h3Aa9nkPb${LqJUjYbQc zNxFB7Iqz{JeBVK_ufT~JjTEYlWbI9~8z&vm!W=AY$XHk2ozp5#9diKSU4-iG9qTQk2*q@~xE*w4 zzkdX~KAkVwf4sq^KsMrMR%|V#WU=;)cek>JvMxvX{1Ki@aku~FmDn<8p`>yN#K8FF z$pGpt_!7{qR>5cBy^S_^;wE(H_c^?0j|A(=|4*W8F8brArB6>w*Eu6pkJC1;o1-<6VgSfJGUs~yjSbW21 z^oHuXiiX&^J#zXCzK|#x_I^lPIZd^QdiqQ+(on$5j7{%o5}7JD<2K|o=HNEpn=d7T zl zu?&Ixf(0epqF7!Ekn}dFfewRV<~7ANdu5N~6T^I)+g1(u+@^bLh%x0%p7-_-Zo}4R z0+sL0Ao4dkH!((9#EY!misN!|II)3EM$saw0VpaRj3wLm_ipkuw||4E${MAQ%feSX zO><{^9)9mobQxZnj~2e%H6YULj%PTGaqZM9C}k6jP<@P0k~?`3c%wesJ8CuH=8}Ux z={)JgUY4|i|8SS|p|f31r==85)8IH@8X&v&LUOG^pRK{!F=Z~cSW|6N-2-P}MqDfx z5j$pIt)wQ(=pbEJOn-slsvob#pHj)d>+GpAxVnx|TIG*()nAYY*UjKXPhd96)4}GJ zgy|y9g9Wfdv+rr*g0ONGWLVpI5L)5sdXtF7_Iilp>QRWm&31EBrF*@fV=NoaVNbzs zrk{?Q3?VGG>hm}CH=f}YgVs>|Td~!f&E_AK=58N8CF(s)7{NmSDv2n|fU!nsYGnnu z#xHIh$~imYEmqZB5tMxH&!r}N$D4sI(A9UG)b99nv$`$<>g+&CTc!#(>LSX;9$3?% zVxP=E79&r2`Z3STqj%26qa8ck!7;f4=*DhLrxR&0#r|MWck%QMGD8Hm`v`@_(iiD_ zmy`I_6ZikvF6iBph_qLeR#Y5xj?X$GwREbuWjsz1wydrH40SJigufYRl$)DFA{e7T z*IDtB@Y5@`_KzBB8Whga?IoIU&BBwKb{K0hAI{*^EnvzuhB3vD;Bw+F83<9^?}$NA zOk~9=6!UbeaP4M5+>c#5NC_Rojt)Yu7?KHqE&?04l$SP8k^=T(#JTV_*0FfOz1w)& z>1IOM$gBoRBOC61;9&XIMiS?ED~w^lJoiNsGbhP*`uXVC z%l?z(^FQex_^*+LuCsJg*LJ6gLgWN`>oaEbj z%nhd0Vq+T^oZ@LY6Oz>omx|YqaCgSZ%Bpo!Oh21{AeU#XnE#AFLp-c-lHXC($()$C zLeruTf}SA5wDYMc1%fH6rq)S(B#5`UZ>^3uV%hs_3ST|gjF5kUT&+av7-S(TrBCn& z@@#pO=`fO`v|nIpRDX9q8V{ZNRP|b;V=AC2Ybb@a448or{EG0@u$M$Bphkw5EY~4YU4WU1Mxizg+U;9EaQCErMyD+^x{9?C9 zzfc7L3L{n(-6ik4R%SKL-r62t?mxtPU0$99^pr@AXhUv&fngY-;&;8p^jsFKurr@gyhoTbH&Tl&HcTM?=)BM1ferM^We;Y`t{n40(JJ zC{mXq^>lEgt~-&oe|72Z679s$Wxf;L2ksY63YHQe^jI%&Oc4O#OR1>zj%L*n0~`s< zB-0z0GXLuj=I0`J990w5l*$IG!KiLifvSOeDm1?NZ@aw=c>?s$gHklJ)l-_*&8CR7 zC9Bs;pLG0$+U)U2ZM>5i5TR+5Rgpky0a!5uPkee-*$|9l*b*_eI=f*JHK87l-hn-e zem-DzUicoxgRtCs6UTf}04Stl+i`#)W=`h#kIQqw`DJ;}{lH(_2ai}sb+V+|PNrev zFsuG!gSdT6rt}UZQol5=rAJIzj5{mkup(RRyQW&Ar7*}RW%CHooGbQgP^Ap2bfCPl z`@u)K82;6~@#ZID#5k^*?PXrLGz^pWej<_~7%fKWol9b13HeJz!f3B|Q}2aK!#r5wl+F-EKsN zV8#~4xK#H7zY&|U$+r>pk3sLq*Xyu*QtzP~&-x6mZZbP>>+$55@hj%qbR7ARI`9D8 zXe?`8>DRJGUk01f<6;BpjiL%ib5D;4HPsn!MX#L`dp1p^cUtlM__A7)YfS7?MF@=v zo-Tj=Y0^V}RaULZ9`pu84LUF!YZE%*Yss@Cy6auIrm(iC{oKQ^N*PtO_mcKw7I|*X zm!|EeObbvpL4YM4cK0Mx5Nj=bwYuyVp_mwWsA$pPF--HoRu*d?^m3 zrF$eF*-$tXrHot#XWDsgCVO}v7at7Yt}{jjo)%>iRjs?OABesF5%##x2KTY-SM~tC zfRD3}0%{~N?}j|#Sg6T7uX&V`Tu4hzD^j31H9=e)0@Y|tFL{5Pv=cE84tp|tE0QYj zvRm?^ef%loeKWe-#qXMEEj>0D<>1LGcqIFE$zjs_z0kqd#f5L*A>B?8_>w~lxy_8R zpvhzMlLw!bnUfMadc_X^dRO+1lv?gEqMql6LgBs80}2*dhknP>&+1+3(foyFN&XGi zUiKo?YccO4e^JZ-3v5n-#9B)V*}tHDV6;bT6=9+m6!R1Z-5&3ZO``jO@I`qhN6H_# zSj=fQC^UpuTQVL2Sz{AdS{3FhqjX>3e4AboIas%Sf(gXzy1;8TDGmjam$nKUD-kBSk+*$cq4K{}~cOzv^cT7km_c=adJ92MOyYlmaeS z4IWVu9^JufYO`^tq`y#G>im<@xvs=pt$o-)APAe6Lre- zy}d!A4n2k2v{Dehl}goTgCqQ>O+V@v4)^tvk+DA0(P8c$GkyvMwlZOQTTjI!OtEml zN1xeH#G|R58BCSq9lT7XUyS6~KUhT1prbFqHjCA@tSn9?a0SRr3yqE%`JNp(a4qCk z5e}|cy|>my#rH9Kz2oVRh-%gf#=hl%w(4(5oBm>z%@$YW)^~z|bPh zW;!J)8qCpB;npbzHlXVtm>%1s=RKpBrJDh^LaG|EFo1rm5@D!)d?2S zELn9T=qJE%@Mq!My=pGGN)EoSX%a_zRMoH3a&Laf<@y0ki+!||5Lg#%Qrc7paH+FmZZdm-ZW>5zCV$5S)3N;7dfn7f;(!N!427eU#DiWOsOVXO z;zeeIuSzf}9_0`OndY}7a`NhWxy<-%k||Yg7q$&wgs#5!@?iaya;EM=lt%s-{|>E* zy|Pp#=h?7*aH(wWUF>{+PqrTk&;tEOs3xGJAS-8lG~L9w0zf)C(2JGdASAEomCq5- zYS<@d&)08bjK|xD+l<~H(ADUOB}(bg80x*K(GK&v3b(^q6y3M!d@J_+n?sJ1@MYmn9!J{M-=jN7*B}BAD&m+3k{|>DUQ~Ga4hX*NySR=S{o*p3OQQnl?Ca<|?Ai^ErWr2f%#aI? zTsU6I5B#$*8ysTbW8bV?9YgMjh5-xe^X!zccm2P~=;xTjQ1Tj%X5RA|cR}}lUOOhsa zH8iF838~GCwp%Xj$qUn&M_;uno~#ZH)_Y1Oma{N!&+dU&-Mr#Z5dPMi3qasUD!)wL zB)g~iYuAer>q;GZ;toX-MSc4XdYS5YbH2PT_xDI}!vX9}9Q7V6Y0cZnN2g7}$WI4? z4Q8CJBsio7p)5ckm=)jCdS9e~usNjS{_tnh%;0@ar zV6FkU`$xx{hiluR*qei`QK*+D0)Dc~0Q((XXBn_fA23@#?}Bg`^PB{>Pvm`VVW^I1 zA}s20ud*_aB95*gqg6XnA}3|{G{Q<8lC93v^d1g$$BPcF8fc6QrE7%gJ>m<}!8lp| zXrkHXj5ql}qN$LRm-Sr?8SnQC4EOSw!nOta7lT9>pkq5&Fyk*H{q4f=wi0QT%ZhXS z$QFj(x%+9;iF|UNMZ5{Rqlda-hZ{aV?ns@HgzPM9{g6<1vVAwWN1`^E4~lDkGw6$d zHvOe!H`aP?Xe*V6^KydUw`Sc5E4Zhw?bb%SP_*StpEx*MC8VCzbMjE~VVYMzd+9Fzd?T@n-rV@5X;v`zJK?m zLPXYEuL;~Uk(ajDQB4bu-O--^glPW>(f;2c+C2&M_7tIDb+z0%Z)Gm=KJo!R^RIme z`y2o%rr^P#PJRhXkdTt(jvQ|e2g z2lt)MAEd*EaqU-btfXTFW;i4x7XvW-?~jsJ*a-PIRN|Mn}~ zh*{KH8AGTrC+7e}> zjr}2`9({tMD0i=g_+z{9xYg&MmXrtVoXJpY3xZ(7%;`oLJM$mpls`y69))Gj_iB`X zEIw9OPev(7?a+6w*nFi5xsYVQTda6gmS9}=W6<_1;tFJZ2bK03ti$NBA^ z8dX`tx(^AvOuq!6K-;u0jY|I&Vjj-?xeo}P)b9O93iUs?|FI0{pKbF$s%@}-|9S!f z-2)=vfIuL7G$8r6v>cFu2Bgt}{Bs~qH2UB2v4CyNzojvOG~PWl5D~Cmf`CATf6M=~ zFXF$Y|NKAI-{tcF@NdIOZ~03!Gj054{^!x@W^=SspxtC+sp4x5G`=l_wW6+04M&} zat{q1<31)9_5+-UK!NJVe=avV8V36P`xrpW+=Bq$gD?p06Vmg%#C)P=ipAhe#QQPk z8#bdD8ath|BEUawo`~reP!Xl#5uViH92@QkA#>FQjCMADK$;!^j&C4$+Ec#JdRb5kCSKrXy z(b?7A)7#fSJ~25pJu~}jZgp*aV{>bJXLs-9^z8iN@(OW{{8O(#Vaxw@`9Ic+0H_xl z1_n9?)}MOaL-Pba=mZ$|>3J{-U#el5IzM6H{fJE@74xm4?Exd7`Z2MY%NPy`6aOmn z$)BqIRkQzE#RC4nYW8mx```8Y6$DoUD)RxU0n|EApHkKec7gHx|8*^7>Q!5*DJ31aN zJ}y3CI$myG-e=r=&v*st)OZBxtliw4M4vzR^z`KV_vN`9U96t}_oBtaw${W9JX172 zy^K?z#)mBiXA(v?jJsaza0xv=MtDytX+~OWTqY3FYCJvatgV#y3!snwj?QwzU*rF@ zDfk5!c8cWfTUcjS3;K-)`GG`!mFKPGK{Rx)%G=vpZTHRVq{lg9f*a1CZ57*(CrkLP zp2ZT()4sO+o;!1aRnJ?pDeLt@xC;V#y_G;EAzH1`G^5&i$`}~Gr^w?=J>{Z*SkGZ7 zQCb-v`G`EJm}2*R8Qx+9Urbd4nq0H@LHmz|{_+kix^1{&J&HGn`}k6&AL7@#lCr|u zHJJo{Nuo!5RT4pa^YhF|C*-1#D|0{TS;K1!+L_rIW_=2ZN;|=MUqRIg;RIg&;(Ny2epyjW{*AiB;0XhaXK3=bhY^5_GD##wa%2xXr5j}9-I%at+ zh$-!!v31l~Lj#Yt2H-1m{*bM;ioamP0XHnTr(D`dMAly1EI~AUNgw%Tof{UJOZ_DU z#a?X?5Wq&k?c4+nvR>BjD%$Pl?s$aG=tI+8Z*@HVl?&Gv)|bJw*v(O1{Xt)^>(PGb zByNf~5y9*_#J5M?mlT{TT&J(0Q`d+=e)Kqnh z{3H4mp=LMYj%7cY;N>@7_WKc|+4j7oZH`~N+_t#e`(gQEV-l?^RLShRusDZ+MuQlx zphCWb8xDLIS->mRO)W2wGe>-%CuU6UYw;Z9Tr?p<=rf^tf(zfIulCc@H8y)kiltwV zul@LhL>R3{FJCm*)9N&%%(e3rRm?85{cQ6&IF9q+>Ww@9BBMHLqKcPz zZqMU8HJ@R5=u;c_FM%{qaI#0u8Y-!V)Y^*91-52;@PoEXRwYvt=es;DPQQ1Oj&7i; zD|78CY@coNUc0V~xwav7@YUxPM-98!sd&FLv{*gNFe{u=$*Iqtg2wDl{Tz?CC${ua zCi<{}u4Llx^^ZEbSR!l1Lb0r6p9vZJYrjjtYd;< z$r`4c962REZK4#u30`_Eue6Hf-28jqs`q8{>E&c|+m{&H`YWFP7KVbQsKNFq( zwR`;2|Fj%ze1R7gY4vt~U1}T(8I~`@@5*4CT%X>ms;=|(dTalc<$iRbz{JOP&b&v> z5Q}G=Ap@M<`9E^A^!I!$yiFp+m7SplN*0bB%sHHIf`pgk)FH*+j~yyqOKk`R#uoXX ze{bPwjM#=78x(Xfx8%CwehpF3rMk1r=kF3(U1j%GLRL)0zn$dai!`#J-P?RCFM^eF z5LK7VBSq5f@J{X+iA29hhXHVr@F z5&7G%Z-3xRaqJGU=+sVCiP>xO)sSZqre!t)K}kePir?ghD`*;EG6XZSCJC^34Je0L zBVBeyHAxibZ*w=B0cMSV;p#}uB4wy0LFL^_2cu;57XZF`qI~0+aOvF?u|B+h)|2bL z1Lw43;C}ZOo3XASfs;lssR9uXMIS1r(x&hq&#FvX(;PqFn0V%wYd@&6<*1=+%sjqv zHnh*KN9KS0sAsy|c8PPm${UwYaa={T=P^LFZZFbB9LY7u%g`q-RQ%*En7CGFe`St79@FpbGxHQ`EqYg7eb3PLJ~bgWb=rL*D$n4Z19%Ra_erKcF%5 z7fHryK|0ophW!(Mo_TvhaBH(fv~63lbqo|W`*h_hwUB;2DerZRas;33i^Yo}=M->& zyLqvc!|LOgL?6Elpr=ut!1lyF*RgLIvr7uXnfEtx2r|AL_RMOT8oicbgE)wq6jdx5 zN3gA#;modzp2 z{UY@SHs&~*v<`{ysw!T2@Chp{`t1V2_1U$~XPqe>j}*snaq$X6mQ*Wm!rtakjCTY( zGTvN;$2wZD)u<$hy*S2gmYLdztDkh!7dAE5F*}>&xfE_%I3o!?^_v&x`2kgh<_K4F zQ`dNJ`+3PCs#vhJVR=vsK6B)TXUf5#CnjILeHNA}_~6ORu2EUzx-xplYx>q^tyHR) zkC#>;SgPIWqJD+-$(FO55zgO&RFuVbqG(Z%l^qXSQ?Qv?d zZc+dH@>OHV=W~seboT|M}$CdV&DE4mGw zt^B}Xn)pR5kFl<>&Y5EUG@h7Eg|fs8anr>d4^Okf9;UcH{yA-JIo3U`_>}+=%-9y0 z%(qR^DhS^qCC@x%D?Spz&i5=g`L(OCeLL7Ob+}D~z;vz)4(F^z@3z@?W{-fkxW4i* z%`CRU9{wO!DMSVr!pTLG=FD5^>qGk_s-vNH69wVia&GaZjLdILDdsXQ2GQ~hrp@ts9*O<9$l=x||VW?*5 zAn?5Fz1K`Tw^yUw4WBSF9MV zY}Xwh zEP>d+_NPb(TW^)_`LqU>&aJPak{ms9!Z_Q7B@|;&#M?jo27_&b+_MrniC4TzbcSya4Xt8bXSIVe zBdZ_^{ky+G_Kl!*KN1&Sl&`ZQpF&+_Y_5pPgyPjJ)br`o4irhtWHxAk!c6=($S)0l za%SL4=!wxnpR+Tg5`To=VwA$umV}eC)aRjoPoQ@8Q~{PRnXCtbndRS`FB6~fv1$J` z$xSnr;BgpTxLVgSJ5&xsBHiv@mHQxGu5m;fNM))ve(rk~&MIdfYc7Gc8i>>hm?`m- zu<>JFfmn4t`KhZ^Z9jU_iUqn8653UhnUk~hR21NDYPG3$)E-fqx@FF_Bm9yZnU!`C z%NXFF{jJD@25p>kOYhy8gPzKZ_{i4JaAVUPKa-gxy|8M020IZZoDd{(9py@)m@^EdCxPF2eiSi*OuWAyIOukt;#NT#O&B+ zd_`_VnN2WM2FcylHkkcFGW-UqbL=?rv#uVWMB2db;DVVy~-KzQP6DMU#M#rAv0^SUD_U6h$kJHB* z463+V+9nfwYHaD(XsHmEi#oca6B@M1Z>C$oT>v!)(_8_2(a_Gr(m|XDtlJ^?+!=>&utmZ5c#}8|3prYd7 z6Z{t^7~vSMsRorjF)o4?k{`|mHY?y9C4L5?k-rul9r@zby&jMWqx4D)*RgM+t|VS- zKg|=ho9jq;Dde!V9DH667~TWZaXQnm|eH#@#jfTav&!uv3XRY6$;0C`a^VObCBk4~4>|OmI-DhNjG0GGN!=eGAfKt?- z%-Wx!-nWZa&!~Q&4^y!Ig5CFyM=wR_(|K#KN0R8`!Md?A(P`E_!Ho=9HVadljs||1 z+oIU(pz28DVX>^nO%q|l67QeXPNM$A&eip{q_C22VeU?(O7@~x6BPqCU`#gyj-V9e zq3=pQ18){T*zjHEaAWZuO^@1`#kggVOj^vf?_>KpG4ly3Z8QXO;?3udue&pICFw$4 zv`LSVjpoE2N|932-O8%QDZ=!j4kU@6Vlvv&PJ1MRv8IFAos~;;5BWkrzgxx-LlM3&UZO0gqhBG@>wLS8Gky>$-3B=%<@TZsdEXZx{ z`Vt^Q#@ze6$#;=KNs$2 zlV_KI`;z))u^@#XGUz9aS$Jd+u`1&yAnIBufXz|kLl_I&@}(Y5;!w>qkiV^nc!!*7 zh{8_9W(<Q9 zSt4w+>urJATDG2XcU7@UToZY_SEWwF@jgk4W!l!WUZc$(mW;{YAaq3Rje28Z_ocMp z6CZgw#*C1&vT%dri^OIe=3Wc8n^^ibn#o1{4i8bB`kJNFRy?MVG#?!%r@BzH_^$`b zZl^WV65vu(;|CM*Q17Kh$L1c}xea~C!zsVM-r?I*wOYIk`rEJNp6Svro)e z2;5j9??s{{IHeu&N$+XO*z5_Q*`%G+Dcbo_CE8qXcso*c6KI&!b%YDhRr6ZkhxFC8 z59%P8sPWgpYQ|e8u*B#12k)A9n*DCO?(gs2ketU(^uk-H_adDo?jnCZC^R^T+I_J3 zMe@!13_D12eW}5Oz$;tnxGSb^lI33L-2%rzF9d|DUd@~rN+Os?q^idE6zc{>T{+%X z8HdwTx80N;MeFZ~v#l!8QtzqT=``e2%9h|xJ9PF^j@DjD@EDhhp4!E7Xrz>p;Hc!v zSkmkDhQKF~3e7p?rNqYnTJpUaH<(J220%N?c z`}oB3dx|L@A2~fLO4NGDUTKoyh&mfGdwDMj<`H)%fWwMwQL=Sf2j$PQs^pg{Ps9^% z%zdq2F-BJ4)zNh1+S_V>_lkR&h@IQse@`0)M~_Kah36l~m!>AWp5k&}3XH^CCKPKS zt38Lvjr{MyI=W*oC##$%x6VgEwv6hL<@!uDksXAku`3>cSHpP&Yk6UZDcfqCCNhnz z$=*;iu5dKKfJ1NIt>#3`=SP68?s^pSJO%sntOy);;ve}K*RhkEF7|qWISYH|e{$yg z578u?eNYL^)$-~_M)B~=~nM{qH)X0=#U70yb8At^w}pqBWt13vaKIakK1+Z zJ>S{l;@(VYj&kfs(TsGejic9{I7Gjdn{JShYM%M`Kspy4()^V}4-v zes;O%!g{H(meugNr29cHQHX3JAAx@2wtN*H8U1$mr0u>&6`i2 zZ}WVwhoX>^SVy@ydq_)f7NAU>gWQ2oi%9cXeZGDk{yHX~N9|Sgl{K~Yqx0P%Q<^v# z*_?eOg!$El90U39WLYTSaXk_0* zm!BDW<(H`KZtkA;MIU#RC7ek18pLfZ)!A{uIHnR63<&K zPD?xMThS&eno3Vq9Nh1G(=o2XuKI;qCA-)L`I^S#n>St+B%%z{KcjktHY|exzxGBC z!pqioGHY~@z*SVDvvI5U#?sr7C8R?{cjITR4*f(hA0k3CII4& zififMr1>|Z!d34lg+iXQ=jnX96V;*OccQ11$vqmBR8!T?Tp0Q=XcbH`4Z|(1*I@ZQ848 zIoYOLPqf5}DmfDD%p^WBncveMv3oGj^zEmX&v)%Np^O2MV*%BK|1$^XkUKj z=)I*}DF$R~`qx(t@iDsk{%f4K+Y(M+ (KBm8(#1T(0gT)4ez7Ey-w!Xogam{%17 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 We+d8a{SO!PA1>%WT+lzcp#K7^FP>8X diff --git a/tests/fixtures/samvera_128.tif b/tests/fixtures/samvera_128.tif new file mode 100644 index 0000000000000000000000000000000000000000..276ac96fc09c14bad65efd0269e6bb8d81a9c5cf GIT binary patch literal 51484 zcmeFZWl&sQ7w6lABqV4Eu1$h_u;6qE!2<+$NPpdZ2KoY%5C8()6oj+g%>*bXMV7~Kz~$&wQe_;-!H4Pube9KLvQh< z9{@SbzX`$%(Vg!!a>7{v|E@s+cQvgWNmj;}lo1br4=P3v03(cB8~=WeiPi%Fvinf* zcL_FhN6ZVge`kh&?)_h9iif%XrB~;FWXJ!*?i2ifV9KQfC**>5`dnApUy=4M1IBUde*OTUAL(9Y z4lx+iuvL{NIcEl_N)!KU!+@WwO8Zgz_SJYxHH-KaJ-+VPws`U9`h*#k^;2}}9wBQA%WzHqH$a_se>pSqvt#FHOfzLVNY;FHK{SjU)IjwjS z8+!G5y3P0bj{&B9KFfp4B@68wXABPXqP6dGnu$8~Uhg_kFm@UWU5DNi?yxWRI~Aww z_17G6uIxCNI67wIxO!8qe@FlJohG}bPa%2~|J@&THl8e}J1GkMiHh+US((h&3hbbC zqVC_8KN!6SXq^+uI$|s0hB4S-va|NlPf;c{?V5Rr#BaMy-{H+LRg-b^vFYgO>oN^m zs`0Gg^xuFloT6C{4gWx}ZIZD2x@(!;IEhvDp8f0a{<%ij2l+91(@68DLzpI3;T%~P zD!b>PQQCs$EE@LBx_l4wXq}YOxY&Wt3L5s^VTn~korRHR#wY_ndV#ZRd^Sz12B%w5 zFQ9x^ozQp*<)2&qo1AH4RpWO)v;XFC{qy)RPCHmFo_&v32GH#9HghfN?aust0Gtgl zs`PzrGG6l!$nuFz9D{-Dn!WW!{Eo|8VR0R&o-96k;6`b!ihBJLISbXG zI4OX)c`0nJ!`e|zpRdOXVve?`7Tv!r_L%?KZ2bL+ovO2;crWSI!XwjbQ`Om~<5?@G~;Z8fc`6wYq|cRo{^uF-AX&jE^nMWdKii?$dJArO8BhUhxpD z({I_IKs>fpc?~02W<%laKJIoavG=ZnzBa4Qs7pwV$2ZYR{hCJq69RXP?-Ai8nnoK{ zi;BWSlY^`e0Nb!4PFI{p^QX)3551ok{S4V^p0>zq7v_)T9WQVH*=;Y^suuOd>VEC6 z@B4vGc+HF&^Wwa`F&t5R4t#2D>j_C=`f47C$=q=H0KmQl(~dG58EbWkw#1xU1g3m8 zk@wc~b``N^$!Y03eS}_i2?S51`$P0~>gPlf=@*>{cKk)oji$GZUaBqARrh}FdH}32 zHPh}?E+~vg)@iX{bo)SXG;A=LE|u=(!38!XhtmzY889EUzX<}(@f`82oua;DzT*2L zlRbhsbY!s~#@$aVpP@zt1`-mI_N9Hg?dW?(YQ@aV7P5CcIe%vlOph8>*GKO?+xijM zwN4lQ$BS~a2{7bR^ebM|jLzGEy$Cw~hCDgE^L>?;El}JjtFmxy_EbrCC@pg#p+B`X zQ=^RFg?`Q78n=+9ppdasP^JZJqpoj&Jgmsx{W?om5~9o{{xc_>{nw)2P7}^6B}=Gz zWXy(5MmePI?dApRcJDykAxi!MuupkWDb&ASRCpy+amezQiHyXlmLCTxaEqu>^j9$(+t44qx_1-?9?rHZ2K!8^Yb?0ok zLOQLjv@4Ov+Y9|GqPG3LIdxQ&1gt&z@z&861H~>mGYHJSF(Vn{w0UWNBCehC<VrYW$?iU;nBHzRncbCPQ!o0ZM^aBG$vp8&j&1t3<}{ea42{@Kv@|WgT%- zpL2YZ{Zxw2-sSh&qhMciy8K(&hRdHHk>14XL-YYEg`)}^bV+iIx^#&-iOQO>tAPhL z+a=p45X}yr217evE~?;St(;Krp4uN5?f5lO9^S%g z-Z$AyYQCxx!dL8(<&&DBig81L zXo-8k8VTG%Gcj0_WScUiqmHqT+r;m3oG3E}m>QGax4v(bDLHC=M@1Nz8+y-R=b`h> z)`#7%N2|UEsopjtg4?mtXt0d&gFf=f1Hi@Y&ZcsQEh)c9ch{}VxyYd1>XB=_=OY%B zl4G(zX%nF>--jDG8O_H}igc)HIRTd%9Ee*(6D&)q&HjG0v)*!_ik*%HRG_%6RjSd_15ONXW?oU*`V&o?dzDCW;w(seSK-G zM^g5b-7j(33fmq*p!w}Lln57bXozq4+9cJ20>Q`V*an_Q)QxHs1y(be?v`cjr} zy^&r5ocxUUvwiyABi> zU2~f9D*G;pFyk|EF(?@c&;%5>a~SPWjs=Itl%WXnAW0F9C5s#S?^G~nWF7#feio1- znuAC}d2v8LG_1)V&MKw~Uy@aie~;+fv~3^lf3_wg>ezq9)G||}EVsiE!l83>oV6Bx z?;EGyrFU5b7rknpfil#k+)bOD_J|X^VD9RitHHpV&gXkB*$QkgwB)ex5;tJgK1|4Z z*Meoqe2;?Na+m98az~rO9t5`*4Yy#~i6-MXX$_{;qv&sT#+ z>dTo%`nM7u;Yv2`K+^`_D-qKyi+-_`ij;m7Z|e!=d3s~$A*WegYJluZGIR0o6aqU% z5L)L`A1z89uZiDR%H0_V*~i)e$b??K@*+p(IXlLxYOD>pbQ_bYKii;u$!w1my@?}C z@x@w)?d|Zj2vcvOz6XGqcKF$WNETyeBe-L&Nj-nm)vtGqcB&p;XbC&n^Kv0e+U8Nn z?k&8OSkE`^B{}R-u--XgBzro!C_S1_5(qbbxqDArOW^&=it6Y?MwK5ec&lkp6PaGJ zScSu~Ruxmxa|sMvKQG7CGLynS6oi_3k&8iyA`Pb2A#UEEM!lY2lB~v}-XUJgQCwiK z06R_!2sSXvYdc$s)>D)4>{j|sdb98q?&%BfY{1d3LB$6PMi6EC5X3L~q4;FTdGvla z=W7oe4NJal99?V^m{qqAr?Kxq#A{xmzApjnYb#`yl}P8VhTz0E-xh{6DHyZ z$SA$t7y5$ywqhF?4!xAc2|eoFs{YH2S9XIGAPKsFFc&&9l)&w5}EUBFzddEQIsCRiKk_RJ^GSX3< zz2Hv`r&AX)6i`m&g54Gk+nVgrbSC+21|cfSD@=HI;t$F&hp92gK(_+t6;-YYibKRd zWGroKh(%0>Rs${KO$whbDs;fJwe-1RQrmiLHYJ{AT&A`4QMpNcHHi&@pU?_IM8u}W z9#8x)&m3Y^X}Qt=ESUOt;^E^wiF3+s#M^TIMvem9Q-|-DS19%@qR?Q<^b*y%*SnL6 z@+`e>D#bRWUSA&od2(VMy!1vo_ar03>oSYd%_+U+?)TrdnZ-u=hdD}(WP~}q(qf`7 zu8;V_c{I&#vs`_T5fZ`CnhNY!X;l@0Js}=sr2gD)viHFa;@n!*Q@KmFbQ~htYawe! z+8HiIoZIowlXML7!kx(7irXD!n0~eTAIl#3e=jl9$ZK`a6^{;Qfld%){HuIPWn{BX z6)4fjyS*9u*m#inLSWZ*6U-z<+UP;xKDxzsXS0F)tEMBDUzNNws?8GantsZ=lM{~G zxOw-FmN?InTO%#j|JatHl!Vx{LJa$^Lrv9SLV|)l<~NM27}<5q3VHtwcsil{0Fcxv zgDdG|+?B?Bj<_c|tBYoCS50PXY9`H!kj+(LhYGkuigxGVkq9GiGx+|FLPSvXrZ=Ld zRT-pk;1Z>`p#HPD(MjS|@QF<$X66^i(WLaMgL89|6W2l;fozC0aj!$DZZv>`;S#FZ z$exi?t3bRx(X^n4AXz#%po?3r#oB!4Aa}u3tYhPT=@g=v9P2Jm{zu@nMyLu0yD6Nr z`~h%6peC%OE0uP0DXvzRMYB6Z!40SQ=;^dxn|+^^=qjSQXH80IK-cEjcP`$olO(hi zwjL+-ik$8o?JnApf~|r!RAh_&6NGj&lPJq>?K~a;GvT{6t=OZO{0$y_?>*;Giua(A z`g)UiGFCSJZz93u0@r@r++AOo2esa!T0Y*Sk*B#%ul9`3zW^c=M(vu8F zl+q&1y=chxfXm#dh)U?@hmrhDOJ_J@B41g^0~DdXJBz4H!*+J|eT)t$&(3y&iVp1Z zD;g9d+&ZBfve|_q<9ZV%Y-;L(RUZb}Y?5Tlc44Y3y3&qhORgj0;?hhdI0ja=pL*{r z;ATKIb}-Uk;+85!w`x=9%fYjMBGCP3Tdn$Su$xP4zT|nm`;W+*^SdAml5sHqJ1o4J z@Z*at97$h3CHq&kaU(h=Y%1lVlqF`XeG{Kx?oTyst&~s<#pas~WHnV4fvLp7xd;mZVEjKhdnFd60$Zgl#p9xDq z>QQ^U;w2XcRk$a0I;!6J(DDN$O3Bzpa~MA-9M9|NQ8gaVFHOJ$-^@}@p6*#zhJ~ANj)*qC)exjDB%8 zA%>^k0qzWp4(8e zitXq2#}))kyz=KHA@=2apCk~j^pU6K?wHrpUy%t|%DLGL8-Km^@1L(u4B9BO<+ur4 zfS##Pa6|ekd*`UvLe|Ib6C-b!@Rf(AcbfV;ITL5f41bpl;8@y? zpt!WxwG6LEG3Tg@N9yt;a<)DGOY8fPVak2JeXl^lWkKGAi$&`w7vmQ$Ta!MzK0kq6 z7H4DNwfcKcV32bSqOP#PHJ_~E+wB2~wAxQbyfjH^Vr`xYk_FT&b7Rs~7fWhjf#iK+ zmm5?8$pfh}HnLWJ7Dd)CH5)GpO2XPUN>az-(BND=ttyTS#`akXHk4&>S7*rbr4GK? z${Dd47kB{Rbr;s9k)7I!#`03_-wTA_{fR%%LK(1YOYm2Eh~nv)0cKQ;Q^t{vP^HD9IA$nCDdwPpcR z&6i6<3LQUJE$SsYV}^Wfj{XoQ83shMwFcRox!+5ykDIs!M|^*u}_6jWbkK@)96$_>XSYxR+J<(yID9- zn1=nMxw;eym!~0!UhJuBXj|u8$FS$Q*uvWJ56HwZncDRGh(xS`FlC>n$d@V~9{^d9 ze6?{y4+D-je>Q@9@wrLV$<*hky)v?5e7IWZCx3OlHX|Lcfi@8Pe1@Uj+nrWLs;1%w8$7rc9D^BBpSHJs7wk~%Pe-tCgx%+8J3n|V5rtsF zV_&-KO+wmqUbWD*kX~ATFuD8I$>K9N9LI<|dawT6Tw3zr5+LWcf>HKlt<5~~BtKORw=7e7mFj$dnWKqJC59hx@ zm|jNaj=hxx6@b_-Mrsn^c%+jCf4mhp7DHk?k6#@~UX*kA(ZDSgGTcQg57auonrP|M zZyhzwwEp}O?@w$cZ};5MA*%PcFzB}c%n-#fMY?U9f7rONEt>a4#}7b#?>dL%Zcl2V z=H&UcXe8ABs~kZ4-3^-DVTz2g&X|t3fUQ?8vS%|YYuj434(&HTW#==RDdnemYjdZy z$$9uyO?TlMV=C*5o*GTD{0{pDcf|eM^zIghG$C`)?BzGLc>ytDY6^lP@#czS<1bo} zs;JSV0jGX*f%>=MOPR(IEn?R0YVugYwy&#dH*msWK9EK3CFATR0}~%jM2W;1bhL4v zr41DTuM1}nn$Bp*%Kg-TqCr1MX|n~r2G^`Xqa_&s#A$2E3F!Nv7Jf<7(RRy#-q@^& z5v_Alb>Dc_Pgo3v#k|ELkALk=cqdDOQ1N58=>WfKI_YV&Ew&o@5JxSS+LkC81e%|l-`nF~ivjzrWv zBGi?D@23Pk%c3mO@IiA#QvZKDx`<&pUVu8MLiFAi3wGJhNMXtyHpr}UV= zUQ?8yFn(Ky1}l;L%yqg!4nFobw0Zc_K8A1_y9Yp*NcDVl2~XOV6q4njSQKMd zA4UcIm+A0t#`GW30`AI{fhtweGZPHKG}vM?#xNy?$Qy@iJE+ z$eOT3e%xE&>$+;u*~KE_?-TjQpQC?|Q}UOGk#h_=0FG=XYw$2tT4MY8g??R_3Nd9u zEZs|!WJFVw41 zh6PI)+6+-r4+xl}eVm?P8-Y%Y2K;NZ%(i4GWkY)#_LBd?yxTmBXqQb+(D>Ik|9sEx zsnaC|v%0uE=cOoFB&!*L zAcaf#5!$&)MniGgF)n#op57@z>s_R^g}`2j)+Bd&0Nhz0w0|yMw=Q-`YE3Rm^g7AL zx1s?C9t?w{fGKazfc!BZ&+h);zg1@fD{6Y$EYazS8I@DewEg z3=UJ|RT`C$e5UEr&jlc% zMM`?S=F-7|5M7~oc2^4;ihGlr^D?J*#02QAM(f<+e1}UI`1BA7)e^HMmrwo9{|7c;kFy!jlZhHVcDmSU~XS)}r$TO!=)8+ed@#H&-eZ2ZNsLB@mZiSKO z0pJt9E+HB(L1N?W`w9({Az+fLR8_vKQBOBhMEgyiJAs=2SX>O7kXfBx(|Cl5oVac_ zCbX`O1c$SfMN1Y`Hc6Mv@8~feL40mG%VHa8x5o&a9I)!kOu`Ysd3SAZdxBk&kJ8ij z=2ixQ(K33h^W3aa=N3Lc`}AH4-U zJ6K}|;Ye1FN;v2t`P5&`cAtW$}UDO>sC$H z#`6-LP(=&>1imEfQj(3by@@*&nJ-{*n|6?OgeNxAY4cM`>?l?1XO*OPD7UPE=3Lo^ zX)bM%g7hb;y>drQN4^rP<^J%|Aap*O^Tc-Pm(Z=LsmeE%D_AZ3IWWpldh}^ri+ZSz zftg6c9B5Q(U5`yZC;quga0)}lU1J(G-YVLt@7@zv zOxkAVlAXoz7$FM#jk^+2CFLRYSWG?^F9f2y$J^DtE>7>`Z1j+8Yqk>CWrq`2pEQK{ z^krI%d?VhBPT_jP)K^=9JAQApD3#jv^9)CAh2~zz7`V_c5*d@9m*HV)HjG_Fh%5L1 zUDTJO@!a1dsGz`_orq@Ao`Ml}r1*cm`<0gLe}nD?`ws|N%fLmc|QXnTIDA$ z+Awx23rB|sfE)Q-AMJPZ7OI&V_A+~|hAI0EUPFWWc&R(AKRZ~T*(=LbzQ%{sDx!&5 zYt3IJf@W8ZS!y2s>w-To((`J)!_Ieg*8FCFXtu7tiv_)8pU{5dB%D*bek=UAb=il|%0^(LgG!DOtUe(WTLJnG{cvK@j#ka~C-NG8;^kXi zU+2{sR>s{AxQ@aw_lM$KRK|GQgF^Kgu@3eOa^7JCEQ!D$!Q5srbB}GEvuK< zfLx55sr6P=jTJ{K4*;Fd*loz+H3}cYH9ndo{A?@cdCsX-&ydH&{kyULZ`fOf^2y5< zH4N%mmMkALYL*fm?rzCY0W)AF<8rAK57ErY#wuM)+HZ{TI?PgWx~-S)mLMadym>vDBGbi zO%KWDuyTyjs33E|6=Z5v0;m&%v?TkH;3QdSM3i;;Aq5TO?CG7Q=uHj>7{$3^Fs27eVqV^6nOx& z-z?4~s|r_`GtKVme=@nD{A1QA?BEq5GR`%YQlJ2lkhS*D@kA3S&+19K;v~nnxq1`(N4;6)PaIY#nmm>%Ct-@?3x3UBZ+plRu)%^R zQ|Fj4@T{;5c7St&IPRcuQMz6b%bdUQ57>_0o{dNg^hr+c-0o?9eG2t)*5kfb>8Csw zqxtqH?4c*p1?j8CPj)Z$3bHM1*a~jLm@_pf^tbGk`2rlozZcdRN1$_(6mb_W^>H$8 z3-pRvU3jf!mc@)z!*gKVLIri}G+Ub8HsZy=VAHN@SU&i=F)5A=!H5Tin8fypY zN4MBS1(0RypYgiZI~$xY*n&y-XPvqH@-WpeQfe*tY%Z|FjB-_tEXt7~-6Gr}bY}u( z3iGq;uP7=HKy#}7s3#UXH{dcjY4q0egfFu^KDoS8?jac+Z2(^!B~bm0aEu#I*AEZ* zB?rA>*q7s`m6t1TH8zQc+HGq8-mdSzD&r0{qL%eF3FS<$Sc0u*7tjJ9c77rc=a1f^qkk8!vFYo?QZ;ZN`QG`SO*EHs zKwYl(D1x}8DSFqueJ*M*7Uzl8cmSpu7)IO(!FA5^q$;arQjenxf(Dqe7r9^7G6(|8 zchM}NR5%sd`IPDD)K0_Q%^f=9hch|!=3D)Yx$&ZYLI=V1E_2SUD=3wgezlpZ3rt@( zC8mv6dXtnFZ~NEH6tGBm|0k)f%j7YEF^3D*KMT|)6oJ`oq>{-|Ik0TIxsg|!)I56w zZu3{Txq3Ij$(PXB0Em>-=Q@8n!Ak!u0 z`#nRWsjc!}PY=^=r(=>N5+erX)hN!lS{uZl#d>k420#5I9F_N?XXS+O%zu4)!6Uh= zJYKv2ydbx>N!t>LvWaoCqON**;K`7YU@VYgQRl<4Btp1lQ?hXXyqO$cfs^L6X(Vg0 zHtR!^jX@h>Z)UmRmP-1XJjR`#86hyEzbNfU?!h4c;z~Wv2&6u@w5U70r8h7xSojZA zn1$C}6;Wety{zYF?pm41X~OK!2W!+$@v*8(l5^RwHt56=5kBXP^ryekHd||U6wvwT z^gWqH!i?tG1xbmw#gmJYg{7X#j&y%3zD1e*L@j!<|}5n8d~M-+Vfk%PlX} ztVPQ5^Z(fMT0II7^~!2D(n)P8uiaaTyJxC6{SfoEs;`Nt;Cf+N=Qf2 zR=Z*!*&OC%-q0^{Z#j`&cazhwe~F`JJ$(_m#y(2#)>or32fJ~oCygeQ?j|9Sv}7{ zD&JtQR-wZL4L z#iatCNiAB?+&N#kB|zq^l6V%Z+{X0gxtF4ev2$0#=QDw&gPG0v)<|ff?3|3q)$RiT z-_!%xq38aSU*peY0*9Yx!I!gvd&mv`v~#!iR zS2VoYoJ{wttW@HcSYK(6lVhW@HB=_)An2^yKhd`rYbJ3|bvIXx1D;b@s%-6yZvOH|zizDTXL%u}*xrk&3gzu_vXd_d1!qu{uR2ykJS#F$FWpD|6@5|Fq zkF2{Gjm*MJ=uR3g+Qp9Bk7ZVla0x^{KUfYq5&ImIycMo*wGr$R&kFxqM)in7$MvzB zz}ggqgC7-BmTN?Qqh|?Q?Z5C9*_WF-s=h@IX=@#sxJu+s&R$^ELH&^!2#gvW)02@h zw!309Vknh3%G(19+{03_he-IB#~@XFhy{=^_fQwJ7kiSjeC;ScUs-=7*=P2VgYxZ) zrhvT(t#CNmOX=4aT3B=wQL^uS#^<8*86$IcM`c={`fjg~{8(p~a?NS{J@{_fT)go< z1QcYBdV_E=;yvjiEBV%z@e=C~sseH>XBVfR1&DIknfB%Lvtf{__`Asr{RDbu@f7d-+Vytu1 z_=o^e4xxta8VDw-V98Gxm$AAW#H0^ZC{$0GRFa};3W(SkTA{#r)&~Wky*0+^8hJ3e zmbkyksQo4`p2Cy8lm`HKJkk-R7dg`lQ6(5UcU4(DW-etT;`26C6A;Yo^)UqVzwV%HSmYEN2GZlSZ znRH^4=1Jz7lj#(Sj|n--P*ZXui+a4iL#!P&met!VS)N0xv)2eLQ$OgW9^d~#%i=|>( z#!J88L>>Wac7=})Xu+uIzg4{aM|#RlR*k9k`~^5oVc<3&{d}zY(a?e>H|f5GN~rz< z@I3XY^IiM?MfoGyaKC&*$XQzS z`j$4!SfSeM9LhLpzdd>McxE{Gs5!-p@_dQwQe0+0G*kswgtoU1THRk&XwKSWJ!uHi z@TeOi>J%+gjX?0;RgVJpVX8dxYSSHW_9%j1^nLA_ zIaCHAk$P9Nb}0LCWi!3e^A$nlAx9o2Qaj^*`0dLD4{YyLnI}u@O%~Gt&3o(Veb1-O z3dWD>ubFJPKKjZ_<)Zx8MgwaMCH57kEGnj6S=#;n8XYwSJUIqm7?J0tX@nD7q`fCp zl~E)b!!Z8lk<~s=5SFN1ThQtJI+7zJ_s4FtoY3X4=E-sA0|3{!WU3K!BZbxepW+t%)K{xnVyBa|fa6aP7o)u5> zA`~8P>#Ht}M1{(XTH92$@JQmXX#Git635WJ^ERHTq57-CyEs{h$sLGo!&_T%m62H| zv7+r~fIp$ph$O2lP$ju_$6@Qam{_^{Dc*qOju))Ym|ToV@Mn`ee{7e31(dwG`nw~o zClBzW+huRFuaB&_jiAwZsld`(8$7K!E?YCT(kN8>9zh*++WMaXXIRVuvmW00E|w92?=D_(iNP39nATv4=3gaH&)V`bMB~lMD6Cuam>ZzB4}M z*V!`Z!8B)zgJx#}C{X@_WrF}X-87x^Fqg303$b_$uE~Y9*z`3?BL?41+MCr*uGUWt zSv=JVm5UhztH8+51!`CA!y5=9xVj^m^hGa$9AtC^d@vi#!1L8x?XN{tb9`{N&AM(Z zBL}x-G&lvxLGP3nV9(Y_mvyV6>b=(btgSv8s=E7{9}6`5Gsg$nEj5)j@PV8o5gnORH05U5nG^Q|3$MM1F2HKV ztjS4XIh@yKGf}wzG{0!CzT3LT*JjLzq@V^2wn+J^d*a~DvU{hpuDc98saUL~1iuk} zaq$3XY3*oK{n70U!#AzU{*I*x8Dws# zeJ_z%vr2$rz5HhCi@uHL*GWOYdqncHk`*hEXLHDU_?gLbXPrB}a^9bo-n#NmR}wWR z;GCP*VE)YauFn~l^3?y(V3@;=xNpe@YT(-^q zRO#_de1$#pljrxlhv;&Hedn2$R*Z;f-k&zIMH|{VJHzegFaFRdeco?jA8V4x+ZQP- zD+yZKtlI3mlsp5rsUbt;T4qRW;WJ$P3%sq(x0FvZN2^0bWydU*|CF{6BPC{}*sWe~ zIS(p2^9>l>#P*_<s81@d*LV10ChFN#%b2}Oz(Kgmr16ecb2ogTwiPmdUpv;h%;6pe9l<&QE?Yw%2~k77jc@_jTeXWoLTE1fD0391bV(GXgD2NW&|Iw9OQ zkUiKgC_C=raayY|vtk(Vwik-I=0TN!k&Q)}+VHpaJj~y;pUz2&KlX22M?Ah47(>xa z1xMtf(FWe?M^t43M(-T|(mQ+%+<8X_18*Plka=^DT}}f{zHde!Ur3bvKId08YCpqD z_DE1k>eWnlkkBYKq@sS|?MITZ-0ZitOjQ`^PFNZT9^z$x3nZ}mqqxObjK&-+lYnso zC&*=@OobyC(_hAZSzF#3e3m^~95aOjC!9ZHJH;1^)koUi`C|F^-e{?WNigW`!l1Sg z$;)1;n#GnWtl9OnU6hH~-xl(z{8~mcIqD*#-00RIpIyV*;)wxEDIDqZ#iM~Y#AhN2 zUD^vaw6!@tDgp4#FH?tp1Cb7lvWvNUJZ-4`36nU}cRNz76p!7ZN&Cz9(SMvrSmQ-L^%8Bw*)9@WLsjLERr#Fh5sJ&v`1nOjWp>kydBxu+)sif?A}{M{A^btD(^eq zLNF!c*m~D6-+kBd`>bA8bH}^(H-EzJ+y{CFee*Q@+O-=Aw*5kdb_9mdrQMaR3vMpU zyhy{f6=IGA@w&<>syO#=kK%oGTyAvY^O1WLr;?^615EpIa1y8aQ;BtS_O zXHAZ!T{aUK)=x5Ma+&@;rVvLH5`GC8YI*Ej|4R>18dOXdF@B_BlDq z2DGl6a2JCBYDLk{;dSB^-aU&oje7uKE`zWePv~_c6cFbx4B{?r72a0aZbxR2thdNv z-apZNGN?5=Ok1P1{ZlQ(^!^`kk0qyhed7^2GR20uA(r$N?L|VuHCYC{1K!wlG%2k{ zsmnF`S1k;?TdMRkDAuiyf8PL3G$R_Kt;jKVk+7`j!QJ(jTjS-B?Bp#?hnIHXqN5n_ zxymye%KV8BoJ_S5ApWZCPq~PFq;|uOmy3u@vi%o3f@JK&#}_7xSx!#YH$M)q)uWWL zxF7*ay;?WPDO)uam+D%I+1nEQO*T=6+3L52PshYZ86E&C9rZUgrQ5egSD>@G2f#VK zrjnmws#fARjcu+n@Fi&)M1jZfpCZ@qJERT&R8iKZizmcu#PEnW0(T99Y(2#Ozz+YO zzp6T)_rICm-*DZOrBdoGsa?tLjw#50uPxjx%#P=3`PQbd3(ez&0aw=_+`4{J!UX};IlE4*k(vz(T9CYf3B9?F?O^4dm62kDgObHQ01UZzbsgU`{2p*#S3`ETuU zc4I3OFcoA`=U-PK3d{W3*aIil1_K%PJ5l#lS~FXwjxup{a#L(Sz607wxLAm_UDU!W z-=Nux!vByZ$v}*KBA`u-%id43tId-w+O4$`NO7sk> z-e;Aw$0x5J2Wy5Z;u*Gye^CAIkGL7p-0hSZE?Q&P(2msIKlc;Z&|0Bw;$aAlpR*nd z@N~w0AyMaZpSb8@-_rs_u+U3S(}6V~r|7dXVX0UAaXg*~o%wnGQS(hrQON+ut_;t_ zj{{aO7#@5ytcCWZrF`BF!q_{Xh#5!C_#F!(pcWs{l$yahkXx-ew|J2oe!7O}>;Rrk zT-~GmFZR_nk&v}au63pGQ@9J+C1SA)PE=#!-=IGMS(rSsJgG^jWf$GMegIrf|G&rM znE#jKaaKPMkiXD4eFjD6?rgYecEEHek(6A?{P9bA)_tdMhh*M&^ZuQ==hAT!x+-y! zpG##?kgxtLp^ZNKB20V&)^(E!39@s+(e)|8Nkv`%y|4rH_zF?nV0V`Hu37vf>+xgJ zf4*gD`zmr&*tkjK#haFmxEt71lEm|q;mp|TK*>p;Siq~p=|Nxl#|cL^UAe)TuHHMo zTI@i@=Moy_%aHKt3o)9Fu7N4E`o4=G%W^^mXW3;G$fDwXLQ zc}_l>Qa|!$6$2Kcj|p+HCHpvbxDg^(88AZTbP)Udlm1NJ^!dJ_zEa(vsn@z?b}xEg z)2==MxXZkFey=Oet*CbvMXGldUydP_%jR}rwZGFvMbp2FT&t4xZW?PNP1Xd1T*!FK zk{2LYuN4;+Yj@s|A$olGn{}p%*^0l55GZU!8?AJWDi^pDKLFgRvYr~W3zQbHhnj{< zPMfMdL*a2&pU#g`UslQEj%W5Wd{g~(6Ck2J59U8P%7PmcEa~jMkl7pP5oApYLv$7$ zpwpLnEllO#q_HH+lu`IRCa)*8DlQ=H_EhrlV|?NkGm-o_!jbpu9w4`m-mBY-w26}* zA)Q|T4}0$&*2K5&j|Qn?L6F{}0wPV2-XkD{A|kyv>4YNEYm}-~=>h`MJ4o*!z4sF7 z9i%7J03qISpYJ(m?|sg_cmIC(Irsi^C(k^2XU(k1yt7tj-uii;<}h?EW@K-lYfF>i zRq7WTiB2-dsYy z?sLYQ{=KvM4oMo^a{s>4w0b9aw!uFB*T=TX{d>$Qe4AD@^e*6dRWvHsH*ZxdKF4MZ zN)yw63+6G2|5~Z;wHVH*w#*fW?+Dqoed}3?EJ`UoYLW61cs2amDm9Yj6!(RzkDiqZ z&$JAj$O)#P)V5xswVg71&7+KJP0j9;Ru#Vhr`Hg_SO2*$S-k=$uWC%CWv*y3Onib8 zV?B45)3-UNX*(|~t0oDYwLo-IpqLEoYk6;d;uKF~j&ol~3tWy4h)vhKs6ERCql{qG z+hiRN$1sf#wJsX>8l4(#u5#!wr)|ncQcqSkre-|fQP^W2 z^4Yk8qH8>>Um%CR7AK4r4!KtS1{FK^7o6b|?m)kl>}qOc4GtSTrCGIQxBk^+j6x`X zk5O{GJ1dyQyY8DQceFC{eP=0ex(T6<9$FKd;iEXAa5&gch-OV>bu_vxu4mGU$364Um)TN5uFg1ORC_uT3`yfesLbG|I8*)kCV7&9#3wobgeR{uM=S ze3Zd;5_}!r4BQo$^h-hZOL&P-+ZFF`5Rk3w{TpPm4LPyXJVBSK<6xM60CxtQ$!2qD zpO9SfG}X%9wnFe+=aEhaSp7p^cKXZmv?Gq0y^`#vk8ea4ADBz+{p>9|A>OSJ-))?K zsXg3U6P#`Z?pTn#;NqG-Q#PWWU4DTV-tuCeatDeVWqbJ)fU^3B$JR50f5Y%9gh#m+HW(2K! zd7gCMw2o=2>e&vxq7p|8w^lg@K4qFp?5t5utVyC2Yt9m*e_QPP@yBJ9m(GrZ#z6xK zTM@N(RYO*vIGZ~``f3E@5put#wmI156_MDq`!nxbnyxs`?sC-6@{7>HR zr+BVqf%qckpXJPMuaLYZA!xz~a{M&Z+p3NnnC2>Ag@HAERM1(u9uD2!T)ZA-)wyb6 zucL^Kaue;qZ;3yyymP;E zkuGSnCyB{+jE{$bK{*GcR39wl6vRze66C1aXTRbB+8vO|JVf3nxr7jhAYoe3xlvuB zl&MT#Yk!`8yaz_#BFjSFsNBQQA-!&P#(He2)Jy#aapp|#`=?)R5uTQXKPfh1jCJ1- z)#7c?Qn&h*@L@G7I1T)r(o5(ghQo$XjcM}R09ei4Jl$D`@p0G+)yGr0$!Z8G+Vzkg zw3j?+(~65L99t?pWG#+EV>#M45-y&5v`NscNjT zj43mHxU&s#v<{Z22NNmzcdTnn+Ys^;OV2SzmSac&4^3h)khEw+_!~q4#c;xL zfxqR(N-KsI-~sS)m5}%S*L&0iIcr2&g$Nu5&)S!Ulx@?-_uG!ikLfP<@D&nS;(yd) zrFmdAuiabq8V9fn|4*-k|C*&fOI*#5yt>z8pl6mO&?5BCn~ko)Pn*oopd+Jdq{}pUoj;p%~?Q>#;t_`NmK!n<7IxoM_h^XC8N+^ z8ELA-(FMrHc(w3tAKT7JRh<@A6lKy%3IEcrko4kDo^X0H-KgiF^)!-o+Y|-E&#|!; zf}STiWo%JviGksZy4X?8k<0FYsL`#HvKM0l`pU4EwUaJ03Em0_7Y7`g{n3+kQgzzz z>Fq=8uL~56oXT^$*(Bqthdffc^$3HXV`nE<{H2A6>TQTlXL$kfuB4B}?S&~@qpV>n z>jregNX8X)*zv4)`%Xd$4`B%DgF7b!TPFo4OOcD@4PT&6j9Heg$J5q0#u%5_OD%|Q z4yFe>3AlfmB;JG$jh%+wvF&?$(pcxPKbO^cL31J*@^d=gF7-?#*=8n)ATwDbSTIJ8 zIFxs=2SlQ7@G1+X-Inar&E{HX4!qsONjHtJwsF8EFSn>Muezk;c6``ZF<_K<8aq8_U60_&sN zK3AgT2P&w%*MtRxKw#?fkID4{hpp-qwX-koEEDS6q8D>#Y14zrk+GRCdd#g6>UTTS zDHA8sM4|mCW26ferc!-tITl8+lM`*pLau-t$Hib&LdGS6lbm$^^r82j?>2;+` zN>e-UgDByJDD`2;&5E=f9L|alzg>R0Y~mel5MS8eti&C?WBNqBZEQ2) zs*-Vdc=Jq#A-)MghLc(@XMl~T9}_40k_U}^u~W(eT`_+5%S$jl)23W!TPu1_ubYPy zk|d#UE{27 z!Q5XRg0|BRx?egcNIy@z;isDj#JbDOwsavk%V1^JHD0L!2Q~HKqL)#xecO5^S6gVx zvLKdRZ&Y48bm2Z z1tm4rLgDdf$;tDvR*a?D@Goe5>?uoxr))9V!n~}bL$E@QDZQ;|IV(uhjQvWXh-M>B zB1mxY93C7p_8V0BD(DPy+sO9lDf8sx*$`|}4`6J{puz-s!9x$QZ7UH*D8Ca*XGI7e z>!ljnSRqUriA~Ry@vr&Lsf$bZkv_e19m~H&Ig|1mbPGlaJ1^zj{OI=tdRnHH3b9g( z2TSOc)pUw9r(j4zI5LpX&_f@FqQ3m?&$9z!?WSGr2_Uk&aztBETLz~tzdce=OKq}p)l;jNe2K`JS!?+$!j9j*43s($XnSA5Y$Sf3Net7GopAo^^0 z6p-_+n8HPeXM)`{#){~rBS(_cuL-#zhXe2k@ZWE^%~5T7`pmc|u6hJ{6Yll!hppMm z;X@j|fgteC=nt47W57!6I|-;7A~wH4e)<^Lq#v~h!NiYQyS~lqBGvi_BTki$xS9ET zggbB$CEXoW4K>@g$ez(uLL#vmH`-c^e;H&q3=klV2@#9`usO9U);Yp73+JA^ynm(x z%n|N;zd;Bcc&v8gImHUNq6g#Y5rS>#z$7;>HM^NY0;7ZgQQ0%`bhI6n8wzOEr3E>{ z$_O6bho+zZV82iUUf0fda%1wS-W-Oz#L@mFIlf30y$ixMhfmj^Q1?|yOCL6Mt@~^p zZo#qQwDpz5?ut-11^t9~+1IZa6*dx{WX3=}R`KMrk@X_N7}#jbjbFxdkbC=&quuAW z`yJ+(B07RF?)Tu!kDE4IlCD$urOa07Qng-OpJfT&+rsKXKTD2tALAl6;7o4#d)<9P)B1;v;FIVq?E{da7TLLO(Rga0fN1n-<9x zZ{K?Jg77ed+Vr$-ZHeNH29zp#VbKVdnTR1Vh)Q%UdFpc2 zXJ2NLaO=x3qX>Bs+c`lK`$>*;9`6NMKd^J6YivE?TBXKEXqAhjQ%lJ;Ye~kL2F#;= z{P4tLhh)0iB0>0bQ)J;c^GbRgWBe>$Ve>bUqW9j)DmlA5xkgouaMo>aJ`=|5=2(it z?uY8qw!}<~Ubc1`Q#G+=4u1}to@8bwpnRZ6?v>DM{DaK5sDAu#zgk)H*4#}knC_?o zeW-^CY=!u;^33o1l*`hM3$G@%_OiD}`m#?tIA3r({HQrbZ#Bb$yA+G}#zvwBwpR)Y z$_3}|IaP6FNgQD{%zVI+7}<9ZB~56XMVM?B8RG2Y6S(X zb;?hfTa+E(?cGR8$of0v686pm0B@z}STFRHTthQ@S@G4YL+6t`ETxb?S-qvRsk z&$SVcK-gDzydI~orGsp0UeD^FD?9GZNoO!cxC--pga0Tx4i5b?9xh4oW=Fd~do9*# zTl=4dQ9x0?1#SbMhDqhOM!4a2JhZ)$?|%_Z{4PFIFyE?xFoOQeI9sJ+91{ zuT&`L;0*PZ5sQHk??P70Jiy>1Vf24oZJDeMb$$`EbN{=Prqq#fH}t1vHv=$@ha>om zJm5Ddv`nydRPwgrt78%}Yr&0AZ@$A+gD^PGQQyiwTIaAkrFWKUidNV5YwAWm(_44jS-_OHtLfkmF6M(i~1a z$~r1zZbToiShGCqfECVv7?)ppork?Nfhz|2K|HL}Q(jFIjtfU&CyOPkl`bOF^H(9! zX`PaBeiU6ER;$`U7+F#MpF2)Db8Gir-F~UC$JZwLBYEFjt2{Zm!HR#oKcy-@C_86g zXZAPfV^!)6mROxh`{IBb8j8zQJqCC4kh!yZ<;?4Q5dmHN$3JOTPSQh-NTyt$aB^1r zBKW>X3V5)D^Dzc+eltgC7usrxD#tGDXuqDFW98y3B`3i)6KCr+SSZG=?lS|(h(A@M zOpR0ueB6*FRhwcu)pT9pqv*gwk-TSFAKMb-iTk6<7Oh${jwh8oqV+ryb>^qNY(Rsh>WkP7R;Q!BlKl% zdRA+YH2v(g+nET($fpj)B4xfx?jD(2G;B;8boxqRed3MsEXgVdojD`hubL_vD&E%C zOz7ADVhPWHr239o**IF*C7ivL#UtV=@BE-aV#3C~S5mgmT+`yu@sZg;T!g* zm6*!M9qc?}d14YR*%Ef0-sJ0CD4xbJ&0r)SK0*CSP`o2Ai?|HOn(jYwGA>jo=knvT#Mii7rkvd!~F@Ee! z#-%K!)t2Kv_>+q_1|?At06rZ8!ntPSPd;q}Am|#`K=crN4uKsnQ>SiyH-gLI*4eXl z!FcC(g$(Dr_HGfThf{IO{-UIYgpuOL1?Ub+#q8qnrrRHnnLjnt1WXn%<`X|3{YbH1T@|jYE z9h7J*l~383S54ZR*4KPC&5D*HXnBH?OKt#y50nLYyTz1}Ow|??Iqu!WJk$Kt-XQ2+ zpFqf?)7U+2{R_~znDmjYA%`bLH*vGkJmMh`3rM$yH}?7QZkphxXK7xHcY%4b=S@%M z=rACMMn$iACH0X#+^Bqff5t4~K#JP(S4$p};*2W52b_&oQC2eKoq3V+JYgk{#!|8v zo+qU#7mgwx`t`BvP5!ds8rUNWFYNj%34pbT{Q&XXh(YX zVgAp;0s58a_8Bb}taWW>QF<48V}cL1yS70AnE_1pEgCVfZA&fUkyHKufAxhdE=VZvI)hLpi za=S&x!DGfvpB8mi?Y8ITSB7frLS%=DaGsowFuuSUmbe)U>D7j~qd2;SpuA{*BpmSw zcnOR?FImFzc{J6eYRZ`5{w~=*JnI=>w|R`z4i!_>JNRv9qgY4et&aYHkx5rwFgmn1 zlw<`kyozpWpae7z(W#YXA39o;I4;4$MhgbUhDy$!{ILd#?&1~n36j|eWn>Cg5fTE# z3jTuYjR4S-j+y9MjR`xt~Cj$WgyIEKuxs{=(sN=R) z-72%UGTlUYR=B$ob>#)jP|d@R5)YDnO+*Ly42UhNDw^(w1F^S;DqjX5i&@8*q-D*s zybj0(YYUKJQ$_?o!7-*l%%p=COI9=nZC%VKXafIo`YMhLZhTubV>0+i$Yg zC)H%j^Xg0wfS(#^RExBhf6EyW*}it=gw1}voUZgOSirw;I5_@Y^+(??$@p4iNhh4t zM^XiIosU5mw(ujX4+98}e@s(mTTKgY1eXNkir;`_7E3Y>pkiIm0 zV_P3S;4b^Fj9emt+4YNOIm$Bc(%|G|N%ux`em_{90yRdn<>+fvt#_iIs4O%F?%< zFc^EQ=kbNOa;9SIyuF*aU*sJx765k#-v&m}TpQ-YN71CnB#%&kkN=tnMAx9bc}?*w zkJ^X5YqCVNm9G9${cnOX9=!KI?Y4JTy&VIMm?s%80eq7d2K_$J5~p6LQX^xQAKzgp zS~Ao*(6Z#Abap{w+s~_>b|mHza{621totV)QAaa8=J8!p5d-8~p=Gd-w$tCvP7S!K z20Gwq{=W&TL$*%>neeRxcNDXl7DmSDmKZ$JD6dW~I;zXV$I{|Q0%-_Q9k3bc9E=IG>` z2QGKy=-6&+J36f1Bt$CIZaDr}o~~x{olu*a3QkQOi5EA{*Wbpnm!tS8+fE!wXAYaI zjUv($Jle2G6FSIZTcHu%CviH|V>+=s{Zu;DsJ(8P^QU%O)N)(357J#9g`ryz$YheX2l;m2Bw5i`@4h)sHVH1;Sv4iZfWN?h=un;!G}%D>b`hA7f>6cO zw540u;PrQDOyfDDr~5K5(;q7-%yLFYEHjd<^1x|N(`N$IpLqmmkB`jP*HYo81q=4< zFkf>7qf_5DBxGgpO4R~MAK!<>?gm>7szi0OkD&?QA$?TG$4KrokF`$pTVie5*}UVY z8k65>SGTp;@1wJJlm8YLB>itF9jv&?AVmoK@gcd74zes{GiFi0r@28UICx0Bog~99 zXr#v3UGuP)uGFb;KrN8GWRpdxqF55>Z!D zzd`r4B=HO~eWZf>t*4cI6=z`z@eLGgtzh&rIKslFLLjPx%l2iifY=r6HQ(?ft@xE*Q3&|$IOuT5q)KMxtBstColV>uZJ9WGnr5u851t4bT6Ij_bgj#NUl%y z{rN5qN=V)d9zwbpp1!!M+2)TrIZA@3gu3@M7TL5s7=c;QW^1W_{K_rEL>V82;Qe~F z*#HckqK!bRvG&_`VH16G;gvAKHT3%|>}657XZg*i=^3ed32h>hMaRIyTQUOhlFdnK z{K1ppXop)H)6Z}3gG2ZW(r6w>4K>E!y*n|^<84JF`SVoZz_Z&g{)nXesAn~;LBI4@ z$jZiJjwm|S_Ow(LCH5@Z>g$8hty|i~C%&)F?h7QOdph0QWqvIdHAu`)1El8hZwm-4 znIw|ZeF)#=>Tn0YM9fp(v1f@RF&`5sdhqN^c~z-!w{SPdaEEEU_l~y*#<^W@ta&6b zRZoz8N42dD&m_Ru1VjJ5aiWF6dUOY;>6kPY#;B>A6zBKCX|}c+e*0I$;P-*TZMQ^6 z(tiFi0;W01v;_`xkTAV=MsWKTjgWI!kL4{2eDdOlyT%ag81~VX#b)}7p>UGL?Z;*@6y+H(XAU*0aagCw9#H^@720BC!&3N5=NVvvo1VakL0)`vX%Jq(0+spOyjS! z2kRb|Qg6N?0pd_Ep@vj##;o$KQy9(s2ZG50NgTtslv(==C3@!}q(-jxc(p>L`g2)I z{KZT!RAUBTfhZ=>S+65|6snQkNxXgb)|;@tED`;%7#?|vDQG{5pNf-_orR6_88-TG zDrjZT3;{iM5cF~)kG_-sgMOwM&zcBveC~EisCaM;l>%I&W2OfkdHLemFP*ONY38=BfP)s?G?lk9Z$Yi=F9+-(;E(&zM{b?Mi3HE(-oPM_Q? z3H2Xe;IcQZ4YZGBCdwMc`JkQ#o6}?3U_O|W9+M^Se7J8cgdJGMsz*LklQy7gh( zh-D2Df_;FD8Y!6l#C7vWL#K(NW%5#l1$$jgM^w{mn zAPjNs^7DPeFE0&pFPJ@(5)5gdomJKBIYaI>!E$V9t0uOOOB+|?8TFRr31^C-*=)Td zt>UMw(MH_PPR{v8eG;89^9!$LEZ^v6n_-3&vbPhHn=x*B7FD%Eye=A8 zy%U(^udEb}U;Db`s1flRrGrX)?8;`TPtP7Hf*ImsYH2avyweX;rqae5BNlZ~Tj5qH*-jp*dlh4L-2-CeE2>Z$$r4O! zx(yPpGLCuXWVWh8HOx7CiizN2*?Grf$y9OtUWI-u_l~omms`LJKULbpJ5@-~>T0#+Q>Dzh zn{*!|d9iwM-||skUf-e$)^K+LlvQV)tFVu2F@p`Wet`q6EcaN}NU!$PTLAubvrEe* z%f)>It+Q&m##(;H7+d%gMmgY|vpBafmlk#VL(ldof)C}aHnAs8SX`RLFYmyW9gOFo z)UOdVEB5)VZ+SBMlEysvIkFd3_pAS{ESdaKuX%Lp{HdkL(>3C|>00kZec(5X`7Ouyn^eD*WVfP@ zYxRN{w`QTYZ!&n`-SyJAOhQ8n=A>ZGC1?}9w!ya@#n9U(m-`B!kybr4ZRlxp92X2M zw7;{68N6!m?pe->Yq1l}3o^WZJWZy0As(nznpfzlF^>Z@l2TAeU}jI+eq5neOt_2Rg}rz%6cwJktQDV6pYxaFNc06xoz{>ZpTuD!KDkr`2ANtU12q&=X5Cfru} zW8GfELjNP~q(b2EK87E$?>AEH5!LPW2p#WvR32(7peU* zS=WW>r>18ZQBPwj(U$iaKLHAoUhvg{fV}S9PFEi!6|hqS{(ygqmC=8aU&NHG7Pqi| z&>s3E_n+%X{WEUZ|C8;1u_o1j2c!NcX8r$#mD!yiG&cU>LOUJZxSAL2Bh}-^)wY~fU>g_i2B%auj)e^!Nk?OC!+yBKYk)a4f&MGnzGZ+^`&Z{j0Vt7 zN+`+n3M5I89*?8n6Z9)Kv0|aOy%0WjgpAFyV^9$_6`b^B#<)IAqgv{M47PU3#>v7m zIXU-X~;6o1iw`q1Lw|LvSSKwrAQXkmb+|GVR#{6zyl3zGheeh<(xe@DN- z!2^*1ZT>)C*}rHxfK~^N`SUw10IiQh2$BR&(h1N{@Q>27E8y1b&$u1VRJs+5*SP0Q-r6 z^V13g{U3usUzk83r$-==-~$jS+zABQvH*c7^?|EV0fE+Kfjj!Q&+nhV=Rh(b0z7;I zd^`dId;&s30wUsj#Kbpm5|iI0xqXj{oSK@7oRX53fdx!U$3#y_`GE5Q(_>aPb~YL? z7Z2AH9+oF;PyU<)hmeqvn27j3G4cH;w3M_@{+E~Eoggr9UHCYETL4!6w&2{r1ul+| z=qB+k;DG9Te}*6T1|BXxJ{}%$v@ft9ghz@`_VAe$!F^Rz!beWzydR=7h?u0y+bGn= zkj#8<-ud4orlg{#p=Ei@`UHUf7Z4N@77>+sAu9)!S5Q>f(A3h_(bY3Ex3ILbwy||~ zadmU|@bn4@3&2W>$7iZeD&tVMS$CbxmzueM5UkXIFPmZ(slT z#N^a8;^)ll%Iezs#^%l1iW?+9*u8h<0IVdBnG^luO($jMSTF|gxR zgSM00PcHzv+2rzzS4imLR@`-TP}6fH2rs>W-)51s#b5QT;^`yS&(Cj52Ez5Wo|Fx= z)|4+!%wB23I}UzcM&*xgY-~Wk&&>C@JJKT=#_D5iw_yj8X9tn66Jg#7`HTUA&L;Y&nvqGPsp%u=P!|{SoPxb%|GEv@5$R9f~8R zGk8~vCXn~L#!RtmMW(3N>kdQN2=BBO!9aF32PJc_5}^2IN%~`fFYGa$`1CQ}fD>kQ zLGY#`Yl@^W7j3wod1%hs?p7!f7ZdZ%cO#L@F5s>4I$QMo@y8ug4sl5aj*>Zv@Vkbz zqi6A=dtQ<8WxBS?6*q|o!Y>?n;6JbwrSiC}IUbV^V+{>trFlT{Oo1IQgEjTB%y={( zv>LTLig1ukQ{hp|)AZgpR!)k9-1t5nXB6I>*sW#brfM3WNk||CSV5+y>>o|LWYN~m zJqn4qCV36}l-NF-yg(hp;xa;Z05Y3AzvgJ2;F66Gq`a#2lqXMDUkooT6{Fr6?`a=B zsT~-Z)X9IH)yFAbEnWlUt<`^z>v6r$DlRCgbxCUodDSqjHH=6&g^B0)zw!(kTL^_P=1!x9e8Qbokv~#b42@}4`z9X zu2;R1`_tP+eQMyeqpnOpgb-Scgu81V?{Jeo1CuKwy2%P3U2zJ7U|7PY-m@Afi* zH~VX&v2i_tPXm&ewvWzi!+Z4L1Y?8*Ahjy-3uP*U#H{XKC$ zZiIlRU$VLbkzvco_C0iCKUw7QbH)1C#8;=gszSm111Cx;3g(d_1k3mQTgwENE$cO$ z#a|XKTjp?Al_6kRqwQ}NX_JFIsv7u$URaqF-hA^Gw4>}*8e(ndQsnL4y>6Vsm=}xL zsfk~?Vi3Ue#%F(V@w_X4=~l*v{;O0=cj>0PID#R1?cvEq=IDpT*5LXRC)E8 zXuqDW3!VDV4m&x&l78h3tW%N+U9qJ)dBA@qk}O6<-Q9Lqe43ujw{p}^U=hQQx-;CI z+3$!%P#$?&K7ZC^_TU=UCGds0X6n%73n{a+XpQeXSfy}xzlV-uY?alu&R*|#(qP_f zj-r0>RKLk;GX(ISJT{3)Jq4m3d;0b~1a9g*cXDSUd>>YCt0z&h-#l=>{ zT&iM@UrjKH2d24(*R~G6gC(Mu)^vRyuJp#Lm^9>E@xQI_IhZu5T&t%6c_&|p9&Ew} zK0SS!6JxV3mZm^m`RtS#0e~EeI&Z2PER1~V=T)4EV6=^=w>i;Y+9*Hw4Z6P5uoE8oFLHn0r}Xx#snK`K#HZ3ggwt z&kZ4;AJoHq_K$y1U+(WlA!ZxvSQJ(iOijibg0%?!NfbYgwpsGGlx1guf1q}XjmYw9 z@{`{ojB?#WPU6Nn2Td`3)Cca}e0vf_si>A{w)89MgVo&287oD- zj-E%9wa(E*3fwU(wA!W zacsekf+bU3tqq->;}bfaGy41fwmqLPw{l_Ut#(P9{>$$fGMTn;bEO!3cZZwAmX&Rl z9dJBtr)!YCv)cqyuHS?2$=(s+NzOuGJU=Y3gqZ~G#GDkxO zz>HAaFTFEx85RY5U4&_&KdhFh?Uz1vojZBsA^+Gq+AlPlWY?JOV;M%Xt-TJ;Tmk@LvX*!a2k+UcRL>CxcRySAB2gUgrQ7GI?`3Q8!?CXO*7 z*vT_K@ZK#X^;}sBE@OX>4fqRCHXT$}Cvc04qZ@l)r&N7-!j(u(LxTDSE(eLUu)s19 zf$&4wZFXZg%+to(PNi?NJoLFl_cL?=T3gdg?cL_5-F2EFVtz`hdlv?dt!0}Y3%+n< zltKa|(91Ar@zp9_ z^-io1@-T49Z0eNgTU=S6BWtF4xR>2{zI$@+$B@4fttBGabk?~f?200SX)D+h zsb0Lei|3owB2C9T&$`b@B zl6wt3EzMg23`uujdM&}eZnK7biduJA(*%_s(C=%ChhKg*TWpLM5rTm|^?BRJbM`G% z_4^KgdG~bOa%({AXX-BnTO{-{akxJF{2Y8f%+dE0VzsYwWm3{oVs)Kh{0Mqy3;$%6 zU>v?I-5jEX>IqE4a?zO&gJ|v395bdXrfOjjaBONJW=tkNGiMdtpk*^$Zf!b&W6MFtlXfoPRHTHQ#b_oQ=uYkA5-tLb)A70+M;+iBhfUz%b>`rg3yR6Zr! zrLm%2i)MA0b8X&`$wkpI@i7tJs(vpb=7dIc+vO9tTmevhc4SQ8Ge~pjL}~ZT1>cs znm6Cn=SA!I!+1CO8k>SJFWKIL&K5kB~^Ofl;qc|?fX_8}plk=5fC=$C=;*;wh zvy41GJ1*+YKC8aAlf-?*N7eV8@?PQRlJR3p#wn1b{ioR< zZ&!W(<^%sBH4g{b%qkz*3X&Si<;X;8oH6-x@afj0aQokk?r{b$)>0jRZbgzmSMp5#i|&8Pi+3NPKHA=EN_^@Y~Onq+uhyksZw2x>om zGi!O@a^$6bZR~7sw8?S|bYaBq1OpqvXfKa2z_bO=`@C0v9qtdCB`;XkMnlit!(${q zb;-2|phg1sRekhVLMFMgzyhaV-=lWgq!{P-OQY;z1-XgNdMeaFZ|h56y#k^?aSHMp!q+-8k*d7tW4?dMzjZhI`vO`x@**!Q~4RIEGB zAAkn}k&iqQ5vu#9yy>1%t&;vXrq9=6Ld(h?zTHg?fFoTsf2n1clxh)vX_SU_~*D(M45Y#Kul`xd^&v92|s*Vl5v9QPGHL({BV5PM2WrPejJ&p_BU% zWHKf551GxF?7US*{Yloe{n$Ki%=PHGRtWS}H&=0*q&TbucWVYi330bW$K#j_>bXCq z`Eb0xTsQlOCEGsw4U!m!EN^weeuKzi_F1s+QfI*t*})##4sNGf25Ix_W;ymAYs;G< ztKNOw%L&SSuj4kMK{CuClNpBxM8$9-4-z0T+|hH@9<_<&0MSBu*H|qvpJXuY(E3fOZ z7j0>96JG13AXO8b>82$#C zRXa0>jEXlofAz^Hgmgm5+0;Vaer|NGI@Kk0Ypx&EY?sAAQ>}jkc1U~I{H;lW0C!Wm z5X#j%5f65&Q=HZixaqcsk`D$~VM;!$JUOTxFHJ6vRp0o{+yn%rn!XGZoiVoY7Gv1mGG<}HWLx?;i2Ri)hKFc4^_X<{(65jenXln4f{Y}B@L_jsm_%&B`l=iL%n+bym z^t`O3VaXdC)C@NcP<)-@GZ#z)pxH|(l-hX=U-`YH+>qdLzS#VJsyn--){yY>z=mX* z?+2zZ)yKiK)1yCrW6xrM{6y(g^!tT9^@PFB-ozB<{z@5rL1T5Gjo!RDB!xIqUj#qS zM0muHq}d}l!Xd$!!h!$#^~be@on4jqDA{8z`C4B|pUvjh4(H~UTFbul zkn1cTR+ivK@F&jE>x6ULSK8>uxIp~X4Upf1OT_5Lml-qU;w)@2tn&Dn7&fEj;m+-* zq{7WKDtQM+;_g&9V@s`U`IDJyEOtPF(v0jF@h%YWGUJqD9$nT6A7JC;=_=%-&p9|xPPpvE;;{CdR;pPQBOKqp;udPU;l1%YXztGOJ zy(g1_Hj?M>jaejmMA{i0j>iCG+6?Y)35W0&eAviRTJx&K%Ar|K!v?Im$czgnZ5Y|~ z$>j-B?e7#K$)`+YL4zEd`9PW@XgJ=yfOSO>yqa|IF>2-*mlp4aTseqRWI_A z5O?$h5NP`AdBt~H9@kDi<4)#lIMyQ&x=G8iOYY)i^HnYuxug@T`C^hOl%D<1Wh+n zy7mnqbX-~3LW@7Gfa?~R$2 z!e~!YX}nvR=G#}b*i+8J4AYYjk0h&W>#I<#A>*sVsw_F{Vp&eVpx}=Z&9a`=*I%cF zxbE~*yoKM8fL1%FS3*PSl{{C9@>qz31nVI#TU)9Z!9A7Q%|?3q3*D4EII*&ki---zQGP*sUU0xmI9W=-Pvpub_y2w8Jr@lhV z;xsw@(7ul%L&tnx&>1sL(7X z4!+ed^tz{jIpTmnM=^`0T=3?_I)?`h%lML#4o3bWC^>N^!s-C83(M2Td?iX(H! z+qKfqT934n83;bxAG!A@`0T%1kD~&TJ8P5er&Hf6}HT*qJBh8H#0W%EMwEA zX*IDWE`qXxH^?9#-YNM)+G`TK1NL+kGQUE~N1*eCPlN-ceXNI!9|5NDYpH>__eVyzI@8=m0 z&7bY7hTk^3QJ1ki*IE^1vwFmLelaYWR<&D3GoM5wo$0;<% z`LqXT5|e!iR=nVR#m73tAxB|RII|ObBw_2~^hHNR)*5T2dK-3If%a{F26R*-PSsc^ zMzQw@@F?c~cbEr+VPlF?cmZt;w$rI*k{R#5>p!%VP_balZ6(c9bbXwG?{*2cXUi|O zvGdXnv4TZVj_ckv_=cB;UK7aEEVfr0AEtBJFnj&&@@gviI{nT~>2M~AaqZJ`R6MP- zgO~v@6!Y&h|7$6)8$rYI7A{w%TyNa4C?mLN+Vm`7K+*4_SNIi*uajA!!Paen3RP(i zb&l0?d=3n)8oLOdzXK2&`ouJ-e+AtsZN{~FdJuwu(Ju;U9CdG+sl@loN$*4`R9O*jQS$NSG#CQ zHh0_IeF8;M#m)Ei?6m?`^GGh}-CCCsj%qBsr)qDuD~UUY8A_LM%YeG4Sao;9$?a=v zNeVMky(h!x&3ISreOt%rCn{=h5;p)7)ei%0#OaY+P)`ueiRqzZGwCN`SBqNSNh_!^nAryH}|0XRPw}aNyy1M_pqGxUYM|u4I8DlwtskZ6)}zds#1o|9XY zt)An1Zzn6s?eNHZGgKplD)00#<$kraL}3~nqgPL&o{nXx&O!Nfy%#ah!9tji;q$7k zoxUzY7{`Z(VW#OlYOVE71M*R?I-1~9{`6-8F)fPhs8R0GxJ|2&&LCboY5wbB#4rd? zhhk-qN~2MP6zlbw(61J2-1JiYbp{6yc+%=&!vFDoYdA%t=zZnpgFJ)3VwqnrQNnG= z$Ip_kYknnonu6-!BIv2#HCDCUgCy7^T=05r?R{s9mC{J2$5pFa zbl?QTi)e#rZ>v|KR#1CeaWX7Dsy=*S1R8Yww!o*i=Lo5!>m}WSA;aJ{blti822Y+z zvRbVBNY&4s5DM(=bo%BCiC49sZY~ITQCEf|(C=$od;KWEu|5Y1d>h6WXDM%ZW;*V2 zITXxh&}jOGFcjVnD=dC1krfKaD2T?@o_$-s*`X4{B1lfjw8U~P9OR$0BNZW@!nB_6 zn$?>&|JZB1sI~X)Y2@PIJ|xrqdnVmCC$FhYnTl*jS=7iNmhU6}-MpH-<$P^L{W~h5 z8g;5>+n)Ds(p$o6ift1xGcVj{bUcA-&{0r4-zsil0U^{IOR364!Y$1i15|9LbldOM zKJ)tM*{}OF_so=*c*6I}A}x{0=lw{}#ULEQ;wCS7E@v!w8^kx_PjU8WRHDyJfu!vg zcTFtQ^bBvX4eur1?=J?g(z40{D;fw=%zRBs()MnIVD`H-(esQCH{OU`whBGL(Tr8hc1H`$7M~gqg;MxI@B~9gT--k`4A*b@@o83pEl8 z`?@Zwr780D$<+PntN7*p8Cq%PKw3ZZNfQ zh#Qv$2Rm*KT09LMw$eQz669-H%SdJV5gH2}fXW5aX+OUEcgfPMiy4cSYj&xcEyAJ1P@&{qe%7dX_? z?o*ZaFL7DQ%zhz>b`9L8??bc#jN#N2d=6q57e#otYdf;NiaY0v&V10V7v!cuAue1* zq3dAS6gPP!z^z*{w&_3gi?rL4==}QbckunlHw9*<_iUX;X8Kr!zw|&kNp(+R%-MaV z#+=W%am?Kp-hY9&m(_)XV@I1>Q%tO)w)oa)kvkbE%1ZqgG1re{1pB;tw?Sej0s1Z2hq}fm!5#UfTb&>of)(@)> z)lcDZRgk3DQLSwvk@wsyzFB0$(hGBQ-SWT%gJ|!D6Fg^RkSX$A1UO-iKc}nAnSOn zKbXug0)lD9wlQ};f!lpW2Yfk>jxlfIY$?)5VszbvuB@HxcDwmK7(ePpeqM~)O7^Qqnc8!+A@{L8(>eTwRyFkr(oZ7P<)ejlAIbvWOoravp>7H; z_8db8>grv9Z577{F`^OajmX3al2bJ}VrupxQY)fVGE-QIXthT}3_M_W2B$r=7;Gq% zdOUI4M4~m!07}5_cC0~32qcd;P|tF?Y+1Pc^Ke)Fo+06*&V_CpHZ`c)H<%g!{c>q# zuns%{_KuC#tL=W9B+)yx#z*sBoVmo=U7TS0;x@AvL;tYx4P?22aqjVRV>{=3ckVgX z{PHn>5;H?j591mMx0=zX;hp0P#8*16^A;wq4n_@pDe$kJf zaxeH4Vi(Gr!(ErV(_eIa;l05*N>O{NV;nT@b_2N(eaRA{`~-1msfW`~-_#K`^ea`T zzHSa0t+Q18;7P ztQI--lAvO0OK4;SEUV~82&0Hy{xzV96dtipqDyJYm#f1L*wv6Ld`HZhk_5oCxr}KhJ?I!G{qWz!(P!ddLi8ClBBd z({B#xJV<$k+Eo{a903D{2F&GsVI#KzlZa__#rY&7rJuu0fMtW_q$J?Yb^i>|;zsKO z(^tI^A<}yuVSj!RYLN+#5;S6zjJXU6F6;IW04DgR{0BQLt!Q<3OMX^es%PI1W9;Vr zW%1#j@$DXbcIw8h)|4uNi4}QVkjU%g^X5u;=RXiMzH-&Wo1>JUeI)zkx*wN=PuCKT zQ@)SC^}UCq)rfpzM)~M4*L9$WO%j>4`MRk!oh(U}w>YOuM%bp-;0+b$skhYGtNq!ag3T>Bmtboo%*gG^oK4>zx8 z0Wt^zgReMFD`_!F>fsnaGkSQax0tgtE`S%f_7VwCOCb(O{K?MTX*{@Jc2@g!tNPTYYxK2zeqVa4 z81?LQd4$1vMuTRd(fMaRpvb+=-mj!-D+cmYvHpHK?i7KWdpzW%jE1nB1rGKirC*m;uCMTP$cSEs-N)FRr@D6?h~*5-!^qVA)gX3$iYhVePgv0=`%L*q za}`Hn+nZdKje}Y%N0(9Xshy87JfNi_J?DA;-XF; zc&4aSN@DbZ18s>M(bD`YcVW52W{om=Cli}jiZ>!|I1re2{5Dj-iXZCKYOh_2&-5&$ zbICWt5GTg0G-Wp!`i~HVN-HBV1ApvPFyJC`Sv+ERbM`@+uQW$d_9zAi4`+DJni+j< z6{3-DJVrLzMU-l`a$a298cwlwq>!zAo?5v{o#Dv&l|WnOMaG(17Hb%i%3-ol2?*8m z&RziO_~Ku>bNQd3Gw&uuT2S=Rg^Z=GnE}tn^XxNoKc^kDHGhVhS7>G#$J^GRUtng?yNZ!EW1 z^9n89%8@9>h_x9ls3df}Y2frOjeayx_UX{JNKA;8)H9auShwKT?G%Xv0Ot5~^Z$Wi z=05_b{+WIMq|v67E>15bW6F5eK{hjyVS+@s_QMq(v`YgHcBbW2R!ajkj9@ z*4LqyGJ2cl{GK=F(Y1>+BF-rfBWJ%(`X$d~-|Fg+(^XZzZ~!PCnIQpN;&Z`(XPEj< zb-A*jljSXa9}!O0!+r8mo7y}2xsS|D`MsGE1(+4FNy~n|QT4g_jjtzG=o_1^u*fIR zhu+;6O?fVcL}v`0+0XacyrB71Fa?uYzx;vRIW6%TUO&_h0uovcf)-+TFfuyDeum-xE1VlU+b~vRk?RvK}txbVEJ7k=>U(N+oR@rhn}gg znagW_wgnCt|1dkjN_eM$K+lD%8uKcPgI4F%*2;@W${xDtj$->h7VG;ZNzZGguNTk; z1AVxQ=QA@-x^Io*oP#mC)D2m8EtBybinYbknz9%KU|`+)Doxp^@ZQrn<%g^vzNyKc z^V#dgen_t@K4vNT`gKdpJKK5SEVBAA4^(jBiZ}HHVuzRJc-1P zrk@b*v^AN1guwQ>_}aH)ltpcrMhT|*_&s&sO38&?k1wk!@yTO*%5W_w`>F!h@l0k% zo_b)FV8jGG{VyCD{AI4Z`YcA>`Q#XI?^7yDUtkP%JY${DJurTIHgQ3fihZ&7{r>eI z(p;w`Ca52qfW^n~G@%KYb_VlkF>>m4qrT)U<8Oy4`7&!_^`o!B??@l=L#QVBt$F50 z(;JaW&m%P8;fF5gushW_)i&q1M&Uzt6H*UyUk^=5S4XmY6CacBaV4x0ZsMKWX2Ea< zoM})0k)lP2d)LQ^`j_tON5OVy0{9s2SL{sz>-m24J$yewMY~f5#Il<*^y&-XcLxK^ zAKjCbMt+=_XgO}aCRxtE5-kO8m?YtzuJnrjV5_yI*?E*o@nK^Z%`3b;mb`rmd?30c zfqopBgr|*MMt3<3f<%thTyje+v|QgSR<3}{-PVO#tCZziy?CW2DCRmt4;&6k00s;) zbLo8h~eLP0W$AlIxyQ_TW~&g{|Oq-$^TCA zZTau9PK9Z$^Q<$&ETdaRDXE@%m?^~{4>1~{jd)^bqq4b5Sj6OIjQ*Rq3aV4tzgEuQ z>9pb0_1FQultsa8UD;JG)xV2SWQm^Nq8 zkC?BFP_BG;ha`C>(eqw0=179pn>NyVjQskcwU7Hctu^R-2kzAHHnsc{ojLSP4~f;_ard0uXt)}hY-9d+z#{E9+_XhEP==ptzb zXI|utm>J|h1NHxtYt4V=wSo2MRS*FLNE!gy!>_;Jsvb#TLGDp>@QW%ub2ghf2(>lfcUqnM+b;08viR*j|2mtwgFT*_W)H6 z1#p_!OCZoGpjRRG1c9U?0mV-gp!kUaR63tPAOYa*|4WVYFE!48M`!fs)i_JOnhW*? z#YV$j4@E6~N(Q)Wi3{<@<}r`2w#xF$L7O_>R3!jC4XDdsM=1_ z>arfLHTn zhbk0|)fS!o1U-^aogB|fl6qNKUFT!S0t?yR5|B_w+?swCO=>kjb*bGu)5YV&KO#+; zCTj#Lt4PKFym`s$GH5^lWTi%+;*W;1o4sxP&s4P<7I!52Vw9H+yrbItOnt_+Hihsv zBM?Tpj1T125n>*pd&aca94?#k4ajL;fyfH8Dm3y9zv}Gso-%V(6$?+|nh;!1tSR8y z>AUkQscpRf;dlLD-hJkdgrAmu#pky+@kmL5N%lxl1!WO4+6xAf>G@>Q_8*m^TDw?J z5^3f#ov7)>4TQGEGrWqagqBrSIi)+zdns1kW^}iGxpU2Y?^dW4II>9Fr}1bhFc!Jo z1^V>p_h|QUQV?dJFBc2i6uzWi#rn8mW#2EOB*cf|_Hz5mkax2;qqo1-nP4otSTm2G zZXOwf{6_GryG7(J-odje3+iO$9%RsHsk@%;+!wCk$Gd&acAP3Wha{*uup>||u1AvJ zl-Jtsbf2rha~fb5&SdM$8%B#Vu6>I+^mu>$L8NFi&vzG@qlL=0?|c(&=(>cm%Cq|E z(LdLQ|OpYa7Ogv>p!R8qRUZ z@q@+EFHkmP9|zE=qADHE=yt3-0@0}pU?zE4ldIF8A4jg}!eT#O?RD*#0ns%2n~Fw;5#@1bU)G$W)E8VdIk?_3FUN{l?dsHl zVu^)b=u_ic<^A3hVILR#i%B=_mAmb;F*C*I2CYP~t&DoUv0Uj4g??KnmFFf$rgANr zf^q8gLDBRwn80m6KfdxJsTS`t15XH)xvl+n6ir`qO!*58tV#s0|1?9mbBTH1B~kGj zt!4*R!OUm#I8~- z16@UMuk3i9cikX&yW+W5+G%@`@tmROXXw~7{>+GU!eHpsC&`i)f$|sOdlOtQM%{|# zhaCYzQ-~}BP+jqSt)R2rrXOY4>JpkNFnBGFlbfI9XiJsVb$@6n+dsefOk^g!7rSyv zi_rf9@A%SZ>$uL)O~F!m{F(Svv0I-K7SpXJm>}o55@jiLUDth*_92NSaw`hcpnsTJ z+u-M;8s^H%kNL#Wa?EVnCUSJs!{7g4*4~Jrn6_0w>GYlq&Ogn_(8-Fk*JkheLov6n zuR&|Hnb3Jtg#)3B9qDJcUYjz3O7LSPy z4!41;k|8RT%Zt>WioK>8=~@j;NNJ5zq#Sk>5@-;!be3qy>2c?miBtG^9N60yPLvY= zLcufdL=p+uDN{L=;+eUKq4e1o`%Oz+i01l55E_OsrMw%qKT|w8ArpQKx!=?KeCSJB`t9*LQJ^(nQ^xMs ze=pKg7-hx7bJ6cSf?u=bl3&ojT?cuahHKNmY)U^k2;#hYmP)+nG+=Uc4zEqCb$GJ= zIHjU8(`~E5X_|Y6Rs6-Hv_#zm`$G51Q?F#_JbWAhK1E&8N5$L5k;6*vY9iI<#!$hYce#=FA~3BC0By3o2BM?$`5$%PW4BjS6`@-FQ4db#ivah z+B;ie%R6{D95XN6?Tn=vOz*YTN;6b^9h zWVf;2UB7I{1}aC*@Q!xZPX9=U@zyp{5MIwv`1miT2*`Ct=w*j_~xU7z1`jI zUB=eBg6e*^r2E&5OwdD?AV*Rdi$@3ju%~&eB-@Qpw~@1Pu@b@I60SvQ7NX{^Gi*wT zugH0l`{CzLdeFz0U#XHPY-Hzm?$o?}sDsY$lY(Q152SH5Z)>F=dW2O@sB}hS=st8t zsg$u5&{+{A1nBf@($dT154UT8->A0V=5>GlZ+J3WnQf=1`7(d@p1l(!QV;DHfQ6N; z#MtwdW-R?c^5c)?&7F4+N}m?>_O|=)^hR+IIDJZvOb&Aa&V!wGpgNArSZP`{PgaF- z>kS1_$9z>oI(qh24GtEHs!VsjJ$&1|T>eXdiuhdF@{dx=2VX@G-#Hp!qhZ$#J z2WF)-8)NujXlioGiTEy4fb<1hA}uYk_+Ct!w>eFPy!L-`09nvDO7@u*?1%Hk4c*8`cKx~TQlM8ozGlE zpL=l+XN)Nd;G+fDrrQ{j8UEPWi&aTja88(R6OeRG z9KeS42xK#!5FuWRb(#D8V=mRd8!1uC*wHiLjB>3Q_vaYM_DuQu-Y**bL(`jSMv&$G z+CZd&^tVqZW7FHr0EztTX!%ZZ5}c~!n9Y6Zht^sRHwoLc>`#z)4dAL>$L9bcK2tzA zU921avFW58pJOhdTY3x>0|G`-#GBbT>Z5lJ<~hXG%t2Wg4%xf_O3UdjT0Av;lY5g+ zZtAQqu|N2h@>tb`x!f9IyE7X0j=(v-eIWK7Nz;nRvTu9mbUTJj!#4Ih>+|PiS|S^v zV~9{Z&&`b$nH>CEorQpQ@HbZEU zPU!x?ML+}(95?qL$CVW~s29!6_+_0Mjcz$1RtqL{N zrFhsjeW*KUs#1o6BO6SadrR@zX1X6^cuZ9+R<4a!_YEwXEYlg1P7QHK${WPl49RO3 z73N-GQc2}eqCJ%>y^mjPN7@L0+nG0v0zg67s~?)zcemPIE3~Z`ZMFQ_J-faLgBkEa z&HA=+?suv-*TbFA3b|EHin!nmKI-hyvwIi#hB!uTbin}*D>>OuY8w&2wPR@t0TVBq z_4ut%#hEUOpB&;~te$o1u(Ga&B(K6!a009rW7~Rn=#)3Vej-QpDQv8p-MjPuhQ?B>sZ! z{z^;aTR=@46CNZ3AE74(sD0mq!%ScOQ#hjQ(J<-u#e=gti=D} zi`W-yF%!c<-X_DRe8mO!ZOZL8O?pC-wZnM^Y*xuxWx5JjjTab^Zl=;3veiKXj{EM` zvw)X$<3lwPh@>hPjb0tK)WgPM0;!R?J-qIa`X-xDyvN0RdzMXPuz54uJhOG?;#afS zBjfP{2*ZPyP^TYgCOXKiGLeX;kX#muJ?z*Aj(D-g;*pbMwtluC-hNn=%j}H#Mt1IY z9V$YCw7g3Sp=puA1=o5_R85fI-H7hFUWTNXQs8Xxcz0en0m3#z?huKw3 zrm5Zj2{K^x4H3YXTTYWV`bF&2s0y_f(kl5*O-Z=Cl5AxH9%XLKDYmWpOF9B#@7AHnG!BToBxF;stw8CEs^Iv{K|2?OqKZ{`MDR`hYH4Eq`doP)69z$7G;Ebk7 z?Qz8}#WfzzwFn_}rgci%{AykrS1+vMi1!>i6lN^a}>%PUzQTWaaF}w#VG{ut-1 z2V_m&2|;27V26p+;dA{mu^u42Zr1zGXk*@KFOpl|GQCbX74D!Q?$vijE@Zg=fkP6s^ z#&24saBtIZ&)mUPbdhSr;2EA*wSN6~XGWyuX_|U+?G7h)Tlqd&#L4KG?o@qU_9j#4 zsC-cuAMCE+=ltV9pF>JdL<|3dB}x0eM@vWcb=HlRY%Q;s0vDAYt;9_Dn4_HWuG8re zEZWs2oU@<;7@J8jjNBy{Q*czwo%+vJ$z z6PK);SKl+CMS6BoB3zpm;l5+*ip;~y2JAIssrpSpC9hSFlf^li23C(J?icgM#$If} zHVKBAHa>{scr3gXJ0Y;`v{}gPGa1ry@*&~FM6{+Om5Xm}oCJES0i5YJ8k(0*@r9;= z!f2z#Vl^Z!cQi!|a6oLF8DOha8~yx2H~z`5JJtE$zf+HMwzxwvVzQEJ*QzB~-qxH=2v3T3pRVDU1(cO84fNwrD#fHkB|!FyW`=kb;- zXJ~!9)T*p9;a2TSd!;v%SdFOfmzBOpYWjO=8>ob7JDgOz78!i(b}*^C1xKizruCpF zj@U#z3nbLDD{72)22FY>#Q|k{kV+1fC+~}z=w@4b-AcsOB#|P>{B6{%uXx>5+e4rZ zO@2eQ>#JoB7UqqA6PjWnSVm~tB~+7EFwPTH=Y}?B*<;X>-i#P)j`Ph*>17Jxsx%H8 zr1YXFJ4q8;Z69SjfvaxB9o|*x8Qi^IJ<{i}_tmO8PS}I)t>Dsh_~oeqBYbqIQ+NvI z*3&PswT!S0%Pk}m9;rQ4p(!hYBTI8PbekA$=;Eq=Bl(n!j^w)Fy?#y;7I%e>i1YmP z#*}%0kpB%!%P*A>T=07O2`17plPhqd$aB5VH%8gSzNUNg(`Zp9J^c;HMkfI0kFNfG zrTYKZZODIByVd-g%!cQ0GMi!apU-T*0%Lz?Hr+t{XEK{#^<|yrzh*YS;%L(U$ZRHo cbN$tIhek;xfMFgYV~ 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 (KBm8(#1T(0gT)4ez7Ey-w!Xogam{%17 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 We+d8a{SO!PA1>%WT+lzcp#K7^FP>8X literal 0 HcmV?d00001 diff --git a/tests/geometry.test.ts b/tests/geometry.test.ts new file mode 100644 index 0000000..47c77b1 --- /dev/null +++ b/tests/geometry.test.ts @@ -0,0 +1,167 @@ +/// +'use strict'; + +import { describe, it, expect } from '@jest/globals'; +import { calculateGeometry, readGeometry } from '../src/geometry'; +import fs from 'node:fs'; + +describe('Geometry', () => { + describe('calculateGeometry', () => { + it('leaves existing geometry unchanged', () => { + const geometry = { + width: 1024, + height: 768, + pages: 3, + tileWidth: 128, + tileHeight: 128, + sizes: [ + { width: 1024, height: 768 }, + { width: 512, height: 384 }, + { width: 256, height: 192 } + ] + }; + const result = calculateGeometry(geometry); + expect(result).toEqual(geometry); + }); + + it('calculates sizes for a given width/height/pages', () => { + const result = calculateGeometry({ width: 1024, height: 768, pages: 3 }); + expect(result.sizes).toHaveLength(3); + expect(result.sizes[0]).toEqual({ width: 1024, height: 768 }); + expect(result.sizes[1]).toEqual({ width: 512, height: 384 }); + expect(result.sizes[2]).toEqual({ width: 256, height: 192 }); + }); + + it('calculates sizes for a given width/height/tile size', () => { + const result = calculateGeometry({ + width: 1024, + height: 768, + tileWidth: 128, + tileHeight: 128 + }); + expect(result.pages).toEqual(4); + expect(result.sizes).toHaveLength(4); + expect(result.sizes[0]).toEqual({ width: 1024, height: 768 }); + expect(result.sizes[1]).toEqual({ width: 512, height: 384 }); + expect(result.sizes[2]).toEqual({ width: 256, height: 192 }); + expect(result.sizes[3]).toEqual({ width: 128, height: 96 }); + }); + + it('calculates pages for a given width/height/sizes', () => { + const result = calculateGeometry({ + width: 1024, + height: 768, + sizes: [ + { width: 512, height: 384 }, + { width: 256, height: 192 } + ] + }); + expect(result.pages).toEqual(2); + }); + + it('calculates width/height for a given sizes', () => { + const result = calculateGeometry({ + sizes: [ + { width: 1024, height: 768 }, + { width: 512, height: 384 }, + { width: 256, height: 192 } + ] + }); + expect(result.pages).toEqual(3); + expect(result.width).toEqual(1024); + expect(result.height).toEqual(768); + }); + }); + + describe('readGeometry', () => { + it('uses the provided geometry if it is complete', async () => { + const streamer = async () => { + throw new Error('Should not be called'); + }; + const geometry = { + width: 1024, + height: 768, + pages: 3, + tileWidth: 128, + tileHeight: 128 + }; + const result = await readGeometry(streamer, geometry); + expect(result).toEqual(geometry); + }); + + it('reads width, height, pages, and tile size', async () => { + const streamer = async (callback) => { + await callback(fs.createReadStream('./tests/fixtures/samvera_256.tif')); + }; + const result = await readGeometry(streamer, {}); + expect(result).toEqual({ + width: 621, + height: 327, + pages: 4, + tileWidth: 256, + tileHeight: 256 + }); + }); + + it('reads width, height, and pages but leaves tile size intact', async () => { + const streamer = async (callback) => { + await callback(fs.createReadStream('./tests/fixtures/samvera_256.tif')); + }; + let result = await readGeometry(streamer, { + tileWidth: 512, + tileHeight: 512 + }); + expect(result).toEqual({ + width: 621, + height: 327, + pages: 4, + tileWidth: 512, + tileHeight: 512 + }); + + result = await readGeometry(streamer, { + tileWidth: null, + tileHeight: null + }); + expect(result).toEqual({ + width: 621, + height: 327, + pages: 4, + tileWidth: null, + tileHeight: null + }); + }); + + it('reads tile size but leaves width/height/pages intact', async () => { + const streamer = async (callback) => { + await callback(fs.createReadStream('./tests/fixtures/samvera_128.tif')); + }; + const result = await readGeometry(streamer, { + width: 1242, + height: 654, + pages: 5 + }); + expect(result).toEqual({ + width: 1242, + height: 654, + pages: 5, + tileWidth: 128, + tileHeight: 128 + }); + }); + + it('leaves tile size undefined if it cannot be read', async () => { + const streamer = async (callback) => { + await callback(fs.createReadStream('./tests/fixtures/samvera.tif')); + }; + const result = await readGeometry(streamer, {}); + expect(result).toEqual({ + width: 621, + height: 327, + pages: 1, + tileWidth: undefined, + tileHeight: undefined + }); + }); + }); +}); diff --git a/tests/v2/integration.test.ts b/tests/v2/integration.test.ts index d85759e..473866d 100644 --- a/tests/v2/integration.test.ts +++ b/tests/v2/integration.test.ts @@ -7,10 +7,13 @@ import fs from 'fs'; import { Processor } from '../../src/processor'; import Sharp from 'sharp'; import values from '../fixtures/iiif-values'; -const { v2: { qualities, formats, regions, sizes, rotations } } = values as any; +const { + v2: { qualities, formats, regions, sizes, rotations } +} = values as any; const base = 'https://example.org/iiif/2/ab/cd/ef/gh/i'; -const streamResolver: any = async () => fs.createReadStream('./tests/fixtures/samvera.tif'); +const streamResolver: any = async () => + fs.createReadStream('./tests/fixtures/samvera_256.tif'); let subject; let consoleWarnMock; @@ -154,7 +157,7 @@ describe('size', () => { `${base}/full/pct:40/0/default.png`, streamResolver ); - pipeline = await subject.operations(await subject.dimensions()).pipeline(); + pipeline = await subject.operations(await subject.geometry()).pipeline(); assert.strictEqual(pipeline.options.input.page, 1); }); @@ -164,7 +167,7 @@ describe('size', () => { `${base}/full/312,165/0/default.png`, streamResolver ); - pipeline = await subject.operations(await subject.dimensions()).pipeline(); + pipeline = await subject.operations(await subject.geometry()).pipeline(); assert.strictEqual(pipeline.options.input.page, 1); subject = new Processor( @@ -172,7 +175,7 @@ describe('size', () => { streamResolver, { pageThreshold: 0 } ); - pipeline = await subject.operations(await subject.dimensions()).pipeline(); + pipeline = await subject.operations(await subject.geometry()).pipeline(); assert.strictEqual(pipeline.options.input.page, 0); }); }); @@ -180,7 +183,10 @@ describe('size', () => { describe('rotation', () => { rotations.forEach((value) => { it(`should produce an image with rotation ${value}`, async () => { - subject = new Processor(`${base}/full/full/${value}/default.png`, streamResolver); + subject = new Processor( + `${base}/full/full/${value}/default.png`, + streamResolver + ); const result = await subject.execute(); assert.strictEqual(result.contentType, 'image/png'); }); @@ -189,22 +195,24 @@ describe('rotation', () => { describe('IIIF transformation', () => { beforeEach(() => { - consoleWarnMock = jest.spyOn(global.console, 'warn').mockImplementation(() => undefined); + consoleWarnMock = jest + .spyOn(global.console, 'warn') + .mockImplementation(() => undefined); subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.png`, streamResolver, - { dimensionFunction: () => null } + { geometryFunction: async () => ({}) } ); }); - + afterEach(() => { consoleWarnMock.mockRestore(); }); - + it('transforms the image', async () => { const result = await subject.execute(); const size = await Sharp(result.body).metadata(); - + assert(result.canonicalLink); assert(result.profileLink); assert.strictEqual(size.width, 25); @@ -212,14 +220,14 @@ describe('IIIF transformation', () => { assert.strictEqual(size.format, 'png'); }); }); - + describe('Two-argument streamResolver', () => { beforeEach(() => { subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.png`, - async ({id, baseUrl}, callback) => { - const stream = await streamResolver({id, baseUrl}); - return callback(stream); + async ({ id, baseUrl }, callback) => { + const stream = await streamResolver({ id, baseUrl }); + return callback(stream); } ); }); @@ -244,7 +252,9 @@ describe('Debug border', () => { }); it('should add a border when `debugBorder` is specified', async () => { - subject = new Processor(`${base}/full/full/0/default.png`, streamResolver, { debugBorder: true }); + subject = new Processor(`${base}/full/full/0/default.png`, streamResolver, { + debugBorder: true + }); const result = await subject.execute(); const image = await Sharp(result.body).removeAlpha().raw().toBuffer(); const pixel = image.readUInt32LE(0); diff --git a/tests/v2/processor.test.ts b/tests/v2/processor.test.ts index 7e77c55..15061cc 100644 --- a/tests/v2/processor.test.ts +++ b/tests/v2/processor.test.ts @@ -9,12 +9,20 @@ import { Processor } from '../../src/processor'; let subject; const base = 'https://example.org/iiif/2/ab/cd/ef/gh/i'; -const dims = [{ width: 1024, height: 768 }]; -const identityResolver = async (_input) => new Stream.Readable({ read () {} }); +const geometry = { + width: 1024, + height: 768, + pages: 1, + sizes: [{ width: 1024, height: 768 }] +}; +const identityResolver = async (_input) => new Stream.Readable({ read() {} }); describe('IIIF Processor', () => { beforeEach(() => { - subject = new Processor(`${base}/10,20,30,40/pct:50/45/default.png`, identityResolver); + subject = new Processor( + `${base}/10,20,30,40/pct:50/45/default.png`, + identityResolver + ); }); it('Parse URL', () => { @@ -28,7 +36,7 @@ describe('IIIF Processor', () => { }); it('Create pipeline', async () => { - const pipe = await subject.operations(dims).pipeline(); + const pipe = await subject.operations(geometry).pipeline(); const opts = pipe.options; assert.strictEqual(opts.width, 15); @@ -41,19 +49,27 @@ describe('IIIF Processor', () => { describe('Minimum width and height', () => { beforeEach(() => { - subject = new Processor(`${base}/8192,0,7,5466/1,342/0/default.jpg`, identityResolver); + subject = new Processor( + `${base}/8192,0,7,5466/1,342/0/default.jpg`, + identityResolver + ); }); it('Avoids having a width or height < 1', async () => { - const dims = [ - { width: 8199, height: 5466 }, - { width: 4099, height: 2733 }, - { width: 2049, height: 1366 }, - { width: 1024, height: 683 }, - { width: 512, height: 341 }, - { width: 256, height: 170 } - ]; - const pipe = await subject.operations(dims).pipeline(); + const geometry = { + width: 8199, + height: 5466, + pages: 6, + sizes: [ + { width: 8199, height: 5466 }, + { width: 4099, height: 2733 }, + { width: 2049, height: 1366 }, + { width: 1024, height: 683 }, + { width: 512, height: 341 }, + { width: 256, height: 170 } + ] + }; + const pipe = await subject.operations(geometry).pipeline(); const opts = pipe.options; assert.notEqual(opts.width, 0); assert.notEqual(opts.height, 0); @@ -62,15 +78,15 @@ describe('Minimum width and height', () => { describe('Include metadata', () => { beforeEach(() => { - subject = new Processor( + subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.jpg`, - async () => new Stream.Readable({ read () {} }), + async () => new Stream.Readable({ read() {} }), { includeMetadata: true } ); }); it('Includes preexisting metadata', async () => { - const pipe = await subject.operations(dims).pipeline(); + const pipe = await subject.operations(geometry).pipeline(); const opts = pipe.options; assert.notEqual(opts.keepMetadata, 0); @@ -79,11 +95,14 @@ describe('Include metadata', () => { describe('TIFF Download', () => { beforeEach(() => { - subject = new Processor(`${base}/10,20,30,40/pct:50/45/default.tif`, identityResolver); + subject = new Processor( + `${base}/10,20,30,40/pct:50/45/default.tif`, + identityResolver + ); }); it('Output TIFF format', async () => { - const pipe = await subject.operations(dims).pipeline(); + const pipe = await subject.operations(geometry).pipeline(); const opts = pipe.options; assert.strictEqual(opts.width, 15); @@ -96,9 +115,9 @@ describe('TIFF Download', () => { describe('Density', () => { beforeEach(() => { subject = (ext) => { - return new Processor( + return new Processor( `https://example.org/iiif/2/ab/cd/ef/gh/i/10,20,30,40/pct:50/45/default.${ext}`, - async () => new Stream.Readable({ read () {} }), + async () => new Stream.Readable({ read() {} }), { density: 600 } ); }; @@ -106,7 +125,7 @@ describe('Density', () => { it('Adds density to TIFF', async () => { const processor = subject('tif'); - const pipe = await processor.operations(dims).pipeline(); + const pipe = await processor.operations(geometry).pipeline(); const opts = pipe.options; assert.strictEqual(opts.tiffXres, 600 / 25.4); @@ -115,7 +134,7 @@ describe('Density', () => { it('Adds density to JPEG', async () => { const processor = subject('jpg'); - const pipe = await processor.operations(dims).pipeline(); + const pipe = await processor.operations(geometry).pipeline(); const opts = pipe.options; assert.strictEqual(opts.withMetadataDensity, 600); @@ -123,7 +142,7 @@ describe('Density', () => { it('Adds density to PNG', async () => { const processor = subject('png'); - const pipe = await processor.operations(dims).pipeline(); + const pipe = await processor.operations(geometry).pipeline(); const opts = pipe.options; assert.strictEqual(opts.withMetadataDensity, 600); @@ -134,11 +153,21 @@ describe('constructor', () => { it('must parse the object-based constructor', async () => { subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.tif`, - async () => new Stream.Readable({ read () {} }), - { dimensionFunction: () => Promise.resolve({width: 1024, height: 768}), max: { width: 1000 }, includeMetadata: true, density: 600 } + async () => new Stream.Readable({ read() {} }), + { + geometryFunction: () => + Promise.resolve({ width: 1024, height: 768, pages: 1 }), + max: { width: 1000 }, + includeMetadata: true, + density: 600 + } ); - expect(subject.dimensionFunction()).resolves.toEqual({width: 1024, height: 768}); + expect(subject.geometryFunction()).resolves.toEqual({ + width: 1024, + height: 768, + pages: 1 + }); assert.equal(typeof subject.streamResolver, 'function'); assert.strictEqual(subject.max.width, 1000); assert.strictEqual(subject.includeMetadata, true); @@ -147,30 +176,30 @@ describe('constructor', () => { it('properly handles custom sharp options', async () => { let pipe; - + subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.tif`, - async () => new Stream.Readable({ read () {} }), + async () => new Stream.Readable({ read() {} }), { sharpOptions: { sequentialRead: false } } ); - pipe = await subject.operations(dims).pipeline(); + pipe = await subject.operations(geometry).pipeline(); assert.strictEqual(pipe.options.input.sequentialRead, false); - - subject = new Processor( + + subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.tif`, - async () => new Stream.Readable({ read () {} }), + async () => new Stream.Readable({ read() {} }), { sharpOptions: { sequentialRead: true } } ); - pipe = await subject.operations(dims).pipeline(); + pipe = await subject.operations(geometry).pipeline(); assert.strictEqual(pipe.options.input.sequentialRead, true); }); it('takes a custom version and path prefix', () => { subject = new Processor( - 'https://example.org/iiif/III/ab/cd/ef/gh/i/info.json', - async () => new Stream.Readable({ read () {} }), - { iiifVersion: 3, pathPrefix: '/iiif/III/' } - ); + 'https://example.org/iiif/III/ab/cd/ef/gh/i/info.json', + async () => new Stream.Readable({ read() {} }), + { iiifVersion: 3, pathPrefix: '/iiif/III/' } + ); assert.strictEqual(subject.version, 3); assert.strictEqual(subject.id, 'ab/cd/ef/gh/i'); assert.strictEqual(subject.baseUrl, 'https://example.org/iiif/III/'); @@ -180,19 +209,28 @@ describe('constructor', () => { describe('constructor errors', () => { it('requires a streamResolver', () => { assert.throws(() => { - return new Processor(`${base}/10,20,30,40/pct:50/45/default.tif`, {} as any); + return new Processor( + `${base}/10,20,30,40/pct:50/45/default.tif`, + {} as any + ); }, IIIFError); }); it('requires a valid URL', () => { assert.throws(() => { - return new Processor(`${base}/10,20,30,40/pct:50/45/default.blargh`, identityResolver); + return new Processor( + `${base}/10,20,30,40/pct:50/45/default.blargh`, + identityResolver + ); }, IIIFError); }); it('needs to be able to infer the version', () => { assert.throws(() => { - return new Processor('https://example.org/iiif/X/ab/cd/ef/gh/i/info.json', identityResolver); + return new Processor( + 'https://example.org/iiif/X/ab/cd/ef/gh/i/info.json', + identityResolver + ); }, IIIFError); }); @@ -218,7 +256,7 @@ describe('constructor errors', () => { describe('stream processor', () => { it('passes the id and baseUrl to the function', () => { - expect.assertions(2) // ensures our streamResolver assertions are both executed in this test + expect.assertions(2); // ensures our streamResolver assertions are both executed in this test const streamResolver = async ({ id, baseUrl }) => { expect(id).toEqual('i'); @@ -227,37 +265,41 @@ describe('stream processor', () => { return new Stream.Readable({ read() {} }); - } + }; - const subject = new Processor(`https://example.org/iiif/2/ab/cd/ef/gh/i/10,20,30,40/pct:50/45/default.png`, streamResolver, {pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/'}); + const subject = new Processor( + `https://example.org/iiif/2/ab/cd/ef/gh/i/10,20,30,40/pct:50/45/default.png`, + streamResolver, + { pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/' } + ); subject.execute(); - }) -}) + }); +}); describe('dimension function', () => { it('passes the id and baseUrl to the function', () => { - expect.assertions(2) // ensures our dimension function assertions are both executed in this test + expect.assertions(2); // ensures our dimension function assertions are both executed in this test const streamResolver = async () => { return new Stream.Readable({ read() {} }); - } + }; - const dimensionFunction = async ({ id, baseUrl }) => { + const geometryFunction = async ({ id, baseUrl }) => { expect(id).toEqual('i'); expect(baseUrl).toEqual('https://example.org/iiif/2/ab/cd/ef/gh/'); - return { width: 100, height: 100 } - } + return { width: 100, height: 100, pages: 1 }; + }; - const subject = new Processor( + const subject = new Processor( `https://example.org/iiif/2/ab/cd/ef/gh/i/10,20,30,40/pct:50/45/default.png`, streamResolver, - { dimensionFunction, pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/' } + { geometryFunction, pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/' } ); subject.execute(); - }) -}) + }); +}); describe('redirect to info.json', () => { it('redirects when no format or info.json is requested', async () => { diff --git a/tests/v3/integration.test.ts b/tests/v3/integration.test.ts index 305850a..f7d4116 100644 --- a/tests/v3/integration.test.ts +++ b/tests/v3/integration.test.ts @@ -7,16 +7,21 @@ import fs from 'fs'; import { Processor } from '../../src/processor'; import Sharp from 'sharp'; import values from '../fixtures/iiif-values'; -const { v3: { qualities, formats, regions, sizes, rotations } } = values as any; +const { + v3: { qualities, formats, regions, sizes, rotations } +} = values as any; const base = 'https://example.org/iiif/3/ab/cd/ef/gh/i'; -const streamResolver: any = () => fs.createReadStream('./tests/fixtures/samvera.tif'); +const streamResolver: any = () => + fs.createReadStream('./tests/fixtures/samvera_256.tif'); let subject; let consoleWarnMock; describe('info.json', () => { it('produces a valid info.json', async () => { - subject = new Processor(`${base}/info.json`, streamResolver, { pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/' }); + subject = new Processor(`${base}/info.json`, streamResolver, { + pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/' + }); const result = await subject.execute(); const info = JSON.parse(result.body); assert.strictEqual(info.id, 'https://example.org/iiif/3/ab/cd/ef/gh/i'); @@ -26,7 +31,10 @@ describe('info.json', () => { }); it('respects max size options', async () => { - subject = new Processor(`${base}/info.json`, streamResolver, { pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/', max: { width: 600 } }); + subject = new Processor(`${base}/info.json`, streamResolver, { + pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/', + max: { width: 600 } + }); const result = await subject.execute(); const info = JSON.parse(result.body); assert.strictEqual(info.maxWidth, 600); @@ -54,7 +62,10 @@ describe('info.json', () => { describe('quality', () => { qualities.forEach((value) => { it(`should produce an image with quality ${value}`, async () => { - subject = new Processor(`${base}/full/max/0/${value}.png`, streamResolver); + subject = new Processor( + `${base}/full/max/0/${value}.png`, + streamResolver + ); const result = await subject.execute(); assert.strictEqual(result.contentType, 'image/png'); }); @@ -64,7 +75,10 @@ describe('quality', () => { describe('format', () => { formats.forEach((value) => { it(`should produce an image with format ${value}`, async () => { - subject = new Processor(`${base}/full/max/0/default.${value}`, streamResolver); + subject = new Processor( + `${base}/full/max/0/default.${value}`, + streamResolver + ); const result = await subject.execute(); assert.match(result.contentType, /^image\//); }); @@ -143,7 +157,7 @@ describe('size', () => { `${base}/full/pct:40/0/default.png`, streamResolver ); - pipeline = await subject.operations(await subject.dimensions()).pipeline(); + pipeline = await subject.operations(await subject.geometry()).pipeline(); assert.strictEqual(pipeline.options.input.page, 1); }); }); @@ -151,7 +165,10 @@ describe('size', () => { describe('rotation', () => { rotations.forEach((value) => { it(`should produce an image with rotation ${value}`, async () => { - subject = new Processor(`${base}/full/max/${value}/default.png`, streamResolver); + subject = new Processor( + `${base}/full/max/${value}/default.png`, + streamResolver + ); const result = await subject.execute(); assert.strictEqual(result.contentType, 'image/png'); }); @@ -160,35 +177,37 @@ describe('rotation', () => { describe('IIIF transformation', () => { beforeEach(() => { - consoleWarnMock = jest.spyOn(global.console, 'warn').mockImplementation(() => undefined); + consoleWarnMock = jest + .spyOn(global.console, 'warn') + .mockImplementation(() => undefined); subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.png`, streamResolver, - { dimensionFunction: () => null } + { geometryFunction: async () => ({}) } ); }); - + afterEach(() => { consoleWarnMock.mockRestore(); }); - + it('transforms the image', async () => { const result = await subject.execute(); const size = await Sharp(result.body).metadata(); - + assert.strictEqual(size.width, 25); assert.strictEqual(size.height, 25); assert.strictEqual(size.format, 'png'); }); }); - + describe('Two-argument streamResolver', () => { beforeEach(() => { subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.png`, - ({id, baseUrl}, callback) => { - const stream = streamResolver({id, baseUrl}); - return callback(stream); + ({ id, baseUrl }, callback) => { + const stream = streamResolver({ id, baseUrl }); + return callback(stream); } ); }); @@ -213,7 +232,9 @@ describe('Debug border', () => { }); it('should add a border when `debugBorder` is specified', async () => { - subject = new Processor(`${base}/full/max/0/default.png`, streamResolver, { debugBorder: true }); + subject = new Processor(`${base}/full/max/0/default.png`, streamResolver, { + debugBorder: true + }); const result = await subject.execute(); const image = await Sharp(result.body).removeAlpha().raw().toBuffer(); const pixel = image.readUInt32LE(0); diff --git a/tests/v3/processor.test.ts b/tests/v3/processor.test.ts index 709b17d..660f884 100644 --- a/tests/v3/processor.test.ts +++ b/tests/v3/processor.test.ts @@ -9,12 +9,20 @@ import { Processor } from '../../src/processor'; let subject; const base = 'https://example.org/iiif/3/ab/cd/ef/gh/i'; -const dims = [{ width: 1024, height: 768 }]; -const identityResolver = async (_input) => new Stream.Readable({ read () {} }); +const geometry = { + width: 1024, + height: 768, + pages: 1, + sizes: [{ width: 1024, height: 768 }] +}; +const identityResolver = async (_input) => new Stream.Readable({ read() {} }); describe('IIIF Processor', () => { beforeEach(() => { - subject = new Processor(`${base}/10,20,30,40/pct:50/45/default.png`, identityResolver); + subject = new Processor( + `${base}/10,20,30,40/pct:50/45/default.png`, + identityResolver + ); }); it('Parse URL', () => { @@ -28,7 +36,7 @@ describe('IIIF Processor', () => { }); it('Create pipeline', async () => { - const pipe = await subject.operations(dims).pipeline(); + const pipe = await subject.operations(geometry).pipeline(); const opts = pipe.options; assert.strictEqual(opts.width, 15); @@ -39,7 +47,7 @@ describe('IIIF Processor', () => { }); }); -describe("Minimum width and height", () => { +describe('Minimum width and height', () => { beforeEach(() => { subject = new Processor( `${base}/8192,0,7,5466/1,342/0/default.jpg`, @@ -47,16 +55,21 @@ describe("Minimum width and height", () => { ); }); - it("Avoids having a width or height < 1", async () => { - const dims = [ - { width: 8199, height: 5466 }, - { width: 4099, height: 2733 }, - { width: 2049, height: 1366 }, - { width: 1024, height: 683 }, - { width: 512, height: 341 }, - { width: 256, height: 170 } - ]; - const pipe = await subject.operations(dims).pipeline(); + it('Avoids having a width or height < 1', async () => { + const geometry = { + width: 8199, + height: 5466, + pages: 6, + sizes: [ + { width: 8199, height: 5466 }, + { width: 4099, height: 2733 }, + { width: 2049, height: 1366 }, + { width: 1024, height: 683 }, + { width: 512, height: 341 }, + { width: 256, height: 170 } + ] + }; + const pipe = await subject.operations(geometry).pipeline(); const opts = pipe.options; assert.notEqual(opts.width, 0); assert.notEqual(opts.height, 0); @@ -73,7 +86,7 @@ describe('Include metadata', () => { }); it('Includes preexisting metadata', async () => { - const pipe = await subject.operations(dims).pipeline(); + const pipe = await subject.operations(geometry).pipeline(); const opts = pipe.options; assert.notEqual(opts.keepMetadata, 0); @@ -82,11 +95,14 @@ describe('Include metadata', () => { describe('TIFF Download', () => { beforeEach(() => { - subject = new Processor(`${base}/10,20,30,40/pct:50/45/default.tif`, identityResolver); + subject = new Processor( + `${base}/10,20,30,40/pct:50/45/default.tif`, + identityResolver + ); }); it('Output TIFF format', async () => { - const pipe = await subject.operations(dims).pipeline(); + const pipe = await subject.operations(geometry).pipeline(); const opts = pipe.options; assert.strictEqual(opts.width, 15); @@ -101,7 +117,7 @@ describe('Density', () => { subject = (ext) => { return new Processor( `https://example.org/iiif/3/ab/cd/ef/gh/i/10,20,30,40/pct:50/45/default.${ext}`, - async () => new Stream.Readable({ read () {} }), + async () => new Stream.Readable({ read() {} }), { density: 600 } ); }; @@ -109,7 +125,7 @@ describe('Density', () => { it('Adds density to TIFF', async () => { const processor = subject('tif'); - const pipe = await processor.operations(dims).pipeline(); + const pipe = await processor.operations(geometry).pipeline(); const opts = pipe.options; assert.strictEqual(opts.tiffXres, 600 / 25.4); @@ -118,7 +134,7 @@ describe('Density', () => { it('Adds density to JPEG', async () => { const processor = subject('jpg'); - const pipe = await processor.operations(dims).pipeline(); + const pipe = await processor.operations(geometry).pipeline(); const opts = pipe.options; assert.strictEqual(opts.withMetadataDensity, 600); @@ -126,7 +142,7 @@ describe('Density', () => { it('Adds density to PNG', async () => { const processor = subject('png'); - const pipe = await processor.operations(dims).pipeline(); + const pipe = await processor.operations(geometry).pipeline(); const opts = pipe.options; assert.strictEqual(opts.withMetadataDensity, 600); @@ -139,15 +155,25 @@ describe('constructor', () => { width: 1000, height: 1000, area: 10000 - } + }; subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.tif`, - async () => new Stream.Readable({ read () {} }), - { dimensionFunction: () => Promise.resolve({width: 1024, height: 768}), max, includeMetadata: true, density: 600 } + async () => new Stream.Readable({ read() {} }), + { + geometryFunction: () => + Promise.resolve({ width: 1024, height: 768, pages: 1 }), + max, + includeMetadata: true, + density: 600 + } ); assert.equal(typeof subject.streamResolver, 'function'); - expect(subject.dimensionFunction()).resolves.toEqual({width: 1024, height: 768}); + expect(subject.geometryFunction()).resolves.toEqual({ + width: 1024, + height: 768, + pages: 1 + }); assert.strictEqual(subject.max.width, 1000); assert.strictEqual(subject.max.height, 1000); assert.strictEqual(subject.max.area, 10000); @@ -157,35 +183,41 @@ describe('constructor', () => { it('properly handles custom sharp options', async () => { let pipe; - + subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.tif`, - async () => new Stream.Readable({ read () {} }), + async () => new Stream.Readable({ read() {} }), { sharpOptions: { sequentialRead: false } } ); - pipe = await subject.operations(dims).pipeline(); + pipe = await subject.operations(geometry).pipeline(); assert.strictEqual(pipe.options.input.sequentialRead, false); - + subject = new Processor( `${base}/10,20,30,40/pct:50/45/default.tif`, - async () => new Stream.Readable({ read () {} }), + async () => new Stream.Readable({ read() {} }), { sharpOptions: { sequentialRead: true } } ); - pipe = await subject.operations(dims).pipeline(); + pipe = await subject.operations(geometry).pipeline(); assert.strictEqual(pipe.options.input.sequentialRead, true); - }) + }); }); describe('constructor errors', () => { it('requires a streamResolver', () => { assert.throws(() => { - return new Processor(`${base}/10,20,30,40/pct:50/45/default.tif`, {} as any); + return new Processor( + `${base}/10,20,30,40/pct:50/45/default.tif`, + {} as any + ); }, IIIFError); }); it('requires a valid URL', () => { assert.throws(() => { - return new Processor(`${base}/10,20,30,40/pct:50/45/default.blargh`, identityResolver); + return new Processor( + `${base}/10,20,30,40/pct:50/45/default.blargh`, + identityResolver + ); }, IIIFError); }); @@ -202,7 +234,7 @@ describe('constructor errors', () => { describe('stream processor', () => { it('passes the id and baseUrl to the function', () => { - expect.assertions(2) // ensures our streamResolver assertions are both executed in this test + expect.assertions(2); // ensures our streamResolver assertions are both executed in this test const streamResolver = async ({ id, baseUrl }) => { expect(id).toEqual('i'); @@ -211,37 +243,41 @@ describe('stream processor', () => { return new Stream.Readable({ read() {} }); - } + }; - const subject = new Processor(`https://example.org/iiif/3/ab/cd/ef/gh/i/10,20,30,40/pct:50/45/default.png`, streamResolver, {pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/'}); + const subject = new Processor( + `https://example.org/iiif/3/ab/cd/ef/gh/i/10,20,30,40/pct:50/45/default.png`, + streamResolver, + { pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/' } + ); subject.execute(); - }) -}) + }); +}); -describe('dimension function', () => { +describe('geometry function', () => { it('passes the id and baseUrl to the function', () => { - expect.assertions(2) // ensures our dimension function assertions are both executed in this test + expect.assertions(2); // ensures our geometry function assertions are both executed in this test const streamResolver = async () => { return new Stream.Readable({ read() {} }); - } + }; - const dimensionFunction = async ({ id, baseUrl }) => { + const geometryFunction = async ({ id, baseUrl }) => { expect(id).toEqual('i'); expect(baseUrl).toEqual('https://example.org/iiif/3/ab/cd/ef/gh/'); - return { width: 100, height: 100 } + return { width: 100, height: 100, pages: 1 }; }; const subject = new Processor( `https://example.org/iiif/3/ab/cd/ef/gh/i/10,20,30,40/pct:50/45/default.png`, streamResolver as any, - { dimensionFunction, pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/' } + { geometryFunction, pathPrefix: '/iiif/{{version}}/ab/cd/ef/gh/' } ); subject.execute(); - }) -}) + }); +}); describe('redirect to info.json', () => { it('redirects when no format or info.json is requested', async () => { From ebc66728a1887101734cd4fe9c817023e0bf16e2 Mon Sep 17 00:00:00 2001 From: "Michael B. Klein" Date: Wed, 22 Apr 2026 17:44:14 -0500 Subject: [PATCH 2/6] 8.0.0-alpha.0 --- README.md | 21 ++++++++++++--------- package-lock.json | 4 ++-- package.json | 2 +- src/processor.ts | 8 ++++++-- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 4e46cd8..f257065 100644 --- a/README.md +++ b/README.md @@ -122,15 +122,18 @@ Any information not included will be calculated or probed for, if possible. For | `width`, `height`, `sizes` | `pages` | | | `width`, `height`, `pages` | `sizes` | | -Tile size information is independent of dimension and page information. If either `tileWidth` or `tileHeight` is -left `undefined`, the image stream will be probed for them, which can be an expensive operation. If both are -provided – even if they are `null` – the given values will be used. `null` values will be replaced by a default -value of `256` when rendering the information document (`info.json`) for an image. - - -The following example shows a Geometry Function that looks up the width, height, and number of pages in the target -image in a database and returns them along with hardcoded tile sizes. The `sizes` array will be automatically -calculated by the processor. +#### Tile Size + +Tile size information is independent of dimension and page information, and is only checked +when rendering the image information document (`info.json`). If either `tileWidth` or `tileHeight` +is left `undefined` by the Geometry Function, the image stream will be probed for them, which +can be an expensive operation. If both are provided – even if they are `null` – the given values +will be used. (`null` values will be replaced by a default value of `256` when rendering the +information document). + +The following example shows a Geometry Function that looks up the width, height, and number of +pages in the target image in a database and returns them along with hardcoded tile sizes. The +`sizes` array will be automatically calculated by the processor. ```typescript async function geometryFunction({ id: string, baseUrl: string }): Promise { diff --git a/package-lock.json b/package-lock.json index 1a71e04..437285b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "iiif-processor", - "version": "7.0.0", + "version": "8.0.0-alpha.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "iiif-processor", - "version": "7.0.0", + "version": "8.0.0-alpha.0", "license": "Apache-2.0", "workspaces": [ "examples/tiny-iiif", diff --git a/package.json b/package.json index 3a7d2db..85987b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iiif-processor", - "version": "7.0.0", + "version": "8.0.0-alpha.0", "description": "IIIF 2.1 & 3.0 Image API modules for NodeJS", "main": "dist/index.js", "module": "dist/index.mjs", diff --git a/src/processor.ts b/src/processor.ts index 35d7105..6cb6237 100644 --- a/src/processor.ts +++ b/src/processor.ts @@ -182,7 +182,7 @@ export class Processor { } } - async geometry(): Promise { + async geometry(includeTile = false): Promise { if (!this.imageGeometry) { debug( 'Attempting to use geometryFunction to retrieve dimensions for %j', @@ -193,6 +193,10 @@ export class Processor { if (this.geometryFunction) { geometry = await this.geometryFunction(params); } + if (!(geometry.tileWidth && geometry.tileHeight) && !includeTile) { + geometry.tileWidth = null; + geometry.tileHeight = null; + } geometry = await readGeometry( (callback) => this.withStream(params, callback), geometry @@ -203,7 +207,7 @@ export class Processor { } async infoJson() { - const geometry = await this.geometry(); + const geometry = await this.geometry(true); const uri = new URL(this.baseUrl); // Node's URL has readonly pathname in types; construct via join on new URL uri.pathname = path.join(uri.pathname, this.id); From 216848ffa8adc3d0fe3f31582224de049a4ae28c Mon Sep 17 00:00:00 2001 From: "Michael B. Klein" Date: Wed, 22 Apr 2026 17:58:41 -0500 Subject: [PATCH 3/6] 8.0.0-alpha.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 437285b..a1c61f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "iiif-processor", - "version": "8.0.0-alpha.0", + "version": "8.0.0-alpha.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "iiif-processor", - "version": "8.0.0-alpha.0", + "version": "8.0.0-alpha.1", "license": "Apache-2.0", "workspaces": [ "examples/tiny-iiif", diff --git a/package.json b/package.json index 85987b0..e1ee14f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iiif-processor", - "version": "8.0.0-alpha.0", + "version": "8.0.0-alpha.1", "description": "IIIF 2.1 & 3.0 Image API modules for NodeJS", "main": "dist/index.js", "module": "dist/index.mjs", From 00246ac811a4f0980f929db4c3c7043b024df953 Mon Sep 17 00:00:00 2001 From: "Michael B. Klein" Date: Thu, 23 Apr 2026 09:24:16 -0500 Subject: [PATCH 4/6] Remove id/baseUrl args from withStream and use known values --- src/geometry.ts | 6 +++--- src/processor.ts | 30 +++++++++++------------------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/src/geometry.ts b/src/geometry.ts index 7b151f1..951cfbb 100644 --- a/src/geometry.ts +++ b/src/geometry.ts @@ -9,7 +9,7 @@ const debug = Debug('iiif:geometry'); type StreamCallback = (stream: Readable) => Promise; export async function readGeometry( - streamer: (callback: StreamCallback) => Promise, + withStream: (callback: StreamCallback) => Promise, geometry: ImageGeometry ): Promise { let metadata = {}; @@ -23,14 +23,14 @@ export async function readGeometry( !geometry.height || !(geometry.pages || geometry.sizes) ) { - await streamer(async (metadataStream) => { + await withStream(async (metadataStream) => { metadata = await readMetadata(metadataStream); }); debug('Read metadata: %O', metadata); } if (geometry.tileWidth === undefined || geometry.tileHeight === undefined) { - await streamer(async (sizeStream) => { + await withStream(async (sizeStream) => { const size = await getTileSize(sizeStream); tileSize = { tileWidth: size.width, tileHeight: size.height }; }); diff --git a/src/processor.ts b/src/processor.ts index 6cb6237..6ec01e5 100644 --- a/src/processor.ts +++ b/src/processor.ts @@ -163,10 +163,8 @@ export class Processor { return this; } - async withStream( - { id, baseUrl }: { id: string; baseUrl: string }, - callback: (s: NodeJS.ReadableStream) => Promise - ) { + async withStream(callback: (s: NodeJS.ReadableStream) => Promise) { + const { id, baseUrl } = this; debug('Requesting stream for %s', id); if (this.streamResolver.length === 2) { return await (this.streamResolver as StreamResolverWithCallback)( @@ -197,10 +195,7 @@ export class Processor { geometry.tileWidth = null; geometry.tileHeight = null; } - geometry = await readGeometry( - (callback) => this.withStream(params, callback), - geometry - ); + geometry = await readGeometry(this.withStream.bind(this), geometry); this.imageGeometry = calculateGeometry(geometry); } return this.imageGeometry; @@ -282,18 +277,15 @@ export class Processor { debugv('Operations: %j', operations); const pipeline = await operations.pipeline(); - const result = await this.withStream( - { id: this.id, baseUrl: this.baseUrl }, - async (stream) => { - debug('piping stream to pipeline'); - let transformed = await stream.pipe(pipeline); - if (this.debugBorder) { - transformed = await this.applyBorder(transformed); - } - debug('converting to buffer'); - return await transformed.toBuffer(); + const result = await this.withStream(async (stream) => { + debug('piping stream to pipeline'); + let transformed = await stream.pipe(pipeline); + if (this.debugBorder) { + transformed = await this.applyBorder(transformed); } - ); + debug('converting to buffer'); + return await transformed.toBuffer(); + }); debug('returning %d bytes', (result as Buffer).length); debug('baseUrl', this.baseUrl); From bd938123fe0c365cf8d575b5f59c672eb9341223 Mon Sep 17 00:00:00 2001 From: "Michael B. Klein" Date: Thu, 23 Apr 2026 09:24:48 -0500 Subject: [PATCH 5/6] 8.0.0-alpha.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a1c61f8..c360572 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "iiif-processor", - "version": "8.0.0-alpha.1", + "version": "8.0.0-alpha.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "iiif-processor", - "version": "8.0.0-alpha.1", + "version": "8.0.0-alpha.2", "license": "Apache-2.0", "workspaces": [ "examples/tiny-iiif", diff --git a/package.json b/package.json index e1ee14f..c2ce021 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iiif-processor", - "version": "8.0.0-alpha.1", + "version": "8.0.0-alpha.2", "description": "IIIF 2.1 & 3.0 Image API modules for NodeJS", "main": "dist/index.js", "module": "dist/index.mjs", From 167ded98ce12e60e02a44d013b240655d43274a6 Mon Sep 17 00:00:00 2001 From: "Michael B. Klein" Date: Thu, 23 Apr 2026 13:14:40 -0500 Subject: [PATCH 6/6] Add v8.0.0 to CHANGELOG describing breaking change to DimensionFunction/GeometryFunction --- CHANGELOG.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index edaf8bb..a349a2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ Only features and major fixes are listed. Everything else can be considered a minor bugfix or maintenance release. +##### v8.0.0 +- **BREAKING CHANGE**: `DimensionFunction` has been replaced with `GeometryFunction`, changing + both the option name and the shape of the expected return value +- Can now probe the image stream for tile size information +- Information document (`info.json`) is now rendered using tile size information from the image + (or from the `GeometryFunction`), falling back to a default of 256 + ##### v7.0.0 - Made entire suite able to pass the [IIIF Image API Validator](https://iiif.io/api/image/validator/) - Added automatic redirect for requests that don't specify a transformation or `info.json` @@ -39,7 +46,7 @@ Only features and major fixes are listed. Everything else can be considered a mi ##### v3.2.0 - Major refactor to support multi-resolution source images -- Backward-compatible overhaul of `geometryFunction` +- Backward-compatible overhaul of `dimensionFunction` - Split `Calculator` out from `Operations` to make certain pre-transform information available with low overhead - Use `sharp.metadata()` instead of `probe-image-size` in default dimension function @@ -65,8 +72,8 @@ Only features and major fixes are listed. Everything else can be considered a mi streamResolver({ id }) { } // new streamResolver({ id }, callback) { } // new - geometryFunction(id) { } // old - geometryFunction({ id }) { } // new + dimensionFunction(id) { } // old + dimensionFunction({ id }) { } // new ``` See [issue #19](https://github.com/samvera/node-iiif/issues/19) for context on why this change was made.