@sendly/cli 3.35.0 → 3.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/commands/business-upgrade/cancel.d.ts +12 -0
  2. package/dist/commands/business-upgrade/cancel.js +47 -0
  3. package/dist/commands/business-upgrade/disposition.d.ts +13 -0
  4. package/dist/commands/business-upgrade/disposition.js +44 -0
  5. package/dist/commands/business-upgrade/preflight.d.ts +16 -0
  6. package/dist/commands/business-upgrade/preflight.js +82 -0
  7. package/dist/commands/business-upgrade/resubmit.d.ts +24 -0
  8. package/dist/commands/business-upgrade/resubmit.js +109 -0
  9. package/dist/commands/business-upgrade/start.d.ts +38 -0
  10. package/dist/commands/business-upgrade/start.js +142 -0
  11. package/dist/commands/business-upgrade/status.d.ts +11 -0
  12. package/dist/commands/business-upgrade/status.js +38 -0
  13. package/dist/commands/enterprise/verification/get.d.ts +13 -0
  14. package/dist/commands/enterprise/verification/get.js +78 -0
  15. package/dist/commands/enterprise/verification/resubmit.d.ts +41 -0
  16. package/dist/commands/enterprise/verification/resubmit.js +87 -0
  17. package/dist/commands/enterprise/verification/submit.d.ts +77 -0
  18. package/dist/commands/enterprise/verification/submit.js +212 -0
  19. package/dist/commands/numbers/buy.d.ts +31 -0
  20. package/dist/commands/numbers/buy.js +252 -0
  21. package/dist/commands/numbers/list.d.ts +10 -0
  22. package/dist/commands/numbers/list.js +53 -0
  23. package/dist/commands/numbers/search.d.ts +13 -0
  24. package/dist/commands/numbers/search.js +78 -0
  25. package/dist/lib/auth.js +2 -94
  26. package/dist/lib/config.js +31 -2
  27. package/dist/lib/detect-install-path.d.ts +11 -7
  28. package/dist/lib/detect-install-path.js +25 -9
  29. package/dist/lib/keypress.d.ts +26 -0
  30. package/dist/lib/keypress.js +103 -0
  31. package/oclif.manifest.json +1931 -622
  32. package/package.json +7 -1
@@ -0,0 +1,212 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import * as fs from "node:fs";
3
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
4
+ import { apiClient } from "../../../lib/api-client.js";
5
+ import { success, json, isJsonMode, spinner, colors, keyValue, } from "../../../lib/output.js";
6
+ export default class EnterpriseVerificationSubmit extends AuthenticatedCommand {
7
+ static description = "Submit (or resubmit) a verification for an enterprise workspace. Partial-update friendly: only the fields you pass are changed.";
8
+ static examples = [
9
+ '<%= config.bin %> enterprise verification submit org_abc123 --data ./verification.json',
10
+ '<%= config.bin %> enterprise verification submit org_abc123 --business-name "Acme LLC" --website https://acme.com --use-case "Insurance Services"',
11
+ '<%= config.bin %> enterprise verification submit org_abc123 --contact-email new@acme.com',
12
+ ];
13
+ static args = {
14
+ workspaceId: Args.string({
15
+ description: "Workspace ID",
16
+ required: true,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...AuthenticatedCommand.baseFlags,
21
+ data: Flags.string({
22
+ char: "d",
23
+ description: "Path to a JSON file containing the verification payload",
24
+ }),
25
+ "business-name": Flags.string({
26
+ description: "Legal business name",
27
+ }),
28
+ "doing-business-as": Flags.string({
29
+ description: "DBA / trading name",
30
+ }),
31
+ website: Flags.string({
32
+ description: "Business website URL",
33
+ }),
34
+ "entity-type": Flags.string({
35
+ description: "Entity type (SOLE_PROPRIETOR | PRIVATE_PROFIT | PUBLIC_PROFIT | NON_PROFIT | GOVERNMENT)",
36
+ options: [
37
+ "SOLE_PROPRIETOR",
38
+ "PRIVATE_PROFIT",
39
+ "PUBLIC_PROFIT",
40
+ "NON_PROFIT",
41
+ "GOVERNMENT",
42
+ ],
43
+ }),
44
+ "address-street": Flags.string({ description: "Street address" }),
45
+ "address-city": Flags.string({ description: "City" }),
46
+ "address-state": Flags.string({ description: "State / region" }),
47
+ "address-zip": Flags.string({ description: "ZIP / postal code" }),
48
+ "address-country": Flags.string({ description: "Country code (e.g. US)" }),
49
+ "contact-first-name": Flags.string({ description: "Contact first name" }),
50
+ "contact-last-name": Flags.string({ description: "Contact last name" }),
51
+ "contact-email": Flags.string({ description: "Contact email address" }),
52
+ "contact-phone": Flags.string({
53
+ description: "Contact phone number (E.164)",
54
+ }),
55
+ brn: Flags.string({
56
+ description: "Business registration number (omit for sole proprietors; server will strip)",
57
+ }),
58
+ "brn-type": Flags.string({
59
+ description: "BRN type (EIN | SSN | DUNS | CRA | VAT | LEI | OTHER)",
60
+ options: ["EIN", "SSN", "DUNS", "CRA", "VAT", "LEI", "OTHER"],
61
+ }),
62
+ "brn-country": Flags.string({
63
+ description: "BRN country code (e.g. US)",
64
+ }),
65
+ "use-case": Flags.string({
66
+ description: "Use case (Telnyx use-case enum value)",
67
+ }),
68
+ "use-case-summary": Flags.string({
69
+ description: "Use case summary",
70
+ }),
71
+ "sample-messages": Flags.string({
72
+ description: "Sample messages",
73
+ }),
74
+ "opt-in-workflow": Flags.string({
75
+ description: "Opt-in workflow description",
76
+ }),
77
+ "opt-in-image-urls": Flags.string({
78
+ description: "Opt-in image URLs (newline or comma separated)",
79
+ }),
80
+ "monthly-volume": Flags.string({
81
+ description: "Estimated monthly message volume",
82
+ }),
83
+ "additional-information": Flags.string({
84
+ description: "Additional information for the carrier",
85
+ }),
86
+ "age-gated-content": Flags.boolean({
87
+ description: "Mark traffic as age-gated content",
88
+ allowNo: true,
89
+ }),
90
+ "isv-reseller": Flags.string({
91
+ description: "ISV / reseller name (if applicable)",
92
+ }),
93
+ "privacy-url": Flags.string({ description: "Privacy policy URL" }),
94
+ "terms-url": Flags.string({ description: "Terms of service URL" }),
95
+ };
96
+ async run() {
97
+ const { args, flags } = await this.parse(EnterpriseVerificationSubmit);
98
+ await submitVerification(args.workspaceId, flags, "Submitting verification...");
99
+ }
100
+ }
101
+ export async function submitVerification(workspaceId, flags, spinnerText) {
102
+ const payload = buildPayload(flags);
103
+ if (Object.keys(payload).length === 0) {
104
+ throw new Error("No fields provided. Pass --data <file> or one or more --* field flags.");
105
+ }
106
+ const spin = spinner(spinnerText);
107
+ spin.start();
108
+ let response;
109
+ try {
110
+ response = await apiClient.post(`/api/v1/enterprise/workspaces/${encodeURIComponent(workspaceId)}/verification/submit`, payload);
111
+ }
112
+ catch (err) {
113
+ spin.fail("Verification submit failed");
114
+ throw err;
115
+ }
116
+ spin.succeed("Verification submitted");
117
+ if (isJsonMode()) {
118
+ json(response);
119
+ return;
120
+ }
121
+ const status = response.status ||
122
+ response.verification?.status ||
123
+ "submitted";
124
+ const id = response.id || response.verification?.id;
125
+ const details = {
126
+ Workspace: workspaceId,
127
+ Status: colors.primary(status),
128
+ };
129
+ if (id)
130
+ details["Verification ID"] = id;
131
+ success("Verification submitted", details);
132
+ if (Object.keys(response).length > 0 && !id) {
133
+ keyValue(response);
134
+ }
135
+ }
136
+ export function buildPayload(flags) {
137
+ let payload = {};
138
+ const dataFlag = flags.data;
139
+ if (dataFlag) {
140
+ if (!fs.existsSync(dataFlag)) {
141
+ throw new Error(`File not found: ${dataFlag}`);
142
+ }
143
+ const content = fs.readFileSync(dataFlag, "utf-8");
144
+ try {
145
+ payload = JSON.parse(content);
146
+ }
147
+ catch {
148
+ throw new Error(`Invalid JSON in ${dataFlag}. Expected a verification payload object.`);
149
+ }
150
+ }
151
+ const setIf = (key, value) => {
152
+ if (value !== undefined) {
153
+ payload[key] = value;
154
+ }
155
+ };
156
+ setIf("businessName", flags["business-name"]);
157
+ setIf("doingBusinessAs", flags["doing-business-as"]);
158
+ setIf("website", flags.website);
159
+ setIf("entityType", flags["entity-type"]);
160
+ setIf("brn", flags.brn);
161
+ setIf("brnType", flags["brn-type"]);
162
+ setIf("brnCountry", flags["brn-country"]);
163
+ setIf("useCase", flags["use-case"]);
164
+ setIf("useCaseSummary", flags["use-case-summary"]);
165
+ setIf("sampleMessages", flags["sample-messages"]);
166
+ setIf("optInWorkflow", flags["opt-in-workflow"]);
167
+ setIf("optInImageUrls", flags["opt-in-image-urls"]);
168
+ setIf("monthlyVolume", flags["monthly-volume"]);
169
+ setIf("additionalInformation", flags["additional-information"]);
170
+ setIf("isvReseller", flags["isv-reseller"]);
171
+ setIf("privacyUrl", flags["privacy-url"]);
172
+ setIf("termsUrl", flags["terms-url"]);
173
+ if (flags["age-gated-content"] !== undefined) {
174
+ payload.ageGatedContent = flags["age-gated-content"];
175
+ }
176
+ const address = {
177
+ ...(payload.address || {}),
178
+ ...stripUndefined({
179
+ street: flags["address-street"],
180
+ city: flags["address-city"],
181
+ state: flags["address-state"],
182
+ zip: flags["address-zip"],
183
+ country: flags["address-country"],
184
+ }),
185
+ };
186
+ if (Object.keys(address).length > 0) {
187
+ payload.address = address;
188
+ }
189
+ const contact = {
190
+ ...(payload.contact || {}),
191
+ ...stripUndefined({
192
+ firstName: flags["contact-first-name"],
193
+ lastName: flags["contact-last-name"],
194
+ email: flags["contact-email"],
195
+ phone: flags["contact-phone"],
196
+ }),
197
+ };
198
+ if (Object.keys(contact).length > 0) {
199
+ payload.contact = contact;
200
+ }
201
+ return payload;
202
+ }
203
+ function stripUndefined(obj) {
204
+ const out = {};
205
+ for (const [k, v] of Object.entries(obj)) {
206
+ if (v !== undefined) {
207
+ out[k] = v;
208
+ }
209
+ }
210
+ return out;
211
+ }
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2VudGVycHJpc2UvdmVyaWZpY2F0aW9uL3N1Ym1pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUNMLE9BQU8sRUFDUCxJQUFJLEVBQ0osVUFBVSxFQUNWLE9BQU8sRUFDUCxNQUFNLEVBQ04sUUFBUSxHQUNULE1BQU0sd0JBQXdCLENBQUM7QUEyQ2hDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sNEJBQTZCLFNBQVEsb0JBQW9CO0lBQzVFLE1BQU0sQ0FBQyxXQUFXLEdBQ2hCLGlJQUFpSSxDQUFDO0lBRXBJLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsd0ZBQXdGO1FBQ3hGLG1KQUFtSjtRQUNuSiwwRkFBMEY7S0FDM0YsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUN2QixXQUFXLEVBQUUsY0FBYztZQUMzQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNqQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSx5REFBeUQ7U0FDdkUsQ0FBQztRQUNGLGVBQWUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLFdBQVcsRUFBRSxxQkFBcUI7U0FDbkMs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Q0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHO1FBQ2QsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQzFCLEdBQUcsY0FBYyxDQUFDO1lBQ2hCLFNBQVMsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQXVCO1lBQzVELFFBQVEsRUFBRSxLQUFLLENBQUMsbUJBQW1CLENBQXVCO1lBQzFELEtBQUssRUFBRSxLQUFLLENBQUMsZUFBZSxDQUF1QjtZQUNuRCxLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBdUI7U0FDcEQsQ0FBQztLQUNILENBQUM7SUFDRixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQzVCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQW9DLEdBQU07SUFDL0QsTUFBTSxHQUFHLEdBQWUsRUFBRSxDQUFDO0lBQzNCLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkIsR0FBK0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcmdzLCBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAganNvbixcbiAgaXNKc29uTW9kZSxcbiAgc3Bpbm5lcixcbiAgY29sb3JzLFxuICBrZXlWYWx1ZSxcbn0gZnJvbSBcIi4uLy4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIFZlcmlmaWNhdGlvblN1Ym1pdElucHV0IHtcbiAgYnVzaW5lc3NOYW1lPzogc3RyaW5nO1xuICBkb2luZ0J1c2luZXNzQXM/OiBzdHJpbmc7XG4gIHdlYnNpdGU/OiBzdHJpbmc7XG4gIGFkZHJlc3M/OiB7XG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgc3RhdGU/OiBzdHJpbmc7XG4gICAgemlwPzogc3RyaW5nO1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gIH07XG4gIGNvbnRhY3Q/OiB7XG4gICAgZmlyc3ROYW1lPzogc3RyaW5nO1xuICAgIGxhc3ROYW1lPzogc3RyaW5nO1xuICAgIGVtYWlsPzogc3RyaW5nO1xuICAgIHBob25lPzogc3RyaW5nO1xuICB9O1xuICBicm4/OiBzdHJpbmcgfCBudWxsO1xuICBicm5UeXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgYnJuQ291bnRyeT86IHN0cmluZyB8IG51bGw7XG4gIGVudGl0eVR5cGU/OiBzdHJpbmc7XG4gIHVzZUNhc2U/OiBzdHJpbmc7XG4gIHVzZUNhc2VTdW1tYXJ5Pzogc3RyaW5nO1xuICBzYW1wbGVNZXNzYWdlcz86IHN0cmluZztcbiAgb3B0SW5Xb3JrZmxvdz86IHN0cmluZztcbiAgb3B0SW5JbWFnZVVybHM/OiBzdHJpbmc7XG4gIG1vbnRobHlWb2x1bWU/OiBzdHJpbmc7XG4gIGFkZGl0aW9uYWxJbmZvcm1hdGlvbj86IHN0cmluZztcbiAgYWdlR2F0ZWRDb250ZW50PzogYm9vbGVhbjtcbiAgaXN2UmVzZWxsZXI/OiBzdHJpbmc7XG4gIHByaXZhY3lVcmw/OiBzdHJpbmc7XG4gIHRlcm1zVXJsPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU3VibWl0UmVzcG9uc2Uge1xuICBzdGF0dXM/OiBzdHJpbmc7XG4gIHZlcmlmaWNhdGlvbj86IHsgaWQ/OiBzdHJpbmc7IHN0YXR1cz86IHN0cmluZyB9O1xuICBpZD86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW50ZXJwcmlzZVZlcmlmaWNhdGlvblN1Ym1pdCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID1cbiAgICBcIlN1Ym1pdCAob3IgcmVzdWJtaXQpIGEgdmVyaWZpY2F0aW9uIGZvciBhbiBlbnRlcnByaXNlIHdvcmtzcGFjZS4gUGFydGlhbC11cGRhdGUgZnJpZW5kbHk6IG9ubHkgdGhlIGZpZWxkcyB5b3UgcGFzcyBhcmUgY2hhbmdlZC5cIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgJzwlPSBjb25maWcuYmluICU+IGVudGVycHJpc2UgdmVyaWZpY2F0aW9uIHN1Ym1pdCBvcmdfYWJjMTIzIC0tZGF0YSAuL3ZlcmlmaWNhdGlvbi5qc29uJyxcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gZW50ZXJwcmlzZSB2ZXJpZmljYXRpb24gc3VibWl0IG9yZ19hYmMxMjMgLS1idXNpbmVzcy1uYW1lIFwiQWNtZSBMTENcIiAtLXdlYnNpdGUgaHR0cHM6Ly9hY21lLmNvbSAtLXVzZS1jYXNlIFwiSW5zdXJhbmNlIFNlcnZpY2VzXCInLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBlbnRlcnByaXNlIHZlcmlmaWNhdGlvbiBzdWJtaXQgb3JnX2FiYzEyMyAtLWNvbnRhY3QtZW1haWwgbmV3QGFjbWUuY29tJyxcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICB3b3Jrc3BhY2VJZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiV29ya3NwYWNlIElEXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgfTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIGRhdGE6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlBhdGggdG8gYSBKU09OIGZpbGUgY29udGFpbmluZyB0aGUgdmVyaWZpY2F0aW9uIHBheWxvYWRcIixcbiAgICB9KSxcbiAgICBcImJ1c2luZXNzLW5hbWVcIjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkxlZ2FsIGJ1c2luZXNzIG5hbWVcIixcbiAgICB9KSxcbiAgICBcImRvaW5nLWJ1c2luZXNzLWFzXCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJEQkEgLyB0cmFkaW5nIG5hbWVcIixcbiAgICB9KSxcbiAgICB3ZWJzaXRlOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiQnVzaW5lc3Mgd2Vic2l0ZSBVUkxcIixcbiAgICB9KSxcbiAgICBcImVudGl0eS10eXBlXCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJFbnRpdHkgdHlwZSAoU09MRV9QUk9QUklFVE9SIHwgUFJJVkFURV9QUk9GSVQgfCBQVUJMSUNfUFJPRklUIHwgTk9OX1BST0ZJVCB8IEdPVkVSTk1FTlQpXCIsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIFwiU09MRV9QUk9QUklFVE9SXCIsXG4gICAgICAgIFwiUFJJVkFURV9QUk9GSVRcIixcbiAgICAgICAgXCJQVUJMSUNfUFJPRklUXCIsXG4gICAgICAgIFwiTk9OX1BST0ZJVFwiLFxuICAgICAgICBcIkdPVkVSTk1FTlRcIixcbiAgICAgIF0sXG4gICAgfSksXG4gICAgXCJhZGRyZXNzLXN0cmVldFwiOiBGbGFncy5zdHJpbmcoeyBkZXNjcmlwdGlvbjogXCJTdHJlZXQgYWRkcmVzc1wiIH0pLFxuICAgIFwiYWRkcmVzcy1jaXR5XCI6IEZsYWdzLnN0cmluZyh7IGRlc2NyaXB0aW9uOiBcIkNpdHlcIiB9KSxcbiAgICBcImFkZHJlc3Mtc3RhdGVcIjogRmxhZ3Muc3RyaW5nKHsgZGVzY3JpcHRpb246IFwiU3RhdGUgLyByZWdpb25cIiB9KSxcbiAgICBcImFkZHJlc3MtemlwXCI6IEZsYWdzLnN0cmluZyh7IGRlc2NyaXB0aW9uOiBcIlpJUCAvIHBvc3RhbCBjb2RlXCIgfSksXG4gICAgXCJhZGRyZXNzLWNvdW50cnlcIjogRmxhZ3Muc3RyaW5nKHsgZGVzY3JpcHRpb246IFwiQ291bnRyeSBjb2RlIChlLmcuIFVTKVwiIH0pLFxuICAgIFwiY29udGFjdC1maXJzdC1uYW1lXCI6IEZsYWdzLnN0cmluZyh7IGRlc2NyaXB0aW9uOiBcIkNvbnRhY3QgZmlyc3QgbmFtZVwiIH0pLFxuICAgIFwiY29udGFjdC1sYXN0LW5hbWVcIjogRmxhZ3Muc3RyaW5nKHsgZGVzY3JpcHRpb246IFwiQ29udGFjdCBsYXN0IG5hbWVcIiB9KSxcbiAgICBcImNvbnRhY3QtZW1haWxcIjogRmxhZ3Muc3RyaW5nKHsgZGVzY3JpcHRpb246IFwiQ29udGFjdCBlbWFpbCBhZGRyZXNzXCIgfSksXG4gICAgXCJjb250YWN0LXBob25lXCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJDb250YWN0IHBob25lIG51bWJlciAoRS4xNjQpXCIsXG4gICAgfSksXG4gICAgYnJuOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQnVzaW5lc3MgcmVnaXN0cmF0aW9uIG51bWJlciAob21pdCBmb3Igc29sZSBwcm9wcmlldG9yczsgc2VydmVyIHdpbGwgc3RyaXApXCIsXG4gICAgfSksXG4gICAgXCJicm4tdHlwZVwiOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiQlJOIHR5cGUgKEVJTiB8IFNTTiB8IERVTlMgfCBDUkEgfCBWQVQgfCBMRUkgfCBPVEhFUilcIixcbiAgICAgIG9wdGlvbnM6IFtcIkVJTlwiLCBcIlNTTlwiLCBcIkRVTlNcIiwgXCJDUkFcIiwgXCJWQVRcIiwgXCJMRUlcIiwgXCJPVEhFUlwiXSxcbiAgICB9KSxcbiAgICBcImJybi1jb3VudHJ5XCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJCUk4gY291bnRyeSBjb2RlIChlLmcuIFVTKVwiLFxuICAgIH0pLFxuICAgIFwidXNlLWNhc2VcIjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlVzZSBjYXNlIChUZWxueXggdXNlLWNhc2UgZW51bSB2YWx1ZSlcIixcbiAgICB9KSxcbiAgICBcInVzZS1jYXNlLXN1bW1hcnlcIjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlVzZSBjYXNlIHN1bW1hcnlcIixcbiAgICB9KSxcbiAgICBcInNhbXBsZS1tZXNzYWdlc1wiOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiU2FtcGxlIG1lc3NhZ2VzXCIsXG4gICAgfSksXG4gICAgXCJvcHQtaW4td29ya2Zsb3dcIjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk9wdC1pbiB3b3JrZmxvdyBkZXNjcmlwdGlvblwiLFxuICAgIH0pLFxuICAgIFwib3B0LWluLWltYWdlLXVybHNcIjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk9wdC1pbiBpbWFnZSBVUkxzIChuZXdsaW5lIG9yIGNvbW1hIHNlcGFyYXRlZClcIixcbiAgICB9KSxcbiAgICBcIm1vbnRobHktdm9sdW1lXCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJFc3RpbWF0ZWQgbW9udGhseSBtZXNzYWdlIHZvbHVtZVwiLFxuICAgIH0pLFxuICAgIFwiYWRkaXRpb25hbC1pbmZvcm1hdGlvblwiOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNhcnJpZXJcIixcbiAgICB9KSxcbiAgICBcImFnZS1nYXRlZC1jb250ZW50XCI6IEZsYWdzLmJvb2xlYW4oe1xuICAgICAgZGVzY3JpcHRpb246IFwiTWFyayB0cmFmZmljIGFzIGFnZS1nYXRlZCBjb250ZW50XCIsXG4gICAgICBhbGxvd05vOiB0cnVlLFxuICAgIH0pLFxuICAgIFwiaXN2LXJlc2VsbGVyXCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJJU1YgLyByZXNlbGxlciBuYW1lIChpZiBhcHBsaWNhYmxlKVwiLFxuICAgIH0pLFxuICAgIFwicHJpdmFjeS11cmxcIjogRmxhZ3Muc3RyaW5nKHsgZGVzY3JpcHRpb246IFwiUHJpdmFjeSBwb2xpY3kgVVJMXCIgfSksXG4gICAgXCJ0ZXJtcy11cmxcIjogRmxhZ3Muc3RyaW5nKHsgZGVzY3JpcHRpb246IFwiVGVybXMgb2Ygc2VydmljZSBVUkxcIiB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShFbnRlcnByaXNlVmVyaWZpY2F0aW9uU3VibWl0KTtcbiAgICBhd2FpdCBzdWJtaXRWZXJpZmljYXRpb24oYXJncy53b3Jrc3BhY2VJZCwgZmxhZ3MsIFwiU3VibWl0dGluZyB2ZXJpZmljYXRpb24uLi5cIik7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFZlcmlmaWNhdGlvbihcbiAgd29ya3NwYWNlSWQ6IHN0cmluZyxcbiAgZmxhZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzcGlubmVyVGV4dDogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBheWxvYWQgPSBidWlsZFBheWxvYWQoZmxhZ3MpO1xuXG4gIGlmIChPYmplY3Qua2V5cyhwYXlsb2FkKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIk5vIGZpZWxkcyBwcm92aWRlZC4gUGFzcyAtLWRhdGEgPGZpbGU+IG9yIG9uZSBvciBtb3JlIC0tKiBmaWVsZCBmbGFncy5cIixcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc3BpbiA9IHNwaW5uZXIoc3Bpbm5lclRleHQpO1xuICBzcGluLnN0YXJ0KCk7XG5cbiAgbGV0IHJlc3BvbnNlOiBTdWJtaXRSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PFN1Ym1pdFJlc3BvbnNlPihcbiAgICAgIGAvYXBpL3YxL2VudGVycHJpc2Uvd29ya3NwYWNlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2VJZCl9L3ZlcmlmaWNhdGlvbi9zdWJtaXRgLFxuICAgICAgcGF5bG9hZCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNwaW4uZmFpbChcIlZlcmlmaWNhdGlvbiBzdWJtaXQgZmFpbGVkXCIpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIHNwaW4uc3VjY2VlZChcIlZlcmlmaWNhdGlvbiBzdWJtaXR0ZWRcIik7XG5cbiAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgIGpzb24ocmVzcG9uc2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1cyA9XG4gICAgcmVzcG9uc2Uuc3RhdHVzIHx8XG4gICAgcmVzcG9uc2UudmVyaWZpY2F0aW9uPy5zdGF0dXMgfHxcbiAgICBcInN1Ym1pdHRlZFwiO1xuICBjb25zdCBpZCA9IHJlc3BvbnNlLmlkIHx8IHJlc3BvbnNlLnZlcmlmaWNhdGlvbj8uaWQ7XG5cbiAgY29uc3QgZGV0YWlsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBXb3Jrc3BhY2U6IHdvcmtzcGFjZUlkLFxuICAgIFN0YXR1czogY29sb3JzLnByaW1hcnkoc3RhdHVzKSxcbiAgfTtcbiAgaWYgKGlkKSBkZXRhaWxzW1wiVmVyaWZpY2F0aW9uIElEXCJdID0gaWQ7XG5cbiAgc3VjY2VzcyhcIlZlcmlmaWNhdGlvbiBzdWJtaXR0ZWRcIiwgZGV0YWlscyk7XG5cbiAgaWYgKE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPiAwICYmICFpZCkge1xuICAgIGtleVZhbHVlKHJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQYXlsb2FkKFxuICBmbGFnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBWZXJpZmljYXRpb25TdWJtaXRJbnB1dCB7XG4gIGxldCBwYXlsb2FkOiBWZXJpZmljYXRpb25TdWJtaXRJbnB1dCA9IHt9O1xuXG4gIGNvbnN0IGRhdGFGbGFnID0gZmxhZ3MuZGF0YSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChkYXRhRmxhZykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhkYXRhRmxhZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZGF0YUZsYWd9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZGF0YUZsYWcsIFwidXRmLThcIik7XG4gICAgdHJ5IHtcbiAgICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpIGFzIFZlcmlmaWNhdGlvblN1Ym1pdElucHV0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBKU09OIGluICR7ZGF0YUZsYWd9LiBFeHBlY3RlZCBhIHZlcmlmaWNhdGlvbiBwYXlsb2FkIG9iamVjdC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzZXRJZiA9IDxLIGV4dGVuZHMga2V5b2YgVmVyaWZpY2F0aW9uU3VibWl0SW5wdXQ+KFxuICAgIGtleTogSyxcbiAgICB2YWx1ZTogVmVyaWZpY2F0aW9uU3VibWl0SW5wdXRbS10gfCB1bmRlZmluZWQsXG4gICk6IHZvaWQgPT4ge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgc2V0SWYoXCJidXNpbmVzc05hbWVcIiwgZmxhZ3NbXCJidXNpbmVzcy1uYW1lXCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIHNldElmKFwiZG9pbmdCdXNpbmVzc0FzXCIsIGZsYWdzW1wiZG9pbmctYnVzaW5lc3MtYXNcIl0gYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgc2V0SWYoXCJ3ZWJzaXRlXCIsIGZsYWdzLndlYnNpdGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgc2V0SWYoXCJlbnRpdHlUeXBlXCIsIGZsYWdzW1wiZW50aXR5LXR5cGVcIl0gYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgc2V0SWYoXCJicm5cIiwgZmxhZ3MuYnJuIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIHNldElmKFwiYnJuVHlwZVwiLCBmbGFnc1tcImJybi10eXBlXCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIHNldElmKFwiYnJuQ291bnRyeVwiLCBmbGFnc1tcImJybi1jb3VudHJ5XCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIHNldElmKFwidXNlQ2FzZVwiLCBmbGFnc1tcInVzZS1jYXNlXCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIHNldElmKFwidXNlQ2FzZVN1bW1hcnlcIiwgZmxhZ3NbXCJ1c2UtY2FzZS1zdW1tYXJ5XCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIHNldElmKFwic2FtcGxlTWVzc2FnZXNcIiwgZmxhZ3NbXCJzYW1wbGUtbWVzc2FnZXNcIl0gYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgc2V0SWYoXCJvcHRJbldvcmtmbG93XCIsIGZsYWdzW1wib3B0LWluLXdvcmtmbG93XCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIHNldElmKFwib3B0SW5JbWFnZVVybHNcIiwgZmxhZ3NbXCJvcHQtaW4taW1hZ2UtdXJsc1wiXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBzZXRJZihcIm1vbnRobHlWb2x1bWVcIiwgZmxhZ3NbXCJtb250aGx5LXZvbHVtZVwiXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBzZXRJZihcbiAgICBcImFkZGl0aW9uYWxJbmZvcm1hdGlvblwiLFxuICAgIGZsYWdzW1wiYWRkaXRpb25hbC1pbmZvcm1hdGlvblwiXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICk7XG4gIHNldElmKFwiaXN2UmVzZWxsZXJcIiwgZmxhZ3NbXCJpc3YtcmVzZWxsZXJcIl0gYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgc2V0SWYoXCJwcml2YWN5VXJsXCIsIGZsYWdzW1wicHJpdmFjeS11cmxcIl0gYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgc2V0SWYoXCJ0ZXJtc1VybFwiLCBmbGFnc1tcInRlcm1zLXVybFwiXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gIGlmIChmbGFnc1tcImFnZS1nYXRlZC1jb250ZW50XCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYXlsb2FkLmFnZUdhdGVkQ29udGVudCA9IGZsYWdzW1wiYWdlLWdhdGVkLWNvbnRlbnRcIl0gYXMgYm9vbGVhbjtcbiAgfVxuXG4gIGNvbnN0IGFkZHJlc3MgPSB7XG4gICAgLi4uKHBheWxvYWQuYWRkcmVzcyB8fCB7fSksXG4gICAgLi4uc3RyaXBVbmRlZmluZWQoe1xuICAgICAgc3RyZWV0OiBmbGFnc1tcImFkZHJlc3Mtc3RyZWV0XCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIGNpdHk6IGZsYWdzW1wiYWRkcmVzcy1jaXR5XCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIHN0YXRlOiBmbGFnc1tcImFkZHJlc3Mtc3RhdGVcIl0gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgemlwOiBmbGFnc1tcImFkZHJlc3MtemlwXCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIGNvdW50cnk6IGZsYWdzW1wiYWRkcmVzcy1jb3VudHJ5XCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB9KSxcbiAgfTtcbiAgaWYgKE9iamVjdC5rZXlzKGFkZHJlc3MpLmxlbmd0aCA+IDApIHtcbiAgICBwYXlsb2FkLmFkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgY29uc3QgY29udGFjdCA9IHtcbiAgICAuLi4ocGF5bG9hZC5jb250YWN0IHx8IHt9KSxcbiAgICAuLi5zdHJpcFVuZGVmaW5lZCh7XG4gICAgICBmaXJzdE5hbWU6IGZsYWdzW1wiY29udGFjdC1maXJzdC1uYW1lXCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIGxhc3ROYW1lOiBmbGFnc1tcImNvbnRhY3QtbGFzdC1uYW1lXCJdIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIGVtYWlsOiBmbGFnc1tcImNvbnRhY3QtZW1haWxcIl0gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgcGhvbmU6IGZsYWdzW1wiY29udGFjdC1waG9uZVwiXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgfSksXG4gIH07XG4gIGlmIChPYmplY3Qua2V5cyhjb250YWN0KS5sZW5ndGggPiAwKSB7XG4gICAgcGF5bG9hZC5jb250YWN0ID0gY29udGFjdDtcbiAgfVxuXG4gIHJldHVybiBwYXlsb2FkO1xufVxuXG5mdW5jdGlvbiBzdHJpcFVuZGVmaW5lZDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFBhcnRpYWw8VD4ge1xuICBjb25zdCBvdXQ6IFBhcnRpYWw8VD4gPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIChvdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tdID0gdjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
@@ -0,0 +1,31 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class NumbersBuy extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ country: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ type: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
+ number: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ /**
14
+ * Resolve which number to buy. If --number is given we trust it (and
15
+ * still need its monthlyCost, so we look it up among available numbers).
16
+ * Otherwise we search and prompt the user to pick one.
17
+ */
18
+ private resolveNumber;
19
+ /**
20
+ * Drive a hosted document-upload / payment action: print the link + code,
21
+ * auto-open it, wire press-[c]-to-copy / [q] to cancel, then poll until
22
+ * the action completes (resolves true) or expires (resolves false).
23
+ */
24
+ private runHostedAction;
25
+ /**
26
+ * Poll the owned-numbers list until the just-ordered number reports
27
+ * `active`. Returns the active record, or undefined if it hasn't
28
+ * activated within the polling window.
29
+ */
30
+ private waitForActive;
31
+ }
@@ -0,0 +1,252 @@
1
+ import { Flags } from "@oclif/core";
2
+ import open from "open";
3
+ import inquirer from "inquirer";
4
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
5
+ import { apiClient, NotFoundError } from "../../lib/api-client.js";
6
+ import { json, success, info, warn, error, colors, spinner, isJsonMode, } from "../../lib/output.js";
7
+ import { attachLoginKeypressHandler } from "../../lib/keypress.js";
8
+ const ACTION_POLL_INTERVAL = 2000; // 2 seconds
9
+ const ACTION_MAX_ATTEMPTS = 600; // ~20 minutes
10
+ const PROVISION_POLL_INTERVAL = 3000; // 3 seconds
11
+ const PROVISION_MAX_ATTEMPTS = 60; // ~3 minutes
12
+ function sleep(ms) {
13
+ return new Promise((resolve) => setTimeout(resolve, ms));
14
+ }
15
+ export default class NumbersBuy extends AuthenticatedCommand {
16
+ static description = "Buy a phone number. Handles document/payment steps interactively when a country requires them.";
17
+ static examples = [
18
+ "<%= config.bin %> numbers buy --country GB --type mobile",
19
+ "<%= config.bin %> numbers buy --country US --type local --number +15551234567",
20
+ "<%= config.bin %> numbers buy --country GB --type mobile --json",
21
+ ];
22
+ static flags = {
23
+ ...AuthenticatedCommand.baseFlags,
24
+ country: Flags.string({
25
+ char: "c",
26
+ description: "ISO country code (e.g. GB, US)",
27
+ required: true,
28
+ }),
29
+ type: Flags.string({
30
+ char: "t",
31
+ description: "Number type (e.g. mobile, local, toll-free)",
32
+ required: true,
33
+ }),
34
+ number: Flags.string({
35
+ char: "n",
36
+ description: "Specific number to buy in E.164 format (skips selection)",
37
+ }),
38
+ };
39
+ async run() {
40
+ const { flags } = await this.parse(NumbersBuy);
41
+ const selected = await this.resolveNumber(flags);
42
+ if (!selected)
43
+ return;
44
+ // The buy body is reused verbatim across every re-POST; only actionCode
45
+ // is added once a hosted action (docs/payment) has completed.
46
+ const buyBody = {
47
+ phoneNumber: selected.phoneNumber,
48
+ countryCode: flags.country,
49
+ phoneNumberType: flags.type,
50
+ monthlyCost: selected.monthlyCost,
51
+ };
52
+ let response = await apiClient.post("/api/v1/numbers/buy", buyBody);
53
+ // Drive the action loop until the carrier accepts the order (provisioning).
54
+ while (response.status === "documents_required" ||
55
+ response.status === "payment_required") {
56
+ const action = response.action;
57
+ if (!action) {
58
+ // Backend says docs/payment required but gave us nowhere to send the
59
+ // user — nothing the CLI can do.
60
+ if (isJsonMode()) {
61
+ json(response);
62
+ return;
63
+ }
64
+ error(`This number needs ${response.status === "payment_required" ? "payment" : "documents"} but no action link was returned.`, {
65
+ hint: "Try again, or complete this number from the Sendly dashboard.",
66
+ });
67
+ this.exit(1);
68
+ }
69
+ if (isJsonMode()) {
70
+ // Non-interactive: surface the action so the caller can drive it.
71
+ json(response);
72
+ return;
73
+ }
74
+ const completed = await this.runHostedAction(response.status, action);
75
+ if (!completed)
76
+ return; // expired / cancelled — already messaged
77
+ // Re-buy with the action identifier (actionCode), NOT the display userCode.
78
+ buyBody.actionCode = action.actionCode;
79
+ response = await apiClient.post("/api/v1/numbers/buy", buyBody);
80
+ }
81
+ // status === "provisioning"
82
+ if (isJsonMode()) {
83
+ // Wait for activation then emit the final number record.
84
+ const active = await this.waitForActive(selected.phoneNumber);
85
+ json(active ?? response);
86
+ return;
87
+ }
88
+ info(`Order accepted for ${colors.code(selected.phoneNumber)} — provisioning...`);
89
+ const active = await this.waitForActive(selected.phoneNumber);
90
+ if (active) {
91
+ success("Number is active", {
92
+ number: active.phoneNumber,
93
+ id: active.id,
94
+ country: active.countryCode,
95
+ type: active.phoneNumberType,
96
+ });
97
+ }
98
+ else {
99
+ warn("Number is still provisioning. It usually activates within a few minutes — check `sendly numbers list`.");
100
+ }
101
+ }
102
+ /**
103
+ * Resolve which number to buy. If --number is given we trust it (and
104
+ * still need its monthlyCost, so we look it up among available numbers).
105
+ * Otherwise we search and prompt the user to pick one.
106
+ */
107
+ async resolveNumber(flags) {
108
+ const spin = spinner("Finding available numbers...");
109
+ spin.start();
110
+ let available;
111
+ try {
112
+ const search = await apiClient.get("/api/v1/numbers/available", {
113
+ country: flags.country,
114
+ type: flags.type,
115
+ ...(flags.number && { contains: flags.number.replace(/^\+/, "") }),
116
+ });
117
+ available = search.numbers ?? [];
118
+ spin.stop();
119
+ }
120
+ catch (err) {
121
+ spin.fail("Could not load available numbers");
122
+ throw err;
123
+ }
124
+ if (flags.number) {
125
+ const match = available.find((n) => n.phoneNumber === flags.number);
126
+ if (!match) {
127
+ error(`${flags.number} is not available for purchase.`, {
128
+ hint: `Run: sendly numbers search --country ${flags.country} --type ${flags.type}`,
129
+ });
130
+ this.exit(1);
131
+ }
132
+ return match;
133
+ }
134
+ if (available.length === 0) {
135
+ info(`No available numbers found for ${flags.country} (${flags.type}).`);
136
+ return undefined;
137
+ }
138
+ // Non-interactive (no TTY / json): take the first result.
139
+ if (isJsonMode() || !process.stdout.isTTY) {
140
+ return available[0];
141
+ }
142
+ const { choice } = await inquirer.prompt([
143
+ {
144
+ type: "list",
145
+ name: "choice",
146
+ message: `Choose a number to buy (${flags.country}, ${flags.type}):`,
147
+ choices: available.slice(0, 25).map((n) => ({
148
+ name: `${n.phoneNumber} — ${n.monthlyCost} ${n.currency}/mo`,
149
+ value: n.phoneNumber,
150
+ })),
151
+ },
152
+ ]);
153
+ return available.find((n) => n.phoneNumber === choice);
154
+ }
155
+ /**
156
+ * Drive a hosted document-upload / payment action: print the link + code,
157
+ * auto-open it, wire press-[c]-to-copy / [q] to cancel, then poll until
158
+ * the action completes (resolves true) or expires (resolves false).
159
+ */
160
+ async runHostedAction(kind, action) {
161
+ const label = kind === "payment_required" ? "Payment required" : "Documents required";
162
+ console.log();
163
+ console.log(colors.bold(label));
164
+ console.log();
165
+ console.log(kind === "payment_required"
166
+ ? "This number needs a payment to complete. Open this secure page:"
167
+ : "This number needs documents before it can be activated. Open this secure page:");
168
+ console.log(colors.primary(` ${action.url}`));
169
+ console.log();
170
+ console.log("Confirmation code (shown so you can verify this is your session):");
171
+ console.log(colors.bold(colors.primary(` ${action.code}`)));
172
+ console.log();
173
+ try {
174
+ await open(action.url);
175
+ console.log(colors.dim("Browser opened automatically"));
176
+ }
177
+ catch {
178
+ console.log(colors.dim("Please open the URL manually"));
179
+ }
180
+ const keypressCleanup = attachLoginKeypressHandler(action.url);
181
+ console.log();
182
+ const spin = spinner("Waiting for you to finish on the secure page...");
183
+ spin.start();
184
+ let attempts = 0;
185
+ while (attempts < ACTION_MAX_ATTEMPTS) {
186
+ await sleep(ACTION_POLL_INTERVAL);
187
+ attempts++;
188
+ let status;
189
+ try {
190
+ status = await apiClient.get(`/api/cli/action/${encodeURIComponent(action.actionCode)}`);
191
+ }
192
+ catch (err) {
193
+ if (err instanceof NotFoundError) {
194
+ // The action is gone (expired/cleaned up) — terminal, not transient.
195
+ spin.fail("This step expired");
196
+ keypressCleanup();
197
+ warn("The secure page expired before it was completed. Re-run `sendly numbers buy` to start over.");
198
+ return false;
199
+ }
200
+ // Transient error — keep polling.
201
+ continue;
202
+ }
203
+ if (status.status === "completed") {
204
+ spin.succeed("Completed");
205
+ keypressCleanup();
206
+ return true;
207
+ }
208
+ if (status.status === "expired") {
209
+ spin.fail("This step expired");
210
+ keypressCleanup();
211
+ warn("The secure page expired before it was completed. Re-run `sendly numbers buy` to start over.");
212
+ return false;
213
+ }
214
+ // pending / authorized — keep polling
215
+ }
216
+ spin.fail("Timed out waiting for completion");
217
+ keypressCleanup();
218
+ warn("We stopped waiting. If you finished on the page, re-run `sendly numbers buy` and we'll pick up where you left off.");
219
+ return false;
220
+ }
221
+ /**
222
+ * Poll the owned-numbers list until the just-ordered number reports
223
+ * `active`. Returns the active record, or undefined if it hasn't
224
+ * activated within the polling window.
225
+ */
226
+ async waitForActive(phoneNumber) {
227
+ const spin = spinner("Activating number...");
228
+ spin.start();
229
+ let attempts = 0;
230
+ while (attempts < PROVISION_MAX_ATTEMPTS) {
231
+ let list;
232
+ try {
233
+ list = await apiClient.get("/api/v1/numbers");
234
+ }
235
+ catch {
236
+ await sleep(PROVISION_POLL_INTERVAL);
237
+ attempts++;
238
+ continue;
239
+ }
240
+ const found = (list.numbers ?? []).find((n) => n.phoneNumber === phoneNumber);
241
+ if (found && found.status === "active") {
242
+ spin.succeed("Active");
243
+ return found;
244
+ }
245
+ await sleep(PROVISION_POLL_INTERVAL);
246
+ attempts++;
247
+ }
248
+ spin.stop();
249
+ return undefined;
250
+ }
251
+ }
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL251bWJlcnMvYnV5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFDTCxJQUFJLEVBQ0osT0FBTyxFQUNQLElBQUksRUFDSixJQUFJLEVBQ0osS0FBSyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBQ1AsVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFvRG5FLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLENBQUMsWUFBWTtBQUMvQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxDQUFDLGNBQWM7QUFDL0MsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZO0FBQ2xELE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUMsYUFBYTtBQUVoRCxTQUFTLEtBQUssQ0FBQyxFQUFVO0lBQ3ZCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyxVQUFXLFNBQVEsb0JBQW9CO0lBQzFELE1BQU0sQ0FBQyxXQUFXLEdBQ2hCLGdHQUFnRyxDQUFDO0lBRW5HLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsMERBQTBEO1FB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O1lBQ3pDLElBQUksSUFBeUIsQ0FBQztZQUM5QixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBc0IsaUJBQWlCLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE1BQU0sS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQ3JDLFFBQVEsRUFBRSxDQUFDO2dCQUNYLFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDckMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUNyQyxDQUFDO1lBQ0YsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNyQyxRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCBvcGVuIGZyb20gXCJvcGVuXCI7XG5pbXBvcnQgaW5xdWlyZXIgZnJvbSBcImlucXVpcmVyXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQsIE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIGpzb24sXG4gIHN1Y2Nlc3MsXG4gIGluZm8sXG4gIHdhcm4sXG4gIGVycm9yLFxuICBjb2xvcnMsXG4gIHNwaW5uZXIsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5pbXBvcnQgeyBhdHRhY2hMb2dpbktleXByZXNzSGFuZGxlciB9IGZyb20gXCIuLi8uLi9saWIva2V5cHJlc3MuanNcIjtcblxuaW50ZXJmYWNlIEF2YWlsYWJsZU51bWJlciB7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gIGNvdW50cnk6IHN0cmluZztcbiAgbnVtYmVyVHlwZTogc3RyaW5nO1xuICBtb250aGx5Q29zdDogc3RyaW5nO1xuICBjdXJyZW5jeTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2VhcmNoTnVtYmVyc1Jlc3BvbnNlIHtcbiAgbnVtYmVyczogQXZhaWxhYmxlTnVtYmVyW107XG59XG5cbmludGVyZmFjZSBCdXlBY3Rpb24ge1xuICB1cmw6IHN0cmluZztcbiAgLy8gYWN0aW9uQ29kZSAoMzItaGV4KSBpZGVudGlmaWVzIHRoZSBhY3Rpb24g4oCUIHVzZWQgdG8gUE9MTCBhbmQgdG8gUkUtQlVZLlxuICBhY3Rpb25Db2RlOiBzdHJpbmc7XG4gIC8vIGNvZGUgKDgtY2hhciB1c2VyQ29kZSkgaXMgc2hvd24gdG8gdGhlIGh1bWFuIHRvIHR5cGUgb24gdGhlIGhvc3RlZCBwYWdlXG4gIC8vIHRvIHByb3ZlIHRlcm1pbmFsIGFjY2Vzcy4gRElTUExBWSBvbmx5IOKAlCBuZXZlciB1c2VkIGFzIGFjdGlvbkNvZGUuXG4gIGNvZGU6IHN0cmluZztcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBPd25lZE51bWJlciB7XG4gIGlkOiBzdHJpbmc7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbiAgY291bnRyeUNvZGU6IHN0cmluZztcbiAgcGhvbmVOdW1iZXJUeXBlOiBzdHJpbmc7XG4gIG1vbnRobHlDb3N0Q2VudHM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEJ1eVJlc3BvbnNlIHtcbiAgc3RhdHVzOiBcInByb3Zpc2lvbmluZ1wiIHwgXCJkb2N1bWVudHNfcmVxdWlyZWRcIiB8IFwicGF5bWVudF9yZXF1aXJlZFwiO1xuICBudW1iZXI/OiBPd25lZE51bWJlcjtcbiAgcmVxdWlyZW1lbnRzPzogdW5rbm93bjtcbiAgYWN0aW9uPzogQnV5QWN0aW9uO1xufVxuXG5pbnRlcmZhY2UgTGlzdE51bWJlcnNSZXNwb25zZSB7XG4gIG51bWJlcnM6IE93bmVkTnVtYmVyW107XG59XG5cbmludGVyZmFjZSBBY3Rpb25TdGF0dXNSZXNwb25zZSB7XG4gIHN0YXR1czogXCJwZW5kaW5nXCIgfCBcImF1dGhvcml6ZWRcIiB8IFwiY29tcGxldGVkXCIgfCBcImV4cGlyZWRcIjtcbiAgYWN0aW9uVHlwZTogc3RyaW5nO1xuICByZXN1bHQ/OiB1bmtub3duO1xuICBleHBpcmVzQXQ6IHN0cmluZztcbn1cblxuY29uc3QgQUNUSU9OX1BPTExfSU5URVJWQUwgPSAyMDAwOyAvLyAyIHNlY29uZHNcbmNvbnN0IEFDVElPTl9NQVhfQVRURU1QVFMgPSA2MDA7IC8vIH4yMCBtaW51dGVzXG5jb25zdCBQUk9WSVNJT05fUE9MTF9JTlRFUlZBTCA9IDMwMDA7IC8vIDMgc2Vjb25kc1xuY29uc3QgUFJPVklTSU9OX01BWF9BVFRFTVBUUyA9IDYwOyAvLyB+MyBtaW51dGVzXG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE51bWJlcnNCdXkgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9XG4gICAgXCJCdXkgYSBwaG9uZSBudW1iZXIuIEhhbmRsZXMgZG9jdW1lbnQvcGF5bWVudCBzdGVwcyBpbnRlcmFjdGl2ZWx5IHdoZW4gYSBjb3VudHJ5IHJlcXVpcmVzIHRoZW0uXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gbnVtYmVycyBidXkgLS1jb3VudHJ5IEdCIC0tdHlwZSBtb2JpbGVcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IG51bWJlcnMgYnV5IC0tY291bnRyeSBVUyAtLXR5cGUgbG9jYWwgLS1udW1iZXIgKzE1NTUxMjM0NTY3XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBudW1iZXJzIGJ1eSAtLWNvdW50cnkgR0IgLS10eXBlIG1vYmlsZSAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIGNvdW50cnk6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImNcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIklTTyBjb3VudHJ5IGNvZGUgKGUuZy4gR0IsIFVTKVwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gICAgdHlwZTogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwidFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiTnVtYmVyIHR5cGUgKGUuZy4gbW9iaWxlLCBsb2NhbCwgdG9sbC1mcmVlKVwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gICAgbnVtYmVyOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJuXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJTcGVjaWZpYyBudW1iZXIgdG8gYnV5IGluIEUuMTY0IGZvcm1hdCAoc2tpcHMgc2VsZWN0aW9uKVwiLFxuICAgIH0pLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKE51bWJlcnNCdXkpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCB0aGlzLnJlc29sdmVOdW1iZXIoZmxhZ3MpO1xuICAgIGlmICghc2VsZWN0ZWQpIHJldHVybjtcblxuICAgIC8vIFRoZSBidXkgYm9keSBpcyByZXVzZWQgdmVyYmF0aW0gYWNyb3NzIGV2ZXJ5IHJlLVBPU1Q7IG9ubHkgYWN0aW9uQ29kZVxuICAgIC8vIGlzIGFkZGVkIG9uY2UgYSBob3N0ZWQgYWN0aW9uIChkb2NzL3BheW1lbnQpIGhhcyBjb21wbGV0ZWQuXG4gICAgY29uc3QgYnV5Qm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBwaG9uZU51bWJlcjogc2VsZWN0ZWQucGhvbmVOdW1iZXIsXG4gICAgICBjb3VudHJ5Q29kZTogZmxhZ3MuY291bnRyeSxcbiAgICAgIHBob25lTnVtYmVyVHlwZTogZmxhZ3MudHlwZSxcbiAgICAgIG1vbnRobHlDb3N0OiBzZWxlY3RlZC5tb250aGx5Q29zdCxcbiAgICB9O1xuXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LnBvc3Q8QnV5UmVzcG9uc2U+KFxuICAgICAgXCIvYXBpL3YxL251bWJlcnMvYnV5XCIsXG4gICAgICBidXlCb2R5LFxuICAgICk7XG5cbiAgICAvLyBEcml2ZSB0aGUgYWN0aW9uIGxvb3AgdW50aWwgdGhlIGNhcnJpZXIgYWNjZXB0cyB0aGUgb3JkZXIgKHByb3Zpc2lvbmluZykuXG4gICAgd2hpbGUgKFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSBcImRvY3VtZW50c19yZXF1aXJlZFwiIHx8XG4gICAgICByZXNwb25zZS5zdGF0dXMgPT09IFwicGF5bWVudF9yZXF1aXJlZFwiXG4gICAgKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSByZXNwb25zZS5hY3Rpb247XG4gICAgICBpZiAoIWFjdGlvbikge1xuICAgICAgICAvLyBCYWNrZW5kIHNheXMgZG9jcy9wYXltZW50IHJlcXVpcmVkIGJ1dCBnYXZlIHVzIG5vd2hlcmUgdG8gc2VuZCB0aGVcbiAgICAgICAgLy8gdXNlciDigJQgbm90aGluZyB0aGUgQ0xJIGNhbiBkby5cbiAgICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlcnJvcihcbiAgICAgICAgICBgVGhpcyBudW1iZXIgbmVlZHMgJHtyZXNwb25zZS5zdGF0dXMgPT09IFwicGF5bWVudF9yZXF1aXJlZFwiID8gXCJwYXltZW50XCIgOiBcImRvY3VtZW50c1wifSBidXQgbm8gYWN0aW9uIGxpbmsgd2FzIHJldHVybmVkLmAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogXCJUcnkgYWdhaW4sIG9yIGNvbXBsZXRlIHRoaXMgbnVtYmVyIGZyb20gdGhlIFNlbmRseSBkYXNoYm9hcmQuXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAgIC8vIE5vbi1pbnRlcmFjdGl2ZTogc3VyZmFjZSB0aGUgYWN0aW9uIHNvIHRoZSBjYWxsZXIgY2FuIGRyaXZlIGl0LlxuICAgICAgICBqc29uKHJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wbGV0ZWQgPSBhd2FpdCB0aGlzLnJ1bkhvc3RlZEFjdGlvbihyZXNwb25zZS5zdGF0dXMsIGFjdGlvbik7XG4gICAgICBpZiAoIWNvbXBsZXRlZCkgcmV0dXJuOyAvLyBleHBpcmVkIC8gY2FuY2VsbGVkIOKAlCBhbHJlYWR5IG1lc3NhZ2VkXG5cbiAgICAgIC8vIFJlLWJ1eSB3aXRoIHRoZSBhY3Rpb24gaWRlbnRpZmllciAoYWN0aW9uQ29kZSksIE5PVCB0aGUgZGlzcGxheSB1c2VyQ29kZS5cbiAgICAgIGJ1eUJvZHkuYWN0aW9uQ29kZSA9IGFjdGlvbi5hY3Rpb25Db2RlO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxCdXlSZXNwb25zZT4oXG4gICAgICAgIFwiL2FwaS92MS9udW1iZXJzL2J1eVwiLFxuICAgICAgICBidXlCb2R5LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBzdGF0dXMgPT09IFwicHJvdmlzaW9uaW5nXCJcbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAvLyBXYWl0IGZvciBhY3RpdmF0aW9uIHRoZW4gZW1pdCB0aGUgZmluYWwgbnVtYmVyIHJlY29yZC5cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IGF3YWl0IHRoaXMud2FpdEZvckFjdGl2ZShzZWxlY3RlZC5waG9uZU51bWJlcik7XG4gICAgICBqc29uKGFjdGl2ZSA/PyByZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5mbyhgT3JkZXIgYWNjZXB0ZWQgZm9yICR7Y29sb3JzLmNvZGUoc2VsZWN0ZWQucGhvbmVOdW1iZXIpfSDigJQgcHJvdmlzaW9uaW5nLi4uYCk7XG4gICAgY29uc3QgYWN0aXZlID0gYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZlKHNlbGVjdGVkLnBob25lTnVtYmVyKTtcblxuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHN1Y2Nlc3MoXCJOdW1iZXIgaXMgYWN0aXZlXCIsIHtcbiAgICAgICAgbnVtYmVyOiBhY3RpdmUucGhvbmVOdW1iZXIsXG4gICAgICAgIGlkOiBhY3RpdmUuaWQsXG4gICAgICAgIGNvdW50cnk6IGFjdGl2ZS5jb3VudHJ5Q29kZSxcbiAgICAgICAgdHlwZTogYWN0aXZlLnBob25lTnVtYmVyVHlwZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuKFxuICAgICAgICBcIk51bWJlciBpcyBzdGlsbCBwcm92aXNpb25pbmcuIEl0IHVzdWFsbHkgYWN0aXZhdGVzIHdpdGhpbiBhIGZldyBtaW51dGVzIOKAlCBjaGVjayBgc2VuZGx5IG51bWJlcnMgbGlzdGAuXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHdoaWNoIG51bWJlciB0byBidXkuIElmIC0tbnVtYmVyIGlzIGdpdmVuIHdlIHRydXN0IGl0IChhbmRcbiAgICogc3RpbGwgbmVlZCBpdHMgbW9udGhseUNvc3QsIHNvIHdlIGxvb2sgaXQgdXAgYW1vbmcgYXZhaWxhYmxlIG51bWJlcnMpLlxuICAgKiBPdGhlcndpc2Ugd2Ugc2VhcmNoIGFuZCBwcm9tcHQgdGhlIHVzZXIgdG8gcGljayBvbmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVOdW1iZXIoZmxhZ3M6IHtcbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIG51bWJlcj86IHN0cmluZztcbiAgfSk6IFByb21pc2U8QXZhaWxhYmxlTnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3BpbiA9IHNwaW5uZXIoXCJGaW5kaW5nIGF2YWlsYWJsZSBudW1iZXJzLi4uXCIpO1xuICAgIHNwaW4uc3RhcnQoKTtcblxuICAgIGxldCBhdmFpbGFibGU6IEF2YWlsYWJsZU51bWJlcltdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZWFyY2ggPSBhd2FpdCBhcGlDbGllbnQuZ2V0PFNlYXJjaE51bWJlcnNSZXNwb25zZT4oXG4gICAgICAgIFwiL2FwaS92MS9udW1iZXJzL2F2YWlsYWJsZVwiLFxuICAgICAgICB7XG4gICAgICAgICAgY291bnRyeTogZmxhZ3MuY291bnRyeSxcbiAgICAgICAgICB0eXBlOiBmbGFncy50eXBlLFxuICAgICAgICAgIC4uLihmbGFncy5udW1iZXIgJiYgeyBjb250YWluczogZmxhZ3MubnVtYmVyLnJlcGxhY2UoL15cXCsvLCBcIlwiKSB9KSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBhdmFpbGFibGUgPSBzZWFyY2gubnVtYmVycyA/PyBbXTtcbiAgICAgIHNwaW4uc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc3Bpbi5mYWlsKFwiQ291bGQgbm90IGxvYWQgYXZhaWxhYmxlIG51bWJlcnNcIik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgaWYgKGZsYWdzLm51bWJlcikge1xuICAgICAgY29uc3QgbWF0Y2ggPSBhdmFpbGFibGUuZmluZCgobikgPT4gbi5waG9uZU51bWJlciA9PT0gZmxhZ3MubnVtYmVyKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgZXJyb3IoYCR7ZmxhZ3MubnVtYmVyfSBpcyBub3QgYXZhaWxhYmxlIGZvciBwdXJjaGFzZS5gLCB7XG4gICAgICAgICAgaGludDogYFJ1bjogc2VuZGx5IG51bWJlcnMgc2VhcmNoIC0tY291bnRyeSAke2ZsYWdzLmNvdW50cnl9IC0tdHlwZSAke2ZsYWdzLnR5cGV9YCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cbiAgICBpZiAoYXZhaWxhYmxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyhgTm8gYXZhaWxhYmxlIG51bWJlcnMgZm91bmQgZm9yICR7ZmxhZ3MuY291bnRyeX0gKCR7ZmxhZ3MudHlwZX0pLmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBOb24taW50ZXJhY3RpdmUgKG5vIFRUWSAvIGpzb24pOiB0YWtlIHRoZSBmaXJzdCByZXN1bHQuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSB8fCAhcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICAgIHJldHVybiBhdmFpbGFibGVbMF07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjaG9pY2UgfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBuYW1lOiBcImNob2ljZVwiLFxuICAgICAgICBtZXNzYWdlOiBgQ2hvb3NlIGEgbnVtYmVyIHRvIGJ1eSAoJHtmbGFncy5jb3VudHJ5fSwgJHtmbGFncy50eXBlfSk6YCxcbiAgICAgICAgY2hvaWNlczogYXZhaWxhYmxlLnNsaWNlKDAsIDI1KS5tYXAoKG4pID0+ICh7XG4gICAgICAgICAgbmFtZTogYCR7bi5waG9uZU51bWJlcn0gIOKAlCAgJHtuLm1vbnRobHlDb3N0fSAke24uY3VycmVuY3l9L21vYCxcbiAgICAgICAgICB2YWx1ZTogbi5waG9uZU51bWJlcixcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIHJldHVybiBhdmFpbGFibGUuZmluZCgobikgPT4gbi5waG9uZU51bWJlciA9PT0gY2hvaWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcml2ZSBhIGhvc3RlZCBkb2N1bWVudC11cGxvYWQgLyBwYXltZW50IGFjdGlvbjogcHJpbnQgdGhlIGxpbmsgKyBjb2RlLFxuICAgKiBhdXRvLW9wZW4gaXQsIHdpcmUgcHJlc3MtW2NdLXRvLWNvcHkgLyBbcV0gdG8gY2FuY2VsLCB0aGVuIHBvbGwgdW50aWxcbiAgICogdGhlIGFjdGlvbiBjb21wbGV0ZXMgKHJlc29sdmVzIHRydWUpIG9yIGV4cGlyZXMgKHJlc29sdmVzIGZhbHNlKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuSG9zdGVkQWN0aW9uKFxuICAgIGtpbmQ6IFwiZG9jdW1lbnRzX3JlcXVpcmVkXCIgfCBcInBheW1lbnRfcmVxdWlyZWRcIixcbiAgICBhY3Rpb246IEJ1eUFjdGlvbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbGFiZWwgPVxuICAgICAga2luZCA9PT0gXCJwYXltZW50X3JlcXVpcmVkXCIgPyBcIlBheW1lbnQgcmVxdWlyZWRcIiA6IFwiRG9jdW1lbnRzIHJlcXVpcmVkXCI7XG5cbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKGxhYmVsKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGtpbmQgPT09IFwicGF5bWVudF9yZXF1aXJlZFwiXG4gICAgICAgID8gXCJUaGlzIG51bWJlciBuZWVkcyBhIHBheW1lbnQgdG8gY29tcGxldGUuIE9wZW4gdGhpcyBzZWN1cmUgcGFnZTpcIlxuICAgICAgICA6IFwiVGhpcyBudW1iZXIgbmVlZHMgZG9jdW1lbnRzIGJlZm9yZSBpdCBjYW4gYmUgYWN0aXZhdGVkLiBPcGVuIHRoaXMgc2VjdXJlIHBhZ2U6XCIsXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMucHJpbWFyeShgICAke2FjdGlvbi51cmx9YCkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coXCJDb25maXJtYXRpb24gY29kZSAoc2hvd24gc28geW91IGNhbiB2ZXJpZnkgdGhpcyBpcyB5b3VyIHNlc3Npb24pOlwiKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChjb2xvcnMucHJpbWFyeShgICAke2FjdGlvbi5jb2RlfWApKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBvcGVuKGFjdGlvbi51cmwpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIkJyb3dzZXIgb3BlbmVkIGF1dG9tYXRpY2FsbHlcIikpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlBsZWFzZSBvcGVuIHRoZSBVUkwgbWFudWFsbHlcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXByZXNzQ2xlYW51cCA9IGF0dGFjaExvZ2luS2V5cHJlc3NIYW5kbGVyKGFjdGlvbi51cmwpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICBjb25zdCBzcGluID0gc3Bpbm5lcihcIldhaXRpbmcgZm9yIHlvdSB0byBmaW5pc2ggb24gdGhlIHNlY3VyZSBwYWdlLi4uXCIpO1xuICAgIHNwaW4uc3RhcnQoKTtcblxuICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgd2hpbGUgKGF0dGVtcHRzIDwgQUNUSU9OX01BWF9BVFRFTVBUUykge1xuICAgICAgYXdhaXQgc2xlZXAoQUNUSU9OX1BPTExfSU5URVJWQUwpO1xuICAgICAgYXR0ZW1wdHMrKztcblxuICAgICAgbGV0IHN0YXR1czogQWN0aW9uU3RhdHVzUmVzcG9uc2U7XG4gICAgICB0cnkge1xuICAgICAgICBzdGF0dXMgPSBhd2FpdCBhcGlDbGllbnQuZ2V0PEFjdGlvblN0YXR1c1Jlc3BvbnNlPihcbiAgICAgICAgICBgL2FwaS9jbGkvYWN0aW9uLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGFjdGlvbi5hY3Rpb25Db2RlKX1gLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGFjdGlvbiBpcyBnb25lIChleHBpcmVkL2NsZWFuZWQgdXApIOKAlCB0ZXJtaW5hbCwgbm90IHRyYW5zaWVudC5cbiAgICAgICAgICBzcGluLmZhaWwoXCJUaGlzIHN0ZXAgZXhwaXJlZFwiKTtcbiAgICAgICAgICBrZXlwcmVzc0NsZWFudXAoKTtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJUaGUgc2VjdXJlIHBhZ2UgZXhwaXJlZCBiZWZvcmUgaXQgd2FzIGNvbXBsZXRlZC4gUmUtcnVuIGBzZW5kbHkgbnVtYmVycyBidXlgIHRvIHN0YXJ0IG92ZXIuXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhbnNpZW50IGVycm9yIOKAlCBrZWVwIHBvbGxpbmcuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICBzcGluLnN1Y2NlZWQoXCJDb21wbGV0ZWRcIik7XG4gICAgICAgIGtleXByZXNzQ2xlYW51cCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXR1cy5zdGF0dXMgPT09IFwiZXhwaXJlZFwiKSB7XG4gICAgICAgIHNwaW4uZmFpbChcIlRoaXMgc3RlcCBleHBpcmVkXCIpO1xuICAgICAgICBrZXlwcmVzc0NsZWFudXAoKTtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBcIlRoZSBzZWN1cmUgcGFnZSBleHBpcmVkIGJlZm9yZSBpdCB3YXMgY29tcGxldGVkLiBSZS1ydW4gYHNlbmRseSBudW1iZXJzIGJ1eWAgdG8gc3RhcnQgb3Zlci5cIixcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gcGVuZGluZyAvIGF1dGhvcml6ZWQg4oCUIGtlZXAgcG9sbGluZ1xuICAgIH1cblxuICAgIHNwaW4uZmFpbChcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBjb21wbGV0aW9uXCIpO1xuICAgIGtleXByZXNzQ2xlYW51cCgpO1xuICAgIHdhcm4oXG4gICAgICBcIldlIHN0b3BwZWQgd2FpdGluZy4gSWYgeW91IGZpbmlzaGVkIG9uIHRoZSBwYWdlLCByZS1ydW4gYHNlbmRseSBudW1iZXJzIGJ1eWAgYW5kIHdlJ2xsIHBpY2sgdXAgd2hlcmUgeW91IGxlZnQgb2ZmLlwiLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGwgdGhlIG93bmVkLW51bWJlcnMgbGlzdCB1bnRpbCB0aGUganVzdC1vcmRlcmVkIG51bWJlciByZXBvcnRzXG4gICAqIGBhY3RpdmVgLiBSZXR1cm5zIHRoZSBhY3RpdmUgcmVjb3JkLCBvciB1bmRlZmluZWQgaWYgaXQgaGFzbid0XG4gICAqIGFjdGl2YXRlZCB3aXRoaW4gdGhlIHBvbGxpbmcgd2luZG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQWN0aXZlKFxuICAgIHBob25lTnVtYmVyOiBzdHJpbmcsXG4gICk6IFByb21pc2U8T3duZWROdW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzcGluID0gc3Bpbm5lcihcIkFjdGl2YXRpbmcgbnVtYmVyLi4uXCIpO1xuICAgIHNwaW4uc3RhcnQoKTtcblxuICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgd2hpbGUgKGF0dGVtcHRzIDwgUFJPVklTSU9OX01BWF9BVFRFTVBUUykge1xuICAgICAgbGV0IGxpc3Q6IExpc3ROdW1iZXJzUmVzcG9uc2U7XG4gICAgICB0cnkge1xuICAgICAgICBsaXN0ID0gYXdhaXQgYXBpQ2xpZW50LmdldDxMaXN0TnVtYmVyc1Jlc3BvbnNlPihcIi9hcGkvdjEvbnVtYmVyc1wiKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhd2FpdCBzbGVlcChQUk9WSVNJT05fUE9MTF9JTlRFUlZBTCk7XG4gICAgICAgIGF0dGVtcHRzKys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3VuZCA9IChsaXN0Lm51bWJlcnMgPz8gW10pLmZpbmQoXG4gICAgICAgIChuKSA9PiBuLnBob25lTnVtYmVyID09PSBwaG9uZU51bWJlcixcbiAgICAgICk7XG4gICAgICBpZiAoZm91bmQgJiYgZm91bmQuc3RhdHVzID09PSBcImFjdGl2ZVwiKSB7XG4gICAgICAgIHNwaW4uc3VjY2VlZChcIkFjdGl2ZVwiKTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzbGVlcChQUk9WSVNJT05fUE9MTF9JTlRFUlZBTCk7XG4gICAgICBhdHRlbXB0cysrO1xuICAgIH1cblxuICAgIHNwaW4uc3RvcCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class NumbersList extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
7
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
8
+ };
9
+ run(): Promise<void>;
10
+ }