@umbraco/headless-client
Version:
Node.js client library for the Umbraco Headless APIs
273 lines • 24.2 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MediaManagementClient = void 0;
var Endpoints_1 = require("../../Endpoints");
/**
* MediaManagementClient is used to access the Media part of the Content Management API.
* @public
*
* @example
* The {@link MediaManagementClient} must be accessed through {@link Client}.
*
* ```typescript
* import { Client } from '@umbraco/headless-client'
*
* const client = new Client({
* projectAlias: '<your-project-alias>',
* apiKey: '<your-api-key>',
* language: '<iso-code>',
* })
*
* const mediaClient = client.management.media
* ```
*/
var MediaManagementClient = /** @class */ (function () {
/**
* @internal
*/
function MediaManagementClient(client) {
var _this = this;
this.client = client;
this.makeRequest = function (endpoint, data) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, this.client.makeRequest(endpoint, data)];
});
}); };
}
/**
* Fetch all media at the root of the tree, which the authorized user has access to according to the 'Start node'-permissions.
* @returns a `Promise` that resolves to an array of {@link ContentManagementMedia}.
*/
MediaManagementClient.prototype.root = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, this.makeRequest(Endpoints_1.Endpoints.management.media.root())];
});
});
};
/**
* Fetch a single media item by its id.
* @param id - GUID id of the Media item
* @returns a `Promise` that resolves to a {@link ContentManagementMedia} if found, otherwise `undefined`.
*/
MediaManagementClient.prototype.byId = function (id) {
return __awaiter(this, void 0, void 0, function () {
var err_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, this.makeRequest(Endpoints_1.Endpoints.management.media.byId(id))];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_1 = _a.sent();
if (err_1.response && err_1.response.status === 404) {
return [2 /*return*/, undefined];
}
throw err_1;
case 3: return [2 /*return*/];
}
});
});
};
/**
* Fetch all children of a Media item.
* @param id - GUID id of the Media item
* @param options - Request options. See {@link APIMediaChildrenOptions}.
* @returns a `Promise` that resolves to a {@link PagedResponse} of {@link ContentManagementMedia} if found, otherwise `undefined`.
*/
MediaManagementClient.prototype.children = function (id, options) {
return __awaiter(this, void 0, void 0, function () {
var err_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, this.makeRequest(Endpoints_1.Endpoints.management.media.children(id, options))];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_2 = _a.sent();
if (err_2.response && err_2.response.status === 404) {
return [2 /*return*/, undefined];
}
throw err_2;
case 3: return [2 /*return*/];
}
});
});
};
/**
* Create a new Media item.
* @param body - The Media to create. See {@link ContentManagementMediaRequest}.
* @returns a `Promise` that resolves to the newly created {@link ContentManagementMedia}.
*
* @example
* ```typescript
* const media = await client.management.media.create({
* name: '<name>',
* mediaTypeAlias: '<media-type-alias>',
* parentId: '<parentId|undefined>',
* })
* ```
*
* If the Media Type includes an `Upload` or an `Image Cropper` property and you want to upload a file you need to pass a `FormData` object to the function instead,
*
* ```typescript
* import FormData from `form-data`
* import fs from 'fs'
* import path from 'path'
*
* const data = new FormData()
*
* data.append(JSON.stringify({
* name: '<name>',
* mediaTypeAlias: '<media-type-alias>',
* parentId: '<parentId|undefined>',
* // if myFile is of type `Upload`
* myFile: 'my-file.txt',
* // if myImage is of type `Image Cropper`
* myImage: { src: 'my-image.jpg', },
* }))
*
* data.append('myFile', fs.createReadStream(path.join(__dirname, 'my-file.txt')))
* data.append('myImage', fs.createReadStream(path.join(__dirname, 'my-image.txt')))
*
* const media = await client.management.media.create(data)
* ```
*
* See {@link https://our.umbraco.com/documentation/Umbraco-Heartcore/API-Documentation/Content-Management/media/#create-content} for more info on the structure of the document.
*/
MediaManagementClient.prototype.create = function (body) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, this.makeRequest(Endpoints_1.Endpoints.management.media.create(), body)];
});
});
};
/**
* Update a Media item.
* @param id - GUID id of the Content item.
* @param body - Media to update. See {@link ContentManagementMediaRequest}.
* @returns a `Promise` that resolves to a {@link ContentManagementMedia} of the updated Media item if found, otherwise `undefined`.
*
* @example
* ```typescript
* const media = await client.management.media.update('<media-id>', {
* name: '<name>',
* mediaTypeAlias: '<media-type-alias>',
* parentId: '<parentId|undefined>',
* })
* ```
*
* If the Media Type includes an `Upload` or an `Image Cropper` property and you want to upload a file you need to pass a `FormData` object to the function instead,
*
* ```typescript
* import FormData from `form-data`
* import fs from 'fs'
* import path from 'path'
*
* const data = new FormData()
*
* data.append(JSON.stringify({
* name: '<name>',
* mediaTypeAlias: '<media-type-alias>',
* parentId: '<parentId|undefined>',
* // if myFile is of type `Upload`
* myFile: 'my-file.txt',
* // if myImage is of type `Image Cropper`
* myImage: { src: 'my-image.jpg', },
* }))
*
* data.append('myFile', fs.createReadStream(path.join(__dirname, 'my-file.txt')))
* data.append('myImage', fs.createReadStream(path.join(__dirname, 'my-image.txt')))
*
* const media = await client.management.media.update('<media-id>', data)
* ```
*
* See {@link https://our.umbraco.com/documentation/Umbraco-Heartcore/API-Documentation/Content-Management/media/#update-media} for more info on the structure of the document.
*/
MediaManagementClient.prototype.update = function (id, body) {
return __awaiter(this, void 0, void 0, function () {
var err_3;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, this.makeRequest(Endpoints_1.Endpoints.management.media.update(id), body)];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_3 = _a.sent();
if (err_3.response && err_3.response.status === 404) {
return [2 /*return*/, undefined];
}
throw err_3;
case 3: return [2 /*return*/];
}
});
});
};
/**
* Delete a Media item.
* @param id - GUID id of the Media item.
* @returns a `Prommise` that resolves to a {@link ContentManagementMedia} of the deleted Media item if found', otherwise `undefined`.
*/
MediaManagementClient.prototype.delete = function (id) {
return __awaiter(this, void 0, void 0, function () {
var err_4;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, this.makeRequest(Endpoints_1.Endpoints.management.media.delete(id))];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_4 = _a.sent();
if (err_4.response && err_4.response.status === 404) {
return [2 /*return*/, undefined];
}
throw err_4;
case 3: return [2 /*return*/];
}
});
});
};
return MediaManagementClient;
}());
exports.MediaManagementClient = MediaManagementClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVkaWFNYW5hZ2VtZW50Q2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0NsaWVudHMvTWFuYWdlbWVudC9NZWRpYU1hbmFnZW1lbnRDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBS0EsNkNBQTJDO0FBRzNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSDtJQUNFOztPQUVHO0lBQ0gsK0JBQ21CLE1BQWM7UUFEakMsaUJBR0M7UUFGa0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUloQixnQkFBVyxHQUFHLFVBQVUsUUFBcUIsRUFBRSxJQUFVOztnQkFDeEUsc0JBQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFBOzthQUMvQyxDQUFBO0lBSkQsQ0FBQztJQU1EOzs7T0FHRztJQUNHLG9DQUFJLEdBQVY7OztnQkFDRSxzQkFBTyxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUssQ0FBQyxFQUFBOzs7S0FDOUQ7SUFFRDs7OztPQUlHO0lBQ0csb0NBQUksR0FBVixVQUE4QyxFQUFVOzs7Ozs7O3dCQUU3QyxxQkFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUksRUFBRSxDQUFDLENBQUMsRUFBQTs0QkFBckUsc0JBQU8sU0FBOEQsRUFBQTs7O3dCQUVyRSxJQUFJLEtBQUcsQ0FBQyxRQUFRLElBQUksS0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFOzRCQUMvQyxzQkFBTyxTQUFTLEVBQUE7eUJBQ2pCO3dCQUVELE1BQU0sS0FBRyxDQUFBOzs7OztLQUVaO0lBRUQ7Ozs7O09BS0c7SUFDRyx3Q0FBUSxHQUFkLFVBQWtELEVBQVUsRUFBRSxPQUFpQzs7Ozs7Ozt3QkFFcEYscUJBQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFBOzRCQUFsRixzQkFBTyxTQUEyRSxFQUFBOzs7d0JBRWxGLElBQUksS0FBRyxDQUFDLFFBQVEsSUFBSSxLQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7NEJBQy9DLHNCQUFPLFNBQVMsRUFBQTt5QkFDakI7d0JBRUQsTUFBTSxLQUFHLENBQUE7Ozs7O0tBRVo7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXdDRztJQUNHLHNDQUFNLEdBQVosVUFBaUQsSUFBOEM7OztnQkFDN0Ysc0JBQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUE7OztLQUNuRTtJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlDRztJQUNHLHNDQUFNLEdBQVosVUFBaUQsRUFBVSxFQUFFLElBQThDOzs7Ozs7O3dCQUVoRyxxQkFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUE7NEJBQTFFLHNCQUFPLFNBQW1FLEVBQUE7Ozt3QkFFMUUsSUFBSSxLQUFHLENBQUMsUUFBUSxJQUFJLEtBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTs0QkFDL0Msc0JBQU8sU0FBUyxFQUFBO3lCQUNqQjt3QkFFRCxNQUFNLEtBQUcsQ0FBQTs7Ozs7S0FFWjtJQUVEOzs7O09BSUc7SUFDRyxzQ0FBTSxHQUFaLFVBQWlELEVBQVU7Ozs7Ozs7d0JBRWhELHFCQUFNLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFBOzRCQUFwRSxzQkFBTyxTQUE2RCxFQUFBOzs7d0JBRXBFLElBQUksS0FBRyxDQUFDLFFBQVEsSUFBSSxLQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7NEJBQy9DLHNCQUFPLFNBQVMsRUFBQTt5QkFDakI7d0JBRUQsTUFBTSxLQUFHLENBQUE7Ozs7O0tBRVo7SUFDSCw0QkFBQztBQUFELENBQUMsQUEzS0QsSUEyS0M7QUEzS1ksc0RBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSdcblxuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vQ2xpZW50J1xuaW1wb3J0IHsgUGFnZWRSZXNwb25zZSwgQ29udGVudE1hbmFnZW1lbnRNZWRpYSwgQ29udGVudE1hbmFnZW1lbnRNZWRpYVJlcXVlc3QgfSBmcm9tICcuLi8uLi9SZXNwb25zZXMnXG5pbXBvcnQgeyBFbmRwb2ludCB9IGZyb20gJy4uLy4uL0VuZHBvaW50J1xuaW1wb3J0IHsgRW5kcG9pbnRzIH0gZnJvbSAnLi4vLi4vRW5kcG9pbnRzJ1xuaW1wb3J0IHsgQVBJTWVkaWFDaGlsZHJlbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9SZXF1ZXN0T3B0aW9ucydcblxuLyoqXG4gKiBNZWRpYU1hbmFnZW1lbnRDbGllbnQgaXMgdXNlZCB0byBhY2Nlc3MgdGhlIE1lZGlhIHBhcnQgb2YgdGhlIENvbnRlbnQgTWFuYWdlbWVudCBBUEkuXG4gKiBAcHVibGljXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoZSB7QGxpbmsgTWVkaWFNYW5hZ2VtZW50Q2xpZW50fSBtdXN0IGJlIGFjY2Vzc2VkIHRocm91Z2gge0BsaW5rIENsaWVudH0uXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnQHVtYnJhY28vaGVhZGxlc3MtY2xpZW50J1xuICpcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoe1xuICogIHByb2plY3RBbGlhczogJzx5b3VyLXByb2plY3QtYWxpYXM+JyxcbiAqICBhcGlLZXk6ICc8eW91ci1hcGkta2V5PicsXG4gKiAgbGFuZ3VhZ2U6ICc8aXNvLWNvZGU+JyxcbiAqIH0pXG4gKlxuICogY29uc3QgbWVkaWFDbGllbnQgPSBjbGllbnQubWFuYWdlbWVudC5tZWRpYVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBNZWRpYU1hbmFnZW1lbnRDbGllbnQge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IENsaWVudFxuICApIHtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFrZVJlcXVlc3QgPSBhc3luYyA8VD4oZW5kcG9pbnQ6IEVuZHBvaW50PFQ+LCBkYXRhPzogYW55KSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Lm1ha2VSZXF1ZXN0KGVuZHBvaW50LCBkYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGFsbCBtZWRpYSBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZSwgd2hpY2ggdGhlIGF1dGhvcml6ZWQgdXNlciBoYXMgYWNjZXNzIHRvIGFjY29yZGluZyB0byB0aGUgJ1N0YXJ0IG5vZGUnLXBlcm1pc3Npb25zLlxuICAgKiBAcmV0dXJucyBhIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHtAbGluayBDb250ZW50TWFuYWdlbWVudE1lZGlhfS5cbiAgICovXG4gIGFzeW5jIHJvb3Q8VCBleHRlbmRzIENvbnRlbnRNYW5hZ2VtZW50TWVkaWE+ICgpIHtcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChFbmRwb2ludHMubWFuYWdlbWVudC5tZWRpYS5yb290PFQ+KCkpXG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBzaW5nbGUgbWVkaWEgaXRlbSBieSBpdHMgaWQuXG4gICAqIEBwYXJhbSBpZCAtIEdVSUQgaWQgb2YgdGhlIE1lZGlhIGl0ZW1cbiAgICogQHJldHVybnMgYSBgUHJvbWlzZWAgdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBDb250ZW50TWFuYWdlbWVudE1lZGlhfSBpZiBmb3VuZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgYXN5bmMgYnlJZDxUIGV4dGVuZHMgQ29udGVudE1hbmFnZW1lbnRNZWRpYT4gKGlkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFrZVJlcXVlc3QoRW5kcG9pbnRzLm1hbmFnZW1lbnQubWVkaWEuYnlJZDxUPihpZCkpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnJlc3BvbnNlICYmIGVyci5yZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbGwgY2hpbGRyZW4gb2YgYSBNZWRpYSBpdGVtLlxuICAgKiBAcGFyYW0gaWQgLSBHVUlEIGlkIG9mIHRoZSBNZWRpYSBpdGVtXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUmVxdWVzdCBvcHRpb25zLiBTZWUge0BsaW5rIEFQSU1lZGlhQ2hpbGRyZW5PcHRpb25zfS5cbiAgICogQHJldHVybnMgYSBgUHJvbWlzZWAgdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBQYWdlZFJlc3BvbnNlfSBvZiB7QGxpbmsgQ29udGVudE1hbmFnZW1lbnRNZWRpYX0gaWYgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGFzeW5jIGNoaWxkcmVuPFQgZXh0ZW5kcyBDb250ZW50TWFuYWdlbWVudE1lZGlhPiAoaWQ6IHN0cmluZywgb3B0aW9ucz86IEFQSU1lZGlhQ2hpbGRyZW5PcHRpb25zKTogUHJvbWlzZTxQYWdlZFJlc3BvbnNlPFQ+IHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0KEVuZHBvaW50cy5tYW5hZ2VtZW50Lm1lZGlhLmNoaWxkcmVuPFQ+KGlkLCBvcHRpb25zKSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIucmVzcG9uc2UgJiYgZXJyLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBNZWRpYSBpdGVtLlxuICAgKiBAcGFyYW0gYm9keSAtIFRoZSBNZWRpYSB0byBjcmVhdGUuIFNlZSB7QGxpbmsgQ29udGVudE1hbmFnZW1lbnRNZWRpYVJlcXVlc3R9LlxuICAgKiBAcmV0dXJucyBhIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXdseSBjcmVhdGVkIHtAbGluayBDb250ZW50TWFuYWdlbWVudE1lZGlhfS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBtZWRpYSA9IGF3YWl0IGNsaWVudC5tYW5hZ2VtZW50Lm1lZGlhLmNyZWF0ZSh7XG4gICAqICBuYW1lOiAnPG5hbWU+JyxcbiAgICogIG1lZGlhVHlwZUFsaWFzOiAnPG1lZGlhLXR5cGUtYWxpYXM+JyxcbiAgICogIHBhcmVudElkOiAnPHBhcmVudElkfHVuZGVmaW5lZD4nLFxuICAgKiB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogSWYgdGhlIE1lZGlhIFR5cGUgaW5jbHVkZXMgYW4gYFVwbG9hZGAgb3IgYW4gYEltYWdlIENyb3BwZXJgIHByb3BlcnR5IGFuZCB5b3Ugd2FudCB0byB1cGxvYWQgYSBmaWxlIHlvdSBuZWVkIHRvIHBhc3MgYSBgRm9ybURhdGFgIG9iamVjdCB0byB0aGUgZnVuY3Rpb24gaW5zdGVhZCxcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgRm9ybURhdGEgZnJvbSBgZm9ybS1kYXRhYFxuICAgKiBpbXBvcnQgZnMgZnJvbSAnZnMnXG4gICAqIGltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG4gICAqXG4gICAqIGNvbnN0IGRhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgKlxuICAgKiBkYXRhLmFwcGVuZChKU09OLnN0cmluZ2lmeSh7XG4gICAqICBuYW1lOiAnPG5hbWU+JyxcbiAgICogIG1lZGlhVHlwZUFsaWFzOiAnPG1lZGlhLXR5cGUtYWxpYXM+JyxcbiAgICogIHBhcmVudElkOiAnPHBhcmVudElkfHVuZGVmaW5lZD4nLFxuICAgKiAgLy8gaWYgbXlGaWxlIGlzIG9mIHR5cGUgYFVwbG9hZGBcbiAgICogIG15RmlsZTogJ215LWZpbGUudHh0JyxcbiAgICogIC8vIGlmIG15SW1hZ2UgaXMgb2YgdHlwZSBgSW1hZ2UgQ3JvcHBlcmBcbiAgICogIG15SW1hZ2U6IHsgc3JjOiAnbXktaW1hZ2UuanBnJywgfSxcbiAgICogfSkpXG4gICAqXG4gICAqIGRhdGEuYXBwZW5kKCdteUZpbGUnLCBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGguam9pbihfX2Rpcm5hbWUsICdteS1maWxlLnR4dCcpKSlcbiAgICogZGF0YS5hcHBlbmQoJ215SW1hZ2UnLCBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGguam9pbihfX2Rpcm5hbWUsICdteS1pbWFnZS50eHQnKSkpXG4gICAqXG4gICAqIGNvbnN0IG1lZGlhID0gYXdhaXQgY2xpZW50Lm1hbmFnZW1lbnQubWVkaWEuY3JlYXRlKGRhdGEpXG4gICAqIGBgYFxuICAgKlxuICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vb3VyLnVtYnJhY28uY29tL2RvY3VtZW50YXRpb24vVW1icmFjby1IZWFydGNvcmUvQVBJLURvY3VtZW50YXRpb24vQ29udGVudC1NYW5hZ2VtZW50L21lZGlhLyNjcmVhdGUtY29udGVudH0gZm9yIG1vcmUgaW5mbyBvbiB0aGUgc3RydWN0dXJlIG9mIHRoZSBkb2N1bWVudC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZSA8VCBleHRlbmRzIENvbnRlbnRNYW5hZ2VtZW50TWVkaWE+IChib2R5OiBDb250ZW50TWFuYWdlbWVudE1lZGlhUmVxdWVzdCB8IEZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QoRW5kcG9pbnRzLm1hbmFnZW1lbnQubWVkaWEuY3JlYXRlKCksIGJvZHkpXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgTWVkaWEgaXRlbS5cbiAgICogQHBhcmFtIGlkIC0gR1VJRCBpZCBvZiB0aGUgQ29udGVudCBpdGVtLlxuICAgKiBAcGFyYW0gYm9keSAtIE1lZGlhIHRvIHVwZGF0ZS4gU2VlIHtAbGluayBDb250ZW50TWFuYWdlbWVudE1lZGlhUmVxdWVzdH0uXG4gICAqIEByZXR1cm5zIGEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ29udGVudE1hbmFnZW1lbnRNZWRpYX0gb2YgdGhlIHVwZGF0ZWQgTWVkaWEgaXRlbSBpZiBmb3VuZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IG1lZGlhID0gYXdhaXQgY2xpZW50Lm1hbmFnZW1lbnQubWVkaWEudXBkYXRlKCc8bWVkaWEtaWQ+Jywge1xuICAgKiAgbmFtZTogJzxuYW1lPicsXG4gICAqICBtZWRpYVR5cGVBbGlhczogJzxtZWRpYS10eXBlLWFsaWFzPicsXG4gICAqICBwYXJlbnRJZDogJzxwYXJlbnRJZHx1bmRlZmluZWQ+JyxcbiAgICogfSlcbiAgICogYGBgXG4gICAqXG4gICAqIElmIHRoZSBNZWRpYSBUeXBlIGluY2x1ZGVzIGFuIGBVcGxvYWRgIG9yIGFuIGBJbWFnZSBDcm9wcGVyYCBwcm9wZXJ0eSBhbmQgeW91IHdhbnQgdG8gdXBsb2FkIGEgZmlsZSB5b3UgbmVlZCB0byBwYXNzIGEgYEZvcm1EYXRhYCBvYmplY3QgdG8gdGhlIGZ1bmN0aW9uIGluc3RlYWQsXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IEZvcm1EYXRhIGZyb20gYGZvcm0tZGF0YWBcbiAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgKiBpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuICAgKlxuICAgKiBjb25zdCBkYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICpcbiAgICogZGF0YS5hcHBlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgKiAgbmFtZTogJzxuYW1lPicsXG4gICAqICBtZWRpYVR5cGVBbGlhczogJzxtZWRpYS10eXBlLWFsaWFzPicsXG4gICAqICBwYXJlbnRJZDogJzxwYXJlbnRJZHx1bmRlZmluZWQ+JyxcbiAgICogIC8vIGlmIG15RmlsZSBpcyBvZiB0eXBlIGBVcGxvYWRgXG4gICAqICBteUZpbGU6ICdteS1maWxlLnR4dCcsXG4gICAqICAvLyBpZiBteUltYWdlIGlzIG9mIHR5cGUgYEltYWdlIENyb3BwZXJgXG4gICAqICBteUltYWdlOiB7IHNyYzogJ215LWltYWdlLmpwZycsIH0sXG4gICAqIH0pKVxuICAgKlxuICAgKiBkYXRhLmFwcGVuZCgnbXlGaWxlJywgZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLmpvaW4oX19kaXJuYW1lLCAnbXktZmlsZS50eHQnKSkpXG4gICAqIGRhdGEuYXBwZW5kKCdteUltYWdlJywgZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLmpvaW4oX19kaXJuYW1lLCAnbXktaW1hZ2UudHh0JykpKVxuICAgKlxuICAgKiBjb25zdCBtZWRpYSA9IGF3YWl0IGNsaWVudC5tYW5hZ2VtZW50Lm1lZGlhLnVwZGF0ZSgnPG1lZGlhLWlkPicsIGRhdGEpXG4gICAqIGBgYFxuICAgKlxuICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vb3VyLnVtYnJhY28uY29tL2RvY3VtZW50YXRpb24vVW1icmFjby1IZWFydGNvcmUvQVBJLURvY3VtZW50YXRpb24vQ29udGVudC1NYW5hZ2VtZW50L21lZGlhLyN1cGRhdGUtbWVkaWF9IGZvciBtb3JlIGluZm8gb24gdGhlIHN0cnVjdHVyZSBvZiB0aGUgZG9jdW1lbnQuXG4gICAqL1xuICBhc3luYyB1cGRhdGUgPFQgZXh0ZW5kcyBDb250ZW50TWFuYWdlbWVudE1lZGlhPiAoaWQ6IHN0cmluZywgYm9keTogQ29udGVudE1hbmFnZW1lbnRNZWRpYVJlcXVlc3QgfCBGb3JtRGF0YSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdChFbmRwb2ludHMubWFuYWdlbWVudC5tZWRpYS51cGRhdGUoaWQpLCBib2R5KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5yZXNwb25zZSAmJiBlcnIucmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgTWVkaWEgaXRlbS5cbiAgICogQHBhcmFtIGlkIC0gR1VJRCBpZCBvZiB0aGUgTWVkaWEgaXRlbS5cbiAgICogQHJldHVybnMgYSBgUHJvbW1pc2VgIHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ29udGVudE1hbmFnZW1lbnRNZWRpYX0gb2YgdGhlIGRlbGV0ZWQgTWVkaWEgaXRlbSBpZiBmb3VuZCcsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZSA8VCBleHRlbmRzIENvbnRlbnRNYW5hZ2VtZW50TWVkaWE+IChpZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0KEVuZHBvaW50cy5tYW5hZ2VtZW50Lm1lZGlhLmRlbGV0ZShpZCkpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnJlc3BvbnNlICYmIGVyci5yZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxufVxuIl19