build-raptor 0.131.0 → 0.133.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/dist/deps/brand/brand.d.ts +5 -0
- package/dist/deps/brand/brand.js +3 -0
- package/dist/deps/brand/index.d.ts +1 -0
- package/dist/deps/brand/index.js +18 -0
- package/dist/deps/build-failed-error/build-failed-error.d.ts +14 -0
- package/dist/deps/build-failed-error/build-failed-error.js +13 -0
- package/dist/deps/build-failed-error/index.d.ts +1 -0
- package/dist/deps/build-failed-error/index.js +18 -0
- package/dist/deps/build-raptor-api/build-raptor-api.d.ts +351 -0
- package/dist/deps/build-raptor-api/build-raptor-api.js +132 -0
- package/dist/deps/build-raptor-api/index.d.ts +2 -0
- package/dist/deps/build-raptor-api/index.js +19 -0
- package/dist/deps/build-raptor-api/step-by-step-processor.d.ts +35 -0
- package/dist/deps/build-raptor-api/step-by-step-processor.js +3 -0
- package/dist/deps/build-raptor-core/breakdown.d.ts +18 -0
- package/dist/deps/build-raptor-core/breakdown.js +99 -0
- package/dist/deps/build-raptor-core/build-raptor-config.d.ts +21 -0
- package/dist/deps/build-raptor-core/build-raptor-config.js +25 -0
- package/dist/deps/build-raptor-core/default-asset-publisher.d.ts +10 -0
- package/dist/deps/build-raptor-core/default-asset-publisher.js +16 -0
- package/dist/deps/build-raptor-core/engine-bootstrapper.d.ts +50 -0
- package/dist/deps/build-raptor-core/engine-bootstrapper.js +200 -0
- package/dist/deps/build-raptor-core/engine-event-scheme.d.ts +20 -0
- package/dist/deps/build-raptor-core/engine-event-scheme.js +3 -0
- package/dist/deps/build-raptor-core/engine.d.ts +66 -0
- package/dist/deps/build-raptor-core/engine.js +285 -0
- package/dist/deps/build-raptor-core/examplify-zod.d.ts +93 -0
- package/dist/deps/build-raptor-core/examplify-zod.js +257 -0
- package/dist/deps/build-raptor-core/execution-plan.d.ts +20 -0
- package/dist/deps/build-raptor-core/execution-plan.js +66 -0
- package/dist/deps/build-raptor-core/execution-record.d.ts +17 -0
- package/dist/deps/build-raptor-core/execution-record.js +3 -0
- package/dist/deps/build-raptor-core/execution-type.d.ts +2 -0
- package/dist/deps/build-raptor-core/execution-type.js +3 -0
- package/dist/deps/build-raptor-core/find-repo-dir.d.ts +1 -0
- package/dist/deps/build-raptor-core/find-repo-dir.js +27 -0
- package/dist/deps/build-raptor-core/fingerprint-ledger.d.ts +33 -0
- package/dist/deps/build-raptor-core/fingerprint-ledger.js +164 -0
- package/dist/deps/build-raptor-core/fingerprint.d.ts +3 -0
- package/dist/deps/build-raptor-core/fingerprint.js +13 -0
- package/dist/deps/build-raptor-core/fingerprinter.d.ts +15 -0
- package/dist/deps/build-raptor-core/fingerprinter.js +122 -0
- package/dist/deps/build-raptor-core/hasher.d.ts +21 -0
- package/dist/deps/build-raptor-core/hasher.js +93 -0
- package/dist/deps/build-raptor-core/index.d.ts +9 -0
- package/dist/deps/build-raptor-core/index.js +26 -0
- package/dist/deps/build-raptor-core/model.d.ts +17 -0
- package/dist/deps/build-raptor-core/model.js +40 -0
- package/dist/deps/build-raptor-core/nop-asset-publisher.d.ts +6 -0
- package/dist/deps/build-raptor-core/nop-asset-publisher.js +12 -0
- package/dist/deps/build-raptor-core/performance-report.d.ts +5 -0
- package/dist/deps/build-raptor-core/performance-report.js +3 -0
- package/dist/deps/build-raptor-core/phase.d.ts +1 -0
- package/dist/deps/build-raptor-core/phase.js +3 -0
- package/dist/deps/build-raptor-core/planner.d.ts +12 -0
- package/dist/deps/build-raptor-core/planner.js +43 -0
- package/dist/deps/build-raptor-core/purger.d.ts +11 -0
- package/dist/deps/build-raptor-core/purger.js +65 -0
- package/dist/deps/build-raptor-core/slot-index.d.ts +6 -0
- package/dist/deps/build-raptor-core/slot-index.js +17 -0
- package/dist/deps/build-raptor-core/step-by-step-transmitter.d.ts +15 -0
- package/dist/deps/build-raptor-core/step-by-step-transmitter.js +94 -0
- package/dist/deps/build-raptor-core/tar-stream.d.ts +20 -0
- package/dist/deps/build-raptor-core/tar-stream.js +194 -0
- package/dist/deps/build-raptor-core/task-executor.d.ts +32 -0
- package/dist/deps/build-raptor-core/task-executor.js +321 -0
- package/dist/deps/build-raptor-core/task-store-cli.d.ts +1 -0
- package/dist/deps/build-raptor-core/task-store-cli.js +61 -0
- package/dist/deps/build-raptor-core/task-store-event.d.ts +17 -0
- package/dist/deps/build-raptor-core/task-store-event.js +3 -0
- package/dist/deps/build-raptor-core/task-store.d.ts +41 -0
- package/dist/deps/build-raptor-core/task-store.js +302 -0
- package/dist/deps/build-raptor-core/task-summary.d.ts +12 -0
- package/dist/deps/build-raptor-core/task-summary.js +3 -0
- package/dist/deps/build-raptor-core/task-tracker.d.ts +23 -0
- package/dist/deps/build-raptor-core/task-tracker.js +97 -0
- package/dist/deps/build-raptor-core/task.d.ts +30 -0
- package/dist/deps/build-raptor-core/task.js +90 -0
- package/dist/deps/build-raptor-core/updatable-task-output-registry.d.ts +13 -0
- package/dist/deps/build-raptor-core/updatable-task-output-registry.js +75 -0
- package/dist/deps/build-raptor-core/validate-task-infos.d.ts +3 -0
- package/dist/deps/build-raptor-core/validate-task-infos.js +53 -0
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.d.ts +1 -0
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.js +18 -0
- package/dist/deps/build-raptor-core-testkit/driver.d.ts +119 -0
- package/dist/deps/build-raptor-core-testkit/driver.js +305 -0
- package/dist/deps/build-raptor-core-testkit/index.d.ts +3 -0
- package/dist/deps/build-raptor-core-testkit/index.js +20 -0
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.d.ts +35 -0
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.js +226 -0
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.d.ts +27 -0
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.js +140 -0
- package/dist/deps/build-run-id/build-run-id.d.ts +3 -0
- package/dist/deps/build-run-id/build-run-id.js +13 -0
- package/dist/deps/build-run-id/index.d.ts +1 -0
- package/dist/deps/build-run-id/index.js +18 -0
- package/dist/deps/core-types/core-types.d.ts +29 -0
- package/dist/deps/core-types/core-types.js +81 -0
- package/dist/deps/core-types/index.d.ts +1 -0
- package/dist/deps/core-types/index.js +18 -0
- package/dist/deps/logger/index.d.ts +1 -0
- package/dist/deps/logger/index.js +18 -0
- package/dist/deps/logger/logger.d.ts +26 -0
- package/dist/deps/logger/logger.js +152 -0
- package/dist/deps/misc/arrays.d.ts +7 -0
- package/dist/deps/misc/arrays.js +67 -0
- package/dist/deps/misc/camelize-record.d.ts +6 -0
- package/dist/deps/misc/camelize-record.js +16 -0
- package/dist/deps/misc/clean-directory.d.ts +4 -0
- package/dist/deps/misc/clean-directory.js +80 -0
- package/dist/deps/misc/constructs.d.ts +106 -0
- package/dist/deps/misc/constructs.js +131 -0
- package/dist/deps/misc/directory-scanner.d.ts +49 -0
- package/dist/deps/misc/directory-scanner.js +165 -0
- package/dist/deps/misc/executor.d.ts +39 -0
- package/dist/deps/misc/executor.js +59 -0
- package/dist/deps/misc/file-system-storage-client.d.ts +23 -0
- package/dist/deps/misc/file-system-storage-client.js +93 -0
- package/dist/deps/misc/folderify.d.ts +8 -0
- package/dist/deps/misc/folderify.js +86 -0
- package/dist/deps/misc/graph.d.ts +29 -0
- package/dist/deps/misc/graph.js +200 -0
- package/dist/deps/misc/in-memory-storage-client.d.ts +21 -0
- package/dist/deps/misc/in-memory-storage-client.js +75 -0
- package/dist/deps/misc/index.d.ts +20 -0
- package/dist/deps/misc/index.js +37 -0
- package/dist/deps/misc/int.d.ts +10 -0
- package/dist/deps/misc/int.js +29 -0
- package/dist/deps/misc/internal/graph-executor.d.ts +15 -0
- package/dist/deps/misc/internal/graph-executor.js +93 -0
- package/dist/deps/misc/maps.d.ts +29 -0
- package/dist/deps/misc/maps.js +47 -0
- package/dist/deps/misc/misc.d.ts +23 -0
- package/dist/deps/misc/misc.js +94 -0
- package/dist/deps/misc/object-map.d.ts +10 -0
- package/dist/deps/misc/object-map.js +26 -0
- package/dist/deps/misc/promises.d.ts +39 -0
- package/dist/deps/misc/promises.js +78 -0
- package/dist/deps/misc/records.d.ts +11 -0
- package/dist/deps/misc/records.js +40 -0
- package/dist/deps/misc/slurp-dir.d.ts +1 -0
- package/dist/deps/misc/slurp-dir.js +14 -0
- package/dist/deps/misc/storage-client.d.ts +12 -0
- package/dist/deps/misc/storage-client.js +3 -0
- package/dist/deps/misc/stream-to-buffer.d.ts +2 -0
- package/dist/deps/misc/stream-to-buffer.js +26 -0
- package/dist/deps/misc/strings.d.ts +12 -0
- package/dist/deps/misc/strings.js +68 -0
- package/dist/deps/misc/typed-publisher.d.ts +17 -0
- package/dist/deps/misc/typed-publisher.js +65 -0
- package/dist/deps/repo-protocol/index.d.ts +3 -0
- package/dist/deps/repo-protocol/index.js +20 -0
- package/dist/deps/repo-protocol/repo-protocol.d.ts +49 -0
- package/dist/deps/repo-protocol/repo-protocol.js +3 -0
- package/dist/deps/repo-protocol/task-info.d.ts +18 -0
- package/dist/deps/repo-protocol/task-info.js +3 -0
- package/dist/deps/repo-protocol/test-run-summary.d.ts +54 -0
- package/dist/deps/repo-protocol/test-run-summary.js +32 -0
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.d.ts +5 -0
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.js +26 -0
- package/dist/deps/repo-protocol-toolbox/index.d.ts +3 -0
- package/dist/deps/repo-protocol-toolbox/index.js +20 -0
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.d.ts +10 -0
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.js +90 -0
- package/dist/deps/repo-protocol-toolbox/task-definition.d.ts +14 -0
- package/dist/deps/repo-protocol-toolbox/task-definition.js +3 -0
- package/dist/deps/reporter-output/index.d.ts +1 -0
- package/dist/deps/reporter-output/index.js +18 -0
- package/dist/deps/reporter-output/reporter-output.d.ts +49 -0
- package/dist/deps/reporter-output/reporter-output.js +25 -0
- package/dist/deps/s3-storage-client/creds.d.ts +4 -0
- package/dist/deps/s3-storage-client/creds.js +3 -0
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.d.ts +3 -0
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.js +45 -0
- package/dist/deps/s3-storage-client/index.d.ts +2 -0
- package/dist/deps/s3-storage-client/index.js +19 -0
- package/dist/deps/s3-storage-client/main.d.ts +1 -0
- package/dist/deps/s3-storage-client/main.js +20 -0
- package/dist/deps/s3-storage-client/s3-storage-client.d.ts +25 -0
- package/dist/deps/s3-storage-client/s3-storage-client.js +134 -0
- package/dist/deps/task-name/index.d.ts +1 -0
- package/dist/deps/task-name/index.js +18 -0
- package/dist/deps/task-name/task-name.d.ts +17 -0
- package/dist/deps/task-name/task-name.js +44 -0
- package/dist/deps/unit-metadata/index.d.ts +1 -0
- package/dist/deps/unit-metadata/index.js +18 -0
- package/dist/deps/unit-metadata/unit-metadata.d.ts +14 -0
- package/dist/deps/unit-metadata/unit-metadata.js +32 -0
- package/dist/deps/yarn-repo-protocol/build-task-record.d.ts +61 -0
- package/dist/deps/yarn-repo-protocol/build-task-record.js +29 -0
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.d.ts +4 -0
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.js +26 -0
- package/dist/deps/yarn-repo-protocol/index.d.ts +2 -0
- package/dist/deps/yarn-repo-protocol/index.js +19 -0
- package/dist/deps/yarn-repo-protocol/rerun-list.d.ts +12 -0
- package/dist/deps/yarn-repo-protocol/rerun-list.js +6 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.d.ts +24 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.js +34 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.d.ts +82 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.js +1036 -0
- package/dist/src/build-raptor-cli.d.ts +60 -0
- package/dist/src/build-raptor-cli.js +514 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.js +23 -0
- package/dist/src/register-asset-request.d.ts +18 -0
- package/dist/src/register-asset-request.js +11 -0
- package/dist/src/task-execution-visualizer.d.ts +17 -0
- package/dist/src/task-execution-visualizer.js +116 -0
- package/package.json +17 -14
- package/build-raptor.js +0 -7259
- package/index.d.ts +0 -22
- package/index.js +0 -7231
|
@@ -0,0 +1,1036 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.YarnRepoProtocol = void 0;
|
|
40
|
+
const build_failed_error_1 = require("build-failed-error");
|
|
41
|
+
const core_types_1 = require("core-types");
|
|
42
|
+
const escape_string_regexp_1 = __importDefault(require("escape-string-regexp"));
|
|
43
|
+
const execa_1 = __importDefault(require("execa"));
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const fse = __importStar(require("fs-extra"));
|
|
46
|
+
const misc_1 = require("misc");
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const reporter_output_1 = require("reporter-output");
|
|
49
|
+
const task_name_1 = require("task-name");
|
|
50
|
+
const Tmp = __importStar(require("tmp-promise"));
|
|
51
|
+
const unit_metadata_1 = require("unit-metadata");
|
|
52
|
+
const zod_1 = require("zod");
|
|
53
|
+
const build_task_record_1 = require("./build-task-record");
|
|
54
|
+
const generate_test_run_summary_1 = require("./generate-test-run-summary");
|
|
55
|
+
const rerun_list_1 = require("./rerun-list");
|
|
56
|
+
const yarn_repo_protocol_config_1 = require("./yarn-repo-protocol-config");
|
|
57
|
+
const yarnWorkspacesInfoSchema = zod_1.z.record(zod_1.z.object({
|
|
58
|
+
location: zod_1.z.string(),
|
|
59
|
+
workspaceDependencies: zod_1.z.string().array(),
|
|
60
|
+
mismatchedWorkspaceDependencies: zod_1.z.string().array(),
|
|
61
|
+
}));
|
|
62
|
+
async function getTempFile() {
|
|
63
|
+
const ret = (await Tmp.file()).path;
|
|
64
|
+
return ret;
|
|
65
|
+
}
|
|
66
|
+
function isSimpleName(fileName) {
|
|
67
|
+
return path.basename(fileName) === fileName;
|
|
68
|
+
}
|
|
69
|
+
class YarnRepoProtocol {
|
|
70
|
+
constructor(logger,
|
|
71
|
+
// TODO(imaman): deprecate it.
|
|
72
|
+
assetPublisher) {
|
|
73
|
+
this.logger = logger;
|
|
74
|
+
this.assetPublisher = assetPublisher;
|
|
75
|
+
this.scriptNames = {
|
|
76
|
+
build: 'build',
|
|
77
|
+
validate: 'validate',
|
|
78
|
+
postBuild: 'build:post',
|
|
79
|
+
prepareAssets: 'prepare-assets',
|
|
80
|
+
};
|
|
81
|
+
this.src = 'src';
|
|
82
|
+
this.tests = 'tests';
|
|
83
|
+
this.tsconfigBaseName = 'tsconfig-base.json';
|
|
84
|
+
if (!isSimpleName(this.tsconfigBaseName)) {
|
|
85
|
+
throw new Error(`tsconfig base file name must be a simple name (not a path). Got: "${this.tsconfigBaseName}"`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
getConfigSchema() {
|
|
89
|
+
return yarn_repo_protocol_config_1.YarnRepoProtocolConfig;
|
|
90
|
+
}
|
|
91
|
+
dist(which) {
|
|
92
|
+
const d = `dist`;
|
|
93
|
+
return which === undefined
|
|
94
|
+
? d
|
|
95
|
+
: which === 's'
|
|
96
|
+
? `${d}/${this.src}`
|
|
97
|
+
: which === 't'
|
|
98
|
+
? `${d}/${this.tests}`
|
|
99
|
+
: (0, misc_1.shouldNeverHappen)(which);
|
|
100
|
+
}
|
|
101
|
+
get state() {
|
|
102
|
+
return this.state_ ?? (0, misc_1.failMe)('state was not set');
|
|
103
|
+
}
|
|
104
|
+
get testRunSummaryFile() {
|
|
105
|
+
return path.join(this.state.outDirName, 'test-runs.json');
|
|
106
|
+
}
|
|
107
|
+
hasRunScript(unitId, runScript) {
|
|
108
|
+
const pj = this.getPackageJson(unitId);
|
|
109
|
+
const runScripts = Object.keys(pj.scripts ?? {});
|
|
110
|
+
return runScripts.includes(runScript);
|
|
111
|
+
}
|
|
112
|
+
getTestCommand(unitId) {
|
|
113
|
+
// Check if custom test commands are allowed
|
|
114
|
+
const toggle = this.state.config.enableCustomTestCommands ?? true;
|
|
115
|
+
if (!toggle) {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
const pj = this.getPackageJson(unitId);
|
|
119
|
+
// Check for buildRaptor.testCommand in package.json
|
|
120
|
+
const schema = zod_1.z.object({ buildRaptor: zod_1.z.object({ testCommand: zod_1.z.string().optional() }).optional() });
|
|
121
|
+
const { buildRaptor } = schema.parse(pj);
|
|
122
|
+
return buildRaptor?.testCommand;
|
|
123
|
+
}
|
|
124
|
+
async hasSpecFiles(testsDir) {
|
|
125
|
+
try {
|
|
126
|
+
const files = await misc_1.DirectoryScanner.listPaths(testsDir, { startingPointMustExist: false });
|
|
127
|
+
return files.some(file => file.endsWith('.spec.ts'));
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
// If directory doesn't exist or error reading it, assume no spec files
|
|
131
|
+
this.logger.info(`Error checking for spec files in ${testsDir}: ${error}`);
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
parseConfig(untypedConfig) {
|
|
136
|
+
const parseResult = yarn_repo_protocol_config_1.YarnRepoProtocolConfig.safeParse(untypedConfig ?? {}, { path: ['repoProtocol'] });
|
|
137
|
+
if (parseResult.success) {
|
|
138
|
+
return parseResult.data;
|
|
139
|
+
}
|
|
140
|
+
const formattedIssues = parseResult.error.issues.map(at => at.path.length ? `Attribute: "${at.path.join('.')}": ${at.message}` : at.message);
|
|
141
|
+
throw new build_failed_error_1.BuildFailedError(`bad config\n${formattedIssues.join('\n')}`);
|
|
142
|
+
}
|
|
143
|
+
async initialize(rootDir, publisher, outDirName, repoProtocolConfig) {
|
|
144
|
+
const yarnInfo = await this.getYarnInfo(rootDir);
|
|
145
|
+
const config = this.parseConfig(repoProtocolConfig);
|
|
146
|
+
const allUnits = computeUnits(yarnInfo);
|
|
147
|
+
const units = computeRealUnits(allUnits);
|
|
148
|
+
const [packageByUnitId, _] = await Promise.all([
|
|
149
|
+
readPackages(rootDir, units),
|
|
150
|
+
createOutDirs(rootDir, units, outDirName),
|
|
151
|
+
]);
|
|
152
|
+
const versionByPackageId = computeVersions([...packageByUnitId.values()]);
|
|
153
|
+
const violations = [];
|
|
154
|
+
const graph = new misc_1.Graph(x => x);
|
|
155
|
+
for (const [p, data] of Object.entries(yarnInfo)) {
|
|
156
|
+
const uid = (0, unit_metadata_1.UnitId)(p);
|
|
157
|
+
graph.vertex(uid);
|
|
158
|
+
for (const dep of data.workspaceDependencies) {
|
|
159
|
+
graph.edge(uid, (0, unit_metadata_1.UnitId)(dep));
|
|
160
|
+
}
|
|
161
|
+
for (const d of data.mismatchedWorkspaceDependencies) {
|
|
162
|
+
violations.push([uid, (0, unit_metadata_1.UnitId)(d)]);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const violation = violations.find(Boolean);
|
|
166
|
+
if (violation) {
|
|
167
|
+
const [consumer, supplier] = violation;
|
|
168
|
+
const ps = (0, misc_1.hardGet)(packageByUnitId, supplier);
|
|
169
|
+
// We assume that there is a consistent version for all dependencies so we lookup that version, instead of looking
|
|
170
|
+
// into the package.json of the consumer and digging the exact version that is specified there.
|
|
171
|
+
const v = (0, misc_1.hardGet)(versionByPackageId, supplier);
|
|
172
|
+
// TODO(imaman): generate a comprehensive error message that lists *all* violations.
|
|
173
|
+
throw new build_failed_error_1.BuildFailedError(`Version mismatch for dependency "${supplier}" of "${consumer}": ${ps.version} vs. ${v}`);
|
|
174
|
+
}
|
|
175
|
+
await this.generateTsConfigFiles(rootDir, units, graph);
|
|
176
|
+
await this.generateSymlinksToPackages(rootDir, units);
|
|
177
|
+
this.state_ = {
|
|
178
|
+
yarnInfo,
|
|
179
|
+
graph,
|
|
180
|
+
rootDir,
|
|
181
|
+
units: allUnits,
|
|
182
|
+
packageByUnitId,
|
|
183
|
+
versionByPackageId,
|
|
184
|
+
publisher,
|
|
185
|
+
config,
|
|
186
|
+
outDirName,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async generateSymlinksToPackages(rootDir, units) {
|
|
190
|
+
const nodeModules = (0, core_types_1.PathInRepo)('node_modules');
|
|
191
|
+
const nodeModulesLoc = rootDir.resolve(nodeModules);
|
|
192
|
+
await fse.mkdirp(rootDir.resolve(nodeModules));
|
|
193
|
+
for (const u of units) {
|
|
194
|
+
const link = nodeModules.expand(u.id);
|
|
195
|
+
const linkLoc = rootDir.resolve(link);
|
|
196
|
+
const exists = await fse.pathExists(linkLoc);
|
|
197
|
+
if (exists) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const packageLoc = rootDir.resolve(u.pathInRepo);
|
|
201
|
+
const packageFromNodeModules = path.relative(nodeModulesLoc, packageLoc);
|
|
202
|
+
await fse.symlink(packageFromNodeModules, linkLoc);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async generateTsConfigFiles(rootDir, units, graph) {
|
|
206
|
+
const rootBase = rootDir.resolve((0, core_types_1.PathInRepo)(this.tsconfigBaseName));
|
|
207
|
+
const rootBaseExists = await fse.pathExists(rootBase);
|
|
208
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
209
|
+
const rootBaseContent = rootBaseExists ? (await fse.readJSON(rootBase)) : {};
|
|
210
|
+
const defaultOptions = {
|
|
211
|
+
module: 'CommonJS',
|
|
212
|
+
inlineSourceMap: true,
|
|
213
|
+
newLine: 'LF',
|
|
214
|
+
declaration: true,
|
|
215
|
+
target: 'ES2021',
|
|
216
|
+
lib: ['ES2021', 'DOM'],
|
|
217
|
+
strict: true,
|
|
218
|
+
noImplicitAny: true,
|
|
219
|
+
moduleResolution: 'node',
|
|
220
|
+
allowSyntheticDefaultImports: true,
|
|
221
|
+
esModuleInterop: true,
|
|
222
|
+
resolveJsonModule: true,
|
|
223
|
+
};
|
|
224
|
+
for (const u of units) {
|
|
225
|
+
const deps = graph.neighborsOf(u.id);
|
|
226
|
+
const localBase = rootDir.resolve(u.pathInRepo.expand(this.tsconfigBaseName));
|
|
227
|
+
const localBaseExists = await fse.pathExists(localBase);
|
|
228
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
229
|
+
const localBaseContent = localBaseExists ? (await fse.readJSON(localBase)) : {};
|
|
230
|
+
const additions = [...(localBaseContent.include ?? []), ...(rootBaseContent.include ?? [])];
|
|
231
|
+
const tsconf = {
|
|
232
|
+
...(localBaseExists
|
|
233
|
+
? { extends: `./${this.tsconfigBaseName}` }
|
|
234
|
+
: rootBaseExists
|
|
235
|
+
? { extends: path.relative(u.pathInRepo.val, this.tsconfigBaseName) }
|
|
236
|
+
: {}),
|
|
237
|
+
compilerOptions: {
|
|
238
|
+
...(localBaseExists || rootBaseExists ? {} : defaultOptions),
|
|
239
|
+
composite: true,
|
|
240
|
+
outDir: this.dist(),
|
|
241
|
+
},
|
|
242
|
+
references: deps.map(d => {
|
|
243
|
+
const dp = units.find(at => at.id === d) ?? (0, misc_1.failMe)(`Unit not found: ${d} (when generating tsconfig.json for ${u.id})`);
|
|
244
|
+
return {
|
|
245
|
+
path: path.relative(u.pathInRepo.val, dp.pathInRepo.val),
|
|
246
|
+
};
|
|
247
|
+
}),
|
|
248
|
+
include: [
|
|
249
|
+
`${this.src}/**/*`,
|
|
250
|
+
`${this.src}/**/*.json`,
|
|
251
|
+
`${this.tests}/**/*`,
|
|
252
|
+
`${this.tests}/**/*.json`,
|
|
253
|
+
...additions,
|
|
254
|
+
],
|
|
255
|
+
};
|
|
256
|
+
if (!tsconf.references?.length) {
|
|
257
|
+
delete tsconf.references;
|
|
258
|
+
}
|
|
259
|
+
const content = JSON.stringify(tsconf, null, 2);
|
|
260
|
+
const p = rootDir.resolve(u.pathInRepo.expand('tsconfig.json'));
|
|
261
|
+
if (await fse.pathExists(p)) {
|
|
262
|
+
const existing = JSON.stringify(await fse.readJSON(p, 'utf-8'), null, 2);
|
|
263
|
+
if (existing.trim() === content.trim()) {
|
|
264
|
+
this.logger.info(`skipping generation of tsconfig.json in ${u.id} - no changes`);
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
this.logger.info(`updating the tsconfig.json file of ${u.id}`);
|
|
269
|
+
await fse.writeFile(p, content);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async close() { }
|
|
273
|
+
async run(cmd, args, dir, outputFile, additionalEnvVars = {}) {
|
|
274
|
+
const summary = `<${dir}$ ${cmd} ${args.join(' ')}>`;
|
|
275
|
+
this.logger.info(`Dispatching ${summary}. output: ${outputFile}`);
|
|
276
|
+
const out = await fse.open(outputFile, 'w');
|
|
277
|
+
try {
|
|
278
|
+
const p = await (0, execa_1.default)(cmd, args, { cwd: dir, stdout: out, stderr: out, reject: false, env: additionalEnvVars });
|
|
279
|
+
this.logger.info(`exitCode of ${cmd} ${args.join(' ')} is ${p.exitCode}`);
|
|
280
|
+
if (p.exitCode === 0) {
|
|
281
|
+
return 'OK';
|
|
282
|
+
}
|
|
283
|
+
return 'FAIL';
|
|
284
|
+
}
|
|
285
|
+
catch (e) {
|
|
286
|
+
this.logger.error(`execution of ${summary} failed`, e);
|
|
287
|
+
return 'CRASH';
|
|
288
|
+
}
|
|
289
|
+
finally {
|
|
290
|
+
await fse.close(out);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// TODO(imaman): this should be retired. custom build tasks should be used instead.
|
|
294
|
+
async runAdditionalBuildActions(unitId, dir, outputFile) {
|
|
295
|
+
await this.checkBuiltFiles(dir);
|
|
296
|
+
return await this.runPostBuild(unitId, dir, outputFile);
|
|
297
|
+
}
|
|
298
|
+
async runPostBuild(unitId, dir, outputFile) {
|
|
299
|
+
if (!this.hasRunScript(unitId, this.scriptNames.postBuild)) {
|
|
300
|
+
return 'OK';
|
|
301
|
+
}
|
|
302
|
+
const tempFile = await getTempFile();
|
|
303
|
+
const ret = await this.run('npm', ['run', this.scriptNames.postBuild], dir, tempFile);
|
|
304
|
+
const toAppend = await fse.readFile(tempFile);
|
|
305
|
+
await fse.appendFile(outputFile, toAppend);
|
|
306
|
+
return ret;
|
|
307
|
+
}
|
|
308
|
+
async checkBuiltFiles(dir) {
|
|
309
|
+
for (const codeDir of [this.src, this.tests]) {
|
|
310
|
+
const inputFiles = new Map();
|
|
311
|
+
const inputDir = path.join(dir, codeDir);
|
|
312
|
+
const paths = await misc_1.DirectoryScanner.listPaths(inputDir, { startingPointMustExist: false });
|
|
313
|
+
for (const p of paths) {
|
|
314
|
+
inputFiles.set(p, fs.statSync(path.join(inputDir, p)).mode);
|
|
315
|
+
}
|
|
316
|
+
const d = path.join(dir, `${this.dist()}/${codeDir}`);
|
|
317
|
+
const distFiles = await misc_1.DirectoryScanner.listPaths(d, { startingPointMustExist: false });
|
|
318
|
+
const replaceSuffix = (f, targetSuffx) => f.replace(/\.js$/, targetSuffx).replace(/\.d\.ts$/, targetSuffx);
|
|
319
|
+
const inputFileExists = (f) => {
|
|
320
|
+
let ret;
|
|
321
|
+
ret = inputFiles.get(f);
|
|
322
|
+
if (ret) {
|
|
323
|
+
return ret;
|
|
324
|
+
}
|
|
325
|
+
ret = inputFiles.get(replaceSuffix(f, '.ts'));
|
|
326
|
+
if (ret) {
|
|
327
|
+
return ret;
|
|
328
|
+
}
|
|
329
|
+
ret = inputFiles.get(replaceSuffix(f, '.tsx'));
|
|
330
|
+
if (ret) {
|
|
331
|
+
return ret;
|
|
332
|
+
}
|
|
333
|
+
return undefined;
|
|
334
|
+
};
|
|
335
|
+
for (const f of distFiles) {
|
|
336
|
+
const orig = inputFileExists(f);
|
|
337
|
+
const resolved = path.join(d, f);
|
|
338
|
+
if (orig === undefined) {
|
|
339
|
+
this.logger.info(`deleting unmatched dist file: ${f}`);
|
|
340
|
+
fs.rmSync(resolved);
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
fs.chmodSync(resolved, orig);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
getInstallFeatureToggle() {
|
|
349
|
+
const raw = this.state.config.install ?? 'off';
|
|
350
|
+
if (typeof raw === 'boolean') {
|
|
351
|
+
return raw ? 'on' : 'off';
|
|
352
|
+
}
|
|
353
|
+
return raw;
|
|
354
|
+
}
|
|
355
|
+
async execute(taskName, outputFile, _buildRunId) {
|
|
356
|
+
if (taskName === installTaskName) {
|
|
357
|
+
const ft = this.getInstallFeatureToggle();
|
|
358
|
+
return (0, misc_1.switchOn)(ft, {
|
|
359
|
+
off: async () => {
|
|
360
|
+
throw new Error(`cannot execute ${taskName} when its feature toggle is set to ${ft}`);
|
|
361
|
+
},
|
|
362
|
+
dormant: async () => {
|
|
363
|
+
fs.writeFileSync(outputFile, '');
|
|
364
|
+
const ret = 'OK';
|
|
365
|
+
return ret;
|
|
366
|
+
},
|
|
367
|
+
on: async () => {
|
|
368
|
+
this.logger.print(`Installing dependencies...`);
|
|
369
|
+
const ret = await this.run('yarn', ['--frozen-lockfile'], this.state.rootDir.resolve(), outputFile);
|
|
370
|
+
return ret;
|
|
371
|
+
},
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
const { taskKind, unitId, subKind } = (0, task_name_1.TaskName)().undo(taskName);
|
|
375
|
+
const u = this.state.units.find(at => at.id === unitId) ?? (0, misc_1.failMe)(`unit ID not found: ${unitId}`);
|
|
376
|
+
const dir = this.state.rootDir.resolve(u.pathInRepo);
|
|
377
|
+
if (taskKind === 'build' && subKind === '') {
|
|
378
|
+
let buildStatus;
|
|
379
|
+
if (this.state.config.uberBuild ?? true) {
|
|
380
|
+
buildStatus = await this.runUberBuild(outputFile, taskName);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
buildStatus = await this.run('npm', ['run', this.scriptNames.build], dir, outputFile);
|
|
384
|
+
}
|
|
385
|
+
return await (0, misc_1.switchOn)(buildStatus, {
|
|
386
|
+
CRASH: () => Promise.resolve(buildStatus),
|
|
387
|
+
FAIL: () => Promise.resolve(buildStatus),
|
|
388
|
+
OK: () => this.runAdditionalBuildActions(u.id, dir, outputFile),
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
if (taskKind === 'build' && subKind !== '') {
|
|
392
|
+
return await this.run('npm', ['run', subKind], dir, outputFile);
|
|
393
|
+
}
|
|
394
|
+
if (taskKind === 'test') {
|
|
395
|
+
// Check if there are any *.spec.ts files in the tests directory
|
|
396
|
+
const testsDir = path.join(dir, this.tests);
|
|
397
|
+
const hasSpecFiles = await this.hasSpecFiles(testsDir);
|
|
398
|
+
if (!hasSpecFiles) {
|
|
399
|
+
// No spec files found - skip test execution
|
|
400
|
+
this.logger.info(`No *.spec.ts files found in ${testsDir}, skipping test execution`);
|
|
401
|
+
await fs.promises.writeFile(outputFile, `No test files found in ${testsDir}\n`);
|
|
402
|
+
// Create empty test summary file to maintain invariant
|
|
403
|
+
const dirInRepo = this.state.rootDir.unresolve(dir);
|
|
404
|
+
const resolvedSummaryFile = this.state.rootDir.resolve(dirInRepo.expand(this.testRunSummaryFile));
|
|
405
|
+
fs.writeFileSync(resolvedSummaryFile, JSON.stringify({}));
|
|
406
|
+
// Create empty jest output file
|
|
407
|
+
const jof = path.join(dir, JEST_OUTPUT_FILE);
|
|
408
|
+
fs.writeFileSync(jof, JSON.stringify([]));
|
|
409
|
+
// Still run validate if it exists
|
|
410
|
+
const tempFile = await getTempFile();
|
|
411
|
+
const validateResult = await this.runValidate(u, dir, tempFile);
|
|
412
|
+
const toAppend = await fse.readFile(tempFile);
|
|
413
|
+
await fse.appendFile(outputFile, toAppend);
|
|
414
|
+
return validateResult;
|
|
415
|
+
}
|
|
416
|
+
const tempFile = await getTempFile();
|
|
417
|
+
const testCommand = this.getTestCommand(u.id);
|
|
418
|
+
// Run test and validate in parallel (same approach for both custom and Jest)
|
|
419
|
+
const [testResult, validateResult] = await Promise.all([
|
|
420
|
+
testCommand ? this.runCustomTest(u.id, dir, taskName, outputFile) : this.runJest(dir, taskName, outputFile),
|
|
421
|
+
this.runValidate(u, dir, tempFile),
|
|
422
|
+
]);
|
|
423
|
+
// Merge validate output into main output file
|
|
424
|
+
const toAppend = await fse.readFile(tempFile);
|
|
425
|
+
await fse.appendFile(outputFile, toAppend);
|
|
426
|
+
// Return based on test result: if test fails, return test result; if test passes, return validate result
|
|
427
|
+
return (0, misc_1.switchOn)(testResult, {
|
|
428
|
+
CRASH: () => testResult,
|
|
429
|
+
FAIL: () => testResult,
|
|
430
|
+
OK: () => validateResult,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
if (taskKind === 'pack') {
|
|
434
|
+
const ret = await this.pack(u, dir);
|
|
435
|
+
await fse.writeFile(outputFile, '');
|
|
436
|
+
return ret;
|
|
437
|
+
}
|
|
438
|
+
if (taskKind === 'publish-assets') {
|
|
439
|
+
const scriptName = this.scriptNames.prepareAssets;
|
|
440
|
+
const fullPath = path.join(dir, PREPARED_ASSETS_DIR);
|
|
441
|
+
await fse.rm(fullPath, { force: true, recursive: true });
|
|
442
|
+
await fse.mkdirp(fullPath);
|
|
443
|
+
const ret = await this.run('npm', ['run', scriptName], dir, outputFile);
|
|
444
|
+
const exists = await fse.pathExists(fullPath);
|
|
445
|
+
if (!exists) {
|
|
446
|
+
throw new build_failed_error_1.BuildFailedError(`Output file ${path.basename(fullPath)} was not created by the ${scriptName} run script in ${dir}`);
|
|
447
|
+
}
|
|
448
|
+
const files = await fse.readdir(fullPath);
|
|
449
|
+
await Promise.all(files.map(async (f) => {
|
|
450
|
+
const contentToPublish = await fse.readFile(path.join(fullPath, f));
|
|
451
|
+
this.logger.info(`unit ${u.id}: publishing asset ${f}`);
|
|
452
|
+
const casAddress = await this.assetPublisher.publishAsset(u, contentToPublish, f);
|
|
453
|
+
this.logger.info(`unit ${u.id}: asset ${f} published to cas ${casAddress}`);
|
|
454
|
+
this.state.publisher.publish('assetPublished', {
|
|
455
|
+
taskName,
|
|
456
|
+
casAddress,
|
|
457
|
+
file: f,
|
|
458
|
+
});
|
|
459
|
+
}));
|
|
460
|
+
return ret;
|
|
461
|
+
}
|
|
462
|
+
throw new Error(`Unknown task ${taskKind} (at ${dir})`);
|
|
463
|
+
}
|
|
464
|
+
async runUberBuild(outputFile, taskName) {
|
|
465
|
+
if (this.state.uberBuildPromise) {
|
|
466
|
+
const ret = await this.state.uberBuildPromise;
|
|
467
|
+
await fse.writeFile(outputFile, ``);
|
|
468
|
+
return ret;
|
|
469
|
+
}
|
|
470
|
+
this.logger.info(`logging uberbuild in ${outputFile} (triggered by ${taskName})`);
|
|
471
|
+
const dirs = computeRealUnits(this.state.units).map(at => at.pathInRepo.val);
|
|
472
|
+
const compiler = this.state.config.compilerExecutable ?? 'tsc';
|
|
473
|
+
const p = this.run('npx', [compiler, '--build', ...dirs], this.state.rootDir.resolve(), outputFile);
|
|
474
|
+
this.state.uberBuildPromise = p;
|
|
475
|
+
const ret = await this.state.uberBuildPromise;
|
|
476
|
+
return ret;
|
|
477
|
+
}
|
|
478
|
+
async runJest(dir, taskName, outputFile) {
|
|
479
|
+
const dirInRepo = this.state.rootDir.unresolve(dir);
|
|
480
|
+
// file path resolution here is ugly. it's probably better to change dir (parameter of this function) to be
|
|
481
|
+
// PathInRepo
|
|
482
|
+
const resolvedSummaryFile = this.state.rootDir.resolve(dirInRepo.expand(this.testRunSummaryFile));
|
|
483
|
+
// We must create the file (empty) such that even if the task fails there is still an output (to keep the invariant
|
|
484
|
+
// that all outputs must be produced by a task when it runs).
|
|
485
|
+
fs.writeFileSync(resolvedSummaryFile, JSON.stringify({}));
|
|
486
|
+
const jof = path.join(dir, JEST_OUTPUT_FILE);
|
|
487
|
+
const testsToRun = await this.computeTestsToRun(jof);
|
|
488
|
+
const reporterOutputFile = (await Tmp.file()).path;
|
|
489
|
+
const ret = await this.run('npx', [
|
|
490
|
+
'jest',
|
|
491
|
+
...testsToRun,
|
|
492
|
+
'--outputFile',
|
|
493
|
+
reporterOutputFile,
|
|
494
|
+
'--reporters',
|
|
495
|
+
'build-raptor-jest-reporter',
|
|
496
|
+
'--reporters',
|
|
497
|
+
'default',
|
|
498
|
+
], dir, outputFile, this.state.config.additionalJestEnvVars);
|
|
499
|
+
const readStdout = () => fs.readFileSync(outputFile, 'utf-8').trim();
|
|
500
|
+
const latest = fs.readFileSync(reporterOutputFile, 'utf-8');
|
|
501
|
+
if (latest.trim().length === 0) {
|
|
502
|
+
const output = readStdout();
|
|
503
|
+
if (output.length) {
|
|
504
|
+
this.logger.print(`<No Jest tests were invoked. Jest output follows below. latest=${JSON.stringify(latest)}>\n${output}`);
|
|
505
|
+
fs.writeFileSync(jof, JSON.stringify(emptyRerunList));
|
|
506
|
+
return 'FAIL';
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
let reporterOutput;
|
|
510
|
+
try {
|
|
511
|
+
const parsed = JSON.parse(latest);
|
|
512
|
+
reporterOutput = reporter_output_1.ReporterOutput.parse(parsed);
|
|
513
|
+
}
|
|
514
|
+
catch (e) {
|
|
515
|
+
const output = readStdout();
|
|
516
|
+
const limit = 512;
|
|
517
|
+
this.logger.error(`crashing due to jest output file parsing error: ${JSON.stringify({
|
|
518
|
+
latest,
|
|
519
|
+
testsToRun,
|
|
520
|
+
outputFile,
|
|
521
|
+
})}. First ${limit} chars of the output file: ${output.slice(0, limit)}`, e);
|
|
522
|
+
throw new Error(`failed to parse ${reporterOutputFile} of ${taskName}: <${e}>`);
|
|
523
|
+
}
|
|
524
|
+
reporterOutput.cases.forEach(at => {
|
|
525
|
+
const fileName = this.state.rootDir.unresolve(at.fileName);
|
|
526
|
+
const verdict = (0, misc_1.switchOn)(at.status, {
|
|
527
|
+
disabled: () => undefined,
|
|
528
|
+
failed: () => 'TEST_FAILED',
|
|
529
|
+
passed: () => 'TEST_PASSED',
|
|
530
|
+
pending: () => undefined,
|
|
531
|
+
skipped: () => undefined,
|
|
532
|
+
todo: () => undefined,
|
|
533
|
+
});
|
|
534
|
+
if (verdict) {
|
|
535
|
+
const testPath = [...at.ancestorTitles, at.title];
|
|
536
|
+
this.state.publisher.publish('testEnded', {
|
|
537
|
+
verdict,
|
|
538
|
+
fileName: fileName.val,
|
|
539
|
+
testPath,
|
|
540
|
+
taskName,
|
|
541
|
+
durationMillis: at.duration,
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
const summary = (0, generate_test_run_summary_1.generateTestRunSummary)(this.state.rootDir, reporterOutput);
|
|
546
|
+
fs.writeFileSync(resolvedSummaryFile, JSON.stringify(summary));
|
|
547
|
+
const failingCases = reporterOutput.cases.filter(at => (0, misc_1.switchOn)(at.status, {
|
|
548
|
+
disabled: () => false,
|
|
549
|
+
failed: () => true,
|
|
550
|
+
passed: () => false,
|
|
551
|
+
pending: () => false,
|
|
552
|
+
skipped: () => false,
|
|
553
|
+
todo: () => false,
|
|
554
|
+
}));
|
|
555
|
+
const rerunList = (0, misc_1.sortBy)(failingCases.map(at => ({ fileName: at.fileName, testCaseFullName: at.testCaseFullName })), at => `${at.fileName} ${at.testCaseFullName}`);
|
|
556
|
+
fs.writeFileSync(jof, JSON.stringify(rerun_list_1.RerunList.parse(rerunList)));
|
|
557
|
+
return ret;
|
|
558
|
+
}
|
|
559
|
+
async runCustomTest(unitId, dir, _taskName, outputFile) {
|
|
560
|
+
const testCommand = this.getTestCommand(unitId);
|
|
561
|
+
if (!testCommand) {
|
|
562
|
+
throw new Error(`Custom test command not found for ${unitId}`);
|
|
563
|
+
}
|
|
564
|
+
// Resolve command path relative to repo root
|
|
565
|
+
const commandPath = this.state.rootDir.resolve((0, core_types_1.PathInRepo)(testCommand));
|
|
566
|
+
// Create empty test summary file to maintain invariant
|
|
567
|
+
const dirInRepo = this.state.rootDir.unresolve(dir);
|
|
568
|
+
const resolvedSummaryFile = this.state.rootDir.resolve(dirInRepo.expand(this.testRunSummaryFile));
|
|
569
|
+
fs.writeFileSync(resolvedSummaryFile, JSON.stringify({}));
|
|
570
|
+
// Prepare arguments for the test command
|
|
571
|
+
const args = [
|
|
572
|
+
dir, // Package directory absolute path
|
|
573
|
+
unitId.toString(), // Package name (unit ID)
|
|
574
|
+
path.join(dir, JEST_OUTPUT_FILE), // Rerun file path (optional use by custom runner)
|
|
575
|
+
];
|
|
576
|
+
// Execute the custom test command
|
|
577
|
+
const ret = await this.run(commandPath, args, dir, outputFile);
|
|
578
|
+
// Write empty rerun list if custom runner doesn't provide one
|
|
579
|
+
const jof = path.join(dir, JEST_OUTPUT_FILE);
|
|
580
|
+
if (!fs.existsSync(jof)) {
|
|
581
|
+
fs.writeFileSync(jof, JSON.stringify([]));
|
|
582
|
+
}
|
|
583
|
+
return ret;
|
|
584
|
+
}
|
|
585
|
+
async runValidate(u, dir, outputFile) {
|
|
586
|
+
if (!this.hasRunScript(u.id, this.scriptNames.validate)) {
|
|
587
|
+
return 'OK';
|
|
588
|
+
}
|
|
589
|
+
const ret = await this.run('npm', ['run', this.scriptNames.validate], dir, outputFile);
|
|
590
|
+
return ret;
|
|
591
|
+
}
|
|
592
|
+
getPackageJson(uid) {
|
|
593
|
+
return this.state.packageByUnitId.get(uid) ?? (0, misc_1.failMe)(`Unit ID not found (${uid})`);
|
|
594
|
+
}
|
|
595
|
+
toUnitId(packageName) {
|
|
596
|
+
const ret = (0, unit_metadata_1.UnitId)(packageName);
|
|
597
|
+
if (this.state.packageByUnitId.has(ret)) {
|
|
598
|
+
return ret;
|
|
599
|
+
}
|
|
600
|
+
return undefined;
|
|
601
|
+
}
|
|
602
|
+
isInRepo(packageName) {
|
|
603
|
+
return this.toUnitId(packageName) !== undefined;
|
|
604
|
+
}
|
|
605
|
+
async computePackingPackageJson(unitId) {
|
|
606
|
+
const visited = new Set();
|
|
607
|
+
const scan = (u) => {
|
|
608
|
+
const uid = this.toUnitId(u);
|
|
609
|
+
if (!uid) {
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
if (visited.has(uid)) {
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
visited.add(uid);
|
|
616
|
+
const pd = this.getPackageJson(uid);
|
|
617
|
+
for (const d of Object.keys(pd.dependencies ?? {})) {
|
|
618
|
+
scan(d);
|
|
619
|
+
}
|
|
620
|
+
};
|
|
621
|
+
scan(unitId);
|
|
622
|
+
const allDeps = [...visited];
|
|
623
|
+
const packageDefs = allDeps.map(d => this.getPackageJson(d));
|
|
624
|
+
const outOfRepoDeps = [];
|
|
625
|
+
for (const at of packageDefs) {
|
|
626
|
+
for (const d of Object.keys(at.dependencies ?? {})) {
|
|
627
|
+
if (!this.isInRepo(d)) {
|
|
628
|
+
outOfRepoDeps.push(d);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
// TODO(imaman): cover (the cloning).
|
|
633
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
634
|
+
const ret = JSON.parse(JSON.stringify(this.getPackageJson(unitId)));
|
|
635
|
+
ret.files = [this.dist()];
|
|
636
|
+
ret.dependencies = (0, misc_1.pairsToRecord)(outOfRepoDeps.sort().map(d => [d, this.getVersionOfDep(d)]));
|
|
637
|
+
ret.main = path.join(this.dist('s'), 'index.js');
|
|
638
|
+
delete ret.devDependencies;
|
|
639
|
+
ret.nohoist = true;
|
|
640
|
+
return ret;
|
|
641
|
+
}
|
|
642
|
+
getVersionOfDep(d) {
|
|
643
|
+
return (0, misc_1.hardGet)(this.state.versionByPackageId, d);
|
|
644
|
+
}
|
|
645
|
+
async pack(u, dir) {
|
|
646
|
+
const packageDef = await this.computePackingPackageJson(u.id);
|
|
647
|
+
const packDist = path.join(path.join(dir, PACK_DIR), 'dist');
|
|
648
|
+
const packDistSrc = path.join(packDist, this.src);
|
|
649
|
+
const packDistDeps = path.join(packDist, 'deps');
|
|
650
|
+
fs.mkdirSync(packDistSrc, { recursive: true });
|
|
651
|
+
fs.cpSync(path.join(dir, this.dist('s')), packDistSrc, { recursive: true });
|
|
652
|
+
this.logger.info(`updated packagejson is ${JSON.stringify(packageDef)}`);
|
|
653
|
+
const packageJsonPath = path.join(dir, PACK_DIR, 'package.json');
|
|
654
|
+
// create a deps directory (part of the package) that includes the code of in-repo deps.
|
|
655
|
+
const depUnits = this.state.graph
|
|
656
|
+
.traverseFrom(u.id, { direction: 'forward' })
|
|
657
|
+
.filter(at => at !== u.id)
|
|
658
|
+
.map(at => this.unitOf(at));
|
|
659
|
+
for (const at of depUnits) {
|
|
660
|
+
const d = path.join(packDistDeps, at.id);
|
|
661
|
+
fs.mkdirSync(d, { recursive: true });
|
|
662
|
+
fs.cpSync(this.state.rootDir.resolve(at.pathInRepo.expand(this.dist('s'))), d, { recursive: true });
|
|
663
|
+
}
|
|
664
|
+
try {
|
|
665
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageDef, null, 2));
|
|
666
|
+
}
|
|
667
|
+
catch (e) {
|
|
668
|
+
throw new Error(`Failed to write new package definition at ${packageJsonPath}: ${e}`);
|
|
669
|
+
}
|
|
670
|
+
// We use a synthetic entry point file which does the following:
|
|
671
|
+
// (i) creates a package-only node_modules directory with symlinks to various deps/* directories
|
|
672
|
+
// (ii) delegates to the *real* entry point: dist/src/index.js
|
|
673
|
+
//
|
|
674
|
+
// Step (i) allows imports (i.e., import <sometning> from '<some-package-name>') to be correctly resolved.
|
|
675
|
+
//
|
|
676
|
+
// The symlinks cannot be created at packing-time because NPM does not include symlinks in its packages
|
|
677
|
+
// (https://github.com/npm/npm/issues/3310#issuecomment-15904722). Initially we tried to do it via a postinstall
|
|
678
|
+
// script but it turns out that yarn tries to optimize away the package-only node_modules directory (when it updates
|
|
679
|
+
// other packages, on subsequent install operations). Hence, we have to do this at import-time.
|
|
680
|
+
const indexJs = path.join(dir, PACK_DIR, this.dist('s'), 'index.js');
|
|
681
|
+
const content = fs.readFileSync(indexJs, 'utf-8');
|
|
682
|
+
const preamble = [
|
|
683
|
+
'(() => {',
|
|
684
|
+
' const fs = require(`fs`)',
|
|
685
|
+
' const path = require(`path`)',
|
|
686
|
+
' const dist = path.dirname(__dirname)',
|
|
687
|
+
' const distNodeModules = path.join(dist, `node_modules`)',
|
|
688
|
+
' const distDeps = path.join(dist, `deps`)',
|
|
689
|
+
' fs.rmSync(distNodeModules, {force: true, recursive: true})',
|
|
690
|
+
' fs.mkdirSync(distNodeModules, {recursive: true})',
|
|
691
|
+
' if (fs.existsSync(distDeps)) {',
|
|
692
|
+
' for (const p of fs.readdirSync(distDeps)) {',
|
|
693
|
+
' fs.symlinkSync(`../deps/${p}`, `${distNodeModules}/${p}`)',
|
|
694
|
+
' }',
|
|
695
|
+
' }',
|
|
696
|
+
'})()',
|
|
697
|
+
'',
|
|
698
|
+
].join('\n');
|
|
699
|
+
fs.writeFileSync(indexJs, preamble + content);
|
|
700
|
+
return 'OK';
|
|
701
|
+
}
|
|
702
|
+
async getYarnInfo(rootDir) {
|
|
703
|
+
const copy = {};
|
|
704
|
+
// eslint-disable-next-line no-process-env
|
|
705
|
+
for (const [k, v] of Object.entries(process.env)) {
|
|
706
|
+
// FORCE_COLOR makes yarn return colored output and then JSON.parse() fails. Ideally we'd want to pass an empty
|
|
707
|
+
// env to any process we spawn, but some of the CI systems rely on env vars being set.
|
|
708
|
+
if (k === 'FORCE_COLOR') {
|
|
709
|
+
continue;
|
|
710
|
+
}
|
|
711
|
+
copy[k] = v;
|
|
712
|
+
}
|
|
713
|
+
const p = await (0, execa_1.default)('yarn', ['--silent', 'workspaces', 'info', '--json'], {
|
|
714
|
+
cwd: rootDir.resolve(),
|
|
715
|
+
reject: false,
|
|
716
|
+
encoding: 'utf-8',
|
|
717
|
+
extendEnv: false,
|
|
718
|
+
env: copy,
|
|
719
|
+
});
|
|
720
|
+
if (p.exitCode === 0) {
|
|
721
|
+
let parsed;
|
|
722
|
+
try {
|
|
723
|
+
parsed = JSON.parse(p.stdout);
|
|
724
|
+
}
|
|
725
|
+
catch (e) {
|
|
726
|
+
this.logger.info(`unparsable output of yarn workspaces info:\n<${p.stdout}>`);
|
|
727
|
+
throw new Error(`could not parse yarn workspaces info`);
|
|
728
|
+
}
|
|
729
|
+
return yarnWorkspacesInfoSchema.parse(parsed);
|
|
730
|
+
}
|
|
731
|
+
this.logger.info(`running "yarn workspaces info" failed:\n<${p.stderr}>`);
|
|
732
|
+
throw new Error(`Failed to get yarn info for ${rootDir}`);
|
|
733
|
+
}
|
|
734
|
+
async getGraph() {
|
|
735
|
+
return this.state.graph;
|
|
736
|
+
}
|
|
737
|
+
async getUnits() {
|
|
738
|
+
return this.state.units;
|
|
739
|
+
}
|
|
740
|
+
unitOf(uid) {
|
|
741
|
+
return this.state.units.find(at => at.id === uid) ?? (0, misc_1.failMe)(`Unit not found (unit ID: ${uid})`);
|
|
742
|
+
}
|
|
743
|
+
async getTasks() {
|
|
744
|
+
const unitIds = computeRealUnits(this.state.units).map(at => at.id);
|
|
745
|
+
const ret = unitIds
|
|
746
|
+
.map(at => this.unitOf(at))
|
|
747
|
+
.flatMap(u => [
|
|
748
|
+
this.buildTask(u),
|
|
749
|
+
this.testTask(u),
|
|
750
|
+
this.packTask(u),
|
|
751
|
+
this.publishTask(u),
|
|
752
|
+
...this.customTasks(u),
|
|
753
|
+
])
|
|
754
|
+
.flatMap(x => (x ? [x] : []));
|
|
755
|
+
const installTaskInfo = {
|
|
756
|
+
taskName: installTaskName,
|
|
757
|
+
inputs: [(0, core_types_1.PathInRepo)('yarn.lock'), (0, core_types_1.PathInRepo)('package.json')],
|
|
758
|
+
outputLocations: [{ pathInRepo: (0, core_types_1.PathInRepo)('node_modules'), purge: 'NEVER' }],
|
|
759
|
+
};
|
|
760
|
+
(0, misc_1.switchOn)(this.getInstallFeatureToggle(), {
|
|
761
|
+
off: () => { },
|
|
762
|
+
dormant: () => {
|
|
763
|
+
ret.push(installTaskInfo);
|
|
764
|
+
},
|
|
765
|
+
on: () => {
|
|
766
|
+
ret.push(installTaskInfo);
|
|
767
|
+
},
|
|
768
|
+
});
|
|
769
|
+
return ret;
|
|
770
|
+
}
|
|
771
|
+
depList(...taskNames) {
|
|
772
|
+
return taskNames.filter(at => {
|
|
773
|
+
if (at !== installTaskName) {
|
|
774
|
+
return true;
|
|
775
|
+
}
|
|
776
|
+
return (0, misc_1.switchOn)(this.getInstallFeatureToggle(), {
|
|
777
|
+
off: () => false,
|
|
778
|
+
dormant: () => true,
|
|
779
|
+
on: () => true,
|
|
780
|
+
});
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
buildTask(u) {
|
|
784
|
+
const dir = u.pathInRepo;
|
|
785
|
+
const deps = this.state.graph
|
|
786
|
+
.traverseFrom(u.id)
|
|
787
|
+
.filter(at => at !== u.id)
|
|
788
|
+
.map(at => this.unitOf(at).pathInRepo);
|
|
789
|
+
const ret = {
|
|
790
|
+
labels: ['build'],
|
|
791
|
+
useCaching: this.state.config.cacheCompilationOutputs ?? true,
|
|
792
|
+
taskName: (0, task_name_1.TaskName)(u.id, (0, task_name_1.TaskKind)('build')),
|
|
793
|
+
outputLocations: [{ pathInRepo: dir.expand(this.dist()), purge: 'NEVER' }],
|
|
794
|
+
inputs: [
|
|
795
|
+
dir.expand(this.src),
|
|
796
|
+
dir.expand(this.tests),
|
|
797
|
+
dir.expand('package.json'),
|
|
798
|
+
...deps.map(d => d.expand(this.dist('s'))),
|
|
799
|
+
],
|
|
800
|
+
deps: this.depList(installTaskName),
|
|
801
|
+
};
|
|
802
|
+
(0, misc_1.switchOn)(this.getInstallFeatureToggle(), {
|
|
803
|
+
off: () => {
|
|
804
|
+
ret.inputs?.push((0, core_types_1.PathInRepo)('yarn.lock'));
|
|
805
|
+
},
|
|
806
|
+
dormant: () => { },
|
|
807
|
+
on: () => { },
|
|
808
|
+
});
|
|
809
|
+
return ret;
|
|
810
|
+
}
|
|
811
|
+
testTask(u) {
|
|
812
|
+
const dir = u.pathInRepo;
|
|
813
|
+
const deps = this.state.graph
|
|
814
|
+
.traverseFrom(u.id)
|
|
815
|
+
.filter(at => at !== u.id)
|
|
816
|
+
.map(at => this.unitOf(at).pathInRepo);
|
|
817
|
+
return {
|
|
818
|
+
labels: ['test'],
|
|
819
|
+
taskName: (0, task_name_1.TaskName)(u.id, (0, task_name_1.TaskKind)('test')),
|
|
820
|
+
outputLocations: [
|
|
821
|
+
{ pathInRepo: dir.expand(JEST_OUTPUT_FILE), purge: 'ALWAYS' },
|
|
822
|
+
{ pathInRepo: dir.expand(this.testRunSummaryFile), purge: 'ALWAYS', isPublic: true },
|
|
823
|
+
],
|
|
824
|
+
inputs: [
|
|
825
|
+
dir.expand(this.dist('s')),
|
|
826
|
+
dir.expand(this.dist('t')),
|
|
827
|
+
dir.expand('package.json'),
|
|
828
|
+
...deps.map(d => d.expand(this.dist('s'))),
|
|
829
|
+
],
|
|
830
|
+
deps: this.depList(installTaskName),
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
packTask(u) {
|
|
834
|
+
const dir = u.pathInRepo;
|
|
835
|
+
const deps = this.state.graph
|
|
836
|
+
.traverseFrom(u.id)
|
|
837
|
+
.filter(at => at !== u.id)
|
|
838
|
+
.map(at => this.unitOf(at).pathInRepo);
|
|
839
|
+
return {
|
|
840
|
+
labels: ['pack'],
|
|
841
|
+
taskName: (0, task_name_1.TaskName)(u.id, (0, task_name_1.TaskKind)('pack')),
|
|
842
|
+
outputLocations: [{ pathInRepo: dir.expand(PACK_DIR), purge: 'ALWAYS' }],
|
|
843
|
+
inputs: [dir.expand(this.dist('s')), ...deps.map(d => d.expand(this.dist('s')))],
|
|
844
|
+
};
|
|
845
|
+
}
|
|
846
|
+
publishTask(u) {
|
|
847
|
+
if (!this.hasRunScript(u.id, this.scriptNames.prepareAssets)) {
|
|
848
|
+
return undefined;
|
|
849
|
+
}
|
|
850
|
+
const dir = u.pathInRepo;
|
|
851
|
+
return {
|
|
852
|
+
labels: ['publish-assets'],
|
|
853
|
+
taskName: (0, task_name_1.TaskName)(u.id, (0, task_name_1.TaskKind)('publish-assets')),
|
|
854
|
+
outputLocations: [{ pathInRepo: dir.expand(PREPARED_ASSETS_DIR), purge: 'NEVER' }],
|
|
855
|
+
inputs: [dir.expand('package.json'), dir.expand(this.dist('s'))],
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
customTasks(u) {
|
|
859
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
860
|
+
const casted = this.getPackageJson(u.id);
|
|
861
|
+
const dir = u.pathInRepo;
|
|
862
|
+
const pj = dir.expand('package.json');
|
|
863
|
+
const parseResult = build_task_record_1.BuildTaskRecord.safeParse(casted.buildTasks ?? {});
|
|
864
|
+
if (!parseResult.success) {
|
|
865
|
+
throw new build_failed_error_1.BuildFailedError(`found a buildTasks object (in ${pj}) which is not well formed: ${parseResult.error.message}`);
|
|
866
|
+
}
|
|
867
|
+
const btr = parseResult.data;
|
|
868
|
+
const computeOutputLocation = (buildTaskName, s) => {
|
|
869
|
+
try {
|
|
870
|
+
return dir.to(s);
|
|
871
|
+
}
|
|
872
|
+
catch (e) {
|
|
873
|
+
throw new build_failed_error_1.BuildFailedError(`build task ${buildTaskName} in ${pj} specifies an illegal input: ${e}`);
|
|
874
|
+
}
|
|
875
|
+
};
|
|
876
|
+
const ret = [];
|
|
877
|
+
for (const name of Object.keys(btr)) {
|
|
878
|
+
const unresolvedDef = btr[name];
|
|
879
|
+
const def = typeof unresolvedDef === 'string' ? this.resolveBuildTasks(dir, name, unresolvedDef, pj) : unresolvedDef;
|
|
880
|
+
if (!this.hasRunScript(u.id, name)) {
|
|
881
|
+
throw new build_failed_error_1.BuildFailedError(`found a build task named "${name}" but no run script with that name is defined in ${pj}`);
|
|
882
|
+
}
|
|
883
|
+
const inputs = def.inputs === '_ALWAYS_'
|
|
884
|
+
? [(0, core_types_1.PathInRepo)('.build-raptor/build-run-id')]
|
|
885
|
+
: [pj, ...toArray(def.inputs).map(at => computeOutputLocation(name, at))];
|
|
886
|
+
ret.push({
|
|
887
|
+
taskName: (0, task_name_1.TaskName)(u.id, (0, task_name_1.TaskKind)('build'), name),
|
|
888
|
+
labels: toArray(def.labels ?? []),
|
|
889
|
+
inputs,
|
|
890
|
+
outputLocations: [
|
|
891
|
+
...toArray(def.outputs ?? []).map(at => ({
|
|
892
|
+
pathInRepo: dir.expand(at),
|
|
893
|
+
purge: 'ALWAYS',
|
|
894
|
+
isPublic: false,
|
|
895
|
+
})),
|
|
896
|
+
...toArray(def.publicOutputs ?? []).map(at => ({
|
|
897
|
+
pathInRepo: dir.expand(at),
|
|
898
|
+
purge: 'ALWAYS',
|
|
899
|
+
isPublic: true,
|
|
900
|
+
})),
|
|
901
|
+
],
|
|
902
|
+
});
|
|
903
|
+
}
|
|
904
|
+
return ret;
|
|
905
|
+
}
|
|
906
|
+
resolveBuildTasks(dir, name, pointer, originatingFrom) {
|
|
907
|
+
let where = dir.to(pointer);
|
|
908
|
+
const absPathToIndex = new Map(); // Maps file path to its position in the chain
|
|
909
|
+
while (true) {
|
|
910
|
+
const fileToRead = this.state.rootDir.resolve(where);
|
|
911
|
+
const cycleStart = absPathToIndex.get(fileToRead);
|
|
912
|
+
if (cycleStart !== undefined) {
|
|
913
|
+
const cycle = (0, misc_1.sortBy)([...absPathToIndex.entries()], ([_, index]) => index)
|
|
914
|
+
.slice(cycleStart)
|
|
915
|
+
.map(([abs]) => this.state.rootDir.unresolve(abs));
|
|
916
|
+
cycle.push(where); // Complete the cycle
|
|
917
|
+
throw new build_failed_error_1.BuildFailedError(`Circular reference detected in build task definition: ${cycle.join(' -> ')}`);
|
|
918
|
+
}
|
|
919
|
+
absPathToIndex.set(fileToRead, absPathToIndex.size);
|
|
920
|
+
if (!fs.existsSync(fileToRead)) {
|
|
921
|
+
throw new build_failed_error_1.BuildFailedError(`Could no find file ${where} while resolving build task "${name}" from ${originatingFrom}`);
|
|
922
|
+
}
|
|
923
|
+
const unparsed = JSON.parse(fs.readFileSync(fileToRead, 'utf-8'));
|
|
924
|
+
const parseResult = build_task_record_1.BuildTaskRecord.safeParse(unparsed);
|
|
925
|
+
if (!parseResult.success) {
|
|
926
|
+
throw new build_failed_error_1.BuildFailedError(`buildTask object (in ${fileToRead}) is not well formed: ${parseResult.error.message}`);
|
|
927
|
+
}
|
|
928
|
+
const parsed = parseResult.data;
|
|
929
|
+
const ret = parsed[name];
|
|
930
|
+
if (!ret) {
|
|
931
|
+
throw new build_failed_error_1.BuildFailedError(`could not find buildTask "${name}" in ${fileToRead}`);
|
|
932
|
+
}
|
|
933
|
+
if (typeof ret === 'object') {
|
|
934
|
+
return ret;
|
|
935
|
+
}
|
|
936
|
+
where = (0, core_types_1.PathInRepo)(path.dirname(where.val)).to(ret);
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
async computeTestsToRun(resolved) {
|
|
940
|
+
const exists = await fse.pathExists(resolved);
|
|
941
|
+
if (!exists) {
|
|
942
|
+
this.logger.info('jest-output.json does not exist. running everything!');
|
|
943
|
+
return [this.tests];
|
|
944
|
+
}
|
|
945
|
+
const content = await fse.readFile(resolved, 'utf-8');
|
|
946
|
+
let parsed;
|
|
947
|
+
try {
|
|
948
|
+
parsed = JSON.parse(content);
|
|
949
|
+
}
|
|
950
|
+
catch (e) {
|
|
951
|
+
this.logger.info(`failed to JSON parse ${resolved} <${e}> - using fallback`);
|
|
952
|
+
parsed = emptyRerunList;
|
|
953
|
+
}
|
|
954
|
+
let rerunList;
|
|
955
|
+
try {
|
|
956
|
+
rerunList = rerun_list_1.RerunList.parse(parsed);
|
|
957
|
+
}
|
|
958
|
+
catch (e) {
|
|
959
|
+
this.logger.info(`failed to parse rerun-list from ${resolved} <${e}> - using fallback`);
|
|
960
|
+
rerunList = emptyRerunList;
|
|
961
|
+
}
|
|
962
|
+
if (rerunList.length === 0) {
|
|
963
|
+
this.logger.info(`No failed tests found in ${resolved}`);
|
|
964
|
+
// TODO(imaman): rethink this. maybe we want to run nothing if there are no failed tests.
|
|
965
|
+
// It boilsdown to whether we trust jest-output.json or not.
|
|
966
|
+
return [this.tests];
|
|
967
|
+
}
|
|
968
|
+
const names = (0, misc_1.sortBy)(rerunList.map(at => at.testCaseFullName), x => x);
|
|
969
|
+
const fileNames = (0, misc_1.uniqueBy)(rerunList.map(at => at.fileName), x => x);
|
|
970
|
+
const ret = [...fileNames, '-t', names.map(x => (0, escape_string_regexp_1.default)(x)).join('|')];
|
|
971
|
+
this.logger.info(`tests to run: ${JSON.stringify(ret)}`);
|
|
972
|
+
return ret;
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
exports.YarnRepoProtocol = YarnRepoProtocol;
|
|
976
|
+
const PACK_DIR = 'pack';
|
|
977
|
+
function computeUnits(yarnInfo) {
|
|
978
|
+
const ret = [];
|
|
979
|
+
for (const [p, data] of Object.entries(yarnInfo)) {
|
|
980
|
+
const uid = (0, unit_metadata_1.UnitId)(p);
|
|
981
|
+
ret.push(new unit_metadata_1.UnitMetadata(data.location, uid));
|
|
982
|
+
}
|
|
983
|
+
ret.push(new unit_metadata_1.UnitMetadata('', rootUnitId));
|
|
984
|
+
return ret;
|
|
985
|
+
}
|
|
986
|
+
async function readPackages(rootDir, units) {
|
|
987
|
+
const ret = new Map();
|
|
988
|
+
await (0, misc_1.promises)(units).forEach(20, async (um) => {
|
|
989
|
+
const p = rootDir.resolve(um.pathInRepo.expand('package.json'));
|
|
990
|
+
const content = await fse.readJSON(p);
|
|
991
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
992
|
+
ret.set(um.id, content);
|
|
993
|
+
});
|
|
994
|
+
return ret;
|
|
995
|
+
}
|
|
996
|
+
async function createOutDirs(rootDir, units, outDirName) {
|
|
997
|
+
if (!outDirName) {
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
1000
|
+
await (0, misc_1.promises)(units).forEach(20, async (um) => {
|
|
1001
|
+
const p = rootDir.resolve(um.pathInRepo.expand(outDirName));
|
|
1002
|
+
await fse.ensureDir(p);
|
|
1003
|
+
});
|
|
1004
|
+
}
|
|
1005
|
+
function computeVersions(packages) {
|
|
1006
|
+
const ret = new Map();
|
|
1007
|
+
const register = (d, v) => {
|
|
1008
|
+
const preexisting = ret.get(d);
|
|
1009
|
+
if (preexisting && preexisting !== v) {
|
|
1010
|
+
const arr = [preexisting, v].sort();
|
|
1011
|
+
throw new build_failed_error_1.BuildFailedError(`Inconsistent version for depenedency "${d}": ${arr.join(', ')}`);
|
|
1012
|
+
}
|
|
1013
|
+
ret.set(d, v);
|
|
1014
|
+
};
|
|
1015
|
+
for (const p of packages) {
|
|
1016
|
+
for (const [d, v] of Object.entries(p.dependencies ?? {})) {
|
|
1017
|
+
register(d, v);
|
|
1018
|
+
}
|
|
1019
|
+
for (const [d, v] of Object.entries(p.devDependencies ?? {})) {
|
|
1020
|
+
register(d, v);
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
return ret;
|
|
1024
|
+
}
|
|
1025
|
+
function computeRealUnits(units) {
|
|
1026
|
+
return units.filter(at => at.id !== rootUnitId);
|
|
1027
|
+
}
|
|
1028
|
+
const JEST_OUTPUT_FILE = 'jest-output.json';
|
|
1029
|
+
const PREPARED_ASSETS_DIR = 'prepared-assets';
|
|
1030
|
+
const rootUnitId = (0, unit_metadata_1.UnitId)('.');
|
|
1031
|
+
const installTaskName = (0, task_name_1.TaskName)(rootUnitId, (0, task_name_1.TaskKind)('install'));
|
|
1032
|
+
const emptyRerunList = rerun_list_1.RerunList.parse([]);
|
|
1033
|
+
function toArray(input) {
|
|
1034
|
+
return Array.isArray(input) ? input : [input];
|
|
1035
|
+
}
|
|
1036
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWFybi1yZXBvLXByb3RvY29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3lhcm4tcmVwby1wcm90b2NvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyREFBcUQ7QUFDckQsMkNBQWlEO0FBQ2pELGdGQUFxRDtBQUNyRCxrREFBeUI7QUFDekIsdUNBQXdCO0FBQ3hCLDhDQUErQjtBQUUvQiwrQkFZYTtBQUNiLDJDQUE0QjtBQVM1QixxREFBZ0Q7QUFDaEQseUNBQThDO0FBQzlDLGlEQUFrQztBQUVsQyxpREFBb0Q7QUFDcEQsNkJBQXVCO0FBRXZCLDJEQUFrRjtBQUNsRiwyRUFBb0U7QUFDcEUsNkNBQXdDO0FBQ3hDLDJFQUFvRTtBQUVwRSxNQUFNLHdCQUF3QixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQ3ZDLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDUCxRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNwQixxQkFBcUIsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFO0lBQ3pDLCtCQUErQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUU7Q0FDcEQsQ0FBQyxDQUNILENBQUE7QUFpQkQsS0FBSyxVQUFVLFdBQVc7SUFDeEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUNuQyxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxRQUFnQjtJQUNwQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxDQUFBO0FBQzdDLENBQUM7QUFFRCxNQUFhLGdCQUFnQjtJQVczQixZQUNtQixNQUFjO0lBQy9CLDhCQUE4QjtJQUNiLGNBQXlCO1FBRnpCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFZCxtQkFBYyxHQUFkLGNBQWMsQ0FBVztRQWIzQixnQkFBVyxHQUFHO1lBQzdCLEtBQUssRUFBRSxPQUFPO1lBQ2QsUUFBUSxFQUFFLFVBQVU7WUFDcEIsU0FBUyxFQUFFLFlBQVk7WUFDdkIsYUFBYSxFQUFFLGdCQUFnQjtTQUNoQyxDQUFBO1FBRWdCLFFBQUcsR0FBRyxLQUFLLENBQUE7UUFDWCxVQUFLLEdBQUcsT0FBTyxDQUFBO1FBWWYscUJBQWdCLEdBQUcsb0JBQW9CLENBQUE7UUFMdEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUE7UUFDaEgsQ0FBQztJQUNILENBQUM7SUFLRCxlQUFlO1FBQ2IsT0FBTyxrREFBc0IsQ0FBQTtJQUMvQixDQUFDO0lBRU8sSUFBSSxDQUFDLEtBQWlCO1FBQzVCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQTtRQUNoQixPQUFPLEtBQUssS0FBSyxTQUFTO1lBQ3hCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHO2dCQUNmLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNwQixDQUFDLENBQUMsS0FBSyxLQUFLLEdBQUc7b0JBQ2YsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ3RCLENBQUMsQ0FBQyxJQUFBLHdCQUFpQixFQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRCxJQUFZLEtBQUs7UUFDZixPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksSUFBQSxhQUFNLEVBQUMsbUJBQW1CLENBQUMsQ0FBQTtJQUNuRCxDQUFDO0lBRUQsSUFBWSxrQkFBa0I7UUFDNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVPLFlBQVksQ0FBQyxNQUFjLEVBQUUsU0FBaUI7UUFDcEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN0QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUE7UUFDaEQsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFTyxjQUFjLENBQUMsTUFBYztRQUNuQyw0Q0FBNEM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsd0JBQXdCLElBQUksSUFBSSxDQUFBO1FBQ2pFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3RDLG9EQUFvRDtRQUVwRCxNQUFNLE1BQU0sR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxXQUFXLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFckcsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDeEMsT0FBTyxXQUFXLEVBQUUsV0FBVyxDQUFBO0lBQ2pDLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWdCO1FBQ3pDLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sdUJBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLHNCQUFzQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDM0YsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ3RELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsdUVBQXVFO1lBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUMxRSxPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7SUFDSCxDQUFDO0lBRU8sV0FBVyxDQUFDLGFBQWtDO1FBQ3BELE1BQU0sV0FBVyxHQUFHLGtEQUFzQixDQUFDLFNBQVMsQ0FBQyxhQUFhLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3JHLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQTtRQUN6QixDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQ3hELEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FDakYsQ0FBQTtRQUNELE1BQU0sSUFBSSxxQ0FBZ0IsQ0FBQyxlQUFlLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUNkLE9BQWlCLEVBQ2pCLFNBQTRDLEVBQzVDLFVBQWtCLEVBQ2xCLGtCQUE0QjtRQUU1QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFaEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ25ELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QyxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN4QyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM3QyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQztZQUM1QixhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUM7U0FDMUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFFekUsTUFBTSxVQUFVLEdBQXVCLEVBQUUsQ0FBQTtRQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQUssQ0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDakQsTUFBTSxHQUFHLEdBQUcsSUFBQSxzQkFBTSxFQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3JCLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDakIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0MsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBQSxzQkFBTSxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDOUIsQ0FBQztZQUVELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7Z0JBQ3JELFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBQSxzQkFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNuQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDMUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFBO1lBRXRDLE1BQU0sRUFBRSxHQUFHLElBQUEsY0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUM3QyxrSEFBa0g7WUFDbEgsK0ZBQStGO1lBQy9GLE1BQU0sQ0FBQyxHQUFHLElBQUEsY0FBTyxFQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQy9DLG9GQUFvRjtZQUNwRixNQUFNLElBQUkscUNBQWdCLENBQ3hCLG9DQUFvQyxRQUFRLFNBQVMsUUFBUSxNQUFNLEVBQUUsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxFQUFFLENBQ3pGLENBQUE7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUV2RCxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDckQsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLFFBQVE7WUFDUixLQUFLO1lBQ0wsT0FBTztZQUNQLEtBQUssRUFBRSxRQUFRO1lBQ2YsZUFBZTtZQUNmLGtCQUFrQjtZQUNsQixTQUFTO1lBQ1QsTUFBTTtZQUNOLFVBQVU7U0FDWCxDQUFBO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxPQUFpQixFQUFFLEtBQXFCO1FBQy9FLE1BQU0sV0FBVyxHQUFHLElBQUEsdUJBQVUsRUFBQyxjQUFjLENBQUMsQ0FBQTtRQUM5QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ25ELE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDOUMsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNyQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3JDLE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUM1QyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLFNBQVE7WUFDVixDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDaEQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQTtZQUN4RSxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCLENBQUMsT0FBaUIsRUFBRSxLQUFxQixFQUFFLEtBQW9CO1FBQ2hHLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBQSx1QkFBVSxFQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUE7UUFDbkUsTUFBTSxjQUFjLEdBQUcsTUFBTSxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXJELHlFQUF5RTtRQUN6RSxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUUxRixNQUFNLGNBQWMsR0FBaUM7WUFDbkQsTUFBTSxFQUFFLFVBQVU7WUFDbEIsZUFBZSxFQUFFLElBQUk7WUFDckIsT0FBTyxFQUFFLElBQUk7WUFDYixXQUFXLEVBQUUsSUFBSTtZQUNqQixNQUFNLEVBQUUsUUFBUTtZQUNoQixHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO1lBQ3RCLE1BQU0sRUFBRSxJQUFJO1lBQ1osYUFBYSxFQUFFLElBQUk7WUFDbkIsZ0JBQWdCLEVBQUUsTUFBTTtZQUN4Qiw0QkFBNEIsRUFBRSxJQUFJO1lBQ2xDLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLGlCQUFpQixFQUFFLElBQUk7U0FDeEIsQ0FBQTtRQUVELEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7WUFFcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFBO1lBQzdFLE1BQU0sZUFBZSxHQUFHLE1BQU0sR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUV2RCx5RUFBeUU7WUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUM3RixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUUzRixNQUFNLE1BQU0sR0FBaUI7Z0JBQzNCLEdBQUcsQ0FBQyxlQUFlO29CQUNqQixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtvQkFDM0MsQ0FBQyxDQUFDLGNBQWM7d0JBQ2hCLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO3dCQUNyRSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNQLGVBQWUsRUFBRTtvQkFDZixHQUFHLENBQUMsZUFBZSxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7b0JBQzVELFNBQVMsRUFBRSxJQUFJO29CQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO2lCQUNwQjtnQkFDRCxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDdkIsTUFBTSxFQUFFLEdBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBQSxhQUFNLEVBQUMsbUJBQW1CLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO29CQUM3RyxPQUFPO3dCQUNMLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO3FCQUN6RCxDQUFBO2dCQUNILENBQUMsQ0FBQztnQkFDRixPQUFPLEVBQUU7b0JBQ1AsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPO29CQUNsQixHQUFHLElBQUksQ0FBQyxHQUFHLFlBQVk7b0JBQ3ZCLEdBQUcsSUFBSSxDQUFDLEtBQUssT0FBTztvQkFDcEIsR0FBRyxJQUFJLENBQUMsS0FBSyxZQUFZO29CQUN6QixHQUFHLFNBQVM7aUJBQ2I7YUFDRixDQUFBO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQTtZQUMxQixDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQy9DLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQTtZQUMvRCxJQUFJLE1BQU0sR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO2dCQUN4RSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFBO29CQUNoRixTQUFRO2dCQUNWLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQzlELE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDakMsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLENBQUMsS0FBSyxLQUFJLENBQUM7SUFFUixLQUFLLENBQUMsR0FBRyxDQUNmLEdBQVcsRUFDWCxJQUFjLEVBQ2QsR0FBVyxFQUNYLFVBQWtCLEVBQ2xCLG9CQUFxRCxFQUFFO1FBRXZELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUE7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxPQUFPLGFBQWEsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUVqRSxNQUFNLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBQSxlQUFLLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQTtZQUMvRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1lBQ3pFLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxJQUFJLENBQUE7WUFDYixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUN0RCxPQUFPLE9BQU8sQ0FBQTtRQUNoQixDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxtRkFBbUY7SUFDM0UsS0FBSyxDQUFDLHlCQUF5QixDQUFDLE1BQWMsRUFBRSxHQUFXLEVBQUUsVUFBa0I7UUFDckYsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQy9CLE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBYyxFQUFFLEdBQVcsRUFBRSxVQUFrQjtRQUN4RSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzNELE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUE7UUFDcEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUVyRixNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDN0MsTUFBTSxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUMxQyxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQVc7UUFDdkMsS0FBSyxNQUFNLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUE7WUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDeEMsTUFBTSxLQUFLLEdBQUcsTUFBTSx1QkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUMzRixLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN0QixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDN0QsQ0FBQztZQUVELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDckQsTUFBTSxTQUFTLEdBQUcsTUFBTSx1QkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUV4RixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQVMsRUFBRSxXQUFtQixFQUFFLEVBQUUsQ0FDdkQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUVsRSxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFO2dCQUNwQyxJQUFJLEdBQXVCLENBQUE7Z0JBQzNCLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN2QixJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNSLE9BQU8sR0FBRyxDQUFBO2dCQUNaLENBQUM7Z0JBQ0QsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO2dCQUM3QyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNSLE9BQU8sR0FBRyxDQUFBO2dCQUNaLENBQUM7Z0JBRUQsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO2dCQUM5QyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNSLE9BQU8sR0FBRyxDQUFBO2dCQUNaLENBQUM7Z0JBRUQsT0FBTyxTQUFTLENBQUE7WUFDbEIsQ0FBQyxDQUFBO1lBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFDaEMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO29CQUN0RCxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUNyQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQTtRQUM5QyxJQUFJLE9BQU8sR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzdCLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtRQUMzQixDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFrQixFQUFFLFVBQWtCLEVBQUUsV0FBbUI7UUFDdkUsSUFBSSxRQUFRLEtBQUssZUFBZSxFQUFFLENBQUM7WUFDakMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUE7WUFDekMsT0FBTyxJQUFBLGVBQVEsRUFBQyxFQUFFLEVBQUU7Z0JBQ2xCLEdBQUcsRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixRQUFRLHNDQUFzQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO2dCQUN2RixDQUFDO2dCQUNELE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDbEIsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUE7b0JBQ2hDLE1BQU0sR0FBRyxHQUFlLElBQUksQ0FBQTtvQkFDNUIsT0FBTyxHQUFHLENBQUE7Z0JBQ1osQ0FBQztnQkFDRCxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtvQkFDL0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUE7b0JBQ25HLE9BQU8sR0FBRyxDQUFBO2dCQUNaLENBQUM7YUFDRixDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBQSxvQkFBUSxHQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQy9ELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLElBQUksSUFBQSxhQUFNLEVBQUMsc0JBQXNCLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDakcsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNwRCxJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksT0FBTyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksV0FBdUIsQ0FBQTtZQUMzQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDeEMsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFDN0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1lBQ3ZGLENBQUM7WUFDRCxPQUFPLE1BQU0sSUFBQSxlQUFRLEVBQUMsV0FBVyxFQUFFO2dCQUNqQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQ3pDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDeEMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUM7YUFDaEUsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUNELElBQUksUUFBUSxLQUFLLE9BQU8sSUFBSSxPQUFPLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDM0MsT0FBTyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsSUFBSSxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDeEIsZ0VBQWdFO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUMzQyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7WUFFdEQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNsQiw0Q0FBNEM7Z0JBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixRQUFRLDJCQUEyQixDQUFDLENBQUE7Z0JBQ3BGLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLDBCQUEwQixRQUFRLElBQUksQ0FBQyxDQUFBO2dCQUUvRSx1REFBdUQ7Z0JBQ3ZELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDbkQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFBO2dCQUNqRyxFQUFFLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFFekQsZ0NBQWdDO2dCQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO2dCQUM1QyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7Z0JBRXpDLGtDQUFrQztnQkFDbEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxXQUFXLEVBQUUsQ0FBQTtnQkFDcEMsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7Z0JBQy9ELE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDN0MsTUFBTSxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtnQkFFMUMsT0FBTyxjQUFjLENBQUE7WUFDdkIsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUE7WUFDcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7WUFFN0MsNkVBQTZFO1lBQzdFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUNyRCxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO2dCQUMzRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDO2FBQ25DLENBQUMsQ0FBQTtZQUVGLDhDQUE4QztZQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDN0MsTUFBTSxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUUxQyx5R0FBeUc7WUFDekcsT0FBTyxJQUFBLGVBQVEsRUFBQyxVQUFVLEVBQUU7Z0JBQzFCLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVO2dCQUN2QixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsVUFBVTtnQkFDdEIsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQWM7YUFDekIsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELElBQUksUUFBUSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDbkMsTUFBTSxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUNuQyxPQUFPLEdBQUcsQ0FBQTtRQUNaLENBQUM7UUFFRCxJQUFJLFFBQVEsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFBO1lBRWpELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUE7WUFDcEQsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7WUFDeEQsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBRTFCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1lBQ3ZFLE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM3QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxJQUFJLHFDQUFnQixDQUN4QixlQUFlLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLDJCQUEyQixVQUFVLGtCQUFrQixHQUFHLEVBQUUsQ0FDbkcsQ0FBQTtZQUNILENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDekMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFO2dCQUNsQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUN2RCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFDakYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMscUJBQXFCLFVBQVUsRUFBRSxDQUFDLENBQUE7Z0JBQzNFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDN0MsUUFBUTtvQkFDUixVQUFVO29CQUNWLElBQUksRUFBRSxDQUFDO2lCQUNSLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUNILENBQUE7WUFFRCxPQUFPLEdBQUcsQ0FBQTtRQUNaLENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixRQUFRLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFrQixFQUFFLFFBQWtCO1FBQy9ELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQTtZQUM3QyxNQUFNLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ25DLE9BQU8sR0FBRyxDQUFBO1FBQ1osQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixVQUFVLGtCQUFrQixRQUFRLEdBQUcsQ0FBQyxDQUFBO1FBQ2pGLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM1RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUE7UUFDOUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDbkcsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUE7UUFFL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFBO1FBQzdDLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBVyxFQUFFLFFBQWtCLEVBQUUsVUFBa0I7UUFDdkUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25ELDJHQUEyRztRQUMzRyxhQUFhO1FBQ2IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFBO1FBQ2pHLG1IQUFtSDtRQUNuSCw2REFBNkQ7UUFDN0QsRUFBRSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFFekQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUM1QyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNwRCxNQUFNLGtCQUFrQixHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDbEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUN4QixLQUFLLEVBQ0w7WUFDRSxNQUFNO1lBQ04sR0FBRyxVQUFVO1lBQ2IsY0FBYztZQUNkLGtCQUFrQjtZQUNsQixhQUFhO1lBQ2IsNEJBQTRCO1lBQzVCLGFBQWE7WUFDYixTQUFTO1NBQ1YsRUFDRCxHQUFHLEVBQ0gsVUFBVSxFQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUN4QyxDQUFBO1FBRUQsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDcEUsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxNQUFNLEdBQUcsVUFBVSxFQUFFLENBQUE7WUFDM0IsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLGtFQUFrRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sRUFBRSxDQUN2RyxDQUFBO2dCQUNELEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQTtnQkFDckQsT0FBTyxNQUFNLENBQUE7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksY0FBYyxDQUFBO1FBQ2xCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDakMsY0FBYyxHQUFHLGdDQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQy9DLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxNQUFNLEdBQUcsVUFBVSxFQUFFLENBQUE7WUFDM0IsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFBO1lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLG1EQUFtRCxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNoRSxNQUFNO2dCQUNOLFVBQVU7Z0JBQ1YsVUFBVTthQUNYLENBQUMsV0FBVyxLQUFLLDhCQUE4QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUN4RSxDQUFDLENBQ0YsQ0FBQTtZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLGtCQUFrQixPQUFPLFFBQVEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2pGLENBQUM7UUFFRCxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzFELE1BQU0sT0FBTyxHQUF5QyxJQUFBLGVBQVEsRUFBQyxFQUFFLENBQUMsTUFBTSxFQUFFO2dCQUN4RSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUztnQkFDekIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLGFBQWE7Z0JBQzNCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhO2dCQUMzQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUztnQkFDeEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVM7Z0JBQ3hCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTO2FBQ3RCLENBQUMsQ0FBQTtZQUNGLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO29CQUN4QyxPQUFPO29CQUNQLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRztvQkFDdEIsUUFBUTtvQkFDUixRQUFRO29CQUNSLGNBQWMsRUFBRSxFQUFFLENBQUMsUUFBUTtpQkFDNUIsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxPQUFPLEdBQUcsSUFBQSxrREFBc0IsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQTtRQUMxRSxFQUFFLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUU5RCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUNwRCxJQUFBLGVBQVEsRUFBQyxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ2xCLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO1lBQ3JCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1lBQ2xCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO1lBQ25CLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO1lBQ3BCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO1lBQ3BCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO1NBQ2xCLENBQUMsQ0FDSCxDQUFBO1FBRUQsTUFBTSxTQUFTLEdBQWMsSUFBQSxhQUFNLEVBQ2pDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUMxRixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FDOUMsQ0FBQTtRQUNELEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRWpFLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQ3pCLE1BQWMsRUFDZCxHQUFXLEVBQ1gsU0FBbUIsRUFDbkIsVUFBa0I7UUFFbEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMvQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNoRSxDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFBLHVCQUFVLEVBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQTtRQUV2RSx1REFBdUQ7UUFDdkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25ELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQTtRQUNqRyxFQUFFLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUV6RCx5Q0FBeUM7UUFDekMsTUFBTSxJQUFJLEdBQUc7WUFDWCxHQUFHLEVBQUUsa0NBQWtDO1lBQ3ZDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSx5QkFBeUI7WUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxrREFBa0Q7U0FDckYsQ0FBQTtRQUVELGtDQUFrQztRQUNsQyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFOUQsOERBQThEO1FBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDNUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0MsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBZSxFQUFFLEdBQVcsRUFBRSxVQUFrQjtRQUN4RSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ3RGLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVPLGNBQWMsQ0FBQyxHQUFXO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUEsYUFBTSxFQUFDLHNCQUFzQixHQUFHLEdBQUcsQ0FBQyxDQUFBO0lBQ3BGLENBQUM7SUFFTyxRQUFRLENBQUMsV0FBbUI7UUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBQSxzQkFBTSxFQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQy9CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTyxHQUFHLENBQUE7UUFDWixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVPLFFBQVEsQ0FBQyxXQUFtQjtRQUNsQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssU0FBUyxDQUFBO0lBQ2pELENBQUM7SUFFRCxLQUFLLENBQUMseUJBQXlCLENBQUMsTUFBYztRQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUU7WUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM1QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1QsT0FBTTtZQUNSLENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsT0FBTTtZQUNSLENBQUM7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRWhCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbkMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ1QsQ0FBQztRQUNILENBQUMsQ0FBQTtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNaLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQTtRQUU1QixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRTVELE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQTtRQUNsQyxLQUFLLE1BQU0sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQzdCLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3RCLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELHFDQUFxQztRQUNyQyx5RUFBeUU7UUFDekUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBd0MsQ0FBQTtRQUMxRyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDekIsR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFBLG9CQUFhLEVBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDN0YsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDaEQsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFBO1FBQzFCLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQ2xCLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVPLGVBQWUsQ0FBQyxDQUFTO1FBQy9CLE9BQU8sSUFBQSxjQUFPLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBRU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFlLEVBQUUsR0FBVztRQUM3QyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDN0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUM1RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDakQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDaEQsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM5QyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUUzRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDeEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBRWhFLHdGQUF3RjtRQUN4RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7YUFDOUIsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7YUFDNUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDekIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzdCLEtBQUssTUFBTSxFQUFFLElBQUksUUFBUSxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3hDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7WUFDcEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFDckcsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILEVBQUUsQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3hFLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsZUFBZSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDdkYsQ0FBQztRQUVELGdFQUFnRTtRQUNoRSxnR0FBZ0c7UUFDaEcsOERBQThEO1FBQzlELEVBQUU7UUFDRiwwR0FBMEc7UUFDMUcsRUFBRTtRQUNGLHVHQUF1RztRQUN2RyxnSEFBZ0g7UUFDaEgsb0hBQW9IO1FBQ3BILCtGQUErRjtRQUUvRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUNwRSxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUVqRCxNQUFNLFFBQVEsR0FBRztZQUNmLFVBQVU7WUFDViw0QkFBNEI7WUFDNUIsZ0NBQWdDO1lBQ2hDLHdDQUF3QztZQUN4QywyREFBMkQ7WUFDM0QsNENBQTRDO1lBQzVDLDhEQUE4RDtZQUM5RCxvREFBb0Q7WUFDcEQsa0NBQWtDO1lBQ2xDLGlEQUFpRDtZQUNqRCxpRUFBaUU7WUFDakUsT0FBTztZQUNQLEtBQUs7WUFDTCxNQUFNO1lBQ04sRUFBRTtTQUNILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRVosRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFBO1FBRTdDLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBaUI7UUFDekMsTUFBTSxJQUFJLEdBQXNCLEVBQUUsQ0FBQTtRQUNsQywwQ0FBMEM7UUFDMUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakQsK0dBQStHO1lBQy9HLHNGQUFzRjtZQUN0RixJQUFJLENBQUMsS0FBSyxhQUFhLEVBQUUsQ0FBQztnQkFDeEIsU0FBUTtZQUNWLENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2IsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBQSxlQUFLLEVBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDMUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDdEIsTUFBTSxFQUFFLEtBQUs7WUFDYixRQUFRLEVBQUUsT0FBTztZQUNqQixTQUFTLEVBQUUsS0FBSztZQUNoQixHQUFHLEVBQUUsSUFBSTtTQUNWLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQixJQUFJLE1BQWUsQ0FBQTtZQUNuQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQy9CLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtnQkFDN0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1lBQ3pELENBQUM7WUFFRCxPQUFPLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMvQyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQ3pFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQTtJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVE7UUFDWixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFBO0lBQ3pCLENBQUM7SUFFTyxNQUFNLENBQUMsR0FBVztRQUN4QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLElBQUksSUFBQSxhQUFNLEVBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLENBQUE7SUFDakcsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFbkUsTUFBTSxHQUFHLEdBQUcsT0FBTzthQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDbkIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUN2QixDQUFDO2FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFFL0IsTUFBTSxlQUFlLEdBQWE7WUFDaEMsUUFBUSxFQUFFLGVBQWU7WUFDekIsTUFBTSxFQUFFLENBQUMsSUFBQSx1QkFBVSxFQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUEsdUJBQVUsRUFBQyxjQUFjLENBQUMsQ0FBQztZQUM3RCxlQUFlLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFBLHVCQUFVLEVBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1NBQzlFLENBQUE7UUFFRCxJQUFBLGVBQVEsRUFBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRTtZQUN2QyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztZQUNiLE9BQU8sRUFBRSxHQUFHLEVBQUU7Z0JBQ1osR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUMzQixDQUFDO1lBQ0QsRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDUCxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQzNCLENBQUM7U0FDRixDQUFDLENBQUE7UUFFRixPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFTyxPQUFPLENBQUMsR0FBRyxTQUFxQjtRQUN0QyxPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDM0IsSUFBSSxFQUFFLEtBQUssZUFBZSxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sSUFBSSxDQUFBO1lBQ2IsQ0FBQztZQUVELE9BQU8sSUFBQSxlQUFRLEVBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBQzlDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO2dCQUNoQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtnQkFDbkIsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7YUFDZixDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyxTQUFTLENBQUMsQ0FBZTtRQUMvQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFBO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSzthQUMxQixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNsQixNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUN6QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sR0FBRyxHQUFhO1lBQ3BCLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsdUJBQXVCLElBQUksSUFBSTtZQUM3RCxRQUFRLEVBQUUsSUFBQSxvQkFBUSxFQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBQSxvQkFBUSxFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLGVBQWUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzFFLE1BQU0sRUFBRTtnQkFDTixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ3BCLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7Z0JBQzFCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzNDO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1NBQ3BDLENBQUE7UUFFRCxJQUFBLGVBQVEsRUFBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRTtZQUN2QyxHQUFHLEVBQUUsR0FBRyxFQUFFO2dCQUNSLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUEsdUJBQVUsRUFBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1lBQzNDLENBQUM7WUFDRCxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztZQUNqQixFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztTQUNiLENBQUMsQ0FBQTtRQUVGLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUNPLFFBQVEsQ0FBQyxDQUFlO1FBQzlCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUE7UUFDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO2FBQzFCLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ2xCLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3pCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDeEMsT0FBTztZQUNMLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNoQixRQUFRLEVBQUUsSUFBQSxvQkFBUSxFQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBQSxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLGVBQWUsRUFBRTtnQkFDZixFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtnQkFDN0QsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7YUFDckY7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFCLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO2dCQUMxQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMzQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztTQUNwQyxDQUFBO0lBQ0gsQ0FBQztJQUNPLFFBQVEsQ0FBQyxDQUFlO1FBQzlCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUE7UUFDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO2FBQzFCLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ2xCLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3pCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDeEMsT0FBTztZQUNMLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNoQixRQUFRLEVBQUUsSUFBQSxvQkFBUSxFQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBQSxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLGVBQWUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ3hFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakYsQ0FBQTtJQUNILENBQUM7SUFDTyxXQUFXLENBQUMsQ0FBZTtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUM3RCxPQUFPLFNBQVMsQ0FBQTtRQUNsQixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtRQUN4QixPQUFPO1lBQ0wsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7WUFDMUIsUUFBUSxFQUFFLElBQUEsb0JBQVEsRUFBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUEsb0JBQVEsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BELGVBQWUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDbEYsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNqRSxDQUFBO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxDQUFlO1FBQ2pDLHlFQUF5RTtRQUN6RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQTZCLENBQUE7UUFDcEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtRQUN4QixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLG1DQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUE7UUFDdEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUkscUNBQWdCLENBQ3hCLGlDQUFpQyxFQUFFLCtCQUErQixXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUM5RixDQUFBO1FBQ0gsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUE7UUFFNUIsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLGFBQXFCLEVBQUUsQ0FBUyxFQUFFLEVBQUU7WUFDakUsSUFBSSxDQUFDO2dCQUNILE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNsQixDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUkscUNBQWdCLENBQUMsY0FBYyxhQUFhLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNyRyxDQUFDO1FBQ0gsQ0FBQyxDQUFBO1FBQ0QsTUFBTSxHQUFHLEdBQWUsRUFBRSxDQUFBO1FBQzFCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMvQixNQUFNLEdBQUcsR0FDUCxPQUFPLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFBO1lBQzFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLHFDQUFnQixDQUN4Qiw2QkFBNkIsSUFBSSxvREFBb0QsRUFBRSxFQUFFLENBQzFGLENBQUE7WUFDSCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQ1YsR0FBRyxDQUFDLE1BQU0sS0FBSyxVQUFVO2dCQUN2QixDQUFDLENBQUMsQ0FBQyxJQUFBLHVCQUFVLEVBQUMsNEJBQTRCLENBQUMsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBRTdFLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsUUFBUSxFQUFFLElBQUEsb0JBQVEsRUFBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUEsb0JBQVEsRUFBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7Z0JBQ2pDLE1BQU07Z0JBQ04sZUFBZSxFQUFFO29CQUNmLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDdkMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUMxQixLQUFLLEVBQUUsUUFBaUI7d0JBQ3hCLFFBQVEsRUFBRSxLQUFLO3FCQUNoQixDQUFDLENBQUM7b0JBQ0gsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUM3QyxVQUFVLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7d0JBQzFCLEtBQUssRUFBRSxRQUFpQjt3QkFDeEIsUUFBUSxFQUFFLElBQUk7cUJBQ2YsQ0FBQyxDQUFDO2lCQUNKO2FBQ0YsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVPLGlCQUFpQixDQUN2QixHQUFlLEVBQ2YsSUFBWSxFQUNaLE9BQWUsRUFDZixlQUEyQjtRQUUzQixJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzNCLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBLENBQUMsOENBQThDO1FBRS9GLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDcEQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUNqRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBQSxhQUFNLEVBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztxQkFDdkUsS0FBSyxDQUFDLFVBQVUsQ0FBQztxQkFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7Z0JBQ3BELEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUEsQ0FBQyxxQkFBcUI7Z0JBQ3ZDLE1BQU0sSUFBSSxxQ0FBZ0IsQ0FBQyx5REFBeUQsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDM0csQ0FBQztZQUNELGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVuRCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUkscUNBQWdCLENBQ3hCLHNCQUFzQixLQUFLLGdDQUFnQyxJQUFJLFVBQVUsZUFBZSxFQUFFLENBQzNGLENBQUE7WUFDSCxDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO1lBQ2pFLE1BQU0sV0FBVyxHQUFHLG1DQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sSUFBSSxxQ0FBZ0IsQ0FDeEIsd0JBQXdCLFVBQVUseUJBQXlCLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQ3ZGLENBQUE7WUFDSCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQTtZQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDeEIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNULE1BQU0sSUFBSSxxQ0FBZ0IsQ0FBQyw2QkFBNkIsSUFBSSxRQUFRLFVBQVUsRUFBRSxDQUFDLENBQUE7WUFDbkYsQ0FBQztZQUVELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sR0FBRyxDQUFBO1lBQ1osQ0FBQztZQUVELEtBQUssR0FBRyxJQUFBLHVCQUFVLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBZ0I7UUFDOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNEQUFzRCxDQUFDLENBQUE7WUFDeEUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNyRCxJQUFJLE1BQU0sQ0FBQTtRQUNWLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzlCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLFFBQVEsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUE7WUFDNUUsTUFBTSxHQUFHLGNBQWMsQ0FBQTtRQUN6QixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUE7UUFFYixJQUFJLENBQUM7WUFDSCxTQUFTLEdBQUcsc0JBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDckMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsUUFBUSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtZQUN2RixTQUFTLEdBQUcsY0FBYyxDQUFBO1FBQzVCLENBQUM7UUFFRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFDeEQseUZBQXlGO1lBQ3pGLDREQUE0RDtZQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JCLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFBLGFBQU0sRUFDbEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUN4QyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDUCxDQUFBO1FBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBQSxlQUFRLEVBQ3hCLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQ2hDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNQLENBQUE7UUFDRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBQSw4QkFBa0IsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ2pGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN4RCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7Q0FDRjtBQTFrQ0QsNENBMGtDQztBQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQTtBQUV2QixTQUFTLFlBQVksQ0FBQyxRQUE0QjtJQUNoRCxNQUFNLEdBQUcsR0FBbUIsRUFBRSxDQUFBO0lBQzlCLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDakQsTUFBTSxHQUFHLEdBQUcsSUFBQSxzQkFBTSxFQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSw0QkFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLDRCQUFZLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUE7SUFDMUMsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBRUQsS0FBSyxVQUFVLFlBQVksQ0FBQyxPQUFpQixFQUFFLEtBQXFCO0lBQ2xFLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFBO0lBQzFDLE1BQU0sSUFBQSxlQUFRLEVBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFDLEVBQUU7UUFDM0MsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFBO1FBQy9ELE1BQU0sT0FBTyxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNyQyx5RUFBeUU7UUFDekUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQXNCLENBQUMsQ0FBQTtJQUN4QyxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sR0FBRyxDQUFBO0FBQ1osQ0FBQztBQUVELEtBQUssVUFBVSxhQUFhLENBQUMsT0FBaUIsRUFBRSxLQUFxQixFQUFFLFVBQThCO0lBQ25HLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFNO0lBQ1IsQ0FBQztJQUNELE1BQU0sSUFBQSxlQUFRLEVBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFDLEVBQUU7UUFDM0MsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQzNELE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN4QixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxRQUF1QjtJQUM5QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQTtJQUVyQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRTtRQUN4QyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzlCLElBQUksV0FBVyxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUNuQyxNQUFNLElBQUkscUNBQWdCLENBQUMseUNBQXlDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM5RixDQUFDO1FBRUQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDZixDQUFDLENBQUE7SUFFRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMxRCxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2hCLENBQUM7UUFDRCxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDN0QsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFBO0FBQ1osQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBcUI7SUFDN0MsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQTtBQUNqRCxDQUFDO0FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQTtBQUMzQyxNQUFNLG1CQUFtQixHQUFHLGlCQUFpQixDQUFBO0FBRTdDLE1BQU0sVUFBVSxHQUFHLElBQUEsc0JBQU0sRUFBQyxHQUFHLENBQUMsQ0FBQTtBQUM5QixNQUFNLGVBQWUsR0FBRyxJQUFBLG9CQUFRLEVBQUMsVUFBVSxFQUFFLElBQUEsb0JBQVEsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0FBRWpFLE1BQU0sY0FBYyxHQUFjLHNCQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBSXJELFNBQVMsT0FBTyxDQUFJLEtBQWM7SUFDaEMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDL0MsQ0FBQyJ9
|