UNPKG

ngx-extended-pdf-viewer

Version:

Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.

83 lines 14 kB
export class PdfDocumentPropertiesExtractor { constructor() { this.pdfDateStringRegex = new RegExp('^D:' + // Prefix (required) '(\\d{4})' + // Year (required) '(\\d{2})?' + // Month (optional) '(\\d{2})?' + // Day (optional) '(\\d{2})?' + // Hour (optional) '(\\d{2})?' + // Minute (optional) '(\\d{2})?' + // Second (optional) '([Z|+|-])?' + // Universal time relation (optional) '(\\d{2})?' + // Offset hour (optional) // tslint:disable-next-line: quotemark "'?" + // Splitting apostrophe (optional) '(\\d{2})?' + // Offset minute (optional) // tslint:disable-next-line: quotemark "'?" // Trailing apostrophe (optional) ); } async getDocumentProperties() { const PDFViewerApplication = window.PDFViewerApplication; const pdfDocument = PDFViewerApplication.pdfDocument; const result = {}; const md = await pdfDocument.getMetadata(); const info = md.info; result.author = info.Author; result.creationDate = this.toDateObject(info.CreationDate); result.creator = info.Creator; result.keywords = info.Keywords; result.linearized = info.IsLinearized; result.modificationDate = this.toDateObject(info.ModDate); result.pdfFormatVersion = info.PDFFormatVersion; result.producer = info.Producer; result.subject = info.Subject; result.title = info.Title; if (md['contentDispositionFilename']) { result.fileName = md['contentDispositionFilename']; } result.maybeFileSize = await (await pdfDocument.getDownloadInfo()).length; return result; } /** shamelessly copied from pdf.js */ toDateObject(input) { // Optional fields that don't satisfy the requirements from the regular // expression (such as incorrect digit counts or numbers that are out of // range) will fall back the defaults from the specification. const matches = this.pdfDateStringRegex.exec(input); if (!matches) { return null; } // JavaScript's `Date` object expects the month to be between 0 and 11 // instead of 1 and 12, so we have to correct for that. const year = parseInt(matches[1], 10); let month = parseInt(matches[2], 10); month = month >= 1 && month <= 12 ? month - 1 : 0; let day = parseInt(matches[3], 10); day = day >= 1 && day <= 31 ? day : 1; let hour = parseInt(matches[4], 10); hour = hour >= 0 && hour <= 23 ? hour : 0; let minute = parseInt(matches[5], 10); minute = minute >= 0 && minute <= 59 ? minute : 0; let second = parseInt(matches[6], 10); second = second >= 0 && second <= 59 ? second : 0; const universalTimeRelation = matches[7] || 'Z'; let offsetHour = parseInt(matches[8], 10); offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; let offsetMinute = parseInt(matches[9], 10) || 0; offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; // Universal time relation 'Z' means that the local time is equal to the // universal time, whereas the relations '+'/'-' indicate that the local // time is later respectively earlier than the universal time. Every date // is normalized to universal time. if (universalTimeRelation === '-') { hour += offsetHour; minute += offsetMinute; } else if (universalTimeRelation === '+') { hour -= offsetHour; minute -= offsetMinute; } return new Date(Date.UTC(year, month, day, hour, minute, second)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRvY3VtZW50LXByb3BlcnRpZXMtZXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi9wZGYtZG9jdW1lbnQtcHJvcGVydGllcy1leHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE1BQU0sT0FBTyw4QkFBOEI7SUFBM0M7UUFDVSx1QkFBa0IsR0FBRyxJQUFJLE1BQU0sQ0FDckMsS0FBSyxHQUFHLG9CQUFvQjtZQUMxQixVQUFVLEdBQUcsa0JBQWtCO1lBQy9CLFdBQVcsR0FBRyxtQkFBbUI7WUFDakMsV0FBVyxHQUFHLGlCQUFpQjtZQUMvQixXQUFXLEdBQUcsa0JBQWtCO1lBQ2hDLFdBQVcsR0FBRyxvQkFBb0I7WUFDbEMsV0FBVyxHQUFHLG9CQUFvQjtZQUNsQyxZQUFZLEdBQUcscUNBQXFDO1lBQ3BELFdBQVcsR0FBRyx5QkFBeUI7WUFDdkMsc0NBQXNDO1lBQ3RDLElBQUksR0FBRyxrQ0FBa0M7WUFDekMsV0FBVyxHQUFHLDJCQUEyQjtZQUN6QyxzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLGlDQUFpQztTQUN6QyxDQUFDO0lBc0VKLENBQUM7SUFwRVEsS0FBSyxDQUFDLHFCQUFxQjtRQUNoQyxNQUFNLG9CQUFvQixHQUEyQixNQUFjLENBQUMsb0JBQW9CLENBQUM7UUFDekYsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxDQUFDO1FBRXJELE1BQU0sTUFBTSxHQUFRLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBc0IsQ0FBQztRQUV2QyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDNUIsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDOUIsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN0QyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNoRCxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDaEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDcEQ7UUFDRCxNQUFNLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUMxRSxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQscUNBQXFDO0lBQzdCLFlBQVksQ0FBQyxLQUFtQjtRQUN0Qyx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLDZEQUE2RDtRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsc0VBQXNFO1FBQ3RFLHVEQUF1RDtRQUN2RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckMsS0FBSyxHQUFHLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1FBQ2hELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxDQUFDLElBQUksVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsWUFBWSxHQUFHLFlBQVksSUFBSSxDQUFDLElBQUksWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsbUNBQW1DO1FBQ25DLElBQUkscUJBQXFCLEtBQUssR0FBRyxFQUFFO1lBQ2pDLElBQUksSUFBSSxVQUFVLENBQUM7WUFDbkIsTUFBTSxJQUFJLFlBQVksQ0FBQztTQUN4QjthQUFNLElBQUkscUJBQXFCLEtBQUssR0FBRyxFQUFFO1lBQ3hDLElBQUksSUFBSSxVQUFVLENBQUM7WUFDbkIsTUFBTSxJQUFJLFlBQVksQ0FBQztTQUN4QjtRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBERlZpZXdlckFwcGxpY2F0aW9uIH0gZnJvbSAnLi9vcHRpb25zL3BkZi12aWV3ZXItYXBwbGljYXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBkZkRvY3VtZW50SW5mbyB7XG4gIGF1dGhvcj86IHN0cmluZztcbiAgY3JlYXRpb25EYXRlPzogRGF0ZTtcbiAgY3JlYXRvcj86IHN0cmluZztcblxuICBrZXl3b3Jkcz86IHN0cmluZztcbiAgbGluZWFyaXplZD86IGJvb2xlYW47XG4gIG1heWJlRmlsZVNpemU/OiBzdHJpbmc7XG4gIG1vZGlmaWNhdGlvbkRhdGU/OiBEYXRlO1xuICBwZGZGb3JtYXRWZXJzaW9uPzogc3RyaW5nO1xuICBwcm9kdWNlcj86IHN0cmluZztcbiAgc3ViamVjdD86IHN0cmluZztcbiAgdGl0bGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBQZGZEb2N1bWVudFByb3BlcnRpZXNFeHRyYWN0b3Ige1xuICBwcml2YXRlIHBkZkRhdGVTdHJpbmdSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgJ15EOicgKyAvLyBQcmVmaXggKHJlcXVpcmVkKVxuICAgICAgJyhcXFxcZHs0fSknICsgLy8gWWVhciAocmVxdWlyZWQpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gTW9udGggKG9wdGlvbmFsKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIERheSAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gSG91ciAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gTWludXRlIChvcHRpb25hbClcbiAgICAgICcoXFxcXGR7Mn0pPycgKyAvLyBTZWNvbmQgKG9wdGlvbmFsKVxuICAgICAgJyhbWnwrfC1dKT8nICsgLy8gVW5pdmVyc2FsIHRpbWUgcmVsYXRpb24gKG9wdGlvbmFsKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIE9mZnNldCBob3VyIChvcHRpb25hbClcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcXVvdGVtYXJrXG4gICAgICBcIic/XCIgKyAvLyBTcGxpdHRpbmcgYXBvc3Ryb3BoZSAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gT2Zmc2V0IG1pbnV0ZSAob3B0aW9uYWwpXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHF1b3RlbWFya1xuICAgICAgXCInP1wiIC8vIFRyYWlsaW5nIGFwb3N0cm9waGUgKG9wdGlvbmFsKVxuICApO1xuXG4gIHB1YmxpYyBhc3luYyBnZXREb2N1bWVudFByb3BlcnRpZXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogSVBERlZpZXdlckFwcGxpY2F0aW9uID0gKHdpbmRvdyBhcyBhbnkpLlBERlZpZXdlckFwcGxpY2F0aW9uO1xuICAgIGNvbnN0IHBkZkRvY3VtZW50ID0gUERGVmlld2VyQXBwbGljYXRpb24ucGRmRG9jdW1lbnQ7XG5cbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGNvbnN0IG1kID0gYXdhaXQgcGRmRG9jdW1lbnQuZ2V0TWV0YWRhdGEoKTtcbiAgICBjb25zdCBpbmZvID0gbWQuaW5mbyBhcyB1bmtub3duIGFzIGFueTtcblxuICAgIHJlc3VsdC5hdXRob3IgPSBpbmZvLkF1dGhvcjtcbiAgICByZXN1bHQuY3JlYXRpb25EYXRlID0gdGhpcy50b0RhdGVPYmplY3QoaW5mby5DcmVhdGlvbkRhdGUpO1xuICAgIHJlc3VsdC5jcmVhdG9yID0gaW5mby5DcmVhdG9yO1xuICAgIHJlc3VsdC5rZXl3b3JkcyA9IGluZm8uS2V5d29yZHM7XG4gICAgcmVzdWx0LmxpbmVhcml6ZWQgPSBpbmZvLklzTGluZWFyaXplZDtcbiAgICByZXN1bHQubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMudG9EYXRlT2JqZWN0KGluZm8uTW9kRGF0ZSk7XG4gICAgcmVzdWx0LnBkZkZvcm1hdFZlcnNpb24gPSBpbmZvLlBERkZvcm1hdFZlcnNpb247XG4gICAgcmVzdWx0LnByb2R1Y2VyID0gaW5mby5Qcm9kdWNlcjtcbiAgICByZXN1bHQuc3ViamVjdCA9IGluZm8uU3ViamVjdDtcbiAgICByZXN1bHQudGl0bGUgPSBpbmZvLlRpdGxlO1xuICAgIGlmIChtZFsnY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUnXSkge1xuICAgICAgcmVzdWx0LmZpbGVOYW1lID0gbWRbJ2NvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lJ107XG4gICAgfVxuICAgIHJlc3VsdC5tYXliZUZpbGVTaXplID0gYXdhaXQgKGF3YWl0IHBkZkRvY3VtZW50LmdldERvd25sb2FkSW5mbygpKS5sZW5ndGg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBzaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBwZGYuanMgKi9cbiAgcHJpdmF0ZSB0b0RhdGVPYmplY3QoaW5wdXQ6IHN0cmluZyB8IGFueSk6IERhdGUgfCBudWxsIHtcbiAgICAvLyBPcHRpb25hbCBmaWVsZHMgdGhhdCBkb24ndCBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgZnJvbSB0aGUgcmVndWxhclxuICAgIC8vIGV4cHJlc3Npb24gKHN1Y2ggYXMgaW5jb3JyZWN0IGRpZ2l0IGNvdW50cyBvciBudW1iZXJzIHRoYXQgYXJlIG91dCBvZlxuICAgIC8vIHJhbmdlKSB3aWxsIGZhbGwgYmFjayB0aGUgZGVmYXVsdHMgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi5cbiAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5wZGZEYXRlU3RyaW5nUmVnZXguZXhlYyhpbnB1dCk7XG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBKYXZhU2NyaXB0J3MgYERhdGVgIG9iamVjdCBleHBlY3RzIHRoZSBtb250aCB0byBiZSBiZXR3ZWVuIDAgYW5kIDExXG4gICAgLy8gaW5zdGVhZCBvZiAxIGFuZCAxMiwgc28gd2UgaGF2ZSB0byBjb3JyZWN0IGZvciB0aGF0LlxuICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxMCk7XG4gICAgbGV0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTApO1xuICAgIG1vbnRoID0gbW9udGggPj0gMSAmJiBtb250aCA8PSAxMiA/IG1vbnRoIC0gMSA6IDA7XG4gICAgbGV0IGRheSA9IHBhcnNlSW50KG1hdGNoZXNbM10sIDEwKTtcbiAgICBkYXkgPSBkYXkgPj0gMSAmJiBkYXkgPD0gMzEgPyBkYXkgOiAxO1xuICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hlc1s0XSwgMTApO1xuICAgIGhvdXIgPSBob3VyID49IDAgJiYgaG91ciA8PSAyMyA/IGhvdXIgOiAwO1xuICAgIGxldCBtaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzVdLCAxMCk7XG4gICAgbWludXRlID0gbWludXRlID49IDAgJiYgbWludXRlIDw9IDU5ID8gbWludXRlIDogMDtcbiAgICBsZXQgc2Vjb25kID0gcGFyc2VJbnQobWF0Y2hlc1s2XSwgMTApO1xuICAgIHNlY29uZCA9IHNlY29uZCA+PSAwICYmIHNlY29uZCA8PSA1OSA/IHNlY29uZCA6IDA7XG4gICAgY29uc3QgdW5pdmVyc2FsVGltZVJlbGF0aW9uID0gbWF0Y2hlc1s3XSB8fCAnWic7XG4gICAgbGV0IG9mZnNldEhvdXIgPSBwYXJzZUludChtYXRjaGVzWzhdLCAxMCk7XG4gICAgb2Zmc2V0SG91ciA9IG9mZnNldEhvdXIgPj0gMCAmJiBvZmZzZXRIb3VyIDw9IDIzID8gb2Zmc2V0SG91ciA6IDA7XG4gICAgbGV0IG9mZnNldE1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbOV0sIDEwKSB8fCAwO1xuICAgIG9mZnNldE1pbnV0ZSA9IG9mZnNldE1pbnV0ZSA+PSAwICYmIG9mZnNldE1pbnV0ZSA8PSA1OSA/IG9mZnNldE1pbnV0ZSA6IDA7XG5cbiAgICAvLyBVbml2ZXJzYWwgdGltZSByZWxhdGlvbiAnWicgbWVhbnMgdGhhdCB0aGUgbG9jYWwgdGltZSBpcyBlcXVhbCB0byB0aGVcbiAgICAvLyB1bml2ZXJzYWwgdGltZSwgd2hlcmVhcyB0aGUgcmVsYXRpb25zICcrJy8nLScgaW5kaWNhdGUgdGhhdCB0aGUgbG9jYWxcbiAgICAvLyB0aW1lIGlzIGxhdGVyIHJlc3BlY3RpdmVseSBlYXJsaWVyIHRoYW4gdGhlIHVuaXZlcnNhbCB0aW1lLiBFdmVyeSBkYXRlXG4gICAgLy8gaXMgbm9ybWFsaXplZCB0byB1bml2ZXJzYWwgdGltZS5cbiAgICBpZiAodW5pdmVyc2FsVGltZVJlbGF0aW9uID09PSAnLScpIHtcbiAgICAgIGhvdXIgKz0gb2Zmc2V0SG91cjtcbiAgICAgIG1pbnV0ZSArPSBvZmZzZXRNaW51dGU7XG4gICAgfSBlbHNlIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09ICcrJykge1xuICAgICAgaG91ciAtPSBvZmZzZXRIb3VyO1xuICAgICAgbWludXRlIC09IG9mZnNldE1pbnV0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpKTtcbiAgfVxufVxuIl19