@appium/support 2.55.4 → 2.56.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/build/lib/env.js +102 -0
- package/build/lib/fs.js +74 -56
- package/build/lib/image-util.js +2 -4
- package/build/lib/index.js +18 -6
- package/build/lib/log-internal.js +2 -4
- package/build/lib/logger.js +2 -4
- package/build/lib/logging.js +2 -4
- package/build/lib/mjpeg.js +2 -4
- package/build/lib/mkdirp.js +7 -11
- package/build/lib/net.js +2 -4
- package/build/lib/node.js +99 -2
- package/build/lib/npm.js +240 -0
- package/build/lib/plist.js +2 -4
- package/build/lib/process.js +2 -4
- package/build/lib/system.js +2 -4
- package/build/lib/tempdir.js +2 -4
- package/build/lib/timing.js +2 -4
- package/build/lib/util.js +6 -8
- package/build/lib/zip.js +4 -8
- package/lib/env.js +162 -0
- package/lib/fs.js +193 -69
- package/lib/index.js +8 -2
- package/lib/log-internal.js +2 -2
- package/lib/logging.js +1 -1
- package/lib/mkdirp.js +3 -6
- package/lib/net.js +4 -4
- package/lib/node.js +104 -1
- package/lib/npm.js +335 -0
- package/lib/tempdir.js +6 -6
- package/lib/util.js +28 -24
- package/lib/zip.js +7 -8
- package/package.json +20 -10
- package/build/test/assets/sample_binary.plist +0 -0
- package/build/test/assets/sample_text.plist +0 -28
- package/build/test/fs-specs.js +0 -264
- package/build/test/helpers.js +0 -35
- package/build/test/image-util-e2e-specs.js +0 -78
- package/build/test/index-specs.js +0 -49
- package/build/test/log-internals-specs.js +0 -97
- package/build/test/logger/helpers.js +0 -71
- package/build/test/logger/logger-force-specs.js +0 -41
- package/build/test/logger/logger-normal-specs.js +0 -113
- package/build/test/logger/logger-test-specs.js +0 -40
- package/build/test/mjpeg-e2e-specs.js +0 -96
- package/build/test/net-e2e-specs.js +0 -32
- package/build/test/node-e2e-specs.js +0 -22
- package/build/test/plist-specs.js +0 -54
- package/build/test/process-specs.js +0 -104
- package/build/test/system-specs.js +0 -136
- package/build/test/tempdir-specs.js +0 -86
- package/build/test/timing-specs.js +0 -125
- package/build/test/util-e2e-specs.js +0 -136
- package/build/test/util-specs.js +0 -537
- package/build/test/zip-e2e-specs.js +0 -233
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
8
|
-
|
|
9
|
-
var _path = _interopRequireDefault(require("path"));
|
|
10
|
-
|
|
11
|
-
var util = _interopRequireWildcard(require("../lib/util"));
|
|
12
|
-
|
|
13
|
-
var _index = require("../lib/index");
|
|
14
|
-
|
|
15
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
|
-
|
|
17
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
18
|
-
|
|
19
|
-
describe('#util', function () {
|
|
20
|
-
let tmpRoot;
|
|
21
|
-
let tmpFile;
|
|
22
|
-
const content = 'YOLO';
|
|
23
|
-
beforeEach(async function () {
|
|
24
|
-
tmpRoot = await _index.tempDir.openDir();
|
|
25
|
-
tmpFile = _path.default.resolve(tmpRoot, 'example.txt');
|
|
26
|
-
await _index.fs.writeFile(tmpFile, content, 'utf8');
|
|
27
|
-
});
|
|
28
|
-
afterEach(async function () {
|
|
29
|
-
if (tmpRoot) {
|
|
30
|
-
await _index.fs.rimraf(tmpRoot);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
tmpRoot = null;
|
|
34
|
-
});
|
|
35
|
-
describe('toInMemoryBase64()', function () {
|
|
36
|
-
it('should convert a file to base64 encoding', async function () {
|
|
37
|
-
const data = await util.toInMemoryBase64(tmpFile);
|
|
38
|
-
const fileContent = await _index.fs.readFile(tmpFile);
|
|
39
|
-
data.toString().should.eql(fileContent.toString('base64'));
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
describe('getLockFileGuard()', function () {
|
|
43
|
-
let tmpRoot;
|
|
44
|
-
let lockFile;
|
|
45
|
-
let testFile;
|
|
46
|
-
|
|
47
|
-
async function guardedBehavior(text, msBeforeActing) {
|
|
48
|
-
await _bluebird.default.delay(msBeforeActing);
|
|
49
|
-
await _index.fs.appendFile(testFile, text, 'utf8');
|
|
50
|
-
return text;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async function testFileContents() {
|
|
54
|
-
return (await _index.fs.readFile(testFile)).toString('utf8');
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
beforeEach(async function () {
|
|
58
|
-
tmpRoot = await _index.tempDir.openDir();
|
|
59
|
-
lockFile = _path.default.resolve(tmpRoot, 'test.lock');
|
|
60
|
-
testFile = _path.default.resolve(tmpRoot, 'test');
|
|
61
|
-
await _index.fs.writeFile(testFile, 'a', 'utf8');
|
|
62
|
-
});
|
|
63
|
-
afterEach(async function () {
|
|
64
|
-
try {
|
|
65
|
-
await _bluebird.default.all([lockFile, testFile].map(p => _index.fs.unlink(p)));
|
|
66
|
-
} catch (ign) {}
|
|
67
|
-
});
|
|
68
|
-
it('should lock a file during the given behavior', async function () {
|
|
69
|
-
const guard = util.getLockFileGuard(lockFile);
|
|
70
|
-
await guard.check().should.eventually.be.false;
|
|
71
|
-
const guardPromise = guard(async () => await guardedBehavior('b', 500));
|
|
72
|
-
await _bluebird.default.delay(200);
|
|
73
|
-
await guard.check().should.eventually.be.true;
|
|
74
|
-
await guardPromise;
|
|
75
|
-
await guard.check().should.eventually.be.false;
|
|
76
|
-
await testFileContents().should.eventually.eql('ab');
|
|
77
|
-
});
|
|
78
|
-
it('should recover a broken lock file', async function () {
|
|
79
|
-
await _index.fs.writeFile(lockFile, 'dummy', 'utf8');
|
|
80
|
-
const guard = util.getLockFileGuard(lockFile, {
|
|
81
|
-
timeout: 3,
|
|
82
|
-
tryRecovery: true
|
|
83
|
-
});
|
|
84
|
-
await guard(async () => await guardedBehavior('b', 500));
|
|
85
|
-
await guard.check().should.eventually.be.false;
|
|
86
|
-
await testFileContents().should.eventually.eql('ab');
|
|
87
|
-
});
|
|
88
|
-
it('should block other behavior until the lock is released', async function () {
|
|
89
|
-
await testFileContents().should.eventually.eql('a');
|
|
90
|
-
const unguardedPromise1 = guardedBehavior('b', 500);
|
|
91
|
-
const unguardedPromise2 = guardedBehavior('c', 100);
|
|
92
|
-
await unguardedPromise1;
|
|
93
|
-
await unguardedPromise2;
|
|
94
|
-
await testFileContents().should.eventually.eql('acb');
|
|
95
|
-
const guard = util.getLockFileGuard(lockFile);
|
|
96
|
-
const guardPromise1 = guard(async () => await guardedBehavior('b', 500));
|
|
97
|
-
const guardPromise2 = guard(async () => await guardedBehavior('c', 100));
|
|
98
|
-
await guardPromise1;
|
|
99
|
-
await guardPromise2;
|
|
100
|
-
await testFileContents().should.eventually.eql('acbbc');
|
|
101
|
-
});
|
|
102
|
-
it('should return the result of the guarded behavior', async function () {
|
|
103
|
-
const guard = util.getLockFileGuard(lockFile);
|
|
104
|
-
const guardPromise1 = guard(async () => await guardedBehavior('hello', 500));
|
|
105
|
-
const guardPromise2 = guard(async () => await guardedBehavior('world', 100));
|
|
106
|
-
const ret1 = await guardPromise1;
|
|
107
|
-
const ret2 = await guardPromise2;
|
|
108
|
-
ret1.should.eql('hello');
|
|
109
|
-
ret2.should.eql('world');
|
|
110
|
-
});
|
|
111
|
-
it('should time out if the lock is not released', async function () {
|
|
112
|
-
this.timeout(5000);
|
|
113
|
-
const guard = util.getLockFileGuard(lockFile, {
|
|
114
|
-
timeout: 0.5
|
|
115
|
-
});
|
|
116
|
-
const p1 = guard(async () => await guardedBehavior('hello', 1200));
|
|
117
|
-
const p2 = guard(async () => await guardedBehavior('world', 10));
|
|
118
|
-
await p2.should.eventually.be.rejectedWith(/not acquire lock/);
|
|
119
|
-
await p1.should.eventually.eql('hello');
|
|
120
|
-
});
|
|
121
|
-
it('should still release lock if guarded behavior fails', async function () {
|
|
122
|
-
this.timeout(5000);
|
|
123
|
-
const guard = util.getLockFileGuard(lockFile);
|
|
124
|
-
const p1 = guard(async () => {
|
|
125
|
-
await _bluebird.default.delay(500);
|
|
126
|
-
throw new Error('bad');
|
|
127
|
-
});
|
|
128
|
-
const p2 = guard(async () => await guardedBehavior('world', 100));
|
|
129
|
-
await p1.should.eventually.be.rejectedWith(/bad/);
|
|
130
|
-
await p2.should.eventually.eql('world');
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
});require('source-map-support').install();
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvdXRpbC1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJ0bXBSb290IiwidG1wRmlsZSIsImNvbnRlbnQiLCJiZWZvcmVFYWNoIiwidGVtcERpciIsIm9wZW5EaXIiLCJwYXRoIiwicmVzb2x2ZSIsImZzIiwid3JpdGVGaWxlIiwiYWZ0ZXJFYWNoIiwicmltcmFmIiwiaXQiLCJkYXRhIiwidXRpbCIsInRvSW5NZW1vcnlCYXNlNjQiLCJmaWxlQ29udGVudCIsInJlYWRGaWxlIiwidG9TdHJpbmciLCJzaG91bGQiLCJlcWwiLCJsb2NrRmlsZSIsInRlc3RGaWxlIiwiZ3VhcmRlZEJlaGF2aW9yIiwidGV4dCIsIm1zQmVmb3JlQWN0aW5nIiwiQiIsImRlbGF5IiwiYXBwZW5kRmlsZSIsInRlc3RGaWxlQ29udGVudHMiLCJhbGwiLCJtYXAiLCJwIiwidW5saW5rIiwiaWduIiwiZ3VhcmQiLCJnZXRMb2NrRmlsZUd1YXJkIiwiY2hlY2siLCJldmVudHVhbGx5IiwiYmUiLCJmYWxzZSIsImd1YXJkUHJvbWlzZSIsInRydWUiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJ1bmd1YXJkZWRQcm9taXNlMSIsInVuZ3VhcmRlZFByb21pc2UyIiwiZ3VhcmRQcm9taXNlMSIsImd1YXJkUHJvbWlzZTIiLCJyZXQxIiwicmV0MiIsInAxIiwicDIiLCJyZWplY3RlZFdpdGgiLCJFcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUdBQSxRQUFRLENBQUMsT0FBRCxFQUFVLFlBQVk7QUFDNUIsTUFBSUMsT0FBSjtBQUNBLE1BQUlDLE9BQUo7QUFDQSxRQUFNQyxPQUFPLEdBQUcsTUFBaEI7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLGtCQUFrQjtBQUMzQkgsSUFBQUEsT0FBTyxHQUFHLE1BQU1JLGVBQVFDLE9BQVIsRUFBaEI7QUFDQUosSUFBQUEsT0FBTyxHQUFHSyxjQUFLQyxPQUFMLENBQWFQLE9BQWIs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Q0FBd0JjLFlBQXhCLENBQXFDLEtBQXJDLENBQU47QUFDQSxZQUFNRCxFQUFFLENBQUNqQyxNQUFILENBQVVtQixVQUFWLENBQXFCbEIsR0FBckIsQ0FBeUIsT0FBekIsQ0FBTjtBQUNELEtBVkMsQ0FBRjtBQVdELEdBbEdPLENBQVI7QUFvR0QsQ0E5SE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi9saWIvdXRpbCc7XG5pbXBvcnQgeyB0ZW1wRGlyLCBmcyB9IGZyb20gJy4uL2xpYi9pbmRleCc7XG5cblxuZGVzY3JpYmUoJyN1dGlsJywgZnVuY3Rpb24gKCkge1xuICBsZXQgdG1wUm9vdDtcbiAgbGV0IHRtcEZpbGU7XG4gIGNvbnN0IGNvbnRlbnQgPSAnWU9MTyc7XG5cbiAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRtcEZpbGUgPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgJ2V4YW1wbGUudHh0Jyk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHRtcEZpbGUsIGNvbnRlbnQsICd1dGY4Jyk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRtcFJvb3QpIHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG4gICAgdG1wUm9vdCA9IG51bGw7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0b0luTWVtb3J5QmFzZTY0KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGEgZmlsZSB0byBiYXNlNjQgZW5jb2RpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KHRtcEZpbGUpO1xuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0bXBGaWxlKTtcbiAgICAgIGRhdGEudG9TdHJpbmcoKS5zaG91bGQuZXFsKGZpbGVDb250ZW50LnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRMb2NrRmlsZUd1YXJkKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRtcFJvb3Q7XG4gICAgbGV0IGxvY2tGaWxlO1xuICAgIGxldCB0ZXN0RmlsZTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGd1YXJkZWRCZWhhdmlvciAodGV4dCwgbXNCZWZvcmVBY3RpbmcpIHtcbiAgICAgIGF3YWl0IEIuZGVsYXkobXNCZWZvcmVBY3RpbmcpO1xuICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZSh0ZXN0RmlsZSwgdGV4dCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHRlc3RGaWxlQ29udGVudHMgKCkge1xuICAgICAgcmV0dXJuIChhd2FpdCBmcy5yZWFkRmlsZSh0ZXN0RmlsZSkpLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgfVxuXG4gICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgICBsb2NrRmlsZSA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCAndGVzdC5sb2NrJyk7XG4gICAgICB0ZXN0RmlsZSA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCAndGVzdCcpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlc3RGaWxlLCAnYScsICd1dGY4Jyk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgQi5hbGwoW2xvY2tGaWxlLCB0ZXN0RmlsZV0ubWFwKChwKSA9PiBmcy51bmxpbmsocCkpKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbG9jayBhIGZpbGUgZHVyaW5nIHRoZSBnaXZlbiBiZWhhdmlvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGd1YXJkID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKGxvY2tGaWxlKTtcbiAgICAgIGF3YWl0IGd1YXJkLmNoZWNrKCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUuZmFsc2U7XG4gICAgICBjb25zdCBndWFyZFByb21pc2UgPSBndWFyZChhc3luYyAoKSA9PiBhd2FpdCBndWFyZGVkQmVoYXZpb3IoJ2InLCA1MDApKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoMjAwKTtcbiAgICAgIGF3YWl0IGd1YXJkLmNoZWNrKCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUudHJ1ZTtcbiAgICAgIGF3YWl0IGd1YXJkUHJvbWlzZTtcbiAgICAgIGF3YWl0IGd1YXJkLmNoZWNrKCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUuZmFsc2U7XG4gICAgICBhd2FpdCB0ZXN0RmlsZUNvbnRlbnRzKCkuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKCdhYicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgYnJva2VuIGxvY2sgZmlsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShsb2NrRmlsZSwgJ2R1bW15JywgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGd1YXJkID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKGxvY2tGaWxlLCB7XG4gICAgICAgIHRpbWVvdXQ6IDMsXG4gICAgICAgIHRyeVJlY292ZXJ5OiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBndWFyZChhc3luYyAoKSA9PiBhd2FpdCBndWFyZGVkQmVoYXZpb3IoJ2InLCA1MDApKTtcbiAgICAgIGF3YWl0IGd1YXJkLmNoZWNrKCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUuZmFsc2U7XG4gICAgICBhd2FpdCB0ZXN0RmlsZUNvbnRlbnRzKCkuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKCdhYicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBibG9jayBvdGhlciBiZWhhdmlvciB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGZpcnN0IHByb3ZlIHRoYXQgd2l0aG91dCBhIGxvY2ssIHdlIGdldCByYWNlc1xuICAgICAgYXdhaXQgdGVzdEZpbGVDb250ZW50cygpLnNob3VsZC5ldmVudHVhbGx5LmVxbCgnYScpO1xuICAgICAgY29uc3QgdW5ndWFyZGVkUHJvbWlzZTEgPSBndWFyZGVkQmVoYXZpb3IoJ2InLCA1MDApO1xuICAgICAgY29uc3QgdW5ndWFyZGVkUHJvbWlzZTIgPSBndWFyZGVkQmVoYXZpb3IoJ2MnLCAxMDApO1xuICAgICAgYXdhaXQgdW5ndWFyZGVkUHJvbWlzZTE7XG4gICAgICBhd2FpdCB1bmd1YXJkZWRQcm9taXNlMjtcbiAgICAgIGF3YWl0IHRlc3RGaWxlQ29udGVudHMoKS5zaG91bGQuZXZlbnR1YWxseS5lcWwoJ2FjYicpO1xuXG4gICAgICAvLyBub3cgcHJvdmUgdGhhdCB3aXRoIGEgbG9jaywgd2UgZG9uJ3QgZ2V0IGFueSBpbnRlcmxvcGVyc1xuICAgICAgY29uc3QgZ3VhcmQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQobG9ja0ZpbGUpO1xuICAgICAgY29uc3QgZ3VhcmRQcm9taXNlMSA9IGd1YXJkKGFzeW5jICgpID0+IGF3YWl0IGd1YXJkZWRCZWhhdmlvcignYicsIDUwMCkpO1xuICAgICAgY29uc3QgZ3VhcmRQcm9taXNlMiA9IGd1YXJkKGFzeW5jICgpID0+IGF3YWl0IGd1YXJkZWRCZWhhdmlvcignYycsIDEwMCkpO1xuICAgICAgYXdhaXQgZ3VhcmRQcm9taXNlMTtcbiAgICAgIGF3YWl0IGd1YXJkUHJvbWlzZTI7XG4gICAgICBhd2FpdCB0ZXN0RmlsZUNvbnRlbnRzKCkuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKCdhY2JiYycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZ3VhcmRlZCBiZWhhdmlvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGd1YXJkID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKGxvY2tGaWxlKTtcbiAgICAgIGNvbnN0IGd1YXJkUHJvbWlzZTEgPSBndWFyZChhc3luYyAoKSA9PiBhd2FpdCBndWFyZGVkQmVoYXZpb3IoJ2hlbGxvJywgNTAwKSk7XG4gICAgICBjb25zdCBndWFyZFByb21pc2UyID0gZ3VhcmQoYXN5bmMgKCkgPT4gYXdhaXQgZ3VhcmRlZEJlaGF2aW9yKCd3b3JsZCcsIDEwMCkpO1xuICAgICAgY29uc3QgcmV0MSA9IGF3YWl0IGd1YXJkUHJvbWlzZTE7XG4gICAgICBjb25zdCByZXQyID0gYXdhaXQgZ3VhcmRQcm9taXNlMjtcbiAgICAgIHJldDEuc2hvdWxkLmVxbCgnaGVsbG8nKTtcbiAgICAgIHJldDIuc2hvdWxkLmVxbCgnd29ybGQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGltZSBvdXQgaWYgdGhlIGxvY2sgaXMgbm90IHJlbGVhc2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy50aW1lb3V0KDUwMDApO1xuICAgICAgY29uc3QgZ3VhcmQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQobG9ja0ZpbGUsIHt0aW1lb3V0OiAwLjV9KTtcbiAgICAgIGNvbnN0IHAxID0gZ3VhcmQoYXN5bmMgKCkgPT4gYXdhaXQgZ3VhcmRlZEJlaGF2aW9yKCdoZWxsbycsIDEyMDApKTtcbiAgICAgIGNvbnN0IHAyID0gZ3VhcmQoYXN5bmMgKCkgPT4gYXdhaXQgZ3VhcmRlZEJlaGF2aW9yKCd3b3JsZCcsIDEwKSk7XG4gICAgICBhd2FpdCBwMi5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL25vdCBhY3F1aXJlIGxvY2svKTtcbiAgICAgIGF3YWl0IHAxLnNob3VsZC5ldmVudHVhbGx5LmVxbCgnaGVsbG8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3RpbGwgcmVsZWFzZSBsb2NrIGlmIGd1YXJkZWQgYmVoYXZpb3IgZmFpbHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnRpbWVvdXQoNTAwMCk7XG4gICAgICBjb25zdCBndWFyZCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChsb2NrRmlsZSk7XG4gICAgICBjb25zdCBwMSA9IGd1YXJkKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg1MDApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCcpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBwMiA9IGd1YXJkKGFzeW5jICgpID0+IGF3YWl0IGd1YXJkZWRCZWhhdmlvcignd29ybGQnLCAxMDApKTtcbiAgICAgIGF3YWl0IHAxLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvYmFkLyk7XG4gICAgICBhd2FpdCBwMi5zaG91bGQuZXZlbnR1YWxseS5lcWwoJ3dvcmxkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG59KTtcbiJdLCJmaWxlIjoidGVzdC91dGlsLWUyZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|