@fabasoad/sarif-to-slack 1.4.0 → 1.4.2
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/.github/workflows/release.yml +18 -9
- package/.github/workflows/security.yml +1 -1
- package/.github/workflows/send-sarif-to-slack.yml +10 -2
- package/.github/workflows/unit-tests.yml +3 -3
- package/.pre-commit-config.yaml +5 -5
- package/.tool-versions +1 -1
- package/Makefile +13 -13
- package/api-extractor.json +1 -1
- package/biome.json +1 -1
- package/dist/SarifToSlackClient.d.ts.map +1 -1
- package/dist/SarifToSlackClient.js +7 -7
- package/dist/index.cjs +71 -115
- package/dist/index.d.ts +3 -7
- package/dist/model/Finding.js +4 -5
- package/dist/model/SlackMessage.d.ts.map +1 -1
- package/dist/model/SlackMessage.js +1 -1
- package/dist/model/color/Color.d.ts.map +1 -1
- package/dist/model/color/ColorIdentification.js +7 -7
- package/dist/processors/ProcessorFactory.js +1 -1
- package/dist/representations/CompactGroupByRepresentation.js +1 -1
- package/dist/representations/Representation.js +1 -1
- package/dist/representations/RepresentationFactory.js +1 -1
- package/dist/representations/TableGroupByRunPerLevelRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupByRunPerSeverityRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupByRunRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupBySarifPerLevelRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupBySarifPerSeverityRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupBySarifRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupByToolNamePerLevelRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupByToolNamePerSeverityRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupByToolNameRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupRepresentation.d.ts.map +1 -1
- package/dist/representations/TableGroupRepresentation.js +3 -3
- package/dist/representations/table/Cell.d.ts.map +1 -1
- package/dist/representations/table/Cell.js +1 -1
- package/dist/representations/table/Column.d.ts.map +1 -1
- package/dist/representations/table/Column.js +3 -4
- package/dist/representations/table/Row.d.ts.map +1 -1
- package/dist/representations/table/Row.js +3 -3
- package/dist/representations/table/Table.d.ts.map +1 -1
- package/dist/setupLogger.d.ts +16 -0
- package/dist/setupLogger.d.ts.map +1 -0
- package/dist/setupLogger.js +43 -0
- package/dist/system.js +3 -3
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/types.d.ts +3 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/utils/Comparators.js +1 -1
- package/dist/utils/FileUtils.js +3 -3
- package/etc/sarif-to-slack.api.md +3 -7
- package/package.json +23 -22
- package/pnpm-workspace.yaml +8 -0
- package/scripts/build.sh +1 -1
- package/src/SarifToSlackClient.ts +6 -6
- package/src/model/Finding.ts +3 -3
- package/src/model/SlackMessage.ts +6 -3
- package/src/model/color/ColorIdentification.ts +6 -6
- package/src/representations/TableGroupRepresentation.ts +2 -2
- package/src/representations/table/Column.ts +2 -2
- package/src/representations/table/Row.ts +2 -2
- package/src/setupLogger.ts +62 -0
- package/src/system.ts +2 -2
- package/src/types.ts +2 -6
- package/src/utils/FileUtils.ts +2 -2
- package/tests/tsconfig.json +8 -0
- package/tests/vitest.d.ts +1 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +4 -4
- package/tsconfig.test.json +8 -0
- package/vitest.config.ts +22 -0
- package/dist/Logger.d.ts +0 -2
- package/dist/Logger.d.ts.map +0 -1
- package/dist/Logger.js +0 -76
- package/jest.config.json +0 -33
- package/src/Logger.ts +0 -97
|
@@ -35,33 +35,42 @@ jobs:
|
|
|
35
35
|
private-key: ${{ secrets.GH_APP_CONTENTS_CRUD_PRIVATE_KEY }}
|
|
36
36
|
|
|
37
37
|
- name: Checkout ${{ github.repository }}
|
|
38
|
-
uses: actions/checkout@
|
|
38
|
+
uses: actions/checkout@v7
|
|
39
39
|
with:
|
|
40
40
|
token: "${{ steps.github-app.outputs.token }}"
|
|
41
|
+
persist-credentials: "true"
|
|
42
|
+
|
|
43
|
+
- name: Setup pnpm
|
|
44
|
+
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
|
|
45
|
+
with:
|
|
46
|
+
# Intentional: actions/setup-node provides dependency caching; disable
|
|
47
|
+
# pnpm/action-setup cache to avoid duplicate/unstable cache behavior
|
|
48
|
+
cache: "false"
|
|
41
49
|
|
|
42
50
|
- name: Setup Node
|
|
43
51
|
uses: actions/setup-node@v6
|
|
44
52
|
with:
|
|
45
53
|
node-version-file: ".tool-versions"
|
|
46
|
-
cache: "
|
|
47
|
-
cache-dependency-path: "
|
|
54
|
+
cache: "pnpm"
|
|
55
|
+
cache-dependency-path: "pnpm-lock.yaml"
|
|
48
56
|
|
|
49
57
|
- name: Install dependencies
|
|
50
|
-
run:
|
|
58
|
+
run: pnpm install --frozen-lockfile
|
|
51
59
|
|
|
52
60
|
- name: Install jq
|
|
53
|
-
uses: dcarbone/install-jq-action@
|
|
61
|
+
uses: dcarbone/install-jq-action@4fcb5062d7ce9bc4382d1a352d19ba3ba2c317c1 # v4.0.1
|
|
54
62
|
|
|
55
63
|
- name: Bump version
|
|
56
64
|
env:
|
|
57
65
|
BUMP_STRATEGY: "${{ github.event.inputs.bump-strategy }}"
|
|
58
66
|
GH_TOKEN: "${{ steps.github-app.outputs.token }}"
|
|
67
|
+
GH_APP_SLUG: "${{ steps.github-app.outputs.app-slug }}"
|
|
59
68
|
run: |
|
|
60
|
-
user_name="${
|
|
69
|
+
user_name="${GH_APP_SLUG}[bot]"
|
|
61
70
|
user_id="$(gh api "/users/${user_name}" --jq .id)"
|
|
62
71
|
git config user.email "${user_id}+${user_name}@users.noreply.github.com"
|
|
63
72
|
git config user.name "${user_name}"
|
|
64
|
-
|
|
73
|
+
pnpm run version:${BUMP_STRATEGY}
|
|
65
74
|
|
|
66
75
|
- name: Get metadata
|
|
67
76
|
id: metadata
|
|
@@ -71,13 +80,13 @@ jobs:
|
|
|
71
80
|
echo "ref-name=v${version}" >> "$GITHUB_OUTPUT"
|
|
72
81
|
|
|
73
82
|
- name: Publish to npm registry
|
|
74
|
-
uses: JS-DevTools/npm-publish@v4
|
|
83
|
+
uses: JS-DevTools/npm-publish@0fd2f4369c5d6bcfcde6091a7c527d810b9b5c3f # v4.1.5
|
|
75
84
|
with:
|
|
76
85
|
token: "${{ secrets.NPM_TOKEN }}"
|
|
77
86
|
registry: "https://registry.npmjs.org"
|
|
78
87
|
|
|
79
88
|
- name: Publish to GitHub Packages
|
|
80
|
-
uses: JS-DevTools/npm-publish@v4
|
|
89
|
+
uses: JS-DevTools/npm-publish@0fd2f4369c5d6bcfcde6091a7c527d810b9b5c3f # v4.1.5
|
|
81
90
|
with:
|
|
82
91
|
token: "${{ secrets.GITHUB_TOKEN }}"
|
|
83
92
|
registry: "https://npm.pkg.github.com"
|
|
@@ -23,6 +23,6 @@ jobs:
|
|
|
23
23
|
contents: read
|
|
24
24
|
security-events: write
|
|
25
25
|
with:
|
|
26
|
+
code-scanning-languages: "actions, typescript"
|
|
26
27
|
code-scanning: ${{ contains(fromJSON('["all", "code-scanning"]'), github.event.inputs.security-type || 'all') }}
|
|
27
|
-
code-scanning-languages: "actions,typescript"
|
|
28
28
|
sca: ${{ contains(fromJSON('["all", "sca"]'), github.event.inputs.security-type || 'all') }}
|
|
@@ -185,7 +185,9 @@ jobs:
|
|
|
185
185
|
contents: read
|
|
186
186
|
steps:
|
|
187
187
|
- name: Checkout ${{ github.repository }}
|
|
188
|
-
uses: actions/checkout@
|
|
188
|
+
uses: actions/checkout@v7
|
|
189
|
+
with:
|
|
190
|
+
persist-credentials: "false"
|
|
189
191
|
- name: Determine SARIF file
|
|
190
192
|
id: sarif-file
|
|
191
193
|
env:
|
|
@@ -294,12 +296,18 @@ jobs:
|
|
|
294
296
|
value=""
|
|
295
297
|
fi
|
|
296
298
|
echo "value=${value}" >> "$GITHUB_OUTPUT"
|
|
299
|
+
- name: Setup pnpm
|
|
300
|
+
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
|
|
301
|
+
with:
|
|
302
|
+
run_install: false
|
|
297
303
|
- name: Setup node
|
|
298
304
|
uses: actions/setup-node@v6
|
|
299
305
|
with:
|
|
300
306
|
node-version-file: ".tool-versions"
|
|
307
|
+
cache: "pnpm"
|
|
308
|
+
cache-dependency-path: "pnpm-lock.yaml"
|
|
301
309
|
- name: Install dependencies
|
|
302
|
-
run:
|
|
310
|
+
run: pnpm install --frozen-lockfile
|
|
303
311
|
- name: Send message
|
|
304
312
|
env:
|
|
305
313
|
SARIF_TO_SLACK_WEBHOOK_URL: "${{ secrets.TMP_EUGENE_SLACK_WEBHOOK }}"
|
|
@@ -6,7 +6,7 @@ on: # yamllint disable-line rule:truthy
|
|
|
6
6
|
paths:
|
|
7
7
|
- .github/workflows/unit-tests.yml
|
|
8
8
|
- .tool-versions
|
|
9
|
-
-
|
|
9
|
+
- vitest.config.ts
|
|
10
10
|
- package.json
|
|
11
11
|
- src/**
|
|
12
12
|
- tests/**
|
|
@@ -17,8 +17,8 @@ on: # yamllint disable-line rule:truthy
|
|
|
17
17
|
workflow_dispatch: {}
|
|
18
18
|
|
|
19
19
|
jobs:
|
|
20
|
-
|
|
21
|
-
name:
|
|
20
|
+
vitest:
|
|
21
|
+
name: Vitest
|
|
22
22
|
uses: fabasoad/reusable-workflows/.github/workflows/wf-js-unit-tests.yml@main
|
|
23
23
|
permissions:
|
|
24
24
|
contents: read
|
package/.pre-commit-config.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
default_install_hook_types: ["pre-commit", "pre-push"]
|
|
3
3
|
default_stages: ["pre-commit", "pre-push"]
|
|
4
|
-
exclude: ^(dist
|
|
4
|
+
exclude: ^((dist|etc|node_modules|temp|test-data)/.*|vitest-report.json|pnpm-lock.yaml)$
|
|
5
5
|
minimum_pre_commit_version: 4.4.0
|
|
6
6
|
repos:
|
|
7
7
|
- repo: local
|
|
@@ -29,7 +29,7 @@ repos:
|
|
|
29
29
|
stages: ["pre-push"]
|
|
30
30
|
# Security
|
|
31
31
|
- id: audit
|
|
32
|
-
name:
|
|
32
|
+
name: pnpm audit
|
|
33
33
|
entry: make audit
|
|
34
34
|
language: unsupported
|
|
35
35
|
pass_filenames: false
|
|
@@ -60,16 +60,16 @@ repos:
|
|
|
60
60
|
- --hook-args=--log-level debug
|
|
61
61
|
stages: ["pre-push"]
|
|
62
62
|
- repo: https://github.com/google/osv-scanner
|
|
63
|
-
rev: v2.
|
|
63
|
+
rev: v2.4.0
|
|
64
64
|
hooks:
|
|
65
65
|
- id: osv-scanner
|
|
66
66
|
args:
|
|
67
|
-
- --lockfile=
|
|
67
|
+
- --lockfile=pnpm-lock.yaml
|
|
68
68
|
verbose: true
|
|
69
69
|
stages: ["pre-push"]
|
|
70
70
|
# Markdown
|
|
71
71
|
- repo: https://github.com/igorshubovych/markdownlint-cli
|
|
72
|
-
rev: v0.
|
|
72
|
+
rev: v0.49.0
|
|
73
73
|
hooks:
|
|
74
74
|
- id: markdownlint-fix
|
|
75
75
|
stages: ["pre-commit"]
|
package/.tool-versions
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
nodejs
|
|
1
|
+
nodejs 26.4.0
|
package/Makefile
CHANGED
|
@@ -2,52 +2,52 @@
|
|
|
2
2
|
|
|
3
3
|
.PHONY: audit
|
|
4
4
|
audit:
|
|
5
|
-
@
|
|
5
|
+
@pnpm audit
|
|
6
6
|
|
|
7
7
|
.PHONY: build
|
|
8
8
|
build:
|
|
9
|
-
@
|
|
9
|
+
@pnpm run build
|
|
10
10
|
|
|
11
11
|
.PHONY: clean
|
|
12
12
|
clean:
|
|
13
|
-
@
|
|
13
|
+
@pnpm run clean
|
|
14
14
|
|
|
15
15
|
.PHONY: install
|
|
16
16
|
install:
|
|
17
|
-
@
|
|
17
|
+
@pnpm install
|
|
18
18
|
|
|
19
19
|
.PHONY: reinstall
|
|
20
20
|
reinstall:
|
|
21
21
|
@make clean
|
|
22
|
-
@
|
|
22
|
+
@pnpm run clean:unsafe
|
|
23
23
|
@make install
|
|
24
24
|
|
|
25
25
|
.PHONY: lint
|
|
26
26
|
lint:
|
|
27
|
-
@
|
|
27
|
+
@pnpm run lint
|
|
28
28
|
|
|
29
29
|
.PHONY: test/integration
|
|
30
30
|
test/integration:
|
|
31
|
-
@
|
|
31
|
+
@pnpm run test:integration
|
|
32
32
|
|
|
33
33
|
.PHONY: test/unit
|
|
34
34
|
test/unit:
|
|
35
|
-
@
|
|
35
|
+
@pnpm run test
|
|
36
36
|
|
|
37
37
|
.PHONY: test
|
|
38
38
|
test: test/unit
|
|
39
39
|
|
|
40
|
-
.PHONY:
|
|
41
|
-
|
|
42
|
-
@
|
|
40
|
+
.PHONY: pnpm/update
|
|
41
|
+
pnpm/update:
|
|
42
|
+
@pnpm update
|
|
43
43
|
|
|
44
44
|
.PHONY: pre-commit/update
|
|
45
45
|
pre-commit/update:
|
|
46
46
|
@command -v prek >/dev/null 2>&1 && prek auto-update || pre-commit autoupdate
|
|
47
47
|
|
|
48
48
|
.PHONY: update
|
|
49
|
-
update:
|
|
49
|
+
update: pnpm/update pre-commit/update
|
|
50
50
|
|
|
51
51
|
.PHONY: outdated
|
|
52
52
|
outdated:
|
|
53
|
-
@
|
|
53
|
+
@pnpm outdated
|
package/api-extractor.json
CHANGED
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
* SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
|
|
111
111
|
* DEFAULT VALUE: "<projectFolder>/tsconfig.json"
|
|
112
112
|
*/
|
|
113
|
-
|
|
113
|
+
"tsconfigFilePath": "<projectFolder>/tsconfig.build.json",
|
|
114
114
|
/**
|
|
115
115
|
* Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.
|
|
116
116
|
* The object must conform to the TypeScript tsconfig schema:
|
package/biome.json
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"includes": ["src/**", "tests/**"]
|
|
32
32
|
},
|
|
33
33
|
"javascript": {
|
|
34
|
-
"globals": ["Atomics", "SharedArrayBuffer", "
|
|
34
|
+
"globals": ["Atomics", "SharedArrayBuffer", "vi", "afterEach", "beforeAll", "beforeEach", "expect", "test", "describe"]
|
|
35
35
|
},
|
|
36
36
|
"overrides": [{ "includes": ["**/*.spec.ts", "**/*.spec.tsx"] }]
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SarifToSlackClient.d.ts","sourceRoot":"","sources":["../src/SarifToSlackClient.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,yBAAyB,EAG/B,MAAM,SAAS,CAAC;AAYjB;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,WAAW,CAAC,CAAa;IAEjC,OAAO,CAAC,OAAO,CAAyB;IAExC,OAAO;
|
|
1
|
+
{"version":3,"file":"SarifToSlackClient.d.ts","sourceRoot":"","sources":["../src/SarifToSlackClient.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,yBAAyB,EAG/B,MAAM,SAAS,CAAC;AAYjB;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,WAAW,CAAC,CAAa;IAEjC,OAAO,CAAC,OAAO,CAAyB;IAExC,OAAO,eAEN;IAED,OAAO,CAAC,MAAM,CAAE,oBAAoB;IAOpC;;;;;;;;;OASG;IACH,OAAoB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAW3G;mBAEoB,UAAU;IAoE/B;;;;;OAKG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAcjC;IAED,OAAO,KAAK,iBAAiB,GAyD5B;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
|
-
import
|
|
2
|
+
import { getLogger } from "@logtape/logtape";
|
|
3
3
|
import { SecurityLevel, SecuritySeverity, } from './types';
|
|
4
4
|
import { logMetadata } from './system';
|
|
5
5
|
import { extractListOfFiles } from './utils/FileUtils';
|
|
@@ -10,7 +10,7 @@ import { identifyColor } from './model/color/ColorIdentification';
|
|
|
10
10
|
import FindingArray from './model/FindingArray';
|
|
11
11
|
import { createSlackMessage } from './model/SlackMessage';
|
|
12
12
|
import { SendIf, sendIfLogMessage } from './model/SendIf';
|
|
13
|
-
import {
|
|
13
|
+
import { setupLogger } from "./setupLogger";
|
|
14
14
|
/**
|
|
15
15
|
* Service to convert SARIF files to Slack messages and send them.
|
|
16
16
|
* @public
|
|
@@ -39,8 +39,8 @@ export class SarifToSlackClient {
|
|
|
39
39
|
* @public
|
|
40
40
|
*/
|
|
41
41
|
static async create(webhookUrl, opts) {
|
|
42
|
-
|
|
43
|
-
const logger =
|
|
42
|
+
setupLogger(opts.loggerOptions);
|
|
43
|
+
const logger = getLogger();
|
|
44
44
|
logger.trace(opts);
|
|
45
45
|
const instance = new SarifToSlackClient();
|
|
46
46
|
instance._sendIf = opts.sendIf ?? instance._sendIf;
|
|
@@ -118,13 +118,13 @@ export class SarifToSlackClient {
|
|
|
118
118
|
if (this._sarifModel == null) {
|
|
119
119
|
throw new Error('Could not parse SARIF file(s).');
|
|
120
120
|
}
|
|
121
|
-
const logger =
|
|
121
|
+
const logger = getLogger();
|
|
122
122
|
if (this.shouldSendMessage) {
|
|
123
123
|
if (this._message == null) {
|
|
124
124
|
throw new Error('Slack message was not prepared.');
|
|
125
125
|
}
|
|
126
126
|
const text = await this._message.send();
|
|
127
|
-
logger.info(
|
|
127
|
+
logger.info(`Message sent. Status: ${text}`);
|
|
128
128
|
}
|
|
129
129
|
else {
|
|
130
130
|
logger.info(sendIfLogMessage(this._sendIf));
|
|
@@ -188,4 +188,4 @@ export class SarifToSlackClient {
|
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2FyaWZUb1NsYWNrQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NhcmlmVG9TbGFja0NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFlLE1BQU0sa0JBQWtCLENBQUM7QUFFMUQsT0FBTyxFQUtMLGFBQWEsRUFDYixnQkFBZ0IsR0FDakIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xFLE9BQU8sWUFBWSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxrQkFBa0IsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3JCLFFBQVEsQ0FBZ0I7SUFDeEIsV0FBVyxDQUFjO0lBRXpCLE9BQU8sR0FBVyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBRXhDO1FBQ0UsV0FBVyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQjtRQUNsQyxJQUFJ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
|