@cogeotiff/core 6.1.1 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/build/__benchmark__/cog.read.benchmark.js +7 -4
- package/build/__test__/cog.image.test.js +26 -2
- package/build/cog.tiff.d.ts +2 -2
- package/build/cog.tiff.d.ts.map +1 -1
- package/build/cog.tiff.image.d.ts +16 -7
- package/build/cog.tiff.image.d.ts.map +1 -1
- package/build/cog.tiff.image.js +56 -33
- package/build/cog.tiff.js +19 -54
- package/build/const/tiff.mime.d.ts +5 -1
- package/build/const/tiff.mime.d.ts.map +1 -1
- package/build/const/tiff.mime.js +9 -1
- package/build/read/tag/__test__/tag.test.js +1 -1
- package/build/read/tag/tiff.tag.base.d.ts.map +1 -1
- package/build/read/tag/tiff.tag.base.js +1 -1
- package/build/read/tag/tiff.tag.lazy.d.ts +1 -2
- package/build/read/tag/tiff.tag.lazy.d.ts.map +1 -1
- package/build/read/tag/tiff.tag.lazy.js +3 -3
- package/build/read/tag/tiff.tag.offset.d.ts +2 -3
- package/build/read/tag/tiff.tag.offset.d.ts.map +1 -1
- package/build/read/tag/tiff.tag.offset.js +5 -5
- package/build/read/tiff.gdal.d.ts +6 -19
- package/build/read/tiff.gdal.d.ts.map +1 -1
- package/build/read/tiff.gdal.js +32 -53
- package/package.json +5 -6
- package/src/__benchmark__/cog.read.benchmark.ts +6 -3
- package/src/__test__/cog.image.test.ts +29 -1
- package/src/cog.tiff.image.ts +55 -33
- package/src/cog.tiff.ts +17 -68
- package/src/const/tiff.mime.ts +8 -0
- package/src/read/tag/__test__/tag.test.ts +1 -1
- package/src/read/tag/tiff.tag.base.ts +0 -1
- package/src/read/tag/tiff.tag.lazy.ts +2 -3
- package/src/read/tag/tiff.tag.offset.ts +4 -5
- package/src/read/tiff.gdal.ts +31 -58
- package/build/util/util.enum.d.ts +0 -6
- package/build/util/util.enum.d.ts.map +0 -1
- package/build/util/util.enum.js +0 -17
- package/src/util/util.enum.ts +0 -16
package/build/cog.tiff.image.js
CHANGED
|
@@ -19,25 +19,25 @@ export class CogTiffImage {
|
|
|
19
19
|
*
|
|
20
20
|
* @param loadGeoTags Whether to load the GeoKeyDirectory and unpack it
|
|
21
21
|
*/
|
|
22
|
-
async init(loadGeoTags = false
|
|
22
|
+
async init(loadGeoTags = false) {
|
|
23
23
|
const requiredTags = [
|
|
24
|
-
this.fetch(TiffTag.Compression
|
|
25
|
-
this.fetch(TiffTag.ImageHeight
|
|
26
|
-
this.fetch(TiffTag.ImageWidth
|
|
27
|
-
this.fetch(TiffTag.ModelPixelScale
|
|
28
|
-
this.fetch(TiffTag.ModelTiePoint
|
|
29
|
-
this.fetch(TiffTag.ModelTransformation
|
|
30
|
-
this.fetch(TiffTag.TileHeight
|
|
31
|
-
this.fetch(TiffTag.TileWidth
|
|
24
|
+
this.fetch(TiffTag.Compression),
|
|
25
|
+
this.fetch(TiffTag.ImageHeight),
|
|
26
|
+
this.fetch(TiffTag.ImageWidth),
|
|
27
|
+
this.fetch(TiffTag.ModelPixelScale),
|
|
28
|
+
this.fetch(TiffTag.ModelTiePoint),
|
|
29
|
+
this.fetch(TiffTag.ModelTransformation),
|
|
30
|
+
this.fetch(TiffTag.TileHeight),
|
|
31
|
+
this.fetch(TiffTag.TileWidth),
|
|
32
32
|
];
|
|
33
33
|
if (loadGeoTags) {
|
|
34
|
-
requiredTags.push(this.fetch(TiffTag.GeoKeyDirectory
|
|
35
|
-
requiredTags.push(this.fetch(TiffTag.GeoAsciiParams
|
|
36
|
-
requiredTags.push(this.fetch(TiffTag.GeoDoubleParams
|
|
34
|
+
requiredTags.push(this.fetch(TiffTag.GeoKeyDirectory));
|
|
35
|
+
requiredTags.push(this.fetch(TiffTag.GeoAsciiParams));
|
|
36
|
+
requiredTags.push(this.fetch(TiffTag.GeoDoubleParams));
|
|
37
37
|
}
|
|
38
38
|
await Promise.all(requiredTags);
|
|
39
39
|
if (loadGeoTags) {
|
|
40
|
-
await this.loadGeoTiffTags(
|
|
40
|
+
await this.loadGeoTiffTags();
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
@@ -52,7 +52,7 @@ export class CogTiffImage {
|
|
|
52
52
|
/**
|
|
53
53
|
* Load and unpack the GeoKeyDirectory
|
|
54
54
|
*/
|
|
55
|
-
async loadGeoTiffTags(
|
|
55
|
+
async loadGeoTiffTags() {
|
|
56
56
|
// Already loaded
|
|
57
57
|
if (this.tagsGeoLoaded)
|
|
58
58
|
return;
|
|
@@ -64,9 +64,9 @@ export class CogTiffImage {
|
|
|
64
64
|
if (!sourceTag.isReady && sourceTag instanceof CogTiffTagLazy) {
|
|
65
65
|
// Load all the required keys
|
|
66
66
|
await Promise.all([
|
|
67
|
-
this.fetch(TiffTag.GeoKeyDirectory
|
|
68
|
-
this.fetch(TiffTag.GeoAsciiParams
|
|
69
|
-
this.fetch(TiffTag.GeoDoubleParams
|
|
67
|
+
this.fetch(TiffTag.GeoKeyDirectory),
|
|
68
|
+
this.fetch(TiffTag.GeoAsciiParams),
|
|
69
|
+
this.fetch(TiffTag.GeoDoubleParams),
|
|
70
70
|
]);
|
|
71
71
|
}
|
|
72
72
|
this.tagsGeoLoaded = true;
|
|
@@ -107,12 +107,12 @@ export class CogTiffImage {
|
|
|
107
107
|
* Load a tag, if it is not currently loaded, fetch the required data for the tag.
|
|
108
108
|
* @param tag tag to fetch
|
|
109
109
|
*/
|
|
110
|
-
async fetch(tag
|
|
110
|
+
async fetch(tag) {
|
|
111
111
|
const sourceTag = this.tags.get(tag);
|
|
112
112
|
if (sourceTag == null)
|
|
113
113
|
return null;
|
|
114
114
|
if (CogTiffTag.isLazy(sourceTag))
|
|
115
|
-
return sourceTag.fetch(
|
|
115
|
+
return sourceTag.fetch();
|
|
116
116
|
return sourceTag.value;
|
|
117
117
|
}
|
|
118
118
|
/**
|
|
@@ -287,13 +287,13 @@ export class CogTiffImage {
|
|
|
287
287
|
* @param index tile index
|
|
288
288
|
* @returns file offset of the specified tile
|
|
289
289
|
*/
|
|
290
|
-
async getTileOffset(index
|
|
290
|
+
async getTileOffset(index) {
|
|
291
291
|
const tileOffset = this.tileOffset;
|
|
292
292
|
if (index < 0 || index > tileOffset.dataCount) {
|
|
293
293
|
throw new Error(`Tile offset: ${index} out of range: 0 -> ${tileOffset.dataCount}`);
|
|
294
294
|
}
|
|
295
295
|
// Fetch only the part of the offsets that are needed
|
|
296
|
-
return tileOffset.getValueAt(index
|
|
296
|
+
return tileOffset.getValueAt(index);
|
|
297
297
|
}
|
|
298
298
|
// Clamp the bounds of the output image to the size of the image, as sometimes the edge tiles are not full tiles
|
|
299
299
|
getTileBounds(x, y) {
|
|
@@ -334,13 +334,13 @@ export class CogTiffImage {
|
|
|
334
334
|
return actualBytes;
|
|
335
335
|
}
|
|
336
336
|
/** Read image bytes at the given offset */
|
|
337
|
-
async getBytes(offset, byteCount
|
|
337
|
+
async getBytes(offset, byteCount) {
|
|
338
338
|
const mimeType = this.compression;
|
|
339
339
|
if (mimeType == null)
|
|
340
340
|
throw new Error('Unsupported compression: ' + this.value(TiffTag.Compression));
|
|
341
341
|
if (byteCount === 0)
|
|
342
342
|
return null;
|
|
343
|
-
await this.tif.source.loadBytes(offset, byteCount
|
|
343
|
+
await this.tif.source.loadBytes(offset, byteCount);
|
|
344
344
|
const bytes = this.tif.source.bytes(offset, byteCount);
|
|
345
345
|
if (this.compression === TiffMimeType.JPEG) {
|
|
346
346
|
return { mimeType, bytes: this.getJpegHeader(bytes) };
|
|
@@ -355,7 +355,7 @@ export class CogTiffImage {
|
|
|
355
355
|
* @param x Tile x offset
|
|
356
356
|
* @param y Tile y offset
|
|
357
357
|
*/
|
|
358
|
-
async getTile(x, y
|
|
358
|
+
async getTile(x, y) {
|
|
359
359
|
const mimeType = this.compression;
|
|
360
360
|
const size = this.size;
|
|
361
361
|
const tiles = this.tileSize;
|
|
@@ -373,29 +373,52 @@ export class CogTiffImage {
|
|
|
373
373
|
const totalTiles = nxTiles * nyTiles;
|
|
374
374
|
if (idx >= totalTiles)
|
|
375
375
|
throw new Error(`Tile index is outside of tile range: ${idx} >= ${totalTiles}`);
|
|
376
|
-
const { offset, imageSize } = await this.getTileSize(idx
|
|
377
|
-
return this.getBytes(offset, imageSize
|
|
376
|
+
const { offset, imageSize } = await this.getTileSize(idx);
|
|
377
|
+
return this.getBytes(offset, imageSize);
|
|
378
378
|
}
|
|
379
|
-
|
|
379
|
+
/**
|
|
380
|
+
* Does this tile exist in the tiff and does it actually have a value
|
|
381
|
+
*
|
|
382
|
+
* Sparse tiffs can have a lot of empty tiles, this checks to see if the tile actually has data.
|
|
383
|
+
*
|
|
384
|
+
* @param x Tile x offset
|
|
385
|
+
* @param y Tile y offset
|
|
386
|
+
* @returns if the tile exists and has data
|
|
387
|
+
*/
|
|
388
|
+
async hasTile(x, y) {
|
|
389
|
+
const tiles = this.tileSize;
|
|
390
|
+
const size = this.size;
|
|
391
|
+
if (tiles == null)
|
|
392
|
+
throw new Error('Tiff is not tiled');
|
|
393
|
+
// TODO support GhostOptionTileOrder
|
|
394
|
+
const nyTiles = Math.ceil(size.height / tiles.height);
|
|
395
|
+
const nxTiles = Math.ceil(size.width / tiles.width);
|
|
396
|
+
if (x >= nxTiles || y >= nyTiles)
|
|
397
|
+
return false;
|
|
398
|
+
const idx = y * nxTiles + x;
|
|
399
|
+
const ret = await this.getTileSize(idx);
|
|
400
|
+
return ret.offset > 0;
|
|
401
|
+
}
|
|
402
|
+
async getTileSize(index) {
|
|
380
403
|
// GDAL optimizes tiles by storing the size of the tile in
|
|
381
404
|
// the few bytes leading up to the tile
|
|
382
|
-
|
|
383
|
-
|
|
405
|
+
const leaderBytes = this.tif.options.tileLeaderByteSize;
|
|
406
|
+
if (leaderBytes) {
|
|
407
|
+
const offset = await this.getTileOffset(index);
|
|
384
408
|
// Sparse COG no data found
|
|
385
409
|
if (offset === 0)
|
|
386
410
|
return { offset: 0, imageSize: 0 };
|
|
387
|
-
const leaderBytes = this.tif.options.tileLeaderByteSize;
|
|
388
411
|
// This fetch will generally load in the bytes needed for the image too
|
|
389
412
|
// provided the image size is less than the size of a chunk
|
|
390
|
-
await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes
|
|
413
|
+
await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes);
|
|
391
414
|
return { offset, imageSize: this.tif.source.getUint(offset - leaderBytes, leaderBytes) };
|
|
392
415
|
}
|
|
393
416
|
const byteCounts = this.tags.get(TiffTag.TileByteCounts);
|
|
394
417
|
if (byteCounts == null) {
|
|
395
418
|
throw new Error('No tile byte counts found');
|
|
396
419
|
}
|
|
397
|
-
const [offset, imageSize] = await Promise.all([this.getTileOffset(index
|
|
420
|
+
const [offset, imageSize] = await Promise.all([this.getTileOffset(index), byteCounts.getValueAt(index)]);
|
|
398
421
|
return { offset, imageSize };
|
|
399
422
|
}
|
|
400
423
|
}
|
|
401
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYuaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHaEQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQXNCM0MsTUFBTSxPQUFPLFlBQVk7SUFjckIsWUFBWSxHQUFZLEVBQUUsRUFBVSxFQUFFLElBQWtDO1FBTHhFLHNDQUFzQztRQUM5QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUM5QixpREFBaUQ7UUFDakQsWUFBTyxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBR2xELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssRUFBRSxJQUFhLElBQVc7UUFDcEQsTUFBTSxZQUFZLEdBQUc7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDakMsSUFBSSxD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QUMsQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7U0FDNUY7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFxQixDQUFDO1FBQzdFLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDaEQ7UUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ1R5cGUgfSBmcm9tICdAY2h1bmtkL2NvcmUnO1xuaW1wb3J0IHsgQ29nVGlmZiB9IGZyb20gJy4vY29nLnRpZmYuanMnO1xuaW1wb3J0IHsgVGlmZkNvbXByZXNzaW9uLCBUaWZmTWltZVR5cGUgfSBmcm9tICcuL2NvbnN0L3RpZmYubWltZS5qcyc7XG5pbXBvcnQgeyBUaWZmVGFnLCBUaWZmVGFnR2VvIH0gZnJvbSAnLi9jb25zdC90aWZmLnRhZy5pZC5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnQmFzZSB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcuYmFzZS5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnTGF6eSB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcubGF6eS5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnT2Zmc2V0IH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5vZmZzZXQuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZyB9IGZyb20gJy4vcmVhZC90aWZmLnRhZy5qcyc7XG5pbXBvcnQgeyBCb3VuZGluZ0JveCwgU2l6ZSB9IGZyb20gJy4vdmVjdG9yLmpzJztcblxuLyoqIEludmFsaWQgRVBTRyBjb2RlICovXG5leHBvcnQgY29uc3QgSW52YWxpZFByb2plY3Rpb25Db2RlID0gMzI3Njc7XG5cbi8qKlxuICogTnVtYmVyIG9mIHRpbGVzIHVzZWQgaW5zaWRlIHRoaXMgaW1hZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2dUaWZmSW1hZ2VUaWxlZENvdW50IHtcbiAgICAvKiogTnVtYmVyIG9mIHRpbGVzIG9uIHRoZSB4IGF4aXMgKi9cbiAgICB4OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiB0aWxlcyBvbiB0aGUgeSBheGlzICovXG4gICAgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNpemUgb2YgYSBpbmRpdmlkdWFsIHRpbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2dUaWZmSW1hZ2VUaWxlU2l6ZSB7XG4gICAgLyoqIFRpbGUgd2lkdGggKHBpeGVscykgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaWxlIGhlaWdodCAocGl4ZWxzKSAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgQ29nVGlmZkltYWdlIHtcbiAgICAvKiogQWxsIElGRCB0YWdzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgZm9yIHRoZSBpbWFnZSAqL1xuICAgIHRhZ3M6IE1hcDxUaWZmVGFnLCBDb2dUaWZmVGFnQmFzZT47XG5cbiAgICAvKiogSWQgb2YgdGhlIHRpZiBpbWFnZSwgZ2VuZXJhbGx5IHRoZSBpbWFnZSBpbmRleCBpbnNpZGUgdGhlIHRpZiAqL1xuICAgIGlkOiBudW1iZXI7XG5cbiAgICB0aWY6IENvZ1RpZmY7XG5cbiAgICAvKiogSGFzIGxvYWRHZW9UaWZmVGFncyBiZWVuIGNhbGxlZCAqL1xuICAgIHByaXZhdGUgdGFnc0dlb0xvYWRlZCA9IGZhbHNlO1xuICAgIC8qKiBTdWIgdGFncyBzdG9yZWQgaW4gVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkgKi9cbiAgICB0YWdzR2VvOiBNYXA8VGlmZlRhZ0dlbywgc3RyaW5nIHwgbnVtYmVyPiA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKHRpZjogQ29nVGlmZiwgaWQ6IG51bWJlciwgdGFnczogTWFwPFRpZmZUYWcsIENvZ1RpZmZUYWdCYXNlPikge1xuICAgICAgICB0aGlzLnRpZiA9IHRpZjtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcmNlIGxvYWRpbmcgb2YgaW1wb3J0YW50IHRhZ3MgaWYgdGhleSBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9hZEdlb1RhZ3MgV2hldGhlciB0byBsb2FkIHRoZSBHZW9LZXlEaXJlY3RvcnkgYW5kIHVucGFjayBpdFxuICAgICAqL1xuICAgIGFzeW5jIGluaXQobG9hZEdlb1RhZ3MgPSBmYWxzZSwgbDogTG9nVHlwZSA9IG51bGwgYXMgYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkVGFncyA9IFtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Db21wcmVzc2lvbiwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuSW1hZ2VIZWlnaHQsIGwpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkltYWdlV2lkdGgsIGwpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUaWVQb2ludCwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbiwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZUhlaWdodCwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZVdpZHRoLCBsKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAobG9hZEdlb1RhZ3MpIHtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnksIGwpKTtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Bc2NpaVBhcmFtcywgbCkpO1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0RvdWJsZVBhcmFtcywgbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocmVxdWlyZWRUYWdzKTtcbiAgICAgICAgaWYgKGxvYWRHZW9UYWdzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRHZW9UaWZmVGFncyhsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBUaWZmVGFnIGlmIGl0IGV4aXN0cyBudWxsIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHZhbHVlPFQ+KHRhZzogVGlmZlRhZyk6IFQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc291cmNlVGFnID0gdGhpcy50YWdzLmdldCh0YWcpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gc291cmNlVGFnLnZhbHVlIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhbmQgdW5wYWNrIHRoZSBHZW9LZXlEaXJlY3RvcnlcbiAgICAgKi9cbiAgICBhc3luYyBsb2FkR2VvVGlmZlRhZ3MobDogTG9nVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBBbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy50YWdzR2VvTG9hZGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNvdXJjZVRhZyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGFnc0dlb0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzb3VyY2VUYWcuaXNSZWFkeSAmJiBzb3VyY2VUYWcgaW5zdGFuY2VvZiBDb2dUaWZmVGFnTGF6eSkge1xuICAgICAgICAgICAgLy8gTG9hZCBhbGwgdGhlIHJlcXVpcmVkIGtleXNcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5LCBsKSxcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvQXNjaWlQYXJhbXMsIGwpLFxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Eb3VibGVQYXJhbXMsIGwpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWdzR2VvTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZy52YWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdlb1RhZ3MgPSBzb3VyY2VUYWcudmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShnZW9UYWdzKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdlbyB0YWdzIGZvdW5kJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSA0OyBpIDw9IGdlb1RhZ3NbM10gKiA0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGdlb1RhZ3NbaV0gYXMgVGlmZlRhZ0dlbztcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZ2VvVGFnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGdlb1RhZ3NbaSArIDNdO1xuXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHRoaXMudGFncy5nZXQobG9jYXRpb24pO1xuICAgICAgICAgICAgaWYgKHRhZyA9PSBudWxsIHx8IHRhZy52YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZ2VvVGFnc1tpICsgMl07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWcudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIHRhZy52YWx1ZVtvZmZzZXQgKyBjb3VudCAtIDFdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhZy52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgdGFnLnZhbHVlLnN1YnN0cihvZmZzZXQsIG9mZnNldCArIGNvdW50IC0gMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYXNzb2NpYXRlZCBHZW9UaWZmVGFnc1xuICAgICAqL1xuICAgIHZhbHVlR2VvKHRhZzogVGlmZlRhZ0dlbyk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLnRhZ3NHZW9Mb2FkZWQgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ2xvYWRHZW9UaWZmVGFncygpIGhhcyBub3QgYmVlbiBjYWxsZWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnc0dlby5nZXQodGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgdGFnLCBpZiBpdCBpcyBub3QgY3VycmVudGx5IGxvYWRlZCwgZmV0Y2ggdGhlIHJlcXVpcmVkIGRhdGEgZm9yIHRoZSB0YWcuXG4gICAgICogQHBhcmFtIHRhZyB0YWcgdG8gZmV0Y2hcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2g8VD4odGFnOiBUaWZmVGFnLCBsOiBMb2dUeXBlKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gICAgICAgIGlmIChzb3VyY2VUYWcgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChDb2dUaWZmVGFnLmlzTGF6eShzb3VyY2VUYWcpKSByZXR1cm4gc291cmNlVGFnLmZldGNoKGwpIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRhZy52YWx1ZSBhcyBUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3JpZ2luIHBvaW50IGZvciB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG9yaWdpbiBwb2ludCBvZiB0aGUgaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgb3JpZ2luKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHRpZVBvaW50czogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRpZVBvaW50KTtcbiAgICAgICAgaWYgKHRpZVBvaW50cyAhPSBudWxsICYmIHRpZVBvaW50cy5sZW5ndGggPT09IDYpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGllUG9pbnRzWzNdLCB0aWVQb2ludHNbNF0sIHRpZVBvaW50c1s1XV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbFRyYW5zZm9ybWF0aW9uID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKTtcbiAgICAgICAgaWYgKG1vZGVsVHJhbnNmb3JtYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFRyYW5zZm9ybWF0aW9uWzNdLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzddLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzExXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViIGltYWdlLCB1c2UgdGhlIG9yaWdpbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGlmLmltYWdlc1swXS5vcmlnaW47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGRvZXMgbm90IGhhdmUgYSBnZW8gdHJhbnNmb3JtYXRpb24uJyk7XG4gICAgfVxuXG4gICAgLyoqIElzIHRoZXJlIGVub3VnaCBnZW8gaW5mb3JtYXRpb24gb24gdGhpcyBpbWFnZSB0byBmaWd1cmUgb3V0IHdoZXJlIGl0cyBhY3R1YWxseSBsb2NhdGVkICovXG4gICAgZ2V0IGlzR2VvTG9jYXRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbWFnZUxvY2F0ZWQgPVxuICAgICAgICAgICAgdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSkgIT0gbnVsbCB8fCB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbikgIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzSW1hZ2VMb2NhdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN1YiBpbWFnZSwgdXNlIHRoZSBpc0dlb0xvY2F0ZWQgZnJvbSB0aGUgdG9wIGxldmVsIGltYWdlXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKFRpZmZUYWcuTmV3U3ViRmlsZVR5cGUpID09PSAxICYmIHRoaXMuaWQgIT09IDApIHJldHVybiB0aGlzLnRpZi5pbWFnZXNbMF0uaXNHZW9Mb2NhdGVkO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgW3gseSx6XSBwaXhlbCBzY2FsZVxuICAgICAqL1xuICAgIGdldCByZXNvbHV0aW9uKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUGl4ZWxTY2FsZTogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSk7XG4gICAgICAgIGlmIChtb2RlbFBpeGVsU2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFBpeGVsU2NhbGVbMF0sIC1tb2RlbFBpeGVsU2NhbGVbMV0sIG1vZGVsUGl4ZWxTY2FsZVsyXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kZWxUcmFuc2Zvcm1hdGlvbjogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsVHJhbnNmb3JtYXRpb24pO1xuICAgICAgICBpZiAobW9kZWxUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsVHJhbnNmb3JtYXRpb25bMF0sIG1vZGVsVHJhbnNmb3JtYXRpb25bNV0sIG1vZGVsVHJhbnNmb3JtYXRpb25bMTBdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdWIgaW1hZ2UsIHVzZSB0aGUgcmVzb2x1dGlvbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWcgPSB0aGlzLnRpZi5pbWFnZXNbMF07XG4gICAgICAgICAgICBjb25zdCBbcmVzWCwgcmVzWSwgcmVzWl0gPSBmaXJzdEltZy5yZXNvbHV0aW9uO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWdTaXplID0gZmlyc3RJbWcuc2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGltZ1NpemUgPSB0aGlzLnNpemU7XG4gICAgICAgICAgICAvLyBzY2FsZSByZXNvbHV0aW9uIGJhc2VkIG9uIHRoZSBzaXplIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGltYWdlc1xuICAgICAgICAgICAgcmV0dXJuIFsocmVzWCAqIGZpcnN0SW1nU2l6ZS53aWR0aCkgLyBpbWdTaXplLndpZHRoLCAocmVzWSAqIGZpcnN0SW1nU2l6ZS5oZWlnaHQpIC8gaW1nU2l6ZS5oZWlnaHQsIHJlc1pdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbWFnZSBkb2VzIG5vdCBoYXZlIGEgZ2VvIHRyYW5zZm9ybWF0aW9uLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJvdW5kaW5nIGJveCBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSBib3VuZGluZyBib3hcbiAgICAgKi9cbiAgICBnZXQgYmJveCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMub3JpZ2luO1xuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gdGhpcy5yZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmIChvcmlnaW4gPT0gbnVsbCB8fCBzaXplID09IG51bGwgfHwgcmVzb2x1dGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBjYWxjdWxhdGUgYm91bmRpbmcgYm94Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4MSA9IG9yaWdpblswXTtcbiAgICAgICAgY29uc3QgeTEgPSBvcmlnaW5bMV07XG5cbiAgICAgICAgY29uc3QgeDIgPSB4MSArIHJlc29sdXRpb25bMF0gKiBzaXplLndpZHRoO1xuICAgICAgICBjb25zdCB5MiA9IHkxICsgcmVzb2x1dGlvblsxXSAqIHNpemUuaGVpZ2h0O1xuXG4gICAgICAgIHJldHVybiBbTWF0aC5taW4oeDEsIHgyKSwgTWF0aC5taW4oeTEsIHkyKSwgTWF0aC5tYXgoeDEsIHgyKSwgTWF0aC5tYXgoeTEsIHkyKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb21wcmVzc2lvbiB1c2VkIGJ5IHRoZSB0aWxlXG4gICAgICpcbiAgICAgKiBAc2VlIFRpZmZDb21wcmVzc2lvblxuICAgICAqXG4gICAgICogQHJldHVybnMgQ29tcHJlc3Npb24gdHlwZSBlZyB3ZWJwXG4gICAgICovXG4gICAgZ2V0IGNvbXByZXNzaW9uKCk6IFRpZmZNaW1lVHlwZSB8IG51bGwge1xuICAgICAgICBjb25zdCBjb21wcmVzc2lvbiA9IHRoaXMudmFsdWUoVGlmZlRhZy5Db21wcmVzc2lvbik7XG4gICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBudWxsIHx8IHR5cGVvZiBjb21wcmVzc2lvbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWZmQ29tcHJlc3Npb25bY29tcHJlc3Npb25dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gcmVhZCB0aGUgRVBTRyBDb2RlIGZyb20gVGlmZkdlb1RhZ3NcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEVQU0cgQ29kZSBpZiBpdCBleGlzdHNcbiAgICAgKi9cbiAgICBnZXQgZXBzZygpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMudmFsdWVHZW8oVGlmZlRhZ0dlby5Qcm9qZWN0ZWRDU1R5cGVHZW9LZXkpIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKHByb2plY3Rpb24gPT09IEludmFsaWRQcm9qZWN0aW9uQ29kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNpemUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgZ2V0IHNpemUoKTogU2l6ZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuSW1hZ2VXaWR0aCkgYXMgbnVtYmVyLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5JbWFnZUhlaWdodCkgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBJRkQgdGFncyB0aGF0IHdlcmUgcmVhZFxuICAgICAqL1xuICAgIGdldCB0YWdMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnRhZ3Mua2V5cygpXS5tYXAoKGMpID0+IFRpZmZUYWdbY10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiB0aGlzIGltYWdlIGlzIHRpbGVkXG4gICAgICovXG4gICAgcHVibGljIGlzVGlsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlKFRpZmZUYWcuVGlsZVdpZHRoKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2l6ZSBvZiBpbmRpdmlkdWFsIHRpbGVzXG4gICAgICovXG4gICAgZ2V0IHRpbGVTaXplKCk6IENvZ1RpZmZJbWFnZVRpbGVTaXplIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5UaWxlV2lkdGgpIGFzIG51bWJlcixcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuVGlsZUhlaWdodCkgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0aWxlcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGltYWdlXG4gICAgICovXG4gICAgZ2V0IHRpbGVDb3VudCgpOiBDb2dUaWZmSW1hZ2VUaWxlZENvdW50IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgY29uc3QgdGlsZVNpemUgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5jZWlsKHNpemUud2lkdGggLyB0aWxlU2l6ZS53aWR0aCk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLmNlaWwoc2l6ZS5oZWlnaHQgLyB0aWxlU2l6ZS5oZWlnaHQpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwb2ludGVyIHRvIHdoZXJlIHRoZSB0aWxlcyBzdGFydCBpbiB0aGUgVGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBVc2VkIHRvIHJlYWQgdGlsZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IHRvIHdoZXJlIHRoZSB0aWZmcyBhcmUgc3RvcmVkXG4gICAgICovXG4gICAgZ2V0IHRpbGVPZmZzZXQoKTogQ29nVGlmZlRhZ09mZnNldCB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuVGlsZU9mZnNldHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmICh0aWxlT2Zmc2V0ID09IG51bGwpIHRocm93IG5ldyBFcnJvcignTm8gdGlsZSBvZmZzZXRzIGZvdW5kJyk7XG4gICAgICAgIHJldHVybiB0aWxlT2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHN0cmlwJ3MgaW5zaWRlIHRoaXMgdGlmZlxuICAgICAqXG4gICAgICogQHJlbWFya3MgVXNlZCB0byByZWFkIHN0cmlwZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG51bWJlciBvZiBzdHJpcHMgcHJlc2VudFxuICAgICAqL1xuICAgIGdldCBzdHJpcENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAodGlsZU9mZnNldCA9PSBudWxsKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQuZGF0YUNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHBvaW50ZXIgdG8gYSBzcGVjaWZpYyB0aWxlIGluc2lkZSB0aGUgdGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggdGlsZSBpbmRleFxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgdGlsZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBnZXRUaWxlT2Zmc2V0KGluZGV4OiBudW1iZXIsIGw/OiBMb2dUeXBlKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgdGlsZU9mZnNldCA9IHRoaXMudGlsZU9mZnNldDtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRpbGVPZmZzZXQuZGF0YUNvdW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbGUgb2Zmc2V0OiAke2luZGV4fSBvdXQgb2YgcmFuZ2U6IDAgLT4gJHt0aWxlT2Zmc2V0LmRhdGFDb3VudH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZldGNoIG9ubHkgdGhlIHBhcnQgb2YgdGhlIG9mZnNldHMgdGhhdCBhcmUgbmVlZGVkXG4gICAgICAgIHJldHVybiB0aWxlT2Zmc2V0LmdldFZhbHVlQXQoaW5kZXgsIGwpO1xuICAgIH1cblxuICAgIC8vIENsYW1wIHRoZSBib3VuZHMgb2YgdGhlIG91dHB1dCBpbWFnZSB0byB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UsIGFzIHNvbWV0aW1lcyB0aGUgZWRnZSB0aWxlcyBhcmUgbm90IGZ1bGwgdGlsZXNcbiAgICBnZXRUaWxlQm91bmRzKHg6IG51bWJlciwgeTogbnVtYmVyKTogQm91bmRpbmdCb3gge1xuICAgICAgICBjb25zdCB7IHNpemUsIHRpbGVTaXplIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB0b3AgPSB5ICogdGlsZVNpemUuaGVpZ2h0O1xuICAgICAgICBjb25zdCBsZWZ0ID0geCAqIHRpbGVTaXplLndpZHRoO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGxlZnQgKyB0aWxlU2l6ZS53aWR0aCA+PSBzaXplLndpZHRoID8gc2l6ZS53aWR0aCAtIGxlZnQgOiB0aWxlU2l6ZS53aWR0aDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdG9wICsgdGlsZVNpemUuaGVpZ2h0ID49IHNpemUuaGVpZ2h0ID8gc2l6ZS5oZWlnaHQgLSB0b3AgOiB0aWxlU2l6ZS5oZWlnaHQ7XG4gICAgICAgIHJldHVybiB7IHg6IGxlZnQsIHk6IHRvcCwgd2lkdGgsIGhlaWdodCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBzdHJpcCBpbnRvIGEgdWludDggYXJyYXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBTdHJpcCBpbmRleCB0byByZWFkXG4gICAgICovXG4gICAgYXN5bmMgZ2V0U3RyaXAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBtaW1lVHlwZTogVGlmZk1pbWVUeXBlOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBpZiAodGhpcy5pc1RpbGVkKCkpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgc3RyaXBlcywgdGlmZiBpcyB0aWxlZCcpO1xuXG4gICAgICAgIGNvbnN0IGJ5dGVDb3VudHMgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBjb25zdCBvZmZzZXRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlN0cmlwT2Zmc2V0cykgYXMgQ29nVGlmZlRhZ09mZnNldDtcblxuICAgICAgICBpZiAoaW5kZXggPj0gYnl0ZUNvdW50cy5kYXRhQ291bnQpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgc3RyaXAsIGluZGV4IG91dCBvZiBib3VuZHMnKTtcblxuICAgICAgICBjb25zdCBbYnl0ZUNvdW50LCBvZmZzZXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW29mZnNldHMuZ2V0VmFsdWVBdChpbmRleCksIGJ5dGVDb3VudHMuZ2V0VmFsdWVBdChpbmRleCldKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qnl0ZXMoYnl0ZUNvdW50LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIC8qKiBUaGUganBlZyBoZWFkZXIgaXMgc3RvcmVkIGluIHRoZSBJRkQsIHJlYWQgdGhlIEpQRUcgaGVhZGVyIGFuZCBhZGp1c3QgdGhlIGJ5dGUgYXJyYXkgdG8gaW5jbHVkZSBpdCAqL1xuICAgIHByaXZhdGUgZ2V0SnBlZ0hlYWRlcihieXRlczogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgICAgICAvLyBCb3RoIHRoZSBKUEVHVGFibGUgYW5kIHRoZSBCeXRlcyB3aXRoIGhhdmUgdGhlIHN0YXJ0IG9mIGltYWdlIGFuZCBlbmQgb2YgaW1hZ2UgbWFya2Vyc1xuICAgICAgICAvLyBTdGFydE9mSW1hZ2UgMHhmZmQ4IEVuZE9mSW1hZ2UgMHhmZmQ5XG4gICAgICAgIGNvbnN0IHRhYmxlcyA9IHRoaXMudmFsdWU8bnVtYmVyW10+KFRpZmZUYWcuSlBFR1RhYmxlcyk7XG4gICAgICAgIGlmICh0YWJsZXMgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBKcGVnIGhlYWRlcicpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBFbmRPZkltYWdlIG1hcmtlclxuICAgICAgICBjb25zdCB0YWJsZURhdGEgPSB0YWJsZXMuc2xpY2UoMCwgdGFibGVzLmxlbmd0aCAtIDIpO1xuICAgICAgICBjb25zdCBhY3R1YWxCeXRlcyA9IG5ldyBVaW50OEFycmF5KGJ5dGVzLmJ5dGVMZW5ndGggKyB0YWJsZURhdGEubGVuZ3RoIC0gMik7XG4gICAgICAgIGFjdHVhbEJ5dGVzLnNldCh0YWJsZURhdGEsIDApO1xuICAgICAgICBhY3R1YWxCeXRlcy5zZXQoYnl0ZXMuc2xpY2UoMiksIHRhYmxlRGF0YS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gYWN0dWFsQnl0ZXM7XG4gICAgfVxuXG4gICAgLyoqIFJlYWQgaW1hZ2UgYnl0ZXMgYXQgdGhlIGdpdmVuIG9mZnNldCAqL1xuICAgIHByaXZhdGUgYXN5bmMgZ2V0Qnl0ZXMoXG4gICAgICAgIG9mZnNldDogbnVtYmVyLFxuICAgICAgICBieXRlQ291bnQ6IG51bWJlcixcbiAgICAgICAgbD86IExvZ1R5cGUsXG4gICAgKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBUaWZmTWltZVR5cGU7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IG1pbWVUeXBlID0gdGhpcy5jb21wcmVzc2lvbjtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcbiAgICAgICAgaWYgKGJ5dGVDb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXdhaXQgdGhpcy50aWYuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIGJ5dGVDb3VudCwgbCk7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gdGhpcy50aWYuc291cmNlLmJ5dGVzKG9mZnNldCwgYnl0ZUNvdW50KTtcblxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2lvbiA9PT0gVGlmZk1pbWVUeXBlLkpQRUcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlczogdGhpcy5nZXRKcGVnSGVhZGVyKGJ5dGVzKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIHRpbGUgYnVmZmVyLCB0aGlzIHdvcmtzIGJlc3Qgd2l0aCB3ZWJwXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxzbyBhcHBseSB0aGUgSlBFRyBjb21wcmVzc2lvbiB0YWJsZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRpbGUgeCBvZmZzZXRcbiAgICAgKiBAcGFyYW0geSBUaWxlIHkgb2Zmc2V0XG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGlsZSh4OiBudW1iZXIsIHk6IG51bWJlciwgbD86IExvZ1R5cGUpOiBQcm9taXNlPHsgbWltZVR5cGU6IFRpZmZNaW1lVHlwZTsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbWltZVR5cGUgPSB0aGlzLmNvbXByZXNzaW9uO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBjb25zdCB0aWxlcyA9IHRoaXMudGlsZVNpemU7XG5cbiAgICAgICAgaWYgKHRpbGVzID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVGlmZiBpcyBub3QgdGlsZWQnKTtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcblxuICAgICAgICAvLyBUT0RPIHN1cHBvcnQgR2hvc3RPcHRpb25UaWxlT3JkZXJcbiAgICAgICAgY29uc3QgbnlUaWxlcyA9IE1hdGguY2VpbChzaXplLmhlaWdodCAvIHRpbGVzLmhlaWdodCk7XG4gICAgICAgIGNvbnN0IG54VGlsZXMgPSBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGVzLndpZHRoKTtcblxuICAgICAgICBpZiAoeCA+PSBueFRpbGVzIHx8IHkgPj0gbnlUaWxlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaWxlIGluZGV4IGlzIG91dHNpZGUgb2YgcmFuZ2UgeDoke3h9ID49ICR7bnhUaWxlc30gb3IgeToke3l9ID49ICR7bnlUaWxlc31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiBueFRpbGVzICsgeDtcbiAgICAgICAgY29uc3QgdG90YWxUaWxlcyA9IG54VGlsZXMgKiBueVRpbGVzO1xuICAgICAgICBpZiAoaWR4ID49IHRvdGFsVGlsZXMpIHRocm93IG5ldyBFcnJvcihgVGlsZSBpbmRleCBpcyBvdXRzaWRlIG9mIHRpbGUgcmFuZ2U6ICR7aWR4fSA+PSAke3RvdGFsVGlsZXN9YCk7XG5cbiAgICAgICAgY29uc3QgeyBvZmZzZXQsIGltYWdlU2l6ZSB9ID0gYXdhaXQgdGhpcy5nZXRUaWxlU2l6ZShpZHgsIGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhvZmZzZXQsIGltYWdlU2l6ZSwgbCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldFRpbGVTaXplKGluZGV4OiBudW1iZXIsIGw/OiBMb2dUeXBlKTogUHJvbWlzZTx7IG9mZnNldDogbnVtYmVyOyBpbWFnZVNpemU6IG51bWJlciB9PiB7XG4gICAgICAgIC8vIEdEQUwgb3B0aW1pemVzIHRpbGVzIGJ5IHN0b3JpbmcgdGhlIHNpemUgb2YgdGhlIHRpbGUgaW5cbiAgICAgICAgLy8gdGhlIGZldyBieXRlcyBsZWFkaW5nIHVwIHRvIHRoZSB0aWxlXG4gICAgICAgIGlmICh0aGlzLnRpZi5vcHRpb25zLnRpbGVMZWFkZXJCeXRlU2l6ZSkge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYXdhaXQgdGhpcy5nZXRUaWxlT2Zmc2V0KGluZGV4LCBsKTtcbiAgICAgICAgICAgIC8vIFNwYXJzZSBDT0cgbm8gZGF0YSBmb3VuZFxuICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgcmV0dXJuIHsgb2Zmc2V0OiAwLCBpbWFnZVNpemU6IDAgfTtcblxuICAgICAgICAgICAgY29uc3QgbGVhZGVyQnl0ZXMgPSB0aGlzLnRpZi5vcHRpb25zLnRpbGVMZWFkZXJCeXRlU2l6ZTtcbiAgICAgICAgICAgIC8vIFRoaXMgZmV0Y2ggd2lsbCBnZW5lcmFsbHkgbG9hZCBpbiB0aGUgYnl0ZXMgbmVlZGVkIGZvciB0aGUgaW1hZ2UgdG9vXG4gICAgICAgICAgICAvLyBwcm92aWRlZCB0aGUgaW1hZ2Ugc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIHNpemUgb2YgYSBjaHVua1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50aWYuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQgLSBsZWFkZXJCeXRlcywgbGVhZGVyQnl0ZXMsIGwpO1xuICAgICAgICAgICAgcmV0dXJuIHsgb2Zmc2V0LCBpbWFnZVNpemU6IHRoaXMudGlmLnNvdXJjZS5nZXRVaW50KG9mZnNldCAtIGxlYWRlckJ5dGVzLCBsZWFkZXJCeXRlcykgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ5dGVDb3VudHMgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuVGlsZUJ5dGVDb3VudHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmIChieXRlQ291bnRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdGlsZSBieXRlIGNvdW50cyBmb3VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFtvZmZzZXQsIGltYWdlU2l6ZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5nZXRUaWxlT2Zmc2V0KGluZGV4LCBsKSwgYnl0ZUNvdW50cy5nZXRWYWx1ZUF0KGluZGV4LCBsKV0pO1xuICAgICAgICByZXR1cm4geyBvZmZzZXQsIGltYWdlU2l6ZSB9O1xuICAgIH1cbn1cbiJdfQ==
|
|
424
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYuaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHaEQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQXNCM0MsTUFBTSxPQUFPLFlBQVk7SUFjckIsWUFBWSxHQUFZLEVBQUUsRUFBVSxFQUFFLElBQWtDO1FBTHhFLHNDQUFzQztRQUM5QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUM5QixpREFBaUQ7UUFDakQsWUFBTyxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBR2xELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUs7UUFDMUIsTUFBTSxZQUFZLEdBQUc7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1lBQ25DLElBQUks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QyxrQkFBa0IsQ0FBQztRQUN4RCxJQUFJLFdBQVcsRUFBRTtZQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQywyQkFBMkI7WUFDM0IsSUFBSSxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFckQsdUVBQXVFO1lBQ3ZFLDJEQUEyRDtZQUMzRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7U0FDNUY7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFxQixDQUFDO1FBQzdFLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDaEQ7UUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekcsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2dUaWZmIH0gZnJvbSAnLi9jb2cudGlmZi5qcyc7XG5pbXBvcnQgeyBUaWZmQ29tcHJlc3Npb24sIFRpZmZNaW1lVHlwZSB9IGZyb20gJy4vY29uc3QvdGlmZi5taW1lLmpzJztcbmltcG9ydCB7IFRpZmZUYWcsIFRpZmZUYWdHZW8gfSBmcm9tICcuL2NvbnN0L3RpZmYudGFnLmlkLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdCYXNlIH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5iYXNlLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdMYXp5IH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5sYXp5LmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdPZmZzZXQgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLm9mZnNldC5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnIH0gZnJvbSAnLi9yZWFkL3RpZmYudGFnLmpzJztcbmltcG9ydCB7IEJvdW5kaW5nQm94LCBTaXplIH0gZnJvbSAnLi92ZWN0b3IuanMnO1xuXG4vKiogSW52YWxpZCBFUFNHIGNvZGUgKi9cbmV4cG9ydCBjb25zdCBJbnZhbGlkUHJvamVjdGlvbkNvZGUgPSAzMjc2NztcblxuLyoqXG4gKiBOdW1iZXIgb2YgdGlsZXMgdXNlZCBpbnNpZGUgdGhpcyBpbWFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZ1RpZmZJbWFnZVRpbGVkQ291bnQge1xuICAgIC8qKiBOdW1iZXIgb2YgdGlsZXMgb24gdGhlIHggYXhpcyAqL1xuICAgIHg6IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHRpbGVzIG9uIHRoZSB5IGF4aXMgKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogU2l6ZSBvZiBhIGluZGl2aWR1YWwgdGlsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZ1RpZmZJbWFnZVRpbGVTaXplIHtcbiAgICAvKiogVGlsZSB3aWR0aCAocGl4ZWxzKSAqL1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRpbGUgaGVpZ2h0IChwaXhlbHMpICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBDb2dUaWZmSW1hZ2Uge1xuICAgIC8qKiBBbGwgSUZEIHRhZ3MgdGhhdCBoYXZlIGJlZW4gcmVhZCBmb3IgdGhlIGltYWdlICovXG4gICAgdGFnczogTWFwPFRpZmZUYWcsIENvZ1RpZmZUYWdCYXNlPjtcblxuICAgIC8qKiBJZCBvZiB0aGUgdGlmIGltYWdlLCBnZW5lcmFsbHkgdGhlIGltYWdlIGluZGV4IGluc2lkZSB0aGUgdGlmICovXG4gICAgaWQ6IG51bWJlcjtcblxuICAgIHRpZjogQ29nVGlmZjtcblxuICAgIC8qKiBIYXMgbG9hZEdlb1RpZmZUYWdzIGJlZW4gY2FsbGVkICovXG4gICAgcHJpdmF0ZSB0YWdzR2VvTG9hZGVkID0gZmFsc2U7XG4gICAgLyoqIFN1YiB0YWdzIHN0b3JlZCBpbiBUaWZmVGFnLkdlb0tleURpcmVjdG9yeSAqL1xuICAgIHRhZ3NHZW86IE1hcDxUaWZmVGFnR2VvLCBzdHJpbmcgfCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IodGlmOiBDb2dUaWZmLCBpZDogbnVtYmVyLCB0YWdzOiBNYXA8VGlmZlRhZywgQ29nVGlmZlRhZ0Jhc2U+KSB7XG4gICAgICAgIHRoaXMudGlmID0gdGlmO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMudGFncyA9IHRhZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgbG9hZGluZyBvZiBpbXBvcnRhbnQgdGFncyBpZiB0aGV5IGhhdmUgbm90IGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2FkR2VvVGFncyBXaGV0aGVyIHRvIGxvYWQgdGhlIEdlb0tleURpcmVjdG9yeSBhbmQgdW5wYWNrIGl0XG4gICAgICovXG4gICAgYXN5bmMgaW5pdChsb2FkR2VvVGFncyA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkVGFncyA9IFtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Db21wcmVzc2lvbiksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuSW1hZ2VIZWlnaHQpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkltYWdlV2lkdGgpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUaWVQb2ludCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbiksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZUhlaWdodCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZVdpZHRoKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAobG9hZEdlb1RhZ3MpIHtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkpKTtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Bc2NpaVBhcmFtcykpO1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0RvdWJsZVBhcmFtcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocmVxdWlyZWRUYWdzKTtcbiAgICAgICAgaWYgKGxvYWRHZW9UYWdzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRHZW9UaWZmVGFncygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIFRpZmZUYWcgaWYgaXQgZXhpc3RzIG51bGwgb3RoZXJ3aXNlXG4gICAgICovXG4gICAgdmFsdWU8VD4odGFnOiBUaWZmVGFnKTogVCB8IG51bGwge1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gICAgICAgIGlmIChzb3VyY2VUYWcgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBzb3VyY2VUYWcudmFsdWUgYXMgVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGFuZCB1bnBhY2sgdGhlIEdlb0tleURpcmVjdG9yeVxuICAgICAqL1xuICAgIGFzeW5jIGxvYWRHZW9UaWZmVGFncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gQWxyZWFkeSBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMudGFnc0dlb0xvYWRlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5KTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRhZ3NHZW9Mb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc291cmNlVGFnLmlzUmVhZHkgJiYgc291cmNlVGFnIGluc3RhbmNlb2YgQ29nVGlmZlRhZ0xhenkpIHtcbiAgICAgICAgICAgIC8vIExvYWQgYWxsIHRoZSByZXF1aXJlZCBrZXlzXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkdlb0tleURpcmVjdG9yeSksXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkdlb0FzY2lpUGFyYW1zKSxcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvRG91YmxlUGFyYW1zKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFnc0dlb0xvYWRlZCA9IHRydWU7XG4gICAgICAgIGlmIChzb3VyY2VUYWcudmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnZW9UYWdzID0gc291cmNlVGFnLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZ2VvVGFncykpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBnZW8gdGFncyBmb3VuZCcpO1xuICAgICAgICBmb3IgKGxldCBpID0gNDsgaSA8PSBnZW9UYWdzWzNdICogNDsgaSArPSA0KSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBnZW9UYWdzW2ldIGFzIFRpZmZUYWdHZW87XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGdlb1RhZ3NbaSArIDFdO1xuXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBnZW9UYWdzW2kgKyAzXTtcblxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0YWcgPSB0aGlzLnRhZ3MuZ2V0KGxvY2F0aW9uKTtcbiAgICAgICAgICAgIGlmICh0YWcgPT0gbnVsbCB8fCB0YWcudmFsdWUgPT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IGdlb1RhZ3NbaSArIDJdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFnLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGFnc0dlby5zZXQoa2V5LCB0YWcudmFsdWVbb2Zmc2V0ICsgY291bnQgLSAxXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YWcudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIHRhZy52YWx1ZS5zdWJzdHIob2Zmc2V0LCBvZmZzZXQgKyBjb3VudCAtIDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFzc29jaWF0ZWQgR2VvVGlmZlRhZ3NcbiAgICAgKi9cbiAgICB2YWx1ZUdlbyh0YWc6IFRpZmZUYWdHZW8pOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy50YWdzR2VvTG9hZGVkID09PSBmYWxzZSkgdGhyb3cgbmV3IEVycm9yKCdsb2FkR2VvVGlmZlRhZ3MoKSBoYXMgbm90IGJlZW4gY2FsbGVkJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZ3NHZW8uZ2V0KHRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHRhZywgaWYgaXQgaXMgbm90IGN1cnJlbnRseSBsb2FkZWQsIGZldGNoIHRoZSByZXF1aXJlZCBkYXRhIGZvciB0aGUgdGFnLlxuICAgICAqIEBwYXJhbSB0YWcgdGFnIHRvIGZldGNoXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHRhZzogVGlmZlRhZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICAgICAgY29uc3Qgc291cmNlVGFnID0gdGhpcy50YWdzLmdldCh0YWcpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoQ29nVGlmZlRhZy5pc0xhenkoc291cmNlVGFnKSkgcmV0dXJuIHNvdXJjZVRhZy5mZXRjaCgpIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRhZy52YWx1ZSBhcyBUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3JpZ2luIHBvaW50IGZvciB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG9yaWdpbiBwb2ludCBvZiB0aGUgaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgb3JpZ2luKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHRpZVBvaW50czogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRpZVBvaW50KTtcbiAgICAgICAgaWYgKHRpZVBvaW50cyAhPSBudWxsICYmIHRpZVBvaW50cy5sZW5ndGggPT09IDYpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGllUG9pbnRzWzNdLCB0aWVQb2ludHNbNF0sIHRpZVBvaW50c1s1XV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbFRyYW5zZm9ybWF0aW9uID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKTtcbiAgICAgICAgaWYgKG1vZGVsVHJhbnNmb3JtYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFRyYW5zZm9ybWF0aW9uWzNdLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzddLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzExXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViIGltYWdlLCB1c2UgdGhlIG9yaWdpbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGlmLmltYWdlc1swXS5vcmlnaW47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGRvZXMgbm90IGhhdmUgYSBnZW8gdHJhbnNmb3JtYXRpb24uJyk7XG4gICAgfVxuXG4gICAgLyoqIElzIHRoZXJlIGVub3VnaCBnZW8gaW5mb3JtYXRpb24gb24gdGhpcyBpbWFnZSB0byBmaWd1cmUgb3V0IHdoZXJlIGl0cyBhY3R1YWxseSBsb2NhdGVkICovXG4gICAgZ2V0IGlzR2VvTG9jYXRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbWFnZUxvY2F0ZWQgPVxuICAgICAgICAgICAgdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSkgIT0gbnVsbCB8fCB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbikgIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzSW1hZ2VMb2NhdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN1YiBpbWFnZSwgdXNlIHRoZSBpc0dlb0xvY2F0ZWQgZnJvbSB0aGUgdG9wIGxldmVsIGltYWdlXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKFRpZmZUYWcuTmV3U3ViRmlsZVR5cGUpID09PSAxICYmIHRoaXMuaWQgIT09IDApIHJldHVybiB0aGlzLnRpZi5pbWFnZXNbMF0uaXNHZW9Mb2NhdGVkO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgW3gseSx6XSBwaXhlbCBzY2FsZVxuICAgICAqL1xuICAgIGdldCByZXNvbHV0aW9uKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUGl4ZWxTY2FsZTogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSk7XG4gICAgICAgIGlmIChtb2RlbFBpeGVsU2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFBpeGVsU2NhbGVbMF0sIC1tb2RlbFBpeGVsU2NhbGVbMV0sIG1vZGVsUGl4ZWxTY2FsZVsyXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kZWxUcmFuc2Zvcm1hdGlvbjogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsVHJhbnNmb3JtYXRpb24pO1xuICAgICAgICBpZiAobW9kZWxUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsVHJhbnNmb3JtYXRpb25bMF0sIG1vZGVsVHJhbnNmb3JtYXRpb25bNV0sIG1vZGVsVHJhbnNmb3JtYXRpb25bMTBdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdWIgaW1hZ2UsIHVzZSB0aGUgcmVzb2x1dGlvbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWcgPSB0aGlzLnRpZi5pbWFnZXNbMF07XG4gICAgICAgICAgICBjb25zdCBbcmVzWCwgcmVzWSwgcmVzWl0gPSBmaXJzdEltZy5yZXNvbHV0aW9uO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWdTaXplID0gZmlyc3RJbWcuc2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGltZ1NpemUgPSB0aGlzLnNpemU7XG4gICAgICAgICAgICAvLyBzY2FsZSByZXNvbHV0aW9uIGJhc2VkIG9uIHRoZSBzaXplIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGltYWdlc1xuICAgICAgICAgICAgcmV0dXJuIFsocmVzWCAqIGZpcnN0SW1nU2l6ZS53aWR0aCkgLyBpbWdTaXplLndpZHRoLCAocmVzWSAqIGZpcnN0SW1nU2l6ZS5oZWlnaHQpIC8gaW1nU2l6ZS5oZWlnaHQsIHJlc1pdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbWFnZSBkb2VzIG5vdCBoYXZlIGEgZ2VvIHRyYW5zZm9ybWF0aW9uLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJvdW5kaW5nIGJveCBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSBib3VuZGluZyBib3hcbiAgICAgKi9cbiAgICBnZXQgYmJveCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMub3JpZ2luO1xuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gdGhpcy5yZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmIChvcmlnaW4gPT0gbnVsbCB8fCBzaXplID09IG51bGwgfHwgcmVzb2x1dGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBjYWxjdWxhdGUgYm91bmRpbmcgYm94Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4MSA9IG9yaWdpblswXTtcbiAgICAgICAgY29uc3QgeTEgPSBvcmlnaW5bMV07XG5cbiAgICAgICAgY29uc3QgeDIgPSB4MSArIHJlc29sdXRpb25bMF0gKiBzaXplLndpZHRoO1xuICAgICAgICBjb25zdCB5MiA9IHkxICsgcmVzb2x1dGlvblsxXSAqIHNpemUuaGVpZ2h0O1xuXG4gICAgICAgIHJldHVybiBbTWF0aC5taW4oeDEsIHgyKSwgTWF0aC5taW4oeTEsIHkyKSwgTWF0aC5tYXgoeDEsIHgyKSwgTWF0aC5tYXgoeTEsIHkyKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb21wcmVzc2lvbiB1c2VkIGJ5IHRoZSB0aWxlXG4gICAgICpcbiAgICAgKiBAc2VlIFRpZmZDb21wcmVzc2lvblxuICAgICAqXG4gICAgICogQHJldHVybnMgQ29tcHJlc3Npb24gdHlwZSBlZyB3ZWJwXG4gICAgICovXG4gICAgZ2V0IGNvbXByZXNzaW9uKCk6IFRpZmZNaW1lVHlwZSB8IG51bGwge1xuICAgICAgICBjb25zdCBjb21wcmVzc2lvbiA9IHRoaXMudmFsdWUoVGlmZlRhZy5Db21wcmVzc2lvbik7XG4gICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBudWxsIHx8IHR5cGVvZiBjb21wcmVzc2lvbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWZmQ29tcHJlc3Npb25bY29tcHJlc3Npb25dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gcmVhZCB0aGUgRVBTRyBDb2RlIGZyb20gVGlmZkdlb1RhZ3NcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEVQU0cgQ29kZSBpZiBpdCBleGlzdHNcbiAgICAgKi9cbiAgICBnZXQgZXBzZygpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMudmFsdWVHZW8oVGlmZlRhZ0dlby5Qcm9qZWN0ZWRDU1R5cGVHZW9LZXkpIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKHByb2plY3Rpb24gPT09IEludmFsaWRQcm9qZWN0aW9uQ29kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNpemUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgZ2V0IHNpemUoKTogU2l6ZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuSW1hZ2VXaWR0aCkgYXMgbnVtYmVyLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5JbWFnZUhlaWdodCkgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBJRkQgdGFncyB0aGF0IHdlcmUgcmVhZFxuICAgICAqL1xuICAgIGdldCB0YWdMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnRhZ3Mua2V5cygpXS5tYXAoKGMpID0+IFRpZmZUYWdbY10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiB0aGlzIGltYWdlIGlzIHRpbGVkXG4gICAgICovXG4gICAgcHVibGljIGlzVGlsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlKFRpZmZUYWcuVGlsZVdpZHRoKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2l6ZSBvZiBpbmRpdmlkdWFsIHRpbGVzXG4gICAgICovXG4gICAgZ2V0IHRpbGVTaXplKCk6IENvZ1RpZmZJbWFnZVRpbGVTaXplIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5UaWxlV2lkdGgpIGFzIG51bWJlcixcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuVGlsZUhlaWdodCkgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0aWxlcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGltYWdlXG4gICAgICovXG4gICAgZ2V0IHRpbGVDb3VudCgpOiBDb2dUaWZmSW1hZ2VUaWxlZENvdW50IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgY29uc3QgdGlsZVNpemUgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5jZWlsKHNpemUud2lkdGggLyB0aWxlU2l6ZS53aWR0aCk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLmNlaWwoc2l6ZS5oZWlnaHQgLyB0aWxlU2l6ZS5oZWlnaHQpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwb2ludGVyIHRvIHdoZXJlIHRoZSB0aWxlcyBzdGFydCBpbiB0aGUgVGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBVc2VkIHRvIHJlYWQgdGlsZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IHRvIHdoZXJlIHRoZSB0aWZmcyBhcmUgc3RvcmVkXG4gICAgICovXG4gICAgZ2V0IHRpbGVPZmZzZXQoKTogQ29nVGlmZlRhZ09mZnNldCB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuVGlsZU9mZnNldHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmICh0aWxlT2Zmc2V0ID09IG51bGwpIHRocm93IG5ldyBFcnJvcignTm8gdGlsZSBvZmZzZXRzIGZvdW5kJyk7XG4gICAgICAgIHJldHVybiB0aWxlT2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHN0cmlwJ3MgaW5zaWRlIHRoaXMgdGlmZlxuICAgICAqXG4gICAgICogQHJlbWFya3MgVXNlZCB0byByZWFkIHN0cmlwZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG51bWJlciBvZiBzdHJpcHMgcHJlc2VudFxuICAgICAqL1xuICAgIGdldCBzdHJpcENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAodGlsZU9mZnNldCA9PSBudWxsKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQuZGF0YUNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHBvaW50ZXIgdG8gYSBzcGVjaWZpYyB0aWxlIGluc2lkZSB0aGUgdGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggdGlsZSBpbmRleFxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgdGlsZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBnZXRUaWxlT2Zmc2V0KGluZGV4OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCB0aWxlT2Zmc2V0ID0gdGhpcy50aWxlT2Zmc2V0O1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGlsZU9mZnNldC5kYXRhQ291bnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGlsZSBvZmZzZXQ6ICR7aW5kZXh9IG91dCBvZiByYW5nZTogMCAtPiAke3RpbGVPZmZzZXQuZGF0YUNvdW50fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmV0Y2ggb25seSB0aGUgcGFydCBvZiB0aGUgb2Zmc2V0cyB0aGF0IGFyZSBuZWVkZWRcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQuZ2V0VmFsdWVBdChpbmRleCk7XG4gICAgfVxuXG4gICAgLy8gQ2xhbXAgdGhlIGJvdW5kcyBvZiB0aGUgb3V0cHV0IGltYWdlIHRvIHRoZSBzaXplIG9mIHRoZSBpbWFnZSwgYXMgc29tZXRpbWVzIHRoZSBlZGdlIHRpbGVzIGFyZSBub3QgZnVsbCB0aWxlc1xuICAgIGdldFRpbGVCb3VuZHMoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBCb3VuZGluZ0JveCB7XG4gICAgICAgIGNvbnN0IHsgc2l6ZSwgdGlsZVNpemUgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHRvcCA9IHkgKiB0aWxlU2l6ZS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB4ICogdGlsZVNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gbGVmdCArIHRpbGVTaXplLndpZHRoID49IHNpemUud2lkdGggPyBzaXplLndpZHRoIC0gbGVmdCA6IHRpbGVTaXplLndpZHRoO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0b3AgKyB0aWxlU2l6ZS5oZWlnaHQgPj0gc2l6ZS5oZWlnaHQgPyBzaXplLmhlaWdodCAtIHRvcCA6IHRpbGVTaXplLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHsgeDogbGVmdCwgeTogdG9wLCB3aWR0aCwgaGVpZ2h0IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZCBhIHN0cmlwIGludG8gYSB1aW50OCBhcnJheVxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4IFN0cmlwIGluZGV4IHRvIHJlYWRcbiAgICAgKi9cbiAgICBhc3luYyBnZXRTdHJpcChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBUaWZmTWltZVR5cGU7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGlmICh0aGlzLmlzVGlsZWQoKSkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBzdHJpcGVzLCB0aWZmIGlzIHRpbGVkJyk7XG5cbiAgICAgICAgY29uc3QgYnl0ZUNvdW50cyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5TdHJpcEJ5dGVDb3VudHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGNvbnN0IG9mZnNldHMgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBPZmZzZXRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuXG4gICAgICAgIGlmIChpbmRleCA+PSBieXRlQ291bnRzLmRhdGFDb3VudCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBzdHJpcCwgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgICAgIGNvbnN0IFtieXRlQ291bnQsIG9mZnNldF0gPSBhd2FpdCBQcm9taXNlLmFsbChbb2Zmc2V0cy5nZXRWYWx1ZUF0KGluZGV4KSwgYnl0ZUNvdW50cy5nZXRWYWx1ZUF0KGluZGV4KV0pO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhieXRlQ291bnQsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBqcGVnIGhlYWRlciBpcyBzdG9yZWQgaW4gdGhlIElGRCwgcmVhZCB0aGUgSlBFRyBoZWFkZXIgYW5kIGFkanVzdCB0aGUgYnl0ZSBhcnJheSB0byBpbmNsdWRlIGl0ICovXG4gICAgcHJpdmF0ZSBnZXRKcGVnSGVhZGVyKGJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgICAgIC8vIEJvdGggdGhlIEpQRUdUYWJsZSBhbmQgdGhlIEJ5dGVzIHdpdGggaGF2ZSB0aGUgc3RhcnQgb2YgaW1hZ2UgYW5kIGVuZCBvZiBpbWFnZSBtYXJrZXJzXG4gICAgICAgIC8vIFN0YXJ0T2ZJbWFnZSAweGZmZDggRW5kT2ZJbWFnZSAweGZmZDlcbiAgICAgICAgY29uc3QgdGFibGVzID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5KUEVHVGFibGVzKTtcbiAgICAgICAgaWYgKHRhYmxlcyA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIEpwZWcgaGVhZGVyJyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIEVuZE9mSW1hZ2UgbWFya2VyXG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRhYmxlcy5zbGljZSgwLCB0YWJsZXMubGVuZ3RoIC0gMik7XG4gICAgICAgIGNvbnN0IGFjdHVhbEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMuYnl0ZUxlbmd0aCArIHRhYmxlRGF0YS5sZW5ndGggLSAyKTtcbiAgICAgICAgYWN0dWFsQnl0ZXMuc2V0KHRhYmxlRGF0YSwgMCk7XG4gICAgICAgIGFjdHVhbEJ5dGVzLnNldChieXRlcy5zbGljZSgyKSwgdGFibGVEYXRhLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBhY3R1YWxCeXRlcztcbiAgICB9XG5cbiAgICAvKiogUmVhZCBpbWFnZSBieXRlcyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0ICovXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCeXRlcyhcbiAgICAgICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgICAgIGJ5dGVDb3VudDogbnVtYmVyLFxuICAgICk6IFByb21pc2U8eyBtaW1lVHlwZTogVGlmZk1pbWVUeXBlOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBtaW1lVHlwZSA9IHRoaXMuY29tcHJlc3Npb247XG4gICAgICAgIGlmIChtaW1lVHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbXByZXNzaW9uOiAnICsgdGhpcy52YWx1ZShUaWZmVGFnLkNvbXByZXNzaW9uKSk7XG4gICAgICAgIGlmIChieXRlQ291bnQgPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGF3YWl0IHRoaXMudGlmLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0LCBieXRlQ291bnQpO1xuICAgICAgICBjb25zdCBieXRlcyA9IHRoaXMudGlmLnNvdXJjZS5ieXRlcyhvZmZzZXQsIGJ5dGVDb3VudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3Npb24gPT09IFRpZmZNaW1lVHlwZS5KUEVHKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtaW1lVHlwZSwgYnl0ZXM6IHRoaXMuZ2V0SnBlZ0hlYWRlcihieXRlcykgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtaW1lVHlwZSwgYnl0ZXMgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSB0aWxlIGJ1ZmZlciwgdGhpcyB3b3JrcyBiZXN0IHdpdGggd2VicFxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGFsc28gYXBwbHkgdGhlIEpQRUcgY29tcHJlc3Npb24gdGFibGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaWxlIHggb2Zmc2V0XG4gICAgICogQHBhcmFtIHkgVGlsZSB5IG9mZnNldFxuICAgICAqL1xuICAgIGFzeW5jIGdldFRpbGUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHsgbWltZVR5cGU6IFRpZmZNaW1lVHlwZTsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbWltZVR5cGUgPSB0aGlzLmNvbXByZXNzaW9uO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBjb25zdCB0aWxlcyA9IHRoaXMudGlsZVNpemU7XG5cbiAgICAgICAgaWYgKHRpbGVzID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVGlmZiBpcyBub3QgdGlsZWQnKTtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcblxuICAgICAgICAvLyBUT0RPIHN1cHBvcnQgR2hvc3RPcHRpb25UaWxlT3JkZXJcbiAgICAgICAgY29uc3QgbnlUaWxlcyA9IE1hdGguY2VpbChzaXplLmhlaWdodCAvIHRpbGVzLmhlaWdodCk7XG4gICAgICAgIGNvbnN0IG54VGlsZXMgPSBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGVzLndpZHRoKTtcblxuICAgICAgICBpZiAoeCA+PSBueFRpbGVzIHx8IHkgPj0gbnlUaWxlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaWxlIGluZGV4IGlzIG91dHNpZGUgb2YgcmFuZ2UgeDoke3h9ID49ICR7bnhUaWxlc30gb3IgeToke3l9ID49ICR7bnlUaWxlc31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiBueFRpbGVzICsgeDtcbiAgICAgICAgY29uc3QgdG90YWxUaWxlcyA9IG54VGlsZXMgKiBueVRpbGVzO1xuICAgICAgICBpZiAoaWR4ID49IHRvdGFsVGlsZXMpIHRocm93IG5ldyBFcnJvcihgVGlsZSBpbmRleCBpcyBvdXRzaWRlIG9mIHRpbGUgcmFuZ2U6ICR7aWR4fSA+PSAke3RvdGFsVGlsZXN9YCk7XG5cbiAgICAgICAgY29uc3QgeyBvZmZzZXQsIGltYWdlU2l6ZSB9ID0gYXdhaXQgdGhpcy5nZXRUaWxlU2l6ZShpZHgpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhvZmZzZXQsIGltYWdlU2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG9lcyB0aGlzIHRpbGUgZXhpc3QgaW4gdGhlIHRpZmYgYW5kIGRvZXMgaXQgYWN0dWFsbHkgaGF2ZSBhIHZhbHVlXG4gICAgICpcbiAgICAgKiBTcGFyc2UgdGlmZnMgY2FuIGhhdmUgYSBsb3Qgb2YgZW1wdHkgdGlsZXMsIHRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdGlsZSBhY3R1YWxseSBoYXMgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRpbGUgeCBvZmZzZXRcbiAgICAgKiBAcGFyYW0geSBUaWxlIHkgb2Zmc2V0XG4gICAgICogQHJldHVybnMgaWYgdGhlIHRpbGUgZXhpc3RzIGFuZCBoYXMgZGF0YVxuICAgICAqL1xuICAgIGFzeW5jIGhhc1RpbGUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdGlsZXMgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuXG4gICAgICAgIGlmICh0aWxlcyA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1RpZmYgaXMgbm90IHRpbGVkJyk7XG5cbiAgICAgICAgLy8gVE9ETyBzdXBwb3J0IEdob3N0T3B0aW9uVGlsZU9yZGVyXG4gICAgICAgIGNvbnN0IG55VGlsZXMgPSBNYXRoLmNlaWwoc2l6ZS5oZWlnaHQgLyB0aWxlcy5oZWlnaHQpO1xuICAgICAgICBjb25zdCBueFRpbGVzID0gTWF0aC5jZWlsKHNpemUud2lkdGggLyB0aWxlcy53aWR0aCk7XG4gICAgICAgIGlmICh4ID49IG54VGlsZXMgfHwgeSA+PSBueVRpbGVzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiBueFRpbGVzICsgeDtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgdGhpcy5nZXRUaWxlU2l6ZShpZHgpO1xuICAgICAgICByZXR1cm4gcmV0Lm9mZnNldCA+IDA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldFRpbGVTaXplKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHsgb2Zmc2V0OiBudW1iZXI7IGltYWdlU2l6ZTogbnVtYmVyIH0+IHtcbiAgICAgICAgLy8gR0RBTCBvcHRpbWl6ZXMgdGlsZXMgYnkgc3RvcmluZyB0aGUgc2l6ZSBvZiB0aGUgdGlsZSBpblxuICAgICAgICAvLyB0aGUgZmV3IGJ5dGVzIGxlYWRpbmcgdXAgdG8gdGhlIHRpbGVcbiAgICAgICAgY29uc3QgbGVhZGVyQnl0ZXMgPSB0aGlzLnRpZi5vcHRpb25zLnRpbGVMZWFkZXJCeXRlU2l6ZTtcbiAgICAgICAgaWYgKGxlYWRlckJ5dGVzKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBhd2FpdCB0aGlzLmdldFRpbGVPZmZzZXQoaW5kZXgpO1xuICAgICAgICAgICAgLy8gU3BhcnNlIENPRyBubyBkYXRhIGZvdW5kXG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSByZXR1cm4geyBvZmZzZXQ6IDAsIGltYWdlU2l6ZTogMCB9O1xuXG4gICAgICAgICAgICAvLyBUaGlzIGZldGNoIHdpbGwgZ2VuZXJhbGx5IGxvYWQgaW4gdGhlIGJ5dGVzIG5lZWRlZCBmb3IgdGhlIGltYWdlIHRvb1xuICAgICAgICAgICAgLy8gcHJvdmlkZWQgdGhlIGltYWdlIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGEgY2h1bmtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGlmLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0IC0gbGVhZGVyQnl0ZXMsIGxlYWRlckJ5dGVzKTtcbiAgICAgICAgICAgIHJldHVybiB7IG9mZnNldCwgaW1hZ2VTaXplOiB0aGlzLnRpZi5zb3VyY2UuZ2V0VWludChvZmZzZXQgLSBsZWFkZXJCeXRlcywgbGVhZGVyQnl0ZXMpIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBieXRlQ291bnRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlRpbGVCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAoYnl0ZUNvdW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRpbGUgYnl0ZSBjb3VudHMgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbb2Zmc2V0LCBpbWFnZVNpemVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0VGlsZU9mZnNldChpbmRleCksIGJ5dGVDb3VudHMuZ2V0VmFsdWVBdChpbmRleCldKTtcbiAgICAgICAgcmV0dXJuIHsgb2Zmc2V0LCBpbWFnZVNpemUgfTtcbiAgICB9XG59XG4iXX0=
|
package/build/cog.tiff.js
CHANGED
|
@@ -26,23 +26,23 @@ export class CogTiff {
|
|
|
26
26
|
*
|
|
27
27
|
* @param loadGeoKeys Whether to also initialize the GeoKeyDirectory
|
|
28
28
|
*/
|
|
29
|
-
init(loadGeoKeys = false
|
|
29
|
+
init(loadGeoKeys = false) {
|
|
30
30
|
if (this._initPromise)
|
|
31
31
|
return this._initPromise;
|
|
32
|
-
this._initPromise = this.doInit(loadGeoKeys
|
|
32
|
+
this._initPromise = this.doInit(loadGeoKeys);
|
|
33
33
|
return this._initPromise;
|
|
34
34
|
}
|
|
35
|
-
async doInit(loadGeoKeys = false
|
|
35
|
+
async doInit(loadGeoKeys = false) {
|
|
36
36
|
if (this.isInitialized)
|
|
37
37
|
return this;
|
|
38
38
|
// Load the first few KB in, more loads will run as more data is required
|
|
39
|
-
await this.source.loadBytes(0, this.source.chunkSize
|
|
40
|
-
await this.fetchIfd(
|
|
41
|
-
await Promise.all(this.images.map((c) => c.init(loadGeoKeys
|
|
39
|
+
await this.source.loadBytes(0, this.source.chunkSize);
|
|
40
|
+
await this.fetchIfd();
|
|
41
|
+
await Promise.all(this.images.map((c) => c.init(loadGeoKeys)));
|
|
42
42
|
this.isInitialized = true;
|
|
43
43
|
return this;
|
|
44
44
|
}
|
|
45
|
-
async fetchIfd(
|
|
45
|
+
async fetchIfd() {
|
|
46
46
|
const view = this.cursor.seekTo(0);
|
|
47
47
|
const endian = view.uint16();
|
|
48
48
|
this.source.isLittleEndian = endian === TiffEndian.Little;
|
|
@@ -68,11 +68,9 @@ export class CogTiff {
|
|
|
68
68
|
}
|
|
69
69
|
const ghostSize = nextOffsetIfd - this.cursor.currentOffset;
|
|
70
70
|
// GDAL now stores metadata between the IFD inside a ghost storage area
|
|
71
|
-
if (ghostSize > 0 && ghostSize < 16 * 1024)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
return this.processIfd(nextOffsetIfd, logger);
|
|
71
|
+
if (ghostSize > 0 && ghostSize < 16 * 1024)
|
|
72
|
+
this.options.process(view.bytes(ghostSize));
|
|
73
|
+
return this.processIfd(nextOffsetIfd);
|
|
76
74
|
}
|
|
77
75
|
getImage(z) {
|
|
78
76
|
return this.images[z];
|
|
@@ -116,58 +114,25 @@ export class CogTiff {
|
|
|
116
114
|
throw new Error('Tif is not tiled');
|
|
117
115
|
return image.getTile(x, y);
|
|
118
116
|
}
|
|
119
|
-
async processIfd(offset
|
|
120
|
-
|
|
121
|
-
if (!this.source.hasBytes(offset, 4096)) {
|
|
122
|
-
await this.source.loadBytes(offset, 4096, logger);
|
|
123
|
-
}
|
|
124
|
-
const { image, nextOffset } = await this.readIfd(offset, logger);
|
|
117
|
+
async processIfd(offset) {
|
|
118
|
+
const { image, nextOffset } = await this.readIfd(offset);
|
|
125
119
|
this.images.push(image);
|
|
126
|
-
const size = image.size;
|
|
127
|
-
if (image.isTiled()) {
|
|
128
|
-
const tile = image.tileSize;
|
|
129
|
-
logger === null || logger === void 0 ? void 0 : logger.debug({
|
|
130
|
-
...size,
|
|
131
|
-
tileWidth: tile.width,
|
|
132
|
-
tileHeight: tile.height,
|
|
133
|
-
tileCount: Math.ceil(size.width / tile.width),
|
|
134
|
-
}, 'GotImage');
|
|
135
|
-
}
|
|
136
120
|
if (nextOffset)
|
|
137
|
-
await this.processIfd(nextOffset
|
|
121
|
+
await this.processIfd(nextOffset);
|
|
138
122
|
}
|
|
139
|
-
async readIfd(offset
|
|
140
|
-
if (!this.source.hasBytes(offset,
|
|
141
|
-
await this.source.loadBytes(offset,
|
|
123
|
+
async readIfd(offset) {
|
|
124
|
+
if (!this.source.hasBytes(offset, 4096))
|
|
125
|
+
await this.source.loadBytes(offset, 4096);
|
|
142
126
|
const view = this.cursor.seekTo(offset);
|
|
143
127
|
const tagCount = view.offset();
|
|
144
128
|
const byteStart = offset + this.ifdConfig.offset;
|
|
145
|
-
const logger = log === null || log === void 0 ? void 0 : log.child({ imageId: this.images.length });
|
|
146
129
|
const tags = new Map();
|
|
147
130
|
let pos = byteStart;
|
|
148
131
|
for (let i = 0; i < tagCount; i++) {
|
|
149
132
|
const tag = CogTiffTag.create(this, pos);
|
|
150
133
|
pos += tag.size;
|
|
151
|
-
if (tag.name == null)
|
|
152
|
-
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
if (!tag.isReady) {
|
|
156
|
-
logger === null || logger === void 0 ? void 0 : logger.trace({
|
|
157
|
-
offset: toHexString(pos - offset),
|
|
158
|
-
code: toHexString(tag.id),
|
|
159
|
-
tagName: tag.name,
|
|
160
|
-
ptr: toHexString(tag.valuePointer),
|
|
161
|
-
}, 'PartialReadIFD');
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
logger === null || logger === void 0 ? void 0 : logger.trace({
|
|
165
|
-
offset: toHexString(pos - offset),
|
|
166
|
-
code: toHexString(tag.id),
|
|
167
|
-
tagName: tag.name,
|
|
168
|
-
value: Array.isArray(tag.value) ? `[${tag.value.length}]` : tag.value,
|
|
169
|
-
}, 'ReadIFD');
|
|
170
|
-
}
|
|
134
|
+
if (tag.name == null)
|
|
135
|
+
throw new Error('Unknown IFD Tag: ' + toHexString(tag.id));
|
|
171
136
|
tags.set(tag.id, tag);
|
|
172
137
|
}
|
|
173
138
|
const image = new CogTiffImage(this, this.images.length, tags);
|
|
@@ -180,4 +145,4 @@ export class CogTiff {
|
|
|
180
145
|
await ((_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.close) === null || _b === void 0 ? void 0 : _b.call(_a));
|
|
181
146
|
}
|
|
182
147
|
}
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBaUIsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxNQUFNLE9BQU8sT0FBTztJQVNoQixZQUFZLE1BQW1CO1FBUC9CLFlBQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzNCLFdBQU0sR0FBbUIsRUFBRSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFHbkMsY0FBUyxHQUFrQixhQUFhLENBQUM7UUFZekMsNkJBQTZCO1FBQzdCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBVmxCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQW1CO1FBQzdCLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQU1EOzs7O09BSUc7SUFD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QUNaLENBQUM7YUFDTDtZQUVELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN6QjtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsS0FBSyxDQUFDLEtBQUs7O1FBQ1AsTUFBTSxDQUFBLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxLQUFLLGtEQUFJLENBQUEsQ0FBQztJQUNqQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaHVua1NvdXJjZSwgTG9nVHlwZSB9IGZyb20gJ0BjaHVua2QvY29yZSc7XG5pbXBvcnQgeyBDb2dUaWZmSW1hZ2UgfSBmcm9tICcuL2NvZy50aWZmLmltYWdlLmpzJztcbmltcG9ydCB7IFRpZmZFbmRpYW4gfSBmcm9tICcuL2NvbnN0L3RpZmYuZW5kaWFuLmpzJztcbmltcG9ydCB7IFRpZmZUYWcgfSBmcm9tICcuL2NvbnN0L3RpZmYudGFnLmlkLmpzJztcbmltcG9ydCB7IFRpZmZWZXJzaW9uIH0gZnJvbSAnLi9jb25zdC90aWZmLnZlcnNpb24uanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ0Jhc2UgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLmJhc2UuanMnO1xuaW1wb3J0IHsgQ29nVGlmR2hvc3RPcHRpb25zIH0gZnJvbSAnLi9yZWFkL3RpZmYuZ2RhbC5qcyc7XG5pbXBvcnQgeyBUYWdUaWZmQmlnQ29uZmlnLCBUYWdUaWZmQ29uZmlnLCBUaWZmSWZkQ29uZmlnIH0gZnJvbSAnLi9yZWFkL3RpZmYuaWZkLmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnIH0gZnJvbSAnLi9yZWFkL3RpZmYudGFnLmpzJztcbmltcG9ydCB7IENvZ1NvdXJjZUN1cnNvciB9IGZyb20gJy4vc291cmNlL2NvZy5zb3VyY2Uudmlldy5qcyc7XG5pbXBvcnQgeyB0b0hleFN0cmluZyB9IGZyb20gJy4vdXRpbC91dGlsLmhleC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2dUaWZmIHtcbiAgICBzb3VyY2U6IENodW5rU291cmNlO1xuICAgIHZlcnNpb24gPSBUaWZmVmVyc2lvbi5UaWZmO1xuICAgIGltYWdlczogQ29nVGlmZkltYWdlW10gPSBbXTtcbiAgICBvcHRpb25zID0gbmV3IENvZ1RpZkdob3N0T3B0aW9ucygpO1xuXG4gICAgcHJpdmF0ZSBjdXJzb3I6IENvZ1NvdXJjZUN1cnNvcjtcbiAgICBpZmRDb25maWc6IFRpZmZJZmRDb25maWcgPSBUYWdUaWZmQ29uZmlnO1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlOiBDaHVua1NvdXJjZSkge1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBuZXcgQ29nU291cmNlQ3Vyc29yKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBDb2dUaWZmICovXG4gICAgc3RhdGljIGNyZWF0ZShzb3VyY2U6IENodW5rU291cmNlKTogUHJvbWlzZTxDb2dUaWZmPiB7XG4gICAgICAgIHJldHVybiBuZXcgQ29nVGlmZihzb3VyY2UpLmluaXQoKTtcbiAgICB9XG5cbiAgICAvKiogSGFzIGluaXQoKSBiZWVuIGNhbGxlZCAqL1xuICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIF9pbml0UHJvbWlzZT86IFByb21pc2U8Q29nVGlmZj47XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgQ09HIGxvYWRpbmcgaW4gdGhlIGhlYWRlciBhbmQgYWxsIGltYWdlIGhlYWRlcnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2FkR2VvS2V5cyBXaGV0aGVyIHRvIGFsc28gaW5pdGlhbGl6ZSB0aGUgR2VvS2V5RGlyZWN0b3J5XG4gICAgICovXG4gICAgaW5pdChsb2FkR2VvS2V5cyA9IGZhbHNlLCBsb2dnZXI/OiBMb2dUeXBlKTogUHJvbWlzZTxDb2dUaWZmPiB7XG4gICAgICAgIGlmICh0aGlzLl9pbml0UHJvbWlzZSkgcmV0dXJuIHRoaXMuX2luaXRQcm9taXNlO1xuICAgICAgICB0aGlzLl9pbml0UHJvbWlzZSA9IHRoaXMuZG9Jbml0KGxvYWRHZW9LZXlzLCBsb2dnZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5pdFByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkb0luaXQobG9hZEdlb0tleXMgPSBmYWxzZSwgbG9nZ2VyPzogTG9nVHlwZSk6IFByb21pc2U8Q29nVGlmZj4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSByZXR1cm4gdGhpcztcbiAgICAgICAgLy8gTG9hZCB0aGUgZmlyc3QgZmV3IEtCIGluLCBtb3JlIGxvYWRzIHdpbGwgcnVuIGFzIG1vcmUgZGF0YSBpcyByZXF1aXJlZFxuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZS5sb2FkQnl0ZXMoMCwgdGhpcy5zb3VyY2UuY2h1bmtTaXplLCBsb2dnZXIpO1xuICAgICAgICBhd2FpdCB0aGlzLmZldGNoSWZkKGxvZ2dlcik7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuaW1hZ2VzLm1hcCgoYykgPT4gYy5pbml0KGxvYWRHZW9LZXlzLCBsb2dnZXIpKSk7XG5cbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmZXRjaElmZChsb2dnZXI/OiBMb2dUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmN1cnNvci5zZWVrVG8oMCk7XG4gICAgICAgIGNvbnN0IGVuZGlhbiA9IHZpZXcudWludDE2KCk7XG4gICAgICAgIHRoaXMuc291cmNlLmlzTGl0dGxlRW5kaWFuID0gZW5kaWFuID09PSBUaWZmRW5kaWFuLkxpdHRsZTtcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZS5pc0xpdHRsZUVuZGlhbikgdGhyb3cgbmV3IEVycm9yKCdPbmx5IGxpdHRsZSBlbmRpYW4gaXMgc3VwcG9ydGVkJyk7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZpZXcudWludDE2KCk7XG5cbiAgICAgICAgbGV0IG5leHRPZmZzZXRJZmQ6IG51bWJlcjtcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gVGlmZlZlcnNpb24uQmlnVGlmZikge1xuICAgICAgICAgICAgdGhpcy5pZmRDb25maWcgPSBUYWdUaWZmQmlnQ29uZmlnO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRlclNpemUgPSB2aWV3LnVpbnQxNigpO1xuICAgICAgICAgICAgaWYgKHBvaW50ZXJTaXplICE9PSA4KSB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgOGJ5dGUgcG9pbnRlcnMgYXJlIHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgY29uc3QgemVyb3MgPSB2aWV3LnVpbnQxNigpO1xuICAgICAgICAgICAgaWYgKHplcm9zICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmlnIHRpZmYgaGVhZGVyJyk7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0SWZkID0gdmlldy5wb2ludGVyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52ZXJzaW9uID09PSBUaWZmVmVyc2lvbi5UaWZmKSB7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0SWZkID0gdmlldy5wb2ludGVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgdGlmZiBzdXBwb3J0ZWQgdmVyc2lvbjoke3RoaXMudmVyc2lvbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdob3N0U2l6ZSA9IG5leHRPZmZzZXRJZmQgLSB0aGlzLmN1cnNvci5jdXJyZW50T2Zmc2V0O1xuICAgICAgICAvLyBHREFMIG5vdyBzdG9yZXMgbWV0YWRhdGEgYmV0d2VlbiB0aGUgSUZEIGluc2lkZSBhIGdob3N0IHN0b3JhZ2UgYXJlYVxuICAgICAgICBpZiAoZ2hvc3RTaXplID4gMCAmJiBnaG9zdFNpemUgPCAxNiAqIDEwMjQpIHtcbiAgICAgICAgICAgIGxvZ2dlcj8uZGVidWcoXG4gICAgICAgICAgICAgICAgeyBvZmZzZXQ6IHRvSGV4U3RyaW5nKHRoaXMuY3Vyc29yLmN1cnJlbnRPZmZzZXQpLCBsZW5ndGg6IHRvSGV4U3RyaW5nKGdob3N0U2l6ZSkgfSxcbiAgICAgICAgICAgICAgICAnR2hvc3RPcHRpb25zJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyB0aGlzLm9wdGlvbnMucHJvY2Vzcyh0aGlzLnNvdXJjZSwgdmlldy5jdXJyZW50T2Zmc2V0LCBnaG9zdFNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0lmZChuZXh0T2Zmc2V0SWZkLCBsb2dnZXIpO1xuICAgIH1cblxuICAgIGdldEltYWdlKHo6IG51bWJlcik6IENvZ1RpZmZJbWFnZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1t6XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgaW1hZ2Ugd2hpY2ggaGFzIGEgcmVzb2x1dGlvbiBzaW1pbGFyIHRvIHRoZSBwcm92aWRlZCByZXNvbHV0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzb2x1dGlvbiByZXNvbHV0aW9uIHRvIGZpbmRcbiAgICAgKi9cbiAgICBnZXRJbWFnZUJ5UmVzb2x1dGlvbihyZXNvbHV0aW9uOiBudW1iZXIpOiBDb2dUaWZmSW1hZ2Uge1xuICAgICAgICBjb25zdCBmaXJzdEltYWdlID0gdGhpcy5pbWFnZXNbMF07XG4gICAgICAgIGNvbnN0IGZpcnN0SW1hZ2VTaXplID0gZmlyc3RJbWFnZS5zaXplO1xuICAgICAgICBjb25zdCBbcmVmWF0gPSBmaXJzdEltYWdlLnJlc29sdXRpb247XG5cbiAgICAgICAgY29uc3QgcmVzb2x1dGlvbkJhc2VYID0gcmVmWCAqIGZpcnN0SW1hZ2VTaXplLndpZHRoO1xuICAgICAgICAvLyBjb25zdCByZXNvbHV0aW9uQmFzZVkgPSByZWZZICogZmlyc3RJbWFnZVNpemUuaGVpZ2h0O1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbWFnZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgaW1nID0gdGhpcy5pbWFnZXNbaV07XG4gICAgICAgICAgICBjb25zdCBpbWdTaXplID0gaW1nLnNpemU7XG5cbiAgICAgICAgICAgIGNvbnN0IGltZ1Jlc29sdXRpb25YID0gcmVzb2x1dGlvbkJhc2VYIC8gaW1nU2l6ZS53aWR0aDtcbiAgICAgICAgICAgIC8vIFRPRE8gZG8gd2UgY2FyZSBhYm91dCB5IHJlc29sdXRpb25cbiAgICAgICAgICAgIC8vIGNvbnN0IGltZ1Jlc29sdXRpb25ZID0gcmVzb2x1dGlvbkJhc2VZIC8gaW1nU2l6ZS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIGlmIChpbWdSZXNvbHV0aW9uWCAtIHJlc29sdXRpb24gPD0gMC4wMSkgcmV0dXJuIGltZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlyc3RJbWFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJhdyBieXRlcyBmb3IgYSB0aWxlIGF0IGEgZ2l2ZW4geCx5LCBpbmRleC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWF5IHJldHVybiBudWxsIGlmIHRoZSB0aWxlIGRvZXMgbm90IGV4aXN0IGVnIFNwYXJzZSBjb2dzLFxuICAgICAqXG4gICAgICogQHBhcmFtIHggdGlsZSB4IGluZGV4XG4gICAgICogQHBhcmFtIHkgdGlsZSB5IGluZGV4XG4gICAgICogQHBhcmFtIGluZGV4IGltYWdlIGluZGV4XG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGlsZSh4OiBudW1iZXIsIHk6IG51bWJlciwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBtaW1lVHlwZTogc3RyaW5nOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuZ2V0SW1hZ2UoaW5kZXgpO1xuICAgICAgICBpZiAoaW1hZ2UgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHo6ICR7aW5kZXh9YCk7XG4gICAgICAgIGlmICghaW1hZ2UuaXNUaWxlZCgpKSB0aHJvdyBuZXcgRXJyb3IoJ1RpZiBpcyBub3QgdGlsZWQnKTtcblxuICAgICAgICByZXR1cm4gaW1hZ2UuZ2V0VGlsZSh4LCB5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHByb2Nlc3NJZmQob2Zmc2V0OiBudW1iZXIsIGxvZ2dlcj86IExvZ1R5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbG9nZ2VyPy50cmFjZSh7IG9mZnNldDogdG9IZXhTdHJpbmcob2Zmc2V0KSB9LCAnTmV4dEltYWdlT2Zmc2V0Jyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZS5oYXNCeXRlcyhvZmZzZXQsIDQwOTYpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0LCA0MDk2LCBsb2dnZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBpbWFnZSwgbmV4dE9mZnNldCB9ID0gYXdhaXQgdGhpcy5yZWFkSWZkKG9mZnNldCwgbG9nZ2VyKTtcbiAgICAgICAgdGhpcy5pbWFnZXMucHVzaChpbWFnZSk7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbWFnZS5zaXplO1xuICAgICAgICBpZiAoaW1hZ2UuaXNUaWxlZCgpKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gaW1hZ2UudGlsZVNpemU7XG4gICAgICAgICAgICBsb2dnZXI/LmRlYnVnKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgdGlsZVdpZHRoOiB0aWxlLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICB0aWxlSGVpZ2h0OiB0aWxlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdGlsZUNvdW50OiBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGUud2lkdGgpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ0dvdEltYWdlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dE9mZnNldCkgYXdhaXQgdGhpcy5wcm9jZXNzSWZkKG5leHRPZmZzZXQsIGxvZ2dlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkSWZkKG9mZnNldDogbnVtYmVyLCBsb2c/OiBMb2dUeXBlKTogUHJvbWlzZTx7IG5leHRPZmZzZXQ6IG51bWJlcjsgaW1hZ2U6IENvZ1RpZmZJbWFnZSB9PiB7XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2UuaGFzQnl0ZXMob2Zmc2V0LCAxMDI0KSkgYXdhaXQgdGhpcy5zb3VyY2UubG9hZEJ5dGVzKG9mZnNldCwgdGhpcy5zb3VyY2UuY2h1bmtTaXplLCBsb2cpO1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5jdXJzb3Iuc2Vla1RvKG9mZnNldCk7XG4gICAgICAgIGNvbnN0IHRhZ0NvdW50ID0gdmlldy5vZmZzZXQoKTtcbiAgICAgICAgY29uc3QgYnl0ZVN0YXJ0ID0gb2Zmc2V0ICsgdGhpcy5pZmRDb25maWcub2Zmc2V0O1xuICAgICAgICBjb25zdCBsb2dnZXIgPSBsb2c/LmNoaWxkKHsgaW1hZ2VJZDogdGhpcy5pbWFnZXMubGVuZ3RoIH0pO1xuICAgICAgICBjb25zdCB0YWdzOiBNYXA8VGlmZlRhZywgQ29nVGlmZlRhZ0Jhc2U+ID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIGxldCBwb3MgPSBieXRlU3RhcnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdGFnID0gQ29nVGlmZlRhZy5jcmVhdGUodGhpcywgcG9zKTtcbiAgICAgICAgICAgIHBvcyArPSB0YWcuc2l6ZTtcblxuICAgICAgICAgICAgaWYgKHRhZy5uYW1lID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXI/LmVycm9yKHsgY29kZTogdG9IZXhTdHJpbmcodGFnLmlkKSB9LCBgSUZEVW5rbm93bmApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRhZy5pc1JlYWR5KSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyPy50cmFjZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0b0hleFN0cmluZyhwb3MgLSBvZmZzZXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogdG9IZXhTdHJpbmcodGFnLmlkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ05hbWU6IHRhZy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHRyOiB0b0hleFN0cmluZyh0YWcudmFsdWVQb2ludGVyKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1BhcnRpYWxSZWFkSUZEJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXI/LnRyYWNlKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRvSGV4U3RyaW5nKHBvcyAtIG9mZnNldCksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiB0b0hleFN0cmluZyh0YWcuaWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnTmFtZTogdGFnLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogQXJyYXkuaXNBcnJheSh0YWcudmFsdWUpID8gYFske3RhZy52YWx1ZS5sZW5ndGh9XWAgOiB0YWcudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdSZWFkSUZEJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0YWdzLnNldCh0YWcuaWQsIHRhZyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBDb2dUaWZmSW1hZ2UodGhpcywgdGhpcy5pbWFnZXMubGVuZ3RoLCB0YWdzKTtcbiAgICAgICAgY29uc3QgbmV4dE9mZnNldCA9IHRoaXMuc291cmNlLmdldFVpbnQocG9zLCB0aGlzLmlmZENvbmZpZy5wb2ludGVyKTtcbiAgICAgICAgcmV0dXJuIHsgbmV4dE9mZnNldCwgaW1hZ2UgfTtcbiAgICB9XG5cbiAgICAvKiogQ2xvc2UgdGhlIGZpbGUgc291cmNlIGlmIGl0IG5lZWRzIGNsb3NpbmcgKi9cbiAgICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2U/LmNsb3NlPy4oKTtcbiAgICB9XG59XG4iXX0=
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBaUIsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxNQUFNLE9BQU8sT0FBTztJQVNoQixZQUFZLE1BQW1CO1FBUC9CLFlBQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzNCLFdBQU0sR0FBbUIsRUFBRSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFHbkMsY0FBUyxHQUFrQixhQUFhLENBQUM7UUFZekMsNkJBQTZCO1FBQzdCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBVmxCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQW1CO1FBQzdCLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQU1EOzs7O09BSUc7SUFD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QUksQ0FBQztZQUVoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDekI7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELEtBQUssQ0FBQyxLQUFLOztRQUNQLE1BQU0sQ0FBQSxNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsS0FBSyxrREFBSSxDQUFBLENBQUM7SUFDakMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2h1bmtTb3VyY2UgfSBmcm9tICdAY2h1bmtkL2NvcmUnO1xuaW1wb3J0IHsgQ29nVGlmZkltYWdlIH0gZnJvbSAnLi9jb2cudGlmZi5pbWFnZS5qcyc7XG5pbXBvcnQgeyBUaWZmRW5kaWFuIH0gZnJvbSAnLi9jb25zdC90aWZmLmVuZGlhbi5qcyc7XG5pbXBvcnQgeyBUaWZmVGFnIH0gZnJvbSAnLi9jb25zdC90aWZmLnRhZy5pZC5qcyc7XG5pbXBvcnQgeyBUaWZmVmVyc2lvbiB9IGZyb20gJy4vY29uc3QvdGlmZi52ZXJzaW9uLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdCYXNlIH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5iYXNlLmpzJztcbmltcG9ydCB7IENvZ1RpZkdob3N0T3B0aW9ucyB9IGZyb20gJy4vcmVhZC90aWZmLmdkYWwuanMnO1xuaW1wb3J0IHsgVGFnVGlmZkJpZ0NvbmZpZywgVGFnVGlmZkNvbmZpZywgVGlmZklmZENvbmZpZyB9IGZyb20gJy4vcmVhZC90aWZmLmlmZC5jb25maWcuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZyB9IGZyb20gJy4vcmVhZC90aWZmLnRhZy5qcyc7XG5pbXBvcnQgeyBDb2dTb3VyY2VDdXJzb3IgfSBmcm9tICcuL3NvdXJjZS9jb2cuc291cmNlLnZpZXcuanMnO1xuaW1wb3J0IHsgdG9IZXhTdHJpbmcgfSBmcm9tICcuL3V0aWwvdXRpbC5oZXguanMnO1xuXG5leHBvcnQgY2xhc3MgQ29nVGlmZiB7XG4gICAgc291cmNlOiBDaHVua1NvdXJjZTtcbiAgICB2ZXJzaW9uID0gVGlmZlZlcnNpb24uVGlmZjtcbiAgICBpbWFnZXM6IENvZ1RpZmZJbWFnZVtdID0gW107XG4gICAgb3B0aW9ucyA9IG5ldyBDb2dUaWZHaG9zdE9wdGlvbnMoKTtcblxuICAgIHByaXZhdGUgY3Vyc29yOiBDb2dTb3VyY2VDdXJzb3I7XG4gICAgaWZkQ29uZmlnOiBUaWZmSWZkQ29uZmlnID0gVGFnVGlmZkNvbmZpZztcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZTogQ2h1bmtTb3VyY2UpIHtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gbmV3IENvZ1NvdXJjZUN1cnNvcih0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgQ29nVGlmZiAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc291cmNlOiBDaHVua1NvdXJjZSk6IFByb21pc2U8Q29nVGlmZj4ge1xuICAgICAgICByZXR1cm4gbmV3IENvZ1RpZmYoc291cmNlKS5pbml0KCk7XG4gICAgfVxuXG4gICAgLyoqIEhhcyBpbml0KCkgYmVlbiBjYWxsZWQgKi9cbiAgICBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICBfaW5pdFByb21pc2U/OiBQcm9taXNlPENvZ1RpZmY+O1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIENPRyBsb2FkaW5nIGluIHRoZSBoZWFkZXIgYW5kIGFsbCBpbWFnZSBoZWFkZXJzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9hZEdlb0tleXMgV2hldGhlciB0byBhbHNvIGluaXRpYWxpemUgdGhlIEdlb0tleURpcmVjdG9yeVxuICAgICAqL1xuICAgIGluaXQobG9hZEdlb0tleXMgPSBmYWxzZSk6IFByb21pc2U8Q29nVGlmZj4ge1xuICAgICAgICBpZiAodGhpcy5faW5pdFByb21pc2UpIHJldHVybiB0aGlzLl9pbml0UHJvbWlzZTtcbiAgICAgICAgdGhpcy5faW5pdFByb21pc2UgPSB0aGlzLmRvSW5pdChsb2FkR2VvS2V5cyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbml0UHJvbWlzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRvSW5pdChsb2FkR2VvS2V5cyA9IGZhbHNlKTogUHJvbWlzZTxDb2dUaWZmPiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHJldHVybiB0aGlzO1xuICAgICAgICAvLyBMb2FkIHRoZSBmaXJzdCBmZXcgS0IgaW4sIG1vcmUgbG9hZHMgd2lsbCBydW4gYXMgbW9yZSBkYXRhIGlzIHJlcXVpcmVkXG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlLmxvYWRCeXRlcygwLCB0aGlzLnNvdXJjZS5jaHVua1NpemUpO1xuICAgICAgICBhd2FpdCB0aGlzLmZldGNoSWZkKCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuaW1hZ2VzLm1hcCgoYykgPT4gYy5pbml0KGxvYWRHZW9LZXlzKSkpO1xuXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hJZmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmN1cnNvci5zZWVrVG8oMCk7XG4gICAgICAgIGNvbnN0IGVuZGlhbiA9IHZpZXcudWludDE2KCk7XG4gICAgICAgIHRoaXMuc291cmNlLmlzTGl0dGxlRW5kaWFuID0gZW5kaWFuID09PSBUaWZmRW5kaWFuLkxpdHRsZTtcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZS5pc0xpdHRsZUVuZGlhbikgdGhyb3cgbmV3IEVycm9yKCdPbmx5IGxpdHRsZSBlbmRpYW4gaXMgc3VwcG9ydGVkJyk7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZpZXcudWludDE2KCk7XG5cbiAgICAgICAgbGV0IG5leHRPZmZzZXRJZmQ6IG51bWJlcjtcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gVGlmZlZlcnNpb24uQmlnVGlmZikge1xuICAgICAgICAgICAgdGhpcy5pZmRDb25maWcgPSBUYWdUaWZmQmlnQ29uZmlnO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRlclNpemUgPSB2aWV3LnVpbnQxNigpO1xuICAgICAgICAgICAgaWYgKHBvaW50ZXJTaXplICE9PSA4KSB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgOGJ5dGUgcG9pbnRlcnMgYXJlIHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgY29uc3QgemVyb3MgPSB2aWV3LnVpbnQxNigpO1xuICAgICAgICAgICAgaWYgKHplcm9zICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmlnIHRpZmYgaGVhZGVyJyk7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0SWZkID0gdmlldy5wb2ludGVyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52ZXJzaW9uID09PSBUaWZmVmVyc2lvbi5UaWZmKSB7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0SWZkID0gdmlldy5wb2ludGVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgdGlmZiBzdXBwb3J0ZWQgdmVyc2lvbjoke3RoaXMudmVyc2lvbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdob3N0U2l6ZSA9IG5leHRPZmZzZXRJZmQgLSB0aGlzLmN1cnNvci5jdXJyZW50T2Zmc2V0O1xuICAgICAgICAvLyBHREFMIG5vdyBzdG9yZXMgbWV0YWRhdGEgYmV0d2VlbiB0aGUgSUZEIGluc2lkZSBhIGdob3N0IHN0b3JhZ2UgYXJlYVxuICAgICAgICBpZiAoZ2hvc3RTaXplID4gMCAmJiBnaG9zdFNpemUgPCAxNiAqIDEwMjQpIHRoaXMub3B0aW9ucy5wcm9jZXNzKHZpZXcuYnl0ZXMoZ2hvc3RTaXplKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0lmZChuZXh0T2Zmc2V0SWZkKTtcbiAgICB9XG5cbiAgICBnZXRJbWFnZSh6OiBudW1iZXIpOiBDb2dUaWZmSW1hZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbel07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIGltYWdlIHdoaWNoIGhhcyBhIHJlc29sdXRpb24gc2ltaWxhciB0byB0aGUgcHJvdmlkZWQgcmVzb2x1dGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc29sdXRpb24gcmVzb2x1dGlvbiB0byBmaW5kXG4gICAgICovXG4gICAgZ2V0SW1hZ2VCeVJlc29sdXRpb24ocmVzb2x1dGlvbjogbnVtYmVyKTogQ29nVGlmZkltYWdlIHtcbiAgICAgICAgY29uc3QgZmlyc3RJbWFnZSA9IHRoaXMuaW1hZ2VzWzBdO1xuICAgICAgICBjb25zdCBmaXJzdEltYWdlU2l6ZSA9IGZpcnN0SW1hZ2Uuc2l6ZTtcbiAgICAgICAgY29uc3QgW3JlZlhdID0gZmlyc3RJbWFnZS5yZXNvbHV0aW9uO1xuXG4gICAgICAgIGNvbnN0IHJlc29sdXRpb25CYXNlWCA9IHJlZlggKiBmaXJzdEltYWdlU2l6ZS53aWR0aDtcbiAgICAgICAgLy8gY29uc3QgcmVzb2x1dGlvbkJhc2VZID0gcmVmWSAqIGZpcnN0SW1hZ2VTaXplLmhlaWdodDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW1hZ2VzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGltZyA9IHRoaXMuaW1hZ2VzW2ldO1xuICAgICAgICAgICAgY29uc3QgaW1nU2l6ZSA9IGltZy5zaXplO1xuXG4gICAgICAgICAgICBjb25zdCBpbWdSZXNvbHV0aW9uWCA9IHJlc29sdXRpb25CYXNlWCAvIGltZ1NpemUud2lkdGg7XG4gICAgICAgICAgICAvLyBUT0RPIGRvIHdlIGNhcmUgYWJvdXQgeSByZXNvbHV0aW9uXG4gICAgICAgICAgICAvLyBjb25zdCBpbWdSZXNvbHV0aW9uWSA9IHJlc29sdXRpb25CYXNlWSAvIGltZ1NpemUuaGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAoaW1nUmVzb2x1dGlvblggLSByZXNvbHV0aW9uIDw9IDAuMDEpIHJldHVybiBpbWc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpcnN0SW1hZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByYXcgYnl0ZXMgZm9yIGEgdGlsZSBhdCBhIGdpdmVuIHgseSwgaW5kZXguXG4gICAgICpcbiAgICAgKiBUaGlzIG1heSByZXR1cm4gbnVsbCBpZiB0aGUgdGlsZSBkb2VzIG5vdCBleGlzdCBlZyBTcGFyc2UgY29ncyxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IHRpbGUgeCBpbmRleFxuICAgICAqIEBwYXJhbSB5IHRpbGUgeSBpbmRleFxuICAgICAqIEBwYXJhbSBpbmRleCBpbWFnZSBpbmRleFxuICAgICAqL1xuICAgIGFzeW5jIGdldFRpbGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHsgbWltZVR5cGU6IHN0cmluZzsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmdldEltYWdlKGluZGV4KTtcbiAgICAgICAgaWYgKGltYWdlID09IG51bGwpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB6OiAke2luZGV4fWApO1xuICAgICAgICBpZiAoIWltYWdlLmlzVGlsZWQoKSkgdGhyb3cgbmV3IEVycm9yKCdUaWYgaXMgbm90IHRpbGVkJyk7XG5cbiAgICAgICAgcmV0dXJuIGltYWdlLmdldFRpbGUoeCwgeSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzSWZkKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgaW1hZ2UsIG5leHRPZmZzZXQgfSA9IGF3YWl0IHRoaXMucmVhZElmZChvZmZzZXQpO1xuICAgICAgICB0aGlzLmltYWdlcy5wdXNoKGltYWdlKTtcblxuICAgICAgICBpZiAobmV4dE9mZnNldCkgYXdhaXQgdGhpcy5wcm9jZXNzSWZkKG5leHRPZmZzZXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVhZElmZChvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8eyBuZXh0T2Zmc2V0OiBudW1iZXI7IGltYWdlOiBDb2dUaWZmSW1hZ2UgfT4ge1xuICAgICAgICBpZiAoIXRoaXMuc291cmNlLmhhc0J5dGVzKG9mZnNldCwgNDA5NikpIGF3YWl0IHRoaXMuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIDQwOTYpO1xuXG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmN1cnNvci5zZWVrVG8ob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgdGFnQ291bnQgPSB2aWV3Lm9mZnNldCgpO1xuICAgICAgICBjb25zdCBieXRlU3RhcnQgPSBvZmZzZXQgKyB0aGlzLmlmZENvbmZpZy5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IHRhZ3M6IE1hcDxUaWZmVGFnLCBDb2dUaWZmVGFnQmFzZT4gPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgbGV0IHBvcyA9IGJ5dGVTdGFydDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSBDb2dUaWZmVGFnLmNyZWF0ZSh0aGlzLCBwb3MpO1xuICAgICAgICAgICAgcG9zICs9IHRhZy5zaXplO1xuXG4gICAgICAgICAgICBpZiAodGFnLm5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIElGRCBUYWc6ICcgKyB0b0hleFN0cmluZyh0YWcuaWQpKTtcbiAgICAgICAgICAgIHRhZ3Muc2V0KHRhZy5pZCwgdGFnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IENvZ1RpZmZJbWFnZSh0aGlzLCB0aGlzLmltYWdlcy5sZW5ndGgsIHRhZ3MpO1xuICAgICAgICBjb25zdCBuZXh0T2Zmc2V0ID0gdGhpcy5zb3VyY2UuZ2V0VWludChwb3MsIHRoaXMuaWZkQ29uZmlnLnBvaW50ZXIpO1xuICAgICAgICByZXR1cm4geyBuZXh0T2Zmc2V0LCBpbWFnZSB9O1xuICAgIH1cblxuICAgIC8qKiBDbG9zZSB0aGUgZmlsZSBzb3VyY2UgaWYgaXQgbmVlZHMgY2xvc2luZyAqL1xuICAgIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZT8uY2xvc2U/LigpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -5,9 +5,13 @@ export declare enum TiffMimeType {
|
|
|
5
5
|
NONE = "application/octet-stream",
|
|
6
6
|
JPEG = "image/jpeg",
|
|
7
7
|
JP2 = "image/jp2",
|
|
8
|
+
JPEGXL = "image/jpegxl",
|
|
8
9
|
WEBP = "image/webp",
|
|
10
|
+
ZSTD = "application/zstd",
|
|
9
11
|
LZW = "application/lzw",
|
|
10
|
-
DEFLATE = "application/deflate"
|
|
12
|
+
DEFLATE = "application/deflate",
|
|
13
|
+
LZERC = "application/lerc",
|
|
14
|
+
LZMA = "application/x-lzma"
|
|
11
15
|
}
|
|
12
16
|
export declare const TiffCompression: {
|
|
13
17
|
[key: number]: TiffMimeType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tiff.mime.d.ts","sourceRoot":"","sources":["../../src/const/tiff.mime.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,YAAY;IACpB,IAAI,6BAA6B;IACjC,IAAI,eAAe;IACnB,GAAG,cAAc;IACjB,IAAI,eAAe;IACnB,GAAG,oBAAoB;IACvB,OAAO,wBAAwB;
|
|
1
|
+
{"version":3,"file":"tiff.mime.d.ts","sourceRoot":"","sources":["../../src/const/tiff.mime.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,YAAY;IACpB,IAAI,6BAA6B;IACjC,IAAI,eAAe;IACnB,GAAG,cAAc;IACjB,MAAM,iBAAiB;IACvB,IAAI,eAAe;IACnB,IAAI,qBAAqB;IACzB,GAAG,oBAAoB;IACvB,OAAO,wBAAwB;IAC/B,KAAK,qBAAqB;IAC1B,IAAI,uBAAuB;CAC9B;AAED,eAAO,MAAM,eAAe,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAY1D,CAAC"}
|
package/build/const/tiff.mime.js
CHANGED
|
@@ -6,9 +6,13 @@ export var TiffMimeType;
|
|
|
6
6
|
TiffMimeType["NONE"] = "application/octet-stream";
|
|
7
7
|
TiffMimeType["JPEG"] = "image/jpeg";
|
|
8
8
|
TiffMimeType["JP2"] = "image/jp2";
|
|
9
|
+
TiffMimeType["JPEGXL"] = "image/jpegxl";
|
|
9
10
|
TiffMimeType["WEBP"] = "image/webp";
|
|
11
|
+
TiffMimeType["ZSTD"] = "application/zstd";
|
|
10
12
|
TiffMimeType["LZW"] = "application/lzw";
|
|
11
13
|
TiffMimeType["DEFLATE"] = "application/deflate";
|
|
14
|
+
TiffMimeType["LZERC"] = "application/lerc";
|
|
15
|
+
TiffMimeType["LZMA"] = "application/x-lzma";
|
|
12
16
|
})(TiffMimeType || (TiffMimeType = {}));
|
|
13
17
|
export const TiffCompression = {
|
|
14
18
|
1: TiffMimeType.NONE,
|
|
@@ -16,7 +20,11 @@ export const TiffCompression = {
|
|
|
16
20
|
6: TiffMimeType.JPEG,
|
|
17
21
|
7: TiffMimeType.JPEG,
|
|
18
22
|
8: TiffMimeType.DEFLATE,
|
|
23
|
+
34887: TiffMimeType.LZERC,
|
|
24
|
+
34925: TiffMimeType.LZMA,
|
|
19
25
|
34712: TiffMimeType.JP2,
|
|
26
|
+
50000: TiffMimeType.ZSTD,
|
|
20
27
|
50001: TiffMimeType.WEBP,
|
|
28
|
+
50002: TiffMimeType.JPEGXL,
|
|
21
29
|
};
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlmZi5taW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0L3RpZmYubWltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFlBV1g7QUFYRCxXQUFZLFlBQVk7SUFDcEIsaURBQWlDLENBQUE7SUFDakMsbUNBQW1CLENBQUE7SUFDbkIsaUNBQWlCLENBQUE7SUFDakIsdUNBQXVCLENBQUE7SUFDdkIsbUNBQW1CLENBQUE7SUFDbkIseUNBQXlCLENBQUE7SUFDekIsdUNBQXVCLENBQUE7SUFDdkIsK0NBQStCLENBQUE7SUFDL0IsMENBQTBCLENBQUE7SUFDMUIsMkNBQTJCLENBQUE7QUFDL0IsQ0FBQyxFQVhXLFlBQVksS0FBWixZQUFZLFFBV3ZCO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFvQztJQUM1RCxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUk7SUFDcEIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHO0lBQ25CLENBQUMsRUFBRSxZQUFZLENBQUMsSUFBSTtJQUNwQixDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUk7SUFDcEIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxPQUFPO0lBQ3ZCLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSztJQUN6QixLQUFLLEVBQUUsWUFBWSxDQUFDLElBQUk7SUFDeEIsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHO0lBQ3ZCLEtBQUssRUFBRSxZQUFZLENBQUMsSUFBSTtJQUN4QixLQUFLLEVBQUUsWUFBWSxDQUFDLElBQUk7SUFDeEIsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNO0NBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1pbWVUeXBlIGNvbnZlcnNpb24gZm9yIGNvbW1vbiB0aWYgaW1hZ2UgdHlwZXNcbiAqL1xuZXhwb3J0IGVudW0gVGlmZk1pbWVUeXBlIHtcbiAgICBOT05FID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsXG4gICAgSlBFRyA9ICdpbWFnZS9qcGVnJyxcbiAgICBKUDIgPSAnaW1hZ2UvanAyJyxcbiAgICBKUEVHWEwgPSAnaW1hZ2UvanBlZ3hsJyxcbiAgICBXRUJQID0gJ2ltYWdlL3dlYnAnLFxuICAgIFpTVEQgPSAnYXBwbGljYXRpb24venN0ZCcsXG4gICAgTFpXID0gJ2FwcGxpY2F0aW9uL2x6dycsXG4gICAgREVGTEFURSA9ICdhcHBsaWNhdGlvbi9kZWZsYXRlJyxcbiAgICBMWkVSQyA9ICdhcHBsaWNhdGlvbi9sZXJjJyxcbiAgICBMWk1BID0gJ2FwcGxpY2F0aW9uL3gtbHptYScsXG59XG5cbmV4cG9ydCBjb25zdCBUaWZmQ29tcHJlc3Npb246IHsgW2tleTogbnVtYmVyXTogVGlmZk1pbWVUeXBlIH0gPSB7XG4gICAgMTogVGlmZk1pbWVUeXBlLk5PTkUsXG4gICAgNTogVGlmZk1pbWVUeXBlLkxaVyxcbiAgICA2OiBUaWZmTWltZVR5cGUuSlBFRyxcbiAgICA3OiBUaWZmTWltZVR5cGUuSlBFRyxcbiAgICA4OiBUaWZmTWltZVR5cGUuREVGTEFURSxcbiAgICAzNDg4NzogVGlmZk1pbWVUeXBlLkxaRVJDLFxuICAgIDM0OTI1OiBUaWZmTWltZVR5cGUuTFpNQSxcbiAgICAzNDcxMjogVGlmZk1pbWVUeXBlLkpQMixcbiAgICA1MDAwMDogVGlmZk1pbWVUeXBlLlpTVEQsXG4gICAgNTAwMDE6IFRpZmZNaW1lVHlwZS5XRUJQLFxuICAgIDUwMDAyOiBUaWZmTWltZVR5cGUuSlBFR1hMLFxufTtcbiJdfQ==
|