1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const promisified_functions_1 = require("../utils/promisified-functions");
|
4 | const runtime_1 = require("../errors/runtime");
|
5 | const types_1 = require("../errors/types");
|
6 | const path_1 = require("path");
|
7 | // @ts-ignore Could not find a declaration file for module 'testcafe-hammerhead'
|
8 | const testcafe_hammerhead_1 = require("testcafe-hammerhead");
|
9 | const crypto_1 = require("crypto");
|
10 | const BEAUTIFY_REGEXP = /[/.:\s\\]/g;
|
11 | const BEAUTIFY_CHAR = '_';
|
12 | const EMPTY_CONTENT_STR = '{ content: <empty> }';
|
13 | const CONTENT_STR_MAX_LENGTH = 30;
|
14 | const CONTENT_ELLIPSIS_STR = '...';
|
15 | const URL_UNIQUE_PART_LENGTH = 7;
|
16 | class ClientScript {
|
17 | constructor(init, basePath) {
|
18 | this.init = init || null;
|
19 | this.url = testcafe_hammerhead_1.generateUniqueId(URL_UNIQUE_PART_LENGTH);
|
20 | this.content = '';
|
21 | this.path = null;
|
22 | this.module = null;
|
23 | this.hash = null;
|
24 | this.page = testcafe_hammerhead_1.RequestFilterRule.ANY;
|
25 | this.basePath = basePath;
|
26 | }
|
27 | _resolvePath(path) {
|
28 | let resolvedPath = null;
|
29 | if (path_1.isAbsolute(path))
|
30 | resolvedPath = path;
|
31 | else {
|
32 | if (!this.basePath)
|
33 | throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.clientScriptBasePathIsNotSpecified);
|
34 | resolvedPath = path_1.join(this.basePath, path);
|
35 | }
|
36 | return resolvedPath;
|
37 | }
|
38 | async _loadFromPath(path) {
|
39 | const resolvedPath = this._resolvePath(path);
|
40 | try {
|
41 | this.path = resolvedPath;
|
42 | this.content = await promisified_functions_1.readFile(this.path);
|
43 | this.content = this.content.toString();
|
44 | this.url = path || this.url;
|
45 | }
|
46 | catch (e) {
|
47 | throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotLoadClientScriptFromPath, path);
|
48 | }
|
49 | }
|
50 | async _loadFromModule(name) {
|
51 | let resolvedPath = null;
|
52 | try {
|
53 | resolvedPath = require.resolve(name);
|
54 | }
|
55 | catch (e) {
|
56 | throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.clientScriptModuleEntryPointPathCalculationError, e.message);
|
57 | }
|
58 | await this._loadFromPath(resolvedPath);
|
59 | this.module = name;
|
60 | }
|
61 | _prepareUrl() {
|
62 | this.url = this.url.replace(BEAUTIFY_REGEXP, BEAUTIFY_CHAR).toLowerCase();
|
63 | }
|
64 | async load() {
|
65 | if (this.init === null)
|
66 | throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.clientScriptInitializerIsNotSpecified);
|
67 | else if (typeof this.init === 'string')
|
68 | await this._loadFromPath(this.init);
|
69 | else {
|
70 | const { path: initPath, content: initContent, module: initModule, page: initPage } = this.init;
|
71 | if (initPath && initContent || initPath && initModule || initContent && initModule)
|
72 | throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.clientScriptInitializerMultipleContentSources);
|
73 | if (initPath)
|
74 | await this._loadFromPath(initPath);
|
75 | else if (initModule)
|
76 | await this._loadFromModule(initModule);
|
77 | else
|
78 | this.content = initContent;
|
79 | if (initPage)
|
80 | this.page = new testcafe_hammerhead_1.RequestFilterRule(initPage);
|
81 | }
|
82 | this._calculateHash();
|
83 | this._prepareUrl();
|
84 | }
|
85 | _calculateHash() {
|
86 | this.hash = crypto_1.createHash('md5').update(this.content).digest();
|
87 | }
|
88 | _contentToString() {
|
89 | let displayContent = '';
|
90 | if (this.content.length <= CONTENT_STR_MAX_LENGTH - CONTENT_ELLIPSIS_STR.length)
|
91 | displayContent = this.content;
|
92 | else
|
93 | displayContent = this.content.substring(0, CONTENT_STR_MAX_LENGTH - CONTENT_ELLIPSIS_STR.length) + CONTENT_ELLIPSIS_STR;
|
94 | return `{ content: '${displayContent}' }`;
|
95 | }
|
96 | toString() {
|
97 | if (!this.content)
|
98 | return EMPTY_CONTENT_STR;
|
99 | else if (this.content && !this.path)
|
100 | return this._contentToString();
|
101 | return `{ path: '${this.path}' }`;
|
102 | }
|
103 | static get URL_UNIQUE_PART_LENGTH() {
|
104 | return URL_UNIQUE_PART_LENGTH;
|
105 | }
|
106 | }
|
107 | exports.default = ClientScript;
|
108 | module.exports = exports.default;
|
109 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jdXN0b20tY2xpZW50LXNjcmlwdHMvY2xpZW50LXNjcmlwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUEwRDtBQUMxRCwrQ0FBaUQ7QUFDakQsMkNBQWlEO0FBQ2pELCtCQUF3QztBQUN4QyxnRkFBZ0Y7QUFDaEYsNkRBQTBFO0FBQzFFLG1DQUFvQztBQUdwQyxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxhQUFhLEdBQUssR0FBRyxDQUFDO0FBRTVCLE1BQU0saUJBQWlCLEdBQVEsc0JBQXNCLENBQUM7QUFDdEQsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEMsTUFBTSxvQkFBb0IsR0FBSyxLQUFLLENBQUM7QUFFckMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7QUFFakMsTUFBcUIsWUFBWTtJQVU3QixZQUFvQixJQUErQixFQUFFLFFBQWdCO1FBQ2pFLElBQUksQ0FBQyxJQUFJLEdBQU8sSUFBSSxJQUFJLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxHQUFRLHNDQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBTyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBSyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBTyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBTyx1Q0FBaUIsQ0FBQyxHQUFHLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDN0IsQ0FBQztJQUVPLFlBQVksQ0FBRSxJQUFZO1FBQzlCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQztRQUV4QixJQUFJLGlCQUFVLENBQUMsSUFBSSxDQUFDO1lB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UUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hFLENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBRXhCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksc0JBQXNCLEdBQUcsb0JBQW9CLENBQUMsTUFBTTtZQUMzRSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQzs7WUFFOUIsY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxvQkFBb0IsQ0FBQztRQUU1SCxPQUFPLGVBQWUsY0FBYyxLQUFLLENBQUM7SUFDOUMsQ0FBQztJQUVNLFFBQVE7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDYixPQUFPLGlCQUFpQixDQUFDO2FBRXhCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQy9CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFbkMsT0FBTyxZQUFZLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUN0QyxDQUFDO0lBRU0sTUFBTSxLQUFLLHNCQUFzQjtRQUNwQyxPQUFPLHNCQUFzQixDQUFDO0lBQ2xDLENBQUM7Q0FDSjtBQTNIRCwrQkEySEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2lmaWVkLWZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBpc0Fic29sdXRlLCBqb2luIH0gZnJvbSAncGF0aCc7XG4vLyBAdHMtaWdub3JlIENvdWxkIG5vdCBmaW5kIGEgZGVjbGFyYXRpb24gZmlsZSBmb3IgbW9kdWxlICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJ1xuaW1wb3J0IHsgUmVxdWVzdEZpbHRlclJ1bGUsIGdlbmVyYXRlVW5pcXVlSWQgfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IENsaWVudFNjcmlwdEluaXQgZnJvbSAnLi9jbGllbnQtc2NyaXB0LWluaXQnO1xuXG5jb25zdCBCRUFVVElGWV9SRUdFWFAgPSAvWy8uOlxcc1xcXFxdL2c7XG5jb25zdCBCRUFVVElGWV9DSEFSICAgPSAnXyc7XG5cbmNvbnN0IEVNUFRZX0NPTlRFTlRfU1RSICAgICAgPSAneyBjb250ZW50OiA8ZW1wdHk+IH0nO1xuY29uc3QgQ09OVEVOVF9TVFJfTUFYX0xFTkdUSCA9IDMwO1xuY29uc3QgQ09OVEVOVF9FTExJUFNJU19TVFIgICA9ICcuLi4nO1xuXG5jb25zdCBVUkxfVU5JUVVFX1BBUlRfTEVOR1RIID0gNztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50U2NyaXB0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluaXQ6IG51bGwgfCBzdHJpbmcgfCBDbGllbnRTY3JpcHRJbml0O1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgY29udGVudDogc3RyaW5nO1xuICAgIHB1YmxpYyBwYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyBtb2R1bGU6IHN0cmluZyB8IG51bGw7XG4gICAgcHVibGljIGhhc2g6IEJ1ZmZlciB8IG51bGw7XG4gICAgcHVibGljIHBhZ2U6IFJlcXVlc3RGaWx0ZXJSdWxlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmFzZVBhdGg6IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaW5pdDogc3RyaW5nIHwgQ2xpZW50U2NyaXB0SW5pdCwgYmFzZVBhdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLmluaXQgICAgID0gaW5pdCB8fCBudWxsO1xuICAgICAgICB0aGlzLnVybCAgICAgID0gZ2VuZXJhdGVVbmlxdWVJZChVUkxfVU5JUVVFX1BBUlRfTEVOR1RIKTtcbiAgICAgICAgdGhpcy5jb250ZW50ICA9ICcnO1xuICAgICAgICB0aGlzLnBhdGggICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb2R1bGUgICA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFzaCAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLnBhZ2UgICAgID0gUmVxdWVzdEZpbHRlclJ1bGUuQU5ZO1xuICAgICAgICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzb2x2ZVBhdGggKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXNvbHZlZFBhdGggPSBudWxsO1xuXG4gICAgICAgIGlmIChpc0Fic29sdXRlKHBhdGgpKVxuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcGF0aDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYmFzZVBhdGgpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jbGllbnRTY3JpcHRCYXNlUGF0aElzTm90U3BlY2lmaWVkKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gam9pbih0aGlzLmJhc2VQYXRoLCBwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfbG9hZEZyb21QYXRoIChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gdGhpcy5fcmVzb2x2ZVBhdGgocGF0aCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucGF0aCAgICA9IHJlc29sdmVkUGF0aDtcbiAgICAgICAgICAgIHRoaXMuY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRoaXMucGF0aCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMudXJsICAgICA9IHBhdGggfHwgdGhpcy51cmw7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90TG9hZENsaWVudFNjcmlwdEZyb21QYXRoLCBwYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2xvYWRGcm9tTW9kdWxlIChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHJlc29sdmVkUGF0aCA9IG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jbGllbnRTY3JpcHRNb2R1bGVFbnRyeVBvaW50UGF0aENhbGN1bGF0aW9uRXJyb3IsIGUubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLl9sb2FkRnJvbVBhdGgocmVzb2x2ZWRQYXRoKTtcblxuICAgICAgICB0aGlzLm1vZHVsZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJlcGFyZVVybCAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXJsID0gdGhpcy51cmwucmVwbGFjZShCRUFVVElGWV9SRUdFWFAsIEJFQVVUSUZZX0NIQVIpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbml0ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jbGllbnRTY3JpcHRJbml0aWFsaXplcklzTm90U3BlY2lmaWVkKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMuaW5pdCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9sb2FkRnJvbVBhdGgodGhpcy5pbml0KTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IHBhdGg6IGluaXRQYXRoLCBjb250ZW50OiBpbml0Q29udGVudCwgbW9kdWxlOiBpbml0TW9kdWxlLCBwYWdlOiBpbml0UGFnZSB9ID0gdGhpcy5pbml0IGFzIENsaWVudFNjcmlwdDtcblxuICAgICAgICAgICAgaWYgKGluaXRQYXRoICYmIGluaXRDb250ZW50IHx8IGluaXRQYXRoICYmIGluaXRNb2R1bGUgfHwgaW5pdENvbnRlbnQgJiYgaW5pdE1vZHVsZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmNsaWVudFNjcmlwdEluaXRpYWxpemVyTXVsdGlwbGVDb250ZW50U291cmNlcyk7XG5cbiAgICAgICAgICAgIGlmIChpbml0UGF0aClcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9sb2FkRnJvbVBhdGgoaW5pdFBhdGgpO1xuICAgICAgICAgICAgZWxzZSBpZiAoaW5pdE1vZHVsZSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9sb2FkRnJvbU1vZHVsZShpbml0TW9kdWxlKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbml0Q29udGVudDtcblxuICAgICAgICAgICAgaWYgKGluaXRQYWdlKVxuICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9IG5ldyBSZXF1ZXN0RmlsdGVyUnVsZShpbml0UGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jYWxjdWxhdGVIYXNoKCk7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVVcmwoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jYWxjdWxhdGVIYXNoICgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oYXNoID0gY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKHRoaXMuY29udGVudCkuZGlnZXN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29udGVudFRvU3RyaW5nICgpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZGlzcGxheUNvbnRlbnQgPSAnJztcblxuICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aCA8PSBDT05URU5UX1NUUl9NQVhfTEVOR1RIIC0gQ09OVEVOVF9FTExJUFNJU19TVFIubGVuZ3RoKVxuICAgICAgICAgICAgZGlzcGxheUNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRpc3BsYXlDb250ZW50ID0gdGhpcy5jb250ZW50LnN1YnN0cmluZygwLCBDT05URU5UX1NUUl9NQVhfTEVOR1RIIC0gQ09OVEVOVF9FTExJUFNJU19TVFIubGVuZ3RoKSArIENPTlRFTlRfRUxMSVBTSVNfU1RSO1xuXG4gICAgICAgIHJldHVybiBgeyBjb250ZW50OiAnJHtkaXNwbGF5Q29udGVudH0nIH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZyAoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfQ09OVEVOVF9TVFI7XG5cbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb250ZW50ICYmICF0aGlzLnBhdGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudFRvU3RyaW5nKCk7XG5cbiAgICAgICAgcmV0dXJuIGB7IHBhdGg6ICcke3RoaXMucGF0aH0nIH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFVSTF9VTklRVUVfUEFSVF9MRU5HVEggKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBVUkxfVU5JUVVFX1BBUlRfTEVOR1RIO1xuICAgIH1cbn1cbiJdfQ== |
\ | No newline at end of file |