@plumile/site 0.2.2 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +102 -29
  2. package/lib/esm/node/httpResponse.d.ts +4 -0
  3. package/lib/esm/node/httpResponse.d.ts.map +1 -0
  4. package/lib/esm/node/httpResponse.js +29 -0
  5. package/lib/esm/node/index.d.ts +4 -48
  6. package/lib/esm/node/index.d.ts.map +1 -1
  7. package/lib/esm/node/index.js +4 -102
  8. package/lib/esm/node/renderSiteRequest.d.ts +4 -0
  9. package/lib/esm/node/renderSiteRequest.d.ts.map +1 -0
  10. package/lib/esm/node/renderSiteRequest.js +293 -0
  11. package/lib/esm/node/types.d.ts +106 -0
  12. package/lib/esm/node/types.d.ts.map +1 -0
  13. package/lib/esm/node/types.js +2 -0
  14. package/lib/esm/node/writeStaticSite.d.ts +3 -0
  15. package/lib/esm/node/writeStaticSite.d.ts.map +1 -0
  16. package/lib/esm/node/writeStaticSite.js +77 -0
  17. package/lib/esm/runtime/hydrationPayload.d.ts +8 -0
  18. package/lib/esm/runtime/hydrationPayload.d.ts.map +1 -0
  19. package/lib/esm/runtime/hydrationPayload.js +81 -0
  20. package/lib/esm/runtime/index.d.ts +36 -28
  21. package/lib/esm/runtime/index.d.ts.map +1 -1
  22. package/lib/esm/runtime/index.js +92 -78
  23. package/lib/esm/runtime/scrollRestoration.d.ts +12 -0
  24. package/lib/esm/runtime/scrollRestoration.d.ts.map +1 -0
  25. package/lib/esm/runtime/scrollRestoration.js +66 -0
  26. package/lib/esm/vite/index.d.ts +3 -1
  27. package/lib/esm/vite/index.d.ts.map +1 -1
  28. package/lib/esm/vite/index.js +23 -5
  29. package/lib/esm/vite/resolveSiteAssetsFromViteManifest.d.ts +14 -0
  30. package/lib/esm/vite/resolveSiteAssetsFromViteManifest.d.ts.map +1 -0
  31. package/lib/esm/vite/resolveSiteAssetsFromViteManifest.js +81 -0
  32. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  33. package/lib/types/node/httpResponse.d.ts +4 -0
  34. package/lib/types/node/httpResponse.d.ts.map +1 -0
  35. package/lib/types/node/index.d.ts +4 -48
  36. package/lib/types/node/index.d.ts.map +1 -1
  37. package/lib/types/node/renderSiteRequest.d.ts +4 -0
  38. package/lib/types/node/renderSiteRequest.d.ts.map +1 -0
  39. package/lib/types/node/types.d.ts +106 -0
  40. package/lib/types/node/types.d.ts.map +1 -0
  41. package/lib/types/node/writeStaticSite.d.ts +3 -0
  42. package/lib/types/node/writeStaticSite.d.ts.map +1 -0
  43. package/lib/types/runtime/hydrationPayload.d.ts +8 -0
  44. package/lib/types/runtime/hydrationPayload.d.ts.map +1 -0
  45. package/lib/types/runtime/index.d.ts +36 -28
  46. package/lib/types/runtime/index.d.ts.map +1 -1
  47. package/lib/types/runtime/scrollRestoration.d.ts +12 -0
  48. package/lib/types/runtime/scrollRestoration.d.ts.map +1 -0
  49. package/lib/types/vite/index.d.ts +3 -1
  50. package/lib/types/vite/index.d.ts.map +1 -1
  51. package/lib/types/vite/resolveSiteAssetsFromViteManifest.d.ts +14 -0
  52. package/lib/types/vite/resolveSiteAssetsFromViteManifest.d.ts.map +1 -0
  53. package/package.json +5 -5
@@ -1,6 +1,8 @@
1
1
  import type { PluginOption } from 'vite';
2
+ export { resolveSiteAssetsFromViteManifest, type ResolveSiteAssetsOptions, type ViteManifestChunk, } from './resolveSiteAssetsFromViteManifest.js';
2
3
  export type PlumileSiteVitePluginOptions = {
4
+ clientEntry: string;
3
5
  manifestPath?: string;
4
6
  };
5
- export declare function plumileSiteVitePlugin(options?: PlumileSiteVitePluginOptions): PluginOption;
7
+ export declare function plumileSiteVitePlugin(options: PlumileSiteVitePluginOptions): PluginOption;
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vite/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAEzC,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAKF,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,4BAAiC,GACzC,YAAY,CAad"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vite/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,MAAM,CAAC;AACrD,OAAO,EACL,iCAAiC,EACjC,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,GACvB,MAAM,wCAAwC,CAAC;AAEhD,MAAM,MAAM,4BAA4B,GAAG;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAGF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,YAAY,CA8Bd"}
@@ -1,13 +1,31 @@
1
- export function plumileSiteVitePlugin(options = {}) {
1
+ export { resolveSiteAssetsFromViteManifest, } from './resolveSiteAssetsFromViteManifest.js';
2
+ export function plumileSiteVitePlugin(options) {
3
+ if (options.clientEntry.trim() === '') {
4
+ throw new Error('plumileSiteVitePlugin requires clientEntry');
5
+ }
2
6
  return {
3
7
  name: 'plumile-site',
4
- config() {
8
+ config(config, environment) {
9
+ if (environment.isSsrBuild) {
10
+ return {
11
+ build: {
12
+ copyPublicDir: false,
13
+ manifest: false,
14
+ },
15
+ };
16
+ }
17
+ const configuredInput = config.build?.rollupOptions?.input;
18
+ if (configuredInput != null && configuredInput !== options.clientEntry) {
19
+ throw new Error('Vite Rollup input conflicts with plumileSiteVitePlugin clientEntry');
20
+ }
5
21
  return {
6
- define: {
7
- __PLUMILE_SITE_MANIFEST_PATH__: JSON.stringify(options.manifestPath ?? '.plumile-site/manifest.json'),
22
+ build: {
23
+ copyPublicDir: true,
24
+ manifest: options.manifestPath ?? '.vite/manifest.json',
25
+ rollupOptions: { input: options.clientEntry },
8
26
  },
9
27
  };
10
28
  },
11
29
  };
12
30
  }
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdml0ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSxNQUFNLFVBQVUscUJBQXFCLENBQ25DLE9BQU8sR0FBaUMsRUFBRTtJQUUxQyxPQUFPO1FBQ0wsSUFBSSxFQUFFLGNBQWM7UUFDcEIsTUFBTTtZQUNKLE9BQU87Z0JBQ0wsTUFBTSxFQUFFO29CQUNOLDhCQUE4QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQzVDLE9BQU8sQ0FBQyxZQUFZLElBQUksNkJBQTZCLENBQ3REO2lCQUNGO2FBQ0YsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUGx1Z2luT3B0aW9uIH0gZnJvbSAndml0ZSc7XG5cbmV4cG9ydCB0eXBlIFBsdW1pbGVTaXRlVml0ZVBsdWdpbk9wdGlvbnMgPSB7XG4gIG1hbmlmZXN0UGF0aD86IHN0cmluZztcbn07XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdW1pbGVTaXRlVml0ZVBsdWdpbihcbiAgb3B0aW9uczogUGx1bWlsZVNpdGVWaXRlUGx1Z2luT3B0aW9ucyA9IHt9LFxuKTogUGx1Z2luT3B0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAncGx1bWlsZS1zaXRlJyxcbiAgICBjb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWZpbmU6IHtcbiAgICAgICAgICBfX1BMVU1JTEVfU0lURV9NQU5JRkVTVF9QQVRIX186IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgb3B0aW9ucy5tYW5pZmVzdFBhdGggPz8gJy5wbHVtaWxlLXNpdGUvbWFuaWZlc3QuanNvbicsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdml0ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsaUNBQWlDLEdBR2xDLE1BQU0sd0NBQXdDLENBQUM7QUFRaEQsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxPQUFxQztJQUVyQyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLGNBQWM7UUFDcEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXO1lBQ3hCLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMzQixPQUFPO29CQUNMLEtBQUssRUFBRTt3QkFDTCxhQUFhLEVBQUUsS0FBSzt3QkFDcEIsUUFBUSxFQUFFLEtBQUs7cUJBQ2hCO2lCQUNtQixDQUFDO1lBQ3pCLENBQUM7WUFDRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUM7WUFDM0QsSUFBSSxlQUFlLElBQUksSUFBSSxJQUFJLGVBQWUsS0FBSyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQ2Isb0VBQW9FLENBQ3JFLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTztnQkFDTCxLQUFLLEVBQUU7b0JBQ0wsYUFBYSxFQUFFLElBQUk7b0JBQ25CLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWSxJQUFJLHFCQUFxQjtvQkFDdkQsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUU7aUJBQzlDO2FBQ21CLENBQUM7UUFDekIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQbHVnaW5PcHRpb24sIFVzZXJDb25maWcgfSBmcm9tICd2aXRlJztcbmV4cG9ydCB7XG4gIHJlc29sdmVTaXRlQXNzZXRzRnJvbVZpdGVNYW5pZmVzdCxcbiAgdHlwZSBSZXNvbHZlU2l0ZUFzc2V0c09wdGlvbnMsXG4gIHR5cGUgVml0ZU1hbmlmZXN0Q2h1bmssXG59IGZyb20gJy4vcmVzb2x2ZVNpdGVBc3NldHNGcm9tVml0ZU1hbmlmZXN0LmpzJztcblxuZXhwb3J0IHR5cGUgUGx1bWlsZVNpdGVWaXRlUGx1Z2luT3B0aW9ucyA9IHtcbiAgY2xpZW50RW50cnk6IHN0cmluZztcbiAgbWFuaWZlc3RQYXRoPzogc3RyaW5nO1xufTtcblxuLyoqIENvbmZpZ3VyZXMgZGlzdGluY3QgY2xpZW50LW1hbmlmZXN0IGFuZCBTU1Itc2VydmVyIFZpdGUgYnVpbGRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdW1pbGVTaXRlVml0ZVBsdWdpbihcbiAgb3B0aW9uczogUGx1bWlsZVNpdGVWaXRlUGx1Z2luT3B0aW9ucyxcbik6IFBsdWdpbk9wdGlvbiB7XG4gIGlmIChvcHRpb25zLmNsaWVudEVudHJ5LnRyaW0oKSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BsdW1pbGVTaXRlVml0ZVBsdWdpbiByZXF1aXJlcyBjbGllbnRFbnRyeScpO1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3BsdW1pbGUtc2l0ZScsXG4gICAgY29uZmlnKGNvbmZpZywgZW52aXJvbm1lbnQpIHtcbiAgICAgIGlmIChlbnZpcm9ubWVudC5pc1NzckJ1aWxkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYnVpbGQ6IHtcbiAgICAgICAgICAgIGNvcHlQdWJsaWNEaXI6IGZhbHNlLFxuICAgICAgICAgICAgbWFuaWZlc3Q6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gc2F0aXNmaWVzIFVzZXJDb25maWc7XG4gICAgICB9XG4gICAgICBjb25zdCBjb25maWd1cmVkSW5wdXQgPSBjb25maWcuYnVpbGQ/LnJvbGx1cE9wdGlvbnM/LmlucHV0O1xuICAgICAgaWYgKGNvbmZpZ3VyZWRJbnB1dCAhPSBudWxsICYmIGNvbmZpZ3VyZWRJbnB1dCAhPT0gb3B0aW9ucy5jbGllbnRFbnRyeSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1ZpdGUgUm9sbHVwIGlucHV0IGNvbmZsaWN0cyB3aXRoIHBsdW1pbGVTaXRlVml0ZVBsdWdpbiBjbGllbnRFbnRyeScsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBidWlsZDoge1xuICAgICAgICAgIGNvcHlQdWJsaWNEaXI6IHRydWUsXG4gICAgICAgICAgbWFuaWZlc3Q6IG9wdGlvbnMubWFuaWZlc3RQYXRoID8/ICcudml0ZS9tYW5pZmVzdC5qc29uJyxcbiAgICAgICAgICByb2xsdXBPcHRpb25zOiB7IGlucHV0OiBvcHRpb25zLmNsaWVudEVudHJ5IH0sXG4gICAgICAgIH0sXG4gICAgICB9IHNhdGlzZmllcyBVc2VyQ29uZmlnO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import type { SiteResolvedAssets } from '../node/types.js';
2
+ export type ViteManifestChunk = {
3
+ file: string;
4
+ css?: readonly string[];
5
+ imports?: readonly string[];
6
+ isEntry?: boolean;
7
+ isDynamicEntry?: boolean;
8
+ };
9
+ export type ResolveSiteAssetsOptions = {
10
+ clientEntry: string;
11
+ routeEntries: readonly string[];
12
+ };
13
+ export declare function resolveSiteAssetsFromViteManifest(manifest: Readonly<Record<string, ViteManifestChunk>>, options: ResolveSiteAssetsOptions): SiteResolvedAssets;
14
+ //# sourceMappingURL=resolveSiteAssetsFromViteManifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSiteAssetsFromViteManifest.d.ts","sourceRoot":"","sources":["../../../src/vite/resolveSiteAssetsFromViteManifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,CAAC;AAGF,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,EACrD,OAAO,EAAE,wBAAwB,GAChC,kBAAkB,CAkDpB"}
@@ -0,0 +1,81 @@
1
+ export function resolveSiteAssetsFromViteManifest(manifest, options) {
2
+ if (options.routeEntries.length === 0) {
3
+ throw new Error('Site asset resolution requires at least one route entry');
4
+ }
5
+ requireChunk(manifest, options.clientEntry);
6
+ options.routeEntries.forEach((key) => {
7
+ requireChunk(manifest, key);
8
+ });
9
+ const visited = new Set();
10
+ const visiting = new Set();
11
+ const stylesheets = [];
12
+ const modulePreloads = [];
13
+ const seenStylesheets = new Set();
14
+ const seenPreloads = new Set();
15
+ const visit = (key) => {
16
+ if (visited.has(key) || visiting.has(key))
17
+ return;
18
+ const chunk = requireChunk(manifest, key);
19
+ visiting.add(key);
20
+ visited.add(key);
21
+ const file = toPublicAsset(chunk.file);
22
+ if (key !== options.clientEntry &&
23
+ /\.(?:m?js|cjs)$/i.test(chunk.file) &&
24
+ !seenPreloads.has(file)) {
25
+ seenPreloads.add(file);
26
+ modulePreloads.push(file);
27
+ }
28
+ (chunk.css ?? []).forEach((css) => {
29
+ const publicCss = toPublicAsset(css);
30
+ if (!seenStylesheets.has(publicCss)) {
31
+ seenStylesheets.add(publicCss);
32
+ stylesheets.push(publicCss);
33
+ }
34
+ });
35
+ (chunk.imports ?? []).forEach(visit);
36
+ visiting.delete(key);
37
+ };
38
+ visit(options.clientEntry);
39
+ options.routeEntries.forEach(visit);
40
+ return {
41
+ stylesheets,
42
+ modulePreloads,
43
+ clientEntry: toPublicAsset(requireChunk(manifest, options.clientEntry).file),
44
+ };
45
+ }
46
+ function requireChunk(manifest, key) {
47
+ const chunk = manifest[key];
48
+ if (chunk == null) {
49
+ throw new Error(`Missing Vite manifest entry: ${key}`);
50
+ }
51
+ if (typeof chunk !== 'object' ||
52
+ typeof chunk.file !== 'string' ||
53
+ (chunk.css != null &&
54
+ (!Array.isArray(chunk.css) ||
55
+ chunk.css.some((value) => {
56
+ return typeof value !== 'string';
57
+ }))) ||
58
+ (chunk.imports != null &&
59
+ (!Array.isArray(chunk.imports) ||
60
+ chunk.imports.some((value) => {
61
+ return typeof value !== 'string';
62
+ })))) {
63
+ throw new Error(`Malformed Vite manifest entry: ${key}`);
64
+ }
65
+ return chunk;
66
+ }
67
+ function toPublicAsset(value) {
68
+ if (value === '' ||
69
+ value.startsWith('/') ||
70
+ value.includes('\\') ||
71
+ value.includes('?') ||
72
+ value.includes('#') ||
73
+ /^[a-z][a-z\d+.-]*:/i.test(value) ||
74
+ value.split('/').some((segment) => {
75
+ return segment === '..';
76
+ })) {
77
+ throw new Error(`Invalid Vite manifest asset: ${value}`);
78
+ }
79
+ return `/${value}`;
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZVNpdGVBc3NldHNGcm9tVml0ZU1hbmlmZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZpdGUvcmVzb2x2ZVNpdGVBc3NldHNGcm9tVml0ZU1hbmlmZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdCQSxNQUFNLFVBQVUsaUNBQWlDLENBQy9DLFFBQXFELEVBQ3JELE9BQWlDO0lBRWpDLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1QyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ25DLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDbkMsTUFBTSxXQUFXLEdBQWEsRUFBRSxDQUFDO0lBQ2pDLE1BQU0sY0FBYyxHQUFhLEVBQUUsQ0FBQztJQUNwQyxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzFDLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFdkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFXLEVBQVEsRUFBRTtRQUNsQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPO1FBQ2xELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7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LENBQUMsS0FBYTtJQUNsQyxJQUNFLEtBQUssS0FBSyxFQUFFO1FBQ1osS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDckIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDcEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDbkIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDbkIscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNqQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2hDLE9BQU8sT0FBTyxLQUFLLElBQUksQ0FBQztRQUMxQixDQUFDLENBQUMsRUFDRixDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNpdGVSZXNvbHZlZEFzc2V0cyB9IGZyb20gJy4uL25vZGUvdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSBWaXRlTWFuaWZlc3RDaHVuayA9IHtcbiAgZmlsZTogc3RyaW5nO1xuICBjc3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgaW1wb3J0cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICBpc0VudHJ5PzogYm9vbGVhbjtcbiAgaXNEeW5hbWljRW50cnk/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgUmVzb2x2ZVNpdGVBc3NldHNPcHRpb25zID0ge1xuICBjbGllbnRFbnRyeTogc3RyaW5nO1xuICByb3V0ZUVudHJpZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufTtcblxuLyoqIFJlc29sdmVzIG9yZGVyZWQgcHVibGljIGFzc2V0cyBmcm9tIGEgVml0ZSBjbGllbnQgbWFuaWZlc3Qgd2l0aG91dCBJL08uICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNpdGVBc3NldHNGcm9tVml0ZU1hbmlmZXN0KFxuICBtYW5pZmVzdDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgVml0ZU1hbmlmZXN0Q2h1bms+PixcbiAgb3B0aW9uczogUmVzb2x2ZVNpdGVBc3NldHNPcHRpb25zLFxuKTogU2l0ZVJlc29sdmVkQXNzZXRzIHtcbiAgaWYgKG9wdGlvbnMucm91dGVFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2l0ZSBhc3NldCByZXNvbHV0aW9uIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSByb3V0ZSBlbnRyeScpO1xuICB9XG4gIHJlcXVpcmVDaHVuayhtYW5pZmVzdCwgb3B0aW9ucy5jbGllbnRFbnRyeSk7XG4gIG9wdGlvbnMucm91dGVFbnRyaWVzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHJlcXVpcmVDaHVuayhtYW5pZmVzdCwga2V5KTtcbiAgfSk7XG5cbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB2aXNpdGluZyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBzdHlsZXNoZWV0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgbW9kdWxlUHJlbG9hZHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNlZW5TdHlsZXNoZWV0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBzZWVuUHJlbG9hZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCB2aXNpdCA9IChrZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmICh2aXNpdGVkLmhhcyhrZXkpIHx8IHZpc2l0aW5nLmhhcyhrZXkpKSByZXR1cm47XG4gICAgY29uc3QgY2h1bmsgPSByZXF1aXJlQ2h1bmsobWFuaWZlc3QsIGtleSk7XG4gICAgdmlzaXRpbmcuYWRkKGtleSk7XG4gICAgdmlzaXRlZC5hZGQoa2V5KTtcbiAgICBjb25zdCBmaWxlID0gdG9QdWJsaWNBc3NldChjaHVuay5maWxlKTtcbiAgICBpZiAoXG4gICAgICBrZXkgIT09IG9wdGlvbnMuY2xpZW50RW50cnkgJiZcbiAgICAgIC9cXC4oPzptP2pzfGNqcykkL2kudGVzdChjaHVuay5maWxlKSAmJlxuICAgICAgIXNlZW5QcmVsb2Fkcy5oYXMoZmlsZSlcbiAgICApIHtcbiAgICAgIHNlZW5QcmVsb2Fkcy5hZGQoZmlsZSk7XG4gICAgICBtb2R1bGVQcmVsb2Fkcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgICAoY2h1bmsuY3NzID8/IFtdKS5mb3JFYWNoKChjc3MpID0+IHtcbiAgICAgIGNvbnN0IHB1YmxpY0NzcyA9IHRvUHVibGljQXNzZXQoY3NzKTtcbiAgICAgIGlmICghc2VlblN0eWxlc2hlZXRzLmhhcyhwdWJsaWNDc3MpKSB7XG4gICAgICAgIHNlZW5TdHlsZXNoZWV0cy5hZGQocHVibGljQ3NzKTtcbiAgICAgICAgc3R5bGVzaGVldHMucHVzaChwdWJsaWNDc3MpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIChjaHVuay5pbXBvcnRzID8/IFtdKS5mb3JFYWNoKHZpc2l0KTtcbiAgICB2aXNpdGluZy5kZWxldGUoa2V5KTtcbiAgfTtcblxuICB2aXNpdChvcHRpb25zLmNsaWVudEVudHJ5KTtcbiAgb3B0aW9ucy5yb3V0ZUVudHJpZXMuZm9yRWFjaCh2aXNpdCk7XG4gIHJldHVybiB7XG4gICAgc3R5bGVzaGVldHMsXG4gICAgbW9kdWxlUHJlbG9hZHMsXG4gICAgY2xpZW50RW50cnk6IHRvUHVibGljQXNzZXQoXG4gICAgICByZXF1aXJlQ2h1bmsobWFuaWZlc3QsIG9wdGlvbnMuY2xpZW50RW50cnkpLmZpbGUsXG4gICAgKSxcbiAgfTtcbn1cblxuLyoqIFJldHVybnMgYSB2YWxpZGF0ZWQgbWFuaWZlc3QgY2h1bmsgb3IgcmVwb3J0cyB0aGUgbWlzc2luZyBlbnRyeS4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVDaHVuayhcbiAgbWFuaWZlc3Q6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFZpdGVNYW5pZmVzdENodW5rPj4sXG4gIGtleTogc3RyaW5nLFxuKTogVml0ZU1hbmlmZXN0Q2h1bmsge1xuICBjb25zdCBjaHVuayA9IG1hbmlmZXN0W2tleV07XG4gIGlmIChjaHVuayA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFZpdGUgbWFuaWZlc3QgZW50cnk6ICR7a2V5fWApO1xuICB9XG4gIGlmIChcbiAgICB0eXBlb2YgY2h1bmsgIT09ICdvYmplY3QnIHx8XG4gICAgdHlwZW9mIGNodW5rLmZpbGUgIT09ICdzdHJpbmcnIHx8XG4gICAgKGNodW5rLmNzcyAhPSBudWxsICYmXG4gICAgICAoIUFycmF5LmlzQXJyYXkoY2h1bmsuY3NzKSB8fFxuICAgICAgICBjaHVuay5jc3Muc29tZSgodmFsdWUpID0+IHtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJztcbiAgICAgICAgfSkpKSB8fFxuICAgIChjaHVuay5pbXBvcnRzICE9IG51bGwgJiZcbiAgICAgICghQXJyYXkuaXNBcnJheShjaHVuay5pbXBvcnRzKSB8fFxuICAgICAgICBjaHVuay5pbXBvcnRzLnNvbWUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZyc7XG4gICAgICAgIH0pKSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNYWxmb3JtZWQgVml0ZSBtYW5pZmVzdCBlbnRyeTogJHtrZXl9YCk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vKiogQ29udmVydHMgYSBWaXRlIGZpbGUgbmFtZSBpbnRvIGEgc2FmZSByb290LXJlbGF0aXZlIHB1YmxpYyBhc3NldCBwYXRoLiAqL1xuZnVuY3Rpb24gdG9QdWJsaWNBc3NldCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKFxuICAgIHZhbHVlID09PSAnJyB8fFxuICAgIHZhbHVlLnN0YXJ0c1dpdGgoJy8nKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCdcXFxcJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnPycpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJyMnKSB8fFxuICAgIC9eW2Etel1bYS16XFxkKy4tXSo6L2kudGVzdCh2YWx1ZSkgfHxcbiAgICB2YWx1ZS5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHtcbiAgICAgIHJldHVybiBzZWdtZW50ID09PSAnLi4nO1xuICAgIH0pXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBWaXRlIG1hbmlmZXN0IGFzc2V0OiAke3ZhbHVlfWApO1xuICB9XG4gIHJldHVybiBgLyR7dmFsdWV9YDtcbn1cbiJdfQ==