@rdfc/js-runner 2.0.0-alpha.10 → 2.0.0-alpha.11
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/.editorconfig +9 -0
- package/examples/echo/.idea/echo.iml +9 -0
- package/examples/echo/.idea/misc.xml +6 -0
- package/{.idea → examples/echo/.idea}/modules.xml +1 -1
- package/examples/echo/.idea/vcs.xml +7 -0
- package/examples/echo/.swls/config.json +1 -0
- package/examples/echo/index.ttl +3 -0
- package/examples/echo/minimal.ttl +90 -0
- package/examples/echo/shacl.ttl +9 -0
- package/examples/echo/shape.ttl +1339 -0
- package/examples/echo/test.ttl +11 -0
- package/examples/echo/untitled:/types/MyType.ttl +0 -0
- package/file:/home/silvius/Projects/mumo-pipeline/ldes/http_3A_2F_2Fdata.mumo.be_2Fstreams_2Fnodes_2Fdefault/root/index.trig +3 -0
- package/ldes/http_3A_2F_2Fdata.mumo.be_2Fstreams_2Fnodes_2Fdefault/root/index.trig +3 -0
- package/lib/client.js +2 -2
- package/lib/testUtils.d.ts +8 -8
- package/lib/testUtils.js +32 -32
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/minimal.ttl +99 -0
- package/package.json +1 -1
- package/src/client.ts +15 -15
- package/src/testUtils.ts +140 -140
- package/.idea/LNKD.tech Editor.xml +0 -194
- package/.idea/codeStyles/Project.xml +0 -52
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/.idea/js-runner.iml +0 -12
- package/.idea/vcs.xml +0 -6
- package/dist/args.d.ts +0 -4
- package/dist/args.js +0 -58
- package/dist/connectors/file.d.ts +0 -15
- package/dist/connectors/file.js +0 -89
- package/dist/connectors/http.d.ts +0 -14
- package/dist/connectors/http.js +0 -82
- package/dist/connectors/kafka.d.ts +0 -48
- package/dist/connectors/kafka.js +0 -68
- package/dist/connectors/ws.d.ts +0 -10
- package/dist/connectors/ws.js +0 -72
- package/dist/connectors.d.ts +0 -73
- package/dist/connectors.js +0 -168
- package/dist/index.cjs +0 -732
- package/dist/index.d.ts +0 -42
- package/dist/index.js +0 -83
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/util.d.ts +0 -71
- package/dist/util.js +0 -92
|
File without changes
|
package/lib/client.js
CHANGED
|
@@ -38,6 +38,6 @@ export async function start(addr, uri) {
|
|
|
38
38
|
logger.info('All processors are finished');
|
|
39
39
|
stream.end();
|
|
40
40
|
client.close();
|
|
41
|
-
process.exit(0);
|
|
41
|
+
setTimeout(() => process.exit(0), 500);
|
|
42
42
|
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQWlCLE1BQU0sYUFBYSxDQUFBO0FBQ3pELE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQTtBQUM3QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFakMsTUFBTSxDQUFDLEtBQUssVUFBVSxLQUFLLENBQUMsSUFBWSxFQUFFLEdBQVc7SUFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQTtJQUV4RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ2xDLFVBQVUsRUFBRTtZQUNWLElBQUksWUFBWSxDQUFDO2dCQUNmLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUM7Z0JBQ3RCLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzthQUNwQyxDQUFDO1NBQ0g7S0FDRixDQUFDLENBQUE7SUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7SUFFL0IsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsQ0FBQTtJQUM1QyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUV4RCxNQUFNLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUVyQyxJQUFJLGFBQXVDLENBQUE7SUFDM0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQ2hFO0lBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNaLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLE1BQU0sR0FBRyxHQUFrQixLQUFLLENBQUE7WUFDaEMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNyQyxDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUNwQyxDQUFDO1lBRUQsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDckMsQ0FBQztRQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDOUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUVOLE1BQU0sZUFBZSxDQUFBO0lBRXJCLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtJQUMxQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDWixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDZCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JwYyBmcm9tICdAZ3JwYy9ncnBjLWpzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCdcbmltcG9ydCB7IFJ1bm5lckNsaWVudCwgUnVubmVyTWVzc2FnZSB9IGZyb20gJ0ByZGZjL3Byb3RvJ1xuaW1wb3J0IHdpbnN0b24gZnJvbSAnd2luc3RvbidcbmltcG9ydCB7IFJwY1RyYW5zcG9ydCB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgUnVubmVyIH0gZnJvbSAnLi9ydW5uZXInXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydChhZGRyOiBzdHJpbmcsIHVyaTogc3RyaW5nKSB7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBSdW5uZXJDbGllbnQoYWRkciwgZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVJbnNlY3VyZSgpKVxuXG4gIGNvbnN0IGxvZ2dlciA9IHdpbnN0b24uY3JlYXRlTG9nZ2VyKHtcbiAgICB0cmFuc3BvcnRzOiBbXG4gICAgICBuZXcgUnBjVHJhbnNwb3J0KHtcbiAgICAgICAgZW50aXRpZXM6IFt1cmksICdjbGknXSxcbiAgICAgICAgc3RyZWFtOiBjbGllbnQubG9nU3RyZWFtKCgpID0+IHsgfSksXG4gICAgICB9KSxcbiAgICBdLFxuICB9KVxuXG4gIGNvbnN0IHN0cmVhbSA9IGNsaWVudC5jb25uZWN0KClcblxuICBsb2dnZXIuaW5mbygnQ29ubmVjdGVkIHdpdGggc2VydmVyICcgKyBhZGRyKVxuICBjb25zdCB3cml0YWJsZSA9IHByb21pc2lmeShzdHJlYW0ud3JpdGUuYmluZChzdHJlYW0pKVxuICBjb25zdCBydW5uZXIgPSBuZXcgUnVubmVyKGNsaWVudCwgd3JpdGFibGUsIHVyaSwgbG9nZ2VyKVxuXG4gIGF3YWl0IHdyaXRhYmxlKHsgaWRlbnRpZnk6IHsgdXJpIH0gfSlcblxuICBsZXQgcHJvY2Vzc29yc0VuZCE6ICh2OiB1bmtub3duKSA9PiB1bmtub3duXG4gIGNvbnN0IHByb2Nlc3NvcnNFbmRlZCA9IG5ldyBQcm9taXNlKChyZXMpID0+IChwcm9jZXNzb3JzRW5kID0gcmVzKSlcbiAgICA7IChhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgICBjb25zdCBtc2c6IFJ1bm5lck1lc3NhZ2UgPSBjaHVua1xuICAgICAgICBpZiAobXNnLnByb2MpIHtcbiAgICAgICAgICBhd2FpdCBydW5uZXIuYWRkUHJvY2Vzc29yKG1zZy5wcm9jKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtc2cuc3RhcnQpIHtcbiAgICAgICAgICBydW5uZXIuc3RhcnQoKS50aGVuKHByb2Nlc3NvcnNFbmQpXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBydW5uZXIuaGFuZGxlT3JjaE1lc3NhZ2UobXNnKVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZXJyb3IoJ1N0cmVhbSBlbmRlZCcpXG4gICAgfSkoKVxuXG4gIGF3YWl0IHByb2Nlc3NvcnNFbmRlZFxuXG4gIGxvZ2dlci5pbmZvKCdBbGwgcHJvY2Vzc29ycyBhcmUgZmluaXNoZWQnKVxuICBzdHJlYW0uZW5kKClcbiAgY2xpZW50LmNsb3NlKClcbiAgc2V0VGltZW91dCgoKSA9PiBwcm9jZXNzLmV4aXQoMCksIDUwMClcbn1cbiJdfQ==
|
package/lib/testUtils.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { DataChunk, RunnerClient } from
|
|
2
|
-
import { ClientReadableStream } from
|
|
3
|
-
import winston from
|
|
4
|
-
import { WriterInstance } from
|
|
5
|
-
import { ReaderInstance } from
|
|
6
|
-
import { Processor } from
|
|
7
|
-
import { FullProc } from
|
|
8
|
-
import { Quad } from
|
|
1
|
+
import { DataChunk, RunnerClient } from '@rdfc/proto';
|
|
2
|
+
import { ClientReadableStream } from '@grpc/grpc-js';
|
|
3
|
+
import winston from 'winston';
|
|
4
|
+
import { WriterInstance } from './writer.js';
|
|
5
|
+
import { ReaderInstance } from './reader.js';
|
|
6
|
+
import { Processor } from './processor.js';
|
|
7
|
+
import { FullProc } from './runner.js';
|
|
8
|
+
import { Quad } from '@rdfjs/types';
|
|
9
9
|
export declare function getProcessorShape(baseIRI?: string): Promise<import("rdf-lens").Shapes>;
|
|
10
10
|
export declare class TestClient extends RunnerClient {
|
|
11
11
|
next: (stream: ClientReadableStream<DataChunk>) => unknown;
|
package/lib/testUtils.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { RunnerClient } from
|
|
2
|
-
import * as grpc from
|
|
3
|
-
import { ClientReadableStreamImpl } from
|
|
4
|
-
import { extractShapes } from
|
|
5
|
-
import { NamedNode, Parser, Writer } from
|
|
6
|
-
import { readFile } from
|
|
7
|
-
import winston, { createLogger } from
|
|
8
|
-
import { WriterInstance } from
|
|
9
|
-
import { ReaderInstance } from
|
|
10
|
-
import { Runner } from
|
|
11
|
-
import { createTermNamespace } from
|
|
12
|
-
import { expect } from
|
|
13
|
-
export async function getProcessorShape(baseIRI = process.cwd() +
|
|
14
|
-
const configFile = await readFile(baseIRI, { encoding:
|
|
1
|
+
import { RunnerClient } from '@rdfc/proto';
|
|
2
|
+
import * as grpc from '@grpc/grpc-js';
|
|
3
|
+
import { ClientReadableStreamImpl } from './reexports.js';
|
|
4
|
+
import { extractShapes } from 'rdf-lens';
|
|
5
|
+
import { NamedNode, Parser, Writer } from 'n3';
|
|
6
|
+
import { readFile } from 'fs/promises';
|
|
7
|
+
import winston, { createLogger } from 'winston';
|
|
8
|
+
import { WriterInstance } from './writer.js';
|
|
9
|
+
import { ReaderInstance } from './reader.js';
|
|
10
|
+
import { Runner } from './runner.js';
|
|
11
|
+
import { createTermNamespace } from '@treecg/types';
|
|
12
|
+
import { expect } from 'vitest';
|
|
13
|
+
export async function getProcessorShape(baseIRI = process.cwd() + '/node_modules/@rdfc/js-runner/index.ttl') {
|
|
14
|
+
const configFile = await readFile(baseIRI, { encoding: 'utf8' });
|
|
15
15
|
const configQuads = new Parser().parse(configFile);
|
|
16
16
|
const shapes = extractShapes(configQuads);
|
|
17
17
|
return shapes;
|
|
@@ -19,7 +19,7 @@ export async function getProcessorShape(baseIRI = process.cwd() + "/node_modules
|
|
|
19
19
|
export class TestClient extends RunnerClient {
|
|
20
20
|
next;
|
|
21
21
|
constructor() {
|
|
22
|
-
super(
|
|
22
|
+
super('localhost:5400', grpc.credentials.createInsecure());
|
|
23
23
|
}
|
|
24
24
|
nextStream() {
|
|
25
25
|
return new Promise((res) => (this.next = res));
|
|
@@ -38,10 +38,10 @@ export async function one(iter) {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
export const client = new TestClient();
|
|
41
|
-
export const uri =
|
|
41
|
+
export const uri = 'someUri';
|
|
42
42
|
export const logger = createLogger({
|
|
43
43
|
transports: new winston.transports.Console({
|
|
44
|
-
level: process.env[
|
|
44
|
+
level: process.env['DEBUG'] || 'info',
|
|
45
45
|
}),
|
|
46
46
|
});
|
|
47
47
|
export function createWriter(iri = uri) {
|
|
@@ -85,12 +85,12 @@ const shapeQuads = `
|
|
|
85
85
|
sh:datatype xsd:string;
|
|
86
86
|
].
|
|
87
87
|
`;
|
|
88
|
-
const OWL = createTermNamespace(
|
|
88
|
+
const OWL = createTermNamespace('http://www.w3.org/2002/07/owl#', 'imports');
|
|
89
89
|
const processorShapes = extractShapes(new Parser().parse(shapeQuads));
|
|
90
|
-
const base =
|
|
90
|
+
const base = 'https://w3id.org/rdf-connect#';
|
|
91
91
|
export async function importFile(file) {
|
|
92
92
|
const done = new Set();
|
|
93
|
-
const todo = [new URL(
|
|
93
|
+
const todo = [new URL('file://' + file)];
|
|
94
94
|
const quads = [];
|
|
95
95
|
let item = todo.pop();
|
|
96
96
|
while (item !== undefined) {
|
|
@@ -99,10 +99,10 @@ export async function importFile(file) {
|
|
|
99
99
|
continue;
|
|
100
100
|
}
|
|
101
101
|
done.add(item.toString());
|
|
102
|
-
if (item.protocol !==
|
|
103
|
-
throw
|
|
102
|
+
if (item.protocol !== 'file:') {
|
|
103
|
+
throw 'No supported protocol ' + item.protocol;
|
|
104
104
|
}
|
|
105
|
-
const txt = await readFile(item.pathname, { encoding:
|
|
105
|
+
const txt = await readFile(item.pathname, { encoding: 'utf8' });
|
|
106
106
|
const extras = new Parser({ baseIRI: item.toString() }).parse(txt);
|
|
107
107
|
for (const o of extras
|
|
108
108
|
.filter((x) => x.subject.value === item?.toString() &&
|
|
@@ -115,9 +115,9 @@ export async function importFile(file) {
|
|
|
115
115
|
}
|
|
116
116
|
return quads;
|
|
117
117
|
}
|
|
118
|
-
export async function getProc(config, ty, configLocation, uri =
|
|
118
|
+
export async function getProc(config, ty, configLocation, uri = 'http://example.com/ns#processor') {
|
|
119
119
|
const configQuads = await importFile(configLocation);
|
|
120
|
-
const procConfig = processorShapes.lenses[
|
|
120
|
+
const procConfig = processorShapes.lenses['JsProcessorShape'].execute({
|
|
121
121
|
id: new NamedNode(base + ty),
|
|
122
122
|
quads: configQuads,
|
|
123
123
|
});
|
|
@@ -125,26 +125,26 @@ export async function getProc(config, ty, configLocation, uri = "http://example.
|
|
|
125
125
|
const write = async (x) => {
|
|
126
126
|
msgs.push(x);
|
|
127
127
|
};
|
|
128
|
-
const runner = new Runner(new TestClient(), write,
|
|
128
|
+
const runner = new Runner(new TestClient(), write, 'http://example.com/ns#', logger);
|
|
129
129
|
configQuads.push(...new Parser().parse(config));
|
|
130
130
|
await runner.handleOrchMessage({
|
|
131
131
|
pipeline: new Writer().quadsToString(configQuads),
|
|
132
132
|
});
|
|
133
133
|
const proc = await runner.addProcessor({
|
|
134
134
|
config: JSON.stringify(procConfig),
|
|
135
|
-
arguments:
|
|
135
|
+
arguments: '',
|
|
136
136
|
uri,
|
|
137
137
|
});
|
|
138
138
|
return proc;
|
|
139
139
|
}
|
|
140
140
|
export async function checkProcDefinition(file, n) {
|
|
141
141
|
const quads = await importFile(file);
|
|
142
|
-
const procConfig = (processorShapes.lenses[
|
|
142
|
+
const procConfig = (processorShapes.lenses['JsProcessorShape'].execute({
|
|
143
143
|
id: new NamedNode(base + n),
|
|
144
144
|
quads: quads,
|
|
145
145
|
}));
|
|
146
|
-
expect(procConfig.file, n +
|
|
147
|
-
expect(procConfig.location, n +
|
|
148
|
-
expect(procConfig.clazz, n +
|
|
146
|
+
expect(procConfig.file, n + ' has file').toBeDefined();
|
|
147
|
+
expect(procConfig.location, n + ' has location').toBeDefined();
|
|
148
|
+
expect(procConfig.clazz, n + ' has clazz').toBeDefined();
|
|
149
149
|
}
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3RVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBRXRDLE9BQU8sRUFBRSx3QkFBd0IsRUFBdUIsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFMUMsT0FBTyxFQUFZLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUU1QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVoQyxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNuQyxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLHlDQUF5QztJQUVuRSxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNqRSxNQUFNLFdBQVcsR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLENB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QU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLFlBQVksQ0FBSTtRQUN0QyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDbEMsU0FBUyxFQUFFLEVBQUU7UUFDYixHQUFHO0tBQ04sQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsSUFBWSxFQUFFLENBQVM7SUFDN0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsTUFBTSxVQUFVLEdBQW9ELENBQ2hFLGVBQWUsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDL0MsRUFBRSxFQUFFLElBQUksU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDM0IsS0FBSyxFQUFFLEtBQUs7S0FDZixDQUFDLENBQ0wsQ0FBQztJQUNGLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2RCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhQ2h1bmssIFJ1bm5lckNsaWVudCB9IGZyb20gXCJAcmRmYy9wcm90b1wiO1xuaW1wb3J0ICogYXMgZ3JwYyBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgQ2xpZW50UmVhZGFibGVTdHJlYW0gfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgQ2xpZW50UmVhZGFibGVTdHJlYW1JbXBsLCBPcmNoZXN0cmF0b3JNZXNzYWdlIH0gZnJvbSBcIi4vcmVleHBvcnRzXCI7XG5pbXBvcnQgeyBleHRyYWN0U2hhcGVzIH0gZnJvbSBcInJkZi1sZW5zXCI7XG5pbXBvcnQgeyBOYW1lZE5vZGUsIFBhcnNlciwgV3JpdGVyIH0gZnJvbSBcIm4zXCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHdpbnN0b24sIHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIndpbnN0b25cIjtcbmltcG9ydCB7IFdyaXRlckluc3RhbmNlIH0gZnJvbSBcIi4vd3JpdGVyXCI7XG5pbXBvcnQgeyBSZWFkZXJJbnN0YW5jZSB9IGZyb20gXCIuL3JlYWRlclwiO1xuaW1wb3J0IHsgUHJvY2Vzc29yIH0gZnJvbSBcIi4vcHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBGdWxsUHJvYywgUnVubmVyIH0gZnJvbSBcIi4vcnVubmVyXCI7XG5pbXBvcnQgeyBRdWFkLCBUZXJtIH0gZnJvbSBcIkByZGZqcy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlVGVybU5hbWVzcGFjZSB9IGZyb20gXCJAdHJlZWNnL3R5cGVzXCI7XG5pbXBvcnQgeyBleHBlY3QgfSBmcm9tIFwidml0ZXN0XCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm9jZXNzb3JTaGFwZShcbiAgICBiYXNlSVJJID0gcHJvY2Vzcy5jd2QoKSArIFwiL25vZGVfbW9kdWxlcy9AcmRmYy9qcy1ydW5uZXIvaW5kZXgudHRsXCIsXG4pIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gYXdhaXQgcmVhZEZpbGUoYmFzZUlSSSwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgY29uc3QgY29uZmlnUXVhZHMgPSBuZXcgUGFyc2VyKCkucGFyc2UoY29uZmlnRmlsZSk7XG4gICAgY29uc3Qgc2hhcGVzID0gZXh0cmFjdFNoYXBlcyhjb25maWdRdWFkcyk7XG5cbiAgICByZXR1cm4gc2hhcGVzO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdENsaWVudCBleHRlbmRzIFJ1bm5lckNsaWVudCB7XG4gICAgbmV4dDogKHN0cmVhbTogQ2xpZW50UmVhZGFibGVTdHJlYW08RGF0YUNodW5rPikgPT4gdW5rbm93bjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImxvY2FsaG9zdDo1NDAwXCIsIGdycGMuY3JlZGVudGlhbHMuY3JlYXRlSW5zZWN1cmUoKSk7XG4gICAgfVxuXG4gICAgbmV4dFN0cmVhbSgpOiBQcm9taXNlPENsaWVudFJlYWRhYmxlU3RyZWFtPERhdGFDaHVuaz4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMpID0+ICh0aGlzLm5leHQgPSByZXMpKTtcbiAgICB9XG5cbiAgICByZWNlaXZlU3RyZWFtTWVzc2FnZSgpOiBDbGllbnRSZWFkYWJsZVN0cmVhbTxEYXRhQ2h1bms+IHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IENsaWVudFJlYWRhYmxlU3RyZWFtSW1wbDxEYXRhQ2h1bms+KChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGEgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmV4dChzdHJlYW0pO1xuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZTxUPihpdGVyOiBBc3luY0l0ZXJhYmxlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGl0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgY2xpZW50ID0gbmV3IFRlc3RDbGllbnQoKTtcbmV4cG9ydCBjb25zdCB1cmkgPSBcInNvbWVVcmlcIjtcbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoe1xuICAgIHRyYW5zcG9ydHM6IG5ldyB3aW5zdG9uLnRyYW5zcG9ydHMuQ29uc29sZSh7XG4gICAgICAgIGxldmVsOiBwcm9jZXNzLmVudltcIkRFQlVHXCJdIHx8IFwiaW5mb1wiLFxuICAgIH0pLFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXcml0ZXIoaXJpID0gdXJpKTogW1dyaXRlckluc3RhbmNlLCBSZWFkZXJJbnN0YW5jZV0ge1xuICAgIGNvbnN0IHJlYWRlciA9IGNyZWF0ZVJlYWRlcihpcmkpO1xuICAgIGNvbnN0IHdyaXRlU3RyZWFtID0gbmV3IFdyaXRlckluc3RhbmNlKFxuICAgICAgICBpcmksXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgYXN5bmMgKG1zZykgPT4ge1xuICAgICAgICAgICAgaWYgKG1zZy5tc2cpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIuaGFuZGxlTXNnKG1zZy5tc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1zZy5jbG9zZSkge1xuICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsb2dnZXIsXG4gICAgKTtcbiAgICByZXR1cm4gW3dyaXRlU3RyZWFtLCByZWFkZXJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhZGVyKGlyaSA9IHVyaSk6IFJlYWRlckluc3RhbmNlIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUmVhZGVySW5zdGFuY2UoaXJpLCBjbGllbnQsIGxvZ2dlcik7XG4gICAgcmV0dXJuIHJlYWRlcjtcbn1cblxuY29uc3Qgc2hhcGVRdWFkcyA9IGBcbkBwcmVmaXggcmRmYzogPGh0dHBzOi8vdzNpZC5vcmcvcmRmLWNvbm5lY3QjPi5cbkBwcmVmaXggeHNkOiA8aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjPi5cbkBwcmVmaXggc2g6IDxodHRwOi8vd3d3LnczLm9yZy9ucy9zaGFjbCM+LlxuWyBdIGEgc2g6Tm9kZVNoYXBlO1xuICBzaDp0YXJnZXRDbGFzcyA8SnNQcm9jZXNzb3JTaGFwZT47XG4gIHNoOnByb3BlcnR5IFtcbiAgICBzaDpwYXRoIHJkZmM6ZW50cnlwb2ludDtcbiAgICBzaDpuYW1lIFwibG9jYXRpb25cIjtcbiAgICBzaDptaW5Db3VudCAxO1xuICAgIHNoOm1heENvdW50IDE7XG4gICAgc2g6ZGF0YXR5cGUgeHNkOnN0cmluZztcbiAgXSwgW1xuICAgIHNoOnBhdGggcmRmYzpmaWxlO1xuICAgIHNoOm5hbWUgXCJmaWxlXCI7XG4gICAgc2g6bWluQ291bnQgMTtcbiAgICBzaDptYXhDb3VudCAxO1xuICAgIHNoOmRhdGF0eXBlIHhzZDpzdHJpbmc7XG4gIF0sIFtcbiAgICBzaDpwYXRoIHJkZmM6Y2xhc3M7XG4gICAgc2g6bmFtZSBcImNsYXp6XCI7XG4gICAgc2g6bWF4Q291bnQgMTtcbiAgICBzaDpkYXRhdHlwZSB4c2Q6c3RyaW5nO1xuICBdLlxuYDtcbmNvbnN0IE9XTCA9IGNyZWF0ZVRlcm1OYW1lc3BhY2UoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAyLzA3L293bCNcIiwgXCJpbXBvcnRzXCIpO1xuY29uc3QgcHJvY2Vzc29yU2hhcGVzID0gZXh0cmFjdFNoYXBlcyhuZXcgUGFyc2VyKCkucGFyc2Uoc2hhcGVRdWFkcykpO1xuY29uc3QgYmFzZSA9IFwiaHR0cHM6Ly93M2lkLm9yZy9yZGYtY29ubmVjdCNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEZpbGUoZmlsZTogc3RyaW5nKTogUHJvbWlzZTxRdWFkW10+IHtcbiAgICBjb25zdCBkb25lID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgdG9kbyA9IFtuZXcgVVJMKFwiZmlsZTovL1wiICsgZmlsZSldO1xuICAgIGNvbnN0IHF1YWRzOiBRdWFkW10gPSBbXTtcblxuICAgIGxldCBpdGVtID0gdG9kby5wb3AoKTtcbiAgICB3aGlsZSAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChkb25lLmhhcyhpdGVtLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICBpdGVtID0gdG9kby5wb3AoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGRvbmUuYWRkKGl0ZW0udG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChpdGVtLnByb3RvY29sICE9PSBcImZpbGU6XCIpIHtcbiAgICAgICAgICAgIHRocm93IFwiTm8gc3VwcG9ydGVkIHByb3RvY29sIFwiICsgaXRlbS5wcm90b2NvbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHR4dCA9IGF3YWl0IHJlYWRGaWxlKGl0ZW0ucGF0aG5hbWUsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuICAgICAgICBjb25zdCBleHRyYXMgPSBuZXcgUGFyc2VyKHsgYmFzZUlSSTogaXRlbS50b1N0cmluZygpIH0pLnBhcnNlKHR4dCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBvIG9mIGV4dHJhc1xuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICAgICAgICAgeC5zdWJqZWN0LnZhbHVlID09PSBpdGVtPy50b1N0cmluZygpICYmXG4gICAgICAgICAgICAgICAgICAgIHgucHJlZGljYXRlLmVxdWFscyhPV0wuaW1wb3J0cyksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKCh4KSA9PiB4Lm9iamVjdC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRvZG8ucHVzaChuZXcgVVJMKG8pKTtcbiAgICAgICAgfVxuICAgICAgICBxdWFkcy5wdXNoKC4uLmV4dHJhcyk7XG5cbiAgICAgICAgaXRlbSA9IHRvZG8ucG9wKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1YWRzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHJvYzxUIGV4dGVuZHMgUHJvY2Vzc29yPHVua25vd24+PihcbiAgICBjb25maWc6IHN0cmluZyxcbiAgICB0eTogc3RyaW5nLFxuICAgIGNvbmZpZ0xvY2F0aW9uOiBzdHJpbmcsXG4gICAgdXJpID0gXCJodHRwOi8vZXhhbXBsZS5jb20vbnMjcHJvY2Vzc29yXCIsXG4pOiBQcm9taXNlPEZ1bGxQcm9jPFQ+PiB7XG4gICAgY29uc3QgY29uZmlnUXVhZHMgPSBhd2FpdCBpbXBvcnRGaWxlKGNvbmZpZ0xvY2F0aW9uKTtcbiAgICBjb25zdCBwcm9jQ29uZmlnID0gcHJvY2Vzc29yU2hhcGVzLmxlbnNlc1tcIkpzUHJvY2Vzc29yU2hhcGVcIl0uZXhlY3V0ZSh7XG4gICAgICAgIGlkOiBuZXcgTmFtZWROb2RlKGJhc2UgKyB0eSksXG4gICAgICAgIHF1YWRzOiBjb25maWdRdWFkcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1zZ3M6IE9yY2hlc3RyYXRvck1lc3NhZ2VbXSA9IFtdO1xuICAgIGNvbnN0IHdyaXRlID0gYXN5bmMgKHg6IE9yY2hlc3RyYXRvck1lc3NhZ2UpID0+IHtcbiAgICAgICAgbXNncy5wdXNoKHgpO1xuICAgIH07XG4gICAgY29uc3QgcnVubmVyID0gbmV3IFJ1bm5lcihcbiAgICAgICAgbmV3IFRlc3RDbGllbnQoKSxcbiAgICAgICAgd3JpdGUsXG4gICAgICAgIFwiaHR0cDovL2V4YW1wbGUuY29tL25zI1wiLFxuICAgICAgICBsb2dnZXIsXG4gICAgKTtcbiAgICBjb25maWdRdWFkcy5wdXNoKC4uLm5ldyBQYXJzZXIoKS5wYXJzZShjb25maWcpKTtcbiAgICBhd2FpdCBydW5uZXIuaGFuZGxlT3JjaE1lc3NhZ2Uoe1xuICAgICAgICBwaXBlbGluZTogbmV3IFdyaXRlcigpLnF1YWRzVG9TdHJpbmcoY29uZmlnUXVhZHMpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvYyA9IGF3YWl0IHJ1bm5lci5hZGRQcm9jZXNzb3I8VD4oe1xuICAgICAgICBjb25maWc6IEpTT04uc3RyaW5naWZ5KHByb2NDb25maWcpLFxuICAgICAgICBhcmd1bWVudHM6IFwiXCIsXG4gICAgICAgIHVyaSxcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9jO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tQcm9jRGVmaW5pdGlvbihmaWxlOiBzdHJpbmcsIG46IHN0cmluZykge1xuICAgIGNvbnN0IHF1YWRzID0gYXdhaXQgaW1wb3J0RmlsZShmaWxlKTtcbiAgICBjb25zdCBwcm9jQ29uZmlnID0gPHsgZmlsZTogVGVybTsgbG9jYXRpb246IHN0cmluZzsgY2xheno6IHN0cmluZyB9PihcbiAgICAgICAgcHJvY2Vzc29yU2hhcGVzLmxlbnNlc1tcIkpzUHJvY2Vzc29yU2hhcGVcIl0uZXhlY3V0ZSh7XG4gICAgICAgICAgICBpZDogbmV3IE5hbWVkTm9kZShiYXNlICsgbiksXG4gICAgICAgICAgICBxdWFkczogcXVhZHMsXG4gICAgICAgIH0pXG4gICAgKTtcbiAgICBleHBlY3QocHJvY0NvbmZpZy5maWxlLCBuICsgXCIgaGFzIGZpbGVcIikudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QocHJvY0NvbmZpZy5sb2NhdGlvbiwgbiArIFwiIGhhcyBsb2NhdGlvblwiKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChwcm9jQ29uZmlnLmNsYXp6LCBuICsgXCIgaGFzIGNsYXp6XCIpLnRvQmVEZWZpbmVkKCk7XG59XG4iXX0=
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3RVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3JELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFBO0FBRXJDLE9BQU8sRUFBRSx3QkFBd0IsRUFBdUIsTUFBTSxhQUFhLENBQUE7QUFDM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN0QyxPQUFPLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFekMsT0FBTyxFQUFZLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUUzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUUvQixNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLHlDQUF5QztJQUVuRSxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUNoRSxNQUFNLFdBQVcsR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNsRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLENB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SSxHQUFHLE1BQU0sTUFBTSxDQUFDLFlBQVksQ0FBSTtRQUN4QyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDbEMsU0FBUyxFQUFFLEVBQUU7UUFDYixHQUFHO0tBQ0osQ0FBQyxDQUFBO0lBRUYsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsQ0FBUztJQUMvRCxNQUFNLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNwQyxNQUFNLFVBQVUsR0FBb0QsQ0FDbEUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNqRCxFQUFFLEVBQUUsSUFBSSxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMzQixLQUFLLEVBQUUsS0FBSztLQUNiLENBQUMsQ0FDSCxDQUFBO0lBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3RELE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM5RCxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFDaHVuaywgUnVubmVyQ2xpZW50IH0gZnJvbSAnQHJkZmMvcHJvdG8nXG5pbXBvcnQgKiBhcyBncnBjIGZyb20gJ0BncnBjL2dycGMtanMnXG5pbXBvcnQgeyBDbGllbnRSZWFkYWJsZVN0cmVhbSB9IGZyb20gJ0BncnBjL2dycGMtanMnXG5pbXBvcnQgeyBDbGllbnRSZWFkYWJsZVN0cmVhbUltcGwsIE9yY2hlc3RyYXRvck1lc3NhZ2UgfSBmcm9tICcuL3JlZXhwb3J0cydcbmltcG9ydCB7IGV4dHJhY3RTaGFwZXMgfSBmcm9tICdyZGYtbGVucydcbmltcG9ydCB7IE5hbWVkTm9kZSwgUGFyc2VyLCBXcml0ZXIgfSBmcm9tICduMydcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSAnZnMvcHJvbWlzZXMnXG5pbXBvcnQgd2luc3RvbiwgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICd3aW5zdG9uJ1xuaW1wb3J0IHsgV3JpdGVySW5zdGFuY2UgfSBmcm9tICcuL3dyaXRlcidcbmltcG9ydCB7IFJlYWRlckluc3RhbmNlIH0gZnJvbSAnLi9yZWFkZXInXG5pbXBvcnQgeyBQcm9jZXNzb3IgfSBmcm9tICcuL3Byb2Nlc3NvcidcbmltcG9ydCB7IEZ1bGxQcm9jLCBSdW5uZXIgfSBmcm9tICcuL3J1bm5lcidcbmltcG9ydCB7IFF1YWQsIFRlcm0gfSBmcm9tICdAcmRmanMvdHlwZXMnXG5pbXBvcnQgeyBjcmVhdGVUZXJtTmFtZXNwYWNlIH0gZnJvbSAnQHRyZWVjZy90eXBlcydcbmltcG9ydCB7IGV4cGVjdCB9IGZyb20gJ3ZpdGVzdCdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByb2Nlc3NvclNoYXBlKFxuICBiYXNlSVJJID0gcHJvY2Vzcy5jd2QoKSArICcvbm9kZV9tb2R1bGVzL0ByZGZjL2pzLXJ1bm5lci9pbmRleC50dGwnLFxuKSB7XG4gIGNvbnN0IGNvbmZpZ0ZpbGUgPSBhd2FpdCByZWFkRmlsZShiYXNlSVJJLCB7IGVuY29kaW5nOiAndXRmOCcgfSlcbiAgY29uc3QgY29uZmlnUXVhZHMgPSBuZXcgUGFyc2VyKCkucGFyc2UoY29uZmlnRmlsZSlcbiAgY29uc3Qgc2hhcGVzID0gZXh0cmFjdFNoYXBlcyhjb25maWdRdWFkcylcblxuICByZXR1cm4gc2hhcGVzXG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0Q2xpZW50IGV4dGVuZHMgUnVubmVyQ2xpZW50IHtcbiAgbmV4dDogKHN0cmVhbTogQ2xpZW50UmVhZGFibGVTdHJlYW08RGF0YUNodW5rPikgPT4gdW5rbm93blxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdsb2NhbGhvc3Q6NTQwMCcsIGdycGMuY3JlZGVudGlhbHMuY3JlYXRlSW5zZWN1cmUoKSlcbiAgfVxuXG4gIG5leHRTdHJlYW0oKTogUHJvbWlzZTxDbGllbnRSZWFkYWJsZVN0cmVhbTxEYXRhQ2h1bms+PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMpID0+ICh0aGlzLm5leHQgPSByZXMpKVxuICB9XG5cbiAgcmVjZWl2ZVN0cmVhbU1lc3NhZ2UoKTogQ2xpZW50UmVhZGFibGVTdHJlYW08RGF0YUNodW5rPiB7XG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IENsaWVudFJlYWRhYmxlU3RyZWFtSW1wbDxEYXRhQ2h1bms+KChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIHJldHVybiB7IGRhdGEgfVxuICAgIH0pXG4gICAgdGhpcy5uZXh0KHN0cmVhbSlcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZTxUPihpdGVyOiBBc3luY0l0ZXJhYmxlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBpdGVyKSB7XG4gICAgcmV0dXJuIGl0ZW1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY2xpZW50ID0gbmV3IFRlc3RDbGllbnQoKVxuZXhwb3J0IGNvbnN0IHVyaSA9ICdzb21lVXJpJ1xuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcih7XG4gIHRyYW5zcG9ydHM6IG5ldyB3aW5zdG9uLnRyYW5zcG9ydHMuQ29uc29sZSh7XG4gICAgbGV2ZWw6IHByb2Nlc3MuZW52WydERUJVRyddIHx8ICdpbmZvJyxcbiAgfSksXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV3JpdGVyKGlyaSA9IHVyaSk6IFtXcml0ZXJJbnN0YW5jZSwgUmVhZGVySW5zdGFuY2VdIHtcbiAgY29uc3QgcmVhZGVyID0gY3JlYXRlUmVhZGVyKGlyaSlcbiAgY29uc3Qgd3JpdGVTdHJlYW0gPSBuZXcgV3JpdGVySW5zdGFuY2UoXG4gICAgaXJpLFxuICAgIGNsaWVudCxcbiAgICBhc3luYyAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLm1zZykge1xuICAgICAgICByZWFkZXIuaGFuZGxlTXNnKG1zZy5tc2cpXG4gICAgICB9XG4gICAgICBpZiAobXNnLmNsb3NlKSB7XG4gICAgICAgIHJlYWRlci5jbG9zZSgpXG4gICAgICB9XG4gICAgfSxcbiAgICBsb2dnZXIsXG4gIClcbiAgcmV0dXJuIFt3cml0ZVN0cmVhbSwgcmVhZGVyXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhZGVyKGlyaSA9IHVyaSk6IFJlYWRlckluc3RhbmNlIHtcbiAgY29uc3QgcmVhZGVyID0gbmV3IFJlYWRlckluc3RhbmNlKGlyaSwgY2xpZW50LCBsb2dnZXIpXG4gIHJldHVybiByZWFkZXJcbn1cblxuY29uc3Qgc2hhcGVRdWFkcyA9IGBcbkBwcmVmaXggcmRmYzogPGh0dHBzOi8vdzNpZC5vcmcvcmRmLWNvbm5lY3QjPi5cbkBwcmVmaXggeHNkOiA8aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjPi5cbkBwcmVmaXggc2g6IDxodHRwOi8vd3d3LnczLm9yZy9ucy9zaGFjbCM+LlxuWyBdIGEgc2g6Tm9kZVNoYXBlO1xuICBzaDp0YXJnZXRDbGFzcyA8SnNQcm9jZXNzb3JTaGFwZT47XG4gIHNoOnByb3BlcnR5IFtcbiAgICBzaDpwYXRoIHJkZmM6ZW50cnlwb2ludDtcbiAgICBzaDpuYW1lIFwibG9jYXRpb25cIjtcbiAgICBzaDptaW5Db3VudCAxO1xuICAgIHNoOm1heENvdW50IDE7XG4gICAgc2g6ZGF0YXR5cGUgeHNkOnN0cmluZztcbiAgXSwgW1xuICAgIHNoOnBhdGggcmRmYzpmaWxlO1xuICAgIHNoOm5hbWUgXCJmaWxlXCI7XG4gICAgc2g6bWluQ291bnQgMTtcbiAgICBzaDptYXhDb3VudCAxO1xuICAgIHNoOmRhdGF0eXBlIHhzZDpzdHJpbmc7XG4gIF0sIFtcbiAgICBzaDpwYXRoIHJkZmM6Y2xhc3M7XG4gICAgc2g6bmFtZSBcImNsYXp6XCI7XG4gICAgc2g6bWF4Q291bnQgMTtcbiAgICBzaDpkYXRhdHlwZSB4c2Q6c3RyaW5nO1xuICBdLlxuYFxuY29uc3QgT1dMID0gY3JlYXRlVGVybU5hbWVzcGFjZSgnaHR0cDovL3d3dy53My5vcmcvMjAwMi8wNy9vd2wjJywgJ2ltcG9ydHMnKVxuY29uc3QgcHJvY2Vzc29yU2hhcGVzID0gZXh0cmFjdFNoYXBlcyhuZXcgUGFyc2VyKCkucGFyc2Uoc2hhcGVRdWFkcykpXG5jb25zdCBiYXNlID0gJ2h0dHBzOi8vdzNpZC5vcmcvcmRmLWNvbm5lY3QjJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RmlsZShmaWxlOiBzdHJpbmcpOiBQcm9taXNlPFF1YWRbXT4ge1xuICBjb25zdCBkb25lID0gbmV3IFNldDxzdHJpbmc+KClcbiAgY29uc3QgdG9kbyA9IFtuZXcgVVJMKCdmaWxlOi8vJyArIGZpbGUpXVxuICBjb25zdCBxdWFkczogUXVhZFtdID0gW11cblxuICBsZXQgaXRlbSA9IHRvZG8ucG9wKClcbiAgd2hpbGUgKGl0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChkb25lLmhhcyhpdGVtLnRvU3RyaW5nKCkpKSB7XG4gICAgICBpdGVtID0gdG9kby5wb3AoKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgZG9uZS5hZGQoaXRlbS50b1N0cmluZygpKVxuICAgIGlmIChpdGVtLnByb3RvY29sICE9PSAnZmlsZTonKSB7XG4gICAgICB0aHJvdyAnTm8gc3VwcG9ydGVkIHByb3RvY29sICcgKyBpdGVtLnByb3RvY29sXG4gICAgfVxuXG4gICAgY29uc3QgdHh0ID0gYXdhaXQgcmVhZEZpbGUoaXRlbS5wYXRobmFtZSwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pXG4gICAgY29uc3QgZXh0cmFzID0gbmV3IFBhcnNlcih7IGJhc2VJUkk6IGl0ZW0udG9TdHJpbmcoKSB9KS5wYXJzZSh0eHQpXG5cbiAgICBmb3IgKGNvbnN0IG8gb2YgZXh0cmFzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoeCkgPT5cbiAgICAgICAgICB4LnN1YmplY3QudmFsdWUgPT09IGl0ZW0/LnRvU3RyaW5nKCkgJiZcbiAgICAgICAgICB4LnByZWRpY2F0ZS5lcXVhbHMoT1dMLmltcG9ydHMpLFxuICAgICAgKVxuICAgICAgLm1hcCgoeCkgPT4geC5vYmplY3QudmFsdWUpKSB7XG4gICAgICB0b2RvLnB1c2gobmV3IFVSTChvKSlcbiAgICB9XG4gICAgcXVhZHMucHVzaCguLi5leHRyYXMpXG5cbiAgICBpdGVtID0gdG9kby5wb3AoKVxuICB9XG5cbiAgcmV0dXJuIHF1YWRzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm9jPFQgZXh0ZW5kcyBQcm9jZXNzb3I8dW5rbm93bj4+KFxuICBjb25maWc6IHN0cmluZyxcbiAgdHk6IHN0cmluZyxcbiAgY29uZmlnTG9jYXRpb246IHN0cmluZyxcbiAgdXJpID0gJ2h0dHA6Ly9leGFtcGxlLmNvbS9ucyNwcm9jZXNzb3InLFxuKTogUHJvbWlzZTxGdWxsUHJvYzxUPj4ge1xuICBjb25zdCBjb25maWdRdWFkcyA9IGF3YWl0IGltcG9ydEZpbGUoY29uZmlnTG9jYXRpb24pXG4gIGNvbnN0IHByb2NDb25maWcgPSBwcm9jZXNzb3JTaGFwZXMubGVuc2VzWydKc1Byb2Nlc3NvclNoYXBlJ10uZXhlY3V0ZSh7XG4gICAgaWQ6IG5ldyBOYW1lZE5vZGUoYmFzZSArIHR5KSxcbiAgICBxdWFkczogY29uZmlnUXVhZHMsXG4gIH0pXG5cbiAgY29uc3QgbXNnczogT3JjaGVzdHJhdG9yTWVzc2FnZVtdID0gW11cbiAgY29uc3Qgd3JpdGUgPSBhc3luYyAoeDogT3JjaGVzdHJhdG9yTWVzc2FnZSkgPT4ge1xuICAgIG1zZ3MucHVzaCh4KVxuICB9XG4gIGNvbnN0IHJ1bm5lciA9IG5ldyBSdW5uZXIoXG4gICAgbmV3IFRlc3RDbGllbnQoKSxcbiAgICB3cml0ZSxcbiAgICAnaHR0cDovL2V4YW1wbGUuY29tL25zIycsXG4gICAgbG9nZ2VyLFxuICApXG4gIGNvbmZpZ1F1YWRzLnB1c2goLi4ubmV3IFBhcnNlcigpLnBhcnNlKGNvbmZpZykpXG4gIGF3YWl0IHJ1bm5lci5oYW5kbGVPcmNoTWVzc2FnZSh7XG4gICAgcGlwZWxpbmU6IG5ldyBXcml0ZXIoKS5xdWFkc1RvU3RyaW5nKGNvbmZpZ1F1YWRzKSxcbiAgfSlcblxuICBjb25zdCBwcm9jID0gYXdhaXQgcnVubmVyLmFkZFByb2Nlc3NvcjxUPih7XG4gICAgY29uZmlnOiBKU09OLnN0cmluZ2lmeShwcm9jQ29uZmlnKSxcbiAgICBhcmd1bWVudHM6ICcnLFxuICAgIHVyaSxcbiAgfSlcblxuICByZXR1cm4gcHJvY1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tQcm9jRGVmaW5pdGlvbihmaWxlOiBzdHJpbmcsIG46IHN0cmluZykge1xuICBjb25zdCBxdWFkcyA9IGF3YWl0IGltcG9ydEZpbGUoZmlsZSlcbiAgY29uc3QgcHJvY0NvbmZpZyA9IDx7IGZpbGU6IFRlcm07IGxvY2F0aW9uOiBzdHJpbmc7IGNsYXp6OiBzdHJpbmcgfT4oXG4gICAgcHJvY2Vzc29yU2hhcGVzLmxlbnNlc1snSnNQcm9jZXNzb3JTaGFwZSddLmV4ZWN1dGUoe1xuICAgICAgaWQ6IG5ldyBOYW1lZE5vZGUoYmFzZSArIG4pLFxuICAgICAgcXVhZHM6IHF1YWRzLFxuICAgIH0pXG4gIClcbiAgZXhwZWN0KHByb2NDb25maWcuZmlsZSwgbiArICcgaGFzIGZpbGUnKS50b0JlRGVmaW5lZCgpXG4gIGV4cGVjdChwcm9jQ29uZmlnLmxvY2F0aW9uLCBuICsgJyBoYXMgbG9jYXRpb24nKS50b0JlRGVmaW5lZCgpXG4gIGV4cGVjdChwcm9jQ29uZmlnLmNsYXp6LCBuICsgJyBoYXMgY2xhenonKS50b0JlRGVmaW5lZCgpXG59XG4iXX0=
|