appium 2.0.0-beta.25 → 2.0.0-beta.26

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.
Files changed (124) hide show
  1. package/build/lib/appium-config.schema.json +278 -0
  2. package/build/lib/appium.js +45 -66
  3. package/build/lib/cli/args.js +19 -39
  4. package/build/lib/cli/driver-command.js +5 -9
  5. package/build/lib/cli/extension-command.js +73 -64
  6. package/build/lib/cli/extension.js +10 -23
  7. package/build/lib/cli/parser.js +9 -19
  8. package/build/lib/cli/plugin-command.js +5 -9
  9. package/build/lib/cli/utils.js +2 -4
  10. package/build/lib/config-file.js +2 -4
  11. package/build/lib/config.js +7 -6
  12. package/build/lib/constants.js +60 -0
  13. package/build/lib/extension/driver-config.js +190 -0
  14. package/build/lib/extension/extension-config.js +297 -0
  15. package/build/lib/extension/index.js +77 -0
  16. package/build/lib/extension/manifest.js +246 -0
  17. package/build/lib/extension/package-changed.js +68 -0
  18. package/build/lib/extension/plugin-config.js +87 -0
  19. package/build/lib/grid-register.js +2 -4
  20. package/build/lib/logger.js +2 -4
  21. package/build/lib/logsink.js +2 -4
  22. package/build/lib/main.js +40 -68
  23. package/build/lib/schema/appium-config-schema.js +2 -4
  24. package/build/lib/schema/arg-spec.js +11 -14
  25. package/build/lib/schema/cli-args.js +2 -4
  26. package/build/lib/schema/cli-transformers.js +2 -4
  27. package/build/lib/schema/index.js +2 -4
  28. package/build/lib/schema/keywords.js +2 -4
  29. package/build/lib/schema/schema.js +55 -37
  30. package/build/lib/utils.js +1 -32
  31. package/lib/appium.js +50 -68
  32. package/lib/cli/args.js +19 -23
  33. package/lib/cli/driver-command.js +10 -2
  34. package/lib/cli/extension-command.js +216 -135
  35. package/lib/cli/extension.js +7 -15
  36. package/lib/cli/parser.js +6 -14
  37. package/lib/cli/plugin-command.js +1 -2
  38. package/lib/config-file.js +3 -3
  39. package/lib/config.js +5 -4
  40. package/lib/constants.js +79 -0
  41. package/lib/extension/driver-config.js +230 -0
  42. package/lib/extension/extension-config.js +459 -0
  43. package/lib/extension/index.js +103 -0
  44. package/lib/extension/manifest.js +590 -0
  45. package/lib/extension/package-changed.js +64 -0
  46. package/lib/extension/plugin-config.js +111 -0
  47. package/lib/grid-register.js +4 -4
  48. package/lib/main.js +51 -88
  49. package/lib/schema/arg-spec.js +2 -2
  50. package/lib/schema/cli-args.js +1 -0
  51. package/lib/schema/keywords.js +1 -1
  52. package/lib/schema/schema.js +60 -28
  53. package/lib/utils.js +2 -32
  54. package/package.json +29 -21
  55. package/{postinstall.js → scripts/postinstall.js} +1 -1
  56. package/types/types.d.ts +70 -31
  57. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  58. package/build/check-npm-pack-files.js +0 -23
  59. package/build/commands-yml/parse.js +0 -319
  60. package/build/commands-yml/validator.js +0 -130
  61. package/build/index.js +0 -19
  62. package/build/lib/cli/npm.js +0 -220
  63. package/build/lib/driver-config.js +0 -100
  64. package/build/lib/drivers.js +0 -100
  65. package/build/lib/ext-config-io.js +0 -165
  66. package/build/lib/extension-config.js +0 -320
  67. package/build/lib/plugin-config.js +0 -69
  68. package/build/lib/plugins.js +0 -18
  69. package/build/postinstall.js +0 -90
  70. package/build/test/cli/cli-e2e-specs.js +0 -221
  71. package/build/test/cli/cli-helpers.js +0 -86
  72. package/build/test/cli/cli-specs.js +0 -71
  73. package/build/test/cli/fixtures/test-driver/package.json +0 -27
  74. package/build/test/cli/schema-args-specs.js +0 -48
  75. package/build/test/cli/schema-e2e-specs.js +0 -47
  76. package/build/test/config-e2e-specs.js +0 -112
  77. package/build/test/config-file-e2e-specs.js +0 -191
  78. package/build/test/config-file-specs.js +0 -281
  79. package/build/test/config-specs.js +0 -258
  80. package/build/test/driver-e2e-specs.js +0 -435
  81. package/build/test/driver-specs.js +0 -386
  82. package/build/test/ext-config-io-specs.js +0 -181
  83. package/build/test/extension-config-specs.js +0 -365
  84. package/build/test/fixtures/allow-feat.txt +0 -5
  85. package/build/test/fixtures/caps.json +0 -3
  86. package/build/test/fixtures/config/allow-insecure.txt +0 -3
  87. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
  88. package/build/test/fixtures/config/appium.config.bad.json +0 -32
  89. package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
  90. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
  91. package/build/test/fixtures/config/appium.config.good.js +0 -40
  92. package/build/test/fixtures/config/appium.config.good.json +0 -33
  93. package/build/test/fixtures/config/appium.config.good.yaml +0 -30
  94. package/build/test/fixtures/config/appium.config.invalid.json +0 -31
  95. package/build/test/fixtures/config/appium.config.security-array.json +0 -5
  96. package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
  97. package/build/test/fixtures/config/appium.config.security-path.json +0 -5
  98. package/build/test/fixtures/config/driver-fake.config.json +0 -8
  99. package/build/test/fixtures/config/nodeconfig.json +0 -3
  100. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  101. package/build/test/fixtures/default-args.js +0 -35
  102. package/build/test/fixtures/deny-feat.txt +0 -5
  103. package/build/test/fixtures/driver.schema.js +0 -20
  104. package/build/test/fixtures/extensions.yaml +0 -27
  105. package/build/test/fixtures/flattened-schema.js +0 -532
  106. package/build/test/fixtures/plugin.schema.js +0 -20
  107. package/build/test/fixtures/schema-with-extensions.js +0 -28
  108. package/build/test/grid-register-specs.js +0 -74
  109. package/build/test/helpers.js +0 -75
  110. package/build/test/logger-specs.js +0 -76
  111. package/build/test/npm-specs.js +0 -20
  112. package/build/test/parser-specs.js +0 -319
  113. package/build/test/plugin-e2e-specs.js +0 -316
  114. package/build/test/schema/arg-spec-specs.js +0 -70
  115. package/build/test/schema/cli-args-specs.js +0 -408
  116. package/build/test/schema/schema-specs.js +0 -407
  117. package/build/test/utils-specs.js +0 -288
  118. package/lib/cli/npm.js +0 -251
  119. package/lib/driver-config.js +0 -101
  120. package/lib/drivers.js +0 -84
  121. package/lib/ext-config-io.js +0 -287
  122. package/lib/extension-config.js +0 -366
  123. package/lib/plugin-config.js +0 -63
  124. package/lib/plugins.js +0 -13
@@ -1,281 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _fs = _interopRequireDefault(require("fs"));
8
-
9
- var _sinon = _interopRequireDefault(require("sinon"));
10
-
11
- var _yaml = _interopRequireDefault(require("yaml"));
12
-
13
- var schema = _interopRequireWildcard(require("../lib/schema/schema"));
14
-
15
- var _helpers = require("./helpers");
16
-
17
- 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); }
18
-
19
- 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; }
20
-
21
- const expect = chai.expect;
22
- describe('config-file', function () {
23
- const GOOD_YAML_CONFIG_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.good.yaml');
24
- const GOOD_JSON_CONFIG_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.good.json');
25
- const GOOD_JS_CONFIG_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.good.js');
26
-
27
- const GOOD_YAML_CONFIG = _yaml.default.parse(_fs.default.readFileSync(GOOD_YAML_CONFIG_FILEPATH, 'utf8'));
28
-
29
- const GOOD_JSON_CONFIG = require(GOOD_JSON_CONFIG_FILEPATH);
30
-
31
- const BAD_JSON_CONFIG_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.bad.json');
32
-
33
- const BAD_JSON_CONFIG = require(BAD_JSON_CONFIG_FILEPATH);
34
-
35
- let sandbox;
36
- let readConfigFile;
37
- let lc;
38
- let configFileModule;
39
- let mocks;
40
- before(function () {
41
- schema.finalizeSchema();
42
- });
43
- beforeEach(function () {
44
- sandbox = _sinon.default.createSandbox();
45
- const load = sandbox.stub().resolves({
46
- config: GOOD_JSON_CONFIG,
47
- filepath: GOOD_JSON_CONFIG_FILEPATH
48
- });
49
- load.withArgs(GOOD_YAML_CONFIG_FILEPATH).resolves({
50
- config: GOOD_YAML_CONFIG,
51
- filepath: GOOD_YAML_CONFIG_FILEPATH
52
- });
53
- load.withArgs(BAD_JSON_CONFIG_FILEPATH).resolves({
54
- config: BAD_JSON_CONFIG,
55
- filepath: BAD_JSON_CONFIG_FILEPATH
56
- });
57
- const search = sandbox.stub().resolves({
58
- config: GOOD_JSON_CONFIG,
59
- filepath: GOOD_JSON_CONFIG_FILEPATH
60
- });
61
- lc = {
62
- load,
63
- search
64
- };
65
- mocks = {
66
- lilconfig: {
67
- lilconfig: sandbox.stub().returns(lc)
68
- },
69
- '@sidvind/better-ajv-errors': sandbox.stub().returns('')
70
- };
71
- configFileModule = _helpers.rewiremock.proxy(() => require('../lib/config-file'), mocks);
72
- readConfigFile = configFileModule.readConfigFile;
73
- sandbox.spy(schema, 'validate');
74
- });
75
- afterEach(function () {
76
- sandbox.restore();
77
- });
78
- describe('readConfigFile()', function () {
79
- let result;
80
- it('should support yaml', async function () {
81
- const {
82
- config
83
- } = await readConfigFile(GOOD_YAML_CONFIG_FILEPATH);
84
- expect(config).to.eql(GOOD_JSON_CONFIG);
85
- expect(schema.validate).to.have.been.calledOnce;
86
- });
87
- it('should support json', async function () {
88
- const {
89
- config
90
- } = await readConfigFile(GOOD_JSON_CONFIG_FILEPATH);
91
- expect(config).to.eql(GOOD_JSON_CONFIG);
92
- expect(schema.validate).to.have.been.calledOnce;
93
- });
94
- it('should support js', async function () {
95
- const {
96
- config
97
- } = await readConfigFile(GOOD_JS_CONFIG_FILEPATH);
98
- expect(config).to.eql(GOOD_JSON_CONFIG);
99
- expect(schema.validate).to.have.been.calledOnce;
100
- });
101
- describe('when no filepath provided', function () {
102
- beforeEach(async function () {
103
- result = await readConfigFile();
104
- });
105
- it('should search for a config file', function () {
106
- expect(lc.search).to.have.been.calledOnce;
107
- expect(schema.validate).to.have.been.calledOnce;
108
- });
109
- it('should not try to load a config file directly', function () {
110
- expect(lc.load).to.not.have.been.called;
111
- });
112
- describe('when no config file is found', function () {
113
- beforeEach(async function () {
114
- lc.search.resolves();
115
- schema.validate.resetHistory();
116
- result = await readConfigFile();
117
- });
118
- it('should resolve with an empty object', function () {
119
- expect(result).to.be.an('object').that.is.empty;
120
- expect(schema.validate).not.to.have.been.called;
121
- });
122
- });
123
- describe('when a config file is found', function () {
124
- describe('when the config file is empty', function () {
125
- beforeEach(async function () {
126
- lc.search.resolves({
127
- isEmpty: true,
128
- filepath: '/path/to/file.json',
129
- config: {}
130
- });
131
- result = await readConfigFile();
132
- });
133
- it('should resolve with an object with an `isEmpty` property', function () {
134
- expect(result).to.have.property('isEmpty', true);
135
- });
136
- });
137
- describe('when the config file is not empty', function () {
138
- it('should validate the config against a schema', function () {
139
- expect(schema.validate).to.have.been.calledOnceWith(GOOD_JSON_CONFIG);
140
- });
141
- describe('when the config file is valid', function () {
142
- beforeEach(async function () {
143
- result = await readConfigFile();
144
- });
145
- it('should resolve with an object having `config` property and empty array of errors', function () {
146
- expect(result).to.deep.equal({
147
- config: GOOD_JSON_CONFIG,
148
- errors: [],
149
- filepath: GOOD_JSON_CONFIG_FILEPATH
150
- });
151
- });
152
- });
153
- describe('when the config file is invalid', function () {
154
- beforeEach(function () {
155
- lc.search.resolves({
156
- config: {
157
- foo: 'bar'
158
- },
159
- filepath: '/path/to/file.json'
160
- });
161
- });
162
- beforeEach(async function () {
163
- result = await readConfigFile();
164
- });
165
- it('should resolve with an object having a nonempty array of errors', function () {
166
- expect(result).to.have.property('errors').that.is.not.empty;
167
- });
168
- });
169
- });
170
- });
171
- });
172
- describe('when filepath provided', function () {
173
- beforeEach(async function () {
174
- result = await readConfigFile('appium.json');
175
- });
176
- it('should not attempt to find a config file', function () {
177
- expect(lc.search).to.not.have.been.called;
178
- });
179
- it('should try to load a config file directly', function () {
180
- expect(lc.load).to.have.been.calledOnce;
181
- });
182
- describe('when no config file exists at path', function () {
183
- beforeEach(function () {
184
- lc.load.rejects(Object.assign(new Error(), {
185
- code: 'ENOENT'
186
- }));
187
- });
188
- it('should reject with user-friendly message', async function () {
189
- await expect(readConfigFile('appium.json')).to.be.rejectedWith(/not found at user-provided path/);
190
- });
191
- });
192
- describe('when the config file is invalid JSON', function () {
193
- beforeEach(function () {
194
- lc.load.rejects(new SyntaxError());
195
- });
196
- it('should reject with user-friendly message', async function () {
197
- await expect(readConfigFile('appium.json')).to.be.rejectedWith(/Config file at user-provided path appium.json is invalid/);
198
- });
199
- });
200
- describe('when something else is wrong with loading the config file', function () {
201
- beforeEach(function () {
202
- lc.load.rejects(new Error('guru meditation'));
203
- });
204
- it('should pass error through', async function () {
205
- await expect(readConfigFile('appium.json')).to.be.rejectedWith(/guru meditation/);
206
- });
207
- });
208
- describe('when a config file is found', function () {
209
- describe('when the config file is empty', function () {
210
- beforeEach(async function () {
211
- lc.search.resolves({
212
- isEmpty: true,
213
- filepath: '/path/to/file.json',
214
- config: {}
215
- });
216
- result = await readConfigFile();
217
- });
218
- it('should resolve with an object with an `isEmpty` property', function () {
219
- expect(result).to.have.property('isEmpty', true);
220
- });
221
- });
222
- describe('when the config file is not empty', function () {
223
- it('should validate the config against a schema', function () {
224
- expect(schema.validate).to.have.been.calledOnceWith(GOOD_JSON_CONFIG);
225
- });
226
- describe('when the config file is valid', function () {
227
- beforeEach(async function () {
228
- result = await readConfigFile();
229
- });
230
- it('should resolve with an object having `config` property and empty array of errors', function () {
231
- expect(result).to.deep.equal({
232
- errors: [],
233
- config: GOOD_JSON_CONFIG,
234
- filepath: GOOD_JSON_CONFIG_FILEPATH
235
- });
236
- });
237
- });
238
- describe('when the config file is invalid', function () {
239
- beforeEach(async function () {
240
- result = await readConfigFile(BAD_JSON_CONFIG_FILEPATH);
241
- });
242
- it('should resolve with an object having a nonempty array of errors', function () {
243
- expect(result).to.have.property('errors').that.is.not.empty;
244
- });
245
- });
246
- });
247
- });
248
- });
249
- });
250
- describe('formatErrors()', function () {
251
- describe('when provided `errors` as an empty array', function () {
252
- it('should throw', function () {
253
- expect(() => configFileModule.formatErrors([])).to.throw(TypeError, 'Array of errors must be non-empty');
254
- });
255
- });
256
- describe('when provided `errors` as `undefined`', function () {
257
- it('should throw', function () {
258
- expect(() => configFileModule.formatErrors()).to.throw(TypeError, 'Array of errors must be non-empty');
259
- });
260
- });
261
- describe('when provided `errors` as a non-empty array', function () {
262
- it('should return a string', function () {
263
- expect(configFileModule.formatErrors([{}])).to.be.a('string');
264
- });
265
- });
266
- describe('when `opts.json` is a string', function () {
267
- it('should call `betterAjvErrors()` with option `json: opts.json`', function () {
268
- configFileModule.formatErrors([{}], {}, {
269
- json: '{"foo": "bar"}'
270
- });
271
- expect(mocks['@sidvind/better-ajv-errors']).to.have.been.calledWith(schema.getSchema(), {}, [{}], {
272
- format: 'cli',
273
- json: '{"foo": "bar"}'
274
- });
275
- });
276
- });
277
- });
278
- });require('source-map-support').install();
279
-
280
-
281
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLWZpbGUtc3BlY3MuanMiXSwibmFtZXMiOlsiZXhwZWN0IiwiY2hhaSIsImRlc2NyaWJlIiwiR09PRF9ZQU1MX0NPTkZJR19GSUxFUEFUSCIsIkdPT0RfSlNPTl9DT05GSUdfRklMRVBBVEgiLCJHT09EX0pTX0NPTkZJR19GSUxFUEFUSCIsIkdPT0RfWUFNTF9DT05GSUciLCJZQU1MIiwicGFyc2UiLCJmcyIsInJlYWRGaWxlU3luYyIsIkdPT0RfSlNPTl9DT05GSUciLCJyZXF1aXJlIiwiQkFEX0pTT05fQ09ORklHX0ZJTEVQQVRIIiwiQkFEX0pTT05fQ09ORklHIiwic2FuZGJveCIsInJlYWRDb25maWdGaWxlIiwibGMiLCJjb25maWdGaWxlTW9kdWxlIiwibW9ja3MiLCJiZWZvcmUiLCJzY2hlbWEiLCJmaW5hbGl6ZVNjaGVtYSIsImJlZm9yZUVhY2giLCJzaW5vbiIsImNyZWF0ZVNhbmRib3giLCJsb2FkIiwic3R1YiIsInJlc29sdmVzIiwiY29uZmlnIiwiZmlsZXBhdGgiLCJ3aXRoQXJncyIsInNlYXJjaCIsImxpbGNvbmZpZyIsInJldHVybnMiLCJyZXdpcmVtb2NrIiwicHJveHkiLCJzcHkiLCJhZnRlckVhY2giLCJyZXN0b3JlIiwicmVzdWx0IiwiaXQiLCJ0byIsImVxbCIsInZhbGlkYXRlIiwiaGF2ZSIsImJlZW4iLCJjYWxsZWRPbmNlIiwibm90IiwiY2FsbGVkIiwicmVzZXRIaXN0b3J5IiwiYmUiLCJhbiIsInRoYXQiLCJpcyIsImVtcHR5IiwiaXNFbXB0eSIsInByb3BlcnR5IiwiY2FsbGVkT25jZVdpdGgiLCJkZWVwIiwiZXF1YWwiLCJlcnJvcnMiLCJmb28iLCJyZWplY3RzIiwiT2JqZWN0IiwiYXNzaWduIiwiRXJyb3IiLCJjb2RlIiwicmVqZWN0ZWRXaXRoIiwiU3ludGF4RXJyb3IiLCJmb3JtYXRFcnJvcnMiLCJ0aHJvdyIsIlR5cGVFcnJvciIsImEiLCJqc29uIiwiY2FsbGVkV2l0aCIsImdldFNjaGVtYSIs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QUFBQSxNQUFNLENBQUNrQixnQkFBZ0IsQ0FBQ29ELFlBQWpCLENBQThCLENBQUMsRUFBRCxDQUE5QixDQUFELENBQU4sQ0FBNEM1QixFQUE1QyxDQUErQ1MsRUFBL0MsQ0FBa0RzQixDQUFsRCxDQUFvRCxRQUFwRDtBQUNELE9BSEMsQ0FBRjtBQUlELEtBTE8sQ0FBUjtBQU9BdkUsSUFBQUEsUUFBUSxDQUFDLDhCQUFELEVBQWlDLFlBQVk7QUFDbkR1QyxNQUFBQSxFQUFFLENBQUMsK0RBQUQsRUFBa0UsWUFBWTtBQUU5RXZCLFFBQUFBLGdCQUFnQixDQUFDb0QsWUFBakIsQ0FBOEIsQ0FBQyxFQUFELENBQTlCLEVBQW9DLEVBQXBDLEVBQXdDO0FBQUNJLFVBQUFBLElBQUksRUFBRTtBQUFQLFNBQXhDO0FBQ0ExRSxRQUFBQSxNQUFNLENBQUNtQixLQUFLLENBQUMsNEJBQUQsQ0FBTixDQUFOLENBQTRDdUIsRUFBNUMsQ0FBK0NHLElBQS9DLENBQW9EQyxJQUFwRCxDQUF5RDZCLFVBQXpELENBQ0V0RCxNQUFNLENBQUN1RCxTQUFQLEVBREYsRUFFRSxFQUZGLEVBR0UsQ0FBQyxFQUFELENBSEYsRUFJRTtBQUFDQyxVQUFBQSxNQUFNLEVBQUUsS0FBVDtBQUFnQkgsVUFBQUEsSUFBSSxFQUFFO0FBQXRCLFNBSkY7QUFNRCxPQVRDLENBQUY7QUFVRCxLQVhPLENBQVI7QUFZRCxHQXZDTyxDQUFSO0FBd0NELENBbldPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcbmltcG9ydCAqIGFzIHNjaGVtYSBmcm9tICcuLi9saWIvc2NoZW1hL3NjaGVtYSc7XG5pbXBvcnQgeyByZXNvbHZlRml4dHVyZSwgcmV3aXJlbW9jayB9IGZyb20gJy4vaGVscGVycyc7XG5cbmNvbnN0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuXG5kZXNjcmliZSgnY29uZmlnLWZpbGUnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEdPT0RfWUFNTF9DT05GSUdfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5nb29kLnlhbWwnLFxuICApO1xuICBjb25zdCBHT09EX0pTT05fQ09ORklHX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoXG4gICAgJ2NvbmZpZycsXG4gICAgJ2FwcGl1bS5jb25maWcuZ29vZC5qc29uJyxcbiAgKTtcbiAgY29uc3QgR09PRF9KU19DT05GSUdfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZSgnY29uZmlnJywgJ2FwcGl1bS5jb25maWcuZ29vZC5qcycpO1xuICBjb25zdCBHT09EX1lBTUxfQ09ORklHID0gWUFNTC5wYXJzZShcbiAgICBmcy5yZWFkRmlsZVN5bmMoR09PRF9ZQU1MX0NPTkZJR19GSUxFUEFUSCwgJ3V0ZjgnKSxcbiAgKTtcbiAgY29uc3QgR09PRF9KU09OX0NPTkZJRyA9IHJlcXVpcmUoR09PRF9KU09OX0NPTkZJR19GSUxFUEFUSCk7XG4gIGNvbnN0IEJBRF9KU09OX0NPTkZJR19GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLmJhZC5qc29uJyxcbiAgKTtcbiAgY29uc3QgQkFEX0pTT05fQ09ORklHID0gcmVxdWlyZShCQURfSlNPTl9DT05GSUdfRklMRVBBVEgpO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU2FuZGJveH1cbiAgICovXG4gIGxldCBzYW5kYm94O1xuXG4gIC8qKlxuICAgKiBgcmVhZENvbmZpZ0ZpbGUoKWAgZnJvbSBhbiBpc29sYXRlZCBgY29uZmlnLWZpbGVgIG1vZHVsZVxuICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi4vbGliL2NvbmZpZy1maWxlJykucmVhZENvbmZpZ0ZpbGV9XG4gICAqL1xuICBsZXQgcmVhZENvbmZpZ0ZpbGU7XG4gIC8qKlxuICAgKiBNb2NrIGluc3RhbmNlIG9mIGBsaWxjb25maWdgIGNvbnRhaW5pbmcgc3R1YnMgZm9yXG4gICAqIGBsaWxjb25maWcjc2VhcmNoKClgIGFuZCBgbGlsY29uZmlnI2xvYWRgLlxuICAgKiBOb3QgX2FjdHVhbGx5XyBhIGBTaW5vblN0dWJiZWRJbnN0YW5jZWAsIGJ1dCBkdWNrLXR5cGVkLlxuICAgKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU3R1YmJlZEluc3RhbmNlPFJldHVyblR5cGU8aW1wb3J0KCdsaWxjb25maWcnKS5saWxjb25maWc+Pn1cbiAgICovXG4gIGxldCBsYztcblxuICAvKipcbiAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4uL2xpYi9jb25maWctZmlsZScpfVxuICAgKi9cbiAgbGV0IGNvbmZpZ0ZpbGVNb2R1bGU7XG5cbiAgbGV0IG1vY2tzO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgLy8gZ2VuZXJhbGx5IGNhbGxlZCB2aWEgdGhlIENMSSBwYXJzZXIsIHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBtYW51YWxseSBpbiB0ZXN0cy5cbiAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIF9lYWNoXyB0ZXN0LCBiZWNhdXNlIHdlJ3JlIG5vdCBjaGFuZ2luZyB0aGUgc2NoZW1hLlxuICAgIC8vIGlmIHdlIGRpZCBjaGFuZ2UgdGhlIHNjaGVtYSwgdGhpcyB3b3VsZCBuZWVkIHRvIGJlIGluIGBiZWZvcmVFYWNoKClgIGFuZCBgYWZ0ZXJFYWNoKClgXG4gICAgLy8gd291bGQgbmVlZCB0byBjYWxsIGBzY2hlbWEucmVzZXQoKWAuXG4gICAgc2NoZW1hLmZpbmFsaXplU2NoZW1hKCk7XG4gIH0pO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG5cbiAgICAvLyB3ZSBoYXZlIHRvIG1hbnVhbGx5IHR5cGUgdGhpcyAoYW5kIGBzZWFyY2goKWApIGJlY2F1c2Ugd2UnZCBvbmx5IGdldCB0aGUgcmVhbCB0eXBlXG4gICAgLy8gd2hlbiBzdHViYmluZyBhbiBvYmplY3QgcHJvcDsgZS5nLiwgYHN0dWIobGlsY29uZmlnLCAnbG9hZCcpYFxuICAgIGNvbnN0IGxvYWQgPSAvKiogQHR5cGUge0FzeW5jU2VhcmNoZXJMb2FkU3R1Yn0gKi8gKFxuICAgICAgc2FuZGJveC5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICBjb25maWc6IEdPT0RfSlNPTl9DT05GSUcsXG4gICAgICAgIGZpbGVwYXRoOiBHT09EX0pTT05fQ09ORklHX0ZJTEVQQVRILFxuICAgICAgfSlcbiAgICApO1xuICAgIGxvYWQud2l0aEFyZ3MoR09PRF9ZQU1MX0NPTkZJR19GSUxFUEFUSCkucmVzb2x2ZXMoe1xuICAgICAgY29uZmlnOiBHT09EX1lBTUxfQ09ORklHLFxuICAgICAgZmlsZXBhdGg6IEdPT0RfWUFNTF9DT05GSUdfRklMRVBBVEgsXG4gICAgfSk7XG4gICAgbG9hZC53aXRoQXJncyhCQURfSlNPTl9DT05GSUdfRklMRVBBVEgpLnJlc29sdmVzKHtcbiAgICAgIGNvbmZpZzogQkFEX0pTT05fQ09ORklHLFxuICAgICAgZmlsZXBhdGg6IEJBRF9KU09OX0NPTkZJR19GSUxFUEFUSCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNlYXJjaCA9IC8qKiBAdHlwZSB7QXN5bmNTZWFyY2hlckxvYWRTdHVifSAqLyAoXG4gICAgICBzYW5kYm94LnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgIGNvbmZpZzogR09PRF9KU09OX0NPTkZJRyxcbiAgICAgICAgZmlsZXBhdGg6IEdPT0RfSlNPTl9DT05GSUdfRklMRVBBVEgsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBsYyA9IHtcbiAgICAgIGxvYWQsXG4gICAgICBzZWFyY2gsXG4gICAgfTtcblxuICAgIG1vY2tzID0ge1xuICAgICAgbGlsY29uZmlnOiB7XG4gICAgICAgIGxpbGNvbmZpZzogc2FuZGJveC5zdHViKCkucmV0dXJucyhsYyksXG4gICAgICB9LFxuICAgICAgJ0BzaWR2aW5kL2JldHRlci1hanYtZXJyb3JzJzogc2FuZGJveC5zdHViKCkucmV0dXJucygnJyksXG4gICAgfTtcblxuICAgIC8vIGxvYWRzIHRoZSBgY29uZmlnLWZpbGVgIG1vZHVsZSB1c2luZyB0aGUgbGlsY29uZmlnIG1vY2suXG4gICAgLy8gd2Ugb25seSBtb2NrIGxpbGNvbmZpZyBiZWNhdXNlIGl0J2Qgb3RoZXJ3aXNlIGJlIGEgcGFpbiBpbiB0aGUgcmVhciB0byB0ZXN0XG4gICAgLy8gc2VhcmNoaW5nIGZvciBjb25maWcgZmlsZXMsIGFuZCBpdCBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2QgdGhhdCB3ZSdkIGxvYWQgdGhlIHdyb25nIGZpbGUuXG4gICAgY29uZmlnRmlsZU1vZHVsZSA9IHJld2lyZW1vY2sucHJveHkoKCkgPT4gcmVxdWlyZSgnLi4vbGliL2NvbmZpZy1maWxlJyksIG1vY2tzKTtcbiAgICByZWFkQ29uZmlnRmlsZSA9IGNvbmZpZ0ZpbGVNb2R1bGUucmVhZENvbmZpZ0ZpbGU7XG5cbiAgICAvLyBqdXN0IHdhbnQgdG8gYmUgZXh0cmEtc3VyZSBgdmFsaWRhdGUoKWAgaGFwcGVuc1xuICAgIHNhbmRib3guc3B5KHNjaGVtYSwgJ3ZhbGlkYXRlJyk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWFkQ29uZmlnRmlsZSgpJywgZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtpbXBvcnQoJy4uL2xpYi9jb25maWctZmlsZScpLlJlYWRDb25maWdGaWxlUmVzdWx0fVxuICAgICAqL1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgeWFtbCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHtjb25maWd9ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoR09PRF9ZQU1MX0NPTkZJR19GSUxFUEFUSCk7XG4gICAgICBleHBlY3QoY29uZmlnKS50by5lcWwoR09PRF9KU09OX0NPTkZJRyk7XG4gICAgICBleHBlY3Qoc2NoZW1hLnZhbGlkYXRlKS50by5oYXZlLmJlZW4uY2FsbGVkT25jZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VwcG9ydCBqc29uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qge2NvbmZpZ30gPSBhd2FpdCByZWFkQ29uZmlnRmlsZShHT09EX0pTT05fQ09ORklHX0ZJTEVQQVRIKTtcbiAgICAgIGV4cGVjdChjb25maWcpLnRvLmVxbChHT09EX0pTT05fQ09ORklHKTtcbiAgICAgIGV4cGVjdChzY2hlbWEudmFsaWRhdGUpLnRvLmhhdmUuYmVlbi5jYWxsZWRPbmNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdXBwb3J0IGpzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qge2NvbmZpZ30gPSBhd2FpdCByZWFkQ29uZmlnRmlsZShHT09EX0pTX0NPTkZJR19GSUxFUEFUSCk7XG4gICAgICBleHBlY3QoY29uZmlnKS50by5lcWwoR09PRF9KU09OX0NPTkZJRyk7XG4gICAgICBleHBlY3Qoc2NoZW1hLnZhbGlkYXRlKS50by5oYXZlLmJlZW4uY2FsbGVkT25jZTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIG5vIGZpbGVwYXRoIHByb3ZpZGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzZWFyY2ggZm9yIGEgY29uZmlnIGZpbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChsYy5zZWFyY2gpLnRvLmhhdmUuYmVlbi5jYWxsZWRPbmNlO1xuICAgICAgICBleHBlY3Qoc2NoZW1hLnZhbGlkYXRlKS50by5oYXZlLmJlZW4uY2FsbGVkT25jZTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0cnkgdG8gbG9hZCBhIGNvbmZpZyBmaWxlIGRpcmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobGMubG9hZCkudG8ubm90LmhhdmUuYmVlbi5jYWxsZWQ7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3doZW4gbm8gY29uZmlnIGZpbGUgaXMgZm91bmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxjLnNlYXJjaC5yZXNvbHZlcygpO1xuICAgICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU3BpZWRNZW1iZXI8dHlwZW9mIHNjaGVtYS52YWxpZGF0ZT59ICovKHNjaGVtYS52YWxpZGF0ZSkucmVzZXRIaXN0b3J5KCk7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXNvbHZlIHdpdGggYW4gZW1wdHkgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmJlLmFuKCdvYmplY3QnKS50aGF0LmlzLmVtcHR5O1xuICAgICAgICAgIGV4cGVjdChzY2hlbWEudmFsaWRhdGUpLm5vdC50by5oYXZlLmJlZW4uY2FsbGVkO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnd2hlbiBhIGNvbmZpZyBmaWxlIGlzIGZvdW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsYy5zZWFyY2gucmVzb2x2ZXMoe1xuICAgICAgICAgICAgICBpc0VtcHR5OiB0cnVlLFxuICAgICAgICAgICAgICBmaWxlcGF0aDogJy9wYXRoL3RvL2ZpbGUuanNvbicsXG4gICAgICAgICAgICAgIGNvbmZpZzoge30sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSB3aXRoIGFuIG9iamVjdCB3aXRoIGFuIGBpc0VtcHR5YCBwcm9wZXJ0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmhhdmUucHJvcGVydHkoJ2lzRW1wdHknLCB0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3doZW4gdGhlIGNvbmZpZyBmaWxlIGlzIG5vdCBlbXB0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRoZSBjb25maWcgYWdhaW5zdCBhIHNjaGVtYScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChzY2hlbWEudmFsaWRhdGUpLnRvLmhhdmUuYmVlbi5jYWxsZWRPbmNlV2l0aChcbiAgICAgICAgICAgICAgR09PRF9KU09OX0NPTkZJRyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgdmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHJlc29sdmUgd2l0aCBhbiBvYmplY3QgaGF2aW5nIGBjb25maWdgIHByb3BlcnR5IGFuZCBlbXB0eSBhcnJheSBvZiBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICAgICAgICAgIGNvbmZpZzogR09PRF9KU09OX0NPTkZJRyxcbiAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgICAgICAgIGZpbGVwYXRoOiBHT09EX0pTT05fQ09ORklHX0ZJTEVQQVRILFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZGVzY3JpYmUoJ3doZW4gdGhlIGNvbmZpZyBmaWxlIGlzIGludmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgbGMuc2VhcmNoLnJlc29sdmVzKHtcbiAgICAgICAgICAgICAgICBjb25maWc6IHtmb286ICdiYXInfSxcbiAgICAgICAgICAgICAgICBmaWxlcGF0aDogJy9wYXRoL3RvL2ZpbGUuanNvbicsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSB3aXRoIGFuIG9iamVjdCBoYXZpbmcgYSBub25lbXB0eSBhcnJheSBvZiBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmhhdmUucHJvcGVydHkoJ2Vycm9ycycpLnRoYXQuaXMubm90LmVtcHR5O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBmaWxlcGF0aCBwcm92aWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZSgnYXBwaXVtLmpzb24nKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGZpbmQgYSBjb25maWcgZmlsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KGxjLnNlYXJjaCkudG8ubm90LmhhdmUuYmVlbi5jYWxsZWQ7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0cnkgdG8gbG9hZCBhIGNvbmZpZyBmaWxlIGRpcmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobGMubG9hZCkudG8uaGF2ZS5iZWVuLmNhbGxlZE9uY2U7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3doZW4gbm8gY29uZmlnIGZpbGUgZXhpc3RzIGF0IHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxjLmxvYWQucmVqZWN0cyhPYmplY3QuYXNzaWduKG5ldyBFcnJvcigpLCB7Y29kZTogJ0VOT0VOVCd9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmVqZWN0IHdpdGggdXNlci1mcmllbmRseSBtZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGV4cGVjdChyZWFkQ29uZmlnRmlsZSgnYXBwaXVtLmpzb24nKSkudG8uYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICAgL25vdCBmb3VuZCBhdCB1c2VyLXByb3ZpZGVkIHBhdGgvLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBjb25maWcgZmlsZSBpcyBpbnZhbGlkIEpTT04nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxjLmxvYWQucmVqZWN0cyhuZXcgU3ludGF4RXJyb3IoKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmVqZWN0IHdpdGggdXNlci1mcmllbmRseSBtZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGV4cGVjdChyZWFkQ29uZmlnRmlsZSgnYXBwaXVtLmpzb24nKSkudG8uYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICAgL0NvbmZpZyBmaWxlIGF0IHVzZXItcHJvdmlkZWQgcGF0aCBhcHBpdW0uanNvbiBpcyBpbnZhbGlkLyxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnd2hlbiBzb21ldGhpbmcgZWxzZSBpcyB3cm9uZyB3aXRoIGxvYWRpbmcgdGhlIGNvbmZpZyBmaWxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsYy5sb2FkLnJlamVjdHMobmV3IEVycm9yKCdndXJ1IG1lZGl0YXRpb24nKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcGFzcyBlcnJvciB0aHJvdWdoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGV4cGVjdChyZWFkQ29uZmlnRmlsZSgnYXBwaXVtLmpzb24nKSkudG8uYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICAgL2d1cnUgbWVkaXRhdGlvbi8sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3doZW4gYSBjb25maWcgZmlsZSBpcyBmb3VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVzY3JpYmUoJ3doZW4gdGhlIGNvbmZpZyBmaWxlIGlzIGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGMuc2VhcmNoLnJlc29sdmVzKHtcbiAgICAgICAgICAgICAgaXNFbXB0eTogdHJ1ZSxcbiAgICAgICAgICAgICAgZmlsZXBhdGg6ICcvcGF0aC90by9maWxlLmpzb24nLFxuICAgICAgICAgICAgICBjb25maWc6IHt9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXNvbHZlIHdpdGggYW4gb2JqZWN0IHdpdGggYW4gYGlzRW1wdHlgIHByb3BlcnR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uaGF2ZS5wcm9wZXJ0eSgnaXNFbXB0eScsIHRydWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgbm90IGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdGhlIGNvbmZpZyBhZ2FpbnN0IGEgc2NoZW1hJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHNjaGVtYS52YWxpZGF0ZSkudG8uaGF2ZS5iZWVuLmNhbGxlZE9uY2VXaXRoKFxuICAgICAgICAgICAgICBHT09EX0pTT05fQ09ORklHLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBjb25maWcgZmlsZSBpcyB2YWxpZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSB3aXRoIGFuIG9iamVjdCBoYXZpbmcgYGNvbmZpZ2AgcHJvcGVydHkgYW5kIGVtcHR5IGFycmF5IG9mIGVycm9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICAgICAgICBjb25maWc6IEdPT0RfSlNPTl9DT05GSUcsXG4gICAgICAgICAgICAgICAgZmlsZXBhdGg6IEdPT0RfSlNPTl9DT05GSUdfRklMRVBBVEgsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgaW52YWxpZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShCQURfSlNPTl9DT05GSUdfRklMRVBBVEgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSB3aXRoIGFuIG9iamVjdCBoYXZpbmcgYSBub25lbXB0eSBhcnJheSBvZiBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmhhdmUucHJvcGVydHkoJ2Vycm9ycycpLnRoYXQuaXMubm90LmVtcHR5O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmb3JtYXRFcnJvcnMoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBgZXJyb3JzYCBhcyBhbiBlbXB0eSBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdCgoKSA9PiBjb25maWdGaWxlTW9kdWxlLmZvcm1hdEVycm9ycyhbXSkpLnRvLnRocm93KFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICAnQXJyYXkgb2YgZXJyb3JzIG11c3QgYmUgbm9uLWVtcHR5JyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gcHJvdmlkZWQgYGVycm9yc2AgYXMgYHVuZGVmaW5lZGAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGV4cGVjdCgoKSA9PiBjb25maWdGaWxlTW9kdWxlLmZvcm1hdEVycm9ycygpKS50by50aHJvdyhcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgJ0FycmF5IG9mIGVycm9ycyBtdXN0IGJlIG5vbi1lbXB0eScsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGBlcnJvcnNgIGFzIGEgbm9uLWVtcHR5IGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXhwZWN0KGNvbmZpZ0ZpbGVNb2R1bGUuZm9ybWF0RXJyb3JzKFt7fV0pKS50by5iZS5hKCdzdHJpbmcnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gYG9wdHMuanNvbmAgaXMgYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGNhbGwgYGJldHRlckFqdkVycm9ycygpYCB3aXRoIG9wdGlvbiBganNvbjogb3B0cy5qc29uYCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25maWdGaWxlTW9kdWxlLmZvcm1hdEVycm9ycyhbe31dLCB7fSwge2pzb246ICd7XCJmb29cIjogXCJiYXJcIn0nfSk7XG4gICAgICAgIGV4cGVjdChtb2Nrc1snQHNpZHZpbmQvYmV0dGVyLWFqdi1lcnJvcnMnXSkudG8uaGF2ZS5iZWVuLmNhbGxlZFdpdGgoXG4gICAgICAgICAgc2NoZW1hLmdldFNjaGVtYSgpLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFt7fV0sXG4gICAgICAgICAge2Zvcm1hdDogJ2NsaScsIGpzb246ICd7XCJmb29cIjogXCJiYXJcIn0nfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG4vLyB0aGUgZm9sbG93aW5nIGFyZSBqdXN0IGFsaWFzZXNcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhanYnKS5FcnJvck9iamVjdH0gRXJyb3JPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FqdicpLlZhbGlkYXRlRnVuY3Rpb259IFZhbGlkYXRlRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ3Npbm9uJykuU2lub25TdHViYmVkTWVtYmVyPFJldHVyblR5cGU8aW1wb3J0KCdsaWxjb25maWcnKS5saWxjb25maWc+Wydsb2FkJ10+fSBBc3luY1NlYXJjaGVyTG9hZFN0dWJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ3Npbm9uJykuU2lub25TdHViYmVkTWVtYmVyPFJldHVyblR5cGU8aW1wb3J0KCdsaWxjb25maWcnKS5saWxjb25maWc+WydzZWFyY2gnXT59IEFzeW5jU2VhcmNoZXJTZWFyY2hTdHViXG4gKi9cbiJdLCJmaWxlIjoidGVzdC9jb25maWctZmlsZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
@@ -1,258 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _lodash = _interopRequireDefault(require("lodash"));
8
-
9
- var _sinon = _interopRequireDefault(require("sinon"));
10
-
11
- var _parser = _interopRequireDefault(require("../lib/cli/parser"));
12
-
13
- var _config = require("../lib/config");
14
-
15
- var _logger = _interopRequireDefault(require("../lib/logger"));
16
-
17
- var _schema = require("../lib/schema/schema");
18
-
19
- describe('Config', function () {
20
- let sandbox;
21
- beforeEach(function () {
22
- sandbox = _sinon.default.createSandbox();
23
- });
24
- afterEach(function () {
25
- sandbox.restore();
26
- });
27
- describe('Appium config', function () {
28
- let log;
29
- let dir;
30
- beforeEach(function () {
31
- log = sandbox.spy(console, 'log');
32
- dir = sandbox.spy(console, 'dir');
33
- });
34
- describe('showBuildInfo()', function () {
35
- it('should log build info to console', async function () {
36
- const config = (0, _config.getBuildInfo)();
37
- await (0, _config.showBuildInfo)();
38
- log.should.have.been.calledOnce;
39
- log.firstCall.args.should.contain(JSON.stringify(config));
40
- });
41
- });
42
- describe('showConfig()', function () {
43
- describe('when a config file is present', function () {
44
- it('should dump the current Appium config', function () {
45
- (0, _config.showConfig)({
46
- address: 'bar'
47
- }, {
48
- config: {
49
- server: {
50
- callbackAddress: 'quux'
51
- }
52
- }
53
- }, {
54
- port: 1234
55
- }, {
56
- allowCors: false
57
- });
58
- log.should.have.been.calledWith('Appium Configuration\n');
59
- });
60
- it('should skip empty objects', function () {
61
- (0, _config.showConfig)({
62
- foo: 'bar',
63
- cows: {},
64
- pigs: [],
65
- sheep: 0,
66
- ducks: false
67
- }, {
68
- config: {
69
- server: {
70
- address: 'quux'
71
- }
72
- }
73
- }, {
74
- spam: 'food'
75
- }, {});
76
- dir.should.have.been.calledWith({
77
- foo: 'bar',
78
- sheep: 0,
79
- ducks: false
80
- });
81
- });
82
- });
83
- describe('when a config file is not present', function () {
84
- it('should dump the current Appium config (sans config file contents)', function () {
85
- (0, _config.showConfig)({
86
- foo: 'bar',
87
- cows: {},
88
- pigs: [],
89
- sheep: 0,
90
- ducks: false
91
- }, {}, {
92
- spam: 'food'
93
- }, {});
94
- log.should.have.been.calledWith('\n(no configuration file loaded)');
95
- });
96
- });
97
- describe('when no CLI arguments (other than --show-config) provided', function () {
98
- it('should not dump CLI args', function () {
99
- (0, _config.showConfig)({}, {}, {}, {});
100
- log.should.have.been.calledWith('\n(no CLI parameters provided)');
101
- });
102
- });
103
- });
104
- });
105
- describe('node.js config', function () {
106
- let _process = process;
107
- before(function () {
108
- process = { ...process
109
- };
110
- });
111
- after(function () {
112
- process = _process;
113
- });
114
- describe('checkNodeOk', function () {
115
- describe('unsupported nodes', function () {
116
- const unsupportedVersions = ['v0.1', 'v0.9.12', 'v0.10.36', 'v0.12.14', 'v4.4.7', 'v5.7.0', 'v6.3.1', 'v7.1.1', 'v8.0.0', 'v9.2.3', 'v10.1.0'];
117
-
118
- for (const version of unsupportedVersions) {
119
- it(`should fail if node is ${version}`, function () {
120
- process.version = version;
121
-
122
- _config.checkNodeOk.should.throw();
123
- });
124
- }
125
- });
126
- describe('supported nodes', function () {
127
- it('should succeed if node is 12+', function () {
128
- process.version = 'v12.0.1';
129
-
130
- _config.checkNodeOk.should.not.throw();
131
- });
132
- it('should succeed if node is 13+', function () {
133
- process.version = 'v13.6.0';
134
-
135
- _config.checkNodeOk.should.not.throw();
136
- });
137
- it('should succeed if node is 14+', function () {
138
- process.version = 'v14.0.0';
139
-
140
- _config.checkNodeOk.should.not.throw();
141
- });
142
- });
143
- });
144
- describe('warnNodeDeprecations', function () {
145
- let spy;
146
- before(function () {
147
- spy = sandbox.spy(_logger.default, 'warn');
148
- });
149
- beforeEach(function () {
150
- spy.resetHistory();
151
- });
152
- it('should not log a warning if node is 8+', function () {
153
- process.version = 'v8.0.0';
154
- (0, _config.warnNodeDeprecations)();
155
-
156
- _logger.default.warn.callCount.should.equal(0);
157
- });
158
- it('should not log a warning if node is 9+', function () {
159
- process.version = 'v9.0.0';
160
- (0, _config.warnNodeDeprecations)();
161
-
162
- _logger.default.warn.callCount.should.equal(0);
163
- });
164
- });
165
- });
166
- describe('server arguments', function () {
167
- let args;
168
- describe('getNonDefaultServerArgs', function () {
169
- describe('without extension schemas', function () {
170
- beforeEach(async function () {
171
- await (0, _parser.default)(true);
172
- args = (0, _schema.getDefaultsForSchema)();
173
- });
174
- it('should show none if we have all the defaults', function () {
175
- let nonDefaultArgs = (0, _config.getNonDefaultServerArgs)(args);
176
- nonDefaultArgs.should.be.empty;
177
- });
178
- it('should catch a non-default argument', function () {
179
- args.allowCors = true;
180
- let nonDefaultArgs = (0, _config.getNonDefaultServerArgs)(args);
181
- nonDefaultArgs.should.eql({
182
- allowCors: true
183
- });
184
- });
185
- describe('when arg is an array', function () {
186
- it('should return the arg as an array', function () {
187
- args.usePlugins = ['all'];
188
- (0, _config.getNonDefaultServerArgs)(args).should.eql({
189
- usePlugins: ['all']
190
- });
191
- });
192
- });
193
- });
194
- describe('with extension schemas', function () {
195
- beforeEach(async function () {
196
- (0, _schema.resetSchema)();
197
- (0, _schema.registerSchema)('plugin', 'crypto-fiend', {
198
- type: 'object',
199
- properties: {
200
- elite: {
201
- type: 'boolean',
202
- default: true
203
- }
204
- }
205
- });
206
- (0, _schema.finalizeSchema)();
207
- await (0, _parser.default)(true);
208
- args = (0, _schema.getDefaultsForSchema)();
209
- });
210
- it('should take extension schemas into account', function () {
211
- const nonDefaultArgs = (0, _config.getNonDefaultServerArgs)(args);
212
- nonDefaultArgs.should.be.empty;
213
- });
214
- it('should catch a non-default argument', function () {
215
- args['plugin.crypto-fiend.elite'] = false;
216
- const nonDefaultArgs = (0, _config.getNonDefaultServerArgs)(args);
217
- nonDefaultArgs.should.eql(_lodash.default.set({}, 'plugin.crypto-fiend.elite', false));
218
- });
219
- });
220
- });
221
- });
222
- describe('validateTmpDir', function () {
223
- it('should fail to use a tmp dir with incorrect permissions', function () {
224
- (0, _config.validateTmpDir)('/private/if_you_run_with_sudo_this_wont_fail').should.be.rejectedWith(/could not ensure/);
225
- });
226
- it('should fail to use an undefined tmp dir', function () {
227
- (0, _config.validateTmpDir)().should.be.rejectedWith(/could not ensure/);
228
- });
229
- it('should be able to use a tmp dir with correct permissions', function () {
230
- (0, _config.validateTmpDir)('/tmp/test_tmp_dir/with/any/number/of/levels').should.not.be.rejected;
231
- });
232
- });
233
- describe('parsing args with empty argv[1]', function () {
234
- let argv1;
235
- before(function () {
236
- argv1 = process.argv[1];
237
- });
238
- beforeEach(function () {
239
- (0, _schema.resetSchema)();
240
- });
241
- after(function () {
242
- process.argv[1] = argv1;
243
- });
244
- it('should not fail if process.argv[1] is undefined', async function () {
245
- delete process.argv[1];
246
- let args = await (0, _parser.default)();
247
- args.prog.should.be.equal('appium');
248
- });
249
- it('should set "prog" to process.argv[1]', async function () {
250
- process.argv[1] = 'Hello World';
251
- let args = await (0, _parser.default)();
252
- args.prog.should.be.equal('Hello World');
253
- });
254
- });
255
- });require('source-map-support').install();
256
-
257
-
258
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwic2FuZGJveCIsImJlZm9yZUVhY2giLCJzaW5vbiIsImNyZWF0ZVNhbmRib3giLCJhZnRlckVhY2giLCJyZXN0b3JlIiwibG9nIiwiZGlyIiwic3B5IiwiY29uc29sZSIsIml0IiwiY29uZmlnIiwic2hvdWxkIiwiaGF2ZSIsImJlZW4iLCJjYWxsZWRPbmNlIiwiZmlyc3RDYWxsIiwiYXJncyIsImNvbnRhaW4iLCJKU09OIiwic3RyaW5naWZ5IiwiYWRkcmVzcyIsInNlcnZlciIsImNhbGxiYWNrQWRkcmVzcyIsInBvcnQiLCJhbGxvd0NvcnMiLCJjYWxsZWRXaXRoIiwiZm9vIiwiY293cyIsInBpZ3MiLCJzaGVlcCIsImR1Y2tzIiwic3BhbSIsIl9wcm9jZXNzIiwicHJvY2VzcyIsImJlZm9yZSIsImFmdGVyIiwidW5zdXBwb3J0ZWRWZXJzaW9ucyIsInZlcnNpb24iLCJjaGVja05vZGVPayIsInRocm93Iiwibm90IiwibG9nZ2VyIiwicmVzZXRIaXN0b3J5Iiwid2FybiIsImNhbGxDb3VudCIsImVxdWFsIiwibm9uRGVmYXVsdEFyZ3MiLCJiZSIsImVtcHR5IiwiZXFsIiwidXNlUGx1Z2lucyIsInR5cGUiLCJwcm9wZXJ0aWVzIiwiZWxpdGUiLCJkZWZhdWx0IiwiXyIsInNldCIsInJlamVjdGVkV2l0aCIsInJlamVjdGVkIiwiYXJndjEiLCJhcmd2IiwicHJvZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUFBLFFBQVEsQ0FBQyxRQUFELEVBQVcsWUFBWTtBQUU3QixNQUFJQyxPQUFKO0FBRUFDLEVBQUFBLFVBQVUsQ0FBQyxZQUFZO0FBQ3JCRCxJQUFBQSxPQUFPLEdBQUdFLGVBQU1DLGFBQU4sRUFBVjtBQUNELEdBRlMsQ0FBVjtBQUlBQyxFQUFBQSxTQUFTLENBQUMsWUFBWTtBQUNwQkosSUFBQUEsT0FBTyxD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QSxVQUFVLENBQUMsWUFBWTtBQUNyQjtBQUNELEtBRlMsQ0FBVjtBQUlBbUMsSUFBQUEsS0FBSyxDQUFDLFlBQVk7QUFDaEJGLE1BQUFBLE9BQU8sQ0FBQzJCLElBQVIsQ0FBYSxDQUFiLElBQWtCRCxLQUFsQjtBQUNELEtBRkksQ0FBTDtBQUlBbEQsSUFBQUEsRUFBRSxDQUFDLGlEQUFELEVBQW9ELGtCQUFrQjtBQUN0RSxhQUFPd0IsT0FBTyxDQUFDMkIsSUFBUixDQUFhLENBQWIsQ0FBUDtBQUNBLFVBQUk1QyxJQUFJLEdBQUcsTUFBTSxzQkFBakI7QUFDQUEsTUFBQUEsSUFBSSxDQUFDNkMsSUFBTCxDQUFVbEQsTUFBVixDQUFpQm9DLEVBQWpCLENBQW9CRixLQUFwQixDQUEwQixRQUExQjtBQUNELEtBSkMsQ0FBRjtBQU1BcEMsSUFBQUEsRUFBRSxDQUFDLHNDQUFELEVBQXlDLGtCQUFrQjtBQUMzRHdCLE1BQUFBLE9BQU8sQ0FBQzJCLElBQVIsQ0FBYSxDQUFiLElBQWtCLGFBQWxCO0FBQ0EsVUFBSTVDLElBQUksR0FBRyxNQUFNLHNCQUFqQjtBQUNBQSxNQUFBQSxJQUFJLENBQUM2QyxJQUFMLENBQVVsRCxNQUFWLENBQWlCb0MsRUFBakIsQ0FBb0JGLEtBQXBCLENBQTBCLGFBQTFCO0FBQ0QsS0FKQyxDQUFGO0FBS0QsR0ExQk8sQ0FBUjtBQTRCRCxDQWhQTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8vIHRyYW5zcGlsZTptb2NoYVxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgZ2V0UGFyc2VyIGZyb20gJy4uL2xpYi9jbGkvcGFyc2VyJztcbmltcG9ydCB7IGNoZWNrTm9kZU9rLCBnZXRCdWlsZEluZm8sIGdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzLCBzaG93QnVpbGRJbmZvLCBzaG93Q29uZmlnLCB2YWxpZGF0ZVRtcERpciwgd2Fybk5vZGVEZXByZWNhdGlvbnMgfSBmcm9tICcuLi9saWIvY29uZmlnJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vbGliL2xvZ2dlcic7XG5pbXBvcnQgeyBnZXREZWZhdWx0c0ZvclNjaGVtYSwgcmVzZXRTY2hlbWEsIHJlZ2lzdGVyU2NoZW1hLCBmaW5hbGl6ZVNjaGVtYSB9IGZyb20gJy4uL2xpYi9zY2hlbWEvc2NoZW1hJztcblxuZGVzY3JpYmUoJ0NvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ3Npbm9uJykuU2lub25TYW5kYm94fSAqL1xuICBsZXQgc2FuZGJveDtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQXBwaXVtIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydCgnc2lub24nKS5TaW5vblNweTxbbWVzc2FnZT86IGFueSwgLi4uZXh0cmE6IGFueVtdXSx2b2lkPn0gKi9cbiAgICBsZXQgbG9nO1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU3B5PFttZXNzYWdlPzogYW55LCAuLi5leHRyYTogYW55W11dLHZvaWQ+fSAqL1xuICAgIGxldCBkaXI7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBsb2cgPSBzYW5kYm94LnNweShjb25zb2xlLCAnbG9nJyk7XG4gICAgICBkaXIgPSBzYW5kYm94LnNweShjb25zb2xlLCAnZGlyJyk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2hvd0J1aWxkSW5mbygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBsb2cgYnVpbGQgaW5mbyB0byBjb25zb2xlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBnZXRCdWlsZEluZm8oKTtcbiAgICAgICAgYXdhaXQgc2hvd0J1aWxkSW5mbygpO1xuICAgICAgICBsb2cuc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWRPbmNlO1xuICAgICAgICBsb2cuZmlyc3RDYWxsLmFyZ3Muc2hvdWxkLmNvbnRhaW4oSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzaG93Q29uZmlnKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXNjcmliZSgnd2hlbiBhIGNvbmZpZyBmaWxlIGlzIHByZXNlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgZHVtcCB0aGUgY3VycmVudCBBcHBpdW0gY29uZmlnJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3dDb25maWcoXG4gICAgICAgICAgICB7YWRkcmVzczogJ2Jhcid9LFxuICAgICAgICAgICAge2NvbmZpZzoge1xuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgIHNlcnZlcjoge2NhbGxiYWNrQWRkcmVzczogJ3F1dXgnfX1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7cG9ydDogMTIzNH0sXG4gICAgICAgICAgICB7YWxsb3dDb3JzOiBmYWxzZX1cbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZy5zaG91bGQuaGF2ZS5iZWVuLmNhbGxlZFdpdGgoJ0FwcGl1bSBDb25maWd1cmF0aW9uXFxuJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgc2tpcCBlbXB0eSBvYmplY3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3dDb25maWcoXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB7Zm9vOiAnYmFyJywgY293czoge30sIHBpZ3M6IFtdLCBzaGVlcDogMCwgZHVja3M6IGZhbHNlfSxcbiAgICAgICAgICAgIHtjb25maWc6IHtzZXJ2ZXI6IHthZGRyZXNzOiAncXV1eCd9fX0sXG4gICAgICAgICAgICB7c3BhbTogJ2Zvb2QnfSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBkaXIuc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWRXaXRoKHtmb286ICdiYXInLCBzaGVlcDogMCwgZHVja3M6IGZhbHNlfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIGEgY29uZmlnIGZpbGUgaXMgbm90IHByZXNlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgZHVtcCB0aGUgY3VycmVudCBBcHBpdW0gY29uZmlnIChzYW5zIGNvbmZpZyBmaWxlIGNvbnRlbnRzKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG93Q29uZmlnKFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAge2ZvbzogJ2JhcicsIGNvd3M6IHt9LCBwaWdzOiBbXSwgc2hlZXA6IDAsIGR1Y2tzOiBmYWxzZX0sXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtzcGFtOiAnZm9vZCd9LFxuICAgICAgICAgICAge31cbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZy5zaG91bGQuaGF2ZS5iZWVuLmNhbGxlZFdpdGgoJ1xcbihubyBjb25maWd1cmF0aW9uIGZpbGUgbG9hZGVkKScpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnd2hlbiBubyBDTEkgYXJndW1lbnRzIChvdGhlciB0aGFuIC0tc2hvdy1jb25maWcpIHByb3ZpZGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIG5vdCBkdW1wIENMSSBhcmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBzaG93Q29uZmlnKHt9LCB7fSwge30sIHt9KTtcbiAgICAgICAgICBsb2cuc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWRXaXRoKCdcXG4obm8gQ0xJIHBhcmFtZXRlcnMgcHJvdmlkZWQpJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdub2RlLmpzIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgX3Byb2Nlc3MgPSBwcm9jZXNzO1xuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBuZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gcHJvY2Vzcy52ZXJzaW9uXG4gICAgICAvLyBidXQgYWxzbyB0byBoYXZlIGFjY2VzcyB0byBwcm9jZXNzIG1ldGhvZHNcbiAgICAgIC8vIHNvIGNvcHkgdGhlbSBvdmVyIHRvIGEgd3JpdGFibGUgb2JqZWN0XG4gICAgICBwcm9jZXNzID0gey4uLnByb2Nlc3N9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWdsb2JhbC1hc3NpZ25cbiAgICB9KTtcbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzID0gX3Byb2Nlc3M7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZ2xvYmFsLWFzc2lnblxuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdjaGVja05vZGVPaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlc2NyaWJlKCd1bnN1cHBvcnRlZCBub2RlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdW5zdXBwb3J0ZWRWZXJzaW9ucyA9IFtcbiAgICAgICAgICAndjAuMScsICd2MC45LjEyJywgJ3YwLjEwLjM2JywgJ3YwLjEyLjE0JyxcbiAgICAgICAgICAndjQuNC43JywgJ3Y1LjcuMCcsICd2Ni4zLjEnLCAndjcuMS4xJyxcbiAgICAgICAgICAndjguMC4wJywgJ3Y5LjIuMycsICd2MTAuMS4wJyxcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHVuc3VwcG9ydGVkVmVyc2lvbnMpIHtcbiAgICAgICAgICBpdChgc2hvdWxkIGZhaWwgaWYgbm9kZSBpcyAke3ZlcnNpb259YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgcHJvY2Vzcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICAgIGNoZWNrTm9kZU9rLnNob3VsZC50aHJvdygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3N1cHBvcnRlZCBub2RlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGlmIG5vZGUgaXMgMTIrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjEyLjAuMSc7XG4gICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGlmIG5vZGUgaXMgMTMrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjEzLjYuMCc7XG4gICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGlmIG5vZGUgaXMgMTQrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBwcm9jZXNzLnZlcnNpb24gPSAndjE0LjAuMCc7XG4gICAgICAgICAgY2hlY2tOb2RlT2suc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dhcm5Ob2RlRGVwcmVjYXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHNweTtcbiAgICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNweSA9IHNhbmRib3guc3B5KGxvZ2dlciwgJ3dhcm4nKTtcbiAgICAgIH0pO1xuICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNweS5yZXNldEhpc3RvcnkoKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBub3QgbG9nIGEgd2FybmluZyBpZiBub2RlIGlzIDgrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHByb2Nlc3MudmVyc2lvbiA9ICd2OC4wLjAnO1xuICAgICAgICB3YXJuTm9kZURlcHJlY2F0aW9ucygpO1xuICAgICAgICBsb2dnZXIud2Fybi5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDApO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIG5vdCBsb2cgYSB3YXJuaW5nIGlmIG5vZGUgaXMgOSsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgcHJvY2Vzcy52ZXJzaW9uID0gJ3Y5LjAuMCc7XG4gICAgICAgIHdhcm5Ob2RlRGVwcmVjYXRpb25zKCk7XG4gICAgICAgIGxvZ2dlci53YXJuLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NlcnZlciBhcmd1bWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICBkZXNjcmliZSgnZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXNjcmliZSgnd2l0aG91dCBleHRlbnNpb24gc2NoZW1hcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgZ2V0UGFyc2VyKHRydWUpO1xuICAgICAgICAgIC8vIGdldCBhbGwgdGhlIGRlZmF1bHRzXG4gICAgICAgICAgYXJncyA9IGdldERlZmF1bHRzRm9yU2NoZW1hKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHNob3cgbm9uZSBpZiB3ZSBoYXZlIGFsbCB0aGUgZGVmYXVsdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGV0IG5vbkRlZmF1bHRBcmdzID0gZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MoYXJncyk7XG4gICAgICAgICAgbm9uRGVmYXVsdEFyZ3Muc2hvdWxkLmJlLmVtcHR5O1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBjYXRjaCBhIG5vbi1kZWZhdWx0IGFyZ3VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFyZ3MuYWxsb3dDb3JzID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgbm9uRGVmYXVsdEFyZ3MgPSBnZXROb25EZWZhdWx0U2VydmVyQXJncyhhcmdzKTtcbiAgICAgICAgICBub25EZWZhdWx0QXJncy5zaG91bGQuZXFsKHthbGxvd0NvcnM6IHRydWV9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGFyZyBpcyBhbiBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgYXJnIGFzIGFuIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXJncy51c2VQbHVnaW5zID0gWydhbGwnXTtcbiAgICAgICAgICAgIGdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzKGFyZ3MpLnNob3VsZC5lcWwoe3VzZVBsdWdpbnM6IFsnYWxsJ119KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGRlc2NyaWJlKCd3aXRoIGV4dGVuc2lvbiBzY2hlbWFzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXNldFNjaGVtYSgpO1xuICAgICAgICAgIHJlZ2lzdGVyU2NoZW1hKCdwbHVnaW4nLCAnY3J5cHRvLWZpZW5kJywge3R5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7ZWxpdGU6IHt0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IHRydWV9fX0pO1xuICAgICAgICAgIGZpbmFsaXplU2NoZW1hKCk7XG4gICAgICAgICAgYXdhaXQgZ2V0UGFyc2VyKHRydWUpO1xuICAgICAgICAgIGFyZ3MgPSBnZXREZWZhdWx0c0ZvclNjaGVtYSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRha2UgZXh0ZW5zaW9uIHNjaGVtYXMgaW50byBhY2NvdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IG5vbkRlZmF1bHRBcmdzID0gZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MoYXJncyk7XG4gICAgICAgICAgbm9uRGVmYXVsdEFyZ3Muc2hvdWxkLmJlLmVtcHR5O1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNhdGNoIGEgbm9uLWRlZmF1bHQgYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXJnc1sncGx1Z2luLmNyeXB0by1maWVuZC5lbGl0ZSddID0gZmFsc2U7XG4gICAgICAgICAgY29uc3Qgbm9uRGVmYXVsdEFyZ3MgPSBnZXROb25EZWZhdWx0U2VydmVyQXJncyhhcmdzKTtcbiAgICAgICAgICBub25EZWZhdWx0QXJncy5zaG91bGQuZXFsKF8uc2V0KHt9LCAncGx1Z2luLmNyeXB0by1maWVuZC5lbGl0ZScsIGZhbHNlKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZVRtcERpcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdXNlIGEgdG1wIGRpciB3aXRoIGluY29ycmVjdCBwZXJtaXNzaW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhbGlkYXRlVG1wRGlyKCcvcHJpdmF0ZS9pZl95b3VfcnVuX3dpdGhfc3Vkb190aGlzX3dvbnRfZmFpbCcpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2NvdWxkIG5vdCBlbnN1cmUvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdXNlIGFuIHVuZGVmaW5lZCB0bXAgZGlyJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgdmFsaWRhdGVUbXBEaXIoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9jb3VsZCBub3QgZW5zdXJlLyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHVzZSBhIHRtcCBkaXIgd2l0aCBjb3JyZWN0IHBlcm1pc3Npb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFsaWRhdGVUbXBEaXIoJy90bXAvdGVzdF90bXBfZGlyL3dpdGgvYW55L251bWJlci9vZi9sZXZlbHMnKS5zaG91bGQubm90LmJlLnJlamVjdGVkO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2luZyBhcmdzIHdpdGggZW1wdHkgYXJndlsxXScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgYXJndjE7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgYXJndjEgPSBwcm9jZXNzLmFyZ3ZbMV07XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc2V0U2NoZW1hKCk7XG4gICAgfSk7XG5cbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLmFyZ3ZbMV0gPSBhcmd2MTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGZhaWwgaWYgcHJvY2Vzcy5hcmd2WzFdIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmFyZ3ZbMV07XG4gICAgICBsZXQgYXJncyA9IGF3YWl0IGdldFBhcnNlcigpO1xuICAgICAgYXJncy5wcm9nLnNob3VsZC5iZS5lcXVhbCgnYXBwaXVtJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBcInByb2dcIiB0byBwcm9jZXNzLmFyZ3ZbMV0nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLmFyZ3ZbMV0gPSAnSGVsbG8gV29ybGQnO1xuICAgICAgbGV0IGFyZ3MgPSBhd2FpdCBnZXRQYXJzZXIoKTtcbiAgICAgIGFyZ3MucHJvZy5zaG91bGQuYmUuZXF1YWwoJ0hlbGxvIFdvcmxkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG59KTtcbiJdLCJmaWxlIjoidGVzdC9jb25maWctc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==