@nf-beta/angular 0.0.1 → 0.0.3
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/builders.json +10 -0
- package/collection.json +27 -0
- package/generators.json +12 -0
- package/migration-collection.json +13 -0
- package/package.json +29 -5
- package/src/builders/build/builder.d.ts +6 -0
- package/src/builders/build/builder.d.ts.map +1 -0
- package/src/builders/build/builder.js +348 -0
- package/src/builders/build/federation-build-notifier.d.ts +70 -0
- package/src/builders/build/federation-build-notifier.d.ts.map +1 -0
- package/src/builders/build/federation-build-notifier.js +186 -0
- package/src/builders/build/schema.d.ts +21 -0
- package/src/builders/build/schema.json +84 -0
- package/src/config.d.ts +3 -0
- package/src/config.d.ts.map +1 -0
- package/src/config.js +2 -0
- package/src/generators/native-federation/files/src/index.ts__template__ +1 -0
- package/src/generators/native-federation/generator.d.ts +4 -0
- package/src/generators/native-federation/generator.d.ts.map +1 -0
- package/src/generators/native-federation/generator.js +43 -0
- package/src/generators/native-federation/schema.d.ts +5 -0
- package/src/generators/native-federation/schema.json +29 -0
- package/src/index.d.ts +2 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +1 -0
- package/src/patch-angular-build.d.ts +2 -0
- package/src/patch-angular-build.d.ts.map +1 -0
- package/src/patch-angular-build.js +5 -0
- package/src/plugin/dev-externals-mixin.d.ts +3 -0
- package/src/plugin/dev-externals-mixin.d.ts.map +1 -0
- package/src/plugin/dev-externals-mixin.js +29 -0
- package/src/plugin/externals-skip-list.d.ts +3 -0
- package/src/plugin/externals-skip-list.d.ts.map +1 -0
- package/src/plugin/externals-skip-list.js +4 -0
- package/src/plugin/index.d.ts +4 -0
- package/src/plugin/index.d.ts.map +1 -0
- package/src/plugin/index.js +75 -0
- package/src/schematics/appbuilder/schema.d.ts +3 -0
- package/src/schematics/appbuilder/schema.json +17 -0
- package/src/schematics/appbuilder/schematic.d.ts +5 -0
- package/src/schematics/appbuilder/schematic.d.ts.map +1 -0
- package/src/schematics/appbuilder/schematic.js +83 -0
- package/src/schematics/init/files/federation.config.js__tmpl__ +33 -0
- package/src/schematics/init/schema.d.ts +6 -0
- package/src/schematics/init/schema.json +34 -0
- package/src/schematics/init/schematic.d.ts +7 -0
- package/src/schematics/init/schematic.d.ts.map +1 -0
- package/src/schematics/init/schematic.js +422 -0
- package/src/schematics/remove/schema.d.ts +3 -0
- package/src/schematics/remove/schema.json +17 -0
- package/src/schematics/remove/schematic.d.ts +5 -0
- package/src/schematics/remove/schematic.d.ts.map +1 -0
- package/src/schematics/remove/schematic.js +109 -0
- package/src/schematics/update18/schema.json +7 -0
- package/src/schematics/update18/schematic.d.ts +3 -0
- package/src/schematics/update18/schematic.d.ts.map +1 -0
- package/src/schematics/update18/schematic.js +7 -0
- package/src/tools/fstart-as-data-url.d.ts +2 -0
- package/src/tools/fstart-as-data-url.d.ts.map +1 -0
- package/src/tools/fstart-as-data-url.js +1 -0
- package/src/utils/angular-esbuild-adapter.d.ts +10 -0
- package/src/utils/angular-esbuild-adapter.d.ts.map +1 -0
- package/src/utils/angular-esbuild-adapter.js +289 -0
- package/src/utils/angular-locales.d.ts +19 -0
- package/src/utils/angular-locales.d.ts.map +1 -0
- package/src/utils/angular-locales.js +18 -0
- package/src/utils/create-awaitable-compiler-plugin.d.ts +6 -0
- package/src/utils/create-awaitable-compiler-plugin.d.ts.map +1 -0
- package/src/utils/create-awaitable-compiler-plugin.js +29 -0
- package/src/utils/create-compiler-options.d.ts +5 -0
- package/src/utils/create-compiler-options.d.ts.map +1 -0
- package/src/utils/create-compiler-options.js +42 -0
- package/src/utils/event-source.d.ts +10 -0
- package/src/utils/event-source.d.ts.map +1 -0
- package/src/utils/event-source.js +10 -0
- package/src/utils/i18n.d.ts +23 -0
- package/src/utils/i18n.d.ts.map +1 -0
- package/src/utils/i18n.js +61 -0
- package/src/utils/mem-resuts.d.ts +29 -0
- package/src/utils/mem-resuts.d.ts.map +1 -0
- package/src/utils/mem-resuts.js +50 -0
- package/src/utils/patch-angular-build.d.ts +4 -0
- package/src/utils/patch-angular-build.d.ts.map +1 -0
- package/src/utils/patch-angular-build.js +29 -0
- package/src/utils/rebuild-events.d.ts +8 -0
- package/src/utils/rebuild-events.d.ts.map +1 -0
- package/src/utils/rebuild-events.js +4 -0
- package/src/utils/shared-mappings-plugin.d.ts +4 -0
- package/src/utils/shared-mappings-plugin.d.ts.map +1 -0
- package/src/utils/shared-mappings-plugin.js +28 -0
- package/src/utils/updateIndexHtml.d.ts +5 -0
- package/src/utils/updateIndexHtml.d.ts.map +1 -0
- package/src/utils/updateIndexHtml.js +34 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
export default function remove(options) {
|
|
3
|
+
return async function (tree) {
|
|
4
|
+
const workspaceFileName = getWorkspaceFileName(tree);
|
|
5
|
+
const workspace = JSON.parse(tree.read(workspaceFileName)?.toString('utf8') ?? '{}');
|
|
6
|
+
const normalized = normalizeOptions(options, workspace);
|
|
7
|
+
const { polyfills, projectRoot } = normalized;
|
|
8
|
+
const bootstrapPath = path.join(projectRoot, 'src/bootstrap.ts');
|
|
9
|
+
const mainPath = path.join(projectRoot, 'src/main.ts');
|
|
10
|
+
makeMainSync(tree, bootstrapPath, mainPath);
|
|
11
|
+
updatePolyfills(tree, polyfills);
|
|
12
|
+
updateWorkspaceConfig(tree, normalized, workspace, workspaceFileName);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function makeMainSync(tree, bootstrapPath, mainPath) {
|
|
16
|
+
if (tree.exists(bootstrapPath) && tree.exists(mainPath)) {
|
|
17
|
+
tree.delete(mainPath);
|
|
18
|
+
tree.rename(bootstrapPath, mainPath);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function updateWorkspaceConfig(tree, options, workspace, workspaceFileName) {
|
|
22
|
+
const { projectConfig } = options;
|
|
23
|
+
if (!projectConfig?.architect?.build || !projectConfig?.architect?.serve) {
|
|
24
|
+
throw new Error(`The project doesn't have a build or serve target in angular.json!`);
|
|
25
|
+
}
|
|
26
|
+
if (projectConfig.architect.esbuild) {
|
|
27
|
+
projectConfig.architect.build = projectConfig.architect.esbuild;
|
|
28
|
+
delete projectConfig.architect.esbuild;
|
|
29
|
+
}
|
|
30
|
+
if (projectConfig.architect['serve-original']) {
|
|
31
|
+
projectConfig.architect.serve = projectConfig.architect['serve-original'];
|
|
32
|
+
delete projectConfig.architect['serve-original'];
|
|
33
|
+
}
|
|
34
|
+
if (projectConfig.architect.serve) {
|
|
35
|
+
const conf = projectConfig.architect.serve.configurations;
|
|
36
|
+
conf.production.buildTarget = conf.production.buildTarget.replace(':esbuild:', ':build:');
|
|
37
|
+
conf.development.buildTarget = conf.development.buildTarget.replace(':esbuild:', ':build:');
|
|
38
|
+
}
|
|
39
|
+
tree.overwrite(workspaceFileName, JSON.stringify(workspace, null, '\t'));
|
|
40
|
+
}
|
|
41
|
+
function normalizeOptions(options, workspace) {
|
|
42
|
+
if (!options.project) {
|
|
43
|
+
options.project = workspace.defaultProject;
|
|
44
|
+
}
|
|
45
|
+
const projects = Object.keys(workspace.projects);
|
|
46
|
+
if (!options.project && projects.length === 0) {
|
|
47
|
+
throw new Error(`No default project found. Please specifiy a project name!`);
|
|
48
|
+
}
|
|
49
|
+
if (!options.project) {
|
|
50
|
+
console.log('Using first configured project as default project: ' + projects[0]);
|
|
51
|
+
options.project = projects[0];
|
|
52
|
+
}
|
|
53
|
+
const projectName = options.project;
|
|
54
|
+
const projectConfig = workspace.projects[projectName];
|
|
55
|
+
if (!projectConfig) {
|
|
56
|
+
throw new Error(`Project ${projectName} not found in angular.json.`);
|
|
57
|
+
}
|
|
58
|
+
const projectRoot = projectConfig.root?.replace(/\\/g, '/');
|
|
59
|
+
const projectSourceRoot = projectConfig.sourceRoot?.replace(/\\/g, '/');
|
|
60
|
+
const manifestPath = path
|
|
61
|
+
.join(projectRoot, 'src/assets/federation.manifest.json')
|
|
62
|
+
.replace(/\\/g, '/');
|
|
63
|
+
const main = projectConfig.architect.build.options.main;
|
|
64
|
+
if (!projectConfig.architect.build.options.polyfills) {
|
|
65
|
+
projectConfig.architect.build.options.polyfills = [];
|
|
66
|
+
}
|
|
67
|
+
const polyfills = projectConfig.architect.build.options.polyfills;
|
|
68
|
+
return {
|
|
69
|
+
polyfills,
|
|
70
|
+
projectName,
|
|
71
|
+
projectRoot,
|
|
72
|
+
projectSourceRoot,
|
|
73
|
+
manifestPath,
|
|
74
|
+
projectConfig,
|
|
75
|
+
main,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function updatePolyfills(tree, polyfills) {
|
|
79
|
+
if (typeof polyfills === 'string') {
|
|
80
|
+
updatePolyfillsFile(tree, polyfills);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
updatePolyfillsArray(tree, polyfills);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function updatePolyfillsFile(tree, polyfills) {
|
|
87
|
+
let polyfillsContent = tree.readText(polyfills);
|
|
88
|
+
if (polyfillsContent.includes('es-module-shims')) {
|
|
89
|
+
polyfillsContent = polyfillsContent.replace(`import 'es-module-shims';`, '');
|
|
90
|
+
tree.overwrite(polyfills, polyfillsContent);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function updatePolyfillsArray(_tree, polyfills) {
|
|
94
|
+
const polyfillsConfig = polyfills;
|
|
95
|
+
const index = polyfillsConfig.findIndex(p => p === 'es-module-shims');
|
|
96
|
+
if (index === -1) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
polyfillsConfig.splice(index, 1);
|
|
100
|
+
}
|
|
101
|
+
export function getWorkspaceFileName(tree) {
|
|
102
|
+
if (tree.exists('angular.json')) {
|
|
103
|
+
return 'angular.json';
|
|
104
|
+
}
|
|
105
|
+
if (tree.exists('workspace.json')) {
|
|
106
|
+
return 'workspace.json';
|
|
107
|
+
}
|
|
108
|
+
throw new Error("angular.json or workspace.json expected! Did you call this in your project's root?");
|
|
109
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schematic.d.ts","sourceRoot":"","sources":["../../../../src/schematics/update18/schematic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAQ,MAAM,4BAA4B,CAAC;AAI7D,MAAM,CAAC,OAAO,UAAU,QAAQ,IAAI,IAAI,CAKvC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const fstart = "Ly8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvbm9kZS9pbml0LW5vZGUtZmVkZXJhdGlvbi50cwppbXBvcnQgeyByZWdpc3RlciB9IGZyb20gIm5vZGU6bW9kdWxlIjsKaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gIm5vZGU6dXJsIjsKaW1wb3J0ICogYXMgZnMyIGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgKiBhcyBwYXRoMiBmcm9tICJub2RlOnBhdGgiOwoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvZ2xvYmFsLWNhY2hlLnRzCnZhciBuZk5hbWVzcGFjZSA9ICJfX05BVElWRV9GRURFUkFUSU9OX18iOwp2YXIgZ2xvYmFsMiA9IGdsb2JhbFRoaXM7Cmdsb2JhbDJbbmZOYW1lc3BhY2VdID8/PSB7CiAgZXh0ZXJuYWxzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogIHJlbW90ZU5hbWVzVG9SZW1vdGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksCiAgYmFzZVVybFRvUmVtb3RlTmFtZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkKfTsKdmFyIGdsb2JhbENhY2hlID0gZ2xvYmFsMltuZk5hbWVzcGFjZV07CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9leHRlcm5hbHMudHMKdmFyIGV4dGVybmFscyA9IGdsb2JhbENhY2hlLmV4dGVybmFsczsKZnVuY3Rpb24gZ2V0RXh0ZXJuYWxLZXkoc2hhcmVkKSB7CiAgcmV0dXJuIGAke3NoYXJlZC5wYWNrYWdlTmFtZX1AJHtzaGFyZWQudmVyc2lvbn1gOwp9CmZ1bmN0aW9uIGdldEV4dGVybmFsVXJsKHNoYXJlZCkgewogIGNvbnN0IHBhY2thZ2VLZXkgPSBnZXRFeHRlcm5hbEtleShzaGFyZWQpOwogIHJldHVybiBleHRlcm5hbHMuZ2V0KHBhY2thZ2VLZXkpOwp9CmZ1bmN0aW9uIHNldEV4dGVybmFsVXJsKHNoYXJlZCwgdXJsMikgewogIGNvbnN0IHBhY2thZ2VLZXkgPSBnZXRFeHRlcm5hbEtleShzaGFyZWQpOwogIGV4dGVybmFscy5zZXQocGFja2FnZUtleSwgdXJsMik7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL21vZGVsL2ltcG9ydC1tYXAudHMKZnVuY3Rpb24gbWVyZ2VJbXBvcnRNYXBzKG1hcDEsIG1hcDIpIHsKICByZXR1cm4gewogICAgaW1wb3J0czogeyAuLi5tYXAxLmltcG9ydHMsIC4uLm1hcDIuaW1wb3J0cyB9LAogICAgc2NvcGVzOiB7IC4uLm1hcDEuc2NvcGVzLCAuLi5tYXAyLnNjb3BlcyB9CiAgfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvcmVtb3Rlcy50cwp2YXIgcmVtb3RlTmFtZXNUb1JlbW90ZSA9IGdsb2JhbENhY2hlLnJlbW90ZU5hbWVzVG9SZW1vdGU7CnZhciBiYXNlVXJsVG9SZW1vdGVOYW1lcyA9IGdsb2JhbENhY2hlLmJhc2VVcmxUb1JlbW90ZU5hbWVzOwpmdW5jdGlvbiBhZGRSZW1vdGUocmVtb3RlTmFtZSwgcmVtb3RlKSB7CiAgcmVtb3RlTmFtZXNUb1JlbW90ZS5zZXQocmVtb3RlTmFtZSwgcmVtb3RlKTsKICBiYXNlVXJsVG9SZW1vdGVOYW1lcy5zZXQocmVtb3RlLmJhc2VVcmwsIHJlbW90ZU5hbWUpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi91dGlscy9wYXRoLXV0aWxzLnRzCmZ1bmN0aW9uIGdldERpcmVjdG9yeSh1cmwyKSB7CiAgY29uc3QgcGFydHMgPSB1cmwyLnNwbGl0KCIvIik7CiAgcGFydHMucG9wKCk7CiAgcmV0dXJuIHBhcnRzLmpvaW4oIi8iKTsKfQpmdW5jdGlvbiBqb2luUGF0aHMocGF0aDEsIHBhdGgyMikgewogIHdoaWxlIChwYXRoMS5lbmRzV2l0aCgiLyIpKSB7CiAgICBwYXRoMSA9IHBhdGgxLnN1YnN0cmluZygwLCBwYXRoMS5sZW5ndGggLSAxKTsKICB9CiAgaWYgKHBhdGgyMi5zdGFydHNXaXRoKCIuLyIpKSB7CiAgICBwYXRoMjIgPSBwYXRoMjIuc3Vic3RyaW5nKDIsIHBhdGgyMi5sZW5ndGgpOwogIH0KICByZXR1cm4gYCR7cGF0aDF9LyR7cGF0aDIyfWA7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL3dhdGNoLWZlZGVyYXRpb24tYnVpbGQudHMKZnVuY3Rpb24gd2F0Y2hGZWRlcmF0aW9uQnVpbGRDb21wbGV0aW9uKGVuZHBvaW50KSB7CiAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoZW5kcG9pbnQpOwogIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsKICAgIGlmIChkYXRhLnR5cGUgPT09ICJmZWRlcmF0aW9uLXJlYnVpbGQtY29tcGxldGUiIC8qIENPTVBMRVRFRCAqLykgewogICAgICBjb25zb2xlLmxvZygiW0ZlZGVyYXRpb25dIFJlYnVpbGQgY29tcGxldGVkLCByZWxvYWRpbmcuLi4iKTsKICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfQogIH07CiAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjb25zb2xlLndhcm4oIltGZWRlcmF0aW9uXSBTU0UgY29ubmVjdGlvbiBlcnJvcjoiLCBldmVudCk7CiAgfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvaW5pdC1mZWRlcmF0aW9uLnRzCmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbmZvcyhyZW1vdGVzLCBvcHRpb25zID0geyB0aHJvd0lmUmVtb3RlTm90Rm91bmQ6IGZhbHNlIH0pIHsKICBjb25zdCBwcm9jZXNzUmVtb3RlSW5mb1Byb21pc2VzID0gT2JqZWN0LmtleXMocmVtb3RlcykubWFwKAogICAgYXN5bmMgKHJlbW90ZU5hbWUpID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBsZXQgdXJsMiA9IHJlbW90ZXNbcmVtb3RlTmFtZV07CiAgICAgICAgaWYgKG9wdGlvbnMuY2FjaGVUYWcpIHsKICAgICAgICAgIGNvbnN0IGFkZEFwcGVuZCA9IHJlbW90ZXNbcmVtb3RlTmFtZV0uaW5jbHVkZXMoIj8iKSA/ICImIiA6ICI/IjsKICAgICAgICAgIHVybDIgKz0gYCR7YWRkQXBwZW5kfXQ9JHtvcHRpb25zLmNhY2hlVGFnfWA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhd2FpdCBwcm9jZXNzUmVtb3RlSW5mbyh1cmwyLCByZW1vdGVOYW1lKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnN0IGVycm9yID0gYEVycm9yIGxvYWRpbmcgcmVtb3RlIGVudHJ5IGZvciAke3JlbW90ZU5hbWV9IGZyb20gZmlsZSAke3JlbW90ZXNbcmVtb3RlTmFtZV19YDsKICAgICAgICBpZiAob3B0aW9ucy50aHJvd0lmUmVtb3RlTm90Rm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7CiAgICAgICAgfQogICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgKTsKICBjb25zdCByZW1vdGVJbXBvcnRNYXBzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvY2Vzc1JlbW90ZUluZm9Qcm9taXNlcyk7CiAgY29uc3QgaW1wb3J0TWFwID0gcmVtb3RlSW1wb3J0TWFwcy5yZWR1Y2UoCiAgICAoYWNjLCByZW1vdGVJbXBvcnRNYXApID0+IHJlbW90ZUltcG9ydE1hcCA/IG1lcmdlSW1wb3J0TWFwcyhhY2MsIHJlbW90ZUltcG9ydE1hcCkgOiBhY2MsCiAgICB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH0KICApOwogIHJldHVybiBpbXBvcnRNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1JlbW90ZUluZm8oZmVkZXJhdGlvbkluZm9VcmwsIHJlbW90ZU5hbWUpIHsKICBjb25zdCBiYXNlVXJsID0gZ2V0RGlyZWN0b3J5KGZlZGVyYXRpb25JbmZvVXJsKTsKICBjb25zdCByZW1vdGVJbmZvID0gYXdhaXQgbG9hZEZlZGVyYXRpb25JbmZvKGZlZGVyYXRpb25JbmZvVXJsKTsKICBpZiAoIXJlbW90ZU5hbWUpIHsKICAgIHJlbW90ZU5hbWUgPSByZW1vdGVJbmZvLm5hbWU7CiAgfQogIGlmIChyZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50KSB7CiAgICB3YXRjaEZlZGVyYXRpb25CdWlsZENvbXBsZXRpb24oCiAgICAgIGJhc2VVcmwgKyByZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50CiAgICApOwogIH0KICBjb25zdCBpbXBvcnRNYXAgPSBjcmVhdGVSZW1vdGVJbXBvcnRNYXAocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCk7CiAgYWRkUmVtb3RlKHJlbW90ZU5hbWUsIHsgLi4ucmVtb3RlSW5mbywgYmFzZVVybCB9KTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUltcG9ydE1hcChyZW1vdGVJbmZvLCByZW1vdGVOYW1lLCBiYXNlVXJsKSB7CiAgY29uc3QgaW1wb3J0cyA9IHByb2Nlc3NFeHBvc2VkKHJlbW90ZUluZm8sIHJlbW90ZU5hbWUsIGJhc2VVcmwpOwogIGNvbnN0IHNjb3BlcyA9IHByb2Nlc3NSZW1vdGVJbXBvcnRzKHJlbW90ZUluZm8sIGJhc2VVcmwpOwogIHJldHVybiB7IGltcG9ydHMsIHNjb3BlcyB9Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGZWRlcmF0aW9uSW5mbyh1cmwyKSB7CiAgY29uc3QgaW5mbyA9IGF3YWl0IGZldGNoKHVybDIpLnRoZW4oKHIpID0+IHIuanNvbigpKTsKICByZXR1cm4gaW5mbzsKfQpmdW5jdGlvbiBwcm9jZXNzUmVtb3RlSW1wb3J0cyhyZW1vdGVJbmZvLCBiYXNlVXJsKSB7CiAgY29uc3Qgc2NvcGVzID0ge307CiAgY29uc3Qgc2NvcGVkSW1wb3J0cyA9IHt9OwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIHJlbW90ZUluZm8uc2hhcmVkKSB7CiAgICBjb25zdCBvdXRGaWxlTmFtZSA9IGdldEV4dGVybmFsVXJsKHNoYXJlZCkgPz8gam9pblBhdGhzKGJhc2VVcmwsIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgICBzZXRFeHRlcm5hbFVybChzaGFyZWQsIG91dEZpbGVOYW1lKTsKICAgIHNjb3BlZEltcG9ydHNbc2hhcmVkLnBhY2thZ2VOYW1lXSA9IG91dEZpbGVOYW1lOwogIH0KICBzY29wZXNbYmFzZVVybCArICIvIl0gPSBzY29wZWRJbXBvcnRzOwogIHJldHVybiBzY29wZXM7Cn0KZnVuY3Rpb24gcHJvY2Vzc0V4cG9zZWQocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCkgewogIGNvbnN0IGltcG9ydHMgPSB7fTsKICBmb3IgKGNvbnN0IGV4cG9zZWQgb2YgcmVtb3RlSW5mby5leHBvc2VzKSB7CiAgICBjb25zdCBrZXkgPSBqb2luUGF0aHMocmVtb3RlTmFtZSwgZXhwb3NlZC5rZXkpOwogICAgY29uc3QgdmFsdWUgPSBqb2luUGF0aHMoYmFzZVVybCwgZXhwb3NlZC5vdXRGaWxlTmFtZSk7CiAgICBpbXBvcnRzW2tleV0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIGltcG9ydHM7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0hvc3RJbmZvKGhvc3RJbmZvLCByZWxCdW5kbGVzUGF0aCA9ICIuLyIpIHsKICBjb25zdCBpbXBvcnRzID0gaG9zdEluZm8uc2hhcmVkLnJlZHVjZSgKICAgIChhY2MsIGN1cikgPT4gKHsKICAgICAgLi4uYWNjLAogICAgICBbY3VyLnBhY2thZ2VOYW1lXTogcmVsQnVuZGxlc1BhdGggKyBjdXIub3V0RmlsZU5hbWUKICAgIH0pLAogICAge30KICApOwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIGhvc3RJbmZvLnNoYXJlZCkgewogICAgc2V0RXh0ZXJuYWxVcmwoc2hhcmVkLCByZWxCdW5kbGVzUGF0aCArIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgfQogIHJldHVybiB7IGltcG9ydHMsIHNjb3Blczoge30gfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvdXRpbHMvaW1wb3J0LW1hcC1sb2FkZXIuanMKaW1wb3J0IHBhdGggZnJvbSAicGF0aCI7CmltcG9ydCB1cmwgZnJvbSAidXJsIjsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICJmcyI7CnZhciBJTVBPUlRfTUFQX0ZJTEVfTkFNRSA9ICJub2RlLmltcG9ydG1hcCI7CnZhciBiYXNlVVJMID0gdXJsLnBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSkgKyBwYXRoLnNlcDsKZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CiAgbGV0IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0ge307CiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJzZWQsICJpbXBvcnRzIikpIHsKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuaW1wb3J0cykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJpbXBvcnRzIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdGApOwogICAgfQogICAgc29ydGVkQW5kTm9ybWFsaXplZEltcG9ydHMgPSBzb3J0QW5kTm9ybWFsaXplU3BlY2lmaWVyTWFwKAogICAgICBwYXJzZWQuaW1wb3J0cywKICAgICAgYmFzZVVSTAogICAgKTsKICB9CiAgbGV0IHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSB7fTsKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnNlZCwgInNjb3BlcyIpKSB7CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLnNjb3BlcykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJzY29wZXMiIHByb3BlcnR5IG11c3QgYmUgYW4gb2JqZWN0YCk7CiAgICB9CiAgICBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0gc29ydEFuZE5vcm1hbGl6ZVNjb3BlcyhwYXJzZWQuc2NvcGVzLCBiYXNlVVJMKTsKICB9CiAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhwYXJzZWQpLmZpbHRlcigKICAgIChrZXkpID0+IGtleSAhPT0gImltcG9ydHMiICYmIGtleSAhPT0gInNjb3BlcyIKICApOwogIGlmIChpbnZhbGlkS2V5cy5sZW5ndGggPiAwKSB7CiAgICBjb25zb2xlLndhcm4oCiAgICAgIGBJbnZhbGlkIHRvcC1sZXZlbCBrZXkke2ludmFsaWRLZXlzLmxlbmd0aCA+IDAgPyAicyIgOiAiIn0gaW4gaW1wb3J0IG1hcCAtICR7aW52YWxpZEtleXMuam9pbigiLCAiKX1gCiAgICApOwogIH0KICByZXR1cm4gewogICAgaW1wb3J0czogc29ydGVkQW5kTm9ybWFsaXplZEltcG9ydHMsCiAgICBzY29wZXM6IHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMKICB9Owp9CmZ1bmN0aW9uIHNvcnRBbmROb3JtYWxpemVTcGVjaWZpZXJNYXAobWFwLCBiYXNlVVJMMikgewogIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fTsKICBmb3IgKGxldCBzcGVjaWZpZXJLZXkgaW4gbWFwKSB7CiAgICBjb25zdCB2YWx1ZSA9IG1hcFtzcGVjaWZpZXJLZXldOwogICAgY29uc3Qgbm9ybWFsaXplZFNwZWNpZmllcktleSA9IG5vcm1hbGl6ZVNwZWNpZmllcktleShzcGVjaWZpZXJLZXksIGJhc2VVUkwyKTsKICAgIGlmIChub3JtYWxpemVkU3BlY2lmaWVyS2V5ID09PSBudWxsKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbGV0IGFkZHJlc3NVUkwgPSBwYXJzZVVSTExpa2VTcGVjaWZpZXIodmFsdWUsIGJhc2VVUkwyKTsKICAgIGlmIChhZGRyZXNzVVJMID09PSBudWxsKSB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgSW52YWxpZCBVUkwgYWRkcmVzcyBmb3IgaW1wb3J0IG1hcCBzcGVjaWZpZXIgJyR7c3BlY2lmaWVyS2V5fSdgCiAgICAgICk7CiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBudWxsOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmIChzcGVjaWZpZXJLZXkuZW5kc1dpdGgoIi8iKSAmJiAhYWRkcmVzc1VSTC5lbmRzV2l0aCgiLyIpKSB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgSW52YWxpZCBVUkwgYWRkcmVzcyBmb3IgaW1wb3J0IG1hcCBzcGVjaWZpZXIgJyR7c3BlY2lmaWVyS2V5fScgLSBzaW5jZSB0aGUgc3BlY2lmaWVyIGVuZHMgaW4gc2xhc2gsIHNvIG11c3QgdGhlIGFkZHJlc3NgCiAgICAgICk7CiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBudWxsOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBhZGRyZXNzVVJMOwogIH0KICByZXR1cm4gbm9ybWFsaXplZDsKfQpmdW5jdGlvbiBub3JtYWxpemVTcGVjaWZpZXJLZXkoa2V5KSB7CiAgaWYgKGtleSA9PT0gIiIpIHsKICAgIGNvbnNvbGUud2FybihgU3BlY2lmaWVyIGtleXMgaW4gaW1wb3J0IG1hcHMgbWF5IG5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nYCk7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcmV0dXJuIHBhcnNlVVJMTGlrZVNwZWNpZmllcihrZXksIGJhc2VVUkwpIHx8IGtleTsKfQpmdW5jdGlvbiBwYXJzZVVSTExpa2VTcGVjaWZpZXIoc3BlY2lmaWVyLCBiYXNlVVJMMikgewogIGNvbnN0IHVzZUJhc2VVcmxBc1BhcmVudCA9IHNwZWNpZmllci5zdGFydHNXaXRoKCIvIikgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoIi4vIikgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoIi4uLyIpOwogIHRyeSB7CiAgICByZXR1cm4gbmV3IFVSTChzcGVjaWZpZXIsIHVzZUJhc2VVcmxBc1BhcmVudCA/IGJhc2VVUkwyIDogdm9pZCAwKS5ocmVmOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIG51bGw7CiAgfQp9CmZ1bmN0aW9uIHNvcnRBbmROb3JtYWxpemVTY29wZXMobWFwLCBiYXNlVVJMMikgewogIGxldCBub3JtYWxpemVkID0ge307CiAgZm9yIChsZXQgc2NvcGVQcmVmaXggaW4gbWFwKSB7CiAgICBjb25zdCBwb3RlbnRpYWxTcGVjaWZpZXJNYXAgPSBtYXBbc2NvcGVQcmVmaXhdOwogICAgaWYgKCFpc1BsYWluT2JqZWN0KHBvdGVudGlhbFNwZWNpZmllck1hcCkpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgIGBUaGUgdmFsdWUgb2Ygc2NvcGUgJHtzY29wZVByZWZpeH0gbXVzdCBiZSBhIEpTT04gb2JqZWN0YAogICAgICApOwogICAgfQogICAgbGV0IHNjb3BlUHJlZml4VVJMOwogICAgdHJ5IHsKICAgICAgc2NvcGVQcmVmaXhVUkwgPSBuZXcgVVJMKHNjb3BlUHJlZml4LCBiYXNlVVJMMikuaHJlZjsKICAgIH0gY2F0Y2ggewogICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgYFNjb3BlIHByZWZpeCBVUkwgJyR7c2NvcGVQcmVmaXh9JyB3YXMgbm90IHBhcnNlYWJsZSBpbiBpbXBvcnQgbWFwYAogICAgICApOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIG5vcm1hbGl6ZWRbc2NvcGVQcmVmaXhVUkxdID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcG90ZW50aWFsU3BlY2lmaWVyTWFwLAogICAgICBiYXNlVVJMMgogICAgKTsKICB9CiAgcmV0dXJuIG5vcm1hbGl6ZWQ7Cn0KZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHsKICByZXR1cm4gb2JqID09PSBPYmplY3Qob2JqKSAmJiAhQXJyYXkuaXNBcnJheShvYmopOwp9CnZhciBpbXBvcnRNYXBQcm9taXNlID0gZ2V0SW1wb3J0TWFwUHJvbWlzZSgpOwphc3luYyBmdW5jdGlvbiBnZXRJbXBvcnRNYXBQcm9taXNlKCkgewogIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHByb2Nlc3MuZW52LklNUE9SVF9NQVBfUEFUSCB8fCBJTVBPUlRfTUFQX0ZJTEVfTkFNRTsKICBjb25zdCBpbXBvcnRNYXBQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlbGF0aXZlUGF0aCk7CiAgbGV0IHN0cjsKICB0cnkgewogICAgc3RyID0gYXdhaXQgZnMucmVhZEZpbGUoaW1wb3J0TWFwUGF0aCk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICByZXR1cm4gZW1wdHlNYXAoKTsKICB9CiAgbGV0IGpzb247CiAgdHJ5IHsKICAgIGpzb24gPSBhd2FpdCBKU09OLnBhcnNlKHN0cik7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB0aHJvdyBFcnJvcigKICAgICAgYEltcG9ydCBtYXAgYXQgJHtpbXBvcnRNYXBQYXRofSBjb250YWlucyBpbnZhbGlkIGpzb246ICR7ZXJyLm1lc3NhZ2V9YAogICAgKTsKICB9CiAgcmV0dXJuIHJlc29sdmVBbmRDb21wb3NlSW1wb3J0TWFwKGpzb24pOwp9Cmdsb2JhbC5ub2RlTG9hZGVyID0gZ2xvYmFsLm5vZGVMb2FkZXIgfHwge307Cmdsb2JhbC5ub2RlTG9hZGVyLnNldEltcG9ydE1hcFByb21pc2UgPSBmdW5jdGlvbiBzZXRJbXBvcnRNYXBQcm9taXNlKHByb21pc2UpIHsKICBpbXBvcnRNYXBQcm9taXNlID0gcHJvbWlzZS50aGVuKChtYXApID0+IHsKICAgIHJldHVybiByZXNvbHZlQW5kQ29tcG9zZUltcG9ydE1hcChtYXApOwogIH0pOwp9OwpmdW5jdGlvbiBlbXB0eU1hcCgpIHsKICByZXR1cm4geyBpbXBvcnRzOiB7fSwgc2NvcGVzOiB7fSB9Owp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi91dGlscy9sb2FkZXItYXMtZGF0YS11cmwuanMKdmFyIHJlc29sdmVyID0gImFXMXdiM0owSUhCaGRHZ2dabkp2YlNBbmNHRjBhQ2M3Q21sdGNHOXlkQ0IxY213Z1puSnZiU0FuZFhKc0p6c0thVzF3YjNKMElIc2djSEp2YldselpYTWdZWE1nWm5NZ2ZTQm1jbTl0SUNkbWN5YzdDZ3BsZUhCdmNuUWdZMjl1YzNRZ1NVMVFUMUpVWDAxQlVGOUdTVXhGWDA1QlRVVWdQU0FuYm05a1pTNXBiWEJ2Y25SdFlYQW5Pd29LWTI5dWMzUWdZbUZ6WlZWU1RDQTlJSFZ5YkM1d1lYUm9WRzlHYVd4bFZWSk1LSEJ5YjJObGMzTXVZM2RrS0NrcElDc2djR0YwYUM1elpYQTdDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOdVpYY3RjbVZ6YjJ4MlpTMWhiR2R2Y21sMGFHMEtaWGh3YjNKMElHWjFibU4wYVc5dUlISmxjMjlzZG1WVGNHVmphV1pwWlhJb2FXMXdiM0owVFdGd0xDQnpjR1ZqYVdacFpYSXNJSEJoY21WdWRGVlNUQ2tnZXdvZ0lHeGxkQ0JqZFhKeVpXNTBRbUZ6WlZWU1REc0tJQ0JwWmlBb2NHRnlaVzUwVlZKTUtTQjdDaUFnSUNCamIyNXpkQ0JzWVhOMFUyeGhjMmhKYm1SbGVDQTlJSEJoY21WdWRGVlNUQzVzWVhOMFNXNWtaWGhQWmlod1lYUm9Mbk5sY0NrN0NpQWdJQ0JqZFhKeVpXNTBRbUZ6WlZWU1RDQTlJSEJoY21WdWRGVlNUQzV6YkdsalpTZ3dMQ0JzWVhOMFUyeGhjMmhKYm1SbGVDQXJJREVwT3dvZ0lIMGdaV3h6WlNCN0NpQWdJQ0JqZFhKeVpXNTBRbUZ6WlZWU1RDQTlJR0poYzJWVlVrdzdDaUFnZlFvZ0lHTnZibk4wSUc1dmNtMWhiR2w2WldSVGNHVmphV1pwWlhJZ1BRb2dJQ0FnY0dGeWMyVlZVa3hNYVd0bFUzQmxZMmxtYVdWeUtITndaV05wWm1sbGNpd2dZM1Z5Y21WdWRFSmhjMlZWVWt3cElIeDhJSE53WldOcFptbGxjanNLSUNCbWIzSWdLR3hsZENCelkyOXdaVkJ5WldacGVDQnBiaUJwYlhCdmNuUk5ZWEF1YzJOdmNHVnpLU0I3Q2lBZ0lDQnBaaUFvQ2lBZ0lDQWdJSE5qYjNCbFVISmxabWw0SUQwOVBTQmpkWEp5Wlc1MFFtRnpaVlZTVENCOGZBb2dJQ0FnSUNBb2MyTnZjR1ZRY21WbWFYZ3VaVzVrYzFkcGRHZ29KeThuS1NBbUppQmpkWEp5Wlc1MFFtRnpaVlZTVEM1emRHRnlkSE5YYVhSb0tITmpiM0JsVUhKbFptbDRLU2tLSUNBZ0lDa2dld29nSUNBZ0lDQmpiMjV6ZENCelkyOXdaVWx0Y0c5eWRITk5ZWFJqYUNBOUlISmxjMjlzZG1WSmJYQnZjblJ6VFdGMFkyZ29DaUFnSUNBZ0lDQWdibTl5YldGc2FYcGxaRk53WldOcFptbGxjaXdLSUNBZ0lDQWdJQ0JwYlhCdmNuUk5ZWEF1YzJOdmNHVnpXM05qYjNCbFVISmxabWw0WFN3S0lDQWdJQ0FnS1RzS0lDQWdJQ0FnYVdZZ0tITmpiM0JsU1cxd2IzSjBjMDFoZEdOb0tTQjdDaUFnSUNBZ0lDQWdjbVYwZFhKdUlITmpiM0JsU1cxd2IzSjBjMDFoZEdOb093b2dJQ0FnSUNCOUNpQWdJQ0I5SUdWc2MyVWdld29nSUNBZ0lDQmpiMjV6ZENCMGIzQk1aWFpsYkVsdGNHOXlkSE5OWVhSamFDQTlJSEpsYzI5c2RtVkpiWEJ2Y25SelRXRjBZMmdvQ2lBZ0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2l3S0lDQWdJQ0FnSUNCcGJYQnZjblJOWVhBdWFXMXdiM0owY3l3S0lDQWdJQ0FnS1RzS0lDQWdJQ0FnYVdZZ0tIUnZjRXhsZG1Wc1NXMXdiM0owYzAxaGRHTm9LU0I3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJSFJ2Y0V4bGRtVnNTVzF3YjNKMGMwMWhkR05vT3dvZ0lDQWdJQ0I5Q2lBZ0lDQjlDaUFnZlFvS0lDQnlaWFIxY200Z2NtVnpiMngyWlVsdGNHOXlkSE5OWVhSamFDaHViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlMQ0JwYlhCdmNuUk5ZWEF1YVcxd2IzSjBjeWs3Q24wS0NpOHZJR2gwZEhCek9pOHZkMmxqWnk1bmFYUm9kV0l1YVc4dmFXMXdiM0owTFcxaGNITXZJM0psYzI5c2RtVXRZVzR0YVcxd2IzSjBjeTF0WVhSamFBcG1kVzVqZEdsdmJpQnlaWE52YkhabFNXMXdiM0owYzAxaGRHTm9LRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWElzSUhOd1pXTnBabWxsY2sxaGNDa2dld29nSUdadmNpQW9iR1YwSUhOd1pXTnBabWxsY2t0bGVTQnBiaUJ6Y0dWamFXWnBaWEpOWVhBcElIc0tJQ0FnSUdOdmJuTjBJSEpsYzI5c2RYUnBiMjVTWlhOMWJIUWdQU0J6Y0dWamFXWnBaWEpOWVhCYmMzQmxZMmxtYVdWeVMyVjVYVHNLQ2lBZ0lDQnBaaUFvYzNCbFkybG1hV1Z5UzJWNUlEMDlQU0J1YjNKdFlXeHBlbVZrVTNCbFkybG1hV1Z5S1NCN0NpQWdJQ0FnSUdsbUlDaHlaWE52YkhWMGFXOXVVbVZ6ZFd4MElEMDlQU0J1ZFd4c0tTQjdDaUFnSUNBZ0lDQWdkR2h5YjNjZ1ZIbHdaVVZ5Y205eUtBb2dJQ0FnSUNBZ0lDQWdZRlJvWlNCcGJYQnZjblFnYldGd0lISmxjMjlzZFhScGIyNGdiMllnSkh0emNHVmphV1pwWlhKTFpYbDlJR1poYVd4bFpDQmtkV1VnZEc4Z1lTQnVkV3hzSUdWdWRISjVZQ3dLSUNBZ0lDQWdJQ0FwT3dvZ0lDQWdJQ0I5Q2lBZ0lDQWdJSEpsZEhWeWJpQnlaWE52YkhWMGFXOXVVbVZ6ZFd4ME93b2dJQ0FnZlNCbGJITmxJR2xtSUNnS0lDQWdJQ0FnYzNCbFkybG1hV1Z5UzJWNUxtVnVaSE5YYVhSb0tDY3ZKeWtnSmlZS0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2k1emRHRnlkSE5YYVhSb0tITndaV05wWm1sbGNrdGxlU2tLSUNBZ0lDa2dld29nSUNBZ0lDQnBaaUFvY21WemIyeDFkR2x2YmxKbGMzVnNkQ0E5UFQwZ2JuVnNiQ2tnZXdvZ0lDQWdJQ0FnSUhSb2NtOTNJRlI1Y0dWRmNuSnZjaWdLSUNBZ0lDQWdJQ0FnSUdCVWFHVWdhVzF3YjNKMElHMWhjQ0J5WlhOdmJIVjBhVzl1SUc5bUlDUjdjM0JsWTJsbWFXVnlTMlY1ZlNCbVlXbHNaV1FnWkhWbElIUnZJR0VnYm5Wc2JDQmxiblJ5ZVdBc0NpQWdJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnSUNCamIyNXpkQ0JoWm5SbGNsQnlaV1pwZUNBOUlHNXZjbTFoYkdsNlpXUlRjR1ZqYVdacFpYSXVjMnhwWTJVb2MzQmxZMmxtYVdWeVMyVjVMbXhsYm1kMGFDazdDaUFnSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJRzVsZHlCVlVrd29ZV1owWlhKUWNtVm1hWGdzSUhKbGMyOXNkWFJwYjI1U1pYTjFiSFFwTG1oeVpXWTdDaUFnSUNBZ0lIMGdZMkYwWTJnZ2V3b2dJQ0FnSUNBZ0lIUm9jbTkzSUZSNWNHVkZjbkp2Y2lnS0lDQWdJQ0FnSUNBZ0lHQlVhR1VnYVcxd2IzSjBJRzFoY0NCeVpYTnZiSFYwYVc5dUlHOW1JQ1I3YzNCbFkybG1hV1Z5UzJWNWZTQm1ZV2xzWldRZ1pIVmxJSFJ2SUZWU1RDQndZWEp6WlNCbVlXbHNkWEpsWUN3S0lDQWdJQ0FnSUNBcE93b2dJQ0FnSUNCOUNpQWdJQ0I5Q2lBZ2ZRb0tJQ0J5WlhSMWNtNGdiblZzYkRzS2ZRb0tMeThnYUhSMGNITTZMeTkzYVdObkxtZHBkR2gxWWk1cGJ5OXBiWEJ2Y25RdGJXRndjeThqY0dGeWMybHVad3BsZUhCdmNuUWdablZ1WTNScGIyNGdjbVZ6YjJ4MlpVRnVaRU52YlhCdmMyVkpiWEJ2Y25STllYQW9jR0Z5YzJWa0tTQjdDaUFnTHk4Z1UzUmxjQ0F5Q2lBZ2FXWWdLQ0ZwYzFCc1lXbHVUMkpxWldOMEtIQmhjbk5sWkNrcElIc0tJQ0FnSUhSb2NtOTNJRVZ5Y205eUtHQkpiblpoYkdsa0lHbHRjRzl5ZENCdFlYQWdMU0IwYjNBZ2JHVjJaV3dnYlhWemRDQmlaU0JoYmlCdlltcGxZM1JnS1RzS0lDQjlDZ29nSUM4dklGTjBaWEFnTXdvZ0lHeGxkQ0J6YjNKMFpXUkJibVJPYjNKdFlXeHBlbVZrU1cxd2IzSjBjeUE5SUh0OU93b0tJQ0F2THlCVGRHVndJRFFLSUNCcFppQW9UMkpxWldOMExuQnliM1J2ZEhsd1pTNW9ZWE5QZDI1UWNtOXdaWEowZVM1allXeHNLSEJoY25ObFpDd2dKMmx0Y0c5eWRITW5LU2tnZXdvZ0lDQWdMeThnVTNSbGNDQTBMakVLSUNBZ0lHbG1JQ2doYVhOUWJHRnBiazlpYW1WamRDaHdZWEp6WldRdWFXMXdiM0owY3lrcElIc0tJQ0FnSUNBZ2RHaHliM2NnUlhKeWIzSW9ZRWx1ZG1Gc2FXUWdhVzF3YjNKMElHMWhjQ0F0SUNKcGJYQnZjblJ6SWlCd2NtOXdaWEowZVNCdGRYTjBJR0psSUdGdUlHOWlhbVZqZEdBcE93b2dJQ0FnZlFvS0lDQWdJQzh2SUZOMFpYQWdOQzR5Q2lBZ0lDQnpiM0owWldSQmJtUk9iM0p0WVd4cGVtVmtTVzF3YjNKMGN5QTlJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRjR1ZqYVdacFpYSk5ZWEFvQ2lBZ0lDQWdJSEJoY25ObFpDNXBiWEJ2Y25SekxBb2dJQ0FnSUNCaVlYTmxWVkpNTEFvZ0lDQWdLVHNLSUNCOUNnb2dJQzh2SUZOMFpYQWdOUW9nSUd4bGRDQnpiM0owWldSQmJtUk9iM0p0WVd4cGVtVmtVMk52Y0dWeklEMGdlMzA3Q2dvZ0lDOHZJRk4wWlhBZ05nb2dJR2xtSUNoUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG1oaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2NHRnljMlZrTENBbmMyTnZjR1Z6SnlrcElIc0tJQ0FnSUM4dklGTjBaWEFnTmk0eENpQWdJQ0JwWmlBb0lXbHpVR3hoYVc1UFltcGxZM1FvY0dGeWMyVmtMbk5qYjNCbGN5a3BJSHNLSUNBZ0lDQWdkR2h5YjNjZ1JYSnliM0lvWUVsdWRtRnNhV1FnYVcxd2IzSjBJRzFoY0NBdElDSnpZMjl3WlhNaUlIQnliM0JsY25SNUlHMTFjM1FnWW1VZ1lXNGdiMkpxWldOMFlDazdDaUFnSUNCOUNnb2dJQ0FnTHk4Z1UzUmxjQ0EyTGpJS0lDQWdJSE52Y25SbFpFRnVaRTV2Y20xaGJHbDZaV1JUWTI5d1pYTWdQU0J6YjNKMFFXNWtUbTl5YldGc2FYcGxVMk52Y0dWektIQmhjbk5sWkM1elkyOXdaWE1zSUdKaGMyVlZVa3dwT3dvZ0lIMEtDaUFnTHk4Z1UzUmxjQ0EzQ2lBZ1kyOXVjM1FnYVc1MllXeHBaRXRsZVhNZ1BTQlBZbXBsWTNRdWEyVjVjeWh3WVhKelpXUXBMbVpwYkhSbGNpZ0tJQ0FnSUNoclpYa3BJRDArSUd0bGVTQWhQVDBnSjJsdGNHOXlkSE1uSUNZbUlHdGxlU0FoUFQwZ0ozTmpiM0JsY3ljc0NpQWdLVHNLSUNCcFppQW9hVzUyWVd4cFpFdGxlWE11YkdWdVozUm9JRDRnTUNrZ2V3b2dJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNCZ1NXNTJZV3hwWkNCMGIzQXRiR1YyWld3Z2EyVjVKSHNLSUNBZ0lDQWdJQ0JwYm5aaGJHbGtTMlY1Y3k1c1pXNW5kR2dnUGlBd0lEOGdKM01uSURvZ0p5Y0tJQ0FnSUNBZ2ZTQnBiaUJwYlhCdmNuUWdiV0Z3SUMwZ0pIdHBiblpoYkdsa1MyVjVjeTVxYjJsdUtDY3NJQ2NwZldBc0NpQWdJQ0FwT3dvZ0lIMEtDaUFnTHk4Z1UzUmxjQ0E0Q2lBZ2NtVjBkWEp1SUhzS0lDQWdJR2x0Y0c5eWRITTZJSE52Y25SbFpFRnVaRTV2Y20xaGJHbDZaV1JKYlhCdmNuUnpMQW9nSUNBZ2MyTnZjR1Z6T2lCemIzSjBaV1JCYm1ST2IzSnRZV3hwZW1Wa1UyTnZjR1Z6TEFvZ0lIMDdDbjBLQ2k4dklHaDBkSEJ6T2k4dmQybGpaeTVuYVhSb2RXSXVhVzh2YVcxd2IzSjBMVzFoY0hNdkkzTnZjblF0WVc1a0xXNXZjbTFoYkdsNlpTMWhMWE53WldOcFptbGxjaTF0WVhBS1puVnVZM1JwYjI0Z2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDaHRZWEFzSUdKaGMyVlZVa3dwSUhzS0lDQmpiMjV6ZENCdWIzSnRZV3hwZW1Wa0lEMGdlMzA3Q2dvZ0lHWnZjaUFvYkdWMElITndaV05wWm1sbGNrdGxlU0JwYmlCdFlYQXBJSHNLSUNBZ0lHTnZibk4wSUhaaGJIVmxJRDBnYldGd1czTndaV05wWm1sbGNrdGxlVjA3Q2dvZ0lDQWdZMjl1YzNRZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNrdGxlU0E5SUc1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2t0bGVTaHpjR1ZqYVdacFpYSkxaWGtzSUdKaGMyVlZVa3dwT3dvZ0lDQWdhV1lnS0c1dmNtMWhiR2w2WldSVGNHVmphV1pwWlhKTFpYa2dQVDA5SUc1MWJHd3BJSHNLSUNBZ0lDQWdZMjl1ZEdsdWRXVTdDaUFnSUNCOUNnb2dJQ0FnYkdWMElHRmtaSEpsYzNOVlVrd2dQU0J3WVhKelpWVlNURXhwYTJWVGNHVmphV1pwWlhJb2RtRnNkV1VzSUdKaGMyVlZVa3dwT3dvZ0lDQWdhV1lnS0dGa1pISmxjM05WVWt3Z1BUMDlJRzUxYkd3cElIc0tJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLQW9nSUNBZ0lDQWdJR0JKYm5aaGJHbGtJRlZTVENCaFpHUnlaWE56SUdadmNpQnBiWEJ2Y25RZ2JXRndJSE53WldOcFptbGxjaUFuSkh0emNHVmphV1pwWlhKTFpYbDlKMkFzQ2lBZ0lDQWdJQ2s3Q2lBZ0lDQWdJRzV2Y20xaGJHbDZaV1JiYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVWMGdQU0J1ZFd4c093b2dJQ0FnSUNCamIyNTBhVzUxWlRzS0lDQWdJSDBLQ2lBZ0lDQnBaaUFvYzNCbFkybG1hV1Z5UzJWNUxtVnVaSE5YYVhSb0tDY3ZKeWtnSmlZZ0lXRmtaSEpsYzNOVlVrd3VaVzVrYzFkcGRHZ29KeThuS1NrZ2V3b2dJQ0FnSUNCamIyNXpiMnhsTG5kaGNtNG9DaUFnSUNBZ0lDQWdZRWx1ZG1Gc2FXUWdWVkpNSUdGa1pISmxjM01nWm05eUlHbHRjRzl5ZENCdFlYQWdjM0JsWTJsbWFXVnlJQ2NrZTNOd1pXTnBabWxsY2t0bGVYMG5JQzBnYzJsdVkyVWdkR2hsSUhOd1pXTnBabWxsY2lCbGJtUnpJR2x1SUhOc1lYTm9MQ0J6YnlCdGRYTjBJSFJvWlNCaFpHUnlaWE56WUN3S0lDQWdJQ0FnS1RzS0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZ0dWIzSnRZV3hwZW1Wa1UzQmxZMmxtYVdWeVMyVjVYU0E5SUc1MWJHdzdDaUFnSUNBZ0lHTnZiblJwYm5WbE93b2dJQ0FnZlFvS0lDQWdJRzV2Y20xaGJHbDZaV1JiYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVWMGdQU0JoWkdSeVpYTnpWVkpNT3dvZ0lIMEtDaUFnY21WMGRYSnVJRzV2Y20xaGJHbDZaV1E3Q24wS0NpOHZJR2gwZEhCek9pOHZkMmxqWnk1bmFYUm9kV0l1YVc4dmFXMXdiM0owTFcxaGNITXZJMjV2Y20xaGJHbDZaUzFoTFhOd1pXTnBabWxsY2kxclpYa0tablZ1WTNScGIyNGdibTl5YldGc2FYcGxVM0JsWTJsbWFXVnlTMlY1S0d0bGVTa2dld29nSUdsbUlDaHJaWGtnUFQwOUlDY25LU0I3Q2lBZ0lDQmpiMjV6YjJ4bExuZGhjbTRvWUZOd1pXTnBabWxsY2lCclpYbHpJR2x1SUdsdGNHOXlkQ0J0WVhCeklHMWhlU0J1YjNRZ1ltVWdkR2hsSUdWdGNIUjVJSE4wY21sdVoyQXBPd29nSUNBZ2NtVjBkWEp1SUc1MWJHdzdDaUFnZlFvS0lDQnlaWFIxY200Z2NHRnljMlZWVWt4TWFXdGxVM0JsWTJsbWFXVnlLR3RsZVN3Z1ltRnpaVlZTVENrZ2ZId2dhMlY1T3dwOUNnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU53WVhKelpTMWhMWFZ5YkMxc2FXdGxMV2x0Y0c5eWRDMXpjR1ZqYVdacFpYSUtablZ1WTNScGIyNGdjR0Z5YzJWVlVreE1hV3RsVTNCbFkybG1hV1Z5S0hOd1pXTnBabWxsY2l3Z1ltRnpaVlZTVENrZ2V3b2dJR052Ym5OMElIVnpaVUpoYzJWVmNteEJjMUJoY21WdWRDQTlDaUFnSUNCemNHVmphV1pwWlhJdWMzUmhjblJ6VjJsMGFDZ25MeWNwSUh4OENpQWdJQ0J6Y0dWamFXWnBaWEl1YzNSaGNuUnpWMmwwYUNnbkxpOG5LU0I4ZkFvZ0lDQWdjM0JsWTJsbWFXVnlMbk4wWVhKMGMxZHBkR2dvSnk0dUx5Y3BPd29LSUNCMGNua2dld29nSUNBZ2NtVjBkWEp1SUc1bGR5QlZVa3dvYzNCbFkybG1hV1Z5TENCMWMyVkNZWE5sVlhKc1FYTlFZWEpsYm5RZ1B5QmlZWE5sVlZKTUlEb2dkVzVrWldacGJtVmtLUzVvY21WbU93b2dJSDBnWTJGMFkyZ2dld29nSUNBZ2NtVjBkWEp1SUc1MWJHdzdDaUFnZlFwOUNnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU56YjNKMExXRnVaQzF1YjNKdFlXeHBlbVV0YzJOdmNHVnpDbVoxYm1OMGFXOXVJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRZMjl3WlhNb2JXRndMQ0JpWVhObFZWSk1LU0I3Q2lBZ2JHVjBJRzV2Y20xaGJHbDZaV1FnUFNCN2ZUc0tDaUFnWm05eUlDaHNaWFFnYzJOdmNHVlFjbVZtYVhnZ2FXNGdiV0Z3S1NCN0NpQWdJQ0JqYjI1emRDQndiM1JsYm5ScFlXeFRjR1ZqYVdacFpYSk5ZWEFnUFNCdFlYQmJjMk52Y0dWUWNtVm1hWGhkT3dvZ0lDQWdhV1lnS0NGcGMxQnNZV2x1VDJKcVpXTjBLSEJ2ZEdWdWRHbGhiRk53WldOcFptbGxjazFoY0NrcElIc0tJQ0FnSUNBZ2RHaHliM2NnVkhsd1pVVnljbTl5S0FvZ0lDQWdJQ0FnSUdCVWFHVWdkbUZzZFdVZ2IyWWdjMk52Y0dVZ0pIdHpZMjl3WlZCeVpXWnBlSDBnYlhWemRDQmlaU0JoSUVwVFQwNGdiMkpxWldOMFlDd0tJQ0FnSUNBZ0tUc0tJQ0FnSUgwS0NpQWdJQ0JzWlhRZ2MyTnZjR1ZRY21WbWFYaFZVa3c3Q2lBZ0lDQjBjbmtnZXdvZ0lDQWdJQ0J6WTI5d1pWQnlaV1pwZUZWU1RDQTlJRzVsZHlCVlVrd29jMk52Y0dWUWNtVm1hWGdzSUdKaGMyVlZVa3dwTG1oeVpXWTdDaUFnSUNCOUlHTmhkR05vSUhzS0lDQWdJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNBZ0lHQlRZMjl3WlNCd2NtVm1hWGdnVlZKTUlDY2tlM05qYjNCbFVISmxabWw0ZlNjZ2QyRnpJRzV2ZENCd1lYSnpaV0ZpYkdVZ2FXNGdhVzF3YjNKMElHMWhjR0FzQ2lBZ0lDQWdJQ2s3Q2lBZ0lDQWdJR052Ym5ScGJuVmxPd29nSUNBZ2ZRb0tJQ0FnSUc1dmNtMWhiR2w2WldSYmMyTnZjR1ZRY21WbWFYaFZVa3hkSUQwZ2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDZ0tJQ0FnSUNBZ2NHOTBaVzUwYVdGc1UzQmxZMmxtYVdWeVRXRndMQW9nSUNBZ0lDQmlZWE5sVlZKTUxBb2dJQ0FnS1RzS0lDQjlDZ29nSUhKbGRIVnliaUJ1YjNKdFlXeHBlbVZrT3dwOUNncG1kVzVqZEdsdmJpQnBjMUJzWVdsdVQySnFaV04wS0c5aWFpa2dld29nSUhKbGRIVnliaUJ2WW1vZ1BUMDlJRTlpYW1WamRDaHZZbW9wSUNZbUlDRkJjbkpoZVM1cGMwRnljbUY1S0c5aWFpazdDbjBLQ2k4dklDMHRMUW9LYkdWMElHbHRjRzl5ZEUxaGNGQnliMjFwYzJVZ1BTQm5aWFJKYlhCdmNuUk5ZWEJRY205dGFYTmxLQ2s3Q2dwbGVIQnZjblFnWVhONWJtTWdablZ1WTNScGIyNGdjbVZ6YjJ4MlpTaHpjR1ZqYVdacFpYSXNJR052Ym5SbGVIUXNJR1JsWm1GMWJIUlNaWE52YkhabEtTQjdDaUFnWTI5dWMzUWdleUJ3WVhKbGJuUlZVa3dnUFNCdWRXeHNJSDBnUFNCamIyNTBaWGgwT3dvZ0lHTnZibk4wSUdsdGNHOXlkRTFoY0NBOUlHRjNZV2wwSUdsdGNHOXlkRTFoY0ZCeWIyMXBjMlU3Q2lBZ1kyOXVjM1FnYVcxd2IzSjBUV0Z3VlhKc0lEMGdjbVZ6YjJ4MlpWTndaV05wWm1sbGNpaHBiWEJ2Y25STllYQXNJSE53WldOcFptbGxjaXdnY0dGeVpXNTBWVkpNS1RzS0NpQWdjbVYwZFhKdUlHUmxabUYxYkhSU1pYTnZiSFpsS0dsdGNHOXlkRTFoY0ZWeWJDQS9QeUJ6Y0dWamFXWnBaWElzSUdOdmJuUmxlSFFzSUdSbFptRjFiSFJTWlhOdmJIWmxLVHNLZlFvS1pYaHdiM0owSUdGemVXNWpJR1oxYm1OMGFXOXVJR3h2WVdRb2RYSnNMQ0JqYjI1MFpYaDBMQ0JrWldaaGRXeDBURzloWkNrZ2V3b2dJR2xtSUNoMWNtd3VjM1JoY25SelYybDBhQ2duYUhSMGNEb3ZMeWNwSUh4OElIVnliQzV6ZEdGeWRITlhhWFJvS0Nkb2RIUndjem92THljcEtTQjdDaUFnSUNCamIyNXpkQ0J5WlhNZ1BTQmhkMkZwZENCbVpYUmphQ2gxY213cE93b2dJQ0FnYVdZZ0tDRnlaWE11YjJzcElIc0tJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0dCR1lXbHNaV1FnZEc4Z1ptVjBZMmdnYlc5a2RXeGxJR1p5YjIwZ0pIdDFjbXg5WUNrN0NpQWdJQ0I5Q2lBZ0lDQmpiMjV6ZENCemIzVnlZMlVnUFNCaGQyRnBkQ0J5WlhNdWRHVjRkQ2dwT3dvZ0lDQWdjbVYwZFhKdUlIc0tJQ0FnSUNBZ2MyaHZjblJEYVhKamRXbDBPaUIwY25WbExBb2dJQ0FnSUNCbWIzSnRZWFE2SUNkdGIyUjFiR1VuTEFvZ0lDQWdJQ0J6YjNWeVkyVXNDaUFnSUNCOU93b2dJSDBLQ2lBZ2FXWWdLQ0YxY213dWMzUmhjblJ6VjJsMGFDZ25ibTlrWlRvbktTa2dld29nSUNBZ1kyOXVkR1Y0ZEM1bWIzSnRZWFFnUFNBbmJXOWtkV3hsSnpzS0lDQjlDZ29nSUhKbGRIVnliaUJrWldaaGRXeDBURzloWkNoMWNtd3NJR052Ym5SbGVIUXNJR1JsWm1GMWJIUk1iMkZrS1RzS2ZRb0tZWE41Ym1NZ1puVnVZM1JwYjI0Z1oyVjBTVzF3YjNKMFRXRndVSEp2YldselpTZ3BJSHNLSUNCamIyNXpkQ0J5Wld4aGRHbDJaVkJoZEdnZ1BTQndjbTlqWlhOekxtVnVkaTVKVFZCUFVsUmZUVUZRWDFCQlZFZ2dmSHdnU1UxUVQxSlVYMDFCVUY5R1NVeEZYMDVCVFVVN0NpQWdZMjl1YzNRZ2FXMXdiM0owVFdGd1VHRjBhQ0E5SUhCaGRHZ3VjbVZ6YjJ4MlpTaHdjbTlqWlhOekxtTjNaQ2dwTENCeVpXeGhkR2wyWlZCaGRHZ3BPd29LSUNCc1pYUWdjM1J5T3dvZ0lIUnllU0I3Q2lBZ0lDQnpkSElnUFNCaGQyRnBkQ0JtY3k1eVpXRmtSbWxzWlNocGJYQnZjblJOWVhCUVlYUm9LVHNLSUNCOUlHTmhkR05vSUNobGNuSXBJSHNLSUNBZ0lISmxkSFZ5YmlCbGJYQjBlVTFoY0NncE93b2dJSDBLQ2lBZ2JHVjBJR3B6YjI0N0NpQWdkSEo1SUhzS0lDQWdJR3B6YjI0Z1BTQmhkMkZwZENCS1UwOU9MbkJoY25ObEtITjBjaWs3Q2lBZ2ZTQmpZWFJqYUNBb1pYSnlLU0I3Q2lBZ0lDQjBhSEp2ZHlCRmNuSnZjaWdLSUNBZ0lDQWdZRWx0Y0c5eWRDQnRZWEFnWVhRZ0pIdHBiWEJ2Y25STllYQlFZWFJvZlNCamIyNTBZV2x1Y3lCcGJuWmhiR2xrSUdwemIyNDZJQ1I3WlhKeUxtMWxjM05oWjJWOVlDd0tJQ0FnSUNrN0NpQWdmUW9LSUNCeVpYUjFjbTRnY21WemIyeDJaVUZ1WkVOdmJYQnZjMlZKYlhCdmNuUk5ZWEFvYW5OdmJpazdDbjBLQ21kc2IySmhiQzV1YjJSbFRHOWhaR1Z5SUQwZ1oyeHZZbUZzTG01dlpHVk1iMkZrWlhJZ2ZId2dlMzA3Q2dwbmJHOWlZV3d1Ym05a1pVeHZZV1JsY2k1elpYUkpiWEJ2Y25STllYQlFjbTl0YVhObElEMGdablZ1WTNScGIyNGdjMlYwU1cxd2IzSjBUV0Z3VUhKdmJXbHpaU2h3Y205dGFYTmxLU0I3Q2lBZ2FXMXdiM0owVFdGd1VISnZiV2x6WlNBOUlIQnliMjFwYzJVdWRHaGxiaWdvYldGd0tTQTlQaUI3Q2lBZ0lDQnlaWFIxY200Z2NtVnpiMngyWlVGdVpFTnZiWEJ2YzJWSmJYQnZjblJOWVhBb2JXRndLVHNLSUNCOUtUc0tmVHNLQ21aMWJtTjBhVzl1SUdWdGNIUjVUV0Z3S0NrZ2V3b2dJSEpsZEhWeWJpQjdJR2x0Y0c5eWRITTZJSHQ5TENCelkyOXdaWE02SUh0OUlIMDdDbjBLIjsKCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL25vZGUvaW5pdC1ub2RlLWZlZGVyYXRpb24udHMKdmFyIGRlZmF1bHRPcHRpb25zID0gewogIHJlbW90ZXNPck1hbmlmZXN0VXJsOiB7fSwKICByZWxCdW5kbGVQYXRoOiAiLi4vYnJvd3NlciIsCiAgdGhyb3dJZlJlbW90ZU5vdEZvdW5kOiBmYWxzZQp9Owphc3luYyBmdW5jdGlvbiBpbml0Tm9kZUZlZGVyYXRpb24ob3B0aW9ucykgewogIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH07CiAgY29uc3QgaW1wb3J0TWFwID0gYXdhaXQgY3JlYXRlTm9kZUltcG9ydE1hcChtZXJnZWRPcHRpb25zKTsKICBhd2FpdCB3cml0ZUltcG9ydE1hcChpbXBvcnRNYXApOwogIGF3YWl0IHdyaXRlUmVzb2x2ZXIoKTsKICByZWdpc3RlcihwYXRoVG9GaWxlVVJMKCIuL2ZlZGVyYXRpb24tcmVzb2x2ZXIubWpzIikuaHJlZik7Cn0KYXN5bmMgZnVuY3Rpb24gY3JlYXRlTm9kZUltcG9ydE1hcChvcHRpb25zKSB7CiAgY29uc3QgeyByZW1vdGVzT3JNYW5pZmVzdFVybCwgcmVsQnVuZGxlUGF0aCB9ID0gb3B0aW9uczsKICBjb25zdCByZW1vdGVzID0gdHlwZW9mIHJlbW90ZXNPck1hbmlmZXN0VXJsID09PSAib2JqZWN0IiA/IHJlbW90ZXNPck1hbmlmZXN0VXJsIDogYXdhaXQgbG9hZEZzTWFuaWZlc3QocmVtb3Rlc09yTWFuaWZlc3RVcmwpOwogIGNvbnN0IGhvc3RJbmZvID0gYXdhaXQgbG9hZEZzRmVkZXJhdGlvbkluZm8ocmVsQnVuZGxlUGF0aCk7CiAgY29uc3QgaG9zdEltcG9ydE1hcCA9IGF3YWl0IHByb2Nlc3NIb3N0SW5mbyhob3N0SW5mbywgIi4vIiArIHJlbEJ1bmRsZVBhdGgpOwogIGNvbnN0IHJlbW90ZXNJbXBvcnRNYXAgPSBhd2FpdCBwcm9jZXNzUmVtb3RlSW5mb3MocmVtb3RlcywgewogICAgdGhyb3dJZlJlbW90ZU5vdEZvdW5kOiBvcHRpb25zLnRocm93SWZSZW1vdGVOb3RGb3VuZCwKICAgIGNhY2hlVGFnOiBvcHRpb25zLmNhY2hlVGFnCiAgfSk7CiAgY29uc3QgaW1wb3J0TWFwID0gbWVyZ2VJbXBvcnRNYXBzKGhvc3RJbXBvcnRNYXAsIHJlbW90ZXNJbXBvcnRNYXApOwogIHJldHVybiBpbXBvcnRNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gbG9hZEZzTWFuaWZlc3QobWFuaWZlc3RVcmwpIHsKICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMyLnJlYWRGaWxlKG1hbmlmZXN0VXJsLCAidXRmLTgiKTsKICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoY29udGVudCk7CiAgcmV0dXJuIG1hbmlmZXN0Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGc0ZlZGVyYXRpb25JbmZvKHJlbEJ1bmRsZVBhdGgpIHsKICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoMi5qb2luKHJlbEJ1bmRsZVBhdGgsICJyZW1vdGVFbnRyeS5qc29uIik7CiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzMi5yZWFkRmlsZShtYW5pZmVzdFBhdGgsICJ1dGYtOCIpOwogIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShjb250ZW50KTsKICByZXR1cm4gbWFuaWZlc3Q7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVJbXBvcnRNYXAobWFwKSB7CiAgYXdhaXQgZnMyLndyaXRlRmlsZSgKICAgIElNUE9SVF9NQVBfRklMRV9OQU1FLAogICAgSlNPTi5zdHJpbmdpZnkobWFwLCBudWxsLCAyKSwKICAgICJ1dGYtOCIKICApOwp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlUmVzb2x2ZXIoKSB7CiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20ocmVzb2x2ZXIsICJiYXNlNjQiKTsKICBhd2FpdCBmczIud3JpdGVGaWxlKCJmZWRlcmF0aW9uLXJlc29sdmVyLm1qcyIsIGJ1ZmZlciwgInV0Zi04Iik7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2ZzdGFydC1hcmdzLXBhcnNlci50cwppbXBvcnQgKiBhcyBmczMgZnJvbSAibm9kZTpmcyI7CnZhciBkZWZhdWx0QXJncyA9IHsKICBlbnRyeTogIi4vc2VydmVyLm1qcyIsCiAgcmVtb3Rlc09yTWFuaWZlc3RVcmw6ICIuLi9icm93c2VyL2ZlZGVyYXRpb24ubWFuaWZlc3QuanNvbiIsCiAgcmVsQnVuZGxlUGF0aDogIi4uL2Jyb3dzZXIvIgp9OwpmdW5jdGlvbiBwYXJzZUZTdGFydEFyZ3MoKSB7CiAgY29uc3QgYXJnczIgPSB7CiAgICBlbnRyeTogIiIsCiAgICByZW1vdGVzT3JNYW5pZmVzdFVybDogIiIsCiAgICByZWxCdW5kbGVQYXRoOiAiIgogIH07CiAgbGV0IGtleSA9ICIiOwogIGZvciAobGV0IGkgPSAyOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBjYW5kID0gcHJvY2Vzcy5hcmd2W2ldOwogICAgaWYgKGNhbmQuc3RhcnRzV2l0aCgiLS0iKSkgewogICAgICBjb25zdCBjYW5kS2V5ID0gY2FuZC5zdWJzdHJpbmcoMik7CiAgICAgIGlmIChkZWZhdWx0QXJnc1tjYW5kS2V5XSkgewogICAgICAgIGtleSA9IGNhbmRLZXk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgc3dpdGNoICR7Y2FuZH0gbm90IHN1cHBvcnRlZCFgKTsKICAgICAgICBleGl0V2l0aFVzYWdlKGRlZmF1bHRBcmdzKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChrZXkpIHsKICAgICAgYXJnczJba2V5XSA9IGNhbmQ7CiAgICAgIGtleSA9ICIiOwogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS5lcnJvcihgdW5yZWxhZGVkIHZhbHVlICR7Y2FuZH0hYCk7CiAgICAgIGV4aXRXaXRoVXNhZ2UoZGVmYXVsdEFyZ3MpOwogICAgfQogIH0KICBhcHBseURlZmF1bHRBcmdzKGFyZ3MyKTsKICByZXR1cm4gYXJnczI7Cn0KZnVuY3Rpb24gYXBwbHlEZWZhdWx0QXJncyhhcmdzMikgewogIGlmIChhcmdzMi5yZWxCdW5kbGVQYXRoICYmICFhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCkgewogICAgY29uc3QgY2FuZCA9IGRlZmF1bHRBcmdzLnJlbEJ1bmRsZVBhdGggKyAiZmVkZXJhdGlvbi5tYW5pZmVzdC5qc29uIjsKICAgIGlmIChmczMuZXhpc3RzU3luYyhjYW5kKSkgewogICAgICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9IGNhbmQ7CiAgICB9CiAgfQogIGFyZ3MyLmVudHJ5ID0gYXJnczIuZW50cnkgfHwgZGVmYXVsdEFyZ3MuZW50cnk7CiAgYXJnczIucmVsQnVuZGxlUGF0aCA9IGFyZ3MyLnJlbEJ1bmRsZVBhdGggfHwgZGVmYXVsdEFyZ3MucmVsQnVuZGxlUGF0aDsKICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9IGFyZ3MyLnJlbW90ZXNPck1hbmlmZXN0VXJsIHx8IGRlZmF1bHRBcmdzLnJlbW90ZXNPck1hbmlmZXN0VXJsOwogIGlmICghZnMzLmV4aXN0c1N5bmMoYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwpKSB7CiAgICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9IHZvaWQgMDsKICB9Cn0KZnVuY3Rpb24gZXhpdFdpdGhVc2FnZShkZWZhdWx0QXJnczIpIHsKICBsZXQgYXJnczIgPSAiIjsKICBmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0QXJnczIpIHsKICAgIGFyZ3MyICs9IGBbLS0ke2tleX0gJHtkZWZhdWx0QXJnczJba2V5XX1dIGA7CiAgfQogIGNvbnNvbGUubG9nKCJ1c2FnZTogbmZzdGFydCAiICsgYXJnczIpOwogIHByb2Nlc3MuZXhpdCgxKTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvdXRpbHMvZnN0YXJ0LnRzCnZhciBhcmdzID0gcGFyc2VGU3RhcnRBcmdzKCk7Cihhc3luYyAoKSA9PiB7CiAgYXdhaXQgaW5pdE5vZGVGZWRlcmF0aW9uKHsKICAgIC4uLmFyZ3MucmVtb3Rlc09yTWFuaWZlc3RVcmwgPyB7IHJlbW90ZXNPck1hbmlmZXN0VXJsOiBhcmdzLnJlbW90ZXNPck1hbmlmZXN0VXJsIH0gOiB7fSwKICAgIHJlbEJ1bmRsZVBhdGg6IGFyZ3MucmVsQnVuZGxlUGF0aAogIH0pOwogIGF3YWl0IGltcG9ydChhcmdzLmVudHJ5KTsKfSkoKTsK";
|
|
2
|
+
//# sourceMappingURL=fstart-as-data-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fstart-as-data-url.d.ts","sourceRoot":"","sources":["../../../src/tools/fstart-as-data-url.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,i8/BAC66/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const fstart = 'Ly8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvbm9kZS9pbml0LW5vZGUtZmVkZXJhdGlvbi50cwppbXBvcnQgeyByZWdpc3RlciB9IGZyb20gIm5vZGU6bW9kdWxlIjsKaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gIm5vZGU6dXJsIjsKaW1wb3J0ICogYXMgZnMyIGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgKiBhcyBwYXRoMiBmcm9tICJub2RlOnBhdGgiOwoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvZ2xvYmFsLWNhY2hlLnRzCnZhciBuZk5hbWVzcGFjZSA9ICJfX05BVElWRV9GRURFUkFUSU9OX18iOwp2YXIgZ2xvYmFsMiA9IGdsb2JhbFRoaXM7Cmdsb2JhbDJbbmZOYW1lc3BhY2VdID8/PSB7CiAgZXh0ZXJuYWxzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogIHJlbW90ZU5hbWVzVG9SZW1vdGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksCiAgYmFzZVVybFRvUmVtb3RlTmFtZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkKfTsKdmFyIGdsb2JhbENhY2hlID0gZ2xvYmFsMltuZk5hbWVzcGFjZV07CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9leHRlcm5hbHMudHMKdmFyIGV4dGVybmFscyA9IGdsb2JhbENhY2hlLmV4dGVybmFsczsKZnVuY3Rpb24gZ2V0RXh0ZXJuYWxLZXkoc2hhcmVkKSB7CiAgcmV0dXJuIGAke3NoYXJlZC5wYWNrYWdlTmFtZX1AJHtzaGFyZWQudmVyc2lvbn1gOwp9CmZ1bmN0aW9uIGdldEV4dGVybmFsVXJsKHNoYXJlZCkgewogIGNvbnN0IHBhY2thZ2VLZXkgPSBnZXRFeHRlcm5hbEtleShzaGFyZWQpOwogIHJldHVybiBleHRlcm5hbHMuZ2V0KHBhY2thZ2VLZXkpOwp9CmZ1bmN0aW9uIHNldEV4dGVybmFsVXJsKHNoYXJlZCwgdXJsMikgewogIGNvbnN0IHBhY2thZ2VLZXkgPSBnZXRFeHRlcm5hbEtleShzaGFyZWQpOwogIGV4dGVybmFscy5zZXQocGFja2FnZUtleSwgdXJsMik7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL21vZGVsL2ltcG9ydC1tYXAudHMKZnVuY3Rpb24gbWVyZ2VJbXBvcnRNYXBzKG1hcDEsIG1hcDIpIHsKICByZXR1cm4gewogICAgaW1wb3J0czogeyAuLi5tYXAxLmltcG9ydHMsIC4uLm1hcDIuaW1wb3J0cyB9LAogICAgc2NvcGVzOiB7IC4uLm1hcDEuc2NvcGVzLCAuLi5tYXAyLnNjb3BlcyB9CiAgfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvcmVtb3Rlcy50cwp2YXIgcmVtb3RlTmFtZXNUb1JlbW90ZSA9IGdsb2JhbENhY2hlLnJlbW90ZU5hbWVzVG9SZW1vdGU7CnZhciBiYXNlVXJsVG9SZW1vdGVOYW1lcyA9IGdsb2JhbENhY2hlLmJhc2VVcmxUb1JlbW90ZU5hbWVzOwpmdW5jdGlvbiBhZGRSZW1vdGUocmVtb3RlTmFtZSwgcmVtb3RlKSB7CiAgcmVtb3RlTmFtZXNUb1JlbW90ZS5zZXQocmVtb3RlTmFtZSwgcmVtb3RlKTsKICBiYXNlVXJsVG9SZW1vdGVOYW1lcy5zZXQocmVtb3RlLmJhc2VVcmwsIHJlbW90ZU5hbWUpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi91dGlscy9wYXRoLXV0aWxzLnRzCmZ1bmN0aW9uIGdldERpcmVjdG9yeSh1cmwyKSB7CiAgY29uc3QgcGFydHMgPSB1cmwyLnNwbGl0KCIvIik7CiAgcGFydHMucG9wKCk7CiAgcmV0dXJuIHBhcnRzLmpvaW4oIi8iKTsKfQpmdW5jdGlvbiBqb2luUGF0aHMocGF0aDEsIHBhdGgyMikgewogIHdoaWxlIChwYXRoMS5lbmRzV2l0aCgiLyIpKSB7CiAgICBwYXRoMSA9IHBhdGgxLnN1YnN0cmluZygwLCBwYXRoMS5sZW5ndGggLSAxKTsKICB9CiAgaWYgKHBhdGgyMi5zdGFydHNXaXRoKCIuLyIpKSB7CiAgICBwYXRoMjIgPSBwYXRoMjIuc3Vic3RyaW5nKDIsIHBhdGgyMi5sZW5ndGgpOwogIH0KICByZXR1cm4gYCR7cGF0aDF9LyR7cGF0aDIyfWA7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL3dhdGNoLWZlZGVyYXRpb24tYnVpbGQudHMKZnVuY3Rpb24gd2F0Y2hGZWRlcmF0aW9uQnVpbGRDb21wbGV0aW9uKGVuZHBvaW50KSB7CiAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoZW5kcG9pbnQpOwogIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsKICAgIGlmIChkYXRhLnR5cGUgPT09ICJmZWRlcmF0aW9uLXJlYnVpbGQtY29tcGxldGUiIC8qIENPTVBMRVRFRCAqLykgewogICAgICBjb25zb2xlLmxvZygiW0ZlZGVyYXRpb25dIFJlYnVpbGQgY29tcGxldGVkLCByZWxvYWRpbmcuLi4iKTsKICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfQogIH07CiAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjb25zb2xlLndhcm4oIltGZWRlcmF0aW9uXSBTU0UgY29ubmVjdGlvbiBlcnJvcjoiLCBldmVudCk7CiAgfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvaW5pdC1mZWRlcmF0aW9uLnRzCmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbmZvcyhyZW1vdGVzLCBvcHRpb25zID0geyB0aHJvd0lmUmVtb3RlTm90Rm91bmQ6IGZhbHNlIH0pIHsKICBjb25zdCBwcm9jZXNzUmVtb3RlSW5mb1Byb21pc2VzID0gT2JqZWN0LmtleXMocmVtb3RlcykubWFwKAogICAgYXN5bmMgKHJlbW90ZU5hbWUpID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBsZXQgdXJsMiA9IHJlbW90ZXNbcmVtb3RlTmFtZV07CiAgICAgICAgaWYgKG9wdGlvbnMuY2FjaGVUYWcpIHsKICAgICAgICAgIGNvbnN0IGFkZEFwcGVuZCA9IHJlbW90ZXNbcmVtb3RlTmFtZV0uaW5jbHVkZXMoIj8iKSA/ICImIiA6ICI/IjsKICAgICAgICAgIHVybDIgKz0gYCR7YWRkQXBwZW5kfXQ9JHtvcHRpb25zLmNhY2hlVGFnfWA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhd2FpdCBwcm9jZXNzUmVtb3RlSW5mbyh1cmwyLCByZW1vdGVOYW1lKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnN0IGVycm9yID0gYEVycm9yIGxvYWRpbmcgcmVtb3RlIGVudHJ5IGZvciAke3JlbW90ZU5hbWV9IGZyb20gZmlsZSAke3JlbW90ZXNbcmVtb3RlTmFtZV19YDsKICAgICAgICBpZiAob3B0aW9ucy50aHJvd0lmUmVtb3RlTm90Rm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7CiAgICAgICAgfQogICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgKTsKICBjb25zdCByZW1vdGVJbXBvcnRNYXBzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvY2Vzc1JlbW90ZUluZm9Qcm9taXNlcyk7CiAgY29uc3QgaW1wb3J0TWFwID0gcmVtb3RlSW1wb3J0TWFwcy5yZWR1Y2UoCiAgICAoYWNjLCByZW1vdGVJbXBvcnRNYXApID0+IHJlbW90ZUltcG9ydE1hcCA/IG1lcmdlSW1wb3J0TWFwcyhhY2MsIHJlbW90ZUltcG9ydE1hcCkgOiBhY2MsCiAgICB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH0KICApOwogIHJldHVybiBpbXBvcnRNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1JlbW90ZUluZm8oZmVkZXJhdGlvbkluZm9VcmwsIHJlbW90ZU5hbWUpIHsKICBjb25zdCBiYXNlVXJsID0gZ2V0RGlyZWN0b3J5KGZlZGVyYXRpb25JbmZvVXJsKTsKICBjb25zdCByZW1vdGVJbmZvID0gYXdhaXQgbG9hZEZlZGVyYXRpb25JbmZvKGZlZGVyYXRpb25JbmZvVXJsKTsKICBpZiAoIXJlbW90ZU5hbWUpIHsKICAgIHJlbW90ZU5hbWUgPSByZW1vdGVJbmZvLm5hbWU7CiAgfQogIGlmIChyZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50KSB7CiAgICB3YXRjaEZlZGVyYXRpb25CdWlsZENvbXBsZXRpb24oCiAgICAgIGJhc2VVcmwgKyByZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50CiAgICApOwogIH0KICBjb25zdCBpbXBvcnRNYXAgPSBjcmVhdGVSZW1vdGVJbXBvcnRNYXAocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCk7CiAgYWRkUmVtb3RlKHJlbW90ZU5hbWUsIHsgLi4ucmVtb3RlSW5mbywgYmFzZVVybCB9KTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUltcG9ydE1hcChyZW1vdGVJbmZvLCByZW1vdGVOYW1lLCBiYXNlVXJsKSB7CiAgY29uc3QgaW1wb3J0cyA9IHByb2Nlc3NFeHBvc2VkKHJlbW90ZUluZm8sIHJlbW90ZU5hbWUsIGJhc2VVcmwpOwogIGNvbnN0IHNjb3BlcyA9IHByb2Nlc3NSZW1vdGVJbXBvcnRzKHJlbW90ZUluZm8sIGJhc2VVcmwpOwogIHJldHVybiB7IGltcG9ydHMsIHNjb3BlcyB9Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGZWRlcmF0aW9uSW5mbyh1cmwyKSB7CiAgY29uc3QgaW5mbyA9IGF3YWl0IGZldGNoKHVybDIpLnRoZW4oKHIpID0+IHIuanNvbigpKTsKICByZXR1cm4gaW5mbzsKfQpmdW5jdGlvbiBwcm9jZXNzUmVtb3RlSW1wb3J0cyhyZW1vdGVJbmZvLCBiYXNlVXJsKSB7CiAgY29uc3Qgc2NvcGVzID0ge307CiAgY29uc3Qgc2NvcGVkSW1wb3J0cyA9IHt9OwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIHJlbW90ZUluZm8uc2hhcmVkKSB7CiAgICBjb25zdCBvdXRGaWxlTmFtZSA9IGdldEV4dGVybmFsVXJsKHNoYXJlZCkgPz8gam9pblBhdGhzKGJhc2VVcmwsIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgICBzZXRFeHRlcm5hbFVybChzaGFyZWQsIG91dEZpbGVOYW1lKTsKICAgIHNjb3BlZEltcG9ydHNbc2hhcmVkLnBhY2thZ2VOYW1lXSA9IG91dEZpbGVOYW1lOwogIH0KICBzY29wZXNbYmFzZVVybCArICIvIl0gPSBzY29wZWRJbXBvcnRzOwogIHJldHVybiBzY29wZXM7Cn0KZnVuY3Rpb24gcHJvY2Vzc0V4cG9zZWQocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCkgewogIGNvbnN0IGltcG9ydHMgPSB7fTsKICBmb3IgKGNvbnN0IGV4cG9zZWQgb2YgcmVtb3RlSW5mby5leHBvc2VzKSB7CiAgICBjb25zdCBrZXkgPSBqb2luUGF0aHMocmVtb3RlTmFtZSwgZXhwb3NlZC5rZXkpOwogICAgY29uc3QgdmFsdWUgPSBqb2luUGF0aHMoYmFzZVVybCwgZXhwb3NlZC5vdXRGaWxlTmFtZSk7CiAgICBpbXBvcnRzW2tleV0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIGltcG9ydHM7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0hvc3RJbmZvKGhvc3RJbmZvLCByZWxCdW5kbGVzUGF0aCA9ICIuLyIpIHsKICBjb25zdCBpbXBvcnRzID0gaG9zdEluZm8uc2hhcmVkLnJlZHVjZSgKICAgIChhY2MsIGN1cikgPT4gKHsKICAgICAgLi4uYWNjLAogICAgICBbY3VyLnBhY2thZ2VOYW1lXTogcmVsQnVuZGxlc1BhdGggKyBjdXIub3V0RmlsZU5hbWUKICAgIH0pLAogICAge30KICApOwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIGhvc3RJbmZvLnNoYXJlZCkgewogICAgc2V0RXh0ZXJuYWxVcmwoc2hhcmVkLCByZWxCdW5kbGVzUGF0aCArIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgfQogIHJldHVybiB7IGltcG9ydHMsIHNjb3Blczoge30gfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvdXRpbHMvaW1wb3J0LW1hcC1sb2FkZXIuanMKaW1wb3J0IHBhdGggZnJvbSAicGF0aCI7CmltcG9ydCB1cmwgZnJvbSAidXJsIjsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICJmcyI7CnZhciBJTVBPUlRfTUFQX0ZJTEVfTkFNRSA9ICJub2RlLmltcG9ydG1hcCI7CnZhciBiYXNlVVJMID0gdXJsLnBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSkgKyBwYXRoLnNlcDsKZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CiAgbGV0IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0ge307CiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJzZWQsICJpbXBvcnRzIikpIHsKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuaW1wb3J0cykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJpbXBvcnRzIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdGApOwogICAgfQogICAgc29ydGVkQW5kTm9ybWFsaXplZEltcG9ydHMgPSBzb3J0QW5kTm9ybWFsaXplU3BlY2lmaWVyTWFwKAogICAgICBwYXJzZWQuaW1wb3J0cywKICAgICAgYmFzZVVSTAogICAgKTsKICB9CiAgbGV0IHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSB7fTsKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnNlZCwgInNjb3BlcyIpKSB7CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLnNjb3BlcykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJzY29wZXMiIHByb3BlcnR5IG11c3QgYmUgYW4gb2JqZWN0YCk7CiAgICB9CiAgICBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0gc29ydEFuZE5vcm1hbGl6ZVNjb3BlcyhwYXJzZWQuc2NvcGVzLCBiYXNlVVJMKTsKICB9CiAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhwYXJzZWQpLmZpbHRlcigKICAgIChrZXkpID0+IGtleSAhPT0gImltcG9ydHMiICYmIGtleSAhPT0gInNjb3BlcyIKICApOwogIGlmIChpbnZhbGlkS2V5cy5sZW5ndGggPiAwKSB7CiAgICBjb25zb2xlLndhcm4oCiAgICAgIGBJbnZhbGlkIHRvcC1sZXZlbCBrZXkke2ludmFsaWRLZXlzLmxlbmd0aCA+IDAgPyAicyIgOiAiIn0gaW4gaW1wb3J0IG1hcCAtICR7aW52YWxpZEtleXMuam9pbigiLCAiKX1gCiAgICApOwogIH0KICByZXR1cm4gewogICAgaW1wb3J0czogc29ydGVkQW5kTm9ybWFsaXplZEltcG9ydHMsCiAgICBzY29wZXM6IHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMKICB9Owp9CmZ1bmN0aW9uIHNvcnRBbmROb3JtYWxpemVTcGVjaWZpZXJNYXAobWFwLCBiYXNlVVJMMikgewogIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fTsKICBmb3IgKGxldCBzcGVjaWZpZXJLZXkgaW4gbWFwKSB7CiAgICBjb25zdCB2YWx1ZSA9IG1hcFtzcGVjaWZpZXJLZXldOwogICAgY29uc3Qgbm9ybWFsaXplZFNwZWNpZmllcktleSA9IG5vcm1hbGl6ZVNwZWNpZmllcktleShzcGVjaWZpZXJLZXksIGJhc2VVUkwyKTsKICAgIGlmIChub3JtYWxpemVkU3BlY2lmaWVyS2V5ID09PSBudWxsKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbGV0IGFkZHJlc3NVUkwgPSBwYXJzZVVSTExpa2VTcGVjaWZpZXIodmFsdWUsIGJhc2VVUkwyKTsKICAgIGlmIChhZGRyZXNzVVJMID09PSBudWxsKSB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgSW52YWxpZCBVUkwgYWRkcmVzcyBmb3IgaW1wb3J0IG1hcCBzcGVjaWZpZXIgJyR7c3BlY2lmaWVyS2V5fSdgCiAgICAgICk7CiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBudWxsOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmIChzcGVjaWZpZXJLZXkuZW5kc1dpdGgoIi8iKSAmJiAhYWRkcmVzc1VSTC5lbmRzV2l0aCgiLyIpKSB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgSW52YWxpZCBVUkwgYWRkcmVzcyBmb3IgaW1wb3J0IG1hcCBzcGVjaWZpZXIgJyR7c3BlY2lmaWVyS2V5fScgLSBzaW5jZSB0aGUgc3BlY2lmaWVyIGVuZHMgaW4gc2xhc2gsIHNvIG11c3QgdGhlIGFkZHJlc3NgCiAgICAgICk7CiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBudWxsOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBhZGRyZXNzVVJMOwogIH0KICByZXR1cm4gbm9ybWFsaXplZDsKfQpmdW5jdGlvbiBub3JtYWxpemVTcGVjaWZpZXJLZXkoa2V5KSB7CiAgaWYgKGtleSA9PT0gIiIpIHsKICAgIGNvbnNvbGUud2FybihgU3BlY2lmaWVyIGtleXMgaW4gaW1wb3J0IG1hcHMgbWF5IG5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nYCk7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcmV0dXJuIHBhcnNlVVJMTGlrZVNwZWNpZmllcihrZXksIGJhc2VVUkwpIHx8IGtleTsKfQpmdW5jdGlvbiBwYXJzZVVSTExpa2VTcGVjaWZpZXIoc3BlY2lmaWVyLCBiYXNlVVJMMikgewogIGNvbnN0IHVzZUJhc2VVcmxBc1BhcmVudCA9IHNwZWNpZmllci5zdGFydHNXaXRoKCIvIikgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoIi4vIikgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoIi4uLyIpOwogIHRyeSB7CiAgICByZXR1cm4gbmV3IFVSTChzcGVjaWZpZXIsIHVzZUJhc2VVcmxBc1BhcmVudCA/IGJhc2VVUkwyIDogdm9pZCAwKS5ocmVmOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIG51bGw7CiAgfQp9CmZ1bmN0aW9uIHNvcnRBbmROb3JtYWxpemVTY29wZXMobWFwLCBiYXNlVVJMMikgewogIGxldCBub3JtYWxpemVkID0ge307CiAgZm9yIChsZXQgc2NvcGVQcmVmaXggaW4gbWFwKSB7CiAgICBjb25zdCBwb3RlbnRpYWxTcGVjaWZpZXJNYXAgPSBtYXBbc2NvcGVQcmVmaXhdOwogICAgaWYgKCFpc1BsYWluT2JqZWN0KHBvdGVudGlhbFNwZWNpZmllck1hcCkpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgIGBUaGUgdmFsdWUgb2Ygc2NvcGUgJHtzY29wZVByZWZpeH0gbXVzdCBiZSBhIEpTT04gb2JqZWN0YAogICAgICApOwogICAgfQogICAgbGV0IHNjb3BlUHJlZml4VVJMOwogICAgdHJ5IHsKICAgICAgc2NvcGVQcmVmaXhVUkwgPSBuZXcgVVJMKHNjb3BlUHJlZml4LCBiYXNlVVJMMikuaHJlZjsKICAgIH0gY2F0Y2ggewogICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgYFNjb3BlIHByZWZpeCBVUkwgJyR7c2NvcGVQcmVmaXh9JyB3YXMgbm90IHBhcnNlYWJsZSBpbiBpbXBvcnQgbWFwYAogICAgICApOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIG5vcm1hbGl6ZWRbc2NvcGVQcmVmaXhVUkxdID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcG90ZW50aWFsU3BlY2lmaWVyTWFwLAogICAgICBiYXNlVVJMMgogICAgKTsKICB9CiAgcmV0dXJuIG5vcm1hbGl6ZWQ7Cn0KZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHsKICByZXR1cm4gb2JqID09PSBPYmplY3Qob2JqKSAmJiAhQXJyYXkuaXNBcnJheShvYmopOwp9CnZhciBpbXBvcnRNYXBQcm9taXNlID0gZ2V0SW1wb3J0TWFwUHJvbWlzZSgpOwphc3luYyBmdW5jdGlvbiBnZXRJbXBvcnRNYXBQcm9taXNlKCkgewogIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHByb2Nlc3MuZW52LklNUE9SVF9NQVBfUEFUSCB8fCBJTVBPUlRfTUFQX0ZJTEVfTkFNRTsKICBjb25zdCBpbXBvcnRNYXBQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlbGF0aXZlUGF0aCk7CiAgbGV0IHN0cjsKICB0cnkgewogICAgc3RyID0gYXdhaXQgZnMucmVhZEZpbGUoaW1wb3J0TWFwUGF0aCk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICByZXR1cm4gZW1wdHlNYXAoKTsKICB9CiAgbGV0IGpzb247CiAgdHJ5IHsKICAgIGpzb24gPSBhd2FpdCBKU09OLnBhcnNlKHN0cik7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB0aHJvdyBFcnJvcigKICAgICAgYEltcG9ydCBtYXAgYXQgJHtpbXBvcnRNYXBQYXRofSBjb250YWlucyBpbnZhbGlkIGpzb246ICR7ZXJyLm1lc3NhZ2V9YAogICAgKTsKICB9CiAgcmV0dXJuIHJlc29sdmVBbmRDb21wb3NlSW1wb3J0TWFwKGpzb24pOwp9Cmdsb2JhbC5ub2RlTG9hZGVyID0gZ2xvYmFsLm5vZGVMb2FkZXIgfHwge307Cmdsb2JhbC5ub2RlTG9hZGVyLnNldEltcG9ydE1hcFByb21pc2UgPSBmdW5jdGlvbiBzZXRJbXBvcnRNYXBQcm9taXNlKHByb21pc2UpIHsKICBpbXBvcnRNYXBQcm9taXNlID0gcHJvbWlzZS50aGVuKChtYXApID0+IHsKICAgIHJldHVybiByZXNvbHZlQW5kQ29tcG9zZUltcG9ydE1hcChtYXApOwogIH0pOwp9OwpmdW5jdGlvbiBlbXB0eU1hcCgpIHsKICByZXR1cm4geyBpbXBvcnRzOiB7fSwgc2NvcGVzOiB7fSB9Owp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi91dGlscy9sb2FkZXItYXMtZGF0YS11cmwuanMKdmFyIHJlc29sdmVyID0gImFXMXdiM0owSUhCaGRHZ2dabkp2YlNBbmNHRjBhQ2M3Q21sdGNHOXlkQ0IxY213Z1puSnZiU0FuZFhKc0p6c0thVzF3YjNKMElIc2djSEp2YldselpYTWdZWE1nWm5NZ2ZTQm1jbTl0SUNkbWN5YzdDZ3BsZUhCdmNuUWdZMjl1YzNRZ1NVMVFUMUpVWDAxQlVGOUdTVXhGWDA1QlRVVWdQU0FuYm05a1pTNXBiWEJ2Y25SdFlYQW5Pd29LWTI5dWMzUWdZbUZ6WlZWU1RDQTlJSFZ5YkM1d1lYUm9WRzlHYVd4bFZWSk1LSEJ5YjJObGMzTXVZM2RrS0NrcElDc2djR0YwYUM1elpYQTdDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOdVpYY3RjbVZ6YjJ4MlpTMWhiR2R2Y21sMGFHMEtaWGh3YjNKMElHWjFibU4wYVc5dUlISmxjMjlzZG1WVGNHVmphV1pwWlhJb2FXMXdiM0owVFdGd0xDQnpjR1ZqYVdacFpYSXNJSEJoY21WdWRGVlNUQ2tnZXdvZ0lHeGxkQ0JqZFhKeVpXNTBRbUZ6WlZWU1REc0tJQ0JwWmlBb2NHRnlaVzUwVlZKTUtTQjdDaUFnSUNCamIyNXpkQ0JzWVhOMFUyeGhjMmhKYm1SbGVDQTlJSEJoY21WdWRGVlNUQzVzWVhOMFNXNWtaWGhQWmlod1lYUm9Mbk5sY0NrN0NpQWdJQ0JqZFhKeVpXNTBRbUZ6WlZWU1RDQTlJSEJoY21WdWRGVlNUQzV6YkdsalpTZ3dMQ0JzWVhOMFUyeGhjMmhKYm1SbGVDQXJJREVwT3dvZ0lIMGdaV3h6WlNCN0NpQWdJQ0JqZFhKeVpXNTBRbUZ6WlZWU1RDQTlJR0poYzJWVlVrdzdDaUFnZlFvZ0lHTnZibk4wSUc1dmNtMWhiR2w2WldSVGNHVmphV1pwWlhJZ1BRb2dJQ0FnY0dGeWMyVlZVa3hNYVd0bFUzQmxZMmxtYVdWeUtITndaV05wWm1sbGNpd2dZM1Z5Y21WdWRFSmhjMlZWVWt3cElIeDhJSE53WldOcFptbGxjanNLSUNCbWIzSWdLR3hsZENCelkyOXdaVkJ5WldacGVDQnBiaUJwYlhCdmNuUk5ZWEF1YzJOdmNHVnpLU0I3Q2lBZ0lDQnBaaUFvQ2lBZ0lDQWdJSE5qYjNCbFVISmxabWw0SUQwOVBTQmpkWEp5Wlc1MFFtRnpaVlZTVENCOGZBb2dJQ0FnSUNBb2MyTnZjR1ZRY21WbWFYZ3VaVzVrYzFkcGRHZ29KeThuS1NBbUppQmpkWEp5Wlc1MFFtRnpaVlZTVEM1emRHRnlkSE5YYVhSb0tITmpiM0JsVUhKbFptbDRLU2tLSUNBZ0lDa2dld29nSUNBZ0lDQmpiMjV6ZENCelkyOXdaVWx0Y0c5eWRITk5ZWFJqYUNBOUlISmxjMjlzZG1WSmJYQnZjblJ6VFdGMFkyZ29DaUFnSUNBZ0lDQWdibTl5YldGc2FYcGxaRk53WldOcFptbGxjaXdLSUNBZ0lDQWdJQ0JwYlhCdmNuUk5ZWEF1YzJOdmNHVnpXM05qYjNCbFVISmxabWw0WFN3S0lDQWdJQ0FnS1RzS0lDQWdJQ0FnYVdZZ0tITmpiM0JsU1cxd2IzSjBjMDFoZEdOb0tTQjdDaUFnSUNBZ0lDQWdjbVYwZFhKdUlITmpiM0JsU1cxd2IzSjBjMDFoZEdOb093b2dJQ0FnSUNCOUNpQWdJQ0I5SUdWc2MyVWdld29nSUNBZ0lDQmpiMjV6ZENCMGIzQk1aWFpsYkVsdGNHOXlkSE5OWVhSamFDQTlJSEpsYzI5c2RtVkpiWEJ2Y25SelRXRjBZMmdvQ2lBZ0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2l3S0lDQWdJQ0FnSUNCcGJYQnZjblJOWVhBdWFXMXdiM0owY3l3S0lDQWdJQ0FnS1RzS0lDQWdJQ0FnYVdZZ0tIUnZjRXhsZG1Wc1NXMXdiM0owYzAxaGRHTm9LU0I3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJSFJ2Y0V4bGRtVnNTVzF3YjNKMGMwMWhkR05vT3dvZ0lDQWdJQ0I5Q2lBZ0lDQjlDaUFnZlFvS0lDQnlaWFIxY200Z2NtVnpiMngyWlVsdGNHOXlkSE5OWVhSamFDaHViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlMQ0JwYlhCdmNuUk5ZWEF1YVcxd2IzSjBjeWs3Q24wS0NpOHZJR2gwZEhCek9pOHZkMmxqWnk1bmFYUm9kV0l1YVc4dmFXMXdiM0owTFcxaGNITXZJM0psYzI5c2RtVXRZVzR0YVcxd2IzSjBjeTF0WVhSamFBcG1kVzVqZEdsdmJpQnlaWE52YkhabFNXMXdiM0owYzAxaGRHTm9LRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWElzSUhOd1pXTnBabWxsY2sxaGNDa2dld29nSUdadmNpQW9iR1YwSUhOd1pXTnBabWxsY2t0bGVTQnBiaUJ6Y0dWamFXWnBaWEpOWVhBcElIc0tJQ0FnSUdOdmJuTjBJSEpsYzI5c2RYUnBiMjVTWlhOMWJIUWdQU0J6Y0dWamFXWnBaWEpOWVhCYmMzQmxZMmxtYVdWeVMyVjVYVHNLQ2lBZ0lDQnBaaUFvYzNCbFkybG1hV1Z5UzJWNUlEMDlQU0J1YjNKdFlXeHBlbVZrVTNCbFkybG1hV1Z5S1NCN0NpQWdJQ0FnSUdsbUlDaHlaWE52YkhWMGFXOXVVbVZ6ZFd4MElEMDlQU0J1ZFd4c0tTQjdDaUFnSUNBZ0lDQWdkR2h5YjNjZ1ZIbHdaVVZ5Y205eUtBb2dJQ0FnSUNBZ0lDQWdZRlJvWlNCcGJYQnZjblFnYldGd0lISmxjMjlzZFhScGIyNGdiMllnSkh0emNHVmphV1pwWlhKTFpYbDlJR1poYVd4bFpDQmtkV1VnZEc4Z1lTQnVkV3hzSUdWdWRISjVZQ3dLSUNBZ0lDQWdJQ0FwT3dvZ0lDQWdJQ0I5Q2lBZ0lDQWdJSEpsZEhWeWJpQnlaWE52YkhWMGFXOXVVbVZ6ZFd4ME93b2dJQ0FnZlNCbGJITmxJR2xtSUNnS0lDQWdJQ0FnYzNCbFkybG1hV1Z5UzJWNUxtVnVaSE5YYVhSb0tDY3ZKeWtnSmlZS0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2k1emRHRnlkSE5YYVhSb0tITndaV05wWm1sbGNrdGxlU2tLSUNBZ0lDa2dld29nSUNBZ0lDQnBaaUFvY21WemIyeDFkR2x2YmxKbGMzVnNkQ0E5UFQwZ2JuVnNiQ2tnZXdvZ0lDQWdJQ0FnSUhSb2NtOTNJRlI1Y0dWRmNuSnZjaWdLSUNBZ0lDQWdJQ0FnSUdCVWFHVWdhVzF3YjNKMElHMWhjQ0J5WlhOdmJIVjBhVzl1SUc5bUlDUjdjM0JsWTJsbWFXVnlTMlY1ZlNCbVlXbHNaV1FnWkhWbElIUnZJR0VnYm5Wc2JDQmxiblJ5ZVdBc0NpQWdJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnSUNCamIyNXpkQ0JoWm5SbGNsQnlaV1pwZUNBOUlHNXZjbTFoYkdsNlpXUlRjR1ZqYVdacFpYSXVjMnhwWTJVb2MzQmxZMmxtYVdWeVMyVjVMbXhsYm1kMGFDazdDaUFnSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJRzVsZHlCVlVrd29ZV1owWlhKUWNtVm1hWGdzSUhKbGMyOXNkWFJwYjI1U1pYTjFiSFFwTG1oeVpXWTdDaUFnSUNBZ0lIMGdZMkYwWTJnZ2V3b2dJQ0FnSUNBZ0lIUm9jbTkzSUZSNWNHVkZjbkp2Y2lnS0lDQWdJQ0FnSUNBZ0lHQlVhR1VnYVcxd2IzSjBJRzFoY0NCeVpYTnZiSFYwYVc5dUlHOW1JQ1I3YzNCbFkybG1hV1Z5UzJWNWZTQm1ZV2xzWldRZ1pIVmxJSFJ2SUZWU1RDQndZWEp6WlNCbVlXbHNkWEpsWUN3S0lDQWdJQ0FnSUNBcE93b2dJQ0FnSUNCOUNpQWdJQ0I5Q2lBZ2ZRb0tJQ0J5WlhSMWNtNGdiblZzYkRzS2ZRb0tMeThnYUhSMGNITTZMeTkzYVdObkxtZHBkR2gxWWk1cGJ5OXBiWEJ2Y25RdGJXRndjeThqY0dGeWMybHVad3BsZUhCdmNuUWdablZ1WTNScGIyNGdjbVZ6YjJ4MlpVRnVaRU52YlhCdmMyVkpiWEJ2Y25STllYQW9jR0Z5YzJWa0tTQjdDaUFnTHk4Z1UzUmxjQ0F5Q2lBZ2FXWWdLQ0ZwYzFCc1lXbHVUMkpxWldOMEtIQmhjbk5sWkNrcElIc0tJQ0FnSUhSb2NtOTNJRVZ5Y205eUtHQkpiblpoYkdsa0lHbHRjRzl5ZENCdFlYQWdMU0IwYjNBZ2JHVjJaV3dnYlhWemRDQmlaU0JoYmlCdlltcGxZM1JnS1RzS0lDQjlDZ29nSUM4dklGTjBaWEFnTXdvZ0lHeGxkQ0J6YjNKMFpXUkJibVJPYjNKdFlXeHBlbVZrU1cxd2IzSjBjeUE5SUh0OU93b0tJQ0F2THlCVGRHVndJRFFLSUNCcFppQW9UMkpxWldOMExuQnliM1J2ZEhsd1pTNW9ZWE5QZDI1UWNtOXdaWEowZVM1allXeHNLSEJoY25ObFpDd2dKMmx0Y0c5eWRITW5LU2tnZXdvZ0lDQWdMeThnVTNSbGNDQTBMakVLSUNBZ0lHbG1JQ2doYVhOUWJHRnBiazlpYW1WamRDaHdZWEp6WldRdWFXMXdiM0owY3lrcElIc0tJQ0FnSUNBZ2RHaHliM2NnUlhKeWIzSW9ZRWx1ZG1Gc2FXUWdhVzF3YjNKMElHMWhjQ0F0SUNKcGJYQnZjblJ6SWlCd2NtOXdaWEowZVNCdGRYTjBJR0psSUdGdUlHOWlhbVZqZEdBcE93b2dJQ0FnZlFvS0lDQWdJQzh2SUZOMFpYQWdOQzR5Q2lBZ0lDQnpiM0owWldSQmJtUk9iM0p0WVd4cGVtVmtTVzF3YjNKMGN5QTlJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRjR1ZqYVdacFpYSk5ZWEFvQ2lBZ0lDQWdJSEJoY25ObFpDNXBiWEJ2Y25SekxBb2dJQ0FnSUNCaVlYTmxWVkpNTEFvZ0lDQWdLVHNLSUNCOUNnb2dJQzh2SUZOMFpYQWdOUW9nSUd4bGRDQnpiM0owWldSQmJtUk9iM0p0WVd4cGVtVmtVMk52Y0dWeklEMGdlMzA3Q2dvZ0lDOHZJRk4wWlhBZ05nb2dJR2xtSUNoUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG1oaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2NHRnljMlZrTENBbmMyTnZjR1Z6SnlrcElIc0tJQ0FnSUM4dklGTjBaWEFnTmk0eENpQWdJQ0JwWmlBb0lXbHpVR3hoYVc1UFltcGxZM1FvY0dGeWMyVmtMbk5qYjNCbGN5a3BJSHNLSUNBZ0lDQWdkR2h5YjNjZ1JYSnliM0lvWUVsdWRtRnNhV1FnYVcxd2IzSjBJRzFoY0NBdElDSnpZMjl3WlhNaUlIQnliM0JsY25SNUlHMTFjM1FnWW1VZ1lXNGdiMkpxWldOMFlDazdDaUFnSUNCOUNnb2dJQ0FnTHk4Z1UzUmxjQ0EyTGpJS0lDQWdJSE52Y25SbFpFRnVaRTV2Y20xaGJHbDZaV1JUWTI5d1pYTWdQU0J6YjNKMFFXNWtUbTl5YldGc2FYcGxVMk52Y0dWektIQmhjbk5sWkM1elkyOXdaWE1zSUdKaGMyVlZVa3dwT3dvZ0lIMEtDaUFnTHk4Z1UzUmxjQ0EzQ2lBZ1kyOXVjM1FnYVc1MllXeHBaRXRsZVhNZ1BTQlBZbXBsWTNRdWEyVjVjeWh3WVhKelpXUXBMbVpwYkhSbGNpZ0tJQ0FnSUNoclpYa3BJRDArSUd0bGVTQWhQVDBnSjJsdGNHOXlkSE1uSUNZbUlHdGxlU0FoUFQwZ0ozTmpiM0JsY3ljc0NpQWdLVHNLSUNCcFppQW9hVzUyWVd4cFpFdGxlWE11YkdWdVozUm9JRDRnTUNrZ2V3b2dJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNCZ1NXNTJZV3hwWkNCMGIzQXRiR1YyWld3Z2EyVjVKSHNLSUNBZ0lDQWdJQ0JwYm5aaGJHbGtTMlY1Y3k1c1pXNW5kR2dnUGlBd0lEOGdKM01uSURvZ0p5Y0tJQ0FnSUNBZ2ZTQnBiaUJwYlhCdmNuUWdiV0Z3SUMwZ0pIdHBiblpoYkdsa1MyVjVjeTVxYjJsdUtDY3NJQ2NwZldBc0NpQWdJQ0FwT3dvZ0lIMEtDaUFnTHk4Z1UzUmxjQ0E0Q2lBZ2NtVjBkWEp1SUhzS0lDQWdJR2x0Y0c5eWRITTZJSE52Y25SbFpFRnVaRTV2Y20xaGJHbDZaV1JKYlhCdmNuUnpMQW9nSUNBZ2MyTnZjR1Z6T2lCemIzSjBaV1JCYm1ST2IzSnRZV3hwZW1Wa1UyTnZjR1Z6TEFvZ0lIMDdDbjBLQ2k4dklHaDBkSEJ6T2k4dmQybGpaeTVuYVhSb2RXSXVhVzh2YVcxd2IzSjBMVzFoY0hNdkkzTnZjblF0WVc1a0xXNXZjbTFoYkdsNlpTMWhMWE53WldOcFptbGxjaTF0WVhBS1puVnVZM1JwYjI0Z2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDaHRZWEFzSUdKaGMyVlZVa3dwSUhzS0lDQmpiMjV6ZENCdWIzSnRZV3hwZW1Wa0lEMGdlMzA3Q2dvZ0lHWnZjaUFvYkdWMElITndaV05wWm1sbGNrdGxlU0JwYmlCdFlYQXBJSHNLSUNBZ0lHTnZibk4wSUhaaGJIVmxJRDBnYldGd1czTndaV05wWm1sbGNrdGxlVjA3Q2dvZ0lDQWdZMjl1YzNRZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNrdGxlU0E5SUc1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2t0bGVTaHpjR1ZqYVdacFpYSkxaWGtzSUdKaGMyVlZVa3dwT3dvZ0lDQWdhV1lnS0c1dmNtMWhiR2w2WldSVGNHVmphV1pwWlhKTFpYa2dQVDA5SUc1MWJHd3BJSHNLSUNBZ0lDQWdZMjl1ZEdsdWRXVTdDaUFnSUNCOUNnb2dJQ0FnYkdWMElHRmtaSEpsYzNOVlVrd2dQU0J3WVhKelpWVlNURXhwYTJWVGNHVmphV1pwWlhJb2RtRnNkV1VzSUdKaGMyVlZVa3dwT3dvZ0lDQWdhV1lnS0dGa1pISmxjM05WVWt3Z1BUMDlJRzUxYkd3cElIc0tJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLQW9nSUNBZ0lDQWdJR0JKYm5aaGJHbGtJRlZTVENCaFpHUnlaWE56SUdadmNpQnBiWEJ2Y25RZ2JXRndJSE53WldOcFptbGxjaUFuSkh0emNHVmphV1pwWlhKTFpYbDlKMkFzQ2lBZ0lDQWdJQ2s3Q2lBZ0lDQWdJRzV2Y20xaGJHbDZaV1JiYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVWMGdQU0J1ZFd4c093b2dJQ0FnSUNCamIyNTBhVzUxWlRzS0lDQWdJSDBLQ2lBZ0lDQnBaaUFvYzNCbFkybG1hV1Z5UzJWNUxtVnVaSE5YYVhSb0tDY3ZKeWtnSmlZZ0lXRmtaSEpsYzNOVlVrd3VaVzVrYzFkcGRHZ29KeThuS1NrZ2V3b2dJQ0FnSUNCamIyNXpiMnhsTG5kaGNtNG9DaUFnSUNBZ0lDQWdZRWx1ZG1Gc2FXUWdWVkpNSUdGa1pISmxjM01nWm05eUlHbHRjRzl5ZENCdFlYQWdjM0JsWTJsbWFXVnlJQ2NrZTNOd1pXTnBabWxsY2t0bGVYMG5JQzBnYzJsdVkyVWdkR2hsSUhOd1pXTnBabWxsY2lCbGJtUnpJR2x1SUhOc1lYTm9MQ0J6YnlCdGRYTjBJSFJvWlNCaFpHUnlaWE56WUN3S0lDQWdJQ0FnS1RzS0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZ0dWIzSnRZV3hwZW1Wa1UzQmxZMmxtYVdWeVMyVjVYU0E5SUc1MWJHdzdDaUFnSUNBZ0lHTnZiblJwYm5WbE93b2dJQ0FnZlFvS0lDQWdJRzV2Y20xaGJHbDZaV1JiYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVWMGdQU0JoWkdSeVpYTnpWVkpNT3dvZ0lIMEtDaUFnY21WMGRYSnVJRzV2Y20xaGJHbDZaV1E3Q24wS0NpOHZJR2gwZEhCek9pOHZkMmxqWnk1bmFYUm9kV0l1YVc4dmFXMXdiM0owTFcxaGNITXZJMjV2Y20xaGJHbDZaUzFoTFhOd1pXTnBabWxsY2kxclpYa0tablZ1WTNScGIyNGdibTl5YldGc2FYcGxVM0JsWTJsbWFXVnlTMlY1S0d0bGVTa2dld29nSUdsbUlDaHJaWGtnUFQwOUlDY25LU0I3Q2lBZ0lDQmpiMjV6YjJ4bExuZGhjbTRvWUZOd1pXTnBabWxsY2lCclpYbHpJR2x1SUdsdGNHOXlkQ0J0WVhCeklHMWhlU0J1YjNRZ1ltVWdkR2hsSUdWdGNIUjVJSE4wY21sdVoyQXBPd29nSUNBZ2NtVjBkWEp1SUc1MWJHdzdDaUFnZlFvS0lDQnlaWFIxY200Z2NHRnljMlZWVWt4TWFXdGxVM0JsWTJsbWFXVnlLR3RsZVN3Z1ltRnpaVlZTVENrZ2ZId2dhMlY1T3dwOUNnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU53WVhKelpTMWhMWFZ5YkMxc2FXdGxMV2x0Y0c5eWRDMXpjR1ZqYVdacFpYSUtablZ1WTNScGIyNGdjR0Z5YzJWVlVreE1hV3RsVTNCbFkybG1hV1Z5S0hOd1pXTnBabWxsY2l3Z1ltRnpaVlZTVENrZ2V3b2dJR052Ym5OMElIVnpaVUpoYzJWVmNteEJjMUJoY21WdWRDQTlDaUFnSUNCemNHVmphV1pwWlhJdWMzUmhjblJ6VjJsMGFDZ25MeWNwSUh4OENpQWdJQ0J6Y0dWamFXWnBaWEl1YzNSaGNuUnpWMmwwYUNnbkxpOG5LU0I4ZkFvZ0lDQWdjM0JsWTJsbWFXVnlMbk4wWVhKMGMxZHBkR2dvSnk0dUx5Y3BPd29LSUNCMGNua2dld29nSUNBZ2NtVjBkWEp1SUc1bGR5QlZVa3dvYzNCbFkybG1hV1Z5TENCMWMyVkNZWE5sVlhKc1FYTlFZWEpsYm5RZ1B5QmlZWE5sVlZKTUlEb2dkVzVrWldacGJtVmtLUzVvY21WbU93b2dJSDBnWTJGMFkyZ2dld29nSUNBZ2NtVjBkWEp1SUc1MWJHdzdDaUFnZlFwOUNnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU56YjNKMExXRnVaQzF1YjNKdFlXeHBlbVV0YzJOdmNHVnpDbVoxYm1OMGFXOXVJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRZMjl3WlhNb2JXRndMQ0JpWVhObFZWSk1LU0I3Q2lBZ2JHVjBJRzV2Y20xaGJHbDZaV1FnUFNCN2ZUc0tDaUFnWm05eUlDaHNaWFFnYzJOdmNHVlFjbVZtYVhnZ2FXNGdiV0Z3S1NCN0NpQWdJQ0JqYjI1emRDQndiM1JsYm5ScFlXeFRjR1ZqYVdacFpYSk5ZWEFnUFNCdFlYQmJjMk52Y0dWUWNtVm1hWGhkT3dvZ0lDQWdhV1lnS0NGcGMxQnNZV2x1VDJKcVpXTjBLSEJ2ZEdWdWRHbGhiRk53WldOcFptbGxjazFoY0NrcElIc0tJQ0FnSUNBZ2RHaHliM2NnVkhsd1pVVnljbTl5S0FvZ0lDQWdJQ0FnSUdCVWFHVWdkbUZzZFdVZ2IyWWdjMk52Y0dVZ0pIdHpZMjl3WlZCeVpXWnBlSDBnYlhWemRDQmlaU0JoSUVwVFQwNGdiMkpxWldOMFlDd0tJQ0FnSUNBZ0tUc0tJQ0FnSUgwS0NpQWdJQ0JzWlhRZ2MyTnZjR1ZRY21WbWFYaFZVa3c3Q2lBZ0lDQjBjbmtnZXdvZ0lDQWdJQ0J6WTI5d1pWQnlaV1pwZUZWU1RDQTlJRzVsZHlCVlVrd29jMk52Y0dWUWNtVm1hWGdzSUdKaGMyVlZVa3dwTG1oeVpXWTdDaUFnSUNCOUlHTmhkR05vSUhzS0lDQWdJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNBZ0lHQlRZMjl3WlNCd2NtVm1hWGdnVlZKTUlDY2tlM05qYjNCbFVISmxabWw0ZlNjZ2QyRnpJRzV2ZENCd1lYSnpaV0ZpYkdVZ2FXNGdhVzF3YjNKMElHMWhjR0FzQ2lBZ0lDQWdJQ2s3Q2lBZ0lDQWdJR052Ym5ScGJuVmxPd29nSUNBZ2ZRb0tJQ0FnSUc1dmNtMWhiR2w2WldSYmMyTnZjR1ZRY21WbWFYaFZVa3hkSUQwZ2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDZ0tJQ0FnSUNBZ2NHOTBaVzUwYVdGc1UzQmxZMmxtYVdWeVRXRndMQW9nSUNBZ0lDQmlZWE5sVlZKTUxBb2dJQ0FnS1RzS0lDQjlDZ29nSUhKbGRIVnliaUJ1YjNKdFlXeHBlbVZrT3dwOUNncG1kVzVqZEdsdmJpQnBjMUJzWVdsdVQySnFaV04wS0c5aWFpa2dld29nSUhKbGRIVnliaUJ2WW1vZ1BUMDlJRTlpYW1WamRDaHZZbW9wSUNZbUlDRkJjbkpoZVM1cGMwRnljbUY1S0c5aWFpazdDbjBLQ2k4dklDMHRMUW9LYkdWMElHbHRjRzl5ZEUxaGNGQnliMjFwYzJVZ1BTQm5aWFJKYlhCdmNuUk5ZWEJRY205dGFYTmxLQ2s3Q2dwbGVIQnZjblFnWVhONWJtTWdablZ1WTNScGIyNGdjbVZ6YjJ4MlpTaHpjR1ZqYVdacFpYSXNJR052Ym5SbGVIUXNJR1JsWm1GMWJIUlNaWE52YkhabEtTQjdDaUFnWTI5dWMzUWdleUJ3WVhKbGJuUlZVa3dnUFNCdWRXeHNJSDBnUFNCamIyNTBaWGgwT3dvZ0lHTnZibk4wSUdsdGNHOXlkRTFoY0NBOUlHRjNZV2wwSUdsdGNHOXlkRTFoY0ZCeWIyMXBjMlU3Q2lBZ1kyOXVjM1FnYVcxd2IzSjBUV0Z3VlhKc0lEMGdjbVZ6YjJ4MlpWTndaV05wWm1sbGNpaHBiWEJ2Y25STllYQXNJSE53WldOcFptbGxjaXdnY0dGeVpXNTBWVkpNS1RzS0NpQWdjbVYwZFhKdUlHUmxabUYxYkhSU1pYTnZiSFpsS0dsdGNHOXlkRTFoY0ZWeWJDQS9QeUJ6Y0dWamFXWnBaWElzSUdOdmJuUmxlSFFzSUdSbFptRjFiSFJTWlhOdmJIWmxLVHNLZlFvS1pYaHdiM0owSUdGemVXNWpJR1oxYm1OMGFXOXVJR3h2WVdRb2RYSnNMQ0JqYjI1MFpYaDBMQ0JrWldaaGRXeDBURzloWkNrZ2V3b2dJR2xtSUNoMWNtd3VjM1JoY25SelYybDBhQ2duYUhSMGNEb3ZMeWNwSUh4OElIVnliQzV6ZEdGeWRITlhhWFJvS0Nkb2RIUndjem92THljcEtTQjdDaUFnSUNCamIyNXpkQ0J5WlhNZ1BTQmhkMkZwZENCbVpYUmphQ2gxY213cE93b2dJQ0FnYVdZZ0tDRnlaWE11YjJzcElIc0tJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0dCR1lXbHNaV1FnZEc4Z1ptVjBZMmdnYlc5a2RXeGxJR1p5YjIwZ0pIdDFjbXg5WUNrN0NpQWdJQ0I5Q2lBZ0lDQmpiMjV6ZENCemIzVnlZMlVnUFNCaGQyRnBkQ0J5WlhNdWRHVjRkQ2dwT3dvZ0lDQWdjbVYwZFhKdUlIc0tJQ0FnSUNBZ2MyaHZjblJEYVhKamRXbDBPaUIwY25WbExBb2dJQ0FnSUNCbWIzSnRZWFE2SUNkdGIyUjFiR1VuTEFvZ0lDQWdJQ0J6YjNWeVkyVXNDaUFnSUNCOU93b2dJSDBLQ2lBZ2FXWWdLQ0YxY213dWMzUmhjblJ6VjJsMGFDZ25ibTlrWlRvbktTa2dld29nSUNBZ1kyOXVkR1Y0ZEM1bWIzSnRZWFFnUFNBbmJXOWtkV3hsSnpzS0lDQjlDZ29nSUhKbGRIVnliaUJrWldaaGRXeDBURzloWkNoMWNtd3NJR052Ym5SbGVIUXNJR1JsWm1GMWJIUk1iMkZrS1RzS2ZRb0tZWE41Ym1NZ1puVnVZM1JwYjI0Z1oyVjBTVzF3YjNKMFRXRndVSEp2YldselpTZ3BJSHNLSUNCamIyNXpkQ0J5Wld4aGRHbDJaVkJoZEdnZ1BTQndjbTlqWlhOekxtVnVkaTVKVFZCUFVsUmZUVUZRWDFCQlZFZ2dmSHdnU1UxUVQxSlVYMDFCVUY5R1NVeEZYMDVCVFVVN0NpQWdZMjl1YzNRZ2FXMXdiM0owVFdGd1VHRjBhQ0E5SUhCaGRHZ3VjbVZ6YjJ4MlpTaHdjbTlqWlhOekxtTjNaQ2dwTENCeVpXeGhkR2wyWlZCaGRHZ3BPd29LSUNCc1pYUWdjM1J5T3dvZ0lIUnllU0I3Q2lBZ0lDQnpkSElnUFNCaGQyRnBkQ0JtY3k1eVpXRmtSbWxzWlNocGJYQnZjblJOWVhCUVlYUm9LVHNLSUNCOUlHTmhkR05vSUNobGNuSXBJSHNLSUNBZ0lISmxkSFZ5YmlCbGJYQjBlVTFoY0NncE93b2dJSDBLQ2lBZ2JHVjBJR3B6YjI0N0NpQWdkSEo1SUhzS0lDQWdJR3B6YjI0Z1BTQmhkMkZwZENCS1UwOU9MbkJoY25ObEtITjBjaWs3Q2lBZ2ZTQmpZWFJqYUNBb1pYSnlLU0I3Q2lBZ0lDQjBhSEp2ZHlCRmNuSnZjaWdLSUNBZ0lDQWdZRWx0Y0c5eWRDQnRZWEFnWVhRZ0pIdHBiWEJ2Y25STllYQlFZWFJvZlNCamIyNTBZV2x1Y3lCcGJuWmhiR2xrSUdwemIyNDZJQ1I3WlhKeUxtMWxjM05oWjJWOVlDd0tJQ0FnSUNrN0NpQWdmUW9LSUNCeVpYUjFjbTRnY21WemIyeDJaVUZ1WkVOdmJYQnZjMlZKYlhCdmNuUk5ZWEFvYW5OdmJpazdDbjBLQ21kc2IySmhiQzV1YjJSbFRHOWhaR1Z5SUQwZ1oyeHZZbUZzTG01dlpHVk1iMkZrWlhJZ2ZId2dlMzA3Q2dwbmJHOWlZV3d1Ym05a1pVeHZZV1JsY2k1elpYUkpiWEJ2Y25STllYQlFjbTl0YVhObElEMGdablZ1WTNScGIyNGdjMlYwU1cxd2IzSjBUV0Z3VUhKdmJXbHpaU2h3Y205dGFYTmxLU0I3Q2lBZ2FXMXdiM0owVFdGd1VISnZiV2x6WlNBOUlIQnliMjFwYzJVdWRHaGxiaWdvYldGd0tTQTlQaUI3Q2lBZ0lDQnlaWFIxY200Z2NtVnpiMngyWlVGdVpFTnZiWEJ2YzJWSmJYQnZjblJOWVhBb2JXRndLVHNLSUNCOUtUc0tmVHNLQ21aMWJtTjBhVzl1SUdWdGNIUjVUV0Z3S0NrZ2V3b2dJSEpsZEhWeWJpQjdJR2x0Y0c5eWRITTZJSHQ5TENCelkyOXdaWE02SUh0OUlIMDdDbjBLIjsKCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL25vZGUvaW5pdC1ub2RlLWZlZGVyYXRpb24udHMKdmFyIGRlZmF1bHRPcHRpb25zID0gewogIHJlbW90ZXNPck1hbmlmZXN0VXJsOiB7fSwKICByZWxCdW5kbGVQYXRoOiAiLi4vYnJvd3NlciIsCiAgdGhyb3dJZlJlbW90ZU5vdEZvdW5kOiBmYWxzZQp9Owphc3luYyBmdW5jdGlvbiBpbml0Tm9kZUZlZGVyYXRpb24ob3B0aW9ucykgewogIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH07CiAgY29uc3QgaW1wb3J0TWFwID0gYXdhaXQgY3JlYXRlTm9kZUltcG9ydE1hcChtZXJnZWRPcHRpb25zKTsKICBhd2FpdCB3cml0ZUltcG9ydE1hcChpbXBvcnRNYXApOwogIGF3YWl0IHdyaXRlUmVzb2x2ZXIoKTsKICByZWdpc3RlcihwYXRoVG9GaWxlVVJMKCIuL2ZlZGVyYXRpb24tcmVzb2x2ZXIubWpzIikuaHJlZik7Cn0KYXN5bmMgZnVuY3Rpb24gY3JlYXRlTm9kZUltcG9ydE1hcChvcHRpb25zKSB7CiAgY29uc3QgeyByZW1vdGVzT3JNYW5pZmVzdFVybCwgcmVsQnVuZGxlUGF0aCB9ID0gb3B0aW9uczsKICBjb25zdCByZW1vdGVzID0gdHlwZW9mIHJlbW90ZXNPck1hbmlmZXN0VXJsID09PSAib2JqZWN0IiA/IHJlbW90ZXNPck1hbmlmZXN0VXJsIDogYXdhaXQgbG9hZEZzTWFuaWZlc3QocmVtb3Rlc09yTWFuaWZlc3RVcmwpOwogIGNvbnN0IGhvc3RJbmZvID0gYXdhaXQgbG9hZEZzRmVkZXJhdGlvbkluZm8ocmVsQnVuZGxlUGF0aCk7CiAgY29uc3QgaG9zdEltcG9ydE1hcCA9IGF3YWl0IHByb2Nlc3NIb3N0SW5mbyhob3N0SW5mbywgIi4vIiArIHJlbEJ1bmRsZVBhdGgpOwogIGNvbnN0IHJlbW90ZXNJbXBvcnRNYXAgPSBhd2FpdCBwcm9jZXNzUmVtb3RlSW5mb3MocmVtb3RlcywgewogICAgdGhyb3dJZlJlbW90ZU5vdEZvdW5kOiBvcHRpb25zLnRocm93SWZSZW1vdGVOb3RGb3VuZCwKICAgIGNhY2hlVGFnOiBvcHRpb25zLmNhY2hlVGFnCiAgfSk7CiAgY29uc3QgaW1wb3J0TWFwID0gbWVyZ2VJbXBvcnRNYXBzKGhvc3RJbXBvcnRNYXAsIHJlbW90ZXNJbXBvcnRNYXApOwogIHJldHVybiBpbXBvcnRNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gbG9hZEZzTWFuaWZlc3QobWFuaWZlc3RVcmwpIHsKICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMyLnJlYWRGaWxlKG1hbmlmZXN0VXJsLCAidXRmLTgiKTsKICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoY29udGVudCk7CiAgcmV0dXJuIG1hbmlmZXN0Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGc0ZlZGVyYXRpb25JbmZvKHJlbEJ1bmRsZVBhdGgpIHsKICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoMi5qb2luKHJlbEJ1bmRsZVBhdGgsICJyZW1vdGVFbnRyeS5qc29uIik7CiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzMi5yZWFkRmlsZShtYW5pZmVzdFBhdGgsICJ1dGYtOCIpOwogIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShjb250ZW50KTsKICByZXR1cm4gbWFuaWZlc3Q7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVJbXBvcnRNYXAobWFwKSB7CiAgYXdhaXQgZnMyLndyaXRlRmlsZSgKICAgIElNUE9SVF9NQVBfRklMRV9OQU1FLAogICAgSlNPTi5zdHJpbmdpZnkobWFwLCBudWxsLCAyKSwKICAgICJ1dGYtOCIKICApOwp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlUmVzb2x2ZXIoKSB7CiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20ocmVzb2x2ZXIsICJiYXNlNjQiKTsKICBhd2FpdCBmczIud3JpdGVGaWxlKCJmZWRlcmF0aW9uLXJlc29sdmVyLm1qcyIsIGJ1ZmZlciwgInV0Zi04Iik7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2ZzdGFydC1hcmdzLXBhcnNlci50cwppbXBvcnQgKiBhcyBmczMgZnJvbSAibm9kZTpmcyI7CnZhciBkZWZhdWx0QXJncyA9IHsKICBlbnRyeTogIi4vc2VydmVyLm1qcyIsCiAgcmVtb3Rlc09yTWFuaWZlc3RVcmw6ICIuLi9icm93c2VyL2ZlZGVyYXRpb24ubWFuaWZlc3QuanNvbiIsCiAgcmVsQnVuZGxlUGF0aDogIi4uL2Jyb3dzZXIvIgp9OwpmdW5jdGlvbiBwYXJzZUZTdGFydEFyZ3MoKSB7CiAgY29uc3QgYXJnczIgPSB7CiAgICBlbnRyeTogIiIsCiAgICByZW1vdGVzT3JNYW5pZmVzdFVybDogIiIsCiAgICByZWxCdW5kbGVQYXRoOiAiIgogIH07CiAgbGV0IGtleSA9ICIiOwogIGZvciAobGV0IGkgPSAyOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBjYW5kID0gcHJvY2Vzcy5hcmd2W2ldOwogICAgaWYgKGNhbmQuc3RhcnRzV2l0aCgiLS0iKSkgewogICAgICBjb25zdCBjYW5kS2V5ID0gY2FuZC5zdWJzdHJpbmcoMik7CiAgICAgIGlmIChkZWZhdWx0QXJnc1tjYW5kS2V5XSkgewogICAgICAgIGtleSA9IGNhbmRLZXk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgc3dpdGNoICR7Y2FuZH0gbm90IHN1cHBvcnRlZCFgKTsKICAgICAgICBleGl0V2l0aFVzYWdlKGRlZmF1bHRBcmdzKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChrZXkpIHsKICAgICAgYXJnczJba2V5XSA9IGNhbmQ7CiAgICAgIGtleSA9ICIiOwogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS5lcnJvcihgdW5yZWxhZGVkIHZhbHVlICR7Y2FuZH0hYCk7CiAgICAgIGV4aXRXaXRoVXNhZ2UoZGVmYXVsdEFyZ3MpOwogICAgfQogIH0KICBhcHBseURlZmF1bHRBcmdzKGFyZ3MyKTsKICByZXR1cm4gYXJnczI7Cn0KZnVuY3Rpb24gYXBwbHlEZWZhdWx0QXJncyhhcmdzMikgewogIGlmIChhcmdzMi5yZWxCdW5kbGVQYXRoICYmICFhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCkgewogICAgY29uc3QgY2FuZCA9IGRlZmF1bHRBcmdzLnJlbEJ1bmRsZVBhdGggKyAiZmVkZXJhdGlvbi5tYW5pZmVzdC5qc29uIjsKICAgIGlmIChmczMuZXhpc3RzU3luYyhjYW5kKSkgewogICAgICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9IGNhbmQ7CiAgICB9CiAgfQogIGFyZ3MyLmVudHJ5ID0gYXJnczIuZW50cnkgfHwgZGVmYXVsdEFyZ3MuZW50cnk7CiAgYXJnczIucmVsQnVuZGxlUGF0aCA9IGFyZ3MyLnJlbEJ1bmRsZVBhdGggfHwgZGVmYXVsdEFyZ3MucmVsQnVuZGxlUGF0aDsKICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9IGFyZ3MyLnJlbW90ZXNPck1hbmlmZXN0VXJsIHx8IGRlZmF1bHRBcmdzLnJlbW90ZXNPck1hbmlmZXN0VXJsOwogIGlmICghZnMzLmV4aXN0c1N5bmMoYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwpKSB7CiAgICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9IHZvaWQgMDsKICB9Cn0KZnVuY3Rpb24gZXhpdFdpdGhVc2FnZShkZWZhdWx0QXJnczIpIHsKICBsZXQgYXJnczIgPSAiIjsKICBmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0QXJnczIpIHsKICAgIGFyZ3MyICs9IGBbLS0ke2tleX0gJHtkZWZhdWx0QXJnczJba2V5XX1dIGA7CiAgfQogIGNvbnNvbGUubG9nKCJ1c2FnZTogbmZzdGFydCAiICsgYXJnczIpOwogIHByb2Nlc3MuZXhpdCgxKTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvdXRpbHMvZnN0YXJ0LnRzCnZhciBhcmdzID0gcGFyc2VGU3RhcnRBcmdzKCk7Cihhc3luYyAoKSA9PiB7CiAgYXdhaXQgaW5pdE5vZGVGZWRlcmF0aW9uKHsKICAgIC4uLmFyZ3MucmVtb3Rlc09yTWFuaWZlc3RVcmwgPyB7IHJlbW90ZXNPck1hbmlmZXN0VXJsOiBhcmdzLnJlbW90ZXNPck1hbmlmZXN0VXJsIH0gOiB7fSwKICAgIHJlbEJ1bmRsZVBhdGg6IGFyZ3MucmVsQnVuZGxlUGF0aAogIH0pOwogIGF3YWl0IGltcG9ydChhcmdzLmVudHJ5KTsKfSkoKTsK';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type BuildAdapter } from '@nf-beta/core/build';
|
|
2
|
+
import * as esbuild from 'esbuild';
|
|
3
|
+
import type { BuilderContext } from '@angular-devkit/architect';
|
|
4
|
+
import type { ApplicationBuilderOptions } from '@angular/build';
|
|
5
|
+
import { type RebuildEvents } from './rebuild-events.js';
|
|
6
|
+
export type MemResultHandler = (outfiles: esbuild.OutputFile[], outdir?: string) => void;
|
|
7
|
+
export declare function setMemResultHandler(handler: MemResultHandler): void;
|
|
8
|
+
export declare function createAngularBuildAdapter(builderOptions: ApplicationBuilderOptions, context: BuilderContext, rebuildRequested?: RebuildEvents): BuildAdapter;
|
|
9
|
+
export declare function loadEsmModule<T>(modulePath: string | URL): Promise<T>;
|
|
10
|
+
//# sourceMappingURL=angular-esbuild-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular-esbuild-adapter.d.ts","sourceRoot":"","sources":["../../../src/utils/angular-esbuild-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAMlB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAWnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAShE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAQhE,OAAO,EAAE,KAAK,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAMtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAKzF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAEnE;AAED,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,yBAAyB,EACzC,OAAO,EAAE,cAAc,EACvB,gBAAgB,GAAE,aAAiC,GAClD,YAAY,CAwFd;AAgSD,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAErE"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { AbortedError, logger, } from '@nf-beta/core/build';
|
|
2
|
+
import * as esbuild from 'esbuild';
|
|
3
|
+
import { transformSupportedBrowsersToTargets, getSupportedBrowsers, generateSearchDirectories, findTailwindConfiguration, loadPostcssConfiguration, } from '@angular/build/private';
|
|
4
|
+
import { createCompilerPluginOptions } from './create-compiler-options.js';
|
|
5
|
+
import { normalizeOptimization, normalizeSourceMaps, } from '@angular-devkit/build-angular/src/utils/index.js';
|
|
6
|
+
import { createRequire } from 'node:module';
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { createSharedMappingsPlugin } from './shared-mappings-plugin.js';
|
|
10
|
+
import { transformAsync } from '@babel/core';
|
|
11
|
+
import { RebuildHubs } from './rebuild-events.js';
|
|
12
|
+
import JSON5 from 'json5';
|
|
13
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
14
|
+
import { createAwaitableCompilerPlugin } from './create-awaitable-compiler-plugin.js';
|
|
15
|
+
let _memResultHandler;
|
|
16
|
+
// Todo: figure out if still necessary
|
|
17
|
+
export function setMemResultHandler(handler) {
|
|
18
|
+
_memResultHandler = handler;
|
|
19
|
+
}
|
|
20
|
+
export function createAngularBuildAdapter(builderOptions, context, rebuildRequested = new RebuildHubs()) {
|
|
21
|
+
return async (options) => {
|
|
22
|
+
const { entryPoints, tsConfigPath, external, outdir, mappedPaths, kind, watch, dev, hash, platform, optimizedMappings, signal, } = options;
|
|
23
|
+
setNgServerMode();
|
|
24
|
+
const files = await runEsbuild(builderOptions, context, entryPoints, external, outdir, tsConfigPath, mappedPaths, watch, rebuildRequested, dev, kind, hash, undefined, undefined, undefined, platform, optimizedMappings, signal);
|
|
25
|
+
if (kind === 'shared-package') {
|
|
26
|
+
const scriptFiles = files.filter(f => f.endsWith('.js') || f.endsWith('.mjs'));
|
|
27
|
+
for (const file of scriptFiles) {
|
|
28
|
+
link(file, !!dev);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return files.map(fileName => ({ fileName }));
|
|
32
|
+
};
|
|
33
|
+
async function link(outfile, dev) {
|
|
34
|
+
const code = fs.readFileSync(outfile, 'utf-8');
|
|
35
|
+
try {
|
|
36
|
+
const linkerEsm = await loadEsmModule('@angular/compiler-cli/linker/babel');
|
|
37
|
+
const linker = linkerEsm.default;
|
|
38
|
+
const result = await transformAsync(code, {
|
|
39
|
+
filename: outfile,
|
|
40
|
+
compact: !dev,
|
|
41
|
+
configFile: false,
|
|
42
|
+
babelrc: false,
|
|
43
|
+
minified: !dev,
|
|
44
|
+
browserslistConfigFile: false,
|
|
45
|
+
plugins: [linker],
|
|
46
|
+
});
|
|
47
|
+
if (!result)
|
|
48
|
+
logger.warn(`File ${outfile} could not be linked.`);
|
|
49
|
+
if (!result?.code) {
|
|
50
|
+
logger.warn(`File ${outfile} seems to be empty.`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
fs.writeFileSync(outfile, result.code, 'utf-8');
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
logger.error('error linking');
|
|
57
|
+
if (fs.existsSync(`${outfile}.error`)) {
|
|
58
|
+
fs.unlinkSync(`${outfile}.error`);
|
|
59
|
+
}
|
|
60
|
+
fs.renameSync(outfile, `${outfile}.error`);
|
|
61
|
+
throw e;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function runEsbuild(builderOptions, context, entryPoints, external, outdir, tsConfigPath, mappedPaths, watch, rebuildRequested = new RebuildHubs(), dev, kind, hash = false, plugins = null, absWorkingDir = undefined, logLevel = 'warning', platform, optimizedMappings, signal) {
|
|
66
|
+
if (signal?.aborted) {
|
|
67
|
+
throw new AbortedError('[angular-esbuild-adapter] Before building');
|
|
68
|
+
}
|
|
69
|
+
const workspaceRoot = context.workspaceRoot;
|
|
70
|
+
const projectMetadata = await context.getProjectMetadata(context.target.project);
|
|
71
|
+
const projectRoot = path.join(workspaceRoot, projectMetadata['root'] ?? '');
|
|
72
|
+
const browsers = getSupportedBrowsers(projectRoot, context.logger);
|
|
73
|
+
const target = transformSupportedBrowsersToTargets(browsers);
|
|
74
|
+
const optimizationOptions = normalizeOptimization(builderOptions.optimization);
|
|
75
|
+
const sourcemapOptions = normalizeSourceMaps(builderOptions.sourceMap);
|
|
76
|
+
const searchDirectories = await generateSearchDirectories([projectRoot, workspaceRoot]);
|
|
77
|
+
const postcssConfiguration = await loadPostcssConfiguration(searchDirectories);
|
|
78
|
+
const tailwindConfiguration = postcssConfiguration
|
|
79
|
+
? undefined
|
|
80
|
+
: await getTailwindConfig(searchDirectories);
|
|
81
|
+
const outputNames = {
|
|
82
|
+
bundles: '[name]',
|
|
83
|
+
media: 'media/[name]',
|
|
84
|
+
};
|
|
85
|
+
let fileReplacements;
|
|
86
|
+
if (builderOptions.fileReplacements) {
|
|
87
|
+
for (const replacement of builderOptions.fileReplacements) {
|
|
88
|
+
fileReplacements ??= {};
|
|
89
|
+
fileReplacements[path.join(workspaceRoot, replacement.replace)] = path.join(workspaceRoot, replacement.with);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (!optimizedMappings) {
|
|
93
|
+
tsConfigPath = createTsConfigForFederation(workspaceRoot, tsConfigPath, entryPoints);
|
|
94
|
+
}
|
|
95
|
+
const pluginOptions = createCompilerPluginOptions({
|
|
96
|
+
workspaceRoot,
|
|
97
|
+
optimizationOptions,
|
|
98
|
+
sourcemapOptions,
|
|
99
|
+
tsconfig: tsConfigPath,
|
|
100
|
+
outputNames,
|
|
101
|
+
fileReplacements,
|
|
102
|
+
externalDependencies: external,
|
|
103
|
+
preserveSymlinks: builderOptions.preserveSymlinks,
|
|
104
|
+
stylePreprocessorOptions: builderOptions.stylePreprocessorOptions,
|
|
105
|
+
advancedOptimizations: !dev,
|
|
106
|
+
inlineStyleLanguage: builderOptions.inlineStyleLanguage,
|
|
107
|
+
jit: false,
|
|
108
|
+
tailwindConfiguration,
|
|
109
|
+
postcssConfiguration,
|
|
110
|
+
}, target, undefined);
|
|
111
|
+
const commonjsPluginModule = await import('@chialab/esbuild-plugin-commonjs');
|
|
112
|
+
const commonjsPlugin = commonjsPluginModule.default;
|
|
113
|
+
pluginOptions.styleOptions.externalDependencies = [];
|
|
114
|
+
const [compilerPlugin, pluginDisposed] = createAwaitableCompilerPlugin(pluginOptions.pluginOptions, pluginOptions.styleOptions);
|
|
115
|
+
const config = {
|
|
116
|
+
entryPoints: entryPoints.map(ep => ({
|
|
117
|
+
in: ep.fileName,
|
|
118
|
+
out: path.parse(ep.outName).name,
|
|
119
|
+
})),
|
|
120
|
+
outdir,
|
|
121
|
+
entryNames: hash ? '[name]-[hash]' : '[name]',
|
|
122
|
+
write: false,
|
|
123
|
+
absWorkingDir,
|
|
124
|
+
external,
|
|
125
|
+
logLevel,
|
|
126
|
+
bundle: true,
|
|
127
|
+
sourcemap: sourcemapOptions.scripts,
|
|
128
|
+
minify: !dev,
|
|
129
|
+
supported: {
|
|
130
|
+
'async-await': false,
|
|
131
|
+
'object-rest-spread': false,
|
|
132
|
+
},
|
|
133
|
+
splitting: true, //kind === 'mapping-or-exposed',
|
|
134
|
+
platform: platform ?? 'browser',
|
|
135
|
+
format: 'esm',
|
|
136
|
+
target: target,
|
|
137
|
+
logLimit: kind === 'shared-package' ? 1 : 0,
|
|
138
|
+
plugins: plugins || [
|
|
139
|
+
compilerPlugin,
|
|
140
|
+
...(mappedPaths && mappedPaths.length > 0 ? [createSharedMappingsPlugin(mappedPaths)] : []),
|
|
141
|
+
commonjsPlugin(),
|
|
142
|
+
],
|
|
143
|
+
define: {
|
|
144
|
+
...(!dev ? { ngDevMode: 'false' } : {}),
|
|
145
|
+
ngJitMode: 'false',
|
|
146
|
+
},
|
|
147
|
+
...(builderOptions.loader ? { loader: builderOptions.loader } : {}),
|
|
148
|
+
resolveExtensions: ['.ts', '.tsx', '.mjs', '.js', '.cjs'],
|
|
149
|
+
};
|
|
150
|
+
const ctx = await esbuild.context(config);
|
|
151
|
+
try {
|
|
152
|
+
const abortHandler = async () => {
|
|
153
|
+
await ctx.cancel();
|
|
154
|
+
await ctx.dispose();
|
|
155
|
+
await pluginDisposed;
|
|
156
|
+
};
|
|
157
|
+
if (signal) {
|
|
158
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
159
|
+
}
|
|
160
|
+
const result = await ctx.rebuild();
|
|
161
|
+
const memOnly = dev && kind === 'mapping-or-exposed' && !!_memResultHandler;
|
|
162
|
+
const writtenFiles = writeResult(result, outdir, !!memOnly);
|
|
163
|
+
if (watch) {
|
|
164
|
+
// Also hardcoded disabled?
|
|
165
|
+
registerForRebuilds(kind ?? 'shared-package', rebuildRequested, ctx, outdir, !!memOnly);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
if (signal)
|
|
169
|
+
signal.removeEventListener('abort', abortHandler);
|
|
170
|
+
await ctx.dispose();
|
|
171
|
+
await pluginDisposed;
|
|
172
|
+
}
|
|
173
|
+
return writtenFiles;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
// ESBuild throws an error if the request is cancelled.
|
|
177
|
+
// if it is, it's changed to an 'AbortedError'
|
|
178
|
+
if (signal?.aborted && error instanceof Error && error.message.includes('canceled')) {
|
|
179
|
+
throw new AbortedError('[runEsbuild] ESBuild was canceled.');
|
|
180
|
+
}
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function getTailwindConfig(searchDirectories) {
|
|
185
|
+
const tailwindConfigurationPath = findTailwindConfiguration(searchDirectories);
|
|
186
|
+
if (!tailwindConfigurationPath) {
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
file: tailwindConfigurationPath,
|
|
191
|
+
package: createRequire(tailwindConfigurationPath).resolve('tailwindcss'),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function createTsConfigForFederation(workspaceRoot, tsConfigPath, entryPoints) {
|
|
195
|
+
const fullTsConfigPath = path.join(workspaceRoot, tsConfigPath);
|
|
196
|
+
const tsconfigDir = path.dirname(fullTsConfigPath);
|
|
197
|
+
const filtered = entryPoints
|
|
198
|
+
.filter(ep => !ep.fileName.includes('/node_modules/') && !ep.fileName.startsWith('.'))
|
|
199
|
+
.map(ep => path.relative(tsconfigDir, ep.fileName).replace(/\\\\/g, '/'));
|
|
200
|
+
const tsconfigAsString = fs.readFileSync(fullTsConfigPath, 'utf-8');
|
|
201
|
+
const tsconfig = JSON5.parse(tsconfigAsString);
|
|
202
|
+
if (!tsconfig.include) {
|
|
203
|
+
tsconfig.include = [];
|
|
204
|
+
}
|
|
205
|
+
for (const ep of filtered) {
|
|
206
|
+
if (!tsconfig.include.includes(ep)) {
|
|
207
|
+
tsconfig.include.push(ep);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
const content = JSON5.stringify(tsconfig, null, 2);
|
|
211
|
+
const tsconfigFedPath = path.join(tsconfigDir, 'tsconfig.federation.json');
|
|
212
|
+
if (!doesFileExistAndJsonEqual(tsconfigFedPath, content)) {
|
|
213
|
+
fs.writeFileSync(tsconfigFedPath, JSON.stringify(tsconfig, null, 2));
|
|
214
|
+
}
|
|
215
|
+
tsConfigPath = tsconfigFedPath;
|
|
216
|
+
return tsConfigPath;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Checks if a file exists and if its content is equal to the provided content.
|
|
220
|
+
* If the file does not exist, it returns false.
|
|
221
|
+
* If the file or its content is invalid JSON, it returns false.
|
|
222
|
+
* @param {string} path - The path to the file
|
|
223
|
+
* @param {string} content - The content to compare with
|
|
224
|
+
* @returns {boolean} - Returns true if the file exists and its content is equal to the provided content
|
|
225
|
+
*/
|
|
226
|
+
function doesFileExistAndJsonEqual(path, content) {
|
|
227
|
+
if (!fs.existsSync(path)) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
const currentContent = fs.readFileSync(path, 'utf-8');
|
|
232
|
+
const currentJson = JSON5.parse(currentContent);
|
|
233
|
+
const newJson = JSON5.parse(content);
|
|
234
|
+
return isDeepStrictEqual(currentJson, newJson);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function writeResult(result, outdir, memOnly) {
|
|
241
|
+
const writtenFiles = [];
|
|
242
|
+
if (memOnly) {
|
|
243
|
+
_memResultHandler(result.outputFiles ?? [], outdir);
|
|
244
|
+
}
|
|
245
|
+
for (const outFile of result.outputFiles ?? []) {
|
|
246
|
+
const fileName = path.basename(outFile.path);
|
|
247
|
+
const filePath = path.join(outdir, fileName);
|
|
248
|
+
if (!memOnly) {
|
|
249
|
+
fs.writeFileSync(filePath, outFile.text);
|
|
250
|
+
}
|
|
251
|
+
writtenFiles.push(filePath);
|
|
252
|
+
}
|
|
253
|
+
if (!memOnly) {
|
|
254
|
+
// for (const asset of result.outputFiles)
|
|
255
|
+
}
|
|
256
|
+
return writtenFiles;
|
|
257
|
+
}
|
|
258
|
+
function registerForRebuilds(kind, rebuildRequested, ctx, outdir, memOnly) {
|
|
259
|
+
if (kind !== 'shared-package') {
|
|
260
|
+
rebuildRequested.rebuild.register(async () => {
|
|
261
|
+
const result = await ctx.rebuild();
|
|
262
|
+
writeResult(result, outdir, memOnly);
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
export function loadEsmModule(modulePath) {
|
|
267
|
+
return new Function('modulePath', `return import(modulePath);`)(modulePath);
|
|
268
|
+
}
|
|
269
|
+
//
|
|
270
|
+
// Usually, ngServerMode is set during bundling. However, we need to infer this
|
|
271
|
+
// value at runtime as we are using the same shared bundle for @angular/core
|
|
272
|
+
// on the server and in the browser.
|
|
273
|
+
//
|
|
274
|
+
function setNgServerMode() {
|
|
275
|
+
const fileToPatch = 'node_modules/@angular/core/fesm2022/core.mjs';
|
|
276
|
+
const lineToAdd = `if (typeof globalThis.ngServerMode ==='undefined') globalThis.ngServerMode = (typeof window === 'undefined') ? true : false;`;
|
|
277
|
+
try {
|
|
278
|
+
if (fs.existsSync(fileToPatch)) {
|
|
279
|
+
let content = fs.readFileSync(fileToPatch, 'utf-8');
|
|
280
|
+
if (!content.includes(lineToAdd)) {
|
|
281
|
+
content = lineToAdd + '\n' + content;
|
|
282
|
+
fs.writeFileSync(fileToPatch, content);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
console.error('Error patching file ', fileToPatch, '\nIs it write-protected?');
|
|
288
|
+
}
|
|
289
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type SharedConfig } from '@nf-beta/core/build';
|
|
2
|
+
export declare function shareAngularLocales(keys: string[], config?: SharedConfig): (string | {
|
|
3
|
+
[x: string]: SharedConfig & {
|
|
4
|
+
includeSecondaries?: boolean | {
|
|
5
|
+
skip: string | string[];
|
|
6
|
+
resolveGlob?: boolean;
|
|
7
|
+
keepAll?: boolean;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
})[] | {
|
|
11
|
+
[x: string]: SharedConfig & {
|
|
12
|
+
includeSecondaries?: boolean | {
|
|
13
|
+
skip: string | string[];
|
|
14
|
+
resolveGlob?: boolean;
|
|
15
|
+
keepAll?: boolean;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=angular-locales.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular-locales.d.ts","sourceRoot":"","sources":["../../../src/utils/angular-locales.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/D,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,GAAE,YAIP;;;;;;;;;;;;;;;;EAeF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { share } from '@nf-beta/core/build';
|
|
2
|
+
export function shareAngularLocales(keys, config = {
|
|
3
|
+
singleton: true,
|
|
4
|
+
strictVersion: true,
|
|
5
|
+
requiredVersion: 'auto',
|
|
6
|
+
}) {
|
|
7
|
+
const locales = keys.reduce((acc, key) => {
|
|
8
|
+
acc[`@angular/common/locales/${key}`] = {
|
|
9
|
+
...config,
|
|
10
|
+
};
|
|
11
|
+
acc[`@angular/common/locales/${key}`].packageInfo = {
|
|
12
|
+
...(config.packageInfo ?? { esm: true, version: '0.0.0' }),
|
|
13
|
+
entryPoint: config.packageInfo?.entryPoint || `node_modules/@angular/common/locales/${key}.mjs`,
|
|
14
|
+
};
|
|
15
|
+
return acc;
|
|
16
|
+
}, {});
|
|
17
|
+
return share(locales);
|
|
18
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type * as esbuild from 'esbuild';
|
|
2
|
+
import { createCompilerPlugin } from '@angular/build/private';
|
|
3
|
+
type CreateCompilerPluginParams = Parameters<typeof createCompilerPlugin>;
|
|
4
|
+
export declare function createAwaitableCompilerPlugin(pluginOptions: CreateCompilerPluginParams[0], styleOptions: CreateCompilerPluginParams[1]): [esbuild.Plugin, Promise<void>];
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=create-awaitable-compiler-plugin.d.ts.map
|