@flakiness/playwright 0.148.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/LICENSE +21 -0
- package/README.md +219 -0
- package/lib/playwright-test.js +284 -0
- package/package.json +26 -0
- package/types/tsconfig.tsbuildinfo +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Degu Labs, Inc
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# Flakiness.io Playwright Reporter
|
|
2
|
+
|
|
3
|
+
A custom Playwright test reporter that generates Flakiness Reports from your Playwright test runs. The reporter automatically converts Playwright test results into the standardized [Flakiness JSON format](https://github.com/flakiness/flakiness-report), capturing test outcomes, attachments, system utilization, and environment information.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Requirements](#requirements)
|
|
8
|
+
- [Installation](#installation)
|
|
9
|
+
- [Quick Start](#quick-start)
|
|
10
|
+
- [Uploading Reports](#uploading-reports)
|
|
11
|
+
- [Viewing Reports](#viewing-reports)
|
|
12
|
+
- [Features](#features)
|
|
13
|
+
- [Attachment Handling](#attachment-handling)
|
|
14
|
+
- [Environment Detection](#environment-detection)
|
|
15
|
+
- [CI Integration](#ci-integration)
|
|
16
|
+
- [Configuration Options](#configuration-options)
|
|
17
|
+
- [`endpoint?: string`](#endpoint-string)
|
|
18
|
+
- [`token?: string`](#token-string)
|
|
19
|
+
- [`outputFolder?: string`](#outputfolder-string)
|
|
20
|
+
- [`open?: 'always' | 'never' | 'on-failure'`](#open-always--never--on-failure)
|
|
21
|
+
- [`collectBrowserVersions?: boolean`](#collectbrowserversions-boolean)
|
|
22
|
+
- [Environment Variables](#environment-variables)
|
|
23
|
+
- [Example Configuration](#example-configuration)
|
|
24
|
+
|
|
25
|
+
## Requirements
|
|
26
|
+
|
|
27
|
+
- Playwright 1.57.0 or higher
|
|
28
|
+
- Node.js project with a git repository (for commit information)
|
|
29
|
+
- Valid Flakiness.io access token (for uploads)
|
|
30
|
+
|
|
31
|
+
## Installation
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install @flakiness/playwright
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Quick Start
|
|
38
|
+
|
|
39
|
+
Add the reporter to your `playwright.config.ts`:
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
import { defineConfig } from '@playwright/test';
|
|
43
|
+
|
|
44
|
+
export default defineConfig({
|
|
45
|
+
reporter: [
|
|
46
|
+
['@flakiness/playwright']
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Run your tests. The report will be automatically generated in the `./flakiness-report` folder:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npx playwright test
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
View the interactive report:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npx flakiness show ./flakiness-report
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Uploading Reports
|
|
64
|
+
|
|
65
|
+
Reports are automatically uploaded to Flakiness.io in the `onExit()` hook if a valid access token is provided (via `token` option or `FLAKINESS_ACCESS_TOKEN` environment variable).
|
|
66
|
+
|
|
67
|
+
If upload fails, the report is still available locally in the output folder.
|
|
68
|
+
|
|
69
|
+
## Viewing Reports
|
|
70
|
+
|
|
71
|
+
After test execution, you can view the report using:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npx flakiness show ./flakiness-report
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Features
|
|
78
|
+
|
|
79
|
+
### Attachment Handling
|
|
80
|
+
|
|
81
|
+
All Playwright test attachments (screenshots, traces, videos, etc.) are automatically:
|
|
82
|
+
- Included in the report
|
|
83
|
+
- Hashed for deduplication
|
|
84
|
+
- Written to the `attachments/` directory in the output folder
|
|
85
|
+
|
|
86
|
+
If an attachment file cannot be accessed, a warning is displayed but the report generation continues.
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
### Environment Detection
|
|
90
|
+
|
|
91
|
+
For each Playwright project, the reporter creates a unique environment that includes:
|
|
92
|
+
- Project name and metadata
|
|
93
|
+
- Operating system information (detected automatically)
|
|
94
|
+
- Browser information (if `collectBrowserVersions` is enabled)
|
|
95
|
+
- Custom environment variables prefixed with `FK_ENV_`
|
|
96
|
+
|
|
97
|
+
Environment variables prefixed with `FK_ENV_` are automatically included in the environment's `userSuppliedData`. The prefix is stripped and the key is converted to lowercase.
|
|
98
|
+
|
|
99
|
+
**Example:**
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
export FK_ENV_DEPLOYMENT=staging
|
|
103
|
+
export FK_ENV_REGION=us-east-1
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
This will result in the environment containing:
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"userSuppliedData": {
|
|
110
|
+
"deployment": "staging",
|
|
111
|
+
"region": "us-east-1"
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Flakiness.io will create a dedicated history for tests executed in each unique environment. This means tests run with `FK_ENV_DEPLOYMENT=staging` will have a separate timeline from tests run with `FK_ENV_DEPLOYMENT=production`, allowing you to track flakiness patterns specific to each deployment environment.
|
|
117
|
+
|
|
118
|
+
### CI Integration
|
|
119
|
+
|
|
120
|
+
The reporter automatically detects CI environments and includes:
|
|
121
|
+
- CI run URLs (GitHub Actions, Azure DevOps, Jenkins, GitLab CI)
|
|
122
|
+
- Git commit information
|
|
123
|
+
- System environment data
|
|
124
|
+
|
|
125
|
+
## Configuration Options
|
|
126
|
+
|
|
127
|
+
The reporter accepts the following options:
|
|
128
|
+
|
|
129
|
+
### `endpoint?: string`
|
|
130
|
+
|
|
131
|
+
Custom Flakiness.io endpoint URL for uploading reports. Defaults to the `FLAKINESS_ENDPOINT` environment variable, or `https://flakiness.io` if not set.
|
|
132
|
+
|
|
133
|
+
Use this option to point to a custom or self-hosted Flakiness.io instance.
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
reporter: [
|
|
137
|
+
['@flakiness/playwright', { endpoint: 'https://custom.flakiness.io' }]
|
|
138
|
+
]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### `token?: string`
|
|
142
|
+
|
|
143
|
+
Access token for authenticating with Flakiness.io when uploading reports. Defaults to the `FLAKINESS_ACCESS_TOKEN` environment variable.
|
|
144
|
+
|
|
145
|
+
If no token is provided, the report will still be generated locally but won't be uploaded automatically.
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
reporter: [
|
|
149
|
+
['@flakiness/playwright', { token: 'your-access-token' }]
|
|
150
|
+
]
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### `outputFolder?: string`
|
|
154
|
+
|
|
155
|
+
Directory path where the Flakiness report will be written. Defaults to `flakiness-report` in the current working directory, or the `FLAKINESS_OUTPUT_DIR` environment variable if set.
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
reporter: [
|
|
159
|
+
['@flakiness/playwright', { outputFolder: './test-results/flakiness' }]
|
|
160
|
+
]
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### `open?: 'always' | 'never' | 'on-failure'`
|
|
164
|
+
|
|
165
|
+
Controls when the report viewer should automatically open in your browser after test completion.
|
|
166
|
+
|
|
167
|
+
- **`'on-failure'`** (default): Opens the report only if tests failed and running in an interactive terminal (not in CI)
|
|
168
|
+
- **`'always'`**: Always opens the report after test completion (when running in an interactive terminal)
|
|
169
|
+
- **`'never'`**: Never automatically opens the report
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
reporter: [
|
|
173
|
+
['@flakiness/playwright', { open: 'always' }]
|
|
174
|
+
]
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### `collectBrowserVersions?: boolean`
|
|
178
|
+
|
|
179
|
+
When enabled, the reporter will launch each browser type used in your Playwright projects to detect and record the actual browser version. This information is added to the environment metadata.
|
|
180
|
+
|
|
181
|
+
**Note:** This option requires launching browsers, which adds overhead to report generation. Enable only when browser version information is critical for your analysis.
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
reporter: [
|
|
185
|
+
['@flakiness/playwright', { collectBrowserVersions: true }]
|
|
186
|
+
]
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Environment Variables
|
|
190
|
+
|
|
191
|
+
The reporter respects the following environment variables:
|
|
192
|
+
|
|
193
|
+
- **`FLAKINESS_ACCESS_TOKEN`**: Access token for Flakiness.io uploads (equivalent to `token` option)
|
|
194
|
+
- **`FLAKINESS_ENDPOINT`**: Custom Flakiness.io endpoint URL (equivalent to `endpoint` option)
|
|
195
|
+
- **`FLAKINESS_OUTPUT_DIR`**: Output directory for reports (equivalent to `outputFolder` option)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
## Example Configuration
|
|
200
|
+
|
|
201
|
+
Here's a complete example with all options:
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
import { defineConfig } from '@playwright/test';
|
|
205
|
+
|
|
206
|
+
export default defineConfig({
|
|
207
|
+
reporter: [
|
|
208
|
+
['@flakiness/playwright', {
|
|
209
|
+
endpoint: process.env.FLAKINESS_ENDPOINT,
|
|
210
|
+
token: process.env.FLAKINESS_ACCESS_TOKEN,
|
|
211
|
+
outputFolder: './flakiness-report',
|
|
212
|
+
open: 'on-failure',
|
|
213
|
+
collectBrowserVersions: false,
|
|
214
|
+
}]
|
|
215
|
+
],
|
|
216
|
+
// ... rest of your config
|
|
217
|
+
});
|
|
218
|
+
```
|
|
219
|
+
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
// src/playwright-test.ts
|
|
2
|
+
import {
|
|
3
|
+
CIUtils,
|
|
4
|
+
GitWorktree,
|
|
5
|
+
ReportUtils,
|
|
6
|
+
showReport,
|
|
7
|
+
SystemUtilizationSampler,
|
|
8
|
+
uploadReport,
|
|
9
|
+
writeReport
|
|
10
|
+
} from "@flakiness/sdk";
|
|
11
|
+
import chalk from "chalk";
|
|
12
|
+
import fs from "fs";
|
|
13
|
+
import path from "path";
|
|
14
|
+
var warn = (txt) => console.warn(chalk.yellow(`[flakiness.io] ${txt}`));
|
|
15
|
+
var err = (txt) => console.error(chalk.red(`[flakiness.io] ${txt}`));
|
|
16
|
+
function parseDurationMS(value) {
|
|
17
|
+
if (isNaN(value))
|
|
18
|
+
throw new Error("Duration cannot be NaN");
|
|
19
|
+
if (value < 0)
|
|
20
|
+
throw new Error(`Duration cannot be less than 0, found ${value}`);
|
|
21
|
+
return value | 0;
|
|
22
|
+
}
|
|
23
|
+
async function existsAsync(aPath) {
|
|
24
|
+
return fs.promises.stat(aPath).then(() => true).catch((e) => false);
|
|
25
|
+
}
|
|
26
|
+
var FlakinessReporter = class {
|
|
27
|
+
constructor(_options = {}) {
|
|
28
|
+
this._options = _options;
|
|
29
|
+
this._outputFolder = path.join(process.cwd(), this._options.outputFolder ?? process.env.FLAKINESS_OUTPUT_DIR ?? "flakiness-report");
|
|
30
|
+
}
|
|
31
|
+
_config;
|
|
32
|
+
_rootSuite;
|
|
33
|
+
_results = /* @__PURE__ */ new Map();
|
|
34
|
+
_unattributedErrors = [];
|
|
35
|
+
_systemUtilizationSampler = new SystemUtilizationSampler();
|
|
36
|
+
_report;
|
|
37
|
+
_attachments = [];
|
|
38
|
+
_outputFolder;
|
|
39
|
+
_result;
|
|
40
|
+
printsToStdio() {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
onBegin(config, suite) {
|
|
44
|
+
this._config = config;
|
|
45
|
+
this._rootSuite = suite;
|
|
46
|
+
}
|
|
47
|
+
onError(error) {
|
|
48
|
+
this._unattributedErrors.push(error);
|
|
49
|
+
}
|
|
50
|
+
onTestBegin(test) {
|
|
51
|
+
}
|
|
52
|
+
onTestEnd(test, result) {
|
|
53
|
+
const results = this._results.get(test) ?? /* @__PURE__ */ new Set();
|
|
54
|
+
results.add(result);
|
|
55
|
+
this._results.set(test, results);
|
|
56
|
+
}
|
|
57
|
+
async _toFKSuites(context, pwSuite) {
|
|
58
|
+
const location = pwSuite.location;
|
|
59
|
+
if (pwSuite.type === "root" || pwSuite.type === "project" || !location)
|
|
60
|
+
return (await Promise.all(pwSuite.suites.map((suite) => this._toFKSuites(context, suite)))).flat();
|
|
61
|
+
let type = "suite";
|
|
62
|
+
if (pwSuite.type === "file")
|
|
63
|
+
type = "file";
|
|
64
|
+
else if (pwSuite.type === "describe" && !pwSuite.title)
|
|
65
|
+
type = "anonymous suite";
|
|
66
|
+
return [{
|
|
67
|
+
type,
|
|
68
|
+
title: pwSuite.title,
|
|
69
|
+
location: this._createLocation(context, location),
|
|
70
|
+
suites: (await Promise.all(pwSuite.suites.map((suite) => this._toFKSuites(context, suite)))).flat(),
|
|
71
|
+
tests: await Promise.all(pwSuite.tests.map((test) => this._toFKTest(context, test)))
|
|
72
|
+
}];
|
|
73
|
+
}
|
|
74
|
+
async _toFKTest(context, pwTest) {
|
|
75
|
+
return {
|
|
76
|
+
title: pwTest.title,
|
|
77
|
+
// Playwright Test tags must start with '@' so we cut it off.
|
|
78
|
+
tags: pwTest.tags.map((tag) => tag.startsWith("@") ? tag.substring(1) : tag),
|
|
79
|
+
location: this._createLocation(context, pwTest.location),
|
|
80
|
+
// de-duplication of tests will happen later, so here we will have all attempts.
|
|
81
|
+
attempts: await Promise.all(Array.from(this._results.get(pwTest) ?? /* @__PURE__ */ new Set()).map((result) => this._toFKRunAttempt(context, pwTest, result)))
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async _toFKRunAttempt(context, pwTest, result) {
|
|
85
|
+
const attachments = [];
|
|
86
|
+
const attempt = {
|
|
87
|
+
timeout: parseDurationMS(pwTest.timeout),
|
|
88
|
+
annotations: pwTest.annotations.map((annotation) => ({
|
|
89
|
+
type: annotation.type,
|
|
90
|
+
description: annotation.description,
|
|
91
|
+
location: annotation.location ? this._createLocation(context, annotation.location) : void 0
|
|
92
|
+
})),
|
|
93
|
+
environmentIdx: context.project2environmentIdx.get(pwTest.parent.project()),
|
|
94
|
+
expectedStatus: pwTest.expectedStatus,
|
|
95
|
+
parallelIndex: result.parallelIndex,
|
|
96
|
+
status: result.status,
|
|
97
|
+
errors: result.errors && result.errors.length ? result.errors.map((error) => this._toFKTestError(context, error)) : void 0,
|
|
98
|
+
stdout: result.stdout ? result.stdout.map(toSTDIOEntry) : void 0,
|
|
99
|
+
stderr: result.stderr ? result.stderr.map(toSTDIOEntry) : void 0,
|
|
100
|
+
steps: result.steps ? result.steps.map((jsonTestStep) => this._toFKTestStep(context, jsonTestStep)) : void 0,
|
|
101
|
+
startTimestamp: +result.startTime,
|
|
102
|
+
duration: +result.duration,
|
|
103
|
+
attachments
|
|
104
|
+
};
|
|
105
|
+
await Promise.all((result.attachments ?? []).map(async (jsonAttachment) => {
|
|
106
|
+
if (jsonAttachment.path && !await existsAsync(jsonAttachment.path)) {
|
|
107
|
+
context.unaccessibleAttachmentPaths.push(jsonAttachment.path);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
let attachment;
|
|
111
|
+
if (jsonAttachment.path)
|
|
112
|
+
attachment = await ReportUtils.createFileAttachment(jsonAttachment.contentType, jsonAttachment.path);
|
|
113
|
+
else if (jsonAttachment.body)
|
|
114
|
+
attachment = await ReportUtils.createDataAttachment(jsonAttachment.contentType, jsonAttachment.body);
|
|
115
|
+
else
|
|
116
|
+
return;
|
|
117
|
+
context.attachments.set(attachment.id, attachment);
|
|
118
|
+
attachments.push({
|
|
119
|
+
id: attachment.id,
|
|
120
|
+
name: jsonAttachment.name,
|
|
121
|
+
contentType: jsonAttachment.contentType
|
|
122
|
+
});
|
|
123
|
+
}));
|
|
124
|
+
return attempt;
|
|
125
|
+
}
|
|
126
|
+
_toFKTestStep(context, pwStep) {
|
|
127
|
+
const step = {
|
|
128
|
+
// NOTE: jsonStep.duration was -1 in some playwright versions
|
|
129
|
+
duration: parseDurationMS(Math.max(pwStep.duration, 0)),
|
|
130
|
+
title: pwStep.title,
|
|
131
|
+
location: pwStep.location ? this._createLocation(context, pwStep.location) : void 0
|
|
132
|
+
};
|
|
133
|
+
if (pwStep.location) {
|
|
134
|
+
const resolvedPath = path.resolve(pwStep.location.file);
|
|
135
|
+
}
|
|
136
|
+
if (pwStep.error)
|
|
137
|
+
step.error = this._toFKTestError(context, pwStep.error);
|
|
138
|
+
if (pwStep.steps)
|
|
139
|
+
step.steps = pwStep.steps.map((childJSONStep) => this._toFKTestStep(context, childJSONStep));
|
|
140
|
+
return step;
|
|
141
|
+
}
|
|
142
|
+
_createLocation(context, pwLocation) {
|
|
143
|
+
return {
|
|
144
|
+
file: context.worktree.gitPath(path.resolve(pwLocation.file)),
|
|
145
|
+
line: pwLocation.line,
|
|
146
|
+
column: pwLocation.column
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
_toFKTestError(context, pwError) {
|
|
150
|
+
return {
|
|
151
|
+
location: pwError.location ? this._createLocation(context, pwError.location) : void 0,
|
|
152
|
+
message: ReportUtils.stripAnsi(pwError.message ?? "").split("\n")[0],
|
|
153
|
+
snippet: pwError.snippet,
|
|
154
|
+
stack: pwError.stack,
|
|
155
|
+
value: pwError.value
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
async onEnd(result) {
|
|
159
|
+
this._systemUtilizationSampler.dispose();
|
|
160
|
+
if (!this._config || !this._rootSuite)
|
|
161
|
+
throw new Error("ERROR: failed to resolve config");
|
|
162
|
+
let commitId;
|
|
163
|
+
let worktree;
|
|
164
|
+
try {
|
|
165
|
+
worktree = GitWorktree.create(this._config.rootDir);
|
|
166
|
+
} catch (e) {
|
|
167
|
+
warn(`Failed to fetch commit info - is this a git repo?`);
|
|
168
|
+
err(`Report is NOT generated.`);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const configPath = this._config.configFile ? worktree.gitPath(this._config.configFile) : void 0;
|
|
172
|
+
const context = {
|
|
173
|
+
project2environmentIdx: /* @__PURE__ */ new Map(),
|
|
174
|
+
worktree,
|
|
175
|
+
attachments: /* @__PURE__ */ new Map(),
|
|
176
|
+
unaccessibleAttachmentPaths: []
|
|
177
|
+
};
|
|
178
|
+
const environmentsMap = createEnvironments(this._config.projects);
|
|
179
|
+
if (this._options.collectBrowserVersions) {
|
|
180
|
+
try {
|
|
181
|
+
let playwrightPath = fs.realpathSync(process.argv[1]);
|
|
182
|
+
while (path.basename(playwrightPath) !== "test")
|
|
183
|
+
playwrightPath = path.dirname(playwrightPath);
|
|
184
|
+
const module = await import(path.join(playwrightPath, "index.js"));
|
|
185
|
+
for (const [project, env] of environmentsMap) {
|
|
186
|
+
const { browserName = "chromium", channel, headless } = project.use;
|
|
187
|
+
let browserType;
|
|
188
|
+
switch (browserName) {
|
|
189
|
+
case "chromium":
|
|
190
|
+
browserType = module.default.chromium;
|
|
191
|
+
break;
|
|
192
|
+
case "firefox":
|
|
193
|
+
browserType = module.default.firefox;
|
|
194
|
+
break;
|
|
195
|
+
case "webkit":
|
|
196
|
+
browserType = module.default.webkit;
|
|
197
|
+
break;
|
|
198
|
+
default:
|
|
199
|
+
throw new Error(`Unsupported browser: ${browserName}`);
|
|
200
|
+
}
|
|
201
|
+
const browser = await browserType.launch({ channel, headless });
|
|
202
|
+
const version = browser.version();
|
|
203
|
+
await browser.close();
|
|
204
|
+
env.userSuppliedData ??= {};
|
|
205
|
+
env.userSuppliedData["browser"] = (channel ?? browserName).toLowerCase().trim() + " " + version;
|
|
206
|
+
}
|
|
207
|
+
} catch (e) {
|
|
208
|
+
err(`Failed to resolve browser version: ${e}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const environments = [...environmentsMap.values()];
|
|
212
|
+
for (let envIdx = 0; envIdx < environments.length; ++envIdx)
|
|
213
|
+
context.project2environmentIdx.set(this._config.projects[envIdx], envIdx);
|
|
214
|
+
const report = ReportUtils.normalizeReport({
|
|
215
|
+
category: "playwright",
|
|
216
|
+
commitId: worktree.headCommitId(),
|
|
217
|
+
relatedCommitIds: [],
|
|
218
|
+
systemUtilization: this._systemUtilizationSampler.result,
|
|
219
|
+
configPath,
|
|
220
|
+
url: CIUtils.runUrl(),
|
|
221
|
+
environments,
|
|
222
|
+
suites: await this._toFKSuites(context, this._rootSuite),
|
|
223
|
+
opaqueData: this._config,
|
|
224
|
+
unattributedErrors: this._unattributedErrors.map((e) => this._toFKTestError(context, e)),
|
|
225
|
+
duration: parseDurationMS(result.duration),
|
|
226
|
+
startTimestamp: +result.startTime
|
|
227
|
+
});
|
|
228
|
+
ReportUtils.createTestStepSnippetsInplace(worktree, report);
|
|
229
|
+
for (const unaccessibleAttachment of context.unaccessibleAttachmentPaths)
|
|
230
|
+
warn(`cannot access attachment ${unaccessibleAttachment}`);
|
|
231
|
+
this._report = report;
|
|
232
|
+
this._attachments = await writeReport(report, Array.from(context.attachments.values()), this._outputFolder);
|
|
233
|
+
this._result = result;
|
|
234
|
+
}
|
|
235
|
+
async onExit() {
|
|
236
|
+
if (!this._report)
|
|
237
|
+
return;
|
|
238
|
+
await uploadReport(this._report, this._attachments, {
|
|
239
|
+
flakinessAccessToken: this._options.token,
|
|
240
|
+
flakinessEndpoint: this._options.endpoint
|
|
241
|
+
});
|
|
242
|
+
const openMode = this._options.open ?? "on-failure";
|
|
243
|
+
const shouldOpen = process.stdin.isTTY && !process.env.CI && (openMode === "always" || openMode === "on-failure" && this._result?.status === "failed");
|
|
244
|
+
if (shouldOpen) {
|
|
245
|
+
await showReport(this._outputFolder);
|
|
246
|
+
} else {
|
|
247
|
+
const defaultOutputFolder = path.join(process.cwd(), "flakiness-report");
|
|
248
|
+
const folder = defaultOutputFolder === this._outputFolder ? "" : path.relative(process.cwd(), this._outputFolder);
|
|
249
|
+
console.log(`
|
|
250
|
+
To open last Flakiness report, run:
|
|
251
|
+
|
|
252
|
+
${chalk.cyan(`npx flakiness show ${folder}`)}
|
|
253
|
+
`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
function toSTDIOEntry(data) {
|
|
258
|
+
if (Buffer.isBuffer(data))
|
|
259
|
+
return { buffer: data.toString("base64") };
|
|
260
|
+
return { text: data };
|
|
261
|
+
}
|
|
262
|
+
function createEnvironments(projects) {
|
|
263
|
+
let uniqueNames = /* @__PURE__ */ new Set();
|
|
264
|
+
const result = /* @__PURE__ */ new Map();
|
|
265
|
+
for (const project of projects) {
|
|
266
|
+
let defaultName = project.name;
|
|
267
|
+
if (!defaultName.trim())
|
|
268
|
+
defaultName = "anonymous";
|
|
269
|
+
let name = defaultName;
|
|
270
|
+
for (let i = 2; uniqueNames.has(name); ++i)
|
|
271
|
+
name = `${defaultName}-${i}`;
|
|
272
|
+
uniqueNames.add(defaultName);
|
|
273
|
+
result.set(project, ReportUtils.createEnvironment({
|
|
274
|
+
name,
|
|
275
|
+
userSuppliedData: project.metadata,
|
|
276
|
+
opaqueData: { project }
|
|
277
|
+
}));
|
|
278
|
+
}
|
|
279
|
+
return result;
|
|
280
|
+
}
|
|
281
|
+
export {
|
|
282
|
+
FlakinessReporter as default
|
|
283
|
+
};
|
|
284
|
+
//# sourceMappingURL=playwright-test.js.map
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flakiness/playwright",
|
|
3
|
+
"version": "0.148.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"exports": {
|
|
6
|
+
".": {
|
|
7
|
+
"types": "./types/src/playwright-test.d.ts",
|
|
8
|
+
"import": "./lib/playwright-test.js",
|
|
9
|
+
"require": "./lib/playwright-test.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"type": "module",
|
|
13
|
+
"description": "",
|
|
14
|
+
"types": "./types/index.d.ts",
|
|
15
|
+
"scripts": {},
|
|
16
|
+
"keywords": [],
|
|
17
|
+
"author": "Degu Labs, Inc",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@playwright/test": "^1.57.0"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@flakiness/sdk": "0.148.0",
|
|
24
|
+
"chalk": "^5.6.2"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.string.d.ts","../../node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.object.d.ts","../../node_modules/typescript/lib/lib.esnext.regexp.d.ts","../../node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../sdk/node_modules/@flakiness/flakiness-report/types/src/flakinessreport.d.ts","../../sdk/types/src/ciutils.d.ts","../../sdk/types/src/gitworktree.d.ts","../../sdk/types/src/createenvironment.d.ts","../../sdk/types/src/createteststepsnippets.d.ts","../../sdk/types/src/normalizereport.d.ts","../../sdk/types/src/stripansi.d.ts","../../sdk/types/src/uploadreport.d.ts","../../sdk/types/src/visittests.d.ts","../../sdk/types/src/reportutils.d.ts","../../sdk/types/src/systemutilizationsampler.d.ts","../../sdk/types/src/showreport.d.ts","../../sdk/types/src/writereport.d.ts","../../sdk/types/src/flakinessprojectconfig.d.ts","../../sdk/types/src/index.d.ts","../../node_modules/playwright-core/types/protocol.d.ts","../../node_modules/playwright-core/types/structs.d.ts","../../node_modules/playwright-core/types/types.d.ts","../../node_modules/playwright-core/index.d.ts","../../node_modules/playwright/types/test.d.ts","../../node_modules/playwright/test.d.ts","../../node_modules/@playwright/test/index.d.ts","../../node_modules/playwright/types/testreporter.d.ts","../../node_modules/@playwright/test/reporter.d.ts","../../node_modules/chalk/source/vendor/ansi-styles/index.d.ts","../../node_modules/chalk/source/vendor/supports-color/index.d.ts","../../node_modules/chalk/source/index.d.ts","../src/playwright-test.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/ts5.6/globals.typedarray.d.ts","../../node_modules/@types/node/ts5.6/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/ts5.6/index.d.ts"],"fileIdsList":[[95,108,151],[97,108,151],[108,148,151],[108,150,151],[108,151,156,186],[108,151,152,157,163,164,171,183,194],[108,151,152,153,163,171],[108,151],[103,104,105,108,151],[108,151,154,195],[108,151,155,156,164,172],[108,151,156,183,191],[108,151,157,159,163,171],[108,150,151,158],[108,151,159,160],[108,151,163],[108,151,161,163],[108,150,151,163],[108,151,163,164,165,183,194],[108,151,163,164,165,178,183,186],[108,146,151,199],[108,146,151,159,163,166,171,183,194],[108,151,163,164,166,167,171,183,191,194],[108,151,166,168,183,191,194],[108,151,163,169],[108,151,170,194,199],[108,151,159,163,171,183],[108,151,172],[108,151,173],[108,150,151,174],[108,148,149,150,151,152,153,154,155,156,157,158,159,160,161,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200],[108,151,176],[108,151,177],[108,151,163,178,179],[108,151,178,180,195,197],[108,151,163,183,184,185,186],[108,151,183,185],[108,151,183,184],[108,151,186],[108,151,187],[108,148,151,183],[108,151,163,189,190],[108,151,189,190],[108,151,156,171,183,191],[108,151,192],[151],[106,107,108,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200],[108,151,171,193],[108,151,166,177,194],[108,151,156,195],[108,151,183,196],[108,151,170,197],[108,151,198],[108,151,156,163,165,174,183,194,197,199],[108,151,183,200],[99,100,108,151],[108,151,193],[92,108,151],[90,91,108,151,152,164,183],[94,108,151],[93,108,151],[108,118,122,151,194],[108,118,151,183,194],[108,113,151],[108,115,118,151,191,194],[108,151,171,191],[108,151,201],[108,113,151,201],[108,115,118,151,171,194],[108,110,111,114,117,151,163,183,194],[108,118,125,151],[108,110,116,151],[108,118,139,140,151],[108,114,118,151,186,194,201],[108,139,151,201],[108,112,113,151,201],[108,118,151],[108,112,113,114,115,116,117,118,119,120,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,140,141,142,143,144,145,151],[108,118,133,151],[108,118,125,126,151],[108,116,118,126,127,151],[108,117,151],[108,110,113,118,151],[108,118,122,126,127,151],[108,122,151],[108,116,118,121,151,194],[108,110,115,118,125,151],[108,151,183],[108,113,118,139,151,199,201],[89,96,98,101,108,151,164,173],[75,108,151],[75,77,108,151],[75,76,77,82,84,85,86,87,88,108,151],[78,79,80,81,82,83,108,151],[75,82,108,151]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"abee51ebffafd50c07d76be5848a34abfe4d791b5745ef1e5648718722fab924","impliedFormat":1},{"version":"9e8ca8ed051c2697578c023d9c29d6df689a083561feba5c14aedee895853999","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"15c1c3d7b2e46e0025417ed6d5f03f419e57e6751f87925ca19dc88297053fe6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b11f3ca66aa33124202c80b70cd203219c3d4460cfc165e0707aa9ec710fc53","affectsGlobalScope":true,"impliedFormat":1},{"version":"6a3f5a0129cc80cf439ab71164334d649b47059a4f5afca90282362407d0c87f","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d6a2092f48af66dbfb220e31eea8b10bc02b6932d6e529005fd2d7b3281290","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"32d77e0b50b41780eedfeb32f2cbcfb2c72d52511c7d1d7ac3e9da7ac64c213f","impliedFormat":99},{"version":"39f2d47a707e11e4dc702468b73674d815f4bd1c2ee39877c2b939f6837d5dd5","impliedFormat":99},{"version":"f72f5a3cc83aa9041f894e30fc0820de893f90facd5e58451dc6702638ce73e1","impliedFormat":99},{"version":"2e412b2c99246f04b3371dcbf3c25a39e923a125cfe611d4b44f6093eb1bf800","impliedFormat":99},{"version":"6d74839a24af230f12a1969500c557a3b3c3d918ee471a3b7d45a5872cda999c","impliedFormat":99},{"version":"3df52b6da8dbade43179d9b9466b0e95e4a28787039f2493d15429fc28db40e8","impliedFormat":99},{"version":"8bf419db9950c62f5728fb3fe0a70597eca94b19e79bdedc28b27243fd672b3d","impliedFormat":99},{"version":"fb9fdd90711ae778914a033c6d9bbb8e5500854e5e70898b4f80c56b2c0459ff","impliedFormat":99},{"version":"b9de716d46b0aefe0a8c0ecca517af6d605f9827b91f38314bff2718f5b282ff","impliedFormat":99},{"version":"e4eb328c95ba3b261ad853f9913b6c2c06686c1abc102ddf4fe4da4dda954cd9","impliedFormat":99},{"version":"4eb2b299fc19af0f15419126ee1f1749a51f625a9cb3ad97c1efe36959da46d9","impliedFormat":99},{"version":"62f1716120eae1575a07334b687db85d9f914bd847e8cc621c06e0303c7dd509","impliedFormat":99},{"version":"ac35d2c7653f71ebc04544a91d90ba502b1438d03f752d8560c4ab13f796394a","impliedFormat":99},{"version":"5652d11bd35569288b184e52d3a41e11f134afd0003ecf250c4fbcf62f6158dd","impliedFormat":99},{"version":"5ab53f7ffe59fb8477ab5d8f6e8fc855897eee93969dc3ba4408ec9ffaf84cef","impliedFormat":99},{"version":"b34209befaf07b7cc1932e5cc137ce121cbc9f892551126962d9e908be91adb4","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"2c0b5ace721ddf7314b622bbad664a9958cfd1068422dbed5cdb760cba1c7f0c","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"707332817d714a4277d2d386d9c209cdb2137313284c65621849a12f413aaf5e","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f00324f263189b385c3a9383b1f4dae6237697bcf0801f96aa35c340512d79c","impliedFormat":1},{"version":"ec8997c2e5cea26befc76e7bf990750e96babb16977673a9ff3b5c0575d01e48","impliedFormat":1},{"version":"77d83fa6b61fd5cdc943d461571d4ab4b8eda89a6f6ade5d5756f79feb49b7d0","impliedFormat":1},{"version":"04392f8e190f9e51301f73d17bbb34babd54858c1efc932d2193962f66dabae2","impliedFormat":1},{"version":"acfed6cc001e7f7f26d2ba42222a180ba669bb966d4dd9cb4ad5596516061b13","impliedFormat":99},{"version":"f61a4dc92450609c353738f0a2daebf8cae71b24716dbd952456d80b1e1a48b6","impliedFormat":99},{"version":"f3f76db6e76bc76d13cc4bfa10e1f74390b8ebe279535f62243e8d8acd919314","impliedFormat":99},{"version":"773adfe679e9b5c89f1542ea7a7963d1304d82d7c52df36d64fd539878df9ab7","signature":"d76b6cec2ac0f92001d93dc72b92a5a0029807457adde27efdcf2432d7cf7a19","impliedFormat":99},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"613b21ccdf3be6329d56e6caa13b258c842edf8377be7bc9f014ed14cdcfc308","affectsGlobalScope":true,"impliedFormat":1},{"version":"2d1319e6b5d0efd8c5eae07eb864a00102151e8b9afddd2d45db52e9aae002c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"81184fe8e67d78ac4e5374650f0892d547d665d77da2b2f544b5d84729c4a15d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f52e8dacc97d71dcc96af29e49584353f9c54cb916d132e3e768d8b8129c928d","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0","impliedFormat":1},{"version":"53eac70430b30089a3a1959d8306b0f9cfaf0de75224b68ef25243e0b5ad1ca3","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"86956cc2eb9dd371d6fab493d326a574afedebf76eef3fa7833b8e0d9b52d6f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"24642567d3729bcc545bacb65ee7c0db423400c7f1ef757cab25d05650064f98","impliedFormat":1},{"version":"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"875928df2f3e9a3aed4019539a15d04ff6140a06df6cd1b2feb836d22a81eaca","affectsGlobalScope":true,"impliedFormat":1},{"version":"e9ad08a376ac84948fcca0013d6f1d4ae4f9522e26b91f87945b97c99d7cc30b","impliedFormat":1},{"version":"eaf9ee1d90a35d56264f0bf39842282c58b9219e112ac7d0c1bce98c6c5da672","impliedFormat":1},{"version":"c15c4427ae7fd1dcd7f312a8a447ac93581b0d4664ddf151ecd07de4bf2bb9d7","impliedFormat":1},{"version":"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb","impliedFormat":1},{"version":"4f80de3a11c0d2f1329a72e92c7416b2f7eab14f67e92cac63bb4e8d01c6edc8","impliedFormat":1},{"version":"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6","impliedFormat":1},{"version":"75c3400359d59fae5aed4c4a59fcd8a9760cf451e25dc2174cb5e08b9d4803e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"94c4187083503a74f4544503b5a30e2bd7af0032dc739b0c9a7ce87f8bddc7b9","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"3eb62baae4df08c9173e6903d3ca45942ccec8c3659b0565684a75f3292cffbb","affectsGlobalScope":true,"impliedFormat":1},{"version":"a85683ef86875f4ad4c6b7301bbcc63fb379a8d80d3d3fd735ee57f48ef8a47e","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba","impliedFormat":1},{"version":"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"15c5e91b5f08be34a78e3d976179bf5b7a9cc28dc0ef1ffebffeb3c7812a2dca","impliedFormat":1},{"version":"a8f06c2382a30b7cb89ad2dfc48fc3b2b490f3dafcd839dadc008e4e5d57031d","impliedFormat":1},{"version":"553870e516f8c772b89f3820576152ebc70181d7994d96917bb943e37da7f8a7","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"745c4240220559bd340c8aeb6e3c5270a709d3565e934dc22a69c304703956bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"9212c6e9d80cb45441a3614e95afd7235a55a18584c2ed32d6c1aca5a0c53d93","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef91efa0baea5d0e0f0f27b574a8bc100ce62a6d7e70220a0d58af6acab5e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"282fd2a1268a25345b830497b4b7bf5037a5e04f6a9c44c840cb605e19fea841","impliedFormat":1},{"version":"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"6bd91a2a356600dee28eb0438082d0799a18a974a6537c4410a796bab749813c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7","impliedFormat":1},{"version":"ae25afbbf1ed5df63a177d67b9048bf7481067f1b8dc9c39212e59db94fc9fc6","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"52a8e7e8a1454b6d1b5ad428efae3870ffc56f2c02d923467f2940c454aa9aec","affectsGlobalScope":true,"impliedFormat":1},{"version":"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539","impliedFormat":1},{"version":"171fd8807643c46a9d17e843959abdf10480d57d60d38d061fb44a4c8d4a8cc4","impliedFormat":1}],"root":[102],"options":{"allowJs":true,"checkJs":true,"composite":true,"declaration":true,"declarationMap":true,"emitDeclarationOnly":true,"module":199,"outDir":"./","strict":true,"strictBindCallApply":true,"target":99},"referencedMap":[[96,1],[98,2],[148,3],[149,3],[150,4],[151,5],[152,6],[153,7],[103,8],[106,9],[104,8],[105,8],[154,10],[155,11],[156,12],[157,13],[158,14],[159,15],[160,15],[162,16],[161,17],[163,18],[164,19],[165,20],[147,21],[166,22],[167,23],[168,24],[169,25],[170,26],[171,27],[172,28],[173,29],[174,30],[175,31],[176,32],[177,33],[178,34],[179,34],[180,35],[181,8],[182,8],[183,36],[185,37],[184,38],[186,39],[187,40],[188,41],[189,42],[190,43],[191,44],[192,45],[108,46],[107,8],[201,47],[193,48],[194,49],[195,50],[196,51],[197,52],[198,53],[199,54],[200,55],[109,8],[101,56],[99,8],[100,57],[93,58],[90,8],[91,58],[92,59],[95,60],[94,61],[97,60],[73,8],[74,8],[12,8],[13,8],[15,8],[14,8],[2,8],[16,8],[17,8],[18,8],[19,8],[20,8],[21,8],[22,8],[23,8],[3,8],[24,8],[4,8],[25,8],[29,8],[26,8],[27,8],[28,8],[30,8],[31,8],[32,8],[5,8],[33,8],[34,8],[35,8],[36,8],[6,8],[40,8],[37,8],[38,8],[39,8],[41,8],[7,8],[42,8],[47,8],[48,8],[43,8],[44,8],[45,8],[46,8],[8,8],[52,8],[49,8],[50,8],[51,8],[53,8],[9,8],[54,8],[55,8],[56,8],[59,8],[57,8],[58,8],[60,8],[61,8],[10,8],[62,8],[1,8],[63,8],[64,8],[11,8],[69,8],[66,8],[65,8],[72,8],[70,8],[68,8],[71,8],[67,8],[125,62],[135,63],[124,62],[145,64],[116,65],[115,66],[144,67],[138,68],[143,69],[118,70],[132,71],[117,72],[141,73],[113,74],[112,67],[142,75],[114,76],[119,77],[120,8],[123,77],[110,8],[146,78],[136,79],[127,80],[128,81],[130,82],[126,83],[129,84],[139,67],[121,85],[122,86],[131,87],[111,88],[134,79],[133,77],[137,8],[140,89],[102,90],[75,8],[76,8],[78,91],[79,92],[88,8],[77,91],[89,93],[80,91],[84,94],[86,8],[81,8],[85,91],[82,91],[83,91],[87,95]],"latestChangedDtsFile":"./src/playwright-test.d.ts","version":"5.6.2"}
|