@decohere/scaffold 0.0.1-dev.88 → 0.0.1-dev.89
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/commonjs/src/auth0-configure.action.js +30 -0
- package/commonjs/src/auth0-configure.command.js +26 -0
- package/commonjs/src/auth0-login.action.js +30 -0
- package/commonjs/src/auth0-login.command.js +25 -0
- package/commonjs/src/auth0.command.js +24 -0
- package/commonjs/src/auth0.module.js +30 -0
- package/commonjs/src/index.js +13 -1
- package/commonjs/src/program.js +10 -1
- package/commonjs/src/webapi/auth0-commands.js +252 -0
- package/commonjs/src/webapi/authorize-scopes.js +81 -0
- package/commonjs/src/webapi/features/auth.feature.js +3 -30
- package/commonjs/src/webapi/features/auth0-cli.js +41 -2
- package/commonjs/src/webapi/workspace-readme.js +2 -2
- package/es6/src/auth0-configure.action.js +20 -0
- package/es6/src/auth0-configure.command.js +16 -0
- package/es6/src/auth0-login.action.js +20 -0
- package/es6/src/auth0-login.command.js +15 -0
- package/es6/src/auth0.command.js +14 -0
- package/es6/src/auth0.module.js +20 -0
- package/es6/src/index.js +4 -1
- package/es6/src/program.js +10 -1
- package/es6/src/webapi/auth0-commands.js +187 -0
- package/es6/src/webapi/authorize-scopes.js +57 -0
- package/es6/src/webapi/features/auth.feature.js +3 -30
- package/es6/src/webapi/features/auth0-cli.js +36 -3
- package/es6/src/webapi/workspace-readme.js +2 -2
- package/package.json +3 -3
- package/types/src/auth0-configure.action.d.ts +7 -0
- package/types/src/auth0-configure.command.d.ts +6 -0
- package/types/src/auth0-login.action.d.ts +4 -0
- package/types/src/auth0-login.command.d.ts +6 -0
- package/types/src/auth0.command.d.ts +6 -0
- package/types/src/auth0.module.d.ts +18 -0
- package/types/src/index.d.ts +4 -0
- package/types/src/webapi/auth0-commands.d.ts +11 -0
- package/types/src/webapi/authorize-scopes.d.ts +7 -0
- package/types/src/webapi/features/auth0-cli.d.ts +4 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "Auth0ConfigureAction", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return Auth0ConfigureAction;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _decorators = require("@decohere/crucible/decorators");
|
|
12
|
+
const _cli = require("@decohere/nexus/cli");
|
|
13
|
+
const _auth0commands = require("./webapi/auth0-commands.js");
|
|
14
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
+
}
|
|
20
|
+
class Auth0ConfigureAction {
|
|
21
|
+
async run(options) {
|
|
22
|
+
(0, _auth0commands.runAuth0Configure)(typeof options.d === "string" ? options.d : ".");
|
|
23
|
+
return _cli.ActionResponse.Success("configure");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
Auth0ConfigureAction = _ts_decorate([
|
|
27
|
+
(0, _decorators.injectable)()
|
|
28
|
+
], Auth0ConfigureAction);
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9hdXRoMC1jb25maWd1cmUuYWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgQWN0aW9uLCBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBydW5BdXRoMENvbmZpZ3VyZSB9IGZyb20gXCIuL3dlYmFwaS9hdXRoMC1jb21tYW5kcy5qc1wiO1xuXG5leHBvcnQgdHlwZSBBdXRoMENvbmZpZ3VyZU9wdGlvbnMgPSB7XG5cdGQ/OiBzdHJpbmc7XG59O1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aDBDb25maWd1cmVBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb248QXV0aDBDb25maWd1cmVPcHRpb25zPiB7XG5cdHB1YmxpYyBhc3luYyBydW4ob3B0aW9uczogQXV0aDBDb25maWd1cmVPcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRcdHJ1bkF1dGgwQ29uZmlndXJlKHR5cGVvZiBvcHRpb25zLmQgPT09IFwic3RyaW5nXCIgPyBvcHRpb25zLmQgOiBcIi5cIik7XG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoXCJjb25maWd1cmVcIik7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJBdXRoMENvbmZpZ3VyZUFjdGlvbiIsInJ1biIsIm9wdGlvbnMiLCJydW5BdXRoMENvbmZpZ3VyZSIsImQiLCJBY3Rpb25SZXNwb25zZSIsIlN1Y2Nlc3MiXSwibWFwcGluZ3MiOiI7Ozs7K0JBU2FBOzs7ZUFBQUE7Ozs0QkFUYztxQkFDaUI7K0JBQ1Y7Ozs7Ozs7QUFPM0IsTUFBTUE7SUFDWixNQUFhQyxJQUFJQyxPQUE4QixFQUEyQjtRQUN6RUMsSUFBQUEsZ0NBQWlCLEVBQUMsT0FBT0QsUUFBUUUsQ0FBQyxLQUFLLFdBQVdGLFFBQVFFLENBQUMsR0FBRztRQUM5RCxPQUFPQyxtQkFBYyxDQUFDQyxPQUFPLENBQUM7SUFDL0I7QUFDRCJ9
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "Auth0ConfigureCommand", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return Auth0ConfigureCommand;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _cli = require("@decohere/nexus/cli");
|
|
12
|
+
const _auth0configureaction = require("./auth0-configure.action.js");
|
|
13
|
+
class Auth0ConfigureCommand extends _cli.DecohereCommand {
|
|
14
|
+
get actions() {
|
|
15
|
+
return [
|
|
16
|
+
_auth0configureaction.Auth0ConfigureAction
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
constructor(name){
|
|
20
|
+
super(name);
|
|
21
|
+
this.description("Update Auth0 API permissions and Postman SPA from @Authorize in this workspace");
|
|
22
|
+
this.option("-d <directory>", "Workspace directory (default: current directory)", ".");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9hdXRoMC1jb25maWd1cmUuY29tbWFuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWNvaGVyZUNvbW1hbmQgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgQXV0aDBDb25maWd1cmVBY3Rpb24gfSBmcm9tIFwiLi9hdXRoMC1jb25maWd1cmUuYWN0aW9uLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBBdXRoMENvbmZpZ3VyZUNvbW1hbmQgZXh0ZW5kcyBEZWNvaGVyZUNvbW1hbmQge1xuXHRwdWJsaWMgb3ZlcnJpZGUgZ2V0IGFjdGlvbnMoKSB7XG5cdFx0cmV0dXJuIFtBdXRoMENvbmZpZ3VyZUFjdGlvbl07XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobmFtZSk7XG5cdFx0dGhpcy5kZXNjcmlwdGlvbihcblx0XHRcdFwiVXBkYXRlIEF1dGgwIEFQSSBwZXJtaXNzaW9ucyBhbmQgUG9zdG1hbiBTUEEgZnJvbSBAQXV0aG9yaXplIGluIHRoaXMgd29ya3NwYWNlXCIsXG5cdFx0KTtcblx0XHR0aGlzLm9wdGlvbihcIi1kIDxkaXJlY3Rvcnk+XCIsIFwiV29ya3NwYWNlIGRpcmVjdG9yeSAoZGVmYXVsdDogY3VycmVudCBkaXJlY3RvcnkpXCIsIFwiLlwiKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkF1dGgwQ29uZmlndXJlQ29tbWFuZCIsIkRlY29oZXJlQ29tbWFuZCIsImFjdGlvbnMiLCJBdXRoMENvbmZpZ3VyZUFjdGlvbiIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIm9wdGlvbiJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFHYUE7OztlQUFBQTs7O3FCQUhtQjtzQ0FDSztBQUU5QixNQUFNQSw4QkFBOEJDLG9CQUFlO0lBQ3pELElBQW9CQyxVQUFVO1FBQzdCLE9BQU87WUFBQ0MsMENBQW9CO1NBQUM7SUFDOUI7SUFFQSxZQUFtQkMsSUFBWSxDQUFFO1FBQ2hDLEtBQUssQ0FBQ0E7UUFDTixJQUFJLENBQUNDLFdBQVcsQ0FDZjtRQUVELElBQUksQ0FBQ0MsTUFBTSxDQUFDLGtCQUFrQixvREFBb0Q7SUFDbkY7QUFDRCJ9
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "Auth0LoginAction", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return Auth0LoginAction;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _decorators = require("@decohere/crucible/decorators");
|
|
12
|
+
const _cli = require("@decohere/nexus/cli");
|
|
13
|
+
const _auth0commands = require("./webapi/auth0-commands.js");
|
|
14
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
+
}
|
|
20
|
+
class Auth0LoginAction {
|
|
21
|
+
async run() {
|
|
22
|
+
(0, _auth0commands.runAuth0Login)();
|
|
23
|
+
return _cli.ActionResponse.Success("login");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
Auth0LoginAction = _ts_decorate([
|
|
27
|
+
(0, _decorators.injectable)()
|
|
28
|
+
], Auth0LoginAction);
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9hdXRoMC1sb2dpbi5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgdHlwZSBBY3Rpb24sIEFjdGlvblJlc3BvbnNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IHJ1bkF1dGgwTG9naW4gfSBmcm9tIFwiLi93ZWJhcGkvYXV0aDAtY29tbWFuZHMuanNcIjtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGgwTG9naW5BY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24ge1xuXHRwdWJsaWMgYXN5bmMgcnVuKCk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0XHRydW5BdXRoMExvZ2luKCk7XG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoXCJsb2dpblwiKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkF1dGgwTG9naW5BY3Rpb24iLCJydW4iLCJydW5BdXRoMExvZ2luIiwiQWN0aW9uUmVzcG9uc2UiLCJTdWNjZXNzIl0sIm1hcHBpbmdzIjoiOzs7OytCQUthQTs7O2VBQUFBOzs7NEJBTGM7cUJBQ2lCOytCQUNkOzs7Ozs7O0FBR3ZCLE1BQU1BO0lBQ1osTUFBYUMsTUFBK0I7UUFDM0NDLElBQUFBLDRCQUFhO1FBQ2IsT0FBT0MsbUJBQWMsQ0FBQ0MsT0FBTyxDQUFDO0lBQy9CO0FBQ0QifQ==
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "Auth0LoginCommand", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return Auth0LoginCommand;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _cli = require("@decohere/nexus/cli");
|
|
12
|
+
const _auth0loginaction = require("./auth0-login.action.js");
|
|
13
|
+
class Auth0LoginCommand extends _cli.DecohereCommand {
|
|
14
|
+
get actions() {
|
|
15
|
+
return [
|
|
16
|
+
_auth0loginaction.Auth0LoginAction
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
constructor(name){
|
|
20
|
+
super(name);
|
|
21
|
+
this.description("Authenticate the Auth0 CLI (device URL; tokens persist on the host)");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9hdXRoMC1sb2dpbi5jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlY29oZXJlQ29tbWFuZCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBBdXRoMExvZ2luQWN0aW9uIH0gZnJvbSBcIi4vYXV0aDAtbG9naW4uYWN0aW9uLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBBdXRoMExvZ2luQ29tbWFuZCBleHRlbmRzIERlY29oZXJlQ29tbWFuZCB7XG5cdHB1YmxpYyBvdmVycmlkZSBnZXQgYWN0aW9ucygpIHtcblx0XHRyZXR1cm4gW0F1dGgwTG9naW5BY3Rpb25dO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuXHRcdHN1cGVyKG5hbWUpO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24oXCJBdXRoZW50aWNhdGUgdGhlIEF1dGgwIENMSSAoZGV2aWNlIFVSTDsgdG9rZW5zIHBlcnNpc3Qgb24gdGhlIGhvc3QpXCIpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiQXV0aDBMb2dpbkNvbW1hbmQiLCJEZWNvaGVyZUNvbW1hbmQiLCJhY3Rpb25zIiwiQXV0aDBMb2dpbkFjdGlvbiIsIm5hbWUiLCJkZXNjcmlwdGlvbiJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFHYUE7OztlQUFBQTs7O3FCQUhtQjtrQ0FDQztBQUUxQixNQUFNQSwwQkFBMEJDLG9CQUFlO0lBQ3JELElBQW9CQyxVQUFVO1FBQzdCLE9BQU87WUFBQ0Msa0NBQWdCO1NBQUM7SUFDMUI7SUFFQSxZQUFtQkMsSUFBWSxDQUFFO1FBQ2hDLEtBQUssQ0FBQ0E7UUFDTixJQUFJLENBQUNDLFdBQVcsQ0FBQztJQUNsQjtBQUNEIn0=
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "Auth0Command", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return Auth0Command;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _cli = require("@decohere/nexus/cli");
|
|
12
|
+
class Auth0Command extends _cli.DecohereCommand {
|
|
13
|
+
constructor(commands, handler){
|
|
14
|
+
super(Auth0Command);
|
|
15
|
+
this.description("Log in to Auth0 and update a scaffolded client");
|
|
16
|
+
this.exitOverride();
|
|
17
|
+
this.registerSubcommand(commands, handler);
|
|
18
|
+
}
|
|
19
|
+
run(_actions, _options) {
|
|
20
|
+
return this.help();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9hdXRoMC5jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9ucyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQge1xuXHR0eXBlIENvbW1hbmRIYW5kbGVyLFxuXHR0eXBlIENvbW1hbmRSZXNwb25zZSxcblx0dHlwZSBDb21tYW5kVHlwZSxcblx0RGVjb2hlcmVDb21tYW5kLFxufSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuXG5leHBvcnQgY2xhc3MgQXV0aDBDb21tYW5kIGV4dGVuZHMgRGVjb2hlcmVDb21tYW5kIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKGNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBDb21tYW5kVHlwZT4sIGhhbmRsZXI6IENvbW1hbmRIYW5kbGVyKSB7XG5cdFx0c3VwZXIoQXV0aDBDb21tYW5kKTtcblx0XHR0aGlzLmRlc2NyaXB0aW9uKFwiTG9nIGluIHRvIEF1dGgwIGFuZCB1cGRhdGUgYSBzY2FmZm9sZGVkIGNsaWVudFwiKTtcblx0XHR0aGlzLmV4aXRPdmVycmlkZSgpO1xuXHRcdHRoaXMucmVnaXN0ZXJTdWJjb21tYW5kKGNvbW1hbmRzLCBoYW5kbGVyKTtcblx0fVxuXG5cdHB1YmxpYyBydW4oX2FjdGlvbnM6IEFjdGlvbnMsIF9vcHRpb25zOiBuZXZlcik6IFByb21pc2U8Q29tbWFuZFJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuaGVscCgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiQXV0aDBDb21tYW5kIiwiRGVjb2hlcmVDb21tYW5kIiwiY29tbWFuZHMiLCJoYW5kbGVyIiwiZGVzY3JpcHRpb24iLCJleGl0T3ZlcnJpZGUiLCJyZWdpc3RlclN1YmNvbW1hbmQiLCJydW4iLCJfYWN0aW9ucyIsIl9vcHRpb25zIiwiaGVscCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFRYUE7OztlQUFBQTs7O3FCQUZOO0FBRUEsTUFBTUEscUJBQXFCQyxvQkFBZTtJQUNoRCxZQUFtQkMsUUFBcUMsRUFBRUMsT0FBdUIsQ0FBRTtRQUNsRixLQUFLLENBQUNIO1FBQ04sSUFBSSxDQUFDSSxXQUFXLENBQUM7UUFDakIsSUFBSSxDQUFDQyxZQUFZO1FBQ2pCLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNKLFVBQVVDO0lBQ25DO0lBRU9JLElBQUlDLFFBQWlCLEVBQUVDLFFBQWUsRUFBNEI7UUFDeEUsT0FBTyxJQUFJLENBQUNDLElBQUk7SUFDakI7QUFDRCJ9
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "Auth0Module", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return Auth0Module;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _cli = require("@decohere/nexus/cli");
|
|
12
|
+
const _auth0command = require("./auth0.command.js");
|
|
13
|
+
const _auth0configureaction = require("./auth0-configure.action.js");
|
|
14
|
+
const _auth0configurecommand = require("./auth0-configure.command.js");
|
|
15
|
+
const _auth0loginaction = require("./auth0-login.action.js");
|
|
16
|
+
const _auth0logincommand = require("./auth0-login.command.js");
|
|
17
|
+
class Auth0Module extends _cli.ModuleManifest {
|
|
18
|
+
id = "auth0";
|
|
19
|
+
command = _auth0command.Auth0Command;
|
|
20
|
+
commands = {
|
|
21
|
+
login: _auth0logincommand.Auth0LoginCommand,
|
|
22
|
+
configure: _auth0configurecommand.Auth0ConfigureCommand
|
|
23
|
+
};
|
|
24
|
+
actions = {
|
|
25
|
+
login: _auth0loginaction.Auth0LoginAction,
|
|
26
|
+
configure: _auth0configureaction.Auth0ConfigureAction
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9hdXRoMC5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kdWxlTWFuaWZlc3QgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgQXV0aDBDb21tYW5kIH0gZnJvbSBcIi4vYXV0aDAuY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgQXV0aDBDb25maWd1cmVBY3Rpb24gfSBmcm9tIFwiLi9hdXRoMC1jb25maWd1cmUuYWN0aW9uLmpzXCI7XG5pbXBvcnQgeyBBdXRoMENvbmZpZ3VyZUNvbW1hbmQgfSBmcm9tIFwiLi9hdXRoMC1jb25maWd1cmUuY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgQXV0aDBMb2dpbkFjdGlvbiB9IGZyb20gXCIuL2F1dGgwLWxvZ2luLmFjdGlvbi5qc1wiO1xuaW1wb3J0IHsgQXV0aDBMb2dpbkNvbW1hbmQgfSBmcm9tIFwiLi9hdXRoMC1sb2dpbi5jb21tYW5kLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBBdXRoME1vZHVsZSBleHRlbmRzIE1vZHVsZU1hbmlmZXN0IHtcblx0cHVibGljIHJlYWRvbmx5IGlkID0gXCJhdXRoMFwiO1xuXHRwdWJsaWMgcmVhZG9ubHkgY29tbWFuZCA9IEF1dGgwQ29tbWFuZDtcblx0cHVibGljIHJlYWRvbmx5IGNvbW1hbmRzID0geyBsb2dpbjogQXV0aDBMb2dpbkNvbW1hbmQsIGNvbmZpZ3VyZTogQXV0aDBDb25maWd1cmVDb21tYW5kIH07XG5cdHB1YmxpYyByZWFkb25seSBhY3Rpb25zID0geyBsb2dpbjogQXV0aDBMb2dpbkFjdGlvbiwgY29uZmlndXJlOiBBdXRoMENvbmZpZ3VyZUFjdGlvbiB9O1xufVxuIl0sIm5hbWVzIjpbIkF1dGgwTW9kdWxlIiwiTW9kdWxlTWFuaWZlc3QiLCJpZCIsImNvbW1hbmQiLCJBdXRoMENvbW1hbmQiLCJjb21tYW5kcyIsImxvZ2luIiwiQXV0aDBMb2dpbkNvbW1hbmQiLCJjb25maWd1cmUiLCJBdXRoMENvbmZpZ3VyZUNvbW1hbmQiLCJhY3Rpb25zIiwiQXV0aDBMb2dpbkFjdGlvbiIsIkF1dGgwQ29uZmlndXJlQWN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7OytCQU9hQTs7O2VBQUFBOzs7cUJBUGtCOzhCQUNGO3NDQUNRO3VDQUNDO2tDQUNMO21DQUNDO0FBRTNCLE1BQU1BLG9CQUFvQkMsbUJBQWM7SUFDOUJDLEtBQUssUUFBUTtJQUNiQyxVQUFVQywwQkFBWSxDQUFDO0lBQ3ZCQyxXQUFXO1FBQUVDLE9BQU9DLG9DQUFpQjtRQUFFQyxXQUFXQyw0Q0FBcUI7SUFBQyxFQUFFO0lBQzFFQyxVQUFVO1FBQUVKLE9BQU9LLGtDQUFnQjtRQUFFSCxXQUFXSSwwQ0FBb0I7SUFBQyxFQUFFO0FBQ3hGIn0=
|
package/commonjs/src/index.js
CHANGED
|
@@ -15,6 +15,15 @@ _export(exports, {
|
|
|
15
15
|
get AddModule () {
|
|
16
16
|
return _addmodule.AddModule;
|
|
17
17
|
},
|
|
18
|
+
get Auth0ConfigureAction () {
|
|
19
|
+
return _auth0configureaction.Auth0ConfigureAction;
|
|
20
|
+
},
|
|
21
|
+
get Auth0LoginAction () {
|
|
22
|
+
return _auth0loginaction.Auth0LoginAction;
|
|
23
|
+
},
|
|
24
|
+
get Auth0Module () {
|
|
25
|
+
return _auth0module.Auth0Module;
|
|
26
|
+
},
|
|
18
27
|
get CreateModule () {
|
|
19
28
|
return _createmodule.CreateModule;
|
|
20
29
|
},
|
|
@@ -30,9 +39,12 @@ _export(exports, {
|
|
|
30
39
|
});
|
|
31
40
|
const _addmodule = require("./add.module.js");
|
|
32
41
|
const _addapiaction = require("./add-api.action.js");
|
|
42
|
+
const _auth0module = require("./auth0.module.js");
|
|
43
|
+
const _auth0configureaction = require("./auth0-configure.action.js");
|
|
44
|
+
const _auth0loginaction = require("./auth0-login.action.js");
|
|
33
45
|
const _createmodule = require("./create.module.js");
|
|
34
46
|
const _program = require("./program.js");
|
|
35
47
|
const _createapi = require("./webapi/create-api.js");
|
|
36
48
|
const _webapiaction = require("./webapi.action.js");
|
|
37
49
|
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBBZGRNb2R1bGUgfSBmcm9tIFwiLi9hZGQubW9kdWxlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEFkZEFwaU9wdGlvbnMgfSBmcm9tIFwiLi9hZGQtYXBpLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHsgQWRkQXBpQWN0aW9uIH0gZnJvbSBcIi4vYWRkLWFwaS5hY3Rpb24uanNcIjtcbmV4cG9ydCB7IEF1dGgwTW9kdWxlIH0gZnJvbSBcIi4vYXV0aDAubW9kdWxlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGgwQ29uZmlndXJlT3B0aW9ucyB9IGZyb20gXCIuL2F1dGgwLWNvbmZpZ3VyZS5hY3Rpb24uanNcIjtcbmV4cG9ydCB7IEF1dGgwQ29uZmlndXJlQWN0aW9uIH0gZnJvbSBcIi4vYXV0aDAtY29uZmlndXJlLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHsgQXV0aDBMb2dpbkFjdGlvbiB9IGZyb20gXCIuL2F1dGgwLWxvZ2luLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHsgQ3JlYXRlTW9kdWxlIH0gZnJvbSBcIi4vY3JlYXRlLm1vZHVsZS5qc1wiO1xuZXhwb3J0IHsgcnVuQ2xpIH0gZnJvbSBcIi4vcHJvZ3JhbS5qc1wiO1xuZXhwb3J0IHR5cGUgeyBBcGlPcHRpb25zIH0gZnJvbSBcIi4vd2ViYXBpL2NyZWF0ZS1hcGkuanNcIjtcbmV4cG9ydCB7IHNjYWZmb2xkQXBpIH0gZnJvbSBcIi4vd2ViYXBpL2NyZWF0ZS1hcGkuanNcIjtcbmV4cG9ydCB0eXBlIHsgV2ViYXBpT3B0aW9ucyB9IGZyb20gXCIuL3dlYmFwaS5hY3Rpb24uanNcIjtcbmV4cG9ydCB7IFdlYmFwaUFjdGlvbiB9IGZyb20gXCIuL3dlYmFwaS5hY3Rpb24uanNcIjtcbiJdLCJuYW1lcyI6WyJBZGRBcGlBY3Rpb24iLCJBZGRNb2R1bGUiLCJBdXRoMENvbmZpZ3VyZUFjdGlvbiIsIkF1dGgwTG9naW5BY3Rpb24iLCJBdXRoME1vZHVsZSIsIkNyZWF0ZU1vZHVsZSIsIldlYmFwaUFjdGlvbiIsInJ1bkNsaSIsInNjYWZmb2xkQXBpIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQUVTQTtlQUFBQSwwQkFBWTs7UUFGWkM7ZUFBQUEsb0JBQVM7O1FBS1RDO2VBQUFBLDBDQUFvQjs7UUFDcEJDO2VBQUFBLGtDQUFnQjs7UUFIaEJDO2VBQUFBLHdCQUFXOztRQUlYQztlQUFBQSwwQkFBWTs7UUFLWkM7ZUFBQUEsMEJBQVk7O1FBSlpDO2VBQUFBLGVBQU07O1FBRU5DO2VBQUFBLHNCQUFXOzs7MkJBVk07OEJBRUc7NkJBQ0Q7c0NBRVM7a0NBQ0o7OEJBQ0o7eUJBQ047MkJBRUs7OEJBRUMifQ==
|
package/commonjs/src/program.js
CHANGED
|
@@ -18,6 +18,7 @@ _export(exports, {
|
|
|
18
18
|
});
|
|
19
19
|
const _commander = require("commander");
|
|
20
20
|
const _apiname = require("./webapi/api-name.js");
|
|
21
|
+
const _auth0commands = require("./webapi/auth0-commands.js");
|
|
21
22
|
const _clioptions = require("./webapi/cli-options.js");
|
|
22
23
|
function createProgram() {
|
|
23
24
|
const program = new _commander.Command();
|
|
@@ -35,6 +36,14 @@ function createProgram() {
|
|
|
35
36
|
add: true
|
|
36
37
|
}));
|
|
37
38
|
});
|
|
39
|
+
const auth0 = program.command("auth0").description("Log in to Auth0 and update a scaffolded client");
|
|
40
|
+
auth0.command("login").description("Authenticate the Auth0 CLI (device URL; tokens persist on the host)").action(()=>{
|
|
41
|
+
(0, _auth0commands.runAuth0Login)();
|
|
42
|
+
});
|
|
43
|
+
auth0.command("configure").description("Update Auth0 API permissions and Postman SPA from @Authorize in this workspace").action((_opts, cmd)=>{
|
|
44
|
+
const d = cmd.optsWithGlobals().d;
|
|
45
|
+
(0, _auth0commands.runAuth0Configure)(typeof d === "string" ? d : ".");
|
|
46
|
+
});
|
|
38
47
|
return program;
|
|
39
48
|
}
|
|
40
49
|
async function runCli(argv = process.argv) {
|
|
@@ -54,4 +63,4 @@ async function runCli(argv = process.argv) {
|
|
|
54
63
|
process.exit(process.exitCode ?? 0);
|
|
55
64
|
}
|
|
56
65
|
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9wcm9ncmFtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQsIENvbW1hbmRlckVycm9yIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlQ2xpRXJyb3IgfSBmcm9tIFwiLi93ZWJhcGkvYXBpLW5hbWUuanNcIjtcbmltcG9ydCB7IHJ1bkF1dGgwQ29uZmlndXJlLCBydW5BdXRoMExvZ2luIH0gZnJvbSBcIi4vd2ViYXBpL2F1dGgwLWNvbW1hbmRzLmpzXCI7XG5pbXBvcnQge1xuXHRhZGRXZWJhcGlGZWF0dXJlT3B0aW9ucyxcblx0Y29sbGVjdE5hbWUsXG5cdHJ1blNjYWZmb2xkQXBpLFxuXHR0b0FwaU9wdGlvbnMsXG59IGZyb20gXCIuL3dlYmFwaS9jbGktb3B0aW9ucy5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbSgpOiBDb21tYW5kIHtcblx0Y29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cdHByb2dyYW0uZXhpdE92ZXJyaWRlKCk7XG5cdHByb2dyYW1cblx0XHQubmFtZShcImRlY29oZXJlXCIpXG5cdFx0LmRlc2NyaXB0aW9uKFwiRGVjb2hlcmUgQ0xJXCIpXG5cdFx0Lm9wdGlvbihcIi1kIDxkaXJlY3Rvcnk+XCIsIFwiVGFyZ2V0IGRpcmVjdG9yeSAoZGVmYXVsdDogY3VycmVudCBkaXJlY3RvcnkpXCIsIFwiLlwiKTtcblxuXHRjb25zdCBjcmVhdGUgPSBwcm9ncmFtLmNvbW1hbmQoXCJjcmVhdGVcIikuZGVzY3JpcHRpb24oXCJDcmVhdGUgYSBuZXcgRGVjb2hlcmUgd29ya3NwYWNlXCIpO1xuXHRhZGRXZWJhcGlGZWF0dXJlT3B0aW9ucyhcblx0XHRjcmVhdGVcblx0XHRcdC5jb21tYW5kKFwid2ViYXBpXCIpXG5cdFx0XHQuYXJndW1lbnQoXCJbZGlyZWN0b3J5XVwiLCBcIlRhcmdldCBkaXJlY3RvcnkgKGRlZmF1bHQ6IC1kIG9yIGN1cnJlbnQgZGlyZWN0b3J5KVwiKVxuXHRcdFx0Lm9wdGlvbihcblx0XHRcdFx0XCItLW5hbWUgPHNsdWc+XCIsXG5cdFx0XHRcdFwiQVBJIG5hbWUgdW5kZXIgcHJvamVjdHMvIChyZXBlYXRhYmxlOyBkZWZhdWx0OiBhcGkpXCIsXG5cdFx0XHRcdGNvbGxlY3ROYW1lLFxuXHRcdFx0XHRbXSBhcyBzdHJpbmdbXSxcblx0XHRcdCksXG5cdCkuYWN0aW9uKGFzeW5jIChkaXJlY3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCwgX29wdHM6IHVua25vd24sIGNtZDogQ29tbWFuZCkgPT4ge1xuXHRcdGF3YWl0IHJ1blNjYWZmb2xkQXBpKHRvQXBpT3B0aW9ucyhkaXJlY3RvcnksIGNtZC5vcHRzV2l0aEdsb2JhbHMoKSkpO1xuXHR9KTtcblxuXHRhZGRXZWJhcGlGZWF0dXJlT3B0aW9ucyhcblx0XHRwcm9ncmFtXG5cdFx0XHQuY29tbWFuZChcImFkZFwiKVxuXHRcdFx0LmRlc2NyaXB0aW9uKFwiQWRkIHRvIGFuIGV4aXN0aW5nIERlY29oZXJlIHdvcmtzcGFjZVwiKVxuXHRcdFx0LmNvbW1hbmQoXCJhcGlcIilcblx0XHRcdC5hcmd1bWVudChcIjxuYW1lPlwiLCBcIkFQSSBuYW1lIHVuZGVyIHByb2plY3RzL1wiKSxcblx0KS5hY3Rpb24oYXN5bmMgKG5hbWU6IHN0cmluZywgX29wdHM6IHVua25vd24sIGNtZDogQ29tbWFuZCkgPT4ge1xuXHRcdGF3YWl0IHJ1blNjYWZmb2xkQXBpKFxuXHRcdFx0dG9BcGlPcHRpb25zKHVuZGVmaW5lZCwgY21kLm9wdHNXaXRoR2xvYmFscygpLCB7IG5hbWVzOiBbbmFtZV0sIGFkZDogdHJ1ZSB9KSxcblx0XHQpO1xuXHR9KTtcblxuXHRjb25zdCBhdXRoMCA9IHByb2dyYW1cblx0XHQuY29tbWFuZChcImF1dGgwXCIpXG5cdFx0LmRlc2NyaXB0aW9uKFwiTG9nIGluIHRvIEF1dGgwIGFuZCB1cGRhdGUgYSBzY2FmZm9sZGVkIGNsaWVudFwiKTtcblx0YXV0aDBcblx0XHQuY29tbWFuZChcImxvZ2luXCIpXG5cdFx0LmRlc2NyaXB0aW9uKFwiQXV0aGVudGljYXRlIHRoZSBBdXRoMCBDTEkgKGRldmljZSBVUkw7IHRva2VucyBwZXJzaXN0IG9uIHRoZSBob3N0KVwiKVxuXHRcdC5hY3Rpb24oKCkgPT4ge1xuXHRcdFx0cnVuQXV0aDBMb2dpbigpO1xuXHRcdH0pO1xuXHRhdXRoMFxuXHRcdC5jb21tYW5kKFwiY29uZmlndXJlXCIpXG5cdFx0LmRlc2NyaXB0aW9uKFxuXHRcdFx0XCJVcGRhdGUgQXV0aDAgQVBJIHBlcm1pc3Npb25zIGFuZCBQb3N0bWFuIFNQQSBmcm9tIEBBdXRob3JpemUgaW4gdGhpcyB3b3Jrc3BhY2VcIixcblx0XHQpXG5cdFx0LmFjdGlvbigoX29wdHM6IHVua25vd24sIGNtZDogQ29tbWFuZCkgPT4ge1xuXHRcdFx0Y29uc3QgZCA9IGNtZC5vcHRzV2l0aEdsb2JhbHMoKS5kO1xuXHRcdFx0cnVuQXV0aDBDb25maWd1cmUodHlwZW9mIGQgPT09IFwic3RyaW5nXCIgPyBkIDogXCIuXCIpO1xuXHRcdH0pO1xuXG5cdHJldHVybiBwcm9ncmFtO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ2xpKGFyZ3Y6IHN0cmluZ1tdID0gcHJvY2Vzcy5hcmd2KTogUHJvbWlzZTx2b2lkPiB7XG5cdHRyeSB7XG5cdFx0YXdhaXQgY3JlYXRlUHJvZ3JhbSgpLnBhcnNlQXN5bmMoYXJndik7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGlmIChlcnIgaW5zdGFuY2VvZiBDb21tYW5kZXJFcnJvcikge1xuXHRcdFx0cHJvY2Vzcy5leGl0KGVyci5leGl0Q29kZSk7XG5cdFx0fVxuXHRcdGlmIChlcnIgaW5zdGFuY2VvZiBDcmVhdGVDbGlFcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgXFxuICAke2Vyci5tZXNzYWdlfVxcbmApO1xuXHRcdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHRcdH1cblx0XHRjb25zb2xlLmVycm9yKGVycik7XG5cdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHR9XG5cdHByb2Nlc3MuZXhpdChwcm9jZXNzLmV4aXRDb2RlID8/IDApO1xufVxuIl0sIm5hbWVzIjpbImNyZWF0ZVByb2dyYW0iLCJydW5DbGkiLCJwcm9ncmFtIiwiQ29tbWFuZCIsImV4aXRPdmVycmlkZSIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIm9wdGlvbiIsImNyZWF0ZSIsImNvbW1hbmQiLCJhZGRXZWJhcGlGZWF0dXJlT3B0aW9ucyIsImFyZ3VtZW50IiwiY29sbGVjdE5hbWUiLCJhY3Rpb24iLCJkaXJlY3RvcnkiLCJfb3B0cyIsImNtZCIsInJ1blNjYWZmb2xkQXBpIiwidG9BcGlPcHRpb25zIiwib3B0c1dpdGhHbG9iYWxzIiwidW5kZWZpbmVkIiwibmFtZXMiLCJhZGQiLCJhdXRoMCIsInJ1bkF1dGgwTG9naW4iLCJkIiwicnVuQXV0aDBDb25maWd1cmUiLCJhcmd2IiwicHJvY2VzcyIsInBhcnNlQXN5bmMiLCJlcnIiLCJDb21tYW5kZXJFcnJvciIsImV4aXQiLCJleGl0Q29kZSIsIkNyZWF0ZUNsaUVycm9yIiwiY29uc29sZSIsImVycm9yIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUFVZ0JBO2VBQUFBOztRQXlETUM7ZUFBQUE7OzsyQkFuRWtCO3lCQUNUOytCQUNrQjs0QkFNMUM7QUFFQSxTQUFTRDtJQUNmLE1BQU1FLFVBQVUsSUFBSUMsa0JBQU87SUFDM0JELFFBQVFFLFlBQVk7SUFDcEJGLFFBQ0VHLElBQUksQ0FBQyxZQUNMQyxXQUFXLENBQUMsZ0JBQ1pDLE1BQU0sQ0FBQyxrQkFBa0IsaURBQWlEO0lBRTVFLE1BQU1DLFNBQVNOLFFBQVFPLE9BQU8sQ0FBQyxVQUFVSCxXQUFXLENBQUM7SUFDckRJLElBQUFBLG1DQUF1QixFQUN0QkYsT0FDRUMsT0FBTyxDQUFDLFVBQ1JFLFFBQVEsQ0FBQyxlQUFlLHVEQUN4QkosTUFBTSxDQUNOLGlCQUNBLHVEQUNBSyx1QkFBVyxFQUNYLEVBQUUsR0FFSEMsTUFBTSxDQUFDLE9BQU9DLFdBQStCQyxPQUFnQkM7UUFDOUQsTUFBTUMsSUFBQUEsMEJBQWMsRUFBQ0MsSUFBQUEsd0JBQVksRUFBQ0osV0FBV0UsSUFBSUcsZUFBZTtJQUNqRTtJQUVBVCxJQUFBQSxtQ0FBdUIsRUFDdEJSLFFBQ0VPLE9BQU8sQ0FBQyxPQUNSSCxXQUFXLENBQUMseUNBQ1pHLE9BQU8sQ0FBQyxPQUNSRSxRQUFRLENBQUMsVUFBVSw2QkFDcEJFLE1BQU0sQ0FBQyxPQUFPUixNQUFjVSxPQUFnQkM7UUFDN0MsTUFBTUMsSUFBQUEsMEJBQWMsRUFDbkJDLElBQUFBLHdCQUFZLEVBQUNFLFdBQVdKLElBQUlHLGVBQWUsSUFBSTtZQUFFRSxPQUFPO2dCQUFDaEI7YUFBSztZQUFFaUIsS0FBSztRQUFLO0lBRTVFO0lBRUEsTUFBTUMsUUFBUXJCLFFBQ1pPLE9BQU8sQ0FBQyxTQUNSSCxXQUFXLENBQUM7SUFDZGlCLE1BQ0VkLE9BQU8sQ0FBQyxTQUNSSCxXQUFXLENBQUMsdUVBQ1pPLE1BQU0sQ0FBQztRQUNQVyxJQUFBQSw0QkFBYTtJQUNkO0lBQ0RELE1BQ0VkLE9BQU8sQ0FBQyxhQUNSSCxXQUFXLENBQ1gsa0ZBRUFPLE1BQU0sQ0FBQyxDQUFDRSxPQUFnQkM7UUFDeEIsTUFBTVMsSUFBSVQsSUFBSUcsZUFBZSxHQUFHTSxDQUFDO1FBQ2pDQyxJQUFBQSxnQ0FBaUIsRUFBQyxPQUFPRCxNQUFNLFdBQVdBLElBQUk7SUFDL0M7SUFFRCxPQUFPdkI7QUFDUjtBQUVPLGVBQWVELE9BQU8wQixPQUFpQkMsUUFBUUQsSUFBSTtJQUN6RCxJQUFJO1FBQ0gsTUFBTTNCLGdCQUFnQjZCLFVBQVUsQ0FBQ0Y7SUFDbEMsRUFBRSxPQUFPRyxLQUFLO1FBQ2IsSUFBSUEsZUFBZUMseUJBQWMsRUFBRTtZQUNsQ0gsUUFBUUksSUFBSSxDQUFDRixJQUFJRyxRQUFRO1FBQzFCO1FBQ0EsSUFBSUgsZUFBZUksdUJBQWMsRUFBRTtZQUNsQ0MsUUFBUUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFTixJQUFJTyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3BDVCxRQUFRSSxJQUFJLENBQUM7UUFDZDtRQUNBRyxRQUFRQyxLQUFLLENBQUNOO1FBQ2RGLFFBQVFJLElBQUksQ0FBQztJQUNkO0lBQ0FKLFFBQVFJLElBQUksQ0FBQ0osUUFBUUssUUFBUSxJQUFJO0FBQ2xDIn0=
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get AUTH0_CLI_INSTALL_MESSAGE () {
|
|
13
|
+
return AUTH0_CLI_INSTALL_MESSAGE;
|
|
14
|
+
},
|
|
15
|
+
get ensureLoggedIn () {
|
|
16
|
+
return ensureLoggedIn;
|
|
17
|
+
},
|
|
18
|
+
get requireInstalled () {
|
|
19
|
+
return requireInstalled;
|
|
20
|
+
},
|
|
21
|
+
get runAuth0Configure () {
|
|
22
|
+
return runAuth0Configure;
|
|
23
|
+
},
|
|
24
|
+
get runAuth0Login () {
|
|
25
|
+
return runAuth0Login;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
const _nodefs = require("node:fs");
|
|
29
|
+
const _nodepath = require("node:path");
|
|
30
|
+
const _apiname = require("./api-name.js");
|
|
31
|
+
const _authorizescopes = require("./authorize-scopes.js");
|
|
32
|
+
const _auth0cli = /*#__PURE__*/ _interop_require_wildcard(require("./features/auth0-cli.js"));
|
|
33
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
34
|
+
if (typeof WeakMap !== "function") return null;
|
|
35
|
+
var cacheBabelInterop = new WeakMap();
|
|
36
|
+
var cacheNodeInterop = new WeakMap();
|
|
37
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
38
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
39
|
+
})(nodeInterop);
|
|
40
|
+
}
|
|
41
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
42
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
43
|
+
return obj;
|
|
44
|
+
}
|
|
45
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
46
|
+
return {
|
|
47
|
+
default: obj
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
51
|
+
if (cache && cache.has(obj)) {
|
|
52
|
+
return cache.get(obj);
|
|
53
|
+
}
|
|
54
|
+
var newObj = {
|
|
55
|
+
__proto__: null
|
|
56
|
+
};
|
|
57
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
58
|
+
for(var key in obj){
|
|
59
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
60
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
61
|
+
if (desc && (desc.get || desc.set)) {
|
|
62
|
+
Object.defineProperty(newObj, key, desc);
|
|
63
|
+
} else {
|
|
64
|
+
newObj[key] = obj[key];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
newObj.default = obj;
|
|
69
|
+
if (cache) {
|
|
70
|
+
cache.set(obj, newObj);
|
|
71
|
+
}
|
|
72
|
+
return newObj;
|
|
73
|
+
}
|
|
74
|
+
/** Same Postman OAuth callbacks as `PostmanFeature`. */ const POSTMAN_CALLBACKS = [
|
|
75
|
+
"https://oauth.pstmn.io/v1/callback",
|
|
76
|
+
"https://oauth.pstmn.io/v1/browser-callback"
|
|
77
|
+
];
|
|
78
|
+
const SPA_SUFFIX = " Postman";
|
|
79
|
+
const AUTH0_CLI_INSTALL_MESSAGE = "The Auth0 CLI is required.\n" + " It is bundled in the Decohere create image (`npx @decohere/create auth0 login`).\n" + " Host install: brew install auth0/auth0-cli/auth0\n" + " Or visit: https://github.com/auth0/auth0-cli";
|
|
80
|
+
function fail(message) {
|
|
81
|
+
throw new _apiname.CreateCliError(message);
|
|
82
|
+
}
|
|
83
|
+
function requireInstalled() {
|
|
84
|
+
if (_auth0cli.isInstalled()) return;
|
|
85
|
+
fail(AUTH0_CLI_INSTALL_MESSAGE);
|
|
86
|
+
}
|
|
87
|
+
function ensureLoggedIn() {
|
|
88
|
+
requireInstalled();
|
|
89
|
+
process.stdout.write("\n Checking Auth0 credentials...");
|
|
90
|
+
let tenants = _auth0cli.listTenants();
|
|
91
|
+
if (tenants.length === 0) {
|
|
92
|
+
process.stdout.write(" not logged in.\n");
|
|
93
|
+
console.log(" Logging in to Auth0 (open the URL in your browser)...");
|
|
94
|
+
if (!_auth0cli.login()) fail("Auth0 login failed.");
|
|
95
|
+
tenants = _auth0cli.listTenants();
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
_auth0cli.listApis();
|
|
99
|
+
process.stdout.write(" ok.\n");
|
|
100
|
+
} catch (err) {
|
|
101
|
+
if (err instanceof _auth0cli.Auth0AuthError) {
|
|
102
|
+
process.stdout.write(" token expired.\n");
|
|
103
|
+
console.log(" Re-authenticating (open the URL in your browser)...");
|
|
104
|
+
if (!_auth0cli.login()) fail("Auth0 login failed.");
|
|
105
|
+
tenants = _auth0cli.listTenants();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const active = tenants.find((t)=>t.active) ?? tenants[0];
|
|
109
|
+
if (active == null) fail("No Auth0 tenant after login.");
|
|
110
|
+
return active;
|
|
111
|
+
}
|
|
112
|
+
function runAuth0Login() {
|
|
113
|
+
requireInstalled();
|
|
114
|
+
console.log(" Logging in to Auth0 (open the URL in your browser)...");
|
|
115
|
+
if (!_auth0cli.login()) fail("Auth0 login failed.");
|
|
116
|
+
const tenants = _auth0cli.listTenants();
|
|
117
|
+
const active = tenants.find((t)=>t.active) ?? tenants[0];
|
|
118
|
+
if (active == null) fail("No Auth0 tenant after login.");
|
|
119
|
+
console.log(`\n ✓ Auth0 tenant: https://${active.name}`);
|
|
120
|
+
console.log(" Tokens are stored in ~/.config/auth0 (mounted into the create image).");
|
|
121
|
+
console.log(" Next: npx @decohere/create auth0 configure");
|
|
122
|
+
}
|
|
123
|
+
function runAuth0Configure(directory = ".") {
|
|
124
|
+
const targetDir = (0, _nodepath.resolve)(directory);
|
|
125
|
+
if (!(0, _apiname.isDecohereWorkspace)(targetDir)) {
|
|
126
|
+
throw new _apiname.CreateCliError(`Not a Decohere workspace: ${targetDir}. Scaffold one first with \`npx @decohere/create webapi\`.`);
|
|
127
|
+
}
|
|
128
|
+
const active = ensureLoggedIn();
|
|
129
|
+
const issuerBaseUrl = `https://${active.name}`;
|
|
130
|
+
const projectName = process.env.DECOHERE_PROJECT_NAME?.trim() || (0, _nodepath.basename)(targetDir);
|
|
131
|
+
const envPath = (0, _nodepath.join)(targetDir, ".env");
|
|
132
|
+
const existing = readEnvFile(envPath);
|
|
133
|
+
const existingAudience = existing.AUTH0_AUDIENCE?.trim();
|
|
134
|
+
const discovered = (0, _authorizescopes.discoverAuthorizeScopes)(targetDir);
|
|
135
|
+
let existingScopes = [];
|
|
136
|
+
if (existingAudience) {
|
|
137
|
+
try {
|
|
138
|
+
existingScopes = _auth0cli.listApiScopes(existingAudience);
|
|
139
|
+
} catch (err) {
|
|
140
|
+
if (err instanceof _auth0cli.Auth0AuthError) throw err;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const apiScopes = resolveApiScopes(discovered, existingScopes);
|
|
144
|
+
console.log(discovered.length > 0 ? ` ✓ Scanned @Authorize — ${discovered.length} scope(s) from controllers` : " ✓ No @Authorize in projects/*/src — keeping existing / Hello scopes");
|
|
145
|
+
let audience = existingAudience;
|
|
146
|
+
if (audience) {
|
|
147
|
+
try {
|
|
148
|
+
_auth0cli.updateApiScopes(audience, apiScopes);
|
|
149
|
+
console.log(` ✓ API scopes ensured (${apiScopes.join(", ")})`);
|
|
150
|
+
} catch (err) {
|
|
151
|
+
console.error(` ✗ Failed to update API scopes: ${err instanceof Error ? err.message : err}`);
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
const identifier = `https://api.${projectName}`;
|
|
155
|
+
console.log(`\n Creating Auth0 API ${identifier}...`);
|
|
156
|
+
audience = _auth0cli.createApi(`${projectName} API`, identifier, apiScopes).identifier;
|
|
157
|
+
console.log(` ✓ API created: ${audience}`);
|
|
158
|
+
}
|
|
159
|
+
const appName = `${projectName}${SPA_SUFFIX}`;
|
|
160
|
+
const app = _auth0cli.ensureSpaApp(appName, [
|
|
161
|
+
...POSTMAN_CALLBACKS
|
|
162
|
+
]);
|
|
163
|
+
console.log(app.reused ? ` ✓ Reusing Auth0 SPA app (${app.client_id})` : ` ✓ Auth0 SPA app created (${app.client_id})`);
|
|
164
|
+
try {
|
|
165
|
+
_auth0cli.enableConnectionForClient(_auth0cli.DB_CONNECTION_NAME, app.client_id);
|
|
166
|
+
console.log(` ✓ Enabled ${_auth0cli.DB_CONNECTION_NAME} on SPA`);
|
|
167
|
+
} catch (err) {
|
|
168
|
+
console.error(` ✗ Failed to enable DB connection on SPA: ${err instanceof Error ? err.message : err}`);
|
|
169
|
+
}
|
|
170
|
+
upsertEnv(envPath, {
|
|
171
|
+
AUTH0_ISSUER_BASE_URL: issuerBaseUrl,
|
|
172
|
+
AUTH0_AUDIENCE: audience
|
|
173
|
+
});
|
|
174
|
+
console.log(` ✓ Wrote AUTH0_ISSUER_BASE_URL and AUTH0_AUDIENCE to .env`);
|
|
175
|
+
const adminSub = existing.AUTH0_ADMIN_USER_SUB?.trim();
|
|
176
|
+
if (adminSub) {
|
|
177
|
+
try {
|
|
178
|
+
_auth0cli.assignUserPermissions(adminSub, audience, apiScopes);
|
|
179
|
+
console.log(` ✓ Assigned ${apiScopes.length} API permission(s) to admin user`);
|
|
180
|
+
} catch (err) {
|
|
181
|
+
console.error(` ✗ Failed to assign admin permissions: ${err instanceof Error ? err.message : err}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const domain = issuerBaseUrl.replace(/^https?:\/\//, "");
|
|
185
|
+
patchPostmanAuth(targetDir, projectName, {
|
|
186
|
+
domain,
|
|
187
|
+
audience,
|
|
188
|
+
clientId: app.client_id,
|
|
189
|
+
scopes: (0, _authorizescopes.postmanRequestedScopes)(apiScopes)
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
function readEnvFile(path) {
|
|
193
|
+
if (!(0, _nodefs.existsSync)(path)) return {};
|
|
194
|
+
const out = {};
|
|
195
|
+
for (const line of (0, _nodefs.readFileSync)(path, "utf8").split("\n")){
|
|
196
|
+
const trimmed = line.trim();
|
|
197
|
+
if (trimmed === "" || trimmed.startsWith("#")) continue;
|
|
198
|
+
const eq = line.indexOf("=");
|
|
199
|
+
if (eq <= 0) continue;
|
|
200
|
+
out[line.slice(0, eq).trim()] = line.slice(eq + 1);
|
|
201
|
+
}
|
|
202
|
+
return out;
|
|
203
|
+
}
|
|
204
|
+
function resolveApiScopes(discovered, existing) {
|
|
205
|
+
const merged = (0, _authorizescopes.mergeApiScopes)(discovered, existing);
|
|
206
|
+
return merged.length > 0 ? merged : [
|
|
207
|
+
..._auth0cli.HELLO_API_SCOPES
|
|
208
|
+
].sort();
|
|
209
|
+
}
|
|
210
|
+
function upsertEnv(path, entries) {
|
|
211
|
+
let text = (0, _nodefs.existsSync)(path) ? (0, _nodefs.readFileSync)(path, "utf8") : "";
|
|
212
|
+
for (const [key, value] of Object.entries(entries)){
|
|
213
|
+
const re = new RegExp(`^${key}=.*$`, "m");
|
|
214
|
+
if (re.test(text)) {
|
|
215
|
+
text = text.replace(re, `${key}=${value}`);
|
|
216
|
+
} else {
|
|
217
|
+
text = `${text}${text === "" || text.endsWith("\n") ? "" : "\n"}${key}=${value}\n`;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (text !== "" && !text.endsWith("\n")) text = `${text}\n`;
|
|
221
|
+
(0, _nodefs.writeFileSync)(path, text);
|
|
222
|
+
}
|
|
223
|
+
function patchPostmanAuth(targetDir, projectName, auth) {
|
|
224
|
+
const envYaml = (0, _nodepath.join)(targetDir, "postman/environments", `${projectName}-Local.environment.yaml`);
|
|
225
|
+
if ((0, _nodefs.existsSync)(envYaml)) {
|
|
226
|
+
let yaml = (0, _nodefs.readFileSync)(envYaml, "utf8");
|
|
227
|
+
yaml = replaceYamlKeyedValue(yaml, "auth0Domain", auth.domain);
|
|
228
|
+
yaml = replaceYamlKeyedValue(yaml, "auth0Audience", auth.audience);
|
|
229
|
+
yaml = replaceYamlKeyedValue(yaml, "auth0ClientId", auth.clientId);
|
|
230
|
+
yaml = replaceYamlKeyedValue(yaml, "authUrl", `https://${auth.domain}/authorize?audience=${auth.audience}`);
|
|
231
|
+
yaml = replaceYamlKeyedValue(yaml, "accessTokenUrl", `https://${auth.domain}/oauth/token`);
|
|
232
|
+
yaml = replaceYamlKeyedValue(yaml, "scope", auth.scopes);
|
|
233
|
+
(0, _nodefs.writeFileSync)(envYaml, yaml);
|
|
234
|
+
console.log(` ✓ Updated Postman environment auth0ClientId (${auth.clientId})`);
|
|
235
|
+
console.log(` ✓ Updated Postman token scopes`);
|
|
236
|
+
}
|
|
237
|
+
const collectionDef = (0, _nodepath.join)(targetDir, "postman/collections", `${projectName} WebAPI`, ".resources/definition.yaml");
|
|
238
|
+
if ((0, _nodefs.existsSync)(collectionDef)) {
|
|
239
|
+
let yaml = (0, _nodefs.readFileSync)(collectionDef, "utf8");
|
|
240
|
+
yaml = yaml.replace(/^(\s*clientId:\s*).+$/m, `$1${JSON.stringify(auth.clientId)}`);
|
|
241
|
+
yaml = yaml.replace(/^(\s*scope:\s*).+$/m, `$1${JSON.stringify(auth.scopes)}`);
|
|
242
|
+
(0, _nodefs.writeFileSync)(collectionDef, yaml);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/** Replace `key: <name>` / `value: …` pairs in Postman Local View environment YAML. */ function replaceYamlKeyedValue(yaml, key, value) {
|
|
246
|
+
const quoted = JSON.stringify(value);
|
|
247
|
+
const re = new RegExp(`(key:\\s*${key}\\s*\\n\\s*value:\\s*)[^\\n]+`, "m");
|
|
248
|
+
if (!re.test(yaml)) return yaml;
|
|
249
|
+
return yaml.replace(re, `$1${quoted}`);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvYXV0aDAtY29tbWFuZHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQ3JlYXRlQ2xpRXJyb3IsIGlzRGVjb2hlcmVXb3Jrc3BhY2UgfSBmcm9tIFwiLi9hcGktbmFtZS5qc1wiO1xuaW1wb3J0IHtcblx0ZGlzY292ZXJBdXRob3JpemVTY29wZXMsXG5cdG1lcmdlQXBpU2NvcGVzLFxuXHRwb3N0bWFuUmVxdWVzdGVkU2NvcGVzLFxufSBmcm9tIFwiLi9hdXRob3JpemUtc2NvcGVzLmpzXCI7XG5pbXBvcnQgKiBhcyBhdXRoMENsaSBmcm9tIFwiLi9mZWF0dXJlcy9hdXRoMC1jbGkuanNcIjtcblxuLyoqIFNhbWUgUG9zdG1hbiBPQXV0aCBjYWxsYmFja3MgYXMgYFBvc3RtYW5GZWF0dXJlYC4gKi9cbmNvbnN0IFBPU1RNQU5fQ0FMTEJBQ0tTID0gW1xuXHRcImh0dHBzOi8vb2F1dGgucHN0bW4uaW8vdjEvY2FsbGJhY2tcIixcblx0XCJodHRwczovL29hdXRoLnBzdG1uLmlvL3YxL2Jyb3dzZXItY2FsbGJhY2tcIixcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IFNQQV9TVUZGSVggPSBcIiBQb3N0bWFuXCI7XG5cbmV4cG9ydCBjb25zdCBBVVRIMF9DTElfSU5TVEFMTF9NRVNTQUdFID1cblx0XCJUaGUgQXV0aDAgQ0xJIGlzIHJlcXVpcmVkLlxcblwiICtcblx0XCIgIEl0IGlzIGJ1bmRsZWQgaW4gdGhlIERlY29oZXJlIGNyZWF0ZSBpbWFnZSAoYG5weCBAZGVjb2hlcmUvY3JlYXRlIGF1dGgwIGxvZ2luYCkuXFxuXCIgK1xuXHRcIiAgSG9zdCBpbnN0YWxsOiBicmV3IGluc3RhbGwgYXV0aDAvYXV0aDAtY2xpL2F1dGgwXFxuXCIgK1xuXHRcIiAgT3IgdmlzaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hdXRoMC9hdXRoMC1jbGlcIjtcblxuZnVuY3Rpb24gZmFpbChtZXNzYWdlOiBzdHJpbmcpOiBuZXZlciB7XG5cdHRocm93IG5ldyBDcmVhdGVDbGlFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqIFRocm93IGlmIHRoZSBgYXV0aDBgIGJpbmFyeSBpcyBtaXNzaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVJbnN0YWxsZWQoKTogdm9pZCB7XG5cdGlmIChhdXRoMENsaS5pc0luc3RhbGxlZCgpKSByZXR1cm47XG5cdGZhaWwoQVVUSDBfQ0xJX0lOU1RBTExfTUVTU0FHRSk7XG59XG5cbi8qKlxuICogTG9nIGluIHdoZW4gdGhlcmUgaXMgbm8gdGVuYW50IHNlc3Npb24gb3IgdGhlIE1hbmFnZW1lbnQgQVBJIHRva2VuIGlzIGV4cGlyZWQuXG4gKiBSZXR1cm5zIHRoZSBhY3RpdmUgdGVuYW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlTG9nZ2VkSW4oKTogYXV0aDBDbGkuQXV0aDBUZW5hbnQge1xuXHRyZXF1aXJlSW5zdGFsbGVkKCk7XG5cblx0cHJvY2Vzcy5zdGRvdXQud3JpdGUoXCJcXG4gIENoZWNraW5nIEF1dGgwIGNyZWRlbnRpYWxzLi4uXCIpO1xuXHRsZXQgdGVuYW50cyA9IGF1dGgwQ2xpLmxpc3RUZW5hbnRzKCk7XG5cdGlmICh0ZW5hbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiIG5vdCBsb2dnZWQgaW4uXFxuXCIpO1xuXHRcdGNvbnNvbGUubG9nKFwiICBMb2dnaW5nIGluIHRvIEF1dGgwIChvcGVuIHRoZSBVUkwgaW4geW91ciBicm93c2VyKS4uLlwiKTtcblx0XHRpZiAoIWF1dGgwQ2xpLmxvZ2luKCkpIGZhaWwoXCJBdXRoMCBsb2dpbiBmYWlsZWQuXCIpO1xuXHRcdHRlbmFudHMgPSBhdXRoMENsaS5saXN0VGVuYW50cygpO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRhdXRoMENsaS5saXN0QXBpcygpO1xuXHRcdHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiIG9rLlxcblwiKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0aWYgKGVyciBpbnN0YW5jZW9mIGF1dGgwQ2xpLkF1dGgwQXV0aEVycm9yKSB7XG5cdFx0XHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIiB0b2tlbiBleHBpcmVkLlxcblwiKTtcblx0XHRcdGNvbnNvbGUubG9nKFwiICBSZS1hdXRoZW50aWNhdGluZyAob3BlbiB0aGUgVVJMIGluIHlvdXIgYnJvd3NlcikuLi5cIik7XG5cdFx0XHRpZiAoIWF1dGgwQ2xpLmxvZ2luKCkpIGZhaWwoXCJBdXRoMCBsb2dpbiBmYWlsZWQuXCIpO1xuXHRcdFx0dGVuYW50cyA9IGF1dGgwQ2xpLmxpc3RUZW5hbnRzKCk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgYWN0aXZlID0gdGVuYW50cy5maW5kKCh0KSA9PiB0LmFjdGl2ZSkgPz8gdGVuYW50c1swXTtcblx0aWYgKGFjdGl2ZSA9PSBudWxsKSBmYWlsKFwiTm8gQXV0aDAgdGVuYW50IGFmdGVyIGxvZ2luLlwiKTtcblx0cmV0dXJuIGFjdGl2ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkF1dGgwTG9naW4oKTogdm9pZCB7XG5cdHJlcXVpcmVJbnN0YWxsZWQoKTtcblx0Y29uc29sZS5sb2coXCIgIExvZ2dpbmcgaW4gdG8gQXV0aDAgKG9wZW4gdGhlIFVSTCBpbiB5b3VyIGJyb3dzZXIpLi4uXCIpO1xuXHRpZiAoIWF1dGgwQ2xpLmxvZ2luKCkpIGZhaWwoXCJBdXRoMCBsb2dpbiBmYWlsZWQuXCIpO1xuXHRjb25zdCB0ZW5hbnRzID0gYXV0aDBDbGkubGlzdFRlbmFudHMoKTtcblx0Y29uc3QgYWN0aXZlID0gdGVuYW50cy5maW5kKCh0KSA9PiB0LmFjdGl2ZSkgPz8gdGVuYW50c1swXTtcblx0aWYgKGFjdGl2ZSA9PSBudWxsKSBmYWlsKFwiTm8gQXV0aDAgdGVuYW50IGFmdGVyIGxvZ2luLlwiKTtcblx0Y29uc29sZS5sb2coYFxcbiAg4pyTIEF1dGgwIHRlbmFudDogaHR0cHM6Ly8ke2FjdGl2ZS5uYW1lfWApO1xuXHRjb25zb2xlLmxvZyhcIiAgICBUb2tlbnMgYXJlIHN0b3JlZCBpbiB+Ly5jb25maWcvYXV0aDAgKG1vdW50ZWQgaW50byB0aGUgY3JlYXRlIGltYWdlKS5cIik7XG5cdGNvbnNvbGUubG9nKFwiICAgIE5leHQ6IG5weCBAZGVjb2hlcmUvY3JlYXRlIGF1dGgwIGNvbmZpZ3VyZVwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkF1dGgwQ29uZmlndXJlKGRpcmVjdG9yeSA9IFwiLlwiKTogdm9pZCB7XG5cdGNvbnN0IHRhcmdldERpciA9IHJlc29sdmUoZGlyZWN0b3J5KTtcblx0aWYgKCFpc0RlY29oZXJlV29ya3NwYWNlKHRhcmdldERpcikpIHtcblx0XHR0aHJvdyBuZXcgQ3JlYXRlQ2xpRXJyb3IoXG5cdFx0XHRgTm90IGEgRGVjb2hlcmUgd29ya3NwYWNlOiAke3RhcmdldERpcn0uIFNjYWZmb2xkIG9uZSBmaXJzdCB3aXRoIFxcYG5weCBAZGVjb2hlcmUvY3JlYXRlIHdlYmFwaVxcYC5gLFxuXHRcdCk7XG5cdH1cblxuXHRjb25zdCBhY3RpdmUgPSBlbnN1cmVMb2dnZWRJbigpO1xuXHRjb25zdCBpc3N1ZXJCYXNlVXJsID0gYGh0dHBzOi8vJHthY3RpdmUubmFtZX1gO1xuXHRjb25zdCBwcm9qZWN0TmFtZSA9IHByb2Nlc3MuZW52LkRFQ09IRVJFX1BST0pFQ1RfTkFNRT8udHJpbSgpIHx8IGJhc2VuYW1lKHRhcmdldERpcik7XG5cdGNvbnN0IGVudlBhdGggPSBqb2luKHRhcmdldERpciwgXCIuZW52XCIpO1xuXHRjb25zdCBleGlzdGluZyA9IHJlYWRFbnZGaWxlKGVudlBhdGgpO1xuXHRjb25zdCBleGlzdGluZ0F1ZGllbmNlID0gZXhpc3RpbmcuQVVUSDBfQVVESUVOQ0U/LnRyaW0oKTtcblx0Y29uc3QgZGlzY292ZXJlZCA9IGRpc2NvdmVyQXV0aG9yaXplU2NvcGVzKHRhcmdldERpcik7XG5cdGxldCBleGlzdGluZ1Njb3Blczogc3RyaW5nW10gPSBbXTtcblx0aWYgKGV4aXN0aW5nQXVkaWVuY2UpIHtcblx0XHR0cnkge1xuXHRcdFx0ZXhpc3RpbmdTY29wZXMgPSBhdXRoMENsaS5saXN0QXBpU2NvcGVzKGV4aXN0aW5nQXVkaWVuY2UpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0aWYgKGVyciBpbnN0YW5jZW9mIGF1dGgwQ2xpLkF1dGgwQXV0aEVycm9yKSB0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGFwaVNjb3BlcyA9IHJlc29sdmVBcGlTY29wZXMoZGlzY292ZXJlZCwgZXhpc3RpbmdTY29wZXMpO1xuXHRjb25zb2xlLmxvZyhcblx0XHRkaXNjb3ZlcmVkLmxlbmd0aCA+IDBcblx0XHRcdD8gYCAg4pyTIFNjYW5uZWQgQEF1dGhvcml6ZSDigJQgJHtkaXNjb3ZlcmVkLmxlbmd0aH0gc2NvcGUocykgZnJvbSBjb250cm9sbGVyc2Bcblx0XHRcdDogXCIgIOKckyBObyBAQXV0aG9yaXplIGluIHByb2plY3RzLyovc3JjIOKAlCBrZWVwaW5nIGV4aXN0aW5nIC8gSGVsbG8gc2NvcGVzXCIsXG5cdCk7XG5cblx0bGV0IGF1ZGllbmNlID0gZXhpc3RpbmdBdWRpZW5jZTtcblx0aWYgKGF1ZGllbmNlKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGF1dGgwQ2xpLnVwZGF0ZUFwaVNjb3BlcyhhdWRpZW5jZSwgYXBpU2NvcGVzKTtcblx0XHRcdGNvbnNvbGUubG9nKGAgIOKckyBBUEkgc2NvcGVzIGVuc3VyZWQgKCR7YXBpU2NvcGVzLmpvaW4oXCIsIFwiKX0pYCk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgICDinJcgRmFpbGVkIHRvIHVwZGF0ZSBBUEkgc2NvcGVzOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnJ9YCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGlkZW50aWZpZXIgPSBgaHR0cHM6Ly9hcGkuJHtwcm9qZWN0TmFtZX1gO1xuXHRcdGNvbnNvbGUubG9nKGBcXG4gIENyZWF0aW5nIEF1dGgwIEFQSSAke2lkZW50aWZpZXJ9Li4uYCk7XG5cdFx0YXVkaWVuY2UgPSBhdXRoMENsaS5jcmVhdGVBcGkoYCR7cHJvamVjdE5hbWV9IEFQSWAsIGlkZW50aWZpZXIsIGFwaVNjb3BlcykuaWRlbnRpZmllcjtcblx0XHRjb25zb2xlLmxvZyhgICDinJMgQVBJIGNyZWF0ZWQ6ICR7YXVkaWVuY2V9YCk7XG5cdH1cblxuXHRjb25zdCBhcHBOYW1lID0gYCR7cHJvamVjdE5hbWV9JHtTUEFfU1VGRklYfWA7XG5cdGNvbnN0IGFwcCA9IGF1dGgwQ2xpLmVuc3VyZVNwYUFwcChhcHBOYW1lLCBbLi4uUE9TVE1BTl9DQUxMQkFDS1NdKTtcblx0Y29uc29sZS5sb2coXG5cdFx0YXBwLnJldXNlZFxuXHRcdFx0PyBgICDinJMgUmV1c2luZyBBdXRoMCBTUEEgYXBwICgke2FwcC5jbGllbnRfaWR9KWBcblx0XHRcdDogYCAg4pyTIEF1dGgwIFNQQSBhcHAgY3JlYXRlZCAoJHthcHAuY2xpZW50X2lkfSlgLFxuXHQpO1xuXHR0cnkge1xuXHRcdGF1dGgwQ2xpLmVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQoYXV0aDBDbGkuREJfQ09OTkVDVElPTl9OQU1FLCBhcHAuY2xpZW50X2lkKTtcblx0XHRjb25zb2xlLmxvZyhgICDinJMgRW5hYmxlZCAke2F1dGgwQ2xpLkRCX0NPTk5FQ1RJT05fTkFNRX0gb24gU1BBYCk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRgICDinJcgRmFpbGVkIHRvIGVuYWJsZSBEQiBjb25uZWN0aW9uIG9uIFNQQTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfWAsXG5cdFx0KTtcblx0fVxuXG5cdHVwc2VydEVudihlbnZQYXRoLCB7XG5cdFx0QVVUSDBfSVNTVUVSX0JBU0VfVVJMOiBpc3N1ZXJCYXNlVXJsLFxuXHRcdEFVVEgwX0FVRElFTkNFOiBhdWRpZW5jZSxcblx0fSk7XG5cdGNvbnNvbGUubG9nKGAgIOKckyBXcm90ZSBBVVRIMF9JU1NVRVJfQkFTRV9VUkwgYW5kIEFVVEgwX0FVRElFTkNFIHRvIC5lbnZgKTtcblxuXHRjb25zdCBhZG1pblN1YiA9IGV4aXN0aW5nLkFVVEgwX0FETUlOX1VTRVJfU1VCPy50cmltKCk7XG5cdGlmIChhZG1pblN1Yikge1xuXHRcdHRyeSB7XG5cdFx0XHRhdXRoMENsaS5hc3NpZ25Vc2VyUGVybWlzc2lvbnMoYWRtaW5TdWIsIGF1ZGllbmNlLCBhcGlTY29wZXMpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAg4pyTIEFzc2lnbmVkICR7YXBpU2NvcGVzLmxlbmd0aH0gQVBJIHBlcm1pc3Npb24ocykgdG8gYWRtaW4gdXNlcmApO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0YCAg4pyXIEZhaWxlZCB0byBhc3NpZ24gYWRtaW4gcGVybWlzc2lvbnM6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycn1gLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBkb21haW4gPSBpc3N1ZXJCYXNlVXJsLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgXCJcIik7XG5cdHBhdGNoUG9zdG1hbkF1dGgodGFyZ2V0RGlyLCBwcm9qZWN0TmFtZSwge1xuXHRcdGRvbWFpbixcblx0XHRhdWRpZW5jZSxcblx0XHRjbGllbnRJZDogYXBwLmNsaWVudF9pZCxcblx0XHRzY29wZXM6IHBvc3RtYW5SZXF1ZXN0ZWRTY29wZXMoYXBpU2NvcGVzKSxcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKHBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuXHRpZiAoIWV4aXN0c1N5bmMocGF0aCkpIHJldHVybiB7fTtcblx0Y29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdGZvciAoY29uc3QgbGluZSBvZiByZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpLnNwbGl0KFwiXFxuXCIpKSB7XG5cdFx0Y29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuXHRcdGlmICh0cmltbWVkID09PSBcIlwiIHx8IHRyaW1tZWQuc3RhcnRzV2l0aChcIiNcIikpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IGVxID0gbGluZS5pbmRleE9mKFwiPVwiKTtcblx0XHRpZiAoZXEgPD0gMCkgY29udGludWU7XG5cdFx0b3V0W2xpbmUuc2xpY2UoMCwgZXEpLnRyaW0oKV0gPSBsaW5lLnNsaWNlKGVxICsgMSk7XG5cdH1cblx0cmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFwaVNjb3Blcyhcblx0ZGlzY292ZXJlZDogcmVhZG9ubHkgc3RyaW5nW10sXG5cdGV4aXN0aW5nOiByZWFkb25seSBzdHJpbmdbXSxcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgbWVyZ2VkID0gbWVyZ2VBcGlTY29wZXMoZGlzY292ZXJlZCwgZXhpc3RpbmcpO1xuXHRyZXR1cm4gbWVyZ2VkLmxlbmd0aCA+IDAgPyBtZXJnZWQgOiBbLi4uYXV0aDBDbGkuSEVMTE9fQVBJX1NDT1BFU10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiB1cHNlcnRFbnYocGF0aDogc3RyaW5nLCBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCB7XG5cdGxldCB0ZXh0ID0gZXhpc3RzU3luYyhwYXRoKSA/IHJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIikgOiBcIlwiO1xuXHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuXHRcdGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXiR7a2V5fT0uKiRgLCBcIm1cIik7XG5cdFx0aWYgKHJlLnRlc3QodGV4dCkpIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UocmUsIGAke2tleX09JHt2YWx1ZX1gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGV4dCA9IGAke3RleHR9JHt0ZXh0ID09PSBcIlwiIHx8IHRleHQuZW5kc1dpdGgoXCJcXG5cIikgPyBcIlwiIDogXCJcXG5cIn0ke2tleX09JHt2YWx1ZX1cXG5gO1xuXHRcdH1cblx0fVxuXHRpZiAodGV4dCAhPT0gXCJcIiAmJiAhdGV4dC5lbmRzV2l0aChcIlxcblwiKSkgdGV4dCA9IGAke3RleHR9XFxuYDtcblx0d3JpdGVGaWxlU3luYyhwYXRoLCB0ZXh0KTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hQb3N0bWFuQXV0aChcblx0dGFyZ2V0RGlyOiBzdHJpbmcsXG5cdHByb2plY3ROYW1lOiBzdHJpbmcsXG5cdGF1dGg6IHsgZG9tYWluOiBzdHJpbmc7IGF1ZGllbmNlOiBzdHJpbmc7IGNsaWVudElkOiBzdHJpbmc7IHNjb3Blczogc3RyaW5nIH0sXG4pOiB2b2lkIHtcblx0Y29uc3QgZW52WWFtbCA9IGpvaW4oXG5cdFx0dGFyZ2V0RGlyLFxuXHRcdFwicG9zdG1hbi9lbnZpcm9ubWVudHNcIixcblx0XHRgJHtwcm9qZWN0TmFtZX0tTG9jYWwuZW52aXJvbm1lbnQueWFtbGAsXG5cdCk7XG5cdGlmIChleGlzdHNTeW5jKGVudllhbWwpKSB7XG5cdFx0bGV0IHlhbWwgPSByZWFkRmlsZVN5bmMoZW52WWFtbCwgXCJ1dGY4XCIpO1xuXHRcdHlhbWwgPSByZXBsYWNlWWFtbEtleWVkVmFsdWUoeWFtbCwgXCJhdXRoMERvbWFpblwiLCBhdXRoLmRvbWFpbik7XG5cdFx0eWFtbCA9IHJlcGxhY2VZYW1sS2V5ZWRWYWx1ZSh5YW1sLCBcImF1dGgwQXVkaWVuY2VcIiwgYXV0aC5hdWRpZW5jZSk7XG5cdFx0eWFtbCA9IHJlcGxhY2VZYW1sS2V5ZWRWYWx1ZSh5YW1sLCBcImF1dGgwQ2xpZW50SWRcIiwgYXV0aC5jbGllbnRJZCk7XG5cdFx0eWFtbCA9IHJlcGxhY2VZYW1sS2V5ZWRWYWx1ZShcblx0XHRcdHlhbWwsXG5cdFx0XHRcImF1dGhVcmxcIixcblx0XHRcdGBodHRwczovLyR7YXV0aC5kb21haW59L2F1dGhvcml6ZT9hdWRpZW5jZT0ke2F1dGguYXVkaWVuY2V9YCxcblx0XHQpO1xuXHRcdHlhbWwgPSByZXBsYWNlWWFtbEtleWVkVmFsdWUoeWFtbCwgXCJhY2Nlc3NUb2tlblVybFwiLCBgaHR0cHM6Ly8ke2F1dGguZG9tYWlufS9vYXV0aC90b2tlbmApO1xuXHRcdHlhbWwgPSByZXBsYWNlWWFtbEtleWVkVmFsdWUoeWFtbCwgXCJzY29wZVwiLCBhdXRoLnNjb3Blcyk7XG5cdFx0d3JpdGVGaWxlU3luYyhlbnZZYW1sLCB5YW1sKTtcblx0XHRjb25zb2xlLmxvZyhgICDinJMgVXBkYXRlZCBQb3N0bWFuIGVudmlyb25tZW50IGF1dGgwQ2xpZW50SWQgKCR7YXV0aC5jbGllbnRJZH0pYCk7XG5cdFx0Y29uc29sZS5sb2coYCAg4pyTIFVwZGF0ZWQgUG9zdG1hbiB0b2tlbiBzY29wZXNgKTtcblx0fVxuXG5cdGNvbnN0IGNvbGxlY3Rpb25EZWYgPSBqb2luKFxuXHRcdHRhcmdldERpcixcblx0XHRcInBvc3RtYW4vY29sbGVjdGlvbnNcIixcblx0XHRgJHtwcm9qZWN0TmFtZX0gV2ViQVBJYCxcblx0XHRcIi5yZXNvdXJjZXMvZGVmaW5pdGlvbi55YW1sXCIsXG5cdCk7XG5cdGlmIChleGlzdHNTeW5jKGNvbGxlY3Rpb25EZWYpKSB7XG5cdFx0bGV0IHlhbWwgPSByZWFkRmlsZVN5bmMoY29sbGVjdGlvbkRlZiwgXCJ1dGY4XCIpO1xuXHRcdHlhbWwgPSB5YW1sLnJlcGxhY2UoL14oXFxzKmNsaWVudElkOlxccyopLiskL20sIGAkMSR7SlNPTi5zdHJpbmdpZnkoYXV0aC5jbGllbnRJZCl9YCk7XG5cdFx0eWFtbCA9IHlhbWwucmVwbGFjZSgvXihcXHMqc2NvcGU6XFxzKikuKyQvbSwgYCQxJHtKU09OLnN0cmluZ2lmeShhdXRoLnNjb3Blcyl9YCk7XG5cdFx0d3JpdGVGaWxlU3luYyhjb2xsZWN0aW9uRGVmLCB5YW1sKTtcblx0fVxufVxuXG4vKiogUmVwbGFjZSBga2V5OiA8bmFtZT5gIC8gYHZhbHVlOiDigKZgIHBhaXJzIGluIFBvc3RtYW4gTG9jYWwgVmlldyBlbnZpcm9ubWVudCBZQU1MLiAqL1xuZnVuY3Rpb24gcmVwbGFjZVlhbWxLZXllZFZhbHVlKHlhbWw6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBxdW90ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cdGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgKGtleTpcXFxccyoke2tleX1cXFxccypcXFxcblxcXFxzKnZhbHVlOlxcXFxzKilbXlxcXFxuXStgLCBcIm1cIik7XG5cdGlmICghcmUudGVzdCh5YW1sKSkgcmV0dXJuIHlhbWw7XG5cdHJldHVybiB5YW1sLnJlcGxhY2UocmUsIGAkMSR7cXVvdGVkfWApO1xufVxuIl0sIm5hbWVzIjpbIkFVVEgwX0NMSV9JTlNUQUxMX01FU1NBR0UiLCJlbnN1cmVMb2dnZWRJbiIsInJlcXVpcmVJbnN0YWxsZWQiLCJydW5BdXRoMENvbmZpZ3VyZSIsInJ1bkF1dGgwTG9naW4iLCJQT1NUTUFOX0NBTExCQUNLUyIsIlNQQV9TVUZGSVgiLCJmYWlsIiwibWVzc2FnZSIsIkNyZWF0ZUNsaUVycm9yIiwiYXV0aDBDbGkiLCJpc0luc3RhbGxlZCIsInByb2Nlc3MiLCJzdGRvdXQiLCJ3cml0ZSIsInRlbmFudHMiLCJsaXN0VGVuYW50cyIsImxlbmd0aCIsImNvbnNvbGUiLCJsb2ciLCJsb2dpbiIsImxpc3RBcGlzIiwiZXJyIiwiQXV0aDBBdXRoRXJyb3IiLCJhY3RpdmUiLCJmaW5kIiwidCIsIm5hbWUiLCJkaXJlY3RvcnkiLCJ0YXJnZXREaXIiLCJyZXNvbHZlIiwiaXNEZWNvaGVyZVdvcmtzcGFjZSIsImlzc3VlckJhc2VVcmwiLCJwcm9qZWN0TmFtZSIsImVudiIsIkRFQ09IRVJFX1BST0pFQ1RfTkFNRSIsInRyaW0iLCJiYXNlbmFtZSIsImVudlBhdGgiLCJqb2luIiwiZXhpc3RpbmciLCJyZWFkRW52RmlsZSIsImV4aXN0aW5nQXVkaWVuY2UiLCJBVVRIMF9BVURJRU5DRSIsImRpc2NvdmVyZWQiLCJkaXNjb3ZlckF1dGhvcml6ZVNjb3BlcyIsImV4aXN0aW5nU2NvcGVzIiwibGlzdEFwaVNjb3BlcyIsImFwaVNjb3BlcyIsInJlc29sdmVBcGlTY29wZXMiLCJhdWRpZW5jZSIsInVwZGF0ZUFwaVNjb3BlcyIsImVycm9yIiwiRXJyb3IiLCJpZGVudGlmaWVyIiwiY3JlYXRlQXBpIiwiYXBwTmFtZSIsImFwcCIsImVuc3VyZVNwYUFwcCIsInJldXNlZCIsImNsaWVudF9pZCIsImVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQiLCJEQl9DT05ORUNUSU9OX05BTUUiLCJ1cHNlcnRFbnYiLCJBVVRIMF9JU1NVRVJfQkFTRV9VUkwiLCJhZG1pblN1YiIsIkFVVEgwX0FETUlOX1VTRVJfU1VCIiwiYXNzaWduVXNlclBlcm1pc3Npb25zIiwiZG9tYWluIiwicmVwbGFjZSIsInBhdGNoUG9zdG1hbkF1dGgiLCJjbGllbnRJZCIsInNjb3BlcyIsInBvc3RtYW5SZXF1ZXN0ZWRTY29wZXMiLCJwYXRoIiwiZXhpc3RzU3luYyIsIm91dCIsImxpbmUiLCJyZWFkRmlsZVN5bmMiLCJzcGxpdCIsInRyaW1tZWQiLCJzdGFydHNXaXRoIiwiZXEiLCJpbmRleE9mIiwic2xpY2UiLCJtZXJnZWQiLCJtZXJnZUFwaVNjb3BlcyIsIkhFTExPX0FQSV9TQ09QRVMiLCJzb3J0IiwiZW50cmllcyIsInRleHQiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsInJlIiwiUmVnRXhwIiwidGVzdCIsImVuZHNXaXRoIiwid3JpdGVGaWxlU3luYyIsImF1dGgiLCJlbnZZYW1sIiwieWFtbCIsInJlcGxhY2VZYW1sS2V5ZWRWYWx1ZSIsImNvbGxlY3Rp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
|